47 #define CONSHDLR_NAME "Savesdpsol"
48 #define CONSHDLR_DESC "saving the SDP solution at each node of the tree constraint handler"
49 #define CONSHDLR_SEPAPRIORITY 0
50 #define CONSHDLR_ENFOPRIORITY 0
51 #define CONSHDLR_CHECKPRIORITY 0
52 #define CONSHDLR_SEPAFREQ -1
53 #define CONSHDLR_PROPFREQ -1
54 #define CONSHDLR_EAGERFREQ 100
56 #define CONSHDLR_MAXPREROUNDS -1
57 #define CONSHDLR_DELAYSEPA FALSE
58 #define CONSHDLR_DELAYPROP FALSE
59 #define CONSHDLR_DELAYPRESOL FALSE
60 #define CONSHDLR_NEEDSCONS TRUE
62 #define CONSHDLR_PROP_TIMING SCIP_PROPTIMING_BEFORELP
69 SCIP_Real maxprimalentry;
71 int* startXnblocknonz;
77 SCIP_Real** startXval;
87 assert( scip != NULL );
88 assert( conshdlr != NULL );
89 assert( cons != NULL );
90 assert( consdata != NULL );
91 assert( *consdata != NULL );
93 SCIPdebugMessage(
"Deleting store node data constraint: <%s>.\n", SCIPconsGetName(cons));
95 for (b = 0; b < (*consdata)->nblocks; b++)
97 SCIPfreeBlockMemoryArray(scip, &((*consdata)->startXval[b]), (*consdata)->startXnblocknonz[b]);
98 SCIPfreeBlockMemoryArray(scip, &((*consdata)->startXcol[b]), (*consdata)->startXnblocknonz[b]);
99 SCIPfreeBlockMemoryArray(scip, &((*consdata)->startXrow[b]), (*consdata)->startXnblocknonz[b]);
101 SCIPfreeBlockMemoryArray(scip, &((*consdata)->startXval), (*consdata)->nblocks);
102 SCIPfreeBlockMemoryArray(scip, &((*consdata)->startXcol), (*consdata)->nblocks);
103 SCIPfreeBlockMemoryArray(scip, &((*consdata)->startXrow), (*consdata)->nblocks);
104 SCIPfreeBlockMemoryArray(scip, &((*consdata)->startXnblocknonz), (*consdata)->nblocks);
106 SCIPfreeSol(scip, &((*consdata)->sol));
107 SCIPfreeBlockMemory(scip, consdata);
117 assert( scip != NULL );
118 assert( conshdlr != NULL );
119 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
120 assert( result != NULL );
123 *result = SCIP_FEASIBLE;
133 assert( scip != NULL );
134 assert( conshdlr != NULL );
135 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
136 assert( result != NULL );
139 *result = SCIP_FEASIBLE;
149 assert( scip != NULL );
150 assert( conshdlr != NULL );
151 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
152 assert( result != NULL );
155 *result = SCIP_FEASIBLE;
165 assert( scip != NULL );
166 assert( conshdlr != NULL );
167 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
168 assert( result != NULL );
171 *result = SCIP_FEASIBLE;
181 assert( scip != NULL );
182 assert( conshdlr != NULL );
183 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
194 assert( scip != NULL );
195 assert( conshdlr != NULL );
196 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
197 assert( valid != NULL );
224 SCIP_CONSHDLR* conshdlr;
230 consEnfolpSavesdpsol, consEnfopsSavesdpsol, consCheckSavesdpsol, consLockSavesdpsol,
232 assert( conshdlr != NULL );
235 SCIP_CALL( SCIPsetConshdlrDelete(scip, conshdlr, consDeleteSavesdpsol) );
236 SCIP_CALL( SCIPsetConshdlrCopy(scip, conshdlr, conshdlrCopySavesdpsol, consCopySavesdpsol) );
237 SCIP_CALL( SCIPsetConshdlrEnforelax(scip, conshdlr, consEnforelaxSavesdpsol) );
254 SCIP_Real maxprimalentry,
256 int* startXnblocknonz,
262 SCIP_Real** startXval
266 SCIP_CONSDATA* consdata = NULL;
267 SCIP_CONSHDLR* conshdlr;
270 assert( scip != NULL );
271 assert( name != NULL );
272 assert( sol != NULL );
273 assert( nblocks >= 0 );
274 assert( nblocks == 0 || startXnblocknonz != NULL );
275 assert( nblocks == 0 || startXrow != NULL );
276 assert( nblocks == 0 || startXcol != NULL );
277 assert( nblocks == 0 || startXval != NULL );
279 SCIPdebugMessage(
"Creating Savesdpsol constraint <%s>.\n", name);
282 conshdlr = SCIPfindConshdlr(scip,
"Savesdpsol");
283 if ( conshdlr == NULL )
285 SCIPerrorMessage(
"Savesdpsol constraint handler not found\n");
286 return SCIP_PLUGINNOTFOUND;
290 SCIP_CALL( SCIPallocBlockMemory(scip, &consdata) );
292 consdata->node = node;
293 SCIP_CALL( SCIPcreateSolCopy(scip, &(consdata->sol), sol) );
294 SCIP_CALL( SCIPunlinkSol(scip, consdata->sol) );
295 consdata->maxprimalentry = maxprimalentry;
298 if ( startXnblocknonz != NULL )
300 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &consdata->startXnblocknonz, startXnblocknonz, nblocks) );
303 consdata->startXnblocknonz = NULL;
305 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->startXrow, nblocks) );
306 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->startXcol, nblocks) );
307 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->startXval, nblocks) );
309 for (b = 0; b < nblocks; b++)
311 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &consdata->startXrow[b], startXrow[b], startXnblocknonz[b]) );
312 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &consdata->startXcol[b], startXcol[b], startXnblocknonz[b]) );
313 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &consdata->startXval[b], startXval[b], startXnblocknonz[b]) );
316 consdata->nblocks = nblocks;
319 SCIP_CALL( SCIPcreateCons(scip, cons, name, conshdlr, consdata, FALSE, FALSE, FALSE, FALSE, FALSE,
320 TRUE, FALSE, TRUE, FALSE, TRUE));
331 SCIP_CONSDATA* consdata;
333 assert ( scip != NULL );
334 assert ( cons != NULL );
336 consdata = SCIPconsGetData(cons);
338 assert ( consdata != NULL );
340 return consdata->node;
349 SCIP_CONSDATA* consdata;
351 assert ( scip != NULL );
352 assert ( cons != NULL );
354 consdata = SCIPconsGetData(cons);
356 assert ( consdata != NULL );
358 return consdata->sol;
367 SCIP_CONSDATA* consdata;
369 assert ( scip != NULL );
370 assert ( cons != NULL );
372 consdata = SCIPconsGetData(cons);
374 assert ( consdata != NULL );
376 return consdata->maxprimalentry;
384 int* startXnblocknonz
388 SCIP_CONSDATA* consdata;
391 assert ( scip != NULL );
392 assert ( cons != NULL );
394 consdata = SCIPconsGetData(cons);
396 assert ( consdata != NULL );
398 if ( nblocks != consdata->nblocks )
400 SCIPerrorMessage(
"SCIPconsSavesdpsolGetPrimalMatrix expected nblocks = %d but got %d\n", consdata->nblocks, nblocks);
404 for (b = 0; b < nblocks; b++)
405 startXnblocknonz[b] = consdata->startXnblocknonz[b];
415 int* startXnblocknonz,
419 SCIP_Real** startXval
422 SCIP_CONSDATA* consdata;
425 SCIP_Bool msgthrown = FALSE;
427 assert ( scip != NULL );
428 assert ( cons != NULL );
430 consdata = SCIPconsGetData(cons);
432 assert ( consdata != NULL );
434 if ( nblocks != consdata->nblocks )
436 SCIPerrorMessage(
"SCIPconsSavesdpsolGetPrimalMatrix expected nblocks = %d but got %d\n", consdata->nblocks, nblocks);
440 for (b = 0; b < nblocks; b++)
442 if ( startXnblocknonz[b] < consdata->startXnblocknonz[b] )
446 SCIPdebugMessage(
"Unsufficient arraylength %d for block %d in SCIPconsSavesdpsolGetPrimalMatrix, need at least %d!\n",
447 startXnblocknonz[b], b, consdata->startXnblocknonz[b]);
450 startXnblocknonz[b] = consdata->startXnblocknonz[b];
454 startXnblocknonz[b] = consdata->startXnblocknonz[b];
455 for (i = 0; i < consdata->startXnblocknonz[b]; i++)
457 startXrow[b][i] = consdata->startXrow[b][i];
458 startXcol[b][i] = consdata->startXcol[b][i];
459 startXval[b][i] = consdata->startXval[b][i];
#define CONSHDLR_NEEDSCONS
static SCIP_DECL_CONSENFOLP(consEnfolpSavesdpsol)
SCIP_Real SCIPconsSavesdpsolGetMaxPrimalEntry(SCIP *scip, SCIP_CONS *cons)
static SCIP_DECL_CONSENFORELAX(consEnforelaxSavesdpsol)
SCIP_RETCODE SCIPconsSavesdpsolGetPrimalMatrixNonzeros(SCIP *scip, SCIP_CONS *cons, int nblocks, int *startXnblocknonz)
#define CONSHDLR_CHECKPRIORITY
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_SOL * SCIPconsSavesdpsolGetDualVector(SCIP *scip, SCIP_CONS *cons)
static SCIP_DECL_CONSCOPY(consCopySavesdpsol)
static SCIP_DECL_CONSLOCK(consLockSavesdpsol)
#define CONSHDLR_ENFOPRIORITY
static SCIP_DECL_CONSENFOPS(consEnfopsSavesdpsol)
static SCIP_DECL_CONSDELETE(consDeleteSavesdpsol)
#define CONSHDLR_EAGERFREQ
SCIP_RETCODE SCIPconsSavesdpsolGetPrimalMatrix(SCIP *scip, SCIP_CONS *cons, int nblocks, int *startXnblocknonz, int **startXrow, int **startXcol, SCIP_Real **startXval)
static SCIP_DECL_CONSCHECK(consCheckSavesdpsol)
SCIP_RETCODE SCIPincludeConshdlrSavesdpsol(SCIP *scip)
static SCIP_DECL_CONSHDLRCOPY(conshdlrCopySavesdpsol)
SCIP_Longint SCIPconsSavesdpsolGetNodeIndex(SCIP *scip, SCIP_CONS *cons)
char name[SCIP_MAXSTRLEN]
constraint handler for saving SDP solutions in nodes