47 #define CONSHDLR_NAME "Savesdpsol" 48 #define CONSHDLR_DESC "saving the SDP solution at each node of the tree constraint handler" 49 #define CONSHDLR_ENFOPRIORITY 0 50 #define CONSHDLR_CHECKPRIORITY 0 51 #define CONSHDLR_EAGERFREQ 100 53 #define CONSHDLR_NEEDSCONS TRUE 60 SCIP_Real maxprimalentry;
62 int* startXnblocknonz;
68 SCIP_Real** startXval;
78 assert(
scip != NULL );
79 assert( conshdlr != NULL );
80 assert( cons != NULL );
81 assert( consdata != NULL );
82 assert( *consdata != NULL );
84 SCIPdebugMsg(
scip,
"Deleting store node data constraint: <%s>.\n", SCIPconsGetName(cons));
86 for (b = 0; b < (*consdata)->nblocks; b++)
88 SCIPfreeBlockMemoryArray(
scip, &((*consdata)->startXval[b]), (*consdata)->startXnblocknonz[b]);
89 SCIPfreeBlockMemoryArray(
scip, &((*consdata)->startXcol[b]), (*consdata)->startXnblocknonz[b]);
90 SCIPfreeBlockMemoryArray(
scip, &((*consdata)->startXrow[b]), (*consdata)->startXnblocknonz[b]);
92 SCIPfreeBlockMemoryArray(
scip, &((*consdata)->startXval), (*consdata)->nblocks);
93 SCIPfreeBlockMemoryArray(
scip, &((*consdata)->startXcol), (*consdata)->nblocks);
94 SCIPfreeBlockMemoryArray(
scip, &((*consdata)->startXrow), (*consdata)->nblocks);
95 SCIPfreeBlockMemoryArray(
scip, &((*consdata)->startXnblocknonz), (*consdata)->nblocks);
97 SCIP_CALL( SCIPfreeSol(
scip, &((*consdata)->sol)) );
98 SCIPfreeBlockMemory(
scip, consdata);
108 assert(
scip != NULL );
109 assert( conshdlr != NULL );
110 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
111 assert( result != NULL );
114 *result = SCIP_FEASIBLE;
124 assert(
scip != NULL );
125 assert( conshdlr != NULL );
126 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
127 assert( result != NULL );
130 *result = SCIP_FEASIBLE;
140 assert(
scip != NULL );
141 assert( conshdlr != NULL );
142 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
143 assert( result != NULL );
146 *result = SCIP_FEASIBLE;
156 assert(
scip != NULL );
157 assert( conshdlr != NULL );
158 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
159 assert( result != NULL );
162 *result = SCIP_FEASIBLE;
172 assert(
scip != NULL );
173 assert( conshdlr != NULL );
174 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
185 assert(
scip != NULL );
186 assert( conshdlr != NULL );
187 assert( strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0 );
188 assert( valid != NULL );
213 SCIP_CONSHDLR* conshdlr;
219 consEnfolpSavesdpsol, consEnfopsSavesdpsol, consCheckSavesdpsol, consLockSavesdpsol,
221 assert( conshdlr != NULL );
224 SCIP_CALL( SCIPsetConshdlrDelete(
scip, conshdlr, consDeleteSavesdpsol) );
225 SCIP_CALL( SCIPsetConshdlrCopy(
scip, conshdlr, conshdlrCopySavesdpsol, consCopySavesdpsol) );
226 SCIP_CALL( SCIPsetConshdlrEnforelax(
scip, conshdlr, consEnforelaxSavesdpsol) );
243 SCIP_Real maxprimalentry,
245 int* startXnblocknonz,
251 SCIP_Real** startXval
255 SCIP_CONSDATA* consdata = NULL;
256 SCIP_CONSHDLR* conshdlr;
259 assert(
scip != NULL );
260 assert(
name != NULL );
261 assert( sol != NULL );
262 assert( nblocks >= 0 );
263 assert( nblocks == 0 || startXnblocknonz != NULL );
264 assert( nblocks == 0 || startXrow != NULL );
265 assert( nblocks == 0 || startXcol != NULL );
266 assert( nblocks == 0 || startXval != NULL );
268 SCIPdebugMsg(
scip,
"Creating Savesdpsol constraint <%s>.\n",
name);
271 conshdlr = SCIPfindConshdlr(
scip,
"Savesdpsol");
272 if ( conshdlr == NULL )
274 SCIPerrorMessage(
"Savesdpsol constraint handler not found\n");
275 return SCIP_PLUGINNOTFOUND;
279 SCIP_CALL( SCIPallocBlockMemory(
scip, &consdata) );
281 consdata->node = node;
282 SCIP_CALL( SCIPcreateSolCopy(
scip, &(consdata->sol), sol) );
283 SCIP_CALL( SCIPunlinkSol(
scip, consdata->sol) );
284 consdata->maxprimalentry = maxprimalentry;
287 if ( startXnblocknonz != NULL )
289 SCIP_CALL( SCIPduplicateBlockMemoryArray(
scip, &consdata->startXnblocknonz, startXnblocknonz, nblocks) );
292 consdata->startXnblocknonz = NULL;
294 SCIP_CALL( SCIPallocBlockMemoryArray(
scip, &consdata->startXrow, nblocks) );
295 SCIP_CALL( SCIPallocBlockMemoryArray(
scip, &consdata->startXcol, nblocks) );
296 SCIP_CALL( SCIPallocBlockMemoryArray(
scip, &consdata->startXval, nblocks) );
298 for (b = 0; b < nblocks; b++)
300 assert( startXnblocknonz != NULL );
301 SCIP_CALL( SCIPduplicateBlockMemoryArray(
scip, &consdata->startXrow[b], startXrow[b], startXnblocknonz[b]) );
302 SCIP_CALL( SCIPduplicateBlockMemoryArray(
scip, &consdata->startXcol[b], startXcol[b], startXnblocknonz[b]) );
303 SCIP_CALL( SCIPduplicateBlockMemoryArray(
scip, &consdata->startXval[b], startXval[b], startXnblocknonz[b]) );
306 consdata->nblocks = nblocks;
309 SCIP_CALL( SCIPcreateCons(
scip, cons,
name, conshdlr, consdata, FALSE, FALSE, FALSE, FALSE, FALSE,
310 TRUE, FALSE, TRUE, FALSE, TRUE));
321 SCIP_CONSDATA* consdata;
323 assert (
scip != NULL );
324 assert ( cons != NULL );
326 consdata = SCIPconsGetData(cons);
328 assert ( consdata != NULL );
330 return consdata->node;
339 SCIP_CONSDATA* consdata;
341 assert (
scip != NULL );
342 assert ( cons != NULL );
344 consdata = SCIPconsGetData(cons);
346 assert ( consdata != NULL );
348 return consdata->sol;
357 SCIP_CONSDATA* consdata;
359 assert (
scip != NULL );
360 assert ( cons != NULL );
362 consdata = SCIPconsGetData(cons);
364 assert ( consdata != NULL );
366 return consdata->maxprimalentry;
374 int* startXnblocknonz
378 SCIP_CONSDATA* consdata;
381 assert (
scip != NULL );
382 assert ( cons != NULL );
384 consdata = SCIPconsGetData(cons);
386 assert ( consdata != NULL );
388 if ( nblocks != consdata->nblocks )
390 SCIPerrorMessage(
"SCIPconsSavesdpsolGetPrimalMatrix expected nblocks = %d but got %d\n", consdata->nblocks, nblocks);
394 for (b = 0; b < nblocks; b++)
395 startXnblocknonz[b] = consdata->startXnblocknonz[b];
405 int* startXnblocknonz,
409 SCIP_Real** startXval
412 SCIP_CONSDATA* consdata;
415 SCIP_Bool msgthrown = FALSE;
417 assert (
scip != NULL );
418 assert ( cons != NULL );
420 consdata = SCIPconsGetData(cons);
422 assert ( consdata != NULL );
424 if ( nblocks != consdata->nblocks )
426 SCIPerrorMessage(
"SCIPconsSavesdpsolGetPrimalMatrix expected nblocks = %d but got %d\n", consdata->nblocks, nblocks);
430 for (b = 0; b < nblocks; b++)
432 if ( startXnblocknonz[b] < consdata->startXnblocknonz[b] )
436 SCIPdebugMsg(
scip,
"Unsufficient arraylength %d for block %d in SCIPconsSavesdpsolGetPrimalMatrix, need at least %d!\n",
437 startXnblocknonz[b], b, consdata->startXnblocknonz[b]);
440 startXnblocknonz[b] = consdata->startXnblocknonz[b];
444 startXnblocknonz[b] = consdata->startXnblocknonz[b];
445 for (i = 0; i < consdata->startXnblocknonz[b]; i++)
447 startXrow[b][i] = consdata->startXrow[b][i];
448 startXcol[b][i] = consdata->startXcol[b][i];
449 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