Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/30/14 01:41:54 (10 years ago)
Author:
bburlacu
Message:

#1772: Worked towards integrating the new graph api with the tracking operators.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking/3.4/GenealogyGraph/GenealogyGraph.cs

    r10903 r11233  
    3232  public class GenealogyGraph : DirectedGraph, IGenealogyGraph {
    3333    [Storable]
     34    private readonly Dictionary<object, IGenealogyGraphNode> contentMap;
     35
     36    [Storable]
     37    private readonly Dictionary<string, IGenealogyGraphNode> idMap;
     38
     39    [Storable]
    3440    private Dictionary<double, List<IGenealogyGraphNode>> ranks; // use a linked list for fast insertion/removal
    3541    public Dictionary<double, List<IGenealogyGraphNode>> Ranks {
     
    3743      set { ranks = value; }
    3844    }
    39     public new IEnumerable<IGenealogyGraphNode> Vertices {
    40       get { return from n in base.Vertices select (IGenealogyGraphNode)n; }
    41     }
    4245
    4346    protected GenealogyGraph(GenealogyGraph original, Cloner cloner)
    4447      : base(original, cloner) {
    4548      Ranks = new Dictionary<double, List<IGenealogyGraphNode>>(original.Ranks);
    46     }
     49      contentMap = new Dictionary<object, IGenealogyGraphNode>(original.contentMap);
     50      idMap = new Dictionary<string, IGenealogyGraphNode>(original.idMap);
     51    }
     52
    4753    public override IDeepCloneable Clone(Cloner cloner) {
    4854      return new GenealogyGraph(this, cloner);
    4955    }
     56
    5057    [StorableConstructor]
    5158    protected GenealogyGraph(bool deserializing) : base(deserializing) { }
    5259    public GenealogyGraph() {
    5360      Ranks = new Dictionary<double, List<IGenealogyGraphNode>>();
     61      contentMap = new Dictionary<object, IGenealogyGraphNode>();
     62      idMap = new Dictionary<string, IGenealogyGraphNode>();
     63    }
     64
     65    public new IEnumerable<IGenealogyGraphNode> Vertices {
     66      get { return from n in base.Vertices select (IGenealogyGraphNode)n; }
    5467    }
    5568
    5669    public override IArc AddArc(IVertex source, IVertex target) {
    5770      var arc = new GenealogyGraphArc((IGenealogyGraphNode)source, (IGenealogyGraphNode)target);
    58       source.AddForwardArc(arc);
    59       target.AddReverseArc(arc);
     71      source.AddArc(arc);
     72      target.AddArc(arc);
    6073      arcs.Add(arc);
    6174      return arc;
     
    6881        Ranks[node.Rank] = new List<IGenealogyGraphNode>();
    6982      Ranks[node.Rank].Add(node);
    70     }
     83
     84      if (contentMap.ContainsKey(node.Content))
     85        throw new InvalidOperationException("Duplicate content is not allowed in the genealogy graph.");
     86      contentMap[node.Content] = node;
     87
     88      if (idMap.ContainsKey(node.Id))
     89        throw new InvalidOperationException("Duplicate content is not allowed in the genealogy graph.");
     90      idMap[node.Id] = node;
     91
     92      vertex.Changed += OnVertexChanged;
     93    }
     94
    7195    public override void RemoveVertex(IVertex vertex) {
    7296      var node = (IGenealogyGraphNode)vertex;
     97      contentMap.Remove(node.Content);
     98      idMap.Remove(node.Id);
    7399      if (Ranks.ContainsKey(node.Rank)) {
    74100        Ranks[node.Rank].Remove(node);
     
    76102      base.RemoveVertex(vertex);
    77103    }
     104
     105    public IGenealogyGraphNode GetByContent(object content) {
     106      IGenealogyGraphNode result;
     107      contentMap.TryGetValue(content, out result);
     108      return result;
     109    }
     110
     111    public IGenealogyGraphNode GetById(string id) {
     112      IGenealogyGraphNode result;
     113      idMap.TryGetValue(id, out result);
     114      return result;
     115    }
     116
     117    public bool Contains(object content) {
     118      return contentMap.ContainsKey(content);
     119    }
     120
    78121    public event EventHandler GraphUpdated;
    79122    private void OnGraphUpdated(object sender, EventArgs args) {
     
    86129      ranks.Clear();
    87130    }
     131
     132    protected override void OnVertexChanged(object sender, EventArgs args) {
     133      base.OnVertexChanged(sender, args);
     134
     135      var vertex = (IGenealogyGraphNode)sender;
     136      if (!contentMap.ContainsKey(vertex.Content)) {
     137        // vertex has received new content
     138      }
     139    }
    88140  }
    89141
     142  //  [StorableClass]
     143  //  [Item("GenealogyGraph", "A class representing a genealogy graph")]
     144  //  public class GenealogyGraph<T> : DirectedGraph, IGenealogyGraph<T> where T : class, IItem {
     145  //    // members and properties
     146  //    [Storable]
     147  //    private Dictionary<double, List<IGenealogyGraphNode>> ranks;
     148  //    public Dictionary<double, List<IGenealogyGraphNode>> Ranks {
     149  //      get { return ranks; }
     150  //      set { ranks = value; }
     151  //    }
     152  //    public new IEnumerable<IGenealogyGraphNode<T>> Vertices {
     153  //      get { return from n in base.Vertices select (IGenealogyGraphNode<T>)n; }
     154  //    }
     155  //    // contructors
     156  //    protected GenealogyGraph(GenealogyGraph<T> original, Cloner cloner)
     157  //      : base(original, cloner) {
     158  //    }
     159  //    public override IDeepCloneable Clone(Cloner cloner) {
     160  //      return new GenealogyGraph<T>(this, cloner);
     161  //    }
     162  //
     163  //    [StorableConstructor]
     164  //    protected GenealogyGraph(bool deserializing) : base(deserializing) { }
     165  //    public GenealogyGraph() {
     166  //      Ranks = new Dictionary<double, List<IGenealogyGraphNode>>();
     167  //    }
     168  //
     169  //    // methods
     170  //    public override void AddVertex(IVertex vertex) {
     171  //      base.AddVertex(vertex);
     172  //      var node = (IGenealogyGraphNode)vertex;
     173  //      if (!Ranks.ContainsKey(node.Rank)) {
     174  //        Ranks[node.Rank] = new List<IGenealogyGraphNode>();
     175  //      }
     176  //      Ranks[node.Rank].Add(node);
     177  //    }
     178  //
     179  //    public override void RemoveVertex(IVertex vertex) {
     180  //      var node = (IGenealogyGraphNode<T>)vertex;
     181  //      if (Ranks.ContainsKey(node.Rank)) {
     182  //        Ranks[node.Rank].Remove(node);
     183  //      }
     184  //      base.RemoveVertex(vertex);
     185  //    }
     186  //
     187  //    public override IArc AddArc(IVertex source, IVertex target) {
     188  //      var arc = new GenealogyGraphArc((IGenealogyGraphNode)source, (IGenealogyGraphNode)target);
     189  //      source.AddArc(arc);
     190  //      target.AddArc(arc);
     191  //      arcs.Add(arc);
     192  //      return arc;
     193  //    }
     194  //
     195  //    IEnumerable<IGenealogyGraphNode> IGenealogyGraph.Vertices {
     196  //      get { return Vertices; }
     197  //    }
     198  //
     199  //    public IGenealogyGraphNode GetByContent(object content)
     200  //    {
     201  //      IGenealogyGraphNode result;
     202  //      contentMap.
     203  //    }
     204  //
     205  //    public event EventHandler GraphUpdated;
     206  //    private void OnGraphUpdated(object sender, EventArgs args) {
     207  //      var updated = GraphUpdated;
     208  //      if (updated != null) updated(sender, args);
     209  //    }
     210  //  }
    90211  [StorableClass]
    91   [Item("GenealogyGraph", "A class representing a genealogy graph")]
    92   public class GenealogyGraph<T> : DirectedGraph, IGenealogyGraph<T> where T : class, IItem {
    93     // members and properties
    94     [Storable]
    95     private Dictionary<double, List<IGenealogyGraphNode>> ranks;
    96     public Dictionary<double, List<IGenealogyGraphNode>> Ranks {
    97       get { return ranks; }
    98       set { ranks = value; }
    99     }
     212
     213  [Item("GenealogyGraph", "A specialization of the genealogy graph with T as content for vertices")]
     214  public class GenealogyGraph<T> : GenealogyGraph, IGenealogyGraph<T> where T : class, IItem {
    100215    public new IEnumerable<IGenealogyGraphNode<T>> Vertices {
    101       get { return from n in base.Vertices select (IGenealogyGraphNode<T>)n; }
    102     }
    103     // contructors
    104     protected GenealogyGraph(GenealogyGraph<T> original, Cloner cloner)
    105       : base(original, cloner) {
    106     }
    107     public override IDeepCloneable Clone(Cloner cloner) {
    108       return new GenealogyGraph<T>(this, cloner);
    109     }
    110     [StorableConstructor]
    111     protected GenealogyGraph(bool deserializing) : base(deserializing) { }
    112     public GenealogyGraph() {
    113       Ranks = new Dictionary<double, List<IGenealogyGraphNode>>();
    114     }
    115     // methods
    116     public override void AddVertex(IVertex vertex) {
    117       base.AddVertex(vertex);
    118       var node = (IGenealogyGraphNode)vertex;
    119       if (!Ranks.ContainsKey(node.Rank)) {
    120         Ranks[node.Rank] = new List<IGenealogyGraphNode>();
    121       }
    122       Ranks[node.Rank].Add(node);
    123     }
    124     public override void RemoveVertex(IVertex vertex) {
    125       var node = (IGenealogyGraphNode<T>)vertex;
    126       if (Ranks.ContainsKey(node.Rank)) {
    127         Ranks[node.Rank].Remove(node);
    128       }
    129       base.RemoveVertex(vertex);
    130     }
    131     public override IArc AddArc(IVertex source, IVertex target) {
    132       var arc = new GenealogyGraphArc((IGenealogyGraphNode)source, (IGenealogyGraphNode)target);
    133       source.AddForwardArc(arc);
    134       target.AddReverseArc(arc);
    135       arcs.Add(arc);
    136       return arc;
    137     }
    138     IEnumerable<IGenealogyGraphNode> IGenealogyGraph.Vertices {
    139       get { return Vertices; }
    140     }
    141     public event EventHandler GraphUpdated;
    142     private void OnGraphUpdated(object sender, EventArgs args) {
    143       var updated = GraphUpdated;
    144       if (updated != null) updated(sender, args);
     216      get { return base.Vertices.Cast<IGenealogyGraphNode<T>>(); }
    145217    }
    146218  }
Note: See TracChangeset for help on using the changeset viewer.