Changeset 17817


Ignore:
Timestamp:
01/05/21 11:16:48 (10 months ago)
Author:
gkronber
Message:

#3095: added support for integer powers to parameter optimization

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs

    r17180 r17817  
    209209      bool updateConstantsInTree = true, Action<double[], double, object> iterationCallback = null, EvaluationsCounter counter = null) {
    210210
    211       // numeric constants in the tree become variables for constant opt
    212       // variables in the tree become parameters (fixed values) for constant opt
    213       // for each parameter (variable in the original tree) we store the
     211      // Numeric constants in the tree become variables for parameter optimization.
     212      // Variables in the tree become parameters (fixed values) for parameter optimization.
     213      // For each parameter (variable in the original tree) we store the
    214214      // variable name, variable value (for factor vars) and lag as a DataForVariable object.
    215215      // A dictionary is used to find parameters
     
    221221      if (!TreeToAutoDiffTermConverter.TryConvertToAutoDiff(tree, updateVariableWeights, applyLinearScaling, out parameters, out initialConstants, out func, out func_grad))
    222222        throw new NotSupportedException("Could not optimize constants of symbolic expression tree due to not supported symbols used in the tree.");
    223       if (parameters.Count == 0) return 0.0; // gkronber: constant expressions always have a R² of 0.0
     223      if (parameters.Count == 0) return 0.0; // constant expressions always have a R² of 0.0
    224224      var parameterEntries = parameters.ToArray(); // order of entries must be the same for x
    225225
    226       //extract inital constants
     226      // extract inital constants
    227227      double[] c;
    228228      if (applyLinearScaling) {
     
    309309        VariableTreeNodeBase variableTreeNodeBase = node as VariableTreeNodeBase;
    310310        FactorVariableTreeNode factorVarTreeNode = node as FactorVariableTreeNode;
    311         if (constantTreeNode != null)
     311        if (constantTreeNode != null) {
     312          if (constantTreeNode.Parent.Symbol is Power
     313              && constantTreeNode.Parent.GetSubtree(1) == constantTreeNode) continue; // exponents in powers are not optimizated (see TreeToAutoDiffTermConverter)
    312314          constantTreeNode.Value = constants[i++];
    313         else if (updateVariableWeights && variableTreeNodeBase != null)
     315        } else if (updateVariableWeights && variableTreeNodeBase != null)
    314316          variableTreeNodeBase.Weight = constants[i++];
    315317        else if (factorVarTreeNode != null) {
  • trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Converters/TreeToAutoDiffTermConverter.cs

    r17180 r17817  
    258258      if (node.Symbol is CubeRoot) {
    259259        return cbrt(ConvertToAutoDiff(node.GetSubtree(0)));
     260      }
     261      if (node.Symbol is Power) {
     262        var powerNode = node.GetSubtree(1) as ConstantTreeNode;
     263        if (powerNode == null)
     264          throw new NotSupportedException("Only integer powers are allowed in parameter optimization. Try to use exp() and log() instead of the power symbol.");
     265        var intPower = Math.Truncate(powerNode.Value);
     266        if (intPower != powerNode.Value)
     267          throw new NotSupportedException("Only integer powers are allowed in parameter optimization. Try to use exp() and log() instead of the power symbol.");
     268        return AutoDiff.TermBuilder.Power(ConvertToAutoDiff(node.GetSubtree(0)), intPower);
    260269      }
    261270      if (node.Symbol is Sine) {
     
    340349          !(n.Symbol is AnalyticQuotient) &&
    341350          !(n.Symbol is Cube) &&
    342           !(n.Symbol is CubeRoot)
     351          !(n.Symbol is CubeRoot) &&
     352          !(n.Symbol is Power)
    343353        select n).Any();
    344354      return !containsUnknownSymbol;
Note: See TracChangeset for help on using the changeset viewer.