41#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
57static char __qsstr[1024];
58static char __egstr[1024];
63#define COLS_PER_PACKET SCIP_DUALPACKETSIZE
65#define ROWS_PER_PACKET SCIP_DUALPACKETSIZE
70#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
72 mpq_factor_work* factor;
99#define __QS_PRINTLOC__ fprintf(stderr,", in (%s:%d)\n", __FILE__, __LINE__);
103#define QS_TESTG(A,B,...) do { { \
105 fprintf(stderr,__VA_ARGS__); \
107 goto B; } } } while(0)
110#define QS_ERROR(A,...) do { { \
112 fprintf(stderr,__VA_ARGS__); \
114 return SCIP_LPERROR; } } } while(0)
118#define QS_RETURN(A) do { \
119 const int __RVAL__ = (A); \
121 fprintf(stderr,"LP Error: QSopt_ex returned %d",__RVAL__); \
123 return SCIP_ERROR; } \
124 return SCIP_OKAY; } while(0)
128#define QS_CONDRET(A) do { \
129 const int __RVAL__ = (A); \
131 fprintf(stderr,"LP Error: QSopt_ex returned %d",__RVAL__); \
133 return SCIP_LPERROR; } \
158 buffer = (
char*) malloc(mpz_sizeinbase(mpq_numref(val), 10) + mpz_sizeinbase(mpq_denref(val), 10) + 3);
159 (void)mpq_get_str(buffer, 10, val);
160 printf(
"%s \n", buffer);
268 for(
i = lpi->tbsz ;
i < sz * 2 ;
i++ )
269 mpq_init(lpi->itab[
i]);
282 if( lpi->colspace < ncols )
284 lpi->colspace = ncols * 2;
299 if( lpi->rowspace < nrows )
306 for (
i = lpi->rowspace ;
i < nrows * 2;
i++)
308 mpq_init(lpi->irhs[
i]);
309 mpq_init(lpi->irng[
i]);
311 lpi->rowspace = nrows * 2;
328 for(
i = 0;
i < nrows; ++
i )
335 lhsg = SCIPrationalGetGMP(lhs[
i]);
336 rhsg = SCIPrationalGetGMP(rhs[
i]);
337#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
338 state1 = ((mpq_cmp(*lhsg, mpq_ILL_MINDOUBLE) <= 0) ? 1U : 0U);
339 state2 = ((mpq_cmp(*rhsg, mpq_ILL_MAXDOUBLE) >= 0) ? 2U : 0U);
340 state = state1 | state2;
355 mpq_set(lpi->irhs[
i], *lhsg);
356 mpq_set_ui(lpi->irng[
i], 0UL, 1UL);
361 mpq_set(lpi->irhs[
i], *lhsg);
362 mpq_sub(lpi->irng[
i], *rhsg, *lhsg);
363 assert( mpq_sgn(lpi->irng[
i]) >=0 );
368 mpq_set(lpi->irhs[
i], *rhsg);
369 mpq_set_ui(lpi->irng[
i], 0UL, 1UL);
373 mpq_set(lpi->irhs[
i], *lhsg);
374 mpq_set_ui(lpi->irng[
i], 0UL, 1UL);
399#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
400 sprintf(__qsstr,
"QSopt_ex %s", string_QSopt_ex);
402 sprintf(__qsstr,
"QSopt_ex");
413 return "Exact Linear Programming Solver by D. Espinoza, W. Cook, S. Dash, and D. Applegate (dii.uchile.cl/~daespino/QSoptExact_doc/main.html)";
421#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
422 sprintf(__egstr,
"EGlib %s", string_EGlib);
424 sprintf(__egstr,
"EGlib");
435 return "Library for basic structures and utilities by D. Espinoza and M. Goycoolea (dii.uchile.cl/~daespino/EGlib_doc/main.html)";
438#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
445 return (
void*) lpi->prob;
463 if( !__QSexact_setup )
474 if( __QSexact_setup )
504 (*lpi)->factor = (mpq_factor_work*)
NULL;
506 (*lpi)->prob = mpq_QScreate_prob(name, (
int) objsen);
507 if( (*lpi)->prob ==
NULL )
513 (*lpi)->rowspace = 1024;
520 (*lpi)->colspace = 1024;
527 for(
i = 0;
i < 1024;
i++ )
529 mpq_init((*lpi)->irhs[
i]);
530 mpq_init((*lpi)->irng[
i]);
531 mpq_init((*lpi)->itab[
i]);
550 if( (*lpi)->factor !=
NULL )
552 mpq_ILLfactor_free_factor_work((*lpi)->factor);
557 mpq_QSfree_prob((*lpi)->prob);
558 for(
i = 0;
i < (*lpi)->tbsz; ++
i )
559 mpq_clear((*lpi)->itab[
i]);
560 for(
i = 0;
i < (*lpi)->rowspace; ++
i )
562 mpq_clear((*lpi)->irng[
i]);
563 mpq_clear((*lpi)->irhs[
i]);
616 SCIPdebugMessage(
"loading LP in column format into QSopt_ex: %d cols, %d rows\n", ncols, nrows);
624 rval = mpq_QSchange_objsense(lpi->prob, QS_MAX);
629 rval = mpq_QSchange_objsense(lpi->prob, QS_MIN);
640 rval = mpq_QSadd_ranged_rows(lpi->prob, nrows, lpi->ircnt, lpi->irbeg, 0, (
const mpq_t*) 0, (
const mpq_t*) lpi->irhs,
641 lpi->isen, (
const mpq_t*) lpi->irng, (
const char**)rownames);
670 SCIPdebugMessage(
"adding %d columns with %d nonzeros to QSopt_ex\n", ncols, nnonz);
680 for(
i = 0;
i < ncols - 1; ++
i )
682 lpi->iccnt[
i] = beg[
i+1] - beg[
i];
687 lpi->iccnt[ncols-1] = nnonz - beg[ncols-1];
688 assert( lpi->iccnt[ncols-1] >= 0 );
692 SCIPrationalSetGMPArray(valgmp, val, nnonz);
695 for(
i = 0;
i < ncols; ++
i )
697 mpq_QSadd_col(lpi->prob, lpi->iccnt[
i], &ind[beg[
i]], &(valgmp[beg[
i]]),
698 *SCIPrationalGetGMP(
obj[
i]), *SCIPrationalGetGMP(lb[
i]), *SCIPrationalGetGMP(ub[
i]), (
const char*) colnames[
i]);
701 SCIPrationalClearArrayGMP(valgmp, nnonz);
706 for(
i = 0;
i < ncols; ++
i )
708 rval = mpq_QSnew_col(lpi->prob, *SCIPrationalGetGMP(
obj[
i]), *SCIPrationalGetGMP(lb[
i]), *SCIPrationalGetGMP(ub[
i]), (
const char*) colnames[
i]);
722 const int len = lastcol - firstcol +1;
730 assert(0 <= firstcol && len > 0 && lastcol < mpq_QSget_colcount (lpi->prob));
735 for(
i = firstcol ;
i <= lastcol ;
i++ )
736 lpi->iccnt[
i-firstcol] =
i;
738 rval = mpq_QSdelete_cols(lpi->prob, len, lpi->iccnt);
751 int rval = 0, ncols, ccnt;
757 ncols = mpq_QSget_colcount(lpi->prob);
762 rval = mpq_QSdelete_setcols(lpi->prob,dstat);
765 for(
i = 0, ccnt = 0;
i < ncols;
i++ )
797 SCIPdebugMessage(
"adding %d rows with %d nonzeros to QSopt_ex\n", nrows, nnonz);
806 for(
i = 0;
i < nrows - 1;
i++ )
808 lpi->ircnt[
i] = beg[
i + 1] - beg[
i];
813 lpi->ircnt[nrows - 1] = nnonz - beg[nrows - 1];
814 assert(lpi->ircnt[nrows - 1] >= 0);
818 SCIPrationalSetGMPArray(valgmp, val, nnonz);
820 rval = mpq_QSadd_ranged_rows(lpi->prob, nrows, lpi->ircnt, beg, ind, (
const mpq_t*) valgmp, (
const mpq_t*) lpi->irhs,
821 lpi->isen, (
const mpq_t*) lpi->irng, (
const char**) rownames);
824 SCIPrationalClearArrayGMP(valgmp, nnonz);
838 const int len = lastrow - firstrow +1;
846 assert(0 <= firstrow && len > 0 && lastrow < mpq_QSget_rowcount (lpi->prob));
851 for(
i = firstrow;
i <= lastrow;
i++ )
852 lpi->ircnt[
i - firstrow] =
i;
853 rval = mpq_QSdelete_rows(lpi->prob, len, lpi->ircnt);
867 int rval = 0, nrows, ccnt, ndel=0;
873 nrows = mpq_QSget_rowcount(lpi->prob);
876 for(
i = 0;
i < nrows; ++
i )
884 rval = mpq_QSdelete_setrows(lpi->prob,dstat);
887 for(
i = 0, ccnt = 0;
i < nrows; ++
i )
903 int ncols, nrows, rval = 0;
911 ncols = mpq_QSget_colcount(lpi->prob);
912 nrows = mpq_QSget_rowcount(lpi->prob);
916 for (
i = 0;
i < ncols; ++
i)
918 rval = mpq_QSdelete_cols(lpi->prob, ncols, lpi->iccnt);
925 for (
i = 0;
i < nrows; ++
i)
927 rval = mpq_QSdelete_rows(lpi->prob, nrows, lpi->ircnt);
958 for( j = 0; j < ncols; ++j )
961 gmp_snprintf(s,
SCIP_MAXSTRLEN,
" col %d: [--,%Qd]\n", ind[j], *SCIPrationalGetGMP(ub[j]));
962 else if( ub ==
NULL )
963 gmp_snprintf(s,
SCIP_MAXSTRLEN,
" col %d: [%Qd,--]\n", ind[j], *SCIPrationalGetGMP(lb[j]));
965 gmp_snprintf(s,
SCIP_MAXSTRLEN,
" col %d: [%Qd,%Qd]\n", ind[j], *SCIPrationalGetGMP(lb[j]), *SCIPrationalGetGMP(ub[j]));
975 for(
i = 0;
i < ncols;
i++ )
978 rval = mpq_QSchange_bound(lpi->prob, ind[
i], lpi->iccha[
i], *SCIPrationalGetGMP(lb[
i]));
985 for(
i = 0;
i < ncols;
i++ )
988 rval = mpq_QSchange_bound(lpi->prob, ind[
i], lpi->iccha[
i], *SCIPrationalGetGMP(ub[
i]));
1019 for(
i = 0;
i < nrows; ++
i )
1021 rval = mpq_QSchange_sense(lpi->prob, ind[
i], lpi->isen[
i]);
1024 rval = mpq_QSchange_rhscoef(lpi->prob, ind[
i], lpi->irhs[
i]);
1027 if (lpi->isen[
i] ==
'R')
1029 rval = mpq_QSchange_range(lpi->prob, ind[
i], lpi->irng[
i]);
1054 rval = mpq_QSchange_coef(lpi->prob, row, col, *SCIPrationalGetGMP(newval));
1076 rval = mpq_QSchange_objsense(lpi->prob, QS_MAX);
1081 rval = mpq_QSchange_objsense(lpi->prob, QS_MIN);
1105 for(
i = 0;
i < ncols; ++
i )
1107 rval = mpq_QSchange_objcoef(lpi->prob, ind[
i], *SCIPrationalGetGMP(
obj[
i]));
1137 rval = mpq_QSget_ranged_rows_list(lpi->prob, 1, rowlist, &rowcnt, &rowbeg, &rowind, &rowval, &rhs, &sense, &range, 0);
1141 for(
i = 0;
i < rowcnt[0]; ++
i )
1143 mpq_mul(svl, rowval[
i], *SCIPrationalGetGMP(scaleval));
1144 rval = mpq_QSchange_coef(lpi->prob, row, rowind[
i], svl);
1151 mpq_mul(svl, *SCIPrationalGetGMP(scaleval), rhs[0]);
1152 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1154 if (sense[0] ==
'R')
1156 mpq_mul(svl, range[0], *SCIPrationalGetGMP(scaleval));
1157 rval = mpq_QSchange_range(lpi->prob, row, svl);
1167 mpq_mul(svl, rhs[0], *SCIPrationalGetGMP(scaleval));
1168 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1172 mpq_mul(svl, rhs[0], *SCIPrationalGetGMP(scaleval));
1173 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1175 rval = mpq_QSchange_sense(lpi->prob, row,
'G');
1179 mpq_mul(svl, rhs[0], *SCIPrationalGetGMP(scaleval));
1180 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1182 rval = mpq_QSchange_sense(lpi->prob, row,
'L');
1186 mpq_add(svl, rhs[0], range[0]);
1187 mpq_mul(svl, svl, *SCIPrationalGetGMP(scaleval));
1188 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1190 mpq_abs(svl,*SCIPrationalGetGMP(scaleval));
1191 mpq_mul(svl, svl, range[0]);
1192 rval = mpq_QSchange_range(lpi->prob, row, svl);
1204 if (rowcnt) mpq_QSfree(rowcnt);
1205 if (rowbeg) mpq_QSfree(rowbeg);
1206 if (rowind) mpq_QSfree(rowind);
1207 if (rowval) mpq_EGlpNumFreeArray(rowval);
1208 if (rhs) mpq_EGlpNumFreeArray(rhs);
1209 if (sense) mpq_QSfree(sense);
1210 if (range) mpq_EGlpNumFreeArray(range);
1227 int* colcnt=0, *colbeg=0, *colind=0;
1228 mpq_t* colval=0, *lb=0, *ub=0, *
obj=0;
1242 rval = mpq_QSget_columns_list(lpi->prob, 1, collist, &colcnt, &colbeg, &colind, &colval, &
obj, &lb, &ub, 0);
1246 for(
i = 0;
i < colcnt[0]; ++
i )
1248 mpq_mul(svl, colval[
i], *SCIPrationalGetGMP(scaleval));
1249 rval = mpq_QSchange_coef(lpi->prob, colind[
i], col, svl);
1254 mpq_mul(svl,
obj[0], *SCIPrationalGetGMP(scaleval));
1255 rval = mpq_QSchange_objcoef(lpi->prob, col, svl);
1259 if( mpq_sgn(*SCIPrationalGetGMP(scaleval)) < 0 )
1261 mpq_set(
obj[0], lb[0]);
1262 mpq_neg(lb[0], ub[0]);
1263 mpq_neg(ub[0],
obj[0]);
1265 if( mpq_cmp(lb[0],mpq_ILL_MINDOUBLE) > 0 )
1267 mpq_abs(svl,*SCIPrationalGetGMP(scaleval));
1268 mpq_mul(lb[0], lb[0], svl);
1270 if( mpq_cmp(ub[0], mpq_ILL_MAXDOUBLE) < 0 )
1272 mpq_abs(svl, *SCIPrationalGetGMP(scaleval));
1273 mpq_mul(ub[0], ub[0], svl);
1276 if( mpq_cmp(lb[0], mpq_ILL_MINDOUBLE) < 0 )
1277 mpq_set(lb[0], mpq_ILL_MINDOUBLE);
1278 if( mpq_cmp(ub[0], mpq_ILL_MAXDOUBLE) > 0 )
1279 mpq_set(ub[0], mpq_ILL_MAXDOUBLE);
1281 rval = mpq_QSchange_bound(lpi->prob, col,
'L', lb[0]);
1283 rval = mpq_QSchange_bound(lpi->prob, col,
'U', ub[0]);
1288 if (colcnt) mpq_QSfree(colcnt);
1289 if (colbeg) mpq_QSfree(colbeg);
1290 if (colind) mpq_QSfree(colind);
1291 if (colval) mpq_EGlpNumFreeArray(colval);
1292 if (
obj) mpq_EGlpNumFreeArray(
obj);
1293 if (lb) mpq_EGlpNumFreeArray(lb);
1294 if (ub) mpq_EGlpNumFreeArray(ub);
1320 *nrows = mpq_QSget_rowcount(lpi->prob);
1337 *ncols = mpq_QSget_colcount(lpi->prob);
1353 *nnonz = mpq_QSget_nzcount(lpi->prob);
1386 assert( 0 <= firstcol && firstcol <= lastcol && lastcol < mpq_QSget_colcount (lpi->prob) );
1387 assert( (lb == 0 && ub == 0) || (lb != 0 && ub != 0));
1388 assert( (nnonz != 0 && beg != 0 && ind != 0 && val != 0) || (nnonz == 0 && beg == 0 && ind == 0 && val == 0) );
1393 len = lastcol - firstcol + 1;
1395 for(
i = 0;
i < len; ++
i )
1396 lpi->iccnt[
i] =
i + firstcol;
1399 rval = mpq_QSget_columns_list(lpi->prob, len, lpi->iccnt, nnonz ? (&lcnt) : 0, nnonz ? (&lbeg) : 0, nnonz ? (&lind) : 0,
1400 nnonz ? (&lval) : 0, 0, lb ? (&llb) : 0, lb ? (&lub) : 0, 0);
1412 *nnonz = lbeg[len-1] + lcnt[len-1];
1413 for(
i = 0 ;
i < len ;
i++ )
1415 for(
i = 0;
i < *nnonz; ++
i )
1418 SCIPrationalSetGMP(val[
i], lval[
i]);
1426 for(
i = 0;
i < len; ++
i )
1428 SCIPrationalSetGMP(lb[
i], llb[
i]);
1429 SCIPrationalSetGMP(ub[
i], lub[
i]);
1434 if (lval) mpq_EGlpNumFreeArray(lval);
1435 if (lub) mpq_EGlpNumFreeArray(lub);
1436 if (llb) mpq_EGlpNumFreeArray(llb);
1437 if (lind) mpq_QSfree(lind);
1438 if (lbeg) mpq_QSfree(lbeg);
1439 if (lcnt) mpq_QSfree(lcnt);
1460 const int len = lastrow - firstrow + 1;
1469 char* lsense =
NULL;
1473 assert(0 <= firstrow && firstrow <= lastrow && lastrow < mpq_QSget_rowcount (lpi->prob));
1474 assert( (lhs == 0 && rhs == 0) || (rhs != 0 && lhs != 0));
1475 assert( (nnonz != 0 && beg != 0 && ind != 0 && val != 0) || (nnonz == 0 && beg == 0 && ind == 0 && val == 0));
1481 for(
i = 0;
i < len; ++
i )
1482 lpi->ircnt[
i] =
i + firstrow;
1485 rval = mpq_QSget_ranged_rows_list(lpi->prob, len, lpi->ircnt, nnonz ? (&lcnt) : 0, nnonz ? (&lbeg) : 0, nnonz ? (&lind) : 0,
1486 nnonz ? (&lval) : 0, rhs ? (&lrhs) : 0, rhs ? (&lsense) : 0, rhs ? (&lrng) : 0, 0);
1497 *nnonz = lbeg[len-1] + lcnt[len-1];
1498 for(
i = 0;
i < len;
i++ )
1500 for(
i = 0;
i < *nnonz; ++
i )
1503 SCIPrationalSetGMP(val[
i], lval[
i]);
1512 for(
i = 0;
i < len; ++
i )
1517 SCIPrationalSetGMP(lhs[
i], lrhs[
i]);
1518 SCIPrationalSetGMP(rhs[
i], lrng[
i]);
1522 SCIPrationalSetGMP(lhs[
i], lrhs[
i]);
1523 SCIPrationalSetGMP(rhs[
i], lrhs[
i]);
1526 SCIPrationalSetGMP(rhs[
i], lrhs[
i]);
1527 SCIPrationalSetGMP(lhs[
i], mpq_ILL_MINDOUBLE);
1530 SCIPrationalSetGMP(lhs[
i], lrhs[
i]);
1531 SCIPrationalSetGMP(rhs[
i], mpq_ILL_MAXDOUBLE);
1541 if (lsense) mpq_QSfree(lsense);
1542 if (lrng) mpq_EGlpNumFreeArray(lrng);
1543 if (lrhs) mpq_EGlpNumFreeArray(lrhs);
1544 if (lval) mpq_EGlpNumFreeArray(lval);
1545 if (lind) mpq_QSfree(lind);
1546 if (lbeg) mpq_QSfree(lbeg);
1547 if (lcnt) mpq_QSfree(lcnt);
1560 const int len = lastcol - firstcol + 1;
1567 assert(0 <= firstcol && firstcol <= lastcol && lastcol < mpq_QSget_colcount (lpi->prob));
1569 SCIPdebugMessage(
"getting objective values %d to %d\n", firstcol, lastcol);
1573 for(
i = 0;
i < len; ++
i )
1574 lpi->iccnt[
i] =
i + firstcol;
1577 SCIPrationalSetGMPArray(valgmp, vals, len);
1579 rval = mpq_QSget_obj_list(lpi->prob, len, lpi->iccnt, valgmp);
1580 SCIPrationalSetArrayGMP(vals, valgmp, len);
1582 SCIPrationalClearArrayGMP(valgmp, len);
1597 const int len = lastcol - firstcol + 1;
1603 assert(0 <= firstcol && firstcol <= lastcol&& lastcol < mpq_QSget_colcount (lpi->prob));
1609 for(
i = 0;
i < len; ++
i )
1613 QS_CONDRET( mpq_QSget_bound(lpi->prob,
i + firstcol,
'L', SCIPrationalGetGMP(lbs[
i])) );
1619 QS_CONDRET( mpq_QSget_bound(lpi->prob,
i + firstcol,
'U', SCIPrationalGetGMP(ubs[
i])) );
1637 const int len = lastrow - firstrow + 1;
1646 assert(0 <= firstrow && firstrow <= lastrow && lastrow < mpq_QSget_rowcount (lpi->prob));
1647 assert(rhss != 0 && lhss != 0);
1653 for(
i = 0;
i < len; ++
i )
1654 lpi->ircnt[
i] =
i + firstrow;
1657 rval = mpq_QSget_ranged_rows_list(lpi->prob, len, lpi->ircnt, 0, 0, 0, 0, &lrhs, &lsense, &lrng, 0);
1661 for(
i = 0;
i < len; ++
i )
1666 SCIPrationalSetGMP(lhss[
i], lrhs[
i]);
1667 SCIPrationalSetGMP(rhss[
i], lrng[
i]);
1671 SCIPrationalSetGMP(lhss[
i], lrhs[
i]);
1672 SCIPrationalSetGMP(rhss[
i], lrhs[
i]);
1675 SCIPrationalSetGMP(rhss[
i], lrhs[
i]);
1676 SCIPrationalSetGMP(lhss[
i], mpq_ILL_MINDOUBLE);
1679 SCIPrationalSetGMP(lhss[
i], lrhs[
i]);
1680 SCIPrationalSetGMP(rhss[
i], mpq_ILL_MAXDOUBLE);
1692 mpq_EGlpNumFreeArray(lrng);
1694 mpq_EGlpNumFreeArray(lrhs);
1714 rval = mpq_QSget_coef(lpi->prob, row, col, SCIPrationalGetGMP(val));
1741 SCIPdebugMessage(
"calling QSopt_ex primal simplex: %d cols, %d rows, %d nz\n", mpq_QSget_colcount(lpi->prob),
1742 mpq_QSget_rowcount(lpi->prob), mpq_QSget_nzcount(lpi->prob));
1744 B = mpq_QSget_basis(lpi->prob);
1745 rval = QSexact_solver(lpi->prob, 0, 0, B, PRIMAL_SIMPLEX, &(lpi->solstat));
1747 mpq_QSfree_basis(B);
1763 SCIPdebugMessage(
"calling QSopt_ex dual simplex: %d cols, %d rows, %d nz\n", mpq_QSget_colcount(lpi->prob),
1764 mpq_QSget_rowcount(lpi->prob), mpq_QSget_nzcount(lpi->prob));
1766 B = mpq_QSget_basis(lpi->prob);
1767 rval = QSexact_solver(lpi->prob, 0, 0, B, DUAL_SIMPLEX, &(lpi->solstat));
1769 mpq_QSfree_basis(B);
1800 return (lpi->solstat != 0 && lpi->solstat != QS_LP_MODIFIED && lpi->solstat != QS_LP_CHANGE_PREC);
1815 *primalfeasible =
FALSE;
1816 *dualfeasible =
FALSE;
1818 if( lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_UNBOUNDED )
1819 *primalfeasible =
TRUE;
1825 if( lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_INFEASIBLE || lpi->solstat == QS_LP_OBJ_LIMIT )
1827 if( lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_INFEASIBLE )
1829 *dualfeasible =
TRUE;
1846 return (lpi->solstat == QS_LP_UNBOUNDED);
1875 return (lpi->solstat == QS_LP_UNBOUNDED);
1888 return (lpi->solstat == QS_LP_INFEASIBLE);
1901 return (lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_UNBOUNDED);
1916 return (lpi->solstat == QS_LP_INFEASIBLE);
1931 return (lpi->solstat == QS_LP_INFEASIBLE);
1944 return (lpi->solstat == QS_LP_INFEASIBLE);
1957 return (lpi->solstat == QS_LP_UNBOUNDED);
1971 return (lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_OBJ_LIMIT );
1973 return (lpi->solstat == QS_LP_OPTIMAL);
1987 return (lpi->solstat == QS_LP_OPTIMAL);
2000 return (lpi->solstat != QS_LP_NUMERR);
2014 return (lpi->solstat == QS_LP_OBJ_LIMIT);
2030 return (lpi->solstat == QS_LP_ITER_LIMIT);
2043 return (lpi->solstat == QS_LP_TIME_LIMIT);
2056 return lpi->solstat;
2089 rval = mpq_QSget_objval(lpi->prob, SCIPrationalGetGMP(
objval));
2106 int rval = 0, nrows, ncols;
2108 mpq_t* primsolgmp, *dualsolgmp, *redcostgmp, *objvalgmp;
2115 nrows = mpq_QSget_rowcount(lpi->prob);
2116 ncols = mpq_QSget_colcount(lpi->prob);
2124 SCIPrationalSetGMPArray(primsolgmp,
primsol, ncols);
2126 if( redcost ==
NULL )
2131 SCIPrationalSetGMPArray(redcostgmp, redcost, ncols);
2133 if( dualsol ==
NULL )
2138 SCIPrationalSetGMPArray(dualsolgmp, dualsol, nrows);
2142 objvalgmp = SCIPrationalGetGMP(
objval);
2148 rval = mpq_QSget_solution(lpi->prob, objvalgmp, primsolgmp, dualsolgmp, lpi->irng, redcostgmp);
2153 if( redcost !=
NULL )
2155 SCIPrationalSetArrayGMP(redcost, redcostgmp, ncols);
2156 SCIPrationalClearArrayGMP(redcostgmp, ncols);
2161 SCIPrationalSetArrayGMP(
primsol, primsolgmp, ncols);
2162 SCIPrationalClearArrayGMP(primsolgmp, ncols);
2165 if( dualsol !=
NULL )
2167 SCIPrationalSetArrayGMP(dualsol, dualsolgmp, nrows);
2168 SCIPrationalClearArrayGMP(dualsolgmp, nrows);
2174 rval = mpq_QSget_rhs(lpi->prob, lpi->irhs);
2176 rval = mpq_QSget_senses(lpi->prob, lpi->isen);
2180 if( activity !=
NULL )
2182 for(
i = 0;
i < nrows; ++
i )
2184 switch (lpi->isen[
i])
2189 mpq_add(*SCIPrationalGetGMP(activity[
i]), lpi->irhs[
i], lpi->irng[
i]);
2194 mpq_sub(*SCIPrationalGetGMP(activity[
i]), lpi->irhs[
i], lpi->irng[
i]);
2217 SCIPerrorMessage(
"SCIPlpiExactGetPrimalRay() not supported by QSopt_ex.\n");
2230 mpq_t* dualfarkasgmp;
2236 SCIPdebugMessage(
"calling QSopt_ex dual farkas: %d cols, %d rows, %d non zeros\n", mpq_QSget_colcount (lpi->prob),
2237 mpq_QSget_rowcount(lpi->prob), mpq_QSget_nzcount(lpi->prob));
2239 nrows = mpq_QSget_rowcount(lpi->prob);\
2241 SCIPrationalSetGMPArray(dualfarkasgmp, dualfarkas, nrows);
2243 rval = mpq_QSget_infeas_array(lpi->prob, dualfarkasgmp);
2245 SCIPrationalSetArrayGMP(dualfarkas, dualfarkasgmp, nrows);
2246 SCIPrationalClearArrayGMP(dualfarkasgmp, nrows);
2263 rval = mpq_QSget_itcnt(lpi->prob, 0, 0, 0, 0, &nit);
2266 *iterations = nit - lpi->previt;
2288 int rval = 0, ncols, nrows;
2289 char* icstat =
NULL;
2290 char* irstat =
NULL;
2296 SCIPdebugMessage(
"saving QSopt_ex basis into %p/%p\n", (
void *) cstat, (
void *) rstat);
2298 ncols = mpq_QSget_colcount(lpi->prob);
2299 nrows = mpq_QSget_rowcount(lpi->prob);
2304 irstat = lpi->ibas+ncols;
2305 rval = mpq_QSget_basis_array(lpi->prob, icstat, irstat);
2309 for(
i = 0;
i < nrows; ++
i )
2313 case QS_ROW_BSTAT_LOWER:
2316 case QS_ROW_BSTAT_BASIC:
2319 case QS_ROW_BSTAT_UPPER:
2327 for(
i = 0;
i < ncols; ++
i )
2331 case QS_COL_BSTAT_LOWER:
2334 case QS_COL_BSTAT_BASIC:
2337 case QS_COL_BSTAT_UPPER:
2340 case QS_COL_BSTAT_FREE:
2358 int rval = 0, ncols, nrows;
2360 char* icstat=0, *irstat = 0;
2365 SCIPdebugMessage(
"loading basis %p/%p into QSopt_ex\n", (
void *) cstat, (
void *) rstat);
2367 ncols = mpq_QSget_colcount(lpi->prob);
2368 nrows = mpq_QSget_rowcount(lpi->prob);
2376 irstat = lpi->ibas + ncols;
2379 for(
i = 0;
i < nrows; ++
i )
2384 irstat[
i] = QS_ROW_BSTAT_LOWER;
2387 irstat[
i] = QS_ROW_BSTAT_BASIC;
2393 if( lpi->isen[
i] ==
'R' )
2395 irstat[
i] = QS_ROW_BSTAT_UPPER;
2401 irstat[
i] = QS_ROW_BSTAT_LOWER;
2408 for(
i = 0;
i < ncols; ++
i )
2413 icstat[
i] = QS_COL_BSTAT_LOWER;
2416 icstat[
i] = QS_COL_BSTAT_BASIC;
2419 icstat[
i] = QS_COL_BSTAT_UPPER;
2422 icstat[
i] = QS_COL_BSTAT_FREE;
2431 rval = mpq_QSload_basis_array(lpi->prob, icstat, irstat);
2441 int rval = 0, nrows, ncols;
2449 nrows = mpq_QSget_rowcount(lpi->prob);
2450 ncols = mpq_QSget_colcount(lpi->prob);
2451 rval = mpq_QSget_basis_order(lpi->prob, bind);
2455 for(
i = 0;
i < nrows; ++
i )
2457 if( bind[
i] >= ncols )
2458 bind[
i] = -(bind[
i] - ncols - 1);
2488 ncols = mpq_QSget_colcount(lpi->prob);
2489 nrows = mpq_QSget_rowcount(lpi->prob);
2496 SCIPdebugMessage(
"storing QSopt_ex LPI state in %p (%d cols, %d rows)\n", (
void *) *lpistate, ncols, nrows);
2504 (*lpistate)->ncols = ncols;
2505 (*lpistate)->nrows = nrows;
2531 if (lpistate ==
NULL)
2535 ncols = mpq_QSget_colcount(lpi->prob);
2536 nrows = mpq_QSget_rowcount(lpi->prob);
2543 SCIPdebugMessage(
"loading LPI state %p (%d cols, %d rows) into QSopt_ex LP (%d cols and %d rows)\n", (
void*) lpistate,
2544 lpistate->ncols, lpistate->nrows, ncols, nrows);
2546 if( lpistate->
ncols == 0 || lpistate->
nrows == 0 )
2555 irstat = lpi->ibas + ncols;
2561 for(
i = lpistate->
ncols;
i < ncols; ++
i )
2563 for(
i = lpistate->
nrows;
i < nrows; ++
i )
2568 for(
i = 0;
i < nrows; ++
i )
2573 switch( lpi->ircnt[
i] )
2576 irstat[
i] = QS_ROW_BSTAT_LOWER;
2579 irstat[
i] = QS_ROW_BSTAT_BASIC;
2585 if( lpi->isen[
i] ==
'R' )
2587 irstat[
i] = QS_ROW_BSTAT_UPPER;
2593 irstat[
i] = QS_ROW_BSTAT_LOWER;
2601 for(
i = 0;
i < ncols; ++
i )
2603 switch(lpi->iccnt[
i])
2606 icstat[
i] = QS_COL_BSTAT_LOWER;
2609 icstat[
i] = QS_COL_BSTAT_BASIC;
2612 icstat[
i] = QS_COL_BSTAT_UPPER;
2615 icstat[
i] = QS_COL_BSTAT_FREE;
2625 rval = mpq_QSload_basis_array(lpi->prob, icstat, irstat);
2639 if( *lpistate !=
NULL )
2651 return (lpistate !=
NULL);
2667 rval = mpq_QSread_and_load_basis(lpi->prob, fname);
2691 bas = mpq_QSget_basis(lpi->prob);
2692 QS_ERROR(bas == 0,
"Could not get basis from problem.");
2695 rval = mpq_QSwrite_basis(lpi->prob, bas, fname);
2706#ifdef SCIP_DISABLED_CODE
2732 B = mpq_QSget_basis(lpi->prob);
2735 rval = QSexact_verify(lpi->prob, B, (
int) useprestep, primalsol, dualsol, (
char*)
result, dualobjval, 0);
2737 rval = QSexact_verify(lpi->prob, B, (
int) useprestep, primalsol, dualsol, (
char*)
result, dualobjval, 1);
2741 mpq_QSfree_basis(B);
2778 rval = mpq_QSget_param(lpi->prob, QS_PARAM_SIMPLEX_SCALING, ival);
2788 rval = mpq_QSget_param(lpi->prob, QS_PARAM_SIMPLEX_DISPLAY, ival);
2795 rval = mpq_QSget_param(lpi->prob, QS_PARAM_SIMPLEX_MAX_ITERATIONS, ival);
2822 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_SCALING, 1);
2824 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_SCALING, 0);
2835 rval = mpq_QSset_param(lpi->prob, QS_PARAM_PRIMAL_PRICING, QS_PRICE_PSTEEP);
2836 rval += mpq_QSset_param(lpi->prob, QS_PARAM_DUAL_PRICING, QS_PRICE_DSTEEP);
2839 rval = mpq_QSset_param(lpi->prob,QS_PARAM_PRIMAL_PRICING,QS_PRICE_PMULTPARTIAL);
2840 rval += mpq_QSset_param(lpi->prob,QS_PARAM_DUAL_PRICING,QS_PRICE_DMULTPARTIAL);
2843 rval = mpq_QSset_param(lpi->prob,QS_PARAM_PRIMAL_PRICING,QS_PRICE_PDEVEX);
2844 rval += mpq_QSset_param(lpi->prob,QS_PARAM_DUAL_PRICING,QS_PRICE_DDEVEX);
2852 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_DISPLAY, 1);
2854 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_DISPLAY, 0);
2857 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_MAX_ITERATIONS, ival);
2886 rval = mpq_QSget_param_EGlpNum(lpi->prob, QS_PARAM_OBJLLIM, &tmpval);
2889 rval = mpq_QSget_param_EGlpNum(lpi->prob, QS_PARAM_SIMPLEX_MAX_TIME, &tmpval);
2899 *dval = mpq_get_d(tmpval);
2915 mpq_set_d(tmpval, dval);
2925 rval = mpq_QSset_param_EGlpNum(lpi->prob, QS_PARAM_SIMPLEX_MAX_TIME, tmpval);
2928 rval = mpq_QSset_param_EGlpNum(lpi->prob, QS_PARAM_OBJLLIM, tmpval);
2960 SCIPrationalSetGMP(infval, mpq_ILL_MAXDOUBLE);
2969 return (mpq_cmp(*SCIPrationalGetGMP(val), mpq_ILL_MAXDOUBLE) >= 0);
2980 SCIPrationalSetGMP(infval, mpq_ILL_MINDOUBLE);
2989 return (mpq_cmp(*SCIPrationalGetGMP(val), mpq_ILL_MINDOUBLE) <= 0);
2999 return mpq_get_d(mpq_ILL_MAXDOUBLE);
3008 return val >= mpq_get_d(mpq_ILL_MAXDOUBLE);
3034 mpq_QSfree_prob(lpi->prob);
3040 j = strlen(fname)-1;
3041 while( j >= 0 && fname[j] !=
'.' )
3043 if( fname[j] ==
'.' )
3047 lpi->prob = mpq_QSread_prob(fname, &(fname[j]));
3048 if( lpi->prob == 0 )
3068 j = strlen(fname) - 1;
3069 while( j >= 0 && fname[j] !=
'.' )
3071 if( fname[j] ==
'.' )
3075 if( mpq_QSwrite_prob(lpi->prob, fname, &(fname[j])) )
3088 SCIPerrorMessage(
"solstat= %d\n (solstat values: QS_LP_OPTIMAL=1, QS_LP_INFEASIBLE=2, QS_LP_UNBOUNDED=3, QS_LP_ITER_LIMIT=4, QS_LP_TIME_LIMIT=5, QS_LP_UNSOLVED=6, QS_LP_ABORTED=7, QS_LP_NUMERR=8, QS_LP_OBJ_LIMIT=9, QS_MODIFIED=100)\n", lpi->solstat );
3090 SCIPerrorMessage(
"probstat.primal_feasible= %d\n", lp->probstat.primal_feasible );
3091 SCIPerrorMessage(
"probstat.primal_infeasible= %d\n", lp->probstat.primal_infeasible );
3092 SCIPerrorMessage(
"probstat.primal_unbounded= %d\n", lp->probstat.primal_unbounded );
3093 SCIPerrorMessage(
"probstat.dual_feasible= %d\n", lp->probstat.dual_feasible );
3094 SCIPerrorMessage(
"probstat.dual_infeasible= %d\n", lp->probstat.dual_infeasible );
3095 SCIPerrorMessage(
"probstat.dual_unbounded= %d\n", lp->probstat.dual_unbounded );
3096 SCIPerrorMessage(
"basisstat.primal_feasible= %d\n", lp->basisstat.primal_feasible );
3097 SCIPerrorMessage(
"basisstat.primal_infeasible= %d\n", lp->basisstat.primal_infeasible );
3098 SCIPerrorMessage(
"basisstat.dual_feasible= %d\n", lp->basisstat.dual_feasible );
3099 SCIPerrorMessage(
"basisstat.dual_infeasible= %d\n", lp->basisstat.dual_infeasible );
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
common defines and data types used in all packages of SCIP
void * SCIPlpiExactGetSolverPointer(SCIP_LPIEXACT *lpi)
SCIP_Bool SCIPlpiExactHasDualRay(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactSetRealpar(SCIP_LPIEXACT *lpi, SCIP_LPPARAM type, SCIP_Real dval)
SCIP_RETCODE SCIPlpiExactSetBase(SCIP_LPIEXACT *lpi, int *cstat, int *rstat)
SCIP_RETCODE SCIPlpiExactReadState(SCIP_LPIEXACT *lpi, const char *fname)
SCIP_Bool SCIPlpiExactHasStateBasis(SCIP_LPIEXACT *lpi, SCIP_LPISTATE *lpistate)
SCIP_RETCODE SCIPlpiExactGetObj(SCIP_LPIEXACT *lpi, int firstcol, int lastcol, SCIP_RATIONAL **vals)
SCIP_RETCODE SCIPlpiExactIgnoreInstability(SCIP_LPIEXACT *lpi, SCIP_Bool *success)
SCIP_RETCODE SCIPlpiExactGetObjval(SCIP_LPIEXACT *lpi, SCIP_RATIONAL *objval)
void SCIPlpiExactEnd(void)
SCIP_RETCODE SCIPlpiExactScaleRow(SCIP_LPIEXACT *lpi, int row, SCIP_RATIONAL *scaleval)
const char * SCIPlpiExactGetExternalCodeDesc(void)
SCIP_Bool SCIPlpiExactIsPosInfinity(SCIP_LPIEXACT *lpi, SCIP_RATIONAL *val)
SCIP_Bool SCIPlpiExactIsDualUnbounded(SCIP_LPIEXACT *lpi)
void SCIPlpiExactPrintInfo(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactWriteLP(SCIP_LPIEXACT *lpi, const char *fname)
SCIP_Bool SCIPlpiExactHasPrimalRay(SCIP_LPIEXACT *lpi)
SCIP_Bool SCIPlpiExactExistsDualRay(SCIP_LPIEXACT *lpi)
SCIP_Bool SCIPlpiExactIsStable(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactGetDualfarkas(SCIP_LPIEXACT *lpi, SCIP_RATIONAL **dualfarkas)
SCIP_RETCODE SCIPlpiExactSolveDual(SCIP_LPIEXACT *lpi)
const char * SCIPlpiExactGetSolverDesc(void)
SCIP_RETCODE SCIPlpiExactChgObjsen(SCIP_LPIEXACT *lpi, SCIP_OBJSEN objsen)
SCIP_RETCODE SCIPlpiExactSetIntpar(SCIP_LPIEXACT *lpi, SCIP_LPPARAM type, int ival)
SCIP_RETCODE SCIPlpiExactWriteState(SCIP_LPIEXACT *lpi, const char *fname)
SCIP_RETCODE SCIPlpiExactScaleCol(SCIP_LPIEXACT *lpi, int col, SCIP_RATIONAL *scaleval)
SCIP_RETCODE SCIPlpiExactChgCoef(SCIP_LPIEXACT *lpi, int row, int col, SCIP_RATIONAL *newval)
SCIP_Bool SCIPlpiExactWasSolved(SCIP_LPIEXACT *lpi)
SCIP_Bool SCIPlpiExactIsPrimalUnbounded(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactGetSides(SCIP_LPIEXACT *lpi, int firstrow, int lastrow, SCIP_RATIONAL **lhss, SCIP_RATIONAL **rhss)
const char * SCIPlpiExactGetSolverName(void)
SCIP_RETCODE SCIPlpiExactGetCols(SCIP_LPIEXACT *lpi, int firstcol, int lastcol, SCIP_RATIONAL **lb, SCIP_RATIONAL **ub, int *nnonz, int *beg, int *ind, SCIP_RATIONAL **val)
SCIP_Bool SCIPlpiExactIsPrimalInfeasible(SCIP_LPIEXACT *lpi)
SCIP_Real SCIPlpiExactInfinity(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactGetRows(SCIP_LPIEXACT *lpi, int firstrow, int lastrow, SCIP_RATIONAL **lhs, SCIP_RATIONAL **rhs, int *nnonz, int *beg, int *ind, SCIP_RATIONAL **val)
SCIP_RETCODE SCIPlpiExactGetSolFeasibility(SCIP_LPIEXACT *lpi, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_Bool SCIPlpiExactExistsPrimalRay(SCIP_LPIEXACT *lpi)
SCIP_Bool SCIPlpiExactIsInfinity(SCIP_LPIEXACT *lpi, SCIP_Real val)
SCIP_RETCODE SCIPlpiExactAddRows(SCIP_LPIEXACT *lpi, int nrows, SCIP_RATIONAL **lhs, SCIP_RATIONAL **rhs, char **rownames, int nnonz, int *beg, int *ind, SCIP_RATIONAL **val)
SCIP_RETCODE SCIPlpiExactCreate(SCIP_LPIEXACT **lpi, SCIP_MESSAGEHDLR *messagehdlr, const char *name, SCIP_OBJSEN objsen)
SCIP_Bool SCIPlpiExactIsIterlimExc(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactLoadColLP(SCIP_LPIEXACT *lpi, SCIP_OBJSEN objsen, int ncols, SCIP_RATIONAL **obj, SCIP_RATIONAL **lb, SCIP_RATIONAL **ub, char **colnames, int nrows, SCIP_RATIONAL **lhs, SCIP_RATIONAL **rhs, char **rownames, int nnonz, int *beg, int *ind, SCIP_RATIONAL **val)
SCIP_Bool SCIPlpiExactIsPrimalFeasible(SCIP_LPIEXACT *lpi)
SCIP_Bool SCIPlpiExactIsNegInfinity(SCIP_LPIEXACT *lpi, SCIP_RATIONAL *val)
SCIP_Bool SCIPlpiExactIsDualFeasible(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactReadLP(SCIP_LPIEXACT *lpi, const char *fname)
SCIP_RETCODE SCIPlpiExactGetBasisInd(SCIP_LPIEXACT *lpi, int *bind)
SCIP_Bool SCIPlpiExactIsOptimal(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactAddCols(SCIP_LPIEXACT *lpi, int ncols, SCIP_RATIONAL **obj, SCIP_RATIONAL **lb, SCIP_RATIONAL **ub, char **colnames, int nnonz, int *beg, int *ind, SCIP_RATIONAL **val)
void SCIPlpiExactStart(void)
SCIP_RETCODE SCIPlpiExactGetBase(SCIP_LPIEXACT *lpi, int *cstat, int *rstat)
SCIP_RETCODE SCIPlpiExactDelColset(SCIP_LPIEXACT *lpi, int *dstat)
SCIP_RETCODE SCIPlpiExactDelCols(SCIP_LPIEXACT *lpi, int firstcol, int lastcol)
SCIP_RETCODE SCIPlpiExactChgObj(SCIP_LPIEXACT *lpi, int ncols, int *ind, SCIP_RATIONAL **obj)
SCIP_RETCODE SCIPlpiExactGetPrimalRay(SCIP_LPIEXACT *lpi, SCIP_RATIONAL **ray)
SCIP_RETCODE SCIPlpiExactGetBounds(SCIP_LPIEXACT *lpi, int firstcol, int lastcol, SCIP_RATIONAL **lbs, SCIP_RATIONAL **ubs)
int SCIPlpiExactGetInternalStatus(SCIP_LPIEXACT *lpi)
const char * SCIPlpiExactGetExternalCodeName(void)
void SCIPlpiExactPosInfinity(SCIP_LPIEXACT *lpi, SCIP_RATIONAL *infval)
SCIP_RETCODE SCIPlpiExactGetCoef(SCIP_LPIEXACT *lpi, int row, int col, SCIP_RATIONAL *val)
SCIP_RETCODE SCIPlpiExactClear(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactGetNNonz(SCIP_LPIEXACT *lpi, int *nnonz)
SCIP_RETCODE SCIPlpiExactFree(SCIP_LPIEXACT **lpi)
SCIP_Bool SCIPlpiExactIsDualInfeasible(SCIP_LPIEXACT *lpi)
SCIP_Bool SCIPlpiExactIsObjlimExc(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactGetNCols(SCIP_LPIEXACT *lpi, int *ncols)
SCIP_RETCODE SCIPlpiExactSolveBarrier(SCIP_LPIEXACT *lpi, SCIP_Bool crossover)
void SCIPlpiExactNegInfinity(SCIP_LPIEXACT *lpi, SCIP_RATIONAL *infval)
SCIP_RETCODE SCIPlpiExactChgSides(SCIP_LPIEXACT *lpi, int nrows, int *ind, SCIP_RATIONAL **lhs, SCIP_RATIONAL **rhs)
SCIP_RETCODE SCIPlpiExactGetState(SCIP_LPIEXACT *lpi, BMS_BLKMEM *blkmem, SCIP_LPISTATE **lpistate)
SCIP_RETCODE SCIPlpiExactDelRows(SCIP_LPIEXACT *lpi, int firstrow, int lastrow)
SCIP_RETCODE SCIPlpiExactGetNRows(SCIP_LPIEXACT *lpi, int *nrows)
SCIP_Bool SCIPlpiExactIsTimelimExc(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactGetRealpar(SCIP_LPIEXACT *lpi, SCIP_LPPARAM type, SCIP_Real *dval)
SCIP_RETCODE SCIPlpiExactChgBounds(SCIP_LPIEXACT *lpi, int ncols, int *ind, SCIP_RATIONAL **lb, SCIP_RATIONAL **ub)
SCIP_RETCODE SCIPlpiExactStateDualFeasible(SCIP_LPIEXACT *lpi, BMS_BLKMEM *blkmem, SCIP_LPISTATE *lpistate, SCIP_Bool useprestep, SCIP_Real *primalsol, SCIP_Real *dualsol, SCIP_Bool *result, SCIP_RATIONAL **dualobjval)
SCIP_RETCODE SCIPlpiExactFreeState(SCIP_LPIEXACT *lpi, BMS_BLKMEM *blkmem, SCIP_LPISTATE **lpistate)
SCIP_RETCODE SCIPlpiExactDelRowset(SCIP_LPIEXACT *lpi, int *dstat)
SCIP_RETCODE SCIPlpiExactGetSol(SCIP_LPIEXACT *lpi, SCIP_RATIONAL *objval, SCIP_RATIONAL **primsol, SCIP_RATIONAL **dualsol, SCIP_RATIONAL **activity, SCIP_RATIONAL **redcost)
SCIP_RETCODE SCIPlpiExactSolvePrimal(SCIP_LPIEXACT *lpi)
SCIP_RETCODE SCIPlpiExactGetIntpar(SCIP_LPIEXACT *lpi, SCIP_LPPARAM type, int *ival)
SCIP_RETCODE SCIPlpiExactSetState(SCIP_LPIEXACT *lpi, BMS_BLKMEM *blkmem, SCIP_LPISTATE *lpistate)
SCIP_RETCODE SCIPlpiExactGetIterations(SCIP_LPIEXACT *lpi, int *iterations)
void SCIPrationalAdd(SCIP_RATIONAL *res, SCIP_RATIONAL *op1, SCIP_RATIONAL *op2)
SCIP_Real SCIPrationalGetReal(SCIP_RATIONAL *rational)
void SCIPrationalResetFloatingPointRepresentable(SCIP_RATIONAL *rat)
#define SCIPrationalDebugMessage
void SCIPrationalCheckInfByValue(SCIP_RATIONAL *rational)
int SCIPrationalGetSign(const SCIP_RATIONAL *rational)
SCIP_Bool SCIPrationalIsEQ(SCIP_RATIONAL *rat1, SCIP_RATIONAL *rat2)
assert(minobj< SCIPgetCutoffbound(scip))
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)
SCIP_DUALPACKET ROWPACKET
static void lpistateFree(SCIP_LPISTATE **lpistate, BMS_BLKMEM *blkmem)
SCIP_DUALPACKET COLPACKET
static int colpacketNum(int ncols)
static SCIP_RETCODE lpistateCreate(SCIP_LPISTATE **lpistate, BMS_BLKMEM *blkmem, int ncols, int nrows)
static void convertSides(SCIP_LPI *lpi, int nrows, const SCIP_Real *lhs, const SCIP_Real *rhs, int indoffset, int *rngcount)
static SCIP_RETCODE ensureTabMem(SCIP_LPI *const lpi, int sz)
#define QS_TESTG(A, B, C)
static SCIP_RETCODE ensureRowMem(SCIP_LPI *const lpi, int nrows)
static SCIP_RETCODE ensureColMem(SCIP_LPI *const lpi, int ncols)
interface methods for specific exact LP solvers
#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 BMSfreeBlockMemoryArray(mem, ptr, num)
struct BMS_BlkMem BMS_BLKMEM
#define BMSallocMemory(ptr)
public methods for message output
wrapper for rational number arithmetic that interacts with GMP
public methods for memory management
@ SCIP_PRICING_STEEPQSTART
@ SCIP_PRICING_LPIDEFAULT
enum SCIP_LPParam SCIP_LPPARAM
struct SCIP_LPiState SCIP_LPISTATE
@ SCIP_LPPAR_BARRIERCONVTOL
enum SCIP_ObjSen SCIP_OBJSEN
type definitions for specific exact LP solvers interface
struct SCIP_LPiExact SCIP_LPIEXACT
struct SCIP_Messagehdlr SCIP_MESSAGEHDLR
struct SCIP_Rational SCIP_RATIONAL
enum SCIP_Retcode SCIP_RETCODE