Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/10/17 00:27:31 (7 years ago)
Author:
pkimmesw
Message:

#2665 LexicaseSelector, Performance improvements, UI Fixes, Debugger only shows used stacks, fixed Debugger stepping, Added vector expressions, ERCOptions,

File:
1 edited

Legend:

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

    r14777 r14834  
    11namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
    22  using System;
    3 
     3  using Common;
    44  using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes;
    55  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
     
    1111  [PushExpression(StackTypes.Float, "FLOAT.+")]
    1212  public class FloatAddExpression : PushResultExpression<double> {
    13     public override bool Eval(IPushInterpreter interpreter) {
    14       return Eval(interpreter.FloatStack, 2, values => values[0] + values[1]);
     13    public override bool Eval(IInternalPushInterpreter interpreter) {
     14      return Eval(interpreter.FloatStack, 2,
     15        values => {
     16          var result = values[0] + values[1];
     17
     18          if (double.IsPositiveInfinity(result)) return double.MaxValue;
     19          if (double.IsNegativeInfinity(result)) return double.MinValue;
     20
     21          return result;
     22        });
    1523    }
    1624  }
     
    2129  [PushExpression(StackTypes.Float, "FLOAT.-")]
    2230  public class FloatSubtractExpression : PushResultExpression<double> {
    23     public override bool Eval(IPushInterpreter interpreter) {
    24       return Eval(interpreter.FloatStack, 2, values => values[0] - values[1]);
     31    public override bool Eval(IInternalPushInterpreter interpreter) {
     32      return Eval(interpreter.FloatStack, 2,
     33        values => {
     34          var result = values[0] - values[1];
     35
     36          if (double.IsPositiveInfinity(result)) return double.MaxValue;
     37          if (double.IsNegativeInfinity(result)) return double.MinValue;
     38
     39          return result;
     40        });
    2541    }
    2642  }
     
    3147  [PushExpression(StackTypes.Float, "FLOAT.*")]
    3248  public class FloatMultiplyExpression : PushResultExpression<double> {
    33     public override bool Eval(IPushInterpreter interpreter) {
    34       return Eval(interpreter.FloatStack, 2, values => values[0] * values[1]);
     49    public override bool Eval(IInternalPushInterpreter interpreter) {
     50      return Eval(interpreter.FloatStack, 2,
     51        values => {
     52          var result = values[0] * values[1];
     53
     54          if (double.IsPositiveInfinity(result)) return double.MaxValue;
     55          if (double.IsNegativeInfinity(result)) return double.MinValue;
     56
     57          return result;
     58        });
    3559    }
    3660  }
     
    4266  [PushExpression(StackTypes.Float, "FLOAT./")]
    4367  public class FloatDivideExpression : PushResultExpression<double> {
    44     public override bool Eval(IPushInterpreter interpreter) {
    45       return Eval(interpreter.FloatStack, 2, values => values[0] / values[1], 0);
     68    public override bool Eval(IInternalPushInterpreter interpreter) {
     69      return Eval(interpreter.FloatStack, 2, values => {
     70        var result = values[0] / values[1];
     71
     72        if (double.IsPositiveInfinity(result)) return double.MaxValue;
     73        if (double.IsNegativeInfinity(result)) return double.MinValue;
     74
     75        return result;
     76      }, 0);
    4677    }
    4778  }
     
    5687  [PushExpression(StackTypes.Float, "FLOAT.%")]
    5788  public class FloatModuloExpression : PushResultExpression<double> {
    58     public override bool Eval(IPushInterpreter interpreter) {
     89    public override bool Eval(IInternalPushInterpreter interpreter) {
    5990      return Eval(interpreter.FloatStack, 2, values => values[0] % values[1], 0);
    6091    }
     
    6697  [PushExpression(StackTypes.Float, "FLOAT.MIN")]
    6798  public class FloatMinExpression : PushResultExpression<double> {
    68     public override bool Eval(IPushInterpreter interpreter) {
     99    public override bool Eval(IInternalPushInterpreter interpreter) {
    69100      return Eval(interpreter.FloatStack, 2, values => Math.Min(values[0], values[1]));
    70101    }
     
    76107  [PushExpression(StackTypes.Float, "FLOAT.MAX")]
    77108  public class FloatMaxExpression : PushResultExpression<double> {
    78     public override bool Eval(IPushInterpreter interpreter) {
     109    public override bool Eval(IInternalPushInterpreter interpreter) {
    79110      return Eval(interpreter.FloatStack, 2, values => Math.Max(values[0], values[1]));
    80111    }
     
    86117  [PushExpression(StackTypes.Float, "FLOAT.<", StackTypes.Boolean)]
    87118  public class FloatSmallerThanExpression : PushResultExpression<double> {
    88     public override bool Eval(IPushInterpreter interpreter) {
     119    public override bool Eval(IInternalPushInterpreter interpreter) {
    89120      return Eval(interpreter.FloatStack, interpreter.BooleanStack, 2, values => values[0] < values[1]);
    90121    }
     
    96127  [PushExpression(StackTypes.Float, "FLOAT.<=", StackTypes.Boolean)]
    97128  public class FloatSmallerThanOrEqualExpression : PushResultExpression<double> {
    98     public override bool Eval(IPushInterpreter interpreter) {
    99       return Eval(interpreter.FloatStack, interpreter.BooleanStack, 2, values => values[0] <= values[1]);
     129    public override bool Eval(IInternalPushInterpreter interpreter) {
     130      return Eval(interpreter.FloatStack, interpreter.BooleanStack, 2, values => values[0] < values[1] || values[0].IsAlmost(values[1]));
    100131    }
    101132  }
     
    106137  [PushExpression(StackTypes.Float, "FLOAT.>", StackTypes.Boolean)]
    107138  public class FloatGreaterThanExpression : PushResultExpression<double> {
    108     public override bool Eval(IPushInterpreter interpreter) {
     139    public override bool Eval(IInternalPushInterpreter interpreter) {
    109140      return Eval(interpreter.FloatStack, interpreter.BooleanStack, 2, values => values[0] > values[1]);
    110141    }
     
    116147  [PushExpression(StackTypes.Float, "FLOAT.>=", StackTypes.Boolean)]
    117148  public class FloatGreaterThanOrEqualExpression : PushResultExpression<double> {
    118     public override bool Eval(IPushInterpreter interpreter) {
    119       return Eval(interpreter.FloatStack, interpreter.BooleanStack, 2, values => values[0] >= values[1]);
     149    public override bool Eval(IInternalPushInterpreter interpreter) {
     150      return Eval(interpreter.FloatStack, interpreter.BooleanStack, 2, values => values[0] > values[1] || values[0].IsAlmost(values[1]));
    120151    }
    121152  }
     
    126157  [PushExpression(StackTypes.Float, "FLOAT.SIN")]
    127158  public class FloatSineExpression : PushResultExpression<double> {
    128     public override bool Eval(IPushInterpreter interpreter) {
     159    public override bool Eval(IInternalPushInterpreter interpreter) {
    129160      return Eval(interpreter.FloatStack, 1, values => Math.Sin(values[0]));
    130161    }
     
    136167  [PushExpression(StackTypes.Float, "FLOAT.COS")]
    137168  public class FloatCosineExpression : PushResultExpression<double> {
    138     public override bool Eval(IPushInterpreter interpreter) {
     169    public override bool Eval(IInternalPushInterpreter interpreter) {
    139170      return Eval(interpreter.FloatStack, 1, values => Math.Cos(values[0]));
    140171    }
     
    146177  [PushExpression(StackTypes.Float, "FLOAT.FROMBOOLEAN", StackTypes.Boolean)]
    147178  public class FloatFromBooleanExpression : StatelessExpression {
    148     public override bool Eval(IPushInterpreter interpreter) {
     179    public override bool Eval(IInternalPushInterpreter interpreter) {
    149180      if (interpreter.BooleanStack.Count == 0) return false;
    150181
     
    163194  [PushExpression(StackTypes.Float, "FLOAT.FROMINTEGER", StackTypes.Integer)]
    164195  public class FloatFromIntegerExpression : StatelessExpression {
    165     public override bool Eval(IPushInterpreter interpreter) {
     196    public override bool Eval(IInternalPushInterpreter interpreter) {
    166197      if (interpreter.IntegerStack.Count == 0) return false;
    167198
Note: See TracChangeset for help on using the changeset viewer.