using System; using System.IO; using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; namespace HeuristicLab.Problems.DataAnalysis.Symbolic { public static class SymbolicDataAnalysisSolutionTextRenderer { public static void TextRender(this ISymbolicExpressionTree tree) { RenderTree(Console.Out, tree); } private static void RenderTree(TextWriter writer, ISymbolicExpressionTree tree) { RenderNode(writer, tree.Root, string.Empty); } public static void RenderNode(TextWriter writer, ISymbolicExpressionTreeNode node, string prefix) { string label; if (node is VariableTreeNode) { var variable = node as VariableTreeNode; label = string.Concat(string.Format("{0:0.000}", variable.Weight), '·', variable.VariableName); } else if (node is ConstantTreeNode) { var constant = node as ConstantTreeNode; label = string.Format("{0:0.000}", constant.Value); } else { label = node.Symbol.ToString(); } writer.Write(label); if (node.SubtreeCount > 0) { var padding = prefix + new string(' ', label.Length); for (int i = 0; i != node.SubtreeCount; ++i) { char connector, extender = ' '; if (i == 0) { if (node.SubtreeCount > 1) { connector = RenderChars.JunctionDown; extender = RenderChars.VerticalLine; } else { connector = RenderChars.HorizontalLine; extender = ' '; } } else { writer.Write(padding); if (i == node.SubtreeCount - 1) { connector = RenderChars.CornerRight; extender = ' '; } else { connector = RenderChars.JunctionRight; extender = RenderChars.VerticalLine; } } writer.Write(string.Concat(connector, RenderChars.HorizontalLine)); var newPrefix = string.Concat(padding, extender, ' '); RenderNode(writer, node.GetSubtree(i), newPrefix); } } else writer.WriteLine(); } // helper class providing characters for displaying a tree in the console public static class RenderChars { public const char JunctionDown = '┬'; public const char HorizontalLine = '─'; public const char VerticalLine = '│'; public const char JunctionRight = '├'; public const char CornerRight = '└'; } } }