mpath_graph 0.0.1 → 0.0.3
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.
- checksums.yaml +5 -13
- data/README.md +6 -3
- data/lib/mpath_graph/version.rb +1 -1
- data/lib/mpath_graph.rb +85 -19
- data/mpath_graph.gemspec +2 -0
- data/test/test_mpath_graph.rb +36 -0
- metadata +29 -13
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
YzU1MjkzOWRhZWYyNDkyMmI0MjA0MDMzNzMxZjVlOTRkNDMzZmQ0MQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d7b6e50d3b2aba78f3916fe417dbb9652e6c028d
|
4
|
+
data.tar.gz: 4e65ecd1d69aa8b692183050da44819dc63a7e56
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YWNiZjM2YmJjYTNkZjIzMTc3YzA2ZDNhNGEyZjk0YTdkOGU5Y2M0OTY4MzUw
|
11
|
-
YjlkNjhjMDM3OGE3ZGI3YjNhMDk2Y2ZiMzc0YmI4YzJlODJkZDk=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZTU5ODFkMzI5NzQ4MDYzNjhhZGQwNTYzYjYzZmRkODYyZjc3ZTQxMzQ5Njdk
|
14
|
-
ZjMxMDE1MGI1NDQ5ODgwZjE0N2Y5NzdhODVjNzMwNjFhYWQ2MDVlMzI5OGRk
|
15
|
-
MDNhYmZlNThkMzY0ZjNiNjgzN2E5ZDVjMzQzMzgwYzA0ZTc3YmE=
|
6
|
+
metadata.gz: da13ccac14270b6e38af0cc5130dee05e97cf7a627b4db0a7eddd03b643b83331ede683346e1a8cb9ffaa32af039e12d23682760c5b1d9e5a74c7aabd81acb50
|
7
|
+
data.tar.gz: 2664b8ee4407f970234e452f968cc041fbe21be8cc02e763fdf67d62b5fd88a26c8b83125850bf1bdb19c5a75ea1f8eadcdcf42dc291cf25b8c8a14d3d83f101
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
#
|
1
|
+
# MPathGraph
|
2
|
+
[](http://badge.fury.io/rb/mpath_graph)
|
3
|
+
[](https://www.gittip.com/neoriddle/)
|
2
4
|
|
3
|
-
|
5
|
+
**MPathGraph** is a library to work with _m_-path graphs generated from a hamiltonian cycle in a hypercube graph.
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
@@ -18,7 +20,8 @@ Or install it yourself as:
|
|
18
20
|
|
19
21
|
## Usage
|
20
22
|
|
21
|
-
TODO: Write usage instructions here
|
23
|
+
- TODO: Write usage instructions here.
|
24
|
+
- TODO: Include some chunks of code as examples.
|
22
25
|
|
23
26
|
## Contributing
|
24
27
|
|
data/lib/mpath_graph/version.rb
CHANGED
data/lib/mpath_graph.rb
CHANGED
@@ -60,14 +60,15 @@ module MPathGraph
|
|
60
60
|
worm = []
|
61
61
|
neighbors = nil
|
62
62
|
steps_walked = 0
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
63
|
+
options[:initial_vertex] ||= 0
|
64
|
+
options[:worm_size] ||= 5
|
65
|
+
options[:walk_limit] ||= -1
|
66
|
+
options[:pause] ||= false
|
67
|
+
options[:induced_cycles_limit] ||= -1
|
68
|
+
options[:print_non_cycles] ||= false
|
68
69
|
|
69
70
|
# Initialize worm with initial vertex
|
70
|
-
worm <<
|
71
|
+
worm << options[:initial_vertex]
|
71
72
|
|
72
73
|
# Initialize pseudo-random number generator
|
73
74
|
prng = Random.new
|
@@ -76,7 +77,7 @@ module MPathGraph
|
|
76
77
|
puts ["k-path","Induced cycle","Steps walked"].to_csv
|
77
78
|
|
78
79
|
# Fill worm
|
79
|
-
while worm.size < worm_size
|
80
|
+
while worm.size < options[:worm_size]
|
80
81
|
# Find neighbors of last vertex
|
81
82
|
neighbors = find_neighbors(worm.last, edges) unless neighbors
|
82
83
|
|
@@ -96,7 +97,7 @@ module MPathGraph
|
|
96
97
|
worm << neighbors[rnd_idx] # Append vertex
|
97
98
|
neighbors = nil # Clean neighbors
|
98
99
|
|
99
|
-
if worm.size == worm_size # When worm is full
|
100
|
+
if worm.size == options[:worm_size] # When worm is full
|
100
101
|
steps_walked += 1 # Increment worm steps walked
|
101
102
|
|
102
103
|
# Output well-formed worm
|
@@ -105,8 +106,8 @@ module MPathGraph
|
|
105
106
|
|
106
107
|
# if has_cycles?(worm, edges, verbose: options[:verbose])
|
107
108
|
if (cycle = find_cycles(worm, edges))
|
108
|
-
|
109
|
-
|
109
|
+
# Flush csv row data to STDIN
|
110
|
+
puts [worm, cycle, steps_walked].to_csv
|
110
111
|
|
111
112
|
# if options[:verbose] # Verbose worm with cycle
|
112
113
|
# puts "Worm\t#{worm.inspect}"
|
@@ -114,24 +115,21 @@ module MPathGraph
|
|
114
115
|
# end
|
115
116
|
|
116
117
|
# Pause when verbose
|
117
|
-
# if pause
|
118
|
+
# if options[:pause]
|
118
119
|
# STDERR.puts "Press a key to continue..."
|
119
120
|
# STDIN.getc
|
120
121
|
# end
|
121
122
|
|
122
123
|
# Check induced cycles counter limit
|
123
|
-
return if induced_cycles_limit==0
|
124
|
-
induced_cycles_limit-=1
|
124
|
+
return if options[:induced_cycles_limit]==0
|
125
|
+
options[:induced_cycles_limit]-=1
|
125
126
|
else
|
126
|
-
|
127
|
-
|
127
|
+
# Flush csv row data to STDIN
|
128
|
+
puts [worm, nil, steps_walked].to_csv if options[:print_non_cycles]
|
128
129
|
end
|
129
130
|
|
130
|
-
# Flush csv row data to STDIN
|
131
|
-
puts csv_row.to_csv
|
132
|
-
|
133
131
|
worm.shift # Drop first vertex in worm (as queue)
|
134
|
-
break if steps_walked > walk_limit && walk_limit > 0 # Stop walking
|
132
|
+
break if steps_walked > options[:walk_limit] && options[:walk_limit] > 0 # Stop walking
|
135
133
|
end
|
136
134
|
end
|
137
135
|
end
|
@@ -191,4 +189,72 @@ module MPathGraph
|
|
191
189
|
|
192
190
|
paths
|
193
191
|
end
|
192
|
+
|
193
|
+
module OddHole
|
194
|
+
def self.rw_search_first(edges, options = {})
|
195
|
+
options[:worm_size] ||= 5
|
196
|
+
return nil if edges.size < options[:worm_size]
|
197
|
+
|
198
|
+
prng = Random.new
|
199
|
+
rnd_idx = prng.rand(edges.size)
|
200
|
+
options[:initial_vertex] ||= edges[rnd_idx][rnd_idx%2]
|
201
|
+
worm = [options[:initial_vertex]]
|
202
|
+
|
203
|
+
while worm.size < options[:worm_size]
|
204
|
+
return nil if worm.empty?
|
205
|
+
|
206
|
+
neighbors = MPathGraph::find_neighbors(worm.last, edges)
|
207
|
+
neighbors = neighbors - worm
|
208
|
+
|
209
|
+
if neighbors.empty?
|
210
|
+
worm.pop
|
211
|
+
next
|
212
|
+
else
|
213
|
+
rnd_idx = prng.rand(neighbors.size)
|
214
|
+
worm << neighbors[rnd_idx]
|
215
|
+
neighbors = nil
|
216
|
+
|
217
|
+
if worm.size == options[:worm_size]
|
218
|
+
if is_an_odd_hole?(worm, edges, options[:worm_size])
|
219
|
+
return worm
|
220
|
+
else
|
221
|
+
worm.shift
|
222
|
+
next
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
# Given a path in a graph G, check if it is an odd-hole with an
|
230
|
+
# specific size.
|
231
|
+
#
|
232
|
+
# @param path [Array<Integer>] Sequence of vertices to check.
|
233
|
+
# @param edges [Array<Array<Integer>>] Set of edges of graph G.
|
234
|
+
# @param size [Array<Array<Integer>>] Odd-hole size to search.
|
235
|
+
def self.is_an_odd_hole?(path, edges, size = 5)
|
236
|
+
raise ArgumentError, "Hole size must be at least 5" if size<5
|
237
|
+
raise ArgumentError, "Hole size must be odd" if size % 2 == 0
|
238
|
+
raise ArgumentError, "Path must have odd-hole size" if path.size != size
|
239
|
+
|
240
|
+
cycle_edge = order_uedge(path[0],path[-1])
|
241
|
+
return false unless edges.include?(cycle_edge)
|
242
|
+
|
243
|
+
(0..size-3).each do |i| # First vertex
|
244
|
+
(2..size-2).each do |j| # Offset from first vertex
|
245
|
+
next if i+j > size-1
|
246
|
+
uedge = order_uedge(path[i],path[i+j])
|
247
|
+
return false if edges.include?(uedge)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
true
|
252
|
+
end
|
253
|
+
|
254
|
+
# Order entries of a tuple.
|
255
|
+
def self.order_uedge(v,u)
|
256
|
+
v < u ? [v,u] : [u,v]
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
194
260
|
end
|
data/mpath_graph.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_runtime_dependency 'ruby-progressbar'
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
24
|
spec.add_development_dependency "rake"
|
23
25
|
spec.add_development_dependency "rspec"
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'mpath_graph'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'minitest/unit'
|
4
|
+
|
5
|
+
# Author:: Israel Buitron (mailto:ibuitron@computacion.cs.cinvestav.mx)
|
6
|
+
class TestMPathGraphOddHole < MiniTest::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@oh5_e = [[1,2],[1,5],[2,3],[3,4],[4,5]]
|
10
|
+
@oh7_e = [[1,2],[1,7],[2,3],[3,4],[4,5],[5,6],[6,7]]
|
11
|
+
@g = [[1,2],[1,5],[2,3],[3,4],[4,5]]
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_is_an_odd_hole?
|
15
|
+
# Test with 5-odd-hole
|
16
|
+
assert_raises(ArgumentError) { MPathGraph::OddHole::is_an_odd_hole?(nil, @oh5_e, 2) }
|
17
|
+
assert_raises(ArgumentError) { MPathGraph::OddHole::is_an_odd_hole?(nil, @oh5_e, 3) }
|
18
|
+
assert_raises(ArgumentError) { MPathGraph::OddHole::is_an_odd_hole?((1..6).to_a, @oh5_e, 5) }
|
19
|
+
refute MPathGraph::OddHole::is_an_odd_hole?([1,2,3,4,10], @oh5_e, 5)
|
20
|
+
assert MPathGraph::OddHole::is_an_odd_hole?([1,2,3,4,5], @oh5_e, 5)
|
21
|
+
|
22
|
+
# Test with 7-odd-hole
|
23
|
+
assert MPathGraph::OddHole::is_an_odd_hole?((1..7).to_a, @oh7_e, 7)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_order_uedge
|
27
|
+
assert [1,2], MPathGraph::OddHole::order_uedge(1,2)
|
28
|
+
assert [1,2], MPathGraph::OddHole::order_uedge(2,1)
|
29
|
+
assert [1,1], MPathGraph::OddHole::order_uedge(1,1)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_rw_search_first
|
33
|
+
computed = MPathGraph::OddHole::rw_search_first(@g)
|
34
|
+
assert_equal [1,2,3,4,5], computed.sort
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,55 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mpath_graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Israel Buitron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ruby-progressbar
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- - ~>
|
31
|
+
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
33
|
version: '1.3'
|
20
34
|
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
|
-
- - ~>
|
38
|
+
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '1.3'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rspec
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - ">="
|
46
60
|
- !ruby/object:Gem::Version
|
47
61
|
version: '0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
description: m-Path graphs library
|
@@ -59,7 +73,7 @@ executables: []
|
|
59
73
|
extensions: []
|
60
74
|
extra_rdoc_files: []
|
61
75
|
files:
|
62
|
-
- .gitignore
|
76
|
+
- ".gitignore"
|
63
77
|
- Gemfile
|
64
78
|
- LICENSE.txt
|
65
79
|
- README.md
|
@@ -67,6 +81,7 @@ files:
|
|
67
81
|
- lib/mpath_graph.rb
|
68
82
|
- lib/mpath_graph/version.rb
|
69
83
|
- mpath_graph.gemspec
|
84
|
+
- test/test_mpath_graph.rb
|
70
85
|
homepage: ''
|
71
86
|
licenses:
|
72
87
|
- MIT
|
@@ -77,18 +92,19 @@ require_paths:
|
|
77
92
|
- lib
|
78
93
|
required_ruby_version: !ruby/object:Gem::Requirement
|
79
94
|
requirements:
|
80
|
-
- -
|
95
|
+
- - ">="
|
81
96
|
- !ruby/object:Gem::Version
|
82
97
|
version: '0'
|
83
98
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
99
|
requirements:
|
85
|
-
- -
|
100
|
+
- - ">="
|
86
101
|
- !ruby/object:Gem::Version
|
87
102
|
version: '0'
|
88
103
|
requirements: []
|
89
104
|
rubyforge_project:
|
90
|
-
rubygems_version: 2.
|
105
|
+
rubygems_version: 2.2.2
|
91
106
|
signing_key:
|
92
107
|
specification_version: 4
|
93
108
|
summary: m-Path graphs library
|
94
|
-
test_files:
|
109
|
+
test_files:
|
110
|
+
- test/test_mpath_graph.rb
|