Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/02/08 22:45:52 (16 years ago)
Author:
gkronber
Message:

worked on #223 (Recheck and improve evaluation of boolean functions and conditionals)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Functions/BakedTreeEvaluator.cs

    r396 r424  
    2727using HeuristicLab.Core;
    2828using System.Xml;
     29using System.Diagnostics;
    2930
    3031namespace HeuristicLab.Functions {
    3132  internal class BakedTreeEvaluator : IEvaluator {
    3233    private const int MAX_TREE_SIZE = 4096;
     34    private const double EPSILON = 1.0e-7;
    3335
    3436    private class Instr {
     
    175177            return Math.Tan(EvaluateBakedCode());
    176178          }
    177         case EvaluatorSymbolTable.AND: {
     179        case EvaluatorSymbolTable.AND: { // only defined for inputs 1 and 0
    178180            double result = 1.0;
    179181            // have to evaluate all sub-trees, skipping would probably not lead to a big gain because
    180182            // we have to iterate over the linear structure anyway
    181183            for(int i = 0; i < currInstr.arity; i++) {
    182               double x = Math.Round(EvaluateBakedCode());
    183               if(x == 0 || x == 1.0) result *= x;
    184               else result = double.NaN;
     184              double x = EvaluateBakedCode();
     185              Debug.Assert(x == 0.0 || x == 1.0);
     186              result *= x;
    185187            }
    186188            return result;
     
    189191            double x = EvaluateBakedCode();
    190192            double y = EvaluateBakedCode();
    191             if(x == y) return 1.0; else return 0.0;
     193            if(Math.Abs(x - y) < EPSILON) return 1.0; else return 0.0;
    192194          }
    193195        case EvaluatorSymbolTable.GT: {
     
    197199            else return 0.0;
    198200          }
    199         case EvaluatorSymbolTable.IFTE: {
    200             double condition = Math.Round(EvaluateBakedCode());
    201             double x = EvaluateBakedCode();
    202             double y = EvaluateBakedCode();
    203             if(condition < .5) return x;
    204             else if(condition >= .5) return y;
    205             else return double.NaN;
     201        case EvaluatorSymbolTable.IFTE: { // only defined for condition 0 or 1
     202            double condition = EvaluateBakedCode();
     203            Debug.Assert(condition == 0.0 || condition == 1.0);
     204            double x = EvaluateBakedCode();
     205            double y = EvaluateBakedCode();
     206            if(condition == 0.0) return x;
     207            else return y;
    206208          }
    207209        case EvaluatorSymbolTable.LT: {
     
    211213            else return 0.0;
    212214          }
    213         case EvaluatorSymbolTable.NOT: {
    214             double result = Math.Round(EvaluateBakedCode());
     215        case EvaluatorSymbolTable.NOT: { // only defined for inputs 0 or 1
     216            double result = EvaluateBakedCode();
     217            Debug.Assert(result == 0.0 || result == 1.0);
    215218            if(result == 0.0) return 1.0;
    216             else if(result == 1.0) return 0.0;
    217             else return double.NaN;
    218           }
    219         case EvaluatorSymbolTable.OR: {
     219            else return 0.0;
     220          }
     221        case EvaluatorSymbolTable.OR: { // only defined for inputs 0 or 1
    220222            double result = 0.0; // default is false
    221223            for(int i = 0; i < currInstr.arity; i++) {
    222               double x = Math.Round(EvaluateBakedCode());
    223               if(x == 1.0 && result == 0.0) result = 1.0; // found first true (1.0) => set to true
    224               else if(x != 0.0) result = double.NaN; // if it was not true it can only be false (0.0) all other cases are undefined => (NaN)
     224              double x = EvaluateBakedCode();
     225              Debug.Assert(x == 0.0 || x == 1.0);
     226              if(x == 1.0) result = 1.0;
    225227            }
    226228            return result;
    227229          }
    228         case EvaluatorSymbolTable.XOR: {
    229             double x = Math.Round(EvaluateBakedCode());
    230             double y = Math.Round(EvaluateBakedCode());
    231             if(x == 0.0 && y == 0.0) return 0.0;
    232             if(x == 1.0 && y == 0.0) return 1.0;
    233             if(x == 0.0 && y == 1.0) return 1.0;
    234             if(x == 1.0 && y == 1.0) return 0.0;
    235             return double.NaN;
     230        case EvaluatorSymbolTable.XOR: { // only defined for inputs 0 or 1
     231            double x = EvaluateBakedCode();
     232            double y = EvaluateBakedCode();
     233            return Math.Abs(x - y);
    236234          }
    237235        default: {
Note: See TracChangeset for help on using the changeset viewer.