Changeset 13869


Ignore:
Timestamp:
06/01/16 17:00:19 (5 years ago)
Author:
bburlacu
Message:

#2609: Introduce arity checks before creating autodiff terms in the TryTransformToAutoDiff method.

File:
1 edited

Legend:

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

    r13670 r13869  
    337337      if (node.Symbol is Multiplication) {
    338338        AutoDiff.Term a, b;
    339         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out a) ||
    340           !TryTransformToAutoDiff(node.GetSubtree(1), variables, parameters, variableNames, updateVariableWeights, out b)) {
    341           term = null;
    342           return false;
    343         } else {
    344           List<AutoDiff.Term> factors = new List<Term>();
    345           foreach (var subTree in node.Subtrees.Skip(2)) {
    346             AutoDiff.Term f;
    347             if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, updateVariableWeights, out f)) {
    348               term = null;
    349               return false;
    350             }
    351             factors.Add(f);
    352           }
    353           term = AutoDiff.TermBuilder.Product(a, b, factors.ToArray());
    354           return true;
    355         }
     339        if (node.SubtreeCount == 1) {
     340          a = AutoDiff.TermBuilder.Constant(1);
     341          if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out b)) {
     342            term = null;
     343            return false;
     344          }
     345        } else {
     346          if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out a) ||
     347              !TryTransformToAutoDiff(node.GetSubtree(1), variables, parameters, variableNames, updateVariableWeights, out b)) {
     348            term = null;
     349            return false;
     350          }
     351        }
     352        List<AutoDiff.Term> factors = new List<Term>();
     353        foreach (var subTree in node.Subtrees.Skip(2)) {
     354          AutoDiff.Term f;
     355          if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, updateVariableWeights, out f)) {
     356            term = null;
     357            return false;
     358          }
     359          factors.Add(f);
     360        }
     361        term = AutoDiff.TermBuilder.Product(a, b, factors.ToArray());
     362        return true;
    356363      }
    357364      if (node.Symbol is Division) {
    358         // only works for at least two subtrees
    359365        AutoDiff.Term a, b;
    360         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out a) ||
    361           !TryTransformToAutoDiff(node.GetSubtree(1), variables, parameters, variableNames, updateVariableWeights, out b)) {
    362           term = null;
    363           return false;
    364         } else {
    365           List<AutoDiff.Term> factors = new List<Term>();
    366           foreach (var subTree in node.Subtrees.Skip(2)) {
    367             AutoDiff.Term f;
    368             if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, updateVariableWeights, out f)) {
    369               term = null;
    370               return false;
    371             }
    372             factors.Add(1.0 / f);
    373           }
    374           term = AutoDiff.TermBuilder.Product(a, 1.0 / b, factors.ToArray());
    375           return true;
    376         }
     366        if (node.SubtreeCount == 1) {
     367          a = AutoDiff.TermBuilder.Constant(1);
     368          if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out b)) {
     369            term = null;
     370            return false;
     371          }
     372        } else {
     373          if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out a) ||
     374              !TryTransformToAutoDiff(node.GetSubtree(1), variables, parameters, variableNames, updateVariableWeights, out b)) {
     375            term = null;
     376            return false;
     377          }
     378        }
     379        List<AutoDiff.Term> factors = new List<Term>();
     380        foreach (var subTree in node.Subtrees.Skip(2)) {
     381          AutoDiff.Term f;
     382          if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, updateVariableWeights, out f)) {
     383            term = null;
     384            return false;
     385          }
     386          factors.Add(1.0 / f);
     387        }
     388        term = AutoDiff.TermBuilder.Product(a, 1.0 / b, factors.ToArray());
     389        return true;
    377390      }
    378391      if (node.Symbol is Logarithm) {
     
    405418          return true;
    406419        }
    407       } if (node.Symbol is SquareRoot) {
     420      }
     421      if (node.Symbol is SquareRoot) {
    408422        AutoDiff.Term t;
    409423        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out t)) {
     
    414428          return true;
    415429        }
    416       } if (node.Symbol is Sine) {
     430      }
     431      if (node.Symbol is Sine) {
    417432        AutoDiff.Term t;
    418433        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out t)) {
     
    423438          return true;
    424439        }
    425       } if (node.Symbol is Cosine) {
     440      }
     441      if (node.Symbol is Cosine) {
    426442        AutoDiff.Term t;
    427443        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out t)) {
     
    432448          return true;
    433449        }
    434       } if (node.Symbol is Tangent) {
     450      }
     451      if (node.Symbol is Tangent) {
    435452        AutoDiff.Term t;
    436453        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out t)) {
     
    441458          return true;
    442459        }
    443       } if (node.Symbol is Erf) {
     460      }
     461      if (node.Symbol is Erf) {
    444462        AutoDiff.Term t;
    445463        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out t)) {
     
    450468          return true;
    451469        }
    452       } if (node.Symbol is Norm) {
     470      }
     471      if (node.Symbol is Norm) {
    453472        AutoDiff.Term t;
    454473        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, updateVariableWeights, out t)) {
Note: See TracChangeset for help on using the changeset viewer.