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 SCIPdebugMessage(
"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 );
214 SCIP_CONSHDLR* conshdlr;
220 consEnfolpSavesdpsol, consEnfopsSavesdpsol, consCheckSavesdpsol, consLockSavesdpsol,
222 assert( conshdlr != NULL );
225 SCIP_CALL( SCIPsetConshdlrDelete(scip, conshdlr, consDeleteSavesdpsol) );
226 SCIP_CALL( SCIPsetConshdlrCopy(scip, conshdlr, conshdlrCopySavesdpsol, consCopySavesdpsol) );
227 SCIP_CALL( SCIPsetConshdlrEnforelax(scip, conshdlr, consEnforelaxSavesdpsol) );
244 SCIP_Real maxprimalentry,
246 int* startXnblocknonz,
252 SCIP_Real** startXval
256 SCIP_CONSDATA* consdata = NULL;
257 SCIP_CONSHDLR* conshdlr;
260 assert( scip != NULL );
261 assert( name != NULL );
262 assert( sol != NULL );
263 assert( nblocks >= 0 );
264 assert( nblocks == 0 || startXnblocknonz != NULL );
265 assert( nblocks == 0 || startXrow != NULL );
266 assert( nblocks == 0 || startXcol != NULL );
267 assert( nblocks == 0 || startXval != NULL );
269 SCIPdebugMessage(
"Creating Savesdpsol constraint <%s>.\n", name);
272 conshdlr = SCIPfindConshdlr(scip,
"Savesdpsol");
273 if ( conshdlr == NULL )
275 SCIPerrorMessage(
"Savesdpsol constraint handler not found\n");
276 return SCIP_PLUGINNOTFOUND;
280 SCIP_CALL( SCIPallocBlockMemory(scip, &consdata) );
282 consdata->node = node;
283 SCIP_CALL( SCIPcreateSolCopy(scip, &(consdata->sol), sol) );
284 SCIP_CALL( SCIPunlinkSol(scip, consdata->sol) );
285 consdata->maxprimalentry = maxprimalentry;
288 if ( startXnblocknonz != NULL )
290 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &consdata->startXnblocknonz, startXnblocknonz, nblocks) );
293 consdata->startXnblocknonz = NULL;
295 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->startXrow, nblocks) );
296 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->startXcol, nblocks) );
297 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->startXval, nblocks) );
299 for (b = 0; b < nblocks; b++)
301 assert( startXnblocknonz != NULL );
302 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &consdata->startXrow[b], startXrow[b], startXnblocknonz[b]) );
303 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &consdata->startXcol[b], startXcol[b], startXnblocknonz[b]) );
304 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &consdata->startXval[b], startXval[b], startXnblocknonz[b]) );
307 consdata->nblocks = nblocks;
310 SCIP_CALL( SCIPcreateCons(scip, cons, name, conshdlr, consdata, FALSE, FALSE, FALSE, FALSE, FALSE,
311 TRUE, FALSE, TRUE, FALSE, TRUE));
322 SCIP_CONSDATA* consdata;
324 assert ( scip != NULL );
325 assert ( cons != NULL );
327 consdata = SCIPconsGetData(cons);
329 assert ( consdata != NULL );
331 return consdata->node;
340 SCIP_CONSDATA* consdata;
342 assert ( scip != NULL );
343 assert ( cons != NULL );
345 consdata = SCIPconsGetData(cons);
347 assert ( consdata != NULL );
349 return consdata->sol;
358 SCIP_CONSDATA* consdata;
360 assert ( scip != NULL );
361 assert ( cons != NULL );
363 consdata = SCIPconsGetData(cons);
365 assert ( consdata != NULL );
367 return consdata->maxprimalentry;
375 int* startXnblocknonz
379 SCIP_CONSDATA* consdata;
382 assert ( scip != NULL );
383 assert ( cons != NULL );
385 consdata = SCIPconsGetData(cons);
387 assert ( consdata != NULL );
389 if ( nblocks != consdata->nblocks )
391 SCIPerrorMessage(
"SCIPconsSavesdpsolGetPrimalMatrix expected nblocks = %d but got %d\n", consdata->nblocks, nblocks);
395 for (b = 0; b < nblocks; b++)
396 startXnblocknonz[b] = consdata->startXnblocknonz[b];
406 int* startXnblocknonz,
410 SCIP_Real** startXval
413 SCIP_CONSDATA* consdata;
416 SCIP_Bool msgthrown = FALSE;
418 assert ( scip != NULL );
419 assert ( cons != NULL );
421 consdata = SCIPconsGetData(cons);
423 assert ( consdata != NULL );
425 if ( nblocks != consdata->nblocks )
427 SCIPerrorMessage(
"SCIPconsSavesdpsolGetPrimalMatrix expected nblocks = %d but got %d\n", consdata->nblocks, nblocks);
431 for (b = 0; b < nblocks; b++)
433 if ( startXnblocknonz[b] < consdata->startXnblocknonz[b] )
437 SCIPdebugMessage(
"Unsufficient arraylength %d for block %d in SCIPconsSavesdpsolGetPrimalMatrix, need at least %d!\n",
438 startXnblocknonz[b], b, consdata->startXnblocknonz[b]);
441 startXnblocknonz[b] = consdata->startXnblocknonz[b];
445 startXnblocknonz[b] = consdata->startXnblocknonz[b];
446 for (i = 0; i < consdata->startXnblocknonz[b]; i++)
448 startXrow[b][i] = consdata->startXrow[b][i];
449 startXcol[b][i] = consdata->startXcol[b][i];
450 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