lib/rgl/implicit.rb in rgl-0.4.0 vs lib/rgl/implicit.rb in rgl-0.5.0
- old
+ new
@@ -1,21 +1,21 @@
-# implicit.rb
+# implicit.rb
#
# This file contains the definition of the class RGL::ImplicitGraph, which
# defines vertex and edge iterators using blocks (which again call blocks).
-#
+#
# An ImplicitGraph provides a handy way to define graphs on the fly, using two
-# blocks for the two iterators defining a graph. A directed cyclic graph,
+# blocks for the two iterators defining a graph. A directed cyclic graph,
# with five vertices can be created as follows:
#
-# g = RGL::ImplicitGraph.new { |g|
+# g = RGL::ImplicitGraph.new do |g|
# g.vertex_iterator { |b| 0.upto(4,&b) }
# g.adjacent_iterator { |x, b| b.call((x+1)%5) }
# g.directed = true
-# }
+# end
#
-# g.to_s => "(0-1)(1-2)(2-3)(3-4)(4-0)"
+# g.to_s # => "(0-1)(1-2)(2-3)(3-4)(4-0)"
#
# Other examples are given by the methods vertices_filtered_by and
# edges_filtered_by, which can be applied to any graph.
require 'rgl/base'
@@ -26,149 +26,151 @@
include Graph
attr_writer :directed
- EMPTY_VERTEX_ITERATOR = proc { |b| }
+ EMPTY_VERTEX_ITERATOR = proc { |b| }
EMPTY_NEIGHBOR_ITERATOR = proc { |x, b| }
-
- # Create a new ImplicitGraph, which is empty by default. The caller should
- # configure the graph using vertex and neighbor iterators. If the graph is
- # directed, the client should set _directed_ to true. The default value
- # for _directed_ is false.
+ # Create a new ImplicitGraph, which is empty by default. The caller should
+ # configure the graph using vertex and neighbor iterators. If the graph is
+ # directed, the client should set _directed_ to true. The default value
+ # for _directed_ is false.
+ #
def initialize
- @directed = false
+ @directed = false
@vertex_iterator = EMPTY_VERTEX_ITERATOR
@adjacent_iterator = EMPTY_NEIGHBOR_ITERATOR
- yield self if block_given? # Let client overwrite defaults.
+ yield self if block_given? # Let client overwrite defaults.
end
# Returns the value of @directed.
-
+ #
def directed?
@directed
end
-
- def each_vertex (&block) # :nodoc:
+
+ def each_vertex(&block) # :nodoc:
@vertex_iterator.call(block)
end
- def each_adjacent (v, &block) # :nodoc:
+ def each_adjacent(v, &block) # :nodoc:
@adjacent_iterator.call(v, block)
end
- def each_edge (&block) # :nodoc:
+ def each_edge(&block) # :nodoc:
if defined? @edge_iterator
@edge_iterator.call(block)
else
- super # use default implementation
+ super # use default implementation
end
end
# Sets the vertex_iterator to _block_,
# which must be a block of one parameter
# which again is the block called by each_vertex.
-
- def vertex_iterator (&block)
+ #
+ def vertex_iterator(&block)
@vertex_iterator = block
end
# Sets the adjacent_iterator to _block_,
- # which must be a block of two parameters:
+ # which must be a block of two parameters:
#
# The first parameter is the vertex the neighbors of which are to be
# traversed.
#
# The second is the block which will be called for each neighbor
# of this vertex.
-
- def adjacent_iterator (&block)
+ #
+ def adjacent_iterator(&block)
@adjacent_iterator = block
end
# Sets the edge_iterator to _block_, which must be a block of two
# parameters: The first parameter is the source of the edges; the
# second is the target of the edge.
-
- def edge_iterator (&block)
+ #
+ def edge_iterator(&block)
@edge_iterator = block
end
- end # class ImplicitGraph
+ end # class ImplicitGraph
-
module Graph
- # ---
# === Graph adaptors
#
# Return a new ImplicitGraph which has as vertices all vertices of the
# receiver which satisfy the predicate _filter_.
#
- # The methods provides similar functionaty as the BGL graph adapter
- # filtered_graph (see BOOST_DOC/filtered_graph.html).
+ # The methods provides similar functionality as the BGL graph adapter
+ # filtered_graph (see BOOST_DOC/filtered_graph.html).
#
# ==== Example
#
# def complete (n)
# set = n.integer? ? (1..n) : n
- # RGL::ImplicitGraph.new { |g|
- # g.vertex_iterator { |b| set.each(&b) }
- # g.adjacent_iterator { |x, b|
- # set.each { |y| b.call(y) unless x == y }
- # }
- # }
+ # RGL::ImplicitGraph.new do |g|
+ # g.vertex_iterator { |b| set.each(&b) }
+ # g.adjacent_iterator do |x, b|
+ # set.each { |y| b.call(y) unless x == y }
+ # end
+ # end
# end
#
- # complete(4).to_s => "(1=2)(1=3)(1=4)(2=3)(2=4)(3=4)"
- # complete(4).vertices_filtered_by {|v| v != 4}.to_s => "(1=2)(1=3)(2=3)"
-
- def vertices_filtered_by (&filter)
- implicit_graph { |g|
- g.vertex_iterator { |b|
+ # complete(4).to_s # => "(1=2)(1=3)(1=4)(2=3)(2=4)(3=4)"
+ # complete(4).vertices_filtered_by { |v| v != 4 }.to_s # => "(1=2)(1=3)(2=3)"
+ #
+ def vertices_filtered_by(&filter)
+ implicit_graph do |g|
+ g.vertex_iterator do |b|
self.each_vertex { |v| b.call(v) if filter.call(v) }
- }
- g.adjacent_iterator { |v, b|
+ end
+
+ g.adjacent_iterator do |v, b|
self.each_adjacent(v) { |u| b.call(u) if filter.call(u) }
- }
- }
+ end
+ end
end
# Return a new ImplicitGraph which has as edges all edges of the receiver
# which satisfy the predicate _filter_ (a block with two parameters).
#
# ==== Example
#
- # g = complete(7).edges_filtered_by {|u,v| u+v == 7}
+ # g = complete(7).edges_filtered_by { |u,v| u+v == 7 }
# g.to_s => "(1=6)(2=5)(3=4)"
# g.vertices => [1, 2, 3, 4, 5, 6, 7]
-
- def edges_filtered_by (&filter)
- implicit_graph { |g|
- g.adjacent_iterator { |v, b|
- self.each_adjacent(v) { |u|
+ #
+ def edges_filtered_by(&filter)
+ implicit_graph do |g|
+ g.adjacent_iterator do |v, b|
+ self.each_adjacent(v) do |u|
b.call(u) if filter.call(v, u)
- }
- }
- g.edge_iterator { |b|
- self.each_edge { |u,v| b.call(u, v) if filter.call(u, v) }
- }
- }
+ end
+ end
+
+ g.edge_iterator do |b|
+ self.each_edge { |u, v| b.call(u, v) if filter.call(u, v) }
+ end
+ end
end
# Return a new ImplicitGraph which is isomorphic (i.e. has same edges and
- # vertices) to the receiver. It is a shortcut, also used by
+ # vertices) to the receiver. It is a shortcut, also used by
# edges_filtered_by and vertices_filtered_by.
-
+ #
def implicit_graph
- result = ImplicitGraph.new { |g|
+ result = ImplicitGraph.new do |g|
g.vertex_iterator { |b| self.each_vertex(&b) }
g.adjacent_iterator { |v, b| self.each_adjacent(v, &b) }
g.directed = self.directed?
- }
+ end
+
yield result if block_given? # let client overwrite defaults
result
end
- end # module Graph
-end # module RGL
+ end # module Graph
+
+end # module RGL