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"
60 #define PENALTYBOUNDTOL 1E-3
63 #define MIN_PENALTYPARAM 1e5
64 #define MAX_PENALTYPARAM 1e12
65 #define PENALTYPARAM_FACTOR 1e4
66 #define MAX_MAXPENALTYPARAM 1e15
67 #define MAXPENALTYPARAM_FACTOR 1e6
68 #define INFEASFEASTOLCHANGE 0.1
69 #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_CALLM(x) do \
98 int _dsdperrorcode_; \
99 if ( (_dsdperrorcode_ = (x)) != 0 ) \
101 SCIPerrorMessage("DSDP-Error <%d> in function call.\n", _dsdperrorcode_); \
102 return SCIP_NOMEMORY; \
108 #define BMS_CALL(x) do \
112 SCIPerrorMessage("No memory in function call.\n"); \
113 return SCIP_NOMEMORY; \
119 #define TIMEOFDAY_CALL(x) do \
122 if ( (_errorcode_ = (x)) != 0 ) \
124 SCIPerrorMessage("Error in gettimeofday! \n"); \
131 #define CHECK_IF_SOLVED(sdpisolver) do \
133 if (!(sdpisolver->solved)) \
135 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
136 return SCIP_LPERROR; \
142 #define CHECK_IF_SOLVED_BOOL(sdpisolver) do \
144 if (!(sdpisolver->solved)) \
146 SCIPerrorMessage("Tried to access solution information for SDP %d ahead of solving!\n", sdpisolver->sdpcounter); \
154 struct SCIP_SDPiSolver
156 SCIP_MESSAGEHDLR* messagehdlr;
165 int* inputtodsdpmapper;
168 int* dsdptoinputmapper;
169 SCIP_Real* fixedvarsval;
170 SCIP_Real fixedvarsobjcontr;
177 SCIP_Real sdpsolverfeastol;
178 SCIP_Real penaltyparam;
182 SCIP_Bool penaltyworbound;
187 SCIP_Bool timelimitinitial;
190 SCIP_Real* preoptimalsol;
191 SCIP_Bool preoptimalsolexists;
192 SCIP_Real preoptimalgap;
198 struct timeval starttime;
220 return i*(i+1)/2 + j;
232 assert( lb < ub + sdpisolver->feastol );
234 return (ub-lb <= sdpisolver->epsilon);
237 #define isFixed(sdpisolver,lb,ub) (ub-lb <= sdpisolver->epsilon)
253 SCIPsortIntIntReal(col, row, val, length);
256 while (nextentry < length)
258 firstentry = nextentry;
260 while (nextentry < length && col[nextentry] == col[firstentry])
264 SCIPsortIntReal(row + firstentry, val + firstentry, nextentry - firstentry);
276 struct timeval currenttime;
277 SCIP_Real startseconds;
278 SCIP_Real currentseconds;
279 SCIP_Real elapsedtime;
281 assert( dsdp != NULL );
282 assert( ctx != NULL );
286 startseconds = (SCIP_Real) (timings->starttime).tv_sec + (SCIP_Real) (timings->starttime).tv_usec / 1e6;
289 currentseconds = (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6;
291 elapsedtime = currentseconds - startseconds;
293 if ( elapsedtime > timings->timelimit )
295 DSDP_CALL( DSDPSetConvergenceFlag(dsdp, DSDP_USER_TERMINATION) );
296 timings->stopped = TRUE;
297 SCIPdebugMessage(
"Time limit reached! Stopping DSDP.\n");
322 DSDP_CALL( DSDPGetPPObjective(dsdp,&pobj) );
323 DSDP_CALL( DSDPGetDDObjective(dsdp,&dobj) );
324 DSDP_CALL( DSDPGetDualityGap(dsdp,&absgap) );
326 relgap = absgap / (1.0 + (REALABS(dobj)/2) + (REALABS(pobj)/2) );
335 SCIPdebugMessage(
"penalty variable %f, gap %f -> saving preoptimal solution\n", r, relgap);
363 return "Dual-Scaling Interior Point SDP-Solver by S. Benson, Y. Ye, and X. Zhang (http://www.mcs.anl.gov/hs/software/DSDP/)";
376 assert( sdpisolver != NULL );
377 return (
void*) sdpisolver->dsdp;
426 SCIP_MESSAGEHDLR* messagehdlr,
431 assert( sdpisolver != NULL );
432 assert( blkmem != NULL );
433 assert( bufmem != NULL );
435 SCIPdebugMessage(
"Calling SCIPsdpiCreate \n");
437 BMS_CALL( BMSallocBlockMemory(blkmem, sdpisolver) );
439 (*sdpisolver)->messagehdlr = messagehdlr;
440 (*sdpisolver)->blkmem = blkmem;
441 (*sdpisolver)->bufmem = bufmem;
445 (*sdpisolver)->dsdp = NULL;
446 (*sdpisolver)->sdpcone = NULL;
447 (*sdpisolver)->lpcone = NULL;
448 (*sdpisolver)->bcone = NULL;
450 (*sdpisolver)->nvars = 0;
451 (*sdpisolver)->nactivevars = 0;
452 (*sdpisolver)->inputtodsdpmapper = NULL;
453 (*sdpisolver)->dsdptoinputmapper = NULL;
454 (*sdpisolver)->fixedvarsval = NULL;
455 (*sdpisolver)->fixedvarsobjcontr = 0.0;
456 (*sdpisolver)->objcoefs = NULL;
457 (*sdpisolver)->solved = FALSE;
458 (*sdpisolver)->timelimit = FALSE;
459 (*sdpisolver)->timelimitinitial = FALSE;
460 (*sdpisolver)->penalty = FALSE;
461 (*sdpisolver)->penaltyworbound = FALSE;
462 (*sdpisolver)->feasorig = FALSE;
463 (*sdpisolver)->sdpcounter = 0;
464 (*sdpisolver)->niterations = 0;
465 (*sdpisolver)->nsdpcalls = 0;
467 (*sdpisolver)->epsilon = 1e-9;
468 (*sdpisolver)->gaptol = 1e-4;
469 (*sdpisolver)->feastol = 1e-6;
470 (*sdpisolver)->sdpsolverfeastol = 1e-6;
471 (*sdpisolver)->penaltyparam = 1e5;
473 (*sdpisolver)->sdpinfo = FALSE;
475 (*sdpisolver)->preoptimalsolexists = FALSE;
476 (*sdpisolver)->preoptimalgap = -1.0;
486 assert( sdpisolver != NULL );
487 assert( *sdpisolver != NULL );
489 SCIPdebugMessage(
"Freeing SDPISolver\n");
491 if ( (*sdpisolver)->dsdp != NULL )
493 DSDP_CALL( DSDPDestroy((*sdpisolver)->dsdp) );
496 if ( (*sdpisolver)->nvars > 0 )
497 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->inputtodsdpmapper, (*sdpisolver)->nvars);
499 if ( (*sdpisolver)->nactivevars > 0 )
501 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->preoptimalsol, (*sdpisolver)->nactivevars);
502 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->dsdptoinputmapper, (*sdpisolver)->nactivevars);
503 BMSfreeBlockMemoryArray((*sdpisolver)->blkmem, &(*sdpisolver)->objcoefs, (*sdpisolver)->nactivevars);
506 if ( (*sdpisolver)->nvars >= (*sdpisolver)->nactivevars )
507 BMSfreeBlockMemoryArrayNull((*sdpisolver)->blkmem, &(*sdpisolver)->fixedvarsval, (*sdpisolver)->nvars - (*sdpisolver)->nactivevars);
509 BMSfreeBlockMemory((*sdpisolver)->blkmem, sdpisolver);
519 assert( sdpisolver != NULL );
521 sdpisolver->sdpcounter++;
531 assert( sdpisolver != NULL );
533 SCIPdebugMessage(
"Resetting counter of SDP-Interface from %d to 0.\n", sdpisolver->sdpcounter);
534 sdpisolver->sdpcounter = 0;
574 int* sdpconstnblocknonz,
578 SCIP_Real** sdpconstval,
580 int** sdpnblockvarnonz,
590 int* blockindchanges,
602 int* startZnblocknonz,
608 SCIP_Real** startZval,
610 int* startXnblocknonz,
616 SCIP_Real** startXval,
623 return SCIPsdpiSolverLoadAndSolveWithPenalty(sdpisolver, 0.0, TRUE, TRUE, nvars, obj, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars,
624 sdpconstnnonz, sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
625 indchanges, nremovedinds, blockindchanges, nremovedblocks, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol,
626 lpval, starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow, startXcol, startXval, startsettings,
627 timelimit, NULL, NULL);
654 SCIP_Real penaltyparam,
665 int* sdpconstnblocknonz,
669 SCIP_Real** sdpconstval,
671 int** sdpnblockvarnonz,
681 int* blockindchanges,
693 int* startZnblocknonz,
699 SCIP_Real** startZval,
701 int* startXnblocknonz,
707 SCIP_Real** startXval,
714 SCIP_Bool* penaltybound
718 int* dsdpconstind = NULL;
719 SCIP_Real* dsdpconstval = NULL;
721 SCIP_Real* dsdpval = NULL;
722 int* dsdplpbegcol = NULL;
723 int* dsdplprow = NULL;
724 SCIP_Real* dsdplpval = NULL;
738 DSDPTerminationReason reason;
741 assert( sdpisolver != NULL );
742 assert( penaltyparam > -1 * sdpisolver->epsilon );
743 assert( penaltyparam < sdpisolver->epsilon || ( feasorig != NULL ) );
745 assert( obj != NULL );
746 assert( lb != NULL );
747 assert( ub != NULL );
748 assert( nsdpblocks >= 0 );
749 assert( nsdpblocks == 0 || sdpblocksizes != NULL );
750 assert( nsdpblocks == 0 || sdpnblockvars != NULL );
751 assert( sdpconstnnonz >= 0 );
752 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstnblocknonz != NULL );
753 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstrow != NULL );
754 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstcol != NULL );
755 assert( nsdpblocks == 0 || sdpconstnnonz == 0 || sdpconstval != NULL );
756 assert( sdpnnonz >= 0 );
757 assert( nsdpblocks == 0 || sdpnblockvarnonz != NULL );
758 assert( nsdpblocks == 0 || sdpvar != NULL );
759 assert( nsdpblocks == 0 || sdprow != NULL );
760 assert( nsdpblocks == 0 || sdpcol != NULL );
761 assert( nsdpblocks == 0 || sdpval != NULL );
762 assert( nsdpblocks == 0 || indchanges != NULL );
763 assert( nsdpblocks == 0 || nremovedinds != NULL );
764 assert( nsdpblocks == 0 || blockindchanges != NULL );
765 assert( 0 <= nremovedblocks && nremovedblocks <= nsdpblocks );
766 assert( nlpcons >= 0 );
767 assert( noldlpcons >= nlpcons );
768 assert( nlpcons == 0 || lplhs != NULL );
769 assert( nlpcons == 0 || lprhs != NULL );
770 assert( nlpcons == 0 || rownactivevars != NULL );
771 assert( lpnnonz >= 0 );
772 assert( nlpcons == 0 || lprow != NULL );
773 assert( nlpcons == 0 || lpcol != NULL );
774 assert( nlpcons == 0 || lpval != NULL );
776 sdpisolver->penalty = penaltyparam > sdpisolver->epsilon;
778 if ( timelimit <= 0.0 )
780 sdpisolver->timelimit = TRUE;
781 sdpisolver->timelimitinitial = TRUE;
782 sdpisolver->solved = FALSE;
786 sdpisolver->timelimitinitial = FALSE;
788 sdpisolver->feasorig = FALSE;
792 timings.timelimit = timelimit;
793 timings.stopped = FALSE;
797 if ( penaltyparam < sdpisolver->epsilon )
799 SCIPdebugMessage(
"Inserting Data into DSDP for SDP (%d) \n", ++sdpisolver->sdpcounter);
804 SCIPdebugMessage(
"Inserting Data again into DSDP for SDP (%d) \n", sdpisolver->sdpcounter);
810 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->inputtodsdpmapper), sdpisolver->nvars, nvars) );
811 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->dsdptoinputmapper), sdpisolver->nactivevars, nvars) );
812 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), sdpisolver->nvars - sdpisolver->nactivevars, nvars) );
813 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), sdpisolver->nactivevars, nvars) );
815 sdpisolver->nvars = nvars;
816 oldnactivevars = sdpisolver->nactivevars;
817 sdpisolver->nactivevars = 0;
819 sdpisolver->niterations = 0;
820 sdpisolver->nsdpcalls = 0;
823 sdpisolver->fixedvarsobjcontr = 0.0;
824 for (i = 0; i < nvars; i++)
826 if (
isFixed(sdpisolver, lb[i], ub[i]) )
829 sdpisolver->inputtodsdpmapper[i] = -nfixedvars;
830 sdpisolver->fixedvarsobjcontr += obj[i] * lb[i];
831 sdpisolver->fixedvarsval[nfixedvars - 1] = lb[i];
832 SCIPdebugMessage(
"Fixing variable %d locally to %f for SDP %d in DSDP\n", i, lb[i], sdpisolver->sdpcounter);
836 sdpisolver->dsdptoinputmapper[sdpisolver->nactivevars] = i;
837 sdpisolver->objcoefs[sdpisolver->nactivevars] = obj[i];
838 sdpisolver->nactivevars++;
839 sdpisolver->inputtodsdpmapper[i] = sdpisolver->nactivevars;
840 SCIPdebugMessage(
"Variable %d becomes variable %d for SDP %d in DSDP\n", i, sdpisolver->inputtodsdpmapper[i], sdpisolver->sdpcounter);
843 assert( sdpisolver->nactivevars + nfixedvars == sdpisolver->nvars );
844 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
846 SCIPdebugMessage(
"Variable %d is the slack variable for the explicit penalty formulation\n", sdpisolver->nactivevars + 1);
851 sdpisolver->fixedvarsobjcontr = 0.0;
854 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->objcoefs), nvars, sdpisolver->nactivevars) );
855 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->fixedvarsval), nvars, nfixedvars) );
856 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->dsdptoinputmapper), nvars, sdpisolver->nactivevars) );
859 if ( sdpisolver->nactivevars != oldnactivevars )
861 if ( oldnactivevars == 0 )
863 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), sdpisolver->nactivevars) );
867 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &(sdpisolver->preoptimalsol), oldnactivevars, sdpisolver->nactivevars) );
870 sdpisolver->preoptimalsolexists = FALSE;
874 if ( sdpisolver->dsdp != NULL )
876 DSDP_CALL( DSDPDestroy(sdpisolver->dsdp) );
880 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
882 DSDP_CALLM( DSDPCreate(sdpisolver->nactivevars + 1, &(sdpisolver->dsdp)) );
883 sdpisolver->penaltyworbound = TRUE;
887 DSDP_CALLM( DSDPCreate(sdpisolver->nactivevars, &(sdpisolver->dsdp)) );
888 sdpisolver->penaltyworbound = FALSE;
890 DSDP_CALLM( DSDPCreateSDPCone(sdpisolver->dsdp, nsdpblocks - nremovedblocks, &(sdpisolver->sdpcone)) );
891 DSDP_CALLM( DSDPCreateLPCone(sdpisolver->dsdp, &(sdpisolver->lpcone)) );
892 DSDP_CALLM( DSDPCreateBCone(sdpisolver->dsdp, &(sdpisolver->bcone)) );
894 #ifdef SCIP_MORE_DEBUG
895 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"setting objective values for SDP %d:\n", sdpisolver->sdpcounter);
898 for (i = 0; i < sdpisolver->nactivevars; i++)
903 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, i+1, -1.0 * obj[sdpisolver->dsdptoinputmapper[i]]) );
904 #ifdef SCIP_MORE_DEBUG
905 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"var %d (was var %d): %f, ", i+1, sdpisolver->dsdptoinputmapper[i], obj[sdpisolver->dsdptoinputmapper[i]]);
910 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, i+1, 0.0) );
916 DSDP_CALL( BConeSetLowerBound(sdpisolver->bcone, i+1, lb[sdpisolver->dsdptoinputmapper[i]]) );
922 DSDP_CALL(BConeSetUpperBound(sdpisolver->bcone, i+1, ub[sdpisolver->dsdptoinputmapper[i]]));
927 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
929 DSDP_CALL( DSDPSetDualObjective(sdpisolver->dsdp, sdpisolver->nactivevars + 1, -1.0 * penaltyparam) );
930 #ifdef SCIP_MORE_DEBUG
931 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"slack variable r: %f, ", penaltyparam);
935 #ifdef SCIP_MORE_DEBUG
936 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"\n");
937 SCIPdebugMessage(
"ATTENTION: BConeView shows the WRONG sign for the lower bound!\n");
938 BConeView(sdpisolver->bcone);
942 for (block = 0; block < nsdpblocks; ++block)
945 if ( blockindchanges[block] > -1 )
948 DSDP_CALL( SDPConeSetBlockSize(sdpisolver->sdpcone, block- blockindchanges[block], sdpblocksizes[block] - nremovedinds[block]) );
966 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
969 for (block = 0; block < nsdpblocks; block++)
970 nrnonz += sdpblocksizes[block] - nremovedinds[block];
971 assert( nrnonz >= 0 );
974 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz + nrnonz) );
976 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz + nrnonz) );
981 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz) );
983 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz) );
988 for (block = 0; block < nsdpblocks; block++)
990 for (i = 0; i < sdpisolver->nactivevars; i++)
993 v = sdpisolver->dsdptoinputmapper[i];
997 for (k = 0; k < sdpnblockvars[block]; k++)
999 if ( v == sdpvar[block][k] )
1008 if ( blockvar > -1 )
1010 for (k = 0; k < sdpnblockvarnonz[block][blockvar]; k++)
1013 assert( indchanges[block][sdprow[block][blockvar][k]] > -1 && indchanges[block][sdpcol[block][blockvar][k]] > -1 );
1016 dsdpind[ind] =
compLowerTriangPos(sdprow[block][blockvar][k] - indchanges[block][sdprow[block][blockvar][k]],
1017 sdpcol[block][blockvar][k] - indchanges[block][sdpcol[block][blockvar][k]]);
1018 dsdpval[ind] = -1.0 * sdpval[block][blockvar][k];
1023 SCIPsortIntReal(dsdpind + startind, dsdpval + startind, sdpnblockvarnonz[block][blockvar]);
1025 assert( blockindchanges[block] > -1 );
1029 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], i + 1, sdpblocksizes[block] - nremovedinds[block],
1030 1.0, 0, dsdpind + startind,dsdpval + startind, sdpnblockvarnonz[block][blockvar]));
1035 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1039 for (block = 0; block < nsdpblocks; block++)
1041 if ( blockindchanges[block] > -1 )
1043 for (i = 0; i < sdpblocksizes[block] - nremovedinds[block]; i++)
1046 dsdpval[ind] = -1.0;
1049 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], sdpisolver->nactivevars + 1,
1050 sdpblocksizes[block] - nremovedinds[block], 1.0, 0, dsdpind + ind - (sdpblocksizes[block] - nremovedinds[block]) ,
1051 dsdpval + ind - (sdpblocksizes[block] - nremovedinds[block]), sdpblocksizes[block] - nremovedinds[block]) );
1054 assert( ind - startind == nrnonz );
1059 if ( sdpconstnnonz > 0 )
1061 assert( nsdpblocks > 0 );
1062 assert( sdpconstnblocknonz!= NULL );
1063 assert( sdpconstcol != NULL );
1064 assert( sdpconstrow != NULL );
1065 assert( sdpconstval != NULL );
1072 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpconstind, sdpconstnnonz) );
1074 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpconstval, sdpconstnnonz) );
1078 for (block = 0; block < nsdpblocks; block++)
1082 if ( sdpconstnblocknonz[block] > 0 )
1085 for (i = 0; i < sdpconstnblocknonz[block]; i++)
1088 assert( indchanges[block][sdpconstrow[block][i]] > -1 && indchanges[block][sdpconstcol[block][i]] > -1 );
1091 dsdpconstind[ind] =
compLowerTriangPos(sdpconstrow[block][i] - indchanges[block][sdpconstrow[block][i]],
1092 sdpconstcol[block][i] - indchanges[block][sdpconstcol[block][i]]);
1093 dsdpconstval[ind] = -1 * sdpconstval[block][i];
1098 SCIPsortIntReal(dsdpconstind + startind, dsdpconstval + startind, sdpconstnblocknonz[block]);
1100 assert( blockindchanges[block] > -1 );
1104 DSDP_CALL( SDPConeSetASparseVecMat(sdpisolver->sdpcone, block - blockindchanges[block], 0, sdpblocksizes[block] - nremovedinds[block],
1105 1.0, 0, dsdpconstind + startind, dsdpconstval + startind, ind - startind));
1110 #ifdef SCIP_MORE_DEBUG
1111 SDPConeView2(sdpisolver->sdpcone);
1123 assert( noldlpcons > 0 );
1124 assert( lprhs != NULL );
1125 assert( lpcol != NULL );
1126 assert( lprow != NULL );
1127 assert( lpval != NULL );
1130 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &rowmapper, 2*noldlpcons) );
1135 for (i = 0; i < noldlpcons; i++)
1137 if ( rownactivevars[i] >= 2 )
1141 rowmapper[2*i] = pos;
1145 rowmapper[2*i] = -1;
1149 rowmapper[2*i + 1] = pos;
1153 rowmapper[2*i + 1] = -1;
1159 rowmapper[2*i] = -1;
1160 rowmapper[2*i + 1] = -1;
1164 assert( nlpineqs <= 2*nlpcons );
1171 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1173 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 3) );
1177 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 2) );
1187 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1189 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, 2 * nlpineqs + 2*lpnnonz) );
1193 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, nlpineqs + 2*lpnnonz) );
1198 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1200 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs) );
1204 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars) );
1216 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1218 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, 2 * nlpineqs + 2*lpnnonz) );
1222 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, nlpineqs + 2*lpnnonz) );
1227 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1229 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs) );
1233 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars) );
1241 for (i = 0; i < nlpcons; i++)
1245 if ( REALABS(lplhs[i]) > sdpisolver->epsilon )
1247 dsdplprow[dsdpnlpnonz] = pos;
1248 dsdplpval[dsdpnlpnonz] = -lplhs[i];
1255 if ( REALABS(lprhs[i]) > sdpisolver->epsilon )
1257 dsdplprow[dsdpnlpnonz] = pos;
1258 dsdplpval[dsdpnlpnonz] = lprhs[i];
1264 assert( pos == nlpineqs );
1269 if ( REALABS(sdpisolver->objlimit) > sdpisolver->epsilon )
1271 dsdplprow[dsdpnlpnonz] = nlpcons;
1272 dsdplpval[dsdpnlpnonz] = sdpisolver->objlimit;
1284 dsdplpbegcol[0] = 0;
1285 for (i = 0; i < lpnnonz; i++)
1288 if ( lpcol[i] >= nextcol )
1293 for (j = nextcol; j <= lpcol[i]; j++)
1295 if ( sdpisolver->inputtodsdpmapper[j] >= 0 )
1297 assert( ! (
isFixed(sdpisolver, lb[j], ub[j])) );
1298 dsdplpbegcol[sdpisolver->inputtodsdpmapper[j]] = dsdpnlpnonz;
1303 dsdplprow[dsdpnlpnonz] = nlpcons;
1304 dsdplpval[dsdpnlpnonz] = obj[j];
1313 if ( !
isFixed(sdpisolver, lb[lpcol[i]], ub[lpcol[i]]) )
1316 if ( rowmapper[2*lprow[i]] > -1 )
1320 dsdplprow[dsdpnlpnonz] = rowmapper[2*lprow[i]];
1321 dsdplpval[dsdpnlpnonz] = -lpval[i];
1325 if ( rowmapper[2*lprow[i] + 1] > -1 )
1329 dsdplprow[dsdpnlpnonz] = rowmapper[2*lprow[i] + 1];
1330 dsdplpval[dsdpnlpnonz] = lpval[i];
1337 assert(
isFixed(sdpisolver, lb[lpcol[i]], ub[lpcol[i]]) || rownactivevars[lprow[i]] == 1 );
1342 for (j = nextcol; j < nvars; j++)
1344 if ( sdpisolver->inputtodsdpmapper[j] >= 0 )
1346 assert( ! (
isFixed(sdpisolver, lb[j], ub[j])) );
1347 dsdplpbegcol[sdpisolver->inputtodsdpmapper[j]] = dsdpnlpnonz;
1351 dsdplprow[dsdpnlpnonz] = nlpcons;
1352 dsdplpval[dsdpnlpnonz] = obj[j];
1358 dsdplpbegcol[sdpisolver->nactivevars + 1] = dsdpnlpnonz;
1361 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1363 for (i = 0; i < nlpineqs; i++)
1365 dsdplprow[dsdpnlpnonz] = i;
1366 dsdplpval[dsdpnlpnonz] = -1.0;
1369 dsdplpbegcol[sdpisolver->nactivevars + 2] = dsdpnlpnonz;
1373 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &rowmapper);
1378 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1380 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, 2*nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1381 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, 2*nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1385 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1386 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, nlpineqs + 2*lpnnonz, dsdpnlpnonz) );
1391 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1393 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs, dsdpnlpnonz) );
1394 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars + nlpineqs, dsdpnlpnonz) );
1398 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, (nlpineqs + 1) + 2*lpnnonz + nvars, dsdpnlpnonz) );
1399 BMS_CALL( BMSreallocBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, (nlpineqs + 1) + 2*lpnnonz + nvars, dsdpnlpnonz) );
1406 DSDP_CALL( LPConeSetData(sdpisolver->lpcone, nlpineqs, dsdplpbegcol, dsdplprow, dsdplpval) );
1410 DSDP_CALL( LPConeSetData(sdpisolver->lpcone, nlpineqs + 1, dsdplpbegcol, dsdplprow, dsdplpval) );
1412 #ifdef SCIP_MORE_DEBUG
1413 LPConeView(sdpisolver->lpcone);
1417 SCIPdebugMessage(
"Calling DSDP-Solve for SDP (%d) \n", sdpisolver->sdpcounter);
1419 DSDP_CALL( DSDPSetGapTolerance(sdpisolver->dsdp, sdpisolver->gaptol) );
1420 DSDP_CALL( DSDPSetRTolerance(sdpisolver->dsdp, sdpisolver->sdpsolverfeastol) );
1421 if ( sdpisolver-> sdpinfo )
1423 DSDP_CALL( DSDPSetStandardMonitor(sdpisolver->dsdp, 1) );
1427 if ( penaltyparam >= sdpisolver->epsilon && rbound )
1429 DSDP_CALL( DSDPSetPenaltyParameter(sdpisolver->dsdp, penaltyparam) );
1430 DSDP_CALL( DSDPUsePenalty(sdpisolver->dsdp, 1) );
1435 DSDP_CALL( DSDPSetPenaltyParameter(sdpisolver->dsdp, sdpisolver->penaltyparam) );
1439 if ( starty != NULL )
1441 for (i = 0; i < sdpisolver->nactivevars; i++)
1443 DSDP_CALL( DSDPSetY0(sdpisolver->dsdp, i + 1, starty[sdpisolver->dsdptoinputmapper[i]]) );
1455 if ( sdpisolver->preoptimalgap >= 0.0 )
1459 DSDP_CALL( DSDPSolve(sdpisolver->dsdp) );
1461 sdpisolver->nsdpcalls++;
1462 DSDP_CALL( DSDPGetIts(sdpisolver->dsdp, &(sdpisolver->niterations)) );
1465 if ( timings.stopped )
1467 sdpisolver->timelimit = TRUE;
1468 sdpisolver->solved = FALSE;
1472 sdpisolver->timelimit = FALSE;
1473 DSDP_CALL( DSDPComputeX(sdpisolver->dsdp) );
1474 sdpisolver->solved = TRUE;
1479 feastol = sdpisolver->sdpsolverfeastol;
1483 SCIP_Real* solvector;
1485 SCIP_Bool infeasible;
1489 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &solvector, nvars) );
1490 nvarspointer = nvars;
1492 assert( nvarspointer == nvars );
1495 SCIP_CALL(
SCIPsdpSolcheckerCheck(sdpisolver->bufmem, nvars, lb, ub, nsdpblocks, sdpblocksizes, sdpnblockvars, sdpconstnnonz,
1496 sdpconstnblocknonz, sdpconstrow, sdpconstcol, sdpconstval, sdpnnonz, sdpnblockvarnonz, sdpvar, sdprow, sdpcol, sdpval,
1497 indchanges, nremovedinds, blockindchanges, nlpcons, noldlpcons, lplhs, lprhs, rownactivevars, lpnnonz, lprow, lpcol, lpval,
1498 solvector, sdpisolver->feastol, sdpisolver->epsilon, &infeasible) );
1500 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &solvector);
1504 SCIPdebugMessage(
"Solution feasible for DSDP but outside feasibility tolerance, changing SDPA feasibility tolerance from %f to %f\n",
1511 DSDP_CALL( DSDPSetRTolerance(sdpisolver->dsdp, feastol) );
1513 DSDP_CALL( DSDPSolve(sdpisolver->dsdp) );
1516 sdpisolver->nsdpcalls++;
1517 DSDP_CALL( DSDPGetIts(sdpisolver->dsdp, &newiterations) );
1518 sdpisolver->niterations += newiterations;
1521 if ( timings.stopped )
1523 sdpisolver->timelimit = TRUE;
1524 sdpisolver->solved = FALSE;
1528 sdpisolver->timelimit = FALSE;
1529 DSDP_CALL( DSDPComputeX(sdpisolver->dsdp) );
1530 sdpisolver->solved = TRUE;
1535 sdpisolver->solved = FALSE;
1536 SCIPmessagePrintInfo(sdpisolver->messagehdlr,
"SDPA failed to reach required feasibility tolerance! \n");
1544 if ( sdpconstnnonz > 0 )
1546 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpconstval, sdpconstnnonz);
1547 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpconstind, sdpconstnnonz);
1552 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1554 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz + nrnonz);
1555 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz + nrnonz);
1559 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpval, sdpnnonz);
1560 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpind, sdpnnonz);
1564 if ( nlpcons > 0 || lpnnonz > 0 )
1566 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpval, dsdpnlpnonz);
1567 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplprow, dsdpnlpnonz);
1568 if ( penaltyparam > sdpisolver->epsilon && (! rbound) )
1570 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 3);
1574 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdplpbegcol, sdpisolver->nactivevars + 2);
1579 DSDP_CALL( DSDPStopReason(sdpisolver->dsdp, &reason) );
1583 case DSDP_CONVERGED:
1584 SCIPdebugMessage(
"DSDP converged!\n");
1587 case DSDP_INFEASIBLE_START:
1588 SCIPdebugMessage(
"DSDP started with an infeasible point!\n");
1591 case DSDP_SMALL_STEPS:
1592 SCIPdebugMessage(
"Short step lengths created by numerical difficulties prevented progress in DSDP!\n");
1595 case DSDP_INDEFINITE_SCHUR_MATRIX:
1596 SCIPdebugMessage(
"Schur Matrix in DSDP was indefinite but should have been positive semidefinite!\n");
1600 SCIPdebugMessage(
"DSDP reached maximum number of iterations!\n");
1603 case DSDP_NUMERICAL_ERROR:
1604 SCIPdebugMessage(
"A numerical error occured in DSDP!\n");
1607 case DSDP_UPPERBOUND:
1608 SCIPdebugMessage(
"Dual objective value in DSDP reached upper bound.\n");
1611 case DSDP_USER_TERMINATION:
1612 SCIPdebugMessage(
"DSDP didn't stop solving, did you?\n");
1615 case CONTINUE_ITERATING:
1616 SCIPdebugMessage(
"DSDP wants to continue iterating but somehow was stopped!\n");
1620 SCIPdebugMessage(
"Unknown stopping reason in DSDP!\n");
1625 if ( penaltyparam >= sdpisolver->epsilon && sdpisolver->solved )
1633 DSDP_CALL( DSDPGetR(sdpisolver->dsdp, &rval) );
1635 *feasorig = (rval < sdpisolver->feastol );
1640 sdpisolver->feasorig = *feasorig;
1647 if ( penaltybound != NULL )
1649 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", rval);
1652 DSDP_CALL( DSDPGetTraceX(sdpisolver->dsdp, &trace) );
1655 assert( trace < penaltyparam + sdpisolver->feastol );
1661 *penaltybound = TRUE;
1662 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1663 trace, penaltyparam);
1666 *penaltybound = FALSE;
1677 BMS_CALL( BMSallocBufferMemoryArray(sdpisolver->bufmem, &dsdpsol, sdpisolver->nactivevars + 1) );
1679 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, sdpisolver->nactivevars + 1) );
1681 *feasorig = (dsdpsol[sdpisolver->nactivevars] < sdpisolver->feastol);
1686 if ( penaltybound != NULL )
1688 SCIPdebugMessage(
"Solution not feasible in original problem, r = %f\n", dsdpsol[sdpisolver->nactivevars]);
1691 DSDP_CALL( DSDPGetTraceX(sdpisolver->dsdp, &trace) );
1694 assert( trace < penaltyparam + sdpisolver->feastol );
1700 *penaltybound = TRUE;
1701 SCIPdebugMessage(
"Tr(X) = %f == %f = Gamma, penalty formulation not exact, Gamma should be increased or problem is infeasible\n",
1702 trace, penaltyparam);
1705 *penaltybound = FALSE;
1710 BMSfreeBufferMemoryArray(sdpisolver->bufmem, &dsdpsol);
1733 assert( sdpisolver != NULL );
1734 return sdpisolver->solved;
1747 DSDPSolutionType pdfeasible;
1749 assert( sdpisolver != NULL );
1752 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1754 if ( pdfeasible == DSDP_PDUNKNOWN )
1763 SCIP_Bool* primalfeasible,
1764 SCIP_Bool* dualfeasible
1767 DSDPSolutionType pdfeasible;
1769 assert( sdpisolver != NULL );
1770 assert( primalfeasible != NULL );
1771 assert( dualfeasible != NULL );
1774 DSDP_CALL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1776 switch ( pdfeasible )
1778 case DSDP_PDFEASIBLE:
1779 *primalfeasible = TRUE;
1780 *dualfeasible = TRUE;
1783 case DSDP_UNBOUNDED:
1784 *primalfeasible = FALSE;
1785 *dualfeasible = TRUE;
1788 case DSDP_INFEASIBLE:
1789 *primalfeasible = TRUE;
1790 *dualfeasible = FALSE;
1794 SCIPerrorMessage(
"DSDP doesn't know if primal and dual solutions are feasible\n");
1795 return SCIP_LPERROR;
1807 DSDPSolutionType pdfeasible;
1809 assert( sdpisolver != NULL );
1812 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1813 if ( pdfeasible == DSDP_PDUNKNOWN )
1818 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible.");
1821 else if ( pdfeasible == DSDP_INFEASIBLE )
1833 DSDPSolutionType pdfeasible;
1835 assert( sdpisolver != NULL );
1838 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1839 if ( pdfeasible == DSDP_PDUNKNOWN )
1844 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1847 else if ( pdfeasible == DSDP_UNBOUNDED )
1859 DSDPSolutionType pdfeasible;
1861 assert( sdpisolver != NULL );
1864 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1865 if ( pdfeasible == DSDP_PDUNKNOWN )
1867 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1870 else if ( pdfeasible == DSDP_UNBOUNDED )
1882 DSDPSolutionType pdfeasible;
1884 assert( sdpisolver != NULL );
1887 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1888 if ( pdfeasible == DSDP_PDUNKNOWN )
1890 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1893 else if ( pdfeasible == DSDP_UNBOUNDED )
1905 DSDPSolutionType pdfeasible;
1907 assert( sdpisolver != NULL );
1910 DSDP_CALL_BOOL(DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible));
1912 if ( pdfeasible == DSDP_PDUNKNOWN )
1914 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1917 else if ( pdfeasible == DSDP_INFEASIBLE )
1929 DSDPSolutionType pdfeasible;
1931 assert( sdpisolver != NULL );
1934 DSDP_CALL_BOOL( DSDPGetSolutionType(sdpisolver->dsdp, &pdfeasible) );
1936 if ( pdfeasible == DSDP_PDUNKNOWN )
1938 SCIPdebugMessage(
"DSDP doesn't know if primal and dual solutions are feasible");
1941 else if ( pdfeasible == DSDP_INFEASIBLE )
1952 DSDPTerminationReason reason;
1954 assert( sdpisolver != NULL );
1956 if ( sdpisolver->timelimit )
1959 if ( ! sdpisolver->solved )
1964 if ( reason == DSDP_CONVERGED )
1975 SCIPdebugMessage(
"Method not implemented for DSDP, as objective limit is given as an ordinary LP-constraint, so in case the objective limit was "
1976 "exceeded, the problem will be reported as infeasible ! \n");
1986 DSDPTerminationReason reason;
1988 assert( sdpisolver != NULL );
1993 if ( reason == DSDP_MAX_IT )
2004 assert( sdpisolver != NULL );
2006 return sdpisolver->timelimit;
2023 DSDPTerminationReason reason;
2026 assert( sdpisolver != NULL );
2028 if ( sdpisolver->dsdp == NULL || (! sdpisolver->solved) )
2031 if ( sdpisolver->timelimit )
2034 dsdpreturn = DSDPStopReason(sdpisolver->dsdp, &reason);
2036 if (dsdpreturn != 0)
2038 SCIPerrorMessage(
"DSDP-Error <%d> in function call.\n", dsdpreturn);
2044 case DSDP_CONVERGED:
2047 case DSDP_INFEASIBLE_START:
2050 case DSDP_SMALL_STEPS:
2053 case DSDP_INDEFINITE_SCHUR_MATRIX:
2059 case DSDP_NUMERICAL_ERROR:
2062 case DSDP_UPPERBOUND:
2065 case DSDP_USER_TERMINATION:
2078 assert( sdpisolver != NULL );
2088 assert( sdpisolver != NULL );
2099 SCIPdebugMessage(
"Not implemented yet\n");
2100 return SCIP_LPERROR;
2112 assert( sdpisolver != NULL );
2113 assert( objval != NULL );
2116 dsdpnvars = sdpisolver->penaltyworbound ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars;
2118 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2122 DSDP_CALL( DSDPGetDObjective(sdpisolver->dsdp, objval) );
2123 *objval = -1*(*objval);
2131 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars) );
2132 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, dsdpnvars) );
2136 for (v = 0; v < sdpisolver->nactivevars; v++)
2137 *objval += sdpisolver->objcoefs[v] * dsdpsol[v];
2141 *objval += sdpisolver->fixedvarsobjcontr;
2143 if ( ( ! sdpisolver->penalty ) || sdpisolver->feasorig )
2145 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars);
2167 assert( sdpisolver != NULL );
2168 assert( dualsollength != NULL );
2171 dsdpnvars = sdpisolver->penaltyworbound ? sdpisolver->nactivevars + 1 : sdpisolver->nactivevars;
2173 if ( *dualsollength > 0 )
2175 assert( dualsol != NULL );
2176 if ( *dualsollength < sdpisolver->nvars )
2178 SCIPdebugMessage(
"The given array in SCIPsdpiSolverGetSol only had length %d, but %d was needed", *dualsollength, sdpisolver->nvars);
2179 *dualsollength = sdpisolver->nvars;
2184 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars) );
2185 DSDP_CALL( DSDPGetY(sdpisolver->dsdp, dsdpsol, dsdpnvars) );
2188 for (v = 0; v < sdpisolver->nvars; v++)
2190 if (sdpisolver->inputtodsdpmapper[v] > -1)
2193 dualsol[v] = dsdpsol[sdpisolver->inputtodsdpmapper[v] - 1];
2198 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtodsdpmapper[v]) - 1];
2202 if ( objval != NULL )
2204 if ( sdpisolver->penalty && ( ! sdpisolver->feasorig ))
2208 DSDP_CALL( DSDPGetDObjective(sdpisolver->dsdp, objval) );
2209 *objval = -1*(*objval);
2215 for (v = 0; v < sdpisolver->nactivevars; v++)
2216 *objval += sdpisolver->objcoefs[v] * dsdpsol[v];
2220 *objval += sdpisolver->fixedvarsobjcontr;
2223 BMSfreeBlockMemoryArray(sdpisolver->blkmem, &dsdpsol, dsdpnvars);
2225 else if ( objval != NULL )
2237 int* startXnblocknonz
2241 SCIPdebugMessage(
"Not implemented yet\n");
2243 return SCIP_PLUGINNOTFOUND;
2260 int* startXnblocknonz,
2264 SCIP_Real** startXval
2269 assert( sdpisolver != NULL );
2270 assert( success != NULL );
2271 assert( dualsol != NULL );
2272 assert( dualsollength != NULL );
2273 assert( *dualsollength >= 0 );
2276 assert( nblocks == -1 );
2278 if ( ! sdpisolver->preoptimalsolexists )
2280 SCIPdebugMessage(
"Failed to retrieve preoptimal solution for warmstarting purposes. \n");
2285 if ( *dualsollength < sdpisolver->nvars )
2287 SCIPdebugMessage(
"Insufficient memory in SCIPsdpiSolverGetPreoptimalSol: needed %d, given %d\n", sdpisolver->nvars, *dualsollength);
2289 *dualsollength = sdpisolver->nvars;
2293 for (v = 0; v < sdpisolver->nvars; v++)
2295 if (sdpisolver->inputtodsdpmapper[v] > -1)
2298 dualsol[v] = sdpisolver->preoptimalsol[sdpisolver->inputtodsdpmapper[v] - 1];
2303 dualsol[v] = sdpisolver->fixedvarsval[(-1 * sdpisolver->inputtodsdpmapper[v]) - 1];
2308 *dualsollength = sdpisolver->nvars;
2329 SCIP_Real* lbvarsdsdp;
2330 SCIP_Real* ubvarsdsdp;
2333 assert( sdpisolver != NULL );
2334 assert( lbvars != NULL );
2335 assert( ubvars != NULL );
2336 assert( arraylength != NULL );
2337 assert( *arraylength >= 0 );
2341 if ( *arraylength < sdpisolver->nvars )
2343 *arraylength = sdpisolver->nvars;
2344 SCIPdebugMessage(
"Insufficient length of array in SCIPsdpiSolverGetPrimalBoundVars (gave %d, needed %d)\n", *arraylength, sdpisolver->nvars);
2349 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &lbvarsdsdp, sdpisolver->nactivevars) );
2350 BMS_CALL( BMSallocBlockMemoryArray(sdpisolver->blkmem, &ubvarsdsdp, sdpisolver->nactivevars) );
2353 DSDP_CALL( BConeCopyX(sdpisolver->bcone, lbvarsdsdp, ubvarsdsdp, sdpisolver->nactivevars) );
2356 for (i = 0; i < sdpisolver->nvars; i++)
2358 if ( sdpisolver->inputtodsdpmapper[i] < 0 )
2367 lbvars[i] = lbvarsdsdp[sdpisolver->inputtodsdpmapper[i] - 1];
2368 ubvars[i] = ubvarsdsdp[sdpisolver->inputtodsdpmapper[i] - 1];
2373 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &ubvarsdsdp, sdpisolver->nactivevars);
2374 BMSfreeBlockMemoryArrayNull(sdpisolver->blkmem, &lbvarsdsdp, sdpisolver->nactivevars);
2383 int* startXnblocknonz
2386 SCIPdebugMessage(
"Not implemented yet\n");
2387 return SCIP_LPERROR;
2397 int* startXnblocknonz,
2401 SCIP_Real** startXval
2404 SCIPdebugMessage(
"Not implemented yet\n");
2405 return SCIP_LPERROR;
2413 SCIPdebugMessage(
"Not implemented yet\n");
2414 return SCIP_LPERROR;
2423 assert( sdpisolver != NULL );
2424 assert( iterations != NULL );
2426 if ( sdpisolver->timelimitinitial )
2429 *iterations = sdpisolver->niterations;
2440 assert( sdpisolver != NULL );
2441 assert( calls != NULL );
2443 if ( sdpisolver->timelimitinitial )
2446 *calls = sdpisolver->nsdpcalls;
2457 assert( sdpisolver != NULL );
2458 assert( usedsetting != NULL );
2463 *usedsetting = sdpisolver->usedsetting;
2504 assert( sdpisolver != NULL );
2505 assert( dval != NULL );
2510 *dval = sdpisolver->epsilon;
2513 *dval = sdpisolver->gaptol;
2516 *dval = sdpisolver->feastol;
2519 *dval = sdpisolver->sdpsolverfeastol;
2522 *dval = sdpisolver->penaltyparam;
2525 *dval = sdpisolver->objlimit;
2528 *dval = sdpisolver->preoptimalgap;
2531 return SCIP_PARAMETERUNKNOWN;
2544 assert( sdpisolver != NULL );
2549 sdpisolver->epsilon = dval;
2550 SCIPdebugMessage(
"Setting sdpisolver epsilon to %f.\n", dval);
2553 sdpisolver->gaptol = dval;
2554 SCIPdebugMessage(
"Setting sdpisolver gaptol to %f.\n", dval);
2557 sdpisolver->feastol = dval;
2558 SCIPdebugMessage(
"Setting sdpisolver feastol to %f.\n", dval);
2561 sdpisolver->sdpsolverfeastol = dval;
2562 SCIPdebugMessage(
"Setting sdpisolver sdpsolverfeastol to %f.\n", dval);
2565 sdpisolver->penaltyparam = dval;
2566 SCIPdebugMessage(
"Setting sdpisolver penaltyparameter to %f.\n", dval);
2569 SCIPdebugMessage(
"Setting sdpisolver objlimit to %f.\n", dval);
2570 sdpisolver->objlimit = dval;
2573 SCIPdebugMessage(
"Parameter SCIP_SDPPAR_LAMBDASTAR not used by DSDP");
2576 SCIPdebugMessage(
"Setting sdpisolver preoptgap to %f.\n", dval);
2577 sdpisolver->preoptimalgap = dval;
2580 return SCIP_PARAMETERUNKNOWN;
2593 assert( sdpisolver != NULL );
2598 *ival = (int) sdpisolver->sdpinfo;
2599 SCIPdebugMessage(
"Getting sdpisolver information output (%d).\n", *ival);
2602 return SCIP_PARAMETERUNKNOWN;
2615 assert( sdpisolver != NULL );
2620 sdpisolver->sdpinfo = (SCIP_Bool) ival;
2621 SCIPdebugMessage(
"Setting sdpisolver information output (%d).\n", ival);
2624 return SCIP_PARAMETERUNKNOWN;
2636 SCIPdebugMessage(
"Lambdastar parameter not used by DSDP");
2645 SCIP_Real* penaltyparam
2650 assert( sdpisolver != NULL );
2651 assert( penaltyparam != NULL );
2669 SCIPdebugMessage(
"Setting penaltyparameter to %f.\n", compval);
2670 sdpisolver->penaltyparam = compval;
2671 *penaltyparam = compval;
2679 SCIP_Real penaltyparam,
2680 SCIP_Real* maxpenaltyparam
2685 assert( sdpisolver != NULL );
2686 assert( maxpenaltyparam != NULL );
2692 *maxpenaltyparam = compval;
2693 SCIPdebugMessage(
"Setting maximum penaltyparameter to %f.\n", compval);
2702 if ( sdpisolver->penaltyparam > *maxpenaltyparam )
2704 SCIPdebugMessage(
"Decreasing penaltyparameter of %f to maximum penalty paramater of %f.\n", sdpisolver->penaltyparam, *maxpenaltyparam);
2705 sdpisolver->penaltyparam = *maxpenaltyparam;
2728 SCIPdebugMessage(
"Not implemented yet\n");
2729 return SCIP_LPERROR;
2738 SCIPdebugMessage(
"Not implemented yet\n");
2739 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)