Free cookie consent management tool by TermsFeed Policy Generator

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

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

#2665 Fixed analyzer, fixed Plush encoding + operators, adpated print evaluation according to McPhee

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