Changeset 14875 for branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs
- Timestamp:
- 04/18/17 01:15:25 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs
r14834 r14875 1 1 namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions { 2 using System; 2 3 using System.Collections.Generic; 3 4 using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes; 5 using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter; 6 using HeuristicLab.Problems.ProgramSynthesis.Push.Stack; 4 using Attributes; 5 using Interpreter; 6 using Stack; 7 7 8 8 /// <summary> … … 13 13 public abstract class YankDuplicateExpression<T> : StatelessExpression { 14 14 public bool Eval(IPushStack<T> stack, IPushStack<long> integerStack) { 15 T item;16 if (!this.TryGetItem(stack, integerStack, out item))15 if ((stack == integerStack && integerStack.Count < 2) || 16 (stack != integerStack && (integerStack.IsEmpty || stack.IsEmpty))) 17 17 return false; 18 18 19 stack.Push(item); 20 return true; 21 } 22 23 public bool Eval(IPushStack<Expression> stack, IPushStack<long> integerStack) { 24 Expression item; 25 if (!this.TryGetItem(stack, integerStack, out item)) 26 return false; 27 28 stack.Push(item); 29 return true; 30 } 31 32 public bool Eval(IPushStack<long> integerStack) { 33 if ((integerStack.Count < 2) || (integerStack.Top > integerStack.Count - 2) || 34 (integerStack.Top < 0)) return false; 35 36 var index = (int)integerStack.Pop(); 37 var item = integerStack.ReverseElementAt(index); 38 39 integerStack.Push(item); 40 return true; 41 } 42 43 private bool TryGetItem<E>(IPushStack<E> stack, IPushStack<long> integerStack, out E item) { 44 if ((integerStack.Count == 0) || 45 (integerStack.Top >= stack.Count) || 46 (integerStack.Top < 0) || 47 (stack.Count < 2)) { 48 item = default(E); 49 return false; 50 } 51 52 var index = (int)integerStack.Pop(); 53 item = stack.ReverseElementAt(index); 54 19 var index = (int)Math.Abs(integerStack.Pop() % stack.Count); 20 stack.Push(stack[index]); 55 21 return true; 56 22 } … … 60 26 public class IntegerYankDuplicateExpression : YankDuplicateExpression<long> { 61 27 public override bool Eval(IInternalPushInterpreter interpreter) { 62 return this.Eval(interpreter.IntegerStack );28 return this.Eval(interpreter.IntegerStack, interpreter.IntegerStack); 63 29 } 64 30 } … … 119 85 } 120 86 } 87 88 [PushExpression(StackTypes.FloatVector, "FLOAT[].YANKDUP", StackTypes.Integer)] 89 public class FloatVectorYankDuplicateExpression : YankDuplicateExpression<List<double>> { 90 public override bool Eval(IInternalPushInterpreter interpreter) { 91 return Eval(interpreter.FloatVectorStack, interpreter.IntegerStack); 92 } 93 } 94 95 [PushExpression(StackTypes.BooleanVector, "BOOLEAN[].YANKDUP", StackTypes.Integer)] 96 public class BooleanVectorYankDuplicateExpression : YankDuplicateExpression<List<bool>> { 97 public override bool Eval(IInternalPushInterpreter interpreter) { 98 return Eval(interpreter.BooleanVectorStack, interpreter.IntegerStack); 99 } 100 } 101 102 [PushExpression(StackTypes.StringVector, "STRING[].YANKDUP", StackTypes.Integer)] 103 public class StringVectorYankDuplicateExpression : YankDuplicateExpression<List<string>> { 104 public override bool Eval(IInternalPushInterpreter interpreter) { 105 return Eval(interpreter.StringVectorStack, interpreter.IntegerStack); 106 } 107 } 121 108 }
Note: See TracChangeset
for help on using the changeset viewer.