rglpk 0.1.1 → 0.2.0
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.
- data/.gitignore +17 -0
- data/ChangeLog.md +13 -0
- data/README.md +99 -0
- data/Rakefile +69 -0
- data/VERSION +1 -0
- data/ext/extconf.rb +1 -1
- data/ext/{rglpk.c → glpk_wrapper.c} +9979 -4362
- data/lib/rglpk.rb +378 -0
- data/rglpk.gemspec +67 -0
- data/swig/Makefile.in +2 -2
- data/swig/glpk.i +2 -1
- data/test/helper.rb +3 -0
- data/test/test_all.rb +5 -187
- data/test/test_basic.rb +186 -0
- data/test/test_brief_example.rb +56 -0
- data/test/test_problem_kind.rb +81 -0
- metadata +55 -25
- data/History.txt +0 -7
- data/Manifest.txt +0 -12
- data/README.txt +0 -45
- data/Rakefile.rb +0 -50
- data/lib/glpk.rb +0 -320
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.expand_path('helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
module TestProblemKind
|
4
|
+
def setup
|
5
|
+
@p = Rglpk::Problem.new
|
6
|
+
@p.obj.dir = Rglpk::GLP_MAX
|
7
|
+
|
8
|
+
cols = @p.add_cols(3)
|
9
|
+
cols[0].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
10
|
+
cols[1].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
11
|
+
cols[2].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
|
12
|
+
|
13
|
+
rows = @p.add_rows(3)
|
14
|
+
|
15
|
+
rows[0].set_bounds(Rglpk::GLP_UP, 0, 4)
|
16
|
+
rows[1].set_bounds(Rglpk::GLP_UP, 0, 5)
|
17
|
+
rows[2].set_bounds(Rglpk::GLP_UP, 0, 6)
|
18
|
+
|
19
|
+
@p.obj.coefs = [1, 1, 1]
|
20
|
+
|
21
|
+
@p.set_matrix([
|
22
|
+
1, 1, 0,
|
23
|
+
0, 1, 1,
|
24
|
+
1, 0, 1
|
25
|
+
])
|
26
|
+
|
27
|
+
@p.cols.each{|c| c.kind = column_kind}
|
28
|
+
end
|
29
|
+
|
30
|
+
def verify_results(*results)
|
31
|
+
if column_kind == Rglpk::GLP_CV
|
32
|
+
solution_method = :simplex
|
33
|
+
value_method = :get_prim
|
34
|
+
else
|
35
|
+
solution_method = :mip
|
36
|
+
value_method = :mip_val
|
37
|
+
end
|
38
|
+
|
39
|
+
@p.send(solution_method, {:presolve => Rglpk::GLP_ON})
|
40
|
+
|
41
|
+
@p.cols.each_with_index do |col, index|
|
42
|
+
assert_equal results[index], col.send(value_method)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class BinaryVariables < Test::Unit::TestCase
|
48
|
+
include TestProblemKind
|
49
|
+
|
50
|
+
def column_kind
|
51
|
+
Rglpk::GLP_BV
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_results
|
55
|
+
verify_results(1, 1, 1)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class IntegerVariables < Test::Unit::TestCase
|
60
|
+
include TestProblemKind
|
61
|
+
|
62
|
+
def column_kind
|
63
|
+
Rglpk::GLP_IV
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_results
|
67
|
+
verify_results(3, 1, 3)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class ContinuousVariables < Test::Unit::TestCase
|
72
|
+
include TestProblemKind
|
73
|
+
|
74
|
+
def column_kind
|
75
|
+
Rglpk::GLP_CV
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_results
|
79
|
+
verify_results(2.5, 1.5, 3.5)
|
80
|
+
end
|
81
|
+
end
|
metadata
CHANGED
@@ -1,70 +1,100 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rglpk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Alex Gutteridge
|
14
|
+
- William Taysom
|
8
15
|
autorequire:
|
9
16
|
bindir: bin
|
10
17
|
cert_chain: []
|
11
18
|
|
12
|
-
date:
|
19
|
+
date: 2010-10-13 00:00:00 +08:00
|
13
20
|
default_executable:
|
14
21
|
dependencies: []
|
15
22
|
|
16
|
-
description:
|
17
|
-
|
23
|
+
description: |-
|
24
|
+
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.
|
25
|
+
|
26
|
+
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.
|
27
|
+
|
28
|
+
All bug reports, feature requests and patches are welcome. Please email alexg (at) kuicr.kyoto-u.ac.jp or use the [rubyforge forums](http://rubyforge.org/forum/?group_id=3943).
|
29
|
+
email:
|
30
|
+
- alexg@kuicr.kyoto-u.ac.jp
|
31
|
+
- wtaysom@gmail.com
|
18
32
|
executables: []
|
19
33
|
|
20
34
|
extensions:
|
21
35
|
- ext/extconf.rb
|
36
|
+
- ext/extconf.rb
|
22
37
|
extra_rdoc_files:
|
23
|
-
-
|
24
|
-
-
|
25
|
-
- License.txt
|
38
|
+
- ChangeLog.md
|
39
|
+
- README.md
|
26
40
|
files:
|
27
|
-
-
|
41
|
+
- .gitignore
|
42
|
+
- ChangeLog.md
|
28
43
|
- License.txt
|
29
|
-
-
|
30
|
-
-
|
31
|
-
-
|
44
|
+
- README.md
|
45
|
+
- Rakefile
|
46
|
+
- VERSION
|
32
47
|
- ext/extconf.rb
|
33
|
-
- ext/
|
34
|
-
- lib/
|
48
|
+
- ext/glpk_wrapper.c
|
49
|
+
- lib/rglpk.rb
|
50
|
+
- rglpk.gemspec
|
35
51
|
- swig/Makefile.in
|
36
52
|
- swig/configure.in
|
37
53
|
- swig/glpk.i
|
54
|
+
- test/helper.rb
|
38
55
|
- test/test_all.rb
|
56
|
+
- test/test_basic.rb
|
57
|
+
- test/test_brief_example.rb
|
58
|
+
- test/test_problem_kind.rb
|
39
59
|
has_rdoc: true
|
40
60
|
homepage: http://rglpk.rubyforge.org/
|
61
|
+
licenses: []
|
62
|
+
|
41
63
|
post_install_message:
|
42
64
|
rdoc_options:
|
43
|
-
- --
|
44
|
-
- test/*
|
45
|
-
- --main
|
46
|
-
- README.txt
|
47
|
-
- --inline-source
|
65
|
+
- --charset=UTF-8
|
48
66
|
require_paths:
|
49
|
-
-
|
67
|
+
- lib
|
68
|
+
- ext
|
69
|
+
- ext
|
50
70
|
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
51
72
|
requirements:
|
52
73
|
- - ">="
|
53
74
|
- !ruby/object:Gem::Version
|
75
|
+
hash: 3
|
76
|
+
segments:
|
77
|
+
- 0
|
54
78
|
version: "0"
|
55
|
-
version:
|
56
79
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
57
81
|
requirements:
|
58
82
|
- - ">="
|
59
83
|
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
60
87
|
version: "0"
|
61
|
-
version:
|
62
88
|
requirements: []
|
63
89
|
|
64
|
-
rubyforge_project:
|
65
|
-
rubygems_version: 1.3.
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 1.3.7
|
66
92
|
signing_key:
|
67
|
-
specification_version:
|
68
|
-
summary: Rglpk is a package providing a Ruby wrapper to the GNU
|
93
|
+
specification_version: 3
|
94
|
+
summary: 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.
|
69
95
|
test_files:
|
96
|
+
- test/helper.rb
|
70
97
|
- test/test_all.rb
|
98
|
+
- test/test_basic.rb
|
99
|
+
- test/test_brief_example.rb
|
100
|
+
- test/test_problem_kind.rb
|
data/History.txt
DELETED
data/Manifest.txt
DELETED
data/README.txt
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
== Introduction
|
2
|
-
|
3
|
-
Rglpk is a package providing a Ruby wrapper to the GNU glpk library (http://www.gnu.org/software/glpk/). The GLPK (GNU Linear Programming Kit) package is intended for solving large-scale linear programming (LP), mixed integer programming (MIP), and other related problems.
|
4
|
-
|
5
|
-
Rglpk is currently in alpha status and the API should be considered subject to change. The main documentation can be found at http://rglpk.rubyforge.org/. Rglpk uses Swig 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.
|
6
|
-
|
7
|
-
All bug reports, feature requests and patches are welcome. Please email alexg (at) kuicr.kyoto-u.ac.jp or use the rubyforge forums: http://rubyforge.org/forum/?group_id=3943
|
8
|
-
|
9
|
-
== Installation
|
10
|
-
|
11
|
-
A working glpk library installation is required.
|
12
|
-
|
13
|
-
Rglpk is only available as a gem. For example, under Ubuntu linux the following command succesfully compiles and installs (you may need to be root):
|
14
|
-
|
15
|
-
gem install rglpk
|
16
|
-
|
17
|
-
The underlying C library is wrapped using Swig. See /swig for details on the interface.
|
18
|
-
|
19
|
-
== Documentation
|
20
|
-
|
21
|
-
Rglpk provides two files: rglpk.so which is a Swig generated wrapper and glpk.rb which wraps rglpk.so to provide a nicer OO-orientated interface. You should only ever need to access glpk.rb.
|
22
|
-
|
23
|
-
An example:
|
24
|
-
|
25
|
-
require 'glpk'
|
26
|
-
|
27
|
-
#Yadda yadda
|
28
|
-
|
29
|
-
== License
|
30
|
-
|
31
|
-
Copyright (C) 2007 Alex Gutteridge
|
32
|
-
|
33
|
-
This library is free software; you can redistribute it and/or
|
34
|
-
modify it under the terms of the GNU Lesser General Public
|
35
|
-
License as published by the Free Software Foundation; either
|
36
|
-
version 2.1 of the License, or (at your option) any later version.
|
37
|
-
|
38
|
-
This library is distributed in the hope that it will be useful,
|
39
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
40
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
41
|
-
Lesser General Public License for more details.
|
42
|
-
|
43
|
-
You should have received a copy of the GNU Lesser General Public
|
44
|
-
License along with this library; if not, write to the Free Software
|
45
|
-
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
data/Rakefile.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'hoe'
|
2
|
-
|
3
|
-
$LOAD_PATH.unshift("./ext")
|
4
|
-
|
5
|
-
module GLPK
|
6
|
-
VERSION = "0.1.1"
|
7
|
-
end
|
8
|
-
|
9
|
-
begin
|
10
|
-
require 'glpk'
|
11
|
-
rescue LoadError
|
12
|
-
end
|
13
|
-
|
14
|
-
hoe = Hoe.new("rglpk",GLPK::VERSION) do |p|
|
15
|
-
|
16
|
-
p.author = "Alex Gutteridge"
|
17
|
-
p.email = "alexg@kuicr.kyoto-u.ac.jp"
|
18
|
-
p.url = "http://rglpk.rubyforge.org/"
|
19
|
-
|
20
|
-
p.description = p.paragraphs_of("README.txt",1..3)[0]
|
21
|
-
p.summary = p.paragraphs_of("README.txt",1)[0]
|
22
|
-
p.changes = p.paragraphs_of("History.txt",0..1).join("\n\n")
|
23
|
-
|
24
|
-
p.clean_globs = ["ext/*.o","ext/*.so","ext/Makefile","ext/mkmf.log","**/*~","email.txt"]
|
25
|
-
|
26
|
-
p.rdoc_pattern = /(^ext\/.*\.c$|^README|^History|^License)/
|
27
|
-
|
28
|
-
p.spec_extras = {
|
29
|
-
:extensions => ['ext/extconf.rb'],
|
30
|
-
:require_paths => ['test'],
|
31
|
-
:has_rdoc => true,
|
32
|
-
:extra_rdoc_files => ["README.txt","History.txt","License.txt"],
|
33
|
-
:rdoc_options => ["--exclude", "test/*", "--main", "README.txt", "--inline-source"]
|
34
|
-
}
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
hoe.spec.dependencies.delete_if{|dep| dep.name == "hoe"}
|
39
|
-
|
40
|
-
desc "Uses extconf.rb and make to build the extension"
|
41
|
-
task :build_extension => ['ext/rglpk.so']
|
42
|
-
SRC = FileList['ext/rglpk.c']
|
43
|
-
file 'ext/rglpk.so' => SRC do
|
44
|
-
Dir.chdir('ext')
|
45
|
-
system("ruby extconf.rb")
|
46
|
-
system("make")
|
47
|
-
Dir.chdir('..')
|
48
|
-
end
|
49
|
-
|
50
|
-
task :test => [:build_extension]
|
data/lib/glpk.rb
DELETED
@@ -1,320 +0,0 @@
|
|
1
|
-
require 'rglpk.so'
|
2
|
-
|
3
|
-
module GLPK
|
4
|
-
|
5
|
-
Rglpk.constants.each do |c|
|
6
|
-
v = Rglpk.const_get(c)
|
7
|
-
self.const_set(c,v) if v.kind_of? Numeric
|
8
|
-
end
|
9
|
-
TypeConstants =[GLP_FR, GLP_LO, GLP_UP, GLP_DB, GLP_FX]
|
10
|
-
|
11
|
-
class RowColArray < Array
|
12
|
-
def [](i)
|
13
|
-
super(i-1)
|
14
|
-
end
|
15
|
-
def []=(i,n)
|
16
|
-
super(i-1,n)
|
17
|
-
end
|
18
|
-
def fix_idx
|
19
|
-
self.each_with_index do |rc,i|
|
20
|
-
if rc.respond_to?(:i)
|
21
|
-
rc.i = i+1
|
22
|
-
else
|
23
|
-
rc.j = i+1
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
class RowArray < RowColArray
|
29
|
-
def [](i)
|
30
|
-
if i.kind_of?(Numeric)
|
31
|
-
super(i)
|
32
|
-
elsif i.kind_of?(String)
|
33
|
-
raise RuntimeError if self[1].nil?
|
34
|
-
idx = Rglpk.glp_find_row(self[1].p.lp,i)
|
35
|
-
raise ArgumentError if idx == 0
|
36
|
-
super(idx)
|
37
|
-
else
|
38
|
-
raise ArgumentError
|
39
|
-
end
|
40
|
-
end
|
41
|
-
def []=(i,n)
|
42
|
-
raise ArgumentError unless n.is_a?(GLPK::Row)
|
43
|
-
super
|
44
|
-
end
|
45
|
-
end
|
46
|
-
class ColArray < RowColArray
|
47
|
-
def [](i)
|
48
|
-
if i.kind_of?(Numeric)
|
49
|
-
super(i)
|
50
|
-
elsif i.kind_of?(String)
|
51
|
-
raise RuntimeError if self[1].nil?
|
52
|
-
idx = Rglpk.glp_find_col(self[1].p.lp,i)
|
53
|
-
raise ArgumentError if idx == 0
|
54
|
-
super(idx)
|
55
|
-
else
|
56
|
-
raise ArgumentError
|
57
|
-
end
|
58
|
-
end
|
59
|
-
def []=(i,n)
|
60
|
-
raise ArgumentError unless n.is_a?(GLPK::Col)
|
61
|
-
super
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
class Problem
|
66
|
-
|
67
|
-
attr_accessor :rows, :cols, :obj, :lp
|
68
|
-
|
69
|
-
def initialize
|
70
|
-
@lp = Rglpk.glp_create_prob
|
71
|
-
@obj = GLPK::ObjectiveFunction.new(self)
|
72
|
-
@rows = GLPK::RowArray.new
|
73
|
-
@cols = GLPK::ColArray.new
|
74
|
-
Rglpk.glp_create_index(@lp)
|
75
|
-
@status = nil
|
76
|
-
end
|
77
|
-
|
78
|
-
def name=(n)
|
79
|
-
Rglpk.glp_set_prob_name(@lp,n)
|
80
|
-
end
|
81
|
-
def name
|
82
|
-
Rglpk.glp_get_prob_name(@lp)
|
83
|
-
end
|
84
|
-
|
85
|
-
def nz
|
86
|
-
Rglpk.glp_get_num_nz(@lp)
|
87
|
-
end
|
88
|
-
|
89
|
-
def add_rows(n)
|
90
|
-
Rglpk.glp_add_rows(@lp,n)
|
91
|
-
s = @rows.size
|
92
|
-
n.times{|i| @rows << GLPK::Row.new(self,s+i+1)}
|
93
|
-
@rows
|
94
|
-
end
|
95
|
-
def add_cols(n)
|
96
|
-
Rglpk.glp_add_cols(@lp,n)
|
97
|
-
s = @cols.size
|
98
|
-
n.times{|i| @cols << GLPK::Column.new(self,s+i+1)}
|
99
|
-
@cols
|
100
|
-
end
|
101
|
-
|
102
|
-
def del_rows(a)
|
103
|
-
#ensure the array of rows tro delete is sorted and unique
|
104
|
-
a = a.sort.uniq
|
105
|
-
|
106
|
-
r = Rglpk.new_intArray(a.size+1)
|
107
|
-
a.each_with_index{|n,i| Rglpk.intArray_setitem(r,i+1,n)}
|
108
|
-
Rglpk.glp_del_rows(@lp,a.size,r)
|
109
|
-
|
110
|
-
a.each do |n|
|
111
|
-
@rows.delete_at(n)
|
112
|
-
a.each_with_index do |nn,i|
|
113
|
-
a[i] -= 1
|
114
|
-
end
|
115
|
-
end
|
116
|
-
@rows.fix_idx
|
117
|
-
a
|
118
|
-
end
|
119
|
-
|
120
|
-
def del_cols(a)
|
121
|
-
#ensure the array of rows tro delete is sorted and unique
|
122
|
-
a = a.sort.uniq
|
123
|
-
|
124
|
-
r = Rglpk.new_intArray(a.size+1)
|
125
|
-
a.each_with_index{|n,i| Rglpk.intArray_setitem(r,i+1,n)}
|
126
|
-
Rglpk.glp_del_cols(@lp,a.size,r)
|
127
|
-
|
128
|
-
a.each do |n|
|
129
|
-
@cols.delete_at(n)
|
130
|
-
a.each_with_index do |nn,i|
|
131
|
-
a[i] -= 1
|
132
|
-
end
|
133
|
-
end
|
134
|
-
@cols.fix_idx
|
135
|
-
a
|
136
|
-
end
|
137
|
-
|
138
|
-
def set_matrix(v)
|
139
|
-
|
140
|
-
nr = Rglpk.glp_get_num_rows(@lp)
|
141
|
-
nc = Rglpk.glp_get_num_cols(@lp)
|
142
|
-
|
143
|
-
ia = Rglpk.new_intArray(v.size+1)
|
144
|
-
ja = Rglpk.new_intArray(v.size+1)
|
145
|
-
ar = Rglpk.new_doubleArray(v.size+1)
|
146
|
-
|
147
|
-
v.each_with_index do |x,y|
|
148
|
-
rn = (y+nr) / nc
|
149
|
-
cn = (y % nc) + 1
|
150
|
-
|
151
|
-
Rglpk.intArray_setitem(ia,y+1,rn) # 1,1,2,2
|
152
|
-
Rglpk.intArray_setitem(ja,y+1,cn) # 1,2,1,2
|
153
|
-
Rglpk.doubleArray_setitem(ar,y+1,x)
|
154
|
-
end
|
155
|
-
|
156
|
-
Rglpk.glp_load_matrix(@lp,v.size,ia,ja,ar)
|
157
|
-
|
158
|
-
end
|
159
|
-
|
160
|
-
def simplex(options)
|
161
|
-
|
162
|
-
parm = Rglpk::Glp_smcp.new
|
163
|
-
Rglpk.glp_init_smcp(parm)
|
164
|
-
|
165
|
-
#Default to errors only temrinal output
|
166
|
-
parm.msg_lev = GLPK::GLP_MSG_ERR
|
167
|
-
|
168
|
-
#set options
|
169
|
-
options.each do |k,v|
|
170
|
-
begin
|
171
|
-
parm.send("#{k}=".to_sym,v)
|
172
|
-
rescue NoMethodError
|
173
|
-
raise ArgumentError, "Unrecognised option: #{k}"
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
Rglpk.glp_simplex(@lp,parm)
|
178
|
-
end
|
179
|
-
|
180
|
-
def status
|
181
|
-
Rglpk.glp_get_status(@lp)
|
182
|
-
end
|
183
|
-
|
184
|
-
end
|
185
|
-
|
186
|
-
class Row
|
187
|
-
attr_accessor :i, :p
|
188
|
-
def initialize(problem,i)
|
189
|
-
@p = problem
|
190
|
-
@i = i
|
191
|
-
end
|
192
|
-
def name=(n)
|
193
|
-
Rglpk.glp_set_row_name(@p.lp,@i,n)
|
194
|
-
end
|
195
|
-
def name
|
196
|
-
Rglpk.glp_get_row_name(@p.lp,@i)
|
197
|
-
end
|
198
|
-
def set_bounds(type,lb,ub)
|
199
|
-
raise ArgumentError unless GLPK::TypeConstants.include?(type)
|
200
|
-
lb = 0.0 if lb.nil?
|
201
|
-
ub = 0.0 if ub.nil?
|
202
|
-
Rglpk.glp_set_row_bnds(@p.lp,@i,type,lb.to_f,ub.to_f)
|
203
|
-
end
|
204
|
-
def bounds
|
205
|
-
t = Rglpk.glp_get_row_type(@p.lp,@i)
|
206
|
-
lb = Rglpk.glp_get_row_lb(@p.lp,@i)
|
207
|
-
ub = Rglpk.glp_get_row_ub(@p.lp,@i)
|
208
|
-
|
209
|
-
lb = (t == GLPK::GLP_FR or t == GLPK::GLP_UP) ? nil : lb
|
210
|
-
ub = (t == GLPK::GLP_FR or t == GLPK::GLP_LO) ? nil : ub
|
211
|
-
|
212
|
-
[t,lb,ub]
|
213
|
-
end
|
214
|
-
def set(v)
|
215
|
-
raise RuntimeError unless v.size == @p.cols.size
|
216
|
-
ind = Rglpk.new_intArray(v.size+1)
|
217
|
-
val = Rglpk.new_doubleArray(v.size+1)
|
218
|
-
|
219
|
-
1.upto(v.size){|x| Rglpk.intArray_setitem(ind,x,x)}
|
220
|
-
v.each_with_index{|x,y| Rglpk.doubleArray_setitem(val,y+1,x)}
|
221
|
-
|
222
|
-
Rglpk.glp_set_mat_row(@p.lp,@i,v.size,ind,val)
|
223
|
-
end
|
224
|
-
def get
|
225
|
-
ind = Rglpk.new_intArray(@p.cols.size+1)
|
226
|
-
val = Rglpk.new_doubleArray(@p.cols.size+1)
|
227
|
-
len = Rglpk.glp_get_mat_row(@p.lp,@i,ind,val)
|
228
|
-
row = Array.new(@p.cols.size,0)
|
229
|
-
len.times do |i|
|
230
|
-
v = Rglpk.doubleArray_getitem(val,i+1)
|
231
|
-
j = Rglpk.intArray_getitem(ind,i+1)
|
232
|
-
row[j-1] = v
|
233
|
-
end
|
234
|
-
return row
|
235
|
-
end
|
236
|
-
end
|
237
|
-
class Column
|
238
|
-
attr_accessor :j, :p
|
239
|
-
def initialize(problem,i)
|
240
|
-
@p = problem
|
241
|
-
@j = i
|
242
|
-
end
|
243
|
-
def name=(n)
|
244
|
-
Rglpk.glp_set_col_name(@p.lp,@j,n)
|
245
|
-
end
|
246
|
-
def name
|
247
|
-
Rglpk.glp_get_col_name(@p.lp,@j)
|
248
|
-
end
|
249
|
-
def set_bounds(type,lb,ub)
|
250
|
-
raise ArgumentError unless GLPK::TypeConstants.include?(type)
|
251
|
-
lb = 0.0 if lb.nil?
|
252
|
-
ub = 0.0 if ub.nil?
|
253
|
-
Rglpk.glp_set_col_bnds(@p.lp,@j,type,lb,ub)
|
254
|
-
end
|
255
|
-
def bounds
|
256
|
-
t = Rglpk.glp_get_col_type(@p.lp,@j)
|
257
|
-
lb = Rglpk.glp_get_col_lb(@p.lp,@j)
|
258
|
-
ub = Rglpk.glp_get_col_ub(@p.lp,@j)
|
259
|
-
|
260
|
-
lb = (t == GLPK::GLP_FR or t == GLPK::GLP_UP) ? nil : lb
|
261
|
-
ub = (t == GLPK::GLP_FR or t == GLPK::GLP_LO) ? nil : ub
|
262
|
-
|
263
|
-
[t,lb,ub]
|
264
|
-
end
|
265
|
-
def set(v)
|
266
|
-
raise RuntimeError unless v.size == @p.rows.size
|
267
|
-
ind = Rglpk.new_intArray(v.size+1)
|
268
|
-
val = Rglpk.new_doubleArray(v.size+1)
|
269
|
-
|
270
|
-
1.upto(v.size){|x| Rglpk.intArray_setitem(ind,x,x)}
|
271
|
-
v.each_with_index{|x,y| Rglpk.doubleArray_setitem(val,y+1,x)}
|
272
|
-
|
273
|
-
Rglpk.glp_set_mat_col(@p.lp,@j,v.size,ind,val)
|
274
|
-
end
|
275
|
-
def get
|
276
|
-
ind = Rglpk.new_intArray(@p.rows.size+1)
|
277
|
-
val = Rglpk.new_doubleArray(@p.rows.size+1)
|
278
|
-
len = Rglpk.glp_get_mat_col(@p.lp,@j,ind,val)
|
279
|
-
col = Array.new(@p.rows.size,0)
|
280
|
-
len.times do |i|
|
281
|
-
v = Rglpk.doubleArray_getitem(val,i+1)
|
282
|
-
j = Rglpk.intArray_getitem(ind,i+1)
|
283
|
-
col[j-1] = v
|
284
|
-
end
|
285
|
-
return col
|
286
|
-
end
|
287
|
-
end
|
288
|
-
|
289
|
-
class ObjectiveFunction
|
290
|
-
def initialize(problem)
|
291
|
-
@p = problem
|
292
|
-
end
|
293
|
-
def name=(n)
|
294
|
-
Rglpk.glp_set_obj_name(@p.lp,n)
|
295
|
-
end
|
296
|
-
def name
|
297
|
-
Rglpk.glp_get_obj_name(@p.lp)
|
298
|
-
end
|
299
|
-
def dir=(d)
|
300
|
-
raise ArgumentError if d != GLPK::GLP_MIN and d != GLPK::GLP_MAX
|
301
|
-
Rglpk.glp_set_obj_dir(@p.lp,d)
|
302
|
-
end
|
303
|
-
def dir
|
304
|
-
Rglpk.glp_get_obj_dir(@p.lp)
|
305
|
-
end
|
306
|
-
def set_coef(j,coef)
|
307
|
-
Rglpk.glp_set_obj_coef(@p.lp,j,coef)
|
308
|
-
end
|
309
|
-
def coefs=(a)
|
310
|
-
@p.cols.each{|c| Rglpk.glp_set_obj_coef(@p.lp,c.j,a[c.j-1])}
|
311
|
-
a
|
312
|
-
end
|
313
|
-
def coefs
|
314
|
-
@p.cols.map{|c| Rglpk.glp_get_obj_coef(@p.lp,c.j)}
|
315
|
-
end
|
316
|
-
def get
|
317
|
-
Rglpk.glp_get_obj_val(@p.lp)
|
318
|
-
end
|
319
|
-
end
|
320
|
-
end
|