rgl 0.5.9 → 0.5.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +2 -2
  3. data/README.md +11 -11
  4. data/examples/canvas.rb +1 -1
  5. data/examples/graph.dot +971 -0
  6. data/examples/insel_der_tausend_gefahren.rb +1 -1
  7. data/examples/north/g.10.0.graphml +1 -1
  8. data/examples/north/g.10.1.graphml +1 -1
  9. data/examples/north/g.10.11.graphml +1 -1
  10. data/examples/north/g.10.12.graphml +1 -1
  11. data/examples/north/g.10.13.graphml +1 -1
  12. data/examples/north/g.10.14.graphml +1 -1
  13. data/examples/north/g.10.15.graphml +1 -1
  14. data/examples/north/g.10.16.graphml +1 -1
  15. data/examples/north/g.10.17.graphml +1 -1
  16. data/examples/north/g.10.19.graphml +1 -1
  17. data/examples/north/g.10.2.graphml +1 -1
  18. data/examples/north/g.10.20.graphml +1 -1
  19. data/examples/north/g.10.22.graphml +1 -1
  20. data/examples/north/g.10.24.graphml +1 -1
  21. data/examples/north/g.10.25.graphml +1 -1
  22. data/examples/north/g.10.27.graphml +1 -1
  23. data/examples/north/g.10.28.graphml +1 -1
  24. data/examples/north/g.10.29.graphml +1 -1
  25. data/examples/north/g.10.3.graphml +1 -1
  26. data/examples/north/g.10.30.graphml +1 -1
  27. data/examples/north/g.10.31.graphml +1 -1
  28. data/examples/north/g.10.34.graphml +1 -1
  29. data/examples/north/g.10.37.graphml +1 -1
  30. data/examples/north/g.10.38.graphml +1 -1
  31. data/examples/north/g.10.39.graphml +1 -1
  32. data/examples/north/g.10.4.graphml +1 -1
  33. data/examples/north/g.10.40.graphml +1 -1
  34. data/examples/north/g.10.41.graphml +1 -1
  35. data/examples/north/g.10.42.graphml +1 -1
  36. data/examples/north/g.10.45.graphml +1 -1
  37. data/examples/north/g.10.46.graphml +1 -1
  38. data/examples/north/g.10.5.graphml +1 -1
  39. data/examples/north/g.10.50.graphml +1 -1
  40. data/examples/north/g.10.56.graphml +1 -1
  41. data/examples/north/g.10.57.graphml +1 -1
  42. data/examples/north/g.10.58.graphml +1 -1
  43. data/examples/north/g.10.6.graphml +1 -1
  44. data/examples/north/g.10.60.graphml +1 -1
  45. data/examples/north/g.10.61.graphml +1 -1
  46. data/examples/north/g.10.62.graphml +1 -1
  47. data/examples/north/g.10.68.graphml +1 -1
  48. data/examples/north/g.10.69.graphml +1 -1
  49. data/examples/north/g.10.7.graphml +1 -1
  50. data/examples/north/g.10.70.graphml +1 -1
  51. data/examples/north/g.10.71.graphml +1 -1
  52. data/examples/north/g.10.72.graphml +1 -1
  53. data/examples/north/g.10.74.graphml +1 -1
  54. data/examples/north/g.10.75.graphml +1 -1
  55. data/examples/north/g.10.78.graphml +1 -1
  56. data/examples/north/g.10.79.graphml +1 -1
  57. data/examples/north/g.10.8.graphml +1 -1
  58. data/examples/north/g.10.80.graphml +1 -1
  59. data/examples/north/g.10.82.graphml +1 -1
  60. data/examples/north/g.10.83.graphml +1 -1
  61. data/examples/north/g.10.85.graphml +1 -1
  62. data/examples/north/g.10.86.graphml +1 -1
  63. data/examples/north/g.10.88.graphml +1 -1
  64. data/examples/north/g.10.89.graphml +1 -1
  65. data/examples/north/g.10.9.graphml +1 -1
  66. data/examples/north/g.10.90.graphml +1 -1
  67. data/examples/north/g.10.91.graphml +1 -1
  68. data/examples/north/g.10.92.graphml +1 -1
  69. data/examples/north/g.10.93.graphml +1 -1
  70. data/examples/north/g.10.94.graphml +1 -1
  71. data/examples/north/g.12.8.graphml +1 -1
  72. data/examples/north/g.14.9.graphml +1 -1
  73. data/examples/north.rb +1 -1
  74. data/examples/rdep-rgl.rb +3 -3
  75. data/lib/rgl/adjacency.rb +43 -51
  76. data/lib/rgl/base.rb +71 -60
  77. data/lib/rgl/bellman_ford.rb +4 -3
  78. data/lib/rgl/bidirectional.rb +2 -2
  79. data/lib/rgl/bipartite.rb +1 -1
  80. data/lib/rgl/condensation.rb +3 -3
  81. data/lib/rgl/connected_components.rb +6 -6
  82. data/lib/rgl/dot.rb +5 -7
  83. data/lib/rgl/edmonds_karp.rb +7 -2
  84. data/lib/rgl/graph_iterator.rb +4 -2
  85. data/lib/rgl/graph_visitor.rb +16 -14
  86. data/lib/rgl/graph_wrapper.rb +3 -2
  87. data/lib/rgl/graphxml.rb +4 -4
  88. data/lib/rgl/implicit.rb +35 -35
  89. data/lib/rgl/mutable.rb +7 -7
  90. data/lib/rgl/path_builder.rb +3 -2
  91. data/lib/rgl/prim.rb +3 -1
  92. data/lib/rgl/rdot.rb +7 -7
  93. data/lib/rgl/topsort.rb +8 -7
  94. data/lib/rgl/transitivity.rb +6 -6
  95. data/lib/rgl/traversal.rb +47 -47
  96. data/test/traversal_test.rb +1 -1
  97. metadata +4 -3
data/lib/rgl/traversal.rb CHANGED
@@ -1,41 +1,45 @@
1
1
  # traversal.rb
2
2
  #
3
- # This file defines the basic graph traversal algorithm for DFS and BFS search.
4
- # They are implemented as an RGL::GraphIterator, which is a Stream of vertices
5
- # of a given graph. The streams are not reversable.
6
- #
7
- # Beside being an iterator in the sense of the Stream mixin, RGL::BFSIterator
8
- # and RGL::DFSIterator follow the BGL
9
- # Visitor[http://www.boost.org/libs/graph/doc/visitor_concepts.html] Concepts
10
- # in a slightly modified fashion (especially for the RGL::DFSIterator).
11
-
12
3
  require 'rgl/base'
13
4
  require 'rgl/graph_visitor'
14
5
  require 'rgl/graph_iterator'
15
6
 
16
7
  module RGL
17
8
 
18
- # A BFSIterator can be used to traverse a graph from a given start vertex in
19
- # breath first search order. Since the Iterator also mixins the GraphVisitor,
9
+ # File +traversal.rb+ defines the basic graph traversal algorithm for DFS and
10
+ # BFS search. They are implemented as a {GraphIterator}, which is a +Stream+
11
+ # of vertices of a given graph. The streams are not reversable.
12
+ #
13
+ # Beside being an iterator in the sense of the Stream mixin, {BFSIterator} and
14
+ # {DFSIterator} follow the
15
+ # {https://www.boost.org/libs/graph/doc/visitor_concepts.html BGL Visitor
16
+ # Concepts} in a slightly modified fashion (especially for the
17
+ # {DFSIterator}).
18
+ #
19
+ # A {BFSIterator} can be used to traverse a graph from a given start vertex in
20
+ # breath first search order. Since the iterator also mixins the {GraphVisitor},
20
21
  # it provides all event points defined there.
21
22
  #
22
- # The vertices which are not yet visited are held in the queue @waiting.
23
+ # The vertices which are not yet visited are held in the queue +@waiting+.
23
24
  # During the traversal, vertices are *colored* using the colors :GRAY
24
25
  # (when waiting) and :BLACK when finished. All other vertices are :WHITE.
25
26
  #
26
- # For more doc see the BGL
27
- # BFS[http://www.boost.org/libs/graph/doc/BFSVisitor.html] Visitor Concept .
27
+ # For more see the BGL {BFS Visitor
28
+ # Concept}[https://www.boost.org/libs/graph/doc/BFSVisitor.html].
28
29
  #
29
- # See the implementation of bfs_search_tree_from for an example usage.
30
+ # See the implementation of {Graph#bfs_search_tree_from} for an example usage.
30
31
  #
32
+ # @see Graph#bfs_iterator
33
+ # @see Graph#bfs_search_tree_from
31
34
  class BFSIterator
32
35
 
33
36
  include GraphIterator
34
37
  include GraphVisitor
35
38
 
39
+ # @return the vertex where the search starts
36
40
  attr_accessor :start_vertex
37
41
 
38
- # Create a new BFSIterator on _graph_, starting at vertex _start_.
42
+ # Create a new {BFSIterator} on _graph_, starting at vertex _start_.
39
43
  #
40
44
  def initialize(graph, start = graph.detect { |x| true })
41
45
  super(graph)
@@ -43,9 +47,9 @@ module RGL
43
47
  set_to_begin
44
48
  end
45
49
 
46
- # Returns true if the @color_map has only one entry (for the start vertex).
50
+ # Returns true if +@color_map+ has only one entry (for the start vertex).
47
51
  #
48
- def at_beginning? # :nodoc:
52
+ def at_beginning?
49
53
  @color_map.size == 1
50
54
  end
51
55
 
@@ -66,7 +70,8 @@ module RGL
66
70
  self
67
71
  end
68
72
 
69
- def basic_forward # :nodoc:
73
+ # @private
74
+ def basic_forward
70
75
  u = next_vertex
71
76
  handle_examine_vertex(u)
72
77
 
@@ -92,7 +97,7 @@ module RGL
92
97
 
93
98
  protected
94
99
 
95
- def next_vertex # :nodoc:
100
+ def next_vertex
96
101
  # waiting is a queue
97
102
  @waiting.shift
98
103
  end
@@ -101,16 +106,15 @@ module RGL
101
106
 
102
107
  module Graph
103
108
 
104
- # Returns a BFSIterator, starting at vertex _v_.
105
-
109
+ # @return [BFSIterator] starting at vertex _v_.
106
110
  def bfs_iterator(v = self.detect { |x| true })
107
111
  BFSIterator.new(self, v)
108
112
  end
109
113
 
110
- # Returns a DirectedAdjacencyGraph, which represents a BFS search tree
111
- # starting at _v_. This method uses the tree_edge_event of BFSIterator
114
+ # This method uses the +tree_edge_event+ of BFSIterator
112
115
  # to record all tree edges of the search tree in the result.
113
-
116
+ #
117
+ # @return [DirectedAdjacencyGraph] which represents a BFS search tree starting at _v_.
114
118
  def bfs_search_tree_from(v)
115
119
  require 'rgl/adjacency'
116
120
  bfs = bfs_iterator(v)
@@ -127,11 +131,12 @@ module RGL
127
131
  end # module Graph
128
132
 
129
133
  # Iterator for a depth first search, starting at a given vertex. The only
130
- # difference from BFSIterator is that @waiting is a stack, instead of a queue.
134
+ # difference from {BFSIterator} is that +@waiting+ is a stack, instead of a queue.
131
135
  #
132
- # Note that this is different from DFSVisitor, which is used in the recursive
133
- # version for depth first search (see depth_first_search).
136
+ # Note that this is different from {DFSVisitor}, which is used in the recursive
137
+ # version for depth first search (see {Graph#depth_first_search}).
134
138
  #
139
+ # @see Graph#dfs_iterator
135
140
  class DFSIterator < BFSIterator
136
141
 
137
142
  def next_vertex
@@ -141,17 +146,13 @@ module RGL
141
146
 
142
147
  end # class DFSIterator
143
148
 
144
- # A DFSVisitor is needed by the depth_first_search and depth_first_visit
145
- # methods of a graph. Besides the eventpoint of GraphVisitor, it provides
146
- # an additional eventpoint start_vertex, which is called when a
147
- # depth_first_search starts a new subtree of the depth first forest that is
148
- # defined by the search.
149
- #
150
- # Note that the discover_vertex event defined in the BGL
151
- # DFSVisitor[http://www.boost.org/libs/graph/doc/DFSVisitor.html] is not
152
- # this is also defined in the common mixin GraphVisitor of DFSVisitor,
153
- # DFSIterator, and BFSIterator.
149
+ # A DFSVisitor is needed by the {Graph#depth_first_search} and
150
+ # {Graph#depth_first_visit} methods of a graph. Besides the eventpoints of
151
+ # {GraphVisitor}, it provides an additional eventpoint +start_vertex+, which is
152
+ # called when a +depth_first_search+ starts a new subtree of the depth first
153
+ # forest that is defined by the search.
154
154
  #
155
+ # @see DFSIterator
155
156
  class DFSVisitor
156
157
 
157
158
  include GraphVisitor
@@ -162,20 +163,19 @@ module RGL
162
163
 
163
164
  module Graph
164
165
 
165
- # Returns a DFSIterator staring at vertex _v_.
166
-
166
+ # @return [DFSIterator] staring at vertex _v_.
167
167
  def dfs_iterator(v = self.detect { |x| true })
168
168
  DFSIterator.new(self, v)
169
169
  end
170
170
 
171
- # Do a recursive DFS search on the whole graph. If a block is passed,
172
- # it is called on each _finish_vertex_ event. See
173
- # strongly_connected_components for an example usage.
171
+ # Do a recursive DFS search on the whole graph. If a block is passed, it is
172
+ # called on each +finish_vertex+ event. See {Graph#strongly_connected_components}
173
+ # for an example usage.
174
174
  #
175
175
  # Note that this traversal does not garantee, that roots are at the top of
176
176
  # each spanning subtree induced by the DFS search on a directed graph (see
177
177
  # also the discussion in issue #20[https://github.com/monora/rgl/issues/20]).
178
- #
178
+ # @see DFSVisitor
179
179
  def depth_first_search(vis = DFSVisitor.new(self), &b)
180
180
  each_vertex do |u|
181
181
  unless vis.finished_vertex?(u)
@@ -186,8 +186,8 @@ module RGL
186
186
  end
187
187
 
188
188
  # Start a depth first search at vertex _u_. The block _b_ is called on
189
- # each finish_vertex event.
190
- #
189
+ # each +finish_vertex+ event.
190
+ # @see DFSVisitor
191
191
  def depth_first_visit(u, vis = DFSVisitor.new(self), &b)
192
192
  vis.color_map[u] = :GRAY
193
193
  vis.handle_examine_vertex(u)
@@ -197,7 +197,7 @@ module RGL
197
197
 
198
198
  if vis.follow_edge?(u, v) # (u,v) is a tree edge
199
199
  vis.handle_tree_edge(u, v) # also discovers v
200
- vis.color_map[v] = :GRAY # color of v was :WHITE
200
+ # color of v was :WHITE. Will be marked :GRAY in recursion
201
201
  depth_first_visit(v, vis, &b)
202
202
  else # (u,v) is a non tree edge
203
203
  if vis.color_map[v] == :GRAY
@@ -204,7 +204,7 @@ END
204
204
 
205
205
  def test_depth_first_search_with_parens
206
206
  @dg.add_edge 10, 11
207
- # We must ensure, that the order of the traversal is not dependend on the
207
+ # We must ensure, that the order of the traversal is not dependent on the
208
208
  # order of the each iterator in the hash map of the adjacency graph. Therefor we
209
209
  # wrap the graph with an implicit graph that simply ensures a sort order on
210
210
  # the vertices.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rgl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.9
4
+ version: 0.5.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Horst Duchene
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire: rgl/base
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-08-29 00:00:00.000000000 Z
12
+ date: 2023-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: stream
@@ -114,6 +114,7 @@ files:
114
114
  - Rakefile
115
115
  - examples/canvas.rb
116
116
  - examples/examples.rb
117
+ - examples/graph.dot
117
118
  - examples/insel_der_tausend_gefahren.rb
118
119
  - examples/north.rb
119
120
  - examples/north/Graph.log
@@ -258,7 +259,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
258
259
  - !ruby/object:Gem::Version
259
260
  version: '0'
260
261
  requirements: []
261
- rubygems_version: 3.2.3
262
+ rubygems_version: 3.4.1
262
263
  signing_key:
263
264
  specification_version: 4
264
265
  summary: Ruby Graph Library