Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DefineExpressions.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: 10.6 KB
Line 
1namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
2  using System;
3  using System.Collections.Generic;
4
5  using Attributes;
6
7  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
8
9  using Interpreter;
10  using Stack;
11
12  /// <summary>
13  ///     Defines the name on top of the NAME stack as an instruction that will push the top item of the T stack onto the
14  ///     EXEC stack.
15  /// </summary>
16  /// <typeparam name="T">Stacktype</typeparam>
17  [StorableClass]
18  public abstract class DefineExpression<T> : StatelessExpression {
19    protected DefineExpression() { }
20    [StorableConstructor]
21    protected DefineExpression(bool deserializing) : base(deserializing) { }
22
23    protected void Eval(
24      IPushStack<T> stack,
25      IPushStack<string> nameStack,
26      IDictionary<string, Expression> customExpressions,
27      Func<T, Expression> creator) {
28      var name = nameStack.Pop();
29      var expression = creator(stack.Top);
30
31      if (customExpressions.ContainsKey(name)) customExpressions[name] = expression;
32      else customExpressions.Add(name, expression);
33    }
34  }
35
36  [PushExpression(StackTypes.Code, "CODE.DEFINE", StackTypes.Name)]
37  [StorableClass]
38  public class CodeDefineExpression : DefineExpression<Expression> {
39    public CodeDefineExpression() { }
40    [StorableConstructor]
41    protected CodeDefineExpression(bool deserializing) : base(deserializing) { }
42
43    public override bool IsNoop(IInternalPushInterpreter interpreter) {
44      return (interpreter.Configuration.TopLevelPushCode && interpreter.CodeStack.Count < 2) ||
45             interpreter.CodeStack.IsEmpty ||
46             interpreter.NameStack.IsEmpty;
47    }
48
49    public override void Eval(IInternalPushInterpreter interpreter) {
50      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<ExecPushExpression>();
51
52      Eval(
53        interpreter.CodeStack,
54        interpreter.NameStack,
55        interpreter.CustomExpressions,
56        v => ExecPushExpression.Create(pool, v));
57
58      interpreter.CodeStack.Pop();
59    }
60  }
61
62  [PushExpression(StackTypes.Exec, "EXEC.DEFINE", StackTypes.Name, execIn: 1)]
63  [StorableClass]
64  public class ExecDefineExpression : DefineExpression<Expression> {
65    public ExecDefineExpression() { }
66    [StorableConstructor]
67    protected ExecDefineExpression(bool deserializing) : base(deserializing) { }
68
69    public override bool IsNoop(IInternalPushInterpreter interpreter) {
70      return interpreter.ExecStack.Count < 2 ||
71             interpreter.NameStack.IsEmpty;
72    }
73
74    public override void Eval(IInternalPushInterpreter interpreter) {
75      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<ExecPushExpression>();
76
77      Eval(
78        interpreter.ExecStack,
79        interpreter.NameStack,
80        interpreter.CustomExpressions,
81        v => ExecPushExpression.Create(pool, v));
82
83      interpreter.ExecStack.Pop();
84    }
85  }
86
87  [PushExpression(StackTypes.Float, "FLOAT.DEFINE", StackTypes.Name)]
88  [StorableClass]
89  public class FloatDefineExpression : DefineExpression<double> {
90    public FloatDefineExpression() { }
91    [StorableConstructor]
92    protected FloatDefineExpression(bool deserializing) : base(deserializing) { }
93
94    public override bool IsNoop(IInternalPushInterpreter interpreter) {
95      return interpreter.FloatStack.IsEmpty ||
96             interpreter.NameStack.IsEmpty;
97    }
98
99    public override void Eval(IInternalPushInterpreter interpreter) {
100      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<FloatPushExpression>();
101
102      Eval(
103        interpreter.FloatStack,
104        interpreter.NameStack,
105        interpreter.CustomExpressions,
106        v => FloatPushExpression.Create(pool, v));
107    }
108  }
109
110  [PushExpression(StackTypes.Integer, "INTEGER.DEFINE", StackTypes.Name)]
111  [StorableClass]
112  public class IntegerDefineExpression : DefineExpression<long> {
113    public IntegerDefineExpression() { }
114    [StorableConstructor]
115    protected IntegerDefineExpression(bool deserializing) : base(deserializing) { }
116
117    public override bool IsNoop(IInternalPushInterpreter interpreter) {
118      return interpreter.IntegerStack.IsEmpty ||
119             interpreter.NameStack.IsEmpty;
120    }
121
122    public override void Eval(IInternalPushInterpreter interpreter) {
123      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<IntegerPushExpression>();
124
125      Eval(
126        interpreter.IntegerStack,
127        interpreter.NameStack,
128        interpreter.CustomExpressions,
129        v => IntegerPushExpression.Create(pool, v));
130    }
131  }
132
133  [PushExpression(StackTypes.Boolean, "BOOLEAN.DEFINE", StackTypes.Name)]
134  [StorableClass]
135  public class BooleanDefineExpression : DefineExpression<bool> {
136    public BooleanDefineExpression() { }
137    [StorableConstructor]
138    protected BooleanDefineExpression(bool deserializing) : base(deserializing) { }
139
140    public override bool IsNoop(IInternalPushInterpreter interpreter) {
141      return interpreter.BooleanStack.IsEmpty ||
142             interpreter.NameStack.IsEmpty;
143    }
144
145    public override void Eval(IInternalPushInterpreter interpreter) {
146      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<BooleanPushExpression>();
147
148      Eval(
149        interpreter.BooleanStack,
150        interpreter.NameStack,
151        interpreter.CustomExpressions,
152        v => BooleanPushExpression.Create(pool, v));
153    }
154  }
155
156  [PushExpression(StackTypes.Char, "CHAR.DEFINE", StackTypes.Name)]
157  [StorableClass]
158  public class CharDefineExpression : DefineExpression<char> {
159    public CharDefineExpression() { }
160    [StorableConstructor]
161    protected CharDefineExpression(bool deserializing) : base(deserializing) { }
162
163    public override bool IsNoop(IInternalPushInterpreter interpreter) {
164      return interpreter.CharStack.IsEmpty ||
165             interpreter.NameStack.IsEmpty;
166    }
167
168    public override void Eval(IInternalPushInterpreter interpreter) {
169      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<CharPushExpression>();
170
171      Eval(
172        interpreter.CharStack,
173        interpreter.NameStack,
174        interpreter.CustomExpressions,
175        v => CharPushExpression.Create(pool, v));
176    }
177  }
178
179  [PushExpression(StackTypes.String, "STRING.DEFINE", StackTypes.Name)]
180  [StorableClass]
181  public class StringDefineExpression : DefineExpression<string> {
182    public StringDefineExpression() { }
183    [StorableConstructor]
184    protected StringDefineExpression(bool deserializing) : base(deserializing) { }
185
186    public override bool IsNoop(IInternalPushInterpreter interpreter) {
187      return interpreter.StringStack.IsEmpty ||
188             interpreter.NameStack.IsEmpty;
189    }
190
191    public override void Eval(IInternalPushInterpreter interpreter) {
192      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<StringPushExpression>();
193
194      Eval(
195        interpreter.StringStack,
196        interpreter.NameStack,
197        interpreter.CustomExpressions,
198        v => StringPushExpression.Create(pool, v));
199    }
200  }
201
202  [PushExpression(StackTypes.IntegerVector, "INTEGER[].DEFINE", StackTypes.Name)]
203  [StorableClass]
204  public class IntegerVectorDefineExpression : DefineExpression<IReadOnlyList<long>> {
205    public IntegerVectorDefineExpression() { }
206    [StorableConstructor]
207    protected IntegerVectorDefineExpression(bool deserializing) : base(deserializing) { }
208
209    public override bool IsNoop(IInternalPushInterpreter interpreter) {
210      return interpreter.IntegerVectorStack.IsEmpty ||
211             interpreter.NameStack.IsEmpty;
212    }
213
214    public override void Eval(IInternalPushInterpreter interpreter) {
215      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<IntegerVectorPushExpression>();
216
217      Eval(
218        interpreter.IntegerVectorStack,
219        interpreter.NameStack,
220        interpreter.CustomExpressions,
221        v => IntegerVectorPushExpression.Create(pool, v));
222    }
223  }
224
225  [PushExpression(StackTypes.FloatVector, "FLOAT[].DEFINE", StackTypes.Name)]
226  [StorableClass]
227  public class FloatVectorDefineExpression : DefineExpression<IReadOnlyList<double>> {
228    public FloatVectorDefineExpression() { }
229    [StorableConstructor]
230    protected FloatVectorDefineExpression(bool deserializing) : base(deserializing) { }
231
232    public override bool IsNoop(IInternalPushInterpreter interpreter) {
233      return interpreter.FloatVectorStack.IsEmpty ||
234             interpreter.NameStack.IsEmpty;
235    }
236
237    public override void Eval(IInternalPushInterpreter interpreter) {
238      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<FloatVectorPushExpression>();
239
240      Eval(
241        interpreter.FloatVectorStack,
242        interpreter.NameStack,
243        interpreter.CustomExpressions,
244        v => FloatVectorPushExpression.Create(pool, v));
245    }
246  }
247
248  [PushExpression(StackTypes.BooleanVector, "BOOLEAN[].DEFINE", StackTypes.Name)]
249  [StorableClass]
250  public class BooleanVectorDefineExpression : DefineExpression<IReadOnlyList<bool>> {
251    public BooleanVectorDefineExpression() { }
252    [StorableConstructor]
253    protected BooleanVectorDefineExpression(bool deserializing) : base(deserializing) { }
254
255    public override bool IsNoop(IInternalPushInterpreter interpreter) {
256      return interpreter.BooleanVectorStack.IsEmpty ||
257             interpreter.NameStack.IsEmpty;
258    }
259
260    public override void Eval(IInternalPushInterpreter interpreter) {
261      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<BooleanVectorPushExpression>();
262
263      Eval(
264        interpreter.BooleanVectorStack,
265        interpreter.NameStack,
266        interpreter.CustomExpressions,
267        v => BooleanVectorPushExpression.Create(pool, v));
268    }
269  }
270
271  [PushExpression(StackTypes.StringVector, "STRING[].DEFINE", StackTypes.Name)]
272  [StorableClass]
273  public class StringVectorDefineExpression : DefineExpression<IReadOnlyList<string>> {
274    public StringVectorDefineExpression() { }
275    [StorableConstructor]
276    protected StringVectorDefineExpression(bool deserializing) : base(deserializing) { }
277
278    public override bool IsNoop(IInternalPushInterpreter interpreter) {
279      return interpreter.StringVectorStack.IsEmpty ||
280             interpreter.NameStack.IsEmpty;
281    }
282
283    public override void Eval(IInternalPushInterpreter interpreter) {
284      var pool = interpreter.PoolContainer.GetStatefulExpressionPool<BooleanVectorPushExpression>();
285
286      Eval(
287        interpreter.StringVectorStack,
288        interpreter.NameStack,
289        interpreter.CustomExpressions,
290        v => StringVectorPushExpression.Create(pool, v));
291    }
292  }
293}
Note: See TracBrowser for help on using the repository browser.