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 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