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 +4 -4
- data/lib/npgrt.rb +12 -1
- data/lib/npgrt.rb~ +13 -1
- data/lib/npgrt/.version.rb.swp +0 -0
- data/lib/npgrt/algorithm.rb +178 -0
- data/lib/npgrt/algorithm.rb~ +179 -0
- data/lib/npgrt/filesystem.rb +8 -0
- data/lib/npgrt/filesystem.rb~ +9 -0
- data/lib/npgrt/find.rb +31 -0
- data/lib/npgrt/find.rb~ +31 -0
- data/lib/npgrt/message.rb +0 -1
- data/lib/npgrt/message.rb~ +1 -1
- data/lib/npgrt/query.rb +6 -0
- data/lib/npgrt/report.rb +182 -0
- data/lib/npgrt/report.rb~ +183 -0
- data/lib/npgrt/require.rb +23 -1
- data/lib/npgrt/require.rb~ +24 -1
- data/lib/npgrt/version.rb +3 -1
- data/lib/npgrt/version.rb~ +3 -1
- data/lib/npgrt/win32api.rb +335 -16
- data/lib/npgrt/win32api.rb~ +334 -15
- data/lib/test_32.dll +0 -0
- data/lib/test_64.dll +0 -0
- metadata +14 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b4a63c69e53e5b3931b1190c18a36d97609e815
|
4
|
+
data.tar.gz: 05368d350a9eed5f83e360da4302abe2429c633f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
+
|
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
|