39#define STRONGBRANCH_RESTOREBASIS
47#include "scip/config.h"
50#ifdef SCIP_WITH_LPSCHECK
53#define CHECK_SPXSOLVE true
54#define CHECK_SPXSTRONGBRANCH true
56#define EXIT_AT_WRONG_RESULT false
57#define EXIT_AT_CPXERROR false
59#define CPX_CALL(x) do \
62 if( (_cpxstat_ = (x)) != 0 ) \
64 SCIPmessagePrintWarning(_messagehdlr, "CPLEX error <%d>; SoPlex result unchecked\n", _cpxstat_); \
65 if( EXIT_AT_CPXERROR ) \
79#define CHECK_SOPLEX_PARAM(x) \
82 SCIPmessagePrintWarning(_messagehdlr, "SoPlex: unsupported parameter value\n"); \
93#pragma GCC visibility push(default)
94#pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
101#ifndef SOPLEX_SUBVERSION
102#define SOPLEX_SUBVERSION 0
105#ifndef SOPLEX_APIVERSION
106#define SOPLEX_APIVERSION 0
110#if (SOPLEX_VERSION < 200 || (SOPLEX_VERSION == 200 && SOPLEX_SUBVERSION < 2) || (SOPLEX_VERSION > 200 && SOPLEX_VERSION < 201))
111#error "This interface is not compatible with SoPlex versions prior to 2.0.0.2"
114#if (SOPLEX_APIVERSION <= 5)
115#include "spxgithash.h"
126#if defined(_MSC_VER) && _MSC_VER < 1900
128#define snprintf _snprintf
132#define SOPLEX_VERBLEVEL 5
145using namespace soplex;
153#define SOPLEX_TRY(messagehdlr, x) do \
159 catch( const SPxMemoryException& E ) \
161 std::string s = E.what(); \
162 SCIPerrorMessage("SoPlex threw a memory exception: %s\n", s.c_str()); \
165 catch( const SPxException& E ) \
167 std::string s = E.what(); \
168 SCIPmessagePrintWarning((messagehdlr), "SoPlex threw an exception: %s\n", s.c_str()); \
169 return SCIP_LPERROR; \
175#define SOPLEX_TRY(messagehdlr, x) do \
181 catch( const SPxMemoryException& E ) \
183 std::string s = E.what(); \
184 SCIPerrorMessage("SoPlex threw a memory exception: %s\n", s.c_str()); \
187 catch( const SPxException& ) \
189 return SCIP_LPERROR; \
198#define SOPLEX_TRY_ABORT(x) do \
204 catch( const SPxException& E ) \
206 std::string s = E.what(); \
207 SCIPerrorMessage("SoPlex threw an exception: %s\n", s.c_str()); \
216class SPxSCIP :
public SoPlex
222 DataArray<SPxSolver::VarStatus> _colStat;
223 DataArray<SPxSolver::VarStatus> _rowStat;
224#ifdef SCIP_WITH_LPSCHECK
235 const char* probname =
NULL
242 _messagehdlr(messagehdlr)
244 if ( probname !=
NULL )
247#if SOPLEX_APIVERSION >= 2
248 (void)setBoolParam(SoPlex::ENSURERAY,
true);
251#ifdef SCIP_WITH_LPSCHECK
254 _doublecheck =
false;
255 _cpxenv = CPXopenCPLEX(&cpxstat);
256 assert(_cpxenv !=
NULL);
257 _cpxlp = CPXcreateprob(_cpxenv, &cpxstat, probname !=
NULL ? probname :
"spxcheck");
258 (void) CPXsetintparam(_cpxenv, CPX_PARAM_SCRIND, 0);
264 if( _probname !=
NULL )
267 freePreStrongbranchingBasis();
269#ifdef SCIP_WITH_LPSCHECK
270 (void) CPXfreeprob(_cpxenv, &_cpxlp);
271 (void) CPXcloseCPLEX(&_cpxenv);
293 return realParam(OPTTOL);
305 Real getObjLimit()
const
307 return (intParam(SoPlex::OBJSENSE) == SoPlex::OBJSENSE_MINIMIZE)
308 ? realParam(SoPlex::OBJLIMIT_UPPER)
309 : realParam(SoPlex::OBJLIMIT_LOWER);
313 bool getFromScratch()
const
318 void setFromScratch(
bool fs)
323 void setInterrupt(
bool interrupt)
325 _interrupt = interrupt;
334 bool getLpInfo()
const
339 void setLpInfo(
bool lpinfo)
345 void setProbname(
const char* probname)
349 assert(probname !=
NULL);
350 if( _probname !=
NULL )
353 len = strlen(probname);
354 spx_alloc(_probname, len + 1);
355 memcpy(_probname, probname, len + 1);
358 void setRep(SPxSolver::Representation p_rep)
360 if( p_rep == SPxSolver::COLUMN && intParam(REPRESENTATION) == REPRESENTATION_ROW )
365 else if( (p_rep == SPxSolver::ROW && intParam(REPRESENTATION) == REPRESENTATION_COLUMN) )
372#ifdef SCIP_WITH_LPSCHECK
373 bool getDoubleCheck()
376 return _doublecheck && _checknum + 1 >= CHECK_START;
379 void setDoubleCheck(
bool dc)
384 const char* spxStatusString(
const SPxSolver::Status stat)
const
388 case SPxSolver::ABORT_TIME:
390 case SPxSolver::ABORT_ITER:
392 case SPxSolver::ABORT_VALUE:
393 return "ABORT_VALUE";
394 case SPxSolver::SINGULAR:
396 case SPxSolver::REGULAR:
400 case SPxSolver::OPTIMAL:
402#if SOPLEX_APIVERSION >= 3
403 case SPxSolver::OPTIMAL_UNSCALED_VIOLATIONS:
404 return "OPTIMAL_UNSCALED_VIOLATIONS";
406 case SPxSolver::UNBOUNDED:
408 case SPxSolver::INFEASIBLE:
415 const char* cpxStatusString(
const int stat)
const
419 case CPX_STAT_ABORT_TIME_LIM:
421 case CPX_STAT_ABORT_IT_LIM:
423 case CPX_STAT_ABORT_OBJ_LIM:
424 return "ABORT_VALUE";
425 case CPX_STAT_OPTIMAL:
427 case CPX_STAT_OPTIMAL_INFEAS:
428 return "CPX_STAT_OPTIMAL_INFEAS: OPT SOL INFEASIBLE AFTER UNSCALING";
429 case CPX_STAT_UNBOUNDED:
431 case CPX_STAT_INFEASIBLE:
433 case CPX_STAT_INForUNBD:
434 return "INFEASIBLE or UNBOUNDED";
435 case CPX_STAT_NUM_BEST:
436 return "CPX_STAT_NUM_BEST: SOL AVAILABLE BUT NOT PROVEN OPTIMAL DUE TO NUM TROUBLE";
444 bool checkConsistentBounds()
const
446 for(
int i = 0; i < numColsReal(); ++i )
448 if( lowerReal(i) > upperReal(i) + realParam(SoPlex::EPSILON_ZERO) )
450 SCIPerrorMessage(
"inconsistent bounds on column %d: lower=%.17g, upper=%.17g\n",
451 i, lowerReal(i), upperReal(i));
459 bool checkConsistentSides()
const
461 for(
int i = 0; i < numRowsReal(); ++i )
463 if( lhsReal(i) > rhsReal(i) + realParam(SoPlex::EPSILON_ZERO) )
466 i, lhsReal(i), rhsReal(i));
475 void trySolve(
bool printwarning =
true)
482#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
483#if SOPLEX_APIVERSION > 11
492 catch(
const SPxException&
x)
494 std::string s =
x.what();
504 assert(status() != SPxSolver::OPTIMAL);
507 assert(intParam(ITERLIMIT) < 0 || numIterations() <= intParam(ITERLIMIT));
510 timespent = solveTime();
514 timelimit = realParam(TIMELIMIT);
515 if( timelimit > timespent )
516 timelimit -= timespent;
520 assert(timelimit >= 0);
525 SPxSolver::Status doSolve(
bool printwarning =
true)
527 SPxOut::Verbosity verbosity;
529 SPxSolver::Status spxStatus;
532 verbosity = spxout.getVerbosity();
533 spxout.setVerbosity((SPxOut::Verbosity)(getLpInfo() ?
SOPLEX_VERBLEVEL : 0));
535 assert(checkConsistentBounds());
536 assert(checkConsistentSides());
538#ifdef SCIP_WITH_LPSCHECK
540 if( getDoubleCheck() )
541 writeStateReal(
"spxcheck",
NULL,
NULL);
544 trySolve(printwarning);
545 spxStatus = status();
550#ifdef SCIP_WITH_LPSCHECK
551 bool minimize = intParam(OBJSENSE) == OBJSENSE_MINIMIZE;
552 Real objLimitUpper = realParam(OBJLIMIT_UPPER);
553 Real objLimitLower = realParam(OBJLIMIT_LOWER);
556 if( getDoubleCheck() && (spxStatus == SPxSolver::OPTIMAL || spxStatus == SPxSolver::UNBOUNDED || spxStatus == SPxSolver::INFEASIBLE || spxStatus == SPxSolver::ABORT_VALUE) )
562 CPX_CALL( CPXreadcopyprob(_cpxenv, _cpxlp,
"spxcheck.mps",
NULL) );
563 CPX_CALL( CPXreadcopybase(_cpxenv, _cpxlp,
"spxcheck.bas") );
566 CPX_CALL( CPXsetdblparam(_cpxenv, CPX_PARAM_EPOPT,
MAX(opttol(), 1e-9)) );
567 CPX_CALL( CPXsetdblparam(_cpxenv, CPX_PARAM_EPRHS,
MAX(feastol(), 1e-9)) );
570 CPX_CALL( CPXlpopt(_cpxenv, _cpxlp) );
573 CPX_CALL( CPXsolution(_cpxenv, _cpxlp, &cpxstat, &cpxobj,
NULL,
NULL,
NULL,
NULL) );
578 if( cpxstat == CPX_STAT_OPTIMAL_INFEAS )
580 SCIPerrorMessage(
"In %s: SoPlex status=%d (%s) while CPLEX status=%d (%s)\n",
581 _probname, spxStatus, spxStatusString(spxStatus), cpxstat, cpxStatusString(cpxstat));
582 if( EXIT_AT_CPXERROR )
585 else if( (spxStatus == SPxSolver::OPTIMAL && cpxstat != CPX_STAT_OPTIMAL)
586 || (spxStatus == SPxSolver::UNBOUNDED && cpxstat != CPX_STAT_UNBOUNDED)
587 || (spxStatus == SPxSolver::INFEASIBLE && cpxstat != CPX_STAT_INFEASIBLE) )
589 SCIPerrorMessage(
"In %s: SoPlex status=%d (%s) while CPLEX status=%d (%s) (checknum=%d)\n",
590 _probname, spxStatus, spxStatusString(spxStatus), cpxstat, cpxStatusString(cpxstat), _checknum);
591 if( EXIT_AT_WRONG_RESULT )
594 else if( spxStatus == SPxSolver::ABORT_VALUE )
598 case CPX_STAT_OPTIMAL:
599 if( (minimize && LTrel(cpxobj, objLimitUpper, 2*opttol()))
600 || (!minimize && GTrel(cpxobj, objLimitLower, 2*opttol())) )
602 SCIPerrorMessage(
"In %s: SoPlex returned status=%d (%s) while CPLEX claims obj=%.10f %s %.10f=obj.limit (%s) (checknum=%d)\n",
603 _probname, spxStatus, spxStatusString(spxStatus), cpxobj, minimize ?
"<" :
">",
604 minimize ? objLimitUpper : objLimitLower, cpxStatusString(cpxstat), _checknum);
605 if( EXIT_AT_WRONG_RESULT )
608 else if( (minimize && cpxobj < objLimitUpper) || (!minimize && cpxobj > objLimitLower) )
610 SCIPerrorMessage(
"In %s: SoPlex returned status=%d (%s) while CPLEX claims obj=%.10f %s %.10f=obj.limit (%s) (checknum=%d)\n",
611 _probname, spxStatus, spxStatusString(spxStatus), cpxobj, minimize?
"<" :
">",
612 minimize ? objLimitUpper : objLimitLower, cpxStatusString(cpxstat), _checknum);
615 case CPX_STAT_OPTIMAL_INFEAS:
616 case CPX_STAT_NUM_BEST:
617 if( (minimize && cpxobj < objLimitUpper) || (!minimize && cpxobj > objLimitLower) )
619 SCIPerrorMessage(
"In %s: SoPlex returned status=%d (%s) while CPLEX claims obj=%.10f %s %.10f=obj.limit (%s) (checknum=%d)\n",
620 _probname, spxStatus, spxStatusString(spxStatus), cpxobj, minimize ?
"<" :
">",
621 minimize ? objLimitUpper : objLimitLower, cpxStatusString(cpxstat), _checknum);
624 case CPX_STAT_INFEASIBLE:
626 case CPX_STAT_UNBOUNDED:
627 SCIPerrorMessage(
"In %s: SoPlex status=%d (%s) while CPLEX status=%d (%s) (checknum=%d)\n",
628 _probname, spxStatus, spxStatusString(spxStatus), cpxstat, cpxStatusString(cpxstat), _checknum);
629 if( EXIT_AT_WRONG_RESULT )
632 case CPX_STAT_INForUNBD:
634 SCIPerrorMessage(
"In %s: SoPlex status=%d (%s) while CPLEX status=%d (%s) (checknum=%d)\n",
635 _probname, spxStatus, spxStatusString(spxStatus), cpxstat, cpxStatusString(cpxstat), _checknum);
640 else if( spxStatus == SPxSolver::OPTIMAL )
642 if( (minimize && LTrel(objValueReal(), cpxobj, 2*opttol()))
643 || (!minimize && GTrel(objValueReal(), cpxobj, 2*opttol())) )
648 else if( (minimize && GTrel(objValueReal(), cpxobj, 2*opttol()))
649 || (!minimize && LTrel(objValueReal(), cpxobj, 2*opttol())) )
651 SCIPerrorMessage(
"In %s: LP optimal; SoPlex value=%.10f %s CPLEX value=%.10f suboptimal (checknum=%d)\n", _probname, objValueReal(),
652 minimize ?
">" :
"<", cpxobj, _checknum);
653 if( EXIT_AT_WRONG_RESULT )
663 spxout.setVerbosity(verbosity);
669 void savePreStrongbranchingBasis()
671 _rowStat.reSize(numRowsReal());
672 _colStat.reSize(numColsReal());
676 getBasis(_rowStat.get_ptr(), _colStat.get_ptr());
679 catch(
const SPxException&
x)
681 std::string s =
x.what();
688 assert(status() != SPxSolver::OPTIMAL);
691 catch(
const SPxException&)
697 void restorePreStrongbranchingBasis()
699 assert(_rowStat.size() == numRowsReal());
700 assert(_colStat.size() == numColsReal());
704 setBasis(_rowStat.get_ptr(), _colStat.get_ptr());
707 catch(
const SPxException&
x)
709 std::string s =
x.what();
712 catch(
const SPxException&)
719 assert(status() != SPxSolver::OPTIMAL);
724 void freePreStrongbranchingBasis()
731 bool preStrongbranchingBasisFreed()
const
733 return ((_rowStat.size() == 0 ) && (_colStat.size() == 0));
737 DataArray<SPxSolver::VarStatus>& rowStat()
743 DataArray<SPxSolver::VarStatus>& colStat()
761#define COLS_PER_PACKET SCIP_DUALPACKETSIZE
763#define ROWS_PER_PACKET SCIP_DUALPACKETSIZE
822 assert(num <= lpi->cstatsize);
844 assert(num <= lpi->rstatsize);
882 assert(lpistate !=
NULL);
898 assert(lpistate !=
NULL);
915 assert(lpistate !=
NULL);
916 assert(blkmem !=
NULL);
937 assert(blkmem !=
NULL);
938 assert(lpistate !=
NULL);
939 assert(*lpistate !=
NULL);
976#if (SOPLEX_SUBVERSION > 0)
977 const static char spxname[20] = {
'S',
'o',
'P',
'l',
'e',
'x',
' ', SOPLEX_VERSION/100 +
'0',
'.', (SOPLEX_VERSION % 100)/10 +
'0',
'.', SOPLEX_VERSION % 10 +
'0',
'.',
SOPLEX_SUBVERSION +
'0',
'\0'};
979 const static char spxname[20] = {
'S',
'o',
'P',
'l',
'e',
'x',
' ', SOPLEX_VERSION/100 +
'0',
'.', (SOPLEX_VERSION % 100)/10 +
'0',
'.', SOPLEX_VERSION % 10 +
'0',
'\0'};
981const static char spxdesc[200] = {
'L',
'i',
'n',
'e',
'a',
'r',
' ',
'p',
'r',
'o',
'g',
'r',
'a',
'm',
'm',
'i',
'n',
'g',
982 ' ',
's',
'o',
'l',
'v',
'e',
'r',
' ' ,
'd',
'e',
'v',
'e',
'l',
'o',
'p',
'e',
'd',
983 ' ',
'a',
't',
' ',
'Z',
'u',
's',
'e',
' ',
'I',
'n',
's',
't',
'i',
't',
'u',
't',
'e',
984 ' ',
'B',
'e',
'r',
'l',
'i',
'n',
' ',
'(',
's',
'o',
'p',
'l',
'e',
'x',
'.',
'z',
'i',
'b',
'.',
'd',
'e',
')',
985#ifdef SCIP_WITH_LPSCHECK
986 ' ',
'-',
' ',
'i',
'n',
'c',
'l',
'u',
'd',
'i',
'n',
'g',
' ',
'C',
'P',
'L',
'E',
'X',
987 ' ',
'd',
'o',
'u',
'b',
'l',
'e',
' ',
'c',
'h',
'e',
'c',
'k',
989 ' ',
'[',
'G',
'i',
't',
'H',
'a',
's',
'h',
':',
' ',
990 getGitHash()[0], getGitHash()[1], getGitHash()[2], getGitHash()[3],
991 getGitHash()[4], getGitHash()[5], getGitHash()[6], getGitHash()[7],
1019 return (
void*) lpi->
spx;
1029 assert( lpi !=
NULL );
1030 assert( ncols >= 0 );
1031 assert( ncols == 0 || intInfo !=
NULL );
1033#if (SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 3))
1034 assert(ncols == lpi->
spx->numColsReal() || (ncols == 0 && intInfo ==
NULL));
1035 lpi->
spx->setIntegralityInformation(ncols, intInfo);
1038 SCIPerrorMessage(
"SCIPlpiSetIntegralityInformation() has not been implemented yet.\n");
1087 assert(lpi !=
NULL);
1088 assert(name !=
NULL);
1095 SOPLEX_TRY( messagehdlr, (*lpi)->spx = new ((*lpi)->spx) SPxSCIP(messagehdlr, name) );
1096 (void) (*lpi)->spx->setIntParam(SoPlex::SYNCMODE, SoPlex::SYNCMODE_ONLYREAL);
1097 (void) (*lpi)->spx->setIntParam(SoPlex::SOLVEMODE, SoPlex::SOLVEMODE_REAL);
1098 (void) (*lpi)->spx->setIntParam(SoPlex::REPRESENTATION, SoPlex::REPRESENTATION_AUTO);
1101#if SOPLEX_APIVERSION >= 10
1102 (void) (*lpi)->spx->setIntParam(SoPlex::STATTIMER, 0);
1105 (*lpi)->cstat =
NULL;
1106 (*lpi)->rstat =
NULL;
1107 (*lpi)->cstatsize = 0;
1108 (*lpi)->rstatsize = 0;
1110 (*lpi)->conditionlimit = -1.0;
1111 (*lpi)->checkcondition =
FALSE;
1112 (*lpi)->messagehdlr = messagehdlr;
1123 (*lpi)->spx->setInterrupt(
FALSE);
1124 SPxOut::Verbosity verbosity = (*lpi)->spx->spxout.getVerbosity();
1125 (*lpi)->spx->spxout.setVerbosity((SPxOut::Verbosity)((*lpi)->spx->getLpInfo() ?
SOPLEX_VERBLEVEL : 0));
1126 (*lpi)->spx->printVersion();
1127 (*lpi)->spx->spxout.setVerbosity(verbosity);
1138 assert(lpi !=
NULL);
1139 assert(*lpi !=
NULL);
1140 assert((*lpi)->spx !=
NULL);
1143 (*lpi)->spx->~SPxSCIP();
1188 for( j = 0; j < nnonz; j++ )
1189 assert( val[j] != 0 );
1195 assert(lpi !=
NULL);
1197 assert(lhs !=
NULL);
1198 assert(rhs !=
NULL);
1199 assert(obj !=
NULL);
1202 assert(beg !=
NULL);
1203 assert(ind !=
NULL);
1204 assert(val !=
NULL);
1207 assert(lpi->
spx->preStrongbranchingBasisFreed());
1211 SPxSCIP* spx = lpi->
spx;
1212 LPRowSet rows(nrows);
1213 DSVector emptyVector(0);
1219 (void) spx->setIntParam(SoPlex::OBJSENSE, (objsen ==
SCIP_OBJSEN_MINIMIZE ? SoPlex::OBJSENSE_MINIMIZE : SoPlex::OBJSENSE_MAXIMIZE));
1222 for( i = 0; i < nrows; ++i )
1223 rows.add(lhs[i], emptyVector, rhs[i]);
1224 spx->addRowsReal(rows);
1230 catch(
const SPxException&
x )
1232 std::string s =
x.what();
1235 catch(
const SPxException& )
1260 assert(lpi !=
NULL);
1262 assert(obj !=
NULL);
1265 assert(nnonz == 0 || beg !=
NULL);
1266 assert(nnonz == 0 || ind !=
NULL);
1267 assert(nnonz == 0 || val !=
NULL);
1273 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1279 int nrows = lpi->
spx->numRowsReal();
1280 for (
int j = 0; j < nnonz; ++j)
1282 assert( 0 <= ind[j] && ind[j] < nrows );
1283 assert( val[j] != 0.0 );
1288 SPxSCIP* spx = lpi->
spx;
1291 LPColSet cols(ncols);
1292 DSVector colVector(ncols);
1298 for( i = 0; i < ncols; ++i )
1304 last = (i == ncols-1 ? nnonz : beg[i+1]);
1305 colVector.add( last-start, &ind[start], &val[start] );
1307 cols.add(obj[i], lb[i], colVector, ub[i]);
1309 spx->addColsReal(cols);
1312 catch(
const SPxException&
x )
1314 std::string s =
x.what();
1317 catch(
const SPxException& )
1333 assert(lpi !=
NULL);
1335 assert(firstcol >= 0);
1336 assert(lastcol < lpi->spx->numColsReal());
1337 assert(firstcol <= lastcol + 1);
1342 if( firstcol > lastcol )
1347 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1367 assert(lpi !=
NULL);
1369 assert(dstat !=
NULL);
1373 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1375 ncols = lpi->
spx->numColsReal();
1378 for( i = 0; i < ncols; ++i )
1401 assert(lpi !=
NULL);
1403 assert(lhs !=
NULL);
1404 assert(rhs !=
NULL);
1405 assert(nnonz == 0 || beg !=
NULL);
1406 assert(nnonz == 0 || ind !=
NULL);
1407 assert(nnonz == 0 || val !=
NULL);
1411 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1417 int ncols = lpi->
spx->numColsReal();
1418 for (
int j = 0; j < nnonz; ++j)
1420 assert( val[j] != 0.0 );
1421 assert( 0 <= ind[j] && ind[j] < ncols );
1428 SPxSCIP* spx = lpi->
spx;
1429 LPRowSet rows(nrows);
1436 for( i = 0; i < nrows; ++i )
1442 last = (i == nrows-1 ? nnonz : beg[i+1]);
1443 rowVector.add( last-start, &ind[start], &val[start] );
1445 rows.add(lhs[i], rowVector, rhs[i]);
1447 spx->addRowsReal(rows);
1450 catch(
const SPxException&
x )
1452 std::string s =
x.what();
1455 catch(
const SPxException& )
1471 assert(lpi !=
NULL);
1473 assert(firstrow >= 0);
1474 assert(lastrow < lpi->spx->numRowsReal());
1475 assert(firstrow <= lastrow + 1);
1480 if( firstrow > lastrow )
1485 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1505 assert(lpi !=
NULL);
1510 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1512 nrows = lpi->
spx->numRowsReal();
1515 for( i = 0; i < nrows; ++i )
1530 assert(lpi !=
NULL);
1535 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1554 assert(lpi !=
NULL);
1556 assert(ncols == 0 || (ind !=
NULL && lb !=
NULL && ub !=
NULL));
1562 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1566 for( i = 0; i < ncols; ++i )
1568 assert(0 <= ind[i] && ind[i] < lpi->
spx->numColsReal());
1572 SCIPerrorMessage(
"LP Error: fixing lower bound for variable %d to infinity.\n", ind[i]);
1577 SCIPerrorMessage(
"LP Error: fixing upper bound for variable %d to -infinity.\n", ind[i]);
1581 lpi->
spx->changeBoundsReal(ind[i], lb[i], ub[i]);
1582 assert(lpi->
spx->lowerReal(ind[i]) <= lpi->
spx->upperReal(ind[i]) + lpi->
spx->realParam(SoPlex::EPSILON_ZERO));
1586 catch(
const SPxException&
x )
1588 std::string s =
x.what();
1591 catch(
const SPxException& )
1613 assert(lpi !=
NULL);
1615 assert(ind !=
NULL);
1616 assert(lhs !=
NULL);
1617 assert(rhs !=
NULL);
1623 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1627 for( i = 0; i < nrows; ++i )
1629 assert(0 <= ind[i] && ind[i] < lpi->
spx->numRowsReal());
1630 lpi->
spx->changeRangeReal(ind[i], lhs[i], rhs[i]);
1631 assert(lpi->
spx->lhsReal(ind[i]) <= lpi->
spx->rhsReal(ind[i]) + lpi->
spx->realParam(SoPlex::EPSILON_ZERO));
1635 catch(
const SPxException&
x )
1637 std::string s =
x.what();
1640 catch(
const SPxException& )
1659 assert(lpi !=
NULL);
1661 assert(0 <= row && row < lpi->spx->numRowsReal());
1662 assert(0 <= col && col < lpi->spx->numColsReal());
1666 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1681 assert(lpi !=
NULL);
1686 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1705 assert(lpi !=
NULL);
1707 assert(ind !=
NULL);
1708 assert(obj !=
NULL);
1712 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1716 for( i = 0; i < ncols; ++i )
1718 assert(0 <= ind[i] && ind[i] < lpi->
spx->numColsReal());
1719 lpi->
spx->changeObjReal(ind[i], obj[i]);
1723 catch(
const SPxException&
x )
1725 std::string s =
x.what();
1728 catch(
const SPxException& )
1749 assert(lpi !=
NULL);
1751 assert(scaleval != 0.0);
1757 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1760#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
1761 SVector rowvec = lpi->
spx->rowVectorRealInternal(row);
1763 SVector rowvec = lpi->
spx->rowVectorReal(row);
1765 lhs = lpi->
spx->lhsReal(row);
1766 rhs = lpi->
spx->rhsReal(row);
1772 if( lhs > -lpi->
spx->realParam(SoPlex::INFTY) )
1774 else if( scaleval < 0.0 )
1775 lhs = lpi->
spx->realParam(SoPlex::INFTY);
1776 if( rhs < lpi->spx->realParam(SoPlex::INFTY) )
1778 else if( scaleval < 0.0 )
1779 rhs = -lpi->
spx->realParam(SoPlex::INFTY);
1780 if( scaleval < 0.0 )
1788 LPRow lprow(lhs, rowvec, rhs);
1791 lpi->
spx->changeRowReal(row, lprow);
1792 assert(lpi->
spx->lhsReal(row) <= lpi->
spx->rhsReal(row));
1795 catch(
const SPxException&
x )
1797 std::string s =
x.what();
1800 catch(
const SPxException& )
1824 assert(lpi !=
NULL);
1826 assert(scaleval != 0.0);
1832 assert( lpi->
spx->preStrongbranchingBasisFreed() );
1835#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
1836 SVector colvec = lpi->
spx->colVectorRealInternal(col);
1838 SVector colvec = lpi->
spx->colVectorReal(col);
1840 obj = lpi->
spx->objReal(col);
1841 lb = lpi->
spx->lowerReal(col);
1842 ub = lpi->
spx->upperReal(col);
1851 if( lb > -lpi->
spx->realParam(SoPlex::INFTY) )
1853 else if( scaleval < 0.0 )
1854 lb = lpi->
spx->realParam(SoPlex::INFTY);
1855 if( ub < lpi->spx->realParam(SoPlex::INFTY) )
1857 else if( scaleval < 0.0 )
1858 ub = -lpi->
spx->realParam(SoPlex::INFTY);
1859 if( scaleval < 0.0 )
1867 LPCol lpcol(obj, colvec, ub, lb);
1870 lpi->
spx->changeColReal(col, lpcol);
1871 assert(lpi->
spx->lowerReal(col) <= lpi->
spx->upperReal(col));
1874 catch(
const SPxException&
x )
1876 std::string s =
x.what();
1879 catch(
const SPxException& )
1908 assert(lpi !=
NULL);
1910 assert(nrows !=
NULL);
1912 *nrows = lpi->
spx->numRowsReal();
1925 assert(lpi !=
NULL);
1927 assert(ncols !=
NULL);
1929 *ncols = lpi->
spx->numColsReal();
1944 assert(lpi !=
NULL);
1946 assert(nnonz !=
NULL);
1950 if( lpi->
spx->numRowsReal() < lpi->
spx->numColsReal() )
1952 for( i = 0; i < lpi->
spx->numRowsReal(); ++i )
1954 (*nnonz) += lpi->
spx->rowVectorRealInternal(i).size();
1956 (*nnonz) += lpi->
spx->rowVectorReal(i).size();
1961 for( i = 0; i < lpi->
spx->numColsReal(); ++i )
1963 (*nnonz) += lpi->
spx->colVectorRealInternal(i).size();
1965 (*nnonz) += lpi->
spx->colVectorReal(i).size();
1991 assert(lpi !=
NULL);
1995 assert(firstcol >= 0);
1996 assert(lastcol < lpi->spx->numColsReal());
1997 assert(firstcol <= lastcol + 1);
2003#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
2004 if( lpi->
spx->boolParam(SoPlex::PERSISTENTSCALING) )
2006 DVector lbvec(lpi->
spx->numColsReal());
2007 DVector ubvec(lpi->
spx->numColsReal());
2008 lpi->
spx->getLowerReal(lbvec);
2009 lpi->
spx->getUpperReal(ubvec);
2010 for( i = firstcol; i <= lastcol; ++i )
2012 lb[i-firstcol] = lbvec[i];
2013 ub[i-firstcol] = ubvec[i];
2018 const Vector& lbvec = lpi->
spx->lowerRealInternal();
2019 const Vector& ubvec = lpi->
spx->upperRealInternal();
2020 for( i = firstcol; i <= lastcol; ++i )
2022 lb[i-firstcol] = lbvec[i];
2023 ub[i-firstcol] = ubvec[i];
2027 const Vector& lbvec = lpi->
spx->lowerReal();
2028 const Vector& ubvec = lpi->
spx->upperReal();
2030 for( i = firstcol; i <= lastcol; ++i )
2032 lb[i-firstcol] = lbvec[i];
2033 ub[i-firstcol] = ubvec[i];
2041 for( i = firstcol; i <= lastcol; ++i )
2043 beg[i-firstcol] = *nnonz;
2045#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
2046 if( lpi->
spx->boolParam(SoPlex::PERSISTENTSCALING) )
2049 lpi->
spx->getColVectorReal(i, cvec);
2050 for( j = 0; j < cvec.size(); ++j )
2052 ind[*nnonz] = cvec.index(j);
2053 val[*nnonz] = cvec.value(j);
2059 const SVector& cvec = lpi->
spx->colVectorRealInternal(i);
2060 for( j = 0; j < cvec.size(); ++j )
2062 ind[*nnonz] = cvec.index(j);
2063 val[*nnonz] = cvec.value(j);
2068 const SVector& cvec = lpi->
spx->colVectorReal(i);
2069 for( j = 0; j < cvec.size(); ++j )
2071 ind[*nnonz] = cvec.index(j);
2072 val[*nnonz] = cvec.value(j);
2101 assert(lpi !=
NULL);
2105 assert(firstrow >= 0);
2106 assert(lastrow < lpi->spx->numRowsReal());
2107 assert(firstrow <= lastrow + 1);
2113#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
2114 if( lpi->
spx->boolParam(SoPlex::PERSISTENTSCALING) )
2116 DVector lhsvec(lpi->
spx->numRowsReal());
2117 DVector rhsvec(lpi->
spx->numRowsReal());
2118 lpi->
spx->getLhsReal(lhsvec);
2119 lpi->
spx->getRhsReal(rhsvec);
2120 for( i = firstrow; i <= lastrow; ++i )
2122 lhs[i-firstrow] = lhsvec[i];
2123 rhs[i-firstrow] = rhsvec[i];
2128 const Vector& lhsvec = lpi->
spx->lhsRealInternal();
2129 const Vector& rhsvec = lpi->
spx->rhsRealInternal();
2130 for( i = firstrow; i <= lastrow; ++i )
2132 lhs[i-firstrow] = lhsvec[i];
2133 rhs[i-firstrow] = rhsvec[i];
2137 const Vector& lhsvec = lpi->
spx->lhsReal();
2138 const Vector& rhsvec = lpi->
spx->rhsReal();
2139 for( i = firstrow; i <= lastrow; ++i )
2141 lhs[i-firstrow] = lhsvec[i];
2142 rhs[i-firstrow] = rhsvec[i];
2150 for( i = firstrow; i <= lastrow; ++i )
2152 beg[i-firstrow] = *nnonz;
2154#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
2155 if( lpi->
spx->boolParam(SoPlex::PERSISTENTSCALING) )
2158 lpi->
spx->getRowVectorReal(i, rvec);
2159 for( j = 0; j < rvec.size(); ++j )
2161 ind[*nnonz] = rvec.index(j);
2162 val[*nnonz] = rvec.value(j);
2168 const SVector& rvec = lpi->
spx->rowVectorRealInternal(i);
2169 for( j = 0; j < rvec.size(); ++j )
2171 ind[*nnonz] = rvec.index(j);
2172 val[*nnonz] = rvec.value(j);
2177 const SVector& rvec = lpi->
spx->rowVectorReal(i);
2178 for( j = 0; j < rvec.size(); ++j )
2180 ind[*nnonz] = rvec.index(j);
2181 val[*nnonz] = rvec.value(j);
2198 int namestoragesize,
2202 assert(lpi !=
NULL);
2204 assert(colnames !=
NULL || namestoragesize == 0);
2205 assert(namestorage !=
NULL || namestoragesize == 0);
2206 assert(namestoragesize >= 0);
2207 assert(storageleft !=
NULL);
2208 assert(firstcol >= 0);
2209 assert(lastcol < lpi->spx->numColsReal());
2210 assert(firstcol <= lastcol + 1);
2226 int namestoragesize,
2230 assert(lpi !=
NULL);
2232 assert(rownames !=
NULL || namestoragesize == 0);
2233 assert(namestorage !=
NULL || namestoragesize == 0);
2234 assert(namestoragesize >= 0);
2235 assert(storageleft !=
NULL);
2236 assert(firstrow >= 0);
2237 assert(lastrow < lpi->spx->numRowsReal());
2238 assert(firstrow <= lastrow + 1);
2255 assert(lpi !=
NULL);
2257 assert(objsen !=
NULL);
2274 assert(lpi !=
NULL);
2276 assert(vals !=
NULL);
2277 assert(firstcol >= 0);
2278 assert(lastcol < lpi->spx->numColsReal());
2279 assert(firstcol <= lastcol + 1);
2283 for( i = firstcol; i <= lastcol; ++i )
2284 vals[i-firstcol] = lpi->
spx->objReal(i);
2300 assert(lpi !=
NULL);
2302 assert(firstcol >= 0);
2303 assert(lastcol < lpi->spx->numColsReal());
2304 assert(firstcol <= lastcol + 1);
2308 for( i = firstcol; i <= lastcol; ++i )
2311 lbs[i-firstcol] = lpi->
spx->lowerReal(i);
2313 ubs[i-firstcol] = lpi->
spx->upperReal(i);
2330 assert(lpi !=
NULL);
2332 assert(firstrow >= 0);
2333 assert(lastrow < lpi->spx->numRowsReal());
2334 assert(firstrow <= lastrow + 1);
2338 for( i = firstrow; i <= lastrow; ++i )
2341 lhss[i-firstrow] = lpi->
spx->lhsReal(i);
2343 rhss[i-firstrow] = lpi->
spx->rhsReal(i);
2359 assert(lpi !=
NULL);
2361 assert(0 <= col && col < lpi->spx->numColsReal());
2362 assert(0 <= row && row < lpi->spx->numRowsReal());
2363 assert(val !=
NULL);
2365#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
2366 *val = lpi->
spx->coefReal(row, col);
2368 *val = lpi->
spx->colVectorReal(col)[row];
2392 assert( lpi !=
NULL );
2395 SPxOut::Verbosity verbosity;
2397 verbosity = lpi->
spx->spxout.getVerbosity();
2400 SCIPdebugMessage(
"calling SoPlex solve(): %d cols, %d rows\n", lpi->
spx->numColsReal(), lpi->
spx->numRowsReal());
2404 assert( lpi->
spx->preStrongbranchingBasisFreed() );
2406#ifdef SCIP_WITH_LPSCHECK
2407 lpi->
spx->setDoubleCheck(CHECK_SPXSOLVE);
2411 if( lpi->
spx->getFromScratch() )
2415 lpi->
spx->clearBasis();
2418 catch(
const SPxException&
x)
2420 std::string s =
x.what();
2423 catch(
const SPxException&)
2426 assert( lpi->
spx->status() != SPxSolver::OPTIMAL );
2430 assert(!lpi->
spx->getFromScratch() || lpi->
spx->status() == SPxSolver::NO_PROBLEM);
2432 SPxSolver::Status status = lpi->
spx->doSolve();
2433 SCIPdebugMessage(
" -> SoPlex status: %d, basis status: %d\n", lpi->
spx->status(), lpi->
spx->basisStatus());
2437 lpi->
spx->spxout.setVerbosity(verbosity);
2441 case SPxSolver::ABORT_TIME:
2442 case SPxSolver::ABORT_ITER:
2443 case SPxSolver::ABORT_VALUE:
2444 case SPxSolver::SINGULAR:
2445 case SPxSolver::REGULAR:
2447 case SPxSolver::OPTIMAL:
2448#if SOPLEX_APIVERSION >= 3
2449 case SPxSolver::OPTIMAL_UNSCALED_VIOLATIONS:
2451 case SPxSolver::UNBOUNDED:
2452 case SPxSolver::INFEASIBLE:
2466 assert(lpi !=
NULL);
2469 (void) lpi->
spx->setIntParam(SoPlex::ALGORITHM, SoPlex::ALGORITHM_PRIMAL);
2480 assert(lpi !=
NULL);
2483 (void) lpi->
spx->setIntParam(SoPlex::ALGORITHM, SoPlex::ALGORITHM_DUAL);
2493 assert(lpi !=
NULL);
2507 assert(lpi !=
NULL);
2510 assert( lpi->
spx->preStrongbranchingBasisFreed() );
2511 lpi->
spx->savePreStrongbranchingBasis();
2521 assert(lpi !=
NULL);
2524 assert( ! lpi->
spx->preStrongbranchingBasisFreed() );
2525 lpi->
spx->restorePreStrongbranchingBasis();
2526 lpi->
spx->freePreStrongbranchingBasis();
2547 assert(lpi !=
NULL);
2551 SPxSolver::Status status;
2556 bool fromparentbasis;
2559 SPxOut::Verbosity verbosity;
2562 verbosity = lpi->
spx->spxout.getVerbosity();
2565 SCIPdebugMessage(
"calling SCIPlpiStrongbranch() on variable %d (%d iterations)\n", col, itlim);
2567 assert(lpi !=
NULL);
2571 assert(downvalid !=
NULL);
2572 assert(upvalid !=
NULL);
2575#ifndef STRONGBRANCH_RESTOREBASIS
2576 fromparentbasis =
false;
2579 oldItlim = spx->intParam(SoPlex::ITERLIMIT);
2582 oldlb = spx->lowerReal(col);
2583 oldub = spx->upperReal(col);
2592 (void) spx->setIntParam(SoPlex::ALGORITHM, SoPlex::ALGORITHM_DUAL);
2595 newub =
EPSCEIL(psol-1.0, lpi->
spx->feastol());
2596 if( newub >= oldlb - 0.5 && down !=
NULL )
2598 SCIPdebugMessage(
"strong branching down on x%d (%g) with %d iterations\n", col, psol, itlim);
2600 spx->changeUpperReal(col, newub);
2601 assert(spx->lowerReal(col) <= spx->upperReal(col));
2603 (void) spx->setIntParam(SoPlex::ITERLIMIT, itlim);
2606#ifndef STRONGBRANCH_RESTOREBASIS
2609#ifdef SCIP_WITH_LPSCHECK
2610 spx->setDoubleCheck(CHECK_SPXSTRONGBRANCH);
2612#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
2613#if SOPLEX_APIVERSION > 11
2614 status = spx->optimize(spx->getInterrupt());
2616 status = spx->optimize();
2619 status = spx->solve();
2624 case SPxSolver::OPTIMAL:
2625 *down = spx->objValueReal();
2629 case SPxSolver::ABORT_TIME:
2630 case SPxSolver::ABORT_ITER:
2631 case SPxSolver::ABORT_CYCLING:
2632#if SOPLEX_APIVERSION >= 3
2633 case SPxSolver::OPTIMAL_UNSCALED_VIOLATIONS:
2635 *down = spx->objValueReal();
2637 case SPxSolver::ABORT_VALUE:
2638 case SPxSolver::INFEASIBLE:
2639 *down = spx->getObjLimit();
2647 (*iter) += spx->numIterations();
2649#ifdef STRONGBRANCH_RESTOREBASIS
2651 assert( ! spx->preStrongbranchingBasisFreed() );
2652 spx->restorePreStrongbranchingBasis();
2653 fromparentbasis =
false;
2657#if SOPLEX_APIVERSION >= 3
2658 repeatstrongbranching = ((status == SPxSolver::ABORT_CYCLING || status == SPxSolver::OPTIMAL_UNSCALED_VIOLATIONS
2659 || status == SPxSolver::SINGULAR) && !fromparentbasis && spx->numIterations() < itlim);
2661 repeatstrongbranching = ((status == SPxSolver::ABORT_CYCLING || status == SPxSolver::SINGULAR)
2662 && !fromparentbasis && spx->numIterations() < itlim);
2664 if( repeatstrongbranching )
2666 SCIPdebugMessage(
" --> Repeat strong branching down with %d iterations after restoring basis\n",
2667 itlim - spx->numIterations());
2668 spx->setIntParam(SoPlex::ITERLIMIT, itlim - spx->numIterations());
2669 spx->restorePreStrongbranchingBasis();
2670 fromparentbasis =
true;
2675 fromparentbasis =
false;
2678 while( fromparentbasis );
2680 spx->changeUpperReal(col, oldub);
2681 assert(spx->lowerReal(col) <= spx->upperReal(col));
2683 else if( down !=
NULL )
2685 *down = spx->getObjLimit();
2695 if( newlb <= oldub + 0.5 && up !=
NULL )
2697 SCIPdebugMessage(
"strong branching up on x%d (%g) with %d iterations\n", col, psol, itlim);
2699 spx->changeLowerReal(col, newlb);
2700 assert(spx->lowerReal(col) <= spx->upperReal(col));
2702 (void) spx->setIntParam(SoPlex::ITERLIMIT, itlim);
2705#ifndef STRONGBRANCH_RESTOREBASIS
2708#ifdef SCIP_WITH_LPSCHECK
2709 spx->setDoubleCheck(CHECK_SPXSTRONGBRANCH);
2711#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
2712#if SOPLEX_APIVERSION > 11
2713 status = spx->optimize(spx->getInterrupt());
2715 status = spx->optimize();
2718 status = spx->solve();
2723 case SPxSolver::OPTIMAL:
2724 *up = spx->objValueReal();
2728 case SPxSolver::ABORT_TIME:
2729 case SPxSolver::ABORT_ITER:
2730 case SPxSolver::ABORT_CYCLING:
2731#if SOPLEX_APIVERSION >= 3
2732 case SPxSolver::OPTIMAL_UNSCALED_VIOLATIONS:
2734 *up = spx->objValueReal();
2736 case SPxSolver::ABORT_VALUE:
2737 case SPxSolver::INFEASIBLE:
2738 *up = spx->getObjLimit();
2746 (*iter) += spx->numIterations();
2748#ifdef STRONGBRANCH_RESTOREBASIS
2750 assert( ! spx->preStrongbranchingBasisFreed() );
2751 spx->restorePreStrongbranchingBasis();
2752 fromparentbasis =
false;
2756#if SOPLEX_APIVERSION >= 3
2757 repeatstrongbranching = ((status == SPxSolver::ABORT_CYCLING || status == SPxSolver::OPTIMAL_UNSCALED_VIOLATIONS
2758 || status == SPxSolver::SINGULAR) && !fromparentbasis && spx->numIterations() < itlim);
2760 repeatstrongbranching = ((status == SPxSolver::ABORT_CYCLING || status == SPxSolver::SINGULAR)
2761 && !fromparentbasis && spx->numIterations() < itlim);
2763 if( repeatstrongbranching )
2765 SCIPdebugMessage(
" --> Repeat strong branching up with %d iterations after restoring basis\n", itlim - spx->numIterations());
2766 spx->restorePreStrongbranchingBasis();
2767 spx->setIntParam(SoPlex::ITERLIMIT, itlim - spx->numIterations());
2769 fromparentbasis =
true;
2773 fromparentbasis =
false;
2776 while( fromparentbasis );
2778 spx->changeLowerReal(col, oldlb);
2779 assert(spx->lowerReal(col) <= spx->upperReal(col));
2781 else if( up !=
NULL )
2783 *up = spx->getObjLimit();
2791 (void) spx->setIntParam(SoPlex::ITERLIMIT, oldItlim);
2794 lpi->
spx->spxout.setVerbosity(verbosity);
2798 SCIPdebugMessage(
"SCIPlpiStrongbranch() returned SoPlex status %d\n",
int(status));
2823 retcode =
lpiStrongbranch(lpi, col, psol, itlim, down, up, downvalid, upvalid, iter);
2853 assert( cols !=
NULL );
2854 assert( psols !=
NULL );
2855 assert( down !=
NULL );
2856 assert( up !=
NULL );
2857 assert( downvalid !=
NULL );
2858 assert( upvalid !=
NULL );
2859 assert( down !=
NULL );
2864 for (
int j = 0; j < ncols; ++j)
2867 retcode =
lpiStrongbranch(lpi, cols[j], psols[j], itlim, &(down[j]), &(up[j]), &(downvalid[j]), &(upvalid[j]), iter);
2897 retcode =
lpiStrongbranch(lpi, col, psol, itlim, down, up, downvalid, upvalid, iter);
2927 assert( cols !=
NULL );
2928 assert( psols !=
NULL );
2929 assert( down !=
NULL );
2930 assert( up !=
NULL );
2931 assert( downvalid !=
NULL );
2932 assert( upvalid !=
NULL );
2933 assert( down !=
NULL );
2938 for (
int j = 0; j < ncols; ++j)
2941 retcode =
lpiStrongbranch(lpi, cols[j], psols[j], itlim, &(down[j]), &(up[j]), &(downvalid[j]), &(upvalid[j]), iter);
2970 assert(lpi !=
NULL);
2993 assert(lpi !=
NULL);
2994 assert(primalfeasible !=
NULL);
2995 assert(dualfeasible !=
NULL);
3012 assert(lpi !=
NULL);
3015 return (lpi->
spx->status() == SPxSolver::UNBOUNDED);
3027 assert(lpi !=
NULL);
3030 return lpi->
spx->hasPrimalRay();
3040 assert(lpi !=
NULL);
3043 assert(lpi->
spx->status() != SPxSolver::UNBOUNDED || lpi->
spx->basisStatus() == SPxBasis::UNBOUNDED);
3048 return lpi->
spx->status() == SPxSolver::UNBOUNDED;
3058 assert(lpi !=
NULL);
3061 return (lpi->
spx->status() == SPxSolver::INFEASIBLE);
3071 assert(lpi !=
NULL);
3074 return lpi->
spx->basisStatus() == SPxBasis::OPTIMAL || lpi->
spx->basisStatus() == SPxBasis::PRIMAL;
3086 assert(lpi !=
NULL);
3089 return (lpi->
spx->status() == SPxSolver::INFEASIBLE);
3101 assert(lpi !=
NULL);
3104 return lpi->
spx->hasDualFarkas();
3114 assert(lpi !=
NULL);
3117 return lpi->
spx->status() == SPxSolver::INFEASIBLE && lpi->
spx->basisStatus() == SPxBasis::DUAL;
3127 assert(lpi !=
NULL);
3130 return (lpi->
spx->status() == SPxSolver::UNBOUNDED);
3140 assert(lpi !=
NULL);
3143 return (lpi->
spx->basisStatus() == SPxBasis::OPTIMAL) || lpi->
spx->basisStatus() == SPxBasis::DUAL;
3153 assert(lpi !=
NULL);
3155 assert((lpi->
spx->basisStatus() == SPxBasis::OPTIMAL)
3158 return (lpi->
spx->status() == SPxSolver::OPTIMAL);
3174 assert(lpi !=
NULL);
3179#if SOPLEX_APIVERSION >= 3
3180 if( lpi->
spx->status() == SPxSolver::OPTIMAL_UNSCALED_VIOLATIONS )
3208 if( lpi->
spx->intParam(SoPlex::OBJSENSE) == SoPlex::OBJSENSE_MAXIMIZE )
3226 assert(lpi !=
NULL);
3229 return (lpi->
spx->status() == SPxSolver::ABORT_VALUE);
3239 assert(lpi !=
NULL);
3242 return (lpi->
spx->status() == SPxSolver::ABORT_ITER);
3252 assert(lpi !=
NULL);
3255 return (lpi->
spx->status() == SPxSolver::ABORT_TIME);
3265 assert(lpi !=
NULL);
3268 return static_cast<int>(lpi->
spx->status());
3279 assert(lpi !=
NULL);
3281 assert(success !=
NULL);
3283#if SOPLEX_APIVERSION >= 4
3284 *success = lpi->
spx->ignoreUnscaledViolations();
3300 assert(lpi !=
NULL);
3302 assert(objval !=
NULL);
3304 *objval = lpi->
spx->objValueReal();
3325 assert(lpi !=
NULL);
3328 if( objval !=
NULL )
3329 *objval = lpi->
spx->objValueReal();
3333 if( primsol !=
NULL )
3335#if SOPLEX_APIVERSION > 10
3336 (void)lpi->
spx->getPrimalReal(primsol, lpi->
spx->numColsReal());
3338 Vector tmp(lpi->
spx->numColsReal(), primsol);
3339 (void)lpi->
spx->getPrimalReal(tmp);
3342 if( dualsol !=
NULL )
3344#if SOPLEX_APIVERSION > 10
3345 (void)lpi->
spx->getDualReal(dualsol, lpi->
spx->numRowsReal());
3347 Vector tmp(lpi->
spx->numRowsReal(), dualsol);
3348 (void)lpi->
spx->getDualReal(tmp);
3351 if( activity !=
NULL )
3353#if SOPLEX_APIVERSION > 10
3354 (void)lpi->
spx->getSlacksReal(activity, lpi->
spx->numRowsReal());
3356 Vector tmp(lpi->
spx->numRowsReal(), activity);
3357 (void)lpi->
spx->getSlacksReal(tmp);
3360 if( redcost !=
NULL )
3362#if SOPLEX_APIVERSION > 10
3363 (void)lpi->
spx->getRedCostReal(redcost, lpi->
spx->numColsReal());
3365 Vector tmp(lpi->
spx->numColsReal(), redcost);
3366 (void)lpi->
spx->getRedCostReal(tmp);
3371 catch(
const SPxException&
x )
3373 std::string s =
x.what();
3376 catch(
const SPxException& )
3393 assert(lpi !=
NULL);
3395 assert(lpi->
spx->hasPrimalRay());
3396 assert(ray !=
NULL);
3400#if SOPLEX_APIVERSION > 10
3401 (void)lpi->
spx->getPrimalRayReal(ray, lpi->
spx->numColsReal());
3403 Vector tmp(lpi->
spx->numColsReal(), ray);
3404 (void)lpi->
spx->getPrimalRayReal(tmp);
3408 catch(
const SPxException&
x )
3410 std::string s =
x.what();
3413 catch(
const SPxException& )
3430 assert(lpi !=
NULL);
3432 assert(lpi->
spx->hasDualFarkas());
3433 assert(dualfarkas !=
NULL);
3437#if SOPLEX_APIVERSION > 10
3438 (void)lpi->
spx->getDualFarkasReal(dualfarkas, lpi->
spx->numRowsReal());
3440 Vector tmp(lpi->
spx->numRowsReal(), dualfarkas);
3441 (void)lpi->
spx->getDualFarkasReal(tmp);
3445 catch(
const SPxException&
x )
3447 std::string s =
x.what();
3450 catch(
const SPxException& )
3467 assert(lpi !=
NULL);
3469 assert(iterations !=
NULL);
3471 *iterations = lpi->
spx->numIterations();
3489 assert(lpi !=
NULL);
3490 assert(quality !=
NULL);
3494 SCIPdebugMessage(
"requesting solution quality from SoPlex: quality %d\n", qualityindicator);
3496 switch( qualityindicator )
3499 success = lpi->
spx->getEstimatedCondition(*quality);
3503 success = lpi->
spx->getExactCondition(*quality);
3544 assert(lpi !=
NULL);
3547 assert( lpi->
spx->preStrongbranchingBasisFreed() );
3551 for( i = 0; i < lpi->
spx->numRowsReal(); ++i )
3553 switch( lpi->
spx->basisRowStatus(i) )
3555 case SPxSolver::BASIC:
3558 case SPxSolver::FIXED:
3559 case SPxSolver::ON_LOWER:
3562 case SPxSolver::ON_UPPER:
3565 case SPxSolver::ZERO:
3566 SCIPerrorMessage(
"slack variable has basis status ZERO (should not occur)\n");
3568 case SPxSolver::UNDEFINED:
3579 for( i = 0; i < lpi->
spx->numColsReal(); ++i )
3582 switch( lpi->
spx->basisColStatus(i) )
3584 case SPxSolver::BASIC:
3587 case SPxSolver::FIXED:
3601 case SPxSolver::ON_LOWER:
3604 case SPxSolver::ON_UPPER:
3607 case SPxSolver::ZERO:
3610 case SPxSolver::UNDEFINED:
3635 assert(lpi !=
NULL);
3641 assert(cstat !=
NULL || ncols == 0);
3642 assert(rstat !=
NULL || nrows == 0);
3644 assert( lpi->
spx->preStrongbranchingBasisFreed() );
3647 DataArray<SPxSolver::VarStatus>& _colstat = lpi->
spx->colStat();
3648 DataArray<SPxSolver::VarStatus>& _rowstat = lpi->
spx->rowStat();
3650 _colstat.reSize(ncols);
3651 _rowstat.reSize(nrows);
3653 for( i = 0; i < nrows; ++i )
3658 _rowstat[i] = SPxSolver::ON_LOWER;
3661 _rowstat[i] = SPxSolver::BASIC;
3664 _rowstat[i] = SPxSolver::ON_UPPER;
3667 SCIPerrorMessage(
"slack variable has basis status ZERO (should not occur)\n");
3676 for( i = 0; i < ncols; ++i )
3681 _colstat[i] = SPxSolver::ON_LOWER;
3684 _colstat[i] = SPxSolver::BASIC;
3687 _colstat[i] = SPxSolver::ON_UPPER;
3690 _colstat[i] = SPxSolver::ZERO;
3700 lpi->
spx->freePreStrongbranchingBasis();
3713 assert(lpi !=
NULL);
3715 assert(bind !=
NULL);
3717 assert(lpi->
spx->preStrongbranchingBasisFreed());
3719 lpi->
spx->getBasisInd(bind);
3742 assert(lpi !=
NULL);
3744 assert(lpi->
spx->preStrongbranchingBasisFreed());
3745 assert(coef !=
NULL);
3748 assert(r < lpi->spx->numRowsReal());
3750 if( ! lpi->
spx->getBasisInverseRowReal(
r, coef, inds, ninds) )
3777 assert( lpi !=
NULL );
3779 assert( lpi->
spx->preStrongbranchingBasisFreed() );
3780 assert(coef !=
NULL);
3782 if( ! lpi->
spx->getBasisInverseColReal(c, coef, inds, ninds) )
3812 assert(lpi !=
NULL);
3814 assert( lpi->
spx->preStrongbranchingBasisFreed() );
3815 assert(coef !=
NULL);
3817 nrows = lpi->
spx->numRowsReal();
3818 ncols = lpi->
spx->numColsReal();
3822 if( binvrow ==
NULL )
3831 assert(binv !=
NULL);
3839 Vector binvvec(nrows, binv);
3841#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
3846 for( c = 0; c < ncols; ++c )
3848#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
3849 lpi->
spx->getColVectorReal(c, acol);
3850 coef[c] = binvvec * acol;
3852 coef[c] = binvvec * lpi->
spx->colVectorReal(c);
3878 DVector col(lpi->
spx->numRowsReal());
3880#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
3887 assert( lpi !=
NULL );
3889 assert( lpi->
spx->preStrongbranchingBasisFreed() );
3890 assert(coef !=
NULL);
3894 assert(c < lpi->spx->numColsReal());
3904#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 4)
3905 lpi->
spx->getColVectorReal(c, colsparse);
3909 col = lpi->
spx->colVectorReal(c);
3913 if( ! lpi->
spx->getBasisInverseTimesVecReal(col.get_ptr(), coef) )
3943 assert(blkmem !=
NULL);
3944 assert(lpi !=
NULL);
3946 assert(lpistate !=
NULL);
3948 assert( lpi->
spx->preStrongbranchingBasisFreed() );
3950 ncols = lpi->
spx->numColsReal();
3951 nrows = lpi->
spx->numRowsReal();
3966 (*lpistate)->ncols = ncols;
3967 (*lpistate)->nrows = nrows;
3988 assert(lpi !=
NULL);
3990 assert(lpistate !=
NULL);
3993 assert( lpi->
spx->preStrongbranchingBasisFreed() );
3995 lpncols = lpi->
spx->numColsReal();
3996 lpnrows = lpi->
spx->numRowsReal();
3997 assert(lpistate->
ncols <= lpncols);
3998 assert(lpistate->
nrows <= lpnrows);
4008 for( i = lpistate->
ncols; i < lpncols; ++i )
4014 bnd = lpi->
spx->lowerReal(i);
4026 for( i = lpistate->
nrows; i < lpnrows; ++i )
4042 assert(lpi !=
NULL);
4047 lpi->
spx->clearBasis();
4050 catch(
const SPxException&
x )
4052 std::string s =
x.what();
4055 catch(
const SPxException& )
4058 assert( lpi->
spx->status() != SPxSolver::OPTIMAL );
4074 assert(lpi !=
NULL);
4075 assert(lpistate !=
NULL);
4076 assert(blkmem !=
NULL);
4078 if ( *lpistate !=
NULL )
4090 assert(lpi !=
NULL);
4101 assert(lpi !=
NULL);
4103 assert(fname !=
NULL);
4105 assert( lpi->
spx->preStrongbranchingBasisFreed() );
4119 assert(lpi !=
NULL);
4121 assert(fname !=
NULL);
4124 assert( lpi->
spx->preStrongbranchingBasisFreed() );
4156#if ((SOPLEX_VERSION == 201 && SOPLEX_SUBVERSION >= 3) || SOPLEX_VERSION > 201)
4160 assert(blkmem !=
NULL);
4161 assert(lpi !=
NULL);
4163 assert(lpinorms !=
NULL);
4165 lpi->
spx->getNdualNorms(nrows, ncols);
4167 if( nrows == 0 && ncols == 0)
4176 (*lpinorms)->nrows = 0;
4177 (*lpinorms)->ncols = 0;
4179 SCIPdebugMessage(
"storing SoPlex LPi pricing norms in %p (%d rows, %d cols)\n", (
void *) *lpinorms, nrows, ncols);
4181 if( !lpi->
spx->getDualNorms((*lpinorms)->nrows, (*lpinorms)->ncols, (*lpinorms)->norms) )
4186 assert(*lpinorms ==
NULL);
4191 assert(nrows == (*lpinorms)->nrows);
4192 assert(ncols == (*lpinorms)->ncols);
4211#if ((SOPLEX_VERSION == 201 && SOPLEX_SUBVERSION >= 3) || SOPLEX_VERSION > 201)
4212 assert(blkmem !=
NULL);
4213 assert(lpi !=
NULL);
4217 if( lpinorms ==
NULL )
4220 assert(lpinorms->
nrows <= lpi->
spx->numRowsReal());
4221 assert(lpinorms->
ncols <= lpi->
spx->numColsReal());
4223 if( lpinorms->
nrows == 0 )
4226 SCIPdebugMessage(
"loading LPi simplex norms %p (%d rows, %d cols) into SoPlex LP with %d rows and %d cols\n",
4227 (
const void *) lpinorms, lpinorms->
nrows, lpinorms->
ncols, lpi->
spx->numRowsReal(), lpi->
spx->numColsReal());
4242#if ((SOPLEX_VERSION == 201 && SOPLEX_SUBVERSION >= 3) || SOPLEX_VERSION > 201)
4243 assert(lpi !=
NULL);
4244 assert(lpinorms !=
NULL);
4250 assert(*lpinorms ==
NULL);
4279 assert(lpi !=
NULL);
4281 assert(ival !=
NULL);
4286 *ival = lpi->
spx->getFromScratch();
4289 *ival = lpi->
spx->getLpInfo();
4292 *ival = lpi->
spx->intParam(SoPlex::ITERLIMIT);
4297 *ival = lpi->
spx->intParam(SoPlex::SIMPLIFIER);
4303 scaleparam = lpi->
spx->intParam(SoPlex::SCALER);
4305 if( scaleparam == SoPlex::SCALER_OFF )
4307 else if( scaleparam == SoPlex::SCALER_BIEQUI )
4309#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 2)
4312 assert(scaleparam == SoPlex::SCALER_LEASTSQ);
4318 assert(scaleparam == SoPlex::SCALER_GEO8);
4323#if SOPLEX_VERSION >= 201
4325 *ival = (int) (lpi->
spx->intParam(SoPlex::TIMER));
4328#if SOPLEX_VERSION >= 230 || (SOPLEX_VERSION == 220 && SOPLEX_SUBVERSION >= 3)
4330 *ival = (int) lpi->
spx->randomSeed();
4333#if SOPLEX_APIVERSION >= 1
4335 *ival = (int) lpi->
spx->intParam(SoPlex::FACTOR_UPDATE_MAX);
4354 assert(lpi !=
NULL);
4361 lpi->
spx->setFromScratch(
bool(ival));
4365 lpi->
spx->setLpInfo(
bool(ival));
4368 assert( ival >= 0 );
4370 if( ival >= INT_MAX )
4372 (void) lpi->
spx->setIntParam(SoPlex::ITERLIMIT, ival);
4376#if SOPLEX_APIVERSION < 13
4379 assert(ival == 1 || ival == 0 || ival == 2);
4381 (void) lpi->
spx->setIntParam(SoPlex::SIMPLIFIER, ival);
4389 (void) lpi->
spx->setIntParam(SoPlex::PRICER, SoPlex::PRICER_AUTO);
4392 (void) lpi->
spx->setIntParam(SoPlex::PRICER, SoPlex::PRICER_STEEP);
4395 (void) lpi->
spx->setIntParam(SoPlex::PRICER, SoPlex::PRICER_PARMULT);
4398 (void) lpi->
spx->setIntParam(SoPlex::PRICER, SoPlex::PRICER_STEEP);
4401 (void) lpi->
spx->setIntParam(SoPlex::PRICER, SoPlex::PRICER_QUICKSTEEP);
4404 (void) lpi->
spx->setIntParam(SoPlex::PRICER, SoPlex::PRICER_DEVEX);
4411 assert(ival >= 0 && ival <= 2);
4413 (void) lpi->
spx->setIntParam(SoPlex::SCALER, SoPlex::SCALER_OFF);
4414 else if( ival == 1 )
4415 (void) lpi->
spx->setIntParam(SoPlex::SCALER, SoPlex::SCALER_BIEQUI);
4417#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 2)
4418 (void) lpi->
spx->setIntParam(SoPlex::SCALER, SoPlex::SCALER_LEASTSQ);
4420 (void) lpi->
spx->setIntParam(SoPlex::SCALER, SoPlex::SCALER_GEO8);
4424#if SOPLEX_VERSION >= 201
4426 assert(ival >= 0 && ival < 3);
4427 (void) lpi->
spx->setIntParam(SoPlex::TIMER, ival);
4430#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION == 221 && SOPLEX_SUBVERSION >= 3)
4432 lpi->
spx->setRandomSeed((
unsigned long)(long)ival);
4435#if SOPLEX_VERSION > 221 || (SOPLEX_VERSION >= 221 && SOPLEX_SUBVERSION >= 3)
4437 assert(ival >= 0 && ival < 3);
4438 (void) lpi->
spx->setIntParam(SoPlex::SOLUTION_POLISHING, ival);
4441#if SOPLEX_APIVERSION >= 1
4444 (void) lpi->
spx->setIntParam(SoPlex::FACTOR_UPDATE_MAX, ival);
4464 assert(lpi !=
NULL);
4466 assert(dval !=
NULL);
4471 *dval = lpi->
spx->feastol();
4474 *dval = lpi->
spx->opttol();
4477 if ( lpi->
spx->intParam(SoPlex::OBJSENSE) == SoPlex::OBJSENSE_MINIMIZE )
4478 *dval = lpi->
spx->realParam(SoPlex::OBJLIMIT_UPPER);
4480 *dval = lpi->
spx->realParam(SoPlex::OBJLIMIT_LOWER);
4483 *dval = lpi->
spx->realParam(SoPlex::TIMELIMIT);
4486 *dval = lpi->
spx->realParam(SoPlex::REPRESENTATION_SWITCH);
4494#if (SOPLEX_APIVERSION >= 9)
4495 *dval = lpi->
spx->realParam(SoPlex::MIN_MARKOWITZ);
4514 assert(lpi !=
NULL);
4521 assert( dval > 0.0 );
4522 lpi->
spx->setFeastol(dval);
4526 assert( dval > 0.0 );
4527 lpi->
spx->setOpttol(dval);
4531 if ( lpi->
spx->intParam(SoPlex::OBJSENSE) == SoPlex::OBJSENSE_MINIMIZE )
4532 (void) lpi->
spx->setRealParam(SoPlex::OBJLIMIT_UPPER, dval);
4534 (
void) lpi->
spx->setRealParam(SoPlex::OBJLIMIT_LOWER, dval);
4537 assert( dval > 0.0 );
4539 (void) lpi->
spx->setRealParam(SoPlex::TIMELIMIT, dval);
4543 assert( dval >= 0.0 || dval == -1.0 );
4547 (
void) lpi->
spx->setRealParam(SoPlex::REPRESENTATION_SWITCH, dval);
4554#if (SOPLEX_APIVERSION >= 9)
4558 else if( dval > 0.9999 )
4561 (void) lpi->
spx->setRealParam(SoPlex::MIN_MARKOWITZ, dval);
4577 assert(lpi !=
NULL);
4580 lpi->
spx->setInterrupt(interrupt);
4602 assert(lpi !=
NULL);
4605 return lpi->
spx->realParam(SoPlex::INFTY);
4614 assert(lpi !=
NULL);
4617 return (val >= lpi->
spx->realParam(SoPlex::INFTY));
4635 const char* filename
4640 f = fopen(filename,
"r");
4657 assert(lpi !=
NULL);
4659 assert(fname !=
NULL);
4661 assert( lpi->
spx->preStrongbranchingBasisFreed() );
4668 assert(lpi->
spx->intParam(SoPlex::READMODE) == SoPlex::READMODE_REAL);
4669 if( !lpi->
spx->readFile(fname) )
4673 catch(
const SPxException&
x )
4675 std::string s =
x.what();
4678 catch(
const SPxException& )
4695 assert(lpi !=
NULL);
4697 assert(fname !=
NULL);
4701 (void) lpi->
spx->writeFileReal(fname);
4704 catch(
const SPxException&
x )
4706 std::string s =
x.what();
4709 catch(
const SPxException& )
void SCIPdecodeDualBit(const SCIP_DUALPACKET *inp, int *out, int count)
void SCIPencodeDualBit(const int *inp, SCIP_DUALPACKET *out, int count)
packing single and dual bit values
unsigned int SCIP_DUALPACKET
SCIP_RETCODE SCIPlpiChgSides(SCIP_LPI *lpi, int nrows, const int *ind, const SCIP_Real *lhs, const SCIP_Real *rhs)
SCIP_RETCODE SCIPlpiSetState(SCIP_LPI *lpi, BMS_BLKMEM *, const SCIP_LPISTATE *lpistate)
SCIP_RETCODE SCIPlpiGetBInvACol(SCIP_LPI *lpi, int c, SCIP_Real *coef, int *inds, int *ninds)
SCIP_RETCODE SCIPlpiGetRealpar(SCIP_LPI *lpi, SCIP_LPPARAM type, SCIP_Real *dval)
SCIP_Real SCIPlpiInfinity(SCIP_LPI *lpi)
SCIP_Bool SCIPlpiIsObjlimExc(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiChgObjsen(SCIP_LPI *lpi, SCIP_OBJSEN objsen)
SCIP_Bool SCIPlpiIsInfinity(SCIP_LPI *lpi, SCIP_Real val)
SCIP_RETCODE SCIPlpiClear(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiClearState(SCIP_LPI *lpi)
SCIP_Bool SCIPlpiExistsDualRay(SCIP_LPI *lpi)
SCIP_Bool SCIPlpiExistsPrimalRay(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiGetBase(SCIP_LPI *lpi, int *cstat, int *rstat)
SCIP_RETCODE SCIPlpiReadState(SCIP_LPI *lpi, const char *fname)
SCIP_RETCODE SCIPlpiAddRows(SCIP_LPI *lpi, int nrows, const SCIP_Real *lhs, const SCIP_Real *rhs, char **, int nnonz, const int *beg, const int *ind, const SCIP_Real *val)
SCIP_RETCODE SCIPlpiGetPrimalRay(SCIP_LPI *lpi, SCIP_Real *ray)
SCIP_RETCODE SCIPlpiGetIntpar(SCIP_LPI *lpi, SCIP_LPPARAM type, int *ival)
SCIP_RETCODE SCIPlpiWriteLP(SCIP_LPI *lpi, const char *fname)
SCIP_RETCODE SCIPlpiSetIntegralityInformation(SCIP_LPI *lpi, int ncols, int *intInfo)
SCIP_Bool SCIPlpiIsDualInfeasible(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiSetRealpar(SCIP_LPI *lpi, SCIP_LPPARAM type, SCIP_Real dval)
SCIP_RETCODE SCIPlpiStrongbranchFrac(SCIP_LPI *lpi, int col, SCIP_Real psol, int itlim, SCIP_Real *down, SCIP_Real *up, SCIP_Bool *downvalid, SCIP_Bool *upvalid, int *iter)
SCIP_RETCODE SCIPlpiSetNorms(SCIP_LPI *lpi, BMS_BLKMEM *blkmem, const SCIP_LPINORMS *lpinorms)
SCIP_RETCODE SCIPlpiGetNNonz(SCIP_LPI *lpi, int *nnonz)
SCIP_Bool SCIPlpiHasPrimalSolve(void)
SCIP_RETCODE SCIPlpiStrongbranchInt(SCIP_LPI *lpi, int col, SCIP_Real psol, int itlim, SCIP_Real *down, SCIP_Real *up, SCIP_Bool *downvalid, SCIP_Bool *upvalid, int *iter)
SCIP_RETCODE SCIPlpiGetBounds(SCIP_LPI *lpi, int firstcol, int lastcol, SCIP_Real *lbs, SCIP_Real *ubs)
SCIP_Bool SCIPlpiHasBarrierSolve(void)
SCIP_RETCODE SCIPlpiGetDualfarkas(SCIP_LPI *lpi, SCIP_Real *dualfarkas)
SCIP_RETCODE SCIPlpiGetObjval(SCIP_LPI *lpi, SCIP_Real *objval)
SCIP_RETCODE SCIPlpiScaleCol(SCIP_LPI *lpi, int col, SCIP_Real scaleval)
int SCIPlpiGetInternalStatus(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiStartStrongbranch(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiGetSolFeasibility(SCIP_LPI *lpi, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_RETCODE SCIPlpiFreeNorms(SCIP_LPI *lpi, BMS_BLKMEM *blkmem, SCIP_LPINORMS **lpinorms)
SCIP_Bool SCIPlpiIsIterlimExc(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiChgBounds(SCIP_LPI *lpi, int ncols, const int *ind, const SCIP_Real *lb, const SCIP_Real *ub)
SCIP_Bool SCIPlpiIsPrimalUnbounded(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiIgnoreInstability(SCIP_LPI *lpi, SCIP_Bool *success)
SCIP_RETCODE SCIPlpiWriteState(SCIP_LPI *lpi, const char *fname)
SCIP_RETCODE SCIPlpiFree(SCIP_LPI **lpi)
SCIP_RETCODE SCIPlpiStrongbranchesFrac(SCIP_LPI *lpi, int *cols, int ncols, SCIP_Real *psols, int itlim, SCIP_Real *down, SCIP_Real *up, SCIP_Bool *downvalid, SCIP_Bool *upvalid, int *iter)
SCIP_RETCODE SCIPlpiGetCoef(SCIP_LPI *lpi, int row, int col, SCIP_Real *val)
SCIP_Bool SCIPlpiIsPrimalFeasible(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiReadLP(SCIP_LPI *lpi, const char *fname)
SCIP_RETCODE SCIPlpiGetRealSolQuality(SCIP_LPI *lpi, SCIP_LPSOLQUALITY qualityindicator, SCIP_Real *quality)
SCIP_Bool SCIPlpiIsDualFeasible(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiGetNorms(SCIP_LPI *lpi, BMS_BLKMEM *blkmem, SCIP_LPINORMS **lpinorms)
SCIP_Bool SCIPlpiIsTimelimExc(SCIP_LPI *lpi)
SCIP_Bool SCIPlpiHasStateBasis(SCIP_LPI *lpi, SCIP_LPISTATE *lpistate)
SCIP_RETCODE SCIPlpiSetIntpar(SCIP_LPI *lpi, SCIP_LPPARAM type, int ival)
const char * SCIPlpiGetSolverName(void)
SCIP_RETCODE SCIPlpiSetBase(SCIP_LPI *lpi, const int *cstat, const int *rstat)
SCIP_Bool SCIPlpiHasPrimalRay(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiGetBInvRow(SCIP_LPI *lpi, int r, SCIP_Real *coef, int *inds, int *ninds)
SCIP_RETCODE SCIPlpiDelRows(SCIP_LPI *lpi, int firstrow, int lastrow)
SCIP_RETCODE SCIPlpiGetCols(SCIP_LPI *lpi, int firstcol, int lastcol, SCIP_Real *lb, SCIP_Real *ub, int *nnonz, int *beg, int *ind, SCIP_Real *val)
SCIP_RETCODE SCIPlpiGetBInvCol(SCIP_LPI *lpi, int c, SCIP_Real *coef, int *inds, int *ninds)
SCIP_RETCODE SCIPlpiGetColNames(SCIP_LPI *lpi, int firstcol, int lastcol, char **colnames, char *namestorage, int namestoragesize, int *storageleft)
SCIP_RETCODE SCIPlpiGetBInvARow(SCIP_LPI *lpi, int r, const SCIP_Real *binvrow, SCIP_Real *coef, int *inds, int *ninds)
SCIP_RETCODE SCIPlpiGetRows(SCIP_LPI *lpi, int firstrow, int lastrow, SCIP_Real *lhs, SCIP_Real *rhs, int *nnonz, int *beg, int *ind, SCIP_Real *val)
SCIP_Bool SCIPlpiWasSolved(SCIP_LPI *lpi)
const char * SCIPlpiGetSolverDesc(void)
SCIP_RETCODE SCIPlpiSolveBarrier(SCIP_LPI *lpi, SCIP_Bool crossover)
SCIP_Bool SCIPlpiIsOptimal(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiGetRowNames(SCIP_LPI *lpi, int firstrow, int lastrow, char **rownames, char *namestorage, int namestoragesize, int *storageleft)
SCIP_Bool SCIPlpiHasDualSolve(void)
SCIP_RETCODE SCIPlpiEndStrongbranch(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiGetSides(SCIP_LPI *lpi, int firstrow, int lastrow, SCIP_Real *lhss, SCIP_Real *rhss)
SCIP_RETCODE SCIPlpiStrongbranchesInt(SCIP_LPI *lpi, int *cols, int ncols, SCIP_Real *psols, int itlim, SCIP_Real *down, SCIP_Real *up, SCIP_Bool *downvalid, SCIP_Bool *upvalid, int *iter)
SCIP_RETCODE SCIPlpiGetSol(SCIP_LPI *lpi, SCIP_Real *objval, SCIP_Real *primsol, SCIP_Real *dualsol, SCIP_Real *activity, SCIP_Real *redcost)
SCIP_Bool SCIPlpiHasDualRay(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiDelColset(SCIP_LPI *lpi, int *dstat)
SCIP_RETCODE SCIPlpiGetObj(SCIP_LPI *lpi, int firstcol, int lastcol, SCIP_Real *vals)
SCIP_RETCODE SCIPlpiFreeState(SCIP_LPI *lpi, BMS_BLKMEM *blkmem, SCIP_LPISTATE **lpistate)
SCIP_Bool SCIPlpiIsPrimalInfeasible(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiSolveDual(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiAddCols(SCIP_LPI *lpi, int ncols, const SCIP_Real *obj, const SCIP_Real *lb, const SCIP_Real *ub, char **, int nnonz, const int *beg, const int *ind, const SCIP_Real *val)
SCIP_RETCODE SCIPlpiSolvePrimal(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiLoadColLP(SCIP_LPI *lpi, SCIP_OBJSEN objsen, int ncols, const SCIP_Real *obj, const SCIP_Real *lb, const SCIP_Real *ub, char **colnames, int nrows, const SCIP_Real *lhs, const SCIP_Real *rhs, char **, int nnonz, const int *beg, const int *ind, const SCIP_Real *val)
SCIP_Bool SCIPlpiIsDualUnbounded(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiGetIterations(SCIP_LPI *lpi, int *iterations)
SCIP_RETCODE SCIPlpiGetBasisInd(SCIP_LPI *lpi, int *bind)
SCIP_RETCODE SCIPlpiCreate(SCIP_LPI **lpi, SCIP_MESSAGEHDLR *messagehdlr, const char *name, SCIP_OBJSEN objsen)
void * SCIPlpiGetSolverPointer(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiChgObj(SCIP_LPI *lpi, int ncols, const int *ind, const SCIP_Real *obj)
SCIP_RETCODE SCIPlpiGetObjsen(SCIP_LPI *lpi, SCIP_OBJSEN *objsen)
SCIP_Bool SCIPlpiIsStable(SCIP_LPI *lpi)
SCIP_RETCODE SCIPlpiGetNCols(SCIP_LPI *lpi, int *ncols)
SCIP_RETCODE SCIPlpiInterrupt(SCIP_LPI *lpi, SCIP_Bool interrupt)
SCIP_RETCODE SCIPlpiDelCols(SCIP_LPI *lpi, int firstcol, int lastcol)
SCIP_RETCODE SCIPlpiDelRowset(SCIP_LPI *lpi, int *dstat)
SCIP_RETCODE SCIPlpiScaleRow(SCIP_LPI *lpi, int row, SCIP_Real scaleval)
SCIP_RETCODE SCIPlpiGetNRows(SCIP_LPI *lpi, int *nrows)
SCIP_RETCODE SCIPlpiGetState(SCIP_LPI *lpi, BMS_BLKMEM *blkmem, SCIP_LPISTATE **lpistate)
SCIP_RETCODE SCIPlpiChgCoef(SCIP_LPI *lpi, int row, int col, SCIP_Real newval)
static SCIP_RETCODE optimize(SCIP *scip, SCIP_SOL *worksol, SCIP_VAR **vars, int *blockstart, int *blockend, int nblocks, OPTTYPE opttype, SCIP_Real *activities, int nrows, SCIP_Bool *improvement, SCIP_Bool *varboundserr, SCIP_HEURDATA *heurdata)
interface methods for specific LP solvers
SCIP_DUALPACKET ROWPACKET
SCIP_DUALPACKET COLPACKET
static void setIntParam(SCIP_LPI *lpi, int const param, int const parval)
static void lpistatePack(SCIP_LPISTATE *lpistate, const int *cstat, const int *rstat)
static void lpistateUnpack(const SCIP_LPISTATE *lpistate, int *cstat, int *rstat)
static SCIP_Bool fileExists(const char *filename)
#define SOPLEX_TRY(messagehdlr, x)
static int rowpacketNum(int nrows)
static SCIP_RETCODE spxSolve(SCIP_LPI *lpi)
SCIP_DUALPACKET ROWPACKET
static SCIP_RETCODE ensureCstatMem(SCIP_LPI *lpi, int num)
static const char spxdesc[200]
static void lpistateFree(SCIP_LPISTATE **lpistate, BMS_BLKMEM *blkmem)
SCIP_DUALPACKET COLPACKET
static SCIP_RETCODE lpiStrongbranch(SCIP_LPI *lpi, int col, SCIP_Real psol, int itlim, SCIP_Real *down, SCIP_Real *up, SCIP_Bool *downvalid, SCIP_Bool *upvalid, int *iter)
static SCIP_RETCODE ensureRstatMem(SCIP_LPI *lpi, int num)
static int colpacketNum(int ncols)
#define CHECK_SOPLEX_PARAM(x)
#define SOPLEX_SUBVERSION
static SCIP_RETCODE lpistateCreate(SCIP_LPISTATE **lpistate, BMS_BLKMEM *blkmem, int ncols, int nrows)
#define SOPLEX_TRY_ABORT(x)
static const char spxname[20]
static void invalidateSolution(SCIP_LPI *lpi)
#define BMSfreeMemory(ptr)
#define BMSfreeBlockMemory(mem, ptr)
#define BMSallocBlockMemory(mem, ptr)
#define BMSreallocMemoryArray(ptr, num)
#define BMSallocMemoryArray(ptr, num)
#define BMSallocMemoryCPP(size)
#define BMSallocBlockMemoryArray(mem, ptr, num)
#define BMSfreeBlockMemoryArray(mem, ptr, num)
struct BMS_BlkMem BMS_BLKMEM
#define BMSfreeMemoryArrayNull(ptr)
#define BMSallocMemory(ptr)
void SCIPmessagePrintWarning(SCIP_MESSAGEHDLR *messagehdlr, const char *formatstr,...)
public methods for message output
SCIP_MESSAGEHDLR * messagehdlr
@ SCIP_PRICING_STEEPQSTART
@ SCIP_PRICING_LPIDEFAULT
enum SCIP_Pricing SCIP_PRICING
enum SCIP_LPParam SCIP_LPPARAM
@ SCIP_LPSOLQUALITY_EXACTCONDITION
@ SCIP_LPSOLQUALITY_ESTIMCONDITION
@ SCIP_LPPAR_CONDITIONLIMIT
@ SCIP_LPPAR_ROWREPSWITCH
enum SCIP_LPSolQuality SCIP_LPSOLQUALITY
enum SCIP_ObjSen SCIP_OBJSEN
enum SCIP_Retcode SCIP_RETCODE