46 #pragma GCC diagnostic ignored "-Wstrict-prototypes" 48 #pragma GCC diagnostic warning "-Wstrict-prototypes" 54 #include "blockmemshell/memory.h" 56 #include "scip/pub_misc.h" 58 #include "scip/pub_message.h" 61 #define PENALTYBOUNDTOL 1E-3 64 #define MIN_PENALTYPARAM 1e5 65 #define MAX_PENALTYPARAM 1e12 66 #define PENALTYPARAM_FACTOR 1e4 67 #define MAX_MAXPENALTYPARAM 1e15 68 #define MAXPENALTYPARAM_FACTOR 1e6 69 #define INFEASFEASTOLCHANGE 0.1 70 #define INFEASMINFEASTOL 1e-15 74 #define DSDP_CALL(x) do \ 76 int _dsdperrorcode_; \ 77 if ( (_dsdperrorcode_ = (x)) != 0 ) \ 79 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \ 80 return SCIP_LPERROR; \ 86 #define DSDP_CALL_BOOL(x) do \ 88 int _dsdperrorcode_; \ 89 if ( (_dsdperrorcode_ = (x)) != 0 ) \ 91 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \ 98 #define DSDP_CALL_INT(x) do \ 100 int _dsdperrorcode_; \ 101 if ( (_dsdperrorcode_ = (x)) != 0 ) \ 103 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \ 104 return _dsdperrorcode_; \ 110 #define DSDP_CALLM(x) do \ 112 int _dsdperrorcode_; \ 113 if ( (_dsdperrorcode_ = (x)) != 0 ) \ 115 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \ 116 return SCIP_NOMEMORY; \ 122 #define BMS_CALL(x) do \ 126 SCIPerrorMessage("No memory in function call.\n"); \ 127 return SCIP_NOMEMORY; \ 133 #define TIMEOFDAY_CALL(x) do \ 136 if ( (_errorcode_ = (x)) != 0 ) \ 138 SCIPerrorMessage("Error in gettimeofday! \n"); \ 145 #define CHECK_IF_SOLVED(sdpisolver) do \ 147 if (!(sdpisolver->solved)) \ 149 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 150 return SCIP_LPERROR; \ 156 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \ 158 if (!(sdpisolver->solved)) \ 160 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 168 struct SCIP_SDPiSolver
170 SCIP_MESSAGEHDLR* messagehdlr;
179 int* inputtodsdpmapper;
182 int* dsdptoinputmapper;
183 SCIP_Real* fixedvarsval;
184 SCIP_Real fixedvarsobjcontr;
191 SCIP_Real sdpsolverfeastol;
192 SCIP_Real penaltyparam;
197 SCIP_Bool penaltyworbound;
202 SCIP_Bool timelimitinitial;
206 SCIP_Real* preoptimalsol;
207 SCIP_Bool preoptimalsolexists;
208 SCIP_Real preoptimalgap;
236 return i*(i+1)/2 + j;
248 assert( lb < ub + sdpisolver->feastol );
250 return (ub-lb <= sdpisolver->epsilon);
253 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon) 269 SCIPsortIntIntReal(col, row, val, length);
272 while (nextentry < length)
274 firstentry = nextentry;
276 while (nextentry < length && col[nextentry] == col[firstentry])
280 SCIPsortIntReal(row + firstentry, val + firstentry, nextentry - firstentry);
293 assert( dsdp != NULL );
294 assert( ctx != NULL );
300 DSDP_CALL( DSDPSetConvergenceFlag(dsdp, DSDP_USER_TERMINATION) );
301 timings->stopped = TRUE;
302 SCIPdebugMessage(
"Time limit reached! Stopping DSDP.\n");
331 relgap = absgap / (1.0 + (REALABS(dobj)/2) + (REALABS(pobj)/2) );
340 SCIPdebugMessage(
"penalty variable %f, gap %f -> saving preoptimal solution\n", r, relgap);
368 return "Dual-Scaling Interior Point SDP-Solver by S. Benson, Y. Ye, and X. Zhang (http://www.mcs.anl.gov/hs/software/DSDP/)";
381 assert( sdpisolver != NULL );
382 return (
void*) sdpisolver->dsdp;
414 SCIP_MESSAGEHDLR* messagehdlr,
419 assert( sdpisolver != NULL );
420 assert( blkmem != NULL );
421 assert( bufmem != NULL );
423 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
425 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
427 (*sdpisolver)->messagehdlr = messagehdlr;
428 (*sdpisolver)->blkmem = blkmem;
429 (*sdpisolver)->bufmem = bufmem;
433 (*sdpisolver)->dsdp = NULL;
434 (*sdpisolver)->sdpcone = NULL;
435 (*sdpisolver)->lpcone = NULL;
436 (*sdpisolver)->bcone = NULL;
438 (*sdpisolver)->nvars = 0;
439 (*sdpisolver)->nactivevars = 0;
440 (*sdpisolver)->inputtodsdpmapper = NULL;
441 (*sdpisolver)->dsdptoinputmapper = NULL;
442 (*sdpisolver)->fixedvarsval = NULL;
443 (*sdpisolver)->fixedvarsobjcontr = 0.0;
444 (*sdpisolver)->objcoefs = NULL;
445 (*sdpisolver)->solved = FALSE;
446 (*sdpisolver)->timelimit = FALSE;
447 (*sdpisolver)->timelimitinitial = FALSE;
448 (*sdpisolver)->penalty = FALSE;
449 (*sdpisolver)->penaltyworbound = FALSE;
450 (*sdpisolver)->feasorig = FALSE;
451 (*sdpisolver)->sdpcounter = 0;
452 (*sdpisolver)->niterations = 0;
453 (*sdpisolver)->opttime = 0.0;
454 (*sdpisolver)->nsdpcalls = 0;
456 (*sdpisolver)->epsilon = 1e-9;
457 (*sdpisolver)->gaptol = 1e-6;
458 (*sdpisolver)->feastol = 1e-6;
459 (*sdpisolver)->sdpsolverfeastol = 1e-6;
460 (*sdpisolver)->penaltyparam = 1e5;
462 (*sdpisolver)->sdpinfo = FALSE;
463 (*sdpisolver)->nthreads = -1;
465 (*sdpisolver)->preoptimalsolexists = FALSE;
466 (*sdpisolver)->preoptimalgap = -1.0;
476 assert( sdpisolver != NULL );
477 assert( *sdpisolver != NULL );
479 SCIPdebugMessage(
"Freeing SDPISolver\n");
481 if ( (*sdpisolver)->dsdp != NULL )
483 DSDP_CALL( DSDPDestroy((*sdpisolver)->dsdp) );
486 if ( (*sdpisolver)->nvars > 0 )
487 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->inputtodsdpmapper, (*sdpisolver)->nvars);
489 if ( (*sdpisolver)->nactivevars > 0 )
491 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->nactivevars);
492 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->dsdptoinputmapper, (*sdpisolver)->nactivevars);
493 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
496 if ( (*sdpisolver)->nvars >= (*sdpisolver)->nactivevars )
497 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
499 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
509 assert( sdpisolver != NULL );
511 sdpisolver->sdpcounter++;
521 assert( sdpisolver != NULL );
523 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
524 sdpisolver->sdpcounter = 0;
564 int* sdpconstnblocknonz,
568 SCIP_Real** sdpconstval,
570 int** sdpnblockvarnonz,
580 int* blockindchanges,
590 int* startZnblocknonz,
596 SCIP_Real** startZval,
598 int* startXnblocknonz,
604 SCIP_Real** startXval,
612 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, TRUE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars,
613 sdpconstnnonz, sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
614 indchanges, nremovedinds, blockindchanges, nremovedblocks, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol,
615 lpval, starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
616 timelimit, usedsdpitime, NULL, NULL);
643 SCIP_Real penaltyparam,
654 int* sdpconstnblocknonz,
658 SCIP_Real** sdpconstval,
660 int** sdpnblockvarnonz,
670 int* blockindchanges,
680 int* startZnblocknonz,
686 SCIP_Real** startZval,
688 int* startXnblocknonz,
694 SCIP_Real** startXval,
702 SCIP_Bool* penaltybound
706 int* dsdpconstind = NULL;
707 SCIP_Real* dsdpconstval = NULL;
709 SCIP_Real* dsdpval = NULL;
710 int* dsdplpbegcol = NULL;
711 int* dsdplprow = NULL;
712 SCIP_Real* dsdplpval = NULL;
724 SCIP_Real solvertimelimit;
725 SCIP_Real oldsdpitime;
729 DSDPTerminationReason reason;
732 assert( sdpisolver != NULL );
733 assert( penaltyparam > -1 * sdpisolver->epsilon );
734 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
736 assert( obj != NULL );
737 assert( lb != NULL );
738 assert( ub != NULL );
739 assert( nsdpblocks >= 0 );
740 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
741 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
742 assert( sdpconstnnonz >= 0 );
743 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
744 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
745 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
746 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
747 assert( sdpnnonz >= 0 );
748 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
749 assert( nsdpblocks == 0 || sdpvar != NULL );
750 assert( nsdpblocks == 0 || sdprow != NULL );
751 assert( nsdpblocks == 0 || sdpcol != NULL );
752 assert( nsdpblocks == 0 || sdpval != NULL );
753 assert( nsdpblocks == 0 || indchanges != NULL );
754 assert( nsdpblocks == 0 || nremovedinds != NULL );
755 assert( nsdpblocks == 0 || blockindchanges != NULL );
756 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
757 assert( nlpcons >= 0 );
758 assert( nlpcons == 0 || lplhs != NULL );
759 assert( nlpcons == 0 || lprhs != NULL );
760 assert( lpnnonz >= 0 );
761 assert( nlpcons == 0 || lprow != NULL );
762 assert( nlpcons == 0 || lpcol != NULL );
763 assert( nlpcons == 0 || lpval != NULL );
766 solvertimelimit = timelimit;
770 if ( solvertimelimit <= 0.0 )
772 sdpisolver->timelimit = TRUE;
773 sdpisolver->timelimitinitial = TRUE;
774 sdpisolver->solved = FALSE;
778 sdpisolver->timelimitinitial = FALSE;
780 sdpisolver->feasorig = FALSE;
781 sdpisolver->penalty = penaltyparam > sdpisolver->epsilon;
784 timings.usedsdpitime = usedsdpitime;
785 timings.timelimit = timelimit;
786 timings.stopped = FALSE;
790 if ( penaltyparam < sdpisolver->epsilon )
792 SCIPdebugMessage(
"Inserting Data into DSDP for SDP (%d) \n", ++sdpisolver->sdpcounter);
797 SCIPdebugMessage(
"Inserting Data again into DSDP for SDP (%d) \n", sdpisolver->sdpcounter);
803 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtodsdpmapper), sdpisolver->nvars, nvars) );
804 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->dsdptoinputmapper), sdpisolver->nactivevars, nvars) );
805 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
806 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
808 sdpisolver->nvars = nvars;
809 oldnactivevars = sdpisolver->nactivevars;
810 sdpisolver->nactivevars = 0;
812 sdpisolver->niterations = 0;
813 sdpisolver->nsdpcalls = 0;
816 sdpisolver->fixedvarsobjcontr = 0.0;
817 for (i = 0; i < nvars; i++)
819 if (
isFixed(sdpisolver, lb[i], ub[i]) )
822 sdpisolver->inputtodsdpmapper[i] = -nfixedvars;
823 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
824 sdpisolver->fixedvarsval[nfixedvars - 1] = lb[i];
825 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in DSDP\n", i, lb[i], sdpisolver->sdpcounter);
829 sdpisolver->dsdptoinputmapper[sdpisolver->nactivevars] = i;
830 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
831 sdpisolver->nactivevars++;
832 sdpisolver->inputtodsdpmapper[i] = sdpisolver->nactivevars;
833 #ifdef SCIP_MORE_DEBUG 834 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in DSDP\n", i, sdpisolver->inputtodsdpmapper[i], sdpisolver->sdpcounter);
838 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
839 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
841 SCIPdebugMessage(
"Variable %d is the slack variable for the explicit penalty formulation.\n", sdpisolver->nactivevars + 1);
846 sdpisolver->fixedvarsobjcontr = 0.0;
849 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
850 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
851 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->dsdptoinputmapper), nvars, sdpisolver->nactivevars) );
854 if ( sdpisolver->nactivevars != oldnactivevars )
856 if ( oldnactivevars == 0 )
858 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), sdpisolver->nactivevars) );
862 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), oldnactivevars, sdpisolver->nactivevars) );
865 sdpisolver->preoptimalsolexists = FALSE;
869 if ( sdpisolver->dsdp != NULL )
871 DSDP_CALL( DSDPDestroy(sdpisolver->dsdp) );
875 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
877 DSDP_CALLM( DSDPCreate(sdpisolver->nactivevars + 1, &(sdpisolver->dsdp)) );
878 sdpisolver->penaltyworbound = TRUE;
882 DSDP_CALLM( DSDPCreate(sdpisolver->nactivevars, &(sdpisolver->dsdp)) );
883 sdpisolver->penaltyworbound = FALSE;
885 DSDP_CALLM( DSDPCreateSDPCone(sdpisolver->dsdp, nsdpblocks - nremovedblocks, &(sdpisolver->sdpcone)) );
886 DSDP_CALLM( DSDPCreateLPCone(sdpisolver->dsdp, &(sdpisolver->lpcone)) );
887 DSDP_CALLM( DSDPCreateBCone(sdpisolver->dsdp, &(sdpisolver->bcone)) );
889 #ifdef SCIP_MORE_DEBUG 890 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"setting objective values for SDP %d:\n", sdpisolver->sdpcounter);
893 for (i = 0; i < sdpisolver->nactivevars; i++)
898 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, i+1, -1.0 * obj[sdpisolver->dsdptoinputmapper[i]]) );
899 #ifdef SCIP_MORE_DEBUG 900 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"var %d (was var %d): %f, ", i+1, sdpisolver->dsdptoinputmapper[i], obj[sdpisolver->dsdptoinputmapper[i]]);
905 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, i+1, 0.0) );
911 DSDP_CALL( BConeSetLowerBound(sdpisolver->bcone, i+1, lb[sdpisolver->dsdptoinputmapper[i]]) );
917 DSDP_CALL(BConeSetUpperBound(sdpisolver->bcone, i+1, ub[sdpisolver->dsdptoinputmapper[i]]));
922 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
924 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, sdpisolver->nactivevars + 1, -1.0 * penaltyparam) );
925 #ifdef SCIP_MORE_DEBUG 926 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"slack variable r: %f, ", penaltyparam);
930 #ifdef SCIP_MORE_DEBUG 931 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
932 SCIPdebugMessage(
"ATTENTION: BConeView shows the WRONG sign for the lower bound!\n");
933 BConeView(sdpisolver->bcone);
937 for (block = 0; block < nsdpblocks; ++block)
940 if ( blockindchanges[block] > -1 )
943 DSDP_CALL( SDPConeSetBlockSize(sdpisolver->sdpcone, block- blockindchanges[block], sdpblocksizes[block] - nremovedinds[block]) );
961 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
964 for (block = 0; block < nsdpblocks; block++)
965 nrnonz += sdpblocksizes[block] - nremovedinds[block];
966 assert( nrnonz >= 0 );
969 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz + nrnonz) );
971 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz + nrnonz) );
976 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz) );
978 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz) );
983 for (block = 0; block < nsdpblocks; block++)
985 for (i = 0; i < sdpisolver->nactivevars; i++)
988 v = sdpisolver->dsdptoinputmapper[i];
992 for (k = 0; k < sdpnblockvars[block]; k++)
994 if ( v == sdpvar[block][k] )
1003 if ( blockvar > -1 )
1005 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
1008 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
1011 dsdpind[ind] =
compLowerTriangPos(sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]],
1012 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]]);
1013 dsdpval[ind] = -1.0 * sdpval[block][blockvar][k];
1018 SCIPsortIntReal(dsdpind + startind, dsdpval + startind, sdpnblockvarnonz[block][blockvar]);
1020 assert( blockindchanges[block] > -1 );
1024 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], i + 1, sdpblocksizes[block] - nremovedinds[block],
1025 1.0, 0, dsdpind + startind,dsdpval + startind, sdpnblockvarnonz[block][blockvar]));
1030 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1034 for (block = 0; block < nsdpblocks; block++)
1036 if ( blockindchanges[block] > -1 )
1038 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1041 dsdpval[ind] = -1.0;
1044 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], sdpisolver->nactivevars + 1,
1045 sdpblocksizes[block] - nremovedinds[block], 1.0, 0, dsdpind + ind - (sdpblocksizes[block] - nremovedinds[block]) ,
1046 dsdpval + ind - (sdpblocksizes[block] - nremovedinds[block]), sdpblocksizes[block] - nremovedinds[block]) );
1049 assert( ind - startind == nrnonz );
1054 if ( sdpconstnnonz > 0 )
1056 assert( nsdpblocks > 0 );
1057 assert( sdpconstnblocknonz!= NULL );
1058 assert( sdpconstcol != NULL );
1059 assert( sdpconstrow != NULL );
1060 assert( sdpconstval != NULL );
1067 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpconstind, sdpconstnnonz) );
1069 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpconstval, sdpconstnnonz) );
1073 for (block = 0; block < nsdpblocks; block++)
1077 if ( sdpconstnblocknonz[block] > 0 )
1080 for (i = 0; i < sdpconstnblocknonz[block]; i++)
1083 assert( indchanges[block][sdpconstrow[block][i]] > -1 && indchanges[block][sdpconstcol[block][i]] > -1 );
1086 dsdpconstind[ind] =
compLowerTriangPos(sdpconstrow[block][i] - indchanges[block][sdpconstrow[block][i]],
1087 sdpconstcol[block][i] - indchanges[block][sdpconstcol[block][i]]);
1088 dsdpconstval[ind] = -1 * sdpconstval[block][i];
1093 SCIPsortIntReal(dsdpconstind + startind, dsdpconstval + startind, sdpconstnblocknonz[block]);
1095 assert( blockindchanges[block] > -1 );
1099 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], 0, sdpblocksizes[block] - nremovedinds[block],
1100 1.0, 0, dsdpconstind + startind, dsdpconstval + startind, ind - startind));
1105 #ifdef SCIP_MORE_DEBUG 1106 SDPConeView2(sdpisolver->sdpcone);
1117 assert( lprhs != NULL );
1118 assert( lpcol != NULL );
1119 assert( lprow != NULL );
1120 assert( lpval != NULL );
1123 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &rowmapper, 2 * nlpcons) );
1127 for (i = 0; i < nlpcons; i++)
1131 rowmapper[2*i] = pos;
1135 rowmapper[2*i] = -1;
1139 rowmapper[2*i + 1] = pos;
1143 rowmapper[2*i + 1] = -1;
1146 assert( nlpineqs <= 2*nlpcons );
1153 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1155 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 3) );
1159 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 2) );
1169 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1171 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, 2 * nlpineqs + 2*lpnnonz) );
1175 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, nlpineqs + 2*lpnnonz) );
1180 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1182 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs) );
1186 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars) );
1198 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1200 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, 2 * nlpineqs + 2*lpnnonz) );
1204 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, nlpineqs + 2*lpnnonz) );
1209 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1211 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs) );
1215 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars) );
1223 for (i = 0; i < nlpcons; i++)
1227 if ( REALABS(lplhs[i]) > sdpisolver->epsilon )
1229 dsdplprow[dsdpnlpnonz] = pos;
1230 dsdplpval[dsdpnlpnonz] = -lplhs[i];
1238 if ( REALABS(lprhs[i]) > sdpisolver->epsilon )
1240 dsdplprow[dsdpnlpnonz] = pos;
1241 dsdplpval[dsdpnlpnonz] = lprhs[i];
1247 assert( pos == nlpineqs );
1252 if ( REALABS(sdpisolver->objlimit) > sdpisolver->epsilon )
1254 dsdplprow[dsdpnlpnonz] = nlpcons;
1255 dsdplpval[dsdpnlpnonz] = sdpisolver->objlimit;
1267 dsdplpbegcol[0] = 0;
1268 for (i = 0; i < lpnnonz; i++)
1271 if ( lpcol[i] >= nextcol )
1276 for (j = nextcol; j <= lpcol[i]; j++)
1278 if ( sdpisolver->inputtodsdpmapper[j] >= 0 )
1280 assert( ! (
isFixed(sdpisolver, lb[j], ub[j])) );
1281 dsdplpbegcol[sdpisolver->inputtodsdpmapper[j]] = dsdpnlpnonz;
1286 dsdplprow[dsdpnlpnonz] = nlpcons;
1287 dsdplpval[dsdpnlpnonz] = obj[j];
1296 if ( !
isFixed(sdpisolver, lb[lpcol[i]], ub[lpcol[i]]) )
1299 if ( rowmapper[2*lprow[i]] > -1 )
1303 dsdplprow[dsdpnlpnonz] = rowmapper[2*lprow[i]];
1304 dsdplpval[dsdpnlpnonz] = -lpval[i];
1308 if ( rowmapper[2*lprow[i] + 1] > -1 )
1312 dsdplprow[dsdpnlpnonz] = rowmapper[2*lprow[i] + 1];
1313 dsdplpval[dsdpnlpnonz] = lpval[i];
1320 for (j = nextcol; j < nvars; j++)
1322 if ( sdpisolver->inputtodsdpmapper[j] >= 0 )
1324 assert( ! (
isFixed(sdpisolver, lb[j], ub[j])) );
1325 dsdplpbegcol[sdpisolver->inputtodsdpmapper[j]] = dsdpnlpnonz;
1329 dsdplprow[dsdpnlpnonz] = nlpcons;
1330 dsdplpval[dsdpnlpnonz] = obj[j];
1336 dsdplpbegcol[sdpisolver->nactivevars + 1] = dsdpnlpnonz;
1339 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1341 for (i = 0; i < nlpineqs; i++)
1343 dsdplprow[dsdpnlpnonz] = i;
1344 dsdplpval[dsdpnlpnonz] = -1.0;
1347 dsdplpbegcol[sdpisolver->nactivevars + 2] = dsdpnlpnonz;
1351 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &rowmapper);
1356 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1358 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, 2*nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1359 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, 2*nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1363 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1364 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1369 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1371 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs, dsdpnlpnonz) );
1372 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs, dsdpnlpnonz) );
1376 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars, dsdpnlpnonz) );
1377 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars, dsdpnlpnonz) );
1384 DSDP_CALL( LPConeSetData(sdpisolver->lpcone, nlpineqs, dsdplpbegcol, dsdplprow, dsdplpval) );
1388 DSDP_CALL( LPConeSetData(sdpisolver->lpcone, nlpineqs + 1, dsdplpbegcol, dsdplprow, dsdplpval) );
1390 #ifdef SCIP_MORE_DEBUG 1391 LPConeView(sdpisolver->lpcone);
1395 SCIPdebugMessage(
"Calling DSDP-Solve for SDP (%d) \n", sdpisolver->sdpcounter);
1397 DSDP_CALL( DSDPSetGapTolerance(sdpisolver->dsdp, sdpisolver->gaptol) );
1398 DSDP_CALL( DSDPSetRTolerance(sdpisolver->dsdp, sdpisolver->sdpsolverfeastol) );
1400 if ( sdpisolver->sdpinfo )
1403 DSDP_CALL( DSDPSetStandardMonitor(sdpisolver->dsdp, 1) );
1407 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1409 DSDP_CALL( DSDPSetPenaltyParameter(sdpisolver->dsdp, penaltyparam) );
1410 DSDP_CALL( DSDPUsePenalty(sdpisolver->dsdp, 1) );
1415 DSDP_CALL( DSDPSetPenaltyParameter(sdpisolver->dsdp, sdpisolver->penaltyparam) );
1419 if ( starty != NULL )
1421 for (i = 0; i < sdpisolver->nactivevars; i++)
1423 DSDP_CALL( DSDPSetY0(sdpisolver->dsdp, i + 1, starty[sdpisolver->dsdptoinputmapper[i]]) );
1428 if ( sdpisolver->nthreads > 0 )
1429 openblas_set_num_threads(sdpisolver->nthreads);
1442 if ( sdpisolver->preoptimalgap >= 0.0 )
1447 DSDP_CALL( DSDPSolve(sdpisolver->dsdp) );
1450 DSDP_CALL( DSDPGetIts(sdpisolver->dsdp, &(sdpisolver->niterations)) );
1451 sdpisolver->nsdpcalls++;
1454 if ( timings.stopped )
1456 sdpisolver->timelimit = TRUE;
1457 sdpisolver->solved = FALSE;
1461 sdpisolver->timelimit = FALSE;
1462 DSDP_CALL( DSDPComputeX(sdpisolver->dsdp) );
1463 sdpisolver->solved = TRUE;
1468 feastol = sdpisolver->sdpsolverfeastol;
1469 gaptol = sdpisolver->gaptol;
1473 SCIP_Real* solvector;
1474 SCIP_Real primalobj;
1476 SCIP_Bool infeasible;
1477 SCIP_Bool solveagain = FALSE;
1482 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
1483 nvarspointer = nvars;
1485 assert( nvarspointer == nvars );
1488 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1489 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1490 indchanges, nremovedinds, blockindchanges, nlpcons, lplhs, lprhs, lpnnonz, lprow, lpcol, lpval,
1491 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
1492 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1499 SCIPdebugMessage(
"Solution feasible for DSDP but outside feasibility tolerance, changing DSDP feasibility tolerance to %g.\n", feastol);
1500 DSDP_CALL( DSDPSetRTolerance(sdpisolver->dsdp, feastol) );
1506 DSDP_CALL( DSDPGetDDObjective(sdpisolver->dsdp, &dualobj) );
1507 DSDP_CALL( DSDPGetPPObjective(sdpisolver->dsdp, &primalobj) );
1508 if ( REALABS(dualobj - primalobj) >= sdpisolver->gaptol )
1514 SCIPdebugMessage(
"Solution feasible, but duality gap %g is too large, changing DSDP gap tolerance to %g.\n", REALABS(dualobj - primalobj), gaptol);
1515 DSDP_CALL( DSDPSetGapTolerance(sdpisolver->dsdp, gaptol) );
1523 DSDP_CALL( DSDPSolve(sdpisolver->dsdp) );
1527 sdpisolver->nsdpcalls++;
1528 DSDP_CALL( DSDPGetIts(sdpisolver->dsdp, &newiterations) );
1529 sdpisolver->niterations += newiterations;
1532 if ( timings.stopped )
1534 sdpisolver->timelimit = TRUE;
1535 sdpisolver->solved = FALSE;
1539 sdpisolver->timelimit = FALSE;
1540 DSDP_CALL( DSDPComputeX(sdpisolver->dsdp) );
1541 sdpisolver->solved = TRUE;
1548 sdpisolver->solved = FALSE;
1549 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"DSDP failed to reach required feasibility tolerance (feastol: %g, gaptol: %g)!\n", feastol, gaptol);
1556 if ( sdpconstnnonz > 0 )
1558 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpconstval, sdpconstnnonz);
1559 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpconstind, sdpconstnnonz);
1564 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1566 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz + nrnonz);
1567 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz + nrnonz);
1571 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz);
1572 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz);
1576 if ( nlpcons > 0 || lpnnonz > 0 )
1578 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, dsdpnlpnonz);
1579 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, dsdpnlpnonz);
1580 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1582 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 3);
1586 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 2);
1591 DSDP_CALL( DSDPStopReason(sdpisolver->dsdp, &reason) );
1595 case DSDP_CONVERGED:
1596 SCIPdebugMessage(
"DSDP converged!\n");
1599 case DSDP_INFEASIBLE_START:
1600 SCIPdebugMessage(
"DSDP started with an infeasible point!\n");
1603 case DSDP_SMALL_STEPS:
1604 SCIPdebugMessage(
"Short step lengths created by numerical difficulties prevented progress in DSDP!\n");
1607 case DSDP_INDEFINITE_SCHUR_MATRIX:
1608 SCIPdebugMessage(
"Schur Matrix in DSDP was indefinite but should have been positive semidefinite!\n");
1612 SCIPdebugMessage(
"DSDP reached maximum number of iterations!\n");
1615 case DSDP_NUMERICAL_ERROR:
1616 SCIPdebugMessage(
"A numerical error occured in DSDP!\n");
1619 case DSDP_UPPERBOUND:
1620 SCIPdebugMessage(
"Dual objective value in DSDP reached upper bound.\n");
1623 case DSDP_USER_TERMINATION:
1624 SCIPdebugMessage(
"DSDP didn't stop solving, did you?\n");
1627 case CONTINUE_ITERATING:
1628 SCIPdebugMessage(
"DSDP wants to continue iterating but somehow was stopped!\n");
1632 SCIPdebugMessage(
"Unknown stopping reason in DSDP!\n");
1637 if ( penaltyparam >= sdpisolver->epsilon && sdpisolver->solved )
1645 DSDP_CALL( DSDPGetR(sdpisolver->dsdp, &rval) );
1647 *feasorig = (rval < sdpisolver->feastol );
1652 sdpisolver->feasorig = *feasorig;
1657 if ( penaltybound != NULL )
1659 SCIPdebugMessage(
"Solution not feasible in original problem, r = %g.\n", rval);
1662 DSDP_CALL( DSDPGetTraceX(sdpisolver->dsdp, &trace) );
1665 assert( trace < penaltyparam + sdpisolver->feastol );
1671 *penaltybound = TRUE;
1672 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1673 trace, penaltyparam);
1676 *penaltybound = FALSE;
1685 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &dsdpsol, sdpisolver->nactivevars + 1) );
1687 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, sdpisolver->nactivevars + 1) );
1689 *feasorig = (dsdpsol[sdpisolver->nactivevars] < sdpisolver->feastol);
1692 if ( penaltybound != NULL )
1694 SCIPdebugMessage(
"Solution not feasible in original problem, r = %g.\n", dsdpsol[sdpisolver->nactivevars]);
1697 DSDP_CALL( DSDPGetTraceX(sdpisolver->dsdp, &trace) );
1700 assert( trace < penaltyparam + sdpisolver->feastol );
1706 *penaltybound = TRUE;
1707 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible.\n",
1708 trace, penaltyparam);
1711 *penaltybound = FALSE;
1714 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &dsdpsol);
1737 assert( sdpisolver != NULL );
1738 return sdpisolver->solved;
1751 DSDPSolutionType pdfeasible;
1753 assert( sdpisolver != NULL );
1756 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1758 if ( pdfeasible == DSDP_PDUNKNOWN )
1767 SCIP_Bool* primalfeasible,
1768 SCIP_Bool* dualfeasible
1771 DSDPSolutionType pdfeasible;
1773 assert( sdpisolver != NULL );
1774 assert( primalfeasible != NULL );
1775 assert( dualfeasible != NULL );
1778 DSDP_CALL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1780 switch ( pdfeasible )
1782 case DSDP_PDFEASIBLE:
1784 *primalfeasible = TRUE;
1785 *dualfeasible = TRUE;
1788 case DSDP_UNBOUNDED:
1790 *primalfeasible = FALSE;
1791 *dualfeasible = TRUE;
1794 case DSDP_INFEASIBLE:
1796 *primalfeasible = TRUE;
1797 *dualfeasible = FALSE;
1801 SCIPerrorMessage(
"DSDP doesn't know if primal and dual solutions are feasible\n");
1802 return SCIP_LPERROR;
1815 DSDPSolutionType pdfeasible;
1817 assert( sdpisolver != NULL );
1820 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1821 if ( pdfeasible == DSDP_PDUNKNOWN )
1826 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.\n");
1829 else if ( pdfeasible == DSDP_INFEASIBLE )
1842 DSDPSolutionType pdfeasible;
1844 assert( sdpisolver != NULL );
1847 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1848 if ( pdfeasible == DSDP_PDUNKNOWN )
1853 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.\n");
1856 else if ( pdfeasible == DSDP_UNBOUNDED )
1868 DSDPSolutionType pdfeasible;
1870 assert( sdpisolver != NULL );
1873 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1874 if ( pdfeasible == DSDP_PDUNKNOWN )
1876 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.\n");
1879 else if ( pdfeasible == DSDP_UNBOUNDED )
1892 DSDPSolutionType pdfeasible;
1894 assert( sdpisolver != NULL );
1897 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1898 if ( pdfeasible == DSDP_PDUNKNOWN )
1900 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.\n");
1903 else if ( pdfeasible == DSDP_UNBOUNDED )
1916 DSDPSolutionType pdfeasible;
1918 assert( sdpisolver != NULL );
1921 DSDP_CALL_BOOL(DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible));
1923 if ( pdfeasible == DSDP_PDUNKNOWN )
1925 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.\n");
1928 else if ( pdfeasible == DSDP_INFEASIBLE )
1941 DSDPSolutionType pdfeasible;
1943 assert( sdpisolver != NULL );
1946 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1948 if ( pdfeasible == DSDP_PDUNKNOWN )
1950 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.\n");
1953 else if ( pdfeasible == DSDP_INFEASIBLE )
1964 DSDPTerminationReason reason;
1966 assert( sdpisolver != NULL );
1968 if ( sdpisolver->timelimit )
1971 if ( ! sdpisolver->solved )
1976 if ( reason == DSDP_CONVERGED )
1987 SCIPdebugMessage(
"Method not implemented for DSDP, as objective limit is given as an ordinary LP-constraint, so in case the objective limit was " 1988 "exceeded, the problem will be reported as infeasible!\n");
1998 DSDPTerminationReason reason;
2000 assert( sdpisolver != NULL );
2005 if ( reason == DSDP_MAX_IT )
2016 assert( sdpisolver != NULL );
2018 return sdpisolver->timelimit;
2036 DSDPTerminationReason reason;
2039 assert( sdpisolver != NULL );
2041 if ( sdpisolver->dsdp == NULL || (! sdpisolver->solved) )
2044 if ( sdpisolver->timelimit )
2047 dsdpreturn = DSDPStopReason(sdpisolver->dsdp, &reason);
2049 if (dsdpreturn != 0)
2051 SCIPerrorMessage(
"DSDP-Error <%d> in function call.\n", dsdpreturn);
2057 case DSDP_CONVERGED:
2060 case DSDP_INFEASIBLE_START:
2063 case DSDP_SMALL_STEPS:
2066 case DSDP_INDEFINITE_SCHUR_MATRIX:
2072 case DSDP_NUMERICAL_ERROR:
2075 case DSDP_UPPERBOUND:
2078 case DSDP_USER_TERMINATION:
2091 assert( sdpisolver != NULL );
2103 DSDPSolutionType pdfeasible;
2105 assert( sdpisolver != NULL );
2108 DSDP_CALL_BOOL(DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible));
2110 if ( pdfeasible == DSDP_PDUNKNOWN )
2112 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.\n");
2125 SCIPdebugMessage(
"Not implemented yet\n");
2126 return SCIP_LPERROR;
2138 assert( sdpisolver != NULL );
2139 assert( objval != NULL );
2142 dsdpnvars = sdpisolver->penaltyworbound ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars;
2144 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2148 DSDP_CALL( DSDPGetDObjective(sdpisolver->dsdp, objval) );
2149 *objval = -1*(*objval);
2157 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars) );
2158 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, dsdpnvars) );
2162 for (v = 0; v < sdpisolver->nactivevars; v++)
2163 *objval += sdpisolver->objcoefs[v] * dsdpsol[v];
2167 *objval += sdpisolver->fixedvarsobjcontr;
2169 if ( ( ! sdpisolver->penalty ) || sdpisolver->feasorig )
2171 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars);
2193 assert( sdpisolver != NULL );
2194 assert( dualsollength != NULL );
2197 dsdpnvars = sdpisolver->penaltyworbound ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars;
2199 if ( *dualsollength > 0 )
2201 assert( dualsol != NULL );
2202 if ( *dualsollength < sdpisolver->nvars )
2204 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed.\n", *dualsollength, sdpisolver->nvars);
2205 *dualsollength = sdpisolver->nvars;
2210 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars) );
2211 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, dsdpnvars) );
2214 for (v = 0; v < sdpisolver->nvars; v++)
2216 if ( sdpisolver->inputtodsdpmapper[v] > -1 )
2219 dualsol[v] = dsdpsol[sdpisolver->inputtodsdpmapper[v] - 1];
2224 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtodsdpmapper[v]) - 1];
2228 if ( objval != NULL )
2230 if ( sdpisolver->penalty && ! sdpisolver->feasorig )
2234 DSDP_CALL( DSDPGetDObjective(sdpisolver->dsdp, objval) );
2235 *objval = -1*(*objval);
2241 for (v = 0; v < sdpisolver->nactivevars; v++)
2242 *objval += sdpisolver->objcoefs[v] * dsdpsol[v];
2246 *objval += sdpisolver->fixedvarsobjcontr;
2249 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars);
2251 else if ( objval != NULL )
2263 int* startXnblocknonz
2267 SCIPdebugMessage(
"Not implemented yet\n");
2269 return SCIP_PLUGINNOTFOUND;
2286 int* startXnblocknonz,
2290 SCIP_Real** startXval
2295 assert( sdpisolver != NULL );
2296 assert( success != NULL );
2297 assert( dualsol != NULL );
2298 assert( dualsollength != NULL );
2299 assert( *dualsollength >= 0 );
2302 assert( nblocks == -1 );
2304 if ( ! sdpisolver->preoptimalsolexists )
2306 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2311 if ( *dualsollength < sdpisolver->nvars )
2313 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2315 *dualsollength = sdpisolver->nvars;
2319 for (v = 0; v < sdpisolver->nvars; v++)
2321 if (sdpisolver->inputtodsdpmapper[v] > -1)
2324 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtodsdpmapper[v] - 1];
2329 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtodsdpmapper[v]) - 1];
2334 *dualsollength = sdpisolver->nvars;
2355 SCIP_Real* lbvarsdsdp;
2356 SCIP_Real* ubvarsdsdp;
2359 assert( sdpisolver != NULL );
2360 assert( lbvars != NULL );
2361 assert( ubvars != NULL );
2362 assert( arraylength != NULL );
2363 assert( *arraylength >= 0 );
2367 if ( *arraylength < sdpisolver->nvars )
2369 *arraylength = sdpisolver->nvars;
2370 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2375 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &lbvarsdsdp, sdpisolver->nactivevars) );
2376 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &ubvarsdsdp, sdpisolver->nactivevars) );
2379 DSDP_CALL( BConeCopyX(sdpisolver->bcone, lbvarsdsdp, ubvarsdsdp, sdpisolver->nactivevars) );
2382 for (i = 0; i < sdpisolver->nvars; i++)
2384 if ( sdpisolver->inputtodsdpmapper[i] < 0 )
2393 lbvars[i] = lbvarsdsdp[sdpisolver->inputtodsdpmapper[i] - 1];
2394 ubvars[i] = ubvarsdsdp[sdpisolver->inputtodsdpmapper[i] - 1];
2399 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &ubvarsdsdp, sdpisolver->nactivevars);
2400 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &lbvarsdsdp, sdpisolver->nactivevars);
2409 int* startXnblocknonz
2412 SCIPdebugMessage(
"Not implemented yet\n");
2413 return SCIP_LPERROR;
2425 int* startXnblocknonz,
2429 SCIP_Real** startXval
2432 SCIPdebugMessage(
"Not implemented yet\n");
2433 return SCIP_LPERROR;
2441 SCIPdebugMessage(
"Not implemented yet\n");
2442 return SCIP_INVALID;
2451 assert( sdpisolver != NULL );
2452 assert( opttime != NULL );
2454 *opttime = sdpisolver->opttime;
2465 assert( sdpisolver != NULL );
2466 assert( iterations != NULL );
2468 if ( sdpisolver->timelimitinitial )
2471 *iterations = sdpisolver->niterations;
2482 assert( sdpisolver != NULL );
2483 assert( calls != NULL );
2485 if ( sdpisolver->timelimitinitial )
2488 *calls = sdpisolver->nsdpcalls;
2499 assert( sdpisolver != NULL );
2500 assert( usedsetting != NULL );
2505 *usedsetting = sdpisolver->usedsetting;
2546 assert( sdpisolver != NULL );
2547 assert( dval != NULL );
2552 *dval = sdpisolver->epsilon;
2555 *dval = sdpisolver->gaptol;
2558 *dval = sdpisolver->feastol;
2561 *dval = sdpisolver->sdpsolverfeastol;
2564 *dval = sdpisolver->penaltyparam;
2567 *dval = sdpisolver->objlimit;
2570 *dval = sdpisolver->preoptimalgap;
2573 return SCIP_PARAMETERUNKNOWN;
2586 assert( sdpisolver != NULL );
2591 sdpisolver->epsilon = dval;
2592 SCIPdebugMessage(
"Setting sdpisolver epsilon to %g.\n", dval);
2595 sdpisolver->gaptol = dval;
2596 SCIPdebugMessage(
"Setting sdpisolver gaptol to %g.\n", dval);
2599 sdpisolver->feastol = dval;
2600 SCIPdebugMessage(
"Setting sdpisolver feastol to %g.\n", dval);
2603 sdpisolver->sdpsolverfeastol = dval;
2604 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %g.\n", dval);
2607 sdpisolver->penaltyparam = dval;
2608 SCIPdebugMessage(
"Setting sdpisolver penaltyparameter to %g.\n", dval);
2611 SCIPdebugMessage(
"Setting sdpisolver objlimit to %g.\n", dval);
2612 sdpisolver->objlimit = dval;
2615 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_LAMBDASTAR not used by DSDP.\n");
2618 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %g.\n", dval);
2619 sdpisolver->preoptimalgap = dval;
2622 return SCIP_PARAMETERUNKNOWN;
2635 assert( sdpisolver != NULL );
2640 *ival = (int) sdpisolver->sdpinfo;
2641 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2644 *ival = sdpisolver->nthreads;
2645 SCIPdebugMessage(
"Getting sdpisolver number of threads: %d.\n", *ival);
2648 return SCIP_PARAMETERUNKNOWN;
2661 assert( sdpisolver != NULL );
2666 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2667 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2670 sdpisolver->nthreads = ival;
2671 SCIPdebugMessage(
"Setting sdpisolver number of threads to %d.\n", ival);
2674 return SCIP_PARAMETERUNKNOWN;
2686 SCIPdebugMessage(
"Lambdastar parameter not used by DSDP.\n");
2695 SCIP_Real* penaltyparam
2700 assert( sdpisolver != NULL );
2701 assert( penaltyparam != NULL );
2719 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2720 sdpisolver->penaltyparam = compval;
2721 *penaltyparam = compval;
2729 SCIP_Real penaltyparam,
2730 SCIP_Real* maxpenaltyparam
2735 assert( sdpisolver != NULL );
2736 assert( maxpenaltyparam != NULL );
2742 *maxpenaltyparam = compval;
2743 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2752 if ( sdpisolver->penaltyparam > *maxpenaltyparam )
2754 SCIPdebugMessage(
"Decreasing penaltyparameter of %f to maximum penalty paramater of %f.\n", sdpisolver->penaltyparam, *maxpenaltyparam);
2755 sdpisolver->penaltyparam = *maxpenaltyparam;
2778 SCIPdebugMessage(
"Not implemented yet\n");
2779 return SCIP_LPERROR;
2788 SCIPdebugMessage(
"Not implemented yet\n");
2789 return SCIP_LPERROR;
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsPrimalUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsObjlimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsDualFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
SCIP_Real SCIPsdpiSolverInfinity(SCIP_SDPISOLVER *sdpisolver)
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, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *starty, int *startZnblocknonz, int **startZrow, int **startZcol, SCIP_Real **startZval, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SDPI_CLOCK *usedsdpitime, SCIP_Bool *feasorig, SCIP_Bool *penaltybound)
static SCIP_Bool isFixed(SCIP_SDPISOLVER *sdpisolver, SCIP_Real lb, SCIP_Real ub)
const char * SCIPsdpiSolverGetSolverDesc(void)
#define CHECK_IF_SOLVED_BOOL(sdpisolver)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
SCIP_RETCODE SCIPsdpSolcheckerCheck(BMS_BUFMEM *bufmem, int nvars, 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 nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
int SCIPsdpiSolverGetDefaultSdpiSolverNpenaltyIncreases(void)
#define DSDP_CALL_BOOL(x)
SCIP_RETCODE SCIPsdpiSolverSettingsUsed(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPSOLVERSETTING *usedsetting)
interface methods for specific SDP-solvers
SCIP_RETCODE SCIPsdpiSolverResetCounter(SCIP_SDPISOLVER *sdpisolver)
void * SCIPsdpiSolverGetSolverPointer(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real *dval)
SCIP_RETCODE SCIPsdpiSolverCreate(SCIP_SDPISOLVER **sdpisolver, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
SCIP_Bool SCIPsdpiSolverIsInfinity(SCIP_SDPISOLVER *sdpisolver, SCIP_Real val)
#define PENALTYPARAM_FACTOR
SCIP_RETCODE SCIPsdpiSolverSetRealpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_Bool SCIPsdpiSolverIsPrimalInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetSolFeasibility(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *primalfeasible, SCIP_Bool *dualfeasible)
SCIP_RETCODE SCIPsdpiSolverFree(SCIP_SDPISOLVER **sdpisolver)
#define CHECK_IF_SOLVED(sdpisolver)
static void sortColRow(int *row, int *col, SCIP_Real *val, int length)
SCIP_Bool SCIPsdpiSolverIsDualUnbounded(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverFeasibilityKnown(SCIP_SDPISOLVER *sdpisolver)
SCIP_Real SCIPsdpiSolverGetMaxPrimalEntry(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetObjval(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *objval)
const char * SCIPsdpiSolverGetSolverName(void)
SCIP_RETCODE SCIPsdpiSolverComputeMaxPenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_RETCODE SCIPsdpiSolverGetPreoptimalPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
checks a given SDP solution for feasibility
SCIP_RETCODE SCIPsdpiSolverSetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int ival)
SCIP_Bool SCIPsdpiSolverIsIterlimExc(SCIP_SDPISOLVER *sdpisolver)
#define INFEASFEASTOLCHANGE
#define MAXPENALTYPARAM_FACTOR
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, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *starty, int *startZnblocknonz, int **startZrow, int **startZcol, SCIP_Real **startZval, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval, SCIP_SDPSOLVERSETTING startsettings, SCIP_Real timelimit, SDPI_CLOCK *usedsdpitime)
SCIP_RETCODE SCIPsdpiSolverGetPrimalBoundVars(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
static int checkTimeLimitDSDP(DSDP dsdp, void *ctx)
SCIP_RETCODE SCIPsdpiSolverGetPrimalMatrix(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
SCIP_RETCODE SCIPsdpiSolverIncreaseCounter(SCIP_SDPISOLVER *sdpisolver)
static int compLowerTriangPos(int i, int j)
SCIP_Real SDPIclockGetTime(SDPI_CLOCK *clck)
static int checkGapSetPreoptimalSol(DSDP dsdp, void *ctx)
SCIP_Bool SCIPsdpiSolverIsTimelimExc(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverComputeLambdastar(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxguess)
SCIP_Bool SCIPsdpiSolverWasSolved(SCIP_SDPISOLVER *sdpisolver)
#define MAX_MAXPENALTYPARAM
SCIP_RETCODE SCIPsdpiSolverIgnoreInstability(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success)
struct SCIP_SDPiSolver SCIP_SDPISOLVER
SCIP_Bool SCIPsdpiSolverDoesWarmstartNeedPrimal(void)
SCIP_Bool SCIPsdpiSolverIsOptimal(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetPrimalNonzeros(SCIP_SDPISOLVER *sdpisolver, int nblocks, int *startXnblocknonz)
SCIP_RETCODE SCIPsdpiSolverGetSdpCalls(SCIP_SDPISOLVER *sdpisolver, int *calls)
SCIP_Bool SCIPsdpiSolverIsAcceptable(SCIP_SDPISOLVER *sdpisolver)
enum SCIP_SDPParam SCIP_SDPPARAM
SCIP_RETCODE SCIPsdpiSolverComputePenaltyparam(SCIP_SDPISOLVER *sdpisolver, SCIP_Real maxcoeff, SCIP_Real *penaltyparam)
SCIP_Bool SCIPsdpiSolverIsDualInfeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_RETCODE SCIPsdpiSolverGetTime(SCIP_SDPISOLVER *sdpisolver, SCIP_Real *opttime)
SCIP_RETCODE SCIPsdpiSolverWriteSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
SCIP_RETCODE SCIPsdpiSolverReadSDP(SCIP_SDPISOLVER *sdpisolver, const char *fname)
SCIP_RETCODE SCIPsdpiSolverGetIterations(SCIP_SDPISOLVER *sdpisolver, int *iterations)
SCIP_RETCODE SCIPsdpiSolverGetPreoptimalSol(SCIP_SDPISOLVER *sdpisolver, SCIP_Bool *success, SCIP_Real *dualsol, int *dualsollength, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)