77#define CONSHDLR_NAME "storeGraph"
78#define CONSHDLR_DESC "storing graph at nodes of the tree constraint handler"
79#define CONSHDLR_ENFOPRIORITY 0
80#define CONSHDLR_CHECKPRIORITY 2000000
81#define CONSHDLR_PROPFREQ 1
82#define CONSHDLR_EAGERFREQ 100
84#define CONSHDLR_DELAYPROP FALSE
85#define CONSHDLR_NEEDSCONS TRUE
87#define CONSHDLR_PROP_TIMING SCIP_PROPTIMING_BEFORELP
96 int* representativeofnode;
111struct SCIP_ConshdlrData
139 nnodes = tcliqueGetNNodes(graph);
142 if ( conshdlr ==
NULL )
152 consdata->graph = graph;
153 consdata->node1 = -1;
154 consdata->node2 = -1;
156 consdata->fathercons =
NULL;
157 consdata->propagatedvars = 0;
158 consdata->stickingatnode =
NULL;
159 consdata->created =
TRUE;
167 consdata->representativeofnode[
i] =
i;
168 consdata->nnodesinunion[
i] = 1;
170 consdata->unionofnode[
i][0] =
i;
185 SCIP_CALL(
SCIPcreateCons(
scip, cons, name, conshdlr, consdata,
FALSE,
FALSE,
FALSE,
FALSE,
FALSE,
196#ifdef SCIP_DISABLED_CODE
202#define conshdlrCopyStoreGraph NULL
248 conshdlrData->stack[0] = cons;
249 conshdlrData->nstack = 1;
268 assert(conshdlrData->nstack == 1);
270 conshdlrData->stack[0] =
NULL;
299 for (
i = tcliqueGetNNodes((*consdata)->graph)-1;
i >= 0;
i-- )
302 assert((*consdata)->nnodesinunion[
i] == 1);
311 if ((*consdata)->created)
313 for (
i = tcliqueGetNNodes((*consdata)->graph)-1;
i >= 0;
i-- )
315 if ( (*consdata)->nnodesinunion[
i] > 0 )
318 (*consdata)->unionofnode[
i] =
NULL;
325 (*consdata)->unionofnode =
NULL;
326 (*consdata)->representativeofnode =
NULL;
327 (*consdata)->nnodesinunion =
NULL;
329 if ((*consdata)->graph !=
NULL)
333 if ((*consdata)->cgraph !=
NULL)
441 (consdata->node1+1), (consdata->node2+1), conshdlrData->nstack+1);
444 if ( conshdlrData->nstack >= conshdlrData->maxstacksize )
448 SCIPdebugMessage(
"reallocating Memory for stack! %d --> %d\n", conshdlrData->maxstacksize, newsize);
451 conshdlrData->maxstacksize = newsize;
453 conshdlrData->stack[conshdlrData->nstack] = cons;
454 ++(conshdlrData->nstack);
457 if ( consdata->created ==
FALSE )
459 consdata->created =
TRUE;
462 || (consdata->node1 == olddata->representativeofnode[consdata->node1]
463 && consdata->node2 == olddata->representativeofnode[consdata->node2]));
464 nnodes = tcliqueGetNNodes(olddata->graph);
465 fathergraph = olddata->graph;
473 consdata->representativeofnode[
i] = olddata->representativeofnode[
i];
474 consdata->nnodesinunion[
i] = olddata->nnodesinunion[
i];
475 if ( consdata->nnodesinunion[
i] > 0 )
478 for ( j = 0; j < consdata->nnodesinunion[
i]; j++ )
480 consdata->unionofnode[
i][j] = olddata->unionofnode[
i][j];
503 while ( firstedge <= lastedge )
505 if ( *firstedge >
i )
523 assert(consdata->representativeofnode[consdata->node2] == consdata->node2);
524 assert(consdata->representativeofnode[consdata->node1] == consdata->node1);
529 for (
i = 0;
i < consdata->nnodesinunion[consdata->representativeofnode[consdata->node2]];
i++ )
531 for ( j = 0; j < consdata->nnodesinunion[consdata->representativeofnode[consdata->node1]]; j++ )
533 if( !
tcliqueAddEdge(consdata->graph, consdata->unionofnode[consdata->representativeofnode[consdata->node1]][j],
534 consdata->unionofnode[consdata->representativeofnode[consdata->node2]][
i])
556 for (
i = 0;
i < consdata->nnodesinunion[consdata->node2];
i++ )
559 consdata->representativeofnode[consdata->unionofnode[consdata->node2][
i]] = consdata->node1;
564 while ( firstedge <= lastedge )
566 if ( !tcliqueIsEdge(fathergraph, *firstedge, consdata->node2) )
568 if( !
tcliqueAddEdge(consdata->graph, consdata->unionofnode[consdata->node2][
i], *firstedge) )
579 for (
i = 0;
i < consdata->nnodesinunion[consdata->node1];
i++ )
584 while ( firstedge <= lastedge )
586 if ( !tcliqueIsEdge(fathergraph, *firstedge, consdata->node1) )
588 if( !
tcliqueAddEdge(consdata->graph, consdata->unionofnode[consdata->node1][
i], *firstedge) )
609 consdata->nnodesinunion[consdata->node1],
610 (consdata->nnodesinunion[consdata->node1]) + (consdata->nnodesinunion[consdata->node2])) );
611 for (
i = 0;
i < consdata->nnodesinunion[consdata->node2];
i ++ )
613 consdata->unionofnode[consdata->node1][consdata->nnodesinunion[consdata->node1]+
i]
614 = consdata->unionofnode[consdata->node2][
i];
617 consdata->nnodesinunion[consdata->node2]);
618 consdata->nnodesinunion[consdata->node1] =
619 (consdata->nnodesinunion[consdata->node1]) + (consdata->nnodesinunion[consdata->node2]);
620 consdata->nnodesinunion[consdata->node2] = 0;
621 consdata->unionofnode[consdata->node2] =
NULL;
668 assert(conshdlrData->nstack > 0);
669 assert(cons == conshdlrData->stack[conshdlrData->nstack-1]);
674 SCIPdebugMessage(
"Deactivating store graph constraint: <%s(%d,%d)> [stack size: %d].\n",
SCIPconsGetName(cons), (consdata->node1+1), (consdata->node2+1), conshdlrData->nstack-1);
678 --conshdlrData->nstack;
710 cons = conshdlrData->stack[conshdlrData->nstack-1];
718 for (
i = 0;
i < nsets;
i++ )
735 for (
i = 0;
i < nsets;
i++ )
750 SCIPdebugMessage(
"Finished propagation of store graph constraint <%s(%d,%d)>, %d vars fixed.\n",
SCIPconsGetName(cons), (consdata->node1+1), (consdata->node2+1), propcount);
774 conshdlrData->stack =
NULL;
775 conshdlrData->nstack = 0;
776 conshdlrData->maxstacksize = 25;
782 consEnfolpStoreGraph, consEnfopsStoreGraph, consCheckStoreGraph, consLockStoreGraph,
821 if ( conshdlr ==
NULL )
836 SCIPdebugMessage(
"Creating store graph constraint: <%s(%d,%d)>. \n", name, (node1+1), (node2+1));
838 consdata->node1 = node1;
839 consdata->node2 = node2;
840 consdata->type = type;
841 consdata->fathercons = fatherconstraint;
842 consdata->propagatedvars = 0;
843 consdata->stickingatnode = stickingnode;
844 consdata->created =
FALSE;
848 SCIP_CALL(
SCIPcreateCons(
scip, cons, name, conshdlr, consdata,
FALSE,
FALSE,
FALSE,
FALSE,
TRUE,
871 return conshdlrData->stack[conshdlrData->nstack-1];
885 if ( conshdlr ==
NULL )
893 assert(conshdlrData->nstack > 0);
895 return conshdlrData->stack[conshdlrData->nstack-1];
911 if ( conshdlr ==
NULL )
919 cons = conshdlrData->stack[conshdlrData->nstack-1];
923 return consdata->graph;
940 if ( conshdlr ==
NULL )
950 cons = conshdlrData->stack[conshdlrData->nstack-1];
954 return consdata->cgraph;
971 if ( conshdlr ==
NULL )
981 cons = conshdlrData->stack[conshdlrData->nstack-1];
983 return consdata->representativeofnode;
1000 if ( conshdlr ==
NULL )
1010 cons = conshdlrData->stack[conshdlrData->nstack-1];
1014 assert(node >= 0 && node < tcliqueGetNNodes(consdata->graph));
1016 return consdata->representativeofnode[node];
1033 if ( conshdlr ==
NULL )
1043 cons = conshdlrData->stack[conshdlrData->nstack-1];
1047 *unions = consdata->unionofnode;
1048 *lengths = consdata->nnodesinunion;
1066 if ( conshdlr ==
NULL )
1074 cons = conshdlrData->stack[conshdlrData->nstack-1];
1078 *nodesinunion = consdata->unionofnode[node];
1079 *nnodesinunion = consdata->nnodesinunion[node];
1094 if ( conshdlr ==
NULL )
1104 *stack = conshdlrData->stack;
1105 *nstackelements = conshdlrData->nstack;
#define CONSHDLR_NEEDSCONS
#define CONSHDLR_CHECKPRIORITY
#define CONSHDLR_PROP_TIMING
#define CONSHDLR_PROPFREQ
#define CONSHDLR_EAGERFREQ
#define CONSHDLR_ENFOPRIORITY
#define CONSHDLR_DELAYPROP
Constraint handler for linear constraints in their most general form, .
int * COLORconsGetRepresentatives(SCIP *scip)
TCLIQUE_GRAPH * COLORconsGetCurrentGraph(SCIP *scip)
SCIP_RETCODE COLORcreateConsStoreGraph(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_CONS *fatherconstraint, COLOR_CONSTYPE type, int node1, int node2, SCIP_NODE *stickingnode)
void COLORconsGetUnions(SCIP *scip, int ***unions, int **lengths)
void COLORconsGetUnion(SCIP *scip, int **nodesinunion, int *nnodesinunion, int node)
SCIP_CONS * COLORconsGetActiveStoreGraphConsFromHandler(SCIP_CONSHDLR *conshdlr)
int COLORconsGetRepresentative(SCIP *scip, int node)
TCLIQUE_GRAPH * COLORconsGetComplementaryGraph(SCIP *scip)
SCIP_RETCODE COLORincludeConshdlrStoreGraph(SCIP *scip)
SCIP_CONS * COLORconsGetActiveStoreGraphCons(SCIP *scip)
static SCIP_RETCODE createConsStoreGraphAtRoot(SCIP *scip, SCIP_CONS **cons, const char *name, TCLIQUE_GRAPH *graph)
void COLORconsGetStack(SCIP *scip, SCIP_CONS ***stack, int *nstackelements)
constraint handler for storing the graph at each node of the tree
enum COLOR_ConsType COLOR_CONSTYPE
#define SCIP_STRINGEQ(name, reference, retcode)
int SCIPgetNTotalVars(SCIP *scip)
SCIP_RETCODE SCIPdelConsLocal(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPsetConshdlrFree(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrActive(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrProp(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_DECL_CONSPROP((*consprop)), int propfreq, SCIP_Bool delayprop, SCIP_PROPTIMING proptiming)
SCIP_RETCODE SCIPincludeConshdlrBasic(SCIP *scip, SCIP_CONSHDLR **conshdlrptr, const char *name, const char *desc, int enfopriority, int chckpriority, int eagerfreq, SCIP_Bool needscons, SCIP_DECL_CONSENFOLP((*consenfolp)), SCIP_DECL_CONSENFOPS((*consenfops)), SCIP_DECL_CONSCHECK((*conscheck)), SCIP_DECL_CONSLOCK((*conslock)), SCIP_CONSHDLRDATA *conshdlrdata)
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
SCIP_RETCODE SCIPsetConshdlrDelete(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrInitsol(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_RETCODE SCIPsetConshdlrDeactive(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_CONSHDLRDATA * SCIPconshdlrGetData(SCIP_CONSHDLR *conshdlr)
SCIP_RETCODE SCIPsetConshdlrExitsol(SCIP *scip, SCIP_CONSHDLR *conshdlr,)
SCIP_CONSDATA * SCIPconsGetData(SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateCons(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_CONSHDLR *conshdlr, SCIP_CONSDATA *consdata, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
const char * SCIPconsGetName(SCIP_CONS *cons)
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
int SCIPcalcMemGrowSize(SCIP *scip, int num)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPreallocBlockMemoryArray(scip, ptr, oldnum, newnum)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
SCIP_RETCODE SCIPrepropagateNode(SCIP *scip, SCIP_NODE *node)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_RETCODE SCIPchgVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
assert(minobj< SCIPgetCutoffbound(scip))
SCIP_VAR * COLORprobGetVarForStableSet(SCIP *scip, int setindex)
void COLORprobGetStableSets(SCIP *scip, int ***stablesets, int **nelements, int *nstablesets)
SCIP_CONS * COLORprobGetConstraint(SCIP *scip, int node)
TCLIQUE_GRAPH * COLORprobGetGraph(SCIP *scip)
SCIP_RETCODE COLORprobGetComplementaryGraph(SCIP *scip, TCLIQUE_GRAPH *graph, TCLIQUE_GRAPH *cgraph)
SCIP_Bool COLORprobIsNodeInStableSet(SCIP *scip, int setindex, int node)
problem data for vertex coloring algorithm
file reader for vertex coloring instances
int * tcliqueGetLastAdjedge(TCLIQUE_GRAPH *tcliquegraph, int node)
void tcliqueFree(TCLIQUE_GRAPH **tcliquegraph)
int * tcliqueGetFirstAdjedge(TCLIQUE_GRAPH *tcliquegraph, int node)
TCLIQUE_Bool tcliqueFlush(TCLIQUE_GRAPH *tcliquegraph)
struct TCLIQUE_Graph TCLIQUE_GRAPH
TCLIQUE_Bool tcliqueCreate(TCLIQUE_GRAPH **tcliquegraph)
TCLIQUE_Bool tcliqueAddNode(TCLIQUE_GRAPH *tcliquegraph, int node, TCLIQUE_WEIGHT weight)
TCLIQUE_Bool tcliqueAddEdge(TCLIQUE_GRAPH *tcliquegraph, int node1, int node2)
type definitions for constraints and constraint handlers
#define SCIP_DECL_CONSENFOLP(x)
#define SCIP_DECL_CONSDELETE(x)
struct SCIP_Cons SCIP_CONS
#define SCIP_DECL_CONSINITSOL(x)
struct SCIP_ConshdlrData SCIP_CONSHDLRDATA
#define SCIP_DECL_CONSPROP(x)
#define SCIP_DECL_CONSACTIVE(x)
#define SCIP_DECL_CONSENFOPS(x)
#define SCIP_DECL_CONSDEACTIVE(x)
#define SCIP_DECL_CONSLOCK(x)
struct SCIP_Conshdlr SCIP_CONSHDLR
struct SCIP_ConsData SCIP_CONSDATA
#define SCIP_DECL_CONSCHECK(x)
#define SCIP_DECL_CONSEXITSOL(x)
#define SCIP_DECL_CONSFREE(x)
enum SCIP_Retcode SCIP_RETCODE
struct SCIP_Node SCIP_NODE