lib/rgl/adjacency.rb in rgl-0.4.0 vs lib/rgl/adjacency.rb in rgl-0.5.0
- old
+ new
@@ -1,17 +1,17 @@
# adjacency.rb
-#
-# $Id: adjacency.rb,v 1.12 2008/08/23 05:37:05 javanthropus Exp $
-#
+#
+# $Id$
+#
# The DirectedAdjacencyGraph class implements a generalized adjacency list
-# graph structure. An AdjacencyGraph is basically a two-dimensional structure
-# (ie, a list of lists). Each element of the first dimension represents a
-# vertex. Each of the vertices contains a one-dimensional structure that is
+# graph structure. An AdjacencyGraph is basically a two-dimensional structure
+# (ie, a list of lists). Each element of the first dimension represents a
+# vertex. Each of the vertices contains a one-dimensional structure that is
# the list of all adjacent vertices.
#
# The class for representing the adjacency list of a vertex is, by default, a
-# Set. This can be configured by the client, however, when an AdjacencyGraph
+# Set. This can be configured by the client, however, when an AdjacencyGraph
# is created.
require 'rgl/mutable'
require 'set'
@@ -23,184 +23,188 @@
# Shortcut for creating a DirectedAdjacencyGraph:
#
# RGL::DirectedAdjacencyGraph[1,2, 2,3, 2,4, 4,5].edges.to_a.to_s =>
# "(1-2)(2-3)(2-4)(4-5)"
-
- def self.[] (*a)
+ #
+ def self.[](*a)
result = new
- 0.step(a.size-1, 2) { |i| result.add_edge(a[i], a[i+1]) }
+ 0.step(a.size - 1, 2) { |i| result.add_edge(a[i], a[i + 1]) }
result
end
# Returns a new empty DirectedAdjacencyGraph which has as its edgelist
- # class the given class. The default edgelist class is Set, to ensure
+ # class the given class. The default edgelist class is Set, to ensure
# set semantics for edges and vertices.
#
# If other graphs are passed as parameters their vertices and edges are
# added to the new graph.
- def initialize (edgelist_class = Set, *other_graphs)
+ #
+ def initialize(edgelist_class = Set, *other_graphs)
@edgelist_class = edgelist_class
- @vertice_dict = Hash.new
+ @vertices_dict = Hash.new
other_graphs.each do |g|
- g.each_vertex {|v| add_vertex v}
- g.each_edge {|v,w| add_edge v,w}
+ g.each_vertex { |v| add_vertex v }
+ g.each_edge { |v, w| add_edge v, w }
end
end
- # Copy internal vertice_dict
+ # Copy internal vertices_dict
+ #
def initialize_copy(orig)
- @vertice_dict = orig.instance_eval{@vertice_dict}.dup
- @vertice_dict.keys.each do |v|
- @vertice_dict[v] = @vertice_dict[v].dup
+ @vertices_dict = orig.instance_eval { @vertices_dict }.dup
+ @vertices_dict.keys.each do |v|
+ @vertices_dict[v] = @vertices_dict[v].dup
end
end
- # Iterator for the keys of the vertice list hash.
-
- def each_vertex (&b)
- @vertice_dict.each_key(&b)
+ # Iterator for the keys of the vertices list hash.
+ #
+ def each_vertex(&b)
+ @vertices_dict.each_key(&b)
end
- def each_adjacent (v, &b) # :nodoc:
- adjacency_list = (@vertice_dict[v] or
- raise NoVertexError, "No vertex #{v}.")
+ def each_adjacent(v, &b) # :nodoc:
+ adjacency_list = (@vertices_dict[v] or raise NoVertexError, "No vertex #{v}.")
adjacency_list.each(&b)
end
# Returns true.
-
+ #
def directed?
true
end
# Complexity is O(1), because the vertices are kept in a Hash containing
# as values the lists of adjacent vertices of _v_.
-
+ #
def has_vertex? (v)
- @vertice_dict.has_key?(v)
+ @vertices_dict.has_key?(v)
end
- # Complexity is O(1), if a Set is used as adjacency list. Otherwise,
+ # Complexity is O(1), if a Set is used as adjacency list. Otherwise,
# complexity is O(out_degree(v)).
#
# ---
# MutableGraph interface.
-
+ #
def has_edge? (u, v)
- has_vertex?(u) and @vertice_dict[u].include?(v)
+ has_vertex?(u) && @vertices_dict[u].include?(v)
end
# See MutableGraph#add_vertex.
#
# If the vertex is already in the graph (using eql?), the method does
# nothing.
-
- def add_vertex (v)
- @vertice_dict[v] ||= @edgelist_class.new
+ #
+ def add_vertex(v)
+ @vertices_dict[v] ||= @edgelist_class.new
end
# See MutableGraph#add_edge.
-
- def add_edge (u, v)
- add_vertex(u) # ensure key
- add_vertex(v) # ensure key
+ #
+ def add_edge(u, v)
+ add_vertex(u) # ensure key
+ add_vertex(v) # ensure key
basic_add_edge(u, v)
end
# See MutableGraph#remove_vertex.
+ #
+ def remove_vertex(v)
+ @vertices_dict.delete(v)
- def remove_vertex (v)
- @vertice_dict.delete(v)
-
# remove v from all adjacency lists
-
- @vertice_dict.each_value { |adjList| adjList.delete(v) }
+ @vertices_dict.each_value { |adjList| adjList.delete(v) }
end
# See MutableGraph::remove_edge.
-
- def remove_edge (u, v)
- @vertice_dict[u].delete(v) unless @vertice_dict[u].nil?
+ #
+ def remove_edge(u, v)
+ @vertices_dict[u].delete(v) unless @vertices_dict[u].nil?
end
# Converts the adjacency list of each vertex to be of type _klass_. The
- # class is expected to have a new contructor which accepts an enumerable as
+ # class is expected to have a new constructor which accepts an enumerable as
# parameter.
+ #
def edgelist_class=(klass)
- @vertice_dict.keys.each do |v|
- @vertice_dict[v] = klass.new @vertice_dict[v].to_a
+ @vertices_dict.keys.each do |v|
+ @vertices_dict[v] = klass.new @vertices_dict[v].to_a
end
end
protected
- def basic_add_edge (u, v)
- @vertice_dict[u].add(v)
+ def basic_add_edge(u, v)
+ @vertices_dict[u].add(v)
end
- end # class DirectedAdjacencyGraph
+ end # class DirectedAdjacencyGraph
- # AdjacencyGraph is an undirected Graph. The methods add_edge and
- # remove_edge are reimplemented: If an edge (u,v) is added or removed,
+ # AdjacencyGraph is an undirected Graph. The methods add_edge and
+ # remove_edge are reimplemented: if an edge (u,v) is added or removed,
# then the reverse edge (v,u) is also added or removed.
+ #
+ class AdjacencyGraph < DirectedAdjacencyGraph
- class AdjacencyGraph < DirectedAdjacencyGraph
-
- def directed? # Always returns false.
+ # Always returns false.
+ #
+ def directed?
false
end
-
- # Also removes (v,u)
- def remove_edge (u, v)
+ # Also removes (v,u)
+ #
+ def remove_edge(u, v)
super
- @vertice_dict[v].delete(u) unless @vertice_dict[v].nil?
+ @vertices_dict[v].delete(u) unless @vertices_dict[v].nil?
end
protected
- def basic_add_edge (u,v)
+ def basic_add_edge(u, v)
super
- @vertice_dict[v].add(u) # Insert backwards edge
+ @vertices_dict[v].add(u) # Insert backwards edge
end
- end # class AdjacencyGraph
+ end # class AdjacencyGraph
module Graph
- # Convert a general graph to an AdjacencyGraph. If the graph is directed,
+ # Convert a general graph to an AdjacencyGraph. If the graph is directed,
# returns a DirectedAdjacencyGraph; otherwise, returns an AdjacencyGraph.
-
+ #
def to_adjacency
result = (directed? ? DirectedAdjacencyGraph : AdjacencyGraph).new
each_vertex { |v| result.add_vertex(v) }
- each_edge { |u,v| result.add_edge(u, v) }
+ each_edge { |u, v| result.add_edge(u, v) }
result
end
# Return a new DirectedAdjacencyGraph which has the same set of vertices.
# If (u,v) is an edge of the graph, then (v,u) is an edge of the result.
#
# If the graph is undirected, the result is self.
-
+ #
def reverse
return self unless directed?
result = DirectedAdjacencyGraph.new
each_vertex { |v| result.add_vertex v }
- each_edge { |u,v| result.add_edge(v, u) }
+ each_edge { |u, v| result.add_edge(v, u) }
result
end
- # Return a new AdjacencyGraph which has the same set of vertices. If (u,v)
+ # Return a new AdjacencyGraph which has the same set of vertices. If (u,v)
# is an edge of the graph, then (u,v) and (v,u) (which are the same edges)
# are edges of the result.
#
# If the graph is undirected, the result is self.
-
+ #
def to_undirected
return self unless directed?
AdjacencyGraph.new(Set, self)
end
- end # module Graph
-end # module RGL
+ end # module Graph
+
+end # module RGL