Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/28/16 17:55:52 (7 years ago)
Author:
bburlacu
Message:

#1772: Extract common methods (used by the schema creator and the schema frequency analyzer) in static SchemaUtil class. Make AnyNode constructor public.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SchemaDiversification/SchemaCreator.cs

    r13876 r14427  
    2323using System.Collections.Generic;
    2424using System.Linq;
    25 using System.Text;
    2625using HeuristicLab.Common;
    2726using HeuristicLab.Core;
     
    202201                     select v;
    203202
    204       var schemas = new List<ISymbolicExpressionTree>(GenerateSchemas(vertices, MinimumSchemaLength, StrictSchemaMatching));
     203      var schemas = GenerateSchemas(vertices, MinimumSchemaLength, StrictSchemaMatching).ToList();
    205204
    206205      #region create schemas and add subscopes representing the individuals
     
    226225    public static IEnumerable<ISymbolicExpressionTree> GenerateSchemas(IEnumerable<IGenealogyGraphNode<ISymbolicExpressionTree>> vertices, int minimumSchemaLength, bool strict = true) {
    227226      var anySubtreeSymbol = new AnySubtreeSymbol();
    228       //            var anyNodeSymbol = new AnyNodeSymbol();
    229       var groups = vertices.GroupBy(x => x.Parents.First()).OrderByDescending(g => g.Count()).ToList();
     227      var groups = vertices.GroupBy(x => x.Parents.First()).OrderByDescending(g => g.Count());
    230228      var hash = new HashSet<string>();
    231       //      var formatter = new SymbolicExpressionTreeStringFormatter { Indent = false, AppendNewLines = false };
    232229      foreach (var g in groups) {
    233230        var parent = g.Key;
     
    237234        var schema = (ISymbolicExpressionTree)parent.Data.Clone();
    238235        var nodes = schema.IterateNodesPrefix().ToList();
    239         var arcs = g.Select(x => x.InArcs.Last()).Where(x => x.Data != null);
    240         var indices = (from arc in arcs
    241                        let fragment = (IFragment<ISymbolicExpressionTreeNode>)arc.Data
    242                        select fragment.Index1).Distinct().ToArray();
    243         var levels = indices.Select(x => schema.Root.GetBranchLevel(nodes[x])).ToArray();
    244         Array.Sort(levels, indices);
    245         // order nodes by their depth so that cutpoints are replaced with wildcards from the bottom up
    246         var nodesToReplace = indices.Select(x => nodes[x]).ToList();
    247         for (int i = nodesToReplace.Count - 1; i >= 0; --i) {
    248           var node = nodesToReplace[i];
    249 
     236        var fragments = g.Select(x => x.InArcs.Last().Data).Where(x => x != null).Cast<IFragment<ISymbolicExpressionTreeNode>>();
     237        var indices = fragments.Select(x => x.Index1).Distinct().OrderByDescending(x => schema.Root.GetBranchLevel(nodes[x]));
     238        foreach (var i in indices) {
     239          var node = nodes[i];
    250240          // do not replace the node with a wildcard if it would result in a length < MinimumSchemaLength
    251           if (schema.Length - node.GetLength() + 1 < minimumSchemaLength)
    252             continue;
    253 
    254           var replacement = anySubtreeSymbol.CreateTreeNode();
    255           ReplaceSubtree(node, replacement, false);
     241          //          if (schema.Length - node.GetLength() + 1 < minimumSchemaLength)
     242          //            continue;
     243          ISymbolicExpressionTreeNode replacement;
     244          if (node.SubtreeCount > 0) {
     245            var anyNodeSymbol = new AnyNodeSymbol(node.Symbol.MinimumArity, node.Symbol.MaximumArity);
     246            replacement = anyNodeSymbol.CreateTreeNode();
     247          } else {
     248            replacement = anySubtreeSymbol.CreateTreeNode();
     249          }
     250          SchemaUtil.ReplaceSubtree(node, replacement, true);
    256251          //          var replacement = new AnyNodeSymbol(node.Symbol.MinimumArity, node.Symbol.MinimumArity).CreateTreeNode();
    257252          //          ReplaceSubtree(node, replacement, true);
     
    259254        }
    260255        if (replaced) {
    261           //          var str = formatter.Format(schema.Root.GetSubtree(0).GetSubtree(0));
    262           var str = SubtreeToString(schema.Root.GetSubtree(0).GetSubtree(0), strict);
    263           if (hash.Contains(str)) continue;
    264           yield return schema;
    265           hash.Add(str);
     256          var str = schema.Root.GetSubtree(0).GetSubtree(0).FormatToString(strict);
     257          if (hash.Add(str))
     258            yield return schema;
    266259        }
    267260      }
    268261    }
    269 
    270     private static void ReplaceSubtree(ISymbolicExpressionTreeNode original, ISymbolicExpressionTreeNode replacement, bool preserveChildren = true) {
    271       var parent = original.Parent;
    272       if (parent == null)
    273         throw new ArgumentException("Parent cannot be null for node " + original);
    274       var index = parent.IndexOfSubtree(original);
    275       parent.RemoveSubtree(index);
    276       parent.InsertSubtree(index, replacement);
    277 
    278       if (preserveChildren) {
    279         var subtrees = original.Subtrees.ToList();
    280 
    281         for (int i = subtrees.Count - 1; i >= 0; --i)
    282           original.RemoveSubtree(i);
    283 
    284         for (int i = 0; i < subtrees.Count; ++i) {
    285           replacement.AddSubtree(subtrees[i]);
    286         }
    287       }
    288     }
    289 
    290     private static string SubtreeToString(ISymbolicExpressionTreeNode node, bool strict = false) {
    291       StringBuilder strBuilder = new StringBuilder();
    292       // internal nodes or leaf nodes?
    293       if (node is AnySubtree)
    294         return "# ";
    295 
    296       if (node.SubtreeCount > 0) {
    297         strBuilder.Append("(");
    298         // symbol on same line as '('
    299         string label = string.Empty;
    300         if (node is AnyNode)
    301           label = "=";
    302         else {
    303           label = node.Symbol.Name;
    304         }
    305         strBuilder.Append(label + " ");
    306         // each subtree expression on a new line
    307         // and closing ')' also on new line
    308         foreach (var subtree in node.Subtrees) {
    309           strBuilder.Append(SubtreeToString(subtree, strict));
    310         }
    311         strBuilder.Append(") ");
    312       } else {
    313         // symbol in the same line with as '(' and ')'
    314         var v = node as VariableTreeNode;
    315         var c = node as ConstantTreeNode;
    316         var w = node as AnyNode; // wildcard
    317         string label = string.Empty;
    318         if (w != null)
    319           label = "=";
    320         else if (v != null)
    321           label = strict ? string.Format("{0:0.00}_{1}", v.Weight, v.VariableName) : string.Format("{0}", v.VariableName);
    322         else if (c != null)
    323           label = strict ? string.Format("{0:0.00}", c.Value) : "C";
    324         strBuilder.Append(label);
    325         if (node.Parent != null && node != node.Parent.Subtrees.Last())
    326           strBuilder.Append(" ");
    327         //strBuilder.Append(")");
    328       }
    329       return strBuilder.ToString();
    330     }
    331262  }
    332263}
Note: See TracChangeset for help on using the changeset viewer.