- Timestamp:
- 08/03/09 15:18:36 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/HL3TreeEvaluator.cs
r2222 r2226 22 22 using System; 23 23 using System.Diagnostics; 24 using HeuristicLab.Modeling; // double.IsAlmost extension 24 25 25 26 namespace HeuristicLab.GP.StructureIdentification { … … 29 30 /// </summary> 30 31 public class HL3TreeEvaluator : TreeEvaluatorBase { 31 32 33 32 protected override double EvaluateBakedCode() { 34 33 Instr currInstr = codeArr[PC++]; … … 36 35 case EvaluatorSymbolTable.VARIABLE: { 37 36 int row = sampleIndex + currInstr.i_arg1; 38 if (row < 0 || row >= dataset.Rows) return double.NaN;37 if (row < 0 || row >= dataset.Rows) throw new InvalidOperationException("Out of range access to dataset row: " + row); 39 38 else return currInstr.d_arg0 * dataset.GetValue(row, currInstr.i_arg0); 40 39 } … … 44 43 case EvaluatorSymbolTable.DIFFERENTIAL: { 45 44 int row = sampleIndex + currInstr.i_arg1; 46 if (row < 0 || row >= dataset.Rows) return double.NaN;45 if (row < 0 || row >= dataset.Rows) throw new InvalidOperationException("Out of range access to dataset row: " + row); 47 46 else if (row < 1) return 0.0; 48 47 else { … … 117 116 return Math.Tan(EvaluateBakedCode()); 118 117 } 119 case EvaluatorSymbolTable.AND: { // only defined for inputs 1 and 0118 case EvaluatorSymbolTable.AND: { 120 119 double result = EvaluateBakedCode(); 121 120 for (int i = 1; i < currInstr.arity; i++) { 122 if (result ==0.0) SkipBakedCode();121 if (result < 0.0) SkipBakedCode(); 123 122 else { 124 123 result = EvaluateBakedCode(); 125 124 } 126 Debug.Assert(result == 0.0 || result == 1.0);127 125 } 128 return result;126 return Math.Sign(result); 129 127 } 130 128 case EvaluatorSymbolTable.EQU: { 131 129 double x = EvaluateBakedCode(); 132 130 double y = EvaluateBakedCode(); 133 if ( Math.Abs(x - y) < EPSILON) return 1.0; else return 0.0;131 if (x.IsAlmost(y)) return 1.0; else return -1.0; 134 132 } 135 133 case EvaluatorSymbolTable.GT: { … … 137 135 double y = EvaluateBakedCode(); 138 136 if (x > y) return 1.0; 139 else return 0.0;137 else return -1.0; 140 138 } 141 case EvaluatorSymbolTable.IFTE: { // only defined for condition 0 or 1139 case EvaluatorSymbolTable.IFTE: { 142 140 double condition = EvaluateBakedCode(); 143 Debug.Assert(condition == 0.0 || condition == 1.0);144 141 double result; 145 if (condition ==0.0) {142 if (condition < 0.0) { 146 143 result = EvaluateBakedCode(); SkipBakedCode(); 147 144 } else { … … 154 151 double y = EvaluateBakedCode(); 155 152 if (x < y) return 1.0; 156 else return 0.0;153 else return -1.0; 157 154 } 158 case EvaluatorSymbolTable.NOT: { // only defined for inputs 0 or 1 159 double result = EvaluateBakedCode(); 160 Debug.Assert(result == 0.0 || result == 1.0); 161 return Math.Abs(result - 1.0); 155 case EvaluatorSymbolTable.NOT: { 156 return -EvaluateBakedCode(); 162 157 } 163 case EvaluatorSymbolTable.OR: { // only defined for inputs 0 or 1158 case EvaluatorSymbolTable.OR: { 164 159 double result = EvaluateBakedCode(); 165 160 for (int i = 1; i < currInstr.arity; i++) { 166 if (result > 0.0) SkipBakedCode();161 if (result >= 0.0) SkipBakedCode(); 167 162 else { 168 163 result = EvaluateBakedCode(); 169 Debug.Assert(result == 0.0 || result == 1.0);170 164 } 171 165 } 172 return result;166 return Math.Sign(result); 173 167 } 174 case EvaluatorSymbolTable.XOR: { // only defined for inputs 0 or 1168 case EvaluatorSymbolTable.XOR: { 175 169 double x = EvaluateBakedCode(); 176 170 double y = EvaluateBakedCode(); 177 return Math.Abs(x - y); 171 if (x > y) { 172 double tmp = x; 173 x = y; 174 y = tmp; 175 } 176 // invariant y >= x 177 if (y < 0.0 || x > 0.0) return -1.0; 178 else return 1.0; 178 179 } 179 180 default: {
Note: See TracChangeset
for help on using the changeset viewer.