Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/15/21 11:50:57 (2 years ago)
Author:
gkronber
Message:

#3140: merged r18091:18131 from branch to trunk

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/HeuristicLab.Problems.DataAnalysis.Symbolic

  • trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Converters/DerivativeCalculator.cs

    r17902 r18132  
    4141    }
    4242
    43     private static readonly Constant constantSy = new Constant();
     43    private static readonly Number numberSy = new Number();
    4444    private static readonly Addition addSy = new Addition();
    4545    private static readonly Subtraction subSy = new Subtraction();
     
    5252
    5353    public static ISymbolicExpressionTreeNode Derive(ISymbolicExpressionTreeNode branch, string variableName) {
    54       if (branch.Symbol is Constant) {
    55         return CreateConstant(0.0);
     54      if (branch.Symbol is INumericSymbol) {
     55        return CreateNumber(0.0);
    5656      }
    5757      if (branch.Symbol is Variable) {
    5858        var varNode = branch as VariableTreeNode;
    5959        if (varNode.VariableName == variableName) {
    60           return CreateConstant(varNode.Weight);
     60          return CreateNumber(varNode.Weight);
    6161        } else {
    62           return CreateConstant(0.0);
     62          return CreateNumber(0.0);
    6363        }
    6464      }
     
    102102        if (branch.SubtreeCount == 1) {
    103103          var g = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone();
    104           var gPrime = Product(CreateConstant(-1.0), Derive(g, variableName));
     104          var gPrime = Product(CreateNumber(-1.0), Derive(g, variableName));
    105105          var sqrNode = new Square().CreateTreeNode();
    106106          sqrNode.AddSubtree(g);
     
    125125      if (branch.Symbol is Logarithm) {
    126126        var f = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone();
    127         return Product(Div(CreateConstant(1.0), f), Derive(f, variableName));
     127        return Product(Div(CreateNumber(1.0), f), Derive(f, variableName));
    128128      }
    129129      if (branch.Symbol is Exponential) {
     
    133133      if (branch.Symbol is Square) {
    134134        var f = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone();
    135         return Product(Product(CreateConstant(2.0), f), Derive(f, variableName));
     135        return Product(Product(CreateNumber(2.0), f), Derive(f, variableName));
    136136      }
    137137      if (branch.Symbol is SquareRoot) {
    138138        var f = (ISymbolicExpressionTreeNode)branch.Clone();
    139139        var u = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone();
    140         return Product(Div(CreateConstant(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));
    141141      }
    142142      if (branch.Symbol is CubeRoot) {
    143143        var f = (ISymbolicExpressionTreeNode)branch.Clone();
    144144        var u = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone();
    145         return Product(Div(CreateConstant(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)
    146146      }
    147147      if (branch.Symbol is Cube) {
    148148        var f = (ISymbolicExpressionTreeNode)branch.GetSubtree(0).Clone();
    149         return Product(Product(CreateConstant(3.0), Square(f)), Derive(f, variableName));
     149        return Product(Product(CreateNumber(3.0), Square(f)), Derive(f, variableName));
    150150      }
    151151      if (branch.Symbol is Power) {
    152152        // HL evaluators handle power strangely (exponent is rounded to an integer)
    153153        // 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;
    155155        if (exponent != null && Math.Truncate(exponent.Value) == exponent.Value) {
    156156          var newPower = (ISymbolicExpressionTreeNode)branch.Clone();
    157157          var f = (ISymbolicExpressionTreeNode)newPower.GetSubtree(0).Clone();
    158           var newExponent = (ConstantTreeNode)newPower.GetSubtree(1);
    159           newExponent.Value -= 1;
    160           return Product(Product(CreateConstant(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));
    161161        } else throw new NotSupportedException("Cannot derive non-integer powers");
    162162      }
     
    171171        var b = (ISymbolicExpressionTreeNode)branch.GetSubtree(1).Clone();
    172172
    173         var definition = Div(a, SquareRoot(Sum(Square(b), CreateConstant(1.0))));
     173        var definition = Div(a, SquareRoot(Sum(Square(b), CreateNumber(1.0))));
    174174        return Derive(definition, variableName);
    175175      }
     
    184184        var sin = (new Sine()).CreateTreeNode();
    185185        sin.AddSubtree(u);
    186         return Product(CreateConstant(-1.0), Product(sin, Derive(u, variableName)));
     186        return Product(CreateNumber(-1.0), Product(sin, Derive(u, variableName)));
    187187      }
    188188      if (branch.Symbol is Tangent) {
     
    196196        var fxp = Derive(branch.GetSubtree(0), variableName);
    197197        var tanh = (ISymbolicExpressionTreeNode)branch.Clone();
    198         return Product(fxp, Subtract(CreateConstant(1.0), Square(tanh)));
     198        return Product(fxp, Subtract(CreateNumber(1.0), Square(tanh)));
    199199      }
    200200      throw new NotSupportedException(string.Format("Symbol {0} is not supported.", branch.Symbol));
     
    253253    }
    254254
    255     private static ISymbolicExpressionTreeNode CreateConstant(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;
    259259    }
    260260
     
    264264        where
    265265          !(n.Symbol is Variable) &&
     266          !(n.Symbol is Number) &&
    266267          !(n.Symbol is Constant) &&
    267268          !(n.Symbol is Addition) &&
Note: See TracChangeset for help on using the changeset viewer.