Changeset 18146 for branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionLatexFormatter.cs
- Timestamp:
- 12/16/21 14:23:48 (2 years ago)
- Location:
- branches/3136_Structural_GP
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3136_Structural_GP
- Property svn:mergeinfo changed
-
branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
-
branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionLatexFormatter.cs
r17826 r18146 33 33 [StorableType("D7186DFF-1596-4A58-B27D-974DF0D93E4F")] 34 34 public sealed class SymbolicDataAnalysisExpressionLatexFormatter : NamedItem, ISymbolicExpressionTreeStringFormatter { 35 private readonly List<KeyValuePair<string, double>> constants;36 private int constIndex;35 private readonly List<KeyValuePair<string, double>> parameters; 36 private int paramIdx; 37 37 private int targetCount; 38 38 private int currentLag; … … 44 44 private SymbolicDataAnalysisExpressionLatexFormatter(SymbolicDataAnalysisExpressionLatexFormatter original, Cloner cloner) 45 45 : base(original, cloner) { 46 constants = new List<KeyValuePair<string, double>>(original.constants);47 constIndex = original.constIndex;46 parameters = new List<KeyValuePair<string, double>>(original.parameters); 47 paramIdx = original.paramIdx; 48 48 currentLag = original.currentLag; 49 49 targetCount = original.targetCount; … … 53 53 Name = ItemName; 54 54 Description = ItemDescription; 55 constants = new List<KeyValuePair<string, double>>();55 parameters = new List<KeyValuePair<string, double>>(); 56 56 } 57 57 … … 66 66 try { 67 67 StringBuilder strBuilder = new StringBuilder(); 68 constants.Clear();69 constIndex = 0;68 parameters.Clear(); 69 paramIdx = 0; 70 70 this.targetVariable = targetVariable; 71 71 containsTimeSeriesSymbol = symbolicExpressionTree.IterateNodesBreadth().Any(n => IsTimeSeriesSymbol(n.Symbol)); … … 189 189 } else if (node.Symbol is IfThenElse) { 190 190 strBuilder.Append(@" \operatorname{if} \left( "); 191 } else if (node.Symbol is Constant) {192 var constName = "c_{" + constIndex + "}";193 constIndex++;194 var constNode = node as ConstantTreeNode;195 if ( constNode.Value.IsAlmost(1.0)) {191 } else if (node.Symbol is INumericSymbol numSy) { 192 var numName = "c_{" + paramIdx + "}"; 193 paramIdx++; 194 var numericNode = node as INumericTreeNode; 195 if (numericNode.Value.IsAlmost(1.0)) { 196 196 strBuilder.Append("1 "); 197 197 } else { 198 strBuilder.Append(constName); 199 constants.Add(new KeyValuePair<string, double>(constName, constNode.Value)); 200 } 201 198 strBuilder.Append(numName); 199 parameters.Add(new KeyValuePair<string, double>(numName, numericNode.Value)); 200 } 202 201 } else if (node.Symbol is FactorVariable) { 203 202 var factorNode = node as FactorVariableTreeNode; 204 var constName = "c_{" + constIndex + "}";205 strBuilder.Append( constName + " ");203 var paramName = "c_{" + paramIdx + "}"; 204 strBuilder.Append(paramName + " "); 206 205 foreach (var e in factorNode.Symbol.GetVariableValues(factorNode.VariableName) 207 206 .Zip(factorNode.Weights, Tuple.Create)) { 208 constants.Add(new KeyValuePair<string, double>("c_{" + constIndex + ", " + EscapeLatexString(factorNode.VariableName) + "=" + EscapeLatexString(e.Item1) + "}", e.Item2));209 } 210 constIndex++;207 parameters.Add(new KeyValuePair<string, double>("c_{" + paramIdx + ", " + EscapeLatexString(factorNode.VariableName) + "=" + EscapeLatexString(e.Item1) + "}", e.Item2)); 208 } 209 paramIdx++; 211 210 } else if (node.Symbol is BinaryFactorVariable) { 212 211 var binFactorNode = node as BinaryFactorVariableTreeNode; 213 212 if (!binFactorNode.Weight.IsAlmost((1.0))) { 214 var constName = "c_{" + constIndex + "}";215 strBuilder.Append( constName + " \\cdot");216 constants.Add(new KeyValuePair<string, double>(constName, binFactorNode.Weight));217 constIndex++;213 var paramName = "c_{" + paramIdx + "}"; 214 strBuilder.Append(paramName + " \\cdot"); 215 parameters.Add(new KeyValuePair<string, double>(paramName, binFactorNode.Weight)); 216 paramIdx++; 218 217 } 219 218 strBuilder.Append("(" + EscapeLatexString(binFactorNode.VariableName)); … … 223 222 var laggedVarNode = node as LaggedVariableTreeNode; 224 223 if (!laggedVarNode.Weight.IsAlmost(1.0)) { 225 var constName = "c_{" + constIndex + "}";226 strBuilder.Append( constName + " \\cdot");227 constants.Add(new KeyValuePair<string, double>(constName, laggedVarNode.Weight));228 constIndex++;224 var paramName = "c_{" + paramIdx + "}"; 225 strBuilder.Append(paramName + " \\cdot"); 226 parameters.Add(new KeyValuePair<string, double>(paramName, laggedVarNode.Weight)); 227 paramIdx++; 229 228 } 230 229 strBuilder.Append(EscapeLatexString(laggedVarNode.VariableName)); … … 234 233 var varNode = node as VariableTreeNode; 235 234 if (!varNode.Weight.IsAlmost((1.0))) { 236 var constName = "c_{" + constIndex + "}";237 strBuilder.Append( constName + " \\cdot");238 constants.Add(new KeyValuePair<string, double>(constName, varNode.Weight));239 constIndex++;235 var paramName = "c_{" + paramIdx + "}"; 236 strBuilder.Append(paramName + " \\cdot"); 237 parameters.Add(new KeyValuePair<string, double>(paramName, varNode.Weight)); 238 paramIdx++; 240 239 } 241 240 strBuilder.Append(EscapeLatexString(varNode.VariableName)); … … 271 270 } else if (node.Symbol is VariableCondition) { 272 271 var conditionTreeNode = node as VariableConditionTreeNode; 273 var constName = "c_{" + constants.Count + "}";274 string p = @"1 / 1 + \exp - " + constName + " ";275 constants.Add(new KeyValuePair<string, double>(constName, conditionTreeNode.Slope));276 constIndex++;277 var const2Name = "c_{" + constants.Count + @"}";272 var paramName = "c_{" + parameters.Count + "}"; 273 string p = @"1 / 1 + \exp - " + paramName + " "; 274 parameters.Add(new KeyValuePair<string, double>(paramName, conditionTreeNode.Slope)); 275 paramIdx++; 276 var const2Name = "c_{" + parameters.Count + @"}"; 278 277 p += @" \cdot " + EscapeLatexString(conditionTreeNode.VariableName) + LagToString(currentLag) + " - " + const2Name + " "; 279 constants.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold));280 constIndex++;278 parameters.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold)); 279 paramIdx++; 281 280 strBuilder.Append(@" \left( " + p + @"\cdot "); 282 281 } else { … … 379 378 } else if (node.Symbol is VariableCondition) { 380 379 var conditionTreeNode = node as VariableConditionTreeNode; 381 var const1Name = "c_{" + constants.Count + "}";380 var const1Name = "c_{" + parameters.Count + "}"; 382 381 string p = @"1 / \left( 1 + \exp \left( - " + const1Name + " "; 383 constants.Add(new KeyValuePair<string, double>(const1Name, conditionTreeNode.Slope));384 constIndex++;385 var const2Name = "c_{" + constants.Count + "}";382 parameters.Add(new KeyValuePair<string, double>(const1Name, conditionTreeNode.Slope)); 383 paramIdx++; 384 var const2Name = "c_{" + parameters.Count + "}"; 386 385 p += @" \cdot " + EscapeLatexString(conditionTreeNode.VariableName) + LagToString(currentLag) + " - " + const2Name + " \right) \right) \right) "; 387 constants.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold));388 constIndex++;386 parameters.Add(new KeyValuePair<string, double>(const2Name, conditionTreeNode.Threshold)); 387 paramIdx++; 389 388 strBuilder.Append(@" + \left( 1 - " + p + @" \right) \cdot "); 390 389 } else { … … 471 470 } else if (node.Symbol is IfThenElse) { 472 471 strBuilder.Append(@" \right) "); 472 } else if (node.Symbol is Number) { 473 473 } else if (node.Symbol is Constant) { 474 474 } else if (node.Symbol is LaggedVariable) { … … 481 481 .AppendLine("\\begin{align*}") 482 482 .AppendLine("\\nonumber"); 483 // output all constantvalues484 if ( constants.Count > 0) {485 foreach (var constant in constants) {483 // output all parameter values 484 if (parameters.Count > 0) { 485 foreach (var param in parameters) { 486 486 // replace "." with ".&" to align decimal points 487 var constStr = string.Format(System.Globalization.NumberFormatInfo.InvariantInfo, "{0:G5}", constant.Value);488 if (! constStr.Contains(".")) constStr = constStr + ".0";489 constStr = constStr.Replace(".", "&."); // fix problem in rendering of aligned expressions490 strBuilder.Append( constant.Key + "& = & " + constStr);487 var paramStr = string.Format(System.Globalization.NumberFormatInfo.InvariantInfo, "{0:G5}", param.Value); 488 if (!paramStr.Contains(".")) paramStr = paramStr + ".0"; 489 paramStr = paramStr.Replace(".", "&."); // fix problem in rendering of aligned expressions 490 strBuilder.Append(param.Key + "& = & " + paramStr); 491 491 strBuilder.Append(@"\\"); 492 492 }
Note: See TracChangeset
for help on using the changeset viewer.