Ignore:
Timestamp:
10/27/09 09:50:46 (13 years ago)
Author:
gkronber
Message:

Fixed minor evaluation inconsistencies in HL3 tree evaluator. #791

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/HL3TreeEvaluator.cs

    r2393 r2449  
    7070        case EvaluatorSymbolTable.SUBTRACTION: {
    7171            double result = EvaluateBakedCode();
     72            if (currInstr.arity == 1) return -result;
    7273            for (int i = 1; i < currInstr.arity; i++) {
    7374              result -= EvaluateBakedCode();
     
    7879            double result;
    7980            result = EvaluateBakedCode();
     81            if (currInstr.arity == 1) {
     82              return result.IsAlmost(0.0) ? 0.0 : 1.0 / result;
     83            }
    8084            for (int i = 1; i < currInstr.arity; i++) {
    81               result /= EvaluateBakedCode();
     85              double tmp = EvaluateBakedCode();
     86              result = tmp.IsAlmost(0.0) ? 0.0 : result /= tmp;
    8287            }
    83             if (double.IsInfinity(result)) return 0.0;
    84             else return result;
     88            return result;
    8589          }
    8690        case EvaluatorSymbolTable.AVERAGE: {
     
    122126            double result = EvaluateBakedCode();
    123127            for (int i = 1; i < currInstr.arity; i++) {
    124               if (result < 0.0) SkipBakedCode();
     128              if (result <= 0.0) SkipBakedCode();
    125129              else {
    126130                result = EvaluateBakedCode();
    127131              }
    128132            }
    129             return Math.Sign(result);
     133            return result <= 0.0 ? -1.0 : 1.0;
    130134          }
    131135        case EvaluatorSymbolTable.EQU: {
     
    143147            double condition = EvaluateBakedCode();
    144148            double result;
    145             if (condition < 0.0) {
     149            if (condition > 0.0) {
    146150              result = EvaluateBakedCode(); SkipBakedCode();
    147151            } else {
     
    162166            double result = EvaluateBakedCode();
    163167            for (int i = 1; i < currInstr.arity; i++) {
    164               if (result >= 0.0) SkipBakedCode();
     168              if (result > 0.0) SkipBakedCode();
    165169              else {
    166170                result = EvaluateBakedCode();
    167171              }
    168172            }
    169             return Math.Sign(result);
     173            return result > 0.0 ? 1.0 : -1.0;
    170174          }
    171175        case EvaluatorSymbolTable.XOR: {
     
    178182            }
    179183            // invariant y >= x
    180             if (y < 0.0 || x > 0.0) return -1.0;
     184            if (y <= 0.0 || x > 0.0) return -1.0;
    181185            else return 1.0;
    182186          }
Note: See TracChangeset for help on using the changeset viewer.