Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEncoding.cs @ 15334

Last change on this file since 15334 was 15334, checked in by pkimmesw, 7 years ago

#2665 Testet Problems, Testet error functions, Small fixes, Created HL files

File size: 14.5 KB
Line 
1using System.Collections.Generic;
2
3namespace HeuristicLab.Problems.ProgramSynthesis.Push.Encoding {
4  using System;
5  using System.Linq;
6
7  using HeuristicLab.Common;
8  using HeuristicLab.Core;
9  using HeuristicLab.Data;
10  using HeuristicLab.Optimization;
11  using HeuristicLab.Parameters;
12  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
13  using HeuristicLab.PluginInfrastructure;
14  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc;
15  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
16  using HeuristicLab.Problems.ProgramSynthesis.Push.Crossover;
17  using HeuristicLab.Problems.ProgramSynthesis.Push.Manipulator;
18  using HeuristicLab.Problems.ProgramSynthesis.Push.SolutionCreator;
19
20  [Item("PlushEncoding", "Describes an linear push (Plush) encoding.")]
21  [StorableClass]
22  public class PlushEncoding : Encoding<IPlushCreator> {
23
24    public PlushEncoding() : this("Plush") { }
25
26    public PlushEncoding(string name) : base(name) {
27      minLengthParameter = new FixedValueParameter<IntValue>(Name + ".MinLength", new IntValue(25));
28      maxLengthParameter = new FixedValueParameter<IntValue>(Name + ".MaxLength", new IntValue(100));
29      maxCloseParameter = new FixedValueParameter<IntValue>(Name + ".MaxClose", new IntValue(3));
30      closeBiasLevelParameter = new FixedValueParameter<DoubleValue>(Name + ".CloseBiasLevel", new DoubleValue(3d));
31      instructionsParameter = new ValueParameter<IExpressionsConfiguration>(Name + ".Instructions");
32      ercOptionsParameter = new ValueParameter<ErcOptions>(Name + ".ErcOptions");
33      inInstructionProbabilityParameter = new FixedValueParameter<PercentValue>(Name + ".InInstructionProbability", new PercentValue(0.1));
34
35      Parameters.Add(minLengthParameter);
36      Parameters.Add(maxLengthParameter);
37      Parameters.Add(maxCloseParameter);
38      Parameters.Add(closeBiasLevelParameter);
39      Parameters.Add(instructionsParameter);
40      Parameters.Add(ercOptionsParameter);
41      Parameters.Add(inInstructionProbabilityParameter);
42
43      SolutionCreator = new PlushCreator();
44      RegisterParameterEvents();
45      DiscoverOperators();
46    }
47
48    public PlushEncoding(bool deserializing)
49      : base(deserializing) {
50    }
51
52    public PlushEncoding(PlushEncoding original, Cloner cloner)
53      : base(original, cloner) {
54      minLengthParameter = cloner.Clone(original.minLengthParameter);
55      maxLengthParameter = cloner.Clone(original.maxLengthParameter);
56    }
57
58    [StorableHook(HookType.AfterDeserialization)]
59    private void AfterDeserialization() {
60      RegisterParameterEvents();
61      DiscoverOperators();
62    }
63
64    public override IDeepCloneable Clone(Cloner cloner) {
65      return new PlushEncoding(this, cloner);
66    }
67
68    #region events
69
70    private void OnMinLengthParameterChanged() {
71      RegisterMinLengthParameterEvents();
72      ConfigureOperators(Operators);
73    }
74    private void OnMaxLengthParameterChanged() {
75      RegisterMaxLengthParameterEvents();
76      ConfigureOperators(Operators);
77    }
78    private void OnMaxCloseParameterChanged() {
79      RegisterMaxCloseParameterEvents();
80      ConfigureOperators(Operators);
81    }
82    private void OnCloseBiasLevelParameterChanged() {
83      RegisterCloseBiasLevelParameterEvents();
84      ConfigureOperators(Operators);
85    }
86    private void OnErcOptionsParameterChanged() {
87      RegisterErcOptionsParameterEvents();
88      ConfigureOperators(Operators);
89    }
90    private void OnInstructionsParameterChanged() {
91      RegisterInstructionsParameterEvents();
92      ConfigureOperators(Operators);
93    }
94    private void OnInInstructionProbabilityParameterChanged() {
95      RegisterInInstructionProbabilityParameterEvents();
96      ConfigureOperators(Operators);
97    }
98
99    private void RegisterParameterEvents() {
100      RegisterMinLengthParameterEvents();
101      RegisterMaxLengthParameterEvents();
102      RegisterMaxCloseParameterEvents();
103      RegisterCloseBiasLevelParameterEvents();
104      RegisterErcOptionsParameterEvents();
105      RegisterInstructionsParameterEvents();
106      RegisterInInstructionProbabilityParameterEvents();
107    }
108
109    private void RegisterMinLengthParameterEvents() {
110      MinLengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
111      MinLengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
112    }
113
114    private void RegisterMaxLengthParameterEvents() {
115      MaxLengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
116      MaxLengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
117    }
118
119    private void RegisterMaxCloseParameterEvents() {
120      MaxCloseParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
121      MaxCloseParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
122    }
123
124    private void RegisterCloseBiasLevelParameterEvents() {
125      CloseBiasLevelParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
126      CloseBiasLevelParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
127    }
128
129    private void RegisterInInstructionProbabilityParameterEvents() {
130      InInstructionProbabilityParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
131      InInstructionProbabilityParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
132    }
133
134    private void RegisterErcOptionsParameterEvents() {
135      ErcOptionsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
136    }
137
138    private void RegisterInstructionsParameterEvents() {
139      InstructionsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
140    }
141
142    #endregion
143
144    #region Encoding Parameters
145    [Storable]
146    private IValueParameter<IntValue> minLengthParameter;
147    public IValueParameter<IntValue> MinLengthParameter
148    {
149      get { return minLengthParameter; }
150      set
151      {
152        if (value == null) throw new ArgumentNullException("Min length parameter must not be null.");
153        if (value.Value == null) throw new ArgumentNullException("Min length parameter value must not be null.");
154        if (minLengthParameter == value) return;
155
156        if (minLengthParameter != null) Parameters.Remove(minLengthParameter);
157        minLengthParameter = value;
158        Parameters.Add(minLengthParameter);
159        OnMinLengthParameterChanged();
160      }
161    }
162
163    [Storable]
164    private IValueParameter<IntValue> maxLengthParameter;
165    public IValueParameter<IntValue> MaxLengthParameter
166    {
167      get { return maxLengthParameter; }
168      set
169      {
170        if (value == null) throw new ArgumentNullException("Max length parameter must not be null.");
171        if (value.Value == null) throw new ArgumentNullException("Max length parameter value must not be null.");
172        if (maxLengthParameter == value) return;
173
174        if (maxLengthParameter != null) Parameters.Remove(maxLengthParameter);
175        maxLengthParameter = value;
176        Parameters.Add(maxLengthParameter);
177        OnMaxLengthParameterChanged();
178      }
179    }
180
181    [Storable]
182    private IValueParameter<IntValue> maxCloseParameter;
183    public IValueParameter<IntValue> MaxCloseParameter
184    {
185      get { return maxCloseParameter; }
186      set
187      {
188        if (value == null) throw new ArgumentNullException("Max close parameter must not be null.");
189        if (value.Value == null) throw new ArgumentNullException("Max close parameter value must not be null.");
190        if (maxCloseParameter == value) return;
191
192        if (maxCloseParameter != null) Parameters.Remove(maxCloseParameter);
193        maxCloseParameter = value;
194        Parameters.Add(maxCloseParameter);
195        OnMaxCloseParameterChanged();
196      }
197    }
198
199    [Storable]
200    private IValueParameter<DoubleValue> closeBiasLevelParameter;
201    public IValueParameter<DoubleValue> CloseBiasLevelParameter
202    {
203      get { return closeBiasLevelParameter; }
204      set
205      {
206        if (value == null) throw new ArgumentNullException("Close bias level parameter must not be null.");
207        if (value.Value == null) throw new ArgumentNullException("Close bias level parameter value must not be null.");
208        if (closeBiasLevelParameter == value) return;
209
210        if (closeBiasLevelParameter != null) Parameters.Remove(closeBiasLevelParameter);
211        closeBiasLevelParameter = value;
212        Parameters.Add(closeBiasLevelParameter);
213        OnCloseBiasLevelParameterChanged();
214      }
215    }
216
217    [Storable]
218    private IValueParameter<PercentValue> inInstructionProbabilityParameter;
219    public IValueParameter<PercentValue> InInstructionProbabilityParameter
220    {
221      get { return inInstructionProbabilityParameter; }
222      set
223      {
224        if (value == null) throw new ArgumentNullException("In instruciton probability parameter must not be null.");
225        if (value.Value == null) throw new ArgumentNullException("In instruciton probability parameter value must not be null.");
226        if (inInstructionProbabilityParameter == value) return;
227
228        if (inInstructionProbabilityParameter != null) Parameters.Remove(inInstructionProbabilityParameter);
229        inInstructionProbabilityParameter = value;
230        Parameters.Add(inInstructionProbabilityParameter);
231        OnInInstructionProbabilityParameterChanged();
232      }
233    }
234
235    [Storable]
236    private IValueParameter<IExpressionsConfiguration> instructionsParameter;
237    public IValueParameter<IExpressionsConfiguration> InstructionsParameter
238    {
239      get { return instructionsParameter; }
240      set
241      {
242        if (value == null) throw new ArgumentNullException("Instructions paramter must not be null");
243        if (instructionsParameter == value) return;
244
245        if (instructionsParameter != null) Parameters.Remove(instructionsParameter);
246        instructionsParameter = value;
247        Parameters.Add(instructionsParameter);
248        OnInstructionsParameterChanged();
249      }
250    }
251
252    [Storable]
253    private IValueParameter<ErcOptions> ercOptionsParameter;
254    public IValueParameter<ErcOptions> ErcOptionsParameter
255    {
256      get { return ercOptionsParameter; }
257      set
258      {
259        if (value == null) throw new ArgumentNullException("ErcOptions paramter must not be null");
260        if (ercOptionsParameter == value) return;
261
262        if (ercOptionsParameter != null) Parameters.Remove(ercOptionsParameter);
263        ercOptionsParameter = value;
264        Parameters.Add(ercOptionsParameter);
265        OnErcOptionsParameterChanged();
266      }
267    }
268
269    public IExpressionsConfiguration Instructions
270    {
271      get { return InstructionsParameter.Value; }
272      set { InstructionsParameter.Value = value; }
273    }
274
275    public ErcOptions ErcOptions
276    {
277      get { return ErcOptionsParameter.Value; }
278      set { ErcOptionsParameter.Value = value; }
279    }
280
281    public int MinLength
282    {
283      get { return MinLengthParameter.Value.Value; }
284      set { MinLengthParameter.Value.Value = value; }
285    }
286
287    public int MaxLength
288    {
289      get { return MaxLengthParameter.Value.Value; }
290      set { MaxLengthParameter.Value.Value = value; }
291    }
292
293    public int MaxClose
294    {
295      get { return MaxCloseParameter.Value.Value; }
296      set { MaxCloseParameter.Value.Value = value; }
297    }
298
299    public double InInstructionProbability
300    {
301      get { return InInstructionProbabilityParameter.Value.Value; }
302      set { InInstructionProbabilityParameter.Value.Value = value; }
303    }
304    #endregion
305
306    #region Operator Discovery
307    private static readonly IEnumerable<Type> EncodingSpecificOperatorTypes;
308    static PlushEncoding() {
309      EncodingSpecificOperatorTypes = new List<Type>() {
310        typeof (IPlushOperator),
311        typeof (IPlushCreator),
312        typeof (IPlushCrossover),
313        typeof (IPlushManipulator),
314      };
315    }
316
317    private void DiscoverOperators() {
318      var assembly = typeof(IPlushOperator).Assembly;
319      var discoveredTypes = ApplicationManager.Manager.GetTypes(EncodingSpecificOperatorTypes, assembly, true, false, false);
320      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
321      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
322
323      ConfigureOperators(newOperators);
324      foreach (var @operator in newOperators)
325        AddOperator(@operator);
326    }
327    #endregion
328
329    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
330      ConfigureCreators(operators.OfType<IPlushCreator>());
331      ConfigureCrossovers(operators.OfType<IPlushCrossover>());
332      ConfigureManipulators(operators.OfType<IPlushManipulator>());
333    }
334
335    private void ConfigureCreators(IEnumerable<IPlushCreator> creators) {
336      foreach (var creator in creators) {
337        creator.PlushVectorParameter.ActualName = Name;
338        creator.MinLengthParameter.ActualName = MinLengthParameter.Name;
339        creator.MaxLengthParameter.ActualName = MaxLengthParameter.Name;
340        creator.MaxCloseParameter.ActualName = MaxCloseParameter.Name;
341        creator.CloseBiasLevelParameter.ActualName = CloseBiasLevelParameter.Name;
342        creator.ErcOptionsParameter.ActualName = ErcOptionsParameter.Name;
343        creator.InstructionsParameter.ActualName = InstructionsParameter.Name;
344        creator.InInstructionProbabilityParameter.ActualName = InInstructionProbabilityParameter.Name;
345      }
346    }
347
348    private void ConfigureCrossovers(IEnumerable<IPlushCrossover> crossovers) {
349      foreach (var crossover in crossovers) {
350        crossover.ChildParameter.ActualName = Name;
351        crossover.ParentsParameter.ActualName = Name;
352      }
353    }
354
355    private void ConfigureManipulators(IEnumerable<IPlushManipulator> manipulators) {
356      foreach (var manipulator in manipulators) {
357        manipulator.PlushVectorParameter.ActualName = Name;
358        manipulator.PlushVectorParameter.Hidden = true;
359
360        manipulator.ErcOptionsParameter.ActualName = ErcOptionsParameter.Name;
361        manipulator.InstructionsParameter.ActualName = InstructionsParameter.Name;
362        manipulator.InInstructionProbabilityParameter.ActualName = InInstructionProbabilityParameter.Name;
363      }
364    }
365  }
366
367  public static class IndividualExtensionMethods {
368    public static PlushVector PlushVector(this Individual individual) {
369      var encoding = individual.GetEncoding<PlushEncoding>();
370      return individual.PlushVector(encoding.Name);
371    }
372
373    public static PlushVector PlushVector(this Individual individual, string name) {
374      return (PlushVector)individual[name];
375    }
376  }
377}
Note: See TracBrowser for help on using the repository browser.