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);
161 (void)mpq_get_str(buffer, 10, val);
162 printf(
"%s \n", buffer);
271 for(
i = lpi->tbsz ;
i < sz * 2 ;
i++ )
272 mpq_init(lpi->itab[
i]);
285 if( lpi->colspace < ncols )
287 lpi->colspace = ncols * 2;
302 if( lpi->rowspace < nrows )
309 for (
i = lpi->rowspace ;
i < nrows * 2;
i++)
311 mpq_init(lpi->irhs[
i]);
312 mpq_init(lpi->irng[
i]);
314 lpi->rowspace = nrows * 2;
331 for(
i = 0;
i < nrows; ++
i )
338 lhsg = SCIPrationalGetGMP(lhs[
i]);
339 rhsg = SCIPrationalGetGMP(rhs[
i]);
340#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
341 state1 = ((mpq_cmp(*lhsg, mpq_ILL_MINDOUBLE) <= 0) ? 1U : 0U);
342 state2 = ((mpq_cmp(*rhsg, mpq_ILL_MAXDOUBLE) >= 0) ? 2U : 0U);
343 state = state1 | state2;
358 mpq_set(lpi->irhs[
i], *lhsg);
359 mpq_set_ui(lpi->irng[
i], 0UL, 1UL);
364 mpq_set(lpi->irhs[
i], *lhsg);
365 mpq_sub(lpi->irng[
i], *rhsg, *lhsg);
366 assert( mpq_sgn(lpi->irng[
i]) >=0 );
371 mpq_set(lpi->irhs[
i], *rhsg);
372 mpq_set_ui(lpi->irng[
i], 0UL, 1UL);
376 mpq_set(lpi->irhs[
i], *lhsg);
377 mpq_set_ui(lpi->irng[
i], 0UL, 1UL);
402#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
403 sprintf(__qsstr,
"QSopt_ex %s", string_QSopt_ex);
405 sprintf(__qsstr,
"QSopt_ex");
416 return "Exact Linear Programming Solver by D. Espinoza, W. Cook, S. Dash, and D. Applegate (dii.uchile.cl/~daespino/QSoptExact_doc/main.html)";
424#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
425 sprintf(__egstr,
"EGlib %s", string_EGlib);
427 sprintf(__egstr,
"EGlib");
438 return "Library for basic structures and utilities by D. Espinoza and M. Goycoolea (dii.uchile.cl/~daespino/EGlib_doc/main.html)";
441#if defined(SCIP_WITH_GMP) && defined(SCIP_WITH_EGLIB)
448 return (
void*) lpi->prob;
466 if( !__QSexact_setup )
477 if( __QSexact_setup )
507 (*lpi)->factor = (mpq_factor_work*)
NULL;
509 (*lpi)->prob = mpq_QScreate_prob(name, (
int) objsen);
510 if( (*lpi)->prob ==
NULL )
516 (*lpi)->rowspace = 1024;
523 (*lpi)->colspace = 1024;
530 for(
i = 0;
i < 1024;
i++ )
532 mpq_init((*lpi)->irhs[
i]);
533 mpq_init((*lpi)->irng[
i]);
534 mpq_init((*lpi)->itab[
i]);
553 if( (*lpi)->factor !=
NULL )
555 mpq_ILLfactor_free_factor_work((*lpi)->factor);
560 mpq_QSfree_prob((*lpi)->prob);
561 for(
i = 0;
i < (*lpi)->tbsz; ++
i )
562 mpq_clear((*lpi)->itab[
i]);
563 for(
i = 0;
i < (*lpi)->rowspace; ++
i )
565 mpq_clear((*lpi)->irng[
i]);
566 mpq_clear((*lpi)->irhs[
i]);
619 SCIPdebugMessage(
"loading LP in column format into QSopt_ex: %d cols, %d rows\n", ncols, nrows);
627 rval = mpq_QSchange_objsense(lpi->prob, QS_MAX);
632 rval = mpq_QSchange_objsense(lpi->prob, QS_MIN);
643 rval = mpq_QSadd_ranged_rows(lpi->prob, nrows, lpi->ircnt, lpi->irbeg, 0, (
const mpq_t*) 0, (
const mpq_t*) lpi->irhs,
644 lpi->isen, (
const mpq_t*) lpi->irng, (
const char**)rownames);
673 SCIPdebugMessage(
"adding %d columns with %d nonzeros to QSopt_ex\n", ncols, nnonz);
683 for(
i = 0;
i < ncols - 1; ++
i )
685 lpi->iccnt[
i] = beg[
i+1] - beg[
i];
690 lpi->iccnt[ncols-1] = nnonz - beg[ncols-1];
691 assert( lpi->iccnt[ncols-1] >= 0 );
695 SCIPrationalSetGMPArray(valgmp, val, nnonz);
698 for(
i = 0;
i < ncols; ++
i )
700 mpq_QSadd_col(lpi->prob, lpi->iccnt[
i], &ind[beg[
i]], &(valgmp[beg[
i]]),
701 *SCIPrationalGetGMP(
obj[
i]), *SCIPrationalGetGMP(lb[
i]), *SCIPrationalGetGMP(ub[
i]), (
const char*) colnames[
i]);
704 SCIPrationalClearArrayGMP(valgmp, nnonz);
709 for(
i = 0;
i < ncols; ++
i )
711 rval = mpq_QSnew_col(lpi->prob, *SCIPrationalGetGMP(
obj[
i]), *SCIPrationalGetGMP(lb[
i]), *SCIPrationalGetGMP(ub[
i]), (
const char*) colnames[
i]);
725 const int len = lastcol - firstcol +1;
733 assert(0 <= firstcol && len > 0 && lastcol < mpq_QSget_colcount (lpi->prob));
738 for(
i = firstcol ;
i <= lastcol ;
i++ )
739 lpi->iccnt[
i-firstcol] =
i;
741 rval = mpq_QSdelete_cols(lpi->prob, len, lpi->iccnt);
754 int rval = 0, ncols, ccnt;
760 ncols = mpq_QSget_colcount(lpi->prob);
765 rval = mpq_QSdelete_setcols(lpi->prob,dstat);
768 for(
i = 0, ccnt = 0;
i < ncols;
i++ )
800 SCIPdebugMessage(
"adding %d rows with %d nonzeros to QSopt_ex\n", nrows, nnonz);
809 for(
i = 0;
i < nrows - 1;
i++ )
811 lpi->ircnt[
i] = beg[
i + 1] - beg[
i];
816 lpi->ircnt[nrows - 1] = nnonz - beg[nrows - 1];
817 assert(lpi->ircnt[nrows - 1] >= 0);
821 SCIPrationalSetGMPArray(valgmp, val, nnonz);
823 rval = mpq_QSadd_ranged_rows(lpi->prob, nrows, lpi->ircnt, beg, ind, (
const mpq_t*) valgmp, (
const mpq_t*) lpi->irhs,
824 lpi->isen, (
const mpq_t*) lpi->irng, (
const char**) rownames);
827 SCIPrationalClearArrayGMP(valgmp, nnonz);
841 const int len = lastrow - firstrow +1;
849 assert(0 <= firstrow && len > 0 && lastrow < mpq_QSget_rowcount (lpi->prob));
854 for(
i = firstrow;
i <= lastrow;
i++ )
855 lpi->ircnt[
i - firstrow] =
i;
856 rval = mpq_QSdelete_rows(lpi->prob, len, lpi->ircnt);
870 int rval = 0, nrows, ccnt, ndel=0;
876 nrows = mpq_QSget_rowcount(lpi->prob);
879 for(
i = 0;
i < nrows; ++
i )
887 rval = mpq_QSdelete_setrows(lpi->prob,dstat);
890 for(
i = 0, ccnt = 0;
i < nrows; ++
i )
906 int ncols, nrows, rval = 0;
914 ncols = mpq_QSget_colcount(lpi->prob);
915 nrows = mpq_QSget_rowcount(lpi->prob);
919 for (
i = 0;
i < ncols; ++
i)
921 rval = mpq_QSdelete_cols(lpi->prob, ncols, lpi->iccnt);
928 for (
i = 0;
i < nrows; ++
i)
930 rval = mpq_QSdelete_rows(lpi->prob, nrows, lpi->ircnt);
961 for( j = 0; j < ncols; ++j )
964 gmp_snprintf(s,
SCIP_MAXSTRLEN,
" col %d: [--,%Qd]\n", ind[j], *SCIPrationalGetGMP(ub[j]));
965 else if( ub ==
NULL )
966 gmp_snprintf(s,
SCIP_MAXSTRLEN,
" col %d: [%Qd,--]\n", ind[j], *SCIPrationalGetGMP(lb[j]));
968 gmp_snprintf(s,
SCIP_MAXSTRLEN,
" col %d: [%Qd,%Qd]\n", ind[j], *SCIPrationalGetGMP(lb[j]), *SCIPrationalGetGMP(ub[j]));
978 for(
i = 0;
i < ncols;
i++ )
981 rval = mpq_QSchange_bound(lpi->prob, ind[
i], lpi->iccha[
i], *SCIPrationalGetGMP(lb[
i]));
988 for(
i = 0;
i < ncols;
i++ )
991 rval = mpq_QSchange_bound(lpi->prob, ind[
i], lpi->iccha[
i], *SCIPrationalGetGMP(ub[
i]));
1022 for(
i = 0;
i < nrows; ++
i )
1024 rval = mpq_QSchange_sense(lpi->prob, ind[
i], lpi->isen[
i]);
1027 rval = mpq_QSchange_rhscoef(lpi->prob, ind[
i], lpi->irhs[
i]);
1030 if (lpi->isen[
i] ==
'R')
1032 rval = mpq_QSchange_range(lpi->prob, ind[
i], lpi->irng[
i]);
1057 rval = mpq_QSchange_coef(lpi->prob, row, col, *SCIPrationalGetGMP(newval));
1079 rval = mpq_QSchange_objsense(lpi->prob, QS_MAX);
1084 rval = mpq_QSchange_objsense(lpi->prob, QS_MIN);
1108 for(
i = 0;
i < ncols; ++
i )
1110 rval = mpq_QSchange_objcoef(lpi->prob, ind[
i], *SCIPrationalGetGMP(
obj[
i]));
1140 rval = mpq_QSget_ranged_rows_list(lpi->prob, 1, rowlist, &rowcnt, &rowbeg, &rowind, &rowval, &rhs, &sense, &range, 0);
1144 for(
i = 0;
i < rowcnt[0]; ++
i )
1146 mpq_mul(svl, rowval[
i], *SCIPrationalGetGMP(scaleval));
1147 rval = mpq_QSchange_coef(lpi->prob, row, rowind[
i], svl);
1154 mpq_mul(svl, *SCIPrationalGetGMP(scaleval), rhs[0]);
1155 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1157 if (sense[0] ==
'R')
1159 mpq_mul(svl, range[0], *SCIPrationalGetGMP(scaleval));
1160 rval = mpq_QSchange_range(lpi->prob, row, svl);
1170 mpq_mul(svl, rhs[0], *SCIPrationalGetGMP(scaleval));
1171 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1175 mpq_mul(svl, rhs[0], *SCIPrationalGetGMP(scaleval));
1176 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1178 rval = mpq_QSchange_sense(lpi->prob, row,
'G');
1182 mpq_mul(svl, rhs[0], *SCIPrationalGetGMP(scaleval));
1183 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1185 rval = mpq_QSchange_sense(lpi->prob, row,
'L');
1189 mpq_add(svl, rhs[0], range[0]);
1190 mpq_mul(svl, svl, *SCIPrationalGetGMP(scaleval));
1191 rval = mpq_QSchange_rhscoef(lpi->prob, row, svl);
1193 mpq_abs(svl,*SCIPrationalGetGMP(scaleval));
1194 mpq_mul(svl, svl, range[0]);
1195 rval = mpq_QSchange_range(lpi->prob, row, svl);
1207 if (rowcnt) mpq_QSfree(rowcnt);
1208 if (rowbeg) mpq_QSfree(rowbeg);
1209 if (rowind) mpq_QSfree(rowind);
1210 if (rowval) mpq_EGlpNumFreeArray(rowval);
1211 if (rhs) mpq_EGlpNumFreeArray(rhs);
1212 if (sense) mpq_QSfree(sense);
1213 if (range) mpq_EGlpNumFreeArray(range);
1230 int* colcnt=0, *colbeg=0, *colind=0;
1231 mpq_t* colval=0, *lb=0, *ub=0, *
obj=0;
1245 rval = mpq_QSget_columns_list(lpi->prob, 1, collist, &colcnt, &colbeg, &colind, &colval, &
obj, &lb, &ub, 0);
1249 for(
i = 0;
i < colcnt[0]; ++
i )
1251 mpq_mul(svl, colval[
i], *SCIPrationalGetGMP(scaleval));
1252 rval = mpq_QSchange_coef(lpi->prob, colind[
i], col, svl);
1257 mpq_mul(svl,
obj[0], *SCIPrationalGetGMP(scaleval));
1258 rval = mpq_QSchange_objcoef(lpi->prob, col, svl);
1262 if( mpq_sgn(*SCIPrationalGetGMP(scaleval)) < 0 )
1264 mpq_set(
obj[0], lb[0]);
1265 mpq_neg(lb[0], ub[0]);
1266 mpq_neg(ub[0],
obj[0]);
1268 if( mpq_cmp(lb[0],mpq_ILL_MINDOUBLE) > 0 )
1270 mpq_abs(svl,*SCIPrationalGetGMP(scaleval));
1271 mpq_mul(lb[0], lb[0], svl);
1273 if( mpq_cmp(ub[0], mpq_ILL_MAXDOUBLE) < 0 )
1275 mpq_abs(svl, *SCIPrationalGetGMP(scaleval));
1276 mpq_mul(ub[0], ub[0], svl);
1279 if( mpq_cmp(lb[0], mpq_ILL_MINDOUBLE) < 0 )
1280 mpq_set(lb[0], mpq_ILL_MINDOUBLE);
1281 if( mpq_cmp(ub[0], mpq_ILL_MAXDOUBLE) > 0 )
1282 mpq_set(ub[0], mpq_ILL_MAXDOUBLE);
1284 rval = mpq_QSchange_bound(lpi->prob, col,
'L', lb[0]);
1286 rval = mpq_QSchange_bound(lpi->prob, col,
'U', ub[0]);
1291 if (colcnt) mpq_QSfree(colcnt);
1292 if (colbeg) mpq_QSfree(colbeg);
1293 if (colind) mpq_QSfree(colind);
1294 if (colval) mpq_EGlpNumFreeArray(colval);
1295 if (
obj) mpq_EGlpNumFreeArray(
obj);
1296 if (lb) mpq_EGlpNumFreeArray(lb);
1297 if (ub) mpq_EGlpNumFreeArray(ub);
1323 *nrows = mpq_QSget_rowcount(lpi->prob);
1340 *ncols = mpq_QSget_colcount(lpi->prob);
1356 *nnonz = mpq_QSget_nzcount(lpi->prob);
1389 assert( 0 <= firstcol && firstcol <= lastcol && lastcol < mpq_QSget_colcount (lpi->prob) );
1390 assert( (lb == 0 && ub == 0) || (lb != 0 && ub != 0));
1391 assert( (nnonz != 0 && beg != 0 && ind != 0 && val != 0) || (nnonz == 0 && beg == 0 && ind == 0 && val == 0) );
1396 len = lastcol - firstcol + 1;
1398 for(
i = 0;
i < len; ++
i )
1399 lpi->iccnt[
i] =
i + firstcol;
1402 rval = mpq_QSget_columns_list(lpi->prob, len, lpi->iccnt, nnonz ? (&lcnt) : 0, nnonz ? (&lbeg) : 0, nnonz ? (&lind) : 0,
1403 nnonz ? (&lval) : 0, 0, lb ? (&llb) : 0, lb ? (&lub) : 0, 0);
1415 *nnonz = lbeg[len-1] + lcnt[len-1];
1416 for(
i = 0 ;
i < len ;
i++ )
1418 for(
i = 0;
i < *nnonz; ++
i )
1421 SCIPrationalSetGMP(val[
i], lval[
i]);
1429 for(
i = 0;
i < len; ++
i )
1431 SCIPrationalSetGMP(lb[
i], llb[
i]);
1432 SCIPrationalSetGMP(ub[
i], lub[
i]);
1437 if (lval) mpq_EGlpNumFreeArray(lval);
1438 if (lub) mpq_EGlpNumFreeArray(lub);
1439 if (llb) mpq_EGlpNumFreeArray(llb);
1440 if (lind) mpq_QSfree(lind);
1441 if (lbeg) mpq_QSfree(lbeg);
1442 if (lcnt) mpq_QSfree(lcnt);
1463 const int len = lastrow - firstrow + 1;
1472 char* lsense =
NULL;
1476 assert(0 <= firstrow && firstrow <= lastrow && lastrow < mpq_QSget_rowcount (lpi->prob));
1477 assert( (lhs == 0 && rhs == 0) || (rhs != 0 && lhs != 0));
1478 assert( (nnonz != 0 && beg != 0 && ind != 0 && val != 0) || (nnonz == 0 && beg == 0 && ind == 0 && val == 0));
1484 for(
i = 0;
i < len; ++
i )
1485 lpi->ircnt[
i] =
i + firstrow;
1488 rval = mpq_QSget_ranged_rows_list(lpi->prob, len, lpi->ircnt, nnonz ? (&lcnt) : 0, nnonz ? (&lbeg) : 0, nnonz ? (&lind) : 0,
1489 nnonz ? (&lval) : 0, rhs ? (&lrhs) : 0, rhs ? (&lsense) : 0, rhs ? (&lrng) : 0, 0);
1500 *nnonz = lbeg[len-1] + lcnt[len-1];
1501 for(
i = 0;
i < len;
i++ )
1503 for(
i = 0;
i < *nnonz; ++
i )
1506 SCIPrationalSetGMP(val[
i], lval[
i]);
1515 for(
i = 0;
i < len; ++
i )
1520 SCIPrationalSetGMP(lhs[
i], lrhs[
i]);
1521 SCIPrationalSetGMP(rhs[
i], lrng[
i]);
1525 SCIPrationalSetGMP(lhs[
i], lrhs[
i]);
1526 SCIPrationalSetGMP(rhs[
i], lrhs[
i]);
1529 SCIPrationalSetGMP(rhs[
i], lrhs[
i]);
1530 SCIPrationalSetGMP(lhs[
i], mpq_ILL_MINDOUBLE);
1533 SCIPrationalSetGMP(lhs[
i], lrhs[
i]);
1534 SCIPrationalSetGMP(rhs[
i], mpq_ILL_MAXDOUBLE);
1544 if (lsense) mpq_QSfree(lsense);
1545 if (lrng) mpq_EGlpNumFreeArray(lrng);
1546 if (lrhs) mpq_EGlpNumFreeArray(lrhs);
1547 if (lval) mpq_EGlpNumFreeArray(lval);
1548 if (lind) mpq_QSfree(lind);
1549 if (lbeg) mpq_QSfree(lbeg);
1550 if (lcnt) mpq_QSfree(lcnt);
1563 const int len = lastcol - firstcol + 1;
1570 assert(0 <= firstcol && firstcol <= lastcol && lastcol < mpq_QSget_colcount (lpi->prob));
1572 SCIPdebugMessage(
"getting objective values %d to %d\n", firstcol, lastcol);
1576 for(
i = 0;
i < len; ++
i )
1577 lpi->iccnt[
i] =
i + firstcol;
1580 SCIPrationalSetGMPArray(valgmp, vals, len);
1582 rval = mpq_QSget_obj_list(lpi->prob, len, lpi->iccnt, valgmp);
1583 SCIPrationalSetArrayGMP(vals, valgmp, len);
1585 SCIPrationalClearArrayGMP(valgmp, len);
1600 const int len = lastcol - firstcol + 1;
1606 assert(0 <= firstcol && firstcol <= lastcol&& lastcol < mpq_QSget_colcount (lpi->prob));
1612 for(
i = 0;
i < len; ++
i )
1616 QS_CONDRET( mpq_QSget_bound(lpi->prob,
i + firstcol,
'L', SCIPrationalGetGMP(lbs[
i])) );
1622 QS_CONDRET( mpq_QSget_bound(lpi->prob,
i + firstcol,
'U', SCIPrationalGetGMP(ubs[
i])) );
1640 const int len = lastrow - firstrow + 1;
1649 assert(0 <= firstrow && firstrow <= lastrow && lastrow < mpq_QSget_rowcount (lpi->prob));
1650 assert(rhss != 0 && lhss != 0);
1656 for(
i = 0;
i < len; ++
i )
1657 lpi->ircnt[
i] =
i + firstrow;
1660 rval = mpq_QSget_ranged_rows_list(lpi->prob, len, lpi->ircnt, 0, 0, 0, 0, &lrhs, &lsense, &lrng, 0);
1664 for(
i = 0;
i < len; ++
i )
1669 SCIPrationalSetGMP(lhss[
i], lrhs[
i]);
1670 SCIPrationalSetGMP(rhss[
i], lrng[
i]);
1674 SCIPrationalSetGMP(lhss[
i], lrhs[
i]);
1675 SCIPrationalSetGMP(rhss[
i], lrhs[
i]);
1678 SCIPrationalSetGMP(rhss[
i], lrhs[
i]);
1679 SCIPrationalSetGMP(lhss[
i], mpq_ILL_MINDOUBLE);
1682 SCIPrationalSetGMP(lhss[
i], lrhs[
i]);
1683 SCIPrationalSetGMP(rhss[
i], mpq_ILL_MAXDOUBLE);
1695 mpq_EGlpNumFreeArray(lrng);
1697 mpq_EGlpNumFreeArray(lrhs);
1717 rval = mpq_QSget_coef(lpi->prob, row, col, SCIPrationalGetGMP(val));
1744 SCIPdebugMessage(
"calling QSopt_ex primal simplex: %d cols, %d rows, %d nz\n", mpq_QSget_colcount(lpi->prob),
1745 mpq_QSget_rowcount(lpi->prob), mpq_QSget_nzcount(lpi->prob));
1747 B = mpq_QSget_basis(lpi->prob);
1748 rval = QSexact_solver(lpi->prob, 0, 0, B, PRIMAL_SIMPLEX, &(lpi->solstat));
1750 mpq_QSfree_basis(B);
1766 SCIPdebugMessage(
"calling QSopt_ex dual simplex: %d cols, %d rows, %d nz\n", mpq_QSget_colcount(lpi->prob),
1767 mpq_QSget_rowcount(lpi->prob), mpq_QSget_nzcount(lpi->prob));
1769 B = mpq_QSget_basis(lpi->prob);
1770 rval = QSexact_solver(lpi->prob, 0, 0, B, DUAL_SIMPLEX, &(lpi->solstat));
1772 mpq_QSfree_basis(B);
1803 return (lpi->solstat != 0 && lpi->solstat != QS_LP_MODIFIED && lpi->solstat != QS_LP_CHANGE_PREC);
1818 *primalfeasible =
FALSE;
1819 *dualfeasible =
FALSE;
1821 if( lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_UNBOUNDED )
1822 *primalfeasible =
TRUE;
1828 if( lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_INFEASIBLE || lpi->solstat == QS_LP_OBJ_LIMIT )
1830 if( lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_INFEASIBLE )
1832 *dualfeasible =
TRUE;
1849 return (lpi->solstat == QS_LP_UNBOUNDED);
1878 return (lpi->solstat == QS_LP_UNBOUNDED);
1891 return (lpi->solstat == QS_LP_INFEASIBLE);
1904 return (lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_UNBOUNDED);
1919 return (lpi->solstat == QS_LP_INFEASIBLE);
1934 return (lpi->solstat == QS_LP_INFEASIBLE);
1947 return (lpi->solstat == QS_LP_INFEASIBLE);
1960 return (lpi->solstat == QS_LP_UNBOUNDED);
1974 return (lpi->solstat == QS_LP_OPTIMAL || lpi->solstat == QS_LP_OBJ_LIMIT );
1976 return (lpi->solstat == QS_LP_OPTIMAL);
1990 return (lpi->solstat == QS_LP_OPTIMAL);
2003 return (lpi->solstat != QS_LP_NUMERR);
2017 return (lpi->solstat == QS_LP_OBJ_LIMIT);
2033 return (lpi->solstat == QS_LP_ITER_LIMIT);
2046 return (lpi->solstat == QS_LP_TIME_LIMIT);
2059 return lpi->solstat;
2092 rval = mpq_QSget_objval(lpi->prob, SCIPrationalGetGMP(
objval));
2109 int rval = 0, nrows, ncols;
2111 mpq_t* primsolgmp, *dualsolgmp, *redcostgmp, *objvalgmp;
2118 nrows = mpq_QSget_rowcount(lpi->prob);
2119 ncols = mpq_QSget_colcount(lpi->prob);
2127 SCIPrationalSetGMPArray(primsolgmp,
primsol, ncols);
2129 if( redcost ==
NULL )
2134 SCIPrationalSetGMPArray(redcostgmp, redcost, ncols);
2136 if( dualsol ==
NULL )
2141 SCIPrationalSetGMPArray(dualsolgmp, dualsol, nrows);
2145 objvalgmp = SCIPrationalGetGMP(
objval);
2151 rval = mpq_QSget_solution(lpi->prob, objvalgmp, primsolgmp, dualsolgmp, lpi->irng, redcostgmp);
2156 if( redcost !=
NULL )
2158 SCIPrationalSetArrayGMP(redcost, redcostgmp, ncols);
2159 SCIPrationalClearArrayGMP(redcostgmp, ncols);
2164 SCIPrationalSetArrayGMP(
primsol, primsolgmp, ncols);
2165 SCIPrationalClearArrayGMP(primsolgmp, ncols);
2168 if( dualsol !=
NULL )
2170 SCIPrationalSetArrayGMP(dualsol, dualsolgmp, nrows);
2171 SCIPrationalClearArrayGMP(dualsolgmp, nrows);
2177 rval = mpq_QSget_rhs(lpi->prob, lpi->irhs);
2179 rval = mpq_QSget_senses(lpi->prob, lpi->isen);
2183 if( activity !=
NULL )
2185 for(
i = 0;
i < nrows; ++
i )
2187 switch (lpi->isen[
i])
2192 mpq_add(*SCIPrationalGetGMP(activity[
i]), lpi->irhs[
i], lpi->irng[
i]);
2197 mpq_sub(*SCIPrationalGetGMP(activity[
i]), lpi->irhs[
i], lpi->irng[
i]);
2220 SCIPerrorMessage(
"SCIPlpiExactGetPrimalRay() not supported by QSopt_ex.\n");
2233 mpq_t* dualfarkasgmp;
2239 SCIPdebugMessage(
"calling QSopt_ex dual farkas: %d cols, %d rows, %d non zeros\n", mpq_QSget_colcount (lpi->prob),
2240 mpq_QSget_rowcount(lpi->prob), mpq_QSget_nzcount(lpi->prob));
2242 nrows = mpq_QSget_rowcount(lpi->prob);\
2244 SCIPrationalSetGMPArray(dualfarkasgmp, dualfarkas, nrows);
2246 rval = mpq_QSget_infeas_array(lpi->prob, dualfarkasgmp);
2248 SCIPrationalSetArrayGMP(dualfarkas, dualfarkasgmp, nrows);
2249 SCIPrationalClearArrayGMP(dualfarkasgmp, nrows);
2266 rval = mpq_QSget_itcnt(lpi->prob, 0, 0, 0, 0, &nit);
2269 *iterations = nit - lpi->previt;
2291 int rval = 0, ncols, nrows;
2292 char* icstat =
NULL;
2293 char* irstat =
NULL;
2299 SCIPdebugMessage(
"saving QSopt_ex basis into %p/%p\n", (
void *) cstat, (
void *) rstat);
2301 ncols = mpq_QSget_colcount(lpi->prob);
2302 nrows = mpq_QSget_rowcount(lpi->prob);
2307 irstat = lpi->ibas+ncols;
2308 rval = mpq_QSget_basis_array(lpi->prob, icstat, irstat);
2312 for(
i = 0;
i < nrows; ++
i )
2316 case QS_ROW_BSTAT_LOWER:
2319 case QS_ROW_BSTAT_BASIC:
2322 case QS_ROW_BSTAT_UPPER:
2330 for(
i = 0;
i < ncols; ++
i )
2334 case QS_COL_BSTAT_LOWER:
2337 case QS_COL_BSTAT_BASIC:
2340 case QS_COL_BSTAT_UPPER:
2343 case QS_COL_BSTAT_FREE:
2361 int rval = 0, ncols, nrows;
2363 char* icstat=0, *irstat = 0;
2368 SCIPdebugMessage(
"loading basis %p/%p into QSopt_ex\n", (
void *) cstat, (
void *) rstat);
2370 ncols = mpq_QSget_colcount(lpi->prob);
2371 nrows = mpq_QSget_rowcount(lpi->prob);
2379 irstat = lpi->ibas + ncols;
2382 for(
i = 0;
i < nrows; ++
i )
2387 irstat[
i] = QS_ROW_BSTAT_LOWER;
2390 irstat[
i] = QS_ROW_BSTAT_BASIC;
2396 if( lpi->isen[
i] ==
'R' )
2398 irstat[
i] = QS_ROW_BSTAT_UPPER;
2404 irstat[
i] = QS_ROW_BSTAT_LOWER;
2411 for(
i = 0;
i < ncols; ++
i )
2416 icstat[
i] = QS_COL_BSTAT_LOWER;
2419 icstat[
i] = QS_COL_BSTAT_BASIC;
2422 icstat[
i] = QS_COL_BSTAT_UPPER;
2425 icstat[
i] = QS_COL_BSTAT_FREE;
2434 rval = mpq_QSload_basis_array(lpi->prob, icstat, irstat);
2444 int rval = 0, nrows, ncols;
2452 nrows = mpq_QSget_rowcount(lpi->prob);
2453 ncols = mpq_QSget_colcount(lpi->prob);
2454 rval = mpq_QSget_basis_order(lpi->prob, bind);
2458 for(
i = 0;
i < nrows; ++
i )
2460 if( bind[
i] >= ncols )
2461 bind[
i] = -(bind[
i] - ncols - 1);
2491 ncols = mpq_QSget_colcount(lpi->prob);
2492 nrows = mpq_QSget_rowcount(lpi->prob);
2499 SCIPdebugMessage(
"storing QSopt_ex LPI state in %p (%d cols, %d rows)\n", (
void *) *lpistate, ncols, nrows);
2507 (*lpistate)->ncols = ncols;
2508 (*lpistate)->nrows = nrows;
2534 if (lpistate ==
NULL)
2538 ncols = mpq_QSget_colcount(lpi->prob);
2539 nrows = mpq_QSget_rowcount(lpi->prob);
2546 SCIPdebugMessage(
"loading LPI state %p (%d cols, %d rows) into QSopt_ex LP (%d cols and %d rows)\n", (
void*) lpistate,
2547 lpistate->ncols, lpistate->nrows, ncols, nrows);
2549 if( lpistate->
ncols == 0 || lpistate->
nrows == 0 )
2558 irstat = lpi->ibas + ncols;
2564 for(
i = lpistate->
ncols;
i < ncols; ++
i )
2566 for(
i = lpistate->
nrows;
i < nrows; ++
i )
2571 for(
i = 0;
i < nrows; ++
i )
2576 switch( lpi->ircnt[
i] )
2579 irstat[
i] = QS_ROW_BSTAT_LOWER;
2582 irstat[
i] = QS_ROW_BSTAT_BASIC;
2588 if( lpi->isen[
i] ==
'R' )
2590 irstat[
i] = QS_ROW_BSTAT_UPPER;
2596 irstat[
i] = QS_ROW_BSTAT_LOWER;
2604 for(
i = 0;
i < ncols; ++
i )
2606 switch(lpi->iccnt[
i])
2609 icstat[
i] = QS_COL_BSTAT_LOWER;
2612 icstat[
i] = QS_COL_BSTAT_BASIC;
2615 icstat[
i] = QS_COL_BSTAT_UPPER;
2618 icstat[
i] = QS_COL_BSTAT_FREE;
2628 rval = mpq_QSload_basis_array(lpi->prob, icstat, irstat);
2642 if( *lpistate !=
NULL )
2654 return (lpistate !=
NULL);
2670 rval = mpq_QSread_and_load_basis(lpi->prob, fname);
2694 bas = mpq_QSget_basis(lpi->prob);
2695 QS_ERROR(bas == 0,
"Could not get basis from problem.");
2698 rval = mpq_QSwrite_basis(lpi->prob, bas, fname);
2709#ifdef SCIP_DISABLED_CODE
2735 B = mpq_QSget_basis(lpi->prob);
2738 rval = QSexact_verify(lpi->prob, B, (
int) useprestep, primalsol, dualsol, (
char*)
result, dualobjval, 0);
2740 rval = QSexact_verify(lpi->prob, B, (
int) useprestep, primalsol, dualsol, (
char*)
result, dualobjval, 1);
2744 mpq_QSfree_basis(B);
2781 rval = mpq_QSget_param(lpi->prob, QS_PARAM_SIMPLEX_SCALING, ival);
2791 rval = mpq_QSget_param(lpi->prob, QS_PARAM_SIMPLEX_DISPLAY, ival);
2798 rval = mpq_QSget_param(lpi->prob, QS_PARAM_SIMPLEX_MAX_ITERATIONS, ival);
2825 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_SCALING, 1);
2827 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_SCALING, 0);
2838 rval = mpq_QSset_param(lpi->prob, QS_PARAM_PRIMAL_PRICING, QS_PRICE_PSTEEP);
2839 rval += mpq_QSset_param(lpi->prob, QS_PARAM_DUAL_PRICING, QS_PRICE_DSTEEP);
2842 rval = mpq_QSset_param(lpi->prob,QS_PARAM_PRIMAL_PRICING,QS_PRICE_PMULTPARTIAL);
2843 rval += mpq_QSset_param(lpi->prob,QS_PARAM_DUAL_PRICING,QS_PRICE_DMULTPARTIAL);
2846 rval = mpq_QSset_param(lpi->prob,QS_PARAM_PRIMAL_PRICING,QS_PRICE_PDEVEX);
2847 rval += mpq_QSset_param(lpi->prob,QS_PARAM_DUAL_PRICING,QS_PRICE_DDEVEX);
2855 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_DISPLAY, 1);
2857 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_DISPLAY, 0);
2860 rval = mpq_QSset_param(lpi->prob, QS_PARAM_SIMPLEX_MAX_ITERATIONS, ival);
2889 rval = mpq_QSget_param_EGlpNum(lpi->prob, QS_PARAM_OBJLLIM, &tmpval);
2892 rval = mpq_QSget_param_EGlpNum(lpi->prob, QS_PARAM_SIMPLEX_MAX_TIME, &tmpval);
2902 *dval = mpq_get_d(tmpval);
2918 mpq_set_d(tmpval, dval);
2928 rval = mpq_QSset_param_EGlpNum(lpi->prob, QS_PARAM_SIMPLEX_MAX_TIME, tmpval);
2931 rval = mpq_QSset_param_EGlpNum(lpi->prob, QS_PARAM_OBJLLIM, tmpval);
2963 SCIPrationalSetGMP(infval, mpq_ILL_MAXDOUBLE);
2972 return (mpq_cmp(*SCIPrationalGetGMP(val), mpq_ILL_MAXDOUBLE) >= 0);
2983 SCIPrationalSetGMP(infval, mpq_ILL_MINDOUBLE);
2992 return (mpq_cmp(*SCIPrationalGetGMP(val), mpq_ILL_MINDOUBLE) <= 0);
3002 return mpq_get_d(mpq_ILL_MAXDOUBLE);
3011 return val >= mpq_get_d(mpq_ILL_MAXDOUBLE);
3037 mpq_QSfree_prob(lpi->prob);
3043 j = strlen(fname)-1;
3044 while( j >= 0 && fname[j] !=
'.' )
3046 if( fname[j] ==
'.' )
3050 lpi->prob = mpq_QSread_prob(fname, &(fname[j]));
3051 if( lpi->prob == 0 )
3071 j = strlen(fname) - 1;
3072 while( j >= 0 && fname[j] !=
'.' )
3074 if( fname[j] ==
'.' )
3078 if( mpq_QSwrite_prob(lpi->prob, fname, &(fname[j])) )
3091 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 );
3093 SCIPerrorMessage(
"probstat.primal_feasible= %d\n", lp->probstat.primal_feasible );
3094 SCIPerrorMessage(
"probstat.primal_infeasible= %d\n", lp->probstat.primal_infeasible );
3095 SCIPerrorMessage(
"probstat.primal_unbounded= %d\n", lp->probstat.primal_unbounded );
3096 SCIPerrorMessage(
"probstat.dual_feasible= %d\n", lp->probstat.dual_feasible );
3097 SCIPerrorMessage(
"probstat.dual_infeasible= %d\n", lp->probstat.dual_infeasible );
3098 SCIPerrorMessage(
"probstat.dual_unbounded= %d\n", lp->probstat.dual_unbounded );
3099 SCIPerrorMessage(
"basisstat.primal_feasible= %d\n", lp->basisstat.primal_feasible );
3100 SCIPerrorMessage(
"basisstat.primal_infeasible= %d\n", lp->basisstat.primal_infeasible );
3101 SCIPerrorMessage(
"basisstat.dual_feasible= %d\n", lp->basisstat.dual_feasible );
3102 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