compute_symmetry_bliss.cpp
Go to the documentation of this file.
32 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
77 * Compare the types of two operators according to their name, level and, in case of power, exponent.
119 SCIPhashKeyValString(NULL, static_cast<void*>(const_cast<char*>(SCIPexprhdlrGetName(SCIPexprGetHdlr(k->expr))))));
213 /* make sure we do not generate more that maxgenerators many permutations, if the limit in bliss is not available */
255 if ( SCIPreallocBlockMemoryArray(data->scip, &data->perms, data->nmaxperms, newsize) != SCIP_OKAY )
264 /** Creates the nodes in the graph that correspond to variables. Each variable type gets a unique color
300 /* this is not exactly true, since we skip auxvars, but it doesn't matter if some colors are not used at all */
314 * Each different variable, rhs, matrix coefficient gets a different color that is attached to the corresponding entries.
316 * @pre This method assumes that the nodes corresponding to permutation variables are already in the graph and that
357 * That is, given several variable nodes which are incident to one constraint node by the same color,
366 /* "colored" edges based on all matrix coefficients - loop through ordered matrix coefficients */
378 /* We pass through the matrix coeficients, grouped by color, i.e., different coefficients. If the coeffients appear
379 * in the same row or column, it suffices to only generate a single node (depending on groupByConstraints). We store
380 * this node in the array internodes. In order to avoid reinitialization, we store the node number with increasing
381 * numbers for each color. The smallest number for the current color is stored in firstcolornodenumber. */
397 assert( 0 <= matrixdata->matvaridx[idx] && matrixdata->matvaridx[idx] < matrixdata->npermvars );
401 assert( matrixdata->npermvars <= rhsnode && rhsnode < matrixdata->npermvars + matrixdata->nrhscoef );
485 * - Each coefficient of a sum expression gets its own node connected to the node of the corresponding child.
486 * - Each constraint (with lhs and (!) rhs) gets its own node connected to the corresponding node of the root expression.
488 * @note: In contrast to the linear part, lhs and rhs are treated together here, so that each unique combination of lhs
489 * and rhs gets its own node. This makes the implementation a lot simpler with the small downside, that different
496 * Each different constraint (sides), sum-expression coefficient, constant and operator type gets a
499 * @pre This method assumes that the nodes corresponding to permutation variables are already in the graph and that
557 SCIP_CALL( SCIPhashtableCreate(&consttypemap, SCIPblkmem(scip), constarraysize, SYMhashGetKeyConsttype,
559 SCIP_CALL( SCIPhashtableCreate(&sumcoefmap, SCIPblkmem(scip), coefarraysize, SYMhashGetKeyConsttype,
561 SCIP_CALL( SCIPhashtableCreate(&rhstypemap, SCIPblkmem(scip), rhsarraysize, SYMhashGetKeyRhstype,
594 for (SCIP_EXPR* expr = SCIPexpriterGetCurrent(it); !SCIPexpriterIsEnd(it); expr = SCIPexpriterGetNext(it)) /*lint !e441*/ /*lint !e440*/
610 /* check whether the variable is active; if not, then replace the inactive variable by its aggregation
611 * or its fixed value; note that this step is equivalent as representing an inactive variable as sum
636 SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &varssize, nvars, &constant, &requiredsize, TRUE) );
642 /* create nodes for all aggregation variables and coefficients and connect them to the parent node */
780 /* if this is the root expression, add the constraint side node (will be parent of expression node) */
818 /* in all cases apart from variable expressions, the new node is added with the corresponding color */
843 /* iterate over children from last to first, such that visitednodes array is in correct order */
924 /* when leaving an expression, the nodes that are not needed anymore are erased from the respective arrays */
931 /* When leaving the child of a sum expression, we have to pop again to get rid of the intermediate nodes
1009 return "Computing Graph Automorphism Groups by T. Junttila and P. Kaski (https://users.aalto.fi/~tjunttil/bliss/)";
1031 int* nmaxperms, /**< pointer to store maximal number of permutations (needed for freeing storage) */
1071 SCIP_CALL( fillGraphByLinearConss(scip, &G, matrixdata, nnodes, nedges, nusedcolors, success) );
1075 SCIPverbMessage(scip, SCIP_VERBLEVEL_MINIMAL, 0, "Graph construction failed during linear part.\n");
1080 SCIP_CALL( fillGraphByNonlinearConss(scip, &G, exprdata, nnodes, nedges, nusedcolors, success) );
1084 SCIPverbMessage(scip, SCIP_VERBLEVEL_MINIMAL, 0, "Graph construction failed during non-linear part.\n");
1134 /* 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
static SCIP_RETCODE fillGraphByNonlinearConss(SCIP *scip, bliss::Graph *G, SYM_EXPRDATA *exprdata, int &nnodes, int &nedges, int &nusedcolors, SCIP_Bool &success)
Definition: compute_symmetry_bliss.cpp:503
Definition: struct_scip.h:68
SCIP_RETCODE SCIPhashtableInsert(SCIP_HASHTABLE *hashtable, void *element)
Definition: misc.c:2497
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
Definition: scip_cons.c:886
SCIP_EXPR * SCIPexpriterGetParentDFS(SCIP_EXPRITER *iterator)
Definition: expriter.c:739
static SCIP_DECL_HASHKEYEQ(SYMhashKeyEQOptype)
Definition: compute_symmetry_bliss.cpp:80
static SCIP_DECL_HASHKEYVAL(SYMhashKeyValOptype)
Definition: compute_symmetry_bliss.cpp:106
Definition: struct_var.h:207
static SCIP_RETCODE fillGraphByLinearConss(SCIP *scip, bliss::Graph *G, SYM_MATRIXDATA *matrixdata, int &nnodes, int &nedges, int &nusedcolors, SCIP_Bool &success)
Definition: compute_symmetry_bliss.cpp:320
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 SYMcanComputeSymmetry(void)
Definition: compute_symmetry_bliss.cpp:979
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
interface for symmetry computations
static void blisshook(void *user_param, unsigned int n, const unsigned int *aut)
Definition: compute_symmetry_bliss.cpp:199
Definition: struct_cons.h:46
Definition: struct_cons.h:126
Definition: type_expr.h:700
static SCIP_DECL_HASHGETKEY(SYMhashGetKeyOptype)
Definition: compute_symmetry_bliss.cpp:70
SCIP_EXPR * SCIPgetExprNonlinear(SCIP_CONS *cons)
Definition: cons_nonlinear.c:12268
power and signed power expression handlers
Definition: type_retcode.h:42
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_bliss.cpp:1025
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_RETCODE SCIPcreateExpriter(SCIP *scip, SCIP_EXPRITER **iterator)
Definition: scip_expr.c:2296
Definition: struct_expr.h:104
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
void SCIPexpriterSetStagesDFS(SCIP_EXPRITER *iterator, SCIP_EXPRITER_STAGE stopstages)
Definition: expriter.c:663
Definition: struct_misc.h:89
SCIP_EXPRITER_STAGE SCIPexpriterGetStageDFS(SCIP_EXPRITER *iterator)
Definition: expriter.c:695
const char * SYMsymmetryGetAddDesc(void)
Definition: compute_symmetry_bliss.cpp:1019
SCIP_Bool SCIPhashtableExists(SCIP_HASHTABLE *hashtable, void *element)
Definition: misc.c:2609
Definition: struct_symmetry.h:78
static SCIP_RETCODE createVariableNodes(SCIP *scip, bliss::Graph *G, SYM_MATRIXDATA *matrixdata, int &nnodes, int &nusedcolors)
Definition: compute_symmetry_bliss.cpp:269
sum expression handler
Definition: compute_symmetry_bliss.cpp:56
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
Definition: scip_mem.h:111
Definition: objbenders.h:43
Definition: struct_symmetry.h:101
const char * SYMsymmetryGetAddName(void)
Definition: compute_symmetry_bliss.cpp:1013