npgrt 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 444d0978a8020feaefb2a5e0adcad3e4c161d8d3
4
- data.tar.gz: c771aeaef308edf04c7005103865d61011fcae85
3
+ metadata.gz: 7b4a63c69e53e5b3931b1190c18a36d97609e815
4
+ data.tar.gz: 05368d350a9eed5f83e360da4302abe2429c633f
5
5
  SHA512:
6
- metadata.gz: 1145e1cfcfa9a752eab716013492a6df6a711de972f2dc61cecfb1e5eb62a5bc5d50082da70926bd98fa233c33fbd9e318d40f046cbb79e45e97957e96ecb118
7
- data.tar.gz: 9a1303dd3ef1be63407acf1e16e2a9671eb237b025c739798fe8a3aa8533af764c4414e09840d6767b48094cf4ff78633416d2c521c524a38d4d17401b55e3f3
6
+ metadata.gz: 7fc1519805172f33d646f83fee5c8a6a22f46c13726ea8a7df4f8f2c21e492f1f84a7f92c7aff602dd45077b3618541bf939362f9304fdddd938309fc721d8c6
7
+ data.tar.gz: ab0cb7fa3460e9565c44c2d953e3d1e7929e33600e10dc39fd195ec422aa91fdf3a3cd000279d15bf83315ab4d425a12b2e02e375570bfdcb2f8870216c656a6
data/lib/npgrt.rb CHANGED
@@ -1,5 +1,16 @@
1
1
  require "npgrt/version"
2
2
  require 'npgrt/win32api'
3
3
  require 'npgrt/message'
4
+ require 'npgrt/filesystem'
4
5
  require 'npgrt/require'
5
-
6
+ require 'npgrt/algorithm'
7
+ require 'npgrt/find'
8
+ require 'npgrt/report'
9
+ module NPGRT
10
+ extend Win32API
11
+ extend Message
12
+ extend FileSystem
13
+ extend Require
14
+ extend Algorithm
15
+ extend Find
16
+ end
data/lib/npgrt.rb~ CHANGED
@@ -1,4 +1,16 @@
1
1
  require "npgrt/version"
2
+ require 'npgrt/win32api'
2
3
  require 'npgrt/message'
4
+ require 'npgrt/filesystem'
3
5
  require 'npgrt/require'
4
-
6
+ require 'npgrt/algorithm'
7
+ require 'npgrt/find'
8
+ require 'npgrt/report'
9
+ module NPGRT
10
+ extend Win32API
11
+ extend Message
12
+ extend FileSystem
13
+ extend Require
14
+ extend Algorithm
15
+ extend Find
16
+ end
Binary file
@@ -0,0 +1,178 @@
1
+ module NPGRT
2
+ module Algorithm
3
+ def dfs(start, &b)
4
+ yield(lambda{|v| dfs(v, &b)}, start)
5
+ end
6
+
7
+ def bfs(*start)
8
+ yield(start.method(:push), start.shift) until start.empty?
9
+ end
10
+
11
+ def array_to_hash(arr)
12
+ hsh = {}
13
+ arr.each_with_index{|e, i| hsh[i] = e if e}
14
+ hsh
15
+ end
16
+
17
+ def hash_to_array(hsh)
18
+ arr = []
19
+ hsh.each{|k, v| arr[k] = v}
20
+ arr
21
+ end
22
+
23
+ class AlgorithmError < StandardError; end
24
+ class CycleFound < StandardError; end
25
+ class NotFound < StandardError; end
26
+ def graph_buildpath(st, ed, pre)
27
+ ret = []
28
+ while ed != st && ed != -1
29
+ raise CycleFound, 'path cycled' if ret.include?(ed)
30
+ ret.unshift ed
31
+ ed = pre[ed]
32
+ end
33
+ if ed == st
34
+ ret.unshift st
35
+ else
36
+ raise NotFound
37
+ end
38
+ ret
39
+ end
40
+
41
+
42
+ class Graph
43
+ attr_accessor :adjlist, :adjmat
44
+
45
+ RelaxOperators = Struct.new(:add, :min, :maxvalue)
46
+ DefaultRelax = RelaxOperators.new(
47
+ lambda{|a, b| a + b},
48
+ lambda{|a, b| [a,b].min},
49
+ Float::INFINITY
50
+ )
51
+
52
+ def adjlist
53
+ @adjlist ||= adjmat.map(&NPGRT.method(:array_to_hash))
54
+ end
55
+ def adjmat
56
+ @adjmat ||= adjlist.map(&NPGRT.method(:hash_to_array))
57
+ end
58
+ def floyd!(relax = DefaultRelax)
59
+ a = adjmat
60
+ n = adjmat.size
61
+ self.adjlist = nil #reset
62
+ (0...n).each{|k|
63
+ (0...n).each{|i|
64
+ next if i == k
65
+ next if a[i][k] == nil
66
+ (0...n).each{|j|
67
+ next if j == k || j == i
68
+ next if a[i][k] == nil || a[k][j] == nil
69
+ if !a[i][j]
70
+ a[i][j] = relax.add[ a[i][k], a[k][j] ]
71
+ else
72
+ a[i][j] = relax.min[
73
+ a[i][j],
74
+ relax.add[a[i][k], a[k][j] ]
75
+
76
+ ]
77
+ end
78
+ }
79
+ }
80
+ }
81
+ self
82
+ end
83
+
84
+ def floyd
85
+ deepcopy_adjmat.floyd!
86
+ end
87
+
88
+ def bellman_ford(start = [0], relax = DefaultRelax)
89
+ a = self.adjlist
90
+ dis = a.map { relax.maxvalue }
91
+ pre = a.map { -1 }
92
+ start.each{|i| dis[i] = 0; pre[i] = i }
93
+ n = a.size
94
+ (n-1).times{
95
+ relaxed = false
96
+ each_edge do |u, v, w|
97
+ next if w == nil
98
+ rel = relax.add[ dis[u] , w]
99
+ if rel == relax.min[ rel, dis[v] ]
100
+ dis[v] = rel
101
+ pre[v] = u
102
+ relaxed = true
103
+ end
104
+ end
105
+ break if !relaxed
106
+ }
107
+ [dis, pre]
108
+ end
109
+
110
+ def spfa(start = [0], relax = DefaultRelax)
111
+ a = self.adjlist
112
+ dis = a.map { relax.maxvalue }
113
+ pre = a.map { -1 }
114
+ inq = []
115
+ start.each{|i| dis[i] = 0; pre[i] = i; inq[i] = true }
116
+ n = a.size
117
+
118
+ NPGRT.bfs *start do |yielder, u|
119
+ inq[u] = false
120
+ a[u].each do |v, w|
121
+ next if w == nil
122
+ rel = relax.add[ dis[u] , w]
123
+ if rel == relax.min[ rel, dis[v] ]
124
+ dis[v] = rel
125
+ pre[v] = u
126
+ if !inq[v]
127
+ inq[v] = true
128
+ yielder.call v
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ [dis, pre]
135
+ end
136
+
137
+ def each_edge(start = (0...adjlist.size))
138
+ start.each{|u| self.adjlist[u].each{|v, w|
139
+ yield u, v, w
140
+ }}
141
+ end
142
+
143
+ def toposort
144
+ x = self.adjlist
145
+ id = x.map { 0 }
146
+ each_edge{|u, v, w| id[v] += 1 if w}
147
+ n = x.size
148
+ ret = []
149
+ while true
150
+ a = (0...n).select{|u| id[u] == 0} - ret
151
+ break if a == []
152
+ ret.concat a
153
+ each_edge a do |u, v, w|
154
+ id[v] -= 1 if w
155
+ end
156
+ end
157
+ raise CycleFound, 'in toposorting' if ret.size != n
158
+ ret
159
+ end
160
+
161
+ def deepcopy_adjmat
162
+ x = Graph.new
163
+ x.adjmat = Marshal.load Marshal.dump adjmat
164
+ x.adjlist = nil
165
+ x
166
+ end
167
+
168
+ def deepcopy_adjlist
169
+ x = Graph.new
170
+ x.adjlist = Marshal.load Marshal.dump adjlist
171
+ x.adjmat = nil
172
+ x
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+
@@ -0,0 +1,179 @@
1
+ module NPGRT
2
+ module Algorithm
3
+ def dfs(start, &b)
4
+ yield(lambda{|v| dfs(v, &b)}, start)
5
+ end
6
+
7
+ def bfs(*start)
8
+ yield(start.method(:push), start.shift) until start.empty?
9
+ end
10
+
11
+ def array_to_hash(arr)
12
+ hsh = {}
13
+ arr.each_with_index{|e, i| hsh[i] = e if e}
14
+ hsh
15
+ end
16
+
17
+ def hash_to_array(hsh)
18
+ arr = []
19
+ hsh.each{|k, v| arr[k] = v}
20
+ arr
21
+ end
22
+
23
+ class AlgorithmError < StandardError; end
24
+ class CycleFound < StandardError; end
25
+ class NotFound < StandardError; end
26
+ def graph_buildpath(st, ed, pre)
27
+ ret = []
28
+ while ed != st && ed != -1
29
+ raise CycleFound, 'path cycled' if ret.include?(ed)
30
+ ret.unshift ed
31
+ ed = pre[ed]
32
+ end
33
+ if ed == st
34
+ ret.unshift st
35
+ else
36
+ raise NotFound
37
+ end
38
+ ret
39
+ end
40
+
41
+
42
+ class Graph
43
+ attr_accessor :adjlist, :adjmat
44
+
45
+ RelaxOperators = Struct.new(:add, :min, :maxvalue)
46
+ DefaultRelax = RelaxOperators.new(
47
+ lambda{|a, b| a + b},
48
+ lambda{|a, b| [a,b].min},
49
+ Float::INFINITY
50
+ )
51
+
52
+ def adjlist
53
+ @adjlist ||= adjmat.map(&NPGRT.method(:array_to_hash))
54
+ end
55
+ def adjmat
56
+ @adjmat ||= adjlist.map(&NPGRT.method(:hash_to_array))
57
+ end
58
+ def floyd!(relax = DefaultRelax)
59
+ a = adjmat
60
+ n = adjmat.size
61
+ self.adjlist = nil #reset
62
+ (0...n).each{|k|
63
+ (0...n).each{|i|
64
+ next if i == k
65
+ next if a[i][k] == nil
66
+ (0...n).each{|j|
67
+ next if j == k || j == i
68
+ next if a[i][k] == nil || a[k][j] == nil
69
+ if !a[i][j]
70
+ a[i][j] = relax.add[ a[i][k], a[k][j] ]
71
+ else
72
+ a[i][j] = relax.min[
73
+ a[i][j],
74
+ relax.add[a[i][k], a[k][j] ]
75
+
76
+ ]
77
+ end
78
+ }
79
+ }
80
+ }
81
+ self
82
+ end
83
+
84
+ def floyd
85
+ deepcopy_adjmat.floyd!
86
+ end
87
+
88
+ def bellman_ford(start = [0], relax = DefaultRelax)
89
+ a = self.adjlist
90
+ dis = a.map { relax.maxvalue }
91
+ pre = a.map { -1 }
92
+ start.each{|i| dis[i] = 0; pre[i] = i }
93
+ n = a.size
94
+ (n-1).times{
95
+ relaxed = false
96
+ each_edge do |u, v, w|
97
+ next if w == nil
98
+ rel = relax.add[ dis[u] , w]
99
+ if rel == relax.min[ rel, dis[v] ]
100
+ dis[v] = rel
101
+ pre[v] = u
102
+ relaxed = true
103
+ end
104
+ end
105
+ break if !relaxed
106
+ }
107
+ [dis, pre]
108
+ end
109
+
110
+ def spfa(start = [0], relax = DefaultRelax)
111
+ a = self.adjlist
112
+ dis = a.map { relax.maxvalue }
113
+ pre = a.map { -1 }
114
+ inq = []
115
+ start.each{|i| dis[i] = 0; pre[i] = i; inq[i] = true }
116
+ n = a.size
117
+
118
+ NPGRT.bfs *start do |yielder, u|
119
+ inq[u] = false
120
+ a[u].each do |v, w|
121
+ next if w == nil
122
+ rel = relax.add[ dis[u] , w]
123
+ if rel == relax.min[ rel, dis[v] ]
124
+ dis[v] = rel
125
+ pre[v] = u
126
+ if !inq[v]
127
+ inq[v] = true
128
+ yielder.call v
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ [dis, pre]
135
+ end
136
+
137
+ def each_edge(start = (0...adjlist.size))
138
+ start.each{|u| self.adjlist[u].each{|v, w|
139
+ yield u, v, w
140
+ }}
141
+ end
142
+
143
+ def toposort
144
+ x = self.adjlist
145
+ id = x.map { 0 }
146
+ each_edge{|u, v, w| id[v] += 1 if w}
147
+ n = x.size
148
+ ret = []
149
+ while true
150
+ a = (0...n).select{|u| id[u] == 0} - ret
151
+ break if a == []
152
+ ret.concat a
153
+ each_edge a do |u, v, w|
154
+ id[v] -= 1 if w
155
+ end
156
+ end
157
+ raise CycleFound, 'in toposorting' if ret.size != n
158
+ ret
159
+ end
160
+
161
+ def deepcopy_adjmat
162
+ x = Graph.new
163
+ x.adjmat = Marshal.load Marshal.dump adjmat
164
+ x.adjlist = nil
165
+ x
166
+ end
167
+
168
+ def deepcopy_adjlist
169
+ x = Graph.new
170
+ x.adjlist = Marshal.load Marshal.dump adjlist
171
+ x.adjmat = nil
172
+ x
173
+ end
174
+ end
175
+ end
176
+ extend Algorithm
177
+ end
178
+
179
+
@@ -0,0 +1,8 @@
1
+ module NPGRT
2
+ module FileSystem
3
+ def normalize_pathsep_os(path)
4
+ path.tr("/", "\\")
5
+ end
6
+ end
7
+
8
+ end
@@ -0,0 +1,9 @@
1
+ module NPGRT
2
+ module FileSystem
3
+ def normalize_pathsep_os(path)
4
+ path.tr("/", "\\")
5
+ end
6
+ end
7
+
8
+ extend FileSystem
9
+ end
data/lib/npgrt/find.rb ADDED
@@ -0,0 +1,31 @@
1
+ module NPGRT
2
+ module Find
3
+ extend self
4
+ private
5
+ def each_path
6
+ ENV['path'].split(";").each{|x|
7
+ yield x
8
+ }
9
+ end
10
+ public
11
+
12
+ def binary(name)
13
+ each_path do |path|
14
+ v = File.join(path, name)
15
+ return NPGRT.normalize_pathsep_os(v) if FileTest.file?(v)
16
+ end
17
+ Gem.find_files(name).each do |v|
18
+ return NPGRT.normalize_pathsep_os(v) if FileTest.file?(v)
19
+ end
20
+
21
+ nil
22
+ end
23
+ def hostruby
24
+ binary("ruby.exe")
25
+ end
26
+
27
+
28
+ end
29
+
30
+
31
+ end