Changeset 18132 for trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/InfixExpressionFormatter.cs
- Timestamp:
- 12/15/21 11:50:57 (2 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/3140_NumberSymbol (added) merged: 18091,18093,18100,18112-18121,18123-18131
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
/branches/3140_NumberSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic (added) merged: 18093,18100,18112-18116,18118,18121,18123-18124,18129-18130
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/InfixExpressionFormatter.cs
r17811 r18132 33 33 public static class BaseInfixExpressionFormatter { 34 34 public static void FormatRecursively(ISymbolicExpressionTreeNode node, StringBuilder strBuilder, 35 NumberFormatInfo numberFormat, string formatString, List<KeyValuePair<string, double>> constants = null) {35 NumberFormatInfo numberFormat, string formatString, List<KeyValuePair<string, double>> parameters = null) { 36 36 if (node.SubtreeCount > 1) { 37 37 var token = GetToken(node.Symbol); … … 40 40 token == "*" || token == "/" || token == "AND") { 41 41 strBuilder.Append("("); 42 FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, constants);42 FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, parameters); 43 43 44 44 foreach (var subtree in node.Subtrees.Skip(1)) { 45 45 strBuilder.Append(" ").Append(token).Append(" "); 46 FormatRecursively(subtree, strBuilder, numberFormat, formatString, constants);46 FormatRecursively(subtree, strBuilder, numberFormat, formatString, parameters); 47 47 } 48 48 … … 51 51 // handle integer powers directly 52 52 strBuilder.Append("("); 53 FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, constants);53 FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, parameters); 54 54 55 55 var power = node.GetSubtree(1); 56 if(power is ConstantTreeNode constNode && Math.Truncate(constNode.Value) == constNode.Value) {57 strBuilder.Append(" ").Append(token).Append(" ").Append( constNode.Value.ToString(formatString, numberFormat));56 if(power is INumericTreeNode numNode && Math.Truncate(numNode.Value) == numNode.Value) { 57 strBuilder.Append(" ").Append(token).Append(" ").Append(numNode.Value.ToString(formatString, numberFormat)); 58 58 } else { 59 59 strBuilder.Append(" ").Append(token).Append(" "); 60 FormatRecursively(power, strBuilder, numberFormat, formatString, constants);60 FormatRecursively(power, strBuilder, numberFormat, formatString, parameters); 61 61 } 62 62 … … 65 65 // function with multiple arguments 66 66 strBuilder.Append(token).Append("("); 67 FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, constants);67 FormatRecursively(node.Subtrees.First(), strBuilder, numberFormat, formatString, parameters); 68 68 foreach (var subtree in node.Subtrees.Skip(1)) { 69 69 strBuilder.Append(", "); 70 FormatRecursively(subtree, strBuilder, numberFormat, formatString, constants);70 FormatRecursively(subtree, strBuilder, numberFormat, formatString, parameters); 71 71 } 72 72 … … 77 77 if (token == "-" || token == "NOT") { 78 78 strBuilder.Append("(").Append(token).Append("("); 79 FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, constants);79 FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, parameters); 80 80 strBuilder.Append("))"); 81 81 } else if (token == "/") { 82 82 strBuilder.Append("1/"); 83 FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, constants);83 FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, parameters); 84 84 } else if (token == "+" || token == "*") { 85 FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, constants);85 FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, parameters); 86 86 } else { 87 87 // function with only one argument 88 88 strBuilder.Append(token).Append("("); 89 FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, constants);89 FormatRecursively(node.GetSubtree(0), strBuilder, numberFormat, formatString, parameters); 90 90 strBuilder.Append(")"); 91 91 } … … 96 96 if (!varNode.Weight.IsAlmost(1.0)) { 97 97 strBuilder.Append("("); 98 Append Constant(strBuilder, constants, varNode.Weight, formatString, numberFormat);98 AppendNumber(strBuilder, parameters, varNode.Weight, formatString, numberFormat); 99 99 strBuilder.Append("*"); 100 100 } … … 110 110 if (!varNode.Weight.IsAlmost(1.0)) { 111 111 strBuilder.Append("("); 112 Append Constant(strBuilder, constants, varNode.Weight, formatString, numberFormat);112 AppendNumber(strBuilder, parameters, varNode.Weight, formatString, numberFormat); 113 113 strBuilder.Append("*"); 114 114 } … … 124 124 for (int i = 0; i < factorNode.Weights.Length; i++) { 125 125 if (i > 0) strBuilder.Append(", "); 126 Append Constant(strBuilder, constants, factorNode.Weights[i], formatString, numberFormat);126 AppendNumber(strBuilder, parameters, factorNode.Weights[i], formatString, numberFormat); 127 127 } 128 128 strBuilder.Append("]"); … … 131 131 if (!factorNode.Weight.IsAlmost(1.0)) { 132 132 strBuilder.Append("("); 133 Append Constant(strBuilder, constants, factorNode.Weight, formatString, numberFormat);133 AppendNumber(strBuilder, parameters, factorNode.Weight, formatString, numberFormat); 134 134 135 135 strBuilder.Append("*"); … … 141 141 142 142 if (!factorNode.Weight.IsAlmost(1.0)) strBuilder.Append(")"); 143 } else if (node .Symbol is Constant) {144 var constNode = node as ConstantTreeNode;145 if (constants == null && constNode.Value < 0) {146 strBuilder.Append("(").Append( constNode.Value.ToString(formatString, numberFormat))147 .Append(")"); // (-1143 } else if (node is INumericTreeNode numNode) { 144 if (parameters == null && numNode.Value < 0) { 145 // negative value 146 strBuilder.Append("(").Append(numNode.Value.ToString(formatString, numberFormat)) 147 .Append(")"); 148 148 } else { 149 Append Constant(strBuilder, constants, constNode.Value, formatString, numberFormat);149 AppendNumber(strBuilder, parameters, numNode.Value, formatString, numberFormat); 150 150 } 151 151 } … … 153 153 } 154 154 155 private static void Append Constant(StringBuilder strBuilder, List<KeyValuePair<string, double>> constants, double value, string formatString, NumberFormatInfo numberFormat) {156 if ( constants != null) {157 string constantKey = $"c_{constants.Count}";158 strBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0}", constantKey);159 constants.Add(new KeyValuePair<string, double>(constantKey, value));155 private static void AppendNumber(StringBuilder strBuilder, List<KeyValuePair<string, double>> parameters, double value, string formatString, NumberFormatInfo numberFormat) { 156 if (parameters != null) { 157 string paramKey = $"c_{parameters.Count}"; 158 strBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0}", paramKey); 159 parameters.Add(new KeyValuePair<string, double>(paramKey, value)); 160 160 } else { 161 161 strBuilder.Append(value.ToString(formatString, numberFormat)); … … 204 204 /// </summary> 205 205 /// <param name="symbolicExpressionTree">The tree representation of the expression.</param> 206 /// <param name="numberFormat">Number format that should be used for numericparameters (e.g. NumberFormatInfo.InvariantInfo (default)).</param>207 /// <param name="formatString">The format string for numericparameters (e.g. \"G4\" to limit to 4 digits, default is \"G\")</param>206 /// <param name="numberFormat">Number format that should be used for parameters (e.g. NumberFormatInfo.InvariantInfo (default)).</param> 207 /// <param name="formatString">The format string for parameters (e.g. \"G4\" to limit to 4 digits, default is \"G\")</param> 208 208 /// <returns>Infix expression</returns> 209 209 public string Format(ISymbolicExpressionTree symbolicExpressionTree, NumberFormatInfo numberFormat, … … 241 241 public string Format(ISymbolicExpressionTree symbolicExpressionTree) { 242 242 StringBuilder strBuilder = new StringBuilder(); 243 var constants = new List<KeyValuePair<string, double>>();243 var parameters = new List<KeyValuePair<string, double>>(); 244 244 BaseInfixExpressionFormatter.FormatRecursively(symbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0), 245 strBuilder, NumberFormatInfo.InvariantInfo, "G", constants);245 strBuilder, NumberFormatInfo.InvariantInfo, "G", parameters); 246 246 strBuilder.Append($"{Environment.NewLine}{Environment.NewLine}"); 247 247 248 int maxDigits = GetDigits( constants.Count);249 int padding = constants.Max(x => x.Value.ToString("F12", CultureInfo.InvariantCulture).Length);250 foreach (var constant in constants) {251 int digits = GetDigits( Int32.Parse(constant.Key.Substring(2)));252 strBuilder.Append($"{ constant.Key}{new String(' ', maxDigits - digits)} = " +253 string.Format($"{{0,{padding}:F12}}", constant.Value, CultureInfo.InvariantCulture) +248 int maxDigits = GetDigits(parameters.Count); 249 int padding = parameters.Max(x => x.Value.ToString("F12", CultureInfo.InvariantCulture).Length); 250 foreach (var param in parameters) { 251 int digits = GetDigits(int.Parse(param.Key.Substring(2))); 252 strBuilder.Append($"{param.Key}{new string(' ', maxDigits - digits)} = " + 253 string.Format($"{{0,{padding}:F12}}", param.Value, CultureInfo.InvariantCulture) + 254 254 Environment.NewLine); 255 255 }
Note: See TracChangeset
for help on using the changeset viewer.