Mercurial > octave
annotate libinterp/dldfcn/__glpk__.cc @ 20939:b17fda023ca6
maint: Use new C++ archetype in more files.
Place input validation first in files.
Move declaration of retval down in function to be closer to point of usage.
Eliminate else clause after if () error.
Use "return ovl()" where it makes sense.
* find.cc, gammainc.cc, gcd.cc, getgrent.cc, getpwent.cc, givens.cc,
graphics.cc, help.cc, hess.cc, hex2num.cc, input.cc, kron.cc, load-path.cc,
load-save.cc, lookup.cc, mappers.cc, matrix_type.cc, mgorth.cc, nproc.cc,
ordschur.cc, pager.cc, pinv.cc, pr-output.cc, profiler.cc, psi.cc, quad.cc,
rcond.cc, regexp.cc, schur.cc, sighandlers.cc, sparse.cc, str2double.cc,
strfind.cc, strfns.cc, sub2ind.cc, svd.cc, sylvester.cc, symtab.cc,
syscalls.cc, sysdep.cc, time.cc, toplev.cc, tril.cc, tsearch.cc, typecast.cc,
urlwrite.cc, utils.cc, variables.cc, __delaunayn__.cc, __eigs__.cc,
__glpk__.cc, __magick_read__.cc, __osmesa_print__.cc, __voronoi__.cc, amd.cc,
audiodevinfo.cc, audioread.cc, chol.cc, colamd.cc, dmperm.cc, fftw.cc, qr.cc,
symbfact.cc, symrcm.cc, ov-bool-mat.cc, ov-cell.cc, ov-class.cc,
ov-classdef.cc, ov-fcn-handle.cc, ov-fcn-inline.cc, ov-flt-re-mat.cc,
ov-java.cc, ov-null-mat.cc, ov-oncleanup.cc, ov-re-mat.cc, ov-struct.cc,
ov-typeinfo.cc, ov-usr-fcn.cc, ov.cc, octave.cc:
Use new C++ archetype in more files.
author | Rik <rik@octave.org> |
---|---|
date | Fri, 18 Dec 2015 15:37:22 -0800 |
parents | baa3b9f0e9d4 |
children | 48b2ad5ee801 |
rev | line source |
---|---|
5234 | 1 /* |
2 | |
19697
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
3 Copyright (C) 2005-2015 Nicolo' Giorgetti |
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
4 Copyright (C) 2013-2015 Sébastien Villemot <sebastien@debian.org> |
5234 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
5234 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
5234 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
5232 | 27 |
28 #include <cfloat> | |
29 #include <csetjmp> | |
30 #include <ctime> | |
31 | |
9003
0631d397fbe0
replace lo_ieee_isnan by xisnan, add missing includes
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
32 #include "lo-ieee.h" |
0631d397fbe0
replace lo_ieee_isnan by xisnan, add missing includes
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
33 |
5234 | 34 #include "defun-dld.h" |
35 #include "error.h" | |
5235 | 36 #include "gripes.h" |
37 #include "oct-map.h" | |
5234 | 38 #include "oct-obj.h" |
5235 | 39 #include "pager.h" |
40 | |
41 #if defined (HAVE_GLPK) | |
5232 | 42 |
6333 | 43 extern "C" |
44 { | |
6804 | 45 #if defined (HAVE_GLPK_GLPK_H) |
46 #include <glpk/glpk.h> | |
47 #else | |
5234 | 48 #include <glpk.h> |
6804 | 49 #endif |
6472 | 50 } |
6333 | 51 |
17181
4e9ff411d0fa
Remove minor stylistic C'ism
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
17180
diff
changeset
|
52 struct control_params |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
53 { |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
54 int msglev; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
55 int dual; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
56 int price; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
57 int itlim; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
58 int outfrq; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
59 int branch; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
60 int btrack; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
61 int presol; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
62 int rtest; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
63 int tmlim; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
64 int outdly; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
65 double tolbnd; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
66 double toldj; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
67 double tolpiv; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
68 double objll; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
69 double objul; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
70 double tolint; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
71 double tolobj; |
17181
4e9ff411d0fa
Remove minor stylistic C'ism
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
17180
diff
changeset
|
72 }; |
5232 | 73 |
5241 | 74 static jmp_buf mark; //-- Address for long jump to jump to |
5232 | 75 |
5234 | 76 int |
77 glpk (int sense, int n, int m, double *c, int nz, int *rn, int *cn, | |
78 double *a, double *b, char *ctype, int *freeLB, double *lb, | |
79 int *freeUB, double *ub, int *vartype, int isMIP, int lpsolver, | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
80 int save_pb, int scale, const control_params *par, |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
81 double *xmin, double *fmin, int *status, |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
82 double *lambda, double *redcosts, double *time) |
5232 | 83 { |
5234 | 84 int typx = 0; |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
85 int errnum = 0; |
5234 | 86 |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14501
diff
changeset
|
87 clock_t t_start = clock (); |
5234 | 88 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
89 glp_prob *lp = glp_create_prob (); |
5232 | 90 |
5234 | 91 //-- Set the sense of optimization |
92 if (sense == 1) | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
93 glp_set_obj_dir (lp, GLP_MIN); |
5234 | 94 else |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
95 glp_set_obj_dir (lp, GLP_MAX); |
5234 | 96 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
97 glp_add_cols (lp, n); |
5234 | 98 for (int i = 0; i < n; i++) |
99 { | |
5232 | 100 //-- Define type of the structural variables |
5234 | 101 if (! freeLB[i] && ! freeUB[i]) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
102 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
103 if (lb[i] != ub[i]) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
104 glp_set_col_bnds (lp, i+1, GLP_DB, lb[i], ub[i]); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
105 else |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
106 glp_set_col_bnds (lp, i+1, GLP_FX, lb[i], ub[i]); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
107 } |
5234 | 108 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
109 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
110 if (! freeLB[i] && freeUB[i]) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
111 glp_set_col_bnds (lp, i+1, GLP_LO, lb[i], ub[i]); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
112 else |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
113 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
114 if (freeLB[i] && ! freeUB[i]) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
115 glp_set_col_bnds (lp, i+1, GLP_UP, lb[i], ub[i]); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
116 else |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
117 glp_set_col_bnds (lp, i+1, GLP_FR, lb[i], ub[i]); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
118 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
119 } |
5234 | 120 |
121 // -- Set the objective coefficient of the corresponding | |
5232 | 122 // -- structural variable. No constant term is assumed. |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
123 glp_set_obj_coef(lp,i+1,c[i]); |
5232 | 124 |
5234 | 125 if (isMIP) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
126 glp_set_col_kind (lp, i+1, vartype[i]); |
5234 | 127 } |
128 | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
129 glp_add_rows (lp, m); |
5234 | 130 |
131 for (int i = 0; i < m; i++) | |
132 { | |
5232 | 133 /* If the i-th row has no lower bound (types F,U), the |
134 corrispondent parameter will be ignored. | |
135 If the i-th row has no upper bound (types F,L), the corrispondent | |
136 parameter will be ignored. | |
137 If the i-th row is of S type, the i-th LB is used, but | |
138 the i-th UB is ignored. | |
139 */ | |
5234 | 140 |
141 switch (ctype[i]) | |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
142 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
143 case 'F': |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
144 typx = GLP_FR; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
145 break; |
5234 | 146 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
147 case 'U': |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
148 typx = GLP_UP; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
149 break; |
5234 | 150 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
151 case 'L': |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
152 typx = GLP_LO; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
153 break; |
5232 | 154 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
155 case 'S': |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
156 typx = GLP_FX; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
157 break; |
5232 | 158 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
159 case 'D': |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
160 typx = GLP_DB; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
161 break; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
162 } |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
163 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
164 glp_set_row_bnds (lp, i+1, typx, b[i], b[i]); |
5234 | 165 |
166 } | |
167 | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
168 glp_load_matrix (lp, nz, rn, cn, a); |
5232 | 169 |
5234 | 170 if (save_pb) |
171 { | |
6484 | 172 static char tmp[] = "outpb.lp"; |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
173 if (glp_write_lp (lp, NULL, tmp) != 0) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
174 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
175 error ("__glpk__: unable to write problem"); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
176 longjmp (mark, -1); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
177 } |
5234 | 178 } |
179 | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
180 //-- scale the problem data |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
181 if (!par->presol || lpsolver != 1) |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
182 glp_scale_prob (lp, scale); |
5234 | 183 |
184 //-- build advanced initial basis (if required) | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
185 if (lpsolver == 1 && !par->presol) |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
186 glp_adv_basis (lp, 0); |
5232 | 187 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
188 /* For MIP problems without a presolver, a first pass with glp_simplex |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
189 is required */ |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
190 if ((!isMIP && lpsolver == 1) |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
191 || (isMIP && !par->presol)) |
5234 | 192 { |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
193 glp_smcp smcp; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
194 glp_init_smcp (&smcp); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
195 smcp.msg_lev = par->msglev; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
196 smcp.meth = par->dual; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
197 smcp.pricing = par->price; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
198 smcp.r_test = par->rtest; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
199 smcp.tol_bnd = par->tolbnd; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
200 smcp.tol_dj = par->toldj; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
201 smcp.tol_piv = par->tolpiv; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
202 smcp.obj_ll = par->objll; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
203 smcp.obj_ul = par->objul; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
204 smcp.it_lim = par->itlim; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
205 smcp.tm_lim = par->tmlim; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
206 smcp.out_frq = par->outfrq; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
207 smcp.out_dly = par->outdly; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
208 smcp.presolve = par->presol; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
209 errnum = glp_simplex (lp, &smcp); |
5234 | 210 } |
211 | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
212 if (isMIP) |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
213 { |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
214 glp_iocp iocp; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
215 glp_init_iocp (&iocp); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
216 iocp.msg_lev = par->msglev; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
217 iocp.br_tech = par->branch; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
218 iocp.bt_tech = par->btrack; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
219 iocp.tol_int = par->tolint; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
220 iocp.tol_obj = par->tolobj; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
221 iocp.tm_lim = par->tmlim; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
222 iocp.out_frq = par->outfrq; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
223 iocp.out_dly = par->outdly; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
224 iocp.presolve = par->presol; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
225 errnum = glp_intopt (lp, &iocp); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
226 } |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
227 |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
228 if (!isMIP && lpsolver == 2) |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
229 { |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
230 glp_iptcp iptcp; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
231 glp_init_iptcp (&iptcp); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
232 iptcp.msg_lev = par->msglev; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
233 errnum = glp_interior (lp, &iptcp); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
234 } |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
235 |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
236 if (errnum == 0) |
5234 | 237 { |
238 if (isMIP) | |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
239 { |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
240 *status = glp_mip_status (lp); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
241 *fmin = glp_mip_obj_val (lp); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
242 } |
5234 | 243 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
244 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
245 if (lpsolver == 1) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
246 { |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
247 *status = glp_get_status (lp); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
248 *fmin = glp_get_obj_val (lp); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
249 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
250 else |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
251 { |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
252 *status = glp_ipt_status (lp); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
253 *fmin = glp_ipt_obj_val (lp); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
254 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
255 } |
5232 | 256 |
5234 | 257 if (isMIP) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
258 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
259 for (int i = 0; i < n; i++) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
260 xmin[i] = glp_mip_col_val (lp, i+1); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
261 } |
5234 | 262 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
263 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
264 /* Primal values */ |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
265 for (int i = 0; i < n; i++) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
266 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
267 if (lpsolver == 1) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
268 xmin[i] = glp_get_col_prim (lp, i+1); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
269 else |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
270 xmin[i] = glp_ipt_col_prim (lp, i+1); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
271 } |
5232 | 272 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
273 /* Dual values */ |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
274 for (int i = 0; i < m; i++) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
275 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
276 if (lpsolver == 1) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
277 lambda[i] = glp_get_row_dual (lp, i+1); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
278 else |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
279 lambda[i] = glp_ipt_row_dual (lp, i+1); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
280 } |
5234 | 281 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
282 /* Reduced costs */ |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
283 for (int i = 0; i < glp_get_num_cols (lp); i++) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
284 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
285 if (lpsolver == 1) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
286 redcosts[i] = glp_get_col_dual (lp, i+1); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
287 else |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
288 redcosts[i] = glp_ipt_col_dual (lp, i+1); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
289 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
290 } |
5234 | 291 |
5241 | 292 *time = (clock () - t_start) / CLOCKS_PER_SEC; |
5234 | 293 } |
294 | |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
295 glp_delete_prob (lp); |
5234 | 296 |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
297 return errnum; |
5232 | 298 } |
299 | |
5235 | 300 #endif |
301 | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
302 #define OCTAVE_GLPK_GET_REAL_PARAM(NAME, VAL) \ |
5240 | 303 do \ |
304 { \ | |
11053
c33b7054f1f9
in recent Octave_map -> octave_scalar_map changes, use GETFIELD to access map elements, not CONTENTS
John W. Eaton <jwe@octave.org>
parents:
11048
diff
changeset
|
305 octave_value tmp = PARAM.getfield (NAME); \ |
11047
52609f73c7d9
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
10527
diff
changeset
|
306 \ |
52609f73c7d9
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
10527
diff
changeset
|
307 if (tmp.is_defined ()) \ |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
308 { \ |
5240 | 309 if (! tmp.is_empty ()) \ |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
310 VAL = tmp.xscalar_value ("glpk: invalid value in PARAM" NAME); \ |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
311 else \ |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
312 error ("glpk: invalid value in PARAM" NAME); \ |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
313 } \ |
5240 | 314 } \ |
315 while (0) | |
316 | |
317 #define OCTAVE_GLPK_GET_INT_PARAM(NAME, VAL) \ | |
318 do \ | |
319 { \ | |
11053
c33b7054f1f9
in recent Octave_map -> octave_scalar_map changes, use GETFIELD to access map elements, not CONTENTS
John W. Eaton <jwe@octave.org>
parents:
11048
diff
changeset
|
320 octave_value tmp = PARAM.getfield (NAME); \ |
11047
52609f73c7d9
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
10527
diff
changeset
|
321 \ |
52609f73c7d9
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
10527
diff
changeset
|
322 if (tmp.is_defined ()) \ |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
323 { \ |
5240 | 324 if (! tmp.is_empty ()) \ |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
325 VAL = tmp.xint_value ("glpk: invalid value in PARAM" NAME); \ |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
326 else \ |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
327 error ("glpk: invalid value in PARAM" NAME); \ |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
328 } \ |
5240 | 329 } \ |
330 while (0) | |
331 | |
5235 | 332 DEFUN_DLD (__glpk__, args, , |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
333 "-*- texinfo -*-\n\ |
20853
1142cf6abc0d
2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents:
20825
diff
changeset
|
334 @deftypefn {} {[@var{values}] =} __glpk__ (@var{args})\n\ |
6945 | 335 Undocumented internal function.\n\ |
5245 | 336 @end deftypefn") |
5232 | 337 { |
5235 | 338 #if defined (HAVE_GLPK) |
339 | |
20812
d9ca869ca124
maint: Clean-up more instances of print_usage().
Rik <rik@octave.org>
parents:
20790
diff
changeset
|
340 // FIXME: Should we even need checking for an internal function? |
20818
cef0448a6ed2
eliminate unnecessary uses of nargin
John W. Eaton <jwe@octave.org>
parents:
20812
diff
changeset
|
341 if (args.length () != 9) |
20790
c2d9556d51d0
eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents:
20704
diff
changeset
|
342 print_usage (); |
5234 | 343 |
20939
b17fda023ca6
maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents:
20867
diff
changeset
|
344 // 1nd Input. A column array containing the objective function coefficients. |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14501
diff
changeset
|
345 volatile int mrowsc = args(0).rows (); |
5234 | 346 |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
347 Matrix C = args(0).xmatrix_value ("__glpk__: invalid value of C"); |
5240 | 348 |
5234 | 349 double *c = C.fortran_vec (); |
5455 | 350 Array<int> rn; |
351 Array<int> cn; | |
352 ColumnVector a; | |
5515 | 353 volatile int mrowsA; |
5455 | 354 volatile int nz = 0; |
5232 | 355 |
20939
b17fda023ca6
maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents:
20867
diff
changeset
|
356 // 2nd Input. A matrix containing the constraints coefficients. |
5234 | 357 // If matrix A is NOT a sparse matrix |
5631 | 358 if (args(1).is_sparse_type ()) |
5455 | 359 { |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
360 SparseMatrix A = args(1).xsparse_matrix_value ("__glpk__: invalid value of A"); |
5234 | 361 |
5455 | 362 mrowsA = A.rows (); |
363 octave_idx_type Anc = A.cols (); | |
10527
b4d2080b6df7
Replace nzmax by nnz as needed
David Bateman <dbateman@free.fr>
parents:
10350
diff
changeset
|
364 octave_idx_type Anz = A.nnz (); |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
365 rn.resize (dim_vector (Anz+1, 1)); |
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
366 cn.resize (dim_vector (Anz+1, 1)); |
5455 | 367 a.resize (Anz+1, 0.0); |
368 | |
369 if (Anc != mrowsc) | |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
370 error ("__glpk__: invalid value of A"); |
5455 | 371 |
372 for (octave_idx_type j = 0; j < Anc; j++) | |
14854
5ae9f0f77635
maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
373 for (octave_idx_type i = A.cidx (j); i < A.cidx (j+1); i++) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
374 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
375 nz++; |
14854
5ae9f0f77635
maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
376 rn(nz) = A.ridx (i) + 1; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
377 cn(nz) = j + 1; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
378 a(nz) = A.data(i); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
379 } |
5455 | 380 } |
5631 | 381 else |
382 { | |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
383 Matrix A = args(1).xmatrix_value ("__glpk__: invalid value of A"); |
5631 | 384 |
385 mrowsA = A.rows (); | |
11574
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
386 rn.resize (dim_vector (mrowsA*mrowsc+1, 1)); |
a83bad07f7e3
attempt better backward compatibility for Array resize functions
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
387 cn.resize (dim_vector (mrowsA*mrowsc+1, 1)); |
5631 | 388 a.resize (mrowsA*mrowsc+1, 0.0); |
389 | |
390 for (int i = 0; i < mrowsA; i++) | |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
391 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
392 for (int j = 0; j < mrowsc; j++) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
393 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
394 if (A(i,j) != 0) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
395 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
396 nz++; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
397 rn(nz) = i + 1; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
398 cn(nz) = j + 1; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
399 a(nz) = A(i,j); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
400 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
401 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
402 } |
5631 | 403 |
404 } | |
5232 | 405 |
5237 | 406 //-- 3rd Input. A column array containing the right-hand side value |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
407 // for each constraint in the constraint matrix. |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
408 Matrix B = args(2).xmatrix_value ("__glpk__: invalid value of B"); |
5240 | 409 |
5234 | 410 double *b = B.fortran_vec (); |
411 | |
5237 | 412 //-- 4th Input. An array of length mrowsc containing the lower |
5234 | 413 //-- bound on each of the variables. |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
414 Matrix LB = args(3).xmatrix_value ("__glpk__: invalid value of LB"); |
5240 | 415 |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
416 if (LB.numel () < mrowsc) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
417 error ("__glpk__: invalid dimensions for LB"); |
5240 | 418 |
5234 | 419 double *lb = LB.fortran_vec (); |
420 | |
421 //-- LB argument, default: Free | |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
422 Array<int> freeLB (dim_vector (mrowsc, 1)); |
5234 | 423 for (int i = 0; i < mrowsc; i++) |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
424 { |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
425 if (xisinf (lb[i])) |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
426 { |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
427 freeLB(i) = 1; |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
428 lb[i] = -octave_Inf; |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
429 } |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
430 else |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
431 freeLB(i) = 0; |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
432 } |
5234 | 433 |
5237 | 434 //-- 5th Input. An array of at least length numcols containing the upper |
5234 | 435 //-- bound on each of the variables. |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
436 Matrix UB = args(4).xmatrix_value ("__glpk__: invalid value of UB"); |
5234 | 437 |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
438 if (UB.numel () < mrowsc) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
439 error ("__glpk__: invalid dimensions for UB"); |
5240 | 440 |
5234 | 441 double *ub = UB.fortran_vec (); |
5232 | 442 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
443 Array<int> freeUB (dim_vector (mrowsc, 1)); |
5234 | 444 for (int i = 0; i < mrowsc; i++) |
445 { | |
5455 | 446 if (xisinf (ub[i])) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
447 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
448 freeUB(i) = 1; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
449 ub[i] = octave_Inf; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
450 } |
5234 | 451 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
452 freeUB(i) = 0; |
5234 | 453 } |
454 | |
5237 | 455 //-- 6th Input. A column array containing the sense of each constraint |
456 //-- in the constraint matrix. | |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
457 charMatrix CTYPE = args(5).char_matrix_value ("__glpk__: invalid value of CTYPE"); |
5240 | 458 |
5237 | 459 char *ctype = CTYPE.fortran_vec (); |
460 | |
461 //-- 7th Input. A column array containing the types of the variables. | |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
462 charMatrix VTYPE = args(6).char_matrix_value ("__glpk__: invalid value of VARTYPE"); |
5240 | 463 |
11570
57632dea2446
attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
464 Array<int> vartype (dim_vector (mrowsc, 1)); |
5235 | 465 volatile int isMIP = 0; |
5234 | 466 for (int i = 0; i < mrowsc ; i++) |
467 { | |
468 if (VTYPE(i,0) == 'I') | |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
469 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
470 isMIP = 1; |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
471 vartype(i) = GLP_IV; |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
472 } |
5234 | 473 else |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
474 vartype(i) = GLP_CV; |
5234 | 475 } |
476 | |
5237 | 477 //-- 8th Input. Sense of optimization. |
478 volatile int sense; | |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
479 double SENSE = args(7).scalar_value ("__glpk__: invalid value of SENSE"); |
5240 | 480 |
5237 | 481 if (SENSE >= 0) |
482 sense = 1; | |
483 else | |
484 sense = -1; | |
485 | |
5234 | 486 //-- 9th Input. A structure containing the control parameters. |
20704
571508c1ed06
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
487 octave_scalar_map PARAM = args(8).xscalar_map_value ("__glpk__: invalid value of PARAM"); |
5240 | 488 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
489 control_params par; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
490 |
5234 | 491 //-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
492 //-- Integer parameters | |
493 //-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
494 | |
495 //-- Level of messages output by the solver | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
496 par.msglev = 1; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
497 OCTAVE_GLPK_GET_INT_PARAM ("msglev", par.msglev); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
498 if (par.msglev < 0 || par.msglev > 3) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
499 error ("__glpk__: PARAM.msglev must be 0 (no output) or 1 (error and warning messages only [default]) or 2 (normal output) or 3 (full output)"); |
5232 | 500 |
5234 | 501 //-- scaling option |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
502 volatile int scale = 16; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
503 OCTAVE_GLPK_GET_INT_PARAM ("scale", scale); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
504 if (scale < 0 || scale > 128) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
505 error ("__glpk__: PARAM.scale must either be 128 (automatic selection of scaling options), or a bitwise or of: 1 (geometric mean scaling), 16 (equilibration scaling), 32 (round scale factors to power of two), 64 (skip if problem is well scaled"); |
5232 | 506 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
507 //-- Dual simplex option |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
508 par.dual = 1; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
509 OCTAVE_GLPK_GET_INT_PARAM ("dual", par.dual); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
510 if (par.dual < 1 || par.dual > 3) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
511 error ("__glpk__: PARAM.dual must be 1 (use two-phase primal simplex [default]) or 2 (use two-phase dual simplex) or 3 (use two-phase dual simplex, and if it fails, switch to the primal simplex)"); |
5232 | 512 |
5234 | 513 //-- Pricing option |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
514 par.price = 34; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
515 OCTAVE_GLPK_GET_INT_PARAM ("price", par.price); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
516 if (par.price != 17 && par.price != 34) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
517 error ("__glpk__: PARAM.price must be 17 (textbook pricing) or 34 (steepest edge pricing [default])"); |
5234 | 518 |
519 //-- Simplex iterations limit | |
17195
2899d110c178
Use std::numeric_limits instead of INT_MAX in __glpk__ (bug #39715).
Rik <rik@octave.org>
parents:
17181
diff
changeset
|
520 par.itlim = std::numeric_limits<int>::max (); |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
521 OCTAVE_GLPK_GET_INT_PARAM ("itlim", par.itlim); |
5234 | 522 |
523 //-- Output frequency, in iterations | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
524 par.outfrq = 200; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
525 OCTAVE_GLPK_GET_INT_PARAM ("outfrq", par.outfrq); |
5234 | 526 |
527 //-- Branching heuristic option | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
528 par.branch = 4; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
529 OCTAVE_GLPK_GET_INT_PARAM ("branch", par.branch); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
530 if (par.branch < 1 || par.branch > 5) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
531 error ("__glpk__: PARAM.branch must be 1 (first fractional variable) or 2 (last fractional variable) or 3 (most fractional variable) or 4 (heuristic by Driebeck and Tomlin [default]) or 5 (hybrid pseudocost heuristic)"); |
5232 | 532 |
5234 | 533 //-- Backtracking heuristic option |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
534 par.btrack = 4; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
535 OCTAVE_GLPK_GET_INT_PARAM ("btrack", par.btrack); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
536 if (par.btrack < 1 || par.btrack > 4) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
537 error ("__glpk__: PARAM.btrack must be 1 (depth first search) or 2 (breadth first search) or 3 (best local bound) or 4 (best projection heuristic [default]"); |
5232 | 538 |
5234 | 539 //-- Presolver option |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
540 par.presol = 1; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
541 OCTAVE_GLPK_GET_INT_PARAM ("presol", par.presol); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
542 if (par.presol < 0 || par.presol > 1) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
543 error ("__glpk__: PARAM.presol must be 0 (do NOT use LP presolver) or 1 (use LP presolver [default])"); |
5234 | 544 |
5237 | 545 //-- LPsolver option |
546 volatile int lpsolver = 1; | |
5240 | 547 OCTAVE_GLPK_GET_INT_PARAM ("lpsolver", lpsolver); |
548 if (lpsolver < 1 || lpsolver > 2) | |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
549 error ("__glpk__: PARAM.lpsolver must be 1 (simplex method) or 2 (interior point method)"); |
5237 | 550 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
551 //-- Ratio test option |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
552 par.rtest = 34; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
553 OCTAVE_GLPK_GET_INT_PARAM ("rtest", par.rtest); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
554 if (par.rtest != 17 && par.rtest != 34) |
20825
66cd994d1b79
eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents:
20818
diff
changeset
|
555 error ("__glpk__: PARAM.rtest must be 17 (standard ratio test) or 34 (Harris' two-pass ratio test [default])"); |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
556 |
17195
2899d110c178
Use std::numeric_limits instead of INT_MAX in __glpk__ (bug #39715).
Rik <rik@octave.org>
parents:
17181
diff
changeset
|
557 par.tmlim = std::numeric_limits<int>::max (); |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
558 OCTAVE_GLPK_GET_INT_PARAM ("tmlim", par.tmlim); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
559 |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
560 par.outdly = 0; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
561 OCTAVE_GLPK_GET_INT_PARAM ("outdly", par.outdly); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
562 |
5237 | 563 //-- Save option |
564 volatile int save_pb = 0; | |
5240 | 565 OCTAVE_GLPK_GET_INT_PARAM ("save", save_pb); |
566 save_pb = save_pb != 0; | |
5237 | 567 |
5234 | 568 //-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
569 //-- Real parameters | |
570 //-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
571 | |
572 //-- Relative tolerance used to check if the current basic solution | |
573 //-- is primal feasible | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
574 par.tolbnd = 1e-7; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
575 OCTAVE_GLPK_GET_REAL_PARAM ("tolbnd", par.tolbnd); |
5234 | 576 |
577 //-- Absolute tolerance used to check if the current basic solution | |
578 //-- is dual feasible | |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
579 par.toldj = 1e-7; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
580 OCTAVE_GLPK_GET_REAL_PARAM ("toldj", par.toldj); |
5232 | 581 |
5234 | 582 //-- Relative tolerance used to choose eligible pivotal elements of |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9003
diff
changeset
|
583 //-- the simplex table in the ratio test |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
584 par.tolpiv = 1e-10; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
585 OCTAVE_GLPK_GET_REAL_PARAM ("tolpiv", par.tolpiv); |
5234 | 586 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
587 par.objll = -std::numeric_limits<double>::max (); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
588 OCTAVE_GLPK_GET_REAL_PARAM ("objll", par.objll); |
5232 | 589 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
590 par.objul = std::numeric_limits<double>::max (); |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
591 OCTAVE_GLPK_GET_REAL_PARAM ("objul", par.objul); |
5234 | 592 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
593 par.tolint = 1e-5; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
594 OCTAVE_GLPK_GET_REAL_PARAM ("tolint", par.tolint); |
5234 | 595 |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
596 par.tolobj = 1e-7; |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
597 OCTAVE_GLPK_GET_REAL_PARAM ("tolobj", par.tolobj); |
5234 | 598 |
599 //-- Assign pointers to the output parameters | |
8068
e3e3d12364b0
make glpk return NA values for unfeasible problems
Jaroslav Hajek <highegg@gmail.com>
parents:
8036
diff
changeset
|
600 ColumnVector xmin (mrowsc, octave_NA); |
11048
10c65e01f042
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
11047
diff
changeset
|
601 double fmin = octave_NA; |
8068
e3e3d12364b0
make glpk return NA values for unfeasible problems
Jaroslav Hajek <highegg@gmail.com>
parents:
8036
diff
changeset
|
602 ColumnVector lambda (mrowsA, octave_NA); |
e3e3d12364b0
make glpk return NA values for unfeasible problems
Jaroslav Hajek <highegg@gmail.com>
parents:
8036
diff
changeset
|
603 ColumnVector redcosts (mrowsc, octave_NA); |
11048
10c65e01f042
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
11047
diff
changeset
|
604 double time; |
19779
166051951878
avoid warning from GCC about variables possibly clobbered by longjmp
John W. Eaton <jwe@octave.org>
parents:
19697
diff
changeset
|
605 int status; |
166051951878
avoid warning from GCC about variables possibly clobbered by longjmp
John W. Eaton <jwe@octave.org>
parents:
19697
diff
changeset
|
606 volatile int errnum = 0; |
5232 | 607 |
5234 | 608 int jmpret = setjmp (mark); |
5235 | 609 |
5234 | 610 if (jmpret == 0) |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
611 errnum = glpk (sense, mrowsc, mrowsA, c, nz, rn.fortran_vec (), |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
612 cn.fortran_vec (), a.fortran_vec (), b, ctype, |
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
613 freeLB.fortran_vec (), lb, freeUB.fortran_vec (), ub, |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
614 vartype.fortran_vec (), isMIP, lpsolver, save_pb, scale, |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
615 &par, xmin.fortran_vec (), &fmin, &status, |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
616 lambda.fortran_vec (), redcosts.fortran_vec (), &time); |
5232 | 617 |
11048
10c65e01f042
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
11047
diff
changeset
|
618 octave_scalar_map extra; |
5234 | 619 |
5238 | 620 if (! isMIP) |
621 { | |
11048
10c65e01f042
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
11047
diff
changeset
|
622 extra.assign ("lambda", lambda); |
10c65e01f042
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
11047
diff
changeset
|
623 extra.assign ("redcosts", redcosts); |
5238 | 624 } |
625 | |
11048
10c65e01f042
__glpk__.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents:
11047
diff
changeset
|
626 extra.assign ("time", time); |
17180
54e251e699bb
Use the new GLPK API (bug #39038).
Sébastien Villemot <sebastien@debian.org>
parents:
15213
diff
changeset
|
627 extra.assign ("status", status); |
5232 | 628 |
20939
b17fda023ca6
maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents:
20867
diff
changeset
|
629 return ovl (xmin, fmin, errnum, extra); |
5234 | 630 |
5235 | 631 #else |
632 | |
633 gripe_not_supported ("glpk"); | |
634 | |
635 #endif | |
5232 | 636 } |
12805
3641167e5b75
codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
637 |
3641167e5b75
codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
638 /* |
3641167e5b75
codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
639 ## No test needed for internal helper function. |
3641167e5b75
codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
640 %!assert (1) |
3641167e5b75
codesprint: *.cc helper functions do not need tests
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
641 */ |