gratr19 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README +335 -0
- data/examples/graph_self.rb +54 -0
- data/examples/module_graph.jpg +0 -0
- data/examples/module_graph.rb +12 -0
- data/examples/self_graph.jpg +0 -0
- data/examples/visualize.jpg +0 -0
- data/examples/visualize.rb +8 -0
- data/install.rb +49 -0
- data/lib/gratr.rb +42 -0
- data/lib/gratr/adjacency_graph.rb +230 -0
- data/lib/gratr/base.rb +34 -0
- data/lib/gratr/biconnected.rb +116 -0
- data/lib/gratr/chinese_postman.rb +123 -0
- data/lib/gratr/common.rb +74 -0
- data/lib/gratr/comparability.rb +92 -0
- data/lib/gratr/digraph.rb +115 -0
- data/lib/gratr/digraph_distance.rb +185 -0
- data/lib/gratr/dot.rb +90 -0
- data/lib/gratr/edge.rb +145 -0
- data/lib/gratr/graph.rb +314 -0
- data/lib/gratr/graph_api.rb +82 -0
- data/lib/gratr/import.rb +44 -0
- data/lib/gratr/labels.rb +103 -0
- data/lib/gratr/maximum_flow.rb +107 -0
- data/lib/gratr/rdot.rb +332 -0
- data/lib/gratr/search.rb +422 -0
- data/lib/gratr/strong_components.rb +127 -0
- data/lib/gratr/undirected_graph.rb +153 -0
- data/lib/gratr/version.rb +6 -0
- data/lib/priority-queue/benchmark/dijkstra.rb +171 -0
- data/lib/priority-queue/compare_comments.rb +49 -0
- data/lib/priority-queue/ext/priority_queue/CPriorityQueue/extconf.rb +2 -0
- data/lib/priority-queue/lib/priority_queue.rb +14 -0
- data/lib/priority-queue/lib/priority_queue/c_priority_queue.rb +1 -0
- data/lib/priority-queue/lib/priority_queue/poor_priority_queue.rb +46 -0
- data/lib/priority-queue/lib/priority_queue/ruby_priority_queue.rb +525 -0
- data/lib/priority-queue/setup.rb +1551 -0
- data/lib/priority-queue/test/priority_queue_test.rb +371 -0
- data/tests/TestBiconnected.rb +53 -0
- data/tests/TestChinesePostman.rb +53 -0
- data/tests/TestComplement.rb +54 -0
- data/tests/TestDigraph.rb +333 -0
- data/tests/TestDigraphDistance.rb +138 -0
- data/tests/TestDot.rb +75 -0
- data/tests/TestEdge.rb +171 -0
- data/tests/TestInspection.rb +57 -0
- data/tests/TestMultiEdge.rb +57 -0
- data/tests/TestNeighborhood.rb +64 -0
- data/tests/TestProperties.rb +160 -0
- data/tests/TestSearch.rb +277 -0
- data/tests/TestStrongComponents.rb +85 -0
- data/tests/TestTriagulated.rb +137 -0
- data/tests/TestUndirectedGraph.rb +219 -0
- metadata +152 -0
data/tests/TestDot.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2006 Shawn Patrick Garbett
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice(s),
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of the Shawn Garbett nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software
|
14
|
+
# without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#++
|
27
|
+
|
28
|
+
require 'test/unit'
|
29
|
+
require 'gratr/import'
|
30
|
+
|
31
|
+
class TestDot < Test::Unit::TestCase # :nodoc:
|
32
|
+
|
33
|
+
DG_DOT = <<-DOT
|
34
|
+
digraph {
|
35
|
+
label = "Datacenters"
|
36
|
+
Miranda [
|
37
|
+
color = green,
|
38
|
+
style = filled,
|
39
|
+
label = "Miranda"
|
40
|
+
]
|
41
|
+
|
42
|
+
Miranda -> Hillview [
|
43
|
+
|
44
|
+
]
|
45
|
+
|
46
|
+
Miranda -> "San Francisco" [
|
47
|
+
|
48
|
+
]
|
49
|
+
|
50
|
+
Miranda -> "San Jose" [
|
51
|
+
|
52
|
+
]
|
53
|
+
|
54
|
+
Sunnyvale -> Miranda [
|
55
|
+
|
56
|
+
]
|
57
|
+
|
58
|
+
}
|
59
|
+
DOT
|
60
|
+
|
61
|
+
def setup
|
62
|
+
@dg = DOT::DOTDigraph.new('label' => 'Datacenters')
|
63
|
+
@dg << DOT::DOTNode.new('name' => 'Miranda', 'color' => 'green', 'style' => 'filled')
|
64
|
+
@dg << DOT::DOTDirectedArc.new('from' => 'Miranda', 'to' => 'Hillview')
|
65
|
+
@dg << DOT::DOTDirectedArc.new('from' => 'Miranda', 'to' => '"San Francisco"')
|
66
|
+
@dg << DOT::DOTDirectedArc.new('from' => 'Miranda', 'to' => '"San Jose"')
|
67
|
+
@dg << DOT::DOTDirectedArc.new('from' => 'Sunnyvale', 'to' => 'Miranda')
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_generation
|
71
|
+
assert @dg.to_s
|
72
|
+
assert_equal DG_DOT, @dg.to_s
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/tests/TestEdge.rb
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2006 Shawn Patrick Garbett
|
3
|
+
# Copyright (c) 2002,2004,2005 by Horst Duchene
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
# are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright notice(s),
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
# * Neither the name of the Shawn Garbett nor the names of its contributors
|
14
|
+
# may be used to endorse or promote products derived from this software
|
15
|
+
# without specific prior written permission.
|
16
|
+
#
|
17
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
18
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
19
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
20
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
21
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
22
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
23
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
24
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
25
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
#++
|
28
|
+
|
29
|
+
|
30
|
+
require 'test/unit'
|
31
|
+
require 'gratr/import'
|
32
|
+
|
33
|
+
class TestArc < Test::Unit::TestCase # :nodoc:
|
34
|
+
|
35
|
+
def setup
|
36
|
+
@e = Arc.new(1,2,'boo')
|
37
|
+
@u = Edge.new(1,2,'hoo')
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_edge_new
|
41
|
+
assert_raises(ArgumentError) {Arc.new}
|
42
|
+
assert_raises(ArgumentError) {Arc.new(1)}
|
43
|
+
assert Arc.new(1,2)
|
44
|
+
assert Arc.new(1,2,'label')
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_edge_getters
|
48
|
+
|
49
|
+
assert_equal(1, @e.source)
|
50
|
+
assert_equal(2, @e.target)
|
51
|
+
assert_equal('boo', @e.label)
|
52
|
+
|
53
|
+
assert_equal(1, @e[0])
|
54
|
+
assert_equal(2, @e[1])
|
55
|
+
assert_equal('boo', @e[2])
|
56
|
+
|
57
|
+
assert_equal(1, @e[-3])
|
58
|
+
assert_equal(2, @e[-2])
|
59
|
+
assert_equal('boo', @e[-1])
|
60
|
+
|
61
|
+
assert_raise(IndexError) {@e[-4]}
|
62
|
+
assert_raise(IndexError) {@e[3]}
|
63
|
+
|
64
|
+
assert_equal(1, @e['source'])
|
65
|
+
assert_equal(2, @e['target'])
|
66
|
+
assert_equal('boo', @e['label'])
|
67
|
+
|
68
|
+
assert_equal(1, @e[:source])
|
69
|
+
assert_equal(2, @e[:target])
|
70
|
+
assert_equal('boo', @e[:label])
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_edge_setters
|
74
|
+
@e.source = 23
|
75
|
+
@e.target = 42
|
76
|
+
@e.label = 'Yabba'
|
77
|
+
assert_equal(23, @e.source)
|
78
|
+
assert_equal(42, @e.target)
|
79
|
+
assert_equal('Yabba',@e.label)
|
80
|
+
|
81
|
+
@e['source'] = 2
|
82
|
+
@e['target'] = 1
|
83
|
+
@e['label'] = 'Dabba'
|
84
|
+
assert_equal(2, @e.source)
|
85
|
+
assert_equal(1, @e.target)
|
86
|
+
assert_equal('Dabba',@e.label)
|
87
|
+
|
88
|
+
@e[:source] = 9
|
89
|
+
@e[:target] = 8
|
90
|
+
@e['label'] = 'Doooo!'
|
91
|
+
assert_equal(9, @e.source)
|
92
|
+
assert_equal(8, @e.target)
|
93
|
+
assert_equal('Doooo!',@e.label)
|
94
|
+
|
95
|
+
@e[0] = 'Fred'
|
96
|
+
@e[1] = 'Flintstone'
|
97
|
+
@e[2] = 'and'
|
98
|
+
assert_equal('Fred', @e.source)
|
99
|
+
assert_equal('Flintstone',@e.target)
|
100
|
+
assert_equal('and', @e.label)
|
101
|
+
|
102
|
+
@e[-3] = 'Barney'
|
103
|
+
@e[-2] = 'Rubble'
|
104
|
+
@e[-1] = nil
|
105
|
+
assert_equal('Barney', @e.source)
|
106
|
+
assert_equal('Rubble', @e.target)
|
107
|
+
assert_equal(nil, @e.label)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_edge_simple_methods
|
111
|
+
assert_equal([1,2,'boo'], @e.to_a)
|
112
|
+
assert_equal("(1-2 'boo')", @e.to_s)
|
113
|
+
@e.label = nil
|
114
|
+
assert_equal("(1-2)", @e.to_s)
|
115
|
+
assert(@e.eql?(Arc.new(1,2)))
|
116
|
+
assert(!@e.eql?(Arc.new(1,3)))
|
117
|
+
assert(!Arc.new(2,1).eql?(@e))
|
118
|
+
|
119
|
+
assert(@e == (Arc.new(1,2)))
|
120
|
+
assert(@e.reverse == (Arc.new(2,1)))
|
121
|
+
assert(Arc.new(1,2) != (Arc.new(1,3)))
|
122
|
+
assert(Arc.new(2,1) != @e)
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_edge_sort
|
126
|
+
x = [ Arc.new(2,3), Arc.new(1,3), Arc.new(1,2), Arc.new(2,1) ].sort
|
127
|
+
assert_equal [Arc.new(1,2), Arc.new(1,3), Arc.new(2,1), Arc.new(2,3)], x
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_undirected_edge_new
|
131
|
+
assert_raises(ArgumentError) {Edge.new}
|
132
|
+
assert_raises(ArgumentError) {Edge.new(1)}
|
133
|
+
assert Edge.new(1,2)
|
134
|
+
assert Edge.new(1,2,'label')
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_undirected_edge_getters
|
138
|
+
assert_equal(1,@u.source)
|
139
|
+
assert_equal(2,@u.target)
|
140
|
+
assert_equal([1,2,'hoo'],@u.to_a)
|
141
|
+
assert_equal("(1=2 'hoo')",@u.to_s)
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_undirected_edge_methods
|
145
|
+
@u.label = nil
|
146
|
+
assert_equal("(1=2)",@u.to_s)
|
147
|
+
assert_equal("(1=2)",Edge.new(2,1).to_s)
|
148
|
+
|
149
|
+
assert @u.eql?(Edge.new(2,1))
|
150
|
+
assert @u == Edge.new(2,1,'boo')
|
151
|
+
assert @u != Edge.new(2,3)
|
152
|
+
|
153
|
+
assert_equal(@u.hash,Edge.new(2,1).hash)
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_undirected_edge_sort
|
157
|
+
x=[Edge.new(12, 1), Edge.new(2,11)].sort
|
158
|
+
assert_equal [Edge.new(2,11), Edge.new(1,12)], x
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_hash
|
162
|
+
assert_equal Arc[1,2,:b], Arc[1,2,:c]
|
163
|
+
assert_equal Arc[1,2,:b].hash, Arc[1,2,:c].hash
|
164
|
+
assert Arc[1,2] != Arc[2,1]
|
165
|
+
assert Arc[1,2] != Edge[1,2]
|
166
|
+
assert_equal Edge[1,2], Edge[2,1]
|
167
|
+
assert_equal Edge[1,2,:a], Edge[2,1,:b]
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2006 Shawn Patrick Garbett
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice(s),
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of the Shawn Garbett nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software
|
14
|
+
# without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#++
|
27
|
+
|
28
|
+
|
29
|
+
require 'test/unit'
|
30
|
+
require 'gratr/import'
|
31
|
+
|
32
|
+
class TestInspection < Test::Unit::TestCase # :nodoc:
|
33
|
+
|
34
|
+
def setup
|
35
|
+
@dg = DirectedMultiGraph[
|
36
|
+
[0,0,1] => 1,
|
37
|
+
[1,2,2] => 2,
|
38
|
+
[1,3,3] => 4,
|
39
|
+
[1,4,4] => nil,
|
40
|
+
[4,1,5] => 8,
|
41
|
+
[1,2,6] => 16,
|
42
|
+
[3,3,7] => 32,
|
43
|
+
[3,3,8] => 64 ]
|
44
|
+
@dg[3] = 128
|
45
|
+
@dg[0] = 256
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_inspection
|
49
|
+
inspect = @dg.inspect
|
50
|
+
assert_equal 384, @dg.vertices.inject(0) {|a,v| a += (@dg[v] || 0)}
|
51
|
+
assert_equal 127, @dg.edges.inject(0) {|a,e| a += (@dg[e] || 0)}
|
52
|
+
reflect = eval inspect
|
53
|
+
assert reflect == @dg
|
54
|
+
assert_equal 127, reflect.edges.inject(0) {|a,e| a += (reflect[e] || 0)}
|
55
|
+
assert_equal 384, reflect.vertices.inject(0) {|a,v| a += (reflect[v] || 0)}
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2006 Shawn Patrick Garbett
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice(s),
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of the Shawn Garbett nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software
|
14
|
+
# without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#++
|
27
|
+
|
28
|
+
|
29
|
+
require 'test/unit'
|
30
|
+
require 'gratr/import'
|
31
|
+
|
32
|
+
class TestMultiArc < Test::Unit::TestCase # :nodoc:
|
33
|
+
|
34
|
+
def test_directed_pseudo_graph
|
35
|
+
dpg=DirectedPseudoGraph[ :a,:b,
|
36
|
+
:a,:b,
|
37
|
+
:a,:b ]
|
38
|
+
assert_equal 3, dpg.edges.size
|
39
|
+
x=0
|
40
|
+
dpg.edges.each {|e| dpg[e] = (x+=1)}
|
41
|
+
assert_equal 6, dpg.edges.inject(0) {|a,v| a+=dpg[v]}
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_directed_multi_graph
|
45
|
+
dmg=DirectedMultiGraph[ :a,:a,
|
46
|
+
:a,:a,
|
47
|
+
:a,:b,
|
48
|
+
:a,:b,
|
49
|
+
:b,:b,
|
50
|
+
:b,:b ]
|
51
|
+
assert_equal 6, dmg.edges.size
|
52
|
+
x = 0
|
53
|
+
dmg.edges.each {|e| dmg[e] = (x+=1)}
|
54
|
+
assert_equal 21, dmg.edges.inject(0) {|a,v| a+=dmg[v]}
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2006 Shawn Patrick Garbett
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice(s),
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of the Shawn Garbett nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software
|
14
|
+
# without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#++
|
27
|
+
|
28
|
+
|
29
|
+
require 'test/unit'
|
30
|
+
require 'gratr/import'
|
31
|
+
|
32
|
+
class TestNeighborhood < Test::Unit::TestCase # :nodoc:
|
33
|
+
|
34
|
+
def setup
|
35
|
+
@d = Digraph[:a,:b, :a,:f,
|
36
|
+
:b,:g,
|
37
|
+
:c,:b, :c,:g,
|
38
|
+
:d,:c, :d,:g,
|
39
|
+
:e,:d,
|
40
|
+
:f,:e, :f,:g,
|
41
|
+
:g,:a, :g,:e]
|
42
|
+
@w = [:a,:b]
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_open_out_neighborhood
|
46
|
+
assert_equal [:g], @d.set_neighborhood([:a], :in)
|
47
|
+
assert_equal [], [:f,:g] - @d.set_neighborhood(@w, :out)
|
48
|
+
assert_equal [], @w - @d.open_pth_neighborhood(@w, 0, :out)
|
49
|
+
assert_equal [], [:f, :g] - @d.open_pth_neighborhood(@w, 1, :out)
|
50
|
+
assert_equal [], [:e] - @d.open_pth_neighborhood(@w, 2, :out)
|
51
|
+
assert_equal [], [:d] - @d.open_pth_neighborhood(@w, 3, :out)
|
52
|
+
assert_equal [], [:c] - @d.open_pth_neighborhood(@w, 4, :out)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_closed_out_neighborhood
|
56
|
+
assert_equal [], @w - @d.closed_pth_neighborhood(@w, 0, :out)
|
57
|
+
assert_equal [], [:a,:b,:f,:g] - @d.closed_pth_neighborhood(@w, 1, :out)
|
58
|
+
assert_equal [], [:a,:b,:e,:f,:g] - @d.closed_pth_neighborhood(@w, 2, :out)
|
59
|
+
assert_equal [], [:a,:b,:d,:e,:f,:g] - @d.closed_pth_neighborhood(@w, 3, :out)
|
60
|
+
assert_equal [], [:a,:b,:c,:d,:e,:f,:g] - @d.closed_pth_neighborhood(@w, 4, :out)
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2006 Shawn Patrick Garbett
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice(s),
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer in the documentation
|
11
|
+
# and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of the Shawn Garbett nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software
|
14
|
+
# without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#++
|
27
|
+
|
28
|
+
|
29
|
+
require 'test/unit'
|
30
|
+
require 'gratr/import'
|
31
|
+
require 'gratr/dot'
|
32
|
+
|
33
|
+
# This test runs the classes from Appendix F in
|
34
|
+
# _Algorithmic_Graph_Theory_and_Perfect_Graphs,
|
35
|
+
# by Martin Charles Golumbic
|
36
|
+
class TestProperties < Test::Unit::TestCase # :nodoc:
|
37
|
+
|
38
|
+
def test_g1
|
39
|
+
g1 = UndirectedGraph[ :a,:b, :a,:d, :a,:e, :a,:i, :a,:g, :a,:h,
|
40
|
+
:b,:c, :b,:f,
|
41
|
+
:c,:d, :c,:h,
|
42
|
+
:d,:h, :d,:e,
|
43
|
+
:e,:f,
|
44
|
+
:f,:g, :f,:h, :f,:i,
|
45
|
+
:h,:i ]
|
46
|
+
|
47
|
+
assert !g1.triangulated?
|
48
|
+
assert !g1.complement.triangulated? # Disagrees with Golumbic!
|
49
|
+
assert !g1.comparability?
|
50
|
+
assert !g1.complement.comparability?
|
51
|
+
assert !g1.interval?
|
52
|
+
assert !g1.complement.interval?
|
53
|
+
assert !g1.permutation?
|
54
|
+
assert !g1.split?
|
55
|
+
|
56
|
+
# g1.write_to_graphic_file('jpg','g1')
|
57
|
+
# g1.complement.write_to_graphic_file('jpg','g1_complement')
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_g2
|
61
|
+
g2 = UndirectedGraph[ :a,:b, :a,:e,
|
62
|
+
:b,:c, :b,:e, :b,:f,
|
63
|
+
:c,:d, :c,:f, :c,:g,
|
64
|
+
:d,:g,
|
65
|
+
:e,:f,
|
66
|
+
:f,:g]
|
67
|
+
|
68
|
+
assert g2.triangulated?
|
69
|
+
assert !g2.complement.triangulated?
|
70
|
+
assert !g2.comparability?
|
71
|
+
assert g2.complement.comparability?
|
72
|
+
assert g2.interval?
|
73
|
+
assert !g2.complement.interval?
|
74
|
+
assert !g2.permutation?
|
75
|
+
assert !g2.split?
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_g3
|
79
|
+
g3 = UndirectedGraph[ :a,:c,
|
80
|
+
:b,:e,
|
81
|
+
:c,:d, :c,:f,
|
82
|
+
:d,:f, :d,:g, :d,:e,
|
83
|
+
:e,:g,
|
84
|
+
:f,:g ]
|
85
|
+
assert g3.triangulated?
|
86
|
+
assert !g3.complement.triangulated?
|
87
|
+
assert !g3.comparability?
|
88
|
+
assert g3.complement.comparability?
|
89
|
+
assert g3.interval?
|
90
|
+
assert !g3.complement.interval?
|
91
|
+
assert !g3.permutation?
|
92
|
+
assert !g3.split?
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_g4
|
96
|
+
g4 = UndirectedGraph[ :a,:b,
|
97
|
+
:b,:c,
|
98
|
+
:c,:d, :c,:e,
|
99
|
+
:d,:f,
|
100
|
+
:e,:g]
|
101
|
+
assert g4.triangulated?
|
102
|
+
assert !g4.complement.triangulated?
|
103
|
+
assert g4.comparability?
|
104
|
+
assert !g4.complement.comparability?
|
105
|
+
assert !g4.interval?
|
106
|
+
assert !g4.complement.interval?
|
107
|
+
assert !g4.permutation?
|
108
|
+
assert !g4.split?
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_g5
|
112
|
+
g5 = UndirectedGraph[ :a,:b, :a,:c,
|
113
|
+
:b,:c, :b,:d, :b,:f, :b,:g,
|
114
|
+
:c,:e, :c,:f, :c,:g,
|
115
|
+
:d,:f,
|
116
|
+
:e,:g,
|
117
|
+
:f,:g]
|
118
|
+
assert g5.triangulated?
|
119
|
+
assert g5.complement.triangulated?
|
120
|
+
assert g5.comparability?
|
121
|
+
assert !g5.complement.comparability?
|
122
|
+
assert !g5.interval?
|
123
|
+
assert g5.complement.interval?
|
124
|
+
assert !g5.permutation?
|
125
|
+
assert g5.split?
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_g6
|
129
|
+
g6 = UndirectedGraph[ :a,:c, :a,:d,
|
130
|
+
:b,:c,
|
131
|
+
:c,:f,
|
132
|
+
:d,:e, :d,:f]
|
133
|
+
assert !g6.triangulated?
|
134
|
+
assert !g6.complement.triangulated?
|
135
|
+
assert g6.comparability?
|
136
|
+
assert g6.complement.comparability?
|
137
|
+
assert !g6.interval?
|
138
|
+
assert !g6.complement.interval?
|
139
|
+
assert g6.permutation?
|
140
|
+
assert !g6.split?
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_g7
|
144
|
+
g7 = UndirectedGraph[ :a,:b, :a,:c,
|
145
|
+
:b,:c, :b,:d, :b,:e,
|
146
|
+
:c,:e, :c,:f,
|
147
|
+
:d,:e,
|
148
|
+
:e,:f]
|
149
|
+
assert g7.triangulated?
|
150
|
+
assert g7.complement.triangulated?
|
151
|
+
assert !g7.comparability?
|
152
|
+
assert !g7.complement.comparability?
|
153
|
+
assert !g7.interval?
|
154
|
+
assert !g7.complement.interval?
|
155
|
+
assert !g7.permutation?
|
156
|
+
assert g7.split?
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|