Changeset 14764 for branches/symbreg-factors-2650/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMATLABFormatter.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/SymbolicDataAnalysisExpressionMATLABFormatter.cs
r14185 r14764 21 21 22 22 using System.Globalization; 23 using System.Linq; 23 24 using System.Text; 24 25 using HeuristicLab.Common; … … 77 78 stringBuilder.AppendLine(" y = (f0 + 2*f1 - 2*f3 - f4) / 8;"); 78 79 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 79 103 return stringBuilder.ToString(); 80 104 } … … 92 116 StringBuilder stringBuilder = new StringBuilder(); 93 117 94 if 118 if(symbol is ProgramRootSymbol) { 95 119 stringBuilder.AppendLine(FormatRecursively(node.GetSubtree(0))); 96 } else if 120 } else if(symbol is StartSymbol) 97 121 return FormatRecursively(node.GetSubtree(0)); 98 else if 99 stringBuilder.Append("("); 100 for 101 if 102 stringBuilder.Append(FormatRecursively(node.GetSubtree(i))); 103 } 104 stringBuilder.Append(")"); 105 } else if 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) { 106 130 stringBuilder.Append("(("); 107 for 108 if 131 for(int i = 0; i < node.SubtreeCount; i++) { 132 if(i > 0) stringBuilder.Append("&"); 109 133 stringBuilder.Append("(("); 110 134 stringBuilder.Append(FormatRecursively(node.GetSubtree(i))); … … 113 137 stringBuilder.Append(")-0.5)*2"); 114 138 // MATLAB maps false and true to 0 and 1, resp., we map this result to -1.0 and +1.0, resp. 115 } else if 139 } else if(symbol is Average) { 116 140 stringBuilder.Append("(1/"); 117 141 stringBuilder.Append(node.SubtreeCount); 118 142 stringBuilder.Append(")*("); 119 for 120 if 143 for(int i = 0; i < node.SubtreeCount; i++) { 144 if(i > 0) stringBuilder.Append("+"); 121 145 stringBuilder.Append("("); 122 146 stringBuilder.Append(FormatRecursively(node.GetSubtree(i))); … … 124 148 } 125 149 stringBuilder.Append(")"); 126 } else if 150 } else if(symbol is Constant) { 127 151 ConstantTreeNode constantTreeNode = node as ConstantTreeNode; 128 152 stringBuilder.Append(constantTreeNode.Value.ToString(CultureInfo.InvariantCulture)); 129 } else if 153 } else if(symbol is Cosine) { 130 154 stringBuilder.Append("cos("); 131 155 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 132 156 stringBuilder.Append(")"); 133 } else if 134 if 157 } else if(symbol is Division) { 158 if(node.SubtreeCount == 1) { 135 159 stringBuilder.Append("1/"); 136 160 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); … … 138 162 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 139 163 stringBuilder.Append("/("); 140 for 141 if 164 for(int i = 1; i < node.SubtreeCount; i++) { 165 if(i > 1) stringBuilder.Append("*"); 142 166 stringBuilder.Append(FormatRecursively(node.GetSubtree(i))); 143 167 } 144 168 stringBuilder.Append(")"); 145 169 } 146 } else if 170 } else if(symbol is Exponential) { 147 171 stringBuilder.Append("exp("); 148 172 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 149 173 stringBuilder.Append(")"); 150 } else if 174 } else if(symbol is Square) { 151 175 stringBuilder.Append("("); 152 176 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 153 177 stringBuilder.Append(").^2"); 154 } else if 178 } else if(symbol is SquareRoot) { 155 179 stringBuilder.Append("sqrt("); 156 180 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 157 181 stringBuilder.Append(")"); 158 } else if 182 } else if(symbol is GreaterThan) { 159 183 stringBuilder.Append("(("); 160 184 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); … … 163 187 stringBuilder.Append(")-0.5)*2"); 164 188 // MATLAB maps false and true to 0 and 1, resp., we map this result to -1.0 and +1.0, resp. 165 } else if 189 } else if(symbol is IfThenElse) { 166 190 stringBuilder.Append("("); 167 191 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); … … 173 197 stringBuilder.Append("<=0)*"); 174 198 stringBuilder.Append(FormatRecursively(node.GetSubtree(2))); 175 } else if 199 } else if(symbol is LaggedVariable) { 176 200 // this if must be checked before if(symbol is LaggedVariable) 177 201 LaggedVariableTreeNode laggedVariableTreeNode = node as LaggedVariableTreeNode; … … 180 204 stringBuilder.Append(laggedVariableTreeNode.VariableName + 181 205 LagToString(currentLag + laggedVariableTreeNode.Lag)); 182 } else if 206 } else if(symbol is LessThan) { 183 207 stringBuilder.Append("(("); 184 208 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); … … 187 211 stringBuilder.Append(")-0.5)*2"); 188 212 // MATLAB maps false and true to 0 and 1, resp., we map this result to -1.0 and +1.0, resp. 189 } else if 213 } else if(symbol is Logarithm) { 190 214 stringBuilder.Append("log_("); 191 215 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 192 216 stringBuilder.Append(")"); 193 } else if 194 for 195 if 196 stringBuilder.Append(FormatRecursively(node.GetSubtree(i))); 197 } 198 } else if 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) { 199 223 stringBuilder.Append("~("); 200 224 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 201 225 stringBuilder.Append(" > 0 )"); 202 } else if 226 } else if(symbol is Or) { 203 227 stringBuilder.Append("(("); 204 for 205 if 228 for(int i = 0; i < node.SubtreeCount; i++) { 229 if(i > 0) stringBuilder.Append("|"); 206 230 stringBuilder.Append("(("); 207 231 stringBuilder.Append(FormatRecursively(node.GetSubtree(i))); … … 210 234 stringBuilder.Append(")-0.5)*2"); 211 235 // MATLAB maps false and true to 0 and 1, resp., we map this result to -1.0 and +1.0, resp. 212 } else if 236 } else if(symbol is Sine) { 213 237 stringBuilder.Append("sin("); 214 238 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 215 239 stringBuilder.Append(")"); 216 } else if 217 stringBuilder.Append("("); 218 if 240 } else if(symbol is Subtraction) { 241 stringBuilder.Append("("); 242 if(node.SubtreeCount == 1) { 219 243 stringBuilder.Append("-"); 220 244 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 221 245 } else { 222 246 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 223 for 247 for(int i = 1; i < node.SubtreeCount; i++) { 224 248 stringBuilder.Append("-"); 225 249 stringBuilder.Append(FormatRecursively(node.GetSubtree(i))); … … 227 251 } 228 252 stringBuilder.Append(")"); 229 } else if 253 } else if(symbol is Tangent) { 230 254 stringBuilder.Append("tan("); 231 255 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 232 256 stringBuilder.Append(")"); 233 } else if 257 } else if(node.Symbol is AiryA) { 234 258 stringBuilder.Append("airy("); 235 259 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 236 260 stringBuilder.Append(")"); 237 } else if 261 } else if(node.Symbol is AiryB) { 238 262 stringBuilder.Append("airy(2, "); 239 263 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 240 264 stringBuilder.Append(")"); 241 } else if 265 } else if(node.Symbol is Bessel) { 242 266 stringBuilder.Append("besseli(0.0,"); 243 267 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 244 268 stringBuilder.Append(")"); 245 } else if 269 } else if(node.Symbol is CosineIntegral) { 246 270 stringBuilder.Append("cosint("); 247 271 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 248 272 stringBuilder.Append(")"); 249 } else if 273 } else if(node.Symbol is Dawson) { 250 274 stringBuilder.Append("dawson("); 251 275 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 252 276 stringBuilder.Append(")"); 253 } else if 277 } else if(node.Symbol is Erf) { 254 278 stringBuilder.Append("erf("); 255 279 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 256 280 stringBuilder.Append(")"); 257 } else if 281 } else if(node.Symbol is ExponentialIntegralEi) { 258 282 stringBuilder.Append("expint("); 259 283 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 260 284 stringBuilder.Append(")"); 261 } else if 285 } else if(node.Symbol is FresnelCosineIntegral) { 262 286 stringBuilder.Append("FresnelC("); 263 287 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 264 288 stringBuilder.Append(")"); 265 } else if 289 } else if(node.Symbol is FresnelSineIntegral) { 266 290 stringBuilder.Append("FresnelS("); 267 291 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 268 292 stringBuilder.Append(")"); 269 } else if 293 } else if(node.Symbol is Gamma) { 270 294 stringBuilder.Append("gamma("); 271 295 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 272 296 stringBuilder.Append(")"); 273 } else if 297 } else if(node.Symbol is HyperbolicCosineIntegral) { 274 298 stringBuilder.Append("Chi("); 275 299 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 276 300 stringBuilder.Append(")"); 277 } else if 301 } else if(node.Symbol is HyperbolicSineIntegral) { 278 302 stringBuilder.Append("Shi("); 279 303 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 280 304 stringBuilder.Append(")"); 281 } else if 305 } else if(node.Symbol is Norm) { 282 306 stringBuilder.Append("normpdf("); 283 307 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 284 308 stringBuilder.Append(")"); 285 } else if 309 } else if(node.Symbol is Psi) { 286 310 stringBuilder.Append("psi("); 287 311 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 288 312 stringBuilder.Append(")"); 289 } else if 313 } else if(node.Symbol is SineIntegral) { 290 314 stringBuilder.Append("sinint("); 291 315 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); 292 316 stringBuilder.Append(")"); 293 } else if 317 } else if(symbol is HeuristicLab.Problems.DataAnalysis.Symbolic.Variable) { 294 318 VariableTreeNode variableTreeNode = node as VariableTreeNode; 295 319 stringBuilder.Append(variableTreeNode.Weight.ToString(CultureInfo.InvariantCulture)); 296 320 stringBuilder.Append("*"); 297 321 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) { 299 333 stringBuilder.Append("("); 300 334 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); … … 302 336 stringBuilder.Append(FormatRecursively(node.GetSubtree(1))); 303 337 stringBuilder.Append(")"); 304 } else if 338 } else if(symbol is Root) { 305 339 stringBuilder.Append("("); 306 340 stringBuilder.Append(FormatRecursively(node.GetSubtree(0))); … … 308 342 stringBuilder.Append(FormatRecursively(node.GetSubtree(1))); 309 343 stringBuilder.Append("))"); 310 } else if 344 } else if(symbol is Derivative) { 311 345 stringBuilder.Append("fivePoint("); 312 346 // f0 … … 326 360 stringBuilder.Append(")"); 327 361 currentLag += 4; 328 } else if 362 } else if(symbol is Integral) { 329 363 var laggedNode = node as LaggedTreeNode; 330 364 string prevCounterVariable = CurrentIndexVariable; … … 334 368 "))"); 335 369 ReleaseIndexVariable(); 336 } else if 370 } else if(symbol is TimeLag) { 337 371 var laggedNode = node as LaggedTreeNode; 338 372 currentLag += laggedNode.Lag; … … 347 381 348 382 private string LagToString(int lag) { 349 if 383 if(lag < 0) { 350 384 return "(" + CurrentIndexVariable + "" + lag + ")"; 351 } else if 385 } else if(lag > 0) { 352 386 return "(" + CurrentIndexVariable + "+" + lag + ")"; 353 387 } else return "(" + CurrentIndexVariable + ")";
Note: See TracChangeset
for help on using the changeset viewer.