Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/18/17 14:22:46 (7 years ago)
Author:
gkronber
Message:

#2650 adapted formatters to handle factor symbols

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/symbreg-factors-2650/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMathematicaFormatter.cs

    r14185 r14764  
    5353
    5454    private void FormatRecursively(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) {
    55       if (node.Subtrees.Any()) {
    56         if (node.Symbol is Addition) {
     55      if(node.Subtrees.Any()) {
     56        if(node.Symbol is Addition) {
    5757          FormatFunction(node, "Plus", strBuilder);
    58         } else if (node.Symbol is Average) {
     58        } else if(node.Symbol is Average) {
    5959          FormatAverage(node, strBuilder);
    60         } else if (node.Symbol is Multiplication) {
     60        } else if(node.Symbol is Multiplication) {
    6161          FormatFunction(node, "Times", strBuilder);
    62         } else if (node.Symbol is Subtraction) {
     62        } else if(node.Symbol is Subtraction) {
    6363          FormatSubtraction(node, strBuilder);
    64         } else if (node.Symbol is Division) {
     64        } else if(node.Symbol is Division) {
    6565          FormatDivision(node, strBuilder);
    66         } else if (node.Symbol is Sine) {
     66        } else if(node.Symbol is Sine) {
    6767          FormatFunction(node, "Sin", strBuilder);
    68         } else if (node.Symbol is Cosine) {
     68        } else if(node.Symbol is Cosine) {
    6969          FormatFunction(node, "Cos", strBuilder);
    70         } else if (node.Symbol is Tangent) {
     70        } else if(node.Symbol is Tangent) {
    7171          FormatFunction(node, "Tan", strBuilder);
    72         } else if (node.Symbol is Exponential) {
     72        } else if(node.Symbol is Exponential) {
    7373          FormatFunction(node, "Exp", strBuilder);
    74         } else if (node.Symbol is Logarithm) {
     74        } else if(node.Symbol is Logarithm) {
    7575          FormatFunction(node, "Log", strBuilder);
    76         } else if (node.Symbol is IfThenElse) {
     76        } else if(node.Symbol is IfThenElse) {
    7777          FormatIf(node, strBuilder);
    78         } else if (node.Symbol is GreaterThan) {
     78        } else if(node.Symbol is GreaterThan) {
    7979          strBuilder.Append("If[Greater[");
    8080          FormatRecursively(node.GetSubtree(0), strBuilder);
     
    8282          FormatRecursively(node.GetSubtree(1), strBuilder);
    8383          strBuilder.Append("], 1, -1]");
    84         } else if (node.Symbol is LessThan) {
     84        } else if(node.Symbol is LessThan) {
    8585          strBuilder.Append("If[Less[");
    8686          FormatRecursively(node.GetSubtree(0), strBuilder);
     
    8888          FormatRecursively(node.GetSubtree(1), strBuilder);
    8989          strBuilder.Append("], 1, -1]");
    90         } else if (node.Symbol is And) {
     90        } else if(node.Symbol is And) {
    9191          FormatAnd(node, strBuilder);
    92         } else if (node.Symbol is Not) {
     92        } else if(node.Symbol is Not) {
    9393          strBuilder.Append("If[Greater[");
    9494          FormatRecursively(node.GetSubtree(0), strBuilder);
    9595          strBuilder.Append(", 0], -1, 1]");
    96         } else if (node.Symbol is Or) {
     96        } else if(node.Symbol is Or) {
    9797          FormatOr(node, strBuilder);
    98         } else if (node.Symbol is Xor) {
     98        } else if(node.Symbol is Xor) {
    9999          FormatXor(node, strBuilder);
    100         } else if (node.Symbol is Square) {
     100        } else if(node.Symbol is Square) {
    101101          FormatSquare(node, strBuilder);
    102         } else if (node.Symbol is SquareRoot) {
     102        } else if(node.Symbol is SquareRoot) {
    103103          FormatFunction(node, "Sqrt", strBuilder);
    104         } else if (node.Symbol is Power) {
     104        } else if(node.Symbol is Power) {
    105105          FormatFunction(node, "Power", strBuilder);
    106         } else if (node.Symbol is Root) {
     106        } else if(node.Symbol is Root) {
    107107          FormatRoot(node, strBuilder);
    108108        } else {
     
    110110        }
    111111      } else {
    112         if (node is VariableTreeNode) {
     112        // terminals
     113        if(node.Symbol is Variable) {
    113114          var varNode = node as VariableTreeNode;
    114115          strBuilder.AppendFormat("Times[{0}, {1}]", varNode.VariableName, varNode.Weight.ToString("G17", CultureInfo.InvariantCulture));
    115         } else if (node is ConstantTreeNode) {
     116        } else if(node.Symbol is Constant) {
    116117          var constNode = node as ConstantTreeNode;
    117118          strBuilder.Append(constNode.Value.ToString("G17", CultureInfo.InvariantCulture));
     119        } else if(node.Symbol is FactorVariable) {
     120          var factorNode = node as FactorVariableTreeNode;
     121          strBuilder.AppendFormat("Switch[{0},", factorNode.VariableName);
     122          var varValues = factorNode.Symbol.GetVariableValues(factorNode.VariableName).ToArray();
     123          var weights = varValues.Select(factorNode.GetValue).ToArray();
     124
     125          var weightStr = string.Join(", ",
     126            varValues.Zip(weights, (s, d) => string.Format(CultureInfo.InvariantCulture, "\"{0}\", {1:G17}", s, d)));
     127          strBuilder.Append(weightStr);
     128          strBuilder.Append("]");
     129        } else if(node.Symbol is BinaryFactorVariable) {
     130          var factorNode = node as BinaryFactorVariableTreeNode;
     131          strBuilder.AppendFormat(CultureInfo.InvariantCulture, "If[{0}==\"{1}\",{2:G17},0.0]",
     132            factorNode.VariableName, factorNode.VariableValue, factorNode.Weight);
    118133        } else {
    119134          throw new NotSupportedException("Formatting of symbol: " + node.Symbol + " is not supported.");
     
    124139    private void FormatXor(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) {
    125140      strBuilder.Append("If[Xor[");
    126       foreach (var t in node.Subtrees) {
     141      foreach(var t in node.Subtrees) {
    127142        strBuilder.Append("Greater[");
    128143        FormatRecursively(t, strBuilder);
    129144        strBuilder.Append(", 0]");
    130         if (t != node.Subtrees.Last()) strBuilder.Append(",");
     145        if(t != node.Subtrees.Last()) strBuilder.Append(",");
    131146      }
    132147      strBuilder.Append("], 1, -1]");
     
    135150    private void FormatOr(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) {
    136151      strBuilder.Append("If[Or[");
    137       foreach (var t in node.Subtrees) {
     152      foreach(var t in node.Subtrees) {
    138153        strBuilder.Append("Greater[");
    139154        FormatRecursively(t, strBuilder);
    140155        strBuilder.Append(", 0]");
    141         if (t != node.Subtrees.Last()) strBuilder.Append(",");
     156        if(t != node.Subtrees.Last()) strBuilder.Append(",");
    142157      }
    143158      strBuilder.Append("], 1, -1]");
     
    146161    private void FormatAnd(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) {
    147162      strBuilder.Append("If[And[");
    148       foreach (var t in node.Subtrees) {
     163      foreach(var t in node.Subtrees) {
    149164        strBuilder.Append("Greater[");
    150165        FormatRecursively(t, strBuilder);
    151166        strBuilder.Append(", 0]");
    152         if (t != node.Subtrees.Last()) strBuilder.Append(",");
     167        if(t != node.Subtrees.Last()) strBuilder.Append(",");
    153168      }
    154169      strBuilder.Append("], 1, -1]");
     
    169184      strBuilder.Append("Mean[{");
    170185      FormatRecursively(node.GetSubtree(0), strBuilder);
    171       for (int i = 1; i < node.SubtreeCount; i++) {
     186      for(int i = 1; i < node.SubtreeCount; i++) {
    172187        strBuilder.Append(",");
    173188        FormatRecursively(node.GetSubtree(i), strBuilder);
     
    180195      FormatRecursively(node.GetSubtree(0), strBuilder);
    181196      strBuilder.Append(", Times[-1");
    182       foreach (var t in node.Subtrees) {
     197      foreach(var t in node.Subtrees) {
    183198        strBuilder.Append(",");
    184199        FormatRecursively(t, strBuilder);
     
    202217
    203218    private void FormatDivision(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) {
    204       if (node.SubtreeCount == 1) {
     219      if(node.SubtreeCount == 1) {
    205220        strBuilder.Append("Divide[1, ");
    206221        FormatRecursively(node.GetSubtree(0), strBuilder);
     
    211226        strBuilder.Append(", Times[");
    212227        FormatRecursively(node.GetSubtree(1), strBuilder);
    213         for (int i = 2; i < node.SubtreeCount; i++) {
     228        for(int i = 2; i < node.SubtreeCount; i++) {
    214229          strBuilder.Append(",");
    215230          FormatRecursively(node.GetSubtree(i), strBuilder);
     
    221236    private void FormatFunction(ISymbolicExpressionTreeNode node, string function, StringBuilder strBuilder) {
    222237      strBuilder.Append(function + "[");
    223       foreach (var child in node.Subtrees) {
     238      foreach(var child in node.Subtrees) {
    224239        FormatRecursively(child, strBuilder);
    225         if (child != node.Subtrees.Last())
     240        if(child != node.Subtrees.Last())
    226241          strBuilder.Append(", ");
    227242      }
Note: See TracChangeset for help on using the changeset viewer.