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
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <!-- This file was written by the internal XML-Handler of Y-Files.-->
3
- <!DOCTYPE graphml SYSTEM "http://www.graphdrawing.org/dtds/graphml.dtd">
3
+ <!DOCTYPE graphml SYSTEM "https://www.graphdrawing.org/dtds/graphml.dtd">
4
4
  <graphml>
5
5
  <graph id="G">
6
6
  <node id="n0"/>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <!-- This file was written by the internal XML-Handler of Y-Files.-->
3
- <!DOCTYPE graphml SYSTEM "http://www.graphdrawing.org/dtds/graphml.dtd">
3
+ <!DOCTYPE graphml SYSTEM "https://www.graphdrawing.org/dtds/graphml.dtd">
4
4
  <graphml>
5
5
  <graph id="G">
6
6
  <node id="n0"/>
data/examples/north.rb CHANGED
@@ -6,7 +6,7 @@ include RGL
6
6
 
7
7
  Dir['north/*.graphml'].each do |filename|
8
8
  File.open(filename) { |file|
9
- graph = DirectedAdjacencyGraph.from_graphxml(file)
9
+ graph = DirectedAdjacencyGraph.new.from_graphxml(file)
10
10
  graph.write_to_graphic_file('jpg', filename)
11
11
  }
12
12
  end
data/examples/rdep-rgl.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  #
2
2
  # Simple extensions of Hal Fultons tool to show dependencies between ruby
3
- # source files (see http://hypermetrics.com/rubyhacker/code/rdep/). The basic
3
+ # source files (see https://hypermetrics.com/rubyhacker/code/rdep/). The basic
4
4
  # extensions can be found at the end of the function find_files.
5
5
  #
6
- # Source: [http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/rgl/rgl/examples/rdep-rgl.rb]
6
+ # Source: [https://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/rgl/rgl/examples/rdep-rgl.rb]
7
7
  #
8
8
  # Additionaly rdep-rgl.rb generates a graphics file named
9
9
  # File.basename(ARGV[0]) + ".png".
10
10
  #
11
- # Requires RGL (http://rgl.sourceforge.net) and Graphviz
11
+ # Requires RGL (https://rgl.sourceforge.net) and Graphviz
12
12
  # (www.research.att.com/sw/tools/graphviz/download.html).
13
13
  #
14
14
  # ruby rdep-rgl.rb j:/ruby/lib/ruby/site_ruby/1.6/rdoc/rdoc.rb
data/lib/rgl/adjacency.rb CHANGED
@@ -1,30 +1,27 @@
1
1
  # adjacency.rb
2
2
  #
3
- # $Id$
4
- #
5
- # The DirectedAdjacencyGraph class implements a generalized adjacency list
6
- # graph structure. An AdjacencyGraph is basically a two-dimensional structure
7
- # (ie, a list of lists). Each element of the first dimension represents a
8
- # vertex. Each of the vertices contains a one-dimensional structure that is
9
- # the list of all adjacent vertices.
10
- #
11
- # The class for representing the adjacency list of a vertex is, by default, a
12
- # Set. This can be configured by the client, however, when an AdjacencyGraph
13
- # is created.
14
-
15
3
  require 'rgl/mutable'
16
4
  require 'set'
17
5
 
18
6
  module RGL
19
7
 
8
+ # The +DirectedAdjacencyGraph+ class implements a generalized adjacency list
9
+ # graph structure. An AdjacencyGraph is basically a two-dimensional structure
10
+ # (ie, a list of lists). Each element of the first dimension represents a
11
+ # vertex. Each of the vertices contains a one-dimensional structure that is
12
+ # the list of all adjacent vertices.
13
+ #
14
+ # The class for representing the adjacency list of a vertex is, by default, a
15
+ # +Set+. This can be configured by the client, however, when an AdjacencyGraph
16
+ # is created.
20
17
  class DirectedAdjacencyGraph
21
18
 
22
19
  include MutableGraph
23
20
 
24
- # Shortcut for creating a DirectedAdjacencyGraph:
25
- #
26
- # RGL::DirectedAdjacencyGraph[1,2, 2,3, 2,4, 4,5].edges.to_a.to_s =>
27
- # "(1-2)(2-3)(2-4)(4-5)"
21
+ # Shortcut for creating a DirectedAdjacencyGraph
22
+ # @example
23
+ # RGL::DirectedAdjacencyGraph[1,2, 2,3, 2,4, 4,5].edges.to_a.to_s =>
24
+ # "(1-2)(2-3)(2-4)(4-5)"
28
25
  #
29
26
  def self.[](*a)
30
27
  result = new
@@ -32,13 +29,13 @@ module RGL
32
29
  result
33
30
  end
34
31
 
35
- # Returns a new empty DirectedAdjacencyGraph which has as its edgelist
36
- # class the given class. The default edgelist class is Set, to ensure
37
- # set semantics for edges and vertices.
32
+ # The new empty graph has as its edgelist class the given class. The default
33
+ # edgelist class is Set, to ensure set semantics for edges and vertices.
38
34
  #
39
35
  # If other graphs are passed as parameters their vertices and edges are
40
36
  # added to the new graph.
41
- #
37
+ # @param [Class] edgelist_class
38
+ # @param [Array[Graph]] other_graphs
42
39
  def initialize(edgelist_class = Set, *other_graphs)
43
40
  @edgelist_class = edgelist_class
44
41
  @vertices_dict = Hash.new
@@ -58,58 +55,53 @@ module RGL
58
55
  end
59
56
 
60
57
  # Iterator for the keys of the vertices list hash.
61
- #
58
+ # @see Graph#each_vertex
62
59
  def each_vertex(&b)
63
60
  @vertices_dict.each_key(&b)
64
61
  end
65
62
 
66
- def each_adjacent(v, &b) # :nodoc:
63
+ # @see Graph#each_adjacent
64
+ def each_adjacent(v, &b)
67
65
  adjacency_list = (@vertices_dict[v] or raise NoVertexError, "No vertex #{v}.")
68
66
  adjacency_list.each(&b)
69
67
  end
70
68
 
71
- # Returns true.
69
+ # @return true.
72
70
  #
73
71
  def directed?
74
72
  true
75
73
  end
76
74
 
77
- # Complexity is O(1), because the vertices are kept in a Hash containing
75
+ # Complexity is O(1), because the vertices are kept in a +Hash+ containing
78
76
  # as values the lists of adjacent vertices of _v_.
79
77
  #
78
+ # @see Graph#has_vertex
80
79
  def has_vertex?(v)
81
80
  @vertices_dict.has_key?(v)
82
81
  end
83
82
 
84
83
  # Complexity is O(1), if a Set is used as adjacency list. Otherwise,
85
84
  # complexity is O(out_degree(v)).
86
- #
87
- # ---
88
- # MutableGraph interface.
89
- #
85
+ # @see Graph#has_edge?
90
86
  def has_edge?(u, v)
91
87
  has_vertex?(u) && @vertices_dict[u].include?(v)
92
88
  end
93
89
 
94
- # See MutableGraph#add_vertex.
95
- #
96
- # If the vertex is already in the graph (using eql?), the method does
90
+ # If the vertex is already in the graph (using +eql?+), the method does
97
91
  # nothing.
98
- #
92
+ # @see MutableGraph#add_vertex
99
93
  def add_vertex(v)
100
94
  @vertices_dict[v] ||= @edgelist_class.new
101
95
  end
102
96
 
103
- # See MutableGraph#add_edge.
104
- #
97
+ # @see MutableGraph#add_edge.
105
98
  def add_edge(u, v)
106
99
  add_vertex(u) # ensure key
107
100
  add_vertex(v) # ensure key
108
101
  basic_add_edge(u, v)
109
102
  end
110
103
 
111
- # See MutableGraph#remove_vertex.
112
- #
104
+ # @see MutableGraph#remove_vertex.
113
105
  def remove_vertex(v)
114
106
  @vertices_dict.delete(v)
115
107
 
@@ -117,16 +109,15 @@ module RGL
117
109
  @vertices_dict.each_value { |adjList| adjList.delete(v) }
118
110
  end
119
111
 
120
- # See MutableGraph::remove_edge.
121
- #
112
+ # @see MutableGraph::remove_edge.
122
113
  def remove_edge(u, v)
123
114
  @vertices_dict[u].delete(v) unless @vertices_dict[u].nil?
124
115
  end
125
116
 
126
- # Converts the adjacency list of each vertex to be of type _klass_. The
117
+ # Converts the adjacency list of each vertex to be of type +klass+. The
127
118
  # class is expected to have a new constructor which accepts an enumerable as
128
119
  # parameter.
129
- #
120
+ # @param [Class] klass
130
121
  def edgelist_class=(klass)
131
122
  @vertices_dict.keys.each do |v|
132
123
  @vertices_dict[v] = klass.new @vertices_dict[v].to_a
@@ -141,20 +132,21 @@ module RGL
141
132
 
142
133
  end # class DirectedAdjacencyGraph
143
134
 
144
- # AdjacencyGraph is an undirected Graph. The methods add_edge and
145
- # remove_edge are reimplemented: if an edge (u,v) is added or removed,
146
- # then the reverse edge (v,u) is also added or removed.
135
+ # AdjacencyGraph is an undirected Graph. The methods
136
+ # {DirectedAdjacencyGraph#add_edge} and {DirectedAdjacencyGraph#remove_edge}
137
+ # are reimplemented: if an edge (u,v) is added or removed, then the reverse
138
+ # edge (v,u) is also added or removed.
147
139
  #
148
140
  class AdjacencyGraph < DirectedAdjacencyGraph
149
141
 
150
- # Always returns false.
142
+ # @return false.
151
143
  #
152
144
  def directed?
153
145
  false
154
146
  end
155
147
 
156
148
  # Also removes (v,u)
157
- #
149
+ # @see DirectedAdjacencyGraph#remove_edge
158
150
  def remove_edge(u, v)
159
151
  super
160
152
  @vertices_dict[v].delete(u) unless @vertices_dict[v].nil?
@@ -172,8 +164,8 @@ module RGL
172
164
  module Graph
173
165
 
174
166
  # Convert a general graph to an AdjacencyGraph. If the graph is directed,
175
- # returns a DirectedAdjacencyGraph; otherwise, returns an AdjacencyGraph.
176
- #
167
+ # returns a {DirectedAdjacencyGraph}; otherwise, returns an {AdjacencyGraph}.
168
+ # @return {DirectedAdjacencyGraph} or {AdjacencyGraph}
177
169
  def to_adjacency
178
170
  result = (directed? ? DirectedAdjacencyGraph : AdjacencyGraph).new
179
171
  each_vertex { |v| result.add_vertex(v) }
@@ -185,7 +177,7 @@ module RGL
185
177
  # If (u,v) is an edge of the graph, then (v,u) is an edge of the result.
186
178
  #
187
179
  # If the graph is undirected, the result is self.
188
- #
180
+ # @return [DirectedAdjacencyGraph]
189
181
  def reverse
190
182
  return self unless directed?
191
183
  result = DirectedAdjacencyGraph.new
@@ -194,12 +186,12 @@ module RGL
194
186
  result
195
187
  end
196
188
 
197
- # Return a new AdjacencyGraph which has the same set of vertices. If (u,v)
189
+ # Return a new {AdjacencyGraph} which has the same set of vertices. If (u,v)
198
190
  # is an edge of the graph, then (u,v) and (v,u) (which are the same edges)
199
191
  # are edges of the result.
200
192
  #
201
- # If the graph is undirected, the result is self.
202
- #
193
+ # If the graph is undirected, the result is +self+.
194
+ # @return [AdjacencyGraph]
203
195
  def to_undirected
204
196
  return self unless directed?
205
197
  AdjacencyGraph.new(Set, self)
data/lib/rgl/base.rb CHANGED
@@ -1,10 +1,16 @@
1
1
  # base.rb
2
- #
3
- # Module RGL defines the namespace for all modules and classes of the graph
4
- # library. The main module is RGL::Graph which defines the abstract behavior of
5
- # all graphs in the library.
6
2
 
7
- RGL_VERSION = "0.5.9"
3
+ # version information
4
+ RGL_VERSION = "0.5.10"
5
+
6
+ # Module {RGL} defines the namespace for all modules and classes of the graph
7
+ # library. The main module is {Graph} which defines the abstract behavior of
8
+ # all graphs in the library. Other important modules or classes are:
9
+ #
10
+ # * Class {AdjacencyGraph} provides a concrete implementation of an undirected graph.
11
+ # * Module {Edge} defines edges of a graph.
12
+ # * {GraphIterator} and {GraphVisitor} provide support for iterating and searching.
13
+ # * {DOT} helps to visualize graphs.
8
14
 
9
15
  module RGL
10
16
  class NotDirectedError < RuntimeError; end
@@ -17,16 +23,16 @@ module RGL
17
23
 
18
24
  INFINITY = 1.0 / 0.0 # positive infinity
19
25
 
20
- # Module Edge includes classes for representing edges of directed and
21
- # undirected graphs. There is no need for a Vertex class, because every ruby
26
+ # Module {Edge} includes classes for representing edges of directed and
27
+ # undirected graphs. There is no need for a vertex class, because every ruby
22
28
  # object can be a vertex of a graph.
23
29
  #
24
30
  module Edge
25
- # Simply a directed pair (source -> target). Most library functions try do
26
- # omit to instantiate edges. They instead use two vertex parameters for
27
- # representing edges (see each_edge). If a client wants to store edges
28
- # explicitly DirectedEdge or UnDirectedEdge instances are returned
29
- # (i.e. Graph#edges).
31
+ # An {Edge} is simply a directed pair +(source -> target)+. Most library
32
+ # functions try do omit to instantiate edges. They instead use two vertex
33
+ # parameters for representing edges (see {Graph#each_edge}). If a client wants to
34
+ # store edges explicitly {DirectedEdge} or {UnDirectedEdge} instances are
35
+ # returned (i.e. {Graph#edges}).
30
36
  #
31
37
  class DirectedEdge
32
38
 
@@ -37,15 +43,14 @@ module RGL
37
43
  new(a[0], a[1])
38
44
  end
39
45
 
40
- # Create a new DirectedEdge with source _a_ and target _b_.
46
+ # Create a new DirectedEdge with source +a+ and target +b+.
41
47
  #
42
48
  def initialize(a, b)
43
49
  @source, @target = a, b
44
50
  end
45
51
 
46
- # Two directed edges (u,v) and (x,y) are equal iff u == x and v == y. eql?
47
- # is needed when edges are inserted into a Set. eql? is aliased to ==.
48
- #
52
+ # Two directed edges (u,v) and (x,y) are equal iff u == x and v == y. +eql?+
53
+ # is needed when edges are inserted into a +Set+. +eql?+ is aliased to +==+.
49
54
  def eql?(edge)
50
55
  (source == edge.source) && (target == edge.target)
51
56
  end
@@ -57,20 +62,22 @@ module RGL
57
62
  end
58
63
 
59
64
  # Returns (v,u) if self == (u,v).
60
- #
65
+ # @return [Edge]
61
66
  def reverse
62
67
  self.class.new(target, source)
63
68
  end
64
69
 
65
- # Edges can be indexed. edge[0] == edge.source, edge[n] == edge.target for
66
- # all n>0. Edges can thus be used as a two element array.
70
+ # Edges can be indexed. +edge.at(0) == edge.source+, +edge.at(n) ==
71
+ # edge.target+ for all +n>0+. Edges can thus be used as a two element array.
67
72
  #
68
73
  def [](index)
69
74
  index.zero? ? source : target
70
75
  end
71
76
 
72
- # DirectedEdge[1,2].to_s == "(1-2)"
73
- #
77
+ # Returns string representation of the edge
78
+ # @example
79
+ # DirectedEdge[1,2].to_s == "(1-2)"
80
+ # @return [String]
74
81
  def to_s
75
82
  "(#{source}-#{target})"
76
83
  end
@@ -79,7 +86,7 @@ module RGL
79
86
  alias inspect to_s
80
87
 
81
88
  # Returns the array [source,target].
82
- #
89
+ # @return [Array]
83
90
  def to_a
84
91
  [source, target]
85
92
  end
@@ -93,15 +100,18 @@ module RGL
93
100
  end # DirectedEdge
94
101
 
95
102
  # An undirected edge is simply an undirected pair (source, target) used in
96
- # undirected graphs. UnDirectedEdge[u,v] == UnDirectedEdge[v,u]
103
+ # undirected graphs.
104
+ # @example
105
+ # UnDirectedEdge[u,v] == UnDirectedEdge[v,u]
97
106
  #
98
107
  class UnDirectedEdge < DirectedEdge
99
108
  def eql?(edge)
100
109
  super || ((target == edge.source) && (source == edge.target))
101
110
  end
102
111
 
103
- # UnDirectedEdge[1,2].to_s == "(1=2)"
104
- #
112
+ # @example
113
+ # UnDirectedEdge[1,2].to_s == "(1=2)"
114
+ # @return (see DirectedEdge#to_s)
105
115
  def to_s
106
116
  "(#{source}=#{target})"
107
117
  end
@@ -110,18 +120,18 @@ module RGL
110
120
 
111
121
  end # Edge
112
122
 
113
- # In BGL terminology the module Graph defines the graph concept (see
114
- # http://www.boost.org/libs/graph/doc/graph_concepts.html). We however do not
115
- # distinguish between the IncidenceGraph, EdgeListGraph and VertexListGraph
116
- # concepts, which would complicate the interface too much. These concepts are
117
- # defined in BGL to differentiate between efficient access to edges and
118
- # vertices.
123
+ # In _BGL_ terminology the module Graph defines the graph concept (see {Graph
124
+ # Concepts}[https://www.boost.org/libs/graph/doc/graph_concepts.html]). We
125
+ # however do not distinguish between the IncidenceGraph, EdgeListGraph and
126
+ # VertexListGraph concepts, which would complicate the interface too much.
127
+ # These concepts are defined in BGL to differentiate between efficient access
128
+ # to edges and vertices.
119
129
  #
120
130
  # The RGL Graph concept contains only a few requirements that are common to
121
131
  # all the graph concepts. These include, especially, the iterators defining
122
- # the sets of vertices and edges (see each_vertex and each_adjacent). Most
132
+ # the sets of vertices and edges (see {#each_vertex} and {#each_adjacent}). Most
123
133
  # other functions are derived from these fundamental iterators, i.e.
124
- # num_vertices or num_edges.
134
+ # {#each_edge}, {#num_vertices} or {#num_edges}.
125
135
  #
126
136
  # Each graph is an enumerable of vertices.
127
137
  #
@@ -129,30 +139,30 @@ module RGL
129
139
 
130
140
  include Enumerable
131
141
  include Edge
132
- # The each_vertex iterator defines the set of vertices. This method must be
133
- # defined by concrete graph classes. It defines the BGL VertexListGraph
134
- # concept.
142
+ # The +each_vertex+ iterator defines the set of vertices of the graph. This
143
+ # method must be defined by concrete graph classes. It defines the BGL
144
+ # VertexListGraph concept.
135
145
  #
136
146
  def each_vertex() # :yields: v
137
147
  raise NotImplementedError
138
148
  end
139
149
 
140
- # The each_adjacent iterator defines the out edges of vertex _v_. This
150
+ # The +each_adjacent+ iterator defines the out edges of vertex +v+. This
141
151
  # method must be defined by concrete graph classes. Its defines the BGL
142
152
  # IncidenceGraph concept.
153
+ # @param v a vertex of the graph
143
154
  #
144
155
  def each_adjacent(v) # :yields: v
145
156
  raise NotImplementedError
146
157
  end
147
158
 
148
- # The each_edge iterator should provide efficient access to all edges of the
149
- # graph. Its defines the EdgeListGraph concept.
159
+ # The +each_edge+ iterator should provide efficient access to all edges of the
160
+ # graph. Its defines the BGL EdgeListGraph concept.
150
161
  #
151
- # This method must _not_ be defined by concrete graph classes, because it
152
- # can be implemented using each_vertex and each_adjacent. However for
153
- # undirected graph the function is inefficient because we must not yield
162
+ # This method must *not* be defined by concrete graph classes, because it
163
+ # can be implemented using {#each_vertex} and {#each_adjacent}. However for
164
+ # undirected graphs the function is inefficient because we must not yield
154
165
  # (v,u) if we already visited edge (u,v).
155
- #
156
166
  def each_edge(&block)
157
167
  if directed?
158
168
  each_vertex do |u|
@@ -170,15 +180,14 @@ module RGL
170
180
  end
171
181
 
172
182
  # Is the graph directed? The default returns false.
173
- #
174
183
  def directed?
175
184
  false
176
185
  end
177
186
 
178
- # Returns true if _v_ is a vertex of the graph. Same as #include? inherited
187
+ # Returns true if +v+ is a vertex of the graph. Same as #include? inherited
179
188
  # from Enumerable. Complexity is O(num_vertices) by default. Concrete graph
180
189
  # may be better here (see AdjacencyGraph).
181
- #
190
+ # @param (see #each_adjacent)
182
191
  def has_vertex?(v)
183
192
  include?(v) # inherited from enumerable
184
193
  end
@@ -189,20 +198,20 @@ module RGL
189
198
  num_vertices.zero?
190
199
  end
191
200
 
192
- # Return the array of vertices. Synonym for #to_a inherited by Enumerable.
193
- #
201
+ # Synonym for #to_a inherited by Enumerable.
202
+ # @return [Array] of vertices
194
203
  def vertices
195
204
  to_a
196
205
  end
197
206
 
198
- # Returns the class for edges: DirectedEdge or UnDirectedEdge.
207
+ # @return [Class] the class for edges: {Edge::DirectedEdge} or {Edge::UnDirectedEdge}.
199
208
  #
200
209
  def edge_class
201
210
  directed? ? DirectedEdge : UnDirectedEdge
202
211
  end
203
212
 
204
- # Return the array of edges (DirectedEdge or UnDirectedEdge) of the graph
205
- # using each_edge, depending whether the graph is directed or not.
213
+ # @return [Array] of edges (DirectedEdge or UnDirectedEdge) of the graph
214
+ # It uses {#each_edge} to compute the edges
206
215
  def edges
207
216
  result = []
208
217
  c = edge_class
@@ -210,8 +219,8 @@ module RGL
210
219
  result
211
220
  end
212
221
 
213
- # Returns an array of vertices adjacent to vertex _v_.
214
- #
222
+ # @return [Array] of vertices adjacent to vertex +v+.
223
+ # @param (see #each_adjacent)
215
224
  def adjacent_vertices(v)
216
225
  r = []
217
226
  each_adjacent(v) { |u| r << u }
@@ -219,15 +228,16 @@ module RGL
219
228
  end
220
229
 
221
230
  # Returns the number of out-edges (for directed graphs) or the number of
222
- # incident edges (for undirected graphs) of vertex _v_.
223
- #
231
+ # incident edges (for undirected graphs) of vertex +v+.
232
+ # @return [int]
233
+ # @param (see #each_adjacent)
224
234
  def out_degree(v)
225
235
  r = 0
226
236
  each_adjacent(v) { |u| r += 1 }
227
237
  r
228
238
  end
229
239
 
230
- # Returns the number of vertices.
240
+ # @return [int] the number of vertices
231
241
  #
232
242
  def size # Why not in Enumerable?
233
243
  inject(0) { |n, v| n + 1 }
@@ -235,7 +245,7 @@ module RGL
235
245
 
236
246
  alias num_vertices size
237
247
 
238
- # Returns the number of edges.
248
+ # @return [int] the number of edges
239
249
  #
240
250
  def num_edges
241
251
  r = 0
@@ -244,13 +254,14 @@ module RGL
244
254
  end
245
255
 
246
256
  # Utility method to show a string representation of the edges of the graph.
247
- #
257
+ # @return [String]
248
258
  def to_s
249
259
  edges.collect {|e| e.to_s}.sort.join
250
260
  end
251
261
 
252
- # Two graphs are equal iff they have equal directed? property as well as vertices and edges sets.
253
- #
262
+ # Two graphs are equal iff they have equal directed? property as well as
263
+ # vertices and edges sets.
264
+ # @param [Graph] other
254
265
  def eql?(other)
255
266
  equal?(other) || eql_graph?(other)
256
267
  end
@@ -39,9 +39,10 @@ module RGL
39
39
 
40
40
  # Finds the shortest path form the _source_ to every other vertex of the graph.
41
41
  #
42
- # Returns the shortest paths map that contains the shortest path (if it exists) from the source to any vertex of the
43
- # graph.
42
+ # Returns the shortest paths map that contains the shortest path (if it
43
+ # exists) from the source to any vertex of the graph.
44
44
  #
45
+ # @return [Hash[Object,Array]]
45
46
  def shortest_paths(source)
46
47
  init(source)
47
48
  relax_edges
@@ -102,7 +103,7 @@ module RGL
102
103
  #
103
104
  # Raises ArgumentError or the graph has negative-weight cycles. This behavior can be overridden my a custom handler
104
105
  # for visitor's _edge_not_minimized_ event.
105
- #
106
+ # @return [Hash[Object,Array]]
106
107
  def bellman_ford_shortest_paths(edge_weights_map, source, visitor = BellmanFordVisitor.new(self))
107
108
  BellmanFordAlgorithm.new(self, edge_weights_map, visitor).shortest_paths(source)
108
109
  end
@@ -28,7 +28,7 @@ module RGL
28
28
 
29
29
  # Returns the number of in-edges (for directed graphs) or the number of
30
30
  # incident edges (for undirected graphs) of vertex _v_.
31
- #
31
+ # @return [int]
32
32
  def in_degree(v)
33
33
  r = 0
34
34
  each_in_neighbor(v) { |u| r += 1 }
@@ -37,7 +37,7 @@ module RGL
37
37
 
38
38
  # Returns the number of in-edges plus out-edges (for directed graphs) or the
39
39
  # number of incident edges (for undirected graphs) of vertex _v_.
40
- #
40
+ # @return [int]
41
41
  def degree(v)
42
42
  in_degree(v) + out_degree(v)
43
43
  end
data/lib/rgl/bipartite.rb CHANGED
@@ -10,7 +10,7 @@ module RGL
10
10
  #
11
11
  # Returns an array of two disjoint vertices sets (represented as arrays) if the graph is bipartite. Otherwise,
12
12
  # returns nil.
13
- #
13
+ # @return [Array]
14
14
  def bipartite_sets
15
15
  raise NotUndirectedError.new('bipartite sets can only be found for an undirected graph') if directed?
16
16
 
@@ -6,14 +6,14 @@ module RGL
6
6
 
7
7
  module Graph
8
8
 
9
- # Returns an RGL::ImplicitGraph where the strongly connected components of
9
+ # Returns an {ImplicitGraph} where the strongly connected components of
10
10
  # this graph are condensed into single nodes represented by Set instances
11
11
  # containing the members of each strongly connected component. Edges
12
12
  # between the different strongly connected components are preserved while
13
13
  # edges within strongly connected components are omitted.
14
14
  #
15
- # Raises RGL::NotDirectedError if run on an undirected graph.
16
- #
15
+ # Raises {NotDirectedError} if run on an undirected graph.
16
+ # @return ImplicitGraph
17
17
  def condensation_graph
18
18
  raise NotDirectedError,
19
19
  "condensation_graph only supported for directed graphs" unless directed?
@@ -38,7 +38,7 @@ module RGL
38
38
  yield comp unless comp.empty?
39
39
  end
40
40
 
41
- # This GraphVisitor is used by strongly_connected_components to compute
41
+ # This {GraphVisitor} is used by {#strongly_connected_components} to compute
42
42
  # the strongly connected components of a directed graph.
43
43
  #
44
44
  class TarjanSccVisitor < DFSVisitor
@@ -103,7 +103,7 @@ module RGL
103
103
  # This is Tarjan's algorithm for strongly connected components, from his
104
104
  # paper "Depth first search and linear graph algorithms". It calculates
105
105
  # the components in a single application of DFS. We implement the
106
- # algorithm with the help of the DFSVisitor TarjanSccVisitor.
106
+ # algorithm with the help of the {DFSVisitor} {TarjanSccVisitor}.
107
107
  #
108
108
  # === Definition
109
109
  #
@@ -128,10 +128,10 @@ module RGL
128
128
  # bibsource = "Parallel/Multi.bib, Misc/Reverse.eng.bib",
129
129
  # }
130
130
  #
131
- # The output of the algorithm is recorded in a TarjanSccVisitor _vis_.
132
- # vis.comp_map will contain numbers giving the component ID assigned to
133
- # each vertex. The number of components is vis.num_comp.
134
- #
131
+ # The output of the algorithm is recorded in a {TarjanSccVisitor} _vis_.
132
+ # +vis.comp_map+ will contain numbers giving the component ID assigned to
133
+ # each vertex. The number of components is +vis.num_comp+.
134
+ # @return [TarjanSccVisitor]
135
135
  def strongly_connected_components
136
136
  raise NotDirectedError,
137
137
  "strong_components only works for directed graphs." unless directed?