networkx 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 39e75c0ad21604275a008c53a29f282d681f3c50cb7648470cc6e4e2cffa5071
4
- data.tar.gz: 93e93f5a2603beb715b38856518ed47e698c0978c5ff02a737a7baff68357e8c
3
+ metadata.gz: 4bce7e05d9da7dd9774ad976cb82c8de0bd5847be9fb0dfc07af1042568446a9
4
+ data.tar.gz: '085683454ca374c50f594509e13da7c3114131e54936a11f6daf4dd3f4924b29'
5
5
  SHA512:
6
- metadata.gz: 1ce185b8e9246db7b791d4d1800b39d1ad9a5f1036c99899842554c31e2400469d775acd382c2dfc27275857db58e66228062502bffefb16ddca4c3a63b346fe
7
- data.tar.gz: 9b615db49ec2ba5e06bbfecf1710849d079661b301a85493740434eae464bfd74c250c38c31ed2cc5dfb93983cb2c7315fe27452c2f6a243051ac1f80512816b
6
+ metadata.gz: 91cdd246c4692b87a90405676f58a330257ecc02d6cdc9e55c79428afc4d22a9d621fd175d6408e0a7f6aafec50deaa8cd2eb9a0d5ef49360befd5ae8e88dd30
7
+ data.tar.gz: 79bade11b9709a78102bb83d13d77a3abe661fbaf75bdc18dbc5f822e71d6c5ecd53c8b7c46324cf9d6eda1df570f299c77191e8079426c50e4fd5b3f87e7ffd
@@ -5,15 +5,15 @@ module NetworkX
5
5
  #
6
6
  # @return [Array<Array<Object>>] Arrays of nodes in the cliques
7
7
  def self.find_cliques(graph)
8
- return nil if graph.nodes.empty?
8
+ return nil if graph.nodes(data: true).empty?
9
9
 
10
10
  q = [nil]
11
11
  adj = {}
12
- graph.nodes.each_key { |u| adj[u] = [] }
12
+ graph.nodes(data: true).each_key { |u| adj[u] = [] }
13
13
  graph.adj.each { |u, u_edges| u_edges.each_key { |v| adj[u] << v if u != v } }
14
14
 
15
- subg = graph.nodes.keys
16
- cand = graph.nodes.keys
15
+ subg = graph.nodes(data: true).keys
16
+ cand = graph.nodes(data: true).keys
17
17
  u = subg.max { |n1, n2| (cand & adj[n1]).length <=> (cand & adj[n2]).length }
18
18
  ext_u = cand - adj[u]
19
19
  stack = []
@@ -6,7 +6,7 @@ module NetworkX
6
6
  #
7
7
  # @return [Array<Array<Object>>] Arrays of nodes in the cycles
8
8
  def self.cycle_basis(graph, root = nil)
9
- gnodes = graph.nodes.keys
9
+ gnodes = graph.nodes(data: true).keys
10
10
  cycles = []
11
11
  until gnodes.empty?
12
12
  root = gnodes.shift if root.nil?
@@ -34,14 +34,14 @@ module NetworkX
34
34
  raise ArgumentError, 'Topological Sort not defined on undirected graphs!' unless graph.directed?
35
35
 
36
36
  nodes = []
37
- indegree_map = graph.nodes.each_key.map do |u|
37
+ indegree_map = graph.nodes(data: true).each_key.map do |u|
38
38
  [u, graph.in_degree(u)] if graph.in_degree(u).positive?
39
39
  end.compact.to_h
40
- zero_indegree = graph.nodes.each_key.select { |u| graph.in_degree(u).zero? }
40
+ zero_indegree = graph.nodes(data: true).each_key.select { |u| graph.in_degree(u).zero? }
41
41
 
42
42
  until zero_indegree.empty?
43
43
  node = zero_indegree.shift
44
- raise ArgumentError, 'Graph changed during iteration!' unless graph.nodes.has_key?(node)
44
+ raise ArgumentError, 'Graph changed during iteration!' unless graph.nodes(data: true).has_key?(node)
45
45
 
46
46
  graph.adj[node].each_key do |child|
47
47
  indegree_map[child] -= 1
@@ -7,10 +7,10 @@ module NetworkX
7
7
  # @return [Array<Numeric>, Numeric] eccentricity/eccentricites of all nodes
8
8
  def self.eccentricity(graph, node = nil)
9
9
  e = {}
10
- graph.nodes.each do |u, _|
10
+ graph.nodes(data: true).each do |u, _|
11
11
  length = single_source_shortest_path_length(graph, u)
12
12
  l = length.length
13
- raise ArgumentError, 'Found infinite path length!' unless l == graph.nodes.length
13
+ raise ArgumentError, 'Found infinite path length!' unless l == graph.nodes(data: true).length
14
14
 
15
15
  e[u] = length.max_by { |a| a[1] }[1]
16
16
  end
@@ -6,13 +6,15 @@ module NetworkX
6
6
  #
7
7
  # @return [Numeric] radius of the graph
8
8
  def self.maximal_independent_set(graph, nodes)
9
- raise 'The array containing the nodes should be a subset of the graph!' if (graph.nodes.keys - nodes).empty?
9
+ if (graph.nodes(data: true).keys - nodes).empty?
10
+ raise 'The array containing the nodes should be a subset of the graph!'
11
+ end
10
12
 
11
13
  neighbours = []
12
14
  nodes.each { |u| graph.adj[u].each { |v, _| neighbours |= [v] } }
13
15
  raise 'Nodes is not an independent set of graph!' if (neighbours - nodes).empty?
14
16
 
15
- available_nodes = graph.nodes.keys - (neighbours | nodes)
17
+ available_nodes = graph.nodes(data: true).keys - (neighbours | nodes)
16
18
  until available_nodes.empty?
17
19
  node = available_nodes.sample
18
20
  nodes << node
@@ -20,8 +20,8 @@ module NetworkX
20
20
  mst = Marshal.load(Marshal.dump(graph))
21
21
  mst.clear
22
22
  edges = get_edges_weights(graph).sort_by { |a| a[1] }
23
- union_find = UnionFind.new(graph.nodes.keys)
24
- while edges.any? && mst.nodes.length <= graph.nodes.length
23
+ union_find = UnionFind.new(graph.nodes(data: true).keys)
24
+ while edges.any? && mst.nodes(data: true).length <= graph.nodes(data: true).length
25
25
  edge = edges.shift
26
26
  unless union_find.connected?(edge[0][0], edge[0][1])
27
27
  union_find.union(edge[0][0], edge[0][1])
@@ -7,7 +7,7 @@ module NetworkX
7
7
  # @return [Numeric] closeness vitality of the given node
8
8
  def self.closeness_vitality(graph, node)
9
9
  before = wiener_index(graph)
10
- after = wiener_index(graph.subgraph(graph.nodes.keys - [node]))
10
+ after = wiener_index(graph.subgraph(graph.nodes(data: true).keys - [node]))
11
11
  before - after
12
12
  end
13
13
  end
@@ -10,7 +10,7 @@ module NetworkX
10
10
  csv << graph.graph.keys
11
11
  csv << graph.graph.values
12
12
  csv << ['graph_nodes']
13
- graph.nodes.each do |u, attrs|
13
+ graph.nodes(data: true).each do |u, attrs|
14
14
  node_attrs = [u]
15
15
  attrs.each do |k, v|
16
16
  node_attrs << k
@@ -11,7 +11,7 @@ module NetworkX
11
11
  # @return [Boolean] whether there exists a negative cycle in graph
12
12
  def self.negative_edge_cycle(graph)
13
13
  newnode = generate_unique_node
14
- graph.add_edges(graph.nodes.keys.map { |n| [newnode, n] })
14
+ graph.add_edges(graph.nodes(data: true).keys.map { |n| [newnode, n] })
15
15
  begin
16
16
  bellmanford_predecesor_distance(graph, newnode)
17
17
  rescue ArgumentError
@@ -25,10 +25,10 @@ module NetworkX
25
25
  # Detects the unboundedness in the residual graph
26
26
  def self._detect_unboundedness(residual)
27
27
  g = NetworkX::DiGraph.new
28
- g.add_nodes(residual.nodes.keys.zip(residual.nodes.values))
28
+ g.add_nodes(residual.nodes(data: true).keys.zip(residual.nodes(data: true).values))
29
29
  inf = residual.graph[:inf]
30
30
 
31
- residual.nodes.each do |u, _attr|
31
+ residual.nodes(data: true).each do |u, _attr|
32
32
  residual.adj[u].each do |v, uv_attrs|
33
33
  w = inf
34
34
  uv_attrs.each { |_key, edge_attrs| w = [w, edge_attrs[:weight]].min if edge_attrs[:capacity] == inf }
@@ -41,10 +41,10 @@ module NetworkX
41
41
  # Returns the residual graph of the given graph
42
42
  def self._build_residual_network(graph)
43
43
  raise ArgumentError, 'Sum of demands should be 0!' unless \
44
- graph.nodes.values.map { |attr| attr[:demand] || 0 }.inject(0, :+).zero?
44
+ graph.nodes(data: true).values.map { |attr| attr[:demand] || 0 }.inject(0, :+).zero?
45
45
 
46
46
  residual = NetworkX::MultiDiGraph.new(inf: 0)
47
- residual.add_nodes(graph.nodes.map { |u, attr| [u, {excess: (attr[:demand] || 0) * -1, potential: 0}] })
47
+ residual.add_nodes(graph.nodes(data: true).map { |u, attr| [u, {excess: (attr[:demand] || 0) * -1, potential: 0}] })
48
48
  inf = Float::INFINITY
49
49
  edge_list = []
50
50
 
@@ -66,9 +66,11 @@ module NetworkX
66
66
  end
67
67
  end
68
68
 
69
- temp_inf = [residual.nodes.map { |_u, attrs| attrs[:excess].abs }.inject(0, :+), edge_list.map do |_, _, _, e|
70
- (e.has_key?(:capacity) && e[:capacity] != inf ? e[:capacity] : 0)
71
- end.inject(0, :+) * 2].max
69
+ temp_inf = [residual.nodes(data: true).map do |_u, attrs|
70
+ attrs[:excess].abs
71
+ end.inject(0, :+), edge_list.map do |_, _, _, e|
72
+ (e.has_key?(:capacity) && e[:capacity] != inf ? e[:capacity] : 0)
73
+ end.inject(0, :+) * 2].max
72
74
  inf = temp_inf.zero? ? 1 : temp_inf
73
75
 
74
76
  edge_list.each do |u, v, k, e|
@@ -88,7 +90,7 @@ module NetworkX
88
90
  inf = Float::INFINITY
89
91
 
90
92
  if graph.multigraph?
91
- graph.nodes.each_key do |u|
93
+ graph.nodes(data: true).each_key do |u|
92
94
  flow_dict[u] = {}
93
95
  graph.adj[u].each do |v, uv_edges|
94
96
  flow_dict[u][v] = uv_edges.transform_values do |e|
@@ -102,7 +104,7 @@ module NetworkX
102
104
  end
103
105
  end
104
106
  else
105
- graph.nodes.each_key do |u|
107
+ graph.nodes(data: true).each_key do |u|
106
108
  flow_dict[u] = graph.adj[u].to_h do |v, e|
107
109
  [v, u != v || (e[:capacity] || inf) <= 0 || (e[:weight] || 0) >= 0 ? 0 : e[:capacity]]
108
110
  end
@@ -163,7 +165,7 @@ module NetworkX
163
165
  s_set = Set.new
164
166
  t_set = Set.new
165
167
 
166
- residual.nodes.each do |u, _attrs|
168
+ residual.nodes(data: true).each do |u, _attrs|
167
169
  excess = r_nodes[u][:excess]
168
170
  if excess >= delta
169
171
  s_set.add(u)
@@ -236,7 +238,7 @@ module NetworkX
236
238
 
237
239
  r_nodes.each_value { |attrs| raise ArgumentError, 'No flow satisfying all demands!' if attrs[:excess] != 0 }
238
240
 
239
- residual.nodes.each_key do |node|
241
+ residual.nodes(data: true).each_key do |node|
240
242
  residual.adj[node].each_value do |uv_edges|
241
243
  uv_edges.each_value do |k_attrs|
242
244
  flow = k_attrs[:flow]
@@ -84,8 +84,8 @@ module NetworkX
84
84
 
85
85
  # Helper function for the edmondskarp function
86
86
  def self.edmondskarp_impl(graph, source, target, residual, cutoff)
87
- raise ArgumentError, 'Source not in graph!' unless graph.nodes.has_key?(source)
88
- raise ArgumentError, 'Target not in graph!' unless graph.nodes.has_key?(target)
87
+ raise ArgumentError, 'Source not in graph!' unless graph.nodes(data: true).has_key?(source)
88
+ raise ArgumentError, 'Target not in graph!' unless graph.nodes(data: true).has_key?(target)
89
89
  raise ArgumentError, 'Source and target are same node!' if source == target
90
90
 
91
91
  res_graph = residual.nil? ? build_residual_network(graph) : residual.clone
@@ -12,8 +12,8 @@ module NetworkX
12
12
 
13
13
  # Helper function to apply the preflow push algorithm
14
14
  def self.preflowpush_impl(graph, source, target, residual, globalrelabel_freq, value_only)
15
- raise ArgumentError, 'Source not in graph!' unless graph.nodes.has_key?(source)
16
- raise ArgumentError, 'Target not in graph!' unless graph.nodes.has_key?(target)
15
+ raise ArgumentError, 'Source not in graph!' unless graph.nodes(data: true).has_key?(source)
16
+ raise ArgumentError, 'Target not in graph!' unless graph.nodes(data: true).has_key?(target)
17
17
  raise ArgumentError, 'Source and Target are same!' if source == target
18
18
 
19
19
  globalrelabel_freq = 0 if globalrelabel_freq.nil?
@@ -38,7 +38,7 @@ module NetworkX
38
38
  return r_network
39
39
  end
40
40
 
41
- n = r_network.nodes.length
41
+ n = r_network.nodes(data: true).length
42
42
  max_height = heights.map { |u, h| u == source ? -1 : h }.max
43
43
  heights[source] = n
44
44
 
@@ -1,8 +1,8 @@
1
1
  module NetworkX
2
2
  # Helper function for running the shortest augmenting path algorithm
3
3
  def self.shortest_augmenting_path_impl(graph, source, target, residual, two_phase, cutoff)
4
- raise ArgumentError, 'Source is not in the graph!' unless graph.nodes.has_key?(source)
5
- raise ArgumentError, 'Target is not in the graph!' unless graph.nodes.has_key?(target)
4
+ raise ArgumentError, 'Source is not in the graph!' unless graph.nodes(data: true).has_key?(source)
5
+ raise ArgumentError, 'Target is not in the graph!' unless graph.nodes(data: true).has_key?(target)
6
6
  raise ArgumentError, 'Source and Target are the same!' if source == target
7
7
 
8
8
  residual = residual.nil? ? build_residual_network(graph) : residual
@@ -35,7 +35,7 @@ module NetworkX
35
35
  return residual
36
36
  end
37
37
 
38
- n = graph.nodes.length
38
+ n = graph.nodes(data: true).length
39
39
  m = residual.size / 2
40
40
 
41
41
  r_nodes.each do |node, attrs|
@@ -62,7 +62,7 @@ module NetworkX
62
62
  raise NotImplementedError, 'MultiGraph and MultiDiGraph not supported!' if graph.multigraph?
63
63
 
64
64
  r_network = NetworkX::DiGraph.new(inf: 0, flow_value: 0)
65
- r_network.add_nodes(graph.nodes.keys)
65
+ r_network.add_nodes(graph.nodes(data: true).keys)
66
66
  inf = Float::INFINITY
67
67
  edge_list = []
68
68
 
@@ -213,14 +213,13 @@ module NetworkX
213
213
  end
214
214
  end
215
215
 
216
- # [TODO] Current default of `data` is true.
217
- # [Alert] Change the default in the futher. Please specify the `data`.
216
+ # Return nodes of graph
218
217
  #
219
218
  # @param data [bool] true if you want data of each edge
220
219
  #
221
220
  # @return [Hash | Array] if data is true, it returns hash including data.
222
221
  # otherwise, simple nodes array.
223
- def nodes(data: true)
222
+ def nodes(data: false)
224
223
  if data
225
224
  @nodes
226
225
  else
@@ -8,7 +8,7 @@ module NetworkX
8
8
  #
9
9
  # @return [Array<Numeric, Numeric>] hits and authority scores
10
10
  def self.hits(graph, max_iter = 100, tol = 1e-8, nstart)
11
- return [{}, {}] if graph.nodes.empty?
11
+ return [{}, {}] if graph.nodes(data: true).empty?
12
12
 
13
13
  h = nstart
14
14
  sum = h.values.sum
@@ -27,12 +27,12 @@ module NetworkX
27
27
  def self.convert_to_distinct_labels(graph, starting_int = -1)
28
28
  new_graph = graph.class.new
29
29
 
30
- idx_dict = graph.nodes.keys.to_h do |v|
30
+ idx_dict = graph.nodes(data: true).keys.to_h do |v|
31
31
  starting_int += 1
32
32
  [v, starting_int]
33
33
  end
34
34
 
35
- graph.nodes.each do |u, attrs|
35
+ graph.nodes(data: true).each do |u, attrs|
36
36
  new_graph.add_node(u.to_s + idx_dict[u].to_s, **attrs)
37
37
  end
38
38
 
@@ -60,9 +60,12 @@ module NetworkX
60
60
  result = g1.class.new
61
61
 
62
62
  raise ArgumentError, 'Arguments must be both Graphs or MultiGraphs!' unless g1.multigraph? == g2.multigraph?
63
- raise ArgumentError, 'Node sets must be equal!' unless (g1.nodes.keys - g2.nodes.keys).empty?
64
63
 
65
- g1.nodes.each { |u, attrs| result.add_node(u, **attrs) }
64
+ unless (g1.nodes(data: true).keys - g2.nodes(data: true).keys).empty?
65
+ raise ArgumentError, 'Node sets must be equal!'
66
+ end
67
+
68
+ g1.nodes(data: true).each { |u, attrs| result.add_node(u, **attrs) }
66
69
 
67
70
  g1, g2 = g2, g1 if g1.number_of_edges > g2.number_of_edges
68
71
  g1.adj.each do |u, u_edges|
@@ -91,9 +94,12 @@ module NetworkX
91
94
  result = g1.class.new
92
95
 
93
96
  raise ArgumentError, 'Arguments must be both Graphs or MultiGraphs!' unless g1.multigraph? == g2.multigraph?
94
- raise ArgumentError, 'Node sets must be equal!' unless (g1.nodes.keys - g2.nodes.keys).empty?
95
97
 
96
- g1.nodes.each { |u, attrs| result.add_node(u, **attrs) }
98
+ unless (g1.nodes(data: true).keys - g2.nodes(data: true).keys).empty?
99
+ raise ArgumentError, 'Node sets must be equal!'
100
+ end
101
+
102
+ g1.nodes(data: true).each { |u, attrs| result.add_node(u, **attrs) }
97
103
 
98
104
  g1.adj.each do |u, u_edges|
99
105
  u_edges.each do |v, uv_attrs|
@@ -121,9 +127,12 @@ module NetworkX
121
127
  result = g1.class.new
122
128
 
123
129
  raise ArgumentError, 'Arguments must be both Graphs or MultiGraphs!' unless g1.multigraph? == g2.multigraph?
124
- raise ArgumentError, 'Node sets must be equal!' unless (g1.nodes.keys - g2.nodes.keys).empty?
125
130
 
126
- g1.nodes.each { |u, attrs| result.add_node(u, **attrs) }
131
+ unless (g1.nodes(data: true).keys - g2.nodes(data: true).keys).empty?
132
+ raise ArgumentError, 'Node sets must be equal!'
133
+ end
134
+
135
+ g1.nodes(data: true).each { |u, attrs| result.add_node(u, **attrs) }
127
136
 
128
137
  g1.adj.each do |u, u_edges|
129
138
  u_edges.each do |v, uv_attrs|
@@ -166,8 +175,8 @@ module NetworkX
166
175
 
167
176
  raise ArgumentError, 'Arguments must be both Graphs or MultiGraphs!' unless g1.multigraph? == g2.multigraph?
168
177
 
169
- result.add_nodes(g1.nodes.map { |u, attrs| [u, attrs] })
170
- result.add_nodes(g2.nodes.map { |u, attrs| [u, attrs] })
178
+ result.add_nodes(g1.nodes(data: true).map { |u, attrs| [u, attrs] })
179
+ result.add_nodes(g2.nodes(data: true).map { |u, attrs| [u, attrs] })
171
180
 
172
181
  if g1.multigraph?
173
182
  g1.adj.each { |u, e| e.each { |v, uv_edges| uv_edges.each_value { |attrs| result.add_edge(u, v, **attrs) } } }
@@ -192,14 +201,16 @@ module NetworkX
192
201
  new_graph.graph.merge!(g1.graph)
193
202
  new_graph.graph.merge!(g2.graph)
194
203
 
195
- raise ArgumentError, 'Graphs must be disjoint!' unless (g1.nodes.keys & g2.nodes.keys).empty?
204
+ unless (g1.nodes(data: true).keys & g2.nodes(data: true).keys).empty?
205
+ raise ArgumentError, 'Graphs must be disjoint!'
206
+ end
196
207
 
197
208
  g1_edges = get_edges(g1)
198
209
  g2_edges = get_edges(g2)
199
210
 
200
- new_graph.add_nodes(g1.nodes.keys)
211
+ new_graph.add_nodes(g1.nodes(data: true).keys)
201
212
  new_graph.add_edges(g1_edges)
202
- new_graph.add_nodes(g2.nodes.keys)
213
+ new_graph.add_nodes(g2.nodes(data: true).keys)
203
214
  new_graph.add_edges(g2_edges)
204
215
 
205
216
  new_graph
@@ -28,8 +28,8 @@ module NetworkX
28
28
  # Returns the node product of nodes of two graphs
29
29
  def self.node_product(g1, g2)
30
30
  n_product = []
31
- g1.nodes.each do |k1, attrs1|
32
- g2.nodes.each do |k2, attrs2|
31
+ g1.nodes(data: true).each do |k1, attrs1|
32
+ g2.nodes(data: true).each do |k2, attrs2|
33
33
  n_product << [[k1, k2], hash_product(attrs1, attrs2)]
34
34
  end
35
35
  end
@@ -62,7 +62,7 @@ module NetworkX
62
62
  def self.edges_cross_nodes(g1, g2)
63
63
  result = []
64
64
  edges_in_array(g1).each do |u, v, d|
65
- g2.nodes.each_key do |x|
65
+ g2.nodes(data: true).each_key do |x|
66
66
  result << [[u, x], [v, x], d]
67
67
  end
68
68
  end
@@ -72,7 +72,7 @@ module NetworkX
72
72
  # Returns the product of directed nodes with edges
73
73
  def self.nodes_cross_edges(g1, g2)
74
74
  result = []
75
- g1.nodes.each_key do |x|
75
+ g1.nodes(data: true).each_key do |x|
76
76
  edges_in_array(g2).each do |u, v, d|
77
77
  result << [[x, u], [x, v], d]
78
78
  end
@@ -84,8 +84,8 @@ module NetworkX
84
84
  def self.edges_cross_nodes_and_nodes(g1, g2)
85
85
  result = []
86
86
  edges_in_array(g1).each do |u, v, d|
87
- g2.nodes.each_key do |x|
88
- g2.nodes.each_key do |y|
87
+ g2.nodes(data: true).each_key do |x|
88
+ g2.nodes(data: true).each_key do |y|
89
89
  result << [[u, x], [v, y], d]
90
90
  end
91
91
  end
@@ -174,8 +174,8 @@ module NetworkX
174
174
  raise ArgumentError, 'Power must be a positive quantity!' if pow <= 0
175
175
 
176
176
  result = NetworkX::Graph.new
177
- result.add_nodes(graph.nodes.map { |n, attrs| [n, attrs] })
178
- graph.nodes.each do |n, _attrs|
177
+ result.add_nodes(graph.nodes(data: true).map { |n, attrs| [n, attrs] })
178
+ graph.nodes(data: true).each do |n, _attrs|
179
179
  seen = {}
180
180
  level = 1
181
181
  next_level = graph.adj[n]
@@ -8,9 +8,9 @@ module NetworkX
8
8
  result = Marshal.load(Marshal.dump(graph))
9
9
  result.clear
10
10
 
11
- result.add_nodes(graph.nodes.map { |u, attrs| [u, attrs] })
11
+ result.add_nodes(graph.nodes(data: true).map { |u, attrs| [u, attrs] })
12
12
  graph.adj.each do |u, u_edges|
13
- graph.nodes.each { |v, attrs| result.add_edge(u, v, **attrs) if !u_edges.has_key?(v) && u != v }
13
+ graph.nodes(data: true).each { |v, attrs| result.add_edge(u, v, **attrs) if !u_edges.has_key?(v) && u != v }
14
14
  end
15
15
  result
16
16
  end
@@ -7,7 +7,7 @@ module NetworkX
7
7
  # b/w all pairs of nodes
8
8
  def self.floyd_warshall(graph)
9
9
  a, index = to_matrix(graph, Float::INFINITY, 'min')
10
- nodelen = graph.nodes.length
10
+ nodelen = graph.nodes(data: true).length
11
11
  (0..(nodelen - 1)).each { |i| a[i, i] = 0 }
12
12
  (0..(nodelen - 1)).each do |k|
13
13
  (0..(nodelen - 1)).each do |i|
@@ -34,7 +34,7 @@ module NetworkX
34
34
 
35
35
  cutoff = Float::INFINITY if cutoff.nil?
36
36
  nextlevel = {source => 1}
37
- help_single_shortest_path_length(graph.adj, nextlevel, cutoff).take(graph.nodes.length)
37
+ help_single_shortest_path_length(graph.adj, nextlevel, cutoff).take(graph.nodes(data: true).length)
38
38
  end
39
39
 
40
40
  # Computes shortest path values to all nodes from all nodes
@@ -45,7 +45,7 @@ module NetworkX
45
45
  # @return [Array<Object, Array<Object, Numeric>>] path lengths for all nodes from all nodes
46
46
  def self.all_pairs_shortest_path_length(graph, cutoff = nil)
47
47
  shortest_paths = []
48
- graph.nodes.each_key { |n| shortest_paths << [n, single_source_shortest_path_length(graph, n, cutoff)] }
48
+ graph.nodes(data: true).each_key { |n| shortest_paths << [n, single_source_shortest_path_length(graph, n, cutoff)] }
49
49
  shortest_paths
50
50
  end
51
51
 
@@ -93,7 +93,7 @@ module NetworkX
93
93
  # @return [Array<Object, Hash {Object => Array<Object> }>] paths for all nodes from all nodes
94
94
  def self.all_pairs_shortest_path(graph, cutoff = nil)
95
95
  shortest_paths = []
96
- graph.nodes.each_key { |n| shortest_paths << [n, single_source_shortest_path(graph, n, cutoff)] }
96
+ graph.nodes(data: true).each_key { |n| shortest_paths << [n, single_source_shortest_path(graph, n, cutoff)] }
97
97
  shortest_paths
98
98
  end
99
99
 
@@ -188,7 +188,7 @@ module NetworkX
188
188
  # paths and path lengths between all nodes
189
189
  def self.all_pairs_dijkstra(graph, cutoff = nil)
190
190
  path = []
191
- graph.nodes.each_key { |n| path << [n, singlesource_dijkstra(graph, n, nil, cutoff)] }
191
+ graph.nodes(data: true).each_key { |n| path << [n, singlesource_dijkstra(graph, n, nil, cutoff)] }
192
192
  path
193
193
  end
194
194
 
@@ -200,7 +200,7 @@ module NetworkX
200
200
  # @return [Array<Object, Hash{ Object => Numeric }>] path lengths between all nodes
201
201
  def self.all_pairs_dijkstra_path_length(graph, cutoff = nil)
202
202
  path_lengths = []
203
- graph.nodes.each_key { |n| path_lengths << [n, singlesource_dijkstra_path_length(graph, n, cutoff)] }
203
+ graph.nodes(data: true).each_key { |n| path_lengths << [n, singlesource_dijkstra_path_length(graph, n, cutoff)] }
204
204
  path_lengths
205
205
  end
206
206
 
@@ -212,7 +212,7 @@ module NetworkX
212
212
  # @return [Array<Object, Hash{ Object => Array<Object> }>] path lengths between all nodes
213
213
  def self.all_pairs_dijkstra_path(graph, cutoff = nil)
214
214
  paths = []
215
- graph.nodes.each_key { |n| paths << singlesource_dijkstra_path(graph, n, cutoff) }
215
+ graph.nodes(data: true).each_key { |n| paths << singlesource_dijkstra_path(graph, n, cutoff) }
216
216
  paths
217
217
  end
218
218
 
@@ -221,7 +221,7 @@ module NetworkX
221
221
  pred = sources.product([[]]).to_h if pred.nil?
222
222
  dist = sources.product([0]).to_h if dist.nil?
223
223
 
224
- inf, n, count, q, in_q = Float::INFINITY, graph.nodes.length, {}, sources.clone, Set.new(sources)
224
+ inf, n, count, q, in_q = Float::INFINITY, graph.nodes(data: true).length, {}, sources.clone, Set.new(sources)
225
225
  until q.empty?
226
226
  u = q.shift
227
227
  in_q.delete(u)
@@ -281,7 +281,7 @@ module NetworkX
281
281
  # TODO: Detection of selfloop edges
282
282
  dist = {source => 0}
283
283
  pred = {source => []}
284
- return [pred, dist] if graph.nodes.length == 1
284
+ return [pred, dist] if graph.nodes(data: true).length == 1
285
285
 
286
286
  dist = help_bellman_ford(graph, [source], weight, pred, nil, dist, cutoff, target)
287
287
  [pred, dist]
@@ -360,7 +360,7 @@ module NetworkX
360
360
  # @return [Array<Object, Hash{ Object => Numeric }>] path lengths from source to all nodes
361
361
  def self.allpairs_bellmanford_path_length(graph, cutoff = nil)
362
362
  path_lengths = []
363
- graph.nodes.each_key { |n| path_lengths << [n, singlesource_bellmanford_path_length(graph, n, cutoff)] }
363
+ graph.nodes(data: true).each_key { |n| path_lengths << [n, singlesource_bellmanford_path_length(graph, n, cutoff)] }
364
364
  path_lengths
365
365
  end
366
366
 
@@ -372,13 +372,13 @@ module NetworkX
372
372
  # @return [Array<Object, Hash{ Object => Array<Object> }>] path lengths from source to all nodes
373
373
  def self.allpairs_bellmanford_path(graph, cutoff = nil)
374
374
  paths = []
375
- graph.nodes.each_key { |n| paths << [n, singlesource_bellmanford_path(graph, n, cutoff)] }
375
+ graph.nodes(data: true).each_key { |n| paths << [n, singlesource_bellmanford_path(graph, n, cutoff)] }
376
376
  paths
377
377
  end
378
378
 
379
379
  # Helper function to get sources
380
380
  def self.get_sources(graph)
381
- graph.nodes.collect { |k, _v| k }
381
+ graph.nodes(data: true).collect { |k, _v| k }
382
382
  end
383
383
 
384
384
  # Helper function to get distances
@@ -393,7 +393,7 @@ module NetworkX
393
393
  # Helper function to set path lengths for Johnson algorithm
394
394
  def self.set_path_lengths_johnson(graph, dist_path, new_weight)
395
395
  path_lengths = []
396
- graph.nodes.each_key { |n| path_lengths << [n, dist_path.call(graph, n, new_weight)] }
396
+ graph.nodes(data: true).each_key { |n| path_lengths << [n, dist_path.call(graph, n, new_weight)] }
397
397
  path_lengths
398
398
  end
399
399
 
@@ -405,7 +405,7 @@ module NetworkX
405
405
  def self.johnson(graph)
406
406
  dist, pred = {}, {}
407
407
  sources = get_sources(graph)
408
- graph.nodes.each_key do |n|
408
+ graph.nodes(data: true).each_key do |n|
409
409
  dist[n], pred[n] = 0, []
410
410
  end
411
411
  weight = get_weight(graph)
@@ -2,14 +2,14 @@ module NetworkX
2
2
  def self.to_matrix(graph, val, multigraph_weight = 'sum')
3
3
  is_undirected = !graph.directed?
4
4
  is_multigraph = graph.multigraph?
5
- nodelen = graph.nodes.length
5
+ nodelen = graph.nodes(data: true).length
6
6
 
7
7
  m = Matrix.build(nodelen) { val }
8
8
  index = {}
9
9
  inv_index = {}
10
10
  ind = 0
11
11
 
12
- graph.nodes.each do |u, _|
12
+ graph.nodes(data: true).each do |u, _|
13
13
  index[u] = ind
14
14
  inv_index[ind] = u
15
15
  ind += 1
@@ -11,7 +11,7 @@ module NetworkX
11
11
  raise KeyError, "There exists no node names #{source} in the given graph." unless graph.node?(source)
12
12
 
13
13
  depth_limit += 1 if depth_limit
14
- depth_limit = graph.nodes.length if depth_limit.nil?
14
+ depth_limit = graph.nodes(data: true).length if depth_limit.nil?
15
15
  dfs_edges = []
16
16
  visited = [source]
17
17
  stack = [[-1, source, depth_limit, graph.neighbours(source)]]
@@ -1,3 +1,3 @@
1
1
  module NetworkX
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: networkx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Athitya Kumar