Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.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: 9.1 KB
Line 
1namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
2  using System;
3  using System.Collections.Generic;
4  using Attributes;
5
6  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
7  using HeuristicLab.Problems.ProgramSynthesis.Push.Extensions;
8
9  using Interpreter;
10  using Stack;
11
12  /// <summary>
13  ///     Pushes a copy of an indexed item "deep" in the stack onto the top of the stack, without removing the deep item.
14  ///     The index is taken from the INTEGER stack, and the indexing is done after the index is removed.
15  /// </summary>
16  /// <typeparam name="T">Stacktype</typeparam>
17  [StorableClass]
18  public abstract class YankDuplicateExpression<T> : StatelessExpression {
19    protected YankDuplicateExpression() { }
20    [StorableConstructor]
21    protected YankDuplicateExpression(bool deserializing) : base(deserializing) { }
22
23    protected bool IsNoop(IPushStack<T> stack, IPushStack<long> integerStack) {
24      return (stack == integerStack && integerStack.Count < 3) ||
25             (stack != integerStack && (integerStack.IsEmpty || stack.Count < 2));
26    }
27
28    protected void Eval(IPushStack<T> stack, IPushStack<long> integerStack) {
29      var index = integerStack.Pop().AsInt(stack.Count);
30      stack.Push(stack[index]);
31    }
32  }
33
34  [StorableClass]
35  [PushExpression(StackTypes.Integer, "INTEGER.YANKDUP")]
36  public class IntegerYankDuplicateExpression : YankDuplicateExpression<long> {
37    public IntegerYankDuplicateExpression() { }
38    [StorableConstructor]
39    protected IntegerYankDuplicateExpression(bool deserializing) : base(deserializing) { }
40
41    public override bool IsNoop(IInternalPushInterpreter interpreter) {
42      return IsNoop(interpreter.IntegerStack, interpreter.IntegerStack);
43    }
44
45    public override void Eval(IInternalPushInterpreter interpreter) {
46      Eval(interpreter.IntegerStack, interpreter.IntegerStack);
47    }
48  }
49
50  [StorableClass]
51  [PushExpression(StackTypes.Float, "FLOAT.YANKDUP", StackTypes.Integer)]
52  public class FloatYankDuplicateExpression : YankDuplicateExpression<double> {
53    public FloatYankDuplicateExpression() { }
54    [StorableConstructor]
55    protected FloatYankDuplicateExpression(bool deserializing) : base(deserializing) { }
56
57    public override bool IsNoop(IInternalPushInterpreter interpreter) {
58      return IsNoop(interpreter.FloatStack, interpreter.IntegerStack);
59    }
60
61    public override void Eval(IInternalPushInterpreter interpreter) {
62      Eval(interpreter.FloatStack, interpreter.IntegerStack);
63    }
64  }
65
66  [StorableClass]
67  [PushExpression(StackTypes.Boolean, "BOOLEAN.YANKDUP", StackTypes.Integer)]
68  public class BooleanYankDuplicateExpression : YankDuplicateExpression<bool> {
69    public BooleanYankDuplicateExpression() { }
70    [StorableConstructor]
71    protected BooleanYankDuplicateExpression(bool deserializing) : base(deserializing) { }
72
73    public override bool IsNoop(IInternalPushInterpreter interpreter) {
74      return IsNoop(interpreter.BooleanStack, interpreter.IntegerStack);
75    }
76
77    public override void Eval(IInternalPushInterpreter interpreter) {
78      Eval(interpreter.BooleanStack, interpreter.IntegerStack);
79    }
80  }
81
82  [StorableClass]
83  [PushExpression(StackTypes.Name, "NAME.YANKDUP", StackTypes.Integer)]
84  public class NameYankDuplicateExpression : YankDuplicateExpression<string> {
85    public NameYankDuplicateExpression() { }
86    [StorableConstructor]
87    protected NameYankDuplicateExpression(bool deserializing) : base(deserializing) { }
88
89    public override bool IsNoop(IInternalPushInterpreter interpreter) {
90      return IsNoop(interpreter.NameStack, interpreter.IntegerStack);
91    }
92
93    public override void Eval(IInternalPushInterpreter interpreter) {
94      Eval(interpreter.NameStack, interpreter.IntegerStack);
95    }
96  }
97
98  [StorableClass]
99  [PushExpression(StackTypes.Exec, "EXEC.YANKDUP", StackTypes.Integer, execIn: 0)]
100  public class ExecYankDuplicateExpression : YankDuplicateExpression<Expression> {
101    public ExecYankDuplicateExpression() { }
102    [StorableConstructor]
103    protected ExecYankDuplicateExpression(bool deserializing) : base(deserializing) { }
104
105    public override bool IsNoop(IInternalPushInterpreter interpreter) {
106      return IsNoop(interpreter.ExecStack, interpreter.IntegerStack);
107    }
108
109    public override void Eval(IInternalPushInterpreter interpreter) {
110      Eval(interpreter.ExecStack, interpreter.IntegerStack);
111    }
112  }
113
114  [StorableClass]
115  [PushExpression(StackTypes.Code, "CODE.YANKDUP", StackTypes.Integer)]
116  public class CodeYankDuplicateExpression : YankDuplicateExpression<Expression> {
117    public CodeYankDuplicateExpression() { }
118    [StorableConstructor]
119    protected CodeYankDuplicateExpression(bool deserializing) : base(deserializing) { }
120
121    public override bool IsNoop(IInternalPushInterpreter interpreter) {
122      return IsNoop(interpreter.CodeStack, interpreter.IntegerStack);
123    }
124
125    public override void Eval(IInternalPushInterpreter interpreter) {
126      Eval(interpreter.CodeStack, interpreter.IntegerStack);
127    }
128  }
129
130  [StorableClass]
131  [PushExpression(StackTypes.Char, "CHAR.YANKDUP", StackTypes.Integer)]
132  public class CharYankDuplicateExpression : YankDuplicateExpression<char> {
133    public CharYankDuplicateExpression() { }
134    [StorableConstructor]
135    protected CharYankDuplicateExpression(bool deserializing) : base(deserializing) { }
136
137    public override bool IsNoop(IInternalPushInterpreter interpreter) {
138      return IsNoop(interpreter.CharStack, interpreter.IntegerStack);
139    }
140
141    public override void Eval(IInternalPushInterpreter interpreter) {
142      Eval(interpreter.CharStack, interpreter.IntegerStack);
143    }
144  }
145
146  [StorableClass]
147  [PushExpression(StackTypes.String, "STRING.YANKDUP", StackTypes.Integer)]
148  public class StringYankDuplicateExpression : YankDuplicateExpression<string> {
149    public StringYankDuplicateExpression() { }
150    [StorableConstructor]
151    protected StringYankDuplicateExpression(bool deserializing) : base(deserializing) { }
152
153    public override bool IsNoop(IInternalPushInterpreter interpreter) {
154      return IsNoop(interpreter.StringStack, interpreter.IntegerStack);
155    }
156
157    public override void Eval(IInternalPushInterpreter interpreter) {
158      Eval(interpreter.StringStack, interpreter.IntegerStack);
159    }
160  }
161
162  [StorableClass]
163  [PushExpression(StackTypes.IntegerVector, "INTEGER[].YANKDUP", StackTypes.Integer)]
164  public class IntegerVectorYankDuplicateExpression : YankDuplicateExpression<IReadOnlyList<long>> {
165    public IntegerVectorYankDuplicateExpression() { }
166    [StorableConstructor]
167    protected IntegerVectorYankDuplicateExpression(bool deserializing) : base(deserializing) { }
168
169    public override bool IsNoop(IInternalPushInterpreter interpreter) {
170      return IsNoop(interpreter.IntegerVectorStack, interpreter.IntegerStack);
171    }
172
173    public override void Eval(IInternalPushInterpreter interpreter) {
174      Eval(interpreter.IntegerVectorStack, interpreter.IntegerStack);
175    }
176  }
177
178  [StorableClass]
179  [PushExpression(StackTypes.FloatVector, "FLOAT[].YANKDUP", StackTypes.Integer)]
180  public class FloatVectorYankDuplicateExpression : YankDuplicateExpression<IReadOnlyList<double>> {
181    public FloatVectorYankDuplicateExpression() { }
182    [StorableConstructor]
183    protected FloatVectorYankDuplicateExpression(bool deserializing) : base(deserializing) { }
184
185    public override bool IsNoop(IInternalPushInterpreter interpreter) {
186      return IsNoop(interpreter.FloatVectorStack, interpreter.IntegerStack);
187    }
188
189    public override void Eval(IInternalPushInterpreter interpreter) {
190      Eval(interpreter.FloatVectorStack, interpreter.IntegerStack);
191    }
192  }
193
194  [StorableClass]
195  [PushExpression(StackTypes.BooleanVector, "BOOLEAN[].YANKDUP", StackTypes.Integer)]
196  public class BooleanVectorYankDuplicateExpression : YankDuplicateExpression<IReadOnlyList<bool>> {
197    public BooleanVectorYankDuplicateExpression() { }
198    [StorableConstructor]
199    protected BooleanVectorYankDuplicateExpression(bool deserializing) : base(deserializing) { }
200
201    public override bool IsNoop(IInternalPushInterpreter interpreter) {
202      return IsNoop(interpreter.BooleanVectorStack, interpreter.IntegerStack);
203    }
204
205    public override void Eval(IInternalPushInterpreter interpreter) {
206      Eval(interpreter.BooleanVectorStack, interpreter.IntegerStack);
207    }
208  }
209
210  [StorableClass]
211  [PushExpression(StackTypes.StringVector, "STRING[].YANKDUP", StackTypes.Integer)]
212  public class StringVectorYankDuplicateExpression : YankDuplicateExpression<IReadOnlyList<string>> {
213    public StringVectorYankDuplicateExpression() { }
214    [StorableConstructor]
215    protected StringVectorYankDuplicateExpression(bool deserializing) : base(deserializing) { }
216
217    public override bool IsNoop(IInternalPushInterpreter interpreter) {
218      return IsNoop(interpreter.StringVectorStack, interpreter.IntegerStack);
219    }
220
221    public override void Eval(IInternalPushInterpreter interpreter) {
222      Eval(interpreter.StringVectorStack, interpreter.IntegerStack);
223    }
224  }
225}
Note: See TracBrowser for help on using the repository browser.