Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfigurationBase.cs @ 15017

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

#2665 Fixed Benchmark Problem Definition, Converted LoopExpressions to stateless expressions, Added several unit test to ensure funcionality, Fixed UI bugs

File size: 7.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4
5namespace HeuristicLab.Problems.ProgramSynthesis.Push.Configuration {
6  using HeuristicLab.Common;
7  using HeuristicLab.Core;
8  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
9  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
10  using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
11
12  [StorableClass]
13  public abstract class PushConfigurationBase : NamedItem, IEnabledExpressionsConfiguration {
14
15    protected PushConfigurationBase() {
16      Name = "Push Configuration";
17
18      enabledExpressions = ExpressionTable.ExpressionNames.ToList();
19      enabledStacks = new Dictionary<StackTypes, bool>();
20
21      InitEnabledStacks();
22    }
23
24    [StorableConstructor]
25    protected PushConfigurationBase(bool deserializing) : base(deserializing) { }
26
27    protected PushConfigurationBase(PushConfigurationBase origin, Cloner cloner) : base(origin, cloner) {
28      enabledExpressions = origin.EnabledExpressions.ToList();
29      enabledStacks = origin.EnabledStacks.ToDictionary(x => x.Key, x => x.Value);
30    }
31
32    [Storable]
33    private readonly Dictionary<StackTypes, bool> enabledStacks;
34
35    public IReadOnlyDictionary<StackTypes, bool> EnabledStacks { get { return enabledStacks; } }
36
37    public event EventHandler<EnabledExpressionsChangedEventArgs> EnabledExpressionsChanged;
38
39    [Storable]
40    protected readonly List<string> enabledExpressions;
41
42    public IList<string> EnabledExpressions
43    {
44      get { return enabledExpressions; }
45      set
46      {
47        var removedExpressions = enabledExpressions.ToArray();
48        enabledExpressions.Clear();
49        enabledExpressions.AddRange(value);
50
51        if (EnabledExpressionsChanged != null) {
52          EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(value, removedExpressions));
53        }
54      }
55    }
56
57    private void InitEnabledStacks(bool state = true) {
58      foreach (StackTypes type in Enum.GetValues(typeof(StackTypes))) {
59        if (!enabledStacks.ContainsKey(type) && type != StackTypes.None)
60          enabledStacks.Add(type, state);
61      }
62    }
63
64    public void SetEnabledStacks(StackTypes types) {
65      // Disable all
66      EnabledExpressions.Clear();
67
68      foreach (StackTypes type in Enum.GetValues(types.GetType())) {
69        if (type == StackTypes.None) continue;
70        enabledStacks[type] = false;
71      }
72
73      foreach (var pair in ExpressionTable.StackDependencyToNamesTable) {
74        if (types.HasFlag(pair.Key)) {
75          foreach (var name in pair.Value) {
76            EnableExpression(name, true);
77          }
78        }
79      }
80    }
81
82    public void EnableExpressionOfStack(StackTypes types) {
83      EnableExpressions(ExpressionTable.StackTypeToNamesTable[types]);
84    }
85
86    public void EnableExpressionDependentOnStack(StackTypes types) {
87      var names = ExpressionTable.StackDependencyToNamesTable[types].Where(
88        name => {
89          var type = ExpressionTable.NameToTypeTable[name];
90          var attribute = ExpressionTable.TypeToAttributeTable[type];
91
92          return (attribute.StackType | attribute.AdditionalStackDependencies)
93            .ToEnumerable()
94            .All(st => enabledStacks.ContainsKey(st) && enabledStacks[st]);
95        });
96
97      EnableExpressions(names);
98    }
99
100    private void EnableExpressions(IEnumerable<string> names) {
101      foreach (var name in names.Except(EnabledExpressions))
102        EnabledExpressions.Add(name);
103
104      if (EnabledExpressionsChanged != null) {
105        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(names, new string[0]));
106      }
107    }
108
109    public void DisableExpressionsOfStack(StackTypes types) {
110      DisableExpressions(ExpressionTable.StackTypeToNamesTable[types]);
111    }
112
113    public void DisableExpressionsDependentOnStack(StackTypes types) {
114      var names = ExpressionTable.StackDependencyToNamesTable
115          .Where(pair => pair.Key.HasFlag(types))
116          .SelectMany(pair => pair.Value);
117
118      DisableExpressions(names);
119    }
120
121    private void DisableExpressions(IEnumerable<string> names) {
122      foreach (var name in names.Intersect(EnabledExpressions))
123        EnabledExpressions.Remove(name);
124
125      if (EnabledExpressionsChanged != null) {
126        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(new string[0], names));
127      }
128    }
129
130    public void EnableExpression(string name, bool enableStackIfDisabled = false) {
131      if (EnabledExpressions.Contains(name)) return;
132
133      EnabledExpressions.Add(name);
134
135      if (enableStackIfDisabled) {
136        var type = ExpressionTable.TypeToNameTable.Single(x => x.Value == name).Key;
137        var attribute = ExpressionTable.TypeToAttributeTable[type];
138        enabledStacks[attribute.StackType] = true;
139      }
140
141      if (EnabledExpressionsChanged != null) {
142        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(
143          new[] { name },
144          new string[0]));
145      }
146    }
147
148    public void DisableExpression(string name, bool disableStackIfEnabled = false) {
149      if (!EnabledExpressions.Contains(name)) return;
150
151      EnabledExpressions.Remove(name);
152
153      if (disableStackIfEnabled) {
154        var type = ExpressionTable.TypeToNameTable.Single(x => x.Value == name).Key;
155        var attribute = ExpressionTable.TypeToAttributeTable[type];
156        enabledStacks[attribute.StackType] = false;
157      }
158
159      if (EnabledExpressionsChanged != null) {
160        EnabledExpressionsChanged(this, new EnabledExpressionsChangedEventArgs(
161          new string[0],
162          new[] { name }));
163      }
164    }
165
166    public void EnableExpression<T>(bool enableStackIfDisabled = false) where T : Expression {
167      var attribute = ExpressionTable.TypeToAttributeTable[typeof(T)];
168      EnableExpression(attribute.ExpressionName, enableStackIfDisabled);
169    }
170
171    public void DisableExpression<T>(bool disableStackIfEnabled = false) where T : Expression {
172      var attribute = ExpressionTable.TypeToAttributeTable[typeof(T)];
173      DisableExpression(attribute.ExpressionName, disableStackIfEnabled);
174    }
175
176    public void SetExpression(string name, bool state, bool cascadeForStack = false) {
177      if (state) EnableExpression(name, cascadeForStack);
178      else DisableExpression(name, cascadeForStack);
179    }
180
181    public void SetExpression<T>(bool state, bool cascadeForStack = false) where T : Expression {
182      if (state) EnableExpression<T>(cascadeForStack);
183      else DisableExpression<T>(cascadeForStack);
184    }
185
186    public void EnableStack(StackTypes type, bool enableExpressions = true, bool enableDependencies = true) {
187      enabledStacks[type] = true;
188
189      if (enableExpressions) EnableExpressionOfStack(type);
190      if (enableDependencies) EnableExpressionDependentOnStack(type);
191    }
192
193    public void DisableStack(StackTypes type, bool disableExpressions = true, bool disableDependencies = true) {
194      enabledStacks[type] = false;
195
196      if (disableExpressions) DisableExpressionsOfStack(type);
197      if (disableDependencies) DisableExpressionsDependentOnStack(type);
198    }
199
200    public void SetStack(StackTypes type, bool state, bool setExpressions = true, bool setDependencies = true) {
201      if (state) EnableStack(type, setExpressions, setDependencies);
202      else DisableStack(type, setExpressions, setDependencies);
203    }
204  }
205}
Note: See TracBrowser for help on using the repository browser.