38 #include "scip/pub_misc.h" 43 #define BMS_CALL(x) do \ 47 SCIPerrorMessage("No memory in function call\n"); \ 48 return SCIP_NOMEMORY; \ 60 SCIP_Real* fullconstmatrix,
61 SCIP_Real* fullmatrix,
63 SCIP_Real* eigenvalue,
64 SCIP_Real* eigenvector
69 assert( fullconstmatrix != NULL );
70 assert( fullmatrix != NULL );
71 assert( eigenvalue != NULL );
74 for (i = 0; i < blocksize * blocksize; ++i)
75 tmpmatrix[i] = alpha * fullmatrix[i] - fullconstmatrix[i];
77 if ( eigenvector != NULL )
97 SCIP_Real* eigenvector,
98 SCIP_Real* supergradient
105 assert( supergradient != NULL );
107 *supergradient = 0.0;
108 for (i = 0; i < sdpnnonz; ++i)
113 *supergradient += sdpval[i] * eigenvector[r] * eigenvector[c];
115 *supergradient += sdpval[i] * eigenvector[c] * eigenvector[r];
129 SCIP_Real* sdpconstval,
140 SCIP_Real* fullconstmatrix;
141 SCIP_Real* fullmatrix;
142 SCIP_Real* tmpmatrix;
143 SCIP_Real* eigenvector = NULL;
144 SCIP_Real eigenvalue;
145 SCIP_Real supergradient = SCIP_INVALID;
151 assert( sdpconstnnonz == 0 || sdpconstrow != NULL );
152 assert( sdpconstnnonz == 0 || sdpconstcol != NULL );
153 assert( sdpconstnnonz == 0 || sdpconstval != NULL );
154 assert( sdpnnonz == 0 || sdprow != NULL );
155 assert( sdpnnonz == 0 || sdpcol != NULL );
156 assert( sdpnnonz == 0 || sdpval != NULL );
157 assert( objval != NULL );
158 assert( optval != NULL );
160 *objval = SCIP_INVALID;
161 *optval = SCIP_INVALID;
164 if ( lb <= -infinity )
166 if ( ub >= infinity )
173 SCIPdebugMessage(
"Solve SDP with one variable (obj = %g, lb = %g, ub = %g).\n", obj, lb, ub);
176 BMS_CALL( BMSallocClearBufferMemoryArray(bufmem, &fullconstmatrix, blocksize * blocksize) );
177 BMS_CALL( BMSallocClearBufferMemoryArray(bufmem, &fullmatrix, blocksize * blocksize) );
178 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &tmpmatrix, blocksize * blocksize) );
179 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &eigenvector, blocksize) );
181 for (i = 0; i < sdpconstnnonz; ++i)
185 assert( fullconstmatrix[r * blocksize + c] == 0.0 );
186 assert( fullconstmatrix[c * blocksize + r] == 0.0 );
187 fullconstmatrix[r * blocksize + c] = sdpconstval[i];
188 fullconstmatrix[c * blocksize + r] = sdpconstval[i];
191 for (i = 0; i < sdpnnonz; ++i)
195 assert( fullmatrix[r * blocksize + c] == 0.0 );
196 assert( fullmatrix[c * blocksize + r] == 0.0 );
197 fullmatrix[r * blocksize + c] = sdpval[i];
198 fullmatrix[c * blocksize + r] = sdpval[i];
202 SCIP_CALL(
SCIPoneVarFeasible(bufmem, blocksize, tmpmatrix, fullconstmatrix, fullmatrix, ub, &eigenvalue, eigenvector) );
203 SCIPdebugMessage(
"ub = %g, minimal eigenvalue: %g\n", ub, eigenvalue);
206 if ( eigenvalue < -feastol )
212 if ( supergradient > 0.0 )
214 SCIPdebugMessage(
"Problem is infeasible (minimal eigenvalue: %g, supergradient = %g).\n", eigenvalue, supergradient);
223 SCIP_CALL(
SCIPoneVarFeasible(bufmem, blocksize, tmpmatrix, fullconstmatrix, fullmatrix, lb, &eigenvalue, eigenvector) );
226 if ( eigenvalue >= -feastol )
228 SCIPdebugMessage(
"Lower bound is optimal.\n");
240 if ( supergradient <= 0.0 )
242 SCIPdebugMessage(
"Problem is infeasible (minimal eigenvalue: %g, supergradient: %g).\n", eigenvalue, supergradient);
249 assert( supergradient != SCIP_INVALID );
250 SCIPdebugMessage(
"lb = %g, minimal eigenvalue: %g, supergradient: %g\n", lb, eigenvalue, supergradient);
253 assert( eigenvector != NULL );
254 assert( eigenvalue < -feastol );
255 assert( supergradient > 0.0 );
257 while ( eigenvalue < -feastol && supergradient > 0.0 )
259 assert( eigenvalue < -feastol );
260 assert( supergradient > 0.0 );
264 mu = mu - (feastol / 2.0 + eigenvalue) / supergradient;
272 SCIP_CALL(
SCIPoneVarFeasible(bufmem, blocksize, tmpmatrix, fullconstmatrix, fullmatrix, mu, &eigenvalue, eigenvector) );
277 SCIPdebugMessage(
"mu = %.15g in [%.15g, %.15g], minimal eigenvalue: %g, supergradient: %g.\n", mu, lb, ub, eigenvalue, supergradient);
281 if ( eigenvalue < -feastol )
283 SCIPdebugMessage(
"Problem infeasible; detected at %.15g in [%.15g, %.15g], minimal eigenvalue: %g, supergradient: %g.\n", mu, lb, ub, eigenvalue, supergradient);
289 SCIPdebugMessage(
"Solution is %.15g in [%.15g, %.15g], minimal eigenvalue: %g, supergradient: %g.\n", mu, lb, ub, eigenvalue, supergradient);
295 BMSfreeBufferMemoryArray(bufmem, &eigenvector);
296 BMSfreeBufferMemoryArray(bufmem, &tmpmatrix);
297 BMSfreeBufferMemoryArray(bufmem, &fullmatrix);
298 BMSfreeBufferMemoryArray(bufmem, &fullconstmatrix);
311 SCIP_Real* fullconstmatrix,
322 SCIP_Real* fullmatrix;
323 SCIP_Real* tmpmatrix;
324 SCIP_Real* eigenvector = NULL;
325 SCIP_Real eigenvalue;
326 SCIP_Real supergradient = SCIP_INVALID;
332 assert( fullconstmatrix != NULL );
333 assert( sdpnnonz == 0 || sdprow != NULL );
334 assert( sdpnnonz == 0 || sdpcol != NULL );
335 assert( sdpnnonz == 0 || sdpval != NULL );
336 assert( objval != NULL );
337 assert( optval != NULL );
339 *objval = SCIP_INVALID;
340 *optval = SCIP_INVALID;
343 if ( lb <= -infinity )
345 if ( ub >= infinity )
352 SCIPdebugMessage(
"Solve SDP with one variable (obj = %g, lb = %g, ub = %g).\n", obj, lb, ub);
355 BMS_CALL( BMSallocClearBufferMemoryArray(bufmem, &fullmatrix, blocksize * blocksize) );
356 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &tmpmatrix, blocksize * blocksize) );
357 BMS_CALL( BMSallocBufferMemoryArray(bufmem, &eigenvector, blocksize) );
359 for (i = 0; i < sdpnnonz; ++i)
363 assert( fullmatrix[r * blocksize + c] == 0.0 );
364 assert( fullmatrix[c * blocksize + r] == 0.0 );
365 fullmatrix[r * blocksize + c] = sdpval[i];
366 fullmatrix[c * blocksize + r] = sdpval[i];
370 SCIP_CALL(
SCIPoneVarFeasible(bufmem, blocksize, tmpmatrix, fullconstmatrix, fullmatrix, ub, &eigenvalue, eigenvector) );
371 SCIPdebugMessage(
"ub = %g, minimal eigenvalue: %g\n", ub, eigenvalue);
374 if ( eigenvalue < -feastol )
380 if ( supergradient > 0.0 )
382 SCIPdebugMessage(
"Problem is infeasible (minimal eigenvalue: %g, supergradient = %g).\n", eigenvalue, supergradient);
391 SCIP_CALL(
SCIPoneVarFeasible(bufmem, blocksize, tmpmatrix, fullconstmatrix, fullmatrix, lb, &eigenvalue, eigenvector) );
394 if ( eigenvalue >= -feastol )
396 SCIPdebugMessage(
"Lower bound is optimal.\n");
408 if ( supergradient <= 0.0 )
410 SCIPdebugMessage(
"Problem is infeasible (minimal eigenvalue: %g, supergradient: %g).\n", eigenvalue, supergradient);
417 assert( supergradient != SCIP_INVALID );
418 SCIPdebugMessage(
"lb = %g, minimal eigenvalue: %g, supergradient: %g\n", lb, eigenvalue, supergradient);
421 assert( eigenvector != NULL );
422 assert( eigenvalue < -feastol );
423 assert( supergradient > 0.0 );
425 while ( eigenvalue < -feastol && supergradient > 0.0 )
427 assert( eigenvalue < -feastol );
428 assert( supergradient > 0.0 );
432 mu = mu - (feastol / 2.0 + eigenvalue) / supergradient;
440 SCIP_CALL(
SCIPoneVarFeasible(bufmem, blocksize, tmpmatrix, fullconstmatrix, fullmatrix, mu, &eigenvalue, eigenvector) );
445 SCIPdebugMessage(
"mu = %.15g in [%.15g, %.15g], minimal eigenvalue: %g, supergradient: %g.\n", mu, lb, ub, eigenvalue, supergradient);
449 if ( eigenvalue < -feastol )
451 SCIPdebugMessage(
"Problem infeasible; detected at %.15g in [%.15g, %.15g], minimal eigenvalue: %g, supergradient: %g.\n", mu, lb, ub, eigenvalue, supergradient);
457 SCIPdebugMessage(
"Solution is %.15g in [%.15g, %.15g], minimal eigenvalue: %g, supergradient: %g.\n", mu, lb, ub, eigenvalue, supergradient);
463 BMSfreeBufferMemoryArray(bufmem, &eigenvector);
464 BMSfreeBufferMemoryArray(bufmem, &tmpmatrix);
465 BMSfreeBufferMemoryArray(bufmem, &fullmatrix);
SCIP_RETCODE SCIPsolveOneVarSDP(BMS_BUFMEM *bufmem, SCIP_Real obj, SCIP_Real lb, SCIP_Real ub, int blocksize, int sdpconstnnonz, int *sdpconstrow, int *sdpconstcol, SCIP_Real *sdpconstval, int sdpnnonz, int *sdprow, int *sdpcol, SCIP_Real *sdpval, SCIP_Real infinity, SCIP_Real feastol, SCIP_Real *objval, SCIP_Real *optval)
SCIP_RETCODE SCIPsolveOneVarSDPDense(BMS_BUFMEM *bufmem, SCIP_Real obj, SCIP_Real lb, SCIP_Real ub, int blocksize, SCIP_Real *fullconstmatrix, int sdpnnonz, int *sdprow, int *sdpcol, SCIP_Real *sdpval, SCIP_Real infinity, SCIP_Real feastol, SCIP_Real *objval, SCIP_Real *optval)
static SCIP_RETCODE SCIPoneVarFeasible(BMS_BUFMEM *bufmem, int blocksize, SCIP_Real *tmpmatrix, SCIP_Real *fullconstmatrix, SCIP_Real *fullmatrix, SCIP_Real alpha, SCIP_Real *eigenvalue, SCIP_Real *eigenvector)
Solve SDP with one variable.
interface methods for eigenvector computation and matrix multiplication using openblas ...
SCIP_RETCODE SCIPlapackComputeIthEigenvalue(BMS_BUFMEM *bufmem, SCIP_Bool geteigenvectors, int n, SCIP_Real *A, int i, SCIP_Real *eigenvalue, SCIP_Real *eigenvector)
static void computeSupergradient(int sdpnnonz, int *sdprow, int *sdpcol, SCIP_Real *sdpval, SCIP_Real *eigenvector, SCIP_Real *supergradient)