Class: NetworkX::MultiDiGraph
- Defined in:
- lib/networkx/multidigraph.rb
Overview
Describes the class for making MultiDiGraphs
Instance Attribute Summary collapse
-
#adj ⇒ Hash{ Object => Hash{ Object => Hash{ Integer => Hash{ Object => Object } } } }
readonly
Stores the edges and their attributes in an adjencency list form.
-
#graph ⇒ Hash{ Object => Object }
readonly
Stores the attributes of the graph.
-
#nodes ⇒ Hash{ Object => Hash{ Object => Object } }
readonly
Stores the nodes and their attributes.
-
#pred ⇒ Hash{ Object => Hash{ Object => Hash{ Integer => Hash{ Object => Object } } } }
readonly
Stores the reverse edges and their attributes in an adjencency list form.
Instance Method Summary collapse
-
#add_edge(node1, node2, **edge_attrs) ⇒ Object
Adds the respective edge.
-
#edge?(node1, node2, key = nil) ⇒ Boolean
Checks if the the edge consisting of two nodes is present in the graph.
-
#edge_subgraph(edges) ⇒ Object
Returns subgraph conisting of given edges.
- #has_edge?(node1, node2, key = nil) ⇒ Boolean
-
#in_degree(node) ⇒ Object
Returns in-degree of a given node.
- #multigraph? ⇒ Boolean
-
#new_edge_key(node1, node2) ⇒ Object
Returns a new key.
-
#number_of_edges ⇒ Object
Returns number of edges.
-
#out_degree(node) ⇒ Object
Returns out-degree of a given node.
-
#remove_edge(node1, node2, key = nil) ⇒ Object
Removes edge from the graph.
-
#reverse ⇒ Object
Returns the reversed version of the graph.
-
#size(is_weighted = false) ⇒ Object
Returns the size of the graph.
-
#subgraph(nodes) ⇒ Object
Returns subgraph consisting of given array of nodes.
-
#to_directed ⇒ Object
Returns the directed version of the graph.
-
#to_multigraph ⇒ Object
Returns the multigraph version of the graph.
-
#to_undirected ⇒ Object
Returns the undirected version of the graph.
Methods inherited from DiGraph
#add_node, #clear, #directed?, #initialize, #remove_node
Methods inherited from Graph
#add_edges, #add_edges_from, #add_node, #add_nodes, #add_nodes_from, #add_path, #add_weighted_edge, #add_weighted_edges, #add_weighted_edges_from, balanced_tree, barbell_graph, #bfs_edges, #bfs_nodes, bull_graph, circular_ladder_graph, #clear, complete_edges, complete_graph, cubical_graph, cycle_graph, #degree, #dfs_edges, #dfs_postorder_nodes, #dfs_preorder_nodes, diamond_graph, #directed?, dodecahedral_graph, #each_bfs_edge, #each_bfs_node, #each_dfs_edge, #each_dfs_postorder_node, #each_dfs_preorder_node, #each_edge, #each_node, #edges, empty_graph, #get_edge_data, #get_node_data, heawood_graph, house_graph, house_x_graph, #info, #initialize, ladder_graph, lollipop_graph, moebius_kantor_graph, #neighbours, #node?, null_graph, #number_of_nodes, octahedral_graph, path_graph, #put_graph_x2, read_edgelist, read_weighted_edgelist, #remove_edges, #remove_node, #remove_nodes, star_graph, tetrahedral_graph, trivial_graph, wheel_graph
Constructor Details
This class inherits a constructor from NetworkX::DiGraph
Instance Attribute Details
#adj ⇒ Hash{ Object => Hash{ Object => Hash{ Integer => Hash{ Object => Object } } } } (readonly)
Stores the edges and their attributes in an adjencency list form
10 11 12 |
# File 'lib/networkx/multidigraph.rb', line 10 def adj @adj end |
#graph ⇒ Hash{ Object => Object } (readonly)
Stores the attributes of the graph
10 11 12 |
# File 'lib/networkx/multidigraph.rb', line 10 def graph @graph end |
#nodes ⇒ Hash{ Object => Hash{ Object => Object } } (readonly)
Stores the nodes and their attributes
10 11 12 |
# File 'lib/networkx/multidigraph.rb', line 10 def nodes @nodes end |
#pred ⇒ Hash{ Object => Hash{ Object => Hash{ Integer => Hash{ Object => Object } } } } (readonly)
Stores the reverse edges and their attributes in an adjencency list form
10 11 12 |
# File 'lib/networkx/multidigraph.rb', line 10 def pred @pred end |
Instance Method Details
#add_edge(node1, node2, **edge_attrs) ⇒ Object
Adds the respective edge
34 35 36 37 38 39 40 41 42 |
# File 'lib/networkx/multidigraph.rb', line 34 def add_edge(node1, node2, **edge_attrs) add_node(node1) add_node(node2) key = new_edge_key(node1, node2) all_edge_attrs = @adj[node1][node2] || {} all_edge_attrs[key] = edge_attrs @adj[node1][node2] = all_edge_attrs @pred[node2][node1] = all_edge_attrs end |
#edge?(node1, node2, key = nil) ⇒ Boolean
Checks if the the edge consisting of two nodes is present in the graph
73 74 75 76 77 |
# File 'lib/networkx/multidigraph.rb', line 73 def edge?(node1, node2, key = nil) return super(node1, node2) if key.nil? node?(node1) && @adj[node1].has_key?(node2) && @adj[node1][node2].has_key?(key) end |
#edge_subgraph(edges) ⇒ Object
Returns subgraph conisting of given edges
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 |
# File 'lib/networkx/multidigraph.rb', line 226 def edge_subgraph(edges) case edges when Array, Set sub_graph = NetworkX::MultiDiGraph.new(**@graph) edges.each do |u, v| raise KeyError, "Edge between #{u} and #{v} does not exist in the graph!" unless @nodes.has_key?(u) \ && @adj[u].has_key?(v) sub_graph.add_node(u, **@nodes[u]) sub_graph.add_node(v, **@nodes[v]) @adj[u][v].each { |_, keyval| sub_graph.add_edge(u, v, **keyval) } end sub_graph else raise ArgumentError, 'Expected Argument to be Array or Set of edges, ' \ "received #{edges.class.name} instead." end end |
#has_edge?(node1, node2, key = nil) ⇒ Boolean
79 80 81 82 83 84 85 |
# File 'lib/networkx/multidigraph.rb', line 79 def has_edge?(node1, node2, key = nil) return super(node1, node2) if key.nil? return false unless node?(node1) && @adj[node1].has_key?(node2) @adj[node1][node2].any? { |_index, data| data[:key] == key } end |
#in_degree(node) ⇒ Object
Returns in-degree of a given node
155 156 157 |
# File 'lib/networkx/multidigraph.rb', line 155 def in_degree(node) @pred[node].values.map(&:length).sum end |
#multigraph? ⇒ Boolean
245 246 247 |
# File 'lib/networkx/multidigraph.rb', line 245 def multigraph? true end |
#new_edge_key(node1, node2) ⇒ Object
Returns a new key
15 16 17 18 19 20 21 |
# File 'lib/networkx/multidigraph.rb', line 15 def new_edge_key(node1, node2) return 0 if @adj[node1][node2].nil? key = @adj[node1][node2].length key += 1 while @adj[node1][node2].has_key?(key) key end |
#number_of_edges ⇒ Object
Returns number of edges
173 174 175 |
# File 'lib/networkx/multidigraph.rb', line 173 def number_of_edges @adj.values.flat_map(&:values).map(&:length).sum end |
#out_degree(node) ⇒ Object
Returns out-degree of a given node
165 166 167 |
# File 'lib/networkx/multidigraph.rb', line 165 def out_degree(node) @adj[node].values.map(&:length).sum end |
#remove_edge(node1, node2, key = nil) ⇒ Object
Removes edge from the graph
51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/networkx/multidigraph.rb', line 51 def remove_edge(node1, node2, key = nil) return super(node1, node2) if key.nil? raise KeyError, "#{node1} is not a valid node." unless @nodes.has_key?(node1) raise KeyError, "#{node2} is not a valid node" unless @nodes.has_key?(node2) raise KeyError, 'The given edge is not a valid one.' unless @adj[node1].has_key?(node2) if @adj[node1][node2].none? { |_index, data| data[:key] == key } raise KeyError, 'The given edge is not a valid one' end @adj[node1][node2].delete_if { |_indx, data| data[:key] == key } @pred[node2][node1].delete_if { |_indx, data| data[:key] == key } end |
#reverse ⇒ Object
Returns the reversed version of the graph
140 141 142 143 144 145 146 147 |
# File 'lib/networkx/multidigraph.rb', line 140 def reverse new_graph = NetworkX::MultiDiGraph.new(**@graph) @nodes.each { |node, attrs| new_graph.add_node(node, **attrs) } @adj.each do |u, u_edges| u_edges.each { |v, uv_attrs| uv_attrs.each { |_k, edge_attrs| new_graph.add_edge(v, u, **edge_attrs) } } end new_graph end |
#size(is_weighted = false) ⇒ Object
Returns the size of the graph
184 185 186 187 188 189 190 191 192 193 |
# File 'lib/networkx/multidigraph.rb', line 184 def size(is_weighted = false) if is_weighted graph_size = 0 @adj.each do |_, hash_val| hash_val.each { |_, v| v.each { |_, attrs| graph_size += attrs[:weight] if attrs.has_key?(:weight) } } end return graph_size end number_of_edges end |
#subgraph(nodes) ⇒ Object
Returns subgraph consisting of given array of nodes
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'lib/networkx/multidigraph.rb', line 201 def subgraph(nodes) case nodes when Array, Set sub_graph = NetworkX::MultiDiGraph.new(**@graph) nodes.each do |u, _| raise KeyError, "#{u} does not exist in the current graph!" unless @nodes.has_key?(u) sub_graph.add_node(u, **@nodes[u]) @adj[u].each do |v, edge_val| edge_val.each { |_, keyval| sub_graph.add_edge(u, v, **keyval) if @adj[u].has_key?(v) && nodes.include?(v) } end end sub_graph else raise ArgumentError, 'Expected Argument to be Array or Set of nodes, ' \ "received #{nodes.class.name} instead." end end |
#to_directed ⇒ Object
Returns the directed version of the graph
108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/networkx/multidigraph.rb', line 108 def to_directed graph = NetworkX::DiGraph.new(**@graph) @nodes.each { |node, node_attr| graph.add_node(node, **node_attr) } @adj.each do |node1, node1_edges| node1_edges.each do |node2, node1_node2| edge_attrs = {} node1_node2.each { |_key, attrs| edge_attrs.merge!(attrs) } graph.add_edge(node1, node2, **edge_attrs) end end graph end |
#to_multigraph ⇒ Object
Returns the multigraph version of the graph
125 126 127 128 129 130 131 132 133 134 |
# File 'lib/networkx/multidigraph.rb', line 125 def to_multigraph graph = NetworkX::MultiGraph.new(**@graph) @nodes.each { |node, node_attr| graph.add_node(node, **node_attr) } @adj.each do |node1, node2_edges| node2_edges.each do |node2, edges| edges.each { |_key, attrs| graph.add_edge(node1, node2, **attrs) } end end graph end |
#to_undirected ⇒ Object
Returns the undirected version of the graph
91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/networkx/multidigraph.rb', line 91 def to_undirected graph = NetworkX::Graph.new(**@graph) @nodes.each { |node, node_attr| graph.add_node(node, **node_attr) } @adj.each do |node1, node1_edges| node1_edges.each do |node2, node1_node2| edge_attrs = {} node1_node2.each { |_key, attrs| edge_attrs.merge!(attrs) } graph.add_edge(node1, node2, **edge_attrs) end end graph end |