Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/03/22 12:23:11 (2 years ago)
Author:
gkronber
Message:

#3136: merged r18165:18174 from trunk to branch (resolving conflicts in the parser)

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/InfixExpressionFormatter.cs

    r18157 r18176  
    3737        var token = GetToken(node.Symbol);
    3838        // operators
    39         if (token == "+" || token == "-" || token == "OR" || token == "XOR" ||
    40             token == "*" || token == "/" || token == "AND") {
    41           strBuilder.Append("(");
     39        if (token == "+" || token == "-" || token == "OR" || token == "XOR") {
     40          var parenthesisRequired = false;
     41          if (node.Parent != null && node.Parent.SubtreeCount > 1) {
     42            var parentOp = GetToken(node.Parent.Symbol);
     43            if (parentOp != "+" && parentOp != "-" && parentOp != "OR" && parentOp != "XOR")
     44              parenthesisRequired = true;
     45          }
     46          if (parenthesisRequired) strBuilder.Append("(");
    4247          FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, parameters);
    4348
     
    4752          }
    4853
    49           strBuilder.Append(")");
     54          if (parenthesisRequired) strBuilder.Append(")");
     55        } else if (token == "*" || token == "/" || token == "AND") {
     56          FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, parameters);
     57
     58          foreach (var subtree in node.Subtrees.Skip(1)) {
     59            strBuilder.Append(" ").Append(token).Append(" ");
     60            // a / b * c => a / (b * C)
     61            if (subtree.SubtreeCount > 1 && token == "/" && GetToken(subtree.Symbol) == "*") {
     62              strBuilder.Append("(");
     63              FormatRecursively(subtree, strBuilder, numberFormat, formatString, parameters);
     64              strBuilder.Append(")");
     65            } else {
     66              FormatRecursively(subtree, strBuilder, numberFormat, formatString, parameters);
     67            }
     68          }
    5069        } else if (token == "^") {
    5170          // handle integer powers directly
    52           strBuilder.Append("(");
    5371          FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, parameters);
    5472
     
    6078            FormatRecursively(power, strBuilder, numberFormat, formatString, parameters);
    6179          }
    62 
    63           strBuilder.Append(")");
    6480        } else {
    6581          // function with multiple arguments
     
    7894        var token = GetToken(node.Symbol);
    7995        if (token == "-" || token == "NOT") {
    80           strBuilder.Append("(").Append(token).Append("(");
    81           FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, parameters);
    82           strBuilder.Append("))");
     96          strBuilder.Append(token);
     97          FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, parameters);
    8398        } else if (token == "/") {
    8499          strBuilder.Append("1/");
     
    97112          var varNode = node as LaggedVariableTreeNode;
    98113          if (!varNode.Weight.IsAlmost(1.0)) {
    99             strBuilder.Append("(");
    100114            AppendNumber(strBuilder, parameters, varNode.Weight, formatString, numberFormat);
    101115            strBuilder.Append("*");
     
    107121                    .AppendFormat(numberFormat, "{0}", varNode.Lag)
    108122                    .Append(")");
    109           if (!varNode.Weight.IsAlmost(1.0)) strBuilder.Append(")");
    110123        } else if (node.Symbol is Variable) {
    111124          var varNode = node as VariableTreeNode;
    112125          if (!varNode.Weight.IsAlmost(1.0)) {
    113             strBuilder.Append("(");
    114126            AppendNumber(strBuilder, parameters, varNode.Weight, formatString, numberFormat);
    115127            strBuilder.Append("*");
    116128          }
    117 
    118129          AppendVariableName(strBuilder, varNode.VariableName);
    119 
    120           if (!varNode.Weight.IsAlmost(1.0)) strBuilder.Append(")");
    121130        } else if (node.Symbol is FactorVariable) {
    122131          var factorNode = node as FactorVariableTreeNode;
     
    132141          var factorNode = node as BinaryFactorVariableTreeNode;
    133142          if (!factorNode.Weight.IsAlmost(1.0)) {
    134             strBuilder.Append("(");
    135143            AppendNumber(strBuilder, parameters, factorNode.Weight, formatString, numberFormat);
    136 
    137144            strBuilder.Append("*");
    138145          }
    139 
    140146          AppendVariableName(strBuilder, factorNode.VariableName);
    141147          strBuilder.Append(" = ");
    142148          AppendVariableName(strBuilder, factorNode.VariableValue);
    143 
    144           if (!factorNode.Weight.IsAlmost(1.0)) strBuilder.Append(")");
    145149        } else if (node is INumericTreeNode numNode) {
    146150          if (parameters == null && numNode.Value < 0) {
    147151            // negative value
    148             strBuilder.Append("(").Append(numNode.Value.ToString(formatString, numberFormat))
    149                       .Append(")");
     152            strBuilder.Append(numNode.Value.ToString(formatString, numberFormat));
    150153          } else {
    151154            AppendNumber(strBuilder, parameters, numNode.Value, formatString, numberFormat);
Note: See TracChangeset for help on using the changeset viewer.