Changeset 14826 for trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionLatexFormatter.cs
- Timestamp:
- 04/04/17 17:52:44 (7 years ago)
- Location:
- trunk/sources
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources
- Property svn:mergeinfo changed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionLatexFormatter.cs
r14367 r14826 33 33 [StorableClass] 34 34 public sealed class SymbolicDataAnalysisExpressionLatexFormatter : NamedItem, ISymbolicExpressionTreeStringFormatter { 35 private readonly List<double> constants; 35 private readonly List<KeyValuePair<string, double>> constants; 36 private int constIndex; 36 37 private int targetCount; 37 38 private int currentLag; … … 43 44 private SymbolicDataAnalysisExpressionLatexFormatter(SymbolicDataAnalysisExpressionLatexFormatter original, Cloner cloner) 44 45 : base(original, cloner) { 45 constants = new List<double>(original.constants); 46 constants = new List<KeyValuePair<string, double>>(original.constants); 47 constIndex = original.constIndex; 48 currentLag = original.currentLag; 49 targetCount = original.targetCount; 46 50 } 47 51 public SymbolicDataAnalysisExpressionLatexFormatter() … … 49 53 Name = ItemName; 50 54 Description = ItemDescription; 51 constants = new List< double>();55 constants = new List<KeyValuePair<string, double>>(); 52 56 } 53 57 … … 63 67 StringBuilder strBuilder = new StringBuilder(); 64 68 constants.Clear(); 69 constIndex = 0; 65 70 this.targetVariable = targetVariable; 66 71 containsTimeSeriesSymbol = symbolicExpressionTree.IterateNodesBreadth().Any(n => IsTimeSeriesSymbol(n.Symbol)); … … 84 89 } 85 90 int i = 1; 86 foreach ( SymbolicExpressionTreeNodesubTree in node.Subtrees.Skip(1)) {91 foreach (var subTree in node.Subtrees.Skip(1)) { 87 92 FormatSep(node, strBuilder, i); 88 93 // format the whole subtree … … 175 180 strBuilder.Append(@" \operatorname{if} \left( "); 176 181 } else if (node.Symbol is Constant) { 182 var constName = "c_{" + constIndex + "}"; 183 constIndex++; 177 184 var constNode = node as ConstantTreeNode; 178 185 if (constNode.Value.IsAlmost(1.0)) { 179 186 strBuilder.Append("1 "); 180 187 } else { 181 strBuilder.Append("c_{" + constants.Count + "} "); 182 constants.Add(constNode.Value); 183 } 188 strBuilder.Append(constName); 189 constants.Add(new KeyValuePair<string, double>(constName, constNode.Value)); 190 } 191 192 } else if (node.Symbol is FactorVariable) { 193 var factorNode = node as FactorVariableTreeNode; 194 var constName = "c_{" + constIndex + "}"; 195 strBuilder.Append(constName + " "); 196 foreach (var e in factorNode.Symbol.GetVariableValues(factorNode.VariableName) 197 .Zip(factorNode.Weights, Tuple.Create)) { 198 constants.Add(new KeyValuePair<string, double>("c_{" + constIndex + ", " + EscapeLatexString(factorNode.VariableName) + "=" + EscapeLatexString(e.Item1) + "}", e.Item2)); 199 } 200 constIndex++; 201 } else if (node.Symbol is BinaryFactorVariable) { 202 var binFactorNode = node as BinaryFactorVariableTreeNode; 203 if (!binFactorNode.Weight.IsAlmost((1.0))) { 204 var constName = "c_{" + constIndex + "}"; 205 strBuilder.Append(constName + " \\cdot"); 206 constants.Add(new KeyValuePair<string, double>(constName, binFactorNode.Weight)); 207 constIndex++; 208 } 209 strBuilder.Append("(" + EscapeLatexString(binFactorNode.VariableName)); 210 strBuilder.Append(LagToString(currentLag)); 211 strBuilder.Append(" = " + EscapeLatexString(binFactorNode.VariableValue) + " )"); 184 212 } else if (node.Symbol is LaggedVariable) { 185 213 var laggedVarNode = node as LaggedVariableTreeNode; 186 214 if (!laggedVarNode.Weight.IsAlmost(1.0)) { 187 strBuilder.Append("c_{" + constants.Count + "} \\cdot "); 188 constants.Add(laggedVarNode.Weight); 215 var constName = "c_{" + constIndex + "}"; 216 strBuilder.Append(constName + " \\cdot"); 217 constants.Add(new KeyValuePair<string, double>(constName, laggedVarNode.Weight)); 218 constIndex++; 189 219 } 190 220 strBuilder.Append(EscapeLatexString(laggedVarNode.VariableName)); … … 194 224 var varNode = node as VariableTreeNode; 195 225 if (!varNode.Weight.IsAlmost((1.0))) { 196 strBuilder.Append("c_{" + constants.Count + "} \\cdot "); 197 constants.Add(varNode.Weight); 226 var constName = "c_{" + constIndex + "}"; 227 strBuilder.Append(constName + " \\cdot"); 228 constants.Add(new KeyValuePair<string, double>(constName, varNode.Weight)); 229 constIndex++; 198 230 } 199 231 strBuilder.Append(EscapeLatexString(varNode.VariableName)); … … 229 261 } else if (node.Symbol is VariableCondition) { 230 262 var conditionTreeNode = node as VariableConditionTreeNode; 231 string p = @"1 / 1 + \exp - c_{" + constants.Count + "} "; 232 constants.Add(conditionTreeNode.Slope); 233 p += @" \cdot " + EscapeLatexString(conditionTreeNode.VariableName) + LagToString(currentLag) + " - c_{" + constants.Count + @"} "; 234 constants.Add(conditionTreeNode.Threshold); 263 var constName = "c_{" + constants.Count + "}"; 264 string p = @"1 / 1 + \exp - " + constName + " "; 265 constants.Add(new KeyValuePair<string, double>(constName, conditionTreeNode.Slope)); 266 constIndex++; 267 var const2Name = "c_{" + constants.Count + @"}"; 268 p += @" \cdot " + EscapeLatexString(conditionTreeNode.VariableName) + LagToString(currentLag) + " - " + const2Name + " "; 269 constants.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold)); 270 constIndex++; 235 271 strBuilder.Append(@" \left( " + p + @"\cdot "); 236 272 } else { … … 323 359 } else if (node.Symbol is VariableCondition) { 324 360 var conditionTreeNode = node as VariableConditionTreeNode; 325 string p = @"1 / \left( 1 + \exp \left( - c_{" + constants.Count + "} "; 326 constants.Add(conditionTreeNode.Slope); 327 p += @" \cdot " + EscapeLatexString(conditionTreeNode.VariableName) + LagToString(currentLag) + " - c_{" + constants.Count + @"} \right) \right) \right) "; 328 constants.Add(conditionTreeNode.Threshold); 361 var const1Name = "c_{" + constants.Count + "}"; 362 string p = @"1 / \left( 1 + \exp \left( - " + const1Name + " "; 363 constants.Add(new KeyValuePair<string, double>(const1Name, conditionTreeNode.Slope)); 364 constIndex++; 365 var const2Name = "c_{" + constants.Count + "}"; 366 p += @" \cdot " + EscapeLatexString(conditionTreeNode.VariableName) + LagToString(currentLag) + " - " + const2Name + " \right) \right) \right) "; 367 constants.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold)); 368 constIndex++; 329 369 strBuilder.Append(@" + \left( 1 - " + p + @" \right) \cdot "); 330 370 } else { … … 404 444 } else if (node.Symbol is LaggedVariable) { 405 445 } else if (node.Symbol is Variable) { 446 } else if (node.Symbol is FactorVariable) { 447 } else if (node.Symbol is BinaryFactorVariable) { 406 448 } else if (node.Symbol is ProgramRootSymbol) { 407 449 strBuilder … … 411 453 // output all constant values 412 454 if (constants.Count > 0) { 413 int i = 0;414 455 foreach (var constant in constants) { 415 456 // replace "." with ".&" to align decimal points 416 var constStr = string.Format(System.Globalization.NumberFormatInfo.InvariantInfo, "{0:G5}", constant );457 var constStr = string.Format(System.Globalization.NumberFormatInfo.InvariantInfo, "{0:G5}", constant.Value); 417 458 if (!constStr.Contains(".")) constStr = constStr + ".0"; 418 459 constStr = constStr.Replace(".", "&."); // fix problem in rendering of aligned expressions 419 strBuilder.Append( "c_{" + i + "}& = & " + constStr);460 strBuilder.Append(constant.Key + "& = & " + constStr); 420 461 strBuilder.Append(@"\\"); 421 i++;422 462 } 423 463 }
Note: See TracChangeset
for help on using the changeset viewer.