15 #ifndef MAD_CLIQUERI_INCLUDED
16 #define MAD_CLIQUERI_INCLUDED
21 # if (ULONG_MAX == 65535)
22 # define ELEMENTSIZE 16
23 # elif (ULONG_MAX == 4294967295)
24 # define ELEMENTSIZE 32
26 # define ELEMENTSIZE 64
36 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,
37 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
38 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
39 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
40 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
41 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
42 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
43 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
44 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
45 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
46 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
47 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
48 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
49 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
50 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
51 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8 };
56 #define SET_ELEMENT_BIT_COUNT_8(a) (set_bit_count[(a)])
57 #define SET_ELEMENT_BIT_COUNT_16(a) (set_bit_count[(a)>>8] + \
58 set_bit_count[(a)&0xFF])
59 #define SET_ELEMENT_BIT_COUNT_32(a) (set_bit_count[(a)>>24] + \
60 set_bit_count[((a)>>16)&0xFF] + \
61 set_bit_count[((a)>>8)&0xFF] + \
62 set_bit_count[(a)&0xFF])
63 #define SET_ELEMENT_BIT_COUNT_64(a) (set_bit_count[(a)>>56] + \
64 set_bit_count[((a)>>48)&0xFF] + \
65 set_bit_count[((a)>>40)&0xFF] + \
66 set_bit_count[((a)>>32)&0xFF] + \
67 set_bit_count[((a)>>24)&0xFF] + \
68 set_bit_count[((a)>>16)&0xFF] + \
69 set_bit_count[((a)>>8)&0xFF] + \
70 set_bit_count[(a)&0xFF])
72 # define SET_ELEMENT_BIT_COUNT(a) SET_ELEMENT_BIT_COUNT_64(a)
73 # define FULL_ELEMENT ((setelement)0xFFFFFFFFFFFFFFFF)
74 #elif (ELEMENTSIZE==32)
75 # define SET_ELEMENT_BIT_COUNT(a) SET_ELEMENT_BIT_COUNT_32(a)
76 # define FULL_ELEMENT ((setelement)0xFFFFFFFF)
77 #elif (ELEMENTSIZE==16)
78 # define SET_ELEMENT_BIT_COUNT(a) SET_ELEMENT_BIT_COUNT_16(a)
79 # define FULL_ELEMENT ((setelement)0xFFFF)
81 # error "SET_ELEMENT_BIT_COUNT(a) not defined for current ELEMENTSIZE"
92 #define SET_BIT_MASK(x) ((setelement)1<<(x))
95 #define SET_ELEMENT_CONTAINS(e,v) ((e)&SET_BIT_MASK(v))
96 #define SET_ADD_ELEMENT(s,a) \
97 ((s)[(a)/ELEMENTSIZE] |= SET_BIT_MASK((a)%ELEMENTSIZE))
98 #define SET_DEL_ELEMENT(s,a) \
99 ((s)[(a)/ELEMENTSIZE] &= ~SET_BIT_MASK((a)%ELEMENTSIZE))
100 #define SET_CONTAINS_FAST(s,a) (SET_ELEMENT_CONTAINS((s)[(a)/ELEMENTSIZE], \
102 #define SET_CONTAINS(s,a) (((a)<SET_MAX_SIZE(s))?SET_CONTAINS_FAST(s,a):0)
105 #define SET_MAX_SIZE(s) ((s)[-1])
108 #define SET_ARRAY_LENGTH(s) (((s)[-1]+ELEMENTSIZE-1)/ELEMENTSIZE)
169 #define GRAPH_ADD_EDGE(g,i,j) do { \
170 SET_ADD_ELEMENT((g)->edges[(i)],(j)); \
171 SET_ADD_ELEMENT((g)->edges[(j)],(i)); \
173 #define GRAPH_DEL_EDGE(g,i,j) do { \
174 SET_DEL_ELEMENT((g)->edges[(i)],(j)); \
175 SET_DEL_ELEMENT((g)->edges[(j)],(i)); \
178 #define GRAPH_IS_EDGE_FAST(g,i,j) (SET_CONTAINS_FAST((g)->edges[(i)],(j)))
195 count+=g->
weights[i*ELEMENTSIZE+j];
int(* time_function)(int, int, int, int, double, double, clique_options *)
int clique_find_all(graph_t *g, int min_weight, int max_weight, int maximal, clique_options *opts)
int graph_edge_count(graph_t *g)
int clique_unweighted_find_all(graph_t *g, int min_size, int max_size, int maximal, clique_options *opts)
static int set_bit_count[256]
static void set_free(set_t s)
void graph_print(graph_t *g)
graph_t * graph_new(int n)
int(* user_function)(set_t, graph_t *, clique_options *)
set_t clique_find_single(graph_t *g, int min_weight, int max_weight, int maximal, clique_options *opts)
unsigned long int setelement
static int set_size(set_t s)
static int graph_subgraph_weight(graph_t *g, set_t s)
#define SET_ARRAY_LENGTH(s)
#define SET_ELEMENT_BIT_COUNT(a)
static set_t set_duplicate(set_t s)
clique_options * clique_default_options
static set_t set_new(int size)
void graph_free(graph_t *g)