Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/20/14 17:20:29 (10 years ago)
Author:
mkommend
Message:

#2174: Adapted IntegerEncoding to include the wiring code of operators.

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

Legend:

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

    r11559 r11561  
    2727using HeuristicLab.Data;
    2828using HeuristicLab.Encodings.IntegerVectorEncoding;
     29using HeuristicLab.Optimization;
    2930using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     31using HeuristicLab.PluginInfrastructure;
    3032
    3133namespace HeuristicLab.Problems.Programmable {
     
    3335  [StorableClass]
    3436  public class IntegerEncoding : Encoding<IIntegerVectorCreator> {
     37    #region Encoding Parameters
    3538    [Storable]
    36     private IntValue length;
    37     public IntValue Length {
    38       get { return length; }
     39    private IFixedValueParameter<IntValue> lengthParameter;
     40    public IFixedValueParameter<IntValue> LengthParameter {
     41      get { return lengthParameter; }
    3942      set {
    40         if (length == value) return;
    41         length = value;
    42         OnParameterConfigurationChanged();
     43        if (value == null) throw new ArgumentNullException("Length parameter must not be null.");
     44        if (lengthParameter == value) return;
     45        lengthParameter = value;
     46        OnLengthParameterChanged();
    4347      }
    4448    }
    4549
    4650    [Storable]
    47     private IntMatrix bounds;
     51    private IValueParameter<IntMatrix> boundsParameter;
     52    public IValueParameter<IntMatrix> BoundsParameter {
     53      get { return boundsParameter; }
     54      set {
     55        if (value == null) throw new ArgumentNullException("Bounds parameter must not be null.");
     56        if (boundsParameter == value) return;
     57        boundsParameter = value;
     58        OnBoundsParameterChanged();
     59      }
     60    }
     61
     62    public override IEnumerable<IValueParameter> Parameters {
     63      get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter, BoundsParameter }); }
     64    }
     65    #endregion
     66
     67    public int Length {
     68      get { return LengthParameter.Value.Value; }
     69      set { LengthParameter.Value.Value = value; }
     70    }
    4871    public IntMatrix Bounds {
    49       get { return bounds; }
    50       set {
    51         if (bounds == value) return;
    52         bounds = value;
    53         OnParameterConfigurationChanged();
    54       }
     72      get { return BoundsParameter.Value; }
     73      set { BoundsParameter.Value = value; }
    5574    }
    5675
    5776    [StorableConstructor]
    5877    protected IntegerEncoding(bool deserializing) : base(deserializing) { }
     78    [StorableHook(HookType.AfterDeserialization)]
     79    private void AfterDeserialization() {
     80      RegisterParameterEvents();
     81      DiscoverOperators();
     82    }
     83
    5984    protected IntegerEncoding(IntegerEncoding original, Cloner cloner)
    6085      : base(original, cloner) {
    61       length = cloner.Clone(original.length);
    62       bounds = cloner.Clone(original.bounds);
    63     }
     86      lengthParameter = cloner.Clone(original.lengthParameter);
     87      boundsParameter = cloner.Clone(original.boundsParameter);
     88      RegisterParameterEvents();
     89      DiscoverOperators();
     90    }
     91    public override IDeepCloneable Clone(Cloner cloner) { return new IntegerEncoding(this, cloner); }
     92
    6493    public IntegerEncoding(string name, int length, int min, int max, int? step = null)
    6594      : base(name) {
    6695      if (min >= max) throw new ArgumentException("min must be less than max", "min");
    6796      if (step.HasValue && step.Value <= 0) throw new ArgumentException("step must be greater than zero or null", "step");
    68       this.length = new IntValue(length);
    69       bounds = new IntMatrix(1, step.HasValue ? 3 : 2);
    70       bounds[0, 0] = min;
    71       bounds[0, 1] = max;
    72       if (step.HasValue) bounds[0, 2] = step.Value;
     97      Length = length;
     98      Bounds = new IntMatrix(1, step.HasValue ? 3 : 2);
     99      Bounds[0, 0] = min;
     100      Bounds[0, 1] = max;
     101      if (step.HasValue) Bounds[0, 2] = step.Value;
     102      RegisterParameterEvents();
     103      DiscoverOperators();
    73104    }
    74105    public IntegerEncoding(string name, int length, IList<int> min, IList<int> max, IList<int> step = null)
     
    78109      if (step != null && min.Count != step.Count) throw new ArgumentException("step must be of the same length as min or null", "step");
    79110      if (min.Zip(max, (mi, ma) => mi >= ma).Any(x => x)) throw new ArgumentException("min must be less than max in each dimension", "min");
    80       this.length = new IntValue(length);
    81       bounds = new IntMatrix(min.Count, step != null ? 3 : 2);
     111      Length = length;
     112      Bounds = new IntMatrix(min.Count, step != null ? 3 : 2);
    82113      for (int i = 0; i < min.Count; i++) {
    83         bounds[i, 0] = min[i];
    84         bounds[i, 1] = max[i];
    85         if (step != null) bounds[i, 2] = step[i];
    86       }
    87     }
    88 
    89     public override IDeepCloneable Clone(Cloner cloner) {
    90       return new IntegerEncoding(this, cloner);
    91     }
    92 
     114        Bounds[i, 0] = min[i];
     115        Bounds[i, 1] = max[i];
     116        if (step != null) Bounds[i, 2] = step[i];
     117      }
     118      RegisterParameterEvents();
     119      DiscoverOperators();
     120    }
     121
     122    private void OnLengthParameterChanged() {
     123      RegisterLengthParameterEvents();
     124      ConfigureOperators(Operators);
     125    }
     126    private void OnBoundsParameterChanged() {
     127      RegisterBoundsParameterEvents();
     128      ConfigureOperators(Operators);
     129    }
     130
     131    private void RegisterParameterEvents() {
     132      RegisterLengthParameterEvents();
     133      RegisterBoundsParameterEvents();
     134    }
     135    private void RegisterLengthParameterEvents() {
     136      LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
     137      LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
     138    }
     139    private void RegisterBoundsParameterEvents() {
     140      BoundsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
     141      boundsParameter.Value.ToStringChanged += (o, s) => ConfigureOperators(Operators);
     142    }
     143
     144
     145    #region Operator Discovery
     146    private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
     147    static IntegerEncoding() {
     148      encodingSpecificOperatorTypes = new List<Type>() {
     149        typeof (IIntegerVectorOperator),
     150        typeof (IIntegerVectorCreator),
     151        typeof (IIntegerVectorCrossover),
     152        typeof (IIntegerVectorManipulator),
     153        typeof (IIntegerVectorStdDevStrategyParameterOperator),
     154        typeof (IIntegerVectorMultiNeighborhoodShakingOperator),
     155      };
     156    }
     157    private void DiscoverOperators() {
     158      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, true, false, false);
     159      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
     160      var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList();
     161
     162      ConfigureOperators(newOperators);
     163      encodingOperators.AddRange(newOperators);
     164    }
     165    #endregion
     166
     167    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
     168      ConfigureBoundedOperators(Operators.OfType<IBoundedIntegerVectorOperator>());
     169      ConfigureCreators(Operators.OfType<IIntegerVectorCreator>());
     170      ConfigureCrossovers(Operators.OfType<IIntegerVectorCrossover>());
     171      ConfigureManipulators(Operators.OfType<IIntegerVectorManipulator>());
     172      ConfigureShakingOperators(Operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>());
     173      ConfigureStrategyVectorOperator(Operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>());
     174    }
     175
     176    #region Specific Operator Wiring
     177    private void ConfigureBoundedOperators(IEnumerable<IBoundedIntegerVectorOperator> boundedOperators) {
     178      foreach (var boundedOperator in boundedOperators) {
     179        boundedOperator.BoundsParameter.ActualName = BoundsParameter.Name;
     180      }
     181    }
     182
     183    private void ConfigureCreators(IEnumerable<IIntegerVectorCreator> creators) {
     184      foreach (var creator in creators) {
     185        creator.IntegerVectorParameter.ActualName = Name;
     186        creator.BoundsParameter.ActualName = BoundsParameter.Name;
     187        creator.LengthParameter.ActualName = LengthParameter.Name;
     188      }
     189    }
     190
     191    private void ConfigureCrossovers(IEnumerable<IIntegerVectorCrossover> crossovers) {
     192      foreach (var crossover in crossovers) {
     193        crossover.ChildParameter.ActualName = Name;
     194        crossover.ParentsParameter.ActualName = Name;
     195      }
     196    }
     197
     198    private void ConfigureManipulators(IEnumerable<IIntegerVectorManipulator> manipulators) {
     199      foreach (var manipulator in manipulators) {
     200        manipulator.IntegerVectorParameter.ActualName = Name;
     201        manipulator.IntegerVectorParameter.Hidden = true;
     202        var sm = manipulator as ISelfAdaptiveManipulator;
     203        if (sm != null) {
     204          var p = sm.StrategyParameterParameter as ILookupParameter;
     205          if (p != null) {
     206            p.ActualName = Name + "Strategy";
     207          }
     208        }
     209      }
     210    }
     211
     212    private void ConfigureShakingOperators(IEnumerable<IIntegerVectorMultiNeighborhoodShakingOperator> shakingOperators) {
     213      foreach (var shakingOperator in shakingOperators) {
     214        shakingOperator.IntegerVectorParameter.ActualName = Name;
     215      }
     216    }
     217
     218    private void ConfigureStrategyVectorOperator(IEnumerable<IIntegerVectorStdDevStrategyParameterOperator> strategyVectorOperators) {
     219      var bounds = new DoubleMatrix(Bounds.Rows, Bounds.Columns);
     220      for (var i = 0; i < bounds.Rows; i++) {
     221        bounds[i, 1] = (int)Math.Ceiling(0.33 * (Bounds[i, 1] - Bounds[i, 0]));
     222        bounds[i, 0] = 0;
     223        if (bounds.Columns > 2) bounds[i, 2] = Bounds[i, 2];
     224      }
     225      foreach (var s in strategyVectorOperators) {
     226        var c = s as IIntegerVectorStdDevStrategyParameterCreator;
     227        if (c != null) {
     228          c.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
     229          c.LengthParameter.ActualName = Name;
     230          c.StrategyParameterParameter.ActualName = Name + "Strategy";
     231        }
     232        var m = s as IIntegerVectorStdDevStrategyParameterManipulator;
     233        if (m != null) {
     234          m.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
     235          m.StrategyParameterParameter.ActualName = Name + "Strategy";
     236        }
     237        var mm = s as StdDevStrategyVectorManipulator;
     238        if (mm != null) {
     239          mm.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Length));
     240          mm.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(Length)));
     241        }
     242        var x = s as IIntegerVectorStdDevStrategyParameterCrossover;
     243        if (x != null) {
     244          x.ParentsParameter.ActualName = Name + "Strategy";
     245          x.StrategyParameterParameter.ActualName = Name + "Strategy";
     246        }
     247      }
     248    }
     249    #endregion
    93250  }
    94251}
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs

    r11559 r11561  
    148148    static RealEncoding() {
    149149      encodingSpecificOperatorTypes = new List<Type>() {
    150   typeof (IRealVectorOperator),
    151   typeof (IRealVectorCreator),
    152   typeof (IRealVectorCrossover),
    153   typeof (IRealVectorManipulator),
    154   typeof (IRealVectorStdDevStrategyParameterOperator),
    155   typeof (IRealVectorSwarmUpdater),
    156   typeof (IRealVectorParticleCreator),
    157   typeof (IRealVectorParticleUpdater),
    158   typeof (IRealVectorMultiNeighborhoodShakingOperator),
    159   typeof (IRealVectorBoundsChecker),
    160   typeof (IRealVectorMoveOperator),
    161   typeof (IRealVectorMoveGenerator)
    162   };
     150          typeof (IRealVectorOperator),
     151          typeof (IRealVectorCreator),
     152          typeof (IRealVectorCrossover),
     153          typeof (IRealVectorManipulator),
     154          typeof (IRealVectorStdDevStrategyParameterOperator),
     155          typeof (IRealVectorSwarmUpdater),
     156          typeof (IRealVectorParticleCreator),
     157          typeof (IRealVectorParticleUpdater),
     158          typeof (IRealVectorMultiNeighborhoodShakingOperator),
     159          typeof (IRealVectorBoundsChecker),
     160          typeof (IRealVectorMoveOperator),
     161          typeof (IRealVectorMoveGenerator)
     162      };
    163163    }
    164164    private void DiscoverOperators() {
     
    223223          if (p != null) {
    224224            p.ActualName = Name + "Strategy";
    225             p.Hidden = true;
    226225          }
    227226        }
Note: See TracChangeset for help on using the changeset viewer.