45 #define SLATERSOLVED_ABSOLUTE
64 #define RELAX_NAME "SDP"
65 #define RELAX_DESC "SDP-relaxator"
66 #define RELAX_PRIORITY 1
70 #define DEFAULT_PENALTYPARAM -1.0
71 #define DEFAULT_LAMBDASTAR -1.0
72 #define DEFAULT_MAXPENALTYPARAM -1.0
73 #define DEFAULT_WARMSTARTIPFACTOR 0.50
74 #define DEFAULT_WARMSTARTPRIMALTYPE 3
75 #define DEFAULT_WARMSTARTIPTYPE 1
76 #define DEFAULT_WARMSTARTPROJECT 2
77 #define DEFAULT_WARMSTARTPROJMINEV -1
78 #define DEFAULT_WARMSTARTPROJPDSAME TRUE
79 #define DEFAULT_WARMSTART_PREOPTIMAL_SOL FALSE
80 #define DEFAULT_WARMSTARTPREOPTGAP 1e-2
81 #define DEFAULT_WARMSTARTROUNDONLYINF FALSE
82 #define DEFAULT_SLATERCHECK 0
83 #define DEFAULT_OBJLIMIT FALSE
84 #define DEFAULT_RESOLVE TRUE
85 #define DEFAULT_TIGHTENVB TRUE
86 #define DEFAULT_SDPINFO FALSE
87 #define DEFAULT_WARMSTART FALSE
88 #define DEFAULT_DISPLAYSTAT FALSE
89 #define DEFAULT_SETTINGSRESETFREQ -1
90 #define DEFAULT_SETTINGSRESETOFS 0
91 #define DEFAULT_SDPSOLVERTHREADS -1
93 #define WARMSTART_MINVAL 0.01
94 #define WARMSTART_PROJ_MINRHSOBJ 1
95 #define WARMSTART_PROJ_FACTOR 0.1
96 #define WARMSTART_PROJ_FACTOR_LHS 10
97 #define WARMSTART_PROJ_FACTOR_PRIMAL 0.1
98 #define WARMSTART_PROJ_FACTOR_DUAL 0.1
99 #define WARMSTART_PREOPT_MIN_Z_LPVAL 0.01
102 #define TIMEOFDAY_CALL(x) do \
105 if ( (_errorcode_ = (x)) != 0 ) \
107 SCIPerrorMessage("Error in gettimeofday! \n"); \
118 struct SCIP_RelaxData
125 SCIP_Bool origsolved;
126 SCIP_Bool probingsolved;
127 long int lastsdpnode;
130 SCIP_Real sdpsolvergaptol;
131 SCIP_Real sdpsolverfeastol;
132 SCIP_Real penaltyparam;
133 SCIP_Real maxpenaltyparam;
134 SCIP_Real lambdastar;
135 SCIP_Real computedlambdastar;
139 SCIP_Bool displaystat;
143 int settingsresetfreq;
144 int settingsresetofs;
145 int sdpsolverthreads;
148 int sdpinterfacecalls;
161 int unstablenoslater;
164 int unsolvednoslater;
167 int nslatercheckfailed;
171 int npslatercheckfailed;
174 int ndslatercheckfailed;
175 int nslaterinfeasible;
176 int stableinfeasible;
177 int unstableinfeasible;
178 int penaltyinfeasible;
179 int boundedinfeasible;
180 int unsolvedinfeasible;
182 int primalroundfails;
184 int roundstartsuccess;
187 SCIP_Real roundingprobtime;
190 SCIP_Real warmstartipfactor;
191 int warmstartprimaltype;
193 int warmstartproject;
194 SCIP_Real warmstartpmevprimalpar;
195 SCIP_Real warmstartpmevdualpar;
196 SCIP_Real warmstartprojminevprimal;
197 SCIP_Real warmstartprojminevdual;
198 SCIP_Bool warmstartprojpdsame;
200 SCIP_Bool warmstartpreoptsol;
201 SCIP_Real warmstartpreoptgap;
202 SCIP_Bool warmstartroundonlyinf;
233 assert( nnonz >= 0 );
234 assert( row != NULL );
235 assert( col != NULL );
236 assert( val != NULL );
237 assert( fullmat != NULL );
239 matrixsize = blocksize * blocksize;
242 for (i = 0; i < matrixsize; i++)
245 for (i = 0; i < nnonz; i++)
247 assert( row[i] * blocksize + col[i] <= matrixsize );
248 fullmat[row[i] * blocksize + col[i]] = val[i];
249 assert( col[i] * blocksize + row[i] <= matrixsize );
250 fullmat[col[i] * blocksize + row[i]] = val[i];
267 assert( blocksize >= 0 );
268 assert( matrix != NULL );
269 assert( scale != NULL );
271 for (r = 0; r < blocksize; r++)
273 for (c = 0; c < blocksize; c++)
275 matrix[r * blocksize + c] *= scale[c];
289 SCIP_Bool boundprimal
292 SCIP_CONSHDLR* conshdlr;
293 const char* conshdlrname;
295 SCIP_VAR** blockvars;
298 SCIP_Real** constval;
311 int* nconstblocknonz;
312 int constnnonzcounter;
325 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolvergaptol", ¶m) );
327 SCIPdebugMessage(
"Putting SDP Data in general SDP interface!\n");
329 assert( scip != NULL );
330 assert( sdpi != NULL );
331 assert( varmapper != NULL );
333 vars = SCIPgetVars(scip);
334 nvars = SCIPgetNVars(scip);
335 nvarspen = boundprimal ? nvars + 1 : nvars;
338 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvarspen) );
339 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvarspen) );
340 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvarspen) );
342 for (i = 0; i < nvars; i++)
344 obj[i] = SCIPvarGetObj(vars[i]);
345 lb[i] = SCIPvarGetLbLocal(vars[i]);
346 ub[i] = SCIPvarGetUbLocal(vars[i]);
352 ub[nvars] = SCIPinfinity(scip);
355 nconss = SCIPgetNConss(scip);
356 conss = SCIPgetConss(scip);
363 for (i = 0; i < nconss; i++)
365 conshdlr = SCIPconsGetHdlr(conss[i]);
366 assert( conshdlr != NULL );
368 conshdlrname = SCIPconshdlrGetName(conshdlr);
370 #ifdef SCIP_EVEN_MORE_DEBUG
371 SCIP_CALL( SCIPprintCons(scip, conss[i], NULL) );
372 SCIPinfoMessage(scip, NULL,
"\n");
375 if ( strcmp(conshdlrname,
"SDP") == 0 )
380 sdpnnonz += blocknnonz;
381 sdpconstnnonz += constnnonzcounter;
386 SCIP_CALL( SCIPallocBufferArray(scip, &sdpblocksizes, nsdpblocks) );
387 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvarnonz, nsdpblocks) );
388 SCIP_CALL( SCIPallocBufferArray(scip, &nconstblocknonz, nsdpblocks) );
389 SCIP_CALL( SCIPallocBufferArray(scip, &col, nsdpblocks) );
390 SCIP_CALL( SCIPallocBufferArray(scip, &row, nsdpblocks) );
391 SCIP_CALL( SCIPallocBufferArray(scip, &val, nsdpblocks) );
392 SCIP_CALL( SCIPallocBufferArray(scip, &constcol, nsdpblocks) );
393 SCIP_CALL( SCIPallocBufferArray(scip, &constrow, nsdpblocks) );
394 SCIP_CALL( SCIPallocBufferArray(scip, &constval, nsdpblocks) );
395 SCIP_CALL( SCIPallocBufferArray(scip, &nblockvars, nsdpblocks) );
396 SCIP_CALL( SCIPallocBufferArray(scip, &sdpvar, nsdpblocks) );
398 for (i = 0; i < nsdpblocks; i++)
400 SCIP_CALL( SCIPallocBufferArray(scip, &(nblockvarnonz[i]), nvarspen) );
401 SCIP_CALL( SCIPallocBufferArray(scip, &col[i], nvarspen) );
402 SCIP_CALL( SCIPallocBufferArray(scip, &row[i], nvarspen) );
403 SCIP_CALL( SCIPallocBufferArray(scip, &val[i], nvarspen) );
408 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
410 for (i = 0; i < nconss; i++)
412 conshdlr = SCIPconsGetHdlr(conss[i]);
413 assert( conshdlr != NULL );
415 conshdlrname = SCIPconshdlrGetName(conshdlr);
417 if ( strcmp(conshdlrname,
"SDP") == 0 )
419 assert( ind < nsdpblocks );
423 nconstblocknonz[ind] = constlength;
424 SCIP_CALL( SCIPallocBufferArray(scip, &(constcol[ind]), constlength) );
425 SCIP_CALL( SCIPallocBufferArray(scip, &(constrow[ind]), constlength) );
426 SCIP_CALL( SCIPallocBufferArray(scip, &(constval[ind]), constlength) );
429 SCIP_CALL(
SCIPconsSdpGetData(scip, conss[i], &nblockvars[ind], &blocknnonz, &sdpblocksizes[ind], &nvars, nblockvarnonz[ind], col[ind],
430 row[ind], val[ind], blockvars, &nconstblocknonz[ind], constcol[ind], constrow[ind], constval[ind]) );
433 assert( nvars == SCIPgetNVars(scip) );
434 assert( nconstblocknonz[ind] <= constlength );
436 SCIP_CALL( SCIPallocBufferArray(scip, &(sdpvar[ind]), boundprimal ? nblockvars[ind] + 1 : nblockvars[ind]) );
439 for (j = 0; j < nblockvars[ind]; j++)
446 nblockvarnonz[ind][nblockvars[ind]] = sdpblocksizes[ind];
449 SCIP_CALL( SCIPallocBufferArray(scip, &col[ind][nblockvars[ind]], sdpblocksizes[ind]) );
450 SCIP_CALL( SCIPallocBufferArray(scip, &row[ind][nblockvars[ind]], sdpblocksizes[ind]) );
451 SCIP_CALL( SCIPallocBufferArray(scip, &val[ind][nblockvars[ind]], sdpblocksizes[ind]) );
453 for (j = 0; j < sdpblocksizes[ind]; j++)
455 col[ind][nblockvars[ind]][j] = j;
456 row[ind][nblockvars[ind]][j] = j;
457 val[ind][nblockvars[ind]][j] = 1.0;
467 SCIPfreeBufferArray(scip, &blockvars);
472 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, sdpconstnnonz, nconstblocknonz, constrow,
473 constcol, constval, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
474 NULL, NULL, 0, NULL, NULL, NULL) );
479 for (i = 0; i < nsdpblocks; i++)
480 nconstblocknonz[i] = 0;
482 SCIP_CALL(
SCIPsdpiLoadSDP(sdpi, nvarspen, obj, lb, ub, nsdpblocks, sdpblocksizes, nblockvars, 0, nconstblocknonz, NULL,
483 NULL, NULL, sdpnnonz, nblockvarnonz, sdpvar, row, col, val, 0,
484 NULL, NULL, 0, NULL, NULL, NULL) );
489 for (i = 0; i < nsdpblocks; i++)
493 SCIPfreeBufferArrayNull(scip, &val[i][nblockvars[i] - 1]);
494 SCIPfreeBufferArrayNull(scip, &row[i][nblockvars[i] - 1]);
495 SCIPfreeBufferArrayNull(scip, &col[i][nblockvars[i] - 1]);
497 SCIPfreeBufferArrayNull(scip, &(sdpvar[i]));
498 SCIPfreeBufferArrayNull(scip, &val[i]);
499 SCIPfreeBufferArrayNull(scip, &row[i]);
500 SCIPfreeBufferArrayNull(scip, &col[i]);
501 SCIPfreeBufferArrayNull(scip, &(nblockvarnonz[i]));
502 SCIPfreeBufferArrayNull(scip, &(constval[i]));
503 SCIPfreeBufferArrayNull(scip, &(constrow[i]));
504 SCIPfreeBufferArrayNull(scip, &(constcol[i]));
507 SCIPfreeBufferArrayNull(scip, &sdpvar);
508 SCIPfreeBufferArrayNull(scip, &nblockvars);
509 SCIPfreeBufferArrayNull(scip, &constval);
510 SCIPfreeBufferArrayNull(scip, &constrow);
511 SCIPfreeBufferArrayNull(scip, &constcol);
512 SCIPfreeBufferArrayNull(scip, &val);
513 SCIPfreeBufferArrayNull(scip, &row);
514 SCIPfreeBufferArrayNull(scip, &col);
515 SCIPfreeBufferArrayNull(scip, &nconstblocknonz);
516 SCIPfreeBufferArrayNull(scip, &nblockvarnonz);
517 SCIPfreeBufferArrayNull(scip, &sdpblocksizes);
518 SCIPfreeBufferArray(scip, &ub);
519 SCIPfreeBufferArray(scip, &lb);
520 SCIPfreeBufferArray(scip, &obj);
562 assert( scip != NULL );
563 assert( sdpi != NULL );
564 assert( varmapper != NULL );
566 nvars = SCIPgetNVars(scip);
569 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
570 SCIP_CALL( SCIPgetBoolParam(scip,
"relaxing/SDP/tightenvb", &tightenvb) );
572 SCIPdebugMessage(
"inserting %d LPRows into the interface.\n", nrows);
576 for (i = 0; i < nrows; i++)
578 assert( rows[i] != NULL );
579 scipnnonz += SCIProwGetNNonz(rows[i]);
583 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nrows) );
584 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nrows) );
585 SCIP_CALL( SCIPallocBufferArray(scip, &rowind, scipnnonz) );
586 SCIP_CALL( SCIPallocBufferArray(scip, &colind, scipnnonz) );
587 SCIP_CALL( SCIPallocBufferArray(scip, &val, scipnnonz) );
593 for (i = 0; i < nrows; i++)
596 SCIP_Bool tightened = FALSE;
597 SCIP_Real tightenedval = 0.0;
598 SCIP_Bool swapped = FALSE;
602 rownnonz = SCIProwGetNNonz(row);
604 rowvals = SCIProwGetVals(row);
605 rowcols = SCIProwGetCols(row);
606 sciplhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
607 sciprhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
610 if ( tightenvb && rownnonz == 2 && (SCIPisZero(scip, sciplhs) || SCIPisZero(scip, sciprhs) ) )
620 assert( rowcols[0] != NULL );
621 assert( rowcols[1] != NULL );
622 var1 = SCIPcolGetVar(rowcols[0]);
623 var2 = SCIPcolGetVar(rowcols[1]);
624 assert( var1 != NULL );
625 assert( var2 != NULL );
628 if ( ! SCIPisEQ(scip, SCIPvarGetLbLocal(var1), SCIPvarGetUbLocal(var1)) && ! SCIPisEQ(scip, SCIPvarGetLbLocal(var2), SCIPvarGetUbLocal(var2)) )
631 if ( (SCIPisEQ(scip, val1, 1.0) || SCIPisEQ(scip, val2, 1.0)) && ( SCIPisNegative(scip, val1) || SCIPisNegative(scip, val2) ) )
634 if ( ! SCIPisEQ(scip, val1, 1.0) || ! SCIPisNegative(scip, val2) )
636 SCIPswapPointers((
void**) &var1, (
void**) &var2);
643 if ( SCIPvarIsBinary(var2) )
645 if ( SCIPisZero(scip, sciprhs) )
647 if ( SCIPisLT(scip, SCIPvarGetUbLocal(var1), REALABS(val2)) )
649 SCIPdebugMessage(
"Big-M in %s changed from %f to %f\n", SCIProwGetName(row), REALABS(val2), SCIPvarGetUbLocal(var1));
652 tightenedval = -SCIPvarGetUbLocal(var1);
656 if ( SCIPisZero(scip, sciplhs) )
658 if ( SCIPisGT(scip, SCIPvarGetLbLocal(var1), REALABS(val2)) )
660 SCIPdebugMessage(
"Big-M in %s changed from %f to %f\n", SCIProwGetName(row), REALABS(val2), SCIPvarGetLbLocal(var1));
663 tightenedval = -SCIPvarGetUbLocal(var1);
671 for (j = 0; j < rownnonz; j++)
674 if ( tightened && ( (swapped && (j == 0)) || ((! swapped) && (j == 1)) ) )
676 if ( SCIPisFeasGT(scip, REALABS(tightenedval), 0.0) )
678 assert( SCIPcolGetVar(rowcols[j]) != 0 );
680 rowind[nnonz] = nconss;
681 val[nnonz] = tightenedval;
685 else if ( SCIPisFeasGT(scip, REALABS(rowvals[j]), 0.0))
687 assert( SCIPcolGetVar(rowcols[j]) != 0 );
689 rowind[nnonz] = nconss;
690 val[nnonz] = rowvals[j];
694 lhs[nconss] = primalobj ? sciplhs : (SCIPisInfinity(scip, -sciplhs) ? -sciplhs : 0.0);
695 rhs[nconss] = primalobj ? sciprhs : (SCIPisInfinity(scip, sciprhs) ? sciprhs : 0.0);
707 SCIP_CALL(
SCIPsdpiAddLPRows(sdpi, nconss, lhs, rhs, nnonz, (
const int*)rowind, (
const int*)colind, val) );
710 SCIPfreeBufferArray(scip, &val);
711 SCIPfreeBufferArray(scip, &colind);
712 SCIPfreeBufferArray(scip, &rowind);
713 SCIPfreeBufferArray(scip, &rhs);
714 SCIPfreeBufferArray(scip, &lhs);
719 vars = SCIPgetVars(scip);
720 assert( vars != NULL );
723 SCIP_CALL( SCIPallocBufferArray(scip, &lb, nvars) );
724 SCIP_CALL( SCIPallocBufferArray(scip, &ub, nvars) );
725 SCIP_CALL( SCIPallocBufferArray(scip, &inds, nvars) );
726 SCIP_CALL( SCIPallocBufferArray(scip, &obj, nvars) );
727 SCIP_CALL( SCIPallocBufferArray(scip, &objinds, nvars) );
730 for (i = 0; i < nvars; i++)
732 assert( vars[i] != NULL );
733 lb[i] = primalobj ? SCIPvarGetLbLocal(vars[i]) : (SCIPisInfinity(scip, -SCIPvarGetLbLocal(vars[i])) ? SCIPvarGetLbLocal(vars[i]) : 0.0);
734 ub[i] = primalobj ? SCIPvarGetUbLocal(vars[i]) : (SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[i])) ? SCIPvarGetUbLocal(vars[i]) : 0.0);
736 obj[i] = dualobj ? SCIPvarGetObj(vars[i]) : 0.0;
745 SCIPfreeBufferArray(scip, &objinds);
746 SCIPfreeBufferArray(scip, &obj);
747 SCIPfreeBufferArray(scip, &inds);
748 SCIPfreeBufferArray(scip, &ub);
749 SCIPfreeBufferArray(scip, &lb);
758 SCIP_RELAXDATA* relaxdata,
760 SCIP_Real* lowerbound
763 char saveconsname[SCIP_MAXSTRLEN];
766 SCIP_CONS* savedsetting;
771 SCIP_Bool enforceslater;
773 SCIP_Real objforscip;
774 SCIP_Real* solforscip;
786 SCIPdebugMessage(
"calcRelax called\n");
788 assert( scip != NULL );
789 assert( relaxdata != NULL );
790 assert( result != NULL );
791 assert( lowerbound != NULL );
793 nvars = SCIPgetNVars(scip);
795 vars = SCIPgetVars (scip);
797 sdpi = relaxdata->sdpi;
798 assert( sdpi != NULL );
800 if ( relaxdata->objlimit )
807 rootnode = ! SCIPnodeGetParent(SCIPgetCurrentNode(scip));
810 if ( rootnode || (SCIPnodeGetDepth(SCIPgetCurrentNode(scip)) == relaxdata->settingsresetofs) ||
811 ( relaxdata->settingsresetfreq > 0 && ((SCIPnodeGetDepth(SCIPgetCurrentNode(scip)) - relaxdata->settingsresetofs) % relaxdata->settingsresetfreq == 0)) ||
818 SCIP_CONSHDLR* conshdlr;
822 conshdlr = SCIPfindConshdlr(scip,
"Savedsdpsettings");
823 if ( conshdlr == NULL )
825 SCIPerrorMessage(
"Savedsdpsettings constraint handler not found!\n");
826 return SCIP_PLUGINNOTFOUND;
831 conss = SCIPconshdlrGetConss(conshdlr);
832 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
833 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip))));
835 while ( parentconsind >= 0 && strcmp(saveconsname, SCIPconsGetName(conss[parentconsind])) )
837 if ( parentconsind >= 0 )
841 SCIPdebugMessage(
"Startsetting from parent node not found, restarting with fastest settings!\n");
847 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
848 if ( ! SCIPisInfinity(scip, timelimit) )
850 timelimit -= SCIPgetSolvingTime(scip);
851 if ( timelimit <= 0.0 )
853 *result = SCIP_DIDNOTRUN;
860 enforceslater = SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip)));
863 if ( ( ! SCIPnodeGetParent(SCIPgetCurrentNode(scip))) || ( ! relaxdata->warmstart ) || ((relaxdata->warmstartiptype == 2) &&
866 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
868 else if ( relaxdata->warmstart && (relaxdata->warmstartprimaltype != 2) && (relaxdata->warmstartiptype == 2) && SCIPisEQ(scip, relaxdata->warmstartipfactor, 1.0) )
874 SCIP_CALL( SCIPallocBufferArray(scip, &ipy, nvars) );
875 for (v = 0; v < nvars; v++)
878 #ifdef SCIP_PRINT_WARMSTART
879 SCIPdebugMessage(
"warmstart using the following analytic centers:\n");
880 for (v = 0; v < nvars; v++)
881 SCIPdebugMessage(
"y[%d] = %f\n", v, ipy[v]);
884 for (b = 0; b < relaxdata->nblocks; b++)
886 SCIPdebugMessage(
"dual block %d\n", b);
887 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
889 SCIPdebugMessage(
"Z(%d,%d)=%f\n", relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
892 for (b = 0; b < relaxdata->nblocks; b++)
894 SCIPdebugMessage(
"primal block %d\n", b);
895 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
897 SCIPdebugMessage(
"X(%d,%d)=%f\n", relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
903 SCIP_CALL(
SCIPsdpiSolve(sdpi, ipy, relaxdata->ipZnblocknonz, relaxdata->ipZrow, relaxdata->ipZcol, relaxdata->ipZval, relaxdata->ipXnblocknonz,
904 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval, startsetting, enforceslater, timelimit));
906 SCIPfreeBufferArray(scip, &ipy);
910 SCIP_CONSHDLR* conshdlr;
912 SCIP_Real* starty = NULL;
913 int* startZnblocknonz = NULL;
914 int** startZrow = NULL;
915 int** startZcol = NULL;
916 SCIP_Real** startZval = NULL;
917 int* startXnblocknonz = NULL;
918 int** startXrow = NULL;
919 int** startXcol = NULL;
920 SCIP_Real** startXval = NULL;
922 SCIP_Longint parentnodenumber;
928 conshdlr = SCIPfindConshdlr(scip,
"Savesdpsol");
929 if ( conshdlr == NULL )
931 SCIPerrorMessage(
"Savesdpsol constraint handler not found\n");
932 return SCIP_PLUGINNOTFOUND;
937 conss = SCIPconshdlrGetConss(conshdlr);
938 parentconsind = SCIPconshdlrGetNActiveConss(conshdlr) - 1;
939 parentnodenumber = SCIPnodeGetNumber(SCIPnodeGetParent(SCIPgetCurrentNode(scip)));
947 if ( parentconsind < 0 )
949 SCIPdebugMessage(
"Starting SDP-Solving from scratch since no warmstart information available for node %lld\n", parentnodenumber);
950 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
954 SCIPdebugMessage(
"Using warmstartinformation from node %lld\n", parentnodenumber);
960 SCIP_CALL( SCIPallocBufferArray(scip, &starty, nvars) );
963 for (v = 0; v < nvars; v++)
966 starty[v] = SCIPgetSolVal(scip, dualsol, var);
968 if (SCIPisLT(scip, starty[v], SCIPvarGetLbLocal(var)) && (relaxdata->warmstartproject == 2 || relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4))
970 starty[v] = SCIPvarGetLbLocal(var);
972 SCIP_CALL( SCIPsetSolVal(scip, dualsol, var, SCIPvarGetLbLocal(var)) );
974 else if (SCIPisGT(scip, starty[v], SCIPvarGetUbLocal(var)) && (relaxdata->warmstartproject == 2 || relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4))
976 starty[v] = SCIPvarGetUbLocal(var);
978 SCIP_CALL( SCIPsetSolVal(scip, dualsol, var, SCIPvarGetUbLocal(var)) );
982 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->warmstartproject != 4 )
984 if ( relaxdata->warmstartiptype == 1 )
987 starty[v] *= 1 - relaxdata->warmstartipfactor;
989 else if ( relaxdata->warmstartiptype == 2 )
992 starty[v] = (1 - relaxdata->warmstartipfactor) * starty[v] + relaxdata->warmstartipfactor * SCIPgetSolVal(scip, relaxdata->ipy, var);
1000 SCIP_CONSHDLR* sdpconshdlr;
1001 SCIP_CONS** sdpblocks;
1008 SCIP_Real maxprimalentry = 0.0;
1009 SCIP_Real maxdualentry;
1010 SCIP_Real identitydiagonal = 0.0;
1013 SCIP_Bool* diagentryexists;
1015 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
1016 nblocks = SCIPconshdlrGetNConss(sdpconshdlr);
1017 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
1018 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
1020 SCIP_CALL( SCIPallocBufferArray(scip, &startZnblocknonz, nblocks + 1) );
1021 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow, nblocks + 1) );
1022 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol, nblocks + 1) );
1023 SCIP_CALL( SCIPallocBufferArray(scip, &startZval, nblocks + 1) );
1024 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks + 1) );
1025 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks + 1) );
1026 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks + 1) );
1027 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks + 1) );
1030 if ( relaxdata->warmstartiptype == 1 )
1033 if ( SCIPisLT(scip, maxprimalentry, 1.0) )
1034 maxprimalentry = 1.0;
1038 for (b = 0; b < nblocks; b++)
1042 if ( relaxdata->warmstartproject == 3 || relaxdata->warmstartproject == 4 )
1045 startZnblocknonz[b] = blocksize * (blocksize + 1) / 2;
1052 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
1054 if ( relaxdata->warmstartiptype == 1 )
1055 startZnblocknonz[b] += blocksize;
1056 else if ( relaxdata->warmstartiptype == 2 )
1057 startZnblocknonz[b] += relaxdata->ipZnblocknonz[b];
1061 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[b], startZnblocknonz[b]) );
1062 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[b], startZnblocknonz[b]) );
1063 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[b], startZnblocknonz[b]) );
1069 if ( relaxdata->warmstartproject == 3 )
1071 SCIP_Real* fullZmatrix;
1072 SCIP_Real* eigenvalues;
1073 SCIP_Real* eigenvectors;
1074 SCIP_Real* scaledeigenvectors;
1075 SCIP_Real matrixsize;
1080 matrixsize = blocksize * blocksize;
1082 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
1083 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
1084 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvectors, matrixsize) );
1086 SCIP_CALL(
expandSparseMatrix(startZnblocknonz[b], blocksize, startZrow[b], startZcol[b], startZval[b], fullZmatrix) );
1091 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, eigenvectors, matrixsize) );
1095 while (i < blocksize && SCIPisLT(scip, eigenvalues[i], relaxdata->warmstartprojminevdual) )
1097 eigenvalues[i] = relaxdata->warmstartprojminevdual;
1106 FALSE, fullZmatrix) );
1109 startZnblocknonz[b] = 0;
1110 epsilon = SCIPepsilon(scip);
1111 for (r = 0; r < blocksize; r++)
1113 for (c = r; c < blocksize; c++)
1115 matrixpos = r * blocksize + c;
1116 if ( REALABS(fullZmatrix[matrixpos]) > epsilon )
1118 startZrow[b][startZnblocknonz[b]] = r;
1119 startZcol[b][startZnblocknonz[b]] = c;
1120 startZval[b][startZnblocknonz[b]] = fullZmatrix[matrixpos];
1121 startZnblocknonz[b]++;
1127 SCIPfreeBufferArray(scip, &scaledeigenvectors);
1128 SCIPfreeBufferArray(scip, &eigenvectors);
1129 SCIPfreeBufferArray(scip, &eigenvalues);
1130 SCIPfreeBufferArray(scip, &fullZmatrix);
1133 if ( relaxdata->warmstartprimaltype == 1 )
1136 if ( relaxdata->warmstartiptype == 1 )
1138 startXnblocknonz[b] = blocksize;
1139 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
1140 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
1141 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
1142 for (i = 0; i < startXnblocknonz[b]; i++)
1144 startXrow[b][i] = i;
1145 startXcol[b][i] = i;
1146 startXval[b][i] = maxprimalentry;
1150 else if ( relaxdata->warmstartprimaltype == 2 )
1152 startXnblocknonz[b] = startZnblocknonz[b];
1153 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
1154 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
1155 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
1156 for (i = 0; i < startZnblocknonz[b]; i++)
1158 startXrow[b][i] = startZrow[b][i];
1159 startXcol[b][i] = startZcol[b][i];
1160 startXval[b][i] = 1 / startZval[b][i];
1163 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartproject != 4 )
1165 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1170 if ( relaxdata->warmstartproject != 4 )
1173 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[b], 2 * nrows + 2 * nvars) );
1174 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[b], 2 * nrows + 2 * nvars) );
1175 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[b], 2 * nrows + 2 * nvars) );
1176 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], 2 * nrows + 2 * nvars) );
1177 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], 2 * nrows + 2 * nvars) );
1178 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], 2 * nrows + 2 * nvars) );
1181 startZnblocknonz[b] = 2 * nrows + 2 * nvars;
1182 startXnblocknonz[b] = 2 * nrows + 2 * nvars;
1184 for (r = 0; r < nrows; r++)
1188 rownnonz = SCIProwGetNNonz(rows[r]);
1189 rowvals = SCIProwGetVals(rows[r]);
1190 rowcols = SCIProwGetCols(rows[r]);
1191 for (i = 0; i < rownnonz; i++)
1192 rowval += SCIPgetSolVal(scip, dualsol, SCIPcolGetVar(rowcols[i])) * rowvals[i];
1194 startZrow[b][2*r] = 2*r;
1195 startZcol[b][2*r] = 2*r;
1196 startZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
1198 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r], relaxdata->warmstartprojminevdual) )
1199 startZval[b][2*r] = relaxdata->warmstartprojminevdual;
1203 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*r], 1.0) )
1206 if ( SCIPisLT(scip, startZval[b][2*r], 0.0) )
1207 startZval[b][2*r] = relaxdata->warmstartipfactor;
1209 startZval[b][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r] + relaxdata->warmstartipfactor;
1211 else if ( relaxdata->warmstartiptype == 2 )
1213 startZval[b][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*r];
1223 startZrow[b][2*r + 1] = 2*r + 1;
1224 startZcol[b][2*r + 1] = 2*r + 1;
1225 startZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
1227 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r + 1], relaxdata->warmstartprojminevdual) )
1228 startZval[b][2*r + 1] = relaxdata->warmstartprojminevdual;
1229 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*r + 1], 1.0) )
1232 if ( SCIPisLT(scip, startZval[b][2*r + 1], 0.0) )
1233 startZval[b][2*r + 1] = relaxdata->warmstartipfactor;
1235 startZval[b][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r + 1] + relaxdata->warmstartipfactor;
1237 else if ( relaxdata->warmstartiptype == 2 )
1239 startZval[b][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*r + 1] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*r + 1];
1249 if ( relaxdata->warmstartprimaltype == 1 && relaxdata->warmstartiptype == 1 )
1251 startXrow[b][2*r] = 2*r;
1252 startXcol[b][2*r] = 2*r;
1253 startXval[b][2*r] = maxprimalentry;
1254 startXrow[b][2*r + 1] = 2*r + 1;
1255 startXcol[b][2*r + 1] = 2*r + 1;
1256 startXval[b][2*r + 1] = maxprimalentry;
1258 else if ( relaxdata->warmstartprimaltype == 2 )
1260 startXrow[b][2*r] = startZrow[b][2*r];
1261 startXcol[b][2*r] = startZcol[b][2*r];
1262 startXval[b][2*r] = 1 / startZval[b][2*r];
1263 startXrow[b][2*r + 1] = startZrow[b][2*r + 1];
1264 startXcol[b][2*r + 1] = startZcol[b][2*r + 1];
1265 startXval[b][2*r + 1] = 1 / startZval[b][2*r + 1];
1267 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartiptype == 1 )
1269 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1274 for (v = 0; v < nvars; v++)
1276 startZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
1277 startZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
1278 startZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, dualsol, vars[v]) - SCIPvarGetLbLocal(vars[v]);
1279 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*nrows + 2*v], relaxdata->warmstartprojminevdual) )
1280 startZval[b][2*nrows + 2*v] = relaxdata->warmstartprojminevdual;
1281 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*nrows + 2*v], 1.0) )
1284 if ( SCIPisLT(scip, startZval[b][2*nrows + 2*v], 0.0) )
1285 startZval[b][2*nrows + 2*v] = relaxdata->warmstartipfactor;
1287 startZval[b][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor;
1289 else if ( relaxdata->warmstartiptype == 2 )
1291 startZval[b][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v] + relaxdata->warmstartipfactor * relaxdata->ipZval[b][2*nrows + 2*v];
1301 startZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1302 startZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1303 startZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, dualsol, vars[v]);
1304 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], relaxdata->warmstartprojminevdual) )
1305 startZval[b][2*nrows + 2*v + 1] = relaxdata->warmstartprojminevdual;
1306 else if ( relaxdata->warmstartiptype == 1 && SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], 1.0) )
1309 if ( SCIPisLT(scip, startZval[b][2*nrows + 2*v + 1], 0.0) )
1310 startZval[b][2*nrows + 2*v + 1] = relaxdata->warmstartipfactor;
1312 startZval[b][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[b][2*nrows + 2*v + 1] + relaxdata->warmstartipfactor;
1314 else if ( relaxdata->warmstartiptype == 2 )
1316 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];
1326 if ( relaxdata->warmstartprimaltype == 1 && relaxdata->warmstartiptype == 1 )
1328 startXrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
1329 startXcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
1330 startXval[b][2*nrows + 2*v] = maxprimalentry;
1331 startXrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1332 startXcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
1333 startXval[b][2*nrows + 2*v + 1] = maxprimalentry;
1335 else if ( relaxdata->warmstartprimaltype == 2 )
1337 startXrow[b][2*nrows + 2*v] = startZrow[b][2*nrows + 2*v];
1338 startXcol[b][2*nrows + 2*v] = startZcol[b][2*nrows + 2*v];
1339 startXval[b][2*nrows + 2*v] = 1 / startZval[b][2*nrows + 2*v];
1340 startXrow[b][2*nrows + 2*v + 1] = startZrow[b][2*nrows + 2*v + 1];
1341 startXcol[b][2*nrows + 2*v + 1] = startZcol[b][2*nrows + 2*v + 1];
1342 startXval[b][2*nrows + 2*v + 1] = 1 / startZval[b][2*nrows + 2*v + 1];
1344 else if ( relaxdata->warmstartprimaltype != 3 && relaxdata->warmstartproject == 1 )
1346 SCIPerrorMessage(
"Unknown value %d for warmstartprimaltype.\n", relaxdata->warmstartprimaltype);
1374 if ( relaxdata->warmstartproject == 4 )
1376 SCIP_VAR** blockvars;
1379 struct timeval starttime;
1380 struct timeval currenttime;
1381 SCIP_Real** blockval;
1382 SCIP_Real** blockeigenvalues;
1383 SCIP_Real** blockeigenvectors;
1384 SCIP_Real** blockrowvals;
1391 SCIP_Real* blockconstval;
1392 SCIP_Real* scaledeigenvectors;
1393 SCIP_Real* fullXmatrix;
1394 SCIP_Real* fullZmatrix;
1399 SCIP_Real primalroundobj;
1400 SCIP_Real dualroundobj;
1418 int blockconstnnonz;
1427 int nremovedentries;
1431 if ( relaxdata->warmstartprimaltype != 3 )
1433 SCIPerrorMessage(
"Invalid parameter combination, use relax/warmstartproject = 4 only with relax/warmstartprimaltype = 3.\n");
1434 return SCIP_PARAMETERWRONGVAL;
1440 for (b = 0; b < nblocks; b++)
1443 matrixsize *= (matrixsize + 1) * 0.5;
1444 startXnblocknonz[b] = matrixsize;
1446 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], matrixsize) );
1447 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], matrixsize) );
1448 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], matrixsize) );
1453 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[nblocks], 2 * nvars + 2 * nrows) );
1454 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[nblocks], 2 * nvars + 2 * nrows) );
1455 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[nblocks], 2 * nvars + 2 * nrows) );
1456 startXnblocknonz[nblocks] = 2 * nvars + 2 * nrows;
1460 lpi = relaxdata->lpi;
1463 SCIP_CALL( SCIPlpiClear(lpi) );
1466 SCIP_CALL( SCIPlpiChgObjsen(lpi, SCIP_OBJSEN_MAXIMIZE) );
1472 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nvars) );
1473 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nvars) );
1474 for (v = 0; v < nvars; v++)
1476 varobj = SCIPvarGetObj(vars[v]);
1482 SCIP_CALL( SCIPallocBufferArray(scip, &blocksizes, nblocks + 2) );
1483 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvalues, nblocks) );
1484 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvectors, nblocks) );
1490 SCIP_CALL( SCIPlpiAddRows(lpi, nvars, lhs, rhs, NULL, 0, NULL, NULL, NULL) );
1492 SCIPfreeBufferArray(scip, &rhs);
1493 SCIPfreeBufferArray(scip, &lhs);
1496 SCIP_CALL( SCIPallocBufferArray(scip, &obj, 2*nvars) );
1497 SCIP_CALL( SCIPallocBufferArray(scip, &lb, 2*nvars) );
1498 SCIP_CALL( SCIPallocBufferArray(scip, &ub, 2*nvars) );
1499 SCIP_CALL( SCIPallocBufferArray(scip, &beg, 2*nvars) );
1500 SCIP_CALL( SCIPallocBufferArray(scip, &ind, 2*nvars) );
1501 SCIP_CALL( SCIPallocBufferArray(scip, &val, 2*nvars) );
1505 for (v = 0; v < nvars; v++)
1507 if ( ! SCIPisInfinity(scip, -1 * SCIPvarGetLbLocal(vars[v])) )
1509 obj[pos] = SCIPvarGetLbLocal(vars[v]);
1511 ub[pos] = SCIPlpiInfinity(lpi);
1517 if ( ! SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
1519 obj[pos] = -1 * SCIPvarGetUbLocal(vars[v]);
1521 ub[pos] = SCIPlpiInfinity(lpi);
1529 SCIP_CALL( SCIPlpiAddCols(lpi, pos, obj, lb, ub, NULL, pos, beg, ind, val) );
1530 blocksizes[0] = pos;
1533 SCIPfreeBufferArray(scip, &val);
1534 SCIPfreeBufferArray(scip, &ind);
1535 SCIPfreeBufferArray(scip, &beg);
1536 SCIPfreeBufferArray(scip, &ub);
1537 SCIPfreeBufferArray(scip, &lb);
1538 SCIPfreeBufferArray(scip, &obj);
1541 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
1543 SCIP_CALL( SCIPallocBufferArray(scip, &obj, 2*nrows) );
1544 SCIP_CALL( SCIPallocBufferArray(scip, &lb, 2*nrows) );
1545 SCIP_CALL( SCIPallocBufferArray(scip, &ub, 2*nrows) );
1546 SCIP_CALL( SCIPallocBufferArray(scip, &beg, 2*nrows) );
1547 SCIP_CALL( SCIPallocBufferArray(scip, &ind, 2*nrows*nvars) );
1548 SCIP_CALL( SCIPallocBufferArray(scip, &val, 2*nrows*nvars) );
1553 for (r = 0; r < nrows; r++)
1557 rownnonz = SCIProwGetNNonz(row);
1559 rowvals = SCIProwGetVals(row);
1560 rowcols = SCIProwGetCols(row);
1561 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
1562 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
1564 if ( ! SCIPisInfinity(scip, -1 * rowlhs) )
1568 ub[pos] = SCIPlpiInfinity(lpi);
1570 for (i = 0; i < rownnonz; i++)
1573 val[indpos] = rowvals[i];
1579 if ( ! SCIPisInfinity(scip, rowrhs) )
1581 obj[pos] = -1 * rowrhs;
1583 ub[pos] = SCIPlpiInfinity(lpi);
1585 for (i = 0; i < rownnonz; i++)
1588 val[indpos] = -1 * rowvals[i];
1595 SCIP_CALL( SCIPlpiAddCols(lpi, pos, obj, lb, ub, NULL, indpos, beg, ind, val) );
1596 blocksizes[1] = pos;
1597 roundingvars += pos;
1599 SCIPfreeBufferArray(scip, &val);
1600 SCIPfreeBufferArray(scip, &ind);
1601 SCIPfreeBufferArray(scip, &beg);
1602 SCIPfreeBufferArray(scip, &ub);
1603 SCIPfreeBufferArray(scip, &lb);
1604 SCIPfreeBufferArray(scip, &obj);
1607 for (b = 0; b < nblocks; b++)
1611 SCIP_CALL( SCIPallocBufferArray(scip, &blocknvarnonz, nvars) );
1612 SCIP_CALL( SCIPallocBufferArray(scip, &blockcol, nvars) );
1613 SCIP_CALL( SCIPallocBufferArray(scip, &blockrow, nvars) );
1614 SCIP_CALL( SCIPallocBufferArray(scip, &blockval, nvars) );
1615 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
1616 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstcol, blockconstnnonz) );
1617 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstrow, blockconstnnonz) );
1618 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstval, blockconstnnonz) );
1620 arraylength = nvars;
1621 SCIP_CALL(
SCIPconsSdpGetData(scip, sdpblocks[b], &blocknvars, &blocknnonz, &blocksize, &arraylength, blocknvarnonz,
1622 blockcol, blockrow, blockval, blockvars, &blockconstnnonz, blockconstcol, blockconstrow, blockconstval) );
1623 assert( arraylength == nvars );
1625 matrixsize = blocksize * blocksize;
1627 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
1628 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvalues[b], blocksize) );
1629 SCIP_CALL( SCIPallocBufferArray(scip, &blockeigenvectors[b], matrixsize) );
1631 SCIP_CALL(
expandSparseMatrix(startXnblocknonz[b], blocksize, startXrow[b], startXcol[b], startXval[b], fullXmatrix) );
1636 SCIP_CALL( SCIPallocBufferArray(scip, &obj, blocksize) );
1637 SCIP_CALL( SCIPallocBufferArray(scip, &lb, blocksize) );
1638 SCIP_CALL( SCIPallocBufferArray(scip, &ub, blocksize) );
1639 SCIP_CALL( SCIPallocBufferArray(scip, &beg, blocksize) );
1640 SCIP_CALL( SCIPallocBufferArray(scip, &ind, blocksize*nvars) );
1641 SCIP_CALL( SCIPallocBufferArray(scip, &val, blocksize*nvars) );
1644 for (i = 0; i < blocksize; i++)
1649 for (v = 0; v < nvars; v++)
1651 ind[i * nvars + v] = v;
1652 val[i * nvars + v] = 0.0;
1657 ub[i] = SCIPlpiInfinity(lpi);
1661 for (i = 0; i < blockconstnnonz; i++)
1666 for (evind = 0; evind < blocksize; evind++)
1668 if ( blockconstrow[i] == blockconstcol[i] )
1669 obj[evind] += blockconstval[i] * blockeigenvectors[b][evind * blocksize + blockconstrow[i]] * blockeigenvectors[b][evind * blocksize + blockconstcol[i]];
1671 obj[evind] += 2 * blockconstval[i] * blockeigenvectors[b][evind * blocksize + blockconstrow[i]] * blockeigenvectors[b][evind * blocksize + blockconstcol[i]];
1675 SCIPfreeBufferArray(scip, &blockconstval);
1676 SCIPfreeBufferArray(scip, &blockconstrow);
1677 SCIPfreeBufferArray(scip, &blockconstcol);
1680 for (v = 0; v < blocknvars; v++)
1683 for (i = 0; i < blocknvarnonz[v]; i++)
1688 for (evind = 0; evind < blocksize; evind++)
1690 if ( blockrow[v][i] == blockcol[v][i] )
1691 val[evind * nvars + varind] += blockval[v][i] * blockeigenvectors[b][evind * blocksize + blockrow[v][i]] * blockeigenvectors[b][evind * blocksize + blockcol[v][i]];
1693 val[evind * nvars + varind] += 2 * blockval[v][i] * blockeigenvectors[b][evind * blocksize + blockrow[v][i]] * blockeigenvectors[b][evind * blocksize + blockcol[v][i]];
1698 SCIPfreeBufferArray(scip, &blockvars);
1699 SCIPfreeBufferArray(scip, &blockval);
1700 SCIPfreeBufferArray(scip, &blockrow);
1701 SCIPfreeBufferArray(scip, &blockcol);
1702 SCIPfreeBufferArray(scip, &blocknvarnonz);
1703 SCIPfreeBufferArray(scip, &fullXmatrix);
1706 nremovedentries = 0;
1707 for (i = 0; i < blocksize; i++)
1709 beg[i] = beg[i] - nremovedentries;
1710 for (v = 0; v < nvars; v++)
1712 if ( REALABS(val[i * nvars + v]) < SCIPepsilon(scip) )
1718 val[i * nvars + v - nremovedentries] = val[i * nvars + v];
1719 ind[i * nvars + v - nremovedentries] = ind[i * nvars + v];
1724 SCIP_CALL( SCIPlpiAddCols(lpi, blocksize, obj, lb, ub, NULL, blocksize*nvars - nremovedentries, beg, ind, val) );
1726 blocksizes[2 + b] = blocksize;
1727 roundingvars += blocksize;
1729 SCIPfreeBufferArray(scip, &val);
1730 SCIPfreeBufferArray(scip, &ind);
1731 SCIPfreeBufferArray(scip, &beg);
1732 SCIPfreeBufferArray(scip, &ub);
1733 SCIPfreeBufferArray(scip, &lb);
1734 SCIPfreeBufferArray(scip, &obj);
1739 SCIP_CALL( SCIPlpiSolveDual(lpi) );
1742 SCIP_CALL( SCIPlpiGetObjval(lpi, &primalroundobj) );
1747 if ( SCIPlpiIsDualInfeasible(lpi) || SCIPisGE(scip, primalroundobj, SCIPgetCutoffbound(scip)) )
1749 if ( SCIPlpiIsDualInfeasible(lpi) )
1751 SCIPdebugMsg(scip,
"Infeasibility of node %lld detected through primal rounding problem during warmstarting\n",
1752 SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
1754 relaxdata->roundingprobinf++;
1756 else if ( SCIPisGT(scip, primalroundobj, SCIPgetCutoffbound(scip)) )
1758 SCIPdebugMsg(scip,
"Suboptimality of node %lld detected through primal rounding problem during warmstarting:"
1759 "lower bound = %f > %f = cutoffbound\n", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), primalroundobj, SCIPgetCutoffbound(scip));
1761 relaxdata->roundingcutoff++;
1765 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
1766 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
1767 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
1768 for (b = 0; b < nblocks; b++)
1770 SCIPfreeBufferArrayNull(scip,&blockeigenvectors[b]);
1771 SCIPfreeBufferArrayNull(scip,&blockeigenvalues[b]);
1772 SCIPfreeBufferArrayNull(scip, &startXval[b]);
1773 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
1774 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
1775 SCIPfreeBufferArrayNull(scip, &startZval[b]);
1776 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
1777 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
1779 SCIPfreeBufferArray(scip, &blocksizes);
1780 SCIPfreeBufferArray(scip, &blockeigenvectors);
1781 SCIPfreeBufferArray(scip, &blockeigenvalues);
1782 SCIPfreeBufferArrayNull(scip, &startXval);
1783 SCIPfreeBufferArrayNull(scip, &startXcol);
1784 SCIPfreeBufferArrayNull(scip, &startXrow);
1785 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
1786 SCIPfreeBufferArrayNull(scip, &startZval);
1787 SCIPfreeBufferArrayNull(scip, &startZcol);
1788 SCIPfreeBufferArrayNull(scip, &startZrow);
1789 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
1790 SCIPfreeBufferArray(scip, &starty);
1793 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
1795 relaxdata->feasible = FALSE;
1796 *result = SCIP_CUTOFF;
1799 else if ( relaxdata->warmstartroundonlyinf )
1802 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
1803 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
1804 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
1805 for (b = 0; b < nblocks; b++)
1807 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
1808 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
1809 SCIPfreeBufferArrayNull(scip, &startXval[b]);
1810 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
1811 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
1812 SCIPfreeBufferArrayNull(scip, &startZval[b]);
1813 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
1814 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
1816 SCIPfreeBufferArray(scip, &blocksizes);
1817 SCIPfreeBufferArray(scip, &blockeigenvectors);
1818 SCIPfreeBufferArray(scip, &blockeigenvalues);
1819 SCIPfreeBufferArrayNull(scip, &startXval);
1820 SCIPfreeBufferArrayNull(scip, &startXcol);
1821 SCIPfreeBufferArrayNull(scip, &startXrow);
1822 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
1823 SCIPfreeBufferArrayNull(scip, &startZval);
1824 SCIPfreeBufferArrayNull(scip, &startZcol);
1825 SCIPfreeBufferArrayNull(scip, &startZrow);
1826 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
1827 SCIPfreeBufferArray(scip, &starty);
1830 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
1832 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
1835 else if ( ! SCIPlpiIsOptimal(lpi) )
1837 SCIPdebugMsg(scip,
"Solving without warmstart since solving of the primal rounding problem failed with status %d!\n", SCIPlpiGetInternalStatus(lpi));
1838 relaxdata->primalroundfails++;
1841 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
1842 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
1843 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
1844 for (b = 0; b < nblocks; b++)
1846 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
1847 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
1848 SCIPfreeBufferArrayNull(scip, &startXval[b]);
1849 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
1850 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
1851 SCIPfreeBufferArrayNull(scip, &startZval[b]);
1852 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
1853 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
1855 SCIPfreeBufferArray(scip, &blocksizes);
1856 SCIPfreeBufferArray(scip, &blockeigenvectors);
1857 SCIPfreeBufferArray(scip, &blockeigenvalues);
1858 SCIPfreeBufferArrayNull(scip, &startXval);
1859 SCIPfreeBufferArrayNull(scip, &startXcol);
1860 SCIPfreeBufferArrayNull(scip, &startXrow);
1861 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
1862 SCIPfreeBufferArrayNull(scip, &startZval);
1863 SCIPfreeBufferArrayNull(scip, &startZcol);
1864 SCIPfreeBufferArrayNull(scip, &startZrow);
1865 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
1866 SCIPfreeBufferArray(scip, &starty);
1869 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
1871 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
1880 SCIP_CALL( SCIPallocBufferArray(scip, &optev, roundingvars) );
1882 SCIP_CALL( SCIPlpiGetSol(lpi, NULL, optev, NULL, NULL, NULL) );
1885 pos = blocksizes[1];
1887 for (v = 0; v < nvars; v++)
1889 startXrow[nblocks][pos] = 2 * nrows + 2 * v;
1890 startXcol[nblocks][pos] = 2 * nrows + 2 * v;
1891 if ( ! SCIPisInfinity(scip, -1 * SCIPvarGetLbLocal(vars[v])) )
1893 startXval[nblocks][pos] = optev[evpos];
1897 startXval[nblocks][pos] = SCIPinfinity(scip);
1900 startXrow[nblocks][pos] = 2 * nrows + 2 * v + 1;
1901 startXcol[nblocks][pos] = 2 * nrows + 2 * v + 1;
1902 if ( ! SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
1905 startXval[nblocks][pos] = optev[evpos];
1909 startXval[nblocks][pos] = SCIPinfinity(scip);
1912 assert( evpos == blocksizes[0] );
1916 evpos = blocksizes[0];
1917 for (r = 0; r < nrows; r++)
1921 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
1922 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
1924 startXrow[nblocks][pos] = 2 * r;
1925 startXcol[nblocks][pos] = 2 * r;
1926 if ( ! SCIPisInfinity(scip, -1 * rowlhs) )
1928 startXval[nblocks][pos] = optev[evpos];
1932 startXval[nblocks][pos] = SCIPinfinity(scip);
1935 startXrow[nblocks][pos] = 2 * r + 1;
1936 startXcol[nblocks][pos] = 2 * r + 1;
1937 if ( ! SCIPisInfinity(scip, rowrhs) )
1939 startXval[nblocks][pos] = optev[evpos];
1943 startXval[nblocks][pos] = SCIPinfinity(scip);
1946 assert( evpos == blocksizes[0] + blocksizes[1] );
1948 startXnblocknonz[nblocks] = blocksizes[0] + blocksizes[1];
1951 pos = blocksizes[0] + blocksizes[1];
1952 for (b = 0; b < nblocks; b++)
1954 blocksize = blocksizes[2 + b];
1955 matrixsize = blocksize * blocksize;
1958 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, blockeigenvectors[b], matrixsize) );
1964 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
1967 SCIP_CALL(
SCIPlapackMatrixMatrixMult(blocksizes[2 + b], blocksizes[2 + b], blockeigenvectors[b], TRUE, blocksizes[2 + b], blocksizes[2 + b],
1968 scaledeigenvectors, FALSE, fullXmatrix) );
1971 startXnblocknonz[b] = 0;
1972 epsilon = SCIPepsilon(scip);
1973 for (r = 0; r < blocksize; r++)
1975 for (c = r; c < blocksize; c++)
1977 matrixpos = r * blocksize + c;
1978 if ( REALABS(fullXmatrix[matrixpos]) > epsilon )
1980 startXrow[b][startXnblocknonz[b]] = r;
1981 startXcol[b][startXnblocknonz[b]] = c;
1982 startXval[b][startXnblocknonz[b]] = fullXmatrix[matrixpos];
1983 startXnblocknonz[b]++;
1987 pos += blocksizes[2 + b];
1988 SCIPfreeBufferArray(scip, &fullXmatrix);
1989 SCIPfreeBufferArray(scip, &scaledeigenvectors);
1991 SCIPfreeBufferArray(scip, &optev);
1997 matrixsize = 2 * nvars + 2 * nrows;
1998 SCIP_CALL( SCIPallocBufferArray(scip, &startZrow[nblocks], matrixsize) );
1999 SCIP_CALL( SCIPallocBufferArray(scip, &startZcol[nblocks], matrixsize) );
2000 SCIP_CALL( SCIPallocBufferArray(scip, &startZval[nblocks], matrixsize) );
2003 SCIP_CALL( SCIPlpiClear(lpi) );
2006 SCIP_CALL( SCIPlpiChgObjsen(lpi, SCIP_OBJSEN_MINIMIZE) );
2009 roundingvars = nvars;
2010 for (b = 0; b < nblocks; b++)
2011 roundingvars += blocksizes[2 + b];
2013 SCIP_CALL( SCIPallocBufferArray(scip, &obj, roundingvars) );
2014 SCIP_CALL( SCIPallocBufferArray(scip, &lb, roundingvars) );
2015 SCIP_CALL( SCIPallocBufferArray(scip, &ub, roundingvars) );
2017 for (v = 0; v < nvars; v++)
2025 for (v = nvars; v < roundingvars; v++)
2029 ub[v] = SCIPlpiInfinity(lpi);
2036 SCIP_CALL( SCIPlpiAddCols(lpi, roundingvars, obj, lb, ub, NULL, 0, NULL, NULL, NULL) );
2038 SCIPfreeBufferArray(scip, &ub);
2039 SCIPfreeBufferArray(scip, &lb);
2040 SCIPfreeBufferArray(scip, &obj);
2043 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
2045 for (r = 0; r < nrows; r++)
2048 assert( row != NULL );
2049 rownnonz = SCIProwGetNNonz(row);
2051 rowvals = SCIProwGetVals(row);
2052 rowcols = SCIProwGetCols(row);
2053 rowlhs = SCIProwGetLhs(row) - SCIProwGetConstant(row);
2054 rowrhs = SCIProwGetRhs(row) - SCIProwGetConstant(row);
2056 SCIP_CALL( SCIPallocBufferArray(scip, &rowinds, rownnonz) );
2059 for (i = 0; i < rownnonz; i++)
2064 SCIP_CALL( SCIPlpiAddRows(lpi, 1, &rowlhs, &rowrhs, NULL, rownnonz, &pos, rowinds, rowvals) );
2066 SCIPfreeBufferArray(scip, &rowinds);
2071 for (b = 0; b < nblocks; b++)
2075 SCIP_CALL( SCIPallocBufferArray(scip, &blocknvarnonz, nvars) );
2076 SCIP_CALL( SCIPallocBufferArray(scip, &blockcol, nvars) );
2077 SCIP_CALL( SCIPallocBufferArray(scip, &blockrow, nvars) );
2078 SCIP_CALL( SCIPallocBufferArray(scip, &blockval, nvars) );
2079 SCIP_CALL( SCIPallocBufferArray(scip, &blockvars, nvars) );
2080 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstcol, blockconstnnonz) );
2081 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstrow, blockconstnnonz) );
2082 SCIP_CALL( SCIPallocBufferArray(scip, &blockconstval, blockconstnnonz) );
2083 blocksize = blocksizes[2 + b];
2084 matrixsize = blocksize * blocksize;
2086 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
2088 SCIP_CALL(
expandSparseMatrix(startZnblocknonz[b], blocksize, startZrow[b], startZcol[b], startZval[b], fullZmatrix) );
2092 arraylength = nvars;
2093 SCIP_CALL(
SCIPconsSdpGetData(scip, sdpblocks[b], &blocknvars, &blocknnonz, &blocksize, &arraylength, blocknvarnonz,
2094 blockcol, blockrow, blockval, blockvars, &blockconstnnonz, blockconstcol, blockconstrow, blockconstval) );
2096 nroundingrows = blocksize * (blocksize + 1) * 0.5;
2098 SCIP_CALL( SCIPallocBufferArray(scip, &lhs, nroundingrows) );
2099 SCIP_CALL( SCIPallocBufferArray(scip, &rhs, nroundingrows) );
2100 SCIP_CALL( SCIPallocBufferArray(scip, &nblockrownonz , nroundingrows) );
2101 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowcols , nroundingrows) );
2102 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowvals , nroundingrows) );
2105 for (i = 0; i < nroundingrows; i++)
2110 nblockrownonz[i] = 0;
2111 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowcols[i], nvars + blocksize) );
2112 SCIP_CALL( SCIPallocBufferArray(scip, &blockrowvals[i], nvars + blocksize) );
2116 for (i = 0; i < blockconstnnonz; i++)
2124 for (v = 0; v < blocknvars; v++)
2128 for (i = 0; i < blocknvarnonz[v]; i++)
2131 blockrowcols[pos][nblockrownonz[pos]] = varind;
2132 blockrowvals[pos][nblockrownonz[pos]] = blockval[v][i];
2133 nblockrownonz[pos]++;
2138 for (evind = 0; evind < blocksize; evind++)
2140 for (i = 0; i < blocksize; i++)
2142 for (j = 0; j <= i; j++)
2146 if ( SCIPisGT(scip, REALABS(-1 * blockeigenvectors[b][evind * blocksize + i] * blockeigenvectors[b][evind * blocksize + j]), 0.0) )
2149 blockrowcols[pos][nblockrownonz[pos]] = startpos + evind;
2150 blockrowvals[pos][nblockrownonz[pos]] = -1 * blockeigenvectors[b][evind * blocksize + i] * blockeigenvectors[b][evind * blocksize + j];
2151 nblockrownonz[pos]++;
2156 startpos += blocksize;
2160 for (r = 0; r < nroundingrows; r++)
2162 SCIP_CALL( SCIPlpiAddRows(lpi, 1, &lhs[r], &rhs[r], NULL, nblockrownonz[r], &pos, blockrowcols[r], blockrowvals[r]) );
2163 SCIPfreeBufferArray(scip, &blockrowvals[r]);
2164 SCIPfreeBufferArray(scip, &blockrowcols[r]);
2167 SCIPfreeBufferArray(scip, &blockrowvals);
2168 SCIPfreeBufferArray(scip, &blockrowcols);
2169 SCIPfreeBufferArray(scip, &nblockrownonz);
2170 SCIPfreeBufferArray(scip, &rhs);
2171 SCIPfreeBufferArray(scip, &lhs);
2172 SCIPfreeBufferArray(scip, &fullZmatrix);
2173 SCIPfreeBufferArray(scip, &blockconstval);
2174 SCIPfreeBufferArray(scip, &blockconstrow);
2175 SCIPfreeBufferArray(scip, &blockconstcol);
2176 SCIPfreeBufferArray(scip, &blockvars);
2177 SCIPfreeBufferArray(scip, &blockval);
2178 SCIPfreeBufferArray(scip, &blockrow);
2179 SCIPfreeBufferArray(scip, &blockcol);
2180 SCIPfreeBufferArray(scip, &blocknvarnonz);
2184 SCIP_CALL( SCIPlpiSolveDual(lpi) );
2186 if ( ! SCIPlpiIsOptimal(lpi) )
2188 SCIPdebugMsg(scip,
"Solution of dual rounding problem failed with status %d, continuing without warmstart\n", SCIPlpiGetInternalStatus(lpi));
2189 relaxdata->dualroundfails++;
2192 SCIPfreeBufferArrayNull(scip, &startZval[nblocks]);
2193 SCIPfreeBufferArrayNull(scip, &startZcol[nblocks]);
2194 SCIPfreeBufferArrayNull(scip, &startZrow[nblocks]);
2195 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2196 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2197 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2198 for (b = 0; b < nblocks; b++)
2200 SCIPfreeBufferArrayNull(scip, &blockeigenvectors[b]);
2201 SCIPfreeBufferArrayNull(scip, &blockeigenvalues[b]);
2202 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2203 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2204 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2205 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2206 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2207 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2209 SCIPfreeBufferArray(scip, &blocksizes);
2210 SCIPfreeBufferArray(scip, &blockeigenvectors);
2211 SCIPfreeBufferArray(scip, &blockeigenvalues);
2212 SCIPfreeBufferArrayNull(scip, &startXval);
2213 SCIPfreeBufferArrayNull(scip, &startXcol);
2214 SCIPfreeBufferArrayNull(scip, &startXrow);
2215 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2216 SCIPfreeBufferArrayNull(scip, &startZval);
2217 SCIPfreeBufferArrayNull(scip, &startZcol);
2218 SCIPfreeBufferArrayNull(scip, &startZrow);
2219 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2220 SCIPfreeBufferArray(scip, &starty);
2223 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
2226 SCIP_CALL(
SCIPsdpiSolve(sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, startsetting, enforceslater, timelimit));
2234 relaxdata->roundstartsuccess++;
2237 SCIP_CALL( SCIPallocBufferArray(scip, &optev, nvars + roundingvars) );
2238 SCIP_CALL( SCIPlpiGetSol(lpi, &dualroundobj, optev, NULL, NULL, NULL) );
2242 if ( SCIPisEQ(scip, primalroundobj, dualroundobj) )
2245 SCIP_CONS* savedcons;
2247 SCIPdebugMsg(scip,
"Node %lld solved to optimality through rounding problems with optimal objective %f\n",
2248 SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), dualroundobj);
2250 relaxdata->roundingoptimal++;
2253 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
2256 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
2257 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, optev) );
2259 *lowerbound = dualroundobj;
2260 relaxdata->objval = dualroundobj;
2263 SCIP_CALL( SCIPsetRelaxSolValsSol(scip, scipsol, TRUE) );
2265 relaxdata->feasible = TRUE;
2266 *result = SCIP_SUCCESS;
2269 if ( relaxdata->warmstart )
2271 char consname[SCIP_MAXSTRLEN];
2277 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2278 assert( snprintfreturn < SCIP_MAXSTRLEN );
2280 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
2282 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
2283 maxprimalentry, nblocks + 1, startXnblocknonz, startXrow, startXcol, startXval) );
2285 SCIP_CALL( SCIPaddCons(scip, savedcons) );
2286 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
2289 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
2292 SCIPfreeBufferArray(scip, &optev);
2293 SCIPfreeBufferArrayNull(scip, &startZval[nblocks]);
2294 SCIPfreeBufferArrayNull(scip, &startZcol[nblocks]);
2295 SCIPfreeBufferArrayNull(scip, &startZrow[nblocks]);
2296 SCIPfreeBufferArrayNull(scip, &startXval[nblocks]);
2297 SCIPfreeBufferArrayNull(scip, &startXcol[nblocks]);
2298 SCIPfreeBufferArrayNull(scip, &startXrow[nblocks]);
2299 for (b = 0; b < nblocks; b++)
2301 SCIPfreeBufferArrayNull(scip,&blockeigenvectors[b]);
2302 SCIPfreeBufferArrayNull(scip,&blockeigenvalues[b]);
2303 SCIPfreeBufferArrayNull(scip, &startXval[b]);
2304 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
2305 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
2306 SCIPfreeBufferArrayNull(scip, &startZval[b]);
2307 SCIPfreeBufferArrayNull(scip, &startZcol[b]);
2308 SCIPfreeBufferArrayNull(scip, &startZrow[b]);
2310 SCIPfreeBufferArray(scip, &blocksizes);
2311 SCIPfreeBufferArray(scip, &blockeigenvectors);
2312 SCIPfreeBufferArray(scip, &blockeigenvalues);
2313 SCIPfreeBufferArrayNull(scip, &startXval);
2314 SCIPfreeBufferArrayNull(scip, &startXcol);
2315 SCIPfreeBufferArrayNull(scip, &startXrow);
2316 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
2317 SCIPfreeBufferArrayNull(scip, &startZval);
2318 SCIPfreeBufferArrayNull(scip, &startZcol);
2319 SCIPfreeBufferArrayNull(scip, &startZrow);
2320 SCIPfreeBufferArrayNull(scip, &startZnblocknonz);
2321 SCIPfreeBufferArray(scip, &starty);
2327 for (v = 0; v < nvars; v++)
2329 if ( relaxdata->warmstartiptype == 1 )
2332 starty[v] = (1 - relaxdata->warmstartipfactor) * optev[v];
2334 else if ( relaxdata->warmstartiptype == 2 )
2337 starty[v] = (1 - relaxdata->warmstartipfactor) * optev[v] + relaxdata->warmstartipfactor * SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
2343 for (b = 0; b < nblocks; b++)
2345 blocksize = blocksizes[2 + b];
2346 matrixsize = blocksize * blocksize;
2348 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, blockeigenvectors[b], matrixsize) );
2354 SCIP_CALL( SCIPallocBufferArray(scip, &fullZmatrix, matrixsize) );
2358 scaledeigenvectors, FALSE, fullZmatrix) );
2361 startZnblocknonz[b] = 0;
2362 epsilon = SCIPepsilon(scip);
2363 for (r = 0; r < blocksize; r++)
2365 for (c = r; c < blocksize; c++)
2367 matrixpos = r * blocksize + c;
2368 if ( REALABS(fullZmatrix[matrixpos]) > epsilon )
2370 startZrow[b][startZnblocknonz[b]] = r;
2371 startZcol[b][startZnblocknonz[b]] = c;
2372 startZval[b][startZnblocknonz[b]] = fullZmatrix[matrixpos];
2373 startZnblocknonz[b]++;
2378 SCIPfreeBufferArray(scip, &fullZmatrix);
2379 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2380 SCIPfreeBufferArray(scip, &blockeigenvectors[b]);
2381 SCIPfreeBufferArray(scip, &blockeigenvalues[b]);
2384 SCIPfreeBufferArray(scip, &optev);
2385 SCIPfreeBufferArray(scip, &blockeigenvectors);
2386 SCIPfreeBufferArray(scip, &blockeigenvalues);
2387 SCIPfreeBufferArray(scip, &blocksizes);
2392 startZnblocknonz[b] = 2 * nrows + 2 * nvars;
2395 for (r = 0; r < nrows; r++)
2399 rownnonz = SCIProwGetNNonz(rows[r]);
2400 rowvals = SCIProwGetVals(rows[r]);
2401 rowcols = SCIProwGetCols(rows[r]);
2403 for (i = 0; i < rownnonz; i++)
2406 startZrow[b][2*r] = 2*r;
2407 startZcol[b][2*r] = 2*r;
2408 startZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
2410 startZrow[b][2*r + 1] = 2*r + 1;
2411 startZcol[b][2*r + 1] = 2*r + 1;
2412 startZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
2416 for (v = 0; v < nvars; v++)
2418 startZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
2419 startZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
2422 startZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
2423 startZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
2424 startZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - starty[
SCIPsdpVarmapperGetSdpIndex(relaxdata->varmapper, vars[v])];
2429 relaxdata->roundingprobtime += (SCIP_Real) currenttime.tv_sec + (SCIP_Real) currenttime.tv_usec / 1e6 - (SCIP_Real) starttime.tv_sec - (SCIP_Real) starttime.tv_usec / 1e6;
2433 if ( relaxdata->warmstartprimaltype == 3 )
2436 if ( relaxdata->warmstartproject != 4 )
2441 if ( relaxdata->warmstartproject == 3 )
2446 for (b = 0; b < nblocks; b++)
2449 matrixsize *= (matrixsize + 1) * 0.5;
2451 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], matrixsize) );
2452 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], matrixsize) );
2453 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], matrixsize) );
2456 else if ( relaxdata->warmstartiptype == 1 )
2458 for (b = 0; b < nblocks; b++)
2460 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2461 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2462 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b] +
SCIPconsSdpGetBlocksize(scip, sdpblocks[b])) );
2465 else if ( relaxdata->warmstartiptype == 2 )
2467 for (b = 0; b < nblocks; b++)
2469 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2470 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2471 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2482 if ( relaxdata->warmstartprojpdsame && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2484 identitydiagonal = 1.0;
2486 for (b = 0; b < nblocks; b++)
2488 for (i = 0; i < startZnblocknonz[b]; i++)
2490 if ( REALABS(startZval[b][i]) > identitydiagonal )
2491 identitydiagonal = REALABS(startZval[b][i]);
2493 for (i = 0; i < startXnblocknonz[b]; i++)
2495 if ( REALABS(startXval[b][i]) > identitydiagonal )
2496 identitydiagonal = REALABS(startXval[b][i]);
2499 identitydiagonal *= relaxdata->warmstartipfactor;
2502 for (b = 0; b < nblocks; b++)
2505 if ( relaxdata->warmstartproject == 3 )
2507 SCIP_Real* fullXmatrix;
2508 SCIP_Real* eigenvalues;
2509 SCIP_Real* eigenvectors;
2510 SCIP_Real* scaledeigenvectors;
2511 SCIP_Real matrixsize;
2516 matrixsize = blocksize * blocksize;
2518 SCIP_CALL( SCIPallocBufferArray(scip, &fullXmatrix, matrixsize) );
2519 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
2520 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvectors, matrixsize) );
2522 SCIP_CALL(
expandSparseMatrix(startXnblocknonz[b], blocksize, startXrow[b], startXcol[b], startXval[b], fullXmatrix) );
2527 SCIP_CALL( SCIPduplicateBufferArray(scip, &scaledeigenvectors, eigenvectors, matrixsize) );
2531 while (i < blocksize && SCIPisLT(scip, eigenvalues[i], relaxdata->warmstartprojminevprimal) )
2533 eigenvalues[i] = relaxdata->warmstartprojminevprimal;
2542 FALSE, fullXmatrix) );
2545 startXnblocknonz[b] = 0;
2546 epsilon = SCIPepsilon(scip);
2547 for (r = 0; r < blocksize; r++)
2549 for (c = r; c < blocksize; c++)
2551 matrixpos = r * blocksize + c;
2552 if ( REALABS(fullXmatrix[matrixpos]) > epsilon )
2554 startXrow[b][startXnblocknonz[b]] = r;
2555 startXcol[b][startXnblocknonz[b]] = c;
2556 startXval[b][startXnblocknonz[b]] = fullXmatrix[matrixpos];
2557 startXnblocknonz[b]++;
2563 SCIPfreeBufferArray(scip, &scaledeigenvectors);
2564 SCIPfreeBufferArray(scip, &eigenvectors);
2565 SCIPfreeBufferArray(scip, &eigenvalues);
2566 SCIPfreeBufferArray(scip, &fullXmatrix);
2570 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2572 if ( relaxdata->warmstartiptype == 1 )
2575 if ( ! relaxdata->warmstartprojpdsame )
2577 if ( relaxdata->warmstartproject == 3 )
2578 maxprimalentry = relaxdata->warmstartprojminevprimal;
2580 maxprimalentry = 1.0;
2581 for (i = 0; i < startXnblocknonz[b]; i++)
2583 if ( REALABS(startXval[b][i]) > maxprimalentry )
2584 maxprimalentry = REALABS(startXval[b][i]);
2586 identitydiagonal = relaxdata->warmstartipfactor * maxprimalentry;
2590 SCIP_CALL( SCIPallocBufferArray(scip, &diagentryexists, blocksize) );
2591 for (i = 0; i < blocksize; i++)
2592 diagentryexists[i] = FALSE;
2594 for (i = 0; i < startXnblocknonz[b]; i++)
2596 if ( startXrow[b][i] == startXcol[b][i] )
2598 startXval[b][i] = startXval[b][i] * (1 - relaxdata->warmstartipfactor) + identitydiagonal;
2599 assert( startXval[b][i] >= 0.0 );
2600 diagentryexists[startXrow[b][i]] = TRUE;
2603 startXval[b][i] *= (1 - relaxdata->warmstartipfactor);
2607 for (i = 0; i < blocksize; i++)
2609 if ( ! diagentryexists[i] )
2611 startXrow[b][startXnblocknonz[b]] = i;
2612 startXcol[b][startXnblocknonz[b]] = i;
2613 startXval[b][startXnblocknonz[b]] = identitydiagonal;
2614 startXnblocknonz[b]++;
2617 SCIPfreeBufferArrayNull(scip, &diagentryexists);
2619 else if ( relaxdata->warmstartiptype == 2 )
2622 for (i = 0; i < startXnblocknonz[b]; i++)
2623 startXval[b][i] *= 1 - relaxdata->warmstartipfactor;
2626 SCIP_CALL(
SCIPsdpVarfixerMergeArrays(SCIPblkmem(scip), SCIPepsilon(scip), relaxdata->ipXrow[b], relaxdata->ipXcol[b], relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b], TRUE,
2627 relaxdata->warmstartipfactor, startXrow[b], startXcol[b], startXval[b], &(startXnblocknonz[b]), startXnblocknonz[b] + relaxdata->ipXnblocknonz[b]) );
2632 for (b = 0; b < nblocks; b++)
2635 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2637 if ( relaxdata->warmstartiptype == 1 )
2639 if ( ! relaxdata->warmstartprojpdsame )
2643 for (i = 0; i < startZnblocknonz[b]; i++)
2645 if ( REALABS(startZval[b][i]) > maxdualentry )
2646 maxdualentry = REALABS(startZval[b][i]);
2648 identitydiagonal = relaxdata->warmstartipfactor * maxdualentry;
2651 SCIP_CALL( SCIPallocBufferArray(scip, &diagentryexists, blocksize) );
2652 for (i = 0; i < blocksize; i++)
2653 diagentryexists[i] = FALSE;
2655 for (i = 0; i < startZnblocknonz[b]; i++)
2657 if ( startZrow[b][i] == startZcol[b][i] )
2659 startZval[b][i] = startZval[b][i] * (1 - relaxdata->warmstartipfactor) + identitydiagonal;
2660 assert( startZval[b][i] >= 0 );
2661 diagentryexists[startZrow[b][i]] = TRUE;
2664 startZval[b][i] *= (1 - relaxdata->warmstartipfactor);
2668 for (i = 0; i < blocksize; i++)
2670 if ( ! diagentryexists[i] )
2672 startZrow[b][startZnblocknonz[b]] = i;
2673 startZcol[b][startZnblocknonz[b]] = i;
2674 startZval[b][startZnblocknonz[b]] = identitydiagonal;
2675 startZnblocknonz[b]++;
2679 SCIPfreeBufferArrayNull(scip, &diagentryexists);
2681 else if ( relaxdata->warmstartiptype == 2 )
2684 for (i = 0; i < startZnblocknonz[b]; i++)
2685 startZval[b][i] *= 1 - relaxdata->warmstartipfactor;
2688 SCIP_CALL(
SCIPsdpVarfixerMergeArrays(SCIPblkmem(scip), SCIPepsilon(scip), relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b], TRUE,
2689 relaxdata->warmstartipfactor, startZrow[b], startZcol[b], startZval[b], &(startZnblocknonz[b]), startZnblocknonz[b] + relaxdata->ipZnblocknonz[b]) );
2695 if ( relaxdata->warmstartproject == 3 )
2702 SCIPsortIntIntReal(startXrow[nblocks], startXcol[nblocks], startXval[nblocks], startXnblocknonz[nblocks]);
2705 nsavedentries = startXnblocknonz[nblocks];
2708 for (i = 0; i < nsavedentries; i++)
2710 assert( startXrow[nblocks][i] == startXcol[nblocks][i] );
2712 for (j = lastentry + 1; j < startXrow[nblocks][i]; j++)
2714 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2715 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2716 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2717 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartprojminevprimal;
2718 startXnblocknonz[nblocks]++;
2720 if ( SCIPisLT(scip, startXval[b][i], 1.0) )
2721 startXval[b][i] = relaxdata->warmstartprojminevprimal;
2723 lastentry = startXrow[nblocks][i];
2726 for (j = lastentry + 1; j < 2 * nrows + 2 * nvars; j++)
2728 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2729 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2730 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2731 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartprojminevprimal;
2732 startXnblocknonz[nblocks]++;
2737 if ( SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) )
2739 if ( relaxdata->warmstartiptype == 1 )
2746 if ( ! relaxdata->warmstartprojpdsame )
2747 identitydiagonal = relaxdata->warmstartipfactor;
2750 SCIPsortIntIntReal(startXrow[nblocks], startXcol[nblocks], startXval[nblocks], startXnblocknonz[nblocks]);
2753 nsavedentries = startXnblocknonz[nblocks];
2756 for (i = 0; i < nsavedentries; i++)
2758 assert( startXrow[nblocks][i] == startXcol[nblocks][i] );
2760 for (j = lastentry + 1; j < startXrow[nblocks][i]; j++)
2762 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2763 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2764 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2766 if ( relaxdata->warmstartprojpdsame )
2767 startXval[nblocks][startXnblocknonz[nblocks]] = identitydiagonal;
2769 startXval[nblocks][startXnblocknonz[nblocks]] = relaxdata->warmstartipfactor;
2770 startXnblocknonz[nblocks]++;
2775 if ( relaxdata->warmstartprojpdsame )
2776 startXval[b][i] = (1 - relaxdata->warmstartipfactor) * startXval[b][i] + identitydiagonal;
2777 else if ( SCIPisLT(scip, startXval[b][i], 1.0) )
2778 startXval[b][i] = (1 - relaxdata->warmstartipfactor) * startXval[b][i] + relaxdata->warmstartipfactor;
2780 lastentry = startXrow[nblocks][i];
2783 for (j = lastentry + 1; j < 2 * nrows + 2 * nvars; j++)
2785 assert( startXnblocknonz[nblocks] < 2 * nrows + 2 * nvars );
2786 startXrow[nblocks][startXnblocknonz[nblocks]] = j;
2787 startXcol[nblocks][startXnblocknonz[nblocks]] = j;
2788 startXval[nblocks][startXnblocknonz[nblocks]] = identitydiagonal;
2789 startXnblocknonz[nblocks]++;
2792 else if ( relaxdata->warmstartiptype == 2 )
2795 for (i = 0; i < startXnblocknonz[nblocks]; i++)
2796 startXval[nblocks][i] *= 1 - relaxdata->warmstartipfactor;
2800 relaxdata->ipXcol[nblocks], relaxdata->ipXval[nblocks], relaxdata->ipXnblocknonz[nblocks], TRUE,
2801 relaxdata->warmstartipfactor, startXrow[nblocks], startXcol[nblocks], startXval[nblocks],
2802 &(startXnblocknonz[nblocks]), startXnblocknonz[nblocks] + relaxdata->ipXnblocknonz[nblocks]) );
2806 if ( relaxdata->warmstartiptype == 1 )
2808 for (r = 0; r < nrows; r++)
2811 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[b][2*r], relaxdata->warmstartprojminevdual) )
2812 startZval[nblocks][2*r] = relaxdata->warmstartprojminevdual;
2816 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*r], 1.0) || relaxdata->warmstartprojpdsame) )
2819 if ( SCIPisLT(scip, startZval[nblocks][2*r], 0.0) )
2820 startZval[nblocks][2*r] = identitydiagonal;
2822 startZval[nblocks][2*r] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*r] + identitydiagonal;
2825 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*r + 1], relaxdata->warmstartprojminevdual) )
2826 startZval[nblocks][2*r + 1] = relaxdata->warmstartprojminevdual;
2827 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*r + 1], 1.0) || relaxdata->warmstartprojpdsame) )
2830 if ( SCIPisLT(scip, startZval[nblocks][2*r + 1], 0.0) )
2831 startZval[nblocks][2*r + 1] = identitydiagonal;
2833 startZval[nblocks][2*r + 1] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*r + 1] + identitydiagonal;
2837 for (v = 0; v < nvars; v++)
2839 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], relaxdata->warmstartprojminevdual) )
2840 startZval[nblocks][2*nrows + 2*v] = relaxdata->warmstartprojminevdual;
2841 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], 1.0) || relaxdata->warmstartprojpdsame) )
2844 if ( SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v], 0.0) )
2845 startZval[nblocks][2*nrows + 2*v] = identitydiagonal;
2847 startZval[nblocks][2*nrows + 2*v] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*nrows + 2*v] + identitydiagonal;
2850 if ( relaxdata->warmstartiptype == 1 && relaxdata->warmstartproject == 3 && SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], relaxdata->warmstartprojminevdual) )
2851 startZval[nblocks][2*nrows + 2*v + 1] = relaxdata->warmstartprojminevdual;
2852 else if ( relaxdata->warmstartiptype == 1 && (SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], 1.0) || relaxdata->warmstartprojpdsame) )
2855 if ( SCIPisLT(scip, startZval[nblocks][2*nrows + 2*v + 1], 0.0) )
2856 startZval[nblocks][2*nrows + 2*v + 1] = identitydiagonal;
2858 startZval[nblocks][2*nrows + 2*v + 1] = (1 - relaxdata->warmstartipfactor) * startZval[nblocks][2*nrows + 2*v + 1] + identitydiagonal;
2862 else if ( relaxdata->warmstartiptype == 2 )
2865 for (i = 0; i < startZnblocknonz[nblocks]; i++)
2866 startZval[nblocks][i] *= 1 - relaxdata->warmstartipfactor;
2870 relaxdata->ipZcol[nblocks], relaxdata->ipZval[nblocks], relaxdata->ipZnblocknonz[nblocks], TRUE,
2871 relaxdata->warmstartipfactor, startZrow[nblocks], startZcol[nblocks], startZval[nblocks],
2872 &(startZnblocknonz[nblocks]), startZnblocknonz[nblocks] + relaxdata->ipZnblocknonz[nblocks]) );
2877 #ifdef SCIP_PRINT_WARMSTART
2878 SCIPdebugMessage(
"warmstart using the following point:\n");
2879 nblocks = SCIPconshdlrGetNConss(SCIPfindConshdlr(scip,
"SDP"));
2880 for (i = 0; i < nvars; i++)
2881 SCIPdebugMessage(
"y[%d]=%f\n", i, starty[i]);
2885 for (b = 0; b < nblocks + 1; b++)
2887 SCIPdebugMessage(
"dual block %d\n", b);
2888 for (i = 0; i < startZnblocknonz[b]; i++)
2890 SCIPdebugMessage(
"Z(%d,%d)=%f\n", startZrow[b][i], startZcol[b][i], startZval[b][i]);
2893 for (b = 0; b < nblocks + 1; b++)
2895 SCIPdebugMessage(
"primal block %d\n", b);
2896 for (i = 0; i < startXnblocknonz[b]; i++)
2898 SCIPdebugMessage(
"X(%d,%d)=%f\n", startXrow[b][i], startXcol[b][i], startXval[b][i]);
2905 SCIP_CALL(
SCIPsdpiSolve(sdpi, starty, startZnblocknonz, startZrow, startZcol, startZval, startXnblocknonz, startXrow,
2906 startXcol, startXval, startsetting, enforceslater, timelimit));
2910 SCIP_CONSHDLR* sdpconshdlr;
2912 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
2913 nblocks = SCIPconshdlrGetNConss(sdpconshdlr) + 1;
2916 for (b = 0; b < nblocks; b++)
2918 SCIPfreeBufferArray(scip, &startXval[b]);
2919 SCIPfreeBufferArray(scip, &startXcol[b]);
2920 SCIPfreeBufferArray(scip, &startXrow[b]);
2921 SCIPfreeBufferArray(scip, &startZval[b]);
2922 SCIPfreeBufferArray(scip, &startZcol[b]);
2923 SCIPfreeBufferArray(scip, &startZrow[b]);
2926 SCIPfreeBufferArray(scip, &startXval);
2927 SCIPfreeBufferArray(scip, &startXcol);
2928 SCIPfreeBufferArray(scip, &startXrow);
2929 SCIPfreeBufferArray(scip, &startXnblocknonz);
2930 SCIPfreeBufferArray(scip, &startZval);
2931 SCIPfreeBufferArray(scip, &startZcol);
2932 SCIPfreeBufferArray(scip, &startZrow);
2933 SCIPfreeBufferArray(scip, &startZnblocknonz);
2935 SCIPfreeBufferArray(scip, &starty);
2941 relaxdata->lastsdpnode = SCIPnodeGetNumber(SCIPgetCurrentNode(scip));
2944 relaxdata->sdpinterfacecalls++;
2948 if ( naddedsdpcalls )
2950 relaxdata->sdpcalls += naddedsdpcalls;
2953 relaxdata->sdpiterations += naddediters;
2957 switch( usedsetting )
2960 relaxdata->solvedpenalty++;
2963 relaxdata->solvedfast++;
2966 relaxdata->solvedmedium++;
2969 relaxdata->solvedstable++;
2972 relaxdata->unsolved++;
2979 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
2980 switch( primalslater )
2983 relaxdata->npslatercheckfailed++;
2984 switch( dualslater )
2987 relaxdata->ndslatercheckfailed++;
2988 relaxdata->nslatercheckfailed++;
2991 relaxdata->ndnoslater++;
2992 relaxdata->nnoslater++;
2995 relaxdata->ndslaterholds++;
2996 relaxdata->nslatercheckfailed++;
2999 relaxdata->nslaterinfeasible++;
3002 relaxdata->ndslatercheckfailed++;
3003 relaxdata->nslatercheckfailed++;
3008 relaxdata->npnoslater++;
3009 switch( dualslater )
3012 relaxdata->ndslatercheckfailed++;
3013 relaxdata->nnoslater++;
3016 relaxdata->ndnoslater++;
3017 relaxdata->nnoslater++;
3020 relaxdata->ndslaterholds++;
3021 relaxdata->nnoslater++;
3024 relaxdata->nslaterinfeasible++;
3027 relaxdata->ndslatercheckfailed++;
3028 relaxdata->nnoslater++;
3033 relaxdata->npslaterholds++;
3034 switch( dualslater )
3037 relaxdata->ndslatercheckfailed++;
3038 relaxdata->nslatercheckfailed++;
3041 relaxdata->ndnoslater++;
3042 relaxdata->nnoslater++;
3045 relaxdata->ndslaterholds++;
3046 relaxdata->nslaterholds++;
3049 relaxdata->nslaterinfeasible++;
3052 relaxdata->ndslatercheckfailed++;
3053 relaxdata->nslatercheckfailed++;
3058 relaxdata->npslatercheckfailed++;
3059 relaxdata->ndslatercheckfailed++;
3060 relaxdata->nslatercheckfailed++;
3065 switch( slatersetting )
3068 relaxdata->stablewslater++;
3071 relaxdata->unstablewslater++;
3074 relaxdata->penaltywslater++;
3077 relaxdata->boundedwslater++;
3080 relaxdata->unsolvedwslater++;
3083 relaxdata->stablenoslater++;
3086 relaxdata->unstablenoslater++;
3089 relaxdata->penaltynoslater++;
3092 relaxdata->boundednoslater++;
3095 relaxdata->unsolvednoslater++;
3098 relaxdata->stableinfeasible++;
3101 relaxdata->unstableinfeasible++;
3104 relaxdata->penaltyinfeasible++;
3107 relaxdata->boundedinfeasible++;
3110 relaxdata->unsolvedinfeasible++;
3120 (void) SCIPsnprintf(saveconsname, SCIP_MAXSTRLEN,
"savedsettings_node_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3122 SCIP_CALL( SCIPaddCons(scip, savedsetting) );
3123 SCIP_CALL( SCIPreleaseCons(scip, &savedsetting) );
3127 relaxdata->feasible = FALSE;
3129 if ( SCIPinProbing(scip) )
3136 #ifdef SCIP_MORE_DEBUG
3139 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3141 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &sollength) );
3143 assert( sollength == nvars );
3148 SCIPdebugMessage(
"optimal solution: objective = %f, dual feasible: %u, primal feasible: %u.\n",
3153 SCIPdebugMessage(
"The solver could not determine feasibility ! ");
3157 for (i = 0; i < nvars; ++i)
3159 SCIPdebugMessage(
"<%s> = %f\n", SCIPvarGetName(vars[i]), solforscip[i]);
3161 SCIPfreeBufferArray(scip, &solforscip);
3167 SCIPdebugMessage(
"Node cut off due to infeasibility.\n");
3168 relaxdata->feasible = FALSE;
3169 *result = SCIP_CUTOFF;
3174 SCIPdebugMessage(
"Node cut off due to objective limit.\n");
3175 relaxdata->feasible = FALSE;
3176 *result = SCIP_CUTOFF;
3181 SCIPdebugMessage(
"Node unbounded.");
3182 relaxdata->feasible = TRUE;
3183 *result = SCIP_SUCCESS;
3184 *lowerbound = -SCIPinfinity(scip);
3190 SCIP_SOL* preoptimalsol;
3191 SCIP_CONS* savedcons;
3193 SCIP_Bool preoptimalsolsuccess;
3196 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3198 SCIP_CALL(
SCIPsdpiGetSol(sdpi, &objforscip, solforscip, &slength) );
3200 assert( slength == nvars );
3204 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3205 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, solforscip) );
3207 *lowerbound = objforscip;
3208 relaxdata->objval = objforscip;
3211 SCIP_CALL( SCIPsetRelaxSolVals(scip, nvars, vars, solforscip, TRUE) );
3213 relaxdata->feasible = TRUE;
3214 *result = SCIP_SUCCESS;
3215 preoptimalsolsuccess = FALSE;
3220 SCIP_Real maxprimalentry;
3221 int* startXnblocknonz;
3224 SCIP_Real** startXval;
3225 char consname[SCIP_MAXSTRLEN];
3230 startXnblocknonz = NULL;
3236 if ( relaxdata->warmstartpreoptsol )
3240 SCIP_Real* preoptimalvec;
3243 SCIP_CALL( SCIPallocBufferArray(scip, &preoptimalvec, nvars) );
3248 maxprimalentry = 0.0;
3249 if ( relaxdata->warmstartprimaltype == 3 )
3251 nblocks = SCIPconshdlrGetNConss(SCIPfindConshdlr(scip,
"SDP")) + 1;
3252 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3258 if ( startXnblocknonz[0] > -1 )
3260 preoptimalsolsuccess = TRUE;
3262 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3263 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3264 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3267 for (b = 0; b < nblocks; b++)
3269 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3270 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3271 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3275 nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3278 preoptimalsolsuccess = FALSE;
3288 maxprimalentry = 0.0;
3290 -1, NULL, NULL, NULL, NULL) );
3294 if ( preoptimalsolsuccess )
3296 assert( nvarsgiven == nvars );
3299 SCIP_CALL( SCIPcreateSol(scip, &preoptimalsol, NULL) );
3300 SCIP_CALL( SCIPsetSolVals(scip, preoptimalsol, nvars, vars, preoptimalvec) );
3303 SCIPfreeBufferArray(scip, &preoptimalvec);
3307 SCIPerrorMessage(
"Warmstarting with preoptimal solutions currently only supported for DSDP and SDPA \n");
3308 return SCIP_LPERROR;
3313 maxprimalentry = 0.0;
3314 if ( relaxdata->warmstartprimaltype == 3 )
3316 nblocks = SCIPconshdlrGetNConss(SCIPfindConshdlr(scip,
"SDP")) + 1;
3317 SCIP_CALL( SCIPallocBufferArray(scip, &startXnblocknonz, nblocks) );
3318 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow, nblocks) );
3319 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol, nblocks) );
3320 SCIP_CALL( SCIPallocBufferArray(scip, &startXval, nblocks) );
3326 for (b = 0; b < nblocks; b++)
3328 SCIP_CALL( SCIPallocBufferArray(scip, &startXrow[b], startXnblocknonz[b]) );
3329 SCIP_CALL( SCIPallocBufferArray(scip, &startXcol[b], startXnblocknonz[b]) );
3330 SCIP_CALL( SCIPallocBufferArray(scip, &startXval[b], startXnblocknonz[b]) );
3342 maxprimalentry = 0.0;
3346 snprintfreturn = SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3347 assert( snprintfreturn < SCIP_MAXSTRLEN );
3349 (void) SCIPsnprintf(consname, SCIP_MAXSTRLEN,
"saved_relax_sol_%d", SCIPnodeGetNumber(SCIPgetCurrentNode(scip)));
3351 if ( relaxdata->warmstartpreoptsol )
3354 if ( preoptimalsolsuccess )
3356 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), preoptimalsol,
3357 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3359 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3360 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3365 SCIP_CALL(
createConsSavesdpsol(scip, &savedcons, consname, SCIPnodeGetNumber(SCIPgetCurrentNode(scip)), scipsol,
3366 maxprimalentry, nblocks, startXnblocknonz, startXrow, startXcol, startXval) );
3368 SCIP_CALL( SCIPaddCons(scip, savedcons) );
3369 SCIP_CALL( SCIPreleaseCons(scip, &savedcons) );
3375 if ( startXnblocknonz[0] > 1 )
3377 for (b = 0; b < nblocks; b++)
3379 SCIPfreeBufferArrayNull(scip, &startXval[b]);
3380 SCIPfreeBufferArrayNull(scip, &startXcol[b]);
3381 SCIPfreeBufferArrayNull(scip, &startXrow[b]);
3383 SCIPfreeBufferArrayNull(scip, &startXval);
3384 SCIPfreeBufferArrayNull(scip, &startXcol);
3385 SCIPfreeBufferArrayNull(scip, &startXrow);
3387 SCIPfreeBufferArrayNull(scip, &startXnblocknonz);
3391 SCIPfreeBufferArray(scip, &solforscip);
3392 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3393 if ( preoptimalsolsuccess )
3395 SCIP_CALL( SCIPfreeSol(scip, &preoptimalsol) );
3405 *result = SCIP_DIDNOTRUN;
3411 objlb = -SCIPinfinity(scip);
3413 if ( ! SCIPisInfinity(scip, objlb) )
3415 *lowerbound = objlb;
3416 SCIPdebugMessage(
"The relaxation could not be solved, using best computed bound from penalty formulation.\n");
3418 else if ( ! SCIPisInfinity(scip, -1 * SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip))) )
3420 *lowerbound = SCIPnodeGetLowerbound(SCIPgetCurrentNode(scip));
3421 SCIPdebugMessage(
"The relaxation could not be solved, keeping old bound.\n");
3425 *result = SCIP_SUSPENDED;
3426 SCIPerrorMessage(
"The relaxation of the root node could not be solved, so there is no hope to solve this instance.\n");
3430 *result = SCIP_SUCCESS;
3446 assert( scip != NULL );
3448 vars = SCIPgetVars(scip);
3451 for (i = 0; i < SCIPgetNVars(scip); i++)
3453 if ( SCIPisLT(scip, SCIPvarGetLbLocal(vars[i]), SCIPvarGetUbLocal(vars[i])) )
3465 SCIP_RELAXDATA* relaxdata;
3473 #ifdef SCIP_EVEN_MORE_DEBUG
3474 SCIP_VAR** varsfordebug = SCIPgetVars(scip);
3475 const int nvarsfordebug = SCIPgetNVars(scip);
3478 SCIPdebugMessage(
"Calling relaxExecSdp.\n");
3480 relaxdata = SCIPrelaxGetData(relax);
3481 vars = SCIPgetVars(scip);
3482 nvars = SCIPgetNVars(scip);
3485 if ( (relaxdata->lastsdpnode == SCIPnodeGetNumber(SCIPgetCurrentNode(scip)) && ( ! SCIPinProbing(scip) ) ) && relaxdata->origsolved && ! relaxdata->resolve )
3488 SCIP_Real objforscip;
3489 SCIP_Real* solforscip;
3493 SCIPdebugMessage(
"Already solved SDP-relaxation for node %ld, returning with SCIP_SUCCESS so that no other relaxator is called.\n",
3494 SCIPrelaxGetData(relax)->lastsdpnode);
3498 relaxdata->feasible = TRUE;
3499 *result = SCIP_SUCCESS;
3500 *lowerbound = -SCIPinfinity(scip);
3505 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
3507 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, &objforscip, solforscip, &slength) );
3509 assert( slength == nvars );
3513 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3514 SCIP_CALL( SCIPsetRelaxSolVals(scip, nvars, vars, solforscip, TRUE) );
3516 *lowerbound = objforscip;
3519 SCIP_CALL( SCIPgetLPColsData(scip, &cols, &ncols) );
3520 for (i = 0; i < ncols; i++)
3522 SCIP_CALL( SCIPsetRelaxSolVal(scip, SCIPcolGetVar(cols[i]), SCIPgetSolVal(scip, scipsol, SCIPcolGetVar(cols[i]))) );
3525 SCIP_CALL( SCIPmarkRelaxSolValid(scip, TRUE) );
3526 *result = SCIP_SUCCESS;
3528 SCIPfreeBufferArray(scip, &solforscip);
3529 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3531 *result = SCIP_SUCCESS;
3536 relaxdata->origsolved = FALSE;
3539 SCIP_CALL( SCIPconstructLP(scip, &cutoff) );
3543 relaxdata->feasible = FALSE;
3544 *result = SCIP_CUTOFF;
3549 SCIP_CALL( SCIPflushLP(scip) );
3552 nconss = SCIPgetNConss(scip);
3554 #ifdef SCIP_EVEN_MORE_DEBUG
3555 for (i = 0; i < nvarsfordebug; i++)
3557 SCIPdebugMessage(
"variable %s: status = %u, integral = %u, bounds = [%f, %f] \n", SCIPvarGetName(varsfordebug[i]), SCIPvarGetStatus(varsfordebug[i]),
3558 SCIPvarIsIntegral(varsfordebug[i]), SCIPvarGetLbLocal(varsfordebug[i]), SCIPvarGetUbLocal(varsfordebug[i]));
3565 relaxdata->feasible = TRUE;
3566 *result = SCIP_DIDNOTRUN;
3576 SCIP_CALL( SCIPallocBufferArray(scip, &ubs, nvars) );
3579 for (i = 0; i < nvars; i++)
3581 ubs[i] = SCIPvarGetUbLocal(vars[i]);
3582 *lowerbound += SCIPvarGetObj(vars[i]) * ubs[i];
3583 assert( SCIPisFeasEQ(scip, SCIPvarGetUbLocal(vars[i]), SCIPvarGetLbLocal(vars[i])));
3586 SCIPdebugMessage(
"EVERYTHING IS FIXED, objective value = %f\n", *lowerbound);
3588 SCIP_CALL( SCIPcreateSol(scip, &scipsol, NULL) );
3589 SCIP_CALL( SCIPsetSolVals(scip, scipsol, nvars, vars, ubs) );
3592 for (i = 0; i < nvars; i++)
3594 SCIP_CALL( SCIPsetRelaxSolVal(scip, vars[i], SCIPvarGetLbLocal(vars[i])) );
3596 SCIP_CALL( SCIPmarkRelaxSolValid(scip, TRUE) );
3599 SCIP_CALL( SCIPcheckSol(scip, scipsol, FALSE, TRUE, TRUE, TRUE, TRUE, &feasible) );
3601 relaxdata->feasible = feasible;
3603 SCIP_CALL( SCIPfreeSol(scip, &scipsol) );
3605 SCIPfreeBufferArray(scip, &ubs);
3607 *result = SCIP_SUCCESS;
3614 SCIP_CALL(
calcRelax(scip, relaxdata, result, lowerbound));
3625 SCIP_RELAXDATA* relaxdata;
3626 SCIP_RETCODE retcode;
3630 SCIP_Real penaltyparam;
3631 SCIP_Real maxpenaltyparam;
3634 SCIP_Real givenpenaltyparam;
3635 SCIP_Real projminevprimal;
3636 SCIP_Real projminevdual;
3637 SCIP_Real preoptgap;
3642 assert( relax != NULL );
3644 relaxdata = SCIPrelaxGetData(relax);
3645 assert( relaxdata != NULL );
3647 relaxdata->objval = 0.0;
3648 relaxdata->origsolved = FALSE;
3649 relaxdata->probingsolved = FALSE;
3650 relaxdata->sdpcalls = 0;
3651 relaxdata->sdpinterfacecalls = 0;
3652 relaxdata->sdpiterations = 0;
3653 relaxdata->solvedfast = 0;
3654 relaxdata->solvedmedium = 0;
3655 relaxdata->solvedstable = 0;
3656 relaxdata->solvedpenalty = 0;
3657 relaxdata->stablewslater = 0;
3658 relaxdata->unstablewslater = 0;
3659 relaxdata->boundedwslater = 0;
3660 relaxdata->unsolvedwslater = 0;
3661 relaxdata->stablenoslater = 0;
3662 relaxdata->unsolvednoslater = 0;
3663 relaxdata->boundednoslater = 0;
3664 relaxdata->unsolvednoslater = 0;
3665 relaxdata->nslaterholds = 0;
3666 relaxdata->nnoslater = 0;
3667 relaxdata->nslatercheckfailed = 0;
3668 relaxdata->npslaterholds = 0;
3669 relaxdata->npnoslater = 0;
3670 relaxdata->npslatercheckfailed = 0;
3671 relaxdata->ndslaterholds = 0;
3672 relaxdata->ndnoslater = 0;
3673 relaxdata->ndslatercheckfailed = 0;
3674 relaxdata->nslaterinfeasible = 0;
3675 relaxdata->stableinfeasible = 0;
3676 relaxdata->unstableinfeasible = 0;
3677 relaxdata->penaltyinfeasible = 0;
3678 relaxdata->boundedinfeasible = 0;
3679 relaxdata->unsolvedinfeasible = 0;
3680 relaxdata->roundingprobinf = 0;
3681 relaxdata->primalroundfails = 0;
3682 relaxdata->dualroundfails = 0;
3683 relaxdata->roundstartsuccess = 0;
3684 relaxdata->roundingoptimal = 0;
3685 relaxdata->roundingcutoff = 0;
3686 relaxdata->roundingprobtime = 0.0;
3687 relaxdata->unsolved = 0;
3688 relaxdata->feasible = FALSE;
3690 nvars = SCIPgetNVars(scip);
3691 vars = SCIPgetVars(scip);
3703 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolvergaptol", &gaptol) );
3705 if ( retcode == SCIP_PARAMETERUNKNOWN )
3707 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3708 "SDP Solver <%s>: gaptol setting not available -- SCIP parameter has no effect.\n",
3713 SCIP_CALL( retcode );
3716 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/sdpsolverfeastol", &feastol) );
3718 if ( retcode == SCIP_PARAMETERUNKNOWN )
3720 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3721 "SDP Solver <%s>: sdpsolverfeastol setting not available -- SCIP parameter has no effect.\n",
3726 SCIP_CALL( retcode );
3730 if ( retcode == SCIP_PARAMETERUNKNOWN )
3732 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3733 "SDP Solver <%s>: epsilon setting not available -- SCIP parameter has no effect.\n",
3738 SCIP_CALL( retcode );
3742 if ( retcode == SCIP_PARAMETERUNKNOWN )
3744 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3745 "SDP Solver <%s>: feastol setting not available -- SCIP parameter has no effect.\n",
3750 SCIP_CALL( retcode );
3754 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/penaltyparam", &penaltyparam) );
3755 if ( SCIPisGE(scip, penaltyparam, 0.0) )
3758 givenpenaltyparam = penaltyparam;
3759 if ( retcode == SCIP_PARAMETERUNKNOWN )
3761 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3762 "SDP Solver <%s>: penaltyparam setting not available -- SCIP parameter has no effect\n",
3767 SCIP_CALL( retcode );
3777 for (v = 0; v < nvars; v++)
3779 if ( SCIPisGT(scip, REALABS(SCIPvarGetObj(vars[v])), maxcoeff) )
3780 maxcoeff = REALABS(SCIPvarGetObj(vars[v]));
3787 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/maxpenaltyparam", &maxpenaltyparam) );
3788 if ( SCIPisGE(scip, maxpenaltyparam, 0.0) )
3792 if ( retcode == SCIP_PARAMETERUNKNOWN )
3794 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3795 "SDP Solver <%s>: maxpenaltyparam setting not available -- SCIP parameter has no effect.\n",
3800 SCIP_CALL( retcode );
3804 if ( SCIPisLT(scip, givenpenaltyparam, maxpenaltyparam) )
3806 SCIPdebugMessage(
"Penalty parameter %f overwritten by maxpenaltyparam %f! \n", givenpenaltyparam, maxpenaltyparam);
3812 SCIP_Real givenmaxpenaltyparam;
3818 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/npenaltyincr", &npenaltyincr) );
3820 if ( retcode == SCIP_PARAMETERUNKNOWN )
3822 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3823 "SDP Solver <%s>: npenaltyincr setting not available -- SCIP parameter has no effect.\n",
3828 SCIP_CALL( retcode );
3835 SCIP_Real lambdastar;
3837 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/lambdastar", &lambdastar) );
3838 if ( SCIPisGE(scip, lambdastar, 0.0) )
3851 conss = SCIPgetConss(scip);
3852 nconss = SCIPgetNConss(scip);
3855 for (c = 0; c < nconss; c++)
3858 if ( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[c])),
"SDP") == 0 )
3861 if ( (! SCIPisInfinity(scip, maxguess) ) && SCIPisGT(scip, guess, maxguess) )
3871 relaxdata->lambdastar = 1.0;
3873 if ( retcode == SCIP_PARAMETERUNKNOWN )
3875 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3876 "SDP Solver <%s>: lambdastar setting not available -- SCIP parameter has no effect.\n",
3881 SCIP_CALL( retcode );
3885 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartprminevpri", &projminevprimal) );
3886 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartprminevdu", &projminevdual) );
3888 if ( SCIPisGE(scip, projminevprimal, 0.0) && SCIPisGE(scip, projminevdual, 0.0) )
3890 relaxdata->warmstartprojminevprimal = projminevprimal;
3891 relaxdata->warmstartprojminevdual = projminevdual;
3893 else if ( SCIPisGE(scip, projminevprimal, 0.0) && relaxdata->warmstartprojpdsame )
3895 relaxdata->warmstartprojminevprimal = projminevprimal;
3896 relaxdata->warmstartprojminevdual = projminevprimal;
3898 else if ( SCIPisGE(scip, projminevdual, 0.0) && relaxdata->warmstartprojpdsame )
3900 relaxdata->warmstartprojminevprimal = projminevdual;
3901 relaxdata->warmstartprojminevdual = projminevdual;
3905 SCIP_CONSHDLR* sdpconshdlr;
3906 SCIP_CONS** sdpblocks;
3910 SCIP_Real maxsdprhs;
3912 SCIP_Real maxsdpcoef;
3917 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
3918 nsdpblocks = SCIPconshdlrGetNConss(sdpconshdlr);
3919 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
3923 for (b = 0; b < nsdpblocks; b++)
3926 if ( SCIPisGT(scip, sdpcoef, maxsdpcoef) )
3927 maxsdpcoef = sdpcoef;
3933 for (b = 0; b < nsdpblocks; b++)
3941 for (v = 0; v < nvars; v++)
3943 if ( SCIPisGT(scip, REALABS(SCIPvarGetObj(vars[v])), maxobj) )
3944 maxobj = REALABS(SCIPvarGetObj(vars[v]));
3947 if ( relaxdata->warmstartprojpdsame )
3949 maxval = SCIPisGT(scip, maxsdprhs, maxobj) ? maxsdprhs : maxobj;
3950 maxval = SCIPisGT(scip, maxsdpcoef, maxval) ? maxsdpcoef : maxval;
3955 SCIPdebugMsg(scip,
"Setting warmstartprojminev to %f\n", relaxdata->warmstartprojminevdual);
3959 if ( ! SCIPisGE(scip, projminevprimal, 0.0) )
3963 SCIPdebugMsg(scip,
"Setting warmstartprojminevprimal to %f\n", relaxdata->warmstartprojminevprimal);
3966 if ( ! SCIPisGE(scip, projminevdual, 0.0) )
3970 SCIPdebugMsg(scip,
"Setting warmstartprojminevdual to %f\n", relaxdata->warmstartprojminevdual);
3975 SCIP_CALL( SCIPgetBoolParam(scip,
"relaxing/SDP/sdpinfo", &sdpinfo) );
3977 if ( retcode == SCIP_PARAMETERUNKNOWN )
3979 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3980 "SDP Solver <%s>: sdpinfo setting not available -- SCIP parameter has no effect.\n",
3985 SCIP_CALL( retcode );
3988 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/sdpsolverthreads", &nthreads) );
3993 if ( retcode == SCIP_PARAMETERUNKNOWN )
3995 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
3996 "SDP Solver <%s>: nthreads setting not available -- SCIP parameter has no effect.\n",
4001 SCIP_CALL( retcode );
4005 SCIP_CALL( SCIPgetIntParam(scip,
"relaxing/SDP/slatercheck", &slatercheck) );
4007 if ( retcode == SCIP_PARAMETERUNKNOWN )
4009 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4010 "SDP Solver <%s>: slatercheck setting not available -- SCIP parameter has no effect.\n",
4015 SCIP_CALL( retcode );
4024 SCIP_CALL( SCIPgetRealParam(scip,
"relaxing/SDP/warmstartpreoptgap", &preoptgap) );
4026 if ( retcode == SCIP_PARAMETERUNKNOWN )
4028 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
4029 "SDP Solver <%s>: warmstartpreoptgap setting not available -- SCIP parameter has no effect.\n",
4034 SCIP_CALL( retcode );
4045 assert( scip != NULL );
4046 assert( relax != NULL );
4047 assert( strcmp(SCIPrelaxGetName(relax),
RELAX_NAME) == 0 );
4058 SCIP_RELAXDATA* relaxdata;
4060 assert( scip != NULL );
4061 assert( relax != NULL );
4063 relaxdata = SCIPrelaxGetData(relax);
4064 assert( relaxdata != NULL );
4066 SCIPdebugMessage(
"Exiting Relaxation Handler.\n");
4068 if ( relaxdata->displaystat && SCIPgetSubscipDepth(scip) == 0 )
4070 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"\nSDP iterations:\t\t\t\t%6d\n", relaxdata->sdpiterations);
4071 if ( relaxdata->sdpcalls )
4073 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Average SDP-iterations:\t\t\t%6.2f \n", (SCIP_Real) relaxdata->sdpiterations / (SCIP_Real) relaxdata->sdpcalls );
4075 if ( relaxdata->sdpinterfacecalls )
4079 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4080 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'medium settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedmedium / (SCIP_Real) relaxdata->sdpinterfacecalls);
4081 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedstable / (SCIP_Real) relaxdata->sdpinterfacecalls);
4085 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'default formulation' solved:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedfast / (SCIP_Real) relaxdata->sdpinterfacecalls);
4087 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage penalty formulation used:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->solvedpenalty / (SCIP_Real) relaxdata->sdpinterfacecalls);
4088 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage unsolved even with penalty:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->unsolved / (SCIP_Real) relaxdata->sdpinterfacecalls);
4090 if ( relaxdata->slatercheck )
4092 if ( relaxdata->sdpinterfacecalls )
4094 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater condition held:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->npslaterholds / (SCIP_Real) relaxdata->sdpinterfacecalls);
4095 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater condition did not hold:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->npnoslater / (SCIP_Real) relaxdata->sdpinterfacecalls);
4096 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage primal Slater check failed:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->npslatercheckfailed / (SCIP_Real) relaxdata->sdpinterfacecalls);
4098 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater condition held:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->ndslaterholds / (SCIP_Real) relaxdata->sdpinterfacecalls);
4099 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater condition did not hold:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->ndnoslater / (SCIP_Real) relaxdata->sdpinterfacecalls);
4100 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater check failed:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->ndslatercheckfailed / (SCIP_Real) relaxdata->sdpinterfacecalls);
4101 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage dual Slater check detected infeasibility:\t%6.2f \n", 100.0 * (SCIP_Real) relaxdata->nslaterinfeasible / (SCIP_Real) relaxdata->sdpinterfacecalls);
4103 if ( relaxdata->nslaterholds )
4105 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with primal and dual slater holding:\t%6.2f \n",
4106 100.0 * (SCIP_Real) relaxdata->stablewslater / (SCIP_Real) relaxdata->nslaterholds);
4107 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with primal and dual slater holding:\t%6.2f \n",
4108 100.0 * (SCIP_Real) relaxdata->unstablewslater / (SCIP_Real) relaxdata->nslaterholds);
4109 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with primal and dual slater holding:\t%6.2f \n",
4110 100.0 * (SCIP_Real) relaxdata->penaltywslater / (SCIP_Real) relaxdata->nslaterholds);
4111 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with primal and dual slater holding:\t%6.2f \n",
4112 100.0 * (SCIP_Real) relaxdata->boundedwslater / (SCIP_Real) relaxdata->nslaterholds);
4113 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with primal and dual slater holding:\t%6.2f \n",
4114 100.0 * (SCIP_Real) relaxdata->unsolvedwslater / (SCIP_Real) relaxdata->nslaterholds);
4116 if ( relaxdata->nnoslater )
4118 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with either primal or dual slater not holding:\t%6.2f \n",
4119 100.0 * (SCIP_Real) relaxdata->stablenoslater / (SCIP_Real) relaxdata->nnoslater);
4120 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with either primal or dual slater not holding:\t%6.2f \n",
4121 100.0 * (SCIP_Real) relaxdata->unstablenoslater / (SCIP_Real) relaxdata->nnoslater);
4122 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with either primal or dual slater not holding:\t%6.2f \n",
4123 100.0 * (SCIP_Real) relaxdata->penaltynoslater / (SCIP_Real) relaxdata->nnoslater);
4124 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with either primal or dual slater not holding:\t%6.2f \n",
4125 100.0 * (SCIP_Real) relaxdata->boundednoslater / (SCIP_Real) relaxdata->nnoslater);
4126 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with either primal or dual slater not holding:\t%6.2f \n",
4127 100.0 * (SCIP_Real) relaxdata->unsolvednoslater / (SCIP_Real) relaxdata->nnoslater);
4129 if ( relaxdata->nslaterinfeasible )
4131 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'fastest settings' with slater check showing infeasibility:\t%6.2f \n",
4132 100.0 * (SCIP_Real) relaxdata->stableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4133 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'stable settings' with slater check showing infeasibility:\t%6.2f \n",
4134 100.0 * (SCIP_Real) relaxdata->unstableinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4135 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'penalty' with slater check showing infeasibility:\t%6.2f \n",
4136 100.0 * (SCIP_Real) relaxdata->penaltyinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4137 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'computed infeasible lower bound' with slater check showing infeasibility:\t%6.2f \n",
4138 100.0 * (SCIP_Real) relaxdata->boundedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4139 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Percentage 'unsolved' with slater check showing infeasibility:\t%6.2f \n",
4140 100.0 * (SCIP_Real) relaxdata->unsolvedinfeasible / (SCIP_Real) relaxdata->nslaterinfeasible);
4142 #ifdef SLATERSOLVED_ABSOLUTE
4143 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with primal and dual slater holding:\t%d \n", relaxdata->nslaterholds);
4144 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'fastest settings' and primal and dual slater holding:\t%d \n", relaxdata->stablewslater);
4145 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'stable settings' and primal and dual slater holding:\t%d \n", relaxdata->unstablewslater);
4146 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and primal and dual slater holding:\t%d \n", relaxdata->penaltywslater);
4147 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);
4148 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and primal and dual slater holding:\t%d \n", relaxdata->unsolvedwslater);
4150 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with either primal or dual slater not holding:\t%d \n", relaxdata->nnoslater);
4151 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);
4152 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);
4153 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'penalty' and either primal or dual slater not holding:\t%d \n", relaxdata->penaltynoslater);
4154 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);
4155 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes with 'unsolved' and either primal or dual slater not holding:\t%d \n", relaxdata->unsolvednoslater);
4157 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes:\t%d \n", relaxdata->nslaterinfeasible);
4158 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'fastest settings':\t%d \n", relaxdata->stableinfeasible);
4159 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'stable settings':\t%d \n", relaxdata->unstableinfeasible);
4160 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'penalty':\t%d \n", relaxdata->penaltyinfeasible);
4161 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'computed infeasible lower bound':\t%d \n", relaxdata->boundedinfeasible);
4162 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of infeasible nodes with 'unsolved':\t%d \n", relaxdata->unsolvedinfeasible);
4165 if ( relaxdata->warmstart && relaxdata->warmstartproject == 4 )
4167 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes detected infeasible through primal rounding problem:\t%d \n", relaxdata->roundingprobinf);
4168 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes that were successfully warmstarted using the rounding problems:\t%d \n", relaxdata->roundstartsuccess);
4169 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the primal rounding problem failed:\t%d \n", relaxdata->primalroundfails);
4170 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the dual rounding problem failed:\t%d \n", relaxdata->dualroundfails);
4171 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes where the optimal solution was determined by the rounding problem:\t%d \n", relaxdata->roundingoptimal);
4172 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Number of nodes cut off through bounding by the rounding problem:\t%d \n", relaxdata->roundingcutoff);
4173 SCIPverbMessage(scip, SCIP_VERBLEVEL_NORMAL, NULL,
"Time spent in rounding problems for warmstarting / detecting infeasibility:\t%f s \n", relaxdata->roundingprobtime);
4177 if ( relaxdata->varmapper != NULL )
4183 if ( relaxdata->warmstart && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && relaxdata->nblocks > 0 )
4187 for (b = 0; b < relaxdata->nblocks; b++)
4191 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXval[b]), relaxdata->ipXnblocknonz[b]);
4192 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXcol[b]), relaxdata->ipXnblocknonz[b]);
4193 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipXrow[b]), relaxdata->ipXnblocknonz[b]);
4195 if ( relaxdata->ipZnblocknonz[b] > 0 )
4197 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZval[b]), relaxdata->ipZnblocknonz[b]);
4198 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZcol[b]), relaxdata->ipZnblocknonz[b]);
4199 SCIPfreeBlockMemoryArrayNull(scip, &(relaxdata->ipZrow[b]), relaxdata->ipZnblocknonz[b]);
4204 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXval, relaxdata->nblocks);
4205 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXcol, relaxdata->nblocks);
4206 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXrow, relaxdata->nblocks);
4207 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks);
4209 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZval, relaxdata->nblocks);
4210 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZcol, relaxdata->nblocks);
4211 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZrow, relaxdata->nblocks);
4212 SCIPfreeBlockMemoryArrayNull(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks);
4213 SCIP_CALL( SCIPfreeSol(scip, &relaxdata->ipy) );
4216 relaxdata->objval = 0.0;
4217 relaxdata->origsolved = FALSE;
4218 relaxdata->probingsolved = FALSE;
4219 relaxdata->feasible = FALSE;
4220 relaxdata->sdpiterations = 0;
4221 relaxdata->sdpcalls = 0;
4222 relaxdata->sdpinterfacecalls = 0;
4223 relaxdata->lastsdpnode = 0;
4233 SCIP_RELAXDATA* relaxdata;
4235 relaxdata = SCIPrelaxGetData(relax);
4236 assert(relaxdata != NULL);
4238 if ( relaxdata->sdpi != NULL )
4242 if ( relaxdata->lpi != NULL )
4244 SCIP_CALL( SCIPlpiFree(&(relaxdata->lpi)) );
4247 SCIPfreeMemory(scip, &relaxdata);
4249 SCIPrelaxSetData(relax, NULL);
4259 SCIP_RELAXDATA* relaxdata = NULL;
4264 assert( scip != NULL );
4267 SCIP_CALL( SCIPallocMemory(scip, &relaxdata) );
4268 SCIP_CALL(
SCIPsdpiCreate(&sdpi, SCIPgetMessagehdlr(scip), SCIPblkmem(scip), SCIPbuffer(scip)) );
4269 SCIP_CALL( SCIPlpiCreate(&lpi, SCIPgetMessagehdlr(scip),
"SDProundingProb", SCIP_OBJSEN_MINIMIZE) );
4271 relaxdata->sdpi = sdpi;
4272 relaxdata->lpi = lpi;
4273 relaxdata->lastsdpnode = -1;
4274 relaxdata->nblocks = 0;
4275 relaxdata->ipXexists = FALSE;
4276 relaxdata->ipZexists = FALSE;
4280 assert( relax != NULL );
4283 SCIP_CALL( SCIPsetRelaxInitsol(scip, relax, relaxInitSolSdp) );
4284 SCIP_CALL( SCIPsetRelaxExit(scip, relax, relaxExitSdp) );
4285 SCIP_CALL( SCIPsetRelaxFree(scip, relax, relaxFreeSdp) );
4286 SCIP_CALL( SCIPsetRelaxCopy(scip, relax, relaxCopySdp) );
4289 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolvergaptol",
4290 "the stopping criterion for the duality gap the sdpsolver should use",
4293 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/sdpsolverfeastol",
4294 "the feasibility tolerance for the SDP solver",
4297 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/penaltyparam",
4298 "the starting value of the penalty parameter Gamma used for the penalty formulation if the "
4299 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->penaltyparam),
4302 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/maxpenaltyparam",
4303 "the maximum value of the penalty parameter Gamma used for the penalty formulation if the "
4304 "SDP solver didn't converge; set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->maxpenaltyparam),
4307 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartipfactor",
4308 "factor for interior point in convexcombination of IP and parent solution, if warmstarts are enabled", &(relaxdata->warmstartipfactor),
4311 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartprimaltype",
4312 "how to warmstart the primal problem? 1: scaled identity/analytic center, 2: elementwise reciprocal, 3: saved primal sol", &(relaxdata->warmstartprimaltype), TRUE,
4315 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartiptype",
4316 "which interior point to use for convex combination for warmstarts? 1: scaled identity, 2: analytic center", &(relaxdata->warmstartiptype), TRUE,
4319 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/warmstartproject",
4320 "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", &(relaxdata->warmstartproject), TRUE,
4323 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevpri",
4324 "minimum eigenvalue to allow when projecting primal matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically", &(relaxdata->warmstartpmevprimalpar),
4327 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartprminevdu",
4328 "minimum eigenvalue to allow when projecting dual matrices onto the positive (semi-)definite cone for warmstarting; -1 to compute automatically", &(relaxdata->warmstartpmevdualpar),
4331 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartprojpdsame",
4332 "Should one shared minimum eigenvalue respectively maximum entry be computed for primal and dual problem instead of different ones for primal and dual and each block for projection or convex combination ?",
4335 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartpreoptsol",
4336 "Should a preoptimal solution (with larger gap) instead of the optimal solution be used for warmstarts",
4339 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/warmstartpreoptgap",
4340 "If warmstartpreoptsol is TRUE, this is the gap where the preoptimal solution will be saved", &(relaxdata->warmstartpreoptgap),
4343 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstartroundonlyinf",
4344 "Only use solution of roundingproblem to detect infeasibility (only has an effect for warmstartproject = 4)",
4347 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/npenaltyincr",
4348 "maximum number of times the penalty parameter will be increased if the penalty formulation failed", &(relaxdata->npenaltyincr), TRUE,
4351 SCIP_CALL( SCIPaddRealParam(scip,
"relaxing/SDP/lambdastar",
4352 "the parameter lambda star used by SDPA to set the initial point;"
4353 "set this to a negative value to compute the parameter depending on the given problem", &(relaxdata->lambdastar),
4356 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/slatercheck",
4357 "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 "
4358 "every problem not satisfying primal and dual Slater condition", &(relaxdata->slatercheck), TRUE,
DEFAULT_SLATERCHECK, 0, 2, NULL, NULL) );
4360 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/sdpinfo",
4361 "Should the SDP solver output information to the screen?",
4364 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/warmstart",
4365 "Should the SDP solver try to use warmstarts?",
4368 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/objlimit",
4369 "Should an objective limit be given to the SDP-Solver?",
4372 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/resolve",
4373 "Should the relaxation be resolved after bound-tightenings were found during propagation (outside of probing)?",
4376 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/tightenvb",
4377 "Should Big-Ms in varbound-like constraints be tightened before giving them to the SDP-solver ?",
4380 SCIP_CALL( SCIPaddBoolParam(scip,
"relaxing/SDP/displaystatistics",
4381 "Should statistics about SDP iterations and solver settings/success be printed after quitting SCIP-SDP ?",
4384 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetfreq",
4385 "frequency for resetting parameters in SDP solver and trying again with fastest settings (-1: never, 0: only at depth settingsresetofs);"
4386 "currently only supported for SDPA",
4389 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/settingsresetofs",
4390 "frequency offset for resetting parameters in SDP solver and trying again with fastest settings; currently only supported for SDPA",
4393 SCIP_CALL( SCIPaddIntParam(scip,
"relaxing/SDP/sdpsolverthreads",
4394 "number of threads the SDP solver should use (-1 = number of cores); currently only supported for MOSEK",
4415 SCIP_CONSHDLR* sdpconshdlr;
4416 SCIP_RELAXDATA* relaxdata;
4418 assert( scip != NULL );
4419 assert( relax != NULL );
4420 assert( SCIPgetStage(scip) == SCIP_STAGE_SOLVING );
4422 SCIPdebugMsg(scip,
"computing analytic centers for warmstarting\n");
4424 relaxdata = SCIPrelaxGetData(relax);
4427 if ( relaxdata->ipXexists || relaxdata->ipZexists )
4429 SCIPdebugMsg(scip,
"aborting SCIPrelaxSdpComputeAnalyticCenters since analytic centers have already been computed\n");
4433 sdpconshdlr = SCIPfindConshdlr(scip,
"SDP");
4436 if ( relaxdata->warmstart && (relaxdata->warmstartiptype == 2) && SCIPisGT(scip, relaxdata->warmstartipfactor, 0.0) && (SCIPconshdlrGetNConss(sdpconshdlr) + SCIPgetNLPRows(scip) > 0 ) )
4440 relaxdata->nblocks = SCIPgetNLPRows(scip) + SCIPgetNVars(scip) > 0 ? SCIPconshdlrGetNConss(sdpconshdlr) + 1 : SCIPconshdlrGetNConss(sdpconshdlr);
4442 if ( SCIPgetNVars(scip) > 0 )
4446 SCIP_CONS** sdpblocks;
4447 SCIP_Real* solforscip;
4449 SCIP_Real timelimit;
4472 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
4473 if ( ! SCIPisInfinity(scip, timelimit) )
4475 timelimit -= SCIPgetSolvingTime(scip);
4476 if ( timelimit <= 0.0 )
4481 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit));
4484 relaxdata->sdpinterfacecalls++;
4488 if ( naddedsdpcalls )
4490 relaxdata->sdpcalls += naddedsdpcalls;
4493 relaxdata->sdpiterations += naddediters;
4497 switch( usedsetting )
4500 relaxdata->solvedpenalty++;
4503 relaxdata->solvedfast++;
4506 relaxdata->solvedmedium++;
4509 relaxdata->solvedstable++;
4512 relaxdata->unsolved++;
4519 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
4520 switch( primalslater )
4523 relaxdata->npslatercheckfailed++;
4524 switch( dualslater )
4527 relaxdata->ndslatercheckfailed++;
4528 relaxdata->nslatercheckfailed++;
4531 relaxdata->ndnoslater++;
4532 relaxdata->nnoslater++;
4535 relaxdata->ndslaterholds++;
4536 relaxdata->nslatercheckfailed++;
4539 relaxdata->nslaterinfeasible++;
4542 relaxdata->ndslatercheckfailed++;
4543 relaxdata->nslatercheckfailed++;
4548 relaxdata->npnoslater++;
4549 switch( dualslater )
4552 relaxdata->ndslatercheckfailed++;
4553 relaxdata->nnoslater++;
4556 relaxdata->ndnoslater++;
4557 relaxdata->nnoslater++;
4560 relaxdata->ndslaterholds++;
4561 relaxdata->nnoslater++;
4564 relaxdata->nslaterinfeasible++;
4567 relaxdata->ndslatercheckfailed++;
4568 relaxdata->nnoslater++;
4573 relaxdata->npslaterholds++;
4574 switch( dualslater )
4577 relaxdata->ndslatercheckfailed++;
4578 relaxdata->nslatercheckfailed++;
4581 relaxdata->ndnoslater++;
4582 relaxdata->nnoslater++;
4585 relaxdata->ndslaterholds++;
4586 relaxdata->nslaterholds++;
4589 relaxdata->nslaterinfeasible++;
4592 relaxdata->ndslatercheckfailed++;
4593 relaxdata->nslatercheckfailed++;
4598 relaxdata->npslatercheckfailed++;
4599 relaxdata->ndslatercheckfailed++;
4600 relaxdata->nslatercheckfailed++;
4605 switch( slatersetting )
4608 relaxdata->stablewslater++;
4611 relaxdata->unstablewslater++;
4614 relaxdata->penaltywslater++;
4617 relaxdata->boundedwslater++;
4620 relaxdata->unsolvedwslater++;
4623 relaxdata->stablenoslater++;
4626 relaxdata->unstablenoslater++;
4629 relaxdata->penaltynoslater++;
4632 relaxdata->boundednoslater++;
4635 relaxdata->unsolvednoslater++;
4638 relaxdata->stableinfeasible++;
4641 relaxdata->unstableinfeasible++;
4644 relaxdata->penaltyinfeasible++;
4647 relaxdata->boundedinfeasible++;
4650 relaxdata->unsolvedinfeasible++;
4659 int npenaltybounds = 0;
4661 relaxdata->ipXexists = TRUE;
4664 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
4665 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
4666 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
4667 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
4670 for (b = 0; b < relaxdata->nblocks; b++)
4672 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
4673 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
4674 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
4679 relaxdata->ipXrow, relaxdata->ipXcol, relaxdata->ipXval) );
4682 for (i = 0; i < relaxdata->ipXnblocknonz[relaxdata->nblocks - 1]; i++)
4688 if ( npenaltybounds > 0 )
4690 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXrow[relaxdata->nblocks - 1],
4691 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4692 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXcol[relaxdata->nblocks - 1],
4693 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4694 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipXval[relaxdata->nblocks - 1],
4695 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1], relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds) );
4696 relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] = relaxdata->ipXnblocknonz[relaxdata->nblocks - 1] - npenaltybounds;
4699 for (b = 0; b < relaxdata->nblocks; b++)
4702 SCIPsdpVarfixerSortRowCol(relaxdata->ipXrow[b], relaxdata->ipXcol[b], relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]);
4705 #ifdef SCIP_PRINT_WARMSTART
4706 SCIPdebugMessage(
"Computed primal analytic center:\n");
4707 for (b = 0; b < relaxdata->nblocks; b++)
4709 SCIPdebugMessage(
"primal matrix, block %d:\n", b);
4710 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4712 SCIPdebugMessage(
"X_%d[%d,%d]: %f\n", b, relaxdata->ipXrow[b][i], relaxdata->ipXcol[b][i], relaxdata->ipXval[b][i]);
4719 relaxdata->ipXexists = TRUE;
4721 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXnblocknonz, relaxdata->nblocks) );
4722 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow, relaxdata->nblocks) );
4723 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol, relaxdata->nblocks) );
4724 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval, relaxdata->nblocks) );
4726 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
4728 for (b = 0; b < relaxdata->nblocks; b++)
4730 if ( b < relaxdata->nblocks - 1 )
4738 relaxdata->ipXnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
4740 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXrow[b], relaxdata->ipXnblocknonz[b]) );
4741 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXcol[b], relaxdata->ipXnblocknonz[b]) );
4742 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipXval[b], relaxdata->ipXnblocknonz[b]) );
4744 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
4746 relaxdata->ipXrow[b][i] = i;
4747 relaxdata->ipXcol[b][i] = i;
4748 relaxdata->ipXval[b][i] = relaxdata->lambdastar;
4752 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of primal feasible set, using scaled identity instead.\n");
4761 SCIP_CALL( SCIPgetRealParam(scip,
"limits/time", &timelimit) );
4762 if ( ! SCIPisInfinity(scip, timelimit) )
4764 timelimit -= SCIPgetSolvingTime(scip);
4765 if ( timelimit <= 0.0 )
4770 SCIP_CALL(
SCIPsdpiSolve(relaxdata->sdpi, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
SCIP_SDPSOLVERSETTING_UNSOLVED, FALSE, timelimit));
4776 if ( naddedsdpcalls )
4778 relaxdata->sdpinterfacecalls++;
4779 relaxdata->sdpcalls += naddedsdpcalls;
4782 relaxdata->sdpiterations += naddediters;
4786 switch( usedsetting )
4789 relaxdata->solvedpenalty++;
4792 relaxdata->solvedfast++;
4795 relaxdata->solvedmedium++;
4798 relaxdata->solvedstable++;
4801 relaxdata->unsolved++;
4808 SCIP_CALL(
SCIPsdpiSlater(relaxdata->sdpi, &primalslater, &dualslater) );
4809 switch( primalslater )
4812 relaxdata->npslatercheckfailed++;
4813 switch( dualslater )
4816 relaxdata->ndslatercheckfailed++;
4817 relaxdata->nslatercheckfailed++;
4820 relaxdata->ndnoslater++;
4821 relaxdata->nnoslater++;
4824 relaxdata->ndslaterholds++;
4825 relaxdata->nslatercheckfailed++;
4828 relaxdata->nslaterinfeasible++;
4831 relaxdata->ndslatercheckfailed++;
4832 relaxdata->nslatercheckfailed++;
4837 relaxdata->npnoslater++;
4838 switch( dualslater )
4841 relaxdata->ndslatercheckfailed++;
4842 relaxdata->nnoslater++;
4845 relaxdata->ndnoslater++;
4846 relaxdata->nnoslater++;
4849 relaxdata->ndslaterholds++;
4850 relaxdata->nnoslater++;
4853 relaxdata->nslaterinfeasible++;
4856 relaxdata->ndslatercheckfailed++;
4857 relaxdata->nnoslater++;
4862 relaxdata->npslaterholds++;
4863 switch( dualslater )
4866 relaxdata->ndslatercheckfailed++;
4867 relaxdata->nslatercheckfailed++;
4870 relaxdata->ndnoslater++;
4871 relaxdata->nnoslater++;
4874 relaxdata->ndslaterholds++;
4875 relaxdata->nslaterholds++;
4878 relaxdata->nslaterinfeasible++;
4881 relaxdata->ndslatercheckfailed++;
4882 relaxdata->nslatercheckfailed++;
4887 relaxdata->npslatercheckfailed++;
4888 relaxdata->ndslatercheckfailed++;
4889 relaxdata->nslatercheckfailed++;
4894 switch( slatersetting )
4897 relaxdata->stablewslater++;
4900 relaxdata->unstablewslater++;
4903 relaxdata->penaltywslater++;
4906 relaxdata->boundedwslater++;
4909 relaxdata->unsolvedwslater++;
4912 relaxdata->stablenoslater++;
4915 relaxdata->unstablenoslater++;
4918 relaxdata->penaltynoslater++;
4921 relaxdata->boundednoslater++;
4924 relaxdata->unsolvednoslater++;
4927 relaxdata->stableinfeasible++;
4930 relaxdata->unstableinfeasible++;
4933 relaxdata->penaltyinfeasible++;
4936 relaxdata->boundedinfeasible++;
4939 relaxdata->unsolvedinfeasible++;
4951 relaxdata->ipZexists = TRUE;
4953 nvars = SCIPgetNVars(scip);
4954 vars = SCIPgetVars(scip);
4957 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
4958 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
4959 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
4960 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
4963 SCIP_CALL( SCIPallocBufferArray(scip, &solforscip, nvars) );
4966 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solforscip, &slength) );
4968 assert( slength == nvars );
4972 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
4973 SCIP_CALL( SCIPsetSolVals(scip, relaxdata->ipy, nvars, vars, solforscip) );
4974 #ifdef SCIP_PRINT_WARMSTART
4975 SCIPdebugMessage(
"Computed dual analytic center:\n");
4976 for (i = 0; i < nvars; i++)
4978 SCIPdebugMessage(
"y[%d] = %f\n", i, solforscip[i]);
4982 SCIPfreeBufferArray(scip, &solforscip);
4985 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
4986 for (b = 0; b < relaxdata->nblocks - 1; b++)
4989 arraylength = relaxdata->ipZnblocknonz[b];
4991 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
4992 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
4993 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
4996 SCIP_CALL(
SCIPconsSdpComputeSparseSdpMatrix(scip, sdpblocks[b], relaxdata->ipy, &(relaxdata->ipZnblocknonz[b]), relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b]) );
4998 assert( relaxdata->ipZnblocknonz[b] <= arraylength );
5000 if ( relaxdata->ipZnblocknonz[b] < arraylength )
5002 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5003 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5004 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &relaxdata->ipZval[b], arraylength, relaxdata->ipZnblocknonz[b]) );
5008 SCIPsdpVarfixerSortRowCol(relaxdata->ipZrow[b], relaxdata->ipZcol[b], relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]);
5012 SCIP_CALL( SCIPgetLPRowsData(scip, &rows, &nrows) );
5013 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], 2 * nrows + 2 * nvars) );
5014 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], 2 * nrows + 2 * nvars) );
5015 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], 2 * nrows + 2 * nvars) );
5018 relaxdata->ipZnblocknonz[b] = 2 * nrows + 2 * nvars;
5020 for (r = 0; r < nrows; r++)
5024 rownnonz = SCIProwGetNNonz(rows[r]);
5025 rowvals = SCIProwGetVals(rows[r]);
5026 rowcols = SCIProwGetCols(rows[r]);
5027 for (i = 0; i < rownnonz; i++)
5028 rowval += SCIPgetSolVal(scip, relaxdata->ipy, SCIPcolGetVar(rowcols[i])) * rowvals[i];
5030 relaxdata->ipZrow[b][2*r] = 2*r;
5031 relaxdata->ipZcol[b][2*r] = 2*r;
5032 relaxdata->ipZval[b][2*r] = rowval - (SCIProwGetLhs(rows[r]) - SCIProwGetConstant(rows[r]));
5033 relaxdata->ipZrow[b][2*r + 1] = 2*r + 1;
5034 relaxdata->ipZcol[b][2*r + 1] = 2*r + 1;
5035 relaxdata->ipZval[b][2*r + 1] = SCIProwGetRhs(rows[r]) - SCIProwGetConstant(rows[r]) - rowval;
5038 for (v = 0; v < nvars; v++)
5040 relaxdata->ipZrow[b][2*nrows + 2*v] = 2*nrows + 2*v;
5041 relaxdata->ipZcol[b][2*nrows + 2*v] = 2*nrows + 2*v;
5042 relaxdata->ipZval[b][2*nrows + 2*v] = SCIPgetSolVal(scip, relaxdata->ipy, vars[v]) - SCIPvarGetLbLocal(vars[v]);
5043 relaxdata->ipZrow[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
5044 relaxdata->ipZcol[b][2*nrows + 2*v + 1] = 2*nrows + 2*v + 1;
5045 relaxdata->ipZval[b][2*nrows + 2*v + 1] = SCIPvarGetUbLocal(vars[v]) - SCIPgetSolVal(scip, relaxdata->ipy, vars[v]);
5047 #ifdef SCIP_PRINT_WARMSTART
5048 for (b = 0; b < relaxdata->nblocks - 1; b++)
5050 SCIPdebugMessage(
"dual matrix, block %d:\n", b);
5051 for (i = 0; i < relaxdata->ipZnblocknonz[b]; i++)
5053 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", b, relaxdata->ipZrow[b][i], relaxdata->ipZcol[b][i], relaxdata->ipZval[b][i]);
5056 SCIPdebugMessage(
"dual matrix, LP constraints:\n");
5057 for (r = 0; r < nrows; r++)
5059 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks, relaxdata->ipZrow[b][2*r], relaxdata->ipZcol[b][2*r], relaxdata->ipZval[b][2*r]);
5060 SCIPdebugMessage(
"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]);
5062 for (v = 0; v < nvars; v++)
5064 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
5065 relaxdata->ipZrow[b][2*nrows + 2*v], relaxdata->ipZcol[b][2*nrows + 2*v], relaxdata->ipZval[b][2*nrows + 2*v]);
5066 SCIPdebugMessage(
"Z_%d[%d,%d]: %f\n", relaxdata->nblocks,
5067 relaxdata->ipZrow[b][2*nrows + 2*v + 1], relaxdata->ipZcol[b][2*nrows + 2*v + 1], relaxdata->ipZval[b][2*nrows + 2*v + 1]);
5074 relaxdata->ipZexists = TRUE;
5077 SCIP_CALL( SCIPcreateSol(scip, &relaxdata->ipy, NULL) );
5079 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZnblocknonz, relaxdata->nblocks) );
5080 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow, relaxdata->nblocks) );
5081 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol, relaxdata->nblocks) );
5082 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval, relaxdata->nblocks) );
5084 sdpblocks = SCIPconshdlrGetConss(sdpconshdlr);
5086 for (b = 0; b < relaxdata->nblocks; b++)
5088 if ( b < relaxdata->nblocks - 1 )
5096 relaxdata->ipZnblocknonz[b] = SCIPgetNLPRows(scip) + 2 * SCIPgetNVars(scip);
5098 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZrow[b], relaxdata->ipZnblocknonz[b]) );
5099 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZcol[b], relaxdata->ipZnblocknonz[b]) );
5100 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &relaxdata->ipZval[b], relaxdata->ipZnblocknonz[b]) );
5102 for (i = 0; i < relaxdata->ipXnblocknonz[b]; i++)
5104 relaxdata->ipZrow[b][i] = i;
5105 relaxdata->ipZcol[b][i] = i;
5106 relaxdata->ipZval[b][i] = relaxdata->lambdastar;
5110 SCIPverbMessage(scip, SCIP_VERBLEVEL_FULL, NULL,
"Failed to compute analytic center of dual feasible set, using scaled identity instead.\n");
5133 SCIP_RELAXDATA* relaxdata;
5135 assert( relax != NULL );
5136 assert( lbvars != NULL );
5137 assert( ubvars != NULL );
5138 assert( arraylength != NULL );
5139 assert( *arraylength >= 0 );
5141 relaxdata = SCIPrelaxGetData(relax);
5142 assert( relaxdata != NULL );
5156 SCIP_RELAXDATA* relaxdata;
5158 assert( relax != NULL );
5159 assert( success != NULL );
5160 assert( objval != NULL );
5162 relaxdata = SCIPrelaxGetData(relax);
5163 assert( relaxdata != NULL );
5165 *success = relaxdata->origsolved;
5166 *objval = relaxdata->objval;
5176 SCIP_Real* solarray,
5180 SCIP_RELAXDATA* relaxdata;
5182 assert( relax != NULL );
5183 assert( success != NULL );
5184 assert( solarray != NULL );
5186 relaxdata = SCIPrelaxGetData(relax);
5187 assert( relaxdata != NULL );
5189 *success = relaxdata->origsolved;
5191 if ( *sollength >= SCIPgetNVars(scip) )
5193 SCIP_CALL(
SCIPsdpiGetSol(relaxdata->sdpi, NULL, solarray, sollength) );
5197 SCIPdebugMessage(
"Called SCIPrelaxSdpGetRelaxSol with an array that wasn't big enough, needed length %d, given %d!\n", SCIPgetNVars(scip), *sollength);
5198 *sollength = SCIPgetNVars(scip);
5209 assert( relax != NULL );
5210 assert( SCIPrelaxGetData(relax) != NULL );
5212 return SCIPrelaxGetData(relax)->lastsdpnode;
5220 SCIP_RELAXDATA* relaxdata;
5222 assert( relax != NULL );
5224 relaxdata = SCIPrelaxGetData(relax);
5226 assert( relaxdata != NULL );
5227 assert( relaxdata->sdpi != NULL );
5237 SCIP_RELAXDATA* relaxdata;
5239 assert( relax != NULL );
5241 relaxdata = SCIPrelaxGetData(relax);
5243 assert( relaxdata != NULL );
5244 assert( relaxdata->sdpi != NULL );
5246 return relaxdata->probingsolved;
5254 assert( relax != NULL );
5255 assert( SCIPrelaxGetData(relax) != NULL );
5257 return ( SCIPrelaxGetData(relax)->feasible );
5265 assert( relax != NULL );
5266 assert( SCIPrelaxGetData(relax) != NULL );
5268 return SCIPrelaxGetData(relax)->sdpiterations;
5276 assert( relax != NULL );
5277 assert( SCIPrelaxGetData(relax) != NULL );
5279 return ( SCIPrelaxGetData(relax)->sdpcalls );
5287 assert( relax != NULL );
5288 assert( SCIPrelaxGetData(relax) != NULL );
5290 return ( SCIPrelaxGetData(relax)->sdpinterfacecalls );
5298 assert( relax != NULL );
5299 assert( SCIPrelaxGetData(relax) != NULL );
5301 return ( SCIPrelaxGetData(relax)->solvedfast );
5309 assert( relax != NULL );
5310 assert( SCIPrelaxGetData(relax) != NULL );
5312 return ( SCIPrelaxGetData(relax)->solvedmedium );
5320 assert( relax != NULL );
5321 assert( SCIPrelaxGetData(relax) != NULL );
5323 return ( SCIPrelaxGetData(relax)->solvedstable );
5331 assert( relax != NULL );
5332 assert( SCIPrelaxGetData(relax) != NULL );
5334 return ( SCIPrelaxGetData(relax)->solvedpenalty );
5342 assert( relax != NULL );
5343 assert( SCIPrelaxGetData(relax) != NULL );
5345 return ( SCIPrelaxGetData(relax)->unsolved );
5353 assert( relax != NULL );
5354 assert( SCIPrelaxGetData(relax) != NULL );
5356 return ( SCIPrelaxGetData(relax)->ndslaterholds );
5364 assert( relax != NULL );
5365 assert( SCIPrelaxGetData(relax) != NULL );
5367 return ( SCIPrelaxGetData(relax)->ndnoslater );
5375 assert( relax != NULL );
5376 assert( SCIPrelaxGetData(relax) != NULL );
5378 return ( SCIPrelaxGetData(relax)->nslaterinfeasible );
5386 assert( relax != NULL );
5387 assert( SCIPrelaxGetData(relax) != NULL );
5389 return ( SCIPrelaxGetData(relax)->ndslatercheckfailed );
5397 assert( relax != NULL );
5398 assert( SCIPrelaxGetData(relax) != NULL );
5400 return ( SCIPrelaxGetData(relax)->npslaterholds );
5408 assert( relax != NULL );
5409 assert( SCIPrelaxGetData(relax) != NULL );
5411 return ( SCIPrelaxGetData(relax)->npnoslater );
5419 assert( relax != NULL );
5420 assert( SCIPrelaxGetData(relax) != NULL );
5422 return ( SCIPrelaxGetData(relax)->npslatercheckfailed );
5430 assert( relax != NULL );
5431 assert( SCIPrelaxGetData(relax) != NULL );
5433 return ( SCIPrelaxGetData(relax)->nslaterholds );
5441 assert( relax != NULL );
5442 assert( SCIPrelaxGetData(relax) != NULL );
5444 return ( SCIPrelaxGetData(relax)->stablewslater );
5452 assert( relax != NULL );
5453 assert( SCIPrelaxGetData(relax) != NULL );
5455 return ( SCIPrelaxGetData(relax)->unstablewslater );
5463 assert( relax != NULL );
5464 assert( SCIPrelaxGetData(relax) != NULL );
5466 return ( SCIPrelaxGetData(relax)->penaltywslater );
5474 assert( relax != NULL );
5475 assert( SCIPrelaxGetData(relax) != NULL );
5477 return ( SCIPrelaxGetData(relax)->boundedwslater );
5485 assert( relax != NULL );
5486 assert( SCIPrelaxGetData(relax) != NULL );
5488 return ( SCIPrelaxGetData(relax)->unsolvedwslater );
5496 assert( relax != NULL );
5497 assert( SCIPrelaxGetData(relax) != NULL );
5499 return ( SCIPrelaxGetData(relax)->nnoslater );
5507 assert( relax != NULL );
5508 assert( SCIPrelaxGetData(relax) != NULL );
5510 return ( SCIPrelaxGetData(relax)->stablenoslater );
5518 assert( relax != NULL );
5519 assert( SCIPrelaxGetData(relax) != NULL );
5521 return ( SCIPrelaxGetData(relax)->unstablenoslater );
5529 assert( relax != NULL );
5530 assert( SCIPrelaxGetData(relax) != NULL );
5532 return ( SCIPrelaxGetData(relax)->penaltynoslater );
5540 assert( relax != NULL );
5541 assert( SCIPrelaxGetData(relax) != NULL );
5543 return ( SCIPrelaxGetData(relax)->boundednoslater );
5551 assert( relax != NULL );
5552 assert( SCIPrelaxGetData(relax) != NULL );
5554 return ( SCIPrelaxGetData(relax)->unsolvednoslater );
5562 assert( relax != NULL );
5563 assert( SCIPrelaxGetData(relax) != NULL );
5565 return ( SCIPrelaxGetData(relax)->stableinfeasible );
5573 assert( relax != NULL );
5574 assert( SCIPrelaxGetData(relax) != NULL );
5576 return ( SCIPrelaxGetData(relax)->unstableinfeasible );
5584 assert( relax != NULL );
5585 assert( SCIPrelaxGetData(relax) != NULL );
5587 return ( SCIPrelaxGetData(relax)->penaltyinfeasible );
5595 assert( relax != NULL );
5596 assert( SCIPrelaxGetData(relax) != NULL );
5598 return ( SCIPrelaxGetData(relax)->boundedinfeasible );
5606 assert( relax != NULL );
5607 assert( SCIPrelaxGetData(relax) != NULL );
5609 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 SCIPrelaxSdpGetNSlaterInfeasibleFast(SCIP_RELAX *relax)
SCIP_RETCODE SCIPsdpiGetSdpCalls(SCIP_SDPI *sdpi, int *calls)
static SCIP_RETCODE calcRelax(SCIP *scip, SCIP_RELAXDATA *relaxdata, SCIP_RESULT *result, SCIP_Real *lowerbound)
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)
#define TIMEOFDAY_CALL(x)
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)
EXTERN SCIP_RETCODE SCIPlapackComputeEigenvectorDecomposition(BMS_BUFMEM *bufmem, int n, SCIP_Real *A, SCIP_Real *eigenvalues, SCIP_Real *eigenvectors)
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)
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)
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)
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
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
int SCIPconsSdpComputeUbSparseSdpMatrixLength(SCIP *scip, SCIP_CONS *cons)
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)
EXTERN 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)
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
enum SCIP_SDPSlater SCIP_SDPSLATER
SCIP_Real SCIPsdpiGetMaxPrimalEntry(SCIP_SDPI *sdpi)
SCIP_RETCODE SCIPconsSdpGetNNonz(SCIP *scip, SCIP_CONS *cons, int *nnonz, int *constnnonz)
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)
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
int SCIPrelaxSdpGetNSlaterHoldsPenalty(SCIP_RELAX *relax)
static SCIP_RETCODE putLpDataInInterface(SCIP *scip, SCIP_SDPI *sdpi, SdpVarmapper *varmapper, SCIP_Bool primalobj, SCIP_Bool dualobj)
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)
interface methods for eigenvector computation and matrix multiplication using different versions of L...
#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