relax4 1.0.3 → 1.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.
- data/README.rdoc +3 -3
- data/ext/relax4.c +19 -4
- data/lib/relax4/version.rb +1 -1
- data/test/RELAX4.INP +101 -0
- data/test/test_relax4.rb +284 -0
- data/test/test_solve_4.inp +258 -0
- data/test/test_solve_5.inp +259 -0
- metadata +18 -12
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
=
|
1
|
+
= relax4
|
2
2
|
|
3
3
|
http://relax4.rubyforge.org
|
4
4
|
|
@@ -70,11 +70,11 @@ A lower-level interface is also available; see the docs for the Relax4 module.
|
|
70
70
|
Has been tested on:
|
71
71
|
* x86-linux (Ubuntu 10.04) with Ruby 1.8.7p249
|
72
72
|
* x86-linux (Ubuntu 10.04) with Ruby 1.9.1p378
|
73
|
-
* x86_64-linux (CentOS) with Ruby 1.8.
|
73
|
+
* x86_64-linux (CentOS) with Ruby 1.8.7p72
|
74
74
|
|
75
75
|
The following packages were required to install on Ubuntu 10.04:
|
76
76
|
|
77
|
-
* ruby, ruby-dev, rubygems
|
77
|
+
* ruby, ruby-dev, rubygems
|
78
78
|
|
79
79
|
The bindings were generated with f2c (FORTRAN to C converter) and SWIG
|
80
80
|
(www.swig.org), but you don't need either to build the gem.
|
data/ext/relax4.c
CHANGED
@@ -2,7 +2,14 @@
|
|
2
2
|
* This file was translated by f2c (FORTRAN to C) (version 20090411) from
|
3
3
|
* relax4.f (see http://www.netlib.org/f2c).
|
4
4
|
*
|
5
|
-
* It has been modified (JLM) for use as a library (see relax4.h).
|
5
|
+
* It has been modified (JLM) for use as a library (see relax4.h for interface).
|
6
|
+
* The main changes are:
|
7
|
+
*
|
8
|
+
* 1) Now using dynamic (malloc'd) rather than static arrays.
|
9
|
+
* 2) An apparent bug in ascnt2_ has been fixed: the prdcsr array is a
|
10
|
+
* node-length array, but it was indexed by the 'nb' variable, which can become
|
11
|
+
* larger than the number of nodes. A new arc-length array (temp_nb) has been
|
12
|
+
* added to avoid this.
|
6
13
|
*
|
7
14
|
* The f2c linkage dependencies have been removed, but the FORTRAN character of
|
8
15
|
* the code has been largely preserved -- you have been warned.
|
@@ -315,6 +322,10 @@ struct {
|
|
315
322
|
|
316
323
|
#define cr_1 cr_
|
317
324
|
|
325
|
+
/* Temporary added by JLM to avoid out-of-bounds problem caused by using the
|
326
|
+
* prdcsr array in ascnt2_. */
|
327
|
+
RELAX4_INT *temp_nb;
|
328
|
+
|
318
329
|
/* Subroutine */ int inidat_(void)
|
319
330
|
{
|
320
331
|
/* System generated locals */
|
@@ -3659,7 +3670,7 @@ L4:
|
|
3659
3670
|
if (arrayrc_1.rc[arc - 1] == 0) {
|
3660
3671
|
*delx += arrayu_1.u[arc - 1];
|
3661
3672
|
++nb;
|
3662
|
-
|
3673
|
+
temp_nb[nb - 1] = arc; /* was blk2_3.prdcsr */
|
3663
3674
|
}
|
3664
3675
|
}
|
3665
3676
|
/* L6: */
|
@@ -3694,7 +3705,7 @@ L4:
|
|
3694
3705
|
|
3695
3706
|
i__1 = nb;
|
3696
3707
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
3697
|
-
arc =
|
3708
|
+
arc = temp_nb[i__ - 1]; /* was blk2_3.prdcsr */
|
3698
3709
|
if (blk13_1.tnxtin[arc - 1] == -1) {
|
3699
3710
|
j = arraye_1.endn[arc - 1];
|
3700
3711
|
blk13_1.tnxtin[arc - 1] = blk12_1.tfstin[j - 1];
|
@@ -3797,6 +3808,7 @@ int relax4_init(RELAX4_INT num_nodes, RELAX4_INT num_arcs,
|
|
3797
3808
|
blk15_1.i15 = NULL;
|
3798
3809
|
blk16_1.i16 = NULL;
|
3799
3810
|
blk17_1.i17 = NULL;
|
3811
|
+
temp_nb = NULL;
|
3800
3812
|
|
3801
3813
|
arrayrc_1.rc = malloc(num_arcs*sizeof(RELAX4_INT));
|
3802
3814
|
blk1_1.i1 = malloc(num_nodes*sizeof(RELAX4_INT));
|
@@ -3816,6 +3828,7 @@ int relax4_init(RELAX4_INT num_nodes, RELAX4_INT num_arcs,
|
|
3816
3828
|
blk15_1.i15 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3817
3829
|
blk16_1.i16 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3818
3830
|
blk17_1.i17 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3831
|
+
temp_nb = malloc(num_arcs*sizeof(RELAX4_INT));
|
3819
3832
|
|
3820
3833
|
if (arrayrc_1.rc == NULL ||
|
3821
3834
|
blk1_1.i1 == NULL ||
|
@@ -3834,7 +3847,8 @@ int relax4_init(RELAX4_INT num_nodes, RELAX4_INT num_arcs,
|
|
3834
3847
|
blk14_1.i14 == NULL ||
|
3835
3848
|
blk15_1.i15 == NULL ||
|
3836
3849
|
blk16_1.i16 == NULL ||
|
3837
|
-
blk17_1.i17 == NULL
|
3850
|
+
blk17_1.i17 == NULL ||
|
3851
|
+
temp_nb == NULL) {
|
3838
3852
|
relax4_free();
|
3839
3853
|
return RELAX4_FAIL_OUT_OF_MEMORY;
|
3840
3854
|
}
|
@@ -3948,5 +3962,6 @@ void relax4_free()
|
|
3948
3962
|
if(blk15_1.i15 ) free(blk15_1.i15 );
|
3949
3963
|
if(blk16_1.i16 ) free(blk16_1.i16 );
|
3950
3964
|
if(blk17_1.i17 ) free(blk17_1.i17 );
|
3965
|
+
if(temp_nb ) free(temp_nb );
|
3951
3966
|
}
|
3952
3967
|
|
data/lib/relax4/version.rb
CHANGED
data/test/RELAX4.INP
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
20 80
|
2
|
+
1 10 -4 215
|
3
|
+
1 16 -8 138
|
4
|
+
8 18 2 215
|
5
|
+
8 14 -5 76
|
6
|
+
8 20 -6 193
|
7
|
+
10 8 -9 215
|
8
|
+
10 16 -4 215
|
9
|
+
10 6 9 190
|
10
|
+
10 20 -8 141
|
11
|
+
10 4 -5 152
|
12
|
+
10 11 2 63
|
13
|
+
2 15 5 266
|
14
|
+
2 4 -5 186
|
15
|
+
2 6 -3 162
|
16
|
+
2 17 7 84
|
17
|
+
2 11 6 94
|
18
|
+
2 18 -6 113
|
19
|
+
12 18 -6 266
|
20
|
+
12 7 9 106
|
21
|
+
12 9 4 143
|
22
|
+
12 17 7 95
|
23
|
+
12 15 7 181
|
24
|
+
12 4 9 104
|
25
|
+
12 20 -9 84
|
26
|
+
15 12 8 266
|
27
|
+
15 16 -4 266
|
28
|
+
15 17 5 154
|
29
|
+
15 20 3 132
|
30
|
+
15 4 2 164
|
31
|
+
3 6 2 50
|
32
|
+
3 18 -7 131
|
33
|
+
3 19 -8 89
|
34
|
+
6 7 -2 50
|
35
|
+
6 19 -6 102
|
36
|
+
6 9 6 56
|
37
|
+
7 9 -7 50
|
38
|
+
7 6 3 129
|
39
|
+
7 5 -7 141
|
40
|
+
9 19 -1 50
|
41
|
+
9 17 -2 50
|
42
|
+
9 18 4 50
|
43
|
+
9 13 -7 162
|
44
|
+
9 16 -2 121
|
45
|
+
9 11 10 115
|
46
|
+
9 10 -3 166
|
47
|
+
9 4 1 111
|
48
|
+
4 13 -10 195
|
49
|
+
4 19 8 112
|
50
|
+
4 16 2 195
|
51
|
+
4 10 -9 143
|
52
|
+
4 9 -10 135
|
53
|
+
4 14 -4 191
|
54
|
+
13 18 -9 195
|
55
|
+
13 19 -10 195
|
56
|
+
13 8 -8 165
|
57
|
+
13 17 0 132
|
58
|
+
5 11 -8 319
|
59
|
+
5 7 -8 70
|
60
|
+
5 20 0 63
|
61
|
+
5 9 -9 194
|
62
|
+
11 14 -3 319
|
63
|
+
11 19 2 125
|
64
|
+
11 12 -9 177
|
65
|
+
14 20 -7 319
|
66
|
+
14 16 7 319
|
67
|
+
14 8 9 174
|
68
|
+
14 11 10 77
|
69
|
+
14 5 -4 123
|
70
|
+
14 18 5 125
|
71
|
+
14 12 -10 69
|
72
|
+
16 19 -3 128
|
73
|
+
16 10 -4 56
|
74
|
+
16 6 0 145
|
75
|
+
16 17 10 104
|
76
|
+
16 12 2 199
|
77
|
+
16 5 -5 159
|
78
|
+
17 7 2 68
|
79
|
+
17 12 -3 57
|
80
|
+
17 18 -3 113
|
81
|
+
17 11 -2 130
|
82
|
+
215
|
83
|
+
266
|
84
|
+
5
|
85
|
+
195
|
86
|
+
319
|
87
|
+
0
|
88
|
+
0
|
89
|
+
0
|
90
|
+
0
|
91
|
+
0
|
92
|
+
0
|
93
|
+
0
|
94
|
+
0
|
95
|
+
0
|
96
|
+
0
|
97
|
+
-386
|
98
|
+
-1
|
99
|
+
-399
|
100
|
+
-54
|
101
|
+
-160
|
data/test/test_relax4.rb
ADDED
@@ -0,0 +1,284 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "relax4"
|
3
|
+
|
4
|
+
class TestRelax4< Test::Unit::TestCase
|
5
|
+
def test_solve_1
|
6
|
+
# From Figure 7.14 of Bertsimas and Tsitsiklis (1997). Introduction to
|
7
|
+
# Linear Optimization.
|
8
|
+
prob = {
|
9
|
+
:demands => [-1, 0, 0, 0, 1],
|
10
|
+
:start_nodes => [ 1, 1, 2, 3, 4, 4],
|
11
|
+
:end_nodes => [ 2, 3, 4, 5, 3, 5],
|
12
|
+
:costs => [ 0, 1, 0, 0, 0, 1]}
|
13
|
+
soln = [ 1, 0, 1, 1, 1, 0]
|
14
|
+
assert_equal soln, Relax4.solve(prob)
|
15
|
+
assert_equal soln, Relax4.solve(prob.merge(:auction_init => true))
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_solve_2
|
19
|
+
# From Figure 29.3 of Cormen, Leiserson, Rivest and Stein (2001).
|
20
|
+
# Introduction to Algorithms, 2nd Edition.
|
21
|
+
prob = {
|
22
|
+
:demands => [-4, 0, 0, 4],
|
23
|
+
:start_nodes => [ 1, 1, 2, 2, 3],
|
24
|
+
:end_nodes => [ 2, 3, 3, 4, 4],
|
25
|
+
:costs => [ 2, 5, 3, 7, 1],
|
26
|
+
:capacities => [ 5, 2, 1, 2, 4]}
|
27
|
+
soln = [ 2, 2, 1, 1, 3]
|
28
|
+
flows = Relax4.solve(prob)
|
29
|
+
assert_equal soln, flows
|
30
|
+
assert_equal 27, problem_cost(prob, flows)
|
31
|
+
|
32
|
+
assert_equal soln, Relax4.solve(prob.merge(:auction_init => true))
|
33
|
+
end
|
34
|
+
|
35
|
+
# Load problem from relax4_input format.
|
36
|
+
# Note that the input format has node surpluses rather than demands.
|
37
|
+
# No error checking.
|
38
|
+
def problem_from_relax4_inp file_name
|
39
|
+
require 'scanf'
|
40
|
+
File.open(file_name) {|f|
|
41
|
+
num_nodes, num_arcs = f.scanf('%d %d')
|
42
|
+
arcs = num_arcs.times.collect {f.scanf('%d %d %d %d')}
|
43
|
+
demands = num_nodes.times.collect {-f.scanf('%d').first}
|
44
|
+
{
|
45
|
+
:demands => demands,
|
46
|
+
:start_nodes => arcs.map{|x| x[0].to_i},
|
47
|
+
:end_nodes => arcs.map{|x| x[1].to_i},
|
48
|
+
:costs => arcs.map{|x| x[2].to_i},
|
49
|
+
:capacities => arcs.map{|x| x[3].to_i}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
# Compute cost of flows.
|
55
|
+
def problem_cost prob, flows
|
56
|
+
flows.zip(prob[:costs]).map{|f,c|f*c}.inject(:+)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_solve_3
|
60
|
+
prob = problem_from_relax4_inp 'test/RELAX4.INP'
|
61
|
+
|
62
|
+
flows = Relax4.solve(prob)
|
63
|
+
assert_equal(-26464, problem_cost(prob, flows))
|
64
|
+
|
65
|
+
flows = Relax4.solve(prob.merge(:auction_init => true))
|
66
|
+
assert_equal(-26464, problem_cost(prob, flows))
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_solve_4
|
70
|
+
# This problem appears to fail due to overflow. Its arc capacities are set
|
71
|
+
# to 500 million (equal to the default LARGE constant), and this causes the
|
72
|
+
# solver to incorrectly report that the problem is infeasible. Reducing the
|
73
|
+
# capacities by a factor of 10 makes it work OK.
|
74
|
+
#
|
75
|
+
# Note that giving this file to the original application works, because it
|
76
|
+
# only reads the first 8 digits of any input number (format I8) -- i.e. it
|
77
|
+
# sets the capacities to 50M not 500M.
|
78
|
+
prob = problem_from_relax4_inp 'test/test_solve_4.inp'
|
79
|
+
prob[:capacities].map! {|x| [x, Relax4::RELAX4_UNCAPACITATED].min}
|
80
|
+
flows = Relax4.solve(prob)
|
81
|
+
assert_equal 1381, problem_cost(prob, flows)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_solve_5
|
85
|
+
# This problem caused either a memory error or an infinite loop due to an
|
86
|
+
# apparent bug in the ascnt2_ routine (out of bounds on the prdcsr array,
|
87
|
+
# which was not long enough to record the number of newly balanced arcs).
|
88
|
+
# This bug affected versions 1.0.3 and earlier.
|
89
|
+
prob = problem_from_relax4_inp 'test/test_solve_5.inp'
|
90
|
+
prob[:capacities].map! {|x| [x, Relax4::RELAX4_UNCAPACITATED].min}
|
91
|
+
flows = Relax4.solve(prob)
|
92
|
+
assert_equal 28759, problem_cost(prob, flows)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_solve_lemon_1
|
96
|
+
# Some tests stolen from LEMON version 1.2 (test/min_cost_flow_test.cc).
|
97
|
+
# Note that we can't handle minimum flows, so we can only run tests with the
|
98
|
+
# 'low1' series.
|
99
|
+
nodes_text = <<NODES.lines.drop(1).join("\n")
|
100
|
+
label sup1 sup2 sup3 sup4 sup5 sup6
|
101
|
+
1 20 27 0 30 20 30
|
102
|
+
2 -4 0 0 0 -8 -3
|
103
|
+
3 0 0 0 0 0 0
|
104
|
+
4 0 0 0 0 0 0
|
105
|
+
5 9 0 0 0 6 11
|
106
|
+
6 -6 0 0 0 -5 -6
|
107
|
+
7 0 0 0 0 0 0
|
108
|
+
8 0 0 0 0 0 3
|
109
|
+
9 3 0 0 0 0 0
|
110
|
+
10 -2 0 0 0 -7 -2
|
111
|
+
11 0 0 0 0 -10 0
|
112
|
+
12 -20 -27 0 -30 -30 -20
|
113
|
+
NODES
|
114
|
+
node_rx = /^\s*\d#{'+\s+(-?\d+)'*6}\s*$/
|
115
|
+
demands = (0...6).map{|i| nodes_text.scan(node_rx).map{|x| -x[i].to_i}}
|
116
|
+
|
117
|
+
arcs_text = <<ARCS.lines.drop(1).join("\n")
|
118
|
+
cost cap
|
119
|
+
1 2 70 11
|
120
|
+
1 3 150 3
|
121
|
+
1 4 80 15
|
122
|
+
2 8 80 12
|
123
|
+
3 5 140 5
|
124
|
+
4 6 60 10
|
125
|
+
4 7 80 2
|
126
|
+
4 8 110 3
|
127
|
+
5 7 60 14
|
128
|
+
5 11 120 12
|
129
|
+
6 3 0 3
|
130
|
+
6 9 140 4
|
131
|
+
6 10 90 8
|
132
|
+
7 1 30 5
|
133
|
+
8 12 60 16
|
134
|
+
9 12 50 6
|
135
|
+
10 12 70 13
|
136
|
+
10 2 100 7
|
137
|
+
10 7 60 10
|
138
|
+
11 10 20 14
|
139
|
+
12 11 30 10
|
140
|
+
ARCS
|
141
|
+
|
142
|
+
arc_rx = /^\s*(\d+)\s+(\d+)\s+(-?\d+)\s+(\d+)\s*$/
|
143
|
+
prob = {
|
144
|
+
:start_nodes => arcs_text.scan(arc_rx).map{|x| x[0].to_i},
|
145
|
+
:end_nodes => arcs_text.scan(arc_rx).map{|x| x[1].to_i},
|
146
|
+
:costs => arcs_text.scan(arc_rx).map{|x| x[2].to_i},
|
147
|
+
:capacities => arcs_text.scan(arc_rx).map{|x| x[3].to_i}}
|
148
|
+
|
149
|
+
# l1, s1
|
150
|
+
flows = Relax4.solve(prob.merge(:demands => demands[0]))
|
151
|
+
assert_equal 5240, problem_cost(prob, flows)
|
152
|
+
|
153
|
+
# l1, s2
|
154
|
+
flows = Relax4.solve(prob.merge(:demands => demands[1]))
|
155
|
+
assert_equal 7620, problem_cost(prob, flows)
|
156
|
+
|
157
|
+
# l1, s5 is infeasible because s5 doesn't have balanced supply and demand
|
158
|
+
assert_raise Relax4::InfeasibleError do
|
159
|
+
Relax4.solve(prob.merge(:demands => demands[4]))
|
160
|
+
end
|
161
|
+
|
162
|
+
# unit costs and no capacities (corresponding to "cc" and "cu")
|
163
|
+
prob_unit = {
|
164
|
+
:start_nodes => arcs_text.scan(arc_rx).map{|x| x[0].to_i},
|
165
|
+
:end_nodes => arcs_text.scan(arc_rx).map{|x| x[1].to_i},
|
166
|
+
:costs => [1]*21}
|
167
|
+
|
168
|
+
# l1, s1
|
169
|
+
flows = Relax4.solve(prob_unit.merge(:demands => demands[0]))
|
170
|
+
assert_equal 74, problem_cost(prob_unit, flows)
|
171
|
+
|
172
|
+
# l1, s3
|
173
|
+
flows = Relax4.solve(prob_unit.merge(:demands => demands[2]))
|
174
|
+
assert_equal 0, problem_cost(prob_unit, flows)
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_solve_lemon_2
|
178
|
+
# From test_neg1_lgf in test/min_cost_flow_test.cc. This contains a negative
|
179
|
+
# cost cycle (5, 6, 7). The result is that edges in the cycle are at
|
180
|
+
# capacity; if capacities are not specified, they go to the
|
181
|
+
# RELAX4_UNCAPACITATED constant.
|
182
|
+
prob = {
|
183
|
+
:demands => [-100, 0, 0, 100, 0, 0, 0],
|
184
|
+
:start_nodes => [ 1, 1, 2, 3, 3, 5, 5, 6, 7],
|
185
|
+
:end_nodes => [ 2, 3, 4, 4, 2, 3, 6, 7, 5],
|
186
|
+
:costs => [100,30,20,80,50,10,80,30,-120],
|
187
|
+
}
|
188
|
+
|
189
|
+
flows = Relax4.solve(prob)
|
190
|
+
big = Relax4::RELAX4_UNCAPACITATED
|
191
|
+
assert_equal [0,100,100,0,100,0,big,big,big], flows
|
192
|
+
|
193
|
+
flows = Relax4.solve(prob.merge(:auction_init => true))
|
194
|
+
assert_equal [0,100,100,0,100,0,big,big,big], flows
|
195
|
+
|
196
|
+
# If we put capacity bounds on, we get less flow around the -ve cost cycle.
|
197
|
+
flows = Relax4.solve(prob.merge(:capacities=>[5000]*9))
|
198
|
+
assert_equal(-40000, problem_cost(prob, flows))
|
199
|
+
|
200
|
+
# If we put capacity bounds on, we get less flow around the -ve cost cycle.
|
201
|
+
flows = Relax4.solve(prob.merge(:capacities=>[5000]*9, :auction_init=>true))
|
202
|
+
assert_equal(-40000, problem_cost(prob, flows))
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_bad_args_1
|
206
|
+
# Empty problem is invalid.
|
207
|
+
assert_raise ArgumentError do
|
208
|
+
Relax4.solve(:start_nodes => [],
|
209
|
+
:end_nodes => [],
|
210
|
+
:costs => [],
|
211
|
+
:demands => [])
|
212
|
+
end
|
213
|
+
|
214
|
+
# Mismatch in array lengths.
|
215
|
+
assert_raise ArgumentError do
|
216
|
+
Relax4.solve(:start_nodes => [1,2],
|
217
|
+
:end_nodes => [2,1],
|
218
|
+
:costs => [1,1,1], # too many
|
219
|
+
:demands => [-1,1])
|
220
|
+
end
|
221
|
+
|
222
|
+
# Node out of range.
|
223
|
+
assert_raise ArgumentError do
|
224
|
+
Relax4.solve(:start_nodes => [1,3], # bad node: 3
|
225
|
+
:end_nodes => [2,1],
|
226
|
+
:costs => [1,1],
|
227
|
+
:demands => [-1,1])
|
228
|
+
end
|
229
|
+
assert_raise ArgumentError do
|
230
|
+
Relax4.solve(:start_nodes => [1,2],
|
231
|
+
:end_nodes => [2,3], # bad node: 3
|
232
|
+
:costs => [1,1],
|
233
|
+
:demands => [-1,1])
|
234
|
+
end
|
235
|
+
|
236
|
+
# Cost out of range.
|
237
|
+
assert_raise ArgumentError do
|
238
|
+
Relax4.solve(:start_nodes => [1,2],
|
239
|
+
:end_nodes => [2,1],
|
240
|
+
:costs => [99,101], # bad cost: 100
|
241
|
+
:demands => [-1,1],
|
242
|
+
:large => 1000,
|
243
|
+
:max_cost => 100)
|
244
|
+
end
|
245
|
+
|
246
|
+
# Capacity out of range.
|
247
|
+
assert_raise ArgumentError do
|
248
|
+
Relax4.solve(:start_nodes => [1,2],
|
249
|
+
:end_nodes => [2,1],
|
250
|
+
:costs => [99,100],
|
251
|
+
:capacities => [1000,1001], # bad capacity: 1001
|
252
|
+
:demands => [-1,1],
|
253
|
+
:large => 1000,
|
254
|
+
:max_cost => 100)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_infeasible
|
259
|
+
#
|
260
|
+
# A problem for which the phase 1 init doesn't detect infeasibility.
|
261
|
+
#
|
262
|
+
# (1) (6) all edges have capacity 1
|
263
|
+
# \ / 1 unit surplus for 1, 2
|
264
|
+
# \ / 1 unit deficit for 6, 7
|
265
|
+
# (3)-->--(4) link (3, 4) is the bottleneck
|
266
|
+
# / \
|
267
|
+
# / \
|
268
|
+
# (2) (7)
|
269
|
+
#
|
270
|
+
prob = {
|
271
|
+
:demands => [-1, -1, 0, 0, 1, 1],
|
272
|
+
:start_nodes => [ 1, 2, 3, 4, 4],
|
273
|
+
:end_nodes => [ 3, 3, 4, 5, 6],
|
274
|
+
:costs => [ 1, 1, 1, 1, 1],
|
275
|
+
:capacities => [ 1, 1, 1, 1, 1]}
|
276
|
+
|
277
|
+
assert_raise Relax4::InfeasibleError do
|
278
|
+
Relax4.solve(prob)
|
279
|
+
end
|
280
|
+
assert_raise Relax4::InfeasibleError do
|
281
|
+
Relax4.solve(prob.merge(:auction_init => true))
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
@@ -0,0 +1,258 @@
|
|
1
|
+
17 240
|
2
|
+
1 2 244 500000000
|
3
|
+
1 3 738 500000000
|
4
|
+
1 4 643 500000000
|
5
|
+
1 5 578 500000000
|
6
|
+
1 6 514 500000000
|
7
|
+
1 7 433 500000000
|
8
|
+
1 8 365 500000000
|
9
|
+
1 9 294 500000000
|
10
|
+
1 10 140 500000000
|
11
|
+
1 11 79 500000000
|
12
|
+
1 12 169 500000000
|
13
|
+
1 13 287 500000000
|
14
|
+
1 14 359 500000000
|
15
|
+
1 15 207 500000000
|
16
|
+
2 1 32 500000000
|
17
|
+
2 3 769 500000000
|
18
|
+
2 4 674 500000000
|
19
|
+
2 5 609 500000000
|
20
|
+
2 6 545 500000000
|
21
|
+
2 7 464 500000000
|
22
|
+
2 8 396 500000000
|
23
|
+
2 9 325 500000000
|
24
|
+
2 10 171 500000000
|
25
|
+
2 11 110 500000000
|
26
|
+
2 12 200 500000000
|
27
|
+
2 13 318 500000000
|
28
|
+
2 14 390 500000000
|
29
|
+
2 15 238 500000000
|
30
|
+
3 1 103 500000000
|
31
|
+
3 2 72 500000000
|
32
|
+
3 4 745 500000000
|
33
|
+
3 5 680 500000000
|
34
|
+
3 6 616 500000000
|
35
|
+
3 7 535 500000000
|
36
|
+
3 8 467 500000000
|
37
|
+
3 9 396 500000000
|
38
|
+
3 10 242 500000000
|
39
|
+
3 11 181 500000000
|
40
|
+
3 12 271 500000000
|
41
|
+
3 13 389 500000000
|
42
|
+
3 14 461 500000000
|
43
|
+
3 15 309 500000000
|
44
|
+
4 1 198 500000000
|
45
|
+
4 2 167 500000000
|
46
|
+
4 3 96 500000000
|
47
|
+
4 5 775 500000000
|
48
|
+
4 6 711 500000000
|
49
|
+
4 7 630 500000000
|
50
|
+
4 8 562 500000000
|
51
|
+
4 9 491 500000000
|
52
|
+
4 10 337 500000000
|
53
|
+
4 11 276 500000000
|
54
|
+
4 12 366 500000000
|
55
|
+
4 13 484 500000000
|
56
|
+
4 14 556 500000000
|
57
|
+
4 15 404 500000000
|
58
|
+
5 1 263 500000000
|
59
|
+
5 2 232 500000000
|
60
|
+
5 3 161 500000000
|
61
|
+
5 4 66 500000000
|
62
|
+
5 6 776 500000000
|
63
|
+
5 7 695 500000000
|
64
|
+
5 8 627 500000000
|
65
|
+
5 9 556 500000000
|
66
|
+
5 10 402 500000000
|
67
|
+
5 11 341 500000000
|
68
|
+
5 12 431 500000000
|
69
|
+
5 13 549 500000000
|
70
|
+
5 14 621 500000000
|
71
|
+
5 15 469 500000000
|
72
|
+
6 1 327 500000000
|
73
|
+
6 2 296 500000000
|
74
|
+
6 3 225 500000000
|
75
|
+
6 4 130 500000000
|
76
|
+
6 5 65 500000000
|
77
|
+
6 7 759 500000000
|
78
|
+
6 8 691 500000000
|
79
|
+
6 9 620 500000000
|
80
|
+
6 10 466 500000000
|
81
|
+
6 11 405 500000000
|
82
|
+
6 12 495 500000000
|
83
|
+
6 13 613 500000000
|
84
|
+
6 14 685 500000000
|
85
|
+
6 15 533 500000000
|
86
|
+
7 1 408 500000000
|
87
|
+
7 2 377 500000000
|
88
|
+
7 3 306 500000000
|
89
|
+
7 4 211 500000000
|
90
|
+
7 5 146 500000000
|
91
|
+
7 6 82 500000000
|
92
|
+
7 8 772 500000000
|
93
|
+
7 9 701 500000000
|
94
|
+
7 10 547 500000000
|
95
|
+
7 11 486 500000000
|
96
|
+
7 12 576 500000000
|
97
|
+
7 13 694 500000000
|
98
|
+
7 14 766 500000000
|
99
|
+
7 15 614 500000000
|
100
|
+
8 1 476 500000000
|
101
|
+
8 2 445 500000000
|
102
|
+
8 3 374 500000000
|
103
|
+
8 4 279 500000000
|
104
|
+
8 5 214 500000000
|
105
|
+
8 6 150 500000000
|
106
|
+
8 7 69 500000000
|
107
|
+
8 9 769 500000000
|
108
|
+
8 10 615 500000000
|
109
|
+
8 11 554 500000000
|
110
|
+
8 12 644 500000000
|
111
|
+
8 13 762 500000000
|
112
|
+
8 14 834 500000000
|
113
|
+
8 15 682 500000000
|
114
|
+
9 1 547 500000000
|
115
|
+
9 2 516 500000000
|
116
|
+
9 3 445 500000000
|
117
|
+
9 4 350 500000000
|
118
|
+
9 5 285 500000000
|
119
|
+
9 6 221 500000000
|
120
|
+
9 7 140 500000000
|
121
|
+
9 8 72 500000000
|
122
|
+
9 10 686 500000000
|
123
|
+
9 11 625 500000000
|
124
|
+
9 12 715 500000000
|
125
|
+
9 13 833 500000000
|
126
|
+
9 14 905 500000000
|
127
|
+
9 15 753 500000000
|
128
|
+
10 1 136 500000000
|
129
|
+
10 2 105 500000000
|
130
|
+
10 3 599 500000000
|
131
|
+
10 4 504 500000000
|
132
|
+
10 5 439 500000000
|
133
|
+
10 6 375 500000000
|
134
|
+
10 7 294 500000000
|
135
|
+
10 8 226 500000000
|
136
|
+
10 9 155 500000000
|
137
|
+
10 11 214 500000000
|
138
|
+
10 12 304 500000000
|
139
|
+
10 13 422 500000000
|
140
|
+
10 14 494 500000000
|
141
|
+
10 15 342 500000000
|
142
|
+
11 1 231 500000000
|
143
|
+
11 2 200 500000000
|
144
|
+
11 3 968 500000000
|
145
|
+
11 4 873 500000000
|
146
|
+
11 5 808 500000000
|
147
|
+
11 6 744 500000000
|
148
|
+
11 7 663 500000000
|
149
|
+
11 8 595 500000000
|
150
|
+
11 9 524 500000000
|
151
|
+
11 10 370 500000000
|
152
|
+
11 12 91 500000000
|
153
|
+
11 13 209 500000000
|
154
|
+
11 14 281 500000000
|
155
|
+
11 15 129 500000000
|
156
|
+
12 1 388 500000000
|
157
|
+
12 2 357 500000000
|
158
|
+
12 3 1125 500000000
|
159
|
+
12 4 1030 500000000
|
160
|
+
12 5 965 500000000
|
161
|
+
12 6 901 500000000
|
162
|
+
12 7 820 500000000
|
163
|
+
12 8 752 500000000
|
164
|
+
12 9 681 500000000
|
165
|
+
12 10 527 500000000
|
166
|
+
12 11 466 500000000
|
167
|
+
12 13 119 500000000
|
168
|
+
12 14 191 500000000
|
169
|
+
12 15 286 500000000
|
170
|
+
13 1 270 500000000
|
171
|
+
13 2 239 500000000
|
172
|
+
13 3 1007 500000000
|
173
|
+
13 4 912 500000000
|
174
|
+
13 5 847 500000000
|
175
|
+
13 6 783 500000000
|
176
|
+
13 7 702 500000000
|
177
|
+
13 8 634 500000000
|
178
|
+
13 9 563 500000000
|
179
|
+
13 10 409 500000000
|
180
|
+
13 11 348 500000000
|
181
|
+
13 12 438 500000000
|
182
|
+
13 14 73 500000000
|
183
|
+
13 15 168 500000000
|
184
|
+
14 1 198 500000000
|
185
|
+
14 2 167 500000000
|
186
|
+
14 3 935 500000000
|
187
|
+
14 4 840 500000000
|
188
|
+
14 5 775 500000000
|
189
|
+
14 6 711 500000000
|
190
|
+
14 7 630 500000000
|
191
|
+
14 8 562 500000000
|
192
|
+
14 9 491 500000000
|
193
|
+
14 10 337 500000000
|
194
|
+
14 11 276 500000000
|
195
|
+
14 12 366 500000000
|
196
|
+
14 13 484 500000000
|
197
|
+
14 15 96 500000000
|
198
|
+
15 1 103 500000000
|
199
|
+
15 2 72 500000000
|
200
|
+
15 3 840 500000000
|
201
|
+
15 4 745 500000000
|
202
|
+
15 5 680 500000000
|
203
|
+
15 6 616 500000000
|
204
|
+
15 7 535 500000000
|
205
|
+
15 8 467 500000000
|
206
|
+
15 9 396 500000000
|
207
|
+
15 10 242 500000000
|
208
|
+
15 11 181 500000000
|
209
|
+
15 12 271 500000000
|
210
|
+
15 13 389 500000000
|
211
|
+
15 14 461 500000000
|
212
|
+
16 1 0 500000000
|
213
|
+
16 2 0 500000000
|
214
|
+
16 3 0 500000000
|
215
|
+
16 4 0 500000000
|
216
|
+
16 5 0 500000000
|
217
|
+
16 6 0 500000000
|
218
|
+
16 7 0 500000000
|
219
|
+
16 8 0 500000000
|
220
|
+
16 9 0 500000000
|
221
|
+
16 10 0 500000000
|
222
|
+
16 11 0 500000000
|
223
|
+
16 12 0 500000000
|
224
|
+
16 13 0 500000000
|
225
|
+
16 14 0 500000000
|
226
|
+
16 15 0 500000000
|
227
|
+
1 17 0 500000000
|
228
|
+
2 17 0 500000000
|
229
|
+
3 17 0 500000000
|
230
|
+
4 17 0 500000000
|
231
|
+
5 17 0 500000000
|
232
|
+
6 17 0 500000000
|
233
|
+
7 17 0 500000000
|
234
|
+
8 17 0 500000000
|
235
|
+
9 17 0 500000000
|
236
|
+
10 17 0 500000000
|
237
|
+
11 17 0 500000000
|
238
|
+
12 17 0 500000000
|
239
|
+
13 17 0 500000000
|
240
|
+
14 17 0 500000000
|
241
|
+
15 17 0 500000000
|
242
|
+
4
|
243
|
+
78
|
244
|
+
-1
|
245
|
+
-1
|
246
|
+
0
|
247
|
+
0
|
248
|
+
0
|
249
|
+
0
|
250
|
+
0
|
251
|
+
0
|
252
|
+
3
|
253
|
+
3
|
254
|
+
22
|
255
|
+
11
|
256
|
+
20
|
257
|
+
0
|
258
|
+
-139
|
@@ -0,0 +1,259 @@
|
|
1
|
+
17 240
|
2
|
+
1 2 244 50000000
|
3
|
+
1 3 738 50000000
|
4
|
+
1 4 643 50000000
|
5
|
+
1 5 578 50000000
|
6
|
+
1 6 514 50000000
|
7
|
+
1 7 433 50000000
|
8
|
+
1 8 365 50000000
|
9
|
+
1 9 294 50000000
|
10
|
+
1 10 140 50000000
|
11
|
+
1 11 79 50000000
|
12
|
+
1 12 169 50000000
|
13
|
+
1 13 287 50000000
|
14
|
+
1 14 359 50000000
|
15
|
+
1 15 207 50000000
|
16
|
+
2 1 32 50000000
|
17
|
+
2 3 769 50000000
|
18
|
+
2 4 674 50000000
|
19
|
+
2 5 609 50000000
|
20
|
+
2 6 545 50000000
|
21
|
+
2 7 464 50000000
|
22
|
+
2 8 396 50000000
|
23
|
+
2 9 325 50000000
|
24
|
+
2 10 171 50000000
|
25
|
+
2 11 110 50000000
|
26
|
+
2 12 200 50000000
|
27
|
+
2 13 318 50000000
|
28
|
+
2 14 390 50000000
|
29
|
+
2 15 238 50000000
|
30
|
+
3 1 103 50000000
|
31
|
+
3 2 72 50000000
|
32
|
+
3 4 745 50000000
|
33
|
+
3 5 680 50000000
|
34
|
+
3 6 616 50000000
|
35
|
+
3 7 535 50000000
|
36
|
+
3 8 467 50000000
|
37
|
+
3 9 396 50000000
|
38
|
+
3 10 242 50000000
|
39
|
+
3 11 181 50000000
|
40
|
+
3 12 271 50000000
|
41
|
+
3 13 389 50000000
|
42
|
+
3 14 461 50000000
|
43
|
+
3 15 309 50000000
|
44
|
+
4 1 198 50000000
|
45
|
+
4 2 167 50000000
|
46
|
+
4 3 96 50000000
|
47
|
+
4 5 775 50000000
|
48
|
+
4 6 711 50000000
|
49
|
+
4 7 630 50000000
|
50
|
+
4 8 562 50000000
|
51
|
+
4 9 491 50000000
|
52
|
+
4 10 337 50000000
|
53
|
+
4 11 276 50000000
|
54
|
+
4 12 366 50000000
|
55
|
+
4 13 484 50000000
|
56
|
+
4 14 556 50000000
|
57
|
+
4 15 404 50000000
|
58
|
+
5 1 263 50000000
|
59
|
+
5 2 232 50000000
|
60
|
+
5 3 161 50000000
|
61
|
+
5 4 66 50000000
|
62
|
+
5 6 776 50000000
|
63
|
+
5 7 695 50000000
|
64
|
+
5 8 627 50000000
|
65
|
+
5 9 556 50000000
|
66
|
+
5 10 402 50000000
|
67
|
+
5 11 341 50000000
|
68
|
+
5 12 431 50000000
|
69
|
+
5 13 549 50000000
|
70
|
+
5 14 621 50000000
|
71
|
+
5 15 469 50000000
|
72
|
+
6 1 327 50000000
|
73
|
+
6 2 296 50000000
|
74
|
+
6 3 225 50000000
|
75
|
+
6 4 130 50000000
|
76
|
+
6 5 65 50000000
|
77
|
+
6 7 759 50000000
|
78
|
+
6 8 691 50000000
|
79
|
+
6 9 620 50000000
|
80
|
+
6 10 466 50000000
|
81
|
+
6 11 405 50000000
|
82
|
+
6 12 495 50000000
|
83
|
+
6 13 613 50000000
|
84
|
+
6 14 685 50000000
|
85
|
+
6 15 533 50000000
|
86
|
+
7 1 408 50000000
|
87
|
+
7 2 377 50000000
|
88
|
+
7 3 306 50000000
|
89
|
+
7 4 211 50000000
|
90
|
+
7 5 146 50000000
|
91
|
+
7 6 82 50000000
|
92
|
+
7 8 772 50000000
|
93
|
+
7 9 701 50000000
|
94
|
+
7 10 547 50000000
|
95
|
+
7 11 486 50000000
|
96
|
+
7 12 576 50000000
|
97
|
+
7 13 694 50000000
|
98
|
+
7 14 766 50000000
|
99
|
+
7 15 614 50000000
|
100
|
+
8 1 476 50000000
|
101
|
+
8 2 445 50000000
|
102
|
+
8 3 374 50000000
|
103
|
+
8 4 279 50000000
|
104
|
+
8 5 214 50000000
|
105
|
+
8 6 150 50000000
|
106
|
+
8 7 69 50000000
|
107
|
+
8 9 769 50000000
|
108
|
+
8 10 615 50000000
|
109
|
+
8 11 554 50000000
|
110
|
+
8 12 644 50000000
|
111
|
+
8 13 762 50000000
|
112
|
+
8 14 834 50000000
|
113
|
+
8 15 682 50000000
|
114
|
+
9 1 547 50000000
|
115
|
+
9 2 516 50000000
|
116
|
+
9 3 445 50000000
|
117
|
+
9 4 350 50000000
|
118
|
+
9 5 285 50000000
|
119
|
+
9 6 221 50000000
|
120
|
+
9 7 140 50000000
|
121
|
+
9 8 72 50000000
|
122
|
+
9 10 686 50000000
|
123
|
+
9 11 625 50000000
|
124
|
+
9 12 715 50000000
|
125
|
+
9 13 833 50000000
|
126
|
+
9 14 905 50000000
|
127
|
+
9 15 753 50000000
|
128
|
+
10 1 136 50000000
|
129
|
+
10 2 105 50000000
|
130
|
+
10 3 599 50000000
|
131
|
+
10 4 504 50000000
|
132
|
+
10 5 439 50000000
|
133
|
+
10 6 375 50000000
|
134
|
+
10 7 294 50000000
|
135
|
+
10 8 226 50000000
|
136
|
+
10 9 155 50000000
|
137
|
+
10 11 214 50000000
|
138
|
+
10 12 304 50000000
|
139
|
+
10 13 422 50000000
|
140
|
+
10 14 494 50000000
|
141
|
+
10 15 342 50000000
|
142
|
+
11 1 231 50000000
|
143
|
+
11 2 200 50000000
|
144
|
+
11 3 968 50000000
|
145
|
+
11 4 873 50000000
|
146
|
+
11 5 808 50000000
|
147
|
+
11 6 744 50000000
|
148
|
+
11 7 663 50000000
|
149
|
+
11 8 595 50000000
|
150
|
+
11 9 524 50000000
|
151
|
+
11 10 370 50000000
|
152
|
+
11 12 91 50000000
|
153
|
+
11 13 209 50000000
|
154
|
+
11 14 281 50000000
|
155
|
+
11 15 129 50000000
|
156
|
+
12 1 388 50000000
|
157
|
+
12 2 357 50000000
|
158
|
+
12 3 1125 50000000
|
159
|
+
12 4 1030 50000000
|
160
|
+
12 5 965 50000000
|
161
|
+
12 6 901 50000000
|
162
|
+
12 7 820 50000000
|
163
|
+
12 8 752 50000000
|
164
|
+
12 9 681 50000000
|
165
|
+
12 10 527 50000000
|
166
|
+
12 11 466 50000000
|
167
|
+
12 13 119 50000000
|
168
|
+
12 14 191 50000000
|
169
|
+
12 15 286 50000000
|
170
|
+
13 1 270 50000000
|
171
|
+
13 2 239 50000000
|
172
|
+
13 3 1007 50000000
|
173
|
+
13 4 912 50000000
|
174
|
+
13 5 847 50000000
|
175
|
+
13 6 783 50000000
|
176
|
+
13 7 702 50000000
|
177
|
+
13 8 634 50000000
|
178
|
+
13 9 563 50000000
|
179
|
+
13 10 409 50000000
|
180
|
+
13 11 348 50000000
|
181
|
+
13 12 438 50000000
|
182
|
+
13 14 73 50000000
|
183
|
+
13 15 168 50000000
|
184
|
+
14 1 198 50000000
|
185
|
+
14 2 167 50000000
|
186
|
+
14 3 935 50000000
|
187
|
+
14 4 840 50000000
|
188
|
+
14 5 775 50000000
|
189
|
+
14 6 711 50000000
|
190
|
+
14 7 630 50000000
|
191
|
+
14 8 562 50000000
|
192
|
+
14 9 491 50000000
|
193
|
+
14 10 337 50000000
|
194
|
+
14 11 276 50000000
|
195
|
+
14 12 366 50000000
|
196
|
+
14 13 484 50000000
|
197
|
+
14 15 96 50000000
|
198
|
+
15 1 103 50000000
|
199
|
+
15 2 72 50000000
|
200
|
+
15 3 840 50000000
|
201
|
+
15 4 745 50000000
|
202
|
+
15 5 680 50000000
|
203
|
+
15 6 616 50000000
|
204
|
+
15 7 535 50000000
|
205
|
+
15 8 467 50000000
|
206
|
+
15 9 396 50000000
|
207
|
+
15 10 242 50000000
|
208
|
+
15 11 181 50000000
|
209
|
+
15 12 271 50000000
|
210
|
+
15 13 389 50000000
|
211
|
+
15 14 461 50000000
|
212
|
+
16 1 0 50000000
|
213
|
+
16 2 0 50000000
|
214
|
+
16 3 0 50000000
|
215
|
+
16 4 0 50000000
|
216
|
+
16 5 0 50000000
|
217
|
+
16 6 0 50000000
|
218
|
+
16 7 0 50000000
|
219
|
+
16 8 0 50000000
|
220
|
+
16 9 0 50000000
|
221
|
+
16 10 0 50000000
|
222
|
+
16 11 0 50000000
|
223
|
+
16 12 0 50000000
|
224
|
+
16 13 0 50000000
|
225
|
+
16 14 0 50000000
|
226
|
+
16 15 0 50000000
|
227
|
+
1 17 0 50000000
|
228
|
+
2 17 0 50000000
|
229
|
+
3 17 0 50000000
|
230
|
+
4 17 0 50000000
|
231
|
+
5 17 0 50000000
|
232
|
+
6 17 0 50000000
|
233
|
+
7 17 0 50000000
|
234
|
+
8 17 0 50000000
|
235
|
+
9 17 0 50000000
|
236
|
+
10 17 0 50000000
|
237
|
+
11 17 0 50000000
|
238
|
+
12 17 0 50000000
|
239
|
+
13 17 0 50000000
|
240
|
+
14 17 0 50000000
|
241
|
+
15 17 0 50000000
|
242
|
+
2
|
243
|
+
-2
|
244
|
+
-6
|
245
|
+
-12
|
246
|
+
-13
|
247
|
+
-5
|
248
|
+
-5
|
249
|
+
1
|
250
|
+
2
|
251
|
+
1
|
252
|
+
10
|
253
|
+
11
|
254
|
+
8
|
255
|
+
2
|
256
|
+
1
|
257
|
+
5
|
258
|
+
0
|
259
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relax4
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 4
|
10
|
+
version: 1.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Lees-Miller
|
@@ -15,19 +15,21 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09-
|
18
|
+
date: 2010-09-24 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
22
|
-
description:
|
22
|
+
description: |
|
23
|
+
Ruby interface for the RELAX IV code by D.P. Bertsekas and P. Tseng.
|
24
|
+
|
23
25
|
email:
|
24
26
|
- jdleesmiller@gmail.com
|
25
27
|
executables: []
|
26
28
|
|
27
29
|
extensions:
|
28
30
|
- ext/extconf.rb
|
29
|
-
extra_rdoc_files:
|
30
|
-
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README.rdoc
|
31
33
|
files:
|
32
34
|
- lib/relax4.rb
|
33
35
|
- lib/relax4/version.rb
|
@@ -36,16 +38,20 @@ files:
|
|
36
38
|
- ext/relax4.h
|
37
39
|
- ext/relax4_wrap.c
|
38
40
|
- README.rdoc
|
41
|
+
- test/RELAX4.INP
|
42
|
+
- test/test_solve_4.inp
|
43
|
+
- test/test_solve_5.inp
|
44
|
+
- test/test_relax4.rb
|
39
45
|
has_rdoc: true
|
40
46
|
homepage: http://relax4.rubyforge.org/
|
41
47
|
licenses: []
|
42
48
|
|
43
49
|
post_install_message:
|
44
|
-
rdoc_options:
|
45
|
-
|
50
|
+
rdoc_options:
|
51
|
+
- --main
|
52
|
+
- README.rdoc
|
46
53
|
require_paths:
|
47
54
|
- lib
|
48
|
-
- lib
|
49
55
|
- ext
|
50
56
|
required_ruby_version: !ruby/object:Gem::Requirement
|
51
57
|
none: false
|
@@ -72,5 +78,5 @@ rubygems_version: 1.3.7
|
|
72
78
|
signing_key:
|
73
79
|
specification_version: 3
|
74
80
|
summary: The RELAX IV code for the Minimum Cost Network Flow Problem
|
75
|
-
test_files:
|
76
|
-
|
81
|
+
test_files:
|
82
|
+
- test/test_relax4.rb
|