Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/16/21 14:23:48 (2 years ago)
Author:
mkommend
Message:

#3136: Merged trunk changes into branch.

Location:
branches/3136_Structural_GP
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/3136_Structural_GP

  • branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic

  • branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionLatexFormatter.cs

    r17826 r18146  
    3333  [StorableType("D7186DFF-1596-4A58-B27D-974DF0D93E4F")]
    3434  public sealed class SymbolicDataAnalysisExpressionLatexFormatter : NamedItem, ISymbolicExpressionTreeStringFormatter {
    35     private readonly List<KeyValuePair<string, double>> constants;
    36     private int constIndex;
     35    private readonly List<KeyValuePair<string, double>> parameters;
     36    private int paramIdx;
    3737    private int targetCount;
    3838    private int currentLag;
     
    4444    private SymbolicDataAnalysisExpressionLatexFormatter(SymbolicDataAnalysisExpressionLatexFormatter original, Cloner cloner)
    4545      : base(original, cloner) {
    46       constants = new List<KeyValuePair<string, double>>(original.constants);
    47       constIndex = original.constIndex;
     46      parameters = new List<KeyValuePair<string, double>>(original.parameters);
     47      paramIdx = original.paramIdx;
    4848      currentLag = original.currentLag;
    4949      targetCount = original.targetCount;
     
    5353      Name = ItemName;
    5454      Description = ItemDescription;
    55       constants = new List<KeyValuePair<string, double>>();
     55      parameters = new List<KeyValuePair<string, double>>();
    5656    }
    5757
     
    6666      try {
    6767        StringBuilder strBuilder = new StringBuilder();
    68         constants.Clear();
    69         constIndex = 0;
     68        parameters.Clear();
     69        paramIdx = 0;
    7070        this.targetVariable = targetVariable;
    7171        containsTimeSeriesSymbol = symbolicExpressionTree.IterateNodesBreadth().Any(n => IsTimeSeriesSymbol(n.Symbol));
     
    189189      } else if (node.Symbol is IfThenElse) {
    190190        strBuilder.Append(@" \operatorname{if}  \left( ");
    191       } else if (node.Symbol is Constant) {
    192         var constName = "c_{" + constIndex + "}";
    193         constIndex++;
    194         var constNode = node as ConstantTreeNode;
    195         if (constNode.Value.IsAlmost(1.0)) {
     191      } else if (node.Symbol is INumericSymbol numSy) {
     192        var numName = "c_{" + paramIdx + "}";
     193        paramIdx++;
     194        var numericNode = node as INumericTreeNode;
     195        if (numericNode.Value.IsAlmost(1.0)) {
    196196          strBuilder.Append("1 ");
    197197        } else {
    198           strBuilder.Append(constName);
    199           constants.Add(new KeyValuePair<string, double>(constName, constNode.Value));
    200         }
    201 
     198          strBuilder.Append(numName);
     199          parameters.Add(new KeyValuePair<string, double>(numName, numericNode.Value));
     200        }
    202201      } else if (node.Symbol is FactorVariable) {
    203202        var factorNode = node as FactorVariableTreeNode;
    204         var constName = "c_{" + constIndex + "}";
    205         strBuilder.Append(constName + " ");
     203        var paramName = "c_{" + paramIdx + "}";
     204        strBuilder.Append(paramName + " ");
    206205        foreach (var e in factorNode.Symbol.GetVariableValues(factorNode.VariableName)
    207206          .Zip(factorNode.Weights, Tuple.Create)) {
    208           constants.Add(new KeyValuePair<string, double>("c_{" + constIndex + ", " + EscapeLatexString(factorNode.VariableName) + "=" + EscapeLatexString(e.Item1) + "}", e.Item2));
    209         }
    210         constIndex++;
     207          parameters.Add(new KeyValuePair<string, double>("c_{" + paramIdx + ", " + EscapeLatexString(factorNode.VariableName) + "=" + EscapeLatexString(e.Item1) + "}", e.Item2));
     208        }
     209        paramIdx++;
    211210      } else if (node.Symbol is BinaryFactorVariable) {
    212211        var binFactorNode = node as BinaryFactorVariableTreeNode;
    213212        if (!binFactorNode.Weight.IsAlmost((1.0))) {
    214           var constName = "c_{" + constIndex + "}";
    215           strBuilder.Append(constName + "  \\cdot");
    216           constants.Add(new KeyValuePair<string, double>(constName, binFactorNode.Weight));
    217           constIndex++;
     213          var paramName = "c_{" + paramIdx + "}";
     214          strBuilder.Append(paramName + "  \\cdot");
     215          parameters.Add(new KeyValuePair<string, double>(paramName, binFactorNode.Weight));
     216          paramIdx++;
    218217        }
    219218        strBuilder.Append("(" + EscapeLatexString(binFactorNode.VariableName));
     
    223222        var laggedVarNode = node as LaggedVariableTreeNode;
    224223        if (!laggedVarNode.Weight.IsAlmost(1.0)) {
    225           var constName = "c_{" + constIndex + "}";
    226           strBuilder.Append(constName + "  \\cdot");
    227           constants.Add(new KeyValuePair<string, double>(constName, laggedVarNode.Weight));
    228           constIndex++;
     224          var paramName = "c_{" + paramIdx + "}";
     225          strBuilder.Append(paramName + "  \\cdot");
     226          parameters.Add(new KeyValuePair<string, double>(paramName, laggedVarNode.Weight));
     227          paramIdx++;
    229228        }
    230229        strBuilder.Append(EscapeLatexString(laggedVarNode.VariableName));
     
    234233        var varNode = node as VariableTreeNode;
    235234        if (!varNode.Weight.IsAlmost((1.0))) {
    236           var constName = "c_{" + constIndex + "}";
    237           strBuilder.Append(constName + "  \\cdot");
    238           constants.Add(new KeyValuePair<string, double>(constName, varNode.Weight));
    239           constIndex++;
     235          var paramName = "c_{" + paramIdx + "}";
     236          strBuilder.Append(paramName + "  \\cdot");
     237          parameters.Add(new KeyValuePair<string, double>(paramName, varNode.Weight));
     238          paramIdx++;
    240239        }
    241240        strBuilder.Append(EscapeLatexString(varNode.VariableName));
     
    271270      } else if (node.Symbol is VariableCondition) {
    272271        var conditionTreeNode = node as VariableConditionTreeNode;
    273         var constName = "c_{" + constants.Count + "}";
    274         string p = @"1 /  1 + \exp  - " + constName + " ";
    275         constants.Add(new KeyValuePair<string, double>(constName, conditionTreeNode.Slope));
    276         constIndex++;
    277         var const2Name = "c_{" + constants.Count + @"}";
     272        var paramName = "c_{" + parameters.Count + "}";
     273        string p = @"1 /  1 + \exp  - " + paramName + " ";
     274        parameters.Add(new KeyValuePair<string, double>(paramName, conditionTreeNode.Slope));
     275        paramIdx++;
     276        var const2Name = "c_{" + parameters.Count + @"}";
    278277        p += @" \cdot " + EscapeLatexString(conditionTreeNode.VariableName) + LagToString(currentLag) + " - " + const2Name + "   ";
    279         constants.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold));
    280         constIndex++;
     278        parameters.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold));
     279        paramIdx++;
    281280        strBuilder.Append(@" \left( " + p + @"\cdot ");
    282281      } else {
     
    379378      } else if (node.Symbol is VariableCondition) {
    380379        var conditionTreeNode = node as VariableConditionTreeNode;
    381         var const1Name = "c_{" + constants.Count + "}";
     380        var const1Name = "c_{" + parameters.Count + "}";
    382381        string p = @"1 / \left( 1 + \exp \left( - " + const1Name + " ";
    383         constants.Add(new KeyValuePair<string, double>(const1Name, conditionTreeNode.Slope));
    384         constIndex++;
    385         var const2Name = "c_{" + constants.Count + "}";
     382        parameters.Add(new KeyValuePair<string, double>(const1Name, conditionTreeNode.Slope));
     383        paramIdx++;
     384        var const2Name = "c_{" + parameters.Count + "}";
    386385        p += @" \cdot " + EscapeLatexString(conditionTreeNode.VariableName) + LagToString(currentLag) + " - " + const2Name + " \right) \right) \right)   ";
    387         constants.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold));
    388         constIndex++;
     386        parameters.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold));
     387        paramIdx++;
    389388        strBuilder.Append(@" +  \left( 1 - " + p + @" \right) \cdot ");
    390389      } else {
     
    471470      } else if (node.Symbol is IfThenElse) {
    472471        strBuilder.Append(@" \right) ");
     472      } else if (node.Symbol is Number) {
    473473      } else if (node.Symbol is Constant) {
    474474      } else if (node.Symbol is LaggedVariable) {
     
    481481          .AppendLine("\\begin{align*}")
    482482          .AppendLine("\\nonumber");
    483         // output all constant values
    484         if (constants.Count > 0) {
    485           foreach (var constant in constants) {
     483        // output all parameter values
     484        if (parameters.Count > 0) {
     485          foreach (var param in parameters) {
    486486            // replace "." with ".&" to align decimal points
    487             var constStr = string.Format(System.Globalization.NumberFormatInfo.InvariantInfo, "{0:G5}", constant.Value);
    488             if (!constStr.Contains(".")) constStr = constStr + ".0";
    489             constStr = constStr.Replace(".", "&.");  // fix problem in rendering of aligned expressions
    490             strBuilder.Append(constant.Key + "& = & " + constStr);
     487            var paramStr = string.Format(System.Globalization.NumberFormatInfo.InvariantInfo, "{0:G5}", param.Value);
     488            if (!paramStr.Contains(".")) paramStr = paramStr + ".0";
     489            paramStr = paramStr.Replace(".", "&.");  // fix problem in rendering of aligned expressions
     490            strBuilder.Append(param.Key + "& = & " + paramStr);
    491491            strBuilder.Append(@"\\");
    492492          }
Note: See TracChangeset for help on using the changeset viewer.