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/dot.rb CHANGED
@@ -1,12 +1,10 @@
1
1
  # dot.rb
2
2
  #
3
- # $Id$
4
- #
5
3
  # Minimal Dot support, based on Dave Thomas's dot module (included in rdoc).
6
4
  # rdot.rb is a modified version which also contains support for undirected
7
5
  # graphs.
8
6
  #
9
- # You need to have [GraphViz](http://www.graphviz.org) installed, because the
7
+ # You need to have [GraphViz](https://www.graphviz.org) installed, because the
10
8
  # functions in this modul execute the GraphViz executables _dot_ or _dotty_.
11
9
 
12
10
  require 'rgl/rdot'
@@ -24,8 +22,8 @@ module RGL
24
22
  v
25
23
  end
26
24
 
27
- # Return a RGL::DOT::Digraph for directed graphs or a DOT::Graph for an
28
- # undirected Graph. _params_ can contain any graph property specified in
25
+ # Return a {DOT::Digraph} for directed graphs or a {DOT::Graph} for an
26
+ # undirected {Graph}. _params_ can contain any graph property specified in
29
27
  # rdot.rb.
30
28
  #
31
29
  def to_dot_graph(params = {})
@@ -67,7 +65,7 @@ module RGL
67
65
  s << to_dot_graph(params).to_s << "\n"
68
66
  end
69
67
 
70
- # Call dotty[http://www.graphviz.org] for the graph which is written to the
68
+ # Call dotty[https://www.graphviz.org] for the graph which is written to the
71
69
  # file 'graph.dot' in the current directory.
72
70
  #
73
71
  def dotty(params = {})
@@ -80,7 +78,7 @@ module RGL
80
78
  end
81
79
  end
82
80
 
83
- # Use dot[http://www.graphviz.org] to create a graphical representation of
81
+ # Use dot[https://www.graphviz.org] to create a graphical representation of
84
82
  # the graph. Returns the filename of the graphics file.
85
83
  #
86
84
  def write_to_graphic_file(fmt='png', dotfile="graph", options={})
@@ -3,6 +3,9 @@ require 'rgl/traversal'
3
3
 
4
4
  module RGL
5
5
 
6
+ # Implements {https://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm
7
+ # Edmonds–Karp algorithm}.
8
+ # @see Graph#maximum_flow
6
9
  class EdmondsKarpAlgorithm
7
10
 
8
11
  # Initializes Edmonds-Karp algorithm for a _graph_ with provided edges capacities map.
@@ -17,9 +20,10 @@ module RGL
17
20
 
18
21
  # Finds the maximum flow from the _source_ to the _sink_ in the graph.
19
22
  #
20
- # Returns flows map as a hash that maps each edge of the graph to a flow through that edge that is required to reach
21
- # the maximum total flow.
23
+ # Returns flows map as a hash that maps each edge of the graph to a flow
24
+ # through that edge that is required to reach the maximum total flow.
22
25
  #
26
+ # @return [Hash]
23
27
  def maximum_flow(source, sink)
24
28
  raise ArgumentError.new("source and sink can't be equal") if source == sink
25
29
 
@@ -127,6 +131,7 @@ module RGL
127
131
  # Raises ArgumentError if a reverse edge is missing, edge capacity is missing, an edge has negative capacity, or a
128
132
  # reverse edge has positive capacity.
129
133
  #
134
+ # @return [Hash]
130
135
  def maximum_flow(edge_capacities_map, source, sink)
131
136
  EdmondsKarpAlgorithm.new(self, edge_capacities_map).maximum_flow(source, sink)
132
137
  end
@@ -5,15 +5,17 @@ require 'rgl/graph_wrapper'
5
5
  module RGL
6
6
 
7
7
  # A GraphIterator is the abstract basis for all Iterators on graphs.
8
- # Each graph iterator should implement the protocol defined in module Stream.
8
+ # Each graph iterator should implement the protocol defined in module
9
+ # {https://rubydoc.info/github/monora/stream Stream}.
9
10
  #
10
11
  module GraphIterator
11
12
  include Stream
12
13
  include GraphWrapper
13
14
 
15
+ # @return [int]
14
16
  def length
15
17
  inject(0) { |sum| sum + 1 }
16
18
  end
17
19
  end
18
20
 
19
- end # RGL
21
+ end # RGL
@@ -2,8 +2,8 @@ require 'rgl/graph_wrapper'
2
2
 
3
3
  module RGL
4
4
 
5
- # Module GraphVisitor defines the BGL
6
- # BFS[http://www.boost.org/libs/graph/doc/BFSVisitor.html] Visitor Concept.
5
+ # Module GraphVisitor defines the
6
+ # {https://www.boost.org/libs/graph/doc/visitor_concepts.html BGL Visitor Concepts}.
7
7
  #
8
8
  # Visitors provide a mechanism for extending an algorithm (i.e., for
9
9
  # customizing what is done at each step of the algorithm). They allow users
@@ -12,7 +12,7 @@ module RGL
12
12
  # Graph algorithms typically have multiple event points where one may want to
13
13
  # insert a call-back. Therefore, visitors have several methods that
14
14
  # correspond to the various event points. Each algorithm has a different
15
- # set of event points. The following are common to both DFS and BFS search.
15
+ # set of event points. The following are common to both DFS and BFS search:
16
16
  #
17
17
  # * examine_vertex
18
18
  # * examine_edge
@@ -21,25 +21,26 @@ module RGL
21
21
  # * forward_edge
22
22
  # * finish_vertex
23
23
  #
24
- # These methods are all called handle_* and can be set to appropriate blocks,
25
- # using the methods set_*_event_handler, which are defined for each event
24
+ # These methods are all named +handle_*+ and can be set to appropriate blocks,
25
+ # using the methods +set_*_event_handler+, which are defined for each event
26
26
  # mentioned above.
27
27
  #
28
- # As an alternative, you can also override the handle_* methods in a
28
+ # As an alternative, you can also override the +handle_*+ methods in a
29
29
  # subclass, to configure the algorithm (as an example, see TarjanSccVisitor).
30
30
  #
31
31
  # During a graph traversal, vertices are *colored* using the colors :GRAY
32
32
  # (when waiting) and :BLACK when finished. All other vertices are :WHITE.
33
- # The color_map is also maintained in the visitor.
33
+ # The +color_map+ is also maintained in the visitor.
34
34
  #
35
35
  module GraphVisitor
36
36
 
37
37
  include GraphWrapper
38
38
 
39
+ # @return [Hash] a map which store the colors for each vertex
39
40
  attr_reader :color_map
40
41
 
41
42
  # Create a new GraphVisitor on _graph_.
42
- #
43
+ # @param [Graph] graph
43
44
  def initialize(graph)
44
45
  super(graph)
45
46
  reset
@@ -59,7 +60,7 @@ module RGL
59
60
 
60
61
  # Shall we follow the edge (u,v); i.e. v has color :WHITE
61
62
  #
62
- def follow_edge?(u, v) # :nodoc:
63
+ def follow_edge?(u, v)
63
64
  @color_map[v] == :WHITE
64
65
  end
65
66
 
@@ -67,10 +68,10 @@ module RGL
67
68
  # vertex to the start vertex.
68
69
  #
69
70
  # This is similar to BGLs
70
- # distance_recorder[http://www.boost.org/libs/graph/doc/distance_recorder.html].
71
+ # {https://www.boost.org/libs/graph/doc/distance_recorder.html distance_recorder}.
71
72
  #
72
- # After the distance_map is attached, the visitor has a new method
73
- # distance_to_root, which answers the distance to the start vertex.
73
+ # After the +distance_map+ is attached, the visitor has a new method
74
+ # +distance_to_root+, which answers the distance to the start vertex.
74
75
  #
75
76
  def attach_distance_map(map = Hash.new(0))
76
77
  @distance_map = map
@@ -123,7 +124,8 @@ module RGL
123
124
  extend ClassMethods # add class methods to GraphVisitor class itself
124
125
 
125
126
  def self.included(base)
126
- base.extend ClassMethods # when GraphVisitor is included into a class/module, add class methods as well
127
+ # when GraphVisitor is included into a class/module, add class methods as well
128
+ base.extend ClassMethods
127
129
  end
128
130
 
129
131
  def_event_handlers :examine_vertex,
@@ -135,4 +137,4 @@ module RGL
135
137
 
136
138
  end # module GraphVisitor
137
139
 
138
- end # module RGL
140
+ end # module RGL
@@ -1,7 +1,8 @@
1
1
  module RGL
2
2
 
3
- module GraphWrapper # :nodoc:
3
+ module GraphWrapper
4
4
 
5
+ # @return [Graph] the wrapped graph
5
6
  attr_accessor :graph
6
7
 
7
8
  # Creates a new GraphWrapper on _graph_.
@@ -12,4 +13,4 @@ module RGL
12
13
 
13
14
  end # module GraphWrapper
14
15
 
15
- end # RGL
16
+ end # RGL
data/lib/rgl/graphxml.rb CHANGED
@@ -1,15 +1,15 @@
1
1
  # graphxml.rb
2
2
  #
3
3
  # This file contains minimal support for creating RGL graphs from the GraphML
4
- # format (see http://graphml.graphdrawing.org/). The main purpose is to
4
+ # format (see https://graphml.graphdrawing.org/). The main purpose is to
5
5
  # have a rich set of example graphs to have some more tests.
6
6
  #
7
7
  # See the examples directory, which contains a subdirectory _north_ with the
8
8
  # Graph catalog GraphViz (see
9
- # http://www.research.att.com/sw/tools/graphviz/refs.html).
9
+ # https://www.research.att.com/sw/tools/graphviz/refs.html).
10
10
  #
11
11
  # We use REXML::StreamListener from the REXML library
12
- # (http://www.germane-software.com/software/rexml) to parse the grapml files.
12
+ # (https://www.germane-software.com/software/rexml) to parse the grapml files.
13
13
 
14
14
  require 'rgl/mutable'
15
15
  require 'rexml/document'
@@ -48,7 +48,7 @@ module RGL
48
48
  end # class MutableGraphParser
49
49
 
50
50
  # Initializes an RGL graph from a subset of the GraphML format given in
51
- # +source+ (see http://graphml.graphdrawing.org/).
51
+ # +source+ (see https://graphml.graphdrawing.org/).
52
52
  #
53
53
  def from_graphxml(source)
54
54
  listener = MutableGraphParser.new(self)
data/lib/rgl/implicit.rb CHANGED
@@ -3,25 +3,26 @@
3
3
  # This file contains the definition of the class RGL::ImplicitGraph, which
4
4
  # defines vertex and edge iterators using blocks (which again call blocks).
5
5
  #
6
- # An ImplicitGraph provides a handy way to define graphs on the fly, using two
7
- # blocks for the two iterators defining a graph. A directed cyclic graph,
8
- # with five vertices can be created as follows:
9
- #
10
- # g = RGL::ImplicitGraph.new do |g|
11
- # g.vertex_iterator { |b| 0.upto(4,&b) }
12
- # g.adjacent_iterator { |x, b| b.call((x+1)%5) }
13
- # g.directed = true
14
- # end
15
- #
16
- # g.to_s # => "(0-1)(1-2)(2-3)(3-4)(4-0)"
17
- #
18
- # Other examples are given by the methods vertices_filtered_by and
19
- # edges_filtered_by, which can be applied to any graph.
20
6
 
21
7
  require 'rgl/base'
22
8
 
23
9
  module RGL
24
10
 
11
+ # An ImplicitGraph provides a handy way to define graphs on the fly, using two
12
+ # blocks for the two iterators defining a graph. Other examples are given by the
13
+ # methods {#vertices_filtered_by} and {#edges_filtered_by}, which can be
14
+ # applied to any graph.
15
+ #
16
+ # @example
17
+ # # A directed cyclic graph, with five vertices can be created as follows:
18
+ # g = RGL::ImplicitGraph.new do |g|
19
+ # g.vertex_iterator { |b| 0.upto(4,&b) }
20
+ # g.adjacent_iterator { |x, b| b.call((x+1)%5) }
21
+ # g.directed = true
22
+ # end
23
+ #
24
+ # g.to_s # => "(0-1)(1-2)(2-3)(3-4)(4-0)"
25
+ #
25
26
  class ImplicitGraph
26
27
 
27
28
  include Graph
@@ -31,10 +32,10 @@ module RGL
31
32
  EMPTY_VERTEX_ITERATOR = proc { |b| }
32
33
  EMPTY_NEIGHBOR_ITERATOR = proc { |x, b| }
33
34
 
34
- # Create a new ImplicitGraph, which is empty by default. The caller should
35
+ # Create a new {ImplicitGraph}, which is empty by default. The caller should
35
36
  # configure the graph using vertex and neighbor iterators. If the graph is
36
- # directed, the client should set _directed_ to true. The default value
37
- # for _directed_ is false.
37
+ # directed, the client should set +@directed+ to true. The default value
38
+ # for +@directed+ is false.
38
39
  #
39
40
  def initialize
40
41
  @directed = false
@@ -43,21 +44,21 @@ module RGL
43
44
  yield self if block_given? # Let client overwrite defaults.
44
45
  end
45
46
 
46
- # Returns the value of @directed.
47
+ # Returns the value of +@directed+.
47
48
  #
48
49
  def directed?
49
50
  @directed
50
51
  end
51
52
 
52
- def each_vertex(&block) # :nodoc:
53
+ def each_vertex(&block)
53
54
  @vertex_iterator.call(block)
54
55
  end
55
56
 
56
- def each_adjacent(v, &block) # :nodoc:
57
+ def each_adjacent(v, &block)
57
58
  @adjacent_iterator.call(v, block)
58
59
  end
59
60
 
60
- def each_edge(&block) # :nodoc:
61
+ def each_edge(&block)
61
62
  if defined? @edge_iterator
62
63
  @edge_iterator.call(block)
63
64
  else
@@ -67,7 +68,7 @@ module RGL
67
68
 
68
69
  # Sets the vertex_iterator to _block_,
69
70
  # which must be a block of one parameter
70
- # which again is the block called by each_vertex.
71
+ # which again is the block called by {#each_vertex}.
71
72
  #
72
73
  def vertex_iterator(&block)
73
74
  @vertex_iterator = block
@@ -98,15 +99,14 @@ module RGL
98
99
 
99
100
  module Graph
100
101
 
101
- # === Graph adaptors
102
- #
103
- # Return a new ImplicitGraph which has as vertices all vertices of the
102
+ # Returns a new {ImplicitGraph} which has as vertices all vertices of the
104
103
  # receiver which satisfy the predicate _filter_.
105
104
  #
106
- # The methods provides similar functionality as the BGL graph adapter
107
- # filtered_graph (see BOOST_DOC/filtered_graph.html).
105
+ # The methods provides similar functionality as
106
+ # {https://www.boost.org/doc/libs/1_36_0/libs/graph/doc/filtered_graph.html
107
+ # BGLs Filtered Graph}
108
108
  #
109
- # ==== Example
109
+ # @example
110
110
  #
111
111
  # def complete (n)
112
112
  # set = n.integer? ? (1..n) : n
@@ -120,7 +120,7 @@ module RGL
120
120
  #
121
121
  # complete(4).to_s # => "(1=2)(1=3)(1=4)(2=3)(2=4)(3=4)"
122
122
  # complete(4).vertices_filtered_by { |v| v != 4 }.to_s # => "(1=2)(1=3)(2=3)"
123
- #
123
+ # @return [ImplicitGraph]
124
124
  def vertices_filtered_by(&filter)
125
125
  implicit_graph do |g|
126
126
  g.vertex_iterator do |b|
@@ -133,15 +133,15 @@ module RGL
133
133
  end
134
134
  end
135
135
 
136
- # Return a new ImplicitGraph which has as edges all edges of the receiver
136
+ # Returns a new {ImplicitGraph} which has as edges all edges of the receiver
137
137
  # which satisfy the predicate _filter_ (a block with two parameters).
138
138
  #
139
- # ==== Example
139
+ # @example
140
140
  #
141
141
  # g = complete(7).edges_filtered_by { |u,v| u+v == 7 }
142
142
  # g.to_s => "(1=6)(2=5)(3=4)"
143
143
  # g.vertices => [1, 2, 3, 4, 5, 6, 7]
144
- #
144
+ # @return [ImplicitGraph]
145
145
  def edges_filtered_by(&filter)
146
146
  implicit_graph do |g|
147
147
  g.adjacent_iterator do |v, b|
@@ -156,10 +156,10 @@ module RGL
156
156
  end
157
157
  end
158
158
 
159
- # Return a new ImplicitGraph which is isomorphic (i.e. has same edges and
159
+ # Return a new {ImplicitGraph} which is isomorphic (i.e. has same edges and
160
160
  # vertices) to the receiver. It is a shortcut, also used by
161
- # edges_filtered_by and vertices_filtered_by.
162
- #
161
+ # {#edges_filtered_by} and {#vertices_filtered_by}.
162
+ # @return [ImplicitGraph]
163
163
  def implicit_graph
164
164
  result = ImplicitGraph.new do |g|
165
165
  g.vertex_iterator { |b| self.each_vertex(&b) }
data/lib/rgl/mutable.rb CHANGED
@@ -21,7 +21,7 @@ module RGL
21
21
  # Inserts the edge (u,v) into the graph.
22
22
  #
23
23
  # Note that for undirected graphs, (u,v) is the same edge as (v,u), so
24
- # after a call to the function add_edge(), this implies that edge (u,v)
24
+ # after a call to the function #add_edge, this implies that edge (u,v)
25
25
  # will appear in the out-edges of u and (u,v) (or equivalently (v,u))
26
26
  # will appear in the out-edges of v. Put another way, v will be adjacent
27
27
  # to u and u will be adjacent to v.
@@ -37,8 +37,8 @@ module RGL
37
37
  end
38
38
 
39
39
  # Add all edges in the _edges_ array to the edge set. Elements of the
40
- # array can be both two-element arrays or instances of DirectedEdge or
41
- # UnDirectedEdge.
40
+ # array can be both two-element arrays or instances of {Edge::DirectedEdge} or
41
+ # {Edge::UnDirectedEdge}.
42
42
  #
43
43
  def add_edges(*edges)
44
44
  edges.each { |edge| add_edge(edge[0], edge[1]) }
@@ -65,7 +65,7 @@ module RGL
65
65
  end
66
66
 
67
67
  # Remove all vertices specified by the array a from the graph by calling
68
- # remove_vertex.
68
+ # {#remove_vertex}.
69
69
  #
70
70
  def remove_vertices(*a)
71
71
  a.each { |v| remove_vertex v }
@@ -74,14 +74,14 @@ module RGL
74
74
  # Returns all minimum cycles that pass through a give vertex.
75
75
  # The format is an Array of cycles, with each cycle being an Array
76
76
  # of vertices in the cycle.
77
- #
77
+ # @return [Array[Array]]
78
78
  def cycles_with_vertex(vertex)
79
79
  cycles_with_vertex_helper(vertex, vertex, [])
80
80
  end
81
81
 
82
82
  protected
83
83
 
84
- def cycles_with_vertex_helper(vertex, start, visited) #:nodoc:
84
+ def cycles_with_vertex_helper(vertex, start, visited)
85
85
  adjacent_vertices(start).reject { |x| visited.include?(x) }.inject([]) do |acc, adj|
86
86
  local_visited = Array.new(visited) << adj
87
87
  acc << local_visited if (adj==vertex)
@@ -91,7 +91,7 @@ module RGL
91
91
 
92
92
  public
93
93
 
94
- # Returns an array of all minimum cycles in a graph
94
+ # @return [Array] of all minimum cycles in a graph
95
95
  #
96
96
  # This is not an efficient implementation O(n^4) and could
97
97
  # be done using Minimum Spanning Trees. Hint. Hint.
@@ -1,6 +1,6 @@
1
1
  module RGL
2
2
 
3
- class PathBuilder # :nodoc:
3
+ class PathBuilder
4
4
 
5
5
  def initialize(source, parents_map)
6
6
  @source = source
@@ -16,6 +16,7 @@ module RGL
16
16
  end
17
17
  end
18
18
 
19
+ # @return [Hash]
19
20
  def paths(targets)
20
21
  paths_map = {}
21
22
 
@@ -37,4 +38,4 @@ module RGL
37
38
 
38
39
  end
39
40
 
40
- end # RGL
41
+ end # RGL
data/lib/rgl/prim.rb CHANGED
@@ -3,6 +3,8 @@ require 'rgl/adjacency'
3
3
 
4
4
  module RGL
5
5
 
6
+ # Implements {https://en.wikipedia.org/wiki/Prim%27s_algorithm Prim's algorithm}.
7
+ # @see Graph#prim_minimum_spanning_tree
6
8
  class PrimAlgorithm
7
9
 
8
10
  # Replacement for default distance combinator that is used in Dijkstra's algorithm. While building a minimum
@@ -36,7 +38,7 @@ module RGL
36
38
 
37
39
  # Finds the minimum spanning tree of the graph.
38
40
  #
39
- # Returns an AdjacencyGraph that represents the minimum spanning tree of the graph's connectivity component that
41
+ # Returns an {AdjacencyGraph} that represents the minimum spanning tree of the graph's connectivity component that
40
42
  # contains the starting vertex. The algorithm starts from an arbitrary vertex if the _start_vertex_ is not given.
41
43
  # Since the implementation relies on the Dijkstra's algorithm, Prim's algorithm uses the same visitor class and emits
42
44
  # the same events.
data/lib/rgl/rdot.rb CHANGED
@@ -1,17 +1,17 @@
1
- # This is a modified version of dot.rb from Dave Thomas's rdoc project. I
2
- # renamed it to rdot.rb to avoid collision with an installed rdoc/dot.
3
- #
4
- # It also supports undirected edges.
5
-
6
1
  module RGL
7
2
 
3
+ # This is a modified version of +dot.rb+ from {https://ruby.github.io/rdoc Dave
4
+ # Thomas's rdoc project}. I renamed it to +rdot.rb+ to avoid collision with an
5
+ # installed rdoc/dot.
6
+ #
7
+ # It also supports undirected edges.
8
8
  module DOT
9
9
 
10
10
  # options for node declaration
11
11
 
12
12
  NODE_OPTS = [
13
13
  # attributes due to
14
- # http://www.graphviz.org/Documentation/dotguide.pdf
14
+ # https://www.graphviz.org/Documentation/dotguide.pdf
15
15
  # February 23, 2008
16
16
  'color', # default: black; node shape color
17
17
  'comment', # any string (format-dependent)
@@ -139,7 +139,7 @@ module RGL
139
139
 
140
140
  attr_accessor :name, :options
141
141
 
142
- def initialize(params = {}, option_list = []) # :nodoc:
142
+ def initialize(params = {}, option_list = [])
143
143
  @name = params['name'] ? params['name'] : nil
144
144
  @options = {}
145
145
 
data/lib/rgl/topsort.rb CHANGED
@@ -10,10 +10,11 @@ module RGL
10
10
  # such that if edge (u,v) appears in the graph, then u comes before v in
11
11
  # the ordering. The graph must be a directed acyclic graph (DAG).
12
12
  #
13
- # The iterator can also be applied to undirected graph or to a DG graph
13
+ # The iterator can also be applied to an undirected graph or to a directed graph
14
14
  # which contains a cycle. In this case, the Iterator does not reach all
15
- # vertices. The implementation of acyclic? uses this fact.
15
+ # vertices. The implementation of {Graph#acyclic?} uses this fact.
16
16
  #
17
+ # @see Graph#topsort_iterator
17
18
  class TopsortIterator
18
19
 
19
20
  include GraphIterator
@@ -23,7 +24,7 @@ module RGL
23
24
  set_to_begin
24
25
  end
25
26
 
26
- def set_to_begin # :nodoc:
27
+ def set_to_begin
27
28
  @waiting = Array.new
28
29
  @inDegrees = Hash.new(0)
29
30
 
@@ -39,7 +40,8 @@ module RGL
39
40
  end
40
41
  end
41
42
 
42
- def basic_forward # :nodoc:
43
+ # @private
44
+ def basic_forward
43
45
  u = @waiting.pop
44
46
  graph.each_adjacent(u) do |v|
45
47
  @inDegrees[v] -= 1
@@ -52,16 +54,15 @@ module RGL
52
54
  true
53
55
  end
54
56
 
55
- # :nodoc: FIXME
56
57
  def at_end?
57
58
  @waiting.empty?
58
- end # :nodoc:
59
+ end
59
60
 
60
61
  end # class TopsortIterator
61
62
 
62
63
  module Graph
63
64
 
64
- # Returns a TopsortIterator.
65
+ # @return [TopsortIterator] for the graph.
65
66
  #
66
67
  def topsort_iterator
67
68
  TopsortIterator.new(self)
@@ -6,7 +6,7 @@ module RGL
6
6
 
7
7
  module Graph
8
8
 
9
- # Returns an RGL::DirectedAdjacencyGraph which is the transitive closure of
9
+ # Returns an {DirectedAdjacencyGraph} which is the transitive closure of
10
10
  # this graph. Meaning, for each path u -> ... -> v in this graph, the path
11
11
  # is copied and the edge u -> v is added. This method supports working with
12
12
  # cyclic graphs by ensuring that edges are created between every pair of
@@ -15,8 +15,8 @@ module RGL
15
15
  # This method should run in O(|V||E|) time, where |V| and |E| are the number
16
16
  # of vertices and edges respectively.
17
17
  #
18
- # Raises RGL::NotDirectedError if run on an undirected graph.
19
- #
18
+ # Raises {NotDirectedError} if run on an undirected graph.
19
+ # @return DirectedAdjacencyGraph
20
20
  def transitive_closure
21
21
  raise NotDirectedError,
22
22
  "transitive_closure only supported for directed graphs" unless directed?
@@ -86,7 +86,7 @@ module RGL
86
86
  g
87
87
  end
88
88
 
89
- # Returns an RGL::DirectedAdjacencyGraph which is the transitive reduction
89
+ # Returns an {DirectedAdjacencyGraph} which is the transitive reduction
90
90
  # of this graph. Meaning, that each edge u -> v is omitted if path
91
91
  # u -> ... -> v exists. This method supports working with cyclic graphs;
92
92
  # however, cycles are arbitrarily simplified which may lead to variant,
@@ -95,8 +95,8 @@ module RGL
95
95
  # This method should run in O(|V||E|) time, where |V| and |E| are the number
96
96
  # of vertices and edges respectively.
97
97
  #
98
- # Raises RGL::NotDirectedError if run on an undirected graph.
99
- #
98
+ # Raises {NotDirectedError} if run on an undirected graph.
99
+ # @return DirectedAdjacencyGraph
100
100
  def transitive_reduction
101
101
  raise NotDirectedError,
102
102
  "transitive_reduction only supported for directed graphs" unless directed?