47 #define SLATERSOLVED_ABSOLUTE 65 #define RELAX_NAME "SDP" 66 #define RELAX_DESC "SDP-relaxator" 67 #define RELAX_PRIORITY 1 71 #define DEFAULT_PENALTYPARAM -1.0 72 #define DEFAULT_LAMBDASTAR -1.0 73 #define DEFAULT_MAXPENALTYPARAM -1.0 74 #define DEFAULT_WARMSTARTIPFACTOR 0.50 75 #define DEFAULT_WARMSTARTPRIMALTYPE 3 76 #define DEFAULT_WARMSTARTIPTYPE 1 77 #define DEFAULT_WARMSTARTPROJECT 2 78 #define DEFAULT_WARMSTARTPROJMINEV -1.0 79 #define DEFAULT_WARMSTARTPROJPDSAME TRUE 80 #define DEFAULT_WARMSTART_PREOPTIMAL_SOL FALSE 81 #define DEFAULT_WARMSTARTPREOPTGAP 1e-2 82 #define DEFAULT_WARMSTARTROUNDONLYINF FALSE 83 #define DEFAULT_SLATERCHECK 0 84 #define DEFAULT_OBJLIMIT FALSE 85 #define DEFAULT_RESOLVE TRUE 86 #define DEFAULT_TIGHTENVB TRUE 87 #define DEFAULT_SDPINFO FALSE 88 #define DEFAULT_WARMSTART FALSE 89 #define DEFAULT_DISPLAYSTAT FALSE 90 #define DEFAULT_SETTINGSRESETFREQ -1 91 #define DEFAULT_SETTINGSRESETOFS 0 92 #define DEFAULT_SDPSOLVERTHREADS -1 93 #define DEFAULT_PENINFEASADJUST 10.0 95 #define WARMSTART_MINVAL 0.01 96 #define WARMSTART_PROJ_MINRHSOBJ 1 97 #define WARMSTART_PROJ_FACTOR 0.1 98 #define WARMSTART_PROJ_FACTOR_LHS 10 99 #define WARMSTART_PROJ_FACTOR_PRIMAL 0.1 100 #define WARMSTART_PREOPT_MIN_Z_LPVAL 0.01 108 struct SCIP_RelaxData
115 SCIP_Bool origsolved;
116 SCIP_Bool probingsolved;
117 long int lastsdpnode;
120 SCIP_Real sdpsolvergaptol;
121 SCIP_Real sdpsolverfeastol;
122 SCIP_Real penaltyparam;
123 SCIP_Real maxpenaltyparam;
124 SCIP_Real lambdastar;
126 SCIP_Real peninfeasadjust;
129 SCIP_Bool displaystat;
133 int settingsresetfreq;
134 int settingsresetofs;
135 int sdpsolverthreads;
138 int sdpinterfacecalls;
151 int unstablenoslater;
154 int unsolvednoslater;
157 int nslatercheckfailed;
161 int npslatercheckfailed;
164 int ndslatercheckfailed;
165 int nslaterinfeasible;
166 int stableinfeasible;
167 int unstableinfeasible;
168 int penaltyinfeasible;
169 int boundedinfeasible;
170 int unsolvedinfeasible;
172 int primalroundfails;
174 int roundstartsuccess;
177 SCIP_CLOCK* roundingprobtime;
179 SCIP_Real warmstartipfactor;
180 int warmstartprimaltype;
182 int warmstartproject;
183 SCIP_Real warmstartpmevprimalpar;
184 SCIP_Real warmstartpmevdualpar;
185 SCIP_Real warmstartprojminevprimal;
186 SCIP_Real warmstartprojminevdual;
187 SCIP_Bool warmstartprojpdsame;
189 SCIP_Bool warmstartpreoptsol;
190 SCIP_Real warmstartpreoptgap;
191 SCIP_Bool warmstartroundonlyinf;
207 SCIP_CONSHDLR* sdpconshdlr;
208 SCIP_CONSHDLR* sdprank1conshdlr;
225 assert( nnonz >= 0 );
226 assert( row != NULL );
227 assert( col != NULL );
228 assert( val != NULL );
229 assert( fullmat != NULL );
231 matrixsize = blocksize * blocksize;
234 for (i = 0; i < matrixsize; i++)
237 for (i = 0; i < nnonz; i++)
239 assert( row[i] * blocksize + col[i] <= matrixsize );
240 fullmat[row[i] * blocksize + col[i]] = val[i];
241 assert( col[i] * blocksize + row[i] <= matrixsize );
242 fullmat[col[i] * blocksize + row[i]] = val[i];
259 assert( blocksize >= 0 );
260 assert( matrix != NULL );
261 assert( scale != NULL );
263 for (r = 0; r < blocksize; r++)
265 for (c = 0; c < blocksize; c++)
267 matrix[r * blocksize + c] *= scale[c];
277 SCIP_RELAXDATA* relaxdata
287 assert( relaxdata != NULL );
290 relaxdata->sdpinterfacecalls++;
294 if ( naddedsdpcalls == 0 )
297 relaxdata->sdpcalls += naddedsdpcalls;
301 relaxdata->sdpiterations += naddediters;
305 switch ( usedsetting )
308 relaxdata->solvedpenalty++;
311 relaxdata->solvedfast++;
314 relaxdata->solvedmedium++;
317 relaxdata->solvedstable++;
320 relaxdata->unsolved++;
327 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
328 switch ( primalslater )
331 relaxdata->npslatercheckfailed++;
332 switch ( dualslater )
335 relaxdata->ndslatercheckfailed++;
336 relaxdata->nslatercheckfailed++;
339 relaxdata->ndnoslater++;
340 relaxdata->nnoslater++;
343 relaxdata->ndslaterholds++;
344 relaxdata->nslatercheckfailed++;
347 relaxdata->nslaterinfeasible++;
350 relaxdata->ndslatercheckfailed++;
351 relaxdata->nslatercheckfailed++;
357 relaxdata->npnoslater++;
358 switch ( dualslater )
361 relaxdata->ndslatercheckfailed++;
362 relaxdata->nnoslater++;
365 relaxdata->ndnoslater++;
366 relaxdata->nnoslater++;
369 relaxdata->ndslaterholds++;
370 relaxdata->nnoslater++;
373 relaxdata->nslaterinfeasible++;
376 relaxdata->ndslatercheckfailed++;
377 relaxdata->nnoslater++;
383 relaxdata->npslaterholds++;
384 switch ( dualslater )
387 relaxdata->ndslatercheckfailed++;
388 relaxdata->nslatercheckfailed++;
391 relaxdata->ndnoslater++;
392 relaxdata->nnoslater++;
395 relaxdata->ndslaterholds++;
396 relaxdata->nslaterholds++;
399 relaxdata->nslaterinfeasible++;
402 relaxdata->ndslatercheckfailed++;
403 relaxdata->nslatercheckfailed++;
409 relaxdata->npslatercheckfailed++;
410 relaxdata->ndslatercheckfailed++;
411 relaxdata->nslatercheckfailed++;
417 switch ( slatersetting )
420 relaxdata->stablewslater++;
423 relaxdata->unstablewslater++;
426 relaxdata->penaltywslater++;
429 relaxdata->boundedwslater++;
432 relaxdata->unsolvedwslater++;
435 relaxdata->stablenoslater++;
438 relaxdata->unstablenoslater++;
441 relaxdata->penaltynoslater++;
444 relaxdata->boundednoslater++;
447 relaxdata->unsolvednoslater++;
450 relaxdata->stableinfeasible++;
453 relaxdata->unstableinfeasible++;
456 relaxdata->penaltyinfeasible++;
459 relaxdata->boundedinfeasible++;
462 relaxdata->unsolvedinfeasible++;
478 SCIP_Bool boundprimal
481 SCIP_CONSHDLR* conshdlr;
482 const char* conshdlrname;
484 SCIP_VAR** blockvars;
487 SCIP_Real** constval;
499 int* nconstblocknonz;
500 int constnnonzcounter;
513 assert( scip != NULL );
514 assert( sdpi != NULL );
515 assert( varmapper != NULL );
517 SCIPdebugMsg(scip,
"Putting SDP Data in general SDP interface!\n");
519 vars = SCIPgetVars(scip);
520 nvars = SCIPgetNVars(scip);
521 nvarspen = boundprimal ? nvars + 1 : nvars;
524 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvarspen) );
525 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvarspen) );
526 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvarspen) );
528 for (i = 0; i < nvars; i++)
530 obj[i] = SCIPvarGetObj(vars[i]);
531 lb[i] = SCIPvarGetLbLocal(vars[i]);
532 ub[i] = SCIPvarGetUbLocal(vars[i]);
539 ub[nvars] = SCIPinfinity(scip);
542 nconss = SCIPgetNConss(scip);
543 conss = SCIPgetConss(scip);
550 for (i = 0; i < nconss; i++)
552 conshdlr = SCIPconsGetHdlr(conss[i]);
553 assert( conshdlr != NULL );
555 conshdlrname = SCIPconshdlrGetName(conshdlr);
557 #ifdef SCIP_EVEN_MORE_DEBUG 558 SCIP_CALL( SCIPprintCons(scip, conss[i], NULL) );
559 SCIPinfoMessage(scip, NULL,
"\n");
562 if ( strcmp(conshdlrname,
"SDP") == 0 || strcmp(conshdlrname,
"SDPrank1") == 0 )
567 sdpnnonz += blocknnonz;
568 sdpconstnnonz += constnnonzcounter;
573 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocksizes, nsdpblocks) );
574 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvarnonz, nsdpblocks) );
575 SCIP_CALL( SCIPallocBufferArray(scip, &nconstblocknonz, nsdpblocks) );
576 SCIP_CALL( SCIPallocBufferArray(scip, &col, nsdpblocks) );
577 SCIP_CALL( SCIPallocBufferArray(scip, &row, nsdpblocks) );
578 SCIP_CALL( SCIPallocBufferArray(scip, &val, nsdpblocks) );
579 SCIP_CALL( SCIPallocBufferArray(scip, &constcol, nsdpblocks) );
580 SCIP_CALL( SCIPallocBufferArray(scip, &constrow, nsdpblocks) );
581 SCIP_CALL( SCIPallocBufferArray(scip, &constval, nsdpblocks) );
582 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvars, nsdpblocks) );
583 SCIP_CALL( SCIPallocBufferArray(scip, &sdpvar, nsdpblocks) );
585 for (i = 0; i < nsdpblocks; i++)
587 SCIP_CALL( SCIPallocBufferArray(scip, &(nblockvarnonz[i]), nvarspen) );
588 SCIP_CALL( SCIPallocBufferArray(scip, &col[i], nvarspen) );
589 SCIP_CALL( SCIPallocBufferArray(scip, &row[i], nvarspen) );
590 SCIP_CALL( SCIPallocBufferArray(scip, &val[i], nvarspen) );
595 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
597 for (i = 0; i < nconss; i++)
599 conshdlr = SCIPconsGetHdlr(conss[i]);
600 assert( conshdlr != NULL );
602 conshdlrname = SCIPconshdlrGetName(conshdlr);
604 if ( strcmp(conshdlrname,
"SDP") == 0 || strcmp(conshdlrname,
"SDPrank1") == 0 )
606 assert( ind < nsdpblocks );
610 nconstblocknonz[ind] = constlength;
611 SCIP_CALL( SCIPallocBufferArray(scip, &(constcol[ind]), constlength) );
612 SCIP_CALL( SCIPallocBufferArray(scip, &(constrow[ind]), constlength) );
613 SCIP_CALL( SCIPallocBufferArray(scip, &(constval[ind]), constlength) );
616 SCIP_CALL(
SCIPconsSdpGetData(scip, conss[i], &nblockvars[ind], &blocknnonz, &sdpblocksizes[ind], &nvars, nblockvarnonz[ind], col[ind],
617 row[ind], val[ind], blockvars, &nconstblocknonz[ind], constcol[ind], constrow[ind], constval[ind], NULL, NULL, NULL) );
620 assert( nvars == SCIPgetNVars(scip) );
621 assert( nconstblocknonz[ind] <= constlength );
623 SCIP_CALL( SCIPallocBufferArray(scip, &(sdpvar[ind]), boundprimal ? nblockvars[ind] + 1 : nblockvars[ind]) );
626 for (j = 0; j < nblockvars[ind]; j++)
633 nblockvarnonz[ind][nblockvars[ind]] = sdpblocksizes[ind];
636 SCIP_CALL( SCIPallocBufferArray(scip, &col[ind][nblockvars[ind]], sdpblocksizes[ind]) );
637 SCIP_CALL( SCIPallocBufferArray(scip, &row[ind][nblockvars[ind]], sdpblocksizes[ind]) );
638 SCIP_CALL( SCIPallocBufferArray(scip, &val[ind][nblockvars[ind]], sdpblocksizes[ind]) );
640 for (j = 0; j < sdpblocksizes[ind]; j++)
642 col[ind][nblockvars[ind]][j] = j;
643 row[ind][nblockvars[ind]][j] = j;
644 val[ind][nblockvars[ind]][j] = 1.0;
654 SCIPfreeBufferArray(scip, &blockvars);
659 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, sdpconstnnonz, nconstblocknonz, constrow,
660 constcol, constval, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
661 NULL, NULL, 0, NULL, NULL, NULL) );
666 for (i = 0; i < nsdpblocks; i++)
667 nconstblocknonz[i] = 0;
669 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, 0, nconstblocknonz, NULL,
670 NULL, NULL, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
671 NULL, NULL, 0, NULL, NULL, NULL) );
675 for (i = 0; i < nsdpblocks; i++)
679 SCIPfreeBufferArrayNull(scip, &val[i][nblockvars[i] - 1]);
680 SCIPfreeBufferArrayNull(scip, &row[i][nblockvars[i] - 1]);
681 SCIPfreeBufferArrayNull(scip, &col[i][nblockvars[i] - 1]);
683 SCIPfreeBufferArrayNull(scip, &(sdpvar[i]));
684 SCIPfreeBufferArrayNull(scip, &val[i]);
685 SCIPfreeBufferArrayNull(scip, &row[i]);
686 SCIPfreeBufferArrayNull(scip, &col[i]);
687 SCIPfreeBufferArrayNull(scip, &(nblockvarnonz[i]));
688 SCIPfreeBufferArrayNull(scip, &(constval[i]));
689 SCIPfreeBufferArrayNull(scip, &(constrow[i]));
690 SCIPfreeBufferArrayNull(scip, &(constcol[i]));
693 SCIPfreeBufferArrayNull(scip, &sdpvar);
694 SCIPfreeBufferArrayNull(scip, &nblockvars);
695 SCIPfreeBufferArrayNull(scip, &constval);
696 SCIPfreeBufferArrayNull(scip, &constrow);
697 SCIPfreeBufferArrayNull(scip, &constcol);
698 SCIPfreeBufferArrayNull(scip, &val);
699 SCIPfreeBufferArrayNull(scip, &row);
700 SCIPfreeBufferArrayNull(scip, &col);
701 SCIPfreeBufferArrayNull(scip, &nconstblocknonz);
702 SCIPfreeBufferArrayNull(scip, &nblockvarnonz);
703 SCIPfreeBufferArrayNull(scip, &sdpblocksizes);
704 SCIPfreeBufferArray(scip, &ub);
705 SCIPfreeBufferArray(scip, &lb);
706 SCIPfreeBufferArray(scip, &obj);
715 SCIP_RELAXDATA* relaxdata,
746 assert( scip != NULL );
747 assert( relaxdata != NULL );
749 nvars = SCIPgetNVars(scip);
752 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
754 SCIPdebugMsg(scip,
"inserting %d LPRows into the interface.\n", nrows);
758 for (i = 0; i < nrows; i++)
760 assert( rows[i] != NULL );
761 scipnnonz += SCIProwGetNNonz(rows[i]);
765 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nrows) );
766 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nrows) );
767 SCIP_CALL( SCIPallocBufferArray(scip, &rowind, scipnnonz) );
768 SCIP_CALL( SCIPallocBufferArray(scip, &colind, scipnnonz) );
769 SCIP_CALL( SCIPallocBufferArray(scip, &val, scipnnonz) );
775 for (i = 0; i < nrows; i++)
778 SCIP_Bool tightened = FALSE;
779 SCIP_Real tightenedval = 0.0;
780 SCIP_Bool swapped = FALSE;
784 rownnonz = SCIProwGetNNonz(row);
786 rowvals = SCIProwGetVals(row);
787 rowcols = SCIProwGetCols(row);
788 sciplhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
789 sciprhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
792 if ( relaxdata->tightenvb && rownnonz == 2 && (SCIPisZero(scip, sciplhs) || SCIPisZero(scip, sciprhs) ) )
802 assert( rowcols[0] != NULL );
803 assert( rowcols[1] != NULL );
804 var1 = SCIPcolGetVar(rowcols[0]);
805 var2 = SCIPcolGetVar(rowcols[1]);
806 assert( var1 != NULL );
807 assert( var2 != NULL );
810 if ( ! SCIPisEQ(scip, SCIPvarGetLbLocal(var1), SCIPvarGetUbLocal(var1)) && ! SCIPisEQ(scip, SCIPvarGetLbLocal(var2), SCIPvarGetUbLocal(var2)) )
813 if ( (SCIPisEQ(scip, val1, 1.0) || SCIPisEQ(scip, val2, 1.0)) && ( SCIPisNegative(scip, val1) || SCIPisNegative(scip, val2) ) )
816 if ( ! SCIPisEQ(scip, val1, 1.0) || ! SCIPisNegative(scip, val2) )
818 SCIPswapPointers((
void**) &var1, (
void**) &var2);
825 if ( SCIPvarIsBinary(var2) )
827 if ( SCIPisZero(scip, sciprhs) )
829 if ( SCIPisLT(scip, SCIPvarGetUbLocal(var1), REALABS(val2)) )
831 SCIPdebugMsg(scip,
"Big-M in %s changed from %f to %f\n", SCIProwGetName(row), REALABS(val2), SCIPvarGetUbLocal(var1));
834 tightenedval = -SCIPvarGetUbLocal(var1);
838 if ( SCIPisZero(scip, sciplhs) )
840 if ( SCIPisGT(scip, SCIPvarGetLbLocal(var1), REALABS(val2)) )
842 SCIPdebugMsg(scip,
"Big-M in %s changed from %f to %f\n", SCIProwGetName(row), REALABS(val2), SCIPvarGetLbLocal(var1));
845 tightenedval = -SCIPvarGetUbLocal(var1);
853 for (j = 0; j < rownnonz; j++)
856 if ( tightened && ( (swapped && (j == 0)) || ((! swapped) && (j == 1)) ) )
858 if ( SCIPisFeasGT(scip, REALABS(tightenedval), 0.0) )
860 assert( SCIPcolGetVar(rowcols[j]) != 0 );
862 rowind[nnonz] = nconss;
863 val[nnonz] = tightenedval;
867 else if ( SCIPisFeasGT(scip, REALABS(rowvals[j]), 0.0))
869 assert( SCIPcolGetVar(rowcols[j]) != 0 );
871 rowind[nnonz] = nconss;
872 val[nnonz] = rowvals[j];
876 lhs[nconss] = primalobj ? sciplhs : (SCIPisInfinity(scip, -sciplhs) ? -sciplhs : 0.0);
877 rhs[nconss] = primalobj ? sciprhs : (SCIPisInfinity(scip, sciprhs) ? sciprhs : 0.0);
889 SCIP_CALL(
SCIPsdpiAddLPRows(relaxdata->sdpi, nconss, lhs, rhs, nnonz, (
const int*)rowind, (
const int*)colind, val) );
892 SCIPfreeBufferArray(scip, &val);
893 SCIPfreeBufferArray(scip, &colind);
894 SCIPfreeBufferArray(scip, &rowind);
895 SCIPfreeBufferArray(scip, &rhs);
896 SCIPfreeBufferArray(scip, &lhs);
901 vars = SCIPgetVars(scip);
902 assert( vars != NULL );
905 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvars) );
906 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvars) );
907 SCIP_CALL( SCIPallocBufferArray(scip, &inds, nvars) );
908 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvars) );
909 SCIP_CALL( SCIPallocBufferArray(scip, &objinds, nvars) );
912 for (i = 0; i < nvars; i++)
914 assert( vars[i] != NULL );
915 lb[i] = primalobj ? SCIPvarGetLbLocal(vars[i]) : (SCIPisInfinity(scip, -SCIPvarGetLbLocal(vars[i])) ? SCIPvarGetLbLocal(vars[i]) : 0.0);
916 ub[i] = primalobj ? SCIPvarGetUbLocal(vars[i]) : (SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[i])) ? SCIPvarGetUbLocal(vars[i]) : 0.0);
918 obj[i] = dualobj ? SCIPvarGetObj(vars[i]) : 0.0;
924 SCIP_CALL(
SCIPsdpiChgObj(relaxdata->sdpi, nvars, objinds, obj) );
927 SCIPfreeBufferArray(scip, &objinds);
928 SCIPfreeBufferArray(scip, &obj);
929 SCIPfreeBufferArray(scip, &inds);
930 SCIPfreeBufferArray(scip, &ub);
931 SCIPfreeBufferArray(scip, &lb);
942 SCIP_Real* lowerbound
945 char saveconsname[SCIP_MAXSTRLEN];
947 SCIP_RELAXDATA* relaxdata;
948 SCIP_CONS* savedsetting;
953 SCIP_Bool enforceslater;
955 SCIP_Real objforscip;
956 SCIP_Real* solforscip;
963 SCIPdebugMsg(scip,
"calcRelax called\n");
965 assert( scip != NULL );
966 assert( relax != NULL );
967 assert( result != NULL );
968 assert( lowerbound != NULL );
970 relaxdata = SCIPrelaxGetData(relax);
971 assert( relaxdata != NULL );
973 nvars = SCIPgetNVars(scip);
975 vars = SCIPgetVars (scip);
977 sdpi = relaxdata->sdpi;
978 assert( sdpi != NULL );
980 if ( relaxdata->objlimit )
987 rootnode = ! SCIPnodeGetParent(SCIPgetCurrentNode(scip));
990 if ( rootnode || (SCIPnodeGetDepth(SCIPgetCurrentNode(scip)) == relaxdata->settingsresetofs) ||
991 ( relaxdata->settingsresetfreq > 0 && ((SCIPnodeGetDepth(SCIPgetCurrentNode(scip)) - relaxdata->settingsresetofs) % relaxdata->settingsresetfreq == 0)) ||
998 SCIP_CONSHDLR* conshdlr;
1002 conshdlr = SCIPfindConshdlr(scip,
"Savedsdpsettings");
1003 if ( conshdlr == NULL )
1005 SCIPerrorMessage(
"Savedsdpsettings constraint handler not found!\n");
1006 return SCIP_PLUGINNOTFOUND;
1011 conss = SCIPconshdlrGetConss(conshdlr);
1012 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
1013 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip))));
1015 while ( parentconsind >= 0 && strcmp(saveconsname, SCIPconsGetName(conss[parentconsind])) )
1017 if ( parentconsind >= 0 )
1021 SCIPdebugMsg(scip,
"Startsetting from parent node not found, restarting with fastest settings!\n");
1027 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
1028 if ( ! SCIPisInfinity(scip, timelimit) )
1030 timelimit -= SCIPgetSolvingTime(scip);
1031 if ( timelimit <= 0.0 )
1033 SCIPdebugMsg(scip,
"Time limit reached, not running relax SDP!\n");
1034 *result = SCIP_DIDNOTRUN;
1041 enforceslater = SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip)));
1044 if ( ( ! SCIPnodeGetParent(SCIPgetCurrentNode(scip))) || ( ! relaxdata->warmstart ) || ((relaxdata->warmstartiptype == 2) &&
1047 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
1049 else if ( relaxdata->warmstart && (relaxdata->warmstartprimaltype != 2) && (relaxdata->warmstartiptype == 2) && SCIPisEQ(scip, relaxdata->warmstartipfactor, 1.0) )
1055 SCIP_CALL( SCIPallocBufferArray(scip, &ipy, nvars) );
1056 for (v = 0; v < nvars; v++)
1059 #ifdef SCIP_PRINT_WARMSTART 1060 SCIPdebugMsg(scip,
"warmstart using the following analytic centers:\n");
1061 for (v = 0; v < nvars; v++)
1062 SCIPdebugMsg(scip,
"y[%d] = %f\n", v, ipy[v]);
1065 for (b = 0; b < relaxdata->nblocks; b++)
1067 SCIPdebugMsg(scip,
"dual block %d\n", b);
1068 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
1070 SCIPdebugMsg(scip,
"Z(%d,%d)=%f\n", relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
1073 for (b = 0; b < relaxdata->nblocks; b++)
1075 SCIPdebugMsg(scip,
"primal block %d\n", b);
1076 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
1078 SCIPdebugMsg(scip,
"X(%d,%d)=%f\n", relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
1084 SCIP_CALL(
SCIPsdpiSolve(sdpi, ipy, relaxdata->ipZnblocknonz, relaxdata->ipZrow, relaxdata->ipZcol, relaxdata->ipZval, relaxdata->ipXnblocknonz,
1085 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval, startsetting, enforceslater, timelimit) );
1087 SCIPfreeBufferArray(scip, &ipy);
1091 SCIP_CONSHDLR* conshdlr;
1093 SCIP_CONS** sdpblocks = NULL;
1094 SCIP_Real* starty = NULL;
1095 int* startZnblocknonz = NULL;
1096 int** startZrow = NULL;
1097 int** startZcol = NULL;
1098 SCIP_Real** startZval = NULL;
1099 int* startXnblocknonz = NULL;
1100 int** startXrow = NULL;
1101 int** startXcol = NULL;
1102 SCIP_Real** startXval = NULL;
1104 SCIP_Longint parentnodenumber;
1110 conshdlr = SCIPfindConshdlr(scip,
"Savesdpsol");
1111 if ( conshdlr == NULL )
1113 SCIPerrorMessage(
"Savesdpsol constraint handler not found\n");
1114 return SCIP_PLUGINNOTFOUND;
1119 conss = SCIPconshdlrGetConss(conshdlr);
1120 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
1121 parentnodenumber = SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip)));
1128 if ( parentconsind < 0 )
1130 SCIPdebugMsg(scip,
"Starting SDP-Solving from scratch since no warmstart information available for node %lld\n", parentnodenumber);
1131 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
1135 SCIPdebugMsg(scip,
"Using warmstartinformation from node %lld\n", parentnodenumber);
1141 SCIP_CALL( SCIPallocBufferArray(scip, &starty, nvars) );
1144 for (v = 0; v < nvars; v++)
1147 starty[v] = SCIPgetSolVal(scip, dualsol, var);
1150 if (SCIPisLT(scip, starty[v], SCIPvarGetLbLocal(var)) && (relaxdata->warmstartproject == 2 || relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4))
1152 starty[v] = SCIPvarGetLbLocal(var);
1154 SCIP_CALL( SCIPsetSolVal(scip, dualsol, var, SCIPvarGetLbLocal(var)) );
1156 else if (SCIPisGT(scip, starty[v], SCIPvarGetUbLocal(var)) && (relaxdata->warmstartproject == 2 || relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4))
1158 starty[v] = SCIPvarGetUbLocal(var);
1160 SCIP_CALL( SCIPsetSolVal(scip, dualsol, var, SCIPvarGetUbLocal(var)) );
1164 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->warmstartproject != 4 )
1166 if ( relaxdata->warmstartiptype == 1 )
1169 starty[v] *= 1 - relaxdata->warmstartipfactor;
1171 else if ( relaxdata->warmstartiptype == 2 )
1174 starty[v] = (1 - relaxdata->warmstartipfactor) * starty[v] + relaxdata->warmstartipfactor * SCIPgetSolVal(scip, relaxdata->ipy, var);
1182 SCIP_CONSHDLR* sdpconshdlr;
1183 SCIP_CONSHDLR* sdprank1conshdlr;
1184 SCIP_CONS** sdporigblocks;
1185 SCIP_CONS** sdprank1blocks;
1194 SCIP_Real maxprimalentry = 0.0;
1195 SCIP_Real maxdualentry;
1196 SCIP_Real identitydiagonal = 0.0;
1199 SCIP_Bool* diagentryexists;
1201 sdpconshdlr = relaxdata->sdpconshdlr;
1202 sdprank1conshdlr = relaxdata->sdprank1conshdlr;
1203 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
1204 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
1205 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
1206 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
1208 nblocks = nsdpblocks + nrank1blocks;
1210 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nblocks) );
1211 for (r = 0; r < nsdpblocks; ++r)
1212 sdpblocks[r] = sdporigblocks[r];
1214 for (r = 0; r < nrank1blocks; ++r)
1215 sdpblocks[nsdpblocks + r] = sdprank1blocks[r];
1217 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
1219 SCIP_CALL( SCIPallocBufferArray(scip, &startZnblocknonz, nblocks + 1) );
1220 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow, nblocks + 1) );
1221 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol, nblocks + 1) );
1222 SCIP_CALL( SCIPallocBufferArray(scip, &startZval, nblocks + 1) );
1223 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks + 1) );
1224 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks + 1) );
1225 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks + 1) );
1226 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks + 1) );
1229 if ( relaxdata->warmstartiptype == 1 )
1232 if ( SCIPisLT(scip, maxprimalentry, 1.0) )
1233 maxprimalentry = 1.0;
1237 for (b = 0; b < nblocks; b++)
1241 if ( relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4 )
1244 startZnblocknonz[b] = blocksize * (blocksize + 1) / 2;
1251 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
1253 if ( relaxdata->warmstartiptype == 1 )
1254 startZnblocknonz[b] += blocksize;
1255 else if ( relaxdata->warmstartiptype == 2 )
1256 startZnblocknonz[b] += relaxdata->ipZnblocknonz[b];
1260 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[b], startZnblocknonz[b]) );
1261 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[b], startZnblocknonz[b]) );
1262 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[b], startZnblocknonz[b]) );
1268 if ( relaxdata->warmstartproject == 3 )
1270 SCIP_Real* fullZmatrix;
1271 SCIP_Real* eigenvalues;
1272 SCIP_Real* eigenvectors;
1273 SCIP_Real* scaledeigenvectors;
1279 matrixsize = blocksize * blocksize;
1281 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
1282 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
1283 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvectors, matrixsize) );
1285 SCIP_CALL(
expandSparseMatrix(startZnblocknonz[b], blocksize, startZrow[b], startZcol[b], startZval[b], fullZmatrix) );
1290 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, eigenvectors, matrixsize) );
1294 while (i < blocksize && SCIPisLT(scip, eigenvalues[i], relaxdata->warmstartprojminevdual) )
1296 eigenvalues[i] = relaxdata->warmstartprojminevdual;
1305 FALSE, fullZmatrix) );
1308 startZnblocknonz[b] = 0;
1309 epsilon = SCIPepsilon(scip);
1310 for (r = 0; r < blocksize; r++)
1312 for (c = r; c < blocksize; c++)
1314 matrixpos = r * blocksize + c;
1315 if ( REALABS(fullZmatrix[matrixpos]) > epsilon )
1317 startZrow[b][startZnblocknonz[b]] = r;
1318 startZcol[b][startZnblocknonz[b]] = c;
1319 startZval[b][startZnblocknonz[b]] = fullZmatrix[matrixpos];
1320 startZnblocknonz[b]++;
1326 SCIPfreeBufferArray(scip, &scaledeigenvectors);
1327 SCIPfreeBufferArray(scip, &eigenvectors);
1328 SCIPfreeBufferArray(scip, &eigenvalues);
1329 SCIPfreeBufferArray(scip, &fullZmatrix);
1332 if ( relaxdata->warmstartprimaltype == 1 )
1335 if ( relaxdata->warmstartiptype == 1 )
1337 startXnblocknonz[b] = blocksize;
1338 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
1339 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
1340 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
1341 for (i = 0; i < startXnblocknonz[b]; i++)
1343 startXrow[b][i] = i;
1344 startXcol[b][i] = i;
1345 startXval[b][i] = maxprimalentry;
1349 else if ( relaxdata->warmstartprimaltype == 2 )
1351 startXnblocknonz[b] = startZnblocknonz[b];
1352 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
1353 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
1354 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
1355 for (i = 0; i < startZnblocknonz[b]; i++)
1357 startXrow[b][i] = startZrow[b][i];
1358 startXcol[b][i] = startZcol[b][i];
1359 startXval[b][i] = 1 / startZval[b][i];
1362 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartproject != 4 )
1364 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1369 if ( relaxdata->warmstartproject != 4 )
1372 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[b], 2 * nrows + 2 * nvars) );
1373 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[b], 2 * nrows + 2 * nvars) );
1374 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[b], 2 * nrows + 2 * nvars) );
1375 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], 2 * nrows + 2 * nvars) );
1376 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], 2 * nrows + 2 * nvars) );
1377 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], 2 * nrows + 2 * nvars) );
1380 startZnblocknonz[b] = 2 * nrows + 2 * nvars;
1381 startXnblocknonz[b] = 2 * nrows + 2 * nvars;
1383 for (r = 0; r < nrows; r++)
1387 rownnonz = SCIProwGetNNonz(rows[r]);
1388 rowvals = SCIProwGetVals(rows[r]);
1389 rowcols = SCIProwGetCols(rows[r]);
1390 for (i = 0; i < rownnonz; i++)
1391 rowval += SCIPgetSolVal(scip, dualsol, SCIPcolGetVar(rowcols[i])) * rowvals[i];
1393 startZrow[b][2*r] = 2*r;
1394 startZcol[b][2*r] = 2*r;
1395 startZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
1397 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r], relaxdata->warmstartprojminevdual) )
1398 startZval[b][2*r] = relaxdata->warmstartprojminevdual;
1402 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*r], 1.0) )
1405 if ( SCIPisLT(scip, startZval[b][2*r], 0.0) )
1406 startZval[b][2*r] = relaxdata->warmstartipfactor;
1408 startZval[b][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r] + relaxdata->warmstartipfactor;
1410 else if ( relaxdata->warmstartiptype == 2 )
1412 startZval[b][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*r];
1422 startZrow[b][2*r + 1] = 2*r + 1;
1423 startZcol[b][2*r + 1] = 2*r + 1;
1424 startZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
1426 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r + 1], relaxdata->warmstartprojminevdual) )
1427 startZval[b][2*r + 1] = relaxdata->warmstartprojminevdual;
1428 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*r + 1], 1.0) )
1431 if ( SCIPisLT(scip, startZval[b][2*r + 1], 0.0) )
1432 startZval[b][2*r + 1] = relaxdata->warmstartipfactor;
1434 startZval[b][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r + 1] + relaxdata->warmstartipfactor;
1436 else if ( relaxdata->warmstartiptype == 2 )
1438 startZval[b][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r + 1] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*r + 1];
1448 if ( relaxdata->warmstartprimaltype == 1 && relaxdata->warmstartiptype == 1 )
1450 startXrow[b][2*r] = 2*r;
1451 startXcol[b][2*r] = 2*r;
1452 startXval[b][2*r] = maxprimalentry;
1453 startXrow[b][2*r + 1] = 2*r + 1;
1454 startXcol[b][2*r + 1] = 2*r + 1;
1455 startXval[b][2*r + 1] = maxprimalentry;
1457 else if ( relaxdata->warmstartprimaltype == 2 )
1459 startXrow[b][2*r] = startZrow[b][2*r];
1460 startXcol[b][2*r] = startZcol[b][2*r];
1461 startXval[b][2*r] = 1 / startZval[b][2*r];
1462 startXrow[b][2*r + 1] = startZrow[b][2*r + 1];
1463 startXcol[b][2*r + 1] = startZcol[b][2*r + 1];
1464 startXval[b][2*r + 1] = 1 / startZval[b][2*r + 1];
1466 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartiptype == 1 )
1468 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1473 for (v = 0; v < nvars; v++)
1475 startZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
1476 startZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
1477 startZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, dualsol, vars[v]) - SCIPvarGetLbLocal(vars[v]);
1478 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*nrows + 2*v], relaxdata->warmstartprojminevdual) )
1479 startZval[b][2*nrows + 2*v] = relaxdata->warmstartprojminevdual;
1480 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*nrows + 2*v], 1.0) )
1483 if ( SCIPisLT(scip, startZval[b][2*nrows + 2*v], 0.0) )
1484 startZval[b][2*nrows + 2*v] = relaxdata->warmstartipfactor;
1486 startZval[b][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor;
1488 else if ( relaxdata->warmstartiptype == 2 )
1490 startZval[b][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*nrows + 2*v];
1500 startZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1501 startZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1502 startZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, dualsol, vars[v]);
1503 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], relaxdata->warmstartprojminevdual) )
1504 startZval[b][2*nrows + 2*v + 1] = relaxdata->warmstartprojminevdual;
1505 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], 1.0) )
1508 if ( SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], 0.0) )
1509 startZval[b][2*nrows + 2*v + 1] = relaxdata->warmstartipfactor;
1511 startZval[b][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v + 1] + relaxdata->warmstartipfactor;
1513 else if ( relaxdata->warmstartiptype == 2 )
1515 startZval[b][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*nrows + 2*v + 1];
1525 if ( relaxdata->warmstartprimaltype == 1 && relaxdata->warmstartiptype == 1 )
1527 startXrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
1528 startXcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
1529 startXval[b][2*nrows + 2*v] = maxprimalentry;
1530 startXrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1531 startXcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1532 startXval[b][2*nrows + 2*v + 1] = maxprimalentry;
1534 else if ( relaxdata->warmstartprimaltype == 2 )
1536 startXrow[b][2*nrows + 2*v] = startZrow[b][2*nrows + 2*v];
1537 startXcol[b][2*nrows + 2*v] = startZcol[b][2*nrows + 2*v];
1538 startXval[b][2*nrows + 2*v] = 1 / startZval[b][2*nrows + 2*v];
1539 startXrow[b][2*nrows + 2*v + 1] = startZrow[b][2*nrows + 2*v + 1];
1540 startXcol[b][2*nrows + 2*v + 1] = startZcol[b][2*nrows + 2*v + 1];
1541 startXval[b][2*nrows + 2*v + 1] = 1 / startZval[b][2*nrows + 2*v + 1];
1543 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartproject == 1 )
1545 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1573 if ( relaxdata->warmstartproject == 4 )
1575 SCIP_VAR** blockvars;
1578 SCIP_Real** blockval;
1579 SCIP_Real** blockeigenvalues;
1580 SCIP_Real** blockeigenvectors;
1581 SCIP_Real** blockrowvals;
1588 SCIP_Real* blockconstval;
1589 SCIP_Real* scaledeigenvectors;
1590 SCIP_Real* fullXmatrix;
1591 SCIP_Real* fullZmatrix;
1596 SCIP_Real primalroundobj;
1597 SCIP_Real dualroundobj;
1615 int blockconstnnonz;
1624 int nremovedentries;
1628 if ( relaxdata->warmstartprimaltype != 3 )
1630 SCIPerrorMessage(
"Invalid parameter combination, use relax/warmstartproject = 4 only with relax/warmstartprimaltype = 3.\n");
1631 return SCIP_PARAMETERWRONGVAL;
1634 SCIP_CALL( SCIPstartClock(scip, relaxdata->roundingprobtime) );
1637 for (b = 0; b < nblocks; b++)
1640 matrixsize = (matrixsize * (matrixsize + 1)) / 2;
1641 startXnblocknonz[b] = matrixsize;
1643 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], matrixsize) );
1644 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], matrixsize) );
1645 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], matrixsize) );
1650 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[nblocks], 2 * nvars + 2 * nrows) );
1651 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[nblocks], 2 * nvars + 2 * nrows) );
1652 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[nblocks], 2 * nvars + 2 * nrows) );
1653 startXnblocknonz[nblocks] = 2 * nvars + 2 * nrows;
1657 lpi = relaxdata->lpi;
1660 SCIP_CALL( SCIPlpiClear(lpi) );
1663 SCIP_CALL( SCIPlpiChgObjsen(lpi, SCIP_OBJSEN_MAXIMIZE) );
1669 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nvars) );
1670 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nvars) );
1671 for (v = 0; v < nvars; v++)
1673 varobj = SCIPvarGetObj(vars[v]);
1679 SCIP_CALL( SCIPallocBufferArray(scip, &blocksizes, nblocks + 2) );
1680 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvalues, nblocks) );
1681 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvectors, nblocks) );
1687 SCIP_CALL( SCIPlpiAddRows(lpi, nvars, lhs, rhs, NULL, 0, NULL, NULL, NULL) );
1689 SCIPfreeBufferArray(scip, &rhs);
1690 SCIPfreeBufferArray(scip, &lhs);
1693 SCIP_CALL( SCIPallocBufferArray(scip, &obj, 2*nvars) );
1694 SCIP_CALL( SCIPallocBufferArray(scip, &lb, 2*nvars) );
1695 SCIP_CALL( SCIPallocBufferArray(scip, &ub, 2*nvars) );
1696 SCIP_CALL( SCIPallocBufferArray(scip, &beg, 2*nvars) );
1697 SCIP_CALL( SCIPallocBufferArray(scip, &ind, 2*nvars) );
1698 SCIP_CALL( SCIPallocBufferArray(scip, &val, 2*nvars) );
1702 for (v = 0; v < nvars; v++)
1704 if ( ! SCIPisInfinity(scip, -1 * SCIPvarGetLbLocal(vars[v])) )
1706 obj[pos] = SCIPvarGetLbLocal(vars[v]);
1708 ub[pos] = SCIPlpiInfinity(lpi);
1714 if ( ! SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
1716 obj[pos] = -1 * SCIPvarGetUbLocal(vars[v]);
1718 ub[pos] = SCIPlpiInfinity(lpi);
1726 SCIP_CALL( SCIPlpiAddCols(lpi, pos, obj, lb, ub, NULL, pos, beg, ind, val) );
1727 blocksizes[0] = pos;
1730 SCIPfreeBufferArray(scip, &val);
1731 SCIPfreeBufferArray(scip, &ind);
1732 SCIPfreeBufferArray(scip, &beg);
1733 SCIPfreeBufferArray(scip, &ub);
1734 SCIPfreeBufferArray(scip, &lb);
1735 SCIPfreeBufferArray(scip, &obj);
1738 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
1740 SCIP_CALL( SCIPallocBufferArray(scip, &obj, 2*nrows) );
1741 SCIP_CALL( SCIPallocBufferArray(scip, &lb, 2*nrows) );
1742 SCIP_CALL( SCIPallocBufferArray(scip, &ub, 2*nrows) );
1743 SCIP_CALL( SCIPallocBufferArray(scip, &beg, 2*nrows) );
1744 SCIP_CALL( SCIPallocBufferArray(scip, &ind, 2*nrows*nvars) );
1745 SCIP_CALL( SCIPallocBufferArray(scip, &val, 2*nrows*nvars) );
1750 for (r = 0; r < nrows; r++)
1754 rownnonz = SCIProwGetNNonz(row);
1756 rowvals = SCIProwGetVals(row);
1757 rowcols = SCIProwGetCols(row);
1758 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
1759 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
1761 if ( ! SCIPisInfinity(scip, -1 * rowlhs) )
1765 ub[pos] = SCIPlpiInfinity(lpi);
1767 for (i = 0; i < rownnonz; i++)
1770 val[indpos] = rowvals[i];
1776 if ( ! SCIPisInfinity(scip, rowrhs) )
1778 obj[pos] = -1 * rowrhs;
1780 ub[pos] = SCIPlpiInfinity(lpi);
1782 for (i = 0; i < rownnonz; i++)
1785 val[indpos] = -1 * rowvals[i];
1792 SCIP_CALL( SCIPlpiAddCols(lpi, pos, obj, lb, ub, NULL, indpos, beg, ind, val) );
1793 blocksizes[1] = pos;
1794 roundingvars += pos;
1796 SCIPfreeBufferArray(scip, &val);
1797 SCIPfreeBufferArray(scip, &ind);
1798 SCIPfreeBufferArray(scip, &beg);
1799 SCIPfreeBufferArray(scip, &ub);
1800 SCIPfreeBufferArray(scip, &lb);
1801 SCIPfreeBufferArray(scip, &obj);
1804 for (b = 0; b < nblocks; b++)
1808 SCIP_CALL( SCIPallocBufferArray(scip, &blocknvarnonz, nvars) );
1809 SCIP_CALL( SCIPallocBufferArray(scip, &blockcol, nvars) );
1810 SCIP_CALL( SCIPallocBufferArray(scip, &blockrow, nvars) );
1811 SCIP_CALL( SCIPallocBufferArray(scip, &blockval, nvars) );
1812 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
1813 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstcol, blockconstnnonz) );
1814 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstrow, blockconstnnonz) );
1815 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstval, blockconstnnonz) );
1817 arraylength = nvars;
1818 SCIP_CALL(
SCIPconsSdpGetData(scip, sdpblocks[b], &blocknvars, &blocknnonz, &blocksize, &arraylength, blocknvarnonz,
1819 blockcol, blockrow, blockval, blockvars, &blockconstnnonz, blockconstcol, blockconstrow, blockconstval, NULL, NULL, NULL) );
1820 assert( arraylength == nvars );
1822 matrixsize = blocksize * blocksize;
1824 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
1825 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvalues[b], blocksize) );
1826 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvectors[b], matrixsize) );
1828 SCIP_CALL(
expandSparseMatrix(startXnblocknonz[b], blocksize, startXrow[b], startXcol[b], startXval[b], fullXmatrix) );
1833 SCIP_CALL( SCIPallocBufferArray(scip, &obj, blocksize) );
1834 SCIP_CALL( SCIPallocBufferArray(scip, &lb, blocksize) );
1835 SCIP_CALL( SCIPallocBufferArray(scip, &ub, blocksize) );
1836 SCIP_CALL( SCIPallocBufferArray(scip, &beg, blocksize) );
1837 SCIP_CALL( SCIPallocBufferArray(scip, &ind, blocksize*nvars) );
1838 SCIP_CALL( SCIPallocBufferArray(scip, &val, blocksize*nvars) );
1841 for (i = 0; i < blocksize; i++)
1846 for (v = 0; v < nvars; v++)
1848 ind[i * nvars + v] = v;
1849 val[i * nvars + v] = 0.0;
1854 ub[i] = SCIPlpiInfinity(lpi);
1858 for (i = 0; i < blockconstnnonz; i++)
1863 for (evind = 0; evind < blocksize; evind++)
1865 if ( blockconstrow[i] == blockconstcol[i] )
1866 obj[evind] += blockconstval[i] * blockeigenvectors[b][evind * blocksize + blockconstrow[i]] * blockeigenvectors[b][evind * blocksize + blockconstcol[i]];
1868 obj[evind] += 2 * blockconstval[i] * blockeigenvectors[b][evind * blocksize + blockconstrow[i]] * blockeigenvectors[b][evind * blocksize + blockconstcol[i]];
1872 SCIPfreeBufferArray(scip, &blockconstval);
1873 SCIPfreeBufferArray(scip, &blockconstrow);
1874 SCIPfreeBufferArray(scip, &blockconstcol);
1877 for (v = 0; v < blocknvars; v++)
1880 for (i = 0; i < blocknvarnonz[v]; i++)
1885 for (evind = 0; evind < blocksize; evind++)
1887 if ( blockrow[v][i] == blockcol[v][i] )
1888 val[evind * nvars + varind] += blockval[v][i] * blockeigenvectors[b][evind * blocksize + blockrow[v][i]] * blockeigenvectors[b][evind * blocksize + blockcol[v][i]];
1890 val[evind * nvars + varind] += 2 * blockval[v][i] * blockeigenvectors[b][evind * blocksize + blockrow[v][i]] * blockeigenvectors[b][evind * blocksize + blockcol[v][i]];
1895 SCIPfreeBufferArray(scip, &blockvars);
1896 SCIPfreeBufferArray(scip, &blockval);
1897 SCIPfreeBufferArray(scip, &blockrow);
1898 SCIPfreeBufferArray(scip, &blockcol);
1899 SCIPfreeBufferArray(scip, &blocknvarnonz);
1900 SCIPfreeBufferArray(scip, &fullXmatrix);
1903 nremovedentries = 0;
1904 for (i = 0; i < blocksize; i++)
1906 beg[i] = beg[i] - nremovedentries;
1907 for (v = 0; v < nvars; v++)
1909 if ( REALABS(val[i * nvars + v]) < SCIPepsilon(scip) )
1915 val[i * nvars + v - nremovedentries] = val[i * nvars + v];
1916 ind[i * nvars + v - nremovedentries] = ind[i * nvars + v];
1921 SCIP_CALL( SCIPlpiAddCols(lpi, blocksize, obj, lb, ub, NULL, blocksize*nvars - nremovedentries, beg, ind, val) );
1923 blocksizes[2 + b] = blocksize;
1924 roundingvars += blocksize;
1926 SCIPfreeBufferArray(scip, &val);
1927 SCIPfreeBufferArray(scip, &ind);
1928 SCIPfreeBufferArray(scip, &beg);
1929 SCIPfreeBufferArray(scip, &ub);
1930 SCIPfreeBufferArray(scip, &lb);
1931 SCIPfreeBufferArray(scip, &obj);
1936 SCIP_CALL( SCIPlpiSolveDual(lpi) );
1939 SCIP_CALL( SCIPlpiGetObjval(lpi, &primalroundobj) );
1941 SCIP_CALL( SCIPstopClock(scip, relaxdata->roundingprobtime) );
1946 if ( SCIPlpiIsDualInfeasible(lpi) || SCIPisGE(scip, primalroundobj, SCIPgetCutoffbound(scip)) )
1948 if ( SCIPlpiIsDualInfeasible(lpi) )
1950 SCIPdebugMsg(scip,
"Infeasibility of node %lld detected through primal rounding problem during warmstarting\n",
1951 SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
1953 relaxdata->roundingprobinf++;
1955 else if ( SCIPisGT(scip, primalroundobj, SCIPgetCutoffbound(scip)) )
1957 SCIPdebugMsg(scip,
"Suboptimality of node %lld detected through primal rounding problem during warmstarting:" 1958 "lower bound = %f > %f = cutoffbound\n", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), primalroundobj, SCIPgetCutoffbound(scip));
1960 relaxdata->roundingcutoff++;
1964 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
1965 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
1966 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
1967 for (b = 0; b < nblocks; b++)
1969 SCIPfreeBufferArrayNull(scip,&blockeigenvectors[b]);
1970 SCIPfreeBufferArrayNull(scip,&blockeigenvalues[b]);
1971 SCIPfreeBufferArrayNull(scip, &startXval[b]);
1972 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
1973 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
1974 SCIPfreeBufferArrayNull(scip, &startZval[b]);
1975 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
1976 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
1978 SCIPfreeBufferArray(scip, &blocksizes);
1979 SCIPfreeBufferArray(scip, &blockeigenvectors);
1980 SCIPfreeBufferArray(scip, &blockeigenvalues);
1981 SCIPfreeBufferArrayNull(scip, &startXval);
1982 SCIPfreeBufferArrayNull(scip, &startXcol);
1983 SCIPfreeBufferArrayNull(scip, &startXrow);
1984 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
1985 SCIPfreeBufferArrayNull(scip, &startZval);
1986 SCIPfreeBufferArrayNull(scip, &startZcol);
1987 SCIPfreeBufferArrayNull(scip, &startZrow);
1988 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
1989 SCIPfreeBufferArrayNull(scip, &sdpblocks);
1990 SCIPfreeBufferArray(scip, &starty);
1992 relaxdata->feasible = FALSE;
1993 *result = SCIP_CUTOFF;
1996 else if ( relaxdata->warmstartroundonlyinf )
1999 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2000 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2001 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2002 for (b = 0; b < nblocks; b++)
2004 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
2005 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
2006 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2007 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2008 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2009 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2010 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2011 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2013 SCIPfreeBufferArray(scip, &blocksizes);
2014 SCIPfreeBufferArray(scip, &blockeigenvectors);
2015 SCIPfreeBufferArray(scip, &blockeigenvalues);
2016 SCIPfreeBufferArrayNull(scip, &startXval);
2017 SCIPfreeBufferArrayNull(scip, &startXcol);
2018 SCIPfreeBufferArrayNull(scip, &startXrow);
2019 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2020 SCIPfreeBufferArrayNull(scip, &startZval);
2021 SCIPfreeBufferArrayNull(scip, &startZcol);
2022 SCIPfreeBufferArrayNull(scip, &startZrow);
2023 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2024 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2025 SCIPfreeBufferArray(scip, &starty);
2027 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
2030 else if ( ! SCIPlpiIsOptimal(lpi) )
2032 SCIPdebugMsg(scip,
"Solving without warmstart since solving of the primal rounding problem failed with status %d!\n", SCIPlpiGetInternalStatus(lpi));
2033 relaxdata->primalroundfails++;
2036 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2037 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2038 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2039 for (b = 0; b < nblocks; b++)
2041 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
2042 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
2043 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2044 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2045 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2046 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2047 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2048 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2050 SCIPfreeBufferArray(scip, &blocksizes);
2051 SCIPfreeBufferArray(scip, &blockeigenvectors);
2052 SCIPfreeBufferArray(scip, &blockeigenvalues);
2053 SCIPfreeBufferArrayNull(scip, &startXval);
2054 SCIPfreeBufferArrayNull(scip, &startXcol);
2055 SCIPfreeBufferArrayNull(scip, &startXrow);
2056 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2057 SCIPfreeBufferArrayNull(scip, &startZval);
2058 SCIPfreeBufferArrayNull(scip, &startZcol);
2059 SCIPfreeBufferArrayNull(scip, &startZrow);
2060 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2061 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2062 SCIPfreeBufferArray(scip, &starty);
2064 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
2073 SCIP_CALL( SCIPallocBufferArray(scip, &optev, roundingvars) );
2075 SCIP_CALL( SCIPlpiGetSol(lpi, NULL, optev, NULL, NULL, NULL) );
2078 pos = blocksizes[1];
2080 for (v = 0; v < nvars; v++)
2082 startXrow[nblocks][pos] = 2 * nrows + 2 * v;
2083 startXcol[nblocks][pos] = 2 * nrows + 2 * v;
2084 if ( ! SCIPisInfinity(scip, -1 * SCIPvarGetLbLocal(vars[v])) )
2086 startXval[nblocks][pos] = optev[evpos];
2090 startXval[nblocks][pos] = SCIPinfinity(scip);
2093 startXrow[nblocks][pos] = 2 * nrows + 2 * v + 1;
2094 startXcol[nblocks][pos] = 2 * nrows + 2 * v + 1;
2095 if ( ! SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
2097 startXval[nblocks][pos] = optev[evpos];
2101 startXval[nblocks][pos] = SCIPinfinity(scip);
2104 assert( evpos == blocksizes[0] );
2108 evpos = blocksizes[0];
2109 for (r = 0; r < nrows; r++)
2113 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
2114 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
2116 startXrow[nblocks][pos] = 2 * r;
2117 startXcol[nblocks][pos] = 2 * r;
2118 if ( ! SCIPisInfinity(scip, -1 * rowlhs) )
2120 startXval[nblocks][pos] = optev[evpos];
2124 startXval[nblocks][pos] = SCIPinfinity(scip);
2127 startXrow[nblocks][pos] = 2 * r + 1;
2128 startXcol[nblocks][pos] = 2 * r + 1;
2129 if ( ! SCIPisInfinity(scip, rowrhs) )
2131 startXval[nblocks][pos] = optev[evpos];
2135 startXval[nblocks][pos] = SCIPinfinity(scip);
2138 assert( evpos == blocksizes[0] + blocksizes[1] );
2140 startXnblocknonz[nblocks] = blocksizes[0] + blocksizes[1];
2143 pos = blocksizes[0] + blocksizes[1];
2144 for (b = 0; b < nblocks; b++)
2146 blocksize = blocksizes[2 + b];
2147 matrixsize = blocksize * blocksize;
2150 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, blockeigenvectors[b], matrixsize) );
2156 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
2159 SCIP_CALL(
SCIPlapackMatrixMatrixMult(blocksizes[2 + b], blocksizes[2 + b], blockeigenvectors[b], TRUE, blocksizes[2 + b], blocksizes[2 + b],
2160 scaledeigenvectors, FALSE, fullXmatrix) );
2163 startXnblocknonz[b] = 0;
2164 epsilon = SCIPepsilon(scip);
2165 for (r = 0; r < blocksize; r++)
2167 for (c = r; c < blocksize; c++)
2169 matrixpos = r * blocksize + c;
2170 if ( REALABS(fullXmatrix[matrixpos]) > epsilon )
2172 startXrow[b][startXnblocknonz[b]] = r;
2173 startXcol[b][startXnblocknonz[b]] = c;
2174 startXval[b][startXnblocknonz[b]] = fullXmatrix[matrixpos];
2175 startXnblocknonz[b]++;
2179 pos += blocksizes[2 + b];
2180 SCIPfreeBufferArray(scip, &fullXmatrix);
2181 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2183 SCIPfreeBufferArray(scip, &optev);
2189 matrixsize = 2 * nvars + 2 * nrows;
2190 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[nblocks], matrixsize) );
2191 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[nblocks], matrixsize) );
2192 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[nblocks], matrixsize) );
2195 SCIP_CALL( SCIPlpiClear(lpi) );
2198 SCIP_CALL( SCIPlpiChgObjsen(lpi, SCIP_OBJSEN_MINIMIZE) );
2201 roundingvars = nvars;
2202 for (b = 0; b < nblocks; b++)
2203 roundingvars += blocksizes[2 + b];
2205 SCIP_CALL( SCIPallocBufferArray(scip, &obj, roundingvars) );
2206 SCIP_CALL( SCIPallocBufferArray(scip, &lb, roundingvars) );
2207 SCIP_CALL( SCIPallocBufferArray(scip, &ub, roundingvars) );
2209 for (v = 0; v < nvars; v++)
2217 for (v = nvars; v < roundingvars; v++)
2221 ub[v] = SCIPlpiInfinity(lpi);
2228 SCIP_CALL( SCIPlpiAddCols(lpi, roundingvars, obj, lb, ub, NULL, 0, NULL, NULL, NULL) );
2230 SCIPfreeBufferArray(scip, &ub);
2231 SCIPfreeBufferArray(scip, &lb);
2232 SCIPfreeBufferArray(scip, &obj);
2235 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
2237 for (r = 0; r < nrows; r++)
2240 assert( row != NULL );
2241 rownnonz = SCIProwGetNNonz(row);
2243 rowvals = SCIProwGetVals(row);
2244 rowcols = SCIProwGetCols(row);
2245 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
2246 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
2248 SCIP_CALL( SCIPallocBufferArray(scip, &rowinds, rownnonz) );
2251 for (i = 0; i < rownnonz; i++)
2256 SCIP_CALL( SCIPlpiAddRows(lpi, 1, &rowlhs, &rowrhs, NULL, rownnonz, &pos, rowinds, rowvals) );
2258 SCIPfreeBufferArray(scip, &rowinds);
2263 for (b = 0; b < nblocks; b++)
2267 SCIP_CALL( SCIPallocBufferArray(scip, &blocknvarnonz, nvars) );
2268 SCIP_CALL( SCIPallocBufferArray(scip, &blockcol, nvars) );
2269 SCIP_CALL( SCIPallocBufferArray(scip, &blockrow, nvars) );
2270 SCIP_CALL( SCIPallocBufferArray(scip, &blockval, nvars) );
2271 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
2272 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstcol, blockconstnnonz) );
2273 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstrow, blockconstnnonz) );
2274 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstval, blockconstnnonz) );
2275 blocksize = blocksizes[2 + b];
2276 matrixsize = blocksize * blocksize;
2278 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
2280 SCIP_CALL(
expandSparseMatrix(startZnblocknonz[b], blocksize, startZrow[b], startZcol[b], startZval[b], fullZmatrix) );
2284 arraylength = nvars;
2285 SCIP_CALL(
SCIPconsSdpGetData(scip, sdpblocks[b], &blocknvars, &blocknnonz, &blocksize, &arraylength, blocknvarnonz,
2286 blockcol, blockrow, blockval, blockvars, &blockconstnnonz, blockconstcol, blockconstrow, blockconstval, NULL, NULL, NULL) );
2288 nroundingrows = (blocksize * (blocksize + 1)) / 2;
2290 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nroundingrows) );
2291 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nroundingrows) );
2292 SCIP_CALL( SCIPallocBufferArray(scip, &nblockrownonz , nroundingrows) );
2293 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowcols , nroundingrows) );
2294 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowvals , nroundingrows) );
2297 for (i = 0; i < nroundingrows; i++)
2302 nblockrownonz[i] = 0;
2303 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowcols[i], nvars + blocksize) );
2304 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowvals[i], nvars + blocksize) );
2308 for (i = 0; i < blockconstnnonz; i++)
2316 for (v = 0; v < blocknvars; v++)
2320 for (i = 0; i < blocknvarnonz[v]; i++)
2323 blockrowcols[pos][nblockrownonz[pos]] = varind;
2324 blockrowvals[pos][nblockrownonz[pos]] = blockval[v][i];
2325 nblockrownonz[pos]++;
2330 for (evind = 0; evind < blocksize; evind++)
2332 for (i = 0; i < blocksize; i++)
2334 for (j = 0; j <= i; j++)
2338 if ( SCIPisGT(scip, REALABS(-1 * blockeigenvectors[b][evind * blocksize + i] * blockeigenvectors[b][evind * blocksize + j]), 0.0) )
2341 blockrowcols[pos][nblockrownonz[pos]] = startpos + evind;
2342 blockrowvals[pos][nblockrownonz[pos]] = -1 * blockeigenvectors[b][evind * blocksize + i] * blockeigenvectors[b][evind * blocksize + j];
2343 nblockrownonz[pos]++;
2348 startpos += blocksize;
2352 for (r = 0; r < nroundingrows; r++)
2354 SCIP_CALL( SCIPlpiAddRows(lpi, 1, &lhs[r], &rhs[r], NULL, nblockrownonz[r], &pos, blockrowcols[r], blockrowvals[r]) );
2355 SCIPfreeBufferArray(scip, &blockrowvals[r]);
2356 SCIPfreeBufferArray(scip, &blockrowcols[r]);
2359 SCIPfreeBufferArray(scip, &blockrowvals);
2360 SCIPfreeBufferArray(scip, &blockrowcols);
2361 SCIPfreeBufferArray(scip, &nblockrownonz);
2362 SCIPfreeBufferArray(scip, &rhs);
2363 SCIPfreeBufferArray(scip, &lhs);
2364 SCIPfreeBufferArray(scip, &fullZmatrix);
2365 SCIPfreeBufferArray(scip, &blockconstval);
2366 SCIPfreeBufferArray(scip, &blockconstrow);
2367 SCIPfreeBufferArray(scip, &blockconstcol);
2368 SCIPfreeBufferArray(scip, &blockvars);
2369 SCIPfreeBufferArray(scip, &blockval);
2370 SCIPfreeBufferArray(scip, &blockrow);
2371 SCIPfreeBufferArray(scip, &blockcol);
2372 SCIPfreeBufferArray(scip, &blocknvarnonz);
2376 SCIP_CALL( SCIPstartClock(scip, relaxdata->roundingprobtime) );
2377 SCIP_CALL( SCIPlpiSolveDual(lpi) );
2378 SCIP_CALL( SCIPstopClock(scip, relaxdata->roundingprobtime) );
2380 if ( ! SCIPlpiIsOptimal(lpi) )
2382 SCIPdebugMsg(scip,
"Solution of dual rounding problem failed with status %d, continuing without warmstart\n", SCIPlpiGetInternalStatus(lpi));
2383 relaxdata->dualroundfails++;
2386 SCIPfreeBufferArrayNull(scip, &startZval[nblocks]);
2387 SCIPfreeBufferArrayNull(scip, &startZcol[nblocks]);
2388 SCIPfreeBufferArrayNull(scip, &startZrow[nblocks]);
2389 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2390 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2391 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2392 for (b = 0; b < nblocks; b++)
2394 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
2395 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
2396 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2397 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2398 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2399 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2400 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2401 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2403 SCIPfreeBufferArray(scip, &blocksizes);
2404 SCIPfreeBufferArray(scip, &blockeigenvectors);
2405 SCIPfreeBufferArray(scip, &blockeigenvalues);
2406 SCIPfreeBufferArrayNull(scip, &startXval);
2407 SCIPfreeBufferArrayNull(scip, &startXcol);
2408 SCIPfreeBufferArrayNull(scip, &startXrow);
2409 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2410 SCIPfreeBufferArrayNull(scip, &startZval);
2411 SCIPfreeBufferArrayNull(scip, &startZcol);
2412 SCIPfreeBufferArrayNull(scip, &startZrow);
2413 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2414 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2415 SCIPfreeBufferArray(scip, &starty);
2418 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit) );
2426 relaxdata->roundstartsuccess++;
2429 SCIP_CALL( SCIPallocBufferArray(scip, &optev, nvars + roundingvars) );
2430 SCIP_CALL( SCIPlpiGetSol(lpi, &dualroundobj, optev, NULL, NULL, NULL) );
2434 if ( SCIPisEQ(scip, primalroundobj, dualroundobj) )
2437 SCIP_CONS* savedcons;
2439 SCIPdebugMsg(scip,
"Node %lld solved to optimality through rounding problems with optimal objective %f\n",
2440 SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), dualroundobj);
2442 relaxdata->roundingoptimal++;
2445 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
2446 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, optev) );
2448 *lowerbound = dualroundobj;
2449 relaxdata->objval = dualroundobj;
2452 #if ( SCIP_VERSION >= 700 || (SCIP_VERSION >= 602 && SCIP_SUBVERSION > 0) ) 2453 SCIP_CALL( SCIPsetRelaxSolValsSol(scip, relax, scipsol, TRUE) );
2455 SCIP_CALL( SCIPsetRelaxSolValsSol(scip, scipsol, TRUE) );
2458 relaxdata->feasible = TRUE;
2459 *result = SCIP_SUCCESS;
2462 if ( relaxdata->warmstart )
2464 char consname[SCIP_MAXSTRLEN];
2470 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2471 assert( snprintfreturn < SCIP_MAXSTRLEN );
2473 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2475 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
2476 maxprimalentry, nblocks + 1, startXnblocknonz, startXrow, startXcol, startXval) );
2478 SCIP_CALL( SCIPaddCons(scip, savedcons) );
2479 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
2482 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
2485 SCIPfreeBufferArray(scip, &optev);
2486 SCIPfreeBufferArrayNull(scip, &startZval[nblocks]);
2487 SCIPfreeBufferArrayNull(scip, &startZcol[nblocks]);
2488 SCIPfreeBufferArrayNull(scip, &startZrow[nblocks]);
2489 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2490 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2491 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2492 for (b = 0; b < nblocks; b++)
2494 SCIPfreeBufferArrayNull(scip,&blockeigenvectors[b]);
2495 SCIPfreeBufferArrayNull(scip,&blockeigenvalues[b]);
2496 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2497 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2498 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2499 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2500 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2501 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2503 SCIPfreeBufferArray(scip, &blocksizes);
2504 SCIPfreeBufferArray(scip, &blockeigenvectors);
2505 SCIPfreeBufferArray(scip, &blockeigenvalues);
2506 SCIPfreeBufferArrayNull(scip, &startXval);
2507 SCIPfreeBufferArrayNull(scip, &startXcol);
2508 SCIPfreeBufferArrayNull(scip, &startXrow);
2509 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2510 SCIPfreeBufferArrayNull(scip, &startZval);
2511 SCIPfreeBufferArrayNull(scip, &startZcol);
2512 SCIPfreeBufferArrayNull(scip, &startZrow);
2513 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2514 SCIPfreeBufferArrayNull(scip, &sdpblocks);
2515 SCIPfreeBufferArray(scip, &starty);
2521 for (v = 0; v < nvars; v++)
2523 if ( relaxdata->warmstartiptype == 1 )
2526 starty[v] = (1 - relaxdata->warmstartipfactor) * optev[v];
2528 else if ( relaxdata->warmstartiptype == 2 )
2531 starty[v] = (1 - relaxdata->warmstartipfactor) * optev[v] + relaxdata->warmstartipfactor * SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
2537 for (b = 0; b < nblocks; b++)
2539 blocksize = blocksizes[2 + b];
2540 matrixsize = blocksize * blocksize;
2543 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, blockeigenvectors[b], matrixsize) );
2549 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
2553 scaledeigenvectors, FALSE, fullZmatrix) );
2556 startZnblocknonz[b] = 0;
2557 epsilon = SCIPepsilon(scip);
2558 for (r = 0; r < blocksize; r++)
2560 for (c = r; c < blocksize; c++)
2562 matrixpos = r * blocksize + c;
2563 if ( REALABS(fullZmatrix[matrixpos]) > epsilon )
2565 startZrow[b][startZnblocknonz[b]] = r;
2566 startZcol[b][startZnblocknonz[b]] = c;
2567 startZval[b][startZnblocknonz[b]] = fullZmatrix[matrixpos];
2568 startZnblocknonz[b]++;
2573 SCIPfreeBufferArray(scip, &fullZmatrix);
2574 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2575 SCIPfreeBufferArray(scip, &blockeigenvectors[b]);
2576 SCIPfreeBufferArray(scip, &blockeigenvalues[b]);
2579 SCIPfreeBufferArray(scip, &optev);
2580 SCIPfreeBufferArray(scip, &blockeigenvectors);
2581 SCIPfreeBufferArray(scip, &blockeigenvalues);
2582 SCIPfreeBufferArray(scip, &blocksizes);
2587 startZnblocknonz[b] = 2 * nrows + 2 * nvars;
2590 for (r = 0; r < nrows; r++)
2594 rownnonz = SCIProwGetNNonz(rows[r]);
2595 rowvals = SCIProwGetVals(rows[r]);
2596 rowcols = SCIProwGetCols(rows[r]);
2598 for (i = 0; i < rownnonz; i++)
2601 startZrow[b][2*r] = 2*r;
2602 startZcol[b][2*r] = 2*r;
2603 startZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
2605 startZrow[b][2*r + 1] = 2*r + 1;
2606 startZcol[b][2*r + 1] = 2*r + 1;
2607 startZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
2611 for (v = 0; v < nvars; v++)
2613 startZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
2614 startZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
2617 startZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
2618 startZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
2619 startZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - starty[
SCIPsdpVarmapperGetSdpIndex(relaxdata->varmapper, vars[v])];
2625 if ( relaxdata->warmstartprimaltype == 3 )
2628 if ( relaxdata->warmstartproject != 4 )
2633 if ( relaxdata->warmstartproject == 3 )
2638 for (b = 0; b < nblocks; b++)
2641 matrixsize = (matrixsize * (matrixsize + 1)) / 2;
2643 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], matrixsize) );
2644 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], matrixsize) );
2645 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], matrixsize) );
2648 else if ( relaxdata->warmstartiptype == 1 )
2650 for (b = 0; b < nblocks; b++)
2652 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2653 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2654 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2657 else if ( relaxdata->warmstartiptype == 2 )
2659 for (b = 0; b < nblocks; b++)
2661 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2662 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2663 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2674 if ( relaxdata->warmstartprojpdsame && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2676 identitydiagonal = 1.0;
2678 for (b = 0; b < nblocks; b++)
2680 for (i = 0; i < startZnblocknonz[b]; i++)
2682 if ( REALABS(startZval[b][i]) > identitydiagonal )
2683 identitydiagonal = REALABS(startZval[b][i]);
2685 for (i = 0; i < startXnblocknonz[b]; i++)
2687 if ( REALABS(startXval[b][i]) > identitydiagonal )
2688 identitydiagonal = REALABS(startXval[b][i]);
2691 identitydiagonal *= relaxdata->warmstartipfactor;
2694 for (b = 0; b < nblocks; b++)
2697 if ( relaxdata->warmstartproject == 3 )
2699 SCIP_Real* fullXmatrix;
2700 SCIP_Real* eigenvalues;
2701 SCIP_Real* eigenvectors;
2702 SCIP_Real* scaledeigenvectors;
2709 matrixsize = blocksize * blocksize;
2711 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
2712 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
2713 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvectors, matrixsize) );
2715 SCIP_CALL(
expandSparseMatrix(startXnblocknonz[b], blocksize, startXrow[b], startXcol[b], startXval[b], fullXmatrix) );
2720 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, eigenvectors, matrixsize) );
2724 while (i < blocksize && SCIPisLT(scip, eigenvalues[i], relaxdata->warmstartprojminevprimal) )
2726 eigenvalues[i] = relaxdata->warmstartprojminevprimal;
2735 FALSE, fullXmatrix) );
2738 startXnblocknonz[b] = 0;
2739 epsilon = SCIPepsilon(scip);
2740 for (r = 0; r < blocksize; r++)
2742 for (c = r; c < blocksize; c++)
2744 matrixpos = r * blocksize + c;
2745 if ( REALABS(fullXmatrix[matrixpos]) > epsilon )
2747 startXrow[b][startXnblocknonz[b]] = r;
2748 startXcol[b][startXnblocknonz[b]] = c;
2749 startXval[b][startXnblocknonz[b]] = fullXmatrix[matrixpos];
2750 startXnblocknonz[b]++;
2756 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2757 SCIPfreeBufferArray(scip, &eigenvectors);
2758 SCIPfreeBufferArray(scip, &eigenvalues);
2759 SCIPfreeBufferArray(scip, &fullXmatrix);
2763 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2765 if ( relaxdata->warmstartiptype == 1 )
2768 if ( ! relaxdata->warmstartprojpdsame )
2770 if ( relaxdata->warmstartproject == 3 )
2771 maxprimalentry = relaxdata->warmstartprojminevprimal;
2773 maxprimalentry = 1.0;
2774 for (i = 0; i < startXnblocknonz[b]; i++)
2776 if ( REALABS(startXval[b][i]) > maxprimalentry )
2777 maxprimalentry = REALABS(startXval[b][i]);
2779 identitydiagonal = relaxdata->warmstartipfactor * maxprimalentry;
2783 SCIP_CALL( SCIPallocBufferArray(scip, &diagentryexists, blocksize) );
2784 for (i = 0; i < blocksize; i++)
2785 diagentryexists[i] = FALSE;
2787 for (i = 0; i < startXnblocknonz[b]; i++)
2789 if ( startXrow[b][i] == startXcol[b][i] )
2791 startXval[b][i] = startXval[b][i] * (1 - relaxdata->warmstartipfactor) + identitydiagonal;
2792 assert( startXval[b][i] >= 0.0 );
2793 diagentryexists[startXrow[b][i]] = TRUE;
2796 startXval[b][i] *= (1 - relaxdata->warmstartipfactor);
2800 for (i = 0; i < blocksize; i++)
2802 if ( ! diagentryexists[i] )
2804 startXrow[b][startXnblocknonz[b]] = i;
2805 startXcol[b][startXnblocknonz[b]] = i;
2806 startXval[b][startXnblocknonz[b]] = identitydiagonal;
2807 startXnblocknonz[b]++;
2810 SCIPfreeBufferArrayNull(scip, &diagentryexists);
2812 else if ( relaxdata->warmstartiptype == 2 )
2815 for (i = 0; i < startXnblocknonz[b]; i++)
2816 startXval[b][i] *= 1 - relaxdata->warmstartipfactor;
2820 relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b], TRUE, relaxdata->warmstartipfactor,
2821 startXrow[b], startXcol[b], startXval[b], &(startXnblocknonz[b]), startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2826 for (b = 0; b < nblocks; b++)
2829 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2831 if ( relaxdata->warmstartiptype == 1 )
2833 if ( ! relaxdata->warmstartprojpdsame )
2837 for (i = 0; i < startZnblocknonz[b]; i++)
2839 if ( REALABS(startZval[b][i]) > maxdualentry )
2840 maxdualentry = REALABS(startZval[b][i]);
2842 identitydiagonal = relaxdata->warmstartipfactor * maxdualentry;
2846 SCIP_CALL( SCIPallocBufferArray(scip, &diagentryexists, blocksize) );
2847 for (i = 0; i < blocksize; i++)
2848 diagentryexists[i] = FALSE;
2850 for (i = 0; i < startZnblocknonz[b]; i++)
2852 if ( startZrow[b][i] == startZcol[b][i] )
2854 startZval[b][i] = startZval[b][i] * (1 - relaxdata->warmstartipfactor) + identitydiagonal;
2855 assert( startZval[b][i] >= 0 );
2856 diagentryexists[startZrow[b][i]] = TRUE;
2859 startZval[b][i] *= (1 - relaxdata->warmstartipfactor);
2863 for (i = 0; i < blocksize; i++)
2865 if ( ! diagentryexists[i] )
2867 startZrow[b][startZnblocknonz[b]] = i;
2868 startZcol[b][startZnblocknonz[b]] = i;
2869 startZval[b][startZnblocknonz[b]] = identitydiagonal;
2870 startZnblocknonz[b]++;
2874 SCIPfreeBufferArrayNull(scip, &diagentryexists);
2876 else if ( relaxdata->warmstartiptype == 2 )
2879 for (i = 0; i < startZnblocknonz[b]; i++)
2880 startZval[b][i] *= 1 - relaxdata->warmstartipfactor;
2884 relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b], TRUE, relaxdata->warmstartipfactor,
2885 startZrow[b], startZcol[b], startZval[b], &(startZnblocknonz[b]), startZnblocknonz[b] + relaxdata->ipZnblocknonz[b]) );
2891 if ( relaxdata->warmstartproject == 3 )
2898 SCIPsortIntIntReal(startXrow[nblocks], startXcol[nblocks], startXval[nblocks], startXnblocknonz[nblocks]);
2901 nsavedentries = startXnblocknonz[nblocks];
2904 for (i = 0; i < nsavedentries; i++)
2906 assert( startXrow[nblocks][i] == startXcol[nblocks][i] );
2908 for (j = lastentry + 1; j < startXrow[nblocks][i]; j++)
2910 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2911 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2912 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2913 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartprojminevprimal;
2914 startXnblocknonz[nblocks]++;
2916 if ( SCIPisLT(scip, startXval[b][i], 1.0) )
2917 startXval[b][i] = relaxdata->warmstartprojminevprimal;
2919 lastentry = startXrow[nblocks][i];
2922 for (j = lastentry + 1; j < 2 * nrows + 2 * nvars; j++)
2924 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2925 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2926 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2927 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartprojminevprimal;
2928 startXnblocknonz[nblocks]++;
2933 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2935 if ( relaxdata->warmstartiptype == 1 )
2942 if ( ! relaxdata->warmstartprojpdsame )
2943 identitydiagonal = relaxdata->warmstartipfactor;
2946 SCIPsortIntIntReal(startXrow[nblocks], startXcol[nblocks], startXval[nblocks], startXnblocknonz[nblocks]);
2949 nsavedentries = startXnblocknonz[nblocks];
2952 for (i = 0; i < nsavedentries; i++)
2954 assert( startXrow[nblocks][i] == startXcol[nblocks][i] );
2956 for (j = lastentry + 1; j < startXrow[nblocks][i]; j++)
2958 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2959 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2960 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2962 if ( relaxdata->warmstartprojpdsame )
2963 startXval[nblocks][startXnblocknonz[nblocks]] = identitydiagonal;
2965 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartipfactor;
2966 startXnblocknonz[nblocks]++;
2971 if ( relaxdata->warmstartprojpdsame )
2972 startXval[b][i] = (1 - relaxdata->warmstartipfactor) * startXval[b][i] + identitydiagonal;
2973 else if ( SCIPisLT(scip, startXval[b][i], 1.0) )
2974 startXval[b][i] = (1 - relaxdata->warmstartipfactor) * startXval[b][i] + relaxdata->warmstartipfactor;
2976 lastentry = startXrow[nblocks][i];
2979 for (j = lastentry + 1; j < 2 * nrows + 2 * nvars; j++)
2981 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2982 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2983 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2984 startXval[nblocks][startXnblocknonz[nblocks]] = identitydiagonal;
2985 startXnblocknonz[nblocks]++;
2988 else if ( relaxdata->warmstartiptype == 2 )
2991 for (i = 0; i < startXnblocknonz[nblocks]; i++)
2992 startXval[nblocks][i] *= 1 - relaxdata->warmstartipfactor;
2996 relaxdata->ipXcol[nblocks], relaxdata->ipXval[nblocks], relaxdata->ipXnblocknonz[nblocks], TRUE,
2997 relaxdata->warmstartipfactor, startXrow[nblocks], startXcol[nblocks], startXval[nblocks],
2998 &(startXnblocknonz[nblocks]), startXnblocknonz[nblocks] + relaxdata->ipXnblocknonz[nblocks]) );
3002 if ( relaxdata->warmstartiptype == 1 )
3004 for (r = 0; r < nrows; r++)
3007 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r], relaxdata->warmstartprojminevdual) )
3008 startZval[nblocks][2*r] = relaxdata->warmstartprojminevdual;
3012 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*r], 1.0) || relaxdata->warmstartprojpdsame) )
3015 if ( SCIPisLT(scip, startZval[nblocks][2*r], 0.0) )
3016 startZval[nblocks][2*r] = identitydiagonal;
3018 startZval[nblocks][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*r] + identitydiagonal;
3021 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*r + 1], relaxdata->warmstartprojminevdual) )
3022 startZval[nblocks][2*r + 1] = relaxdata->warmstartprojminevdual;
3023 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*r + 1], 1.0) || relaxdata->warmstartprojpdsame) )
3026 if ( SCIPisLT(scip, startZval[nblocks][2*r + 1], 0.0) )
3027 startZval[nblocks][2*r + 1] = identitydiagonal;
3029 startZval[nblocks][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*r + 1] + identitydiagonal;
3033 for (v = 0; v < nvars; v++)
3035 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], relaxdata->warmstartprojminevdual) )
3036 startZval[nblocks][2*nrows + 2*v] = relaxdata->warmstartprojminevdual;
3037 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], 1.0) || relaxdata->warmstartprojpdsame) )
3040 if ( SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], 0.0) )
3041 startZval[nblocks][2*nrows + 2*v] = identitydiagonal;
3043 startZval[nblocks][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*nrows + 2*v] + identitydiagonal;
3046 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], relaxdata->warmstartprojminevdual) )
3047 startZval[nblocks][2*nrows + 2*v + 1] = relaxdata->warmstartprojminevdual;
3048 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], 1.0) || relaxdata->warmstartprojpdsame) )
3051 if ( SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], 0.0) )
3052 startZval[nblocks][2*nrows + 2*v + 1] = identitydiagonal;
3054 startZval[nblocks][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*nrows + 2*v + 1] + identitydiagonal;
3058 else if ( relaxdata->warmstartiptype == 2 )
3061 for (i = 0; i < startZnblocknonz[nblocks]; i++)
3062 startZval[nblocks][i] *= 1 - relaxdata->warmstartipfactor;
3066 relaxdata->ipZcol[nblocks], relaxdata->ipZval[nblocks], relaxdata->ipZnblocknonz[nblocks], TRUE,
3067 relaxdata->warmstartipfactor, startZrow[nblocks], startZcol[nblocks], startZval[nblocks],
3068 &(startZnblocknonz[nblocks]), startZnblocknonz[nblocks] + relaxdata->ipZnblocknonz[nblocks]) );
3073 #ifdef SCIP_PRINT_WARMSTART 3074 SCIPdebugMsg(scip,
"warmstart using the following point:\n");
3075 nblocks = SCIPconshdlrGetNConss(relaxdata->sdpconshdlr) + SCIPconshdlrGetNConss(relaxdata->sdprank1conshdlr);
3076 for (i = 0; i < nvars; i++)
3077 SCIPdebugMsg(scip,
"y[%d]=%f\n", i, starty[i]);
3081 for (b = 0; b < nblocks + 1; b++)
3083 SCIPdebugMsg(scip,
"dual block %d\n", b);
3084 for (i = 0; i < startZnblocknonz[b]; i++)
3086 SCIPdebugMsg(scip,
"Z(%d,%d)=%f\n", startZrow[b][i], startZcol[b][i], startZval[b][i]);
3089 for (b = 0; b < nblocks + 1; b++)
3091 SCIPdebugMsg(scip,
"primal block %d\n", b);
3092 for (i = 0; i < startXnblocknonz[b]; i++)
3094 SCIPdebugMsg(scip,
"X(%d,%d)=%f\n", startXrow[b][i], startXcol[b][i], startXval[b][i]);
3101 SCIP_CALL(
SCIPsdpiSolve(sdpi, starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow,
3102 startXcol, startXval, startsetting, enforceslater, timelimit) );
3106 SCIP_CONSHDLR* sdpconshdlr;
3107 SCIP_CONSHDLR* sdprank1conshdlr;
3109 sdpconshdlr = relaxdata->sdpconshdlr;
3110 sdprank1conshdlr = relaxdata->sdprank1conshdlr;
3111 nblocks = SCIPconshdlrGetNConss(sdpconshdlr) + SCIPconshdlrGetNConss(sdprank1conshdlr) + 1;
3113 assert( startXval != NULL );
3114 assert( startXcol != NULL );
3115 assert( startXrow != NULL );
3116 assert( startZval != NULL );
3117 assert( startZcol != NULL );
3118 assert( startZrow != NULL );
3121 for (b = 0; b < nblocks; b++)
3123 SCIPfreeBufferArray(scip, &startXval[b]);
3124 SCIPfreeBufferArray(scip, &startXcol[b]);
3125 SCIPfreeBufferArray(scip, &startXrow[b]);
3126 SCIPfreeBufferArray(scip, &startZval[b]);
3127 SCIPfreeBufferArray(scip, &startZcol[b]);
3128 SCIPfreeBufferArray(scip, &startZrow[b]);
3131 SCIPfreeBufferArray(scip, &startXval);
3132 SCIPfreeBufferArray(scip, &startXcol);
3133 SCIPfreeBufferArray(scip, &startXrow);
3134 SCIPfreeBufferArray(scip, &startXnblocknonz);
3135 SCIPfreeBufferArray(scip, &startZval);
3136 SCIPfreeBufferArray(scip, &startZcol);
3137 SCIPfreeBufferArray(scip, &startZrow);
3138 SCIPfreeBufferArray(scip, &startZnblocknonz);
3139 SCIPfreeBufferArray(scip, &sdpblocks);
3141 SCIPfreeBufferArray(scip, &starty);
3147 relaxdata->lastsdpnode = SCIPnodeGetNumber(SCIPgetCurrentNode(scip));
3158 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3160 SCIP_CALL( SCIPaddCons(scip, savedsetting) );
3161 SCIP_CALL( SCIPreleaseCons(scip, &savedsetting) );
3165 relaxdata->feasible = FALSE;
3167 if ( SCIPinProbing(scip) )
3174 #ifdef SCIP_MORE_DEBUG 3177 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3179 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &sollength) );
3181 assert( sollength == nvars );
3186 SCIPdebugMsg(scip,
"optimal solution: objective = %f, dual feasible: %u, primal feasible: %u.\n",
3191 SCIPdebugMsg(scip,
"The solver could not determine feasibility ! ");
3195 for (i = 0; i < nvars; ++i)
3197 SCIPdebugMsg(scip,
"<%s> = %f\n", SCIPvarGetName(vars[i]), solforscip[i]);
3199 SCIPfreeBufferArray(scip, &solforscip);
3205 SCIPdebugMsg(scip,
"Node cut off due to infeasibility.\n");
3206 relaxdata->feasible = FALSE;
3207 *result = SCIP_CUTOFF;
3212 SCIPdebugMsg(scip,
"Node cut off due to objective limit.\n");
3213 relaxdata->feasible = FALSE;
3214 *result = SCIP_CUTOFF;
3219 SCIPdebugMsg(scip,
"Node unbounded.");
3220 relaxdata->feasible = TRUE;
3221 *result = SCIP_SUCCESS;
3222 *lowerbound = -SCIPinfinity(scip);
3228 SCIP_SOL* preoptimalsol = NULL;
3229 SCIP_CONS* savedcons;
3231 SCIP_Bool preoptimalsolsuccess;
3234 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3236 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &slength) );
3238 assert( slength == nvars );
3242 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3243 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, solforscip) );
3245 *lowerbound = objforscip;
3246 relaxdata->objval = objforscip;
3249 #if ( SCIP_VERSION >= 700 || (SCIP_VERSION >= 602 && SCIP_SUBVERSION > 0) ) 3250 SCIP_CALL( SCIPsetRelaxSolVals(scip, relax, nvars, vars, solforscip, TRUE) );
3252 SCIP_CALL( SCIPsetRelaxSolVals(scip, nvars, vars, solforscip, TRUE) );
3255 relaxdata->feasible = TRUE;
3256 *result = SCIP_SUCCESS;
3257 preoptimalsolsuccess = FALSE;
3262 SCIP_Real maxprimalentry;
3263 int* startXnblocknonz = NULL;
3264 int** startXrow = NULL;
3265 int** startXcol = NULL;
3266 SCIP_Real** startXval = NULL;
3267 char consname[SCIP_MAXSTRLEN];
3273 if ( relaxdata->warmstartpreoptsol )
3277 SCIP_Real* preoptimalvec;
3280 SCIP_CALL( SCIPallocBufferArray(scip, &preoptimalvec, nvars) );
3285 maxprimalentry = 0.0;
3286 if ( relaxdata->warmstartprimaltype == 3 )
3288 nblocks = SCIPconshdlrGetNConss(relaxdata->sdpconshdlr) + SCIPconshdlrGetNConss(relaxdata->sdprank1conshdlr) + 1;
3289 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3295 if ( startXnblocknonz[0] > -1 )
3297 preoptimalsolsuccess = TRUE;
3299 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3300 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3301 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3304 for (b = 0; b < nblocks; b++)
3306 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3307 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3308 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3312 nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3315 preoptimalsolsuccess = FALSE;
3325 maxprimalentry = 0.0;
3327 -1, NULL, NULL, NULL, NULL) );
3331 if ( preoptimalsolsuccess )
3333 assert( nvarsgiven == nvars );
3336 SCIP_CALL( SCIPcreateSol(scip, &preoptimalsol, NULL) );
3337 SCIP_CALL( SCIPsetSolVals(scip, preoptimalsol, nvars, vars, preoptimalvec) );
3340 SCIPfreeBufferArray(scip, &preoptimalvec);
3344 SCIPerrorMessage(
"Warmstarting with preoptimal solutions currently only supported for DSDP and SDPA\n");
3345 return SCIP_LPERROR;
3350 maxprimalentry = 0.0;
3351 if ( relaxdata->warmstartprimaltype == 3 )
3353 nblocks = SCIPconshdlrGetNConss(relaxdata->sdpconshdlr) + SCIPconshdlrGetNConss(relaxdata->sdprank1conshdlr) + 1;
3354 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3355 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3356 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3357 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3363 for (b = 0; b < nblocks; b++)
3365 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3366 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3367 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3379 maxprimalentry = 0.0;
3383 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3384 assert( snprintfreturn < SCIP_MAXSTRLEN );
3386 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3388 if ( relaxdata->warmstartpreoptsol )
3391 if ( preoptimalsolsuccess )
3393 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), preoptimalsol,
3394 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3396 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3397 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3402 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
3403 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3405 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3406 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3412 assert( startXnblocknonz != NULL );
3413 if ( startXnblocknonz[0] > 1 )
3415 for (b = 0; b < nblocks; b++)
3417 assert( startXval != NULL );
3418 assert( startXcol != NULL );
3419 assert( startXrow != NULL );
3421 SCIPfreeBufferArrayNull(scip, &startXval[b]);
3422 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
3423 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
3425 SCIPfreeBufferArrayNull(scip, &startXval);
3426 SCIPfreeBufferArrayNull(scip, &startXcol);
3427 SCIPfreeBufferArrayNull(scip, &startXrow);
3429 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
3433 SCIPfreeBufferArray(scip, &solforscip);
3434 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3435 if ( preoptimalsolsuccess )
3437 SCIP_CALL( SCIPfreeSol(scip, &preoptimalsol) );
3447 *result = SCIP_DIDNOTRUN;
3453 objlb = -SCIPinfinity(scip);
3455 if ( ! SCIPisInfinity(scip, objlb) )
3457 *lowerbound = objlb;
3458 SCIPdebugMsg(scip,
"The relaxation could not be solved, using best computed bound from penalty formulation.\n");
3460 else if ( ! SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip))) )
3462 *lowerbound = SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip));
3463 SCIPdebugMsg(scip,
"The relaxation could not be solved, keeping old bound.\n");
3467 *result = SCIP_SUSPENDED;
3468 SCIPerrorMessage(
"The relaxation of the root node could not be solved, so there is no hope to solve this instance.\n");
3472 *result = SCIP_SUCCESS;
3488 assert( scip != NULL );
3490 vars = SCIPgetVars(scip);
3493 for (i = 0; i < SCIPgetNVars(scip); i++)
3495 if ( SCIPisLT(scip, SCIPvarGetLbLocal(vars[i]), SCIPvarGetUbLocal(vars[i])) )
3507 SCIP_RELAXDATA* relaxdata;
3515 #ifdef SCIP_EVEN_MORE_DEBUG 3516 SCIP_VAR** varsfordebug = SCIPgetVars(
scip);
3517 const int nvarsfordebug = SCIPgetNVars(
scip);
3520 SCIPdebugMsg(
scip,
"Calling relaxExecSdp.\n");
3522 relaxdata = SCIPrelaxGetData(relax);
3523 vars = SCIPgetVars(
scip);
3524 nvars = SCIPgetNVars(
scip);
3527 relaxdata->origsolved = FALSE;
3528 relaxdata->probingsolved = FALSE;
3531 if ( (relaxdata->lastsdpnode == SCIPnodeGetNumber(SCIPgetCurrentNode(
scip)) && ( ! SCIPinProbing(
scip) ) ) && relaxdata->origsolved && ! relaxdata->resolve )
3534 SCIP_Real objforscip;
3535 SCIP_Real* solforscip;
3539 SCIPdebugMsg(
scip,
"Already solved SDP-relaxation for node %ld, returning with SCIP_SUCCESS so that no other relaxator is called.\n",
3540 SCIPrelaxGetData(relax)->lastsdpnode);
3544 relaxdata->feasible = TRUE;
3545 *result = SCIP_SUCCESS;
3546 *lowerbound = -SCIPinfinity(
scip);
3551 SCIP_CALL( SCIPallocBufferArray(
scip, &solforscip, nvars) );
3553 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, &objforscip, solforscip, &slength) );
3555 assert( slength == nvars );
3559 SCIP_CALL( SCIPcreateSol(
scip, &scipsol, NULL) );
3560 #if ( SCIP_VERSION >= 700 || (SCIP_VERSION >= 602 && SCIP_SUBVERSION > 0) ) 3561 SCIP_CALL( SCIPsetRelaxSolVals(
scip, relax, nvars, vars, solforscip, TRUE) );
3563 SCIP_CALL( SCIPsetRelaxSolVals(
scip, nvars, vars, solforscip, TRUE) );
3565 *lowerbound = objforscip;
3568 SCIP_CALL( SCIPgetLPColsData(
scip, &cols, &ncols) );
3569 for (i = 0; i < ncols; i++)
3571 #if ( SCIP_VERSION >= 700 || (SCIP_VERSION >= 602 && SCIP_SUBVERSION > 0) ) 3572 SCIP_CALL( SCIPsetRelaxSolVal(
scip, relax, SCIPcolGetVar(cols[i]), SCIPgetSolVal(
scip, scipsol, SCIPcolGetVar(cols[i]))) );
3574 SCIP_CALL( SCIPsetRelaxSolVal(
scip, SCIPcolGetVar(cols[i]), SCIPgetSolVal(
scip, scipsol, SCIPcolGetVar(cols[i]))) );
3578 #if ( SCIP_VERSION >= 700 || (SCIP_VERSION >= 602 && SCIP_SUBVERSION > 0) ) 3579 SCIP_CALL( SCIPmarkRelaxSolValid(
scip, relax, TRUE) );
3581 SCIP_CALL( SCIPmarkRelaxSolValid(
scip, TRUE) );
3583 *result = SCIP_SUCCESS;
3585 SCIPfreeBufferArray(
scip, &solforscip);
3586 SCIP_CALL( SCIPfreeSol(
scip, &scipsol) );
3588 *result = SCIP_SUCCESS;
3593 SCIP_CALL( SCIPconstructLP(
scip, &cutoff) );
3597 relaxdata->feasible = FALSE;
3598 *result = SCIP_CUTOFF;
3603 SCIP_CALL( SCIPflushLP(
scip) );
3606 nconss = SCIPgetNConss(
scip);
3608 #ifdef SCIP_EVEN_MORE_DEBUG 3609 for (i = 0; i < nvarsfordebug; i++)
3611 SCIPdebugMsg(
scip,
"variable %s: status = %u, integral = %u, bounds = [%f, %f]\n", SCIPvarGetName(varsfordebug[i]), SCIPvarGetStatus(varsfordebug[i]),
3612 SCIPvarIsIntegral(varsfordebug[i]), SCIPvarGetLbLocal(varsfordebug[i]), SCIPvarGetUbLocal(varsfordebug[i]));
3619 relaxdata->feasible = TRUE;
3620 *result = SCIP_DIDNOTRUN;
3630 SCIP_CALL( SCIPallocBufferArray(
scip, &ubs, nvars) );
3633 for (i = 0; i < nvars; i++)
3635 ubs[i] = SCIPvarGetUbLocal(vars[i]);
3636 *lowerbound += SCIPvarGetObj(vars[i]) * ubs[i];
3637 assert( SCIPisFeasEQ(
scip, SCIPvarGetUbLocal(vars[i]), SCIPvarGetLbLocal(vars[i])));
3640 SCIPdebugMsg(
scip,
"EVERYTHING IS FIXED, objective value = %f\n", *lowerbound);
3642 SCIP_CALL( SCIPcreateSol(
scip, &scipsol, NULL) );
3643 SCIP_CALL( SCIPsetSolVals(
scip, scipsol, nvars, vars, ubs) );
3646 for (i = 0; i < nvars; i++)
3648 #if ( SCIP_VERSION >= 700 || (SCIP_VERSION >= 602 && SCIP_SUBVERSION > 0) ) 3649 SCIP_CALL( SCIPsetRelaxSolVal(
scip, relax, vars[i], SCIPvarGetLbLocal(vars[i])) );
3651 SCIP_CALL( SCIPsetRelaxSolVal(
scip, vars[i], SCIPvarGetLbLocal(vars[i])) );
3654 #if ( SCIP_VERSION >= 700 || (SCIP_VERSION >= 602 && SCIP_SUBVERSION > 0) ) 3655 SCIP_CALL( SCIPmarkRelaxSolValid(
scip, relax, TRUE) );
3657 SCIP_CALL( SCIPmarkRelaxSolValid(
scip, TRUE) );
3661 SCIP_CALL( SCIPcheckSol(
scip, scipsol, FALSE, TRUE, TRUE, TRUE, TRUE, &feasible) );
3663 relaxdata->feasible = feasible;
3665 SCIP_CALL( SCIPfreeSol(
scip, &scipsol) );
3667 SCIPfreeBufferArray(
scip, &ubs);
3669 *result = SCIP_SUCCESS;
3687 SCIP_RELAXDATA* relaxdata;
3688 SCIP_RETCODE retcode;
3690 SCIP_Real givenpenaltyparam;
3691 SCIP_Real projminevprimal;
3692 SCIP_Real projminevdual;
3695 assert( relax != NULL );
3697 relaxdata = SCIPrelaxGetData(relax);
3698 assert( relaxdata != NULL );
3700 relaxdata->objval = 0.0;
3701 relaxdata->origsolved = FALSE;
3702 relaxdata->probingsolved = FALSE;
3703 relaxdata->sdpcalls = 0;
3704 relaxdata->sdpinterfacecalls = 0;
3705 relaxdata->sdpiterations = 0;
3706 relaxdata->solvedfast = 0;
3707 relaxdata->solvedmedium = 0;
3708 relaxdata->solvedstable = 0;
3709 relaxdata->solvedpenalty = 0;
3710 relaxdata->stablewslater = 0;
3711 relaxdata->unstablewslater = 0;
3712 relaxdata->boundedwslater = 0;
3713 relaxdata->unsolvedwslater = 0;
3714 relaxdata->stablenoslater = 0;
3715 relaxdata->unsolvednoslater = 0;
3716 relaxdata->boundednoslater = 0;
3717 relaxdata->unsolvednoslater = 0;
3718 relaxdata->nslaterholds = 0;
3719 relaxdata->nnoslater = 0;
3720 relaxdata->nslatercheckfailed = 0;
3721 relaxdata->npslaterholds = 0;
3722 relaxdata->npnoslater = 0;
3723 relaxdata->npslatercheckfailed = 0;
3724 relaxdata->ndslaterholds = 0;
3725 relaxdata->ndnoslater = 0;
3726 relaxdata->ndslatercheckfailed = 0;
3727 relaxdata->nslaterinfeasible = 0;
3728 relaxdata->stableinfeasible = 0;
3729 relaxdata->unstableinfeasible = 0;
3730 relaxdata->penaltyinfeasible = 0;
3731 relaxdata->boundedinfeasible = 0;
3732 relaxdata->unsolvedinfeasible = 0;
3733 relaxdata->roundingprobinf = 0;
3734 relaxdata->primalroundfails = 0;
3735 relaxdata->dualroundfails = 0;
3736 relaxdata->roundstartsuccess = 0;
3737 relaxdata->roundingoptimal = 0;
3738 relaxdata->roundingcutoff = 0;
3740 if ( relaxdata->warmstart && relaxdata->warmstartproject == 4 )
3742 if ( relaxdata->roundingprobtime == NULL )
3744 SCIP_CALL( SCIPcreateClock(
scip, &relaxdata->roundingprobtime) );
3749 assert( relaxdata->roundingprobtime == NULL );
3751 relaxdata->unsolved = 0;
3752 relaxdata->feasible = FALSE;
3754 relaxdata->ipXexists = FALSE;
3755 relaxdata->ipZexists = FALSE;
3757 relaxdata->sdpconshdlr = SCIPfindConshdlr(
scip,
"SDP");
3758 if ( relaxdata->sdpconshdlr == NULL )
3759 return SCIP_PLUGINNOTFOUND;
3761 relaxdata->sdprank1conshdlr = SCIPfindConshdlr(
scip,
"SDPrank1");
3762 if ( relaxdata->sdprank1conshdlr == NULL )
3763 return SCIP_PLUGINNOTFOUND;
3765 nvars = SCIPgetNVars(
scip);
3766 vars = SCIPgetVars(
scip);
3779 if ( retcode == SCIP_PARAMETERUNKNOWN )
3781 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3782 "SDP Solver <%s>: gaptol setting not available -- SCIP parameter has no effect.\n",
3787 SCIP_CALL( retcode );
3791 if ( retcode == SCIP_PARAMETERUNKNOWN )
3793 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3794 "SDP Solver <%s>: sdpsolverfeastol setting not available -- SCIP parameter has no effect.\n",
3799 SCIP_CALL( retcode );
3803 if ( retcode == SCIP_PARAMETERUNKNOWN )
3805 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3806 "SDP Solver <%s>: epsilon setting not available -- SCIP parameter has no effect.\n",
3811 SCIP_CALL( retcode );
3815 if ( retcode == SCIP_PARAMETERUNKNOWN )
3817 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3818 "SDP Solver <%s>: feastol setting not available -- SCIP parameter has no effect.\n",
3823 SCIP_CALL( retcode );
3827 if ( SCIPisGE(
scip, relaxdata->penaltyparam, 0.0) )
3830 givenpenaltyparam = relaxdata->penaltyparam;
3831 if ( retcode == SCIP_PARAMETERUNKNOWN )
3833 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3834 "SDP Solver <%s>: penaltyparam setting not available -- SCIP parameter has no effect\n",
3839 SCIP_CALL( retcode );
3849 for (v = 0; v < nvars; v++)
3851 if ( SCIPisGT(
scip, REALABS(SCIPvarGetObj(vars[v])), maxcoeff) )
3852 maxcoeff = REALABS(SCIPvarGetObj(vars[v]));
3859 if ( SCIPisGE(
scip, relaxdata->maxpenaltyparam, 0.0) )
3863 if ( retcode == SCIP_PARAMETERUNKNOWN )
3865 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3866 "SDP Solver <%s>: maxpenaltyparam setting not available -- SCIP parameter has no effect.\n",
3871 SCIP_CALL( retcode );
3875 if ( SCIPisLT(
scip, givenpenaltyparam, relaxdata->maxpenaltyparam) )
3877 SCIPdebugMsg(
scip,
"Penalty parameter %f overwritten by maxpenaltyparam %f!\n", givenpenaltyparam, relaxdata->maxpenaltyparam);
3883 SCIP_Real givenmaxpenaltyparam;
3890 if ( retcode == SCIP_PARAMETERUNKNOWN )
3892 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3893 "SDP Solver <%s>: npenaltyincr setting not available -- SCIP parameter has no effect.\n",
3898 SCIP_CALL( retcode );
3904 if ( retcode == SCIP_PARAMETERUNKNOWN )
3906 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3907 "SDP Solver <%s>: peninfeasadjust setting not available -- SCIP parameter has no effect.\n",
3912 SCIP_CALL( retcode );
3918 if ( SCIPisGE(
scip, relaxdata->lambdastar, 0.0) )
3931 conss = SCIPgetConss(
scip);
3932 nconss = SCIPgetNConss(
scip);
3935 for (c = 0; c < nconss; c++)
3938 if ( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[c])),
"SDP") == 0 || strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[c])),
"SDPrank1") == 0 )
3941 if ( (! SCIPisInfinity(
scip, maxguess) ) && SCIPisGT(
scip, guess, maxguess) )
3951 relaxdata->lambdastar = 1.0;
3953 if ( retcode == SCIP_PARAMETERUNKNOWN )
3955 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
3956 "SDP Solver <%s>: lambdastar setting not available -- SCIP parameter has no effect.\n",
3961 SCIP_CALL( retcode );
3965 SCIP_CALL( SCIPgetRealParam(
scip,
"relaxing/SDP/warmstartprminevpri", &projminevprimal) );
3966 SCIP_CALL( SCIPgetRealParam(
scip,
"relaxing/SDP/warmstartprminevdu", &projminevdual) );
3968 if ( SCIPisGE(
scip, projminevprimal, 0.0) && SCIPisGE(
scip, projminevdual, 0.0) )
3970 relaxdata->warmstartprojminevprimal = projminevprimal;
3971 relaxdata->warmstartprojminevdual = projminevdual;
3973 else if ( SCIPisGE(
scip, projminevprimal, 0.0) && relaxdata->warmstartprojpdsame )
3975 relaxdata->warmstartprojminevprimal = projminevprimal;
3976 relaxdata->warmstartprojminevdual = projminevprimal;
3978 else if ( SCIPisGE(
scip, projminevdual, 0.0) && relaxdata->warmstartprojpdsame )
3980 relaxdata->warmstartprojminevprimal = projminevdual;
3981 relaxdata->warmstartprojminevdual = projminevdual;
3985 SCIP_CONSHDLR* sdpconshdlr;
3986 SCIP_CONSHDLR* sdprank1conshdlr;
3987 SCIP_CONS** sdpblocks;
3988 SCIP_CONS** sdporigblocks;
3989 SCIP_CONS** sdprank1blocks;
3996 SCIP_Real maxsdprhs;
3998 SCIP_Real maxsdpcoef;
4003 sdpconshdlr = relaxdata->sdpconshdlr;
4004 sdprank1conshdlr = relaxdata->sdprank1conshdlr;
4006 nsdporigblocks = SCIPconshdlrGetNConss(sdpconshdlr);
4007 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
4008 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
4009 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
4011 nsdpblocks = nsdporigblocks + nrank1blocks;
4013 SCIP_CALL( SCIPallocBufferArray(
scip, &sdpblocks, nsdpblocks) );
4014 for (c = 0; c < nsdporigblocks; ++c)
4015 sdpblocks[c] = sdporigblocks[c];
4017 for (c = 0; c < nrank1blocks; ++c)
4018 sdpblocks[nsdporigblocks + c] = sdprank1blocks[c];
4022 for (b = 0; b < nsdpblocks; b++)
4025 if ( SCIPisGT(
scip, sdpcoef, maxsdpcoef) )
4026 maxsdpcoef = sdpcoef;
4032 for (b = 0; b < nsdpblocks; b++)
4040 for (v = 0; v < nvars; v++)
4042 if ( SCIPisGT(
scip, REALABS(SCIPvarGetObj(vars[v])), maxobj) )
4043 maxobj = REALABS(SCIPvarGetObj(vars[v]));
4046 if ( relaxdata->warmstartprojpdsame )
4048 maxval = SCIPisGT(
scip, maxsdprhs, maxobj) ? maxsdprhs : maxobj;
4049 maxval = SCIPisGT(
scip, maxsdpcoef, maxval) ? maxsdpcoef : maxval;
4054 SCIPdebugMsg(
scip,
"Setting warmstartprojminev to %f\n", relaxdata->warmstartprojminevdual);
4058 if ( ! SCIPisGE(
scip, projminevprimal, 0.0) )
4062 SCIPdebugMsg(
scip,
"Setting warmstartprojminevprimal to %f\n", relaxdata->warmstartprojminevprimal);
4065 if ( ! SCIPisGE(
scip, projminevdual, 0.0) )
4069 SCIPdebugMsg(
scip,
"Setting warmstartprojminevdual to %f\n", relaxdata->warmstartprojminevdual);
4072 SCIPfreeBufferArray(
scip, &sdpblocks);
4076 if ( retcode == SCIP_PARAMETERUNKNOWN )
4078 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
4079 "SDP Solver <%s>: sdpinfo setting not available -- SCIP parameter has no effect.\n",
4084 SCIP_CALL( retcode );
4091 if ( retcode == SCIP_PARAMETERUNKNOWN )
4093 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
4094 "SDP Solver <%s>: nthreads setting not available -- SCIP parameter has no effect.\n",
4099 SCIP_CALL( retcode );
4104 if ( retcode == SCIP_PARAMETERUNKNOWN )
4106 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
4107 "SDP Solver <%s>: slatercheck setting not available -- SCIP parameter has no effect.\n",
4112 SCIP_CALL( retcode );
4122 if ( retcode == SCIP_PARAMETERUNKNOWN )
4124 SCIPverbMessage(
scip, SCIP_VERBLEVEL_FULL, NULL,
4125 "SDP Solver <%s>: warmstartpreoptgap setting not available -- SCIP parameter has no effect.\n",
4130 SCIP_CALL( retcode );
4141 assert(
scip != NULL );
4142 assert( relax != NULL );
4143 assert( strcmp(SCIPrelaxGetName(relax),
RELAX_NAME) == 0 );
4154 SCIP_RELAXDATA* relaxdata;
4156 assert(
scip != NULL );
4157 assert( relax != NULL );
4159 relaxdata = SCIPrelaxGetData(relax);
4160 assert( relaxdata != NULL );
4162 SCIPdebugMsg(
scip,
"Exiting Relaxation Handler.\n");
4164 if ( relaxdata->displaystat && SCIPgetSubscipDepth(
scip) == 0 )
4166 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"\nSDP iterations:\t\t\t\t%6d\n", relaxdata->sdpiterations);
4167 if ( relaxdata->sdpcalls )
4169 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Average SDP-iterations:\t\t\t%6.2f\n",
4170 (SCIP_Real) relaxdata->sdpiterations / (SCIP_Real) relaxdata->sdpcalls );
4172 if ( relaxdata->sdpinterfacecalls )
4176 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' solved:\t%6.2f\n",
4177 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4178 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'medium settings' solved:\t%6.2f\n",
4179 100.0 * (SCIP_Real) relaxdata->solvedmedium / (SCIP_Real) relaxdata->sdpinterfacecalls);
4180 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' solved:\t%6.2f\n",
4181 100.0 * (SCIP_Real) relaxdata->solvedstable / (SCIP_Real) relaxdata->sdpinterfacecalls);
4185 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'default formulation' solved:\t%6.2f\n",
4186 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4188 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage penalty formulation used:\t%6.2f\n",
4189 100.0 * (SCIP_Real) relaxdata->solvedpenalty / (SCIP_Real) relaxdata->sdpinterfacecalls);
4190 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage unsolved even with penalty:\t%6.2f\n",
4191 100.0 * (SCIP_Real) relaxdata->unsolved / (SCIP_Real) relaxdata->sdpinterfacecalls);
4193 if ( relaxdata->slatercheck )
4195 if ( relaxdata->sdpinterfacecalls )
4197 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater condition held:\t%6.2f\n",
4198 100.0 * (SCIP_Real) relaxdata->npslaterholds / (SCIP_Real) relaxdata->sdpinterfacecalls);
4199 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater condition did not hold:\t%6.2f\n",
4200 100.0 * (SCIP_Real) relaxdata->npnoslater / (SCIP_Real) relaxdata->sdpinterfacecalls);
4201 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater check failed:\t%6.2f\n",
4202 100.0 * (SCIP_Real) relaxdata->npslatercheckfailed / (SCIP_Real) relaxdata->sdpinterfacecalls);
4204 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater condition held:\t%6.2f\n",
4205 100.0 * (SCIP_Real) relaxdata->ndslaterholds / (SCIP_Real) relaxdata->sdpinterfacecalls);
4206 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater condition did not hold:\t%6.2f\n",
4207 100.0 * (SCIP_Real) relaxdata->ndnoslater / (SCIP_Real) relaxdata->sdpinterfacecalls);
4208 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater check failed:\t%6.2f\n",
4209 100.0 * (SCIP_Real) relaxdata->ndslatercheckfailed / (SCIP_Real) relaxdata->sdpinterfacecalls);
4210 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater check detected infeasibility:\t%6.2f\n",
4211 100.0 * (SCIP_Real) relaxdata->nslaterinfeasible / (SCIP_Real) relaxdata->sdpinterfacecalls);
4213 if ( relaxdata->nslaterholds )
4215 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with primal and dual slater holding:\t%6.2f\n",
4216 100.0 * (SCIP_Real) relaxdata->stablewslater / (SCIP_Real) relaxdata->nslaterholds);
4217 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with primal and dual slater holding:\t%6.2f\n",
4218 100.0 * (SCIP_Real) relaxdata->unstablewslater / (SCIP_Real) relaxdata->nslaterholds);
4219 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with primal and dual slater holding:\t%6.2f\n",
4220 100.0 * (SCIP_Real) relaxdata->penaltywslater / (SCIP_Real) relaxdata->nslaterholds);
4221 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with primal and dual slater holding:\t%6.2f\n",
4222 100.0 * (SCIP_Real) relaxdata->boundedwslater / (SCIP_Real) relaxdata->nslaterholds);
4223 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with primal and dual slater holding:\t%6.2f\n",
4224 100.0 * (SCIP_Real) relaxdata->unsolvedwslater / (SCIP_Real) relaxdata->nslaterholds);
4226 if ( relaxdata->nnoslater )
4228 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with either primal or dual slater not holding:\t%6.2f\n",
4229 100.0 * (SCIP_Real) relaxdata->stablenoslater / (SCIP_Real) relaxdata->nnoslater);
4230 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with either primal or dual slater not holding:\t%6.2f\n",
4231 100.0 * (SCIP_Real) relaxdata->unstablenoslater / (SCIP_Real) relaxdata->nnoslater);
4232 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with either primal or dual slater not holding:\t%6.2f\n",
4233 100.0 * (SCIP_Real) relaxdata->penaltynoslater / (SCIP_Real) relaxdata->nnoslater);
4234 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with either primal or dual slater not holding:\t%6.2f\n",
4235 100.0 * (SCIP_Real) relaxdata->boundednoslater / (SCIP_Real) relaxdata->nnoslater);
4236 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with either primal or dual slater not holding:\t%6.2f\n",
4237 100.0 * (SCIP_Real) relaxdata->unsolvednoslater / (SCIP_Real) relaxdata->nnoslater);
4239 if ( relaxdata->nslaterinfeasible )
4241 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with slater check showing infeasibility:\t%6.2f\n",
4242 100.0 * (SCIP_Real) relaxdata->stableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4243 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with slater check showing infeasibility:\t%6.2f\n",
4244 100.0 * (SCIP_Real) relaxdata->unstableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4245 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with slater check showing infeasibility:\t%6.2f\n",
4246 100.0 * (SCIP_Real) relaxdata->penaltyinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4247 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with slater check showing infeasibility:\t%6.2f\n",
4248 100.0 * (SCIP_Real) relaxdata->boundedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4249 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with slater check showing infeasibility:\t%6.2f\n",
4250 100.0 * (SCIP_Real) relaxdata->unsolvedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4252 #ifdef SLATERSOLVED_ABSOLUTE 4253 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with primal and dual slater holding:\t%d\n", relaxdata->nslaterholds);
4254 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'fastest settings' and primal and dual slater holding:\t%d\n", relaxdata->stablewslater);
4255 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'stable settings' and primal and dual slater holding:\t%d\n", relaxdata->unstablewslater);
4256 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and primal and dual slater holding:\t%d\n", relaxdata->penaltywslater);
4257 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'computed infeasible lower bound' and primal and dual slater holding:\t%d\n", relaxdata->boundedwslater);
4258 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and primal and dual slater holding:\t%d\n", relaxdata->unsolvedwslater);
4260 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with either primal or dual slater not holding:\t%d\n", relaxdata->nnoslater);
4261 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'fastest settings' and either primal or dual slater not holding:\t%d\n", relaxdata->stablenoslater);
4262 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'stable settings' and either primal or dual slater not holding:\t%d\n", relaxdata->unstablenoslater);
4263 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and either primal or dual slater not holding:\t%d\n", relaxdata->penaltynoslater);
4264 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'computed infeasible lower bound' and either primal or dual slater not holding:\t%d\n", relaxdata->boundednoslater);
4265 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and either primal or dual slater not holding:\t%d\n", relaxdata->unsolvednoslater);
4267 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes:\t%d\n", relaxdata->nslaterinfeasible);
4268 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'fastest settings':\t%d\n", relaxdata->stableinfeasible);
4269 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'stable settings':\t%d\n", relaxdata->unstableinfeasible);
4270 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'penalty':\t%d\n", relaxdata->penaltyinfeasible);
4271 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'computed infeasible lower bound':\t%d\n", relaxdata->boundedinfeasible);
4272 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'unsolved':\t%d\n", relaxdata->unsolvedinfeasible);
4275 if ( relaxdata->warmstart && relaxdata->warmstartproject == 4 )
4277 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes detected infeasible through primal rounding problem:\t%d\n", relaxdata->roundingprobinf);
4278 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes that were successfully warmstarted using the rounding problems:\t%d\n", relaxdata->roundstartsuccess);
4279 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the primal rounding problem failed:\t%d\n", relaxdata->primalroundfails);
4280 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the dual rounding problem failed:\t%d\n", relaxdata->dualroundfails);
4281 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the optimal solution was determined by the rounding problem:\t%d\n", relaxdata->roundingoptimal);
4282 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes cut off through bounding by the rounding problem:\t%d\n", relaxdata->roundingcutoff);
4283 SCIPverbMessage(
scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Time spent in rounding problems for warmstarting / detecting infeasibility:\t%f s\n",
4284 SCIPgetClockTime(
scip, relaxdata->roundingprobtime));
4288 if ( relaxdata->varmapper != NULL )
4291 relaxdata->varmapper = NULL;
4295 if ( relaxdata->warmstart && SCIPisGT(
scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->nblocks > 0 )
4299 for (b = 0; b < relaxdata->nblocks; b++)
4303 SCIPfreeBlockMemoryArrayNull(
scip, &(relaxdata->ipXval[b]), relaxdata->ipXnblocknonz[b]);
4304 SCIPfreeBlockMemoryArrayNull(
scip, &(relaxdata->ipXcol[b]), relaxdata->ipXnblocknonz[b]);
4305 SCIPfreeBlockMemoryArrayNull(
scip, &(relaxdata->ipXrow[b]), relaxdata->ipXnblocknonz[b]);
4307 if ( relaxdata->ipZnblocknonz[b] > 0 )
4309 SCIPfreeBlockMemoryArrayNull(
scip, &(relaxdata->ipZval[b]), relaxdata->ipZnblocknonz[b]);
4310 SCIPfreeBlockMemoryArrayNull(
scip, &(relaxdata->ipZcol[b]), relaxdata->ipZnblocknonz[b]);
4311 SCIPfreeBlockMemoryArrayNull(
scip, &(relaxdata->ipZrow[b]), relaxdata->ipZnblocknonz[b]);
4316 SCIPfreeBlockMemoryArrayNull(
scip, &relaxdata->ipXval, relaxdata->nblocks);
4317 SCIPfreeBlockMemoryArrayNull(
scip, &relaxdata->ipXcol, relaxdata->nblocks);
4318 SCIPfreeBlockMemoryArrayNull(
scip, &relaxdata->ipXrow, relaxdata->nblocks);
4319 SCIPfreeBlockMemoryArrayNull(
scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks);
4321 SCIPfreeBlockMemoryArrayNull(
scip, &relaxdata->ipZval, relaxdata->nblocks);
4322 SCIPfreeBlockMemoryArrayNull(
scip, &relaxdata->ipZcol, relaxdata->nblocks);
4323 SCIPfreeBlockMemoryArrayNull(
scip, &relaxdata->ipZrow, relaxdata->nblocks);
4324 SCIPfreeBlockMemoryArrayNull(
scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks);
4325 SCIP_CALL( SCIPfreeSol(
scip, &relaxdata->ipy) );
4328 relaxdata->objval = 0.0;
4329 relaxdata->origsolved = FALSE;
4330 relaxdata->probingsolved = FALSE;
4331 relaxdata->feasible = FALSE;
4332 relaxdata->sdpiterations = 0;
4333 relaxdata->sdpcalls = 0;
4334 relaxdata->sdpinterfacecalls = 0;
4335 relaxdata->lastsdpnode = 0;
4336 relaxdata->unsolved = 0;
4346 SCIP_RELAXDATA* relaxdata;
4348 assert( relax != NULL );
4350 relaxdata = SCIPrelaxGetData(relax);
4351 assert( relaxdata != NULL );
4353 if ( relaxdata->roundingprobtime != NULL )
4355 SCIP_CALL( SCIPfreeClock(
scip, &relaxdata->roundingprobtime) );
4365 SCIP_RELAXDATA* relaxdata;
4367 relaxdata = SCIPrelaxGetData(relax);
4368 assert(relaxdata != NULL);
4370 if ( relaxdata->sdpi != NULL )
4374 if ( relaxdata->lpi != NULL )
4376 SCIP_CALL( SCIPlpiFree(&(relaxdata->lpi)) );
4379 SCIPfreeMemory(
scip, &relaxdata);
4381 SCIPrelaxSetData(relax, NULL);
4391 SCIP_RELAXDATA* relaxdata = NULL;
4396 assert( scip != NULL );
4399 SCIP_CALL( SCIPallocMemory(scip, &relaxdata) );
4400 SCIP_CALL(
SCIPsdpiCreate(&sdpi, SCIPgetMessagehdlr(scip), SCIPblkmem(scip), SCIPbuffer(scip)) );
4401 SCIP_CALL( SCIPlpiCreate(&lpi, SCIPgetMessagehdlr(scip),
"SDProundingProb", SCIP_OBJSEN_MINIMIZE) );
4403 relaxdata->sdpi = sdpi;
4404 relaxdata->lpi = lpi;
4405 relaxdata->lastsdpnode = -1;
4406 relaxdata->nblocks = 0;
4407 relaxdata->varmapper = NULL;
4408 relaxdata->roundingprobtime = NULL;
4409 relaxdata->sdpconshdlr = NULL;
4410 relaxdata->sdprank1conshdlr = NULL;
4414 assert( relax != NULL );
4417 SCIP_CALL( SCIPsetRelaxInitsol(scip, relax, relaxInitSolSdp) );
4418 SCIP_CALL( SCIPsetRelaxExitsol(scip, relax, relaxExitSolSdp) );
4419 SCIP_CALL( SCIPsetRelaxExit(scip, relax, relaxExitSdp) );
4420 SCIP_CALL( SCIPsetRelaxFree(scip, relax, relaxFreeSdp) );
4421 SCIP_CALL( SCIPsetRelaxCopy(scip, relax, relaxCopySdp) );
4424 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolvergaptol",
4425 "the stopping criterion for the duality gap the sdpsolver should use",
4428 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolverfeastol",
4429 "the feasibility tolerance for the SDP solver",
4432 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/penaltyparam",
4433 "the starting value of the penalty parameter Gamma used for the penalty formulation if the " 4434 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem",
4437 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/maxpenaltyparam",
4438 "the maximum value of the penalty parameter Gamma used for the penalty formulation if the " 4439 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem",
4442 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/peninfeasadjust",
4443 "gap- or feastol will be multiplied by this before checking for infeasibility using the penalty formulation",
4446 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartipfactor",
4447 "factor for interior point in convexcombination of IP and parent solution, if warmstarts are enabled",
4450 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartprimaltype",
4451 "how to warmstart the primal problem? 1: scaled identity/analytic center, 2: elementwise reciprocal, 3: saved primal sol",
4454 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartiptype",
4455 "which interior point to use for convex combination for warmstarts? 1: scaled identity, 2: analytic center",
4458 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartproject",
4459 "how to update dual matrix for new bounds? 1: use old bounds, 2: use new bounds, 3: use new bounds and project on psd cone, 4: use new bounds and solve rounding problem",
4462 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevpri",
4463 "minimum eigenvalue to allow when projecting primal matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically",
4466 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevdu",
4467 "minimum eigenvalue to allow when projecting dual matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically",
4470 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartprojpdsame",
4471 "Should one shared minimum eigenvalue respectively maximum entry be computed for primal and dual problem instead " 4472 "of different ones for primal and dual and each block for projection or convex combination ?",
4475 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartpreoptsol",
4476 "Should a preoptimal solution (with larger gap) instead of the optimal solution be used for warmstarts",
4479 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartpreoptgap",
4480 "If warmstartpreoptsol is TRUE, this is the gap where the preoptimal solution will be saved",
4483 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartroundonlyinf",
4484 "Only use solution of roundingproblem to detect infeasibility (only has an effect for warmstartproject = 4)",
4487 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/npenaltyincr",
4488 "maximum number of times the penalty parameter will be increased if the penalty formulation failed",
4491 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/lambdastar",
4492 "the parameter lambda star used by SDPA to set the initial point;" 4493 "set this to a negative value to compute the parameter depending on the given problem",
4496 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/slatercheck",
4497 "Should the Slater condition for the primal and dual problem be checked ahead of solving each SDP? 0: no, 1: yes but only for statistics, 2: yes and print warning for " 4498 "every problem not satisfying primal and dual Slater condition",
4501 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/sdpinfo",
4502 "Should the SDP solver output information to the screen?",
4505 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstart",
4506 "Should the SDP solver try to use warmstarts?",
4509 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/objlimit",
4510 "Should an objective limit be given to the SDP-Solver?",
4513 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/resolve",
4514 "Should the relaxation be resolved after bound-tightenings were found during propagation (outside of probing)?",
4517 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/tightenvb",
4518 "Should Big-Ms in varbound-like constraints be tightened before giving them to the SDP-solver ?",
4521 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/displaystatistics",
4522 "Should statistics about SDP iterations and solver settings/success be printed after quitting SCIP-SDP ?",
4525 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetfreq",
4526 "frequency for resetting parameters in SDP solver and trying again with fastest settings (-1: never, 0: only at depth settingsresetofs);" 4527 "currently only supported for SDPA",
4530 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetofs",
4531 "frequency offset for resetting parameters in SDP solver and trying again with fastest settings; currently only supported for SDPA",
4534 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/sdpsolverthreads",
4535 "number of threads the SDP solver should use (-1 = number of cores); currently only supported for MOSEK",
4556 SCIP_CONSHDLR* sdpconshdlr;
4557 SCIP_CONSHDLR* sdprank1conshdlr;
4558 SCIP_RELAXDATA* relaxdata;
4561 SCIP_CONS** sdpblocks;
4562 SCIP_Real* solforscip;
4564 SCIP_Real timelimit;
4574 SCIP_CONS** sdporigblocks;
4575 SCIP_CONS** sdprank1blocks;
4580 assert( scip != NULL );
4581 assert( relax != NULL );
4582 assert( SCIPgetStage(scip) == SCIP_STAGE_SOLVING );
4584 SCIPdebugMsg(scip,
"computing analytic centers for warmstarting\n");
4586 relaxdata = SCIPrelaxGetData(relax);
4587 assert( relaxdata != NULL );
4590 if ( relaxdata->ipXexists || relaxdata->ipZexists )
4592 SCIPdebugMsg(scip,
"aborting SCIPrelaxSdpComputeAnalyticCenters since analytic centers have already been computed\n");
4597 if ( SCIPgetNVars(scip) == 0 )
4601 if ( ! relaxdata->warmstart || relaxdata->warmstartiptype != 2 || SCIPisLE(scip, relaxdata->warmstartipfactor, 0.0) )
4605 sdpconshdlr = relaxdata->sdpconshdlr;
4606 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
4607 sdprank1conshdlr = relaxdata->sdprank1conshdlr;
4608 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
4609 if ( nsdpblocks + nrank1blocks + SCIPgetNLPRows(scip) <= 0 )
4612 relaxdata->nblocks = SCIPgetNLPRows(scip) + SCIPgetNVars(scip) > 0 ? nsdpblocks + nrank1blocks + 1 : SCIPconshdlrGetNConss(sdpconshdlr) + SCIPconshdlrGetNConss(sdprank1conshdlr);
4621 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
4622 if ( ! SCIPisInfinity(scip, timelimit) )
4624 timelimit -= SCIPgetSolvingTime(scip);
4625 if ( timelimit <= 0.0 )
4630 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit) );
4637 int npenaltybounds = 0;
4639 relaxdata->ipXexists = TRUE;
4642 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
4643 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
4644 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
4645 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
4648 for (b = 0; b < relaxdata->nblocks; b++)
4650 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
4651 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
4652 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
4657 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval) );
4660 for (i = 0; i < relaxdata->ipXnblocknonz[relaxdata->nblocks - 1]; i++)
4666 if ( npenaltybounds > 0 )
4668 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXrow[relaxdata->nblocks - 1],
4669 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4670 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXcol[relaxdata->nblocks - 1],
4671 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4672 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXval[relaxdata->nblocks - 1],
4673 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4674 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] = relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds;
4677 for (b = 0; b < relaxdata->nblocks; b++)
4680 SCIPsdpVarfixerSortRowCol(relaxdata->ipXrow[b], relaxdata->ipXcol[b], relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]);
4683 #ifdef SCIP_PRINT_WARMSTART 4684 SCIPdebugMsg(scip,
"Computed primal analytic center:\n");
4685 for (b = 0; b < relaxdata->nblocks; b++)
4687 SCIPdebugMsg(scip,
"primal matrix, block %d:\n", b);
4688 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4690 SCIPdebugMsg(scip,
"X_%d[%d,%d]: %f\n", b, relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
4697 relaxdata->ipXexists = TRUE;
4699 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
4700 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
4701 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
4702 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
4704 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
4705 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
4706 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
4707 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
4709 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nsdpblocks + nrank1blocks) );
4710 for (r = 0; r < nsdpblocks; ++r)
4711 sdpblocks[r] = sdporigblocks[r];
4713 for (r = 0; r < nrank1blocks; ++r)
4714 sdpblocks[nsdpblocks + r] = sdprank1blocks[r];
4716 nsdpblocks += nrank1blocks;
4718 for (b = 0; b < relaxdata->nblocks; b++)
4720 if ( b < relaxdata->nblocks - 1 )
4728 relaxdata->ipXnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
4730 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
4731 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
4732 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
4734 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4736 relaxdata->ipXrow[b][i] = i;
4737 relaxdata->ipXcol[b][i] = i;
4738 relaxdata->ipXval[b][i] = relaxdata->lambdastar;
4742 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of primal feasible set, using scaled identity instead.\n");
4743 SCIPfreeBufferArray(scip, &sdpblocks);
4752 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
4753 if ( ! SCIPisInfinity(scip, timelimit) )
4755 timelimit -= SCIPgetSolvingTime(scip);
4756 if ( timelimit <= 0.0 )
4761 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit) );
4771 relaxdata->ipZexists = TRUE;
4773 nvars = SCIPgetNVars(scip);
4774 vars = SCIPgetVars(scip);
4777 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
4778 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
4779 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
4780 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
4783 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
4786 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solforscip, &slength) );
4788 assert( slength == nvars );
4792 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
4793 SCIP_CALL( SCIPsetSolVals(scip, relaxdata->ipy, nvars, vars, solforscip) );
4794 #ifdef SCIP_PRINT_WARMSTART 4795 SCIPdebugMsg(scip,
"Computed dual analytic center:\n");
4796 for (i = 0; i < nvars; i++)
4798 SCIPdebugMsg(scip,
"y[%d] = %f\n", i, solforscip[i]);
4802 SCIPfreeBufferArray(scip, &solforscip);
4805 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
4806 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
4807 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
4808 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
4810 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nsdpblocks + nrank1blocks) );
4811 for (r = 0; r < nsdpblocks; ++r)
4812 sdpblocks[r] = sdporigblocks[r];
4814 for (r = 0; r < nrank1blocks; ++r)
4815 sdpblocks[nsdpblocks + r] = sdprank1blocks[r];
4817 nsdpblocks += nrank1blocks;
4819 for (b = 0; b < relaxdata->nblocks - 1; b++)
4822 arraylength = relaxdata->ipZnblocknonz[b];
4824 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
4825 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
4826 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
4830 &(relaxdata->ipZnblocknonz[b]), relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b]) );
4832 assert( relaxdata->ipZnblocknonz[b] <= arraylength );
4834 if ( relaxdata->ipZnblocknonz[b] < arraylength )
4836 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], arraylength, relaxdata->ipZnblocknonz[b]) );
4837 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], arraylength, relaxdata->ipZnblocknonz[b]) );
4838 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZval[b], arraylength, relaxdata->ipZnblocknonz[b]) );
4842 SCIPsdpVarfixerSortRowCol(relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]);
4846 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
4847 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], 2 * nrows + 2 * nvars) );
4848 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], 2 * nrows + 2 * nvars) );
4849 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], 2 * nrows + 2 * nvars) );
4852 relaxdata->ipZnblocknonz[b] = 2 * nrows + 2 * nvars;
4854 for (r = 0; r < nrows; r++)
4858 rownnonz = SCIProwGetNNonz(rows[r]);
4859 rowvals = SCIProwGetVals(rows[r]);
4860 rowcols = SCIProwGetCols(rows[r]);
4861 for (i = 0; i < rownnonz; i++)
4862 rowval += SCIPgetSolVal(scip, relaxdata->ipy, SCIPcolGetVar(rowcols[i])) * rowvals[i];
4864 relaxdata->ipZrow[b][2*r] = 2*r;
4865 relaxdata->ipZcol[b][2*r] = 2*r;
4866 relaxdata->ipZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
4867 relaxdata->ipZrow[b][2*r + 1] = 2*r + 1;
4868 relaxdata->ipZcol[b][2*r + 1] = 2*r + 1;
4869 relaxdata->ipZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
4872 for (v = 0; v < nvars; v++)
4874 relaxdata->ipZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
4875 relaxdata->ipZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
4876 relaxdata->ipZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, relaxdata->ipy, vars[v]) - SCIPvarGetLbLocal(vars[v]);
4877 relaxdata->ipZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
4878 relaxdata->ipZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
4879 relaxdata->ipZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
4881 #ifdef SCIP_PRINT_WARMSTART 4882 for (b = 0; b < relaxdata->nblocks - 1; b++)
4884 SCIPdebugMsg(scip,
"dual matrix, block %d:\n", b);
4885 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
4887 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", b, relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
4890 SCIPdebugMsg(scip,
"dual matrix, LP constraints:\n");
4891 for (r = 0; r < nrows; r++)
4893 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks, relaxdata->ipZrow[b][2*r], relaxdata->ipZcol[b][2*r], relaxdata->ipZval[b][2*r]);
4894 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks, relaxdata->ipZrow[b][2*r+1], relaxdata->ipZcol[b][2*r+1], relaxdata->ipZval[b][2*r+1]);
4896 for (v = 0; v < nvars; v++)
4898 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
4899 relaxdata->ipZrow[b][2*nrows + 2*v], relaxdata->ipZcol[b][2*nrows + 2*v], relaxdata->ipZval[b][2*nrows + 2*v]);
4900 SCIPdebugMsg(scip,
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
4901 relaxdata->ipZrow[b][2*nrows + 2*v + 1], relaxdata->ipZcol[b][2*nrows + 2*v + 1], relaxdata->ipZval[b][2*nrows + 2*v + 1]);
4904 SCIPfreeBufferArray(scip, &sdpblocks);
4909 relaxdata->ipZexists = TRUE;
4912 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
4914 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
4915 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
4916 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
4917 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
4919 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
4920 nrank1blocks = SCIPconshdlrGetNConss(sdprank1conshdlr);
4921 sdporigblocks = SCIPconshdlrGetConss(sdpconshdlr);
4922 sdprank1blocks = SCIPconshdlrGetConss(sdprank1conshdlr);
4924 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocks, nsdpblocks + nrank1blocks) );
4925 for (r = 0; r < nsdpblocks; ++r)
4926 sdpblocks[r] = sdporigblocks[r];
4928 for (r = 0; r < nrank1blocks; ++r)
4929 sdpblocks[nsdpblocks + r] = sdprank1blocks[r];
4931 nsdpblocks += nrank1blocks;
4933 for (b = 0; b < relaxdata->nblocks; b++)
4935 if ( b < relaxdata->nblocks - 1 )
4943 relaxdata->ipZnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
4945 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
4946 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
4947 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
4949 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4951 relaxdata->ipZrow[b][i] = i;
4952 relaxdata->ipZcol[b][i] = i;
4953 relaxdata->ipZval[b][i] = relaxdata->lambdastar;
4957 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of dual feasible set, using scaled identity instead.\n");
4958 SCIPfreeBufferArray(scip, &sdpblocks);
4980 SCIP_RELAXDATA* relaxdata;
4982 assert( relax != NULL );
4983 assert( lbvars != NULL );
4984 assert( ubvars != NULL );
4985 assert( arraylength != NULL );
4986 assert( *arraylength >= 0 );
4988 relaxdata = SCIPrelaxGetData(relax);
4989 assert( relaxdata != NULL );
5003 SCIP_RELAXDATA* relaxdata;
5005 assert( relax != NULL );
5006 assert( success != NULL );
5007 assert( objval != NULL );
5009 relaxdata = SCIPrelaxGetData(relax);
5010 assert( relaxdata != NULL );
5012 *success = relaxdata->origsolved;
5013 *objval = relaxdata->objval;
5023 SCIP_Real* solarray,
5027 SCIP_RELAXDATA* relaxdata;
5029 assert( relax != NULL );
5030 assert( success != NULL );
5031 assert( solarray != NULL );
5033 relaxdata = SCIPrelaxGetData(relax);
5034 assert( relaxdata != NULL );
5036 *success = relaxdata->origsolved;
5038 if ( *sollength >= SCIPgetNVars(scip) )
5040 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solarray, sollength) );
5044 SCIPdebugMsg(scip,
"Called SCIPrelaxSdpGetRelaxSol with an array that wasn't big enough, needed length %d, given %d!\n", SCIPgetNVars(scip), *sollength);
5045 *sollength = SCIPgetNVars(scip);
5056 assert( relax != NULL );
5057 assert( SCIPrelaxGetData(relax) != NULL );
5059 return SCIPrelaxGetData(relax)->lastsdpnode;
5067 SCIP_RELAXDATA* relaxdata;
5069 assert( relax != NULL );
5071 relaxdata = SCIPrelaxGetData(relax);
5073 assert( relaxdata != NULL );
5074 assert( relaxdata->sdpi != NULL );
5084 SCIP_RELAXDATA* relaxdata;
5086 assert( relax != NULL );
5088 relaxdata = SCIPrelaxGetData(relax);
5090 assert( relaxdata != NULL );
5091 assert( relaxdata->sdpi != NULL );
5093 return relaxdata->probingsolved;
5101 assert( relax != NULL );
5102 assert( SCIPrelaxGetData(relax) != NULL );
5104 return ( SCIPrelaxGetData(relax)->feasible );
5112 SCIP_RELAXDATA* relaxdata;
5114 assert( relax != NULL );
5116 relaxdata = SCIPrelaxGetData(relax);
5118 assert( SCIPrelaxGetData(relax) != NULL );
5119 assert( relaxdata->sdpi != NULL );
5129 assert( relax != NULL );
5130 assert( SCIPrelaxGetData(relax) != NULL );
5132 return SCIPrelaxGetData(relax)->sdpiterations;
5140 assert( relax != NULL );
5141 assert( SCIPrelaxGetData(relax) != NULL );
5143 return ( SCIPrelaxGetData(relax)->sdpcalls );
5151 assert( relax != NULL );
5152 assert( SCIPrelaxGetData(relax) != NULL );
5154 return ( SCIPrelaxGetData(relax)->sdpinterfacecalls );
5162 assert( relax != NULL );
5163 assert( SCIPrelaxGetData(relax) != NULL );
5165 return ( SCIPrelaxGetData(relax)->solvedfast );
5173 assert( relax != NULL );
5174 assert( SCIPrelaxGetData(relax) != NULL );
5176 return ( SCIPrelaxGetData(relax)->solvedmedium );
5184 assert( relax != NULL );
5185 assert( SCIPrelaxGetData(relax) != NULL );
5187 return ( SCIPrelaxGetData(relax)->solvedstable );
5195 assert( relax != NULL );
5196 assert( SCIPrelaxGetData(relax) != NULL );
5198 return ( SCIPrelaxGetData(relax)->solvedpenalty );
5206 assert( relax != NULL );
5207 assert( SCIPrelaxGetData(relax) != NULL );
5209 return ( SCIPrelaxGetData(relax)->unsolved );
5217 assert( relax != NULL );
5218 assert( SCIPrelaxGetData(relax) != NULL );
5220 return ( SCIPrelaxGetData(relax)->ndslaterholds );
5228 assert( relax != NULL );
5229 assert( SCIPrelaxGetData(relax) != NULL );
5231 return ( SCIPrelaxGetData(relax)->ndnoslater );
5239 assert( relax != NULL );
5240 assert( SCIPrelaxGetData(relax) != NULL );
5242 return ( SCIPrelaxGetData(relax)->nslaterinfeasible );
5250 assert( relax != NULL );
5251 assert( SCIPrelaxGetData(relax) != NULL );
5253 return ( SCIPrelaxGetData(relax)->ndslatercheckfailed );
5261 assert( relax != NULL );
5262 assert( SCIPrelaxGetData(relax) != NULL );
5264 return ( SCIPrelaxGetData(relax)->npslaterholds );
5272 assert( relax != NULL );
5273 assert( SCIPrelaxGetData(relax) != NULL );
5275 return ( SCIPrelaxGetData(relax)->npnoslater );
5283 assert( relax != NULL );
5284 assert( SCIPrelaxGetData(relax) != NULL );
5286 return ( SCIPrelaxGetData(relax)->npslatercheckfailed );
5294 assert( relax != NULL );
5295 assert( SCIPrelaxGetData(relax) != NULL );
5297 return ( SCIPrelaxGetData(relax)->nslaterholds );
5305 assert( relax != NULL );
5306 assert( SCIPrelaxGetData(relax) != NULL );
5308 return ( SCIPrelaxGetData(relax)->stablewslater );
5316 assert( relax != NULL );
5317 assert( SCIPrelaxGetData(relax) != NULL );
5319 return ( SCIPrelaxGetData(relax)->unstablewslater );
5327 assert( relax != NULL );
5328 assert( SCIPrelaxGetData(relax) != NULL );
5330 return ( SCIPrelaxGetData(relax)->penaltywslater );
5338 assert( relax != NULL );
5339 assert( SCIPrelaxGetData(relax) != NULL );
5341 return ( SCIPrelaxGetData(relax)->boundedwslater );
5349 assert( relax != NULL );
5350 assert( SCIPrelaxGetData(relax) != NULL );
5352 return ( SCIPrelaxGetData(relax)->unsolvedwslater );
5360 assert( relax != NULL );
5361 assert( SCIPrelaxGetData(relax) != NULL );
5363 return ( SCIPrelaxGetData(relax)->nnoslater );
5371 assert( relax != NULL );
5372 assert( SCIPrelaxGetData(relax) != NULL );
5374 return ( SCIPrelaxGetData(relax)->stablenoslater );
5382 assert( relax != NULL );
5383 assert( SCIPrelaxGetData(relax) != NULL );
5385 return ( SCIPrelaxGetData(relax)->unstablenoslater );
5393 assert( relax != NULL );
5394 assert( SCIPrelaxGetData(relax) != NULL );
5396 return ( SCIPrelaxGetData(relax)->penaltynoslater );
5404 assert( relax != NULL );
5405 assert( SCIPrelaxGetData(relax) != NULL );
5407 return ( SCIPrelaxGetData(relax)->boundednoslater );
5415 assert( relax != NULL );
5416 assert( SCIPrelaxGetData(relax) != NULL );
5418 return ( SCIPrelaxGetData(relax)->unsolvednoslater );
5426 assert( relax != NULL );
5427 assert( SCIPrelaxGetData(relax) != NULL );
5429 return ( SCIPrelaxGetData(relax)->stableinfeasible );
5437 assert( relax != NULL );
5438 assert( SCIPrelaxGetData(relax) != NULL );
5440 return ( SCIPrelaxGetData(relax)->unstableinfeasible );
5448 assert( relax != NULL );
5449 assert( SCIPrelaxGetData(relax) != NULL );
5451 return ( SCIPrelaxGetData(relax)->penaltyinfeasible );
5459 assert( relax != NULL );
5460 assert( SCIPrelaxGetData(relax) != NULL );
5462 return ( SCIPrelaxGetData(relax)->boundedinfeasible );
5470 assert( relax != NULL );
5471 assert( SCIPrelaxGetData(relax) != NULL );
5473 return ( SCIPrelaxGetData(relax)->unsolvedinfeasible );
SCIP_Real SCIPconsSdpGetMaxConstEntry(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPsdpiFree(SCIP_SDPI **sdpi)
#define WARMSTART_PROJ_FACTOR_PRIMAL
SCIP_Bool SCIPsdpiIsDualUnbounded(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiDelLPRows(SCIP_SDPI *sdpi, int firstrow, int lastrow)
int SCIPrelaxSdpGetNSlaterHoldsStable(SCIP_RELAX *relax)
int SCIPconsSdpComputeUbSparseSdpMatrixLength(SCIP_CONS *cons)
static SCIP_RETCODE putLpDataInInterface(SCIP *scip, SCIP_RELAXDATA *relaxdata, SCIP_Bool primalobj, SCIP_Bool dualobj)
int SCIPrelaxSdpGetNSlaterInfeasibleFast(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiGetSdpCalls(SCIP_SDPI *sdpi, int *calls)
SCIP_Bool SCIPsdpiDoesWarmstartNeedPrimal(void)
static SCIP_DECL_RELAXCOPY(relaxCopySdp)
SCIP_RETCODE SCIPsdpVarmapperAddVars(SCIP *scip, SdpVarmapper *varmapper, int nvars, SCIP_VAR **vars)
int SCIPrelaxSdpGetNSlaterFailsBounded(SCIP_RELAX *relax)
static SCIP_DECL_RELAXEXITSOL(relaxExitSolSdp)
#define DEFAULT_PENINFEASADJUST
int SCIPrelaxSdpGetNprimalSlaterHolds(SCIP_RELAX *relax)
SCIP_Real SCIPconsSavesdpsolGetMaxPrimalEntry(SCIP *scip, SCIP_CONS *cons)
static SCIP_Bool allVarsFixed(SCIP *scip)
#define DEFAULT_SLATERCHECK
#define WARMSTART_PREOPT_MIN_Z_LPVAL
int SCIPrelaxSdpGetNSdpPenalty(SCIP_RELAX *relax)
void SCIPsdpVarfixerSortRowCol(int *row, int *col, SCIP_Real *val, int length)
SCIP_RETCODE SCIPsdpiGetPrimalMatrix(SCIP_SDPI *sdpi, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
enum SCIP_SDPSolverSetting SCIP_SDPSOLVERSETTING
static SCIP_DECL_RELAXEXIT(relaxExitSdp)
SCIP_RETCODE SCIPconsSavesdpsolGetPrimalMatrixNonzeros(SCIP *scip, SCIP_CONS *cons, int nblocks, int *startXnblocknonz)
int SCIPrelaxSdpGetNdualSlaterHolds(SCIP_RELAX *relax)
const char * SCIPsdpiGetSolverName(void)
SCIP_RETCODE SCIPsdpiGetSol(SCIP_SDPI *sdpi, SCIP_Real *objval, SCIP_Real *dualsol, int *dualsollength)
int SCIPrelaxSdpGetNSdpUnsolved(SCIP_RELAX *relax)
#define DEFAULT_PENALTYPARAM
SCIP_RETCODE createConsSavesdpsol(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_Longint node, SCIP_SOL *sol, SCIP_Real maxprimalentry, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
SCIP_RETCODE SCIPsdpiSolve(SCIP_SDPI *sdpi, 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_Bool enforceslatercheck, SCIP_Real timelimit)
SCIP_Bool SCIPsdpiFeasibilityKnown(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiLoadSDP(SCIP_SDPI *sdpi, 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 nlpcons, SCIP_Real *lplhs, SCIP_Real *lprhs, int lpnnonz, int *lprow, int *lpcol, SCIP_Real *lpval)
SCIP_RETCODE SCIPsdpiComputeLambdastar(SCIP_SDPI *sdpi, SCIP_Real maxguess)
SCIP_RETCODE SCIPsdpiGetPrimalNonzeros(SCIP_SDPI *sdpi, int nblocks, int *startXnblocknonz)
SCIP_RETCODE createConsSavedsdpsettings(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_SDPSOLVERSETTING settings)
SCIP_SOL * SCIPconsSavesdpsolGetDualVector(SCIP *scip, SCIP_CONS *cons)
#define DEFAULT_TIGHTENVB
static SCIP_DECL_RELAXEXEC(relaxExecSdp)
SCIP_VAR * SCIPsdpVarmapperGetSCIPvar(SdpVarmapper *varmapper, int ind)
SCIP_RETCODE SCIPsdpiGetIterations(SCIP_SDPI *sdpi, int *iterations)
#define DEFAULT_SETTINGSRESETFREQ
SCIP_RETCODE SCIPsdpiSettingsUsed(SCIP_SDPI *sdpi, SCIP_SDPSOLVERSETTING *usedsetting)
SCIP_RETCODE SCIPsdpiSlaterSettings(SCIP_SDPI *sdpi, SCIP_SDPSLATERSETTING *slatersetting)
int SCIPrelaxSdpGetNdualSlaterFails(SCIP_RELAX *relax)
SCIP_Bool SCIPsdpiIsAcceptable(SCIP_SDPI *sdpi)
int SCIPsdpVarmapperGetNVars(SdpVarmapper *varmapper)
static SCIP_DECL_RELAXINITSOL(relaxInitSolSdp)
int SCIPrelaxSdpGetNSdpStable(SCIP_RELAX *relax)
SCIP_RETCODE SCIPconsSdpComputeSparseSdpMatrix(SCIP *scip, SCIP_CONS *cons, SCIP_SOL *sol, int *length, int *row, int *col, SCIP_Real *val)
int SCIPrelaxSdpGetNSdpMedium(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpVarmapperCreate(SCIP *scip, SdpVarmapper **varmapper, int size)
#define DEFAULT_WARMSTARTIPFACTOR
SCIP_Bool SCIPsdpiIsTimelimExc(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPrelaxSdpRelaxVal(SCIP_RELAX *relax, SCIP_Bool *success, SCIP_Real *objval)
SCIP_Bool SCIPsdpiIsDualInfeasible(SCIP_SDPI *sdpi)
General interface methods for SDP-preprocessing (mainly fixing variables and removing empty rows/cols...
int SCIPrelaxSdpGetNSlaterFailsFast(SCIP_RELAX *relax)
static SCIP_DECL_RELAXFREE(relaxFreeSdp)
SCIP_RETCODE SCIPlapackMatrixMatrixMult(int nrowsA, int ncolsA, SCIP_Real *matrixA, SCIP_Bool transposeA, int nrowsB, int ncolsB, SCIP_Real *matrixB, SCIP_Bool transposeB, SCIP_Real *result)
struct Sdpvarmapper SdpVarmapper
int SCIPrelaxSdpGetNSlaterFailsStable(SCIP_RELAX *relax)
enum SCIP_SDPSlaterSetting SCIP_SDPSLATERSETTING
#define DEFAULT_DISPLAYSTAT
int SCIPsdpVarmapperGetSdpIndex(SdpVarmapper *varmapper, SCIP_VAR *var)
int SCIPrelaxSdpGetNSdpInterfaceCalls(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterHolds(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiChgBounds(SCIP_SDPI *sdpi, int nvars, const int *ind, const SCIP_Real *lb, const SCIP_Real *ub)
int SCIPrelaxSdpGetNSdpCalls(SCIP_RELAX *relax)
Constraint handler for SDP-constraints.
SCIP_RETCODE SCIPsdpiGetLowerObjbound(SCIP_SDPI *sdpi, SCIP_Real *objlb)
SCIP_Bool SCIPsdpiIsObjlimExc(SCIP_SDPI *sdpi)
maps SCIP variables to SDP indices (the SCIP variables are given SDP indices in the order in which th...
#define DEFAULT_MAXPENALTYPARAM
SCIP_Real SCIPconsSdpGetMaxSdpCoef(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPsdpiGetDefaultSdpiSolverFeastol(void)
int SCIPconsSdpCompLowerTriangPos(int i, int j)
int SCIPrelaxSdpGetNSlaterHoldsUnsolved(SCIP_RELAX *relax)
#define WARMSTART_PROJ_FACTOR_LHS
SCIP_RETCODE SCIPsdpiAddLPRows(SCIP_SDPI *sdpi, int nrows, const SCIP_Real *lhs, const SCIP_Real *rhs, int nnonz, const int *row, const int *col, const SCIP_Real *val)
#define WARMSTART_PROJ_FACTOR
SCIP_RETCODE SCIPconsSdpGetData(SCIP *scip, SCIP_CONS *cons, int *nvars, int *nnonz, int *blocksize, int *arraylength, int *nvarnonz, int **col, int **row, SCIP_Real **val, SCIP_VAR **vars, int *constnnonz, int *constcol, int *constrow, SCIP_Real *constval, SCIP_Bool *rankone, int **maxevsubmat, SCIP_Bool *addedquadcons)
int SCIPrelaxSdpGetNSlaterInfeasibleStable(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNdualSlaterUnknown(SCIP_RELAX *relax)
const char * SCIPsdpiGetSolverDesc(void)
SCIP_RETCODE SCIPsdpiComputePenaltyparam(SCIP_SDPI *sdpi, SCIP_Real maxcoeff, SCIP_Real *penaltyparam)
SCIP_RETCODE SCIPsdpiSetIntpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, int ival)
SCIP_SDPSOLVERSETTING SCIPconsSavedsdpsettingsGetSettings(SCIP *scip, SCIP_CONS *cons)
#define DEFAULT_SETTINGSRESETOFS
SCIP_Bool SCIPrelaxSdpSolvedProbing(SCIP_RELAX *relax)
SCIP_Real SCIPsdpiInfinity(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPconsSavesdpsolGetPrimalMatrix(SCIP *scip, SCIP_CONS *cons, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
long int SCIPrelaxSdpGetSdpNode(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiCreate(SCIP_SDPI **sdpi, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, BMS_BUFMEM *bufmem)
#define DEFAULT_WARMSTARTPROJECT
int SCIPrelaxSdpGetNSlaterFailsPenalty(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSdpFast(SCIP_RELAX *relax)
SCIP_Bool SCIPrelaxSdpSolvedOrig(SCIP_RELAX *relax)
#define DEFAULT_WARMSTARTIPTYPE
adds the main functionality to fix/unfix/(multi-)aggregate variables by merging two three-tuple-array...
int SCIPrelaxSdpGetNSlaterHoldsFast(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterInfeasiblePenalty(SCIP_RELAX *relax)
#define WARMSTART_PROJ_MINRHSOBJ
int SCIPsdpiGetDefaultSdpiSolverNpenaltyIncreases(void)
#define DEFAULT_WARMSTARTPRIMALTYPE
SCIP_Bool SCIPsdpiWasSolved(SCIP_SDPI *sdpi)
int SCIPrelaxSdpGetNIterations(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterFails(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiComputeMaxPenaltyparam(SCIP_SDPI *sdpi, SCIP_Real penaltyparam, SCIP_Real *maxpenaltyparam)
SCIP_RETCODE SCIPsdpiClear(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiChgObj(SCIP_SDPI *sdpi, int nvars, const int *ind, const SCIP_Real *obj)
SCIP_RETCODE SCIPrelaxSdpGetRelaxSol(SCIP *scip, SCIP_RELAX *relax, SCIP_Bool *success, SCIP_Real *solarray, int *sollength)
SCIP_RETCODE SCIPsdpiGetPreoptimalSol(SCIP_SDPI *sdpi, SCIP_Bool *success, SCIP_Real *dualsol, int *dualsollength, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
int SCIPconsSdpGetBlocksize(SCIP *scip, SCIP_CONS *cons)
int SCIPrelaxSdpGetNSlaterHoldsBounded(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNprimalSlaterFails(SCIP_RELAX *relax)
int SCIPrelaxSdpGetNSlaterInfeasibleBounded(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpVarmapperFree(SCIP *scip, SdpVarmapper **varmapper)
SCIP_RETCODE SCIPrelaxSdpGetPrimalBoundVars(SCIP_RELAX *relax, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
#define DEFAULT_LAMBDASTAR
static SCIP_RETCODE scaleTransposedMatrix(int blocksize, SCIP_Real *matrix, SCIP_Real *scale)
SCIP_RETCODE SCIPsdpVarfixerMergeArrays(BMS_BLKMEM *blkmem, SCIP_Real epsilon, int *originrow, int *origincol, SCIP_Real *originval, int originlength, SCIP_Bool originsorted, SCIP_Real scalar, int *targetrow, int *targetcol, SCIP_Real *targetval, int *targetlength, int targetmemory)
#define DEFAULT_WARMSTARTROUNDONLYINF
SCIP_Bool SCIPsdpiIsDualFeasible(SCIP_SDPI *sdpi)
struct SCIP_SDPi SCIP_SDPI
SCIP_Bool SCIPsdpiIsPrimalFeasible(SCIP_SDPI *sdpi)
SCIP_Bool SCIPrelaxSdpIsFeasible(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiSetRealpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, SCIP_Real dval)
SCIP_Longint SCIPconsSavesdpsolGetNodeIndex(SCIP *scip, SCIP_CONS *cons)
int SCIPrelaxSdpGetNSlaterFailsUnsolved(SCIP_RELAX *relax)
#define DEFAULT_WARMSTARTPROJMINEV
static SCIP_RETCODE calcRelax(SCIP *scip, SCIP_RELAX *relax, SCIP_RESULT *result, SCIP_Real *lowerbound)
enum SCIP_SDPSlater SCIP_SDPSLATER
SCIP_Real SCIPsdpiGetMaxPrimalEntry(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPconsSdpGetNNonz(SCIP *scip, SCIP_CONS *cons, int *nnonz, int *constnnonz)
SCIP_Bool SCIPrelaxSdpIsUnbounded(SCIP_RELAX *relax)
interface methods for eigenvector computation and matrix multiplication using openblas ...
SCIP_RETCODE SCIPsdpiGetRealpar(SCIP_SDPI *sdpi, SCIP_SDPPARAM type, SCIP_Real *dval)
static SCIP_RETCODE putSdpDataInInterface(SCIP *scip, SCIP_SDPI *sdpi, SdpVarmapper *varmapper, SCIP_Bool primalobj, SCIP_Bool boundprimal)
int SCIPrelaxSdpGetNdualSlaterInfeasible(SCIP_RELAX *relax)
SCIP_Real SCIPsdpiGetDefaultSdpiSolverGaptol(void)
static SCIP_RETCODE updateSDPStatistics(SCIP_RELAXDATA *relaxdata)
SCIP_RETCODE SCIPsdpiGetPreoptimalPrimalNonzeros(SCIP_SDPI *sdpi, int nblocks, int *startXnblocknonz)
SCIP_RETCODE SCIPrelaxSdpComputeAnalyticCenters(SCIP *scip, SCIP_RELAX *relax)
static SCIP_RETCODE expandSparseMatrix(int nnonz, int blocksize, int *row, int *col, SCIP_Real *val, SCIP_Real *fullmat)
#define DEFAULT_WARMSTART
SCIP_RETCODE SCIPlapackComputeEigenvectorDecomposition(BMS_BUFMEM *bufmem, int n, SCIP_Real *A, SCIP_Real *eigenvalues, SCIP_Real *eigenvectors)
int SCIPrelaxSdpGetNSlaterHoldsPenalty(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiGetNLPRows(SCIP_SDPI *sdpi, int *nlprows)
#define DEFAULT_WARMSTARTPREOPTGAP
SCIP_RETCODE SCIPsdpiGetPrimalBoundVars(SCIP_SDPI *sdpi, SCIP_Real *lbvars, SCIP_Real *ubvars, int *arraylength)
#define DEFAULT_WARMSTARTPROJPDSAME
int SCIPrelaxSdpGetNprimalSlaterUnknown(SCIP_RELAX *relax)
SCIP_RETCODE SCIPconsSdpGuessInitialPoint(SCIP *scip, SCIP_CONS *cons, SCIP_Real *lambdastar)
int SCIPrelaxSdpGetNSlaterInfeasibleUnsolved(SCIP_RELAX *relax)
SCIP_Bool SCIPsdpiSolvedOrig(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPsdpiSlater(SCIP_SDPI *sdpi, SCIP_SDPSLATER *primalslater, SCIP_SDPSLATER *dualslater)
#define DEFAULT_SDPSOLVERTHREADS
constraint handler for saving SDP solutions in nodes
SCIP_RETCODE SCIPincludeRelaxSdp(SCIP *scip)
#define DEFAULT_WARMSTART_PREOPTIMAL_SOL
constraint handler for saving SDP settings