rgl 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +74 -0
- data/Makefile +72 -0
- data/README +240 -0
- data/Rakefile +210 -0
- data/TAGS +209 -0
- data/examples/canvas.rb +103 -0
- data/examples/codegraph +238 -0
- data/examples/example.jpg +0 -0
- data/examples/examples.rb +112 -0
- data/examples/graph.dot +54 -0
- data/examples/graph.png +0 -0
- data/examples/module_graph.jpg +0 -0
- data/examples/north.rb +12 -0
- data/examples/north/Graph.log +128 -0
- data/examples/north/g.10.0.graphml +28 -0
- data/examples/north/g.10.1.graphml +28 -0
- data/examples/north/g.10.11.graphml +31 -0
- data/examples/north/g.10.12.graphml +27 -0
- data/examples/north/g.10.13.graphml +27 -0
- data/examples/north/g.10.14.graphml +27 -0
- data/examples/north/g.10.15.graphml +26 -0
- data/examples/north/g.10.16.graphml +26 -0
- data/examples/north/g.10.17.graphml +26 -0
- data/examples/north/g.10.19.graphml +37 -0
- data/examples/north/g.10.2.graphml +28 -0
- data/examples/north/g.10.20.graphml +38 -0
- data/examples/north/g.10.22.graphml +43 -0
- data/examples/north/g.10.24.graphml +30 -0
- data/examples/north/g.10.25.graphml +45 -0
- data/examples/north/g.10.27.graphml +38 -0
- data/examples/north/g.10.28.graphml +30 -0
- data/examples/north/g.10.29.graphml +38 -0
- data/examples/north/g.10.3.graphml +26 -0
- data/examples/north/g.10.30.graphml +34 -0
- data/examples/north/g.10.31.graphml +42 -0
- data/examples/north/g.10.34.graphml +42 -0
- data/examples/north/g.10.37.graphml +28 -0
- data/examples/north/g.10.38.graphml +38 -0
- data/examples/north/g.10.39.graphml +36 -0
- data/examples/north/g.10.4.graphml +26 -0
- data/examples/north/g.10.40.graphml +37 -0
- data/examples/north/g.10.41.graphml +37 -0
- data/examples/north/g.10.42.graphml +26 -0
- data/examples/north/g.10.45.graphml +28 -0
- data/examples/north/g.10.46.graphml +32 -0
- data/examples/north/g.10.5.graphml +31 -0
- data/examples/north/g.10.50.graphml +30 -0
- data/examples/north/g.10.56.graphml +29 -0
- data/examples/north/g.10.57.graphml +32 -0
- data/examples/north/g.10.58.graphml +32 -0
- data/examples/north/g.10.6.graphml +26 -0
- data/examples/north/g.10.60.graphml +32 -0
- data/examples/north/g.10.61.graphml +34 -0
- data/examples/north/g.10.62.graphml +34 -0
- data/examples/north/g.10.68.graphml +30 -0
- data/examples/north/g.10.69.graphml +32 -0
- data/examples/north/g.10.7.graphml +29 -0
- data/examples/north/g.10.70.graphml +26 -0
- data/examples/north/g.10.71.graphml +27 -0
- data/examples/north/g.10.72.graphml +28 -0
- data/examples/north/g.10.74.graphml +29 -0
- data/examples/north/g.10.75.graphml +29 -0
- data/examples/north/g.10.78.graphml +27 -0
- data/examples/north/g.10.79.graphml +34 -0
- data/examples/north/g.10.8.graphml +29 -0
- data/examples/north/g.10.80.graphml +34 -0
- data/examples/north/g.10.82.graphml +35 -0
- data/examples/north/g.10.83.graphml +32 -0
- data/examples/north/g.10.85.graphml +34 -0
- data/examples/north/g.10.86.graphml +34 -0
- data/examples/north/g.10.88.graphml +37 -0
- data/examples/north/g.10.89.graphml +29 -0
- data/examples/north/g.10.9.graphml +26 -0
- data/examples/north/g.10.90.graphml +32 -0
- data/examples/north/g.10.91.graphml +31 -0
- data/examples/north/g.10.92.graphml +26 -0
- data/examples/north/g.10.93.graphml +32 -0
- data/examples/north/g.10.94.graphml +34 -0
- data/examples/north/g.12.8.graphml +40 -0
- data/examples/north/g.14.9.graphml +36 -0
- data/examples/north2.rb +21 -0
- data/examples/rdep-rgl.rb +395 -0
- data/install.rb +49 -0
- data/lib/rgl/adjacency.rb +151 -0
- data/lib/rgl/base.rb +299 -0
- data/lib/rgl/connected_components.rb +125 -0
- data/lib/rgl/dot.rb +63 -0
- data/lib/rgl/graphxml.rb +52 -0
- data/lib/rgl/implicit.rb +151 -0
- data/lib/rgl/mutable.rb +54 -0
- data/lib/rgl/rdot.rb +264 -0
- data/lib/rgl/topsort.rb +61 -0
- data/lib/rgl/transitiv_closure.rb +34 -0
- data/lib/rgl/traversal.rb +296 -0
- data/tests/TestComponents.rb +67 -0
- data/tests/TestDirectedGraph.rb +100 -0
- data/tests/TestEdge.rb +33 -0
- data/tests/TestGraphXML.rb +57 -0
- data/tests/TestImplicit.rb +52 -0
- data/tests/TestTransitiveClosure.rb +29 -0
- data/tests/TestTraversal.rb +222 -0
- data/tests/TestUnDirectedGraph.rb +98 -0
- metadata +163 -0
data/ChangeLog
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
2002-11-10 monora <monora@HDDESKTOP>
|
|
2
|
+
|
|
3
|
+
* lib/set.rb, lib/rgl/adjacency.rb, lib/utils.rb:
|
|
4
|
+
Use knus compatibility library for Ruby 1.8 esp. for set.rb and inject.
|
|
5
|
+
|
|
6
|
+
2002-09-22 monora <monora@HDDESKTOP>
|
|
7
|
+
|
|
8
|
+
* lib/rgl/dot.rb:
|
|
9
|
+
to_dot_graph now also outputs vertices.
|
|
10
|
+
|
|
11
|
+
* lib/rgl/adjacency.rb: cosmetic.
|
|
12
|
+
|
|
13
|
+
2002-09-17 monora <monora@HDDESKTOP>
|
|
14
|
+
|
|
15
|
+
* Makefile: Added releasedoc target.
|
|
16
|
+
|
|
17
|
+
* lib/rgl/base.rb, lib/rgl/implicit.rb:
|
|
18
|
+
Fixed typo.
|
|
19
|
+
|
|
20
|
+
2002-08-29 monora <monora@HDDESKTOP>
|
|
21
|
+
|
|
22
|
+
* ChangeLog, lib/rgl/adjacency.rb, lib/rgl/base.rb, tests/TestDirectedGraph.rb, tests/TestUnDirectedGraph.rb:
|
|
23
|
+
Changed NameError to NoVertexError.
|
|
24
|
+
|
|
25
|
+
2002-09-22 monora <monora@HDDESKTOP>
|
|
26
|
+
|
|
27
|
+
* lib/rgl/dot.rb:
|
|
28
|
+
to_dot_graph now also outputs vertices.
|
|
29
|
+
|
|
30
|
+
* lib/rgl/adjacency.rb: cosmetic.
|
|
31
|
+
|
|
32
|
+
2002-09-17 monora <monora@HDDESKTOP>
|
|
33
|
+
|
|
34
|
+
* Makefile: Added releasedoc target.
|
|
35
|
+
|
|
36
|
+
* lib/rgl/base.rb, lib/rgl/implicit.rb:
|
|
37
|
+
Fixed typo.
|
|
38
|
+
|
|
39
|
+
2002-08-29 monora <monora@HDDESKTOP>
|
|
40
|
+
|
|
41
|
+
* ChangeLog, lib/rgl/adjacency.rb, lib/rgl/base.rb, tests/TestDirectedGraph.rb, tests/TestUnDirectedGraph.rb:
|
|
42
|
+
Changed NameError to NoVertexError.
|
|
43
|
+
|
|
44
|
+
2002-08-29 monora <monora@hddesktop>
|
|
45
|
+
|
|
46
|
+
* TestDirectedGraph.rb, TestUnDirectedGraph.rb:
|
|
47
|
+
* adjacency.rb, base.rb: Changed NameError to NoVertexError. Fixed Bug Nr. 599872.
|
|
48
|
+
|
|
49
|
+
2002-08-23 monora <monora@hddesktop>
|
|
50
|
+
|
|
51
|
+
* base.rb, dot.rb, rdot.rb:
|
|
52
|
+
canvas.rb added. Collision with rdoc/dot.rb removed.
|
|
53
|
+
|
|
54
|
+
2002-08-19 monora <monora@hddesktop>
|
|
55
|
+
|
|
56
|
+
* traversal.rb: New file.
|
|
57
|
+
|
|
58
|
+
* traversal.rb: started at sf
|
|
59
|
+
|
|
60
|
+
* adjacency.rb, base.rb, connected_components.rb, dot.rb, graphxml.rb, implicit.rb, mutable.rb, topsort.rb, transitiv_closure.rb:
|
|
61
|
+
New file.
|
|
62
|
+
|
|
63
|
+
* adjacency.rb, base.rb, connected_components.rb, dot.rb, graphxml.rb, implicit.rb, mutable.rb, topsort.rb, transitiv_closure.rb:
|
|
64
|
+
started at sf
|
|
65
|
+
|
|
66
|
+
2002-06-10 Horst Duchene <horst@hduchene.de>
|
|
67
|
+
|
|
68
|
+
* lib/rgl/graphxml.rb: added + tests + examples from graphviz catalog
|
|
69
|
+
|
|
70
|
+
2002-03-21 Horst Duchene <horst@hduchene.de>
|
|
71
|
+
|
|
72
|
+
* Ported tests to Test::Unit
|
|
73
|
+
* transitive_closure.rb
|
|
74
|
+
|
data/Makefile
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#
|
|
2
|
+
# make test - run the tests
|
|
3
|
+
# make clean - tidy up
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
LIB=./lib
|
|
7
|
+
RGL=rgl-$(VERSION)
|
|
8
|
+
BOOST_DOC=http://www.boost.org/libs/graph/doc
|
|
9
|
+
#BOOST_DOC=file://D:/Programme/bgl/boost_1_25_1/libs/graph/doc
|
|
10
|
+
|
|
11
|
+
default: test
|
|
12
|
+
test:
|
|
13
|
+
cd tests && ruby -I../lib runtests.rb
|
|
14
|
+
|
|
15
|
+
# Release must have VERSION variable set
|
|
16
|
+
#
|
|
17
|
+
# make VERSION=0.2 release
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
release: doc stamp clean tar
|
|
21
|
+
|
|
22
|
+
ftpput: ${RGL}.tgz
|
|
23
|
+
ftpput.rb $<
|
|
24
|
+
|
|
25
|
+
releasedoc: doc
|
|
26
|
+
rm -f htdocs
|
|
27
|
+
ln -fs doc htdocs
|
|
28
|
+
tar --dereference --exclude='*.bak' -czf htdocs.tgz htdocs
|
|
29
|
+
rm htdocs
|
|
30
|
+
scp htdocs.tgz monora@rgl.sf.net:/home/groups/r/rg/rgl
|
|
31
|
+
|
|
32
|
+
stamp:
|
|
33
|
+
ruby -i.bak -pe 'sub!(/V\d+(\.\d+)+/, "V$(VERSION)") if /_VERSION =/' ${LIB}/rgl/base.rb
|
|
34
|
+
rm ${LIB}/rgl/base.rb.bak
|
|
35
|
+
cvs commit
|
|
36
|
+
cvs rtag `echo V$(VERSION) | sed s/\\\\./_/g` rgl
|
|
37
|
+
|
|
38
|
+
doc: ${LIB}/rgl/*.rb README
|
|
39
|
+
# cd ${LIB} && rdoc --diagram --fileboxes --title RGL --main rgl/base.rb --op ../doc
|
|
40
|
+
cd ${LIB} && rdoc.bat --title RGL --main rgl/base.rb --op ../doc
|
|
41
|
+
cp examples/*.jpg doc
|
|
42
|
+
find doc -name \*.html -print | xargs ruby -i.bak -pe 'sub!(/BOOST_DOC.(.*.html)/,"<a href=${BOOST_DOC}/\\1>\\1<a>")'
|
|
43
|
+
|
|
44
|
+
install:
|
|
45
|
+
ruby install.rb
|
|
46
|
+
|
|
47
|
+
tags:
|
|
48
|
+
rtags `find ${LIB} -name '*.rb'`
|
|
49
|
+
|
|
50
|
+
tar: test
|
|
51
|
+
ln -fs rgl ../${RGL}
|
|
52
|
+
tar --directory=.. \
|
|
53
|
+
--create \
|
|
54
|
+
--dereference \
|
|
55
|
+
--file=${RGL}.tgz \
|
|
56
|
+
--gzip \
|
|
57
|
+
--exclude='CVS' \
|
|
58
|
+
--exclude='cvs' \
|
|
59
|
+
--exclude='misc' \
|
|
60
|
+
--exclude='doc' \
|
|
61
|
+
--exclude='homepage' \
|
|
62
|
+
--exclude='*.tgz' \
|
|
63
|
+
--exclude='*/.*' \
|
|
64
|
+
${RGL}
|
|
65
|
+
rm ../${RGL}
|
|
66
|
+
|
|
67
|
+
clean:
|
|
68
|
+
rm -rf rgl*.tgz graph.dot TAGS examples/*/*.dot
|
|
69
|
+
find . -name \*~ -print | xargs rm -f
|
|
70
|
+
find . -name \*.bak -print | xargs rm -f
|
|
71
|
+
find . -name core -print | xargs rm -f
|
|
72
|
+
|
data/README
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
= Ruby Graph Library (RGL)
|
|
2
|
+
|
|
3
|
+
RGL is a framework for graph data structures and algorithms.
|
|
4
|
+
|
|
5
|
+
The design of the library is much influenced by the Boost Graph Library (BGL)
|
|
6
|
+
which is written in C++ heavily using its template mechanism. Refer to
|
|
7
|
+
http://www.boost.org/libs/graph/doc for further links and documentation on graph
|
|
8
|
+
data structures and algorithms and the design rationales of BGL.
|
|
9
|
+
|
|
10
|
+
A comprehensive summary of graph terminology can be found in the the graph
|
|
11
|
+
section of the <em>Dictionary of Algorithms and Data Structures</em> at
|
|
12
|
+
http://www.nist.gov/dads/HTML/graph.html.
|
|
13
|
+
|
|
14
|
+
== Design principles
|
|
15
|
+
|
|
16
|
+
This document concentrates on the special issues of the implementation in
|
|
17
|
+
Ruby. The main design goals directly taken from the BGL design are:
|
|
18
|
+
|
|
19
|
+
* An interface for how the structure of a graph can be accessed using a generic
|
|
20
|
+
interface that hides the details of the graph data structure
|
|
21
|
+
implementation. This interface is defined by the module Graph, which should be
|
|
22
|
+
included in concrete classes.
|
|
23
|
+
|
|
24
|
+
* A standardized generic interface for traversing graphs (RGL::GraphIterator)
|
|
25
|
+
|
|
26
|
+
RGL provides some general purpose graph classes that conform to this interface,
|
|
27
|
+
but they are not meant to be the *only* graph classes. As in BGL I believe that
|
|
28
|
+
the main contribution of the RGL is the formulation of this interface.
|
|
29
|
+
|
|
30
|
+
The BGL graph interface and graph components are generic in the sense of the C++
|
|
31
|
+
Standard Template Library (STL). In Ruby other techniques are available to
|
|
32
|
+
express the generic character of the algorithms and data structures mainly using
|
|
33
|
+
mixins and iterators. The BGL documentation mentions three means to achieve
|
|
34
|
+
genericity:
|
|
35
|
+
|
|
36
|
+
* Algorithm/Data-Structure Interoperability
|
|
37
|
+
* Extension through Function Objects and Visitors
|
|
38
|
+
* Element Type Parameterization
|
|
39
|
+
* Vertex and Edge Property Multi-Parameterization
|
|
40
|
+
|
|
41
|
+
The first is easily achieved in RGL using mixins, which of course is not as
|
|
42
|
+
efficient than C++ templates (but much more readable :-). The second one is even
|
|
43
|
+
more easily implemented using standard iterators with blocks or using the
|
|
44
|
+
Stream module. The third one is no issue since Ruby is dynamically typed: Each
|
|
45
|
+
object can be a graph vertex. There is no need for a vertex (or even edge
|
|
46
|
+
type). In the current version of RGL properties of vertices are simply attached
|
|
47
|
+
using hashes. At first there seems to be not much need for the graph property
|
|
48
|
+
machinery.
|
|
49
|
+
|
|
50
|
+
=== Algorithms
|
|
51
|
+
|
|
52
|
+
The first version of RGL only contains a core set of algorithm patterns:
|
|
53
|
+
|
|
54
|
+
* Breadth First Search (RGL::BFSIterator)
|
|
55
|
+
* Depth First Search (RGL::DFSIterator)
|
|
56
|
+
|
|
57
|
+
The algorithm patterns by themselves do not compute any meaningful quantities
|
|
58
|
+
over graphs, they are merely building blocks for constructing graph
|
|
59
|
+
algorithms. The graph algorithms in RGL currently include:
|
|
60
|
+
|
|
61
|
+
* Topological Sort (RGL::TopsortIterator)
|
|
62
|
+
* Connected Components (RGL::Graph#each_connected_component)
|
|
63
|
+
* Strongly Connected Components (RGL::Graph#strongly_connected_components)
|
|
64
|
+
* Transitive Closure (RGL::Graph#transitive_closure)
|
|
65
|
+
|
|
66
|
+
=== Data Structures
|
|
67
|
+
|
|
68
|
+
RGL currently provides two graph classes that implement a generalized adjacency
|
|
69
|
+
list and an edge list adaptor.
|
|
70
|
+
|
|
71
|
+
* RGL::AdjacencyGraph
|
|
72
|
+
* RGL::ImplicitGraph
|
|
73
|
+
|
|
74
|
+
The AdjacencyGraph class is the general purpose *swiss army knife* of graph
|
|
75
|
+
classes. It is highly parameterized so that it can be optimized for different
|
|
76
|
+
situations: the graph is directed or undirected, allow or disallow parallel
|
|
77
|
+
edges, efficient access to just the out-edges, fast vertex insertion and removal
|
|
78
|
+
at the cost of extra space overhead, etc.
|
|
79
|
+
|
|
80
|
+
=== Differences to BGL
|
|
81
|
+
|
|
82
|
+
The concepts of IncidenceGraph, AdjacencyGraph and VertexListGraph (see
|
|
83
|
+
http://www.boost.org/libs/graph/doc/IncidenceGraph.html) are here bundled in the
|
|
84
|
+
base graph module. Most methods of IncidenceGraph should be standard in the base
|
|
85
|
+
module Graph. The complexity guarantees can not necessarily provided. See
|
|
86
|
+
http://www.boost.org/libs/graph/doc/graph_concepts.html
|
|
87
|
+
|
|
88
|
+
== Installation
|
|
89
|
+
|
|
90
|
+
RGL is depended on the _stream_ library which can also be downloaded from
|
|
91
|
+
http://rubyforge.org/frs/?group_id=110.
|
|
92
|
+
|
|
93
|
+
=== GEM Installation
|
|
94
|
+
|
|
95
|
+
Download the GEM file and install it with ..
|
|
96
|
+
|
|
97
|
+
gem install rgl-VERSION.gem
|
|
98
|
+
|
|
99
|
+
or directly with
|
|
100
|
+
|
|
101
|
+
gem install rgl
|
|
102
|
+
|
|
103
|
+
Use the correct version number for VERSION (e.g. 0.2.2). You may need root
|
|
104
|
+
privileges to install.
|
|
105
|
+
|
|
106
|
+
=== Normal Installation
|
|
107
|
+
|
|
108
|
+
You have to install stream library before. You can than install RGL with the
|
|
109
|
+
following command:
|
|
110
|
+
|
|
111
|
+
% ruby install.rb
|
|
112
|
+
|
|
113
|
+
from its distribution directory.
|
|
114
|
+
|
|
115
|
+
== Example irb session with RGL
|
|
116
|
+
|
|
117
|
+
irb> require 'rgl/adjacency'
|
|
118
|
+
irb> dg=RGL::DirectedAdjacencyGraph[1,2 ,2,3 ,2,4, 4,5, 6,4, 1,6]
|
|
119
|
+
# Use DOT to visualize this graph:
|
|
120
|
+
irb> require 'rgl/dot'
|
|
121
|
+
irb> dg.write_to_graphic_file('jpg')
|
|
122
|
+
"graph.jpg"
|
|
123
|
+
|
|
124
|
+
The result: link:../examples/example.jpg
|
|
125
|
+
|
|
126
|
+
irb> dg.directed?
|
|
127
|
+
true
|
|
128
|
+
irb> dg.vertices
|
|
129
|
+
[5, 6, 1, 2, 3, 4]
|
|
130
|
+
irb> dg.has_vertex? 4
|
|
131
|
+
true
|
|
132
|
+
|
|
133
|
+
Every object could be a vertex (there is no class Vertex), even the class object
|
|
134
|
+
_Object_:
|
|
135
|
+
|
|
136
|
+
irb> dg.has_vertex? Object
|
|
137
|
+
false
|
|
138
|
+
irb> dg.edges.sort.to_s
|
|
139
|
+
"(1-2)(1-6)(2-3)(2-4)(4-5)(6-4)"
|
|
140
|
+
irb> dg.to_undirected.edges.sort.to_s
|
|
141
|
+
"(1=2)(1=6)(2=3)(2=4)(5=4)(6=4)"
|
|
142
|
+
|
|
143
|
+
Add inverse edge (4-2) to directed graph:
|
|
144
|
+
|
|
145
|
+
irb> dg.add_edge 4,2
|
|
146
|
+
|
|
147
|
+
(4-2) == (2-4) in the undirected graph:
|
|
148
|
+
|
|
149
|
+
irb> dg.to_undirected.edges.sort.to_s
|
|
150
|
+
"(1=2)(1=6)(2=3)(2=4)(5=4)(6=4)"
|
|
151
|
+
|
|
152
|
+
(4-2) != (2-4) in directed graphs:
|
|
153
|
+
|
|
154
|
+
irb> dg.edges.sort.to_s
|
|
155
|
+
"(1-2)(1-6)(2-3)(2-4)(4-2)(4-5)(6-4)"
|
|
156
|
+
irb> dg.remove_edge 4,2
|
|
157
|
+
true
|
|
158
|
+
|
|
159
|
+
<em>Topological sort</em> is realized with as iterator:
|
|
160
|
+
|
|
161
|
+
require 'graph/traversal'
|
|
162
|
+
irb> dg.topsort_iterator.to_a
|
|
163
|
+
[1, 2, 3, 6, 4, 5]
|
|
164
|
+
|
|
165
|
+
A more elaborated example showing <em>implicit graphs</em>:
|
|
166
|
+
|
|
167
|
+
def module_graph
|
|
168
|
+
RGL::ImplicitGraph.new { |g|
|
|
169
|
+
g.vertex_iterator { |b|
|
|
170
|
+
ObjectSpace.each_object(Module, &b)
|
|
171
|
+
}
|
|
172
|
+
g.adjacent_iterator { |x, b|
|
|
173
|
+
x.ancestors.each { |y|
|
|
174
|
+
b.call(y) unless x == y || y == Kernel || y == Object
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
g.directed = true
|
|
178
|
+
}
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
This function creates a directed graph with vertices being all loaded modules:
|
|
182
|
+
|
|
183
|
+
g = module_graph
|
|
184
|
+
|
|
185
|
+
We only want to see the ancestors of RGL::AdjacencyGraph:
|
|
186
|
+
|
|
187
|
+
tree = bfs_search_tree_from(g,RGL::AdjacencyGraph)
|
|
188
|
+
|
|
189
|
+
Now we want to visualize this component of g with DOT. We therefore create a
|
|
190
|
+
subgraph of the original graph using a filtered graph:
|
|
191
|
+
|
|
192
|
+
g = g.vertices_filtered_by {|v| tree.has_vertex? v}
|
|
193
|
+
|
|
194
|
+
Create the graphics with DOT:
|
|
195
|
+
|
|
196
|
+
g.write_to_graphic_file
|
|
197
|
+
|
|
198
|
+
produces module_graph.jpg: link:../examples/module_graph.jpg
|
|
199
|
+
|
|
200
|
+
Look for more in the examples directory (i.e.
|
|
201
|
+
examples.rb[link:files/examples/examples_rb.html]).
|
|
202
|
+
|
|
203
|
+
== Credits
|
|
204
|
+
|
|
205
|
+
Many thanks to Robert Feldt which also worked on a graph library
|
|
206
|
+
(http://rockit.sf.net/subprojects/graphr) who pointed me to BGL and many other
|
|
207
|
+
graph resources. Manuel Simoni found a subtle bug in a preliminary version
|
|
208
|
+
announced at http://rubygarden.com/ruby?RubyAlgorithmPackage/Graph.
|
|
209
|
+
|
|
210
|
+
Robert kindly allowed to integrate his work on graphr, which I did not yet
|
|
211
|
+
succeed. Especially his work to output graphs for GraphViz (see
|
|
212
|
+
http://www.research.att.com/sw/tools/graphviz/download.html) is much more
|
|
213
|
+
elaborated than the minimal support in dot.rb.
|
|
214
|
+
|
|
215
|
+
Jason Voegele for set.rb implementing sets using hashes. These are used in the
|
|
216
|
+
implementation of adjacency lists in AdjacencyGraph.
|
|
217
|
+
|
|
218
|
+
Jeremy Siek one of the authors of the nice book "The Boost Graph Library (BGL)"
|
|
219
|
+
(http://cseng.awl.com/book/0,3828,0201729148,00.html) kindly allowed to use the
|
|
220
|
+
BGL documentation as a _cheap_ reference for RGL. He and Robert also gave
|
|
221
|
+
feedback and many ideas for RGL.
|
|
222
|
+
|
|
223
|
+
Dave Thomas for RDoc (http://rdoc.sourceforge.net) which generated what you read
|
|
224
|
+
and matz for Ruby. Dave included in the latest version of RDoc (alpha9) the
|
|
225
|
+
module dot/dot.rb which I use instead of Roberts module to visualize graphs (see
|
|
226
|
+
rgl/dot.rb).
|
|
227
|
+
|
|
228
|
+
== Copying
|
|
229
|
+
|
|
230
|
+
RGL is Copyright (c) 2002,2004 by Horst Duchene. It is free software, and may be
|
|
231
|
+
redistributed under the terms specified in the README file of the Ruby
|
|
232
|
+
distribution.
|
|
233
|
+
|
|
234
|
+
== Support
|
|
235
|
+
|
|
236
|
+
Please contact me at mailto:monora@users.sourceforge.net with bug reports
|
|
237
|
+
suggestions, and other comments. If you send patches, it would help if
|
|
238
|
+
they were in-line (not attachments) and generated using "diff -u".
|
|
239
|
+
|
|
240
|
+
|
data/Rakefile
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Rakefile for RGL -*- ruby -*-
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'rubygems'
|
|
5
|
+
require 'rake/gempackagetask'
|
|
6
|
+
rescue Exception
|
|
7
|
+
nil
|
|
8
|
+
end
|
|
9
|
+
require 'rake/clean'
|
|
10
|
+
require 'rake/testtask'
|
|
11
|
+
require 'rake/rdoctask'
|
|
12
|
+
|
|
13
|
+
# Determine the current version of the software
|
|
14
|
+
|
|
15
|
+
if `ruby -Ilib -rrgl/base -e'puts RGL_VERSION'` =~ /\S+$/
|
|
16
|
+
PKG_VERSION = $&
|
|
17
|
+
else
|
|
18
|
+
PKG_VERSION = "0.0.0"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
SUMMARY = "Ruby Graph Library"
|
|
22
|
+
SOURCES = FileList['lib/**/*.rb']
|
|
23
|
+
RDOC_DIR = './rgl'
|
|
24
|
+
|
|
25
|
+
# The default task is run if rake is given no explicit arguments.
|
|
26
|
+
|
|
27
|
+
desc "Default Task"
|
|
28
|
+
task :default => :test
|
|
29
|
+
|
|
30
|
+
# Define a test task.
|
|
31
|
+
|
|
32
|
+
Rake::TestTask.new { |t|
|
|
33
|
+
t.libs << "tests"
|
|
34
|
+
t.pattern = 'tests/Test*.rb'
|
|
35
|
+
t.verbose = true
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
task :test
|
|
39
|
+
|
|
40
|
+
# Define a test that will run all the test targets.
|
|
41
|
+
desc "Run all test targets"
|
|
42
|
+
task :testall => [:test ]
|
|
43
|
+
|
|
44
|
+
# Install rgl using the standard install.rb script.
|
|
45
|
+
|
|
46
|
+
desc "Install the application"
|
|
47
|
+
task :install do
|
|
48
|
+
ruby "install.rb"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# CVS Tasks ----------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
desc "Tag all the CVS files with the latest release number (TAG=x)"
|
|
54
|
+
task :tag do
|
|
55
|
+
rel = "REL_" + PKG_VERSION.gsub(/\./, '_')
|
|
56
|
+
rel << ENV['TAG'] if ENV['TAG']
|
|
57
|
+
puts rel
|
|
58
|
+
sh %{cvs commit -m 'pre-tag commit'}
|
|
59
|
+
sh %{cvs tag #{rel}}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Create a task to build the RDOC documentation tree.
|
|
63
|
+
|
|
64
|
+
rd = Rake::RDocTask.new("rdoc") { |rdoc|
|
|
65
|
+
rdoc.rdoc_dir = RDOC_DIR
|
|
66
|
+
# rdoc.template = 'kilmer'
|
|
67
|
+
# rdoc.template = 'css2'
|
|
68
|
+
rdoc.title = SUMMARY
|
|
69
|
+
rdoc.options << '--line-numbers' << '--inline-source' <<
|
|
70
|
+
'--main' << 'README'
|
|
71
|
+
rdoc.rdoc_files.include(SOURCES, 'README', 'examples/examples.rb')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
# ====================================================================
|
|
75
|
+
# Create a task that will package the rgl software into distributable
|
|
76
|
+
# tar, zip and gem files.
|
|
77
|
+
|
|
78
|
+
PKG_FILES = FileList[
|
|
79
|
+
'install.rb',
|
|
80
|
+
'[A-Z]*',
|
|
81
|
+
'tests/**/*.rb',
|
|
82
|
+
'examples/**/*'
|
|
83
|
+
] + SOURCES
|
|
84
|
+
|
|
85
|
+
if ! defined?(Gem)
|
|
86
|
+
puts "Package Target requires RubyGEMs"
|
|
87
|
+
else
|
|
88
|
+
spec = Gem::Specification.new do |s|
|
|
89
|
+
|
|
90
|
+
#### Basic information.
|
|
91
|
+
|
|
92
|
+
s.name = 'rgl'
|
|
93
|
+
s.version = PKG_VERSION
|
|
94
|
+
s.summary = SUMMARY
|
|
95
|
+
|
|
96
|
+
s.description = <<-EOF
|
|
97
|
+
RGL is a framework for graph data structures and algorithms.
|
|
98
|
+
|
|
99
|
+
The design of the library is much influenced by the Boost Graph Library (BGL)
|
|
100
|
+
which is written in C++ heavily using its template mechanism.
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
RGL currently contains a core set of algorithm patterns:
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
* Breadth First Search
|
|
107
|
+
* Depth First Search
|
|
108
|
+
|
|
109
|
+
The algorithm patterns by themselves do not compute any meaningful quantities
|
|
110
|
+
over graphs, they are merely building blocks for constructing graph
|
|
111
|
+
algorithms. The graph algorithms in RGL currently include:
|
|
112
|
+
|
|
113
|
+
* Topological Sort
|
|
114
|
+
* Connected Components
|
|
115
|
+
* Strongly Connected Components
|
|
116
|
+
* Transitive Closure
|
|
117
|
+
EOF
|
|
118
|
+
|
|
119
|
+
#### Dependencies and requirements.
|
|
120
|
+
|
|
121
|
+
s.add_dependency('stream', '>= 0.5')
|
|
122
|
+
s.requirements << "Stream library, v0.5 or later"
|
|
123
|
+
|
|
124
|
+
#### Which files are to be included in this gem? Everything! (Except CVS directories.)
|
|
125
|
+
s.files = PKG_FILES.to_a
|
|
126
|
+
|
|
127
|
+
#### Load-time details: library and application (you will need one or both).
|
|
128
|
+
|
|
129
|
+
s.require_path = 'lib' # Use these for libraries.
|
|
130
|
+
s.autorequire = 'rgl'
|
|
131
|
+
|
|
132
|
+
#### Documentation and testing.
|
|
133
|
+
|
|
134
|
+
s.has_rdoc = true
|
|
135
|
+
s.extra_rdoc_files = ['README']
|
|
136
|
+
s.rdoc_options <<
|
|
137
|
+
'--title' << 'RGL - Ruby Graph Library' <<
|
|
138
|
+
'--main' << 'README' <<
|
|
139
|
+
'--line-numbers'
|
|
140
|
+
|
|
141
|
+
#### Author and project details.
|
|
142
|
+
s.author = "Horst Duchene"
|
|
143
|
+
s.email = "hd.at.clr@hduchene.de"
|
|
144
|
+
s.homepage = "rgl.rubyforge.org"
|
|
145
|
+
s.rubyforge_project = "rgl"
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
|
149
|
+
#pkg.need_zip = true
|
|
150
|
+
pkg.need_tar = true
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# TAGS ---------------------------------------------------------------
|
|
155
|
+
|
|
156
|
+
file 'tags' => SOURCES do
|
|
157
|
+
print "Running ctags..."
|
|
158
|
+
sh %{ctags #{SOURCES.join(' ')}} # vi tags
|
|
159
|
+
puts "done."
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
file 'TAGS' => SOURCES do
|
|
163
|
+
sh %{ctags -e #{SOURCES.join(' ')}} # emacs TAGS
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Misc tasks =========================================================
|
|
167
|
+
|
|
168
|
+
def count_lines(filename)
|
|
169
|
+
lines = 0
|
|
170
|
+
codelines = 0
|
|
171
|
+
open(filename) { |f|
|
|
172
|
+
f.each do |line|
|
|
173
|
+
lines += 1
|
|
174
|
+
next if line =~ /^\s*$/
|
|
175
|
+
next if line =~ /^\s*#/
|
|
176
|
+
codelines += 1
|
|
177
|
+
end
|
|
178
|
+
}
|
|
179
|
+
[lines, codelines]
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def show_line(msg, lines, loc)
|
|
183
|
+
printf "%6s %6s %s\n", lines.to_s, loc.to_s, msg
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
desc "Count lines in the main files"
|
|
187
|
+
task :lines do
|
|
188
|
+
total_lines = 0
|
|
189
|
+
total_code = 0
|
|
190
|
+
show_line("File Name", "LINES", "LOC")
|
|
191
|
+
SOURCES.each do |fn|
|
|
192
|
+
lines, codelines = count_lines(fn)
|
|
193
|
+
show_line(fn, lines, codelines)
|
|
194
|
+
total_lines += lines
|
|
195
|
+
total_code += codelines
|
|
196
|
+
end
|
|
197
|
+
show_line("TOTAL", total_lines, total_code)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
ARCHIVEDIR = '/mnt/flash'
|
|
201
|
+
|
|
202
|
+
task :archive => [:package] do
|
|
203
|
+
cp FileList["pkg/*.tgz", "pkg/*.zip", "pkg/*.gem"], ARCHIVEDIR
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
desc "Copy rdoc html to rubyforge"
|
|
207
|
+
task :rdoc2rf => [:rdoc] do
|
|
208
|
+
#sh "scp -r #{RDOC_DIR} monora@rubyforge.org:/var/www/gforge-projects/rgl"
|
|
209
|
+
sh "scp examples/*.jpg monora@rubyforge.org:/var/www/gforge-projects/rgl/examples"
|
|
210
|
+
end
|