Changeset 6849 for trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeInterpreter.cs
- Timestamp:
- 09/29/11 13:27:46 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeInterpreter.cs
r6769 r6849 132 132 133 133 public const byte VariableCondition = 27; 134 135 public const byte UncheckedVariable = 28; 136 public const byte UncheckedVariableCondition = 29; 134 137 } 135 138 #endregion 136 139 140 private Dictionary<Type, byte> symbolToUncheckedOpcode = new Dictionary<Type, byte>() { 141 { typeof(HeuristicLab.Problems.DataAnalysis.Symbolic.Variable), OpCodes.UncheckedVariable }, 142 { typeof(VariableCondition),OpCodes.UncheckedVariableCondition} 143 }; 137 144 private Dictionary<Type, byte> symbolToOpcode = new Dictionary<Type, byte>() { 138 145 { typeof(Addition), OpCodes.Add }, … … 206 213 for (int i = 0; i < code.Length; i++) { 207 214 Instruction instr = code[i]; 208 if (instr.opCode == OpCodes.Variable ) {215 if (instr.opCode == OpCodes.Variable || instr.opCode == OpCodes.UncheckedVariable) { 209 216 var variableTreeNode = instr.dynamicNode as VariableTreeNode; 210 217 instr.iArg0 = dataset.GetReadOnlyDoubleValues(variableTreeNode.VariableName); … … 214 221 instr.iArg0 = dataset.GetReadOnlyDoubleValues(laggedVariableTreeNode.VariableName); 215 222 code[i] = instr; 216 } else if (instr.opCode == OpCodes.VariableCondition ) {223 } else if (instr.opCode == OpCodes.VariableCondition || instr.opCode == OpCodes.UncheckedVariableCondition) { 217 224 var variableConditionTreeNode = instr.dynamicNode as VariableConditionTreeNode; 218 225 instr.iArg0 = dataset.GetReadOnlyDoubleValues(variableConditionTreeNode.VariableName); … … 410 417 return ((IList<double>)currentInstr.iArg0)[row] * variableTreeNode.Weight; 411 418 } 419 case OpCodes.UncheckedVariable: { 420 var variableTreeNode = (VariableTreeNode)currentInstr.dynamicNode; 421 return ((IList<double>)currentInstr.iArg0)[row] * variableTreeNode.Weight; 422 } 412 423 case OpCodes.LagVariable: { 413 424 var laggedVariableTreeNode = (LaggedVariableTreeNode)currentInstr.dynamicNode; … … 437 448 return trueBranch * p + falseBranch * (1 - p); 438 449 } 450 case OpCodes.UncheckedVariableCondition: { 451 var variableConditionTreeNode = (VariableConditionTreeNode)currentInstr.dynamicNode; 452 double variableValue = ((IList<double>)currentInstr.iArg0)[row]; 453 double x = variableValue - variableConditionTreeNode.Threshold; 454 double p = 1 / (1 + Math.Exp(-variableConditionTreeNode.Slope * x)); 455 456 double trueBranch = Evaluate(dataset, ref row, state); 457 double falseBranch = Evaluate(dataset, ref row, state); 458 459 return trueBranch * p + falseBranch * (1 - p); 460 } 439 461 default: throw new NotSupportedException(); 440 462 } … … 442 464 443 465 private byte MapSymbolToOpCode(ISymbolicExpressionTreeNode treeNode) { 444 if (symbolToOpcode.ContainsKey(treeNode.Symbol.GetType())) 445 return symbolToOpcode[treeNode.Symbol.GetType()]; 446 else 447 throw new NotSupportedException("Symbol: " + treeNode.Symbol); 466 if ((treeNode.Symbol.GetType() == typeof(Variable) || treeNode.Symbol.GetType() == typeof(VariableCondition)) && !InLaggedContext(treeNode)) { 467 return symbolToUncheckedOpcode[treeNode.Symbol.GetType()]; 468 } else { 469 if (symbolToOpcode.ContainsKey(treeNode.Symbol.GetType())) 470 return symbolToOpcode[treeNode.Symbol.GetType()]; 471 else 472 throw new NotSupportedException("Symbol: " + treeNode.Symbol); 473 } 474 } 475 476 private bool InLaggedContext(ISymbolicExpressionTreeNode treeNode) { 477 if (treeNode.Parent == null) return false; 478 if (treeNode.Parent is ILaggedTreeNode) return true; 479 if (treeNode.Parent.Symbol is Derivative) return true; 480 return InLaggedContext(treeNode.Parent); 448 481 } 449 482
Note: See TracChangeset
for help on using the changeset viewer.