compute_symmetry_sassy.cpp
Go to the documentation of this file.
30 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
103 * Compare the types of two operators according to their name, level and, in case of power, exponent.
146 SCIPhashKeyValString(NULL, static_cast<void*>(const_cast<char*>(SCIPexprhdlrGetName(SCIPexprGetHdlr(k->expr))))));
289 if ( SCIPreallocBlockMemoryArray(data->scip, &data->perms, data->nmaxperms, newsize) != SCIP_OKAY )
310 int* nnonlinearnodes, /**< pointer to store the number of internal nodes for nonlinear constraints */
365 /* Determine grouping depending on the number of rhs vs. variables; see fillGraphByLinearConss(). */
398 assert( 0 <= matrixdata->matvaridx[idx] && matrixdata->matvaridx[idx] < matrixdata->npermvars );
402 assert( matrixdata->npermvars <= rhsnode && rhsnode < matrixdata->npermvars + matrixdata->nrhscoef );
510 maxvisitednodes = exprdata->nuniqueoperators + exprdata->nuniqueconstants + exprdata->nuniquecoefs;
532 for (expr = SCIPexpriterGetCurrent(it); ! SCIPexpriterIsEnd(it); expr = SCIPexpriterGetNext(it)) /*lint !e441*/ /*lint !e440*/
551 /* Check whether the variable is active; if not, then replace the inactive variable by its aggregation
552 * or its fixed value; note that this step is equivalent as representing an inactive variable as sum
578 SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &nvars, varssize, &constant, &requiredsize, TRUE) );
585 /* create nodes for all aggregation variables and coefficients and connect them to the parent node */
631 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &visitednodes, &maxvisitednodes, numvisitednodes+1) );
632 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &ischildofsum, &maxischildofsum, numischildofsum+1) );
649 /* if this is the root expression, add the constraint side node (will be parent of expression node) */
667 /* in all cases apart from variable expressions, the new node is added with the corresponding color */
679 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &visitednodes, &maxvisitednodes, numvisitednodes+1) );
680 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &ischildofsum, &maxischildofsum, numischildofsum+1) );
698 /* iterate over children from last to first, such that visitednodes array is in correct order */
705 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &visitednodes, &maxvisitednodes, numvisitednodes+1) );
706 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &ischildofsum, &maxischildofsum, numischildofsum+1) );
743 /* when leaving an expression, the nodes that are not needed anymore are erased from the respective arrays */
752 /* When leaving the child of a sum expression, we have to pop again to get rid of the intermediate nodes
783 assert( *nnodes == matrixdata->npermvars + matrixdata->nrhscoef + *nlinearnodes + *nnonlinearnodes );
803 * - Each different variable, rhs, matrix coefficient gets a different color that is attached to the corresponding entries.
807 * - Each coefficient of a sum expression gets its own node connected to the node of the corresponding child.
808 * - Each constraint (with lhs and (!) rhs) gets its own node connected to the corresponding node of the root expression.
810 * @note: In contrast to the linear part, lhs and rhs are treated together here, so that each unique combination of lhs
811 * and rhs gets its own node. This makes the implementation a lot simpler with the small downside, that different
818 * Each different constraint (sides), sum-expression coefficient, constant and operator type gets a
891 assert( 0 <= matrixdata->permvarcolors[j] && matrixdata->permvarcolors[j] < matrixdata->nuniquevars );
900 assert( 0 <= matrixdata->rhscoefcolors[i] && matrixdata->rhscoefcolors[i] < matrixdata->nuniquerhs );
906 /* Grouping of nodes depends on the number of nodes in the bipartite graph class. If there are more variables than
907 * constraints, we group by constraints. That is, given several variable nodes which are incident to one constraint
908 * node by the same color, we join these variable nodes to the constraint node by only one intermediate node.
915 /* "colored" edges based on all matrix coefficients - loop through ordered matrix coefficients */
925 /* We pass through the matrix coeficients, grouped by color, i.e., different coefficients. If the coeffients appear
926 * in the same row or column, it suffices to only generate a single node (depending on groupByConstraints). We store
927 * this node in the array internodes. In order to avoid reinitialization, we store the node number with increasing
928 * numbers for each color. The smallest number for the current color is stored in firstcolornodenumber. */
945 assert( 0 <= matrixdata->matvaridx[idx] && matrixdata->matvaridx[idx] < matrixdata->npermvars );
949 assert( matrixdata->npermvars <= rhsnode && rhsnode < matrixdata->npermvars + matrixdata->nrhscoef );
1057 SCIP_CALL( SCIPhashtableCreate(&consttypemap, SCIPblkmem(scip), constarraysize, SYMhashGetKeyConsttype,
1059 SCIP_CALL( SCIPhashtableCreate(&sumcoefmap, SCIPblkmem(scip), coefarraysize, SYMhashGetKeyConsttype,
1061 SCIP_CALL( SCIPhashtableCreate(&rhstypemap, SCIPblkmem(scip), rhsarraysize, SYMhashGetKeyRhstype,
1097 for (expr = SCIPexpriterGetCurrent(it); ! SCIPexpriterIsEnd(it); expr = SCIPexpriterGetNext(it)) /*lint !e441*/ /*lint !e440*/
1115 /* Check whether the variable is active; if not, then replace the inactive variable by its aggregation
1116 * or its fixed value; note that this step is equivalent as representing an inactive variable as sum
1142 SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &nvars, varssize, &constant, &requiredsize, TRUE) );
1150 /* create nodes for all aggregation variables and coefficients and connect them to the parent node */
1202 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &uniqueconstarray, &constarraysize, nuniqueconsts+1) );
1232 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &visitednodes, &maxvisitednodes, numvisitednodes+1) );
1233 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &ischildofsum, &maxischildofsum, numischildofsum+1) );
1287 /* if this is the root expression, add the constraint side node (will be parent of expression node) */
1322 /* in all cases apart from variable expressions, the new node is added with the corresponding color */
1332 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &visitednodes, &maxvisitednodes, numvisitednodes+1) );
1333 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &ischildofsum, &maxischildofsum, numischildofsum+1) );
1360 /* iterate over children from last to first, such that visitednodes array is in correct order */
1384 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &visitednodes, &maxvisitednodes, numvisitednodes+1) );
1385 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &ischildofsum, &maxischildofsum, numischildofsum+1) );
1406 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &uniqueconstarray, &constarraysize, nuniqueconsts + 1) );
1439 /* when leaving an expression, the nodes that are not needed anymore are erased from the respective arrays */
1446 /* When leaving the child of a sum expression, we have to pop again to get rid of the intermediate nodes
1532 return "Computing Graph Automorphisms by T. Junttila and P. Kaski (users.aalto.fi/~tjunttil/bliss/)";
1554 int* nmaxperms, /**< pointer to store maximal number of permutations (needed for freeing storage) */
1596 SCIPverbMessage(scip, SCIP_VERBLEVEL_MINIMAL, 0, "Stopped symmetry computation: Symmetry graph would become too large.\n");
1680 /* lambda function to have access to stats and terminate the search if maxgenerators are reached */
#define SCIPreallocBlockMemoryArray(scip, ptr, oldnum, newnum)
Definition: scip_mem.h:99
SCIP_RETCODE SCIPexpriterInit(SCIP_EXPRITER *iterator, SCIP_EXPR *expr, SCIP_EXPRITER_TYPE type, SCIP_Bool allowrevisit)
Definition: expriter.c:500
Definition: struct_symmetry.h:63
Definition: struct_scip.h:68
SCIP_RETCODE SCIPhashtableInsert(SCIP_HASHTABLE *hashtable, void *element)
Definition: misc.c:2497
public methods for memory management
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
Definition: scip_cons.c:886
SCIP_EXPR * SCIPexpriterGetParentDFS(SCIP_EXPRITER *iterator)
Definition: expriter.c:739
Definition: struct_var.h:207
static void sassyhook(void *user_param, int n, const int *aut, int nsupp, const int *suppa)
Definition: compute_symmetry_sassy.cpp:231
SCIP_CONS ** SCIPconshdlrGetConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4554
private functions to work with algebraic expressions
Definition: struct_symmetry.h:55
Definition: struct_symmetry.h:70
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
Definition: scip_numerics.c:445
variable expression handler
SCIP_EXPR * SCIPexpriterGetCurrent(SCIP_EXPRITER *iterator)
Definition: expriter.c:682
SCIP_RETCODE SCIPhashtableCreate(SCIP_HASHTABLE **hashtable, BMS_BLKMEM *blkmem, int tablesize, SCIP_DECL_HASHGETKEY((*hashgetkey)), SCIP_DECL_HASHKEYEQ((*hashkeyeq)), SCIP_DECL_HASHKEYVAL((*hashkeyval)), void *userptr)
Definition: misc.c:2246
static SCIP_RETCODE fillGraphByConss(SCIP *scip, sassy::static_graph *G, SYM_MATRIXDATA *matrixdata, SYM_EXPRDATA *exprdata, int nnodes, int nedges, int nlinearnodes, int nnonlinearnodes, int nlinearedges, int nnonlinearedges, int *degrees, int *nusedcolors)
Definition: compute_symmetry_sassy.cpp:822
char * initStaticSymmetryAddName()
Definition: compute_symmetry_sassy.cpp:1513
interface for symmetry computations
Definition: struct_cons.h:46
Definition: struct_cons.h:126
Definition: type_expr.h:700
SCIP_EXPR * SCIPgetExprNonlinear(SCIP_CONS *cons)
Definition: cons_nonlinear.c:12268
power and signed power expression handlers
Definition: type_retcode.h:42
static SCIP_DECL_HASHKEYEQ(SYMhashKeyEQOptype)
Definition: compute_symmetry_sassy.cpp:106
#define SCIPensureBlockMemoryArray(scip, ptr, arraysizeptr, minsize)
Definition: scip_mem.h:107
SCIP_RETCODE SCIPgetProbvarLinearSum(SCIP *scip, SCIP_VAR **vars, SCIP_Real *scalars, int *nvars, int varssize, SCIP_Real *constant, int *requiredsize, SCIP_Bool mergemultiples)
Definition: scip_var.c:1738
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
Definition: scip_message.c:225
Definition: struct_expr.h:202
SCIP_Bool SYMcanComputeSymmetry(void)
Definition: compute_symmetry_sassy.cpp:1493
SCIP_RETCODE SCIPcreateExpriter(SCIP *scip, SCIP_EXPRITER **iterator)
Definition: scip_expr.c:2296
Definition: struct_expr.h:104
static SCIP_DECL_HASHKEYVAL(SYMhashKeyValOptype)
Definition: compute_symmetry_sassy.cpp:132
constraint handler for nonlinear constraints specified by algebraic expressions
Definition: type_message.h:52
SCIP_EXPR * SCIPexpriterGetNext(SCIP_EXPRITER *iterator)
Definition: expriter.c:857
Constraint handler for linear constraints in their most general form, .
void * SCIPhashtableRetrieve(SCIP_HASHTABLE *hashtable, void *key)
Definition: misc.c:2558
const char * SYMsymmetryGetAddDesc(void)
Definition: compute_symmetry_sassy.cpp:1542
static SCIP_DECL_HASHGETKEY(SYMhashGetKeyOptype)
Definition: compute_symmetry_sassy.cpp:96
void SCIPexpriterSetStagesDFS(SCIP_EXPRITER *iterator, SCIP_EXPRITER_STAGE stopstages)
Definition: expriter.c:663
Definition: struct_misc.h:89
Definition: compute_symmetry_sassy.cpp:81
SCIP_EXPRITER_STAGE SCIPexpriterGetStageDFS(SCIP_EXPRITER *iterator)
Definition: expriter.c:695
SCIP_Bool SCIPhashtableExists(SCIP_HASHTABLE *hashtable, void *element)
Definition: misc.c:2609
Definition: struct_symmetry.h:78
const char * SYMsymmetryGetAddName(void)
Definition: compute_symmetry_sassy.cpp:1536
sum expression handler
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
Definition: scip_mem.h:111
Definition: objbenders.h:43
Definition: struct_symmetry.h:101
SCIP_RETCODE SYMcomputeSymmetryGenerators(SCIP *scip, int maxgenerators, SYM_MATRIXDATA *matrixdata, SYM_EXPRDATA *exprdata, int *nperms, int *nmaxperms, int ***perms, SCIP_Real *log10groupsize, SCIP_Real *symcodetime)
Definition: compute_symmetry_sassy.cpp:1548
static SCIP_RETCODE determineGraphSize(SCIP *scip, SYM_MATRIXDATA *matrixdata, SYM_EXPRDATA *exprdata, int *nnodes, int *nedges, int *nlinearnodes, int *nnonlinearnodes, int *nlinearedges, int *nnonlinearedges, int **degrees, int *maxdegrees, SCIP_Bool *success)
Definition: compute_symmetry_sassy.cpp:303