Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/18/17 01:15:25 (7 years ago)
Author:
pkimmesw
Message:

#2665 BenchmarkSuite, all examples, partially tested, VectorExpressions added

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs

    r14834 r14875  
    11namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
     2  using System;
    23  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;
    77
    88  /// <summary>
     
    1313  public abstract class YankDuplicateExpression<T> : StatelessExpression {
    1414    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)))
    1717        return false;
    1818
    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]);
    5521      return true;
    5622    }
     
    6026  public class IntegerYankDuplicateExpression : YankDuplicateExpression<long> {
    6127    public override bool Eval(IInternalPushInterpreter interpreter) {
    62       return this.Eval(interpreter.IntegerStack);
     28      return this.Eval(interpreter.IntegerStack, interpreter.IntegerStack);
    6329    }
    6430  }
     
    11985    }
    12086  }
     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  }
    121108}
Note: See TracChangeset for help on using the changeset viewer.