48 #pragma GCC diagnostic ignored "-Wstrict-prototypes"
49 #include "sdpa_call.h"
50 #pragma GCC diagnostic warning "-Wstrict-prototypes"
52 #include "blockmemshell/memory.h"
54 #include "scip/pub_misc.h"
56 #define EPSILONCHANGE 0.1
57 #define FEASTOLCHANGE 0.1
60 #define BMS_CALL(x) do \
64 SCIPerrorMessage("No memory in function call.\n"); \
65 return SCIP_NOMEMORY; \
71 #define CHECK_IF_SOLVED(sdpisolver) do \
73 if (!(sdpisolver->solved)) \
75 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
76 return SCIP_LPERROR; \
82 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
84 if (!(sdpisolver->solved)) \
86 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
94 struct SCIP_SDPiSolver
96 SCIP_MESSAGEHDLR* messagehdlr;
101 int* inputtosdpamapper;
104 int* sdpatoinputmapper;
105 SCIP_Real* fixedvarsval;
106 SCIP_Real fixedvarsobjcontr;
137 assert( sdpisolver != NULL );
138 assert( lb < ub + sdpisolver->feastol );
140 return (REALABS(ub-lb) <= sdpisolver->feastol);
143 #define isFixed(sdpisolver,lb,ub) (REALABS(ub-lb) <= sdpisolver->feastol)
168 return "Primal-dual Interior Point Solver for Semidefinite Programming developed by Katsuki Fujisawa et al. (sdpa.sourceforge.net)";
181 assert( sdpisolver != NULL );
182 return (
void*) sdpisolver->sdpa;
198 SCIP_MESSAGEHDLR* messagehdlr,
202 assert( sdpisolver != NULL );
203 assert( blkmem != NULL );
205 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
207 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
209 (*sdpisolver)->messagehdlr = messagehdlr;
210 (*sdpisolver)->blkmem = blkmem;
213 (*sdpisolver)->sdpa = NULL;
215 (*sdpisolver)->nvars = 0;
216 (*sdpisolver)->nactivevars = 0;
217 (*sdpisolver)->inputtosdpamapper = NULL;
218 (*sdpisolver)->sdpatoinputmapper = NULL;
219 (*sdpisolver)->fixedvarsval = NULL;
220 (*sdpisolver)->fixedvarsobjcontr = 0.0;
221 (*sdpisolver)->nvarbounds = 0;
222 (*sdpisolver)->varboundpos = NULL;
223 (*sdpisolver)->solved = FALSE;
224 (*sdpisolver)->sdpcounter = 0;
226 (*sdpisolver)->epsilon = 1e-5;
227 (*sdpisolver)->feastol = 1e-4;
230 (*sdpisolver)->threads = 1;
232 (*sdpisolver)->sdpinfo = FALSE;
242 assert( sdpisolver != NULL );
243 assert( *sdpisolver != NULL );
245 SCIPdebugMessage(
"Freeing SDPISolver\n");
247 if (((*sdpisolver)->sdpa) != NULL)
250 delete (*sdpisolver)->sdpa;
253 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->varboundpos, 2 * (*sdpisolver)->nvars);
255 if ( (*sdpisolver)->nvars > 0 )
256 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->inputtosdpamapper, (*sdpisolver)->nvars);
258 if ( (*sdpisolver)->nactivevars > 0 )
259 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->sdpatoinputmapper, (*sdpisolver)->nactivevars);
261 if ( (*sdpisolver)->nvars >= (*sdpisolver)->nactivevars )
262 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
264 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
274 assert( sdpisolver != NULL );
276 sdpisolver->sdpcounter++;
286 assert( sdpisolver != NULL );
288 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
289 sdpisolver->sdpcounter = 0;
326 int* sdpconstnblocknonz,
330 SCIP_Real** sdpconstval,
332 int** sdpnblockvarnonz,
342 int* blockindchanges,
348 int* lprownactivevars,
356 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, FALSE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
357 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval, indchanges,
358 nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, lprownactivevars, lpnnonz, lprow, lpcol, lpval, start, NULL);
382 SCIP_Real penaltyparam,
393 int* sdpconstnblocknonz,
397 SCIP_Real** sdpconstval,
399 int** sdpnblockvarnonz,
409 int* blockindchanges,
425 SCIP_Real* sdpavarbounds;
437 #ifdef SCIP_MORE_DEBUG
442 char phase_string[15];
445 assert( sdpisolver != NULL );
446 assert( penaltyparam > -1 * sdpisolver->epsilon );
447 assert( penaltyparam < sdpisolver->epsilon || feasorig != NULL );
449 assert( obj != NULL );
450 assert( lb != NULL );
451 assert( ub != NULL );
452 assert( nsdpblocks >= 0 );
453 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
454 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
455 assert( sdpconstnnonz >= 0 );
456 assert( nsdpblocks == 0 || sdpconstnblocknonz != NULL );
457 assert( nsdpblocks == 0 || sdpconstrow != NULL );
458 assert( nsdpblocks == 0 || sdpconstcol != NULL );
459 assert( nsdpblocks == 0 || sdpconstval != NULL );
460 assert( sdpnnonz >= 0 );
461 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
462 assert( nsdpblocks == 0 || sdpvar != NULL );
463 assert( nsdpblocks == 0 || sdprow != NULL );
464 assert( nsdpblocks == 0 || sdpcol != NULL );
465 assert( nsdpblocks == 0 || sdpval != NULL );
466 assert( nsdpblocks == 0 || indchanges != NULL );
467 assert( nsdpblocks == 0 || nremovedinds != NULL );
468 assert( nsdpblocks == 0 || blockindchanges != NULL );
469 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
470 assert( nlpcons >= 0 );
471 assert( noldlpcons >= nlpcons );
472 assert( nlpcons == 0 || lplhs != NULL );
473 assert( nlpcons == 0 || lprhs != NULL );
474 assert( nlpcons == 0 || rownactivevars != NULL );
475 assert( lpnnonz >= 0 );
476 assert( nlpcons == 0 || lprow != NULL );
477 assert( nlpcons == 0 || lpcol != NULL );
478 assert( nlpcons == 0 || lpval != NULL );
488 if ( penaltyparam < sdpisolver->epsilon )
489 SCIPdebugMessage(
"Inserting Data into SDPA for SDP (%d) \n", ++sdpisolver->sdpcounter);
491 SCIPdebugMessage(
"Inserting Data again into SDPA for SDP (%d) \n", sdpisolver->sdpcounter);
494 sdpisolver->penalty = (penaltyparam < sdpisolver->epsilon) ? FALSE : TRUE;
495 sdpisolver->rbound = rbound;
499 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtosdpamapper), sdpisolver->nvars, nvars) );
500 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), sdpisolver->nactivevars, nvars) );
501 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
503 sdpisolver->nvars = nvars;
504 sdpisolver->nactivevars = 0;
508 sdpisolver->fixedvarsobjcontr = 0.0;
509 for (i = 0; i < nvars; i++)
511 if (
isFixed(sdpisolver, lb[i], ub[i]) )
513 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
514 sdpisolver->fixedvarsval[nfixedvars] = lb[i];
516 sdpisolver->inputtosdpamapper[i] = -nfixedvars;
517 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in SDPA\n", i, lb[i], sdpisolver->sdpcounter);
521 sdpisolver->sdpatoinputmapper[sdpisolver->nactivevars] = i;
522 sdpisolver->nactivevars++;
523 sdpisolver->inputtosdpamapper[i] = sdpisolver->nactivevars;
524 #ifdef SCIP_MORE_DEBUG
525 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in SDPA\n", i, sdpisolver->inputtosdpamapper[i], sdpisolver->sdpcounter);
529 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
533 sdpisolver->fixedvarsobjcontr = 0.0;
536 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
537 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->sdpatoinputmapper), nvars, sdpisolver->nactivevars) );
540 if ( sdpisolver->sdpa != 0 )
543 delete sdpisolver->sdpa;
544 sdpisolver->sdpa =
new SDPA();
547 sdpisolver->sdpa =
new SDPA();
548 assert( sdpisolver->sdpa != 0 );
551 sdpisolver->nvarbounds = 0;
552 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &sdpavarbounds, 2 * sdpisolver->nactivevars) );
553 if ( sdpisolver->varboundpos == NULL )
555 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->varboundpos), 2 * sdpisolver->nvars) );
557 for (i = 0; i < sdpisolver->nactivevars; i++)
559 assert( 0 <= sdpisolver->sdpatoinputmapper[i] && sdpisolver->sdpatoinputmapper[i] < nvars );
562 sdpavarbounds[sdpisolver->nvarbounds] = lb[sdpisolver->sdpatoinputmapper[i]];
563 sdpisolver->varboundpos[sdpisolver->nvarbounds] = -(i + 1);
564 (sdpisolver->nvarbounds)++;
568 sdpavarbounds[sdpisolver->nvarbounds] = ub[sdpisolver->sdpatoinputmapper[i]];
569 sdpisolver->varboundpos[sdpisolver->nvarbounds] = +(i + 1);
570 (sdpisolver->nvarbounds)++;
577 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &rowmapper, 2*noldlpcons) );
582 for (i = 0; i < noldlpcons; i++)
584 if ( rownactivevars[i] >= 2 )
588 rowmapper[2*i] = pos;
595 rowmapper[2*i + 1] = pos;
599 rowmapper[2*i + 1] = -1;
606 rowmapper[2*i + 1] = -1;
610 assert( nlpineqs <= 2*nlpcons );
616 if ( penaltyparam >= sdpisolver->epsilon && rbound )
617 sdpisolver->nvarbounds++;
619 if ( sdpisolver->sdpinfo )
620 sdpisolver->sdpa->setDisplay(stdout);
622 sdpisolver->sdpa->setDisplay(0);
624 #ifdef SCIP_MORE_DEBUG
625 FILE* fpOut = fopen(
"output.tmp",
"w");
628 sdpisolver->sdpa->setResultFile(fpOut);
633 sdpisolver->sdpa->setInitPoint(
true);
636 if ( penaltyparam < sdpisolver->epsilon )
637 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars);
639 sdpisolver->sdpa->inputConstraintNumber((
long long) sdpisolver->nactivevars + 1);
642 sdpisolver->sdpa->inputBlockNumber((
long long) ((nlpineqs + sdpisolver->nvarbounds > 0) ?
643 nsdpblocks - nremovedblocks + 1 : nsdpblocks - nremovedblocks));
646 for (block = 0; block < nsdpblocks; block++)
648 if ( blockindchanges[block] >= 0 )
650 SCIPdebugMessage(
"adding block %d to SDPA as block %d with size %d\n",
651 block, block - blockindchanges[block] + 1, sdpblocksizes[block] - nremovedinds[block]);
652 sdpisolver->sdpa->inputBlockSize((
long long) block - blockindchanges[block] + 1,
653 (
long long) sdpblocksizes[block] - nremovedinds[block]);
654 sdpisolver->sdpa->inputBlockType((
long long) block - blockindchanges[block] + 1, SDPA::SDP);
657 if ( nlpineqs + sdpisolver->nvarbounds > 0 )
660 sdpisolver->sdpa->inputBlockSize((
long long) nsdpblocks - nremovedblocks + 1, (
long long) -(nlpineqs + sdpisolver->nvarbounds));
661 sdpisolver->sdpa->inputBlockType((
long long) nsdpblocks - nremovedblocks + 1, SDPA::LP);
662 SCIPdebugMessage(
"adding LP block to SDPA as block %d with size %d\n", nsdpblocks - nremovedblocks + 1,
663 -(nlpineqs + sdpisolver->nvarbounds));
665 sdpisolver->sdpa->initializeUpperTriangleSpace();
668 for (i = 0; i < sdpisolver->nactivevars; i++)
673 sdpisolver->sdpa->inputCVec((
long long) i + 1, obj[sdpisolver->sdpatoinputmapper[i]]);
674 #ifdef SCIP_MORE_DEBUG
675 SCIPdebugMessage(
"inserting objective %f for variable %d which became variable %d in SDPA\n", obj[sdpisolver->sdpatoinputmapper[i]],
676 sdpisolver->sdpatoinputmapper[i], i+1);
679 if ( penaltyparam >= sdpisolver->epsilon )
680 sdpisolver->sdpa->inputCVec((
long long) sdpisolver->nactivevars + 1, penaltyparam);
689 assert( nsdpblocks > 0 );
690 assert( sdpnblockvarnonz != NULL );
691 assert( sdpnblockvars != NULL );
692 assert( sdpcol != NULL );
693 assert( sdprow != NULL );
694 assert( sdpval != NULL );
695 assert( sdpvar != NULL );
696 assert( indchanges != NULL );
697 assert( nremovedinds != NULL );
699 for (block = 0; block < nsdpblocks; block++)
702 if ( blockindchanges[block] == -1 )
704 #ifdef SCIP_MORE_DEBUG
705 SCIPdebugMessage(
" -> building block %d, which becomes block %d in SDPA (%d)\n", block, block - blockindchanges[block] + 1,sdpisolver->sdpcounter);
708 for (blockvar = 0; blockvar < sdpnblockvars[block]; blockvar++)
710 v = sdpisolver->inputtosdpamapper[sdpvar[block][blockvar]];
712 #ifdef SCIP_MORE_DEBUG
713 SCIPdebugMessage(
" -> adding coefficient matrix for variable %d which becomes variable %d in SDPA (%d)\n",
714 sdpvar[block][blockvar], v, sdpisolver->sdpcounter);
720 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
723 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
725 assert( indchanges[block][sdprow[block][blockvar][k]] <= sdprow[block][blockvar][k]);
726 assert( indchanges[block][sdpcol[block][blockvar][k]] <= sdpcol[block][blockvar][k]);
728 assert( 0 <= sdprow[block][blockvar][k] && sdprow[block][blockvar][k] < sdpblocksizes[block] );
729 assert( 0 <= sdpcol[block][blockvar][k] && sdpcol[block][blockvar][k] < sdpblocksizes[block] );
732 #ifdef SCIP_MORE_DEBUG
733 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) (%d)\n",
734 sdpval[block][blockvar][k],
735 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
736 sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
737 sdpisolver->sdpcounter);
740 sdpisolver->sdpa->inputElement((
long long) v, (
long long) block - blockindchanges[block] + 1,
741 (
long long) sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]] + 1,
742 (
long long) sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]] + 1,
743 sdpval[block][blockvar][k], checkinput);
748 if ( penaltyparam >= sdpisolver->epsilon )
750 #ifdef SCIP_MORE_DEBUG
751 SCIPdebugMessage(
" -> adding coefficient matrix for penalty variable r in SDPA (%d)\n", sdpisolver->sdpcounter);
753 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
755 #ifdef SCIP_MORE_DEBUG
756 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) (%d)\n", i + 1, i + 1, sdpisolver->sdpcounter);
759 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) block - blockindchanges[block] + 1,
760 (
long long) i + 1, (
long long) i + 1, 1.0, checkinput);
767 if ( sdpconstnnonz > 0 )
769 assert( nsdpblocks > 0 );
770 assert( sdpconstnblocknonz!= NULL );
771 assert( sdpconstcol != NULL );
772 assert( sdpconstrow != NULL );
773 assert( sdpconstval != NULL );
775 for (block = 0; block < nsdpblocks; block++)
777 if ( blockindchanges[block] == -1 )
779 #ifdef SCIP_MORE_DEBUG
780 SCIPdebugMessage(
" -> building block %d (%d)\n", block + 1, sdpisolver->sdpcounter);
782 for (k = 0; k < sdpconstnblocknonz[block]; k++)
785 assert( indchanges[block][sdpconstrow[block][k]] > -1 && indchanges[block][sdpconstcol[block][k]] > -1 );
787 assert( indchanges[block][sdpconstrow[block][k]] <= sdpconstrow[block][k]);
788 assert( indchanges[block][sdpconstcol[block][k]] <= sdpconstcol[block][k]);
790 assert (0 <= sdpconstrow[block][k] && sdpconstrow[block][k] < sdpblocksizes[block]);
791 assert (0 <= sdpconstcol[block][k] && sdpconstcol[block][k] < sdpblocksizes[block]);
794 #ifdef SCIP_MORE_DEBUG
795 SCIPdebugMessage(
" -> adding constant nonzero %g at (%d,%d) (%d)\n", sdpconstval[block][k],
796 sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
797 sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
798 sdpisolver->sdpcounter);
800 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) block - blockindchanges[block] + 1,
801 (
long long) sdpconstcol[block][k] - indchanges[block][sdpconstcol[block][k]] + 1,
802 (
long long) sdpconstrow[block][k] - indchanges[block][sdpconstrow[block][k]] + 1,
803 sdpconstval[block][k], checkinput);
808 #ifdef SCIP_MORE_DEBUG
809 SCIPdebugMessage(
" -> building LP-block %d (%d)\n", nsdpblocks - nremovedblocks + 1, sdpisolver->sdpcounter);
813 for (i = 0; i < lpnnonz; i++)
815 assert( 0 <= lprow[i] && lprow[i] < noldlpcons );
816 assert( 0 <= lpcol[i] && lpcol[i] < nvars );
817 assert( REALABS(lpval[i]) > sdpisolver->epsilon );
820 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
823 assert( rownactivevars[lprow[i]] > 0 );
824 if ( rownactivevars[lprow[i]] > 1 )
826 if ( lprow[i] > lastrow )
830 if ( penaltyparam >= sdpisolver->epsilon )
833 if ( rowmapper[2*lastrow] > -1 )
835 #ifdef SCIP_MORE_DEBUG
836 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
837 rowmapper[2*lastrow], rowmapper[2*lastrow], sdpisolver->sdpcounter);
841 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
842 (
long long) rowmapper[2*lastrow], (
long long) rowmapper[2*lastrow], 1.0, checkinput);
846 if ( rowmapper[2*lastrow + 1] > -1 )
848 #ifdef SCIP_MORE_DEBUG
849 SCIPdebugMessage(
" -> adding nonzero 1.0 at (%d,%d) for penalty variable r in SDPA (%d)\n",
850 rowmapper[2*lastrow + 1], rowmapper[2*lastrow + 1], sdpisolver->sdpcounter);
854 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
855 (
long long) rowmapper[2*lastrow + 1], (
long long) rowmapper[2*lastrow + 1], 1.0, checkinput);
860 if ( rowmapper[2*lastrow] > -1 )
862 #ifdef SCIP_MORE_DEBUG
863 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
864 lpval[i], rowmapper[2*lastrow], rowmapper[2*lastrow], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
867 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
868 (
long long) rowmapper[2*lastrow], (
long long) rowmapper[2*lastrow], lpval[i], checkinput);
871 if ( rowmapper[2*lastrow + 1] > -1 )
873 #ifdef SCIP_MORE_DEBUG
874 SCIPdebugMessage(
" -> adding nonzero %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
875 -1 * lpval[i], rowmapper[2*lastrow + 1], rowmapper[2*lastrow + 1], lpcol[i], sdpisolver->inputtosdpamapper[lpcol[i]], sdpisolver->sdpcounter);
879 sdpisolver->sdpa->inputElement((
long long) sdpisolver->inputtosdpamapper[lpcol[i]], (
long long) nsdpblocks - nremovedblocks + 1,
880 (
long long) rowmapper[2*lastrow + 1], (
long long) rowmapper[2*lastrow + 1], -1 * lpval[i], checkinput);
888 for (i = 0; i < nlpcons; i++)
893 #ifdef SCIP_MORE_DEBUG
894 SCIPdebugMessage(
" -> adding lhs %g at (%d,%d) (%d)\n", lplhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
897 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
898 (
long long) lpconsind, lplhs[i], checkinput);
904 #ifdef SCIP_MORE_DEBUG
905 SCIPdebugMessage(
" -> adding lhs (originally rhs) %g at (%d,%d) (%d)\n", -1 * lprhs[i], lpconsind, lpconsind, sdpisolver->sdpcounter);
909 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) lpconsind,
910 (
long long) lpconsind, -1 * lprhs[i], checkinput);
915 assert( lpconsind == nlpineqs + 1 );
918 #ifdef SCIP_MORE_DEBUG
921 for (i = 0; i < lpnnonz; i++)
924 if ( sdpisolver->inputtosdpamapper[lpcol[i]] > 0 )
926 if ( rownactivevars[lprow[i]] > 1 )
928 if ( lprow[i] > lastrow )
933 printf(
" <= %f\n", lprhs[ind]);
940 printf(
"%f <= ", lplhs[ind]);
942 printf(
"+ %f <x%d> ", lpval[i], lpcol[i]);
949 printf(
" <= %f\n", lprhs[ind]);
953 assert( ind == nlpcons - 1 );
958 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &rowmapper, 2 * noldlpcons);
962 for (i = 0; i < ((penaltyparam < sdpisolver->epsilon) ? sdpisolver->nvarbounds : sdpisolver->nvarbounds - 1); i++)
964 assert( 0 < abs(sdpisolver->varboundpos[i]) && abs(sdpisolver->varboundpos[i] <= sdpisolver->nactivevars) );
967 if ( sdpisolver->varboundpos[i] < 0 )
971 sdpisolver->sdpa->inputElement((
long long) -sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
972 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
974 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
977 #ifdef SCIP_MORE_DEBUG
978 SCIPdebugMessage(
" -> adding lower bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
979 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
980 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
982 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
983 (
long long) nlpineqs + 1 + i, sdpavarbounds[i], checkinput);
988 #ifdef SCIP_MORE_DEBUG
989 SCIPdebugMessage(
" -> adding lower bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
990 nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[-sdpisolver->varboundpos[i] - 1],
991 -sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1001 sdpisolver->sdpa->inputElement((
long long) sdpisolver->varboundpos[i], (
long long) nsdpblocks - nremovedblocks + 1,
1002 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, -1.0, checkinput);
1004 if ( REALABS(sdpavarbounds[i]) > sdpisolver->epsilon )
1007 #ifdef SCIP_MORE_DEBUG
1008 SCIPdebugMessage(
" -> adding upper bound %g at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1009 sdpavarbounds[i], nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1010 sdpisolver->varboundpos[i], sdpisolver->sdpcounter);
1012 sdpisolver->sdpa->inputElement((
long long) 0, (
long long) nsdpblocks - nremovedblocks + 1, (
long long) nlpineqs + 1 + i,
1013 (
long long) nlpineqs + 1 + i, -sdpavarbounds[i], checkinput);
1018 #ifdef SCIP_MORE_DEBUG
1019 SCIPdebugMessage(
" -> adding upper bound 0 at (%d,%d) for variable %d which became variable %d in SDPA (%d)\n",
1020 0, nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpatoinputmapper[sdpisolver->varboundpos[i] - 1],
1021 sdpisolver->varboundpos[i]);
1027 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1030 sdpisolver->sdpa->inputElement((
long long) sdpisolver->nactivevars + 1, (
long long) nsdpblocks - nremovedblocks + 1,
1031 (
long long) nlpineqs + 1 + i, (
long long) nlpineqs + 1 + i, 1.0, checkinput);
1032 #ifdef SCIP_MORE_DEBUG
1033 SCIPdebugMessage(
" -> adding lower bound r >= 0 at (%d,%d) in SDPA (%d)\n", nlpineqs + 1 + i, nlpineqs + 1 + i, sdpisolver->sdpcounter);
1038 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &sdpavarbounds, 2 * sdpisolver->nactivevars);
1041 sdpisolver->sdpa->initializeUpperTriangle();
1043 #ifdef SCIP_DEBUG_PRINTTOFILE
1045 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(
"sdpa.dat-s"), const_cast<char*>(
"%+8.3e"));
1046 sdpisolver->sdpa->writeInitSparse(const_cast<char*>(
"sdpa.ini-s"), const_cast<char*>(
"%+8.3e"));
1049 sdpisolver->sdpa->initializeSolve();
1052 if ( start != NULL && penaltyparam < sdpisolver->epsilon )
1055 SCIPdebugMessage(
"Starting with a previous solution is not yet tested for the interface, only x-vector is given, not y and Z");
1056 for (i = 1; i <= sdpisolver->nactivevars; i++)
1057 sdpisolver->sdpa->inputInitXVec((
long long) i, start[sdpisolver->sdpatoinputmapper[i] - 1]);
1059 else if ( penaltyparam >= sdpisolver->epsilon )
1060 SCIPdebugMessage(
"Skipping insertion of starting point, as this is not yet supported for penalty formulation.\n");
1063 if ( penaltyparam < sdpisolver->epsilon )
1065 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_UNSTABLE_BUT_FAST);
1066 sdpisolver->sdpa->setParameterEpsilonStar(sdpisolver->epsilon);
1067 sdpisolver->sdpa->setParameterEpsilonDash(sdpisolver->feastol);
1071 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1076 sdpisolver->sdpa->setParameterLowerBound(-1e20);
1080 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1082 sdpisolver->sdpa->setParameterUpperBound(1e20);
1083 #ifdef SCIP_MORE_DEBUG
1084 sdpisolver->sdpa->printParameters(stdout);
1090 snprintf(str, 1024,
"OMP_NUM_THREADS=%d", sdpisolver->threads);
1091 int status = putenv(str);
1094 SCIPdebugMessage(
"Setting the number of threads failed (%d, %d).\n", status, errno);
1095 return SCIP_LPERROR;
1099 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d, threads: %d)\n", sdpisolver->sdpcounter, sdpisolver->sdpa->getNumThreads());
1101 SCIPdebugMessage(
"Calling SDPA solve (SDP: %d)\n", sdpisolver->sdpcounter);
1103 sdpisolver->sdpa->solve();
1104 sdpisolver->solved = TRUE;
1108 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1109 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1116 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again ...\n", sdpisolver->sdpcounter);
1119 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_DEFAULT);
1120 sdpisolver->sdpa->setParameterEpsilonStar(
EPSILONCHANGE * sdpisolver->epsilon);
1121 sdpisolver->sdpa->setParameterEpsilonDash(
FEASTOLCHANGE * sdpisolver->feastol);
1124 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1126 sdpisolver->sdpa->setParameterUpperBound(1e20);
1127 #ifdef SCIP_MORE_DEBUG
1128 sdpisolver->sdpa->printParameters(stdout);
1130 sdpisolver->sdpa->solve();
1131 sdpisolver->solved = TRUE;
1135 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1136 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in contrast to our formulation)\n", phase_string);
1142 SCIPdebugMessage(
"Numerical troubles -- solving SDP %d again^2 ...\n", sdpisolver->sdpcounter);
1145 sdpisolver->sdpa->setParameterType(SDPA::PARAMETER_STABLE_BUT_SLOW);
1150 sdpisolver->sdpa->setParameterUpperBound(sdpisolver->objlimit);
1152 sdpisolver->sdpa->setParameterUpperBound(1e20);
1153 #ifdef SCIP_MORE_DEBUG
1154 sdpisolver->sdpa->printParameters(stdout);
1156 sdpisolver->sdpa->solve();
1157 sdpisolver->solved = TRUE;
1161 sdpisolver->sdpa->getPhaseString((
char*)phase_string);
1162 SCIPdebugMessage(
"SDPA solving finished with status %s (primal and dual here are switched in constrast to our formulation)\n", phase_string);
1167 #ifdef SCIP_MORE_DEBUG
1168 (void) fclose(fpOut);
1172 if ( penaltyparam >= sdpisolver->epsilon )
1177 assert( (sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) );
1179 sdpasol = sdpisolver->sdpa->getResultXVec();
1182 *feasorig = (sdpasol[sdpisolver->nactivevars] < sdpisolver->feastol);
1185 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", sdpasol[sdpisolver->nactivevars]);
1209 assert( sdpisolver != NULL );
1210 return sdpisolver->solved;
1223 SDPA::PhaseType phasetype;
1225 assert( sdpisolver != NULL );
1226 assert( sdpisolver->sdpa != NULL);
1229 phasetype = sdpisolver->sdpa->getPhaseValue();
1231 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1240 SCIP_Bool* primalfeasible,
1241 SCIP_Bool* dualfeasible
1244 SDPA::PhaseType phasetype;
1246 assert( sdpisolver != NULL );
1247 assert( sdpisolver->sdpa != NULL );
1248 assert( primalfeasible != NULL );
1249 assert( dualfeasible != NULL );
1252 phasetype = sdpisolver->sdpa->getPhaseValue();
1254 switch ( phasetype )
1257 *primalfeasible = TRUE;
1258 *dualfeasible = TRUE;
1261 *primalfeasible = TRUE;
1262 *dualfeasible = TRUE;
1264 case SDPA::pFEAS_dINF:
1265 *primalfeasible = TRUE;
1266 *dualfeasible = FALSE;
1268 case SDPA::pINF_dFEAS:
1269 *primalfeasible = FALSE;
1270 *dualfeasible = TRUE;
1273 *primalfeasible = TRUE;
1274 *dualfeasible = FALSE;
1275 SCIPdebugMessage(
"SDPA stopped because dual objective became smaller than lower bound\n");
1278 *primalfeasible = FALSE;
1279 *dualfeasible = TRUE;
1280 SCIPdebugMessage(
"SDPA stopped because primal objective became bigger than upper bound\n");
1283 SCIPerrorMessage(
"SDPA doesn't know if primal and dual solutions are feasible\n");
1284 return SCIP_LPERROR;
1296 SDPA::PhaseType phasetype;
1298 assert( sdpisolver != NULL );
1299 assert( sdpisolver->sdpa != NULL );
1302 phasetype = sdpisolver->sdpa->getPhaseValue();
1304 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
1306 SCIPdebugMessage(
"SDPA doesn't know if primal problem is unbounded");
1309 else if ( phasetype == SDPA::pFEAS_dINF )
1311 else if ( phasetype == SDPA::pUNBD )
1313 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
1326 SDPA::PhaseType phasetype;
1328 assert( sdpisolver != NULL );
1329 assert( sdpisolver->sdpa != NULL );
1332 phasetype = sdpisolver->sdpa->getPhaseValue();
1334 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1336 SCIPdebugMessage(
"SDPA doesn't know if primal problem is infeasible");
1339 else if ( phasetype == SDPA::pINF_dFEAS )
1341 else if ( phasetype == SDPA::dUNBD )
1343 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1356 SDPA::PhaseType phasetype;
1358 assert( sdpisolver != NULL );
1359 assert( sdpisolver->sdpa != NULL );
1362 phasetype = sdpisolver->sdpa->getPhaseValue();
1364 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1366 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
1369 else if ( phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS || phasetype == SDPA::pdFEAS )
1371 else if ( phasetype == SDPA::dUNBD )
1373 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1386 SDPA::PhaseType phasetype;
1388 assert( sdpisolver != NULL );
1389 assert( sdpisolver->sdpa != NULL);
1392 phasetype = sdpisolver->sdpa->getPhaseValue();
1394 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1396 SCIPdebugMessage(
"SDPA doesn't know if dual problem is unbounded");
1399 else if ( phasetype == SDPA::pINF_dFEAS )
1401 else if ( phasetype == SDPA::dUNBD )
1403 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1416 SDPA::PhaseType phasetype;
1418 assert( sdpisolver != NULL );
1419 assert( sdpisolver->sdpa != NULL);
1422 phasetype = sdpisolver->sdpa->getPhaseValue();
1424 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::pdINF )
1426 SCIPdebugMessage(
"SDPA doesn't know if dual problem is infeasible");
1429 else if ( phasetype == SDPA::pFEAS_dINF )
1431 else if ( phasetype == SDPA::pUNBD )
1433 SCIPdebugMessage(
"SDPA was stopped because primal objective became bigger than upper bound");
1446 SDPA::PhaseType phasetype;
1448 assert( sdpisolver != NULL );
1449 assert( sdpisolver->sdpa != NULL);
1452 phasetype = sdpisolver->sdpa->getPhaseValue();
1454 if ( phasetype == SDPA::noINFO || phasetype == SDPA::dFEAS || phasetype == SDPA::pdINF )
1456 SCIPdebugMessage(
"SDPA doesn't know if primal problem is feasible");
1459 else if ( phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pdOPT || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1461 else if ( phasetype == SDPA::dUNBD )
1463 SCIPdebugMessage(
"SDPA was stopped because dual objective became smaller than lower bound");
1475 SDPA::PhaseType phasetype;
1477 assert( sdpisolver != NULL );
1478 assert( sdpisolver->sdpa != NULL );
1481 phasetype = sdpisolver->sdpa->getPhaseValue();
1483 if ( phasetype == SDPA::pdOPT )
1494 SDPA::PhaseType phasetype;
1496 assert( sdpisolver != NULL );
1497 assert( sdpisolver->sdpa != NULL );
1500 phasetype = sdpisolver->sdpa->getPhaseValue();
1502 if ( phasetype == SDPA::pUNBD )
1513 SDPA::PhaseType phasetype;
1515 assert( sdpisolver != NULL );
1516 assert( sdpisolver->sdpa != NULL);
1519 phasetype = sdpisolver->sdpa->getPhaseValue();
1521 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1523 if ( sdpisolver->sdpa->getParameterMaxIteration() == sdpisolver->sdpa->getIteration() )
1535 SCIPdebugMessage(
"Not implemented in SDPA!\n");
1553 SDPA::PhaseType phasetype;
1555 assert( sdpisolver != NULL );
1556 assert( sdpisolver->sdpa != NULL );
1558 if ( sdpisolver->sdpa == NULL || (! sdpisolver->solved) )
1561 phasetype = sdpisolver->sdpa->getPhaseValue();
1563 if ( phasetype == SDPA::pdOPT || phasetype == SDPA::pFEAS_dINF || phasetype == SDPA::pINF_dFEAS )
1565 if ( phasetype == SDPA::pdINF )
1567 if ( phasetype == SDPA::pUNBD)
1569 if ( phasetype == SDPA::noINFO || phasetype == SDPA::pFEAS || phasetype == SDPA::dFEAS || phasetype == SDPA::pdFEAS )
1580 SDPA::PhaseType phasetype;
1582 assert( sdpisolver != NULL );
1583 assert( sdpisolver->sdpa != NULL );
1586 phasetype = sdpisolver->sdpa->getPhaseValue();
1588 if ( phasetype == SDPA::pdOPT )
1600 SDPA::PhaseType phasetype;
1602 assert( sdpisolver != NULL );
1603 assert( sdpisolver->sdpa != NULL );
1606 phasetype = sdpisolver->sdpa->getPhaseValue();
1610 if (
SCIPsdpiSolverIsConverged(sdpisolver) || phasetype == SDPA::pUNBD || phasetype == SDPA::pINF_dFEAS || phasetype == SDPA::pFEAS_dINF )
1622 SCIPdebugMessage(
"Not implemented yet\n");
1625 return SCIP_LPERROR;
1634 assert( sdpisolver != NULL );
1635 assert( sdpisolver->sdpa != NULL );
1636 assert( objval != NULL );
1639 *objval = sdpisolver->sdpa->getPrimalObj();
1642 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
1643 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
1644 if ( gap > sdpisolver->epsilon )
1645 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetObjval, "
1646 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
1650 *objval += sdpisolver->fixedvarsobjcontr;
1670 assert( sdpisolver != NULL );
1671 assert( sdpisolver->sdpa != NULL );
1672 assert( dualsollength != NULL );
1675 if ( objval != NULL )
1677 *objval = sdpisolver->sdpa->getPrimalObj();
1680 SCIP_Real primalval = sdpisolver->sdpa->getDualObj();
1681 SCIP_Real gap = (REALABS(*objval - primalval) / (0.5 * (REALABS(primalval) + REALABS(*objval))));
1682 if ( gap > sdpisolver->epsilon )
1684 SCIPdebugMessage(
"Attention: got objective value (before adding values of fixed variables) of %f in SCIPsdpiSolverGetSol, "
1685 "but primal objective is %f with duality gap %f!\n", *objval, primalval, gap );
1690 *objval += sdpisolver->fixedvarsobjcontr;
1693 if ( *dualsollength > 0 )
1695 assert( dualsol != NULL );
1696 if ( *dualsollength < sdpisolver->nvars )
1698 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
1699 *dualsollength = sdpisolver->nvars;
1705 assert( (sdpisolver->penalty && sdpisolver->nactivevars + 1 == sdpisolver->sdpa->getConstraintNumber()) ||
1706 sdpisolver->nactivevars == sdpisolver->sdpa->getConstraintNumber() );
1707 sdpasol = sdpisolver->sdpa->getResultXVec();
1709 for (v = 0; v < sdpisolver->nvars; v++)
1711 if ( sdpisolver->inputtosdpamapper[v] > 0 )
1714 dualsol[v] = sdpasol[sdpisolver->inputtosdpamapper[v] - 1];
1719 assert( -sdpisolver->inputtosdpamapper[v] <= sdpisolver->nvars - sdpisolver->nactivevars );
1720 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtosdpamapper[v]) - 1];
1747 assert( sdpisolver != NULL );
1748 assert( sdpisolver->sdpa != NULL );
1749 assert( lbvars != NULL );
1750 assert( ubvars != NULL );
1751 assert( arraylength != NULL );
1752 assert( *arraylength >= 0 );
1756 if ( *arraylength < sdpisolver->nvars )
1758 *arraylength = sdpisolver->nvars;
1759 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
1764 for (i = 0; i < sdpisolver->nvars; i++)
1771 if ( sdpisolver->nvarbounds == 0 )
1773 SCIPdebugMessage(
"Asked for PrimalBoundVars, but there were no variable bounds in sdpa, returning zero vector !");
1778 lpblockind = (int) sdpisolver->sdpa->getBlockNumber();
1779 assert( sdpisolver->sdpa->getBlockType((
long long) lpblockind) == SDPA::LP );
1780 nlpcons = (int) sdpisolver->sdpa->getBlockSize((
long long) lpblockind);
1781 assert( nlpcons >= 0 );
1783 X = sdpisolver->sdpa->getResultYMat((
long long) lpblockind);
1786 assert( sdpisolver->nvarbounds <= 2 * sdpisolver->nvars || (sdpisolver->nvarbounds <= 2 * sdpisolver->nvars + 1 && sdpisolver->penalty ) );
1788 for (i = 0; i < ((sdpisolver->penalty) ? sdpisolver->nvarbounds - 1 : sdpisolver->nvarbounds); i++)
1790 if ( sdpisolver->varboundpos[i] < 0 )
1794 lbvars[sdpisolver->sdpatoinputmapper[-1 * sdpisolver->varboundpos[i] -1]] = X[nlpcons - sdpisolver->nvarbounds + i];
1800 ubvars[sdpisolver->sdpatoinputmapper[+1 * sdpisolver->varboundpos[i] - 1]] = X[nlpcons - sdpisolver->nvarbounds + i];
1813 assert( sdpisolver != NULL );
1814 assert( sdpisolver->sdpa != NULL );
1815 assert( iterations != NULL );
1818 *iterations = (int) sdpisolver->sdpa->getIteration();
1875 assert( sdpisolver != NULL );
1876 assert( dval != NULL );
1881 *dval = sdpisolver->epsilon;
1884 *dval = sdpisolver->feastol;
1887 *dval = sdpisolver->objlimit;
1890 return SCIP_PARAMETERUNKNOWN;
1903 assert( sdpisolver != NULL );
1908 sdpisolver->epsilon = dval;
1909 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
1912 sdpisolver->feastol = dval;
1913 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
1916 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
1917 sdpisolver->objlimit = dval;
1920 return SCIP_PARAMETERUNKNOWN;
1933 assert( sdpisolver != NULL );
1938 case SCIP_SDPPAR_THREADS:
1939 *ival = sdpisolver->threads;
1940 SCIPdebugMessage(
"Getting sdpisolver number of threads: %d.\n", *ival);
1944 *ival = (int) sdpisolver->sdpinfo;
1945 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
1948 return SCIP_PARAMETERUNKNOWN;
1961 assert( sdpisolver != NULL );
1966 case SCIP_SDPPAR_THREADS:
1967 sdpisolver->threads = ival;
1968 SCIPdebugMessage(
"Setting sdpisolver number of threads to %d.\n", ival);
1972 sdpisolver->sdpinfo = (SCIP_Bool) ival;
1973 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
1976 return SCIP_PARAMETERUNKNOWN;
2000 SCIPdebugMessage(
"Not implemented yet\n");
2001 return SCIP_LPERROR;
2010 assert( fname != NULL );
2012 sdpisolver->sdpa->writeInputSparse(const_cast<char*>(fname), const_cast<char*>(
"%8.3f"));
const char * SCIPsdpiSolverGetSolverName(void)
SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_Bool SCIPsdpiSolverIsGEMaxPenParam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
const char * SCIPsdpiSolverGetSolverDesc(void)
SCIP_Bool SCIPsdpiSolverIsInfinity(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
interface methods for specific SDP solvers
SCIP_RETCODE SCIPsdpiSolverResetCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real *dval)
SCIP_Bool SCIPsdpiSolverIsObjlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverLoadAndSolve(SCIP_SDPISOLVER *sdpisolver, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *lprownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *start)
SCIP_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
SCIP_Bool SCIPsdpiSolverWasSolved(SCIP_SDPISOLVER *sdpisolver)
#define CHECK_IF_SOLVED_BOOL(sdpisolver)
static SCIP_Bool isFixed(SCIP_SDPISOLVER *sdpisolver, SCIP_Real lb, SCIP_Real ub)
SCIP_RETCODE SCIPsdpiSolverLoadAndSolveWithPenalty(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Bool withobj, SCIP_Bool rbound, int nvars, SCIP_Real *obj, SCIP_Real *lb, SCIP_Real *ub, int nsdpblocks, int *sdpblocksizes, int *sdpnblockvars, int sdpconstnnonz, int *sdpconstnblocknonz, int **sdpconstrow, int **sdpconstcol, SCIP_Real **sdpconstval, int sdpnnonz, int **sdpnblockvarnonz, int **sdpvar, int ***sdprow, int ***sdpcol, SCIP_Real ***sdpval, int **indchanges, int *nremovedinds, int *blockindchanges, int nremovedblocks, int nlpcons, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *rownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *start, SCIP_Bool *feasorig)
SCIP_RETCODE SCIPsdpiSolverIncreaseCounter(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSolFeasibility(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_RETCODE SCIPsdpiSolverWriteSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
SCIP_Bool SCIPsdpiSolverIsAcceptable(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsOptimal(SCIP_SDPISOLVER *sdpisolver)
#define CHECK_IF_SOLVED(sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetPrimalBoundVars(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
SCIP_Bool SCIPsdpiSolverIsDualInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverSetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int ival)
SCIP_Bool SCIPsdpiSolverIsPrimalInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_Real SCIPsdpiSolverMaxPenParam(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverReadSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
struct SCIP_SDPiSolver SCIP_SDPISOLVER
SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)