47 #pragma GCC diagnostic ignored "-Wstrict-prototypes" 49 #pragma GCC diagnostic warning "-Wstrict-prototypes" 52 #include "blockmemshell/memory.h" 54 #include "scip/pub_misc.h" 56 #include "scip/pub_message.h" 59 #define PENALTYBOUNDTOL 1E-3 62 #define MIN_PENALTYPARAM 1e5 63 #define MAX_PENALTYPARAM 1e12 64 #define PENALTYPARAM_FACTOR 1e4 65 #define MAX_MAXPENALTYPARAM 1e15 66 #define MAXPENALTYPARAM_FACTOR 1e6 67 #define INFEASFEASTOLCHANGE 0.1 68 #define INFEASMINFEASTOL 1E-9 72 #define DSDP_CALL(x) do \ 74 int _dsdperrorcode_; \ 75 if ( (_dsdperrorcode_ = (x)) != 0 ) \ 77 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \ 78 return SCIP_LPERROR; \ 84 #define DSDP_CALL_BOOL(x) do \ 86 int _dsdperrorcode_; \ 87 if ( (_dsdperrorcode_ = (x)) != 0 ) \ 89 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \ 96 #define DSDP_CALL_INT(x) do \ 98 int _dsdperrorcode_; \ 99 if ( (_dsdperrorcode_ = (x)) != 0 ) \ 101 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \ 102 return _dsdperrorcode_; \ 108 #define DSDP_CALLM(x) do \ 110 int _dsdperrorcode_; \ 111 if ( (_dsdperrorcode_ = (x)) != 0 ) \ 113 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \ 114 return SCIP_NOMEMORY; \ 120 #define BMS_CALL(x) do \ 124 SCIPerrorMessage("No memory in function call.\n"); \ 125 return SCIP_NOMEMORY; \ 131 #define TIMEOFDAY_CALL(x) do \ 134 if ( (_errorcode_ = (x)) != 0 ) \ 136 SCIPerrorMessage("Error in gettimeofday! \n"); \ 143 #define CHECK_IF_SOLVED(sdpisolver) do \ 145 if (!(sdpisolver->solved)) \ 147 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 148 return SCIP_LPERROR; \ 154 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \ 156 if (!(sdpisolver->solved)) \ 158 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \ 166 struct SCIP_SDPiSolver
168 SCIP_MESSAGEHDLR* messagehdlr;
177 int* inputtodsdpmapper;
180 int* dsdptoinputmapper;
181 SCIP_Real* fixedvarsval;
182 SCIP_Real fixedvarsobjcontr;
189 SCIP_Real sdpsolverfeastol;
190 SCIP_Real penaltyparam;
194 SCIP_Bool penaltyworbound;
199 SCIP_Bool timelimitinitial;
202 SCIP_Real* preoptimalsol;
203 SCIP_Bool preoptimalsolexists;
204 SCIP_Real preoptimalgap;
210 struct timeval starttime;
232 return i*(i+1)/2 + j;
244 assert( lb < ub + sdpisolver->feastol );
246 return (ub-lb <= sdpisolver->epsilon);
249 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon) 265 SCIPsortIntIntReal(col, row, val, length);
268 while (nextentry < length)
270 firstentry = nextentry;
272 while (nextentry < length && col[nextentry] == col[firstentry])
276 SCIPsortIntReal(row + firstentry, val + firstentry, nextentry - firstentry);
288 struct timeval currenttime;
289 SCIP_Real startseconds;
290 SCIP_Real currentseconds;
291 SCIP_Real elapsedtime;
293 assert( dsdp != NULL );
294 assert( ctx != NULL );
298 startseconds = (SCIP_Real) (timings->starttime).tv_sec + (SCIP_Real) (timings->starttime).tv_usec / 1e6;
301 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
303 elapsedtime = currentseconds - startseconds;
305 if ( elapsedtime > timings->timelimit )
307 DSDP_CALL( DSDPSetConvergenceFlag(dsdp, DSDP_USER_TERMINATION) );
308 timings->stopped = TRUE;
309 SCIPdebugMessage(
"Time limit reached! Stopping DSDP.\n");
338 relgap = absgap / (1.0 + (REALABS(dobj)/2) + (REALABS(pobj)/2) );
347 SCIPdebugMessage(
"penalty variable %f, gap %f -> saving preoptimal solution\n", r, relgap);
375 return "Dual-Scaling Interior Point SDP-Solver by S. Benson, Y. Ye, and X. Zhang (http://www.mcs.anl.gov/hs/software/DSDP/)";
388 assert( sdpisolver != NULL );
389 return (
void*) sdpisolver->dsdp;
438 SCIP_MESSAGEHDLR* messagehdlr,
443 assert( sdpisolver != NULL );
444 assert( blkmem != NULL );
445 assert( bufmem != NULL );
447 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
449 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
451 (*sdpisolver)->messagehdlr = messagehdlr;
452 (*sdpisolver)->blkmem = blkmem;
453 (*sdpisolver)->bufmem = bufmem;
457 (*sdpisolver)->dsdp = NULL;
458 (*sdpisolver)->sdpcone = NULL;
459 (*sdpisolver)->lpcone = NULL;
460 (*sdpisolver)->bcone = NULL;
462 (*sdpisolver)->nvars = 0;
463 (*sdpisolver)->nactivevars = 0;
464 (*sdpisolver)->inputtodsdpmapper = NULL;
465 (*sdpisolver)->dsdptoinputmapper = NULL;
466 (*sdpisolver)->fixedvarsval = NULL;
467 (*sdpisolver)->fixedvarsobjcontr = 0.0;
468 (*sdpisolver)->objcoefs = NULL;
469 (*sdpisolver)->solved = FALSE;
470 (*sdpisolver)->timelimit = FALSE;
471 (*sdpisolver)->timelimitinitial = FALSE;
472 (*sdpisolver)->penalty = FALSE;
473 (*sdpisolver)->penaltyworbound = FALSE;
474 (*sdpisolver)->feasorig = FALSE;
475 (*sdpisolver)->sdpcounter = 0;
476 (*sdpisolver)->niterations = 0;
477 (*sdpisolver)->nsdpcalls = 0;
479 (*sdpisolver)->epsilon = 1e-9;
480 (*sdpisolver)->gaptol = 1e-4;
481 (*sdpisolver)->feastol = 1e-6;
482 (*sdpisolver)->sdpsolverfeastol = 1e-6;
483 (*sdpisolver)->penaltyparam = 1e5;
485 (*sdpisolver)->sdpinfo = FALSE;
487 (*sdpisolver)->preoptimalsolexists = FALSE;
488 (*sdpisolver)->preoptimalgap = -1.0;
498 assert( sdpisolver != NULL );
499 assert( *sdpisolver != NULL );
501 SCIPdebugMessage(
"Freeing SDPISolver\n");
503 if ( (*sdpisolver)->dsdp != NULL )
505 DSDP_CALL( DSDPDestroy((*sdpisolver)->dsdp) );
508 if ( (*sdpisolver)->nvars > 0 )
509 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->inputtodsdpmapper, (*sdpisolver)->nvars);
511 if ( (*sdpisolver)->nactivevars > 0 )
513 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->nactivevars);
514 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->dsdptoinputmapper, (*sdpisolver)->nactivevars);
515 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
518 if ( (*sdpisolver)->nvars >= (*sdpisolver)->nactivevars )
519 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
521 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
531 assert( sdpisolver != NULL );
533 sdpisolver->sdpcounter++;
543 assert( sdpisolver != NULL );
545 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
546 sdpisolver->sdpcounter = 0;
586 int* sdpconstnblocknonz,
590 SCIP_Real** sdpconstval,
592 int** sdpnblockvarnonz,
602 int* blockindchanges,
614 int* startZnblocknonz,
620 SCIP_Real** startZval,
622 int* startXnblocknonz,
628 SCIP_Real** startXval,
635 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, TRUE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars,
636 sdpconstnnonz, sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
637 indchanges, nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol,
638 lpval, starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
639 timelimit, NULL, NULL);
666 SCIP_Real penaltyparam,
677 int* sdpconstnblocknonz,
681 SCIP_Real** sdpconstval,
683 int** sdpnblockvarnonz,
693 int* blockindchanges,
705 int* startZnblocknonz,
711 SCIP_Real** startZval,
713 int* startXnblocknonz,
719 SCIP_Real** startXval,
726 SCIP_Bool* penaltybound
730 int* dsdpconstind = NULL;
731 SCIP_Real* dsdpconstval = NULL;
733 SCIP_Real* dsdpval = NULL;
734 int* dsdplpbegcol = NULL;
735 int* dsdplprow = NULL;
736 SCIP_Real* dsdplpval = NULL;
750 DSDPTerminationReason reason;
753 assert( sdpisolver != NULL );
754 assert( penaltyparam > -1 * sdpisolver->epsilon );
755 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
757 assert( obj != NULL );
758 assert( lb != NULL );
759 assert( ub != NULL );
760 assert( nsdpblocks >= 0 );
761 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
762 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
763 assert( sdpconstnnonz >= 0 );
764 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
765 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
766 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
767 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
768 assert( sdpnnonz >= 0 );
769 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
770 assert( nsdpblocks == 0 || sdpvar != NULL );
771 assert( nsdpblocks == 0 || sdprow != NULL );
772 assert( nsdpblocks == 0 || sdpcol != NULL );
773 assert( nsdpblocks == 0 || sdpval != NULL );
774 assert( nsdpblocks == 0 || indchanges != NULL );
775 assert( nsdpblocks == 0 || nremovedinds != NULL );
776 assert( nsdpblocks == 0 || blockindchanges != NULL );
777 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
778 assert( nlpcons >= 0 );
779 assert( noldlpcons >= nlpcons );
780 assert( nlpcons == 0 || lplhs != NULL );
781 assert( nlpcons == 0 || lprhs != NULL );
782 assert( nlpcons == 0 || rownactivevars != NULL );
783 assert( lpnnonz >= 0 );
784 assert( nlpcons == 0 || lprow != NULL );
785 assert( nlpcons == 0 || lpcol != NULL );
786 assert( nlpcons == 0 || lpval != NULL );
788 sdpisolver->penalty = penaltyparam > sdpisolver->epsilon;
790 if ( timelimit <= 0.0 )
792 sdpisolver->timelimit = TRUE;
793 sdpisolver->timelimitinitial = TRUE;
794 sdpisolver->solved = FALSE;
798 sdpisolver->timelimitinitial = FALSE;
800 sdpisolver->feasorig = FALSE;
804 timings.timelimit = timelimit;
805 timings.stopped = FALSE;
809 if ( penaltyparam < sdpisolver->epsilon )
811 SCIPdebugMessage(
"Inserting Data into DSDP for SDP (%d) \n", ++sdpisolver->sdpcounter);
816 SCIPdebugMessage(
"Inserting Data again into DSDP for SDP (%d) \n", sdpisolver->sdpcounter);
822 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtodsdpmapper), sdpisolver->nvars, nvars) );
823 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->dsdptoinputmapper), sdpisolver->nactivevars, nvars) );
824 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
825 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
827 sdpisolver->nvars = nvars;
828 oldnactivevars = sdpisolver->nactivevars;
829 sdpisolver->nactivevars = 0;
831 sdpisolver->niterations = 0;
832 sdpisolver->nsdpcalls = 0;
835 sdpisolver->fixedvarsobjcontr = 0.0;
836 for (i = 0; i < nvars; i++)
838 if (
isFixed(sdpisolver, lb[i], ub[i]) )
841 sdpisolver->inputtodsdpmapper[i] = -nfixedvars;
842 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
843 sdpisolver->fixedvarsval[nfixedvars - 1] = lb[i];
844 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in DSDP\n", i, lb[i], sdpisolver->sdpcounter);
848 sdpisolver->dsdptoinputmapper[sdpisolver->nactivevars] = i;
849 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
850 sdpisolver->nactivevars++;
851 sdpisolver->inputtodsdpmapper[i] = sdpisolver->nactivevars;
852 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in DSDP\n", i, sdpisolver->inputtodsdpmapper[i], sdpisolver->sdpcounter);
855 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
856 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
858 SCIPdebugMessage(
"Variable %d is the slack variable for the explicit penalty formulation\n", sdpisolver->nactivevars + 1);
863 sdpisolver->fixedvarsobjcontr = 0.0;
866 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
867 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
868 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->dsdptoinputmapper), nvars, sdpisolver->nactivevars) );
871 if ( sdpisolver->nactivevars != oldnactivevars )
873 if ( oldnactivevars == 0 )
875 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), sdpisolver->nactivevars) );
879 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), oldnactivevars, sdpisolver->nactivevars) );
882 sdpisolver->preoptimalsolexists = FALSE;
886 if ( sdpisolver->dsdp != NULL )
888 DSDP_CALL( DSDPDestroy(sdpisolver->dsdp) );
892 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
894 DSDP_CALLM( DSDPCreate(sdpisolver->nactivevars + 1, &(sdpisolver->dsdp)) );
895 sdpisolver->penaltyworbound = TRUE;
899 DSDP_CALLM( DSDPCreate(sdpisolver->nactivevars, &(sdpisolver->dsdp)) );
900 sdpisolver->penaltyworbound = FALSE;
902 DSDP_CALLM( DSDPCreateSDPCone(sdpisolver->dsdp, nsdpblocks - nremovedblocks, &(sdpisolver->sdpcone)) );
903 DSDP_CALLM( DSDPCreateLPCone(sdpisolver->dsdp, &(sdpisolver->lpcone)) );
904 DSDP_CALLM( DSDPCreateBCone(sdpisolver->dsdp, &(sdpisolver->bcone)) );
906 #ifdef SCIP_MORE_DEBUG 907 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"setting objective values for SDP %d:\n", sdpisolver->sdpcounter);
910 for (i = 0; i < sdpisolver->nactivevars; i++)
915 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, i+1, -1.0 * obj[sdpisolver->dsdptoinputmapper[i]]) );
916 #ifdef SCIP_MORE_DEBUG 917 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"var %d (was var %d): %f, ", i+1, sdpisolver->dsdptoinputmapper[i], obj[sdpisolver->dsdptoinputmapper[i]]);
922 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, i+1, 0.0) );
928 DSDP_CALL( BConeSetLowerBound(sdpisolver->bcone, i+1, lb[sdpisolver->dsdptoinputmapper[i]]) );
934 DSDP_CALL(BConeSetUpperBound(sdpisolver->bcone, i+1, ub[sdpisolver->dsdptoinputmapper[i]]));
939 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
941 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, sdpisolver->nactivevars + 1, -1.0 * penaltyparam) );
942 #ifdef SCIP_MORE_DEBUG 943 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"slack variable r: %f, ", penaltyparam);
947 #ifdef SCIP_MORE_DEBUG 948 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
949 SCIPdebugMessage(
"ATTENTION: BConeView shows the WRONG sign for the lower bound!\n");
950 BConeView(sdpisolver->bcone);
954 for (block = 0; block < nsdpblocks; ++block)
957 if ( blockindchanges[block] > -1 )
960 DSDP_CALL( SDPConeSetBlockSize(sdpisolver->sdpcone, block- blockindchanges[block], sdpblocksizes[block] - nremovedinds[block]) );
978 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
981 for (block = 0; block < nsdpblocks; block++)
982 nrnonz += sdpblocksizes[block] - nremovedinds[block];
983 assert( nrnonz >= 0 );
986 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz + nrnonz) );
988 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz + nrnonz) );
993 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz) );
995 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz) );
1000 for (block = 0; block < nsdpblocks; block++)
1002 for (i = 0; i < sdpisolver->nactivevars; i++)
1005 v = sdpisolver->dsdptoinputmapper[i];
1009 for (k = 0; k < sdpnblockvars[block]; k++)
1011 if ( v == sdpvar[block][k] )
1020 if ( blockvar > -1 )
1022 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
1025 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
1028 dsdpind[ind] =
compLowerTriangPos(sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]],
1029 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]]);
1030 dsdpval[ind] = -1.0 * sdpval[block][blockvar][k];
1035 SCIPsortIntReal(dsdpind + startind, dsdpval + startind, sdpnblockvarnonz[block][blockvar]);
1037 assert( blockindchanges[block] > -1 );
1041 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], i + 1, sdpblocksizes[block] - nremovedinds[block],
1042 1.0, 0, dsdpind + startind,dsdpval + startind, sdpnblockvarnonz[block][blockvar]));
1047 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1051 for (block = 0; block < nsdpblocks; block++)
1053 if ( blockindchanges[block] > -1 )
1055 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1058 dsdpval[ind] = -1.0;
1061 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], sdpisolver->nactivevars + 1,
1062 sdpblocksizes[block] - nremovedinds[block], 1.0, 0, dsdpind + ind - (sdpblocksizes[block] - nremovedinds[block]) ,
1063 dsdpval + ind - (sdpblocksizes[block] - nremovedinds[block]), sdpblocksizes[block] - nremovedinds[block]) );
1066 assert( ind - startind == nrnonz );
1071 if ( sdpconstnnonz > 0 )
1073 assert( nsdpblocks > 0 );
1074 assert( sdpconstnblocknonz!= NULL );
1075 assert( sdpconstcol != NULL );
1076 assert( sdpconstrow != NULL );
1077 assert( sdpconstval != NULL );
1084 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpconstind, sdpconstnnonz) );
1086 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpconstval, sdpconstnnonz) );
1090 for (block = 0; block < nsdpblocks; block++)
1094 if ( sdpconstnblocknonz[block] > 0 )
1097 for (i = 0; i < sdpconstnblocknonz[block]; i++)
1100 assert( indchanges[block][sdpconstrow[block][i]] > -1 && indchanges[block][sdpconstcol[block][i]] > -1 );
1103 dsdpconstind[ind] =
compLowerTriangPos(sdpconstrow[block][i] - indchanges[block][sdpconstrow[block][i]],
1104 sdpconstcol[block][i] - indchanges[block][sdpconstcol[block][i]]);
1105 dsdpconstval[ind] = -1 * sdpconstval[block][i];
1110 SCIPsortIntReal(dsdpconstind + startind, dsdpconstval + startind, sdpconstnblocknonz[block]);
1112 assert( blockindchanges[block] > -1 );
1116 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], 0, sdpblocksizes[block] - nremovedinds[block],
1117 1.0, 0, dsdpconstind + startind, dsdpconstval + startind, ind - startind));
1122 #ifdef SCIP_MORE_DEBUG 1123 SDPConeView2(sdpisolver->sdpcone);
1135 assert( noldlpcons > 0 );
1136 assert( lprhs != NULL );
1137 assert( lpcol != NULL );
1138 assert( lprow != NULL );
1139 assert( lpval != NULL );
1142 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &rowmapper, 2*noldlpcons) );
1147 for (i = 0; i < noldlpcons; i++)
1149 if ( rownactivevars[i] >= 2 )
1153 rowmapper[2*i] = pos;
1157 rowmapper[2*i] = -1;
1161 rowmapper[2*i + 1] = pos;
1165 rowmapper[2*i + 1] = -1;
1171 rowmapper[2*i] = -1;
1172 rowmapper[2*i + 1] = -1;
1176 assert( nlpineqs <= 2*nlpcons );
1183 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1185 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 3) );
1189 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 2) );
1199 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1201 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, 2 * nlpineqs + 2*lpnnonz) );
1205 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, nlpineqs + 2*lpnnonz) );
1210 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1212 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs) );
1216 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars) );
1228 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1230 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, 2 * nlpineqs + 2*lpnnonz) );
1234 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, nlpineqs + 2*lpnnonz) );
1239 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1241 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs) );
1245 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars) );
1253 for (i = 0; i < nlpcons; i++)
1257 if ( REALABS(lplhs[i]) > sdpisolver->epsilon )
1259 dsdplprow[dsdpnlpnonz] = pos;
1260 dsdplpval[dsdpnlpnonz] = -lplhs[i];
1267 if ( REALABS(lprhs[i]) > sdpisolver->epsilon )
1269 dsdplprow[dsdpnlpnonz] = pos;
1270 dsdplpval[dsdpnlpnonz] = lprhs[i];
1276 assert( pos == nlpineqs );
1281 if ( REALABS(sdpisolver->objlimit) > sdpisolver->epsilon )
1283 dsdplprow[dsdpnlpnonz] = nlpcons;
1284 dsdplpval[dsdpnlpnonz] = sdpisolver->objlimit;
1296 dsdplpbegcol[0] = 0;
1297 for (i = 0; i < lpnnonz; i++)
1300 if ( lpcol[i] >= nextcol )
1305 for (j = nextcol; j <= lpcol[i]; j++)
1307 if ( sdpisolver->inputtodsdpmapper[j] >= 0 )
1309 assert( ! (
isFixed(sdpisolver, lb[j], ub[j])) );
1310 dsdplpbegcol[sdpisolver->inputtodsdpmapper[j]] = dsdpnlpnonz;
1315 dsdplprow[dsdpnlpnonz] = nlpcons;
1316 dsdplpval[dsdpnlpnonz] = obj[j];
1325 if ( !
isFixed(sdpisolver, lb[lpcol[i]], ub[lpcol[i]]) )
1328 if ( rowmapper[2*lprow[i]] > -1 )
1332 dsdplprow[dsdpnlpnonz] = rowmapper[2*lprow[i]];
1333 dsdplpval[dsdpnlpnonz] = -lpval[i];
1337 if ( rowmapper[2*lprow[i] + 1] > -1 )
1341 dsdplprow[dsdpnlpnonz] = rowmapper[2*lprow[i] + 1];
1342 dsdplpval[dsdpnlpnonz] = lpval[i];
1349 assert(
isFixed(sdpisolver, lb[lpcol[i]], ub[lpcol[i]]) || rownactivevars[lprow[i]] == 1 );
1354 for (j = nextcol; j < nvars; j++)
1356 if ( sdpisolver->inputtodsdpmapper[j] >= 0 )
1358 assert( ! (
isFixed(sdpisolver, lb[j], ub[j])) );
1359 dsdplpbegcol[sdpisolver->inputtodsdpmapper[j]] = dsdpnlpnonz;
1363 dsdplprow[dsdpnlpnonz] = nlpcons;
1364 dsdplpval[dsdpnlpnonz] = obj[j];
1370 dsdplpbegcol[sdpisolver->nactivevars + 1] = dsdpnlpnonz;
1373 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1375 for (i = 0; i < nlpineqs; i++)
1377 dsdplprow[dsdpnlpnonz] = i;
1378 dsdplpval[dsdpnlpnonz] = -1.0;
1381 dsdplpbegcol[sdpisolver->nactivevars + 2] = dsdpnlpnonz;
1385 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &rowmapper);
1390 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1392 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, 2*nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1393 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, 2*nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1397 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1398 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1403 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1405 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs, dsdpnlpnonz) );
1406 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs, dsdpnlpnonz) );
1410 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars, dsdpnlpnonz) );
1411 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars, dsdpnlpnonz) );
1418 DSDP_CALL( LPConeSetData(sdpisolver->lpcone, nlpineqs, dsdplpbegcol, dsdplprow, dsdplpval) );
1422 DSDP_CALL( LPConeSetData(sdpisolver->lpcone, nlpineqs + 1, dsdplpbegcol, dsdplprow, dsdplpval) );
1424 #ifdef SCIP_MORE_DEBUG 1425 LPConeView(sdpisolver->lpcone);
1429 SCIPdebugMessage(
"Calling DSDP-Solve for SDP (%d) \n", sdpisolver->sdpcounter);
1431 DSDP_CALL( DSDPSetGapTolerance(sdpisolver->dsdp, sdpisolver->gaptol) );
1432 DSDP_CALL( DSDPSetRTolerance(sdpisolver->dsdp, sdpisolver->sdpsolverfeastol) );
1433 if ( sdpisolver-> sdpinfo )
1435 DSDP_CALL( DSDPSetStandardMonitor(sdpisolver->dsdp, 1) );
1439 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1441 DSDP_CALL( DSDPSetPenaltyParameter(sdpisolver->dsdp, penaltyparam) );
1442 DSDP_CALL( DSDPUsePenalty(sdpisolver->dsdp, 1) );
1447 DSDP_CALL( DSDPSetPenaltyParameter(sdpisolver->dsdp, sdpisolver->penaltyparam) );
1451 if ( starty != NULL )
1453 for (i = 0; i < sdpisolver->nactivevars; i++)
1455 DSDP_CALL( DSDPSetY0(sdpisolver->dsdp, i + 1, starty[sdpisolver->dsdptoinputmapper[i]]) );
1467 if ( sdpisolver->preoptimalgap >= 0.0 )
1471 DSDP_CALL( DSDPSolve(sdpisolver->dsdp) );
1473 sdpisolver->nsdpcalls++;
1474 DSDP_CALL( DSDPGetIts(sdpisolver->dsdp, &(sdpisolver->niterations)) );
1477 if ( timings.stopped )
1479 sdpisolver->timelimit = TRUE;
1480 sdpisolver->solved = FALSE;
1484 sdpisolver->timelimit = FALSE;
1485 DSDP_CALL( DSDPComputeX(sdpisolver->dsdp) );
1486 sdpisolver->solved = TRUE;
1491 feastol = sdpisolver->sdpsolverfeastol;
1495 SCIP_Real* solvector;
1497 SCIP_Bool infeasible;
1501 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
1502 nvarspointer = nvars;
1504 assert( nvarspointer == nvars );
1507 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1508 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1509 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
1510 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
1512 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1516 SCIPdebugMessage(
"Solution feasible for DSDP but outside feasibility tolerance, changing SDPA feasibility tolerance from %f to %f\n",
1523 DSDP_CALL( DSDPSetRTolerance(sdpisolver->dsdp, feastol) );
1525 DSDP_CALL( DSDPSolve(sdpisolver->dsdp) );
1528 sdpisolver->nsdpcalls++;
1529 DSDP_CALL( DSDPGetIts(sdpisolver->dsdp, &newiterations) );
1530 sdpisolver->niterations += newiterations;
1533 if ( timings.stopped )
1535 sdpisolver->timelimit = TRUE;
1536 sdpisolver->solved = FALSE;
1540 sdpisolver->timelimit = FALSE;
1541 DSDP_CALL( DSDPComputeX(sdpisolver->dsdp) );
1542 sdpisolver->solved = TRUE;
1547 sdpisolver->solved = FALSE;
1548 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance! \n");
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;
1659 if ( penaltybound != NULL )
1661 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", rval);
1664 DSDP_CALL( DSDPGetTraceX(sdpisolver->dsdp, &trace) );
1667 assert( trace < penaltyparam + sdpisolver->feastol );
1673 *penaltybound = TRUE;
1674 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1675 trace, penaltyparam);
1678 *penaltybound = FALSE;
1689 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &dsdpsol, sdpisolver->nactivevars + 1) );
1691 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, sdpisolver->nactivevars + 1) );
1693 *feasorig = (dsdpsol[sdpisolver->nactivevars] < sdpisolver->feastol);
1698 if ( penaltybound != NULL )
1700 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", dsdpsol[sdpisolver->nactivevars]);
1703 DSDP_CALL( DSDPGetTraceX(sdpisolver->dsdp, &trace) );
1706 assert( trace < penaltyparam + sdpisolver->feastol );
1712 *penaltybound = TRUE;
1713 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1714 trace, penaltyparam);
1717 *penaltybound = FALSE;
1722 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &dsdpsol);
1745 assert( sdpisolver != NULL );
1746 return sdpisolver->solved;
1759 DSDPSolutionType pdfeasible;
1761 assert( sdpisolver != NULL );
1764 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1766 if ( pdfeasible == DSDP_PDUNKNOWN )
1775 SCIP_Bool* primalfeasible,
1776 SCIP_Bool* dualfeasible
1779 DSDPSolutionType pdfeasible;
1781 assert( sdpisolver != NULL );
1782 assert( primalfeasible != NULL );
1783 assert( dualfeasible != NULL );
1786 DSDP_CALL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1788 switch ( pdfeasible )
1790 case DSDP_PDFEASIBLE:
1791 *primalfeasible = TRUE;
1792 *dualfeasible = TRUE;
1795 case DSDP_UNBOUNDED:
1796 *primalfeasible = FALSE;
1797 *dualfeasible = TRUE;
1800 case DSDP_INFEASIBLE:
1801 *primalfeasible = TRUE;
1802 *dualfeasible = FALSE;
1806 SCIPerrorMessage(
"DSDP doesn't know if primal and dual solutions are feasible\n");
1807 return SCIP_LPERROR;
1820 DSDPSolutionType pdfeasible;
1822 assert( sdpisolver != NULL );
1825 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1826 if ( pdfeasible == DSDP_PDUNKNOWN )
1831 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.");
1834 else if ( pdfeasible == DSDP_INFEASIBLE )
1847 DSDPSolutionType pdfeasible;
1849 assert( sdpisolver != NULL );
1852 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1853 if ( pdfeasible == DSDP_PDUNKNOWN )
1858 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1861 else if ( pdfeasible == DSDP_UNBOUNDED )
1873 DSDPSolutionType pdfeasible;
1875 assert( sdpisolver != NULL );
1878 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1879 if ( pdfeasible == DSDP_PDUNKNOWN )
1881 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1884 else if ( pdfeasible == DSDP_UNBOUNDED )
1897 DSDPSolutionType pdfeasible;
1899 assert( sdpisolver != NULL );
1902 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1903 if ( pdfeasible == DSDP_PDUNKNOWN )
1905 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1908 else if ( pdfeasible == DSDP_UNBOUNDED )
1921 DSDPSolutionType pdfeasible;
1923 assert( sdpisolver != NULL );
1926 DSDP_CALL_BOOL(DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible));
1928 if ( pdfeasible == DSDP_PDUNKNOWN )
1930 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1933 else if ( pdfeasible == DSDP_INFEASIBLE )
1946 DSDPSolutionType pdfeasible;
1948 assert( sdpisolver != NULL );
1951 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1953 if ( pdfeasible == DSDP_PDUNKNOWN )
1955 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1958 else if ( pdfeasible == DSDP_INFEASIBLE )
1969 DSDPTerminationReason reason;
1971 assert( sdpisolver != NULL );
1973 if ( sdpisolver->timelimit )
1976 if ( ! sdpisolver->solved )
1981 if ( reason == DSDP_CONVERGED )
1992 SCIPdebugMessage(
"Method not implemented for DSDP, as objective limit is given as an ordinary LP-constraint, so in case the objective limit was " 1993 "exceeded, the problem will be reported as infeasible ! \n");
2003 DSDPTerminationReason reason;
2005 assert( sdpisolver != NULL );
2010 if ( reason == DSDP_MAX_IT )
2021 assert( sdpisolver != NULL );
2023 return sdpisolver->timelimit;
2041 DSDPTerminationReason reason;
2044 assert( sdpisolver != NULL );
2046 if ( sdpisolver->dsdp == NULL || (! sdpisolver->solved) )
2049 if ( sdpisolver->timelimit )
2052 dsdpreturn = DSDPStopReason(sdpisolver->dsdp, &reason);
2054 if (dsdpreturn != 0)
2056 SCIPerrorMessage(
"DSDP-Error <%d> in function call.\n", dsdpreturn);
2062 case DSDP_CONVERGED:
2065 case DSDP_INFEASIBLE_START:
2068 case DSDP_SMALL_STEPS:
2071 case DSDP_INDEFINITE_SCHUR_MATRIX:
2077 case DSDP_NUMERICAL_ERROR:
2080 case DSDP_UPPERBOUND:
2083 case DSDP_USER_TERMINATION:
2096 assert( sdpisolver != NULL );
2108 assert( sdpisolver != NULL );
2119 SCIPdebugMessage(
"Not implemented yet\n");
2120 return SCIP_LPERROR;
2132 assert( sdpisolver != NULL );
2133 assert( objval != NULL );
2136 dsdpnvars = sdpisolver->penaltyworbound ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars;
2138 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2142 DSDP_CALL( DSDPGetDObjective(sdpisolver->dsdp, objval) );
2143 *objval = -1*(*objval);
2151 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars) );
2152 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, dsdpnvars) );
2156 for (v = 0; v < sdpisolver->nactivevars; v++)
2157 *objval += sdpisolver->objcoefs[v] * dsdpsol[v];
2161 *objval += sdpisolver->fixedvarsobjcontr;
2163 if ( ( ! sdpisolver->penalty ) || sdpisolver->feasorig )
2165 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars);
2187 assert( sdpisolver != NULL );
2188 assert( dualsollength != NULL );
2191 dsdpnvars = sdpisolver->penaltyworbound ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars;
2193 if ( *dualsollength > 0 )
2195 assert( dualsol != NULL );
2196 if ( *dualsollength < sdpisolver->nvars )
2198 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2199 *dualsollength = sdpisolver->nvars;
2204 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars) );
2205 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, dsdpnvars) );
2208 for (v = 0; v < sdpisolver->nvars; v++)
2210 if (sdpisolver->inputtodsdpmapper[v] > -1)
2213 dualsol[v] = dsdpsol[sdpisolver->inputtodsdpmapper[v] - 1];
2218 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtodsdpmapper[v]) - 1];
2222 if ( objval != NULL )
2224 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2228 DSDP_CALL( DSDPGetDObjective(sdpisolver->dsdp, objval) );
2229 *objval = -1*(*objval);
2235 for (v = 0; v < sdpisolver->nactivevars; v++)
2236 *objval += sdpisolver->objcoefs[v] * dsdpsol[v];
2240 *objval += sdpisolver->fixedvarsobjcontr;
2243 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars);
2245 else if ( objval != NULL )
2257 int* startXnblocknonz
2261 SCIPdebugMessage(
"Not implemented yet\n");
2263 return SCIP_PLUGINNOTFOUND;
2280 int* startXnblocknonz,
2284 SCIP_Real** startXval
2289 assert( sdpisolver != NULL );
2290 assert( success != NULL );
2291 assert( dualsol != NULL );
2292 assert( dualsollength != NULL );
2293 assert( *dualsollength >= 0 );
2296 assert( nblocks == -1 );
2298 if ( ! sdpisolver->preoptimalsolexists )
2300 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2305 if ( *dualsollength < sdpisolver->nvars )
2307 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2309 *dualsollength = sdpisolver->nvars;
2313 for (v = 0; v < sdpisolver->nvars; v++)
2315 if (sdpisolver->inputtodsdpmapper[v] > -1)
2318 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtodsdpmapper[v] - 1];
2323 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtodsdpmapper[v]) - 1];
2328 *dualsollength = sdpisolver->nvars;
2349 SCIP_Real* lbvarsdsdp;
2350 SCIP_Real* ubvarsdsdp;
2353 assert( sdpisolver != NULL );
2354 assert( lbvars != NULL );
2355 assert( ubvars != NULL );
2356 assert( arraylength != NULL );
2357 assert( *arraylength >= 0 );
2361 if ( *arraylength < sdpisolver->nvars )
2363 *arraylength = sdpisolver->nvars;
2364 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2369 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &lbvarsdsdp, sdpisolver->nactivevars) );
2370 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &ubvarsdsdp, sdpisolver->nactivevars) );
2373 DSDP_CALL( BConeCopyX(sdpisolver->bcone, lbvarsdsdp, ubvarsdsdp, sdpisolver->nactivevars) );
2376 for (i = 0; i < sdpisolver->nvars; i++)
2378 if ( sdpisolver->inputtodsdpmapper[i] < 0 )
2387 lbvars[i] = lbvarsdsdp[sdpisolver->inputtodsdpmapper[i] - 1];
2388 ubvars[i] = ubvarsdsdp[sdpisolver->inputtodsdpmapper[i] - 1];
2393 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &ubvarsdsdp, sdpisolver->nactivevars);
2394 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &lbvarsdsdp, sdpisolver->nactivevars);
2403 int* startXnblocknonz
2406 SCIPdebugMessage(
"Not implemented yet\n");
2407 return SCIP_LPERROR;
2419 int* startXnblocknonz,
2423 SCIP_Real** startXval
2426 SCIPdebugMessage(
"Not implemented yet\n");
2427 return SCIP_LPERROR;
2435 SCIPdebugMessage(
"Not implemented yet\n");
2436 return SCIP_INVALID;
2445 assert( sdpisolver != NULL );
2446 assert( iterations != NULL );
2448 if ( sdpisolver->timelimitinitial )
2451 *iterations = sdpisolver->niterations;
2462 assert( sdpisolver != NULL );
2463 assert( calls != NULL );
2465 if ( sdpisolver->timelimitinitial )
2468 *calls = sdpisolver->nsdpcalls;
2479 assert( sdpisolver != NULL );
2480 assert( usedsetting != NULL );
2485 *usedsetting = sdpisolver->usedsetting;
2526 assert( sdpisolver != NULL );
2527 assert( dval != NULL );
2532 *dval = sdpisolver->epsilon;
2535 *dval = sdpisolver->gaptol;
2538 *dval = sdpisolver->feastol;
2541 *dval = sdpisolver->sdpsolverfeastol;
2544 *dval = sdpisolver->penaltyparam;
2547 *dval = sdpisolver->objlimit;
2550 *dval = sdpisolver->preoptimalgap;
2553 return SCIP_PARAMETERUNKNOWN;
2566 assert( sdpisolver != NULL );
2571 sdpisolver->epsilon = dval;
2572 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
2575 sdpisolver->gaptol = dval;
2576 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
2579 sdpisolver->feastol = dval;
2580 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
2583 sdpisolver->sdpsolverfeastol = dval;
2584 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
2587 sdpisolver->penaltyparam = dval;
2588 SCIPdebugMessage(
"Setting sdpisolver penaltyparameter to %f.\n", dval);
2591 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
2592 sdpisolver->objlimit = dval;
2595 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_LAMBDASTAR not used by DSDP");
2598 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %f.\n", dval);
2599 sdpisolver->preoptimalgap = dval;
2602 return SCIP_PARAMETERUNKNOWN;
2615 assert( sdpisolver != NULL );
2620 *ival = (int) sdpisolver->sdpinfo;
2621 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2624 return SCIP_PARAMETERUNKNOWN;
2637 assert( sdpisolver != NULL );
2642 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2643 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2646 return SCIP_PARAMETERUNKNOWN;
2658 SCIPdebugMessage(
"Lambdastar parameter not used by DSDP");
2667 SCIP_Real* penaltyparam
2672 assert( sdpisolver != NULL );
2673 assert( penaltyparam != NULL );
2691 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2692 sdpisolver->penaltyparam = compval;
2693 *penaltyparam = compval;
2701 SCIP_Real penaltyparam,
2702 SCIP_Real* maxpenaltyparam
2707 assert( sdpisolver != NULL );
2708 assert( maxpenaltyparam != NULL );
2714 *maxpenaltyparam = compval;
2715 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2724 if ( sdpisolver->penaltyparam > *maxpenaltyparam )
2726 SCIPdebugMessage(
"Decreasing penaltyparameter of %f to maximum penalty paramater of %f.\n", sdpisolver->penaltyparam, *maxpenaltyparam);
2727 sdpisolver->penaltyparam = *maxpenaltyparam;
2750 SCIPdebugMessage(
"Not implemented yet\n");
2751 return SCIP_LPERROR;
2760 SCIPdebugMessage(
"Not implemented yet\n");
2761 return SCIP_LPERROR;
SCIP_Bool SCIPsdpiSolverIsConverged(SCIP_SDPISOLVER *sdpisolver)
int SCIPsdpiSolverGetInternalStatus(SCIP_SDPISOLVER *sdpisolver)
SCIP_Bool SCIPsdpiSolverIsPrimalFeasible(SCIP_SDPISOLVER *sdpisolver)
SCIP_Real SCIPsdpiSolverGetDefaultSdpiSolverGaptol(void)
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)
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 SCIPsdpiSolverGetIntpar(SCIP_SDPISOLVER *sdpisolver, SCIP_SDPPARAM type, int *ival)
int SCIPsdpiSolverGetDefaultSdpiSolverNpenaltyIncreases(void)
#define DSDP_CALL_BOOL(x)
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 *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, SCIP_Bool *feasorig, SCIP_Bool *penaltybound)
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)
#define TIMEOFDAY_CALL(x)
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)
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, int noldlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int *rownactivevars, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval, SCIP_Real *solvector, SCIP_Real feastol, SCIP_Real epsilon, SCIP_Bool *infeasible)
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 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)
static int checkGapSetPreoptimalSol(DSDP dsdp, void *ctx)
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 *rownactivevars, 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)
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_Real SCIPsdpiSolverGetDefaultSdpiSolverFeastol(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 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)