Changeset 18132 for trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Converters/DerivativeCalculator.cs
- Timestamp:
- 12/15/21 11:50:57 (2 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/3140_NumberSymbol (added) merged: 18091,18093,18100,18112-18121,18123-18131
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
/branches/3140_NumberSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic (added) merged: 18093,18100,18112-18116,18118,18121,18123-18124,18129-18130
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Converters/DerivativeCalculator.cs
r17902 r18132 41 41 } 42 42 43 private static readonly Constant constantSy = new Constant();43 private static readonly Number numberSy = new Number(); 44 44 private static readonly Addition addSy = new Addition(); 45 45 private static readonly Subtraction subSy = new Subtraction(); … … 52 52 53 53 public static ISymbolicExpressionTreeNode Derive(ISymbolicExpressionTreeNode branch, string variableName) { 54 if (branch.Symbol is Constant) {55 return Create Constant(0.0);54 if (branch.Symbol is INumericSymbol) { 55 return CreateNumber(0.0); 56 56 } 57 57 if (branch.Symbol is Variable) { 58 58 var varNode = branch as VariableTreeNode; 59 59 if (varNode.VariableName == variableName) { 60 return Create Constant(varNode.Weight);60 return CreateNumber(varNode.Weight); 61 61 } else { 62 return Create Constant(0.0);62 return CreateNumber(0.0); 63 63 } 64 64 } … … 102 102 if (branch.SubtreeCount == 1) { 103 103 var g = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone(); 104 var gPrime = Product(Create Constant(-1.0), Derive(g, variableName));104 var gPrime = Product(CreateNumber(-1.0), Derive(g, variableName)); 105 105 var sqrNode = new Square().CreateTreeNode(); 106 106 sqrNode.AddSubtree(g); … … 125 125 if (branch.Symbol is Logarithm) { 126 126 var f = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone(); 127 return Product(Div(Create Constant(1.0), f), Derive(f, variableName));127 return Product(Div(CreateNumber(1.0), f), Derive(f, variableName)); 128 128 } 129 129 if (branch.Symbol is Exponential) { … … 133 133 if (branch.Symbol is Square) { 134 134 var f = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone(); 135 return Product(Product(Create Constant(2.0), f), Derive(f, variableName));135 return Product(Product(CreateNumber(2.0), f), Derive(f, variableName)); 136 136 } 137 137 if (branch.Symbol is SquareRoot) { 138 138 var f = (ISymbolicExpressionTreeNode)branch.Clone(); 139 139 var u = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone(); 140 return Product(Div(Create Constant(1.0), Product(CreateConstant(2.0), f)), Derive(u, variableName));140 return Product(Div(CreateNumber(1.0), Product(CreateNumber(2.0), f)), Derive(u, variableName)); 141 141 } 142 142 if (branch.Symbol is CubeRoot) { 143 143 var f = (ISymbolicExpressionTreeNode)branch.Clone(); 144 144 var u = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone(); 145 return Product(Div(Create Constant(1.0), Product(CreateConstant(3.0), Square(f))), Derive(u, variableName)); // 1/3 1/cbrt(f(x))^2 d/dx f(x)145 return Product(Div(CreateNumber(1.0), Product(CreateNumber(3.0), Square(f))), Derive(u, variableName)); // 1/3 1/cbrt(f(x))^2 d/dx f(x) 146 146 } 147 147 if (branch.Symbol is Cube) { 148 148 var f = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone(); 149 return Product(Product(Create Constant(3.0), Square(f)), Derive(f, variableName));149 return Product(Product(CreateNumber(3.0), Square(f)), Derive(f, variableName)); 150 150 } 151 151 if (branch.Symbol is Power) { 152 152 // HL evaluators handle power strangely (exponent is rounded to an integer) 153 153 // here we only support the case when the exponent is a constant integer 154 var exponent = branch.GetSubtree(1) as ConstantTreeNode;154 var exponent = branch.GetSubtree(1) as INumericTreeNode; 155 155 if (exponent != null && Math.Truncate(exponent.Value) == exponent.Value) { 156 156 var newPower = (ISymbolicExpressionTreeNode)branch.Clone(); 157 157 var f = (ISymbolicExpressionTreeNode)newPower.GetSubtree(0).Clone(); 158 var newExponent = ( ConstantTreeNode)newPower.GetSubtree(1);159 newExponent.Value -=1;160 return Product(Product(Create Constant(exponent.Value), newPower), Derive(f, variableName));158 var newExponent = (INumericTreeNode)numberSy.CreateTreeNode(); 159 newExponent.Value = ((INumericTreeNode)newPower.GetSubtree(1)).Value - 1; 160 return Product(Product(CreateNumber(exponent.Value), newPower), Derive(f, variableName)); 161 161 } else throw new NotSupportedException("Cannot derive non-integer powers"); 162 162 } … … 171 171 var b = (ISymbolicExpressionTreeNode)branch.GetSubtree(1).Clone(); 172 172 173 var definition = Div(a, SquareRoot(Sum(Square(b), Create Constant(1.0))));173 var definition = Div(a, SquareRoot(Sum(Square(b), CreateNumber(1.0)))); 174 174 return Derive(definition, variableName); 175 175 } … … 184 184 var sin = (new Sine()).CreateTreeNode(); 185 185 sin.AddSubtree(u); 186 return Product(Create Constant(-1.0), Product(sin, Derive(u, variableName)));186 return Product(CreateNumber(-1.0), Product(sin, Derive(u, variableName))); 187 187 } 188 188 if (branch.Symbol is Tangent) { … … 196 196 var fxp = Derive(branch.GetSubtree(0), variableName); 197 197 var tanh = (ISymbolicExpressionTreeNode)branch.Clone(); 198 return Product(fxp, Subtract(Create Constant(1.0), Square(tanh)));198 return Product(fxp, Subtract(CreateNumber(1.0), Square(tanh))); 199 199 } 200 200 throw new NotSupportedException(string.Format("Symbol {0} is not supported.", branch.Symbol)); … … 253 253 } 254 254 255 private static ISymbolicExpressionTreeNode Create Constant(double v) {256 var constNode = (ConstantTreeNode)constantSy.CreateTreeNode();257 constNode.Value = v;258 return constNode;255 private static ISymbolicExpressionTreeNode CreateNumber(double v) { 256 var numberNode = (NumberTreeNode)numberSy.CreateTreeNode(); 257 numberNode.Value = v; 258 return numberNode; 259 259 } 260 260 … … 264 264 where 265 265 !(n.Symbol is Variable) && 266 !(n.Symbol is Number) && 266 267 !(n.Symbol is Constant) && 267 268 !(n.Symbol is Addition) &&
Note: See TracChangeset
for help on using the changeset viewer.