-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathnausparse.h
130 lines (112 loc) · 5.59 KB
/
nausparse.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* nausparse.h : header file for sparse digraphs, nauty 2.7 */
/* 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-2018) 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