42#define COLS_PER_PACKET SCIP_DUALPACKETSIZE
44#define ROWS_PER_PACKET SCIP_DUALPACKETSIZE
105#define __QS_PRINTLOC__ fprintf(stderr,", in (%s:%d)\n", __FILE__, __LINE__)
109#define QS_TESTG(A,B,C) do{{ \
111 fprintf(stderr, C); \
116#define QS_ERROR(A,...) do{{ \
118 fprintf(stderr,__VA_ARGS__); \
120 return SCIP_LPERROR;}}}while(0)
124#define QS_RETURN(A) do{ \
125 const int __RVAL__ = (A); \
127 fprintf(stderr,"LP Error: QSopt returned %d",__RVAL__); \
129 return SCIP_ERROR;} \
130 return SCIP_OKAY;}while(0)
134#define QS_CONDRET(A) do{ \
135 const int __RVAL__ = (A); \
137 fprintf(stderr,"LP Error: QSopt returned %d",__RVAL__); \
139 return SCIP_LPERROR;} \
310 const double*
const lhs,
311 const double*
const rhs
321 for(
i = 0 ;
i < nrows ; ++
i )
323 state = ((lhs[
i] <= -QS_MAXDOUBLE ? 1 : 0) | (rhs[
i] >= QS_MAXDOUBLE ? 2 : 0));
340 lpi->
irng[
i] = rhs[
i] - lhs[
i];
383 vnamelen = strlen(vname);
386 memcpy(__qsstr, vname, vnamelen);
387 __qsstr[vnamelen+1] =
'\0';
397 return "Linear Programming Solver developed by D. Applegate, W. Cook, S. Dash, and M. Mevenkamp (www.isye.gatech.edu/~wcook/qsopt)";
406 return (
void*) lpi->
prob;
420 SCIPerrorMessage(
"SCIPlpiSetIntegralityInformation() has not been implemented yet.\n");
478 memset(*lpi, 0,
sizeof(
struct SCIP_LPi));
480 (*lpi)->prob = QScreate_prob(name, (
int) objsen);
481 if ( (*lpi)->prob ==
NULL )
487 (*lpi)->rowspace = 1024;
494 (*lpi)->colspace = 1024;
502 (*lpi)->messagehdlr = messagehdlr;
519 QSfree_prob((*lpi)->prob);
572 for( j = 0; j < nnonz; j++ )
590 SCIPdebugMessage(
"loading LP in column format into QSopt: %d cols, %d rows\n", ncols, nrows);
618 for(
i = 0;
i < ncols-1; ++
i )
626 lpi->
iccnt[ncols-1] = nnonz - beg[ncols-1];
664 SCIPdebugMessage(
"adding %d columns with %d nonzeros to QSopt\n", ncols, nnonz);
681 for(
i = 0;
i < ncols; ++
i )
693 nrows = QSget_rowcount(lpi->
prob);
694 for (
i = 0;
i < nnonz; ++
i)
696 assert( 0 <= ind[
i] && ind[
i] < nrows );
702 for(
i = 0;
i < ncols - 1; ++
i )
708 lpi->
iccnt[ncols-1] = nnonz - beg[ncols-1];
733 const int len = lastcol - firstcol + 1;
751 for(
i = firstcol ;
i <= lastcol ;
i++ )
775 ncols = QSget_colcount(lpi->
prob);
782 for(
i=0, ccnt=0;
i < ncols;
i++ )
817 SCIPdebugMessage(
"adding %d rows with %d nonzeros to QSopt\n", nrows, nnonz);
840 ncols = QSget_colcount(lpi->
prob);
841 for (
i = 0;
i < nnonz; ++
i)
844 assert( 0 <= ind[
i] && ind[
i] < ncols );
849 for(
i = 0 ;
i < nrows -1 ;
i++ )
855 lpi->
ircnt[nrows-1] = nnonz - beg[nrows-1];
860 lpi->
isen, lpi->
irng, (
const char**)rownames) );
864 for(
i = 0;
i < nrows -1; ++
i )
872 lpi->
isen, lpi->
irng, (
const char**)rownames) );
898 assert(colnames !=
NULL || namestoragesize == 0);
899 assert(namestorage !=
NULL || namestoragesize == 0);
900 assert(namestoragesize >= 0);
904 assert(firstcol <= lastcol + 1);
908 ncols = QSget_colcount(lpi->
prob);
911 rval = QSget_colnames(lpi->
prob, cnames);
912 QS_ERROR(rval,
"failed getting column names");
916 sizeleft = namestoragesize;
917 for( j = firstcol; j <= lastcol; ++j )
924 if( colnames !=
NULL )
925 colnames[j-firstcol] = s;
934 *storageleft = sizeleft;
937 for( j = 0; j < ncols; ++j )
963 assert(rownames !=
NULL || namestoragesize == 0);
964 assert(namestorage !=
NULL || namestoragesize == 0);
965 assert(namestoragesize >= 0);
969 assert(firstrow <= lastrow + 1);
973 nrows = QSget_rowcount(lpi->
prob);
976 rval = QSget_rownames(lpi->
prob, rnames);
977 QS_ERROR(rval,
"failed getting row names");
980 sizeleft = namestoragesize;
981 for(
i = firstrow;
i <= lastrow; ++
i )
988 if( rownames !=
NULL )
989 rownames[
i-firstrow] = s;
998 *storageleft = sizeleft;
1001 for(
i = 0;
i < nrows; ++
i )
1014 const int len = lastrow - firstrow + 1;
1032 for(
i = firstrow;
i <= lastrow;
i++ )
1056 nrows = QSget_rowcount(lpi->
prob);
1059 for(
i = 0;
i < nrows; ++
i )
1069 for(
i=0, ccnt=0;
i < nrows;
i++ )
1085 char savename[1024];
1098 name = QSget_probname(lpi->
prob);
1099 (void)strncpy(savename, name, 1023);
1102 QSfree_prob(lpi->
prob);
1103 lpi->
prob = QScreate_prob(savename, objsen);
1130 for (
i = 0;
i < ncols; ++
i)
1136 SCIPerrorMessage(
"LP Error: fixing lower bound for variable %d to infinity.\n", ind[
i]);
1141 SCIPerrorMessage(
"LP Error: fixing upper bound for variable %d to -infinity.\n", ind[
i]);
1147 for(
i = 0;
i < ncols; ++
i )
1152 for(
i = 0;
i < ncols; ++
i )
1187 for(
i = 0;
i < nrows; ++
i )
1193 if( lpi->
isen[
i] ==
'R' )
1215 SCIPdebugMessage(
"changing coefficient row %d, column %d in QSopt to %g\n", row, col, newval);
1266 for(
i = 0;
i < ncols; ++
i )
1293 SCIPdebugMessage(
"scaling row %d with factor %g in QSopt\n", row, scaleval);
1297 rval = QSget_ranged_rows_list(lpi->
prob, 1, rowlist, &rowcnt, &rowbeg, &rowind, &rowval, &rhs, &sense, &range, 0);
1301 for(
i = 0;
i < rowcnt[0]; ++
i )
1303 rval = QSchange_coef(lpi->
prob, row, rowind[
i], rowval[
i] * scaleval);
1310 rval = QSchange_rhscoef(lpi->
prob, row, rhs[0] * scaleval);
1312 if( sense[0] ==
'R' )
1314 rval = QSchange_range(lpi->
prob, row, range[0] * scaleval);
1324 rval = QSchange_rhscoef(lpi->
prob, row, rhs[0]*scaleval);
1328 rval = QSchange_rhscoef(lpi->
prob, row, rhs[0]*scaleval);
1330 rval = QSchange_sense(lpi->
prob, row,
'G');
1334 rval = QSchange_rhscoef(lpi->
prob, row, rhs[0]*scaleval);
1336 rval = QSchange_sense(lpi->
prob, row,
'L');
1340 rhs[0] = (rhs[0] + range[0]) * scaleval;
1341 range[0] = fabs(scaleval) * range[0];
1342 rval = QSchange_rhscoef(lpi->
prob, row, rhs[0]);
1344 rval = QSchange_range(lpi->
prob, row, range[0]);
1357 if( rowcnt !=
NULL )
1359 if( rowbeg !=
NULL )
1361 if( rowind !=
NULL )
1363 if( rowval !=
NULL )
1400 SCIPdebugMessage(
"scaling column %d with factor %g in QSopt\n", col, scaleval);
1404 rval = QSget_columns_list(lpi->
prob, 1, collist, &colcnt, &colbeg, &colind, &colval, &
obj, &lb, &ub, 0);
1408 for(
i = 0;
i < colcnt[0]; ++
i )
1410 rval = QSchange_coef(lpi->
prob, colind[
i], col, colval[
i]*scaleval);
1415 rval = QSchange_objcoef(lpi->
prob, col,
obj[0]*scaleval);
1421 scaleval = -scaleval;
1426 if( lb[0] > -QS_MAXDOUBLE )
1428 if( ub[0] < QS_MAXDOUBLE )
1431 if( lb[0] < -QS_MAXDOUBLE )
1432 lb[0] = -QS_MAXDOUBLE;
1433 if( ub[0] > QS_MAXDOUBLE )
1434 ub[0] = QS_MAXDOUBLE;
1436 rval = QSchange_bound(lpi->
prob, col,
'L', lb[0]);
1438 rval = QSchange_bound(lpi->
prob, col,
'U', ub[0]);
1443 if( colcnt !=
NULL )
1445 if( colbeg !=
NULL )
1447 if( colind !=
NULL )
1449 if( colval !=
NULL )
1484 *nrows = QSget_rowcount(lpi->
prob);
1501 *ncols = QSget_colcount(lpi->
prob);
1518 *nnonz = QSget_nzcount(lpi->
prob);
1539 const int len = lastcol - firstcol + 1;
1541 double* lval =
NULL;
1561 for(
i = 0;
i < len; ++
i )
1565 if ( nnonz !=
NULL )
1566 rval = QSget_columns_list(lpi->
prob, len, lpi->
iccnt, &lcnt, &lbeg, &lind, &lval,
NULL, lb ? (&llb) :
NULL, ub ? (&lub) :
NULL,
NULL);
1568 rval = QSget_columns_list(lpi->
prob, len, lpi->
iccnt,
NULL,
NULL,
NULL,
NULL,
NULL, lb ? (&llb) :
NULL, ub ? (&lub) :
NULL,
NULL);
1583 *nnonz = lbeg[len-1] + lcnt[len-1];
1584 for(
i = 0 ;
i < len ;
i++ )
1586 for(
i = 0;
i < *nnonz; ++
i )
1603 for(
i = 0;
i < len; ++
i )
1643 const int len = lastrow - firstrow + 1;
1645 double* lval =
NULL;
1646 double* lrhs =
NULL;
1647 double* lrng =
NULL;
1652 char* lsense =
NULL;
1666 for(
i = 0;
i < len; ++
i )
1670 if ( nnonz !=
NULL )
1671 rval = QSget_ranged_rows_list(lpi->
prob, len, lpi->
ircnt, &lcnt, &lbeg, &lind, &lval, rhs ? (&lrhs) :
NULL, rhs ? (&lsense) :
NULL, rhs ? (&lrng) :
NULL,
NULL);
1673 rval = QSget_ranged_rows_list(lpi->
prob, len, lpi->
ircnt,
NULL,
NULL,
NULL,
NULL, rhs ? (&lrhs) :
NULL, rhs ? (&lsense) :
NULL, rhs ? (&lrng) :
NULL,
NULL);
1688 *nnonz = lbeg[len-1] + lcnt[len-1];
1689 for(
i = 0 ;
i < len;
i++ )
1691 for(
i = 0;
i < *nnonz; ++
i )
1708 for(
i = 0;
i < len; ++
i )
1714 rhs[
i] = lrhs[
i] + lrng[
i];
1722 lhs[
i] = -QS_MAXDOUBLE;
1726 rhs[
i] = QS_MAXDOUBLE;
1737 if( lsense !=
NULL )
1768 if ( sense == QS_MIN )
1784 const int len = lastcol - firstcol + 1;
1795 SCIPdebugMessage(
"getting objective values %d to %d\n", firstcol, lastcol);
1799 for(
i = 0;
i < len; ++
i )
1806#ifdef SCIP_DISABLED_CODE
1810 QS_CONDRET( QSget_columns_list(lpi->
prob, len, lpi->
iccnt,
NULL,
NULL,
NULL,
NULL, &qsoptvals,
NULL,
NULL,
NULL) );
1811 for (
i = 0;
i < len; ++
i)
1812 vals[
i] = qsoptvals[
i];
1827 const int len = lastcol - firstcol + 1;
1840 for(
i = 0;
i < len; ++
i )
1858 const int len = lastrow - firstrow + 1;
1860 double* lrhs=0, *lrng=0;
1876 for(
i = 0;
i < len; ++
i )
1880 rval = QSget_ranged_rows_list(lpi->
prob, len, lpi->
ircnt, 0, 0, 0, 0, &lrhs, &lsense, &lrng, 0);
1884 for(
i = 0;
i < len; ++
i )
1890 rhss[
i] = lrhs[
i] + lrng[
i];
1893 lhss[
i] = rhss[
i] = lrhs[
i];
1897 lhss[
i] = -QS_MAXDOUBLE;
1901 rhss[
i] = QS_MAXDOUBLE;
1911 if( lsense !=
NULL )
1960 SCIPdebugMessage(
"calling QSopt primal simplex: %d cols, %d rows, %d nz\n", QSget_colcount(lpi->
prob),
1961 QSget_rowcount(lpi->
prob), QSget_nzcount(lpi->
prob));
1977 SCIPdebugMessage(
"calling QSopt dual simplex: %d cols, %d rows, %d nz\n", QSget_colcount(lpi->
prob),
1978 QSget_rowcount(lpi->
prob), QSget_nzcount(lpi->
prob));
2047 SCIPdebugMessage(
"calling QSopt strong branching on variable %d with fractional value (%d it lim)\n", col, itlim);
2056 QS_CONDRET( QSopt_strongbranch(lpi->
prob, 1, &col, &psol, down, up, itlim, QS_MAXDOUBLE) );
2061 *iter = nit - lpi->
previt;
2095 SCIPdebugMessage(
"calling QSopt strong branching on %d variables with fractional value (%d it lim)\n", ncols, itlim);
2098 for( j = 0; j < ncols; ++j )
2100 downvalid[j] =
TRUE;
2106 QS_CONDRET( QSopt_strongbranch(lpi->
prob, ncols, cols, psols, down, up, itlim, QS_MAXDOUBLE) );
2111 *iter = nit - lpi->
previt;
2141 SCIPdebugMessage(
"calling QSopt strong branching on variable %d with integral value (%d it lim)\n", col, itlim);
2188 SCIPdebugMessage(
"calling QSopt strong branching on %d variables with integral value (%d it lim)\n", ncols, itlim);
2194 for( j = 0; j < ncols; ++j )
2199 downvalid[j] =
TRUE;
2256 *primalfeasible =
TRUE;
2258 *primalfeasible =
FALSE;
2261 *dualfeasible =
TRUE;
2263 *dualfeasible =
FALSE;
2280 return (lpi->
solstat == QS_LP_UNBOUNDED);
2324 return (lpi->
solstat == QS_LP_INFEASIBLE);
2337 return (lpi->
solstat == QS_LP_OPTIMAL || lpi->
solstat == QS_LP_UNBOUNDED);
2419 return (lpi->
solstat == QS_LP_OPTIMAL);
2438 return (lpi->
solstat != QS_LP_NUMERR);
2451 return (lpi->
solstat == QS_LP_OBJ_LIMIT);
2464 return (lpi->
solstat == QS_LP_ITER_LIMIT);
2477 return (lpi->
solstat == QS_LP_TIME_LIMIT);
2552 if ( lpi->
solstat != QS_LP_OPTIMAL )
2555 nrows = QSget_rowcount(lpi->
prob);
2566 for(
i = 0;
i < nrows; ++
i )
2568 switch( lpi->
isen[
i] )
2586#ifdef SCIP_DISABLED_CODE
2594 QSget_status(lpi->
prob, &stat);
2595 if( stat == QS_LP_OPTIMAL )
2598 ncols = QSget_colcount(lpi->
prob);
2602 irstat = lpi->
ibas + ncols;
2606 for(
i = ncols ;
i-- ; )
2610 case QS_COL_BSTAT_BASIC:
2611 case QS_COL_BSTAT_FREE:
2614 SCIPerrorMessage(
"stat col[%d] = %c, rd[%d] = %lg sense %d\n",
i, icstat[
i],
i, redcost[
i] * sense, sense);
2619 case QS_COL_BSTAT_UPPER:
2622 SCIPerrorMessage(
"stat col[%d] = %c, rd[%d] = %lg sense %d\n",
i, icstat[
i],
i, redcost[
i] * sense, sense);
2627 case QS_COL_BSTAT_LOWER:
2628 if( redcost[
i] * sense < -
FEASTOL )
2630 SCIPerrorMessage(
"stat col[%d] = %c, rd[%d] = %lg sense %d\n",
i, icstat[
i],
i, redcost[
i] * sense, sense);
2636 SCIPerrorMessage(
"unknown stat col[%d] = %c, rd[%d] = %lg\n",
i, icstat[
i],
i, redcost[
i] * sense);
2673 SCIPdebugMessage(
"calling QSopt dual Farkas: %d cols, %d rows, %d non zeros\n", QSget_colcount (lpi->
prob),
2674 QSget_rowcount(lpi->
prob), QSget_nzcount(lpi->
prob));
2695 *iterations = nit - lpi->
previt;
2749 SCIPdebugMessage(
"saving QSopt basis into %p/%p\n", (
void*)cstat, (
void*)rstat);
2751 ncols = QSget_colcount(lpi->
prob);
2752 nrows = QSget_rowcount(lpi->
prob);
2762 irstat = lpi->
ibas + ncols;
2771 for(
i = 0;
i < nrows; ++
i )
2775 case QS_ROW_BSTAT_LOWER:
2776 if ( lpi->
isen[
i] ==
'L' )
2781 case QS_ROW_BSTAT_BASIC:
2784 case QS_ROW_BSTAT_UPPER:
2793 for(
i = 0;
i < ncols; ++
i )
2797 case QS_COL_BSTAT_LOWER:
2800 case QS_COL_BSTAT_BASIC:
2803 case QS_COL_BSTAT_UPPER:
2806 case QS_COL_BSTAT_FREE:
2840 SCIPdebugMessage(
"loading basis %p/%p into QSopt\n", (
void*)cstat, (
void*)rstat);
2849 irstat = lpi->
ibas + ncols;
2852 for(
i = 0;
i < nrows; ++
i )
2857 irstat[
i] = QS_ROW_BSTAT_LOWER;
2860 irstat[
i] = QS_ROW_BSTAT_BASIC;
2863 if ( lpi->
isen[
i] ==
'L' )
2864 irstat[
i] = QS_ROW_BSTAT_LOWER;
2866 irstat[
i] = QS_ROW_BSTAT_UPPER;
2874 for(
i = 0;
i < ncols; ++
i )
2879 icstat[
i] = QS_COL_BSTAT_LOWER;
2882 icstat[
i] = QS_COL_BSTAT_BASIC;
2885 icstat[
i] = QS_COL_BSTAT_UPPER;
2888 icstat[
i] = QS_COL_BSTAT_FREE;
2920 nrows = QSget_rowcount(lpi->
prob);
2921 ncols = QSget_colcount(lpi->
prob);
2924 if ( stat == QS_LP_UNSOLVED || stat == QS_LP_MODIFIED || stat == QS_LP_NUMERR )
2932 for(
i = 0;
i < nrows; ++
i )
2934 if( bind[
i] >= ncols )
2935 bind[
i] = -(bind[
i] - ncols) - 1;
2966 nrows = QSget_rowcount(lpi->
prob);
2969 SCIPdebugMessage(
"getting binv-row %d from Qsopt %d cols, %d rows, %d nonz\n",
r, QSget_colcount(lpi->
prob),
2970 QSget_rowcount(lpi->
prob), QSget_nzcount(lpi->
prob));
2973 if ( ninds !=
NULL )
2978 for (
i = 0;
i < nrows;
i++)
3049 if ( ninds !=
NULL )
3052 ncols = QSget_colcount(lpi->
prob);
3053 nrows = QSget_rowcount(lpi->
prob);
3062 for (
i = 0;
i < ncols; ++
i)
3124 ncols = QSget_colcount(lpi->
prob);
3125 nrows = QSget_rowcount(lpi->
prob);
3132 SCIPdebugMessage(
"storing QSopt LPI state in %p (%d cols, %d rows)\n", (
void*)*lpistate, ncols, nrows);
3140 (*lpistate)->ncols = ncols;
3141 (*lpistate)->nrows = nrows;
3167 if( lpistate ==
NULL )
3171 ncols = QSget_colcount(lpi->
prob);
3172 nrows = QSget_rowcount(lpi->
prob);
3179 SCIPdebugMessage(
"loading LPI state %p (%d cols, %d rows) into QSopt LP with %d cols and %d rows\n", (
void*)lpistate, lpistate->
ncols,
3180 lpistate->
nrows, ncols, nrows);
3182 if( lpistate->
ncols == 0 || lpistate->
nrows == 0 )
3191 irstat = lpi->
ibas + ncols;
3200 for(
i = lpistate->
ncols;
i < ncols; ++
i )
3218 for(
i = lpistate->
nrows;
i < nrows; ++
i )
3222 for(
i = 0;
i < nrows; ++
i )
3227 irstat[
i] = QS_ROW_BSTAT_LOWER;
3230 irstat[
i] = QS_ROW_BSTAT_BASIC;
3233 if ( lpi->
isen[
i] ==
'L' )
3234 irstat[
i] = QS_ROW_BSTAT_LOWER;
3236 irstat[
i] = QS_ROW_BSTAT_UPPER;
3245 for(
i = 0;
i < ncols; ++
i )
3250 icstat[
i] = QS_COL_BSTAT_LOWER;
3253 icstat[
i] = QS_COL_BSTAT_BASIC;
3256 icstat[
i] = QS_COL_BSTAT_UPPER;
3259 icstat[
i] = QS_COL_BSTAT_FREE;
3290 ncols = QSget_colcount(lpi->
prob);
3291 nrows = QSget_rowcount(lpi->
prob);
3293 if ( ncols == 0 || nrows == 0 )
3299 for (
i = 0;
i < ncols; ++
i)
3301 for (
i = 0;
i < nrows; ++
i)
3323 if( *lpistate !=
NULL )
3336 return (lpistate !=
NULL);
3353 rval = QSread_and_load_basis(lpi->
prob, fname);
3378 bas = QSget_basis(lpi->
prob);
3379 QS_ERROR(bas == 0,
"Could not get basis from problem.");
3382 rval = QSwrite_basis(lpi->
prob, bas, fname);
3422 ncols = QSget_colcount(lpi->
prob);
3423 nrows = QSget_rowcount(lpi->
prob);
3427 (*lpinorms)->ncols = ncols;
3428 (*lpinorms)->nrows = nrows;
3430 if ( QStest_row_norms(lpi->
prob) )
3436 QS_CONDRET( QSget_basis_and_row_norms_array(lpi->
prob, (*lpinorms)->cstat, (*lpinorms)->rstat, (*lpinorms)->norms) );
3440 (*lpinorms)->cstat =
NULL;
3441 (*lpinorms)->rstat =
NULL;
3442 (*lpinorms)->norms =
NULL;
3467 ncols = QSget_colcount(lpi->
prob);
3468 nrows = QSget_rowcount(lpi->
prob);
3469 if ( nrows != lpinorms->
nrows || ncols != lpinorms->
ncols )
3489 if ( (*lpinorms)->norms !=
NULL )
3491 assert( (*lpinorms)->cstat !=
NULL && (*lpinorms)->rstat !=
NULL );
3533 QS_CONDRET( QSget_param(lpi->
prob, QS_PARAM_SIMPLEX_SCALING, ival) );
3534 assert((*ival) == 0 || (*ival) == 1);
3541 QS_CONDRET( QSget_param(lpi->
prob, QS_PARAM_SIMPLEX_DISPLAY, ival) );
3548 QS_CONDRET( QSget_param(lpi->
prob, QS_PARAM_SIMPLEX_MAX_ITERATIONS, ival) );
3573 QS_CONDRET( QSset_param(lpi->
prob, QS_PARAM_SIMPLEX_SCALING, 0) );
3575 QS_CONDRET( QSset_param(lpi->
prob, QS_PARAM_SIMPLEX_SCALING, 1) );
3586 QS_CONDRET( QSset_param(lpi->
prob, QS_PARAM_PRIMAL_PRICING, QS_PRICE_PSTEEP) );
3587 QS_CONDRET( QSset_param(lpi->
prob, QS_PARAM_DUAL_PRICING, QS_PRICE_DSTEEP) );
3590 QS_CONDRET( QSset_param(lpi->
prob,QS_PARAM_PRIMAL_PRICING,QS_PRICE_PMULTPARTIAL) );
3591 QS_CONDRET( QSset_param(lpi->
prob,QS_PARAM_DUAL_PRICING,QS_PRICE_DMULTPARTIAL) );
3594 QS_CONDRET( QSset_param(lpi->
prob,QS_PARAM_PRIMAL_PRICING,QS_PRICE_PDEVEX) );
3595 QS_CONDRET( QSset_param(lpi->
prob,QS_PARAM_DUAL_PRICING,QS_PRICE_DDEVEX) );
3603 QS_CONDRET( QSset_param(lpi->
prob, QS_PARAM_SIMPLEX_DISPLAY, 1) );
3605 QS_CONDRET( QSset_param(lpi->
prob, QS_PARAM_SIMPLEX_DISPLAY, 0) );
3611 QS_CONDRET( QSset_param(lpi->
prob, QS_PARAM_SIMPLEX_MAX_ITERATIONS, ival) );
3639 if ( sense == QS_MIN )
3641 QS_CONDRET( QSget_param_double(lpi->
prob, QS_PARAM_OBJULIM, dval) );
3645 QS_CONDRET( QSget_param_double(lpi->
prob, QS_PARAM_OBJLLIM, dval) );
3650 QS_CONDRET( QSget_param_double(lpi->
prob, QS_PARAM_SIMPLEX_MAX_TIME, dval) );
3684 QS_CONDRET( QSset_param_double(lpi->
prob, QS_PARAM_SIMPLEX_MAX_TIME, dval) );
3690 if ( sense == QS_MIN )
3692 QS_CONDRET( QSset_param_double(lpi->
prob, QS_PARAM_OBJULIM, dval) );
3696 QS_CONDRET( QSset_param_double(lpi->
prob, QS_PARAM_OBJLLIM, dval) );
3741 return QS_MAXDOUBLE;
3751 return (val >= QS_MAXDOUBLE);
3779 QSfree_prob(lpi->
prob);
3784 lpi->
prob = QSread_prob(fname,
"LP");
3785 if( lpi->
prob == 0 )
3803 if( QSwrite_prob (lpi->
prob, fname,
"LP") )
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 *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 **rownames, 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 **colnames, 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 **rownames, 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)
assert(minobj< SCIPgetCutoffbound(scip))
interface methods for specific LP solvers
static int rowpacketNum(int nrows)
SCIP_DUALPACKET ROWPACKET
SCIP_DUALPACKET COLPACKET
static int colpacketNum(int ncols)
static void lpistatePack(SCIP_LPISTATE *lpistate, const int *cstat, const int *rstat)
static void lpistateUnpack(const SCIP_LPISTATE *lpistate, int *cstat, int *rstat)
static int rowpacketNum(int nrows)
static SCIP_RETCODE ensureTabMem(SCIP_LPI *const lpi, int sz)
enum LPI_QSOPT_Algo LPI_QSOPT_ALGO
static void lpistateFree(SCIP_LPISTATE **lpistate, BMS_BLKMEM *blkmem)
#define QS_TESTG(A, B, C)
static int colpacketNum(int ncols)
static SCIP_RETCODE ensureRowMem(SCIP_LPI *const lpi, int nrows)
static SCIP_RETCODE convertSides(SCIP_LPI *const lpi, int nrows, const double *const lhs, const double *const rhs)
static SCIP_RETCODE ensureColMem(SCIP_LPI *const lpi, int ncols)
static SCIP_RETCODE lpistateCreate(SCIP_LPISTATE **lpistate, BMS_BLKMEM *blkmem, int ncols, int nrows)
#define BMSfreeMemory(ptr)
#define BMSfreeBlockMemory(mem, ptr)
#define BMSallocBlockMemory(mem, ptr)
#define BMSreallocMemoryArray(ptr, num)
#define BMSallocMemoryArray(ptr, num)
#define BMSfreeMemoryArray(ptr)
#define BMSallocBlockMemoryArray(mem, ptr, num)
#define BMScopyMemoryArray(ptr, source, num)
#define BMSfreeBlockMemoryArray(mem, ptr, num)
struct BMS_BlkMem BMS_BLKMEM
#define BMSallocMemory(ptr)
public methods for message output
public data structures and miscellaneous methods
SCIP_MESSAGEHDLR * messagehdlr
@ SCIP_PRICING_STEEPQSTART
@ SCIP_PRICING_LPIDEFAULT
enum SCIP_LPParam SCIP_LPPARAM
struct SCIP_LPiState SCIP_LPISTATE
struct SCIP_LPiNorms SCIP_LPINORMS
@ SCIP_LPPAR_BARRIERCONVTOL
enum SCIP_LPSolQuality SCIP_LPSOLQUALITY
enum SCIP_ObjSen SCIP_OBJSEN
struct SCIP_Messagehdlr SCIP_MESSAGEHDLR
enum SCIP_Retcode SCIP_RETCODE