relax4 1.0.1 → 1.0.2
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 +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.
|