Changeset 14513 for branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/YankDuplicateExpressions.cs
- Timestamp:
- 12/20/16 22:57:11 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/YankDuplicateExpressions.cs
r14398 r14513 1 using HeuristicLab.Algorithms.PushGP.Interpreter; 2 using HeuristicLab.Algorithms.PushGP.Stack; 1 namespace HeuristicLab.Algorithms.PushGP.Expressions 2 { 3 using HeuristicLab.Algorithms.PushGP.Interpreter; 4 using HeuristicLab.Algorithms.PushGP.Stack; 3 5 4 namespace HeuristicLab.Algorithms.PushGP.Expressions 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> : StatelessExpression6 /// <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 { 13 public void Eval(IStack<T> stack, IStack<long> integerStack) 12 14 { 13 public void Eval(IStack<T> stack, IStack<long> integerStack, int count = 1) 14 { 15 if (integerStack.Count == 0) 16 return; 17 18 var index = integerStack.Top; 19 20 if (index > stack.Count - count || 21 index < 0 || 22 stack.Count < 2) 23 return; 24 25 integerStack.Pop(); 26 var item = stack.ElementAt((int)index); 27 28 stack.Push(item); 29 } 15 T item; 16 if (this.TryGetItem(stack, integerStack, out item)) stack.Push(item); 30 17 } 31 18 32 public class IntegerYankDuplicateExpression : YankDuplicateExpression<long>19 public void Eval(IStack<Expression> stack, IStack<long> integerStack) 33 20 { 34 protected override string InitStringRepresentation() { return "INTEGER.YANKDUP"; } 35 36 public override void Eval(IInterpreter interpreter) 37 { 38 Eval(interpreter.IntegerStack, interpreter.IntegerStack, 2); 39 } 21 Expression item; 22 if (this.TryGetItem(stack, integerStack, out item)) stack.Push(item); 40 23 } 41 24 42 public class FloatYankDuplicateExpression : YankDuplicateExpression<double>25 public void Eval(IStack<long> integerStack) 43 26 { 44 protected override string InitStringRepresentation() { return "FLOAT.YANKDUP"; }27 if ((integerStack.Count < 2) || (integerStack.Top > integerStack.Count - 2) || (integerStack.Top < 0)) return; 45 28 46 public override void Eval(IInterpreter interpreter)47 {48 Eval(interpreter.FloatStack, interpreter.IntegerStack); 49 }29 var index = (int)integerStack.Pop(); 30 var item = integerStack.ReverseElementAt(index); 31 32 integerStack.Push(item); 50 33 } 51 34 52 p ublic class BooleanYankDuplicateExpression : YankDuplicateExpression<bool>35 private bool TryGetItem<E>(IStack<E> stack, IStack<long> integerStack, out E item) 53 36 { 54 protected override string InitStringRepresentation() { return "BOOLEAN.YANKDUP"; } 37 if ((integerStack.Count == 0) || (integerStack.Top >= stack.Count) || (integerStack.Top < 0) || (stack.Count < 2)) 38 { 39 item = default(E); 40 return false; 41 } 55 42 56 public override void Eval(IInterpreter interpreter) 57 { 58 Eval(interpreter.BooleanStack, interpreter.IntegerStack); 59 } 43 var index = (int)integerStack.Pop(); 44 item = stack.ReverseElementAt(index); 45 46 return true; 47 } 48 } 49 50 public class IntegerYankDuplicateExpression : YankDuplicateExpression<long> 51 { 52 protected override string InitStringRepresentation() 53 { 54 return "INTEGER.YANKDUP"; 60 55 } 61 56 62 public class NameYankDuplicateExpression : YankDuplicateExpression<string>57 public override void Eval(IPushGpInterpreter interpreter) 63 58 { 64 protected override string InitStringRepresentation() { return "NAME.YANKDUP"; } 59 this.Eval(interpreter.IntegerStack); 60 } 61 } 65 62 66 public override void Eval(IInterpreter interpreter) 67 { 68 Eval(interpreter.NameStack, interpreter.IntegerStack); 69 } 63 public class FloatYankDuplicateExpression : YankDuplicateExpression<double> 64 { 65 protected override string InitStringRepresentation() 66 { 67 return "FLOAT.YANKDUP"; 70 68 } 71 69 72 public class ExecYankDuplicateExpression : YankDuplicateExpression<Expression>70 public override void Eval(IPushGpInterpreter interpreter) 73 71 { 74 protected override string InitStringRepresentation() { return "EXEC.YANKDUP"; } 72 this.Eval(interpreter.FloatStack, interpreter.IntegerStack); 73 } 74 } 75 75 76 public override void Eval(IInterpreter interpreter) 77 { 78 Eval(interpreter.ExecStack, interpreter.IntegerStack); 79 } 76 public class BooleanYankDuplicateExpression : YankDuplicateExpression<bool> 77 { 78 protected override string InitStringRepresentation() 79 { 80 return "BOOLEAN.YANKDUP"; 80 81 } 81 82 82 public class CodeYankDuplicateExpression : YankDuplicateExpression<Expression>83 public override void Eval(IPushGpInterpreter interpreter) 83 84 { 84 protected override string InitStringRepresentation() { return "CODE.YANKDUP"; } 85 this.Eval(interpreter.BooleanStack, interpreter.IntegerStack); 86 } 87 } 85 88 86 public override void Eval(IInterpreter interpreter) 87 { 88 Eval(interpreter.CodeStack, interpreter.IntegerStack); 89 } 89 public class NameYankDuplicateExpression : YankDuplicateExpression<string> 90 { 91 protected override string InitStringRepresentation() 92 { 93 return "NAME.YANKDUP"; 90 94 } 95 96 public override void Eval(IPushGpInterpreter interpreter) 97 { 98 this.Eval(interpreter.NameStack, interpreter.IntegerStack); 99 } 100 } 101 102 public class ExecYankDuplicateExpression : YankDuplicateExpression<Expression> 103 { 104 protected override string InitStringRepresentation() 105 { 106 return "EXEC.YANKDUP"; 107 } 108 109 public override void Eval(IPushGpInterpreter interpreter) 110 { 111 this.Eval(interpreter.ExecStack, interpreter.IntegerStack); 112 } 113 } 114 115 public class CodeYankDuplicateExpression : YankDuplicateExpression<Expression> 116 { 117 protected override string InitStringRepresentation() 118 { 119 return "CODE.YANKDUP"; 120 } 121 122 public override void Eval(IPushGpInterpreter interpreter) 123 { 124 this.Eval(interpreter.CodeStack, interpreter.IntegerStack); 125 } 126 } 91 127 }
Note: See TracChangeset
for help on using the changeset viewer.