rgl 0.5.1 → 0.5.7

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b92e64e8461dc9a3f9f471e68c9a2876e93a44f5b858e0a40a30b6933e5136a8
4
+ data.tar.gz: f820274113a375f61620272c1eb6a11127562867e8fe9af8bc20cf075aca5fc6
5
+ SHA512:
6
+ metadata.gz: 8e887b25cc41ead029b67a58a21ce02536baf92a44912d8ff2208b04477ffd9556fde68dd0c4663caa9341cecd58b8102bfafe7df7512b5cbc7285764d0952e2
7
+ data.tar.gz: a610a0225a9c63fb83a841053377b07ee0d59dabf12a4379c30a1f8c27c5618e245f9d10f5f3f5c2aef08ddb323c3e4d357ad432d0c24be49701f8fe336340ef
data/ChangeLog CHANGED
@@ -1,41 +1,97 @@
1
+ 2019-01 Release 0.5.7
2
+
3
+ Horst Duchene
4
+ * Fully automate dev setup with Gitpod (41dd00)
5
+ * Add Dockerfile to install graphviz (2bd738)
6
+ * Examples do not call dotty (6bba96)
7
+ * Add ruby license file (a21aa5)
8
+ ujihisa <ujihisa@users.noreply.github.com>
9
+ * Test against Ruby 2.6 and 2.7 as well (50ac7c)
10
+ * Fix dead links (9184f3)
11
+ Harry Lascelles <hlascelles@users.noreply.github.com>
12
+ * Update .travis.yml (45b9a2)
13
+ * Make the links more explicit (95dc3b)
14
+ Harry Lascelles
15
+ * Add explicit license to gemspec (de3647)
16
+
17
+ 2019-01 Release 0.5.6
18
+
19
+ Artemy Kirienko
20
+ * PR #42 Add method Graph#path?(u, v) to check if a path exists between two vertices
21
+ Horst Duchene
22
+ * Fix #47 set_to_begin for graph iterator (881aa8)
23
+
24
+ 2019-01 Release 0.5.4
25
+
26
+ Lia Skalkos
27
+ * Enable options to be passed to #write_to_graphic_file (4ca972). For details see PR #41
28
+ Horst Duchene
29
+ * Fix travis-ci errors
30
+ * Add new ruby versions
31
+ * Fix gemspec errors
32
+ * Fix lint warnings
33
+ * Use version stream 0.5.2
34
+
35
+ 2017-04 Release 0.5.3
36
+
37
+ Horst Duchene
38
+ * Issue #38: Add error handling or dot functions. (719e38, 5a3423)
39
+ Thomas Orozco
40
+ * Remove Enumerable Extension (fde8a5)
41
+ * Update to codeclimate-test-reporter 1.x (25fdb5)
42
+ Mario Daskalov
43
+ * Clarify that you need graphviz in the README (35a4b4)
44
+
45
+ 2016-05 Release 0.5.2
46
+
47
+ Horst Duchene
48
+ * Issue #21: Use new method vertex_id instead of object_id to identify vertices in dot export. (fa7592)
49
+ * Integrate Code Climate's test coverage reporting (0ab722)
50
+ * Clarify traversal order of DFS search (see #20). (afa788)
51
+ Chase Gilliam
52
+ * drop 1.9.3 add newer jruby and rubinius (fad333)
53
+ Matías Battocchia
54
+ * Switched to a different heap implementation. (bd7c13)
55
+ gorn
56
+ * Adding failing test for issue #24 (1f6204)
57
+
1
58
  2015-12 Release 0.5.1
2
59
 
3
- Horst Duchene <monora@gmail.com>
60
+ Horst Duchene
4
61
  * Changed edge sequence to match example picture (daa88e)
5
62
 
6
- Chase <chase.gilliam@gmail.com>
63
+ Chase
7
64
  * updated algorithms to 6.1 and added test unit to support newer rubies (fbd874)
8
65
 
9
- Louis Rose <louismrose@gmail.com>
66
+ Louis Rose
10
67
  * Fix #15. Use object IDs rather than labels to identify vertexs in DOT graph
11
68
  to ensure that distinct nodes that share a label are shown. (33206f, 4fc455)
12
69
 
13
70
  2014-12 Release 0.5.0
14
71
 
15
- Horst Duchene <monora@gmail.com>
72
+ Horst Duchene
16
73
  * Changed edge sequence to match example picture (daa88e)
17
74
  * Fixed comment (6a6c93)
18
75
  * Fixed spelling (7ca281)
19
- Horst Duchêne <monora@gmail.com>
20
- Chase <chase.gilliam@gmail.com>
76
+ Horst Duchêne
77
+ Chase
21
78
  * updated algorithms to 6.1 and added test unit to support newer rubies (fbd874)
22
- Louis Rose <louismrose@gmail.com>
79
+ Louis Rose
23
80
  * Fix #15. Use object IDs rather than labels to identify vertexs in DOT graph to ensure that distinct nodes that share a label are shown. (33206f)
24
- * Issue #15. Fix tests. (4fc455)
25
-
81
+ * Issue #15. Fix tests. (4fc455)
26
82
 
27
83
  2014-12 Release 0.5.0
28
- Horst Duchene <monora@gmail.com>
84
+ Horst Duchene
29
85
  * Changed edge sequence to match example picture (daa88e)
30
86
  * Fixed comment (6a6c93)
31
87
  * Fixed spelling (7ca281)
32
- Horst Duchêne <monora@gmail.com>
33
- Chase <chase.gilliam@gmail.com>
88
+ Chase
34
89
  * updated algorithms to 6.1 and added test unit to support newer rubies (fbd874)
35
- Louis Rose <louismrose@gmail.com>
36
- * Fix #15. Use object IDs rather than labels to identify vertexs in DOT graph to ensure that distinct nodes that share a label are shown. (33206f)
37
- * Issue #15. Fix tests. (4fc455)
38
-
90
+ Louis Rose
91
+ * Fix #15. Use object IDs rather than labels to identify vertexs
92
+ in DOT graph to ensure that distinct nodes that share a label are
93
+ shown. (33206f)
94
+ * Issue #15. Fix tests. (4fc455)
39
95
 
40
96
  2014-12 Release 0.5.0
41
97
 
data/Gemfile CHANGED
@@ -2,6 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rake'
6
- gem 'yard'
7
- gem 'asciidoctor'
5
+ group :test do
6
+ gem "simplecov"
7
+ gem "codeclimate-test-reporter", "~> 1.0.0"
8
+ end
@@ -0,0 +1,267 @@
1
+ # Ruby Graph Library (RGL) [<img src="https://secure.travis-ci.org/monora/rgl.png?branch=master" alt="Build Status" />](https://travis-ci.org/monora/rgl) [<img src="https://codeclimate.com/github/monora/rgl/badges/coverage.svg" />](https://codeclimate.com/github/monora/rgl/coverage) [<img src="https://badge.fury.io/rb/rgl.svg" alt="Version"/>](https://badge.fury.io/rb/rgl)[![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/monora/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++. Refer to http://www.boost.org/libs/graph/doc for
7
+ further links and documentation on graph data structures and algorithms and
8
+ the design rationales of BGL.
9
+
10
+ A comprehensive summary of graph terminology can be found in the graph section
11
+ of the *Dictionary of Algorithms and Data Structures* at
12
+ http://www.nist.gov/dads/HTML/graph.html or
13
+ [Wikipedia](https://en.wikipedia.org/wiki/Graph_%28discrete_mathematics%29).
14
+
15
+ ## Documentation
16
+
17
+ * RGL's [API Reference](http://www.rubydoc.info/github/monora/rgl) at
18
+ http://rubydoc.info
19
+
20
+
21
+ ## Design principles
22
+
23
+ This document concentrates on the special issues of the implementation in
24
+ Ruby. The main design goals directly taken from the BGL design are:
25
+
26
+ * An interface for how the structure of a graph can be accessed using a
27
+ generic interface that hides the details of the graph data structure
28
+ implementation. This interface is defined by the module {RGL::Graph},
29
+ which should be included in concrete classes.
30
+
31
+ * A standardized generic interface for traversing graphs
32
+ {RGL::GraphIterator}
33
+
34
+
35
+ RGL provides some general purpose graph classes that conform to this
36
+ interface, but they are not meant to be the **only** graph classes. As in BGL
37
+ I believe that the main contribution of the RGL is the formulation of this
38
+ interface.
39
+
40
+ The BGL graph interface and graph components are generic in the sense of the
41
+ C++ Standard Template Library (STL). In Ruby other techniques are available to
42
+ express the generic character of the algorithms and data structures mainly
43
+ using mixins and iterators. The BGL documentation mentions three means to
44
+ achieve genericity:
45
+
46
+ * Algorithm/Data-Structure Interoperability
47
+ * Extension through Function Objects and Visitors
48
+ * Element Type Parameterization
49
+ * Vertex and Edge Property Multi-Parameterization
50
+
51
+
52
+ The first is easily achieved in RGL using mixins, which of course is not as
53
+ efficient than C++ templates (but much more readable :-). The second one is
54
+ even more easily implemented using standard iterators with blocks or using the
55
+ [stream](http://www.rubydoc.info/github/monora/stream) module. The third one
56
+ is no issue since Ruby is dynamically typed: Each object can be a graph
57
+ vertex. There is no need for a vertex (or even edge type). In the current
58
+ version of RGL properties of vertices are simply attached using hashes. At
59
+ first there seems to be not much need for the graph property machinery.
60
+
61
+ ### Algorithms
62
+
63
+ RGL current contains a core set of algorithm patterns:
64
+
65
+ * Breadth First Search {RGL::BFSIterator}
66
+ * Depth First Search {RGL::DFSIterator}
67
+
68
+
69
+ The algorithm patterns by themselves do not compute any meaningful quantities
70
+ over graphs, they are merely building blocks for constructing graph
71
+ algorithms. The graph algorithms in RGL currently include:
72
+
73
+ * Topological Sort {RGL::TopsortIterator}
74
+ * Connected Components {RGL::Graph#each_connected_component}
75
+ * Strongly Connected Components {RGL::Graph#strongly_connected_components}
76
+ * Transitive Closure {RGL::Graph#transitive_closure}
77
+ * Dijkstras Shortest Path Algorithm {RGL::DijkstraAlgorithm}
78
+ * Bellman Ford Algorithm {RGL::BellmanFordAlgorithm}
79
+
80
+
81
+ ### Data Structures
82
+
83
+ RGL currently provides two graph classes that implement a generalized
84
+ adjacency list and an edge list adaptor.
85
+
86
+ * {RGL::AdjacencyGraph}
87
+ * {RGL::ImplicitGraph}
88
+
89
+
90
+ The AdjacencyGraph class is the general purpose _swiss army knife_ of graph
91
+ classes. It is highly parameterized so that it can be optimized for different
92
+ situations: the graph is directed or undirected, allow or disallow parallel
93
+ edges, efficient access to just the out-edges, fast vertex insertion and
94
+ removal at the cost of extra space overhead, etc.
95
+
96
+ ### Differences to BGL
97
+
98
+ The concepts of IncidenceGraph, AdjacencyGraph and VertexListGraph (see
99
+ http://www.boost.org/libs/graph/doc/IncidenceGraph.html) are here bundled in
100
+ the base graph module. Most methods of IncidenceGraph should be standard in
101
+ the base module Graph. The complexity guarantees can not necessarily provided.
102
+ See http://www.boost.org/libs/graph/doc/graph_concepts.html.
103
+
104
+ ## Installation
105
+
106
+ % gem install rgl
107
+
108
+ or download the latest sources from the git repository
109
+ http://github.com/monora/rgl.
110
+
111
+ If you are going to use the drawing functionalities install [Graphviz](http://www.graphviz.org/).
112
+
113
+ ## Running tests
114
+
115
+ Checkout RGL git repository and go to the project directory. First, install
116
+ RGL dependencies with bundler:
117
+
118
+ % bundle install
119
+
120
+ After that you can run the tests:
121
+
122
+ % rake test
123
+
124
+ ## Example irb session with RGL
125
+
126
+ % irb -Ilib
127
+
128
+ irb> require 'rgl/adjacency'
129
+ irb> dg=RGL::DirectedAdjacencyGraph[1,2 ,2,3 ,2,4, 4,5, 6,4, 1,6]
130
+ # Use DOT to visualize this graph:
131
+ irb> require 'rgl/dot'
132
+ irb> dg.write_to_graphic_file('jpg')
133
+ "graph.jpg"
134
+
135
+ The result:
136
+
137
+ ![Example](https://github.com/monora/rgl/raw/master/images/example.jpg)
138
+
139
+ You can control the graph layout by passing layout parameters to `write_to_graphic_file`. See
140
+ `TestDot::test_to_dot_digraph_with_options` for an example using a feature implemented by Lia
141
+ Skalkos (see [PR #41](https://github.com/monora/rgl/pull/41)).
142
+
143
+ irb> dg.directed?
144
+ true
145
+ irb> dg.vertices
146
+ [5, 6, 1, 2, 3, 4]
147
+ irb> dg.has_vertex? 4
148
+ true
149
+
150
+ Every object could be a vertex (there is no class Vertex), even the class
151
+ object *Object*:
152
+
153
+ irb> dg.has_vertex? Object
154
+ false
155
+ irb> dg.edges.sort.to_s
156
+ "(1-2)(1-6)(2-3)(2-4)(4-5)(6-4)"
157
+ irb> dg.to_undirected.edges.sort.to_s
158
+ "(1=2)(1=6)(2=3)(2=4)(5=4)(6=4)"
159
+
160
+ Add inverse edge (4-2) to directed graph:
161
+
162
+ irb> dg.add_edge 4,2
163
+
164
+ (4-2) == (2-4) in the undirected graph:
165
+
166
+ irb> dg.to_undirected.edges.sort.to_s
167
+ "(1=2)(1=6)(2=3)(2=4)(5=4)(6=4)"
168
+
169
+ (4-2) != (2-4) in directed graphs:
170
+
171
+ irb> dg.edges.sort.to_s
172
+ "(1-2)(1-6)(2-3)(2-4)(4-2)(4-5)(6-4)"
173
+ irb> dg.remove_edge 4,2
174
+ true
175
+
176
+ Check whether a path exists between vertices 1 and 5
177
+
178
+ irb> require 'rgl/path'
179
+ irb> dg.path?(1, 5)
180
+ true
181
+
182
+ *Topological sort* is implemented as an iterator:
183
+
184
+ require 'rgl/topsort'
185
+ irb> dg.topsort_iterator.to_a
186
+ [1, 2, 3, 6, 4, 5]
187
+
188
+ A more elaborated example showing *implicit graphs*:
189
+
190
+ require 'rgl/implicit'
191
+ def module_graph
192
+ RGL::ImplicitGraph.new { |g|
193
+ g.vertex_iterator { |b|
194
+ ObjectSpace.each_object(Module, &b)
195
+ }
196
+ g.adjacent_iterator { |x, b|
197
+ x.ancestors.each { |y|
198
+ b.call(y) unless x == y || y == Kernel || y == Object
199
+ }
200
+ }
201
+ g.directed = true
202
+ }
203
+ end
204
+
205
+ This function creates a directed graph, with vertices being all loaded
206
+ modules:
207
+
208
+ g = module_graph
209
+
210
+ We only want to see the ancestors of {RGL::AdjacencyGraph}:
211
+
212
+ require 'rgl/traversal'
213
+ tree = g.bfs_search_tree_from(RGL::AdjacencyGraph)
214
+
215
+ Now we want to visualize this component of g with DOT. We therefore create a
216
+ subgraph of the original graph, using a filtered graph:
217
+
218
+ g = g.vertices_filtered_by {|v| tree.has_vertex? v}
219
+ g.write_to_graphic_file('jpg')
220
+
221
+ creates the following graph image with DOT:
222
+
223
+ ![Module graph](https://github.com/monora/rgl/raw/master/images/module_graph.jpg)
224
+
225
+ This graph shows all loaded RGL modules:
226
+
227
+ ![RGL Modules](https://github.com/monora/rgl/raw/master/images/rgl_modules.png)
228
+
229
+ Look for more in
230
+ [examples](https://github.com/monora/rgl/tree/master/examples) directory.
231
+
232
+ I collect some links to stuff around RGL at http://del.icio.us/monora/rgl.
233
+
234
+ ## Credits
235
+
236
+ Many thanks to Robert Feldt which also worked on a graph library
237
+ (http://rockit.sf.net/subprojects/graphr) who pointed me to BGL and many other
238
+ graph resources.
239
+
240
+ Robert kindly allowed to integrate his work on graphr, which I did not yet
241
+ succeed. Especially his work to output graphs for
242
+ [GraphViz](http://www.graphviz.org) is much more elaborated than the minimal
243
+ support in dot.rb.
244
+
245
+ Jeremy Siek one of the authors of the nice book [The Boost Graph
246
+ Library](http://www.boost.org/libs/graph/doc) kindly allowed to use the BGL
247
+ documentation as a *cheap* reference for RGL. He and Robert also gave feedback
248
+ and many ideas for RGL.
249
+
250
+ Dave Thomas for [RDoc](http://rdoc.sourceforge.net) which generated what you
251
+ read and matz for Ruby. Dave included in the latest version of RDoc (alpha9)
252
+ the module dot/dot.rb which I use instead of Roberts module to visualize
253
+ graphs (see rgl/dot.rb).
254
+
255
+ Jeremy Bopp, John Carter, Sascha Doerdelmann, Shawn Garbett, Andreas Schörk
256
+ and Kirill Lashuk for contributing additions, test cases and bugfixes.
257
+
258
+ Kirill Lashuk who started to take over further development in November 2012.
259
+
260
+ See also http://github.com/monora/rgl/contributors.
261
+
262
+ ## Copying
263
+
264
+ RGL is Copyright (c) 2002,2004,2005,2008,2013,2015,2019,2020 by Horst
265
+ Duchene. It is free software, and may be redistributed under the [Ruby
266
+ license](https://en.wikipedia.org/wiki/Ruby_License) and terms specified in
267
+ the LICENSE file.
data/Rakefile CHANGED
@@ -6,16 +6,16 @@ require 'bundler/setup'
6
6
  require 'rubygems/package_task'
7
7
 
8
8
  require 'rake/testtask'
9
+ require 'rake/clean'
9
10
  require 'yard'
10
11
 
11
12
  $:.unshift File.join(File.dirname(__FILE__), 'lib')
12
13
  require 'rgl/base' # require base module to get RGL_VERSION
13
14
 
14
- SUMMARY = "Ruby Graph Library"
15
15
  SOURCES = FileList['lib/**/*.rb']
16
16
 
17
17
  # The default task is run if rake is given no explicit arguments.
18
- desc "Default Task"
18
+ desc 'Default Task'
19
19
  task :default => :test
20
20
 
21
21
  # Define a test task.
@@ -26,23 +26,9 @@ Rake::TestTask.new do |t|
26
26
  t.verbose = true
27
27
  end
28
28
 
29
- begin
30
- require 'rcov/rcovtask'
31
-
32
- desc "Calculate code coverage with rcov"
33
- Rcov::RcovTask.new(:rcov) do |t|
34
- t.libs << 'test'
35
- t.pattern = 'test/*_test.rb'
36
- t.verbose = true
37
- t.rcov_opts += ['--exclude', 'test/,gems/']
38
- end
39
- rescue LoadError
40
- nil # rcov is available only on Ruby 1.8
41
- end
42
-
43
29
  # Git tagging
44
30
 
45
- desc "Commit all changes as a new version commit. Tag the commit with v<version> tag"
31
+ desc 'Commit all changes as a new version commit. Tag the commit with v<version> tag'
46
32
  task :tag do
47
33
  puts "Committing and tagging version #{RGL_VERSION}"
48
34
  `git commit -am 'Version #{RGL_VERSION}'`
@@ -58,13 +44,13 @@ Bundler::GemHelper.install_tasks
58
44
  # TAGS ---------------------------------------------------------------
59
45
 
60
46
  file 'tags' => SOURCES do
61
- print "Running ctags..."
62
- sh %{ctags #{SOURCES.join(' ')}} # vi tags
63
- puts "done."
47
+ print 'Running ctags...'
48
+ sh %(ctags #{SOURCES.join(' ')}) # vi tags
49
+ puts 'done.'
64
50
  end
65
51
 
66
52
  file 'TAGS' => SOURCES do
67
- sh %{etags #{SOURCES.join(' ')}} # emacs TAGS
53
+ sh %(etags #{SOURCES.join(' ')}) # emacs TAGS
68
54
  end
69
55
 
70
56
  # Misc tasks =========================================================
@@ -87,36 +73,35 @@ def show_line(msg, lines, loc)
87
73
  printf "%6s %6s %s\n", lines.to_s, loc.to_s, msg
88
74
  end
89
75
 
90
- desc "Count lines in the main files"
76
+ desc 'Count lines in the main files'
91
77
  task :lines do
92
78
  total_lines = 0
93
79
  total_code = 0
94
- show_line("File Name", "LINES", "LOC")
80
+ show_line('File Name', 'LINES', 'LOC')
95
81
  SOURCES.each do |fn|
96
82
  lines, codelines = count_lines(fn)
97
83
  show_line(fn, lines, codelines)
98
84
  total_lines += lines
99
- total_code += codelines
85
+ total_code += codelines
100
86
  end
101
- show_line("TOTAL", total_lines, total_code)
87
+ show_line('TOTAL', total_lines, total_code)
102
88
  end
103
89
 
104
90
  # simple rake task to output a changelog between two commits, tags ...
105
91
  # output is formatted simply, commits are grouped under each author name
106
92
  #
107
- desc "generate changelog with nice clean output"
108
- task :changelog, :since_c, :until_c do |t,args|
93
+ desc 'generate changelog with nice clean output'
94
+ task :changelog, :since_c, :until_c do |t, args|
109
95
  since_c = args[:since_c] || `git tag | tail -1`.chomp
110
96
  until_c = args[:until_c]
111
- cmd=`git log --pretty='format:%ci::%an <%ae>::%s::%H' #{since_c}..#{until_c}`
97
+ cmd = `git log --pretty='format:%ci::%an <%ae>::%s::%H' #{since_c}..#{until_c}`
112
98
 
113
99
  entries = Hash.new
114
100
  changelog_content = String.new
115
101
 
116
102
  cmd.split("\n").each do |entry|
117
- date, author, subject, hash = entry.chomp.split("::")
103
+ _, author, subject, hash = entry.chomp.split('::')
118
104
  entries[author] = Array.new unless entries[author]
119
- day = date.split(" ").first
120
105
  entries[author] << "#{subject} (#{hash[0..5]})" unless subject =~ /Merge/
121
106
  end
122
107