1+ #include "postgres.h"
2+ #include "bkb.h"
3+
14/*
2- * Bron–Kerbosch algorithm to find maximumclque in graph
5+ * Bron–Kerbosch algorithm to find maximumclique in graph
36 */
47
58typedef struct {
69int size ;
710int nodes [MAX_NODES ];
8- }List ;
11+ }NodeList ;
912
10- static void list_append (List * list ,int n )
13+ static void list_append (NodeList * list ,int n )
1114{
12- nodes [list -> size ++ ]= n ;
15+ Assert (list -> size < MAX_NODES );
16+ list -> nodes [list -> size ++ ]= n ;
1317}
1418
15- static void list_copy (List * dst ,List * src )
19+ static void list_copy (NodeList * dst ,NodeList const * src )
1620{
1721int i ;
1822int n = src -> size ;
@@ -23,13 +27,15 @@ static void list_copy(List* dst, List* src)
2327}
2428
2529
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 )
2731{
2832int nod = 0 ;
2933int minnod = ce ;
3034int fixp = -1 ;
3135int s = -1 ;
32- int i ,j ;
36+ int i ,j ,k ;
37+ int newce ,newne ;
38+ int sel ;
3339int newSet [MAX_NODES ];
3440
3541for (i = 0 ;i < ce && minnod != 0 ;i ++ ) {
@@ -39,8 +45,9 @@ static void findMaximumIndependentSet(List* cur, List* result, nodemask_t* graph
3945
4046for (j = ne ;j < ce ;j ++ ) {
4147if (!BIT_CHECK (graph [p ],oldSet [j ])) {
42- if (++ cnt == minnod )
48+ if (++ cnt == minnod ) {
4349break ;
50+ }
4451pos = j ;
4552}
4653}
@@ -57,19 +64,19 @@ static void findMaximumIndependentSet(List* cur, List* result, nodemask_t* graph
5764 }
5865
5966
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 ];
6269oldSet [s ]= oldSet [ne ];
6370oldSet [ne ]= sel ;
6471
65- int newne = 0 ;
66- for (int i = 0 ;i < ne ;i ++ ) {
72+ newne = 0 ;
73+ for (i = 0 ;i < ne ;i ++ ) {
6774if (BIT_CHECK (graph [sel ],oldSet [i ])) {
6875newSet [newne ++ ]= oldSet [i ];
6976}
7077}
71- int newce = newne ;
72- for (int i = ne + 1 ;i < ce ;i ++ ) {
78+ newce = newne ;
79+ for (i = ne + 1 ;i < ce ;i ++ ) {
7380if (BIT_CHECK (graph [sel ],oldSet [i ])) {
7481newSet [newce ++ ]= oldSet [i ];
7582}
@@ -84,28 +91,30 @@ static void findMaximumIndependentSet(List* cur, List* result, nodemask_t* graph
8491findMaximumIndependentSet (cur ,result ,graph ,newSet ,newne ,newce );
8592}
8693}
87- cur . size -= 1 ;
94+ cur -> size -= 1 ;
8895if (k > 1 ) {
8996for (s = ++ ne ;BIT_CHECK (graph [fixp ],oldSet [s ]);s ++ );
9097}
9198}
9299}
93100
94- nodemask_t MtmFindMaxClique (nodemask_t * graphs , in n_nodes );
101+ nodemask_t MtmFindMaxClique (nodemask_t * graph , int n_nodes )
95102{
96- List tmp ;
97- List result ;
98- nodemask_t mask = 0 ;
103+ NodeList tmp ;
104+ NodeList result ;
105+ nodemask_t mask ;
99106int all [MAX_NODES ];
100107int i ;
108+
101109tmp .size = 0 ;
102110result .size = 0 ;
103111for (i = 0 ;i < n_nodes ;i ++ ) {
104- all [i ]= i ;
112+ all [i ]= i ;
105113}
106114findMaximumIndependentSet (& tmp ,& result ,graph ,all ,0 ,n_nodes );
115+ mask = 0 ;
107116for (i = 0 ;i < result .size ;i ++ ) {
108117mask |= (nodemask_t )1 <<result .nodes [i ];
109118}
110- return ~ mask ;
119+ return mask ;
111120}