Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfigurationBase.cs @ 15771

Last change on this file since 15771 was 15771, checked in by bburlacu, 6 years ago

#2895: Add solution skeleton for PushGP with genealogy analysis.

File size: 9.6 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4
5namespace HeuristicLab.Problems.ProgramSynthesis {
6  using HeuristicLab.Common;
7  using HeuristicLab.Core;
8  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
9
10  [StorableClass]
11  public abstract class PushConfigurationBase : NamedItem, IExpressionsConfiguration {
12
13    protected PushConfigurationBase() {
14      Name = "Push Configuration";
15
16      enabledExpressions = ExpressionTable.ExpressionNames.ToList();
17      expressionsPerStackCount = new Dictionary<StackTypes, int>();
18      InitExpressionsPerStackCount();
19    }
20
21    [StorableConstructor]
22    protected PushConfigurationBase(bool deserializing) : base(deserializing) { }
23
24    protected PushConfigurationBase(PushConfigurationBase origin, Cloner cloner) : base(origin, cloner) {
25      enabledExpressions = origin.EnabledExpressions.ToList();
26      expressionsPerStackCount = origin.expressionsPerStackCount.ToDictionary(x => x.Key, x => x.Value);
27      InExpressionCount = origin.InExpressionCount;
28      Seed = origin.Seed;
29    }
30
31    [Storable]
32    public int Seed { get; set; }
33
34    [Storable]
35    public int InExpressionCount { get; private set; }
36
37    [Storable]
38    private readonly Dictionary<StackTypes, int> expressionsPerStackCount;
39
40    public IReadOnlyDictionary<StackTypes, int> ExpressionsPerStackCount { get { return expressionsPerStackCount; } }
41
42    public event EventHandler<EnabledExpressionsChangedEventArgs> EnabledExpressionsChanged;
43
44    [Storable]
45    protected readonly List<string> enabledExpressions;
46
47    public bool IsStackEnabled(StackTypes type) {
48      int count;
49      return expressionsPerStackCount.TryGetValue(type, out count) && count > 0;
50    }
51
52    public IReadOnlyList<string> EnabledExpressions {
53      get { return enabledExpressions; }
54      set {
55        var removedExpressions = enabledExpressions.ToList();
56        enabledExpressions.Clear();
57        enabledExpressions.AddRange(value);
58
59        if (EnabledExpressionsChanged != null) {
60          EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(value, removedExpressions));
61        }
62      }
63    }
64
65    private void InitExpressionsPerStackCount() {
66      foreach (StackTypes type in Enum.GetValues(typeof(StackTypes))) {
67        if (type == StackTypes.None) continue;
68        expressionsPerStackCount.Add(type, 0);
69      }
70
71      foreach (var expressionName in ExpressionTable.ExpressionNames) {
72        var type = ExpressionTable.TypeToNameTable.Single(x => x.Value == expressionName).Key;
73        var attribute = ExpressionTable.TypeToAttributeTable[type];
74
75        if (expressionsPerStackCount.ContainsKey(attribute.StackType)) {
76          expressionsPerStackCount[attribute.StackType]++;
77        }
78
79        foreach (var additionalStackType in attribute.AdditionalStackDependencies.ToValues())
80          expressionsPerStackCount[additionalStackType]++;
81      }
82    }
83
84    public void SetEnabledStacks(StackTypes types) {
85      // Disable all
86      enabledExpressions.Clear();
87
88      foreach (StackTypes type in Enum.GetValues(typeof(StackTypes))) {
89        if (type == StackTypes.None) continue;
90        expressionsPerStackCount[type] = 0;
91      }
92
93      var expressionNames = ExpressionTable.StackDependencyToNamesTable
94        .Where(pair => types.HasFlag(pair.Key))
95        .SelectMany(pair => pair.Value);
96
97      EnableExpressions(expressionNames);
98    }
99
100    public void EnableExpressionOfStack(StackTypes types) {
101      EnableExpressions(ExpressionTable.StackTypeToNamesTable[types]);
102    }
103
104    public void EnableExpressionDependentOnStack(StackTypes types) {
105      var names = ExpressionTable.StackDependencyToNamesTable[types].Where(
106        name => {
107          var type = ExpressionTable.NameToTypeTable[name];
108          var attribute = ExpressionTable.TypeToAttributeTable[type];
109
110          return (attribute.StackType | attribute.AdditionalStackDependencies)
111            .ToEnumerable()
112            .All(IsStackEnabled);
113        });
114
115      EnableExpressions(names);
116    }
117
118    private void EnableExpressions(IEnumerable<string> expressionNames) {
119      var addedExpressions = expressionNames as IList<string> ?? expressionNames.ToList();
120
121      foreach (var expressionName in addedExpressions.Except(EnabledExpressions))
122        EnableExpression(expressionName, false);
123
124      if (EnabledExpressionsChanged != null) {
125        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(addedExpressions, new string[0]));
126      }
127    }
128
129    public void DisableExpressionsOfStack(StackTypes types) {
130      DisableExpressions(ExpressionTable.StackTypeToNamesTable[types]);
131    }
132
133    public void DisableExpressionsDependentOnStack(StackTypes types) {
134      var names = ExpressionTable.StackDependencyToNamesTable
135          .Where(pair => pair.Key.HasFlag(types))
136          .SelectMany(pair => pair.Value);
137
138      DisableExpressions(names);
139    }
140
141    private void DisableExpressions(IEnumerable<string> expressionNames) {
142      var removedExpressions = expressionNames as IList<string> ?? expressionNames.ToList();
143
144      foreach (var expressionName in removedExpressions.Intersect(EnabledExpressions))
145        DisableExpression(expressionName, false);
146
147      if (EnabledExpressionsChanged != null) {
148        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(new string[0], removedExpressions));
149      }
150    }
151
152    public void EnableExpression(string expressionName) {
153      EnableExpression(expressionName, true);
154    }
155
156    private void EnableExpression(string expressionName, bool triggerExpressionChanged) {
157      if (enabledExpressions.Contains(expressionName)) return;
158
159      var type = ExpressionTable.TypeToNameTable.Single(x => x.Value == expressionName).Key;
160      var attribute = ExpressionTable.TypeToAttributeTable[type];
161
162      enabledExpressions.Add(expressionName);
163
164      if (expressionsPerStackCount.ContainsKey(attribute.StackType))
165        expressionsPerStackCount[attribute.StackType]++;
166
167      foreach (var additionalStackType in attribute.AdditionalStackDependencies.ToValues().Where(expressionsPerStackCount.ContainsKey))
168        expressionsPerStackCount[additionalStackType]++;
169
170      if (EnabledExpressionsChanged != null && triggerExpressionChanged) {
171        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(
172          new[] { expressionName },
173          new string[0]));
174      }
175    }
176
177    public void DisableExpression(string expressionName) {
178      DisableExpression(expressionName, true);
179    }
180
181    public void DisableExpression(string expressionName, bool triggerExpressionChanged) {
182      if (!EnabledExpressions.Contains(expressionName)) return;
183
184      var type = ExpressionTable.TypeToNameTable.Single(x => x.Value == expressionName).Key;
185      var attribute = ExpressionTable.TypeToAttributeTable[type];
186
187      enabledExpressions.Remove(expressionName);
188
189      if (expressionsPerStackCount.ContainsKey(attribute.StackType))
190        expressionsPerStackCount[attribute.StackType]--;
191
192      foreach (var additionalStackType in attribute.AdditionalStackDependencies.ToValues().Where(expressionsPerStackCount.ContainsKey))
193        expressionsPerStackCount[additionalStackType]--;
194
195      if (EnabledExpressionsChanged != null && triggerExpressionChanged) {
196        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(
197          new string[0],
198          new[] { expressionName }));
199      }
200    }
201
202    public void EnableExpression<T>() where T : Expression {
203      var attribute = ExpressionTable.TypeToAttributeTable[typeof(T)];
204      EnableExpression(attribute.Name);
205    }
206
207    public void DisableExpression<T>() where T : Expression {
208      var attribute = ExpressionTable.TypeToAttributeTable[typeof(T)];
209      DisableExpression(attribute.Name);
210    }
211
212    public void SetExpression(string name, bool state) {
213      if (state) EnableExpression(name);
214      else DisableExpression(name);
215    }
216
217    public void SetExpression<T>(bool state) where T : Expression {
218      if (state) EnableExpression<T>();
219      else DisableExpression<T>();
220    }
221
222    public void EnableStack(StackTypes type, bool enableDependencies = false) {
223      EnableExpressionOfStack(type);
224
225      if (enableDependencies)
226        EnableExpressionDependentOnStack(type);
227    }
228
229    public void DisableStack(StackTypes type, bool disableDependencies = false) {
230      DisableExpressionsOfStack(type);
231
232      if (disableDependencies)
233        DisableExpressionsDependentOnStack(type);
234    }
235
236    public void SetStack(StackTypes type, bool state, bool setDependencies = false) {
237      if (state) EnableStack(type, setDependencies);
238      else DisableStack(type, setDependencies);
239    }
240
241    public void InitInExpressions(int totalInputArgumentCount) {
242      InExpressionCount = totalInputArgumentCount;
243
244      for (var i = 0; i < ExpressionTable.InExpressionTable.Count; i++) {
245        var expression = ExpressionTable.InExpressionTable[i];
246        var expressionName = ExpressionTable.TypeToNameTable[expression.GetType()];
247
248        DisableExpression(expressionName);
249      }
250
251      if (totalInputArgumentCount > ExpressionTable.InExpressionTable.Count)
252        throw new InvalidOperationException("More input arguments defined as InExpression types");
253
254      for (var i = 0; i < totalInputArgumentCount; i++) {
255        var expression = ExpressionTable.InExpressionTable[i];
256        var expressionName = ExpressionTable.TypeToNameTable[expression.GetType()];
257
258        EnableExpression(expressionName);
259      }
260    }
261  }
262}
Note: See TracBrowser for help on using the repository browser.