summaryrefslogtreecommitdiff
path: root/nauty/nausparse.h
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2023-08-13 01:27:00 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2023-08-13 06:00:02 -0500
commit58acff54b1cd64cb23b9d0b1a304eb9db768e3eb (patch)
tree87281f776e0015f218aadb5cbfdad43c66406342 /nauty/nausparse.h
Initial commit
Diffstat (limited to 'nauty/nausparse.h')
-rw-r--r--nauty/nausparse.h130
1 files changed, 130 insertions, 0 deletions
diff --git a/nauty/nausparse.h b/nauty/nausparse.h
new file mode 100644
index 0000000..1a5bd5a
--- /dev/null
+++ b/nauty/nausparse.h
@@ -0,0 +1,130 @@
+/* nausparse.h : header file for sparse digraphs, nauty 2.8 */
+/* This version allows only simple graphs with loops but
+ * contains the data structures for weights on the edges
+ * even though they aren't implemented yet. */
+
+/*****************************************************************************
+* *
+* Copyright (1984-2022) Brendan McKay. All rights reserved. *
+* Subject to the waivers and disclaimers in nauty.h. *
+* *
+* CHANGE HISTORY *
+* 10-Nov-09 : removed types shortish and permutation *
+* 20-May-10 : make some fields type size_t *
+* 23-May-10 : add sparsenauty() *
+* 3-Jun-10 : add *_tr procedures used by Traces *
+* 30-Jun-10 : add DEFAULTOPTIONS_SPARSEDIGRAPH() *
+* 18-Aug-12 : fix SG_DECL initialization order *
+* 18-Jan-13 : add usercanonproc to default options *
+* 17-Dec-15 : add macros for weighted graphs *
+* *
+*****************************************************************************/
+
+#ifndef _NAUSPARSE_H_ /* only process this file once */
+#define _NAUSPARSE_H_
+
+#include "nauty.h"
+
+#ifndef SG_WEIGHT
+#define SG_WEIGHT int
+#define SG_WEIGHT_FMT "%d"
+#define SG_MINWEIGHT (-NAUTY_INFINITY)
+#endif
+typedef SG_WEIGHT sg_weight;
+
+#define CHECK_SWG(sg,id) do { if ((sg)->w) { fprintf(stderr, \
+ ">E procedure %s does not accept weighted graphs\n",id); exit(1); } } while (0)
+
+typedef struct
+{
+ size_t nde; /* Number of directed edges (loops contribute only 1) */
+ size_t *v; /* Array of indexes into e[*] */
+ int nv; /* Number of vertices */
+ int *d; /* Array with out-degree of each vertex */
+ int *e; /* Array to hold lists of neighbours */
+ sg_weight *w; /* Not implemented, should be NULL. */
+ size_t vlen,dlen,elen,wlen; /* Sizes of arrays in units of type */
+} sparsegraph;
+
+
+#define SG_VDE(sgp,vv,dd,ee) do { vv = ((sparsegraph*)(sgp))->v; \
+ dd = ((sparsegraph*)(sgp))->d; ee = ((sparsegraph*)(sgp))->e; } while(0)
+#define SWG_VDE(sgp,vv,dd,ee,ww) do { vv = ((sparsegraph*)(sgp))->v; \
+ dd = ((sparsegraph*)(sgp))->d; ee = ((sparsegraph*)(sgp))->e; \
+ ww = ((sparsegraph*)(sgp))->w; } while(0)
+#define SG_INIT(sg) do { (sg).v = NULL; (sg).d = (sg).e = (sg).w = NULL; \
+ (sg).vlen = (sg).dlen = (sg).elen = (sg).wlen = 0; } while(0)
+#define SWG_INIT SG_INIT
+#define SG_ALLOC(sg,nlen,ndelen,msg) do { \
+ DYNALLOC1(size_t,(sg).v,(sg).vlen,nlen,msg); \
+ DYNALLOC1(int,(sg).d,(sg).dlen,nlen,msg); \
+ DYNALLOC1(int,(sg).e,(sg).elen,ndelen,msg); \
+} while (0)
+#define SWG_ALLOC(sg,nlen,ndelen,msg) do { \
+ DYNALLOC1(size_t,(sg).v,(sg).vlen,nlen,msg); \
+ DYNALLOC1(int,(sg).d,(sg).dlen,nlen,msg); \
+ DYNALLOC1(int,(sg).e,(sg).elen,ndelen,msg); \
+ DYNALLOC1(sg_weight,(sg).w,(sg).wlen,ndelen,msg); \
+} while (0)
+#define SG_FREE(sg) do { \
+ DYNFREE((sg).v,(sg).vlen); \
+ DYNFREE((sg).d,(sg).dlen); \
+ DYNFREE((sg).e,(sg).elen); \
+ if ((sg).w) DYNFREE((sg).w,(sg).wlen); } while (0)
+#define SWG_FREE SG_FREE
+
+#define SG_DECL(sg) sparsegraph sg = {0,NULL,0,NULL,NULL,NULL,0,0,0,0}
+#define SWG_DECL SG_DECL
+
+#define DEFAULTOPTIONS_SPARSEGRAPH(options) optionblk options = \
+ {0,FALSE,FALSE,FALSE,TRUE,FALSE,CONSOLWIDTH, \
+ NULL,NULL,NULL,NULL,NULL,NULL,NULL,100,0,1,0,&dispatch_sparse,FALSE,NULL}
+#define DEFAULTOPTIONS_SPARSEDIGRAPH(options) optionblk options = \
+ {0,TRUE,FALSE,FALSE,TRUE,FALSE,CONSOLWIDTH, \
+ NULL,NULL,NULL,NULL,NULL,NULL,adjacencies_sg,100,0,999,0,&dispatch_sparse,FALSE,NULL}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern dispatchvec dispatch_sparse;
+
+extern int targetcell_sg(graph*,int*,int*,int,int,boolean,int,int,int);
+extern boolean cheapautom_sg(int*,int,boolean,int);
+extern boolean isautom_sg(graph*,int*,boolean,int,int);
+extern void refine_sg(graph*,int*,int*,int,int*,int*,set*,int*,int,int);
+extern int testcanlab_sg(graph*,graph*,int*,int*,int,int);
+extern void updatecan_sg(graph*,graph*,int*,int,int,int);
+extern int testcanlab_tr(sparsegraph*,sparsegraph*,int*,int*,int*);
+extern int comparelab_tr(sparsegraph*,int*,int*,int*,int*,int*,int*);
+extern void updatecan_tr(sparsegraph*,sparsegraph*,int*,int*,int);
+extern void init_sg(graph*,graph**,graph*,graph**,int*,int*,set*,
+ struct optionstruct*,int*,int,int);
+extern void cleanup_sg(graph*,graph**,graph*,graph**,int*,
+ int*,optionblk*,statsblk*stats,int,int);
+extern void nausparse_freedyn(void);
+extern void nausparse_check(int,int,int,int);
+
+extern sparsegraph *nauty_to_sg(graph*,sparsegraph*,int,int);
+extern graph* sg_to_nauty(sparsegraph*,graph*,int,int*);
+extern void sortlists_sg(sparsegraph*);
+extern boolean aresame_sg(sparsegraph*,sparsegraph*);
+extern void put_sg(FILE*,sparsegraph*,boolean,int);
+extern sparsegraph *copy_sg(sparsegraph*,sparsegraph*);
+extern void distvals(sparsegraph*,int,int*,int);
+
+extern void sparsenauty(sparsegraph*g,int*,int*,int*,
+ optionblk*,statsblk*,sparsegraph*);
+
+extern void
+ adjacencies_sg(graph*,int*,int*,int,int,int,int*,int,boolean,int,int);
+extern void
+ distances_sg(graph*,int*,int*,int,int,int,int*,int,boolean,int,int);
+extern void
+ distances_sg(graph*,int*,int*,int,int,int,int*,int,boolean,int,int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif