Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs @ 14727

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

#2665 PushGP HL Integration, Views, Parameters

File size: 3.4 KB
Line 
1namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
2  using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes;
3  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
4  using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
5
6  /// <summary>
7  ///     Pushes a copy of an indexed item "deep" in the stack onto the top of the stack, without removing the deep item.
8  ///     The index is taken from the INTEGER stack, and the indexing is done after the index is removed.
9  /// </summary>
10  /// <typeparam name="T">Stacktype</typeparam>
11  public abstract class YankDuplicateExpression<T> : StatelessExpression {
12    public void Eval(IStack<T> stack, IStack<long> integerStack) {
13      T item;
14      if (this.TryGetItem(stack, integerStack, out item)) stack.Push(item);
15    }
16
17    public void Eval(IStack<Expression> stack, IStack<long> integerStack) {
18      Expression item;
19      if (this.TryGetItem(stack, integerStack, out item)) stack.Push(item);
20    }
21
22    public void Eval(IStack<long> integerStack) {
23      if ((integerStack.Count < 2) || (integerStack.Top > integerStack.Count - 2) ||
24          (integerStack.Top < 0)) return;
25
26      var index = (int)integerStack.Pop();
27      var item = integerStack.ReverseElementAt(index);
28
29      integerStack.Push(item);
30    }
31
32    private bool TryGetItem<E>(IStack<E> stack, IStack<long> integerStack, out E item) {
33      if ((integerStack.Count == 0) ||
34          (integerStack.Top >= stack.Count) ||
35          (integerStack.Top < 0) ||
36          (stack.Count < 2)) {
37        item = default(E);
38        return false;
39      }
40
41      var index = (int)integerStack.Pop();
42      item = stack.ReverseElementAt(index);
43
44      return true;
45    }
46  }
47
48  [PushExpression(StackType.Integer, "INTEGER.YANKDUP")]
49  public class IntegerYankDuplicateExpression : YankDuplicateExpression<long> {
50    public override void Eval(IPushGpInterpreter interpreter) {
51      this.Eval(interpreter.IntegerStack);
52    }
53  }
54
55  [PushExpression(StackType.Float, "FLOAT.YANKDUP")]
56  public class FloatYankDuplicateExpression : YankDuplicateExpression<double> {
57    public override void Eval(IPushGpInterpreter interpreter) {
58      this.Eval(interpreter.FloatStack, interpreter.IntegerStack);
59    }
60  }
61
62  [PushExpression(StackType.Boolean, "BOOLEAN.YANKDUP")]
63  public class BooleanYankDuplicateExpression : YankDuplicateExpression<bool> {
64    public override void Eval(IPushGpInterpreter interpreter) {
65      this.Eval(interpreter.BooleanStack, interpreter.IntegerStack);
66    }
67  }
68
69  [PushExpression(StackType.Name, "NAME.YANKDUP")]
70  public class NameYankDuplicateExpression : YankDuplicateExpression<string> {
71    public override void Eval(IPushGpInterpreter interpreter) {
72      this.Eval(interpreter.NameStack, interpreter.IntegerStack);
73    }
74  }
75
76  [PushExpression(StackType.Exec, "EXEC.YANKDUP")]
77  public class ExecYankDuplicateExpression : YankDuplicateExpression<Expression> {
78    public override void Eval(IPushGpInterpreter interpreter) {
79      this.Eval(interpreter.ExecStack, interpreter.IntegerStack);
80    }
81  }
82
83  [PushExpression(StackType.Code, "CODE.YANKDUP")]
84  public class CodeYankDuplicateExpression : YankDuplicateExpression<Expression> {
85    public override void Eval(IPushGpInterpreter interpreter) {
86      this.Eval(interpreter.CodeStack, interpreter.IntegerStack);
87    }
88  }
89}
Note: See TracBrowser for help on using the repository browser.