Class: Networkr::MultiGraph
- Defined in:
- lib/networkr/graphs/multigraph.rb
Overview
Class for undirected graphs that can store parallel edges.
A MultiGraph holds undirected edges. Self loops are allowed.
See Also
Graph DiGraph
Instance Attribute Summary
Attributes inherited from Graph
Instance Method Summary collapse
- #add_edge(u, v, key = nil, options = {}) ⇒ Object
- #is_multigraph? ⇒ Boolean
-
#new_edge_key(u, v) ⇒ Object
returns an unused key for edges between nodes ‘u’ and ‘v’.
- #remove_edge(u, v, key = nil) ⇒ Object
Methods inherited from Graph
#add_node, #children_of, #clear, #deep_copy, #has_edge?, #has_node?, #initialize, #is_directed?, #length, #remove_node, #to_s
Constructor Details
This class inherits a constructor from Networkr::Graph
Instance Method Details
#add_edge(u, v, key = nil, options = {}) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/networkr/graphs/multigraph.rb', line 41 def add_edge(u, v, key=nil, ={}) if !@adj.include?(u) @adj[u] = {} @nodes[u] = {} end if !@adj.include?(v) @adj[v] = {} @nodes[v] = {} end if !key key = new_edge_key(u, v) end if @adj[u].include?(v) keys = @adj[u][v] data = keys[key] || {} data.merge!() keys[key] = data else data = keys = {} keys[key] = data @adj[u][v] = keys @adj[v][u] = keys end key end |
#is_multigraph? ⇒ Boolean
91 92 93 |
# File 'lib/networkr/graphs/multigraph.rb', line 91 def is_multigraph? true end |
#new_edge_key(u, v) ⇒ Object
returns an unused key for edges between nodes ‘u’ and ‘v’.
The nodes ‘u’ and ‘v’ do not need to be already in the graph.
Notes
The new key is the number of existing edges between ‘u’ and ‘v’, increased if necessary to ensure uniqueness. The first edge will have key 0, the second edge 1, etc. If an edge is removed, new keys may not be in this order.
Parameters
u, v: nodes
Returns
key: int
28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/networkr/graphs/multigraph.rb', line 28 def new_edge_key(u, v) if @adj[u] && @adj[u][v] keys = @adj[u][v] key = keys.length while keys.include?(key) key += 1 end return key else return 0 end end |
#remove_edge(u, v, key = nil) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/networkr/graphs/multigraph.rb', line 68 def remove_edge(u, v, key=nil) keys = @adj[u][v] if keys if !key keys.shift else if keys[key] keys.delete(key) else raise NetworkrError, "Edge #{u}-#{v} with key #{key} not in graph" end end if keys.length == 0 @adj[v].delete(v) if u != v @adj[v].delete(u) end end else raise NetworkrError, "Edge #{u}-#{v} not in graph" end end |