Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/20/16 22:57:11 (7 years ago)
Author:
pkimmesw
Message:

#2665 Added Problem.ProgramSynthesis Project, Fixed Expression Issues, Fixed Code Generation

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;
     1namespace HeuristicLab.Algorithms.PushGP.Expressions
     2{
     3  using HeuristicLab.Algorithms.PushGP.Interpreter;
     4  using HeuristicLab.Algorithms.PushGP.Stack;
    35
    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> : StatelessExpression
     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  {
     13    public void Eval(IStack<T> stack, IStack<long> integerStack)
    1214    {
    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);
    3017    }
    3118
    32     public class IntegerYankDuplicateExpression : YankDuplicateExpression<long>
     19    public void Eval(IStack<Expression> stack, IStack<long> integerStack)
    3320    {
    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);
    4023    }
    4124
    42     public class FloatYankDuplicateExpression : YankDuplicateExpression<double>
     25    public void Eval(IStack<long> integerStack)
    4326    {
    44         protected override string InitStringRepresentation() { return "FLOAT.YANKDUP"; }
     27      if ((integerStack.Count < 2) || (integerStack.Top > integerStack.Count - 2) || (integerStack.Top < 0)) return;
    4528
    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);
    5033    }
    5134
    52     public class BooleanYankDuplicateExpression : YankDuplicateExpression<bool>
     35    private bool TryGetItem<E>(IStack<E> stack, IStack<long> integerStack, out E item)
    5336    {
    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      }
    5542
    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";
    6055    }
    6156
    62     public class NameYankDuplicateExpression : YankDuplicateExpression<string>
     57    public override void Eval(IPushGpInterpreter interpreter)
    6358    {
    64         protected override string InitStringRepresentation() { return "NAME.YANKDUP"; }
     59      this.Eval(interpreter.IntegerStack);
     60    }
     61  }
    6562
    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";
    7068    }
    7169
    72     public class ExecYankDuplicateExpression : YankDuplicateExpression<Expression>
     70    public override void Eval(IPushGpInterpreter interpreter)
    7371    {
    74         protected override string InitStringRepresentation() { return "EXEC.YANKDUP"; }
     72      this.Eval(interpreter.FloatStack, interpreter.IntegerStack);
     73    }
     74  }
    7575
    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";
    8081    }
    8182
    82     public class CodeYankDuplicateExpression : YankDuplicateExpression<Expression>
     83    public override void Eval(IPushGpInterpreter interpreter)
    8384    {
    84         protected override string InitStringRepresentation() { return "CODE.YANKDUP"; }
     85      this.Eval(interpreter.BooleanStack, interpreter.IntegerStack);
     86    }
     87  }
    8588
    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";
    9094    }
     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  }
    91127}
Note: See TracChangeset for help on using the changeset viewer.