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

    r14185 r14764  
    2121
    2222using System.Globalization;
     23using System.Linq;
    2324using System.Text;
    2425using HeuristicLab.Common;
     
    7778      stringBuilder.AppendLine("  y = (f0 + 2*f1 - 2*f3 - f4) / 8;");
    7879      stringBuilder.AppendLine("end");
     80
     81      var factorVariableNames =
     82        symbolicExpressionTree.IterateNodesPostfix()
     83          .OfType<FactorVariableTreeNode>()
     84          .Select(n => n.VariableName)
     85          .Distinct();
     86
     87      foreach(var factorVarName in factorVariableNames)
     88      {
     89        var factorSymb = symbolicExpressionTree.IterateNodesPostfix()
     90          .OfType<FactorVariableTreeNode>()
     91          .First(n => n.VariableName == factorVarName)
     92          .Symbol;
     93        stringBuilder.AppendFormat("function y = switch_{0}(val, v)", factorVarName).AppendLine();
     94        var values = factorSymb.GetVariableValues(factorVarName).ToArray();
     95        stringBuilder.AppendLine("switch val");
     96        for(int i = 0; i < values.Length; i++) {
     97          stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "  case \"{0}\" y = v({1})", values[i], i).AppendLine();
     98        }
     99        stringBuilder.AppendLine("end");
     100        stringBuilder.AppendLine();
     101      }
     102
    79103      return stringBuilder.ToString();
    80104    }
     
    92116      StringBuilder stringBuilder = new StringBuilder();
    93117
    94       if (symbol is ProgramRootSymbol) {
     118      if(symbol is ProgramRootSymbol) {
    95119        stringBuilder.AppendLine(FormatRecursively(node.GetSubtree(0)));
    96       } else if (symbol is StartSymbol)
     120      } else if(symbol is StartSymbol)
    97121        return FormatRecursively(node.GetSubtree(0));
    98       else if (symbol is Addition) {
    99         stringBuilder.Append("(");
    100         for (int i = 0; i < node.SubtreeCount; i++) {
    101           if (i > 0) stringBuilder.Append("+");
    102           stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
    103         }
    104         stringBuilder.Append(")");
    105       } else if (symbol is And) {
     122      else if(symbol is Addition) {
     123        stringBuilder.Append("(");
     124        for(int i = 0; i < node.SubtreeCount; i++) {
     125          if(i > 0) stringBuilder.Append("+");
     126          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
     127        }
     128        stringBuilder.Append(")");
     129      } else if(symbol is And) {
    106130        stringBuilder.Append("((");
    107         for (int i = 0; i < node.SubtreeCount; i++) {
    108           if (i > 0) stringBuilder.Append("&");
     131        for(int i = 0; i < node.SubtreeCount; i++) {
     132          if(i > 0) stringBuilder.Append("&");
    109133          stringBuilder.Append("((");
    110134          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
     
    113137        stringBuilder.Append(")-0.5)*2");
    114138        // MATLAB maps false and true to 0 and 1, resp., we map this result to -1.0 and +1.0, resp.
    115       } else if (symbol is Average) {
     139      } else if(symbol is Average) {
    116140        stringBuilder.Append("(1/");
    117141        stringBuilder.Append(node.SubtreeCount);
    118142        stringBuilder.Append(")*(");
    119         for (int i = 0; i < node.SubtreeCount; i++) {
    120           if (i > 0) stringBuilder.Append("+");
     143        for(int i = 0; i < node.SubtreeCount; i++) {
     144          if(i > 0) stringBuilder.Append("+");
    121145          stringBuilder.Append("(");
    122146          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
     
    124148        }
    125149        stringBuilder.Append(")");
    126       } else if (symbol is Constant) {
     150      } else if(symbol is Constant) {
    127151        ConstantTreeNode constantTreeNode = node as ConstantTreeNode;
    128152        stringBuilder.Append(constantTreeNode.Value.ToString(CultureInfo.InvariantCulture));
    129       } else if (symbol is Cosine) {
     153      } else if(symbol is Cosine) {
    130154        stringBuilder.Append("cos(");
    131155        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    132156        stringBuilder.Append(")");
    133       } else if (symbol is Division) {
    134         if (node.SubtreeCount == 1) {
     157      } else if(symbol is Division) {
     158        if(node.SubtreeCount == 1) {
    135159          stringBuilder.Append("1/");
    136160          stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
     
    138162          stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    139163          stringBuilder.Append("/(");
    140           for (int i = 1; i < node.SubtreeCount; i++) {
    141             if (i > 1) stringBuilder.Append("*");
     164          for(int i = 1; i < node.SubtreeCount; i++) {
     165            if(i > 1) stringBuilder.Append("*");
    142166            stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
    143167          }
    144168          stringBuilder.Append(")");
    145169        }
    146       } else if (symbol is Exponential) {
     170      } else if(symbol is Exponential) {
    147171        stringBuilder.Append("exp(");
    148172        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    149173        stringBuilder.Append(")");
    150       } else if (symbol is Square) {
     174      } else if(symbol is Square) {
    151175        stringBuilder.Append("(");
    152176        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    153177        stringBuilder.Append(").^2");
    154       } else if (symbol is SquareRoot) {
     178      } else if(symbol is SquareRoot) {
    155179        stringBuilder.Append("sqrt(");
    156180        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    157181        stringBuilder.Append(")");
    158       } else if (symbol is GreaterThan) {
     182      } else if(symbol is GreaterThan) {
    159183        stringBuilder.Append("((");
    160184        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
     
    163187        stringBuilder.Append(")-0.5)*2");
    164188        // MATLAB maps false and true to 0 and 1, resp., we map this result to -1.0 and +1.0, resp.
    165       } else if (symbol is IfThenElse) {
     189      } else if(symbol is IfThenElse) {
    166190        stringBuilder.Append("(");
    167191        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
     
    173197        stringBuilder.Append("<=0)*");
    174198        stringBuilder.Append(FormatRecursively(node.GetSubtree(2)));
    175       } else if (symbol is LaggedVariable) {
     199      } else if(symbol is LaggedVariable) {
    176200        // this if must be checked before if(symbol is LaggedVariable)
    177201        LaggedVariableTreeNode laggedVariableTreeNode = node as LaggedVariableTreeNode;
     
    180204        stringBuilder.Append(laggedVariableTreeNode.VariableName +
    181205                             LagToString(currentLag + laggedVariableTreeNode.Lag));
    182       } else if (symbol is LessThan) {
     206      } else if(symbol is LessThan) {
    183207        stringBuilder.Append("((");
    184208        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
     
    187211        stringBuilder.Append(")-0.5)*2");
    188212        // MATLAB maps false and true to 0 and 1, resp., we map this result to -1.0 and +1.0, resp.
    189       } else if (symbol is Logarithm) {
     213      } else if(symbol is Logarithm) {
    190214        stringBuilder.Append("log_(");
    191215        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    192216        stringBuilder.Append(")");
    193       } else if (symbol is Multiplication) {
    194         for (int i = 0; i < node.SubtreeCount; i++) {
    195           if (i > 0) stringBuilder.Append("*");
    196           stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
    197         }
    198       } else if (symbol is Not) {
     217      } else if(symbol is Multiplication) {
     218        for(int i = 0; i < node.SubtreeCount; i++) {
     219          if(i > 0) stringBuilder.Append("*");
     220          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
     221        }
     222      } else if(symbol is Not) {
    199223        stringBuilder.Append("~(");
    200224        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    201225        stringBuilder.Append(" > 0 )");
    202       } else if (symbol is Or) {
     226      } else if(symbol is Or) {
    203227        stringBuilder.Append("((");
    204         for (int i = 0; i < node.SubtreeCount; i++) {
    205           if (i > 0) stringBuilder.Append("|");
     228        for(int i = 0; i < node.SubtreeCount; i++) {
     229          if(i > 0) stringBuilder.Append("|");
    206230          stringBuilder.Append("((");
    207231          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
     
    210234        stringBuilder.Append(")-0.5)*2");
    211235        // MATLAB maps false and true to 0 and 1, resp., we map this result to -1.0 and +1.0, resp.
    212       } else if (symbol is Sine) {
     236      } else if(symbol is Sine) {
    213237        stringBuilder.Append("sin(");
    214238        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    215239        stringBuilder.Append(")");
    216       } else if (symbol is Subtraction) {
    217         stringBuilder.Append("(");
    218         if (node.SubtreeCount == 1) {
     240      } else if(symbol is Subtraction) {
     241        stringBuilder.Append("(");
     242        if(node.SubtreeCount == 1) {
    219243          stringBuilder.Append("-");
    220244          stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    221245        } else {
    222246          stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    223           for (int i = 1; i < node.SubtreeCount; i++) {
     247          for(int i = 1; i < node.SubtreeCount; i++) {
    224248            stringBuilder.Append("-");
    225249            stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
     
    227251        }
    228252        stringBuilder.Append(")");
    229       } else if (symbol is Tangent) {
     253      } else if(symbol is Tangent) {
    230254        stringBuilder.Append("tan(");
    231255        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    232256        stringBuilder.Append(")");
    233       } else if (node.Symbol is AiryA) {
     257      } else if(node.Symbol is AiryA) {
    234258        stringBuilder.Append("airy(");
    235259        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    236260        stringBuilder.Append(")");
    237       } else if (node.Symbol is AiryB) {
     261      } else if(node.Symbol is AiryB) {
    238262        stringBuilder.Append("airy(2, ");
    239263        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    240264        stringBuilder.Append(")");
    241       } else if (node.Symbol is Bessel) {
     265      } else if(node.Symbol is Bessel) {
    242266        stringBuilder.Append("besseli(0.0,");
    243267        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    244268        stringBuilder.Append(")");
    245       } else if (node.Symbol is CosineIntegral) {
     269      } else if(node.Symbol is CosineIntegral) {
    246270        stringBuilder.Append("cosint(");
    247271        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    248272        stringBuilder.Append(")");
    249       } else if (node.Symbol is Dawson) {
     273      } else if(node.Symbol is Dawson) {
    250274        stringBuilder.Append("dawson(");
    251275        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    252276        stringBuilder.Append(")");
    253       } else if (node.Symbol is Erf) {
     277      } else if(node.Symbol is Erf) {
    254278        stringBuilder.Append("erf(");
    255279        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    256280        stringBuilder.Append(")");
    257       } else if (node.Symbol is ExponentialIntegralEi) {
     281      } else if(node.Symbol is ExponentialIntegralEi) {
    258282        stringBuilder.Append("expint(");
    259283        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    260284        stringBuilder.Append(")");
    261       } else if (node.Symbol is FresnelCosineIntegral) {
     285      } else if(node.Symbol is FresnelCosineIntegral) {
    262286        stringBuilder.Append("FresnelC(");
    263287        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    264288        stringBuilder.Append(")");
    265       } else if (node.Symbol is FresnelSineIntegral) {
     289      } else if(node.Symbol is FresnelSineIntegral) {
    266290        stringBuilder.Append("FresnelS(");
    267291        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    268292        stringBuilder.Append(")");
    269       } else if (node.Symbol is Gamma) {
     293      } else if(node.Symbol is Gamma) {
    270294        stringBuilder.Append("gamma(");
    271295        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    272296        stringBuilder.Append(")");
    273       } else if (node.Symbol is HyperbolicCosineIntegral) {
     297      } else if(node.Symbol is HyperbolicCosineIntegral) {
    274298        stringBuilder.Append("Chi(");
    275299        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    276300        stringBuilder.Append(")");
    277       } else if (node.Symbol is HyperbolicSineIntegral) {
     301      } else if(node.Symbol is HyperbolicSineIntegral) {
    278302        stringBuilder.Append("Shi(");
    279303        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    280304        stringBuilder.Append(")");
    281       } else if (node.Symbol is Norm) {
     305      } else if(node.Symbol is Norm) {
    282306        stringBuilder.Append("normpdf(");
    283307        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    284308        stringBuilder.Append(")");
    285       } else if (node.Symbol is Psi) {
     309      } else if(node.Symbol is Psi) {
    286310        stringBuilder.Append("psi(");
    287311        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    288312        stringBuilder.Append(")");
    289       } else if (node.Symbol is SineIntegral) {
     313      } else if(node.Symbol is SineIntegral) {
    290314        stringBuilder.Append("sinint(");
    291315        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
    292316        stringBuilder.Append(")");
    293       } else if (symbol is HeuristicLab.Problems.DataAnalysis.Symbolic.Variable) {
     317      } else if(symbol is HeuristicLab.Problems.DataAnalysis.Symbolic.Variable) {
    294318        VariableTreeNode variableTreeNode = node as VariableTreeNode;
    295319        stringBuilder.Append(variableTreeNode.Weight.ToString(CultureInfo.InvariantCulture));
    296320        stringBuilder.Append("*");
    297321        stringBuilder.Append(variableTreeNode.VariableName + LagToString(currentLag));
    298       } else if (symbol is Power) {
     322      } else if(symbol is HeuristicLab.Problems.DataAnalysis.Symbolic.FactorVariable) {
     323        var factorNode = node as FactorVariableTreeNode;
     324        var weights = string.Join(" ", factorNode.Weights.Select(w => w.ToString("G17", CultureInfo.InvariantCulture)));
     325        stringBuilder.AppendFormat("switch_{0}(\"{1}\",[{2}])",
     326          factorNode.VariableName, factorNode.VariableName, weights)
     327          .AppendLine();
     328      } else if(symbol is HeuristicLab.Problems.DataAnalysis.Symbolic.BinaryFactorVariable) {
     329        var factorNode = node as BinaryFactorVariableTreeNode;
     330        stringBuilder.AppendFormat(CultureInfo.InvariantCulture,
     331          "((strcmp({0},\"{1}\")==1) * {2:G17})", factorNode.VariableName, factorNode.VariableValue, factorNode.Weight);
     332      } else if(symbol is Power) {
    299333        stringBuilder.Append("(");
    300334        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
     
    302336        stringBuilder.Append(FormatRecursively(node.GetSubtree(1)));
    303337        stringBuilder.Append(")");
    304       } else if (symbol is Root) {
     338      } else if(symbol is Root) {
    305339        stringBuilder.Append("(");
    306340        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
     
    308342        stringBuilder.Append(FormatRecursively(node.GetSubtree(1)));
    309343        stringBuilder.Append("))");
    310       } else if (symbol is Derivative) {
     344      } else if(symbol is Derivative) {
    311345        stringBuilder.Append("fivePoint(");
    312346        // f0
     
    326360        stringBuilder.Append(")");
    327361        currentLag += 4;
    328       } else if (symbol is Integral) {
     362      } else if(symbol is Integral) {
    329363        var laggedNode = node as LaggedTreeNode;
    330364        string prevCounterVariable = CurrentIndexVariable;
     
    334368                                 "))");
    335369        ReleaseIndexVariable();
    336       } else if (symbol is TimeLag) {
     370      } else if(symbol is TimeLag) {
    337371        var laggedNode = node as LaggedTreeNode;
    338372        currentLag += laggedNode.Lag;
     
    347381
    348382    private string LagToString(int lag) {
    349       if (lag < 0) {
     383      if(lag < 0) {
    350384        return "(" + CurrentIndexVariable + "" + lag + ")";
    351       } else if (lag > 0) {
     385      } else if(lag > 0) {
    352386        return "(" + CurrentIndexVariable + "+" + lag + ")";
    353387      } else return "(" + CurrentIndexVariable + ")";
Note: See TracChangeset for help on using the changeset viewer.