Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/23/16 09:44:29 (8 years ago)
Author:
gkronber
Message:

#2650: merged r14332:14350 from trunk to branch

Location:
branches/symbreg-factors-2650
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/symbreg-factors-2650

  • branches/symbreg-factors-2650/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression

  • branches/symbreg-factors-2650/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4

  • branches/symbreg-factors-2650/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs

    r14266 r14351  
    183183      List<string> variableNames = new List<string>();
    184184      List<string> categoricalVariableValues = new List<string>();
     185      List<int> lags = new List<int>();
    185186
    186187      AutoDiff.Term func;
    187       if (!TryTransformToAutoDiff(tree.Root.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out func))
     188      if (!TryTransformToAutoDiff(tree.Root.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out func))
    188189        throw new NotSupportedException("Could not optimize constants of symbolic expression tree due to not supported symbols used in the tree.");
    189190      if (variableNames.Count == 0) return 0.0; // gkronber: constant expressions always have a R² of 0.0
     
    235236      foreach (var r in rows) {
    236237        for (int col = 0; col < variableNames.Count; col++) {
     238          int lag = lags[col];
    237239          if (ds.VariableHasType<double>(variableNames[col])) {
    238             x[row, col] = ds.GetDoubleValue(variableNames[col], r);
     240            x[row, col] = ds.GetDoubleValue(variableNames[col], r + lag);
    239241          } else if (ds.VariableHasType<string>(variableNames[col])) {
    240242            x[row, col] = ds.GetStringValue(variableNames[col], r) == categoricalVariableValues[col] ? 1 : 0;
     
    257259        alglib.lsfitfit(state, function_cx_1_func, function_cx_1_grad, null, null);
    258260        alglib.lsfitresults(state, out info, out c, out rep);
    259       }
    260       catch (ArithmeticException) {
     261      } catch (ArithmeticException) {
    261262        return originalQuality;
    262       }
    263       catch (alglib.alglibexception) {
     263      } catch (alglib.alglibexception) {
    264264        return originalQuality;
    265265      }
     
    312312
    313313    private static bool TryTransformToAutoDiff(ISymbolicExpressionTreeNode node, List<AutoDiff.Variable> variables, List<AutoDiff.Variable> parameters,
    314       List<string> variableNames, List<string> categoricalVariableValues, bool updateVariableWeights, out AutoDiff.Term term) {
     314      List<string> variableNames, List<int> lags, List<string> categoricalVariableValues, bool updateVariableWeights, out AutoDiff.Term term) {
    315315      if (node.Symbol is Constant) {
    316316        var var = new AutoDiff.Variable();
     
    325325        var varValue = factorVarNode != null ? factorVarNode.VariableValue : string.Empty;
    326326        var par = FindOrCreateParameter(varNode.VariableName, varValue, parameters, variableNames, categoricalVariableValues);
     327        lags.Add(0);
    327328
    328329        if (updateVariableWeights) {
     
    349350        return true;
    350351      }
     352      if (node.Symbol is LaggedVariable) {
     353        var varNode = node as LaggedVariableTreeNode;
     354        var par = new AutoDiff.Variable();
     355        parameters.Add(par);
     356        variableNames.Add(varNode.VariableName);
     357        lags.Add(varNode.Lag);
     358
     359        if (updateVariableWeights) {
     360          var w = new AutoDiff.Variable();
     361          variables.Add(w);
     362          term = AutoDiff.TermBuilder.Product(w, par);
     363        } else {
     364          term = par;
     365        }
     366        return true;
     367      }
    351368      if (node.Symbol is Addition) {
    352369        List<AutoDiff.Term> terms = new List<Term>();
    353370        foreach (var subTree in node.Subtrees) {
    354371          AutoDiff.Term t;
    355           if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     372          if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    356373            term = null;
    357374            return false;
     
    366383        for (int i = 0; i < node.SubtreeCount; i++) {
    367384          AutoDiff.Term t;
    368           if (!TryTransformToAutoDiff(node.GetSubtree(i), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     385          if (!TryTransformToAutoDiff(node.GetSubtree(i), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    369386            term = null;
    370387            return false;
     
    381398        foreach (var subTree in node.Subtrees) {
    382399          AutoDiff.Term t;
    383           if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     400          if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    384401            term = null;
    385402            return false;
     
    396413        foreach (var subTree in node.Subtrees) {
    397414          AutoDiff.Term t;
    398           if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     415          if (!TryTransformToAutoDiff(subTree, variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    399416            term = null;
    400417            return false;
     
    408425      if (node.Symbol is Logarithm) {
    409426        AutoDiff.Term t;
    410         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     427        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    411428          term = null;
    412429          return false;
     
    418435      if (node.Symbol is Exponential) {
    419436        AutoDiff.Term t;
    420         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     437        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    421438          term = null;
    422439          return false;
     
    428445      if (node.Symbol is Square) {
    429446        AutoDiff.Term t;
    430         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     447        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    431448          term = null;
    432449          return false;
     
    438455      if (node.Symbol is SquareRoot) {
    439456        AutoDiff.Term t;
    440         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     457        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    441458          term = null;
    442459          return false;
     
    448465      if (node.Symbol is Sine) {
    449466        AutoDiff.Term t;
    450         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     467        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    451468          term = null;
    452469          return false;
     
    458475      if (node.Symbol is Cosine) {
    459476        AutoDiff.Term t;
    460         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     477        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    461478          term = null;
    462479          return false;
     
    468485      if (node.Symbol is Tangent) {
    469486        AutoDiff.Term t;
    470         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     487        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    471488          term = null;
    472489          return false;
     
    478495      if (node.Symbol is Erf) {
    479496        AutoDiff.Term t;
    480         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     497        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    481498          term = null;
    482499          return false;
     
    488505      if (node.Symbol is Norm) {
    489506        AutoDiff.Term t;
    490         if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out t)) {
     507        if (!TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out t)) {
    491508          term = null;
    492509          return false;
     
    502519        variables.Add(alpha);
    503520        AutoDiff.Term branchTerm;
    504         if (TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, categoricalVariableValues, updateVariableWeights, out branchTerm)) {
     521        if (TryTransformToAutoDiff(node.GetSubtree(0), variables, parameters, variableNames, lags, categoricalVariableValues, updateVariableWeights, out branchTerm)) {
    505522          term = branchTerm * alpha + beta;
    506523          return true;
     
    547564         !(n.Symbol is BinaryFactorVariable) &&
    548565         !(n.Symbol is FactorVariable) &&
     566         !(n.Symbol is LaggedVariable) &&
    549567         !(n.Symbol is Constant) &&
    550568         !(n.Symbol is Addition) &&
Note: See TracChangeset for help on using the changeset viewer.