npgrt 0.0.3 → 0.0.4
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 +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
|