1 |
aw0a |
1 |
/* |
2 |
|
|
* Definitions of CONOPT Subroutines |
3 |
|
|
* by Vicente Rico-Ramirez |
4 |
|
|
* Created: 07/97 |
5 |
|
|
* Version: $Revision: 1.5 $ |
6 |
|
|
* Version control file: $RCSfile: conopt.c,v $ |
7 |
|
|
* Date last modified: $Date: 1998/02/27 14:33:23 $ |
8 |
|
|
* Last modified by: $Author: mthomas $ |
9 |
|
|
* |
10 |
|
|
* This file is part of the SLV solver. |
11 |
|
|
* |
12 |
|
|
* The SLV solver is free software; you can redistribute |
13 |
|
|
* it and/or modify it under the terms of the GNU General Public License as |
14 |
|
|
* published by the Free Software Foundation; either version 2 of the |
15 |
|
|
* License, or (at your option) any later version. |
16 |
|
|
* |
17 |
|
|
* The SLV solver is distributed in hope that it will be |
18 |
|
|
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
20 |
|
|
* General Public License for more details. |
21 |
|
|
* |
22 |
|
|
* You should have received a copy of the GNU General Public License |
23 |
|
|
* along with the program; if not, write to the Free Software Foundation, |
24 |
|
|
* Inc., 675 Mass Ave, Cambridge, MA 02139 USA. Check the file named |
25 |
|
|
* COPYING. COPYING is found in ../compiler. |
26 |
|
|
* |
27 |
|
|
*/ |
28 |
|
|
|
29 |
|
|
#include "utilities/ascConfig.h" |
30 |
|
|
#include "solver/conopt.h" |
31 |
|
|
#if defined(DYNAMIC_CONOPT) |
32 |
|
|
#include "utilities/ascDynaLoad.h" |
33 |
|
|
#include "solver/conoptdll.h" |
34 |
|
|
#endif |
35 |
|
|
|
36 |
|
|
/* |
37 |
|
|
* is CONOPT available ? |
38 |
|
|
*/ |
39 |
|
|
#if (defined(STATIC_CONOPT) || defined(DYNAMIC_CONOPT)) |
40 |
|
|
#define CONOPT_ACTIVE TRUE |
41 |
|
|
#else /* defined(STATIC_CONOPT) */ |
42 |
|
|
#define CONOPT_ACTIVE FALSE |
43 |
|
|
#endif /* defined(STATIC_CONOPT) */ |
44 |
|
|
|
45 |
|
|
#if CONOPT_ACTIVE /* code used if CONOPT is available */ |
46 |
|
|
|
47 |
|
|
/* |
48 |
|
|
* Optimization subroutines for CONOPT |
49 |
|
|
* --------------------------------- |
50 |
|
|
*/ |
51 |
|
|
|
52 |
|
|
/* |
53 |
|
|
* User-defined subroutines |
54 |
|
|
* ------------------------ |
55 |
|
|
*/ |
56 |
|
|
|
57 |
|
|
/* |
58 |
|
|
* COIRMS Based on the information provided in Coispz, CONOPT will |
59 |
|
|
* allocate the number of vectors into which the user can define |
60 |
|
|
* the details of the model. The details of the model are defined |
61 |
|
|
* here. |
62 |
|
|
* |
63 |
|
|
* COIRMS(lower, curr, upper, vsta, type,rhs, fv, esta, colsta, |
64 |
|
|
* rowno, value, nlflag, n, m, n1, nz, usrmem) |
65 |
|
|
* |
66 |
|
|
* lower - lower bounds on the variables |
67 |
|
|
* curr - intial values of the variables |
68 |
|
|
* upper - upper bounds on the variables |
69 |
|
|
* vsta - initial status of the variable(o nonbasic, 1 basic) |
70 |
|
|
* type - types of equations (0 equality,1 greater,2 less) |
71 |
|
|
* rhs - values of the right hand sides |
72 |
|
|
* fv - sum of the nonlinear terms in the initial point |
73 |
|
|
* esta - initial status of the slack in the constraint (nonbasic,basic) |
74 |
|
|
* colsta- start of column pointers |
75 |
|
|
* rowno - row or equation numbers of the nonzeros |
76 |
|
|
* value - values of the jacobian elements |
77 |
|
|
* nlflag- nonlinearity flags(0 nonzero constant,1 varying) |
78 |
|
|
* n - number of variables |
79 |
|
|
* m - number of constraints |
80 |
|
|
* n1 - n+1 |
81 |
|
|
* nz - number of jacobian elements |
82 |
|
|
* usrmem- user memory defined by conopt |
83 |
|
|
*/ |
84 |
|
|
void COIRMS(real64 *lower, real64 *curr, real64 *upper, int32 *vsta, |
85 |
|
|
int32 *type, real64 *rhs, real64 *fv, int32 *esta, int32 *colsta, |
86 |
|
|
int32 *rowno, real64 *value, int32 *nlflag, int32 *n, int32 *m, |
87 |
|
|
int32 *n1, int32 *nz, real64 *usrmem) |
88 |
|
|
{ |
89 |
|
|
conopt_pointers conopt_ptrs; |
90 |
|
|
real64 **usr_mem; |
91 |
|
|
|
92 |
|
|
usr_mem = (real64 **)usrmem; |
93 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
94 |
|
|
if (conopt_ptrs->coirms_ptr == NULL) { |
95 |
|
|
return; |
96 |
|
|
} |
97 |
|
|
conopt_ptrs->coirms_ptr(lower, curr, upper, vsta, type, rhs, fv, esta, |
98 |
|
|
colsta, rowno, value, nlflag, n, m, n1, nz, |
99 |
|
|
usr_mem[1]); |
100 |
|
|
} |
101 |
|
|
|
102 |
|
|
|
103 |
|
|
/* |
104 |
|
|
* COIFBL Defines the nonlinearities of the model by returning |
105 |
|
|
* numerical values. It works on a block of rows during each call. |
106 |
|
|
* COIFBL( x, g, otn, nto, from, to, jac, stcl, rnum, cnum, nl, strw, |
107 |
|
|
* llen, indx, mode, errcnt, n, m, n1, m1, nz, usrmem) |
108 |
|
|
* |
109 |
|
|
* x - punt of evaluation provided by conopt |
110 |
|
|
* g - vector of function values |
111 |
|
|
* otn - old to new permutation vector |
112 |
|
|
* nto - new to old permutation vector |
113 |
|
|
* from - range in permutation |
114 |
|
|
* to - range in permutation |
115 |
|
|
* jac - vector of jacobian values. |
116 |
|
|
* The following are vectors defining the jacobian structure |
117 |
|
|
* stcl - start of column pointers |
118 |
|
|
* rnum - row numbers |
119 |
|
|
* cnum - column numbers |
120 |
|
|
* nl - nonlinearity flags |
121 |
|
|
* strw - start row pointers |
122 |
|
|
* llen - count of linear jacobian elements |
123 |
|
|
* indx - pointers from the row-wise representation |
124 |
|
|
* mode - indicator of mode of evaluation |
125 |
|
|
* errcnt- number of function evaluation errors |
126 |
|
|
* n - umber of variables |
127 |
|
|
* m - number of constraints |
128 |
|
|
* n1 - n+1 |
129 |
|
|
* m1 - m+1 |
130 |
|
|
* nz - number of jacobian elements |
131 |
|
|
* usrmem- user memory defined by conopt |
132 |
|
|
*/ |
133 |
|
|
void COIFBL(real64 *x, real64 *g, int32 *otn, int32 *nto, int32 *from, |
134 |
|
|
int32 *to, real64 *jac, int32 *stcl, int32 *rnum, int32 *cnum, |
135 |
|
|
int32 *nl, int32 *strw, int32 *llen, int32 *indx, int32 *mode, |
136 |
|
|
int32 *errcnt, int32 *n, int32 *m, int32 *n1, int32 *m1, |
137 |
|
|
int32 *nz, real64 *usrmem) |
138 |
|
|
{ |
139 |
|
|
conopt_pointers conopt_ptrs; |
140 |
|
|
real64 **usr_mem; |
141 |
|
|
|
142 |
|
|
usr_mem = (real64 **)usrmem; |
143 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
144 |
|
|
if (conopt_ptrs->coifbl_ptr == NULL) { |
145 |
|
|
return; |
146 |
|
|
} |
147 |
|
|
conopt_ptrs->coifbl_ptr(x, g, otn, nto, from, to, jac, stcl, rnum, cnum, |
148 |
|
|
nl, strw, llen, indx, mode, errcnt, n, m, n1, m1, |
149 |
|
|
nz, usr_mem[1]); |
150 |
|
|
|
151 |
|
|
} |
152 |
|
|
|
153 |
|
|
/* |
154 |
|
|
* COIFDE Defines the nonlinearities of the model by returning |
155 |
|
|
* numerical values. It works on one row or equation at a time |
156 |
|
|
* COIFDE(x, g, jac, rowno, jcnm, mode, errcnt, newpt, n, nj, usrmem) |
157 |
|
|
* |
158 |
|
|
* x - punt of evaluation provided by conopt |
159 |
|
|
* g - function value |
160 |
|
|
* jac - jacobian values |
161 |
|
|
* rowno - number of the row for which nonlinearities will be eval |
162 |
|
|
* jcnm - list of column number fon the NL nonzeros |
163 |
|
|
* mode - indicator of mode of evaluation |
164 |
|
|
* errcnt - sum of number of func evaluation errors thus far |
165 |
|
|
* newpt - new point indicator |
166 |
|
|
* nj - number of nonlinear nonzero jacobian elements |
167 |
|
|
* n - number of variables |
168 |
|
|
* usrmem - user memory |
169 |
|
|
*/ |
170 |
|
|
void COIFDE(real64 *x, real64 *g, real64 *jac, int32 *rowno, int32 *jcnm, |
171 |
|
|
int32 *mode, int32 *errcnt, int32 *newpt, int32 *n, int32 *nj, |
172 |
|
|
real64 *usrmem) |
173 |
|
|
{ |
174 |
|
|
conopt_pointers conopt_ptrs; |
175 |
|
|
real64 **usr_mem; |
176 |
|
|
|
177 |
|
|
usr_mem = (real64 **)usrmem; |
178 |
|
|
|
179 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
180 |
|
|
if (conopt_ptrs->coifde_ptr == NULL) { |
181 |
|
|
return; |
182 |
|
|
} |
183 |
|
|
conopt_ptrs->coifde_ptr(x, g, jac, rowno, jcnm, mode, errcnt, newpt, n, |
184 |
|
|
nj, usr_mem[1]); |
185 |
|
|
} |
186 |
|
|
|
187 |
|
|
|
188 |
|
|
|
189 |
|
|
/* |
190 |
|
|
* COISTA Pass the solution from CONOPT to the modeler. It returns |
191 |
|
|
* completion status |
192 |
|
|
* COISTA(modsta, solsts, iter, objval, usrmem) |
193 |
|
|
* |
194 |
|
|
* modsta - model status |
195 |
|
|
* solsta - solver status |
196 |
|
|
* iter - number of iterations |
197 |
|
|
* objval - objective value |
198 |
|
|
* usrmem - user memory |
199 |
|
|
*/ |
200 |
|
|
void COISTA(int32 *modsta, int32 *solsta, int32 *iter, real64 *objval, |
201 |
|
|
real64 *usrmem) |
202 |
|
|
{ |
203 |
|
|
conopt_pointers conopt_ptrs; |
204 |
|
|
real64 **usr_mem; |
205 |
|
|
|
206 |
|
|
usr_mem = (real64 **)usrmem; |
207 |
|
|
|
208 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
209 |
|
|
if (conopt_ptrs->coista_ptr == NULL) { |
210 |
|
|
return; |
211 |
|
|
} |
212 |
|
|
conopt_ptrs->coista_ptr(modsta, solsta, iter, objval, usr_mem[1]); |
213 |
|
|
} |
214 |
|
|
|
215 |
|
|
|
216 |
|
|
/* |
217 |
|
|
* COIRS passes the solution from CONOPT to the modeler. It returns |
218 |
|
|
* solution values |
219 |
|
|
* COIRS(val, xmar, xbas, xsta, yval, ymar, ybas, ysta, n, m, usrmem) |
220 |
|
|
* |
221 |
|
|
* xval - the solution values of the variables |
222 |
|
|
* xmar - corresponding marginal values |
223 |
|
|
* xbas - basis indicator for column (at bound, basic, nonbasic) |
224 |
|
|
* xsta - status of column (normal, nonoptimal, infeasible,unbounded) |
225 |
|
|
* yval - values of the left hand side in all the rows |
226 |
|
|
* ymar - corresponding marginal values |
227 |
|
|
* ybas - basis indicator for row |
228 |
|
|
* ysta - status of row |
229 |
|
|
* n - number of variables |
230 |
|
|
* m - number of constraints |
231 |
|
|
* usrmem - user memory |
232 |
|
|
*/ |
233 |
|
|
void COIRS(real64 *xval, real64 *xmar, int32 *xbas, int32 *xsta, real64 *yval, |
234 |
|
|
real64 *ymar, int32 *ybas, int32 * ysta, int32 *n, int32 *m, |
235 |
|
|
real64 *usrmem) |
236 |
|
|
{ |
237 |
|
|
conopt_pointers conopt_ptrs; |
238 |
|
|
real64 **usr_mem; |
239 |
|
|
|
240 |
|
|
usr_mem = (real64 **)usrmem; |
241 |
|
|
|
242 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
243 |
|
|
if (conopt_ptrs->coirs_ptr == NULL) { |
244 |
|
|
return; |
245 |
|
|
} |
246 |
|
|
conopt_ptrs->coirs_ptr(xval, xmar, xbas, xsta, yval, ymar, ybas, ysta, |
247 |
|
|
n, m, usr_mem[1]); |
248 |
|
|
} |
249 |
|
|
|
250 |
|
|
|
251 |
|
|
/* |
252 |
|
|
* COIUSZ communicates and update of an existing model to CONOPT |
253 |
|
|
* COIUSZ(nintg, ipsz, nreal, rpsz, usrmem) |
254 |
|
|
* |
255 |
|
|
* nintg - number of positions in ipsz |
256 |
|
|
* ipsz - array describing problem size and options |
257 |
|
|
* nreal - number of positions in rpsz |
258 |
|
|
* rpsz - array of reals describing problem size and options |
259 |
|
|
* usrmem- user memory |
260 |
|
|
*/ |
261 |
|
|
void COIUSZ(int32 *nintg, int32 *ipsz, int32 *nreal, real64 *rpsz, |
262 |
|
|
real64 *usrmem) |
263 |
|
|
{ |
264 |
|
|
conopt_pointers conopt_ptrs; |
265 |
|
|
real64 **usr_mem; |
266 |
|
|
|
267 |
|
|
usr_mem = (real64 **)usrmem; |
268 |
|
|
|
269 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
270 |
|
|
if (conopt_ptrs->coiusz_ptr == NULL) { |
271 |
|
|
return; |
272 |
|
|
} |
273 |
|
|
conopt_ptrs->coiusz_ptr(nintg, ipsz, nreal, rpsz, usr_mem[1]); |
274 |
|
|
} |
275 |
|
|
|
276 |
|
|
|
277 |
|
|
/* |
278 |
|
|
* COIOPT communicates non-default option values to CONOPT |
279 |
|
|
* COIOPT(name, rval, ival, lval, usrmem) |
280 |
|
|
* name - the name of a CONOPT CR-cell defined by the modeler |
281 |
|
|
* rval - the value to be assigned to name if the cells contains a real |
282 |
|
|
* ival - the value to be assigned to name if the cells contains an int |
283 |
|
|
* lval - the value to be assigned to name if the cells contains a log value |
284 |
|
|
* usrmem - user memory |
285 |
|
|
*/ |
286 |
|
|
void COIOPT(char *name, real64 *rval, int32 *ival, int32 *logical, |
287 |
|
|
real64 *usrmem) |
288 |
|
|
{ |
289 |
|
|
conopt_pointers conopt_ptrs; |
290 |
|
|
real64 **usr_mem; |
291 |
|
|
|
292 |
|
|
usr_mem = (real64 **)usrmem; |
293 |
|
|
|
294 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
295 |
|
|
if (conopt_ptrs->coiopt_ptr == NULL) { |
296 |
|
|
return; |
297 |
|
|
} |
298 |
|
|
conopt_ptrs->coiopt_ptr(name, rval, ival, logical, usr_mem[1]); |
299 |
|
|
} |
300 |
|
|
|
301 |
|
|
|
302 |
|
|
/* |
303 |
|
|
* COIPSZ communicates the model size and structure to CONOPT |
304 |
|
|
* COIPSZ(nintgr, ipsz, nreal, rpsz, usrmem) |
305 |
|
|
* |
306 |
|
|
* ningtr - number of positions in ipsz |
307 |
|
|
* ipsz - array describing problem size and options |
308 |
|
|
* nreal - number of positions in rpsz |
309 |
|
|
* rpsz - array of reals describing problem size and options |
310 |
|
|
* usrmem - user memory |
311 |
|
|
*/ |
312 |
|
|
void COIPSZ(int32 *nintgr, int32 *ipsz, int32 *nreal, real64 *rpsz, |
313 |
|
|
real64 *usrmem) |
314 |
|
|
{ |
315 |
|
|
conopt_pointers conopt_ptrs; |
316 |
|
|
real64 **usr_mem; |
317 |
|
|
|
318 |
|
|
usr_mem = (real64 **)usrmem; |
319 |
|
|
|
320 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
321 |
|
|
if (conopt_ptrs->coipsz_ptr == NULL) { |
322 |
|
|
return; |
323 |
|
|
} |
324 |
|
|
conopt_ptrs->coipsz_ptr(nintgr, ipsz, nreal, rpsz, usr_mem[1]); |
325 |
|
|
} |
326 |
|
|
|
327 |
|
|
|
328 |
|
|
extern void COIMSG (int32 *nmsg, int32 *smsg, int32 *llen, |
329 |
|
|
char msgv[80*15],real64 *usrmem) |
330 |
|
|
{ |
331 |
|
|
conopt_pointers conopt_ptrs; |
332 |
|
|
real64 **usr_mem; |
333 |
|
|
|
334 |
|
|
usr_mem = (real64 **)usrmem; |
335 |
|
|
|
336 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
337 |
|
|
if (conopt_ptrs->coimsg_ptr == NULL) { |
338 |
|
|
return; |
339 |
|
|
} |
340 |
|
|
conopt_ptrs->coimsg_ptr(nmsg, smsg, llen, msgv, usr_mem[1]); |
341 |
|
|
} |
342 |
|
|
|
343 |
|
|
extern void COISCR (char msg[80], int32 *len) |
344 |
|
|
{ |
345 |
|
|
FPRINTF(stdout,"%.*s\n",*len,&msg[0]); |
346 |
|
|
} |
347 |
|
|
|
348 |
|
|
extern void COIEC (int32 *colno, int32 *msglen, char msg[80],real64 *usrmem) |
349 |
|
|
{ |
350 |
|
|
conopt_pointers conopt_ptrs; |
351 |
|
|
real64 **usr_mem; |
352 |
|
|
|
353 |
|
|
usr_mem = (real64 **)usrmem; |
354 |
|
|
|
355 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
356 |
|
|
if (conopt_ptrs->coiec_ptr == NULL) { |
357 |
|
|
return; |
358 |
|
|
} |
359 |
|
|
conopt_ptrs->coiec_ptr(colno, msglen, msg, usr_mem[1]); |
360 |
|
|
} |
361 |
|
|
|
362 |
|
|
extern void COIER (int32 *rowno, int32 *msglen, char msg[80],real64 *usrmem) |
363 |
|
|
{ |
364 |
|
|
conopt_pointers conopt_ptrs; |
365 |
|
|
real64 **usr_mem; |
366 |
|
|
|
367 |
|
|
usr_mem = (real64 **)usrmem; |
368 |
|
|
|
369 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
370 |
|
|
if (conopt_ptrs->coier_ptr == NULL) { |
371 |
|
|
return; |
372 |
|
|
} |
373 |
|
|
conopt_ptrs->coier_ptr(rowno, msglen, msg, usr_mem[1]); |
374 |
|
|
} |
375 |
|
|
|
376 |
|
|
extern void COIENZ (int32 *colno, int32 *rowno, int32 *posno, |
377 |
|
|
int32 *msglen, char msg[80],real64 *usrmem) |
378 |
|
|
{ |
379 |
|
|
conopt_pointers conopt_ptrs; |
380 |
|
|
real64 **usr_mem; |
381 |
|
|
|
382 |
|
|
usr_mem = (real64 **)usrmem; |
383 |
|
|
|
384 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
385 |
|
|
if (conopt_ptrs->coienz_ptr == NULL) { |
386 |
|
|
return; |
387 |
|
|
} |
388 |
|
|
conopt_ptrs->coienz_ptr(colno, rowno, posno, msglen, msg, usr_mem[1]); |
389 |
|
|
} |
390 |
|
|
|
391 |
|
|
extern void COIPRG (int32 *nintgr, int32 *intrep, int32 *nreal, |
392 |
|
|
real64 *rl, real64 *x, real64 *usrmem, int32 *finish) |
393 |
|
|
{ |
394 |
|
|
conopt_pointers conopt_ptrs; |
395 |
|
|
real64 **usr_mem; |
396 |
|
|
|
397 |
|
|
usr_mem = (real64 **)usrmem; |
398 |
|
|
|
399 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
400 |
|
|
if (conopt_ptrs->coiprg_ptr == NULL) { |
401 |
|
|
return; |
402 |
|
|
} |
403 |
|
|
conopt_ptrs->coiprg_ptr(nintgr, intrep, nreal, rl, x, usr_mem[1], finish); |
404 |
|
|
} |
405 |
|
|
|
406 |
|
|
extern void COIORC (int32 *colno, int32 *rowno, real64 *value, |
407 |
|
|
real64 *resid,real64 *usrmem) |
408 |
|
|
{ |
409 |
|
|
conopt_pointers conopt_ptrs; |
410 |
|
|
real64 **usr_mem; |
411 |
|
|
|
412 |
|
|
usr_mem = (real64 **)usrmem; |
413 |
|
|
|
414 |
|
|
conopt_ptrs = (conopt_pointers)usr_mem[0]; |
415 |
|
|
if (conopt_ptrs->coiorc_ptr == NULL) { |
416 |
|
|
return; |
417 |
|
|
} |
418 |
|
|
conopt_ptrs->coiorc_ptr(colno, rowno, value, resid, usr_mem[1]); |
419 |
|
|
} |
420 |
|
|
|
421 |
|
|
#if defined(DYNAMIC_CONOPT) |
422 |
|
|
REGISTER_CONOPT_FUNCTION_FUNC *register_conopt_function; |
423 |
|
|
UNREGISTER_CONOPT_FUNCTION_FUNC *unregister_conopt_function; |
424 |
|
|
COICRM_FUNC *COICRM; |
425 |
|
|
COICSM_FUNC *COICSM; |
426 |
|
|
COIMEM_FUNC *COIMEM; |
427 |
|
|
#endif /* DYNAMIC_CONOPT */ |
428 |
|
|
|
429 |
|
|
/* |
430 |
|
|
* Provided subroutines coicsm and coimem |
431 |
|
|
* -------------------------------------- |
432 |
|
|
*/ |
433 |
|
|
/* |
434 |
|
|
* IMPORTANT: The use of the following functions is a H A C K to aovid |
435 |
|
|
* unresolved externals while linking to the CONOPT library. For some |
436 |
|
|
* reason, the linker wants the calls to the provided subroutines |
437 |
|
|
* COICSM and COIMEM in the same file as the definition of the user |
438 |
|
|
* defined CONOPT subroutines |
439 |
|
|
*/ |
440 |
|
|
/* |
441 |
|
|
* Memory estimation by using CONOPT subroutine coimem |
442 |
|
|
* |
443 |
|
|
* COIMEM Estimates the amount of memory needed by CONOPT |
444 |
|
|
* COIMEM(nintgr, ipsz, minmem, estmem) |
445 |
|
|
* |
446 |
|
|
* nintgr - number of elements in the array ipsz. Should be 3. |
447 |
|
|
* ipsz - vector of integers to describe the size of the model |
448 |
|
|
* minmem - Minimum estimate for the memory needed. Measured in |
449 |
|
|
* number of real elements of work |
450 |
|
|
* estmem - Estimate of the amount of memory |
451 |
|
|
*/ |
452 |
|
|
void conopt_estimate_memory(int32 *nintgr, int32 *ipsz, int32 *minmem, |
453 |
|
|
int32 *estmem) |
454 |
|
|
{ |
455 |
|
|
COIMEM(nintgr, ipsz, minmem, estmem); |
456 |
|
|
} |
457 |
|
|
|
458 |
|
|
|
459 |
|
|
/* |
460 |
|
|
* COICRM restarts CONOPT with user memory |
461 |
|
|
* COICRM(kept, usrmem, lwork, work, maxusd, curusd) |
462 |
|
|
* |
463 |
|
|
* kept - Whether CONOPT has kept the model after solving it or not |
464 |
|
|
* usrmem - array passed to all subroutines. If not needed is dummy array |
465 |
|
|
* lwork - lenght of working array work |
466 |
|
|
* work - working array supplied by the user |
467 |
|
|
* maxusd - maximum amount of memory in work used during optimization |
468 |
|
|
* curusd - current amount of memory in use |
469 |
|
|
*/ |
470 |
|
|
void conopt_restart(int32 *kept, real64 **usrmem, int32 *lwork, real64 *work, |
471 |
|
|
int32 *maxusd, int32 *curusd) |
472 |
|
|
{ |
473 |
|
|
real64 *usr_mem; |
474 |
|
|
usr_mem = (real64 *)usrmem; |
475 |
|
|
|
476 |
|
|
FPRINTF(ASCERR,"\n"); |
477 |
|
|
FPRINTF(ASCERR,"Restarting Conopt\n"); |
478 |
|
|
FPRINTF(ASCERR,"\n"); |
479 |
|
|
|
480 |
|
|
COICRM(kept, usr_mem, lwork, work, maxusd,curusd); |
481 |
|
|
} |
482 |
|
|
|
483 |
|
|
|
484 |
|
|
/* |
485 |
|
|
* COICSM starts up CONOPT with user memory |
486 |
|
|
* COICSM(kept, usrmem, lwork, work, maxusd, curusd) |
487 |
|
|
* |
488 |
|
|
* kept - Whether CONOPT has kept the model after solving it or not |
489 |
|
|
* usrmem - array passed to all subroutines. If not needed is dummy array |
490 |
|
|
* lwork - lenght of working array work |
491 |
|
|
* work - working array supplied by the user |
492 |
|
|
* maxusd - maximum amount of memory in work used during optimization |
493 |
|
|
* curusd - current amount of memory in use |
494 |
|
|
*/ |
495 |
|
|
void conopt_start(int32 *kept, real64 **usrmem, int32 *lwork, real64 *work, |
496 |
|
|
int32 *maxusd, int32 *curusd) |
497 |
|
|
{ |
498 |
|
|
conopt_pointers conopt_ptrs; |
499 |
|
|
real64 *usr_mem; |
500 |
|
|
usr_mem = (real64 *)usrmem; |
501 |
|
|
|
502 |
|
|
FPRINTF(ASCERR,"\n"); |
503 |
|
|
FPRINTF(ASCERR,"Starting Conopt\n"); |
504 |
|
|
FPRINTF(ASCERR,"\n"); |
505 |
|
|
|
506 |
|
|
#if defined(DYNAMIC_CONOPT) |
507 |
|
|
conopt_ptrs = (conopt_pointers)usrmem[0]; |
508 |
|
|
|
509 |
|
|
register_conopt_function(COIRMS_ENUM, |
510 |
|
|
conopt_ptrs->coirms_ptr == NULL ? NULL : (void *)COIRMS); |
511 |
|
|
register_conopt_function(COIFBL_ENUM, |
512 |
|
|
conopt_ptrs->coifbl_ptr == NULL ? NULL : (void *)COIFBL); |
513 |
|
|
register_conopt_function(COIFDE_ENUM, |
514 |
|
|
conopt_ptrs->coifde_ptr == NULL ? NULL : (void *)COIFDE); |
515 |
|
|
register_conopt_function(COIRS_ENUM, |
516 |
|
|
conopt_ptrs->coirs_ptr == NULL ? NULL : (void *)COIRS); |
517 |
|
|
register_conopt_function(COISTA_ENUM, |
518 |
|
|
conopt_ptrs->coista_ptr == NULL ? NULL : (void *)COISTA); |
519 |
|
|
register_conopt_function(COIUSZ_ENUM, |
520 |
|
|
conopt_ptrs->coiusz_ptr == NULL ? NULL : (void *)COIUSZ); |
521 |
|
|
register_conopt_function(COIOPT_ENUM, |
522 |
|
|
conopt_ptrs->coiopt_ptr == NULL ? NULL : (void *)COIOPT); |
523 |
|
|
register_conopt_function(COIPSZ_ENUM, |
524 |
|
|
conopt_ptrs->coipsz_ptr == NULL ? NULL : (void *)COIPSZ); |
525 |
|
|
|
526 |
|
|
register_conopt_function(COIMSG_ENUM, |
527 |
|
|
conopt_ptrs->coimsg_ptr == NULL ? NULL : (void *)COIMSG); |
528 |
|
|
register_conopt_function(COISCR_ENUM,(void *)COISCR); |
529 |
|
|
register_conopt_function(COIEC_ENUM, |
530 |
|
|
conopt_ptrs->coiec_ptr == NULL ? NULL : (void *)COIEC); |
531 |
|
|
register_conopt_function(COIER_ENUM, |
532 |
|
|
conopt_ptrs->coier_ptr == NULL ? NULL : (void *)COIER); |
533 |
|
|
register_conopt_function(COIENZ_ENUM, |
534 |
|
|
conopt_ptrs->coienz_ptr == NULL ? NULL : (void *)COIENZ); |
535 |
|
|
register_conopt_function(COIPRG_ENUM, |
536 |
|
|
conopt_ptrs->coiprg_ptr == NULL ? NULL : (void *)COIPRG); |
537 |
|
|
register_conopt_function(COIORC_ENUM, |
538 |
|
|
conopt_ptrs->coiorc_ptr == NULL ? NULL : (void *)COIORC); |
539 |
|
|
|
540 |
|
|
#endif /* DYNAMIC_CONOPT */ |
541 |
|
|
COICSM(kept, usr_mem, lwork, work, maxusd,curusd); |
542 |
|
|
} |
543 |
|
|
#if defined(DYNAMIC_CONOPT) |
544 |
|
|
int32 conopt_loaded = 1; |
545 |
|
|
|
546 |
|
|
int32 conopt_load(void) { |
547 |
|
|
int32 status; |
548 |
|
|
if (conopt_loaded == 0) { |
549 |
|
|
return 0; /* allready loaded */ |
550 |
|
|
} |
551 |
|
|
status = Asc_DynamicLoad("dllcnsub.dll", NULL); |
552 |
|
|
if (status != 0) { |
553 |
|
|
return 1; /* failure */ |
554 |
|
|
} |
555 |
|
|
register_conopt_function = |
556 |
|
|
(REGISTER_CONOPT_FUNCTION_FUNC *)Asc_DynamicSymbol("dllcnsub.dll", |
557 |
|
|
"register_conopt_function"); |
558 |
|
|
unregister_conopt_function = |
559 |
|
|
(UNREGISTER_CONOPT_FUNCTION_FUNC *)Asc_DynamicSymbol("dllcnsub.dll", |
560 |
|
|
"unregister_conopt_function"); |
561 |
|
|
COICRM = (COICRM_FUNC *)Asc_DynamicSymbol("dllcnsub.dll","COICRM"); |
562 |
|
|
COICSM = (COICSM_FUNC *)Asc_DynamicSymbol("dllcnsub.dll","COICSM"); |
563 |
|
|
COIMEM = (COIMEM_FUNC *)Asc_DynamicSymbol("dllcnsub.dll","COIMEM"); |
564 |
|
|
if (register_conopt_function == NULL || |
565 |
|
|
unregister_conopt_function == NULL || |
566 |
|
|
COICRM == NULL || |
567 |
|
|
COICSM == NULL || |
568 |
|
|
COIMEM == NULL) { |
569 |
|
|
return 1; /* failure */ |
570 |
|
|
} |
571 |
|
|
conopt_loaded = 0; |
572 |
|
|
return 0; |
573 |
|
|
} |
574 |
|
|
#endif /* DYNAMIC_CONOPT */ |
575 |
|
|
#endif /* CONOPT_ACTIVE */ |