Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/26/14 01:56:35 (10 years ago)
Author:
bburlacu
Message:

#1772: Introduced separate class for FragmentNodes and adjusted tracing code. Fixed small bug creating the genealogy graph.

File:
1 edited

Legend:

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

    r10886 r10888  
    2626using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    2727using HeuristicLab.EvolutionTracking;
    28 using FragmentNode = HeuristicLab.EvolutionTracking.GenealogyGraphNode<HeuristicLab.EvolutionTracking.IFragment<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTreeNode>>;
    29 using IFragmentNode = HeuristicLab.EvolutionTracking.IGenealogyGraphNode<HeuristicLab.EvolutionTracking.IFragment<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTreeNode>>;
    30 using IGraphNode = HeuristicLab.EvolutionTracking.IGenealogyGraphNode<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTree>;
    3128
    3229namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
    3330  public static class SymbolicDataAnalysisExpressionTracing {
    34     public static IGenealogyGraph<IFragment<ISymbolicExpressionTreeNode>> TraceSubtree(IGenealogyGraphNode<ISymbolicExpressionTree> graphNode, int subtreeIndex) {
    35       var graph = new GenealogyGraph<IFragment<ISymbolicExpressionTreeNode>>();
     31    public static FragmentGraph TraceSubtree(IGenealogyGraphNode<ISymbolicExpressionTree> graphNode, int subtreeIndex) {
     32      var graph = new FragmentGraph { AllowDuplicateContent = true };
    3633      var nodes = Trace(graphNode, subtreeIndex);
    3734      foreach (var n in nodes) {
     
    4037      return graph;
    4138    }
    42 
    43     private static IEnumerable<IFragmentNode> Trace(IGraphNode graphNode, int subtreeIndex, FragmentNode parentNode = null) {
     39    /// <summary>
     40    /// Traces a subtree in a genealogy of individuals, tracking down it's genetic components
     41    /// </summary>
     42    /// <param name="graphNode">The point in the genealogy where to start the tracing from</param>
     43    /// <param name="subtreeIndex">The traced subtree preorder index in the current tree</param>
     44    /// <param name="parentNode">The parent node in the fragment graph if there is any</param>
     45    /// <returns></returns>
     46    private static IEnumerable<FragmentNode> Trace(IGenealogyGraphNode<ISymbolicExpressionTree> graphNode, int subtreeIndex, FragmentNode parentNode = null) {
    4447      var node = graphNode; // current node
    4548      var index = subtreeIndex; // current index
     
    4952        if (!node.Parents.Any()) {
    5053          var fragmentNode = new FragmentNode {
    51             Content = new Fragment<ISymbolicExpressionTreeNode> {
    52               Root = node.Content.Root,
    53               //              Root = node.Content.NodeAt(index)
    54               Index1 = index
    55             },
    56             Rank = node.Rank,
    57             Quality = node.Quality
     54            Content = node,
     55            SubtreeIndex = index,
    5856          };
    5957          if (parent != null) {
    60             var arc = new GenealogyGraphArc(parent, fragmentNode);
     58            var arc = new Arc(parent, fragmentNode);
    6159            parent.AddForwardArc(arc);
    6260            fragmentNode.AddReverseArc(arc);
     
    7876        var subtreeLength = subtree.GetLength();
    7977
     78        #region mutation tracing
    8079        if (parents.Count == 1) {
    8180          // we are tracing a mutation operation
    8281          var fragmentNode = new FragmentNode {
    83             Content = new Fragment<ISymbolicExpressionTreeNode> {
    84               Root = tree.Root,
    85               //              Root = subtree
    86               Index1 = index,
    87               Index2 = fragment.Index1
    88             },
    89             Rank = node.Rank,
    90             Quality = node.Quality
     82            Content = node,
     83            SubtreeIndex = index,
     84            FragmentIndex = fragment.Index1
    9185          };
    9286          if (parent != null) {
    93             var arc = new GenealogyGraphArc(parent, fragmentNode);
     87            var arc = new Arc(parent, fragmentNode);
    9488            parent.AddForwardArc(arc);
    9589            fragmentNode.AddReverseArc(arc);
    9690          }
     91          node = parents[0];
     92          if (subtreeIndex == fragment.Index1) {
     93            // index stays the same
     94          } else if (fragment.Index1 < subtreeIndex) {
     95            if (subtreeIndex < fragment.Index1 + fragmentLength) {
     96              // subtree contained in fragment, index stays the same
     97            } else {
     98              index += node.Content.NodeAt(fragment.Index1).GetLength() - fragmentLength;
     99            }
     100          } else if (subtreeIndex < fragment.Index1) {
     101            if (fragment.Index1 < subtreeIndex + subtreeLength) {
     102              // subtree contains fragment
     103              index = fragment.Index1;
     104            } else {
     105              // index stays the same
     106            }
     107          }
     108
    97109          yield return fragmentNode;
    98           var up = Trace(parents[0], fragment.Index1, fragmentNode);
     110          var up = Trace(node, index, fragmentNode);
    99111          foreach (var v in up) { yield return v; }
    100112          break;
    101113        }
     114        #endregion
    102115
     116        #region crossover tracing
    103117        if (parents.Count == 2) {
    104118          // we are tracing a crossover operation
     
    125139              // subtree contains fragment => bifurcation point in the fragment graph
    126140              var fragmentNode = new FragmentNode {
    127                 Content = new Fragment<ISymbolicExpressionTreeNode> {
    128                   Root = tree.Root,
    129                   Index1 = index,
    130                   Index2 = fragment.Index1
    131                 },
    132                 Rank = node.Rank,
    133                 Quality = node.Quality
     141                Content = node,
     142                SubtreeIndex = index,
     143                FragmentIndex = fragment.Index1
    134144              };
    135145              if (parent != null) {
    136                 var arc = new GenealogyGraphArc(parent, fragmentNode);
     146                var arc = new Arc(parent, fragmentNode);
    137147                parent.AddForwardArc(arc);
    138148                fragmentNode.AddReverseArc(arc);
    139149              }
    140               //              fragmentNode.Content.Index1 = fragment.Index1 - index;
    141150              yield return fragmentNode;
    142151
     
    154163          }
    155164        }
     165        #endregion
    156166      }
    157167    }
Note: See TracChangeset for help on using the changeset viewer.