40#include "nauty/nauty.h"
41#include "nauty/nausparse.h"
43#include "nauty/traces.h"
49#pragma GCC diagnostic ignored "-Wshadow"
54# pragma warning(disable: 4456)
58#include "dejavu/tools/nauty_converter.h"
60#include "dejavu/tools/traces_converter.h"
64#pragma GCC diagnostic warning "-Wshadow"
79#include "tinycthread/tinycthread.h"
103#if defined(_Thread_local)
135 bool isIdentity =
true;
154 for (
int j = 0; j < permlen; ++j)
156 if ( (
int) aut[j] != j )
168 for (
int j = 0; j < permlen; ++j)
217 "symmetry computation terminated early because Nauty level limit %d is exceeded\n",
220 "for running full symmetry detection, increase value of parameter propagating/symmetry/nautymaxlevel\n");
221 nauty_kill_request = 1;
235static const char nautyname[] = {
'N',
'a',
'u',
't',
'y',
' ', NAUTYVERSIONID/10000 +
'0',
'.', (NAUTYVERSIONID%10000)/1000 +
'0',
'.', (NAUTYVERSIONID%1000)/10 +
'0',
'\0'};
237static const char nautyname[] = {
'T',
'r',
'a',
'c',
'e',
's',
' ', NAUTYVERSIONID/10000 +
'0',
'.', (NAUTYVERSIONID%10000)/1000 +
'0',
'.', (NAUTYVERSIONID%1000)/10 +
'0',
'\0'};
250 return "Computing Graph Automorphism Groups by Brendan D. McKay (users.cecs.anu.edu.au/~bdm/nauty)";
252 return "Computing Graph Automorphism Groups by Adolfo Piperno (pallini.di.uniroma1.it)";
257#define XSTR(x) STR(x)
262 return "sassy " XSTR(SASSY_VERSION_MAJOR)
"." XSTR(SASSY_VERSION_MINOR);
268 return "Symmetry preprocessor by Markus Anders (github.com/markusa4/sassy)";
276 dejavu::static_graph* G,
305 *log10groupsize = 0.0;
327 dejavu::preprocessor sassy;
330 dejavu_hook sassyglue = [&](
int n,
const int* p,
int nsupp,
const int* suppa) {
331 sassyhook((
void*)&data, n, p, nsupp, suppa);
335 sassy.reduce(G, &sassyglue);
337 if( G->get_sgraph()->v_size == 0 )
339 dejavu::big_number grp_sz = sassy.grp_sz;
340 *log10groupsize = (
SCIP_Real) log10l(grp_sz.mantissa * powl(10.0, (
SCIP_Real) grp_sz.exponent));
346 DYNALLSTAT(
int, lab, lab_sz);
347 DYNALLSTAT(
int, ptn, ptn_sz);
350 convert_dejavu_to_nauty(G, &sg, &lab, &lab_sz, &ptn, &ptn_sz);
354 DYNALLSTAT(
int, orbits, orbits_sz);
355 DYNALLOC1(
int, orbits, orbits_sz, sg.nv,
"malloc");
356 DEFAULTOPTIONS_SPARSEGRAPH(options);
358 options.writeautoms =
FALSE;
359 options.userautomproc = dejavu::preprocessor::nauty_hook;
360 options.defaultptn =
FALSE;
361 if ( canterminateearly )
363 sparsenauty(&sg, lab, ptn, orbits, &options, &stats,
NULL);
364 dejavu::big_number grp_sz = sassy.grp_sz;
365 *log10groupsize = log10(stats.grpsize1 * grp_sz.mantissa * pow(10.0, (
SCIP_Real) (stats.grpsize2 + grp_sz.exponent)));
367 convert_dejavu_to_traces(&sassygraph, &sg, &lab, &lab_sz, &ptn, &ptn_sz);
369 DYNALLSTAT(
int, orbits, orbits_sz);
370 DYNALLOC1(
int, orbits, orbits_sz, sg.nv,
"malloc");
371 DEFAULTOPTIONS_TRACES(options);
373 options.writeautoms =
FALSE;
374 options.userautomproc = dejavu::preprocessor::traces_hook;
375 options.defaultptn =
FALSE;
376 Traces(&sg, lab, ptn, orbits, &options, &stats,
NULL);
377 dejavu::big_number grp_sz = sassy.grp_sz;
378 *log10groupsize = log10(stats.grpsize1 * grp_sz.mantissa * pow(10.0, (
SCIP_Real) (stats.grpsize2 + grp_sz.exponent)));
382 DYNFREE(lab, lab_sz);
383 DYNFREE(ptn, ptn_sz);
440 dejavu::static_graph sassygraph;
469 dejavu::static_graph sassygraph;
484 for (
int p = 0; p <
nperms && ! success; ++p)
486 for (
int i = 0;
i < nnodesfromG1; ++
i)
488 if (
perms[p][
i] >= nnodesfromG1 )
496 for (
int p = 0; p <
nperms; ++p)
SCIP_RETCODE SYMbuildDejavuGraphCheck(SCIP *scip, dejavu::static_graph *dejavugraph, SYM_GRAPH *G1, SYM_GRAPH *G2, int *nnodes, int *nnodesfromG1, SCIP_Bool *success)
SCIP_RETCODE SYMbuildDejavuGraph(SCIP *scip, dejavu::static_graph *dejavugraph, SYM_GRAPH *graph, SCIP_Bool *success)
methods to build dejavu graph for symmetry detection
interface for symmetry computations
static const char nautyname[]
static void nautyterminationhook(graph *g, int *lab, int *ptn, int level, int numcells, int tc, int code, int m, int n)
SCIP_Bool SYMcheckGraphsAreIdentical(SCIP *scip, SYM_SYMTYPE symtype, SYM_GRAPH *G1, SYM_GRAPH *G2)
const char * SYMsymmetryGetName(void)
const char * SYMsymmetryGetAddName(void)
static _Thread_local struct NAUTY_Data nautydata_
SCIP_Bool SYMcanComputeSymmetry(void)
const char * SYMsymmetryGetDesc(void)
static void sassyhook(void *user_param, int n, const int *aut, int nsupp, const int *suppa)
static SCIP_RETCODE computeAutomorphisms(SCIP *scip, SYM_SYMTYPE symtype, dejavu::static_graph *G, int nsymvars, int maxgenerators, int ***perms, int *nperms, int *nmaxperms, SCIP_Real *log10groupsize, SCIP_Bool restricttovars, SCIP_Real *symcodetime, SCIP_Bool canterminateearly)
static void nautyterminationhook(graph *g, int *lab, int *ptn, int level, int numcells, int tc, int code, int m, int n)
const char * SYMsymmetryGetAddDesc(void)
SCIP_RETCODE SYMcomputeSymmetryGenerators(SCIP *scip, int maxgenerators, SYM_GRAPH *symgraph, int *nperms, int *nmaxperms, int ***perms, SCIP_Real *log10groupsize, SCIP_Real *symcodetime)
Constraint handler for linear constraints in their most general form, .
constraint handler for nonlinear constraints specified by algebraic expressions
#define SCIP_CALL_ABORT(x)
private functions to work with algebraic expressions
power and signed power expression handlers
variable expression handler
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
SCIP_RETCODE SCIPgetIntParam(SCIP *scip, const char *name, int *value)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
int SCIPcalcMemGrowSize(SCIP *scip, int num)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPreallocBlockMemoryArray(scip, ptr, oldnum, newnum)
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
SCIP_Real SCIPgetSolvingTime(SCIP *scip)
SYM_SYMTYPE SCIPgetSymgraphSymtype(SYM_GRAPH *graph)
int SCIPgetSymgraphNVars(SYM_GRAPH *graph)
assert(minobj< SCIPgetCutoffbound(scip))
public methods for memory management
methods for dealing with symmetry detection graphs
struct SYM_Graph SYM_GRAPH
enum SCIP_Retcode SCIP_RETCODE
enum SYM_Symtype SYM_SYMTYPE