diff options
| author | Alon Levy <alon@pobox.com> | 2015-03-24 17:26:03 +0200 |
|---|---|---|
| committer | Alon Levy <alon@pobox.com> | 2015-03-24 17:26:03 +0200 |
| commit | d22f1572941370c3585305d736ef2ee76290a620 (patch) | |
| tree | 5f9287d13ea2bc448d7b93cd9d96733d0a838950 /src/client | |
| parent | 7a6703319e952c56fec630ef80857840c93d700d (diff) | |
client/model/graph: track node degree (O(1) amortized on link and node addition)
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/model/graph.js | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/client/model/graph.js b/src/client/model/graph.js index 6e67cbec..3a6306ef 100644 --- a/src/client/model/graph.js +++ b/src/client/model/graph.js @@ -12,6 +12,7 @@ function Graph(spec) { var id_to_node_map = {}, id_to_link_map = {}, + id_to_link_id_set = {}, diffBus = new Bacon.Bus(), cached_links, invalidate_links, @@ -42,6 +43,15 @@ function Graph(spec) { } } + function key_count(obj) { + return _.keys(obj).length; + } + + var degree = function (node) { + return key_count(id_to_link_id_set[node.id]); + } + this.degree = degree; + /** * add node if no previous node is present whose id equals that of the node being added * @@ -166,25 +176,38 @@ function Graph(spec) { var _node_remove_helper = function (node_id) { util.assert(node_id, "missing node id"); delete id_to_node_map[node_id]; + delete id_to_link_id_set[node_id]; invalidate_nodes = true; } var _node_add_helper = function (node) { util.assert(node.id, "missing node id"); id_to_node_map[node.id] = node; + id_to_link_id_set[node.id] = []; invalidate_nodes = true; } var _link_remove_helper = function (link_id) { + var link = id_to_link_map[link_id], + src_id = link.__src.id, + dst_id = link.__dst.id; + util.assert(link_id, "missing link id"); + util.assert(link, "non existent link"); + delete id_to_link_id_set[src_id][dst_id]; + delete id_to_link_id_set[dst_id][src_id]; delete id_to_link_map[link_id]; util.assert(id_to_link_map[link_id] === undefined, "delete failed?!"); invalidate_links = true; } var _link_add_helper = function (link) { + var src_id = link.__src.id, + dst_id = link.__dst.id; util.assert(link.id, "missing link id"); id_to_link_map[link.id] = link; + id_to_link_id_set[src_id][dst_id] = 1; + id_to_link_id_set[dst_id][src_id] = 1; invalidate_links = true; } |
