Class: NetworkX::DiGraph
Overview
Describes the class for making Directed Graphs
Direct Known Subclasses
Instance Attribute Summary collapse
-
#adj ⇒ Hash{ Object => Hash{ Object => 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{ Object => Object } } }
readonly
Stores the reverse edges and their attributes in an adjencency list form.
Instance Method Summary collapse
-
#add_edge(node_1, node_2, **edge_attrs) ⇒ Object
Adds the respective edge.
-
#add_node(node, **node_attrs) ⇒ Object
Adds a node and its attributes to the graph.
-
#clear ⇒ Object
Clears the graph.
-
#edge_subgraph(edges) ⇒ Object
Returns subgraph consisting of given edges.
-
#in_degree(node) ⇒ Object
Returns in-degree of a given node.
-
#initialize(**graph_attrs) ⇒ DiGraph
constructor
Constructor for initializing graph.
-
#number_of_edges ⇒ Object
Returns number of edges.
-
#out_degree(node) ⇒ Object
Returns out-degree of a given node.
-
#remove_edge(node_1, node_2) ⇒ Object
Removes edge from the graph.
-
#remove_node(node) ⇒ Object
Removes node from the graph.
-
#reverse ⇒ Object
Returns the reversed version of the graph.
-
#size(is_weighted = false) ⇒ Object
Returns the size of graph.
-
#subgraph(nodes) ⇒ Object
Returns subgraph consisting of given array of nodes.
-
#to_undirected ⇒ Object
Returns the undirected version of the graph.
Methods inherited from Graph
#add_edges, #add_nodes, #add_weighted_edge, #add_weighted_edges, #directed?, #edge?, #get_edge_data, #get_node_data, #multigraph?, #neighbours, #node?, #number_of_nodes, #remove_edges, #remove_nodes
Constructor Details
#initialize(**graph_attrs) ⇒ DiGraph
Constructor for initializing graph
19 20 21 22 23 |
# File 'lib/networkx/digraph.rb', line 19 def initialize(**graph_attrs) super(graph_attrs) @pred = {} end |
Instance Attribute Details
#adj ⇒ Hash{ Object => Hash{ Object => Hash{ Object => Object } } } (readonly)
Stores the edges and their attributes in an adjencency list form
10 11 12 |
# File 'lib/networkx/digraph.rb', line 10 def adj @adj end |
#graph ⇒ Hash{ Object => Object } (readonly)
Stores the attributes of the graph
10 11 12 |
# File 'lib/networkx/digraph.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/digraph.rb', line 10 def nodes @nodes end |
#pred ⇒ Hash{ Object => Hash{ Object => Hash{ Object => Object } } } (readonly)
Stores the reverse edges and their attributes in an adjencency list form
10 11 12 |
# File 'lib/networkx/digraph.rb', line 10 def pred @pred end |
Instance Method Details
#add_edge(node_1, node_2, **edge_attrs) ⇒ Object
Adds the respective edge
36 37 38 39 40 41 42 43 |
# File 'lib/networkx/digraph.rb', line 36 def add_edge(node_1, node_2, **edge_attrs) add_node(node_1) add_node(node_2) edge_attrs = (@adj[node_1][node_2] || {}).merge(edge_attrs) @adj[node_1][node_2] = edge_attrs @pred[node_2][node_1] = edge_attrs end |
#add_node(node, **node_attrs) ⇒ Object
Adds a node and its attributes to the graph
52 53 54 55 56 |
# File 'lib/networkx/digraph.rb', line 52 def add_node(node, **node_attrs) super(node, node_attrs) @pred[node] = {} unless @pred.key?(node) end |
#clear ⇒ Object
Clears the graph
98 99 100 101 102 |
# File 'lib/networkx/digraph.rb', line 98 def clear super @pred.clear end |
#edge_subgraph(edges) ⇒ Object
Returns subgraph consisting of given edges
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/networkx/digraph.rb', line 210 def edge_subgraph(edges) case edges when Array, Set sub_graph = NetworkX::DiGraph.new(@graph) edges.each do |u, v| raise KeyError, "Edge between #{u} and #{v} does not exist in the graph!" unless @nodes.key?(u)\ && @adj[u].key?(v) sub_graph.add_node(u, @nodes[u]) sub_graph.add_node(v, @nodes[v]) sub_graph.add_edge(u, v, @adj[u][v]) end return sub_graph else raise ArgumentError, 'Expected Argument to be Array or Set of edges, '\ "received #{edges.class.name} instead." end end |
#in_degree(node) ⇒ Object
Returns in-degree of a given node
136 137 138 |
# File 'lib/networkx/digraph.rb', line 136 def in_degree(node) @pred[node].length end |
#number_of_edges ⇒ Object
Returns number of edges
108 109 110 |
# File 'lib/networkx/digraph.rb', line 108 def number_of_edges @adj.values.map(&:length).inject(:+) end |
#out_degree(node) ⇒ Object
Returns out-degree of a given node
146 147 148 |
# File 'lib/networkx/digraph.rb', line 146 def out_degree(node) @adj[node].length end |
#remove_edge(node_1, node_2) ⇒ Object
Removes edge from the graph
85 86 87 88 89 90 91 92 |
# File 'lib/networkx/digraph.rb', line 85 def remove_edge(node_1, node_2) raise KeyError, "#{node_1} is not a valid node." unless @nodes.key?(node_1) raise KeyError, "#{node_2} is not a valid node" unless @nodes.key?(node_2) raise KeyError, 'The given edge is not a valid one.' unless @adj[node_1].key?(node_2) @adj[node_1].delete(node_2) @pred[node_2].delete(node_1) end |
#remove_node(node) ⇒ Object
Removes node from the graph
64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/networkx/digraph.rb', line 64 def remove_node(node) raise KeyError, "Error in deleting node #{node} from Graph." unless @nodes.key?(node) neighbours = @adj[node] neighbours.each_key { |k| @pred[k].delete(node) } @pred[node].each_key do |k| @adj[k].delete(node) end @pred.delete(node) @adj.delete(node) @nodes.delete(node) end |
#reverse ⇒ Object
Returns the reversed version of the graph
154 155 156 157 158 159 160 161 |
# File 'lib/networkx/digraph.rb', line 154 def reverse new_graph = NetworkX::DiGraph.new(@graph) @nodes.each { |u, attrs| new_graph.add_node(u, attrs) } @adj.each do |u, edges| edges.each { |v, attrs| new_graph.add_edge(v, u, attrs) } end new_graph end |
#size(is_weighted = false) ⇒ Object
Returns the size of graph
119 120 121 122 123 124 125 126 127 128 |
# File 'lib/networkx/digraph.rb', line 119 def size(is_weighted=false) if is_weighted graph_size = 0 @adj.each do |_, hash_val| hash_val.each { |_, v| graph_size += v[:weight] if v.key?(:weight) } end return graph_size end number_of_edges end |
#subgraph(nodes) ⇒ Object
Returns subgraph consisting of given array of nodes
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/networkx/digraph.rb', line 184 def subgraph(nodes) case nodes when Array, Set sub_graph = NetworkX::DiGraph.new(@graph) nodes.each do |u| raise KeyError, "#{u} does not exist in the current graph!" unless node?(u) sub_graph.add_node(u, @nodes[u]) @adj[u].each do |v, uv_attrs| sub_graph.add_edge(u, v, uv_attrs) if @adj[u].key?(v) && nodes.include?(v) end return sub_graph end else raise ArgumentError, 'Expected Argument to be Array or Set of nodes, '\ "received #{nodes.class.name} instead." end end |
#to_undirected ⇒ Object
Returns the undirected version of the graph
167 168 169 170 171 172 173 174 |
# File 'lib/networkx/digraph.rb', line 167 def to_undirected new_graph = NetworkX::Graph.new(@graph) @nodes.each { |u, attrs| new_graph.add_node(u, attrs) } @adj.each do |u, edges| edges.each { |v, attrs| new_graph.add_edge(u, v, attrs) } end new_graph end |