Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2931_OR-Tools_LP_MIP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionSmalltalkFormatter.cs @ 16803

Last change on this file since 16803 was 16803, checked in by ddorfmei, 5 years ago

#2931: Merged revision(s) 16720-16802 from trunk

File size: 9.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Globalization;
24using System.Text;
25using HeuristicLab.Common;
26using HeuristicLab.Core;
27using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
28
29namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
30
31  [Item("Smalltalk String Formatter", "String formatter for string representations of symbolic expression trees in Smalltalk syntax.")]
32  public class SymbolicDataAnalysisExpressionSmalltalkFormatter : NamedItem, ISymbolicExpressionTreeStringFormatter {
33
34    protected SymbolicDataAnalysisExpressionSmalltalkFormatter(SymbolicDataAnalysisExpressionSmalltalkFormatter original, Cloner cloner) : base(original, cloner) { }
35    public SymbolicDataAnalysisExpressionSmalltalkFormatter()
36      : base() {
37      Name = ItemName;
38      Description = ItemDescription;
39    }
40
41    public string Format(ISymbolicExpressionTree symbolicExpressionTree) {
42      return FormatRecursively(symbolicExpressionTree.Root);
43    }
44
45    // returns the smalltalk expression corresponding to the node
46    // smalltalk expressions are always surrounded by parantheses "(<expr>)"
47    private string FormatRecursively(ISymbolicExpressionTreeNode node) {
48
49      ISymbol symbol = node.Symbol;
50
51      if (symbol is ProgramRootSymbol || symbol is StartSymbol)
52        return FormatRecursively(node.GetSubtree(0));
53
54      StringBuilder stringBuilder = new StringBuilder(20);
55
56      stringBuilder.Append("(");
57
58      if (symbol is Addition) {
59        for (int i = 0; i < node.SubtreeCount; i++) {
60          if (i > 0) stringBuilder.Append("+");
61          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
62        }
63      } else if (symbol is And) {
64        stringBuilder.Append("(");
65        for (int i = 0; i < node.SubtreeCount; i++) {
66          if (i > 0) stringBuilder.Append("&");
67          stringBuilder.Append("(");
68          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
69          stringBuilder.Append(" > 0)");
70        }
71        stringBuilder.Append(") ifTrue:[1] ifFalse:[-1]");
72      } else if (symbol is Absolute) {
73        stringBuilder.Append($"({FormatRecursively(node.GetSubtree(0))}) abs");
74      } else if (symbol is AnalyticQuotient) {
75        stringBuilder.Append($"({FormatRecursively(node.GetSubtree(0))}) / (1 + ({FormatPower(node.GetSubtree(1), "2")})) sqrt");
76      } else if (symbol is Average) {
77        stringBuilder.Append("(1/");
78        stringBuilder.Append(node.SubtreeCount);
79        stringBuilder.Append(")*(");
80        for (int i = 0; i < node.SubtreeCount; i++) {
81          if (i > 0) stringBuilder.Append("+");
82          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
83        }
84        stringBuilder.Append(")");
85      } else if (symbol is Constant) {
86        ConstantTreeNode constantTreeNode = node as ConstantTreeNode;
87        stringBuilder.Append(constantTreeNode.Value.ToString(CultureInfo.InvariantCulture));
88      } else if (symbol is Cosine) {
89        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
90        stringBuilder.Append(" cos");
91      } else if (symbol is Cube) {
92        stringBuilder.Append(FormatPower(node.GetSubtree(0), "3"));
93      } else if (symbol is CubeRoot) {
94        stringBuilder.Append(FormatPower(node.GetSubtree(0), "(1/3)"));
95      } else if (symbol is Division) {
96        if (node.SubtreeCount == 1) {
97          stringBuilder.Append("1/");
98          stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
99        } else {
100          stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
101          stringBuilder.Append("/(");
102          for (int i = 1; i < node.SubtreeCount; i++) {
103            if (i > 1) stringBuilder.Append("*");
104            stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
105          }
106          stringBuilder.Append(")");
107        }
108      } else if (symbol is Exponential) {
109        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
110        stringBuilder.Append(" exp");
111      } else if (symbol is GreaterThan) {
112        stringBuilder.Append("(");
113        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
114        stringBuilder.Append(" > ");
115        stringBuilder.Append(FormatRecursively(node.GetSubtree(1)));
116        stringBuilder.Append(") ifTrue: [1] ifFalse: [-1]");
117      } else if (symbol is IfThenElse) {
118        stringBuilder.Append("(");
119        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
120        stringBuilder.Append(" > 0) ifTrue: [");
121        stringBuilder.Append(FormatRecursively(node.GetSubtree(1)));
122        stringBuilder.Append("] ifFalse: [");
123        stringBuilder.Append(FormatRecursively(node.GetSubtree(2)));
124        stringBuilder.Append("]");
125      } else if (symbol is LaggedVariable) {
126        stringBuilder.Append("lagged variables are not supported");
127      } else if (symbol is LessThan) {
128        stringBuilder.Append("(");
129        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
130        stringBuilder.Append(" < ");
131        stringBuilder.Append(FormatRecursively(node.GetSubtree(1)));
132        stringBuilder.Append(") ifTrue: [1] ifFalse: [-1]");
133      } else if (symbol is Logarithm) {
134        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
135        stringBuilder.Append("ln");
136      } else if (symbol is Multiplication) {
137        for (int i = 0; i < node.SubtreeCount; i++) {
138          if (i > 0) stringBuilder.Append("*");
139          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
140        }
141      } else if (symbol is Not) {
142        stringBuilder.Append("(");
143        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
144        stringBuilder.Append(">0) ifTrue: [-1] ifFalse: [1.0]");
145      } else if (symbol is Or) {
146        stringBuilder.Append("(");
147        for (int i = 0; i < node.SubtreeCount; i++) {
148          if (i > 0) stringBuilder.Append("|");
149          stringBuilder.Append("(");
150          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
151          stringBuilder.Append(">0)");
152        }
153        stringBuilder.Append(") ifTrue:[1] ifFalse:[-1]");
154      } else if (symbol is Sine) {
155        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
156        stringBuilder.Append(" sin");
157      } else if (symbol is Square) {
158        stringBuilder.Append(FormatPower(node.GetSubtree(0), "2"));
159      } else if (symbol is SquareRoot) {
160        stringBuilder.Append(FormatPower(node.GetSubtree(0), "(1/2)"));
161      } else if (symbol is Subtraction) {
162        if (node.SubtreeCount == 1) {
163          stringBuilder.Append("-1*");
164          stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
165        } else {
166          stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
167          for (int i = 1; i < node.SubtreeCount; i++) {
168            stringBuilder.Append(" - ");
169            stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
170          }
171        }
172      } else if (symbol is Tangent) {
173        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
174        stringBuilder.Append(" tan");
175      } else if (symbol is HyperbolicTangent) {
176        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
177        stringBuilder.Append(" tanh");
178      } else if (symbol is Variable) {
179        VariableTreeNode variableTreeNode = node as VariableTreeNode;
180        stringBuilder.Append(variableTreeNode.Weight.ToString(CultureInfo.InvariantCulture));
181        stringBuilder.Append("*");
182        stringBuilder.Append(variableTreeNode.VariableName);
183      } else if (symbol is BinaryFactorVariable || symbol is FactorVariable) {
184        stringBuilder.Append("factor variables are not supported");
185      } else {
186        stringBuilder.Append("(");
187        for (int i = 0; i < node.SubtreeCount; i++) {
188          if (i > 0) stringBuilder.Append(", ");
189          stringBuilder.Append(FormatRecursively(node.GetSubtree(i)));
190        }
191        stringBuilder.AppendFormat(" {0} [Not Supported] )", node.Symbol.Name);
192      }
193
194      stringBuilder.Append(")");
195
196      return stringBuilder.ToString();
197    }
198
199    private string FormatPower(ISymbolicExpressionTreeNode node, string exponent) {
200      return $"(({FormatRecursively(node)}) log * {exponent}) exp ";
201    }
202
203    public override IDeepCloneable Clone(Cloner cloner) {
204      return new SymbolicDataAnalysisExpressionSmalltalkFormatter(this, cloner);
205    }
206  }
207}
Note: See TracBrowser for help on using the repository browser.