1 /*
2 * This file is part of qpOASES.
3 *
4 * qpOASES -- An Implementation of the Online Active Set Strategy.
5 * Copyright (C) 2007-2017 by Hans Joachim Ferreau, Andreas Potschka,
6 * Christian Kirches et al. All rights reserved.
7 *
8 * qpOASES is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * qpOASES is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 * See the GNU Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with qpOASES; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 *
22 */
23
24
25 /**
26 * \file interfaces/scilab/qpOASESinterface.c
27 * \author Holger Diedam, Hans Joachim Ferreau
28 * \version 3.2
29 * \date 2007-2017
30 *
31 * Interface that enables to call qpOASES from scilab.
32 * (Please excuse a lot of copy and paste...)
33 *
34 */
35
36
37 #include <stdio.h>
38 #include <string.h>
39
40 #include <scilab/stack-c.h>
41 #include <scilab/Scierror.h>
42
43 #include "../c/qpOASES_wrapper.h"
44
45
46
47 extern int interface_qpOASES( char* fname );
48
49 extern int interface_QProblem_init( char* fname );
50 extern int interface_QProblemB_init( char* fname );
51 extern int interface_SQProblem_init( char* fname );
52
53 extern int interface_QProblem_hotstart( char* fname );
54 extern int interface_QProblemB_hotstart( char* fname );
55 extern int interface_SQProblem_hotstart( char* fname );
56
57 extern int interface_QProblem_cleanup( char* fname );
58 extern int interface_QProblemB_cleanup( char* fname );
59 extern int interface_SQProblem_cleanup( char* fname );
60
61
62 typedef int (*gate_function) ( char* );
63 extern int sci_gateway( char* name, gate_function f );
64 extern int C2F(qpOASESgateway)();
65
66
67 /* forward declaration of C++ routines */
68 void sci_qpOASES( real_t* H, real_t* g, real_t* A, real_t* lb, real_t* ub, real_t* lbA, real_t* ubA,
69 int_t *nV, int_t* nC, int_t* nWSR,
70 real_t* x, real_t* obj, int_t* status, int_t* nWSRout, real_t* y
71 );
72
73 void sci_QProblem_init( real_t* H, real_t* g, real_t* A, real_t* lb, real_t* ub, real_t* lbA, real_t* ubA,
74 int_t *nV, int_t* nC, int_t* nWSR,
75 real_t* x, real_t* obj, int_t* status, int_t* nWSRout, real_t* y
76 );
77 void sci_QProblemB_init( real_t* H, real_t* g, real_t* lb, real_t* ub,
78 int_t *nV, int_t* nWSR,
79 real_t* x, real_t* obj, int_t* status, int_t* nWSRout, real_t* y
80 );
81 void sci_SQProblem_init( real_t* H, real_t* g, real_t* A, real_t* lb, real_t* ub, real_t* lbA, real_t* ubA,
82 int_t *nV, int_t* nC, int_t* nWSR,
83 real_t* x, real_t* obj, int_t* status, int_t* nWSRout, real_t* y
84 );
85
86 void sci_QProblem_hotstart( real_t* g, real_t* lb, real_t* ub, real_t* lbA, real_t* ubA,
87 int_t* nWSR,
88 real_t* x, real_t* obj, int_t* status, int_t* nWSRout, real_t* y
89 );
90 void sci_QProblemB_hotstart( real_t* g, real_t* lb, real_t* ub,
91 int_t* nWSR,
92 real_t* x, real_t* obj, int_t* status, int_t* nWSRout, real_t* y
93 );
94 void sci_SQProblem_hotstart( real_t* H, real_t* g, real_t* A, real_t* lb, real_t* ub, real_t* lbA, real_t* ubA,
95 int_t* nWSR,
96 real_t* x, real_t* obj, int_t* status, int_t* nWSRout, real_t* y
97 );
98
99 void sci_QProblem_cleanup( );
100 void sci_QProblemB_cleanup( );
101 void sci_SQProblem_cleanup( );
102
103
104 /* global variables containing dimensions of matrices
105 * (also used to check whether qpOASES object were initialised) */
106 static int_t qp_rowsH = -1;
107 static int_t qp_rowsA = -1;
108 static int_t qpb_rowsH = -1;
109 static int_t sqp_rowsH = -1;
110 static int_t sqp_rowsA = -1;
111
112
113 /*
114 * i n t e r f a c e _ q p O A S E S
115 */
interface_qpOASES(char * fname)116 int interface_qpOASES( char* fname )
117 {
118 int_t H, H_rows, H_cols;
119 int_t g, g_rows, g_cols;
120 int_t A, A_rows, A_cols;
121 int_t lb, lb_rows, lb_cols;
122 int_t ub, ub_rows, ub_cols;
123 int_t lbA, lbA_rows, lbA_cols;
124 int_t ubA, ubA_rows, ubA_cols;
125 int_t nWSR, nWSR_rows, nWSR_cols;
126
127 int_t x, obj, status, nWSRout, y;
128
129
130 int minlhs = 1, maxlhs = 5, minrhs = 8, maxrhs = 8, one = 1, y_size;
131
132 CheckRhs( minrhs,maxrhs );
133 CheckLhs( minlhs,maxlhs );
134
135
136 /* check dimensions */
137 GetRhsVar( 1,"d", &H_rows,&H_cols,&H );
138 if ( ( H_rows != H_cols ) || ( H_rows < 1 ) )
139 {
140 Scierror( 111,"ERROR (qpOASES): Dimension mismatch!\n" );
141 return 0;
142 }
143
144 GetRhsVar( 2,"d", &g_rows,&g_cols,&g );
145 if ( !( ( ( g_rows == H_rows ) && ( g_cols == 1 ) ) || ( ( g_rows == 1 ) && ( g_cols == H_rows ) ) ) )
146 {
147 Scierror( 112,"ERROR (qpOASES): Dimension mismatch!\n" );
148 return 0;
149 }
150
151 GetRhsVar( 3,"d", &A_rows,&A_cols,&A );
152 if ( ( A_cols != H_rows ) || ( A_rows < 1 ) )
153 {
154 Scierror( 113,"ERROR (qpOASES): Dimension mismatch!\n" );
155 return 0;
156 }
157
158 GetRhsVar( 4,"d", &lb_rows,&lb_cols,&lb);
159 if ( !( ( ( lb_rows == H_rows ) && ( lb_cols == 1 ) ) || ( ( lb_rows == 0 ) && ( lb_cols == 0 ) ) ) )
160 {
161 Scierror( 114,"ERROR (qpOASES): Dimension mismatch!\n" );
162 return 0;
163 }
164
165 GetRhsVar( 5,"d", &ub_rows,&ub_cols,&ub);
166 if ( !( ( ( ub_rows == H_rows ) && ( ub_cols == 1 ) ) || ( ( ub_rows == 0 ) && ( ub_cols == 0 ) ) ) )
167 {
168 Scierror( 115,"ERROR (qpOASES): Dimension mismatch!\n" );
169 return 0;
170 }
171
172 GetRhsVar( 6,"d", &lbA_rows,&lbA_cols,&lbA);
173 if ( !( ( ( lbA_rows == A_rows ) && ( lbA_cols == 1 ) ) || ( ( lbA_rows == 0 ) && ( lbA_cols == 0 ) ) ) )
174 {
175 Scierror( 116,"ERROR (qpOASES): Dimension mismatch!\n" );
176 return 0;
177 }
178
179 GetRhsVar( 7,"d", &ubA_rows,&ubA_cols,&ubA);
180 if ( !( ( ( ubA_rows == A_rows ) && ( ubA_cols == 1 ) ) || ( ( ubA_rows == 0 ) && ( ubA_cols == 0 ) ) ) )
181 {
182 Scierror( 117,"ERROR (qpOASES): Dimension mismatch!\n" );
183 return 0;
184 }
185
186 GetRhsVar( 8,"i", &nWSR_rows,&nWSR_cols,&nWSR);
187 if ( ( nWSR_rows != nWSR_cols ) || ( nWSR_cols != 1 ) )
188 {
189 Scierror( 118,"ERROR (qpOASES): Dimension mismatch!\n" );
190 return 0;
191 }
192
193
194 y_size = H_rows + A_rows;
195
196 CreateVar( 9,"d", &H_rows,&one,&x );
197 CreateVar( 10,"d", &one,&one,&obj );
198 CreateVar( 11,"i", &one,&one,&status );
199 CreateVar( 12,"i", &one,&one,&nWSRout );
200 CreateVar( 13,"d", &y_size,&one,&y );
201
202
203 /* call interfaced qpOASES routines with appropriate arguments */
204 sci_qpOASES( stk(H),stk(g),stk(A), (lb_rows!=0) ? stk(lb) : 0, (ub_rows!=0) ? stk(ub) : 0, (lbA_rows!=0) ? stk(lbA) : 0, (ubA_rows!=0) ? stk(ubA) : 0,
205 &H_rows,&A_rows,istk(nWSR),
206 stk(x),stk(obj),istk(status),istk(nWSRout),stk(y)
207 );
208
209 LhsVar(1) = 9;
210 LhsVar(2) = 10;
211 LhsVar(3) = 11;
212 LhsVar(4) = 12;
213 LhsVar(5) = 13;
214
215 return 0;
216 }
217
218
219 /*
220 * i n t e r f a c e _ Q P r o b l e m _ i n i t
221 */
interface_QProblem_init(char * fname)222 int interface_QProblem_init( char* fname )
223 {
224 int_t H, H_rows, H_cols;
225 int_t g, g_rows, g_cols;
226 int_t A, A_rows, A_cols;
227 int_t lb, lb_rows, lb_cols;
228 int_t ub, ub_rows, ub_cols;
229 int_t lbA, lbA_rows, lbA_cols;
230 int_t ubA, ubA_rows, ubA_cols;
231 int_t nWSR, nWSR_rows, nWSR_cols;
232
233 int_t x, obj, status, nWSRout, y;
234
235
236 int minlhs = 1, maxlhs = 5, minrhs = 8, maxrhs = 8, one = 1, y_size;
237
238 CheckRhs( minrhs,maxrhs );
239 CheckLhs( minlhs,maxlhs );
240
241
242 /* check dimensions */
243 GetRhsVar( 1,"d", &H_rows,&H_cols,&H );
244 if ( ( H_rows != H_cols ) || ( H_rows < 1 ) )
245 {
246 Scierror( 211,"ERROR (qpOASES): Dimension mismatch!\n" );
247 return 0;
248 }
249
250 GetRhsVar( 2,"d", &g_rows,&g_cols,&g );
251 if ( !( ( ( g_rows == H_rows ) && ( g_cols == 1 ) ) || ( ( g_rows == 1 ) && ( g_cols == H_rows ) ) ) )
252 {
253 Scierror( 212,"ERROR (qpOASES): Dimension mismatch!\n" );
254 return 0;
255 }
256
257 GetRhsVar( 3,"d", &A_rows,&A_cols,&A );
258 if ( ( A_cols != H_rows ) || ( A_rows < 1 ) )
259 {
260 Scierror( 213,"ERROR (qpOASES): Dimension mismatch!\n" );
261 return 0;
262 }
263
264 GetRhsVar( 4,"d", &lb_rows,&lb_cols,&lb);
265 if ( !( ( ( lb_rows == H_rows ) && ( lb_cols == 1 ) ) || ( ( lb_rows == 0 ) && ( lb_cols == 0 ) ) ) )
266 {
267 Scierror( 214,"ERROR (qpOASES): Dimension mismatch!\n" );
268 return 0;
269 }
270
271 GetRhsVar( 5,"d", &ub_rows,&ub_cols,&ub);
272 if ( !( ( ( ub_rows == H_rows ) && ( ub_cols == 1 ) ) || ( ( ub_rows == 0 ) && ( ub_cols == 0 ) ) ) )
273 {
274 Scierror( 215,"ERROR (qpOASES): Dimension mismatch!\n" );
275 return 0;
276 }
277
278 GetRhsVar( 6,"d", &lbA_rows,&lbA_cols,&lbA);
279 if ( !( ( ( lbA_rows == A_rows ) && ( lbA_cols == 1 ) ) || ( ( lbA_rows == 0 ) && ( lbA_cols == 0 ) ) ) )
280 {
281 Scierror( 216,"ERROR (qpOASES): Dimension mismatch!\n" );
282 return 0;
283 }
284
285 GetRhsVar( 7,"d", &ubA_rows,&ubA_cols,&ubA);
286 if ( !( ( ( ubA_rows == A_rows ) && ( ubA_cols == 1 ) ) || ( ( ubA_rows == 0 ) && ( ubA_cols == 0 ) ) ) )
287 {
288 Scierror( 217,"ERROR (qpOASES): Dimension mismatch!\n" );
289 return 0;
290 }
291
292 GetRhsVar( 8,"i", &nWSR_rows,&nWSR_cols,&nWSR);
293 if ( ( nWSR_rows != nWSR_cols ) || ( nWSR_cols != 1 ) )
294 {
295 Scierror( 218,"ERROR (qpOASES): Dimension mismatch!\n" );
296 return 0;
297 }
298
299
300 y_size = H_rows + A_rows;
301
302 CreateVar( 9,"d", &H_rows,&one,&x );
303 CreateVar( 10,"d", &one,&one,&obj );
304 CreateVar( 11,"i", &one,&one,&status );
305 CreateVar( 12,"i", &one,&one,&nWSRout );
306 CreateVar( 13,"d", &y_size,&one,&y );
307
308
309 qp_rowsH = H_rows;
310 qp_rowsA = A_rows;
311
312
313 /* call interfaced qpOASES routines with appropriate arguments */
314 sci_QProblem_init( stk(H),stk(g),stk(A), (lb_rows!=0) ? stk(lb) : 0, (ub_rows!=0) ? stk(ub) : 0, (lbA_rows!=0) ? stk(lbA) : 0, (ubA_rows!=0) ? stk(ubA) : 0,
315 &H_rows,&A_rows,istk(nWSR),
316 stk(x),stk(obj),istk(status),istk(nWSRout),stk(y)
317 );
318
319 LhsVar(1) = 9;
320 LhsVar(2) = 10;
321 LhsVar(3) = 11;
322 LhsVar(4) = 12;
323 LhsVar(5) = 13;
324
325 return 0;
326 }
327
328
329 /*
330 * i n t e r f a c e _ Q P r o b l e m B _ i n i t
331 */
interface_QProblemB_init(char * fname)332 int interface_QProblemB_init( char* fname )
333 {
334 int_t H, H_rows, H_cols;
335 int_t g, g_rows, g_cols;
336 int_t lb, lb_rows, lb_cols;
337 int_t ub, ub_rows, ub_cols;
338 int_t nWSR, nWSR_rows, nWSR_cols;
339
340 int_t x, obj, status, nWSRout, y;
341
342
343 int minlhs = 1, maxlhs = 5, minrhs = 5, maxrhs = 5, one = 1;
344
345 CheckRhs( minrhs,maxrhs );
346 CheckLhs( minlhs,maxlhs );
347
348
349 /* check dimensions */
350 GetRhsVar( 1,"d", &H_rows,&H_cols,&H );
351 if ( ( H_rows != H_cols ) || ( H_rows < 1 ) )
352 {
353 Scierror( 221,"ERROR (qpOASES): Dimension mismatch!\n" );
354 return 0;
355 }
356
357 GetRhsVar( 2,"d", &g_rows,&g_cols,&g );
358 if ( !( ( ( g_rows == H_rows ) && ( g_cols == 1 ) ) || ( ( g_rows == 1 ) && ( g_cols == H_rows ) ) ) )
359 {
360 Scierror( 222,"ERROR (qpOASES): Dimension mismatch!\n" );
361 return 0;
362 }
363
364 GetRhsVar( 3,"d", &lb_rows,&lb_cols,&lb);
365 if ( !( ( ( lb_rows == H_rows ) && ( lb_cols == 1 ) ) || ( ( lb_rows == 0 ) && ( lb_cols == 0 ) ) ) )
366 {
367 Scierror( 223,"ERROR (qpOASES): Dimension mismatch!\n" );
368 return 0;
369 }
370
371 GetRhsVar( 4,"d", &ub_rows,&ub_cols,&ub);
372 if ( !( ( ( ub_rows == H_rows ) && ( ub_cols == 1 ) ) || ( ( ub_rows == 0 ) && ( ub_cols == 0 ) ) ) )
373 {
374 Scierror( 224,"ERROR (qpOASES): Dimension mismatch!\n" );
375 return 0;
376 }
377
378 GetRhsVar( 5,"i", &nWSR_rows,&nWSR_cols,&nWSR);
379 if ( ( nWSR_rows != nWSR_cols ) || ( nWSR_cols != 1 ) )
380 {
381 Scierror( 225,"ERROR (qpOASES): Dimension mismatch!\n" );
382 return 0;
383 }
384
385
386 CreateVar( 9,"d", &H_rows,&one,&x );
387 CreateVar( 10,"d", &one,&one,&obj );
388 CreateVar( 11,"i", &one,&one,&status );
389 CreateVar( 12,"i", &one,&one,&nWSRout );
390 CreateVar( 13,"d", &H_rows,&one,&y );
391
392
393 qpb_rowsH = H_rows;
394
395
396 /* call interfaced qpOASES routines with appropriate arguments */
397 sci_QProblemB_init( stk(H),stk(g), (lb_rows!=0) ? stk(lb) : 0, (ub_rows!=0) ? stk(ub) : 0,
398 &H_rows,istk(nWSR),
399 stk(x),stk(obj),istk(status),istk(nWSRout),stk(y)
400 );
401
402 LhsVar(1) = 9;
403 LhsVar(2) = 10;
404 LhsVar(3) = 11;
405 LhsVar(4) = 12;
406 LhsVar(5) = 13;
407
408 return 0;
409 }
410
411
412 /*
413 * i n t e r f a c e _ S Q P r o b l e m _ i n i t
414 */
interface_SQProblem_init(char * fname)415 int interface_SQProblem_init( char* fname )
416 {
417 int_t H, H_rows, H_cols;
418 int_t g, g_rows, g_cols;
419 int_t A, A_rows, A_cols;
420 int_t lb, lb_rows, lb_cols;
421 int_t ub, ub_rows, ub_cols;
422 int_t lbA, lbA_rows, lbA_cols;
423 int_t ubA, ubA_rows, ubA_cols;
424 int_t nWSR, nWSR_rows, nWSR_cols;
425
426 int_t x, obj, status, nWSRout, y;
427
428
429 int minlhs = 1, maxlhs = 5, minrhs = 8, maxrhs = 8, one = 1, y_size;
430
431 CheckRhs( minrhs,maxrhs );
432 CheckLhs( minlhs,maxlhs );
433
434
435 /* check dimensions */
436 GetRhsVar( 1,"d", &H_rows,&H_cols,&H );
437 if ( ( H_rows != H_cols ) || ( H_rows < 1 ) )
438 {
439 Scierror( 231,"ERROR (qpOASES): Dimension mismatch!\n" );
440 return 0;
441 }
442
443 GetRhsVar( 2,"d", &g_rows,&g_cols,&g );
444 if ( !( ( ( g_rows == H_rows ) && ( g_cols == 1 ) ) || ( ( g_rows == 1 ) && ( g_cols == H_rows ) ) ) )
445 {
446 Scierror( 232,"ERROR (qpOASES): Dimension mismatch!\n" );
447 return 0;
448 }
449
450 GetRhsVar( 3,"d", &A_rows,&A_cols,&A );
451 if ( ( A_cols != H_rows ) || ( A_rows < 1 ) )
452 {
453 Scierror( 233,"ERROR (qpOASES): Dimension mismatch!\n" );
454 return 0;
455 }
456
457 GetRhsVar( 4,"d", &lb_rows,&lb_cols,&lb );
458 if ( !( ( ( lb_rows == H_rows ) && ( lb_cols == 1 ) ) || ( ( lb_rows == 0 ) && ( lb_cols == 0 ) ) ) )
459 {
460 Scierror( 234,"ERROR (qpOASES): Dimension mismatch!\n" );
461 return 0;
462 }
463
464 GetRhsVar( 5,"d", &ub_rows,&ub_cols,&ub );
465 if ( !( ( ( ub_rows == H_rows ) && ( ub_cols == 1 ) ) || ( ( ub_rows == 0 ) && ( ub_cols == 0 ) ) ) )
466 {
467 Scierror( 235,"ERROR (qpOASES): Dimension mismatch!\n" );
468 return 0;
469 }
470
471 GetRhsVar( 6,"d", &lbA_rows,&lbA_cols,&lbA );
472 if ( !( ( ( lbA_rows == A_rows ) && ( lbA_cols == 1 ) ) || ( ( lbA_rows == 0 ) && ( lbA_cols == 0 ) ) ) )
473 {
474 Scierror( 236,"ERROR (qpOASES): Dimension mismatch!\n" );
475 return 0;
476 }
477
478 GetRhsVar( 7,"d", &ubA_rows,&ubA_cols,&ubA );
479 if ( !( ( ( ubA_rows == A_rows ) && ( ubA_cols == 1 ) ) || ( ( ubA_rows == 0 ) && ( ubA_cols == 0 ) ) ) )
480 {
481 Scierror( 237,"ERROR (qpOASES): Dimension mismatch!\n" );
482 return 0;
483 }
484
485 GetRhsVar( 8,"i", &nWSR_rows,&nWSR_cols,&nWSR) ;
486 if ( ( nWSR_rows != nWSR_cols ) || ( nWSR_cols != 1 ) )
487 {
488 Scierror( 238,"ERROR (qpOASES): Dimension mismatch!\n" );
489 return 0;
490 }
491
492
493 y_size = H_rows + A_rows;
494
495 CreateVar( 9,"d", &H_rows,&one,&x );
496 CreateVar( 10,"d", &one,&one,&obj );
497 CreateVar( 11,"i", &one,&one,&status );
498 CreateVar( 12,"i", &one,&one,&nWSRout );
499 CreateVar( 13,"d", &y_size,&one,&y );
500
501
502 sqp_rowsH = H_rows;
503 sqp_rowsA = A_rows;
504
505
506 /* call interfaced qpOASES routines with appropriate arguments */
507 sci_SQProblem_init( stk(H),stk(g),stk(A), (lb_rows!=0) ? stk(lb) : 0, (ub_rows!=0) ? stk(ub) : 0, (lbA_rows!=0) ? stk(lbA) : 0, (ubA_rows!=0) ? stk(ubA) : 0,
508 &H_rows,&A_rows,istk(nWSR),
509 stk(x),stk(obj),istk(status),istk(nWSRout),stk(y)
510 );
511
512 LhsVar(1) = 9;
513 LhsVar(2) = 10;
514 LhsVar(3) = 11;
515 LhsVar(4) = 12;
516 LhsVar(5) = 13;
517
518 return 0;
519 }
520
521
522 /*
523 * i n t e r f a c e _ Q P r o b l e m _ h o t s t a r t
524 */
interface_QProblem_hotstart(char * fname)525 int interface_QProblem_hotstart( char* fname )
526 {
527 int_t g, g_rows, g_cols;
528 int_t lb, lb_rows, lb_cols;
529 int_t ub, ub_rows, ub_cols;
530 int_t lbA, lbA_rows, lbA_cols;
531 int_t ubA, ubA_rows, ubA_cols;
532 int_t nWSR, nWSR_rows, nWSR_cols;
533
534 int_t x, obj, status, nWSRout, y;
535
536
537 int minlhs = 1, maxlhs = 5, minrhs = 6, maxrhs = 6, one = 1, y_size;
538
539 CheckRhs( minrhs,maxrhs );
540 CheckLhs( minlhs,maxlhs );
541
542
543 if ( ( qp_rowsH == -1 ) || ( qp_rowsA == -1 ) )
544 {
545 Scierror( 311,"ERROR (qpOASES): Need to call qpOASES_init first!\n" );
546 return 0;
547 }
548
549 /* check dimensions */
550 GetRhsVar( 1,"d", &g_rows,&g_cols,&g );
551 if ( !( ( ( g_rows == qp_rowsH ) && ( g_cols == 1 ) ) || ( ( g_rows == 1 ) && ( g_cols == qp_rowsH ) ) ) )
552 {
553 Scierror( 312,"ERROR (qpOASES): Dimension mismatch!\n" );
554 return 0;
555 }
556
557 GetRhsVar( 2,"d", &lb_rows,&lb_cols,&lb );
558 if ( !( ( ( lb_rows == qp_rowsH ) && ( lb_cols == 1 ) ) || ( ( lb_rows == 0 ) && ( lb_cols == 0 ) ) ) )
559 {
560 Scierror( 313,"ERROR (qpOASES): Dimension mismatch!\n" );
561 return 0;
562 }
563
564 GetRhsVar( 3,"d", &ub_rows,&ub_cols,&ub );
565 if ( !( ( ( ub_rows == qp_rowsH ) && ( ub_cols == 1 ) ) || ( ( ub_rows == 0 ) && ( ub_cols == 0 ) ) ) )
566 {
567 Scierror( 314,"ERROR (qpOASES): Dimension mismatch!\n" );
568 return 0;
569 }
570
571 GetRhsVar( 4,"d", &lbA_rows,&lbA_cols,&lbA );
572 if ( !( ( ( lbA_rows == qp_rowsA ) && ( lbA_cols == 1 ) ) || ( ( lbA_rows == 0 ) && ( lbA_cols == 0 ) ) ) )
573 {
574 Scierror( 315,"ERROR (qpOASES): Dimension mismatch!\n" );
575 return 0;
576 }
577
578 GetRhsVar( 5,"d", &ubA_rows,&ubA_cols,&ubA );
579 if ( !( ( ( ubA_rows == qp_rowsA ) && ( ubA_cols == 1 ) ) || ( ( ubA_rows == 0 ) && ( ubA_cols == 0 ) ) ) )
580 {
581 Scierror( 316,"ERROR (qpOASES): Dimension mismatch!\n" );
582 return 0;
583 }
584
585 GetRhsVar( 6,"i", &nWSR_rows,&nWSR_cols,&nWSR );
586 if ( ( nWSR_rows != nWSR_cols ) || ( nWSR_cols != 1 ) )
587 {
588 Scierror( 317,"ERROR (qpOASES): Dimension mismatch!\n" );
589 return 0;
590 }
591
592
593 y_size = qp_rowsH + qp_rowsA;
594
595 CreateVar( 7,"d", &qp_rowsH,&one,&x );
596 CreateVar( 8,"d", &one,&one,&obj );
597 CreateVar( 9,"i", &one,&one,&status );
598 CreateVar( 10,"i", &one,&one,&nWSRout );
599 CreateVar( 11,"d", &y_size,&one,&y );
600
601
602 /* call interfaced qpOASES routines with appropriate arguments */
603 sci_QProblem_hotstart( stk(g), (lb_rows!=0) ? stk(lb) : 0, (ub_rows!=0) ? stk(ub) : 0, (lbA_rows!=0) ? stk(lbA) : 0, (ubA_rows!=0) ? stk(ubA) : 0,
604 istk(nWSR),
605 stk(x),stk(obj),istk(status),istk(nWSRout),stk(y)
606 );
607
608 LhsVar(1) = 7;
609 LhsVar(2) = 8;
610 LhsVar(3) = 9;
611 LhsVar(4) = 10;
612 LhsVar(5) = 11;
613
614 return 0;
615 }
616
617
618 /*
619 * i n t e r f a c e _ Q P r o b l e m B _ h o t s t a r t
620 */
interface_QProblemB_hotstart(char * fname)621 int interface_QProblemB_hotstart( char* fname )
622 {
623 int_t g, g_rows, g_cols;
624 int_t lb, lb_rows, lb_cols;
625 int_t ub, ub_rows, ub_cols;
626 int_t nWSR, nWSR_rows, nWSR_cols;
627
628 int_t x, obj, status, nWSRout, y;
629
630
631 int minlhs = 1, maxlhs = 5, minrhs = 4, maxrhs = 4, one = 1;
632
633 CheckRhs( minrhs,maxrhs );
634 CheckLhs( minlhs,maxlhs );
635
636
637 if ( qpb_rowsH == -1 )
638 {
639 Scierror( 321,"ERROR (qpOASES): Need to call qpOASES_initSB first!\n" );
640 return 0;
641 }
642
643 /* check dimensions */
644 GetRhsVar( 1,"d", &g_rows,&g_cols,&g );
645 if ( !( ( ( g_rows == qpb_rowsH ) && ( g_cols == 1 ) ) || ( ( g_rows == 1 ) && ( g_cols == qpb_rowsH ) ) ) )
646 {
647 Scierror( 322,"ERROR (qpOASES): Dimension mismatch!\n" );
648 return 0;
649 }
650
651 GetRhsVar( 2,"d", &lb_rows,&lb_cols,&lb );
652 if ( !( ( ( lb_rows == qpb_rowsH ) && ( lb_cols == 1 ) ) || ( ( lb_rows == 0 ) && ( lb_cols == 0 ) ) ) )
653 {
654 Scierror( 323,"ERROR (qpOASES): Dimension mismatch!\n" );
655 return 0;
656 }
657
658 GetRhsVar( 3,"d", &ub_rows,&ub_cols,&ub );
659 if ( !( ( ( ub_rows == qpb_rowsH ) && ( ub_cols == 1 ) ) || ( ( ub_rows == 0 ) && ( ub_cols == 0 ) ) ) )
660 {
661 Scierror( 324,"ERROR (qpOASES): Dimension mismatch!\n" );
662 return 0;
663 }
664
665 GetRhsVar( 4,"i", &nWSR_rows,&nWSR_cols,&nWSR );
666 if ( ( nWSR_rows != nWSR_cols ) || ( nWSR_cols != 1 ) )
667 {
668 Scierror( 325,"ERROR (qpOASES): Dimension mismatch!\n" );
669 return 0;
670 }
671
672
673 CreateVar( 5,"d", &qpb_rowsH,&one,&x );
674 CreateVar( 6,"d", &one,&one,&obj );
675 CreateVar( 7,"i", &one,&one,&status );
676 CreateVar( 8,"i", &one,&one,&nWSRout );
677 CreateVar( 9,"d", &qpb_rowsH,&one,&y );
678
679
680 /* call interfaced qpOASES routines with appropriate arguments */
681 sci_QProblemB_hotstart( stk(g), (lb_rows!=0) ? stk(lb) : 0, (ub_rows!=0) ? stk(ub) : 0,
682 istk(nWSR),
683 stk(x),stk(obj),istk(status),istk(nWSRout),stk(y)
684 );
685
686 LhsVar(1) = 5;
687 LhsVar(2) = 6;
688 LhsVar(3) = 7;
689 LhsVar(4) = 8;
690 LhsVar(5) = 9;
691
692 return 0;
693 }
694
695
696 /*
697 * i n t e r f a c e _ S Q P r o b l e m _ h o t s t a r t
698 */
interface_SQProblem_hotstart(char * fname)699 int interface_SQProblem_hotstart( char* fname )
700 {
701 int_t H, H_rows, H_cols;
702 int_t g, g_rows, g_cols;
703 int_t A, A_rows, A_cols;
704 int_t lb, lb_rows, lb_cols;
705 int_t ub, ub_rows, ub_cols;
706 int_t lbA, lbA_rows, lbA_cols;
707 int_t ubA, ubA_rows, ubA_cols;
708 int_t nWSR, nWSR_rows, nWSR_cols;
709
710 int_t obj, x, y, status, nWSRout;
711
712
713 int minlhs = 1, maxlhs = 5, minrhs = 8, maxrhs = 8, one = 1, y_size;
714
715 CheckRhs( minrhs,maxrhs );
716 CheckLhs( minlhs,maxlhs );
717
718
719 if ( ( sqp_rowsH == -1 ) || ( sqp_rowsA == -1 ) )
720 {
721 Scierror( 331,"ERROR (qpOASES): Need to call qpOASES_initVM first!\n" );
722 return 0;
723 }
724
725 /* check dimensions */
726 GetRhsVar( 1,"d", &H_rows,&H_cols,&H );
727 if ( ( H_rows != H_cols ) || ( H_rows < 1 ) )
728 {
729 Scierror( 332,"ERROR (qpOASES): Dimension mismatch!\n" );
730 return 0;
731 }
732
733 GetRhsVar( 2,"d", &g_rows,&g_cols,&g );
734 if ( !( ( ( g_rows == H_rows ) && ( g_cols == 1 ) ) || ( ( g_rows == 1 ) && ( g_cols == H_rows ) ) ) )
735 {
736 Scierror( 333,"ERROR (qpOASES): Dimension mismatch!\n" );
737 return 0;
738 }
739
740 GetRhsVar( 3,"d", &A_rows,&A_cols,&A );
741 if ( ( A_cols != H_rows ) || ( A_rows < 1 ) )
742 {
743 Scierror( 334,"ERROR (qpOASES): Dimension mismatch!\n" );
744 return 0;
745 }
746
747 GetRhsVar( 4,"d", &lb_rows,&lb_cols,&lb);
748 if ( !( ( ( lb_rows == H_rows ) && ( lb_cols == 1 ) ) || ( ( lb_rows == 0 ) && ( lb_cols == 0 ) ) ) )
749 {
750 Scierror( 335,"ERROR (qpOASES): Dimension mismatch!\n" );
751 return 0;
752 }
753
754 GetRhsVar( 5,"d", &ub_rows,&ub_cols,&ub);
755 if ( !( ( ( ub_rows == H_rows ) && ( ub_cols == 1 ) ) || ( ( ub_rows == 0 ) && ( ub_cols == 0 ) ) ) )
756 {
757 Scierror( 399,"ERROR (qpOASES): Dimension mismatch!\n" );
758 return 0;
759 }
760
761 GetRhsVar( 6,"d", &lbA_rows,&lbA_cols,&lbA);
762 if ( !( ( ( lbA_rows == A_rows ) && ( lbA_cols == 1 ) ) || ( ( lbA_rows == 0 ) && ( lbA_cols == 0 ) ) ) )
763 {
764 Scierror( 336,"ERROR (qpOASES): Dimension mismatch!\n" );
765 return 0;
766 }
767
768 GetRhsVar( 7,"d", &ubA_rows,&ubA_cols,&ubA);
769 if ( !( ( ( ubA_rows == A_rows ) && ( ubA_cols == 1 ) ) || ( ( ubA_rows == 0 ) && ( ubA_cols == 0 ) ) ) )
770 {
771 Scierror( 337,"ERROR (qpOASES): Dimension mismatch!\n" );
772 return 0;
773 }
774
775 GetRhsVar( 8,"i", &nWSR_rows,&nWSR_cols,&nWSR);
776 if ( ( nWSR_rows != nWSR_cols ) || ( nWSR_cols != 1 ) )
777 {
778 Scierror( 338,"ERROR (qpOASES): Dimension mismatch!\n" );
779 return 0;
780 }
781
782 /* have matrices same dimension as last QP? */
783 if ( ( sqp_rowsH != H_rows ) || ( sqp_rowsA != A_rows ) )
784 {
785 Scierror( 339,"ERROR (qpOASES): Dimension mismatch!\n" );
786 return 0;
787 }
788
789
790 y_size = H_rows + A_rows;
791
792 CreateVar( 9,"d", &H_rows,&one,&x );
793 CreateVar( 10,"d", &one,&one,&obj );
794 CreateVar( 11,"i", &one,&one,&status );
795 CreateVar( 12,"i", &one,&one,&nWSRout );
796 CreateVar( 13,"d", &y_size,&one,&y );
797
798
799 /* call interfaced qpOASES routines with appropriate arguments */
800 sci_SQProblem_hotstart( stk(H),stk(g),stk(A), (lb_rows!=0) ? stk(lb) : 0, (ub_rows!=0) ? stk(ub) : 0, (lbA_rows!=0) ? stk(lbA) : 0, (ubA_rows!=0) ? stk(ubA) : 0,
801 istk(nWSR),
802 stk(x),stk(obj),istk(status),istk(nWSRout),stk(y)
803 );
804
805 LhsVar(1) = 9;
806 LhsVar(2) = 10;
807 LhsVar(3) = 11;
808 LhsVar(4) = 12;
809 LhsVar(5) = 13;
810
811 return 0;
812 }
813
814
815 /*
816 * i n t e r f a c e _ Q P r o b l e m _ c l e a n u p
817 */
interface_QProblem_cleanup(char * fname)818 int interface_QProblem_cleanup( char* fname )
819 {
820 const int minlhs = 0, maxlhs = 1, minrhs = 0, maxrhs = 0;
821
822 CheckRhs( minrhs,maxrhs );
823 CheckLhs( minlhs,maxlhs );
824
825 sci_QProblem_cleanup( );
826 qp_rowsH = -1;
827 qp_rowsA = -1;
828
829 return 0;
830 }
831
832
833 /*
834 * i n t e r f a c e _ Q P r o b l e m B _ c l e a n u p
835 */
interface_QProblemB_cleanup(char * fname)836 int interface_QProblemB_cleanup( char* fname )
837 {
838 const int minlhs = 0, maxlhs = 1, minrhs = 0, maxrhs = 0;
839
840 CheckRhs( minrhs,maxrhs );
841 CheckLhs( minlhs,maxlhs );
842
843 sci_QProblemB_cleanup( );
844 qpb_rowsH = -1;
845
846 return 0;
847 }
848
849
850 /*
851 * i n t e r f a c e _ S Q P r o b l e m _ c l e a n u p
852 */
interface_SQProblem_cleanup(char * fname)853 int interface_SQProblem_cleanup( char* fname )
854 {
855 const int minlhs = 0, maxlhs = 1, minrhs = 0, maxrhs = 0;
856
857 CheckRhs( minrhs,maxrhs );
858 CheckLhs( minlhs,maxlhs );
859
860 sci_SQProblem_cleanup( );
861 sqp_rowsH = -1;
862 sqp_rowsA = -1;
863
864 return 0;
865 }
866
867
868 /*
869 * q p O A S E S g a t e w a y
870 */
C2F(qpOASESgateway)871 int C2F(qpOASESgateway)( )
872 {
873 gate_function function[] = { interface_qpOASES,
874 interface_QProblem_init, interface_QProblemB_init, interface_SQProblem_init,
875 interface_QProblem_hotstart, interface_QProblemB_hotstart, interface_SQProblem_hotstart,
876 interface_QProblem_cleanup, interface_QProblemB_cleanup, interface_SQProblem_cleanup
877 };
878 char* name[] = { "qpOASES",
879 "qpOASES_init", "qpOASES_initSB", "qpOASES_initVM",
880 "qpOASES_hotstart", "qpOASES_hotstartSB", "qpOASES_hotstartVM",
881 "qpOASES_cleanup", "qpOASES_cleanupSB", "qpOASES_cleanupVM"
882 };
883
884 Rhs = Max( 0,Rhs );
885 sci_gateway( name[Fin-1],function[Fin-1] );
886
887 return 0;
888 }
889
890
891 /*
892 * end of file
893 */
894