1
+ #include "postgres.h"
2
+ #include "bkb.h"
3
+
1
4
/*
2
- * Bron–Kerbosch algorithm to find maximumclque in graph
5
+ * Bron–Kerbosch algorithm to find maximumclique in graph
3
6
*/
4
7
5
8
typedef struct {
6
9
int size ;
7
10
int nodes [MAX_NODES ];
8
- }List ;
11
+ }NodeList ;
9
12
10
- static void list_append (List * list ,int n )
13
+ static void list_append (NodeList * list ,int n )
11
14
{
12
- nodes [list -> size ++ ]= n ;
15
+ Assert (list -> size < MAX_NODES );
16
+ list -> nodes [list -> size ++ ]= n ;
13
17
}
14
18
15
- static void list_copy (List * dst ,List * src )
19
+ static void list_copy (NodeList * dst ,NodeList const * src )
16
20
{
17
21
int i ;
18
22
int n = src -> size ;
@@ -23,13 +27,15 @@ static void list_copy(List* dst, List* src)
23
27
}
24
28
25
29
26
- static void findMaximumIndependentSet (List * cur ,List * result ,nodemask_t * graph ,int * oldSet ,int ne ,int ce )
30
+ static void findMaximumIndependentSet (NodeList * cur ,NodeList * result ,nodemask_t * graph ,int * oldSet ,int ne ,int ce )
27
31
{
28
32
int nod = 0 ;
29
33
int minnod = ce ;
30
34
int fixp = -1 ;
31
35
int s = -1 ;
32
- int i ,j ;
36
+ int i ,j ,k ;
37
+ int newce ,newne ;
38
+ int sel ;
33
39
int newSet [MAX_NODES ];
34
40
35
41
for (i = 0 ;i < ce && minnod != 0 ;i ++ ) {
@@ -39,8 +45,9 @@ static void findMaximumIndependentSet(List* cur, List* result, nodemask_t* graph
39
45
40
46
for (j = ne ;j < ce ;j ++ ) {
41
47
if (!BIT_CHECK (graph [p ],oldSet [j ])) {
42
- if (++ cnt == minnod )
48
+ if (++ cnt == minnod ) {
43
49
break ;
50
+ }
44
51
pos = j ;
45
52
}
46
53
}
@@ -57,19 +64,19 @@ static void findMaximumIndependentSet(List* cur, List* result, nodemask_t* graph
57
64
}
58
65
59
66
60
- for (int k = minnod + nod ;k >=1 ;k -- ) {
61
- int sel = oldSet [s ];
67
+ for (k = minnod + nod ;k >=1 ;k -- ) {
68
+ sel = oldSet [s ];
62
69
oldSet [s ]= oldSet [ne ];
63
70
oldSet [ne ]= sel ;
64
71
65
- int newne = 0 ;
66
- for (int i = 0 ;i < ne ;i ++ ) {
72
+ newne = 0 ;
73
+ for (i = 0 ;i < ne ;i ++ ) {
67
74
if (BIT_CHECK (graph [sel ],oldSet [i ])) {
68
75
newSet [newne ++ ]= oldSet [i ];
69
76
}
70
77
}
71
- int newce = newne ;
72
- for (int i = ne + 1 ;i < ce ;i ++ ) {
78
+ newce = newne ;
79
+ for (i = ne + 1 ;i < ce ;i ++ ) {
73
80
if (BIT_CHECK (graph [sel ],oldSet [i ])) {
74
81
newSet [newce ++ ]= oldSet [i ];
75
82
}
@@ -84,28 +91,30 @@ static void findMaximumIndependentSet(List* cur, List* result, nodemask_t* graph
84
91
findMaximumIndependentSet (cur ,result ,graph ,newSet ,newne ,newce );
85
92
}
86
93
}
87
- cur . size -= 1 ;
94
+ cur -> size -= 1 ;
88
95
if (k > 1 ) {
89
96
for (s = ++ ne ;BIT_CHECK (graph [fixp ],oldSet [s ]);s ++ );
90
97
}
91
98
}
92
99
}
93
100
94
- nodemask_t MtmFindMaxClique (nodemask_t * graphs , in n_nodes );
101
+ nodemask_t MtmFindMaxClique (nodemask_t * graph , int n_nodes )
95
102
{
96
- List tmp ;
97
- List result ;
98
- nodemask_t mask = 0 ;
103
+ NodeList tmp ;
104
+ NodeList result ;
105
+ nodemask_t mask ;
99
106
int all [MAX_NODES ];
100
107
int i ;
108
+
101
109
tmp .size = 0 ;
102
110
result .size = 0 ;
103
111
for (i = 0 ;i < n_nodes ;i ++ ) {
104
- all [i ]= i ;
112
+ all [i ]= i ;
105
113
}
106
114
findMaximumIndependentSet (& tmp ,& result ,graph ,all ,0 ,n_nodes );
115
+ mask = 0 ;
107
116
for (i = 0 ;i < result .size ;i ++ ) {
108
117
mask |= (nodemask_t )1 <<result .nodes [i ];
109
118
}
110
- return ~ mask ;
119
+ return mask ;
111
120
}