relax4 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +6 -5
- data/ext/relax4.c +127 -110
- data/ext/relax4.h +26 -10
- data/ext/relax4_wrap.c +497 -185
- data/lib/relax4/version.rb +1 -1
- data/lib/relax4.rb +2 -2
- metadata +4 -5
- data/ext/relax4_f2c.h +0 -247
data/README.rdoc
CHANGED
@@ -67,6 +67,11 @@ A lower-level interface is also available; see the docs for the Relax4 module.
|
|
67
67
|
|
68
68
|
== REQUIREMENTS
|
69
69
|
|
70
|
+
Has been tested on:
|
71
|
+
* x86-linux (Ubuntu 10.04) with Ruby 1.8.7p249
|
72
|
+
* x86-linux (Ubuntu 10.04) with Ruby 1.9.1p378
|
73
|
+
* x86_64-linux (CentOS) with Ruby 1.8.7-p72
|
74
|
+
|
70
75
|
The following packages were required to install on Ubuntu 10.04:
|
71
76
|
|
72
77
|
* ruby, ruby-dev, rubygems, rake
|
@@ -74,11 +79,6 @@ The following packages were required to install on Ubuntu 10.04:
|
|
74
79
|
The bindings were generated with f2c (FORTRAN to C converter) and SWIG
|
75
80
|
(www.swig.org), but you don't need either to build the gem.
|
76
81
|
|
77
|
-
Has been tested on:
|
78
|
-
* x86-linux (Ubuntu 10.04) with Ruby 1.8.7-p302
|
79
|
-
* x86-linux (Ubuntu 10.04) with Ruby 1.9.2-p0
|
80
|
-
* x86_64-linux (CentOS) with Ruby 1.8.7-p72
|
81
|
-
|
82
82
|
== INSTALL
|
83
83
|
|
84
84
|
You should be able to install with
|
@@ -98,6 +98,7 @@ and run
|
|
98
98
|
|
99
99
|
* there are some hard-coded parameters that could be exposed
|
100
100
|
* problem state is global (cf. FORTRAN), so can have only one instance at a time
|
101
|
+
* add some wrappers for transportation and assignment problems
|
101
102
|
|
102
103
|
== LICENSE
|
103
104
|
|
data/ext/relax4.c
CHANGED
@@ -11,47 +11,66 @@
|
|
11
11
|
#include "stdlib.h"
|
12
12
|
/*#include "stdio.h" */ /* just for tracing*/
|
13
13
|
#include "assert.h"
|
14
|
-
#include "relax4_f2c.h"
|
15
14
|
#include "relax4.h"
|
16
15
|
|
17
|
-
/*
|
16
|
+
/*
|
17
|
+
* The following are the required parts from f2c.h -- the Standard Fortran to C
|
18
|
+
* header file. They're included here to avoid having a dependency on f2c,
|
19
|
+
* because we really just need a few defines.
|
20
|
+
*
|
21
|
+
* barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
|
22
|
+
* - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition)
|
23
|
+
*
|
24
|
+
* (yes, the quotation above is a required part of f2c.h)
|
25
|
+
*/
|
26
|
+
|
27
|
+
typedef char logical1;
|
28
|
+
#define TRUE_ (1)
|
29
|
+
#define FALSE_ (0)
|
30
|
+
#define min(a,b) ((a) <= (b) ? (a) : (b))
|
31
|
+
|
32
|
+
/*
|
33
|
+
* Begin translated RELAX4 code...
|
34
|
+
*
|
35
|
+
* Common Block Declarations
|
36
|
+
*/
|
18
37
|
|
19
38
|
struct {
|
20
|
-
|
39
|
+
RELAX4_INT n, na, large;
|
21
40
|
} input_;
|
22
41
|
|
23
42
|
#define input_1 input_
|
24
43
|
|
25
44
|
struct {
|
26
|
-
|
45
|
+
RELAX4_INT *startn;
|
27
46
|
} arrays_;
|
28
47
|
|
29
48
|
#define arrays_1 arrays_
|
30
49
|
|
31
50
|
struct {
|
32
|
-
|
51
|
+
RELAX4_INT *endn;
|
33
52
|
} arraye_;
|
34
53
|
|
35
54
|
#define arraye_1 arraye_
|
36
55
|
|
37
56
|
struct {
|
38
|
-
|
57
|
+
RELAX4_INT *c__;
|
39
58
|
} arrayc_;
|
40
59
|
|
41
60
|
#define arrayc_1 arrayc_
|
42
61
|
|
43
62
|
struct {
|
44
|
-
|
63
|
+
RELAX4_INT *u;
|
45
64
|
} arrayu_;
|
46
65
|
|
47
66
|
#define arrayu_1 arrayu_
|
48
67
|
|
49
68
|
union {
|
50
69
|
struct {
|
51
|
-
|
70
|
+
RELAX4_INT *b;
|
52
71
|
} _1;
|
53
72
|
struct {
|
54
|
-
|
73
|
+
RELAX4_INT *dfct;
|
55
74
|
} _2;
|
56
75
|
} arrayb_;
|
57
76
|
|
@@ -59,35 +78,35 @@ union {
|
|
59
78
|
#define arrayb_2 (arrayb_._2)
|
60
79
|
|
61
80
|
struct {
|
62
|
-
|
81
|
+
RELAX4_INT *x;
|
63
82
|
} arrayx_;
|
64
83
|
|
65
84
|
#define arrayx_1 arrayx_
|
66
85
|
|
67
86
|
struct {
|
68
|
-
|
87
|
+
RELAX4_INT *rc;
|
69
88
|
} arrayrc_;
|
70
89
|
|
71
90
|
#define arrayrc_1 arrayrc_
|
72
91
|
|
73
92
|
struct {
|
74
|
-
|
93
|
+
RELAX4_INT nmultinode, iter, num_augm__, num_ascnt__, nsp;
|
75
94
|
} output_;
|
76
95
|
|
77
96
|
#define output_1 output_
|
78
97
|
|
79
98
|
union {
|
80
99
|
struct {
|
81
|
-
|
100
|
+
RELAX4_INT *i1;
|
82
101
|
} _1;
|
83
102
|
struct {
|
84
|
-
|
103
|
+
RELAX4_INT *tempin;
|
85
104
|
} _2;
|
86
105
|
struct {
|
87
|
-
|
106
|
+
RELAX4_INT *label;
|
88
107
|
} _3;
|
89
108
|
struct {
|
90
|
-
|
109
|
+
RELAX4_INT *p;
|
91
110
|
} _4;
|
92
111
|
} blk1_;
|
93
112
|
|
@@ -98,16 +117,16 @@ union {
|
|
98
117
|
|
99
118
|
union {
|
100
119
|
struct {
|
101
|
-
|
120
|
+
RELAX4_INT *i2;
|
102
121
|
} _1;
|
103
122
|
struct {
|
104
|
-
|
123
|
+
RELAX4_INT *tempou;
|
105
124
|
} _2;
|
106
125
|
struct {
|
107
|
-
|
126
|
+
RELAX4_INT *prdcsr;
|
108
127
|
} _3;
|
109
128
|
struct {
|
110
|
-
|
129
|
+
RELAX4_INT *price;
|
111
130
|
} _4;
|
112
131
|
} blk2_;
|
113
132
|
|
@@ -118,10 +137,10 @@ union {
|
|
118
137
|
|
119
138
|
union {
|
120
139
|
struct {
|
121
|
-
|
140
|
+
RELAX4_INT *i3;
|
122
141
|
} _1;
|
123
142
|
struct {
|
124
|
-
|
143
|
+
RELAX4_INT *fou;
|
125
144
|
} _2;
|
126
145
|
} blk3_;
|
127
146
|
|
@@ -130,10 +149,10 @@ union {
|
|
130
149
|
|
131
150
|
union {
|
132
151
|
struct {
|
133
|
-
|
152
|
+
RELAX4_INT *i4;
|
134
153
|
} _1;
|
135
154
|
struct {
|
136
|
-
|
155
|
+
RELAX4_INT *nxtou;
|
137
156
|
} _2;
|
138
157
|
} blk4_;
|
139
158
|
|
@@ -142,10 +161,10 @@ union {
|
|
142
161
|
|
143
162
|
union {
|
144
163
|
struct {
|
145
|
-
|
164
|
+
RELAX4_INT *i5;
|
146
165
|
} _1;
|
147
166
|
struct {
|
148
|
-
|
167
|
+
RELAX4_INT *fin;
|
149
168
|
} _2;
|
150
169
|
} blk5_;
|
151
170
|
|
@@ -154,10 +173,10 @@ union {
|
|
154
173
|
|
155
174
|
union {
|
156
175
|
struct {
|
157
|
-
|
176
|
+
RELAX4_INT *i6;
|
158
177
|
} _1;
|
159
178
|
struct {
|
160
|
-
|
179
|
+
RELAX4_INT *nxtin;
|
161
180
|
} _2;
|
162
181
|
} blk6_;
|
163
182
|
|
@@ -166,10 +185,10 @@ union {
|
|
166
185
|
|
167
186
|
union {
|
168
187
|
struct {
|
169
|
-
|
188
|
+
RELAX4_INT *i7;
|
170
189
|
} _1;
|
171
190
|
struct {
|
172
|
-
|
191
|
+
RELAX4_INT *save;
|
173
192
|
} _2;
|
174
193
|
} blk7_;
|
175
194
|
|
@@ -196,10 +215,10 @@ union {
|
|
196
215
|
|
197
216
|
union {
|
198
217
|
struct {
|
199
|
-
|
218
|
+
RELAX4_INT *tfstou; /* AKA ddpos */
|
200
219
|
} _1;
|
201
220
|
struct {
|
202
|
-
|
221
|
+
RELAX4_INT *fpushf;
|
203
222
|
} _2;
|
204
223
|
} blk10_;
|
205
224
|
|
@@ -208,10 +227,10 @@ union {
|
|
208
227
|
|
209
228
|
union {
|
210
229
|
struct {
|
211
|
-
|
230
|
+
RELAX4_INT *tnxtou;
|
212
231
|
} _1;
|
213
232
|
struct {
|
214
|
-
|
233
|
+
RELAX4_INT *nxtpushf;
|
215
234
|
} _2;
|
216
235
|
} blk11_;
|
217
236
|
|
@@ -220,10 +239,10 @@ union {
|
|
220
239
|
|
221
240
|
union {
|
222
241
|
struct {
|
223
|
-
|
242
|
+
RELAX4_INT *tfstin; /* AKA ddneg */
|
224
243
|
} _1;
|
225
244
|
struct {
|
226
|
-
|
245
|
+
RELAX4_INT *fpushb;
|
227
246
|
} _2;
|
228
247
|
} blk12_;
|
229
248
|
|
@@ -232,10 +251,10 @@ union {
|
|
232
251
|
|
233
252
|
union {
|
234
253
|
struct {
|
235
|
-
|
254
|
+
RELAX4_INT *tnxtin;
|
236
255
|
} _1;
|
237
256
|
struct {
|
238
|
-
|
257
|
+
RELAX4_INT *nxtpushb;
|
239
258
|
} _2;
|
240
259
|
} blk13_;
|
241
260
|
|
@@ -244,10 +263,10 @@ union {
|
|
244
263
|
|
245
264
|
union {
|
246
265
|
struct {
|
247
|
-
|
266
|
+
RELAX4_INT *i14;
|
248
267
|
} _1;
|
249
268
|
struct {
|
250
|
-
|
269
|
+
RELAX4_INT *nxtqueue;
|
251
270
|
} _2;
|
252
271
|
} blk14_;
|
253
272
|
|
@@ -256,10 +275,10 @@ union {
|
|
256
275
|
|
257
276
|
union {
|
258
277
|
struct {
|
259
|
-
|
278
|
+
RELAX4_INT *i15;
|
260
279
|
} _1;
|
261
280
|
struct {
|
262
|
-
|
281
|
+
RELAX4_INT *extend_arc__;
|
263
282
|
} _2;
|
264
283
|
} blk15_;
|
265
284
|
|
@@ -268,10 +287,10 @@ union {
|
|
268
287
|
|
269
288
|
union {
|
270
289
|
struct {
|
271
|
-
|
290
|
+
RELAX4_INT *i16;
|
272
291
|
} _1;
|
273
292
|
struct {
|
274
|
-
|
293
|
+
RELAX4_INT *sb_level__;
|
275
294
|
} _2;
|
276
295
|
} blk16_;
|
277
296
|
|
@@ -280,10 +299,10 @@ union {
|
|
280
299
|
|
281
300
|
union {
|
282
301
|
struct {
|
283
|
-
|
302
|
+
RELAX4_INT *i17;
|
284
303
|
} _1;
|
285
304
|
struct {
|
286
|
-
|
305
|
+
RELAX4_INT *sb_arc__;
|
287
306
|
} _2;
|
288
307
|
} blk17_;
|
289
308
|
|
@@ -291,7 +310,7 @@ union {
|
|
291
310
|
#define blk17_2 (blk17_._2)
|
292
311
|
|
293
312
|
struct {
|
294
|
-
|
313
|
+
RELAX4_INT crash;
|
295
314
|
} cr_;
|
296
315
|
|
297
316
|
#define cr_1 cr_
|
@@ -299,10 +318,10 @@ struct {
|
|
299
318
|
/* Subroutine */ int inidat_(void)
|
300
319
|
{
|
301
320
|
/* System generated locals */
|
302
|
-
|
321
|
+
RELAX4_INT i__1;
|
303
322
|
|
304
323
|
/* Local variables */
|
305
|
-
static
|
324
|
+
static RELAX4_INT i__, i1, i2;
|
306
325
|
|
307
326
|
|
308
327
|
/* --------------------------------------------------------------- */
|
@@ -387,8 +406,8 @@ struct {
|
|
387
406
|
*/
|
388
407
|
int relax4_init_phase_1(void) {
|
389
408
|
|
390
|
-
|
391
|
-
|
409
|
+
RELAX4_INT i__1, i__2;
|
410
|
+
RELAX4_INT node, arc, node_def__, maxcap, scapou, scapin, capout, capin;
|
392
411
|
|
393
412
|
/* CONSTRUCT LINKED LISTS FOR THE PROBLEM */
|
394
413
|
inidat_();
|
@@ -478,8 +497,8 @@ L10:
|
|
478
497
|
/* ALSO COMPUTE THE DIRECTIONAL DERIVATIVES FOR EACH COORDINATE */
|
479
498
|
/* AND COMPUTE THE ACTUAL DEFICITS. */
|
480
499
|
int relax4_init_phase_2(void) {
|
481
|
-
|
482
|
-
|
500
|
+
RELAX4_INT i__1, i__2;
|
501
|
+
RELAX4_INT numpasses, node, arc, t, t1, t2, passes, delprc, trc, nxtbrk;
|
483
502
|
|
484
503
|
i__1 = input_1.na;
|
485
504
|
for (arc = 1; arc <= i__1; ++arc) {
|
@@ -808,31 +827,31 @@ L40:
|
|
808
827
|
/* Subroutine */ int relax4_(void)
|
809
828
|
{
|
810
829
|
/* System generated locals */
|
811
|
-
|
830
|
+
RELAX4_INT i__1, i__2, i__3;
|
812
831
|
|
813
832
|
/* Local variables */
|
814
|
-
static
|
833
|
+
static RELAX4_INT prevnode, i__, j, t1, t2, lastqueue,
|
815
834
|
numnz_new__, ib, nb, dp, dm, dx, tp, ts, num_passes__,
|
816
835
|
arc;
|
817
|
-
static
|
836
|
+
static RELAX4_INT narc, node, delx;
|
818
837
|
static logical1 quit;
|
819
|
-
static
|
820
|
-
static
|
821
|
-
static
|
838
|
+
static RELAX4_INT node2;
|
839
|
+
static RELAX4_INT indef;
|
840
|
+
static RELAX4_INT nscan;
|
822
841
|
static logical1 posit;
|
823
|
-
static
|
824
|
-
extern /* Subroutine */ int ascnt1_(
|
825
|
-
logical1 *, logical1 *,
|
826
|
-
|
827
|
-
,
|
842
|
+
static RELAX4_INT numnz;
|
843
|
+
extern /* Subroutine */ int ascnt1_(RELAX4_INT *, RELAX4_INT *, RELAX4_INT *,
|
844
|
+
logical1 *, logical1 *, RELAX4_INT *, RELAX4_INT *, RELAX4_INT *), ascnt2_(
|
845
|
+
RELAX4_INT *, RELAX4_INT *, RELAX4_INT *, logical1 *, logical1 *, RELAX4_INT *
|
846
|
+
, RELAX4_INT *, RELAX4_INT *);
|
828
847
|
static logical1 feasbl;
|
829
|
-
static
|
848
|
+
static RELAX4_INT nlabel, defcit, delprc, augnod, tmparc,
|
830
849
|
rdcost, nxtarc;
|
831
850
|
static logical1 switch__;
|
832
|
-
static
|
851
|
+
static RELAX4_INT prvarc;
|
833
852
|
static logical1 pchange;
|
834
|
-
static
|
835
|
-
static
|
853
|
+
static RELAX4_INT naugnod;
|
854
|
+
static RELAX4_INT nxtnode;
|
836
855
|
|
837
856
|
/* --------------------------------------------------------------- */
|
838
857
|
|
@@ -2147,12 +2166,10 @@ L4400:
|
|
2147
2166
|
/* Subroutine */ int auction_(void)
|
2148
2167
|
{
|
2149
2168
|
/* System generated locals */
|
2150
|
-
|
2151
|
-
|
2152
|
-
/* Subroutine */ int s_stop(char *, ftnlen);
|
2169
|
+
RELAX4_INT i__1;
|
2153
2170
|
|
2154
2171
|
/* Local variables */
|
2155
|
-
static
|
2172
|
+
static RELAX4_INT seclevel, red_cost__, bstlevel, prevnode, i__, new_level__,
|
2156
2173
|
prevlevel, lastqueue, num_passes__, arc, end, nas, prd, eps,
|
2157
2174
|
thresh_dfct__, node, pend, naug, incr, last, pass, term, flow,
|
2158
2175
|
root, resid, pterm, start, secarc, factor, extarc, rdcost, nolist,
|
@@ -2999,15 +3016,15 @@ L3000:
|
|
2999
3016
|
|
3000
3017
|
|
3001
3018
|
|
3002
|
-
/* Subroutine */ int ascnt1_(
|
3003
|
-
logical1 *feasbl, logical1 *switch__,
|
3004
|
-
curnode,
|
3019
|
+
/* Subroutine */ int ascnt1_(RELAX4_INT *dm, RELAX4_INT *delx, RELAX4_INT *nlabel,
|
3020
|
+
logical1 *feasbl, logical1 *switch__, RELAX4_INT *nscan, RELAX4_INT *
|
3021
|
+
curnode, RELAX4_INT *prevnode)
|
3005
3022
|
{
|
3006
3023
|
/* System generated locals */
|
3007
|
-
|
3024
|
+
RELAX4_INT i__1;
|
3008
3025
|
|
3009
3026
|
/* Local variables */
|
3010
|
-
static
|
3027
|
+
static RELAX4_INT i__, j, t1, t2, t3, nb, arc, dlx, node, node2, nsave,
|
3011
3028
|
delprc, rdcost;
|
3012
3029
|
|
3013
3030
|
|
@@ -3396,15 +3413,15 @@ L4:
|
|
3396
3413
|
|
3397
3414
|
|
3398
3415
|
|
3399
|
-
/* Subroutine */ int ascnt2_(
|
3400
|
-
logical1 *feasbl, logical1 *switch__,
|
3401
|
-
curnode,
|
3416
|
+
/* Subroutine */ int ascnt2_(RELAX4_INT *dm, RELAX4_INT *delx, RELAX4_INT *nlabel,
|
3417
|
+
logical1 *feasbl, logical1 *switch__, RELAX4_INT *nscan, RELAX4_INT *
|
3418
|
+
curnode, RELAX4_INT *prevnode)
|
3402
3419
|
{
|
3403
3420
|
/* System generated locals */
|
3404
|
-
|
3421
|
+
RELAX4_INT i__1;
|
3405
3422
|
|
3406
3423
|
/* Local variables */
|
3407
|
-
static
|
3424
|
+
static RELAX4_INT i__, j, t1, t2, t3, nb, arc, dlx, node, node2, nsave,
|
3408
3425
|
delprc, rdcost;
|
3409
3426
|
|
3410
3427
|
|
@@ -3693,9 +3710,9 @@ L4:
|
|
3693
3710
|
return 0;
|
3694
3711
|
} /* ascnt2_ */
|
3695
3712
|
|
3696
|
-
/* Subroutine */ int addtr_(
|
3713
|
+
/* Subroutine */ int addtr_(RELAX4_INT *arc)
|
3697
3714
|
{
|
3698
|
-
static
|
3715
|
+
static RELAX4_INT arc1, node;
|
3699
3716
|
|
3700
3717
|
|
3701
3718
|
/* --------------------------------------------------------------- */
|
@@ -3738,14 +3755,14 @@ L30:
|
|
3738
3755
|
return 0;
|
3739
3756
|
} /* addtr_ */
|
3740
3757
|
|
3741
|
-
int relax4_init(
|
3742
|
-
|
3743
|
-
|
3744
|
-
|
3745
|
-
|
3746
|
-
|
3747
|
-
|
3748
|
-
|
3758
|
+
int relax4_init(RELAX4_INT num_nodes, RELAX4_INT num_arcs,
|
3759
|
+
RELAX4_INT start_nodes[],
|
3760
|
+
RELAX4_INT end_nodes[],
|
3761
|
+
RELAX4_INT costs[],
|
3762
|
+
RELAX4_INT capacities[],
|
3763
|
+
RELAX4_INT demands[],
|
3764
|
+
RELAX4_INT flows[],
|
3765
|
+
RELAX4_INT large)
|
3749
3766
|
{
|
3750
3767
|
/* Set input/output pointers. */
|
3751
3768
|
input_1.n = num_nodes;
|
@@ -3781,24 +3798,24 @@ int relax4_init(integer num_nodes, integer num_arcs,
|
|
3781
3798
|
blk16_1.i16 = NULL;
|
3782
3799
|
blk17_1.i17 = NULL;
|
3783
3800
|
|
3784
|
-
arrayrc_1.rc = malloc(num_arcs*sizeof(
|
3785
|
-
blk1_1.i1 = malloc(num_nodes*sizeof(
|
3786
|
-
blk2_1.i2 = malloc(num_nodes*sizeof(
|
3787
|
-
blk3_1.i3 = malloc(num_nodes*sizeof(
|
3788
|
-
blk4_1.i4 = malloc(num_arcs*sizeof(
|
3789
|
-
blk5_1.i5 = malloc(num_nodes*sizeof(
|
3790
|
-
blk6_1.i6 = malloc(num_arcs*sizeof(
|
3791
|
-
blk7_1.i7 = malloc(num_arcs*sizeof(
|
3801
|
+
arrayrc_1.rc = malloc(num_arcs*sizeof(RELAX4_INT));
|
3802
|
+
blk1_1.i1 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3803
|
+
blk2_1.i2 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3804
|
+
blk3_1.i3 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3805
|
+
blk4_1.i4 = malloc(num_arcs*sizeof(RELAX4_INT));
|
3806
|
+
blk5_1.i5 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3807
|
+
blk6_1.i6 = malloc(num_arcs*sizeof(RELAX4_INT));
|
3808
|
+
blk7_1.i7 = malloc(num_arcs*sizeof(RELAX4_INT));
|
3792
3809
|
blk8_1.scan = malloc(num_nodes*sizeof(logical1));
|
3793
3810
|
blk9_1.mark = malloc(num_nodes*sizeof(logical1));
|
3794
|
-
blk10_1.tfstou = malloc(num_nodes*sizeof(
|
3795
|
-
blk11_1.tnxtou = malloc(num_arcs*sizeof(
|
3796
|
-
blk12_1.tfstin = malloc(num_nodes*sizeof(
|
3797
|
-
blk13_1.tnxtin = malloc(num_arcs*sizeof(
|
3798
|
-
blk14_1.i14 = malloc(num_nodes*sizeof(
|
3799
|
-
blk15_1.i15 = malloc(num_nodes*sizeof(
|
3800
|
-
blk16_1.i16 = malloc(num_nodes*sizeof(
|
3801
|
-
blk17_1.i17 = malloc(num_nodes*sizeof(
|
3811
|
+
blk10_1.tfstou = malloc(num_nodes*sizeof(RELAX4_INT));
|
3812
|
+
blk11_1.tnxtou = malloc(num_arcs*sizeof(RELAX4_INT));
|
3813
|
+
blk12_1.tfstin = malloc(num_nodes*sizeof(RELAX4_INT));
|
3814
|
+
blk13_1.tnxtin = malloc(num_arcs*sizeof(RELAX4_INT));
|
3815
|
+
blk14_1.i14 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3816
|
+
blk15_1.i15 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3817
|
+
blk16_1.i16 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3818
|
+
blk17_1.i17 = malloc(num_nodes*sizeof(RELAX4_INT));
|
3802
3819
|
|
3803
3820
|
if (arrayrc_1.rc == NULL ||
|
3804
3821
|
blk1_1.i1 == NULL ||
|
@@ -3827,7 +3844,7 @@ int relax4_init(integer num_nodes, integer num_arcs,
|
|
3827
3844
|
|
3828
3845
|
int relax4_check_inputs(int max_cost)
|
3829
3846
|
{
|
3830
|
-
|
3847
|
+
RELAX4_INT i;
|
3831
3848
|
|
3832
3849
|
if (input_1.n < 1 || input_1.na < 1) {
|
3833
3850
|
return RELAX4_FAIL_BAD_SIZE;
|
@@ -3891,7 +3908,7 @@ int relax4_run()
|
|
3891
3908
|
|
3892
3909
|
int relax4_check_output()
|
3893
3910
|
{
|
3894
|
-
|
3911
|
+
RELAX4_INT i;
|
3895
3912
|
|
3896
3913
|
for (i = 1; i <= input_1.n; ++i) {
|
3897
3914
|
if (arrayb_1.b[i - 1] != 0)
|
data/ext/relax4.h
CHANGED
@@ -12,6 +12,11 @@
|
|
12
12
|
#define RELAX4_OUTPUT_FAIL_NONZERO_DEMAND 101
|
13
13
|
#define RELAX4_OUTPUT_FAIL_COMPLEMENTARY_SLACKNESS 102
|
14
14
|
|
15
|
+
/* Just use int by default; must have at least 32 bits. */
|
16
|
+
#ifndef RELAX4_INT
|
17
|
+
#define RELAX4_INT int
|
18
|
+
#endif
|
19
|
+
|
15
20
|
/**
|
16
21
|
* The default value used for the <tt>large</tt> parameter. It is set to 500
|
17
22
|
* million, which is the value in the original relax4 source.
|
@@ -39,6 +44,17 @@
|
|
39
44
|
*/
|
40
45
|
#define RELAX4_DEFAULT_MAX_COST (RELAX4_DEFAULT_LARGE/10)
|
41
46
|
|
47
|
+
/**
|
48
|
+
* Suggested capacity to use for arcs in uncapacitated problems.
|
49
|
+
*
|
50
|
+
* The guidance in the original relax4 source was that LARGE should be used, but
|
51
|
+
* this has been known to cause overflow problems. Moreover, when relax4 read
|
52
|
+
* its input, it only read the first eight digits of each number, so it read
|
53
|
+
* 500 million (nine decimal digits) as 50 million; so, this is a reasonable
|
54
|
+
* value to use, if you don't have a tighter upper bound.
|
55
|
+
*/
|
56
|
+
#define RELAX4_UNCAPACITATED (RELAX4_DEFAULT_LARGE/10)
|
57
|
+
|
42
58
|
/**
|
43
59
|
* Set global state and allocate memory for internal arrays.
|
44
60
|
*
|
@@ -72,8 +88,8 @@
|
|
72
88
|
* RELAX4_DEFAULT_MAX_COST).
|
73
89
|
*
|
74
90
|
* @param[in] capacities capacity for each arc; for an uncapacitated problem,
|
75
|
-
* set these to a suitably large value (such as
|
76
|
-
* must be in [0, <tt>large</tt>].
|
91
|
+
* set these to a suitably large value (such as +RELAX4_UNCAPACITATED+);
|
92
|
+
* capacities must be in [0, <tt>large</tt>].
|
77
93
|
*
|
78
94
|
* @param[in] demands demand for each node; a node with negative demand is a
|
79
95
|
* surplus node; demands should balance (sum to zero), or else the problem will
|
@@ -88,14 +104,14 @@
|
|
88
104
|
* @return RELAX4_OK if allocations succeeded, or RELAX4_FAIL_OUT_OF_MEMORY if
|
89
105
|
* any failed.
|
90
106
|
*/
|
91
|
-
int relax4_init(
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
107
|
+
int relax4_init(RELAX4_INT num_nodes, RELAX4_INT num_arcs,
|
108
|
+
RELAX4_INT start_nodes[],
|
109
|
+
RELAX4_INT end_nodes[],
|
110
|
+
RELAX4_INT costs[],
|
111
|
+
RELAX4_INT capacities[],
|
112
|
+
RELAX4_INT demands[],
|
113
|
+
RELAX4_INT flows[],
|
114
|
+
RELAX4_INT large);
|
99
115
|
|
100
116
|
/**
|
101
117
|
* Basic checks on the parameters given to relax4_init.
|