Changeset 14764 for branches/symbreg-factors-2650/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMathematicaFormatter.cs
- Timestamp:
- 03/18/17 14:22:46 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/symbreg-factors-2650/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMathematicaFormatter.cs
r14185 r14764 53 53 54 54 private void FormatRecursively(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) { 55 if 56 if 55 if(node.Subtrees.Any()) { 56 if(node.Symbol is Addition) { 57 57 FormatFunction(node, "Plus", strBuilder); 58 } else if 58 } else if(node.Symbol is Average) { 59 59 FormatAverage(node, strBuilder); 60 } else if 60 } else if(node.Symbol is Multiplication) { 61 61 FormatFunction(node, "Times", strBuilder); 62 } else if 62 } else if(node.Symbol is Subtraction) { 63 63 FormatSubtraction(node, strBuilder); 64 } else if 64 } else if(node.Symbol is Division) { 65 65 FormatDivision(node, strBuilder); 66 } else if 66 } else if(node.Symbol is Sine) { 67 67 FormatFunction(node, "Sin", strBuilder); 68 } else if 68 } else if(node.Symbol is Cosine) { 69 69 FormatFunction(node, "Cos", strBuilder); 70 } else if 70 } else if(node.Symbol is Tangent) { 71 71 FormatFunction(node, "Tan", strBuilder); 72 } else if 72 } else if(node.Symbol is Exponential) { 73 73 FormatFunction(node, "Exp", strBuilder); 74 } else if 74 } else if(node.Symbol is Logarithm) { 75 75 FormatFunction(node, "Log", strBuilder); 76 } else if 76 } else if(node.Symbol is IfThenElse) { 77 77 FormatIf(node, strBuilder); 78 } else if 78 } else if(node.Symbol is GreaterThan) { 79 79 strBuilder.Append("If[Greater["); 80 80 FormatRecursively(node.GetSubtree(0), strBuilder); … … 82 82 FormatRecursively(node.GetSubtree(1), strBuilder); 83 83 strBuilder.Append("], 1, -1]"); 84 } else if 84 } else if(node.Symbol is LessThan) { 85 85 strBuilder.Append("If[Less["); 86 86 FormatRecursively(node.GetSubtree(0), strBuilder); … … 88 88 FormatRecursively(node.GetSubtree(1), strBuilder); 89 89 strBuilder.Append("], 1, -1]"); 90 } else if 90 } else if(node.Symbol is And) { 91 91 FormatAnd(node, strBuilder); 92 } else if 92 } else if(node.Symbol is Not) { 93 93 strBuilder.Append("If[Greater["); 94 94 FormatRecursively(node.GetSubtree(0), strBuilder); 95 95 strBuilder.Append(", 0], -1, 1]"); 96 } else if 96 } else if(node.Symbol is Or) { 97 97 FormatOr(node, strBuilder); 98 } else if 98 } else if(node.Symbol is Xor) { 99 99 FormatXor(node, strBuilder); 100 } else if 100 } else if(node.Symbol is Square) { 101 101 FormatSquare(node, strBuilder); 102 } else if 102 } else if(node.Symbol is SquareRoot) { 103 103 FormatFunction(node, "Sqrt", strBuilder); 104 } else if 104 } else if(node.Symbol is Power) { 105 105 FormatFunction(node, "Power", strBuilder); 106 } else if 106 } else if(node.Symbol is Root) { 107 107 FormatRoot(node, strBuilder); 108 108 } else { … … 110 110 } 111 111 } else { 112 if (node is VariableTreeNode) { 112 // terminals 113 if(node.Symbol is Variable) { 113 114 var varNode = node as VariableTreeNode; 114 115 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) { 116 117 var constNode = node as ConstantTreeNode; 117 118 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); 118 133 } else { 119 134 throw new NotSupportedException("Formatting of symbol: " + node.Symbol + " is not supported."); … … 124 139 private void FormatXor(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) { 125 140 strBuilder.Append("If[Xor["); 126 foreach 141 foreach(var t in node.Subtrees) { 127 142 strBuilder.Append("Greater["); 128 143 FormatRecursively(t, strBuilder); 129 144 strBuilder.Append(", 0]"); 130 if 145 if(t != node.Subtrees.Last()) strBuilder.Append(","); 131 146 } 132 147 strBuilder.Append("], 1, -1]"); … … 135 150 private void FormatOr(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) { 136 151 strBuilder.Append("If[Or["); 137 foreach 152 foreach(var t in node.Subtrees) { 138 153 strBuilder.Append("Greater["); 139 154 FormatRecursively(t, strBuilder); 140 155 strBuilder.Append(", 0]"); 141 if 156 if(t != node.Subtrees.Last()) strBuilder.Append(","); 142 157 } 143 158 strBuilder.Append("], 1, -1]"); … … 146 161 private void FormatAnd(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) { 147 162 strBuilder.Append("If[And["); 148 foreach 163 foreach(var t in node.Subtrees) { 149 164 strBuilder.Append("Greater["); 150 165 FormatRecursively(t, strBuilder); 151 166 strBuilder.Append(", 0]"); 152 if 167 if(t != node.Subtrees.Last()) strBuilder.Append(","); 153 168 } 154 169 strBuilder.Append("], 1, -1]"); … … 169 184 strBuilder.Append("Mean[{"); 170 185 FormatRecursively(node.GetSubtree(0), strBuilder); 171 for 186 for(int i = 1; i < node.SubtreeCount; i++) { 172 187 strBuilder.Append(","); 173 188 FormatRecursively(node.GetSubtree(i), strBuilder); … … 180 195 FormatRecursively(node.GetSubtree(0), strBuilder); 181 196 strBuilder.Append(", Times[-1"); 182 foreach 197 foreach(var t in node.Subtrees) { 183 198 strBuilder.Append(","); 184 199 FormatRecursively(t, strBuilder); … … 202 217 203 218 private void FormatDivision(ISymbolicExpressionTreeNode node, StringBuilder strBuilder) { 204 if 219 if(node.SubtreeCount == 1) { 205 220 strBuilder.Append("Divide[1, "); 206 221 FormatRecursively(node.GetSubtree(0), strBuilder); … … 211 226 strBuilder.Append(", Times["); 212 227 FormatRecursively(node.GetSubtree(1), strBuilder); 213 for 228 for(int i = 2; i < node.SubtreeCount; i++) { 214 229 strBuilder.Append(","); 215 230 FormatRecursively(node.GetSubtree(i), strBuilder); … … 221 236 private void FormatFunction(ISymbolicExpressionTreeNode node, string function, StringBuilder strBuilder) { 222 237 strBuilder.Append(function + "["); 223 foreach 238 foreach(var child in node.Subtrees) { 224 239 FormatRecursively(child, strBuilder); 225 if 240 if(child != node.Subtrees.Last()) 226 241 strBuilder.Append(", "); 227 242 }
Note: See TracChangeset
for help on using the changeset viewer.