Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/15/14 17:30:02 (10 years ago)
Author:
mkommend
Message:

#2174: Adapted binary encoding to new wiring method.

Location:
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryEncoding.cs

    r11484 r11553  
    2020#endregion
    2121
     22using System;
     23using System.Collections.Generic;
     24using System.Linq;
    2225using HeuristicLab.Common;
    2326using HeuristicLab.Core;
    2427using HeuristicLab.Data;
     28using HeuristicLab.Encodings.BinaryVectorEncoding;
     29using HeuristicLab.Optimization;
     30using HeuristicLab.Parameters;
    2531using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     32using HeuristicLab.PluginInfrastructure;
    2633
    2734namespace HeuristicLab.Problems.Programmable {
    2835  [Item("BinaryEncoding", "Describes a binary vector encoding.")]
    2936  [StorableClass]
    30   public class BinaryEncoding : Encoding {
     37  public sealed class BinaryEncoding : Encoding {
     38    #region Encoding Parameters
    3139    [Storable]
    32     private IntValue length;
    33     public IntValue Length {
    34       get { return length; }
     40    private IFixedValueParameter<IntValue> lengthParameter;
     41    public IFixedValueParameter<IntValue> LengthParameter {
     42      get { return lengthParameter; }
    3543      set {
    36         if (length == value) return;
    37         length = value;
    38         OnParameterConfigurationChanged();
     44        if (value == null) throw new ArgumentNullException("Length parameter must not be null.");
     45        if (lengthParameter == value) return;
     46        lengthParameter = value;
     47        OnLengthParameterChanged();
    3948      }
     49    }
     50    public override IEnumerable<IValueParameter> Parameters {
     51      get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter }); }
     52    }
     53    #endregion
     54
     55    private List<IOperator> encodingOperators = new List<IOperator>();
     56    [Storable]
     57    public override IEnumerable<IOperator> Operators {
     58      get { return encodingOperators; }
     59      protected set { encodingOperators = new List<IOperator>(value); }
     60    }
     61
     62    public override ISolutionCreator DefaultSolutionCreator {
     63      get { return Operators.OfType<RandomBinaryVectorCreator>().First(); }
     64    }
     65
     66    public int Length {
     67      get { return LengthParameter.Value.Value; }
     68      set { LengthParameter.Value.Value = value; }
    4069    }
    4170
    4271    [StorableConstructor]
    43     protected BinaryEncoding(bool deserializing) : base(deserializing) { }
    44     protected BinaryEncoding(BinaryEncoding original, Cloner cloner)
     72    private BinaryEncoding(bool deserializing) : base(deserializing) { }
     73    [StorableHook(HookType.AfterDeserialization)]
     74    private void AfterDeserialization() {
     75      RegisterParameterEvents();
     76      DiscoverOperators();
     77    }
     78    public override IDeepCloneable Clone(Cloner cloner) { return new BinaryEncoding(this, cloner); }
     79    private BinaryEncoding(BinaryEncoding original, Cloner cloner)
    4580      : base(original, cloner) {
    46       length = cloner.Clone(original.length);
     81      lengthParameter = cloner.Clone(original.lengthParameter);
     82      encodingOperators = original.Operators.Select(cloner.Clone).ToList();
     83      RegisterParameterEvents();
    4784    }
    4885    public BinaryEncoding(string name, int length)
    4986      : base(name) {
    50       this.length = new IntValue(length);
     87      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
    5188    }
    5289
    53     public override IDeepCloneable Clone(Cloner cloner) {
    54       return new BinaryEncoding(this, cloner);
     90    private void OnLengthParameterChanged() {
     91      RegisterLengthParameterEvents();
     92      ConfigureOperators(Operators);
     93    }
     94    private void RegisterParameterEvents() {
     95      RegisterLengthParameterEvents();
     96    }
     97    private void RegisterLengthParameterEvents() {
     98      LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
     99      LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
    55100    }
    56101
     102    #region Operator Discovery
     103    private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
     104    static BinaryEncoding() {
     105      encodingSpecificOperatorTypes = new List<Type>() {
     106        typeof (IBinaryVectorOperator),
     107        typeof (IBinaryVectorCreator),
     108        typeof (IBinaryVectorCrossover),
     109        typeof (IBinaryVectorManipulator),
     110        typeof (IBinaryVectorMoveOperator),
     111        typeof (IBinaryVectorMultiNeighborhoodShakingOperator),
     112      };
     113    }
     114    private void DiscoverOperators() {
     115      var pluginDescription = ApplicationManager.Manager.GetDeclaringPlugin(typeof(IBinaryVectorOperator));
     116      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, pluginDescription, true, false, false);
     117      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
     118      var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList();
     119
     120      ConfigureOperators(newOperators);
     121      encodingOperators.AddRange(newOperators);
     122    }
     123    #endregion
     124
     125    public void ConfigureOperators(IEnumerable<IOperator> operators) {
     126      ConfigureCreators(operators.OfType<IBinaryVectorCreator>());
     127      ConfigureCrossovers(operators.OfType<IBinaryVectorCrossover>());
     128      ConfigureManipulators(operators.OfType<IBinaryVectorManipulator>());
     129      ConfigureMoveOperators(operators.OfType<IBinaryVectorMoveOperator>());
     130      ConfigureShakingOperators(operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>());
     131    }
     132
     133    #region Specific Operator Wiring
     134    private void ConfigureCreators(IEnumerable<IBinaryVectorCreator> creators) {
     135      foreach (var creator in creators) {
     136        creator.BinaryVectorParameter.ActualName = Name;
     137        creator.LengthParameter.ActualName = LengthParameter.Name;
     138      }
     139    }
     140    private void ConfigureCrossovers(IEnumerable<IBinaryVectorCrossover> crossovers) {
     141      foreach (var crossover in crossovers) {
     142        crossover.ParentsParameter.ActualName = Name;
     143        crossover.ChildParameter.ActualName = Name;
     144      }
     145    }
     146    private void ConfigureManipulators(IEnumerable<IBinaryVectorManipulator> manipulators) {
     147      foreach (var manipulator in manipulators) {
     148        manipulator.BinaryVectorParameter.ActualName = Name;
     149      }
     150    }
     151    private void ConfigureMoveOperators(IEnumerable<IBinaryVectorMoveOperator> moveOperators) {
     152      foreach (var moveOperator in moveOperators) {
     153        moveOperator.BinaryVectorParameter.ActualName = Name;
     154      }
     155    }
     156    private void ConfigureShakingOperators(IEnumerable<IBinaryVectorMultiNeighborhoodShakingOperator> shakingOperators) {
     157      foreach (var shakingOperator in shakingOperators) {
     158        shakingOperator.BinaryVectorParameter.ActualName = Name;
     159      }
     160    }
     161    #endregion
    57162  }
    58163}
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs

    r11550 r11553  
    2525using HeuristicLab.Common;
    2626using HeuristicLab.Core;
     27using HeuristicLab.Optimization;
    2728using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2829
     
    3536    }
    3637
    37     [StorableConstructor]
    38     protected Encoding(bool deserializing) : base(deserializing) { }
    39     protected Encoding(Encoding original, Cloner cloner)
    40       : base(original, cloner) { }
    41     protected Encoding(string name) : base(name) { }
    42 
    4338    public virtual IEnumerable<IValueParameter> Parameters {
    4439      get { return Enumerable.Empty<IValueParameter>(); }
     
    5045    }
    5146
     47    public virtual ISolutionCreator DefaultSolutionCreator {
     48      get { return null; }
     49    }
     50
     51    [StorableConstructor]
     52    protected Encoding(bool deserializing) : base(deserializing) { }
     53    protected Encoding(Encoding original, Cloner cloner)
     54      : base(original, cloner) { }
     55    protected Encoding(string name) : base(name) { }
     56
    5257    public event EventHandler ParameterConfigurationChanged;
    5358    protected virtual void OnParameterConfigurationChanged() {
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs

    r11550 r11553  
    7676    }
    7777
    78     public IRealVectorCreator DefaultSolutionCreator {
     78    public override ISolutionCreator DefaultSolutionCreator {
    7979      get { return Operators.OfType<UniformRandomRealVectorCreator>().First(); }
    8080    }
     
    166166    static RealEncoding() {
    167167      encodingSpecificOperatorTypes = new List<Type>() {
     168        typeof (IRealVectorOperator),
    168169        typeof (IRealVectorCreator),
    169170        typeof (IRealVectorCrossover),
Note: See TracChangeset for help on using the changeset viewer.