Scippy

    SCIP

    Solving Constraint Integer Programs

    nlpi_all.c
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the program and library */
    4/* SCIP --- Solving Constraint Integer Programs */
    5/* */
    6/* Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB) */
    7/* */
    8/* Licensed under the Apache License, Version 2.0 (the "License"); */
    9/* you may not use this file except in compliance with the License. */
    10/* You may obtain a copy of the License at */
    11/* */
    12/* http://www.apache.org/licenses/LICENSE-2.0 */
    13/* */
    14/* Unless required by applicable law or agreed to in writing, software */
    15/* distributed under the License is distributed on an "AS IS" BASIS, */
    16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
    17/* See the License for the specific language governing permissions and */
    18/* limitations under the License. */
    19/* */
    20/* You should have received a copy of the Apache-2.0 license */
    21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
    22/* */
    23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    24
    25/**@file nlpi_all.c
    26 * @ingroup DEFPLUGINS_NLPI
    27 * @brief NLP interface that uses all available NLP interfaces
    28 * @author Benjamin Mueller
    29 */
    30
    31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    32
    33#include "scip/nlpi_all.h"
    34#include "scip/scip_mem.h"
    35#include "scip/scip_numerics.h"
    36#include "scip/scip_nlpi.h"
    37#include "scip/pub_message.h"
    38
    39#include <string.h>
    40
    41#define NLPI_NAME "all" /**< short concise name of solver */
    42#define NLPI_DESC "NLP interface that uses all available NLP interfaces" /**< description of solver */
    43#define NLPI_PRIORITY -3000 /**< priority of NLP solver */
    44
    45/*
    46 * Data structures
    47 */
    48
    49struct SCIP_NlpiData
    50{
    51 SCIP_NLPI** nlpis; /**< array containing all nlpis */
    52 int nnlpis; /**< total number of nlpis */
    53};
    54
    56{
    57 SCIP_NLPIPROBLEM** nlpiproblems; /**< array containing all nlpi problems */
    58 int nnlpiproblems; /**< total number of nlpi problems */
    59 int bestidx; /**< index of NLP solver with the best solution */
    60};
    61
    62#ifdef SCIP_STATISTIC
    63static int _nnlps = 0; /**< number of NLPs that have been solved */
    64#endif
    65
    66/*
    67 * Local methods
    68 */
    69
    70/*
    71 * Callback methods of NLP solver interface
    72 */
    73
    74/** copy method of NLP interface (called when SCIP copies plugins) */
    75static
    77{
    78 /* include NLPI */
    80
    81 return SCIP_OKAY; /*lint !e527*/
    82} /*lint !e715*/
    83
    84/** destructor of NLP interface to free nlpi data */
    85static
    87{
    88 assert(nlpi != NULL);
    89 assert(nlpidata != NULL);
    90 assert(*nlpidata != NULL);
    91
    92 SCIPfreeBlockMemoryArrayNull(scip, &(*nlpidata)->nlpis, (*nlpidata)->nnlpis);
    93 SCIPfreeBlockMemory(scip, nlpidata);
    94 assert(*nlpidata == NULL);
    95
    96 return SCIP_OKAY; /*lint !e527*/
    97} /*lint !e715*/
    98
    99/** creates a problem instance */
    100static
    101SCIP_DECL_NLPICREATEPROBLEM(nlpiCreateProblemAll)
    102{
    103 SCIP_NLPIDATA* data;
    104 int i;
    105
    106 assert(nlpi != NULL);
    107 assert(problem != NULL);
    108
    109 data = SCIPnlpiGetData(nlpi);
    110 assert(data != NULL);
    111
    113
    114 /* initialize problem */
    115 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(*problem)->nlpiproblems, data->nnlpis) );
    116 (*problem)->nnlpiproblems = data->nnlpis;
    117
    118 for( i = 0; i < data->nnlpis; ++i )
    119 {
    120 assert(data->nlpis[i] != NULL);
    121 SCIP_CALL( SCIPcreateNlpiProblem(scip, data->nlpis[i], &((*problem)->nlpiproblems[i]), name) );
    122 }
    123
    124 return SCIP_OKAY;
    125} /*lint !e715*/
    126
    127/** free a problem instance */
    128static
    129SCIP_DECL_NLPIFREEPROBLEM(nlpiFreeProblemAll)
    130{
    131 SCIP_NLPIDATA* data;
    132 int i;
    133
    134 assert(nlpi != NULL);
    135 assert(problem != NULL);
    136 assert(*problem != NULL);
    137
    138 data = SCIPnlpiGetData(nlpi);
    139 assert(data != NULL);
    140
    141 for( i = 0; i < data->nnlpis; ++i )
    142 {
    143 assert(data->nlpis[i] != NULL);
    144 SCIP_CALL( SCIPfreeNlpiProblem(scip, data->nlpis[i], &(*problem)->nlpiproblems[i]) );
    145 }
    146
    147 SCIPfreeBlockMemoryArrayNull(scip, &(*problem)->nlpiproblems, data->nnlpis);
    148 SCIPfreeBlockMemory(scip, problem);
    149
    150 return SCIP_OKAY;
    151} /*lint !e715*/
    152
    153/** add variables */
    154static
    156{
    157 SCIP_NLPIDATA* nlpidata;
    158 int i;
    159
    160 nlpidata = SCIPnlpiGetData(nlpi);
    161 assert(nlpidata != NULL);
    162
    163 for( i = 0; i < nlpidata->nnlpis; ++i )
    164 {
    165 assert(nlpidata->nlpis[i] != NULL);
    166 assert(problem->nlpiproblems[i] != NULL);
    167
    168 SCIP_CALL( SCIPaddNlpiVars(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], nvars, lbs, ubs, varnames) );
    169 }
    170
    171 return SCIP_OKAY;
    172} /*lint !e715*/
    173
    174
    175/** add constraints */
    176static
    177SCIP_DECL_NLPIADDCONSTRAINTS(nlpiAddConstraintsAll)
    178{
    179 SCIP_NLPIDATA* nlpidata;
    180 int i;
    181
    182 nlpidata = SCIPnlpiGetData(nlpi);
    183 assert(nlpidata != NULL);
    184
    185 for( i = 0; i < nlpidata->nnlpis; ++i )
    186 {
    187 assert(nlpidata->nlpis[i] != NULL);
    188 assert(problem->nlpiproblems[i] != NULL);
    189
    190 SCIP_CALL( SCIPaddNlpiConstraints(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], nconss, lhss, rhss,
    191 nlininds, lininds, linvals, exprs, names) );
    192 }
    193
    194 return SCIP_OKAY;
    195} /*lint !e715*/
    196
    197/** sets or overwrites objective, a minimization problem is expected */
    198static
    199SCIP_DECL_NLPISETOBJECTIVE(nlpiSetObjectiveAll)
    200{
    201 SCIP_NLPIDATA* nlpidata;
    202 int i;
    203
    204 nlpidata = SCIPnlpiGetData(nlpi);
    205 assert(nlpidata != NULL);
    206
    207 for( i = 0; i < nlpidata->nnlpis; ++i )
    208 {
    209 assert(nlpidata->nlpis[i] != NULL);
    210 assert(problem->nlpiproblems[i] != NULL);
    211
    212 SCIP_CALL( SCIPsetNlpiObjective(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], nlins, lininds, linvals, expr, constant) );
    213 }
    214
    215 return SCIP_OKAY;
    216} /*lint !e715*/
    217
    218/** change variable bounds */
    219static
    220SCIP_DECL_NLPICHGVARBOUNDS(nlpiChgVarBoundsAll)
    221{
    222 SCIP_NLPIDATA* nlpidata;
    223 int i;
    224
    225 nlpidata = SCIPnlpiGetData(nlpi);
    226 assert(nlpidata != NULL);
    227
    228 for( i = 0; i < nlpidata->nnlpis; ++i )
    229 {
    230 assert(nlpidata->nlpis[i] != NULL);
    231 assert(problem->nlpiproblems[i] != NULL);
    232
    233 SCIP_CALL( SCIPchgNlpiVarBounds(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], nvars, indices, lbs, ubs) );
    234 }
    235
    236 return SCIP_OKAY;
    237} /*lint !e715*/
    238
    239/** change constraint bounds */
    240static
    241SCIP_DECL_NLPICHGCONSSIDES(nlpiChgConsSidesAll)
    242{
    243 SCIP_NLPIDATA* nlpidata;
    244 int i;
    245
    246 nlpidata = SCIPnlpiGetData(nlpi);
    247 assert(nlpidata != NULL);
    248
    249 for( i = 0; i < nlpidata->nnlpis; ++i )
    250 {
    251 assert(nlpidata->nlpis[i] != NULL);
    252 assert(problem->nlpiproblems[i] != NULL);
    253
    254 SCIP_CALL( SCIPchgNlpiConsSides(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], nconss, indices, lhss, rhss) );
    255 }
    256
    257 return SCIP_OKAY;
    258} /*lint !e715*/
    259
    260/** delete a set of variables */
    261static
    262SCIP_DECL_NLPIDELVARSET(nlpiDelVarSetAll)
    263{
    264 SCIP_NLPIDATA* nlpidata;
    265 int* tmpdstats;
    266 int i;
    267
    268 nlpidata = SCIPnlpiGetData(nlpi);
    269 assert(nlpidata != NULL);
    270
    271 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &tmpdstats, dstatssize) );
    272
    273 for( i = 0; i < nlpidata->nnlpis; ++i )
    274 {
    275 assert(nlpidata->nlpis[i] != NULL);
    276 assert(problem->nlpiproblems[i] != NULL);
    277
    278 if( i < nlpidata->nnlpis -1 )
    279 {
    280 /* restore dstats entries */
    281 BMScopyMemoryArray(tmpdstats, dstats, dstatssize);
    282
    283 SCIP_CALL( SCIPdelNlpiVarSet(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], tmpdstats, dstatssize) );
    284 }
    285 else
    286 {
    287 /* NOTE this works only when all dstats array are the same after calling the nlpidelvarset callback
    288 * As long as all solvers use the SCIP NLPI oracle to store the NLP problem data, this is the case.
    289 * @TODO Assert that the returned dstats are all the same?
    290 */
    291 SCIP_CALL( SCIPdelNlpiVarSet(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], dstats, dstatssize) );
    292 }
    293 }
    294
    295 SCIPfreeBlockMemoryArray(scip, &tmpdstats, dstatssize);
    296
    297 return SCIP_OKAY;
    298} /*lint !e715*/
    299
    300/** delete a set of constraints */
    301static
    302SCIP_DECL_NLPIDELCONSSET( nlpiDelConstraintSetAll )
    303{
    304 SCIP_NLPIDATA* nlpidata;
    305 int* tmpdstats;
    306 int i;
    307
    308 nlpidata = SCIPnlpiGetData(nlpi);
    309 assert(nlpidata != NULL);
    310
    311 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &tmpdstats, dstatssize) );
    312
    313 for( i = 0; i < nlpidata->nnlpis; ++i )
    314 {
    315 assert(nlpidata->nlpis[i] != NULL);
    316 assert(problem->nlpiproblems[i] != NULL);
    317
    318 if( i < nlpidata->nnlpis - 1 )
    319 {
    320 /* restore dstats entries */
    321 BMScopyMemoryArray(tmpdstats, dstats, dstatssize);
    322
    323 SCIP_CALL( SCIPdelNlpiConsSet(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], tmpdstats, dstatssize) );
    324 }
    325 else
    326 {
    327 /* NOTE this works only when all dstats array are the same after calling the nlpidelconsset callback
    328 * As long as all solvers use the SCIP NLPI oracle to store the NLP problem data, this is the case.
    329 * @TODO Assert that the returned dstats are all the same?
    330 */
    331 SCIP_CALL( SCIPdelNlpiConsSet(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], dstats, dstatssize) );
    332 }
    333 }
    334
    335 SCIPfreeBlockMemoryArray(scip, &tmpdstats, dstatssize);
    336
    337 return SCIP_OKAY;
    338} /*lint !e715*/
    339
    340/** changes (or adds) linear coefficients in a constraint or objective */
    341static
    342SCIP_DECL_NLPICHGLINEARCOEFS(nlpiChgLinearCoefsAll)
    343{
    344 SCIP_NLPIDATA* nlpidata;
    345 int i;
    346
    347 nlpidata = SCIPnlpiGetData(nlpi);
    348 assert(nlpidata != NULL);
    349
    350 for( i = 0; i < nlpidata->nnlpis; ++i )
    351 {
    352 assert(nlpidata->nlpis[i] != NULL);
    353 assert(problem->nlpiproblems[i] != NULL);
    354
    355 SCIP_CALL( SCIPchgNlpiLinearCoefs(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], idx, nvals, varidxs, vals) );
    356 }
    357
    358 return SCIP_OKAY;
    359} /*lint !e715*/
    360
    361/** replaces the expression of a constraint or objective */
    362static
    364{
    365 SCIP_NLPIDATA* nlpidata;
    366 int i;
    367
    368 nlpidata = SCIPnlpiGetData(nlpi);
    369 assert(nlpidata != NULL);
    370
    371 for( i = 0; i < nlpidata->nnlpis; ++i )
    372 {
    373 assert(nlpidata->nlpis[i] != NULL);
    374 assert(problem->nlpiproblems[i] != NULL);
    375
    376 SCIP_CALL( SCIPchgNlpiExpr(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], idxcons, expr) );
    377 }
    378
    379 return SCIP_OKAY;
    380} /*lint !e715*/
    381
    382/** change the constant offset in the objective */
    383static
    384SCIP_DECL_NLPICHGOBJCONSTANT(nlpiChgObjConstantAll)
    385{
    386 SCIP_NLPIDATA* nlpidata;
    387 int i;
    388
    389 nlpidata = SCIPnlpiGetData(nlpi);
    390 assert(nlpidata != NULL);
    391
    392 for( i = 0; i < nlpidata->nnlpis; ++i )
    393 {
    394 assert(nlpidata->nlpis[i] != NULL);
    395 assert(problem->nlpiproblems[i] != NULL);
    396
    397 SCIP_CALL( SCIPchgNlpiObjConstant(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], objconstant) );
    398 }
    399
    400 return SCIP_OKAY;
    401} /*lint !e715*/
    402
    403/** sets initial guess for primal variables */
    404static
    405SCIP_DECL_NLPISETINITIALGUESS(nlpiSetInitialGuessAll)
    406{
    407 SCIP_NLPIDATA* nlpidata;
    408 int i;
    409
    410 nlpidata = SCIPnlpiGetData(nlpi);
    411 assert(nlpidata != NULL);
    412
    413 for( i = 0; i < nlpidata->nnlpis; ++i )
    414 {
    415 assert(nlpidata->nlpis[i] != NULL);
    416 assert(problem->nlpiproblems[i] != NULL);
    417
    418 SCIP_CALL( SCIPsetNlpiInitialGuess(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], primalvalues, consdualvalues,
    419 varlbdualvalues, varubdualvalues) );
    420 }
    421
    422 return SCIP_OKAY;
    423} /*lint !e715*/
    424
    425/** tries to solve NLP */
    426static
    428{
    429 SCIP_NLPIDATA* nlpidata;
    430 SCIP_NLPTERMSTAT besttermstat;
    431 SCIP_NLPSOLSTAT bestsolstat;
    432 SCIP_Real bestsolval;
    433 int i;
    434
    435 nlpidata = SCIPnlpiGetData(nlpi);
    436 assert(nlpidata != NULL);
    437
    438 /* use first solver per default */
    439 problem->bestidx = 0;
    440
    441 /* initialize best solution values */
    442 besttermstat = SCIP_NLPTERMSTAT_OTHER;
    443 bestsolstat = SCIP_NLPSOLSTAT_UNKNOWN;
    444 bestsolval = SCIPinfinity(scip);
    445
    446 for( i = 0; i < nlpidata->nnlpis; ++i )
    447 {
    448 SCIP_NLPTERMSTAT termstat;
    449 SCIP_NLPSOLSTAT solstat;
    450 SCIP_Real solval;
    451 SCIP_Bool update;
    452
    453 assert(nlpidata->nlpis[i] != NULL);
    454 assert(problem->nlpiproblems[i] != NULL);
    455
    456 /* solve NLP */
    457 SCIP_CALL( SCIPsolveNlpiParam(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], param) );
    458
    459 termstat = SCIPgetNlpiTermstat(scip, nlpidata->nlpis[i], problem->nlpiproblems[i]);
    460 solstat = SCIPgetNlpiSolstat(scip, nlpidata->nlpis[i], problem->nlpiproblems[i]);
    461 solval = SCIPinfinity(scip);
    462 update = FALSE;
    463
    464 /* collect solution value */
    465 if( solstat <= SCIP_NLPSOLSTAT_FEASIBLE )
    466 {
    467 SCIP_CALL( SCIPgetNlpiSolution(scip, nlpidata->nlpis[i], problem->nlpiproblems[i],
    468 NULL, NULL, NULL, NULL, &solval) );
    469 assert(!SCIPisInfinity(scip, solval));
    470 }
    471
    472 /* better termination status -> update best solver */
    473 if( termstat < besttermstat )
    474 update = TRUE;
    475
    476 /* no feasible solutions have been found so far -> update best solver */
    477 else if( bestsolstat >= SCIP_NLPSOLSTAT_LOCINFEASIBLE && solstat <= SCIP_NLPSOLSTAT_LOCINFEASIBLE )
    478 update = TRUE;
    479
    480 /* use solver with the better solution value */
    481 else if( solval < bestsolval )
    482 update = TRUE;
    483
    484 /* update best solver */
    485 if( update )
    486 {
    487 besttermstat = termstat;
    488 bestsolstat = solstat;
    489 bestsolval = solval;
    490 problem->bestidx = i;
    491 }
    492
    493#ifdef SCIP_STATISTIC
    494 {
    495 SCIP_NLPSTATISTICS stats;
    496
    497 SCIP_CALL( SCIPgetNlpiStatistics(scip, nlpidata->nlpis[i], problem->nlpiproblems[i], &stats) );
    498
    499 SCIPstatisticMessage("%d solver %s termstat %d solstat %d solval %e iters %d time %g\n",
    500 _nnlps, SCIPnlpiGetName(nlpidata->nlpis[i]), termstat, solstat, solval,
    501 stats.niterations, stats.totaltime);
    502 }
    503#endif
    504
    505 /* don't try more NLP solvers if allowed time is exceeded or SCIP is asked to interrupt */
    506 if( termstat == SCIP_NLPTERMSTAT_TIMELIMIT || termstat == SCIP_NLPTERMSTAT_INTERRUPT )
    507 break;
    508 }
    509
    510#ifdef SCIP_STATISTIC
    511 ++_nnlps;
    512#endif
    513
    514 return SCIP_OKAY;
    515} /*lint !e715*/
    516
    517/** gives solution status */
    518static
    519SCIP_DECL_NLPIGETSOLSTAT(nlpiGetSolstatAll)
    520{
    521 SCIP_NLPIDATA* nlpidata;
    522
    523 nlpidata = SCIPnlpiGetData(nlpi);
    524 assert(nlpidata != NULL);
    525 assert(nlpidata->nlpis != NULL);
    526 assert(nlpidata->nlpis[problem->bestidx] != NULL);
    527 assert(problem->nlpiproblems != NULL);
    528 assert(problem->nlpiproblems[problem->bestidx] != NULL);
    529
    530 /* return the solution status of the first nlpi */
    531 return SCIPgetNlpiSolstat(scip, nlpidata->nlpis[problem->bestidx], problem->nlpiproblems[problem->bestidx]);
    532}
    533
    534/** gives termination reason */
    535static
    536SCIP_DECL_NLPIGETTERMSTAT(nlpiGetTermstatAll)
    537{
    538 SCIP_NLPIDATA* nlpidata;
    539
    540 nlpidata = SCIPnlpiGetData(nlpi);
    541 assert(nlpidata != NULL);
    542 assert(nlpidata->nlpis != NULL);
    543 assert(nlpidata->nlpis[problem->bestidx] != NULL);
    544 assert(problem->nlpiproblems != NULL);
    545 assert(problem->nlpiproblems[problem->bestidx] != NULL);
    546
    547 /* return the solution status of the first nlpi */
    548 return SCIPgetNlpiTermstat(scip, nlpidata->nlpis[problem->bestidx], problem->nlpiproblems[problem->bestidx]);
    549}
    550
    551/** gives primal and dual solution values */
    552static
    553SCIP_DECL_NLPIGETSOLUTION(nlpiGetSolutionAll)
    554{
    555 SCIP_NLPIDATA* nlpidata;
    556
    557 nlpidata = SCIPnlpiGetData(nlpi);
    558 assert(nlpidata != NULL);
    559 assert(nlpidata->nlpis != NULL);
    560 assert(nlpidata->nlpis[problem->bestidx] != NULL);
    561 assert(problem->nlpiproblems != NULL);
    562 assert(problem->nlpiproblems[problem->bestidx] != NULL);
    563
    564 /* return the solution status of the first nlpi */
    565 SCIP_CALL( SCIPgetNlpiSolution(scip, nlpidata->nlpis[problem->bestidx], problem->nlpiproblems[problem->bestidx],
    566 primalvalues, consdualvalues, varlbdualvalues, varubdualvalues, objval) );
    567
    568 return SCIP_OKAY;
    569}
    570
    571/** gives solve statistics */
    572static
    573SCIP_DECL_NLPIGETSTATISTICS(nlpiGetStatisticsAll)
    574{
    575 SCIP_NLPIDATA* nlpidata;
    576
    577 nlpidata = SCIPnlpiGetData(nlpi);
    578 assert(nlpidata != NULL);
    579 assert(nlpidata->nlpis != NULL);
    580 assert(nlpidata->nlpis[problem->bestidx] != NULL);
    581 assert(problem->nlpiproblems != NULL);
    582 assert(problem->nlpiproblems[problem->bestidx] != NULL);
    583
    584 /* collect statistics of the first solver */
    585 SCIP_CALL( SCIPgetNlpiStatistics(scip, nlpidata->nlpis[problem->bestidx], problem->nlpiproblems[problem->bestidx],
    586 statistics) );
    587
    588 return SCIP_OKAY;
    589} /*lint !e715*/
    590
    591/*
    592 * NLP solver interface specific interface methods
    593 */
    594
    595/** create solver interface for the solver "All" and includes it into SCIP, if at least 2 NLPIs have already been included
    596 *
    597 * This method should be called after all other NLP solver interfaces have been included.
    598 */
    600 SCIP* scip /**< SCIP data structure */
    601 )
    602{
    603 SCIP_NLPIDATA* nlpidata;
    604 int i;
    605
    606 assert(scip != NULL);
    607
    608 /* the number of NLPIs so far must be >= 2 */
    609 if( SCIPgetNNlpis(scip) < 2 )
    610 return SCIP_OKAY;
    611
    612 /* create all solver interface data */
    614
    615 nlpidata->nnlpis = SCIPgetNNlpis(scip);
    616 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &nlpidata->nlpis, nlpidata->nnlpis) );
    617
    618 /* copy nlpi pointers TODO should not need that */
    619 for( i = 0; i < nlpidata->nnlpis; ++i )
    620 nlpidata->nlpis[i] = SCIPgetNlpis(scip)[i];
    621
    622 /* create solver interface */
    625 nlpiCopyAll, nlpiFreeAll, NULL,
    626 nlpiCreateProblemAll, nlpiFreeProblemAll, NULL,
    627 nlpiAddVarsAll, nlpiAddConstraintsAll, nlpiSetObjectiveAll,
    628 nlpiChgVarBoundsAll, nlpiChgConsSidesAll, nlpiDelVarSetAll, nlpiDelConstraintSetAll,
    629 nlpiChgLinearCoefsAll, nlpiChgExprAll,
    630 nlpiChgObjConstantAll, nlpiSetInitialGuessAll, nlpiSolveAll, nlpiGetSolstatAll, nlpiGetTermstatAll,
    631 nlpiGetSolutionAll, nlpiGetStatisticsAll,
    632 nlpidata) );
    633
    634 return SCIP_OKAY;
    635}
    #define NULL
    Definition: def.h:248
    #define SCIP_Bool
    Definition: def.h:91
    #define SCIP_Real
    Definition: def.h:156
    #define TRUE
    Definition: def.h:93
    #define FALSE
    Definition: def.h:94
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_RETCODE SCIPincludeNlpSolverAll(SCIP *scip)
    Definition: nlpi_all.c:599
    #define SCIPfreeBlockMemoryArray(scip, ptr, num)
    Definition: scip_mem.h:110
    #define SCIPallocClearBlockMemory(scip, ptr)
    Definition: scip_mem.h:91
    #define SCIPallocBlockMemoryArray(scip, ptr, num)
    Definition: scip_mem.h:93
    #define SCIPfreeBlockMemory(scip, ptr)
    Definition: scip_mem.h:108
    #define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
    Definition: scip_mem.h:111
    SCIP_RETCODE SCIPincludeNlpi(SCIP *scip, const char *name, const char *description, int priority, SCIP_DECL_NLPICOPY((*nlpicopy)), SCIP_DECL_NLPIFREE((*nlpifree)), SCIP_DECL_NLPIGETSOLVERPOINTER((*nlpigetsolverpointer)), SCIP_DECL_NLPICREATEPROBLEM((*nlpicreateproblem)), SCIP_DECL_NLPIFREEPROBLEM((*nlpifreeproblem)), SCIP_DECL_NLPIGETPROBLEMPOINTER((*nlpigetproblempointer)), SCIP_DECL_NLPIADDVARS((*nlpiaddvars)), SCIP_DECL_NLPIADDCONSTRAINTS((*nlpiaddconstraints)), SCIP_DECL_NLPISETOBJECTIVE((*nlpisetobjective)), SCIP_DECL_NLPICHGVARBOUNDS((*nlpichgvarbounds)), SCIP_DECL_NLPICHGCONSSIDES((*nlpichgconssides)), SCIP_DECL_NLPIDELVARSET((*nlpidelvarset)), SCIP_DECL_NLPIDELCONSSET((*nlpidelconsset)), SCIP_DECL_NLPICHGLINEARCOEFS((*nlpichglinearcoefs)), SCIP_DECL_NLPICHGEXPR((*nlpichgexpr)), SCIP_DECL_NLPICHGOBJCONSTANT((*nlpichgobjconstant)), SCIP_DECL_NLPISETINITIALGUESS((*nlpisetinitialguess)), SCIP_DECL_NLPISOLVE((*nlpisolve)), SCIP_DECL_NLPIGETSOLSTAT((*nlpigetsolstat)), SCIP_DECL_NLPIGETTERMSTAT((*nlpigettermstat)), SCIP_DECL_NLPIGETSOLUTION((*nlpigetsolution)), SCIP_DECL_NLPIGETSTATISTICS((*nlpigetstatistics)), SCIP_NLPIDATA *nlpidata)
    Definition: scip_nlpi.c:113
    SCIP_NLPIDATA * SCIPnlpiGetData(SCIP_NLPI *nlpi)
    Definition: nlpi.c:712
    const char * SCIPnlpiGetName(SCIP_NLPI *nlpi)
    Definition: nlpi.c:722
    int SCIPgetNNlpis(SCIP *scip)
    Definition: scip_nlpi.c:205
    SCIP_NLPI ** SCIPgetNlpis(SCIP *scip)
    Definition: scip_nlpi.c:192
    SCIP_Real SCIPinfinity(SCIP *scip)
    SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
    #define BMScopyMemoryArray(ptr, source, num)
    Definition: memory.h:134
    static SCIP_DECL_NLPICOPY(nlpiCopyAll)
    Definition: nlpi_all.c:76
    #define NLPI_PRIORITY
    Definition: nlpi_all.c:43
    static SCIP_DECL_NLPISOLVE(nlpiSolveAll)
    Definition: nlpi_all.c:427
    static SCIP_DECL_NLPIGETSOLSTAT(nlpiGetSolstatAll)
    Definition: nlpi_all.c:519
    static SCIP_DECL_NLPIGETSOLUTION(nlpiGetSolutionAll)
    Definition: nlpi_all.c:553
    static SCIP_DECL_NLPICHGOBJCONSTANT(nlpiChgObjConstantAll)
    Definition: nlpi_all.c:384
    static SCIP_DECL_NLPICHGVARBOUNDS(nlpiChgVarBoundsAll)
    Definition: nlpi_all.c:220
    static SCIP_DECL_NLPISETOBJECTIVE(nlpiSetObjectiveAll)
    Definition: nlpi_all.c:199
    static SCIP_DECL_NLPICREATEPROBLEM(nlpiCreateProblemAll)
    Definition: nlpi_all.c:101
    static SCIP_DECL_NLPICHGCONSSIDES(nlpiChgConsSidesAll)
    Definition: nlpi_all.c:241
    static SCIP_DECL_NLPIGETSTATISTICS(nlpiGetStatisticsAll)
    Definition: nlpi_all.c:573
    #define NLPI_NAME
    Definition: nlpi_all.c:41
    static SCIP_DECL_NLPISETINITIALGUESS(nlpiSetInitialGuessAll)
    Definition: nlpi_all.c:405
    static SCIP_DECL_NLPICHGEXPR(nlpiChgExprAll)
    Definition: nlpi_all.c:363
    static SCIP_DECL_NLPIDELVARSET(nlpiDelVarSetAll)
    Definition: nlpi_all.c:262
    static SCIP_DECL_NLPIFREE(nlpiFreeAll)
    Definition: nlpi_all.c:86
    static SCIP_DECL_NLPIADDVARS(nlpiAddVarsAll)
    Definition: nlpi_all.c:155
    static SCIP_DECL_NLPIADDCONSTRAINTS(nlpiAddConstraintsAll)
    Definition: nlpi_all.c:177
    static SCIP_DECL_NLPICHGLINEARCOEFS(nlpiChgLinearCoefsAll)
    Definition: nlpi_all.c:342
    static SCIP_DECL_NLPIFREEPROBLEM(nlpiFreeProblemAll)
    Definition: nlpi_all.c:129
    static SCIP_DECL_NLPIGETTERMSTAT(nlpiGetTermstatAll)
    Definition: nlpi_all.c:536
    #define NLPI_DESC
    Definition: nlpi_all.c:42
    static SCIP_DECL_NLPIDELCONSSET(nlpiDelConstraintSetAll)
    Definition: nlpi_all.c:302
    NLP interface that uses all available NLP interfaces.
    public methods for message output
    #define SCIPstatisticMessage
    Definition: pub_message.h:123
    public methods for memory management
    public methods for NLPI solver interfaces
    public methods for numerical tolerances
    SCIP_Real totaltime
    Definition: type_nlpi.h:190
    SCIP_NLPIPROBLEM ** nlpiproblems
    Definition: nlpi_all.c:57
    enum SCIP_NlpSolStat SCIP_NLPSOLSTAT
    Definition: type_nlpi.h:168
    @ SCIP_NLPTERMSTAT_TIMELIMIT
    Definition: type_nlpi.h:174
    @ SCIP_NLPTERMSTAT_OTHER
    Definition: type_nlpi.h:182
    @ SCIP_NLPTERMSTAT_INTERRUPT
    Definition: type_nlpi.h:177
    @ SCIP_NLPSOLSTAT_LOCINFEASIBLE
    Definition: type_nlpi.h:163
    @ SCIP_NLPSOLSTAT_FEASIBLE
    Definition: type_nlpi.h:162
    @ SCIP_NLPSOLSTAT_UNKNOWN
    Definition: type_nlpi.h:166
    enum SCIP_NlpTermStat SCIP_NLPTERMSTAT
    Definition: type_nlpi.h:184
    struct SCIP_NlpiData SCIP_NLPIDATA
    Definition: type_nlpi.h:52
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63