rglpk 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.md +4 -0
- data/VERSION +1 -1
- data/lib/rglpk.rb +25 -0
- data/rglpk.gemspec +3 -2
- data/test/helper.rb +50 -1
- data/test/test_all.rb +2 -1
- data/test/test_brief_example.rb +7 -44
- data/test/test_memory_leaks.rb +30 -0
- metadata +3 -2
data/ChangeLog.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.6
|
data/lib/rglpk.rb
CHANGED
@@ -68,6 +68,15 @@ module Rglpk
|
|
68
68
|
@rows = RowArray.new
|
69
69
|
@cols = ColArray.new
|
70
70
|
Glpk_wrapper.glp_create_index(@lp)
|
71
|
+
|
72
|
+
ObjectSpace.define_finalizer(self, self.class.finalizer(@lp))
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.finalizer(lp)
|
76
|
+
proc do
|
77
|
+
Glpk_wrapper.glp_delete_index(lp)
|
78
|
+
Glpk_wrapper.glp_delete_prob(lp)
|
79
|
+
end
|
71
80
|
end
|
72
81
|
|
73
82
|
def name=(n)
|
@@ -117,6 +126,7 @@ module Rglpk
|
|
117
126
|
r = Glpk_wrapper.new_intArray(a.size + 1)
|
118
127
|
a.each_with_index{|n, i| Glpk_wrapper.intArray_setitem(r, i + 1, n)}
|
119
128
|
Glpk_wrapper.glp_del_rows(@lp, a.size, r)
|
129
|
+
Glpk_wrapper.delete_intArray(r)
|
120
130
|
|
121
131
|
a.each do |n|
|
122
132
|
@rows.send(:delete_at, n)
|
@@ -135,6 +145,7 @@ module Rglpk
|
|
135
145
|
r = Glpk_wrapper.new_intArray(a.size + 1)
|
136
146
|
a.each_with_index{|n, i| Glpk_wrapper.intArray_setitem(r, i + 1, n)}
|
137
147
|
Glpk_wrapper.glp_del_cols(@lp, a.size, r)
|
148
|
+
Glpk_wrapper.delete_intArray(r)
|
138
149
|
|
139
150
|
a.each do |n|
|
140
151
|
@cols.send(:delete_at, n)
|
@@ -163,6 +174,10 @@ module Rglpk
|
|
163
174
|
end
|
164
175
|
|
165
176
|
Glpk_wrapper.glp_load_matrix(@lp, v.size, ia, ja, ar)
|
177
|
+
|
178
|
+
Glpk_wrapper.delete_intArray(ia)
|
179
|
+
Glpk_wrapper.delete_intArray(ja)
|
180
|
+
Glpk_wrapper.delete_doubleArray(ar)
|
166
181
|
end
|
167
182
|
|
168
183
|
private
|
@@ -261,6 +276,9 @@ module Rglpk
|
|
261
276
|
Glpk_wrapper.doubleArray_setitem(val, y + 1, x)}
|
262
277
|
|
263
278
|
Glpk_wrapper.glp_set_mat_row(@p.lp, @i, v.size, ind, val)
|
279
|
+
|
280
|
+
Glpk_wrapper.delete_intArray(ind)
|
281
|
+
Glpk_wrapper.delete_doubleArray(val)
|
264
282
|
end
|
265
283
|
|
266
284
|
def get
|
@@ -273,6 +291,8 @@ module Rglpk
|
|
273
291
|
j = Glpk_wrapper.intArray_getitem(ind, i + 1)
|
274
292
|
row[j - 1] = v
|
275
293
|
end
|
294
|
+
Glpk_wrapper.delete_intArray(ind)
|
295
|
+
Glpk_wrapper.delete_doubleArray(val)
|
276
296
|
row
|
277
297
|
end
|
278
298
|
|
@@ -341,6 +361,9 @@ module Rglpk
|
|
341
361
|
Glpk_wrapper.doubleArray_setitem(val, y + 1, x)}
|
342
362
|
|
343
363
|
Glpk_wrapper.glp_set_mat_col(@p.lp, @j, v.size, ind, val)
|
364
|
+
|
365
|
+
Glpk_wrapper.delete_intArray(ind)
|
366
|
+
Glpk_wrapper.delete_doubleArray(val)
|
344
367
|
end
|
345
368
|
|
346
369
|
def get
|
@@ -353,6 +376,8 @@ module Rglpk
|
|
353
376
|
j = Glpk_wrapper.intArray_getitem(ind, i + 1)
|
354
377
|
col[j - 1] = v
|
355
378
|
end
|
379
|
+
Glpk_wrapper.delete_intArray(ind)
|
380
|
+
Glpk_wrapper.delete_doubleArray(val)
|
356
381
|
col
|
357
382
|
end
|
358
383
|
|
data/rglpk.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rglpk}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alex Gutteridge", "William Taysom"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2012-01-03}
|
13
13
|
s.description = %q{Rglpk is a package providing a Ruby wrapper to the [GNU GLPK](http://www.gnu.org/software/glpk/) library. The GLPK (GNU Linear Programming Kit) package is intended for solving large-scale linear programming (LP), mixed integer programming (MIP), and other related problems.
|
14
14
|
|
15
15
|
Rglpk (pronounced as "wriggle-pick") is currently in alpha status and the API should be considered subject to change. Rglpk uses [Swig](http://www.swig.org/) to initially wrap the C GLPK library (using a Swig wrapper originally developed by Nigel Galloway) and then a pure Ruby library to wrap the Swig code in a more friendly OO-style.
|
@@ -38,6 +38,7 @@ See [github](http://github.com/wtaysom/rglpk) for installation instructions. Al
|
|
38
38
|
"test/test_all.rb",
|
39
39
|
"test/test_basic.rb",
|
40
40
|
"test/test_brief_example.rb",
|
41
|
+
"test/test_memory_leaks.rb",
|
41
42
|
"test/test_problem_kind.rb"
|
42
43
|
]
|
43
44
|
s.homepage = %q{http://rglpk.rubyforge.org/}
|
data/test/helper.rb
CHANGED
@@ -2,4 +2,53 @@ here = File.expand_path(File.dirname(__FILE__))
|
|
2
2
|
|
3
3
|
require 'test/unit'
|
4
4
|
$LOAD_PATH << './ext'
|
5
|
-
require here+'/../lib/rglpk'
|
5
|
+
require here+'/../lib/rglpk'
|
6
|
+
|
7
|
+
module Examples
|
8
|
+
def brief_example
|
9
|
+
# The same Brief Example as found in section 1.3 of
|
10
|
+
# glpk-4.44/doc/glpk.pdf.
|
11
|
+
#
|
12
|
+
# maximize
|
13
|
+
# z = 10 * x1 + 6 * x2 + 4 * x3
|
14
|
+
#
|
15
|
+
# subject to
|
16
|
+
# p: x1 + x2 + x3 <= 100
|
17
|
+
# q: 10 * x1 + 4 * x2 + 5 * x3 <= 600
|
18
|
+
# r: 2 * x1 + 2 * x2 + 6 * x3 <= 300
|
19
|
+
#
|
20
|
+
# where all variables are non-negative
|
21
|
+
# x1 >= 0, x2 >= 0, x3 >= 0
|
22
|
+
#
|
23
|
+
p = Rglpk::Problem.new
|
24
|
+
p.name = "sample"
|
25
|
+
p.obj.dir = Rglpk::GLP_MAX
|
26
|
+
|
27
|
+
rows = p.add_rows(3)
|
28
|
+
rows[0].name = "p"
|
29
|
+
rows[0].set_bounds(Rglpk::GLP_UP, 0, 100)
|
30
|
+
rows[1].name = "q"
|
31
|
+
rows[1].set_bounds(Rglpk::GLP_UP, 0, 600)
|
32
|
+
rows[2].name = "r"
|
33
|
+
rows[2].set_bounds(Rglpk::GLP_UP, 0, 300)
|
34
|
+
|
35
|
+
cols = p.add_cols(3)
|
36
|
+
cols[0].name = "x1"
|
37
|
+
cols[0].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
38
|
+
cols[1].name = "x2"
|
39
|
+
cols[1].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
40
|
+
cols[2].name = "x3"
|
41
|
+
cols[2].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
42
|
+
|
43
|
+
p.obj.coefs = [10, 6, 4]
|
44
|
+
|
45
|
+
p.set_matrix([
|
46
|
+
1, 1, 1,
|
47
|
+
10, 4, 5,
|
48
|
+
2, 2, 6
|
49
|
+
])
|
50
|
+
|
51
|
+
p.simplex
|
52
|
+
p
|
53
|
+
end
|
54
|
+
end
|
data/test/test_all.rb
CHANGED
data/test/test_brief_example.rb
CHANGED
@@ -1,50 +1,13 @@
|
|
1
1
|
require File.expand_path('helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
#
|
11
|
-
# subject to
|
12
|
-
# p: x1 + x2 + x3 <= 100
|
13
|
-
# q: 10 * x1 + 4 * x2 + 5 * x3 <= 600
|
14
|
-
# r: 2 * x1 + 2 * x2 + 6 * x3 <= 300
|
15
|
-
#
|
16
|
-
# where all variables are non-negative
|
17
|
-
# x1 >= 0, x2 >= 0, x3 >= 0
|
18
|
-
#
|
19
|
-
p = Rglpk::Problem.new
|
20
|
-
p.name = "sample"
|
21
|
-
p.obj.dir = Rglpk::GLP_MAX
|
3
|
+
class TestBriefExample < Test::Unit::TestCase
|
4
|
+
include Examples
|
5
|
+
|
6
|
+
def test_brief_example
|
7
|
+
p = brief_example
|
8
|
+
cols = p.cols
|
9
|
+
rows = p.rows
|
22
10
|
|
23
|
-
rows = p.add_rows(3)
|
24
|
-
rows[0].name = "p"
|
25
|
-
rows[0].set_bounds(Rglpk::GLP_UP, 0, 100)
|
26
|
-
rows[1].name = "q"
|
27
|
-
rows[1].set_bounds(Rglpk::GLP_UP, 0, 600)
|
28
|
-
rows[2].name = "r"
|
29
|
-
rows[2].set_bounds(Rglpk::GLP_UP, 0, 300)
|
30
|
-
|
31
|
-
cols = p.add_cols(3)
|
32
|
-
cols[0].name = "x1"
|
33
|
-
cols[0].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
34
|
-
cols[1].name = "x2"
|
35
|
-
cols[1].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
36
|
-
cols[2].name = "x3"
|
37
|
-
cols[2].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
38
|
-
|
39
|
-
p.obj.coefs = [10, 6, 4]
|
40
|
-
|
41
|
-
p.set_matrix([
|
42
|
-
1, 1, 1,
|
43
|
-
10, 4, 5,
|
44
|
-
2, 2, 6
|
45
|
-
])
|
46
|
-
|
47
|
-
p.simplex
|
48
11
|
z = p.obj.get
|
49
12
|
x1 = cols[0].get_prim
|
50
13
|
x2 = cols[1].get_prim
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class TestMemoryLeaks < Test::Unit::TestCase
|
4
|
+
include Examples
|
5
|
+
|
6
|
+
def test_memory_prof
|
7
|
+
5.times do
|
8
|
+
1000.times do |i|
|
9
|
+
brief_example
|
10
|
+
end
|
11
|
+
|
12
|
+
change = change_to_real_memory_in_kb
|
13
|
+
assert (change < 10000), "memory leak #{change}kb"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def real_memory_in_kb
|
18
|
+
# "=" after "rss" strips the header line.
|
19
|
+
`ps -p #{Process.pid} -o rss=`.to_i
|
20
|
+
end
|
21
|
+
|
22
|
+
def change_to_real_memory_in_kb
|
23
|
+
GC.start
|
24
|
+
r = real_memory_in_kb
|
25
|
+
@change_to_real_memory_in_kb__prev ||= r
|
26
|
+
r - @change_to_real_memory_in_kb__prev
|
27
|
+
ensure
|
28
|
+
@change_to_real_memory_in_kb__prev = r
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rglpk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Alex Gutteridge
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date:
|
14
|
+
date: 2012-01-03 00:00:00 +08:00
|
15
15
|
default_executable:
|
16
16
|
dependencies: []
|
17
17
|
|
@@ -49,6 +49,7 @@ files:
|
|
49
49
|
- test/test_all.rb
|
50
50
|
- test/test_basic.rb
|
51
51
|
- test/test_brief_example.rb
|
52
|
+
- test/test_memory_leaks.rb
|
52
53
|
- test/test_problem_kind.rb
|
53
54
|
has_rdoc: true
|
54
55
|
homepage: http://rglpk.rubyforge.org/
|