nysol-zdd 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/ext/zdd_so/BDD.cc +495 -0
  3. data/ext/zdd_so/BDD.h +356 -0
  4. data/ext/zdd_so/BDDDG.cc +1818 -0
  5. data/ext/zdd_so/BDDDG.h +107 -0
  6. data/ext/zdd_so/BDDHASH.cc +91 -0
  7. data/ext/zdd_so/BtoI.cc +503 -0
  8. data/ext/zdd_so/BtoI.h +144 -0
  9. data/ext/zdd_so/CtoI.cc +1072 -0
  10. data/ext/zdd_so/CtoI.h +186 -0
  11. data/ext/zdd_so/MLZBDDV.cc +153 -0
  12. data/ext/zdd_so/MLZBDDV.h +42 -0
  13. data/ext/zdd_so/SOP.cc +608 -0
  14. data/ext/zdd_so/SOP.h +199 -0
  15. data/ext/zdd_so/ZBDD.cc +1035 -0
  16. data/ext/zdd_so/ZBDD.h +243 -0
  17. data/ext/zdd_so/ZBDDDG.cc +1834 -0
  18. data/ext/zdd_so/ZBDDDG.h +105 -0
  19. data/ext/zdd_so/ZBDDHASH.cc +91 -0
  20. data/ext/zdd_so/bddc.c +2816 -0
  21. data/ext/zdd_so/bddc.h +132 -0
  22. data/ext/zdd_so/extconf.rb +25 -0
  23. data/ext/zdd_so/include/aheap.c +211 -0
  24. data/ext/zdd_so/include/aheap.h +111 -0
  25. data/ext/zdd_so/include/base.c +93 -0
  26. data/ext/zdd_so/include/base.h +60 -0
  27. data/ext/zdd_so/include/itemset.c +473 -0
  28. data/ext/zdd_so/include/itemset.h +153 -0
  29. data/ext/zdd_so/include/problem.c +371 -0
  30. data/ext/zdd_so/include/problem.h +160 -0
  31. data/ext/zdd_so/include/queue.c +518 -0
  32. data/ext/zdd_so/include/queue.h +177 -0
  33. data/ext/zdd_so/include/sgraph.c +331 -0
  34. data/ext/zdd_so/include/sgraph.h +170 -0
  35. data/ext/zdd_so/include/stdlib2.c +832 -0
  36. data/ext/zdd_so/include/stdlib2.h +746 -0
  37. data/ext/zdd_so/include/trsact.c +723 -0
  38. data/ext/zdd_so/include/trsact.h +167 -0
  39. data/ext/zdd_so/include/vec.c +583 -0
  40. data/ext/zdd_so/include/vec.h +159 -0
  41. data/ext/zdd_so/lcm-vsop.cc +596 -0
  42. data/ext/zdd_so/print.cc +683 -0
  43. data/ext/zdd_so/table.cc +330 -0
  44. data/ext/zdd_so/vsop.h +88 -0
  45. data/ext/zdd_so/zdd_so.cpp +3277 -0
  46. data/lib/nysol/zdd.rb +31 -0
  47. metadata +131 -0
@@ -0,0 +1,132 @@
1
+ /*****************************************
2
+ * BDD Package (SAPPORO-1.57) - Header *
3
+ * (C) Shin-ichi MINATO (June 14, 2013) *
4
+ ******************************************/
5
+
6
+ #ifndef bddc_h
7
+ #define bddc_h
8
+
9
+ #if (defined BDD_CPP)||(! defined B_OLDC)
10
+ # define B_ARG(a) a /* ANSI C style */
11
+ #else
12
+ # define B_ARG(a) () /* K&R C style */
13
+ #endif
14
+
15
+ /***************** Internal macro for index *****************/
16
+ #define B_VAR_WIDTH 16U /* Width of variable index */
17
+ #define B_VAR_MASK ((1U << B_VAR_WIDTH) - 1U)
18
+
19
+ /***************** Internal macro for bddp *****************/
20
+ #ifdef B_64
21
+ # define B_MSB_POS 39ULL
22
+ # define B_LSB_MASK 1ULL
23
+ #else
24
+ # define B_MSB_POS 31U
25
+ # define B_LSB_MASK 1U
26
+ #endif
27
+ #define B_MSB_MASK (B_LSB_MASK << B_MSB_POS)
28
+ #define B_INV_MASK B_LSB_MASK /* Mask of inverter-flag */
29
+ #define B_CST_MASK B_MSB_MASK /* Mask of constant-flag */
30
+ #define B_VAL_MASK (B_MSB_MASK - 1U)
31
+ /* Mask of value-field */
32
+
33
+ /***************** For stack overflow limit *****************/
34
+ extern const int BDD_RecurLimit;
35
+ extern int BDD_RecurCount;
36
+
37
+ /***************** External typedef *****************/
38
+ typedef unsigned int bddvar;
39
+ #ifdef B_64
40
+ typedef unsigned long long bddp;
41
+ #else
42
+ typedef unsigned int bddp;
43
+ #endif
44
+
45
+ /***************** External Macro *****************/
46
+ #define bddvarmax B_VAR_MASK /* Max value of variable index */
47
+ #define bddnull B_VAL_MASK /* Special value for null pointer */
48
+ #define bddfalse B_CST_MASK /* bddp of constant false (0) */
49
+ #define bddtrue (bddfalse ^ B_INV_MASK)
50
+ /* bddp of constant true (1) */
51
+ #define bddempty bddfalse /* bddp of empty ZBDD (0) */
52
+ #define bddsingle bddtrue /* bddp of single unit ZBDD (1) */
53
+ #define bddconst(c) (((c) & B_VAL_MASK) | B_CST_MASK)
54
+ /* bddp of a constant valued node */
55
+ #define bddvalmax B_VAL_MASK /* Max constant value */
56
+
57
+ #ifdef BDD_CPP
58
+ extern "C" {
59
+ #endif /* BDD_CPP */
60
+
61
+ /***************** External operations *****************/
62
+
63
+ /***************** Init. and config. ****************/
64
+ extern int bddinit B_ARG((bddp initsize, bddp limitsize));
65
+ extern bddvar bddnewvar B_ARG((void));
66
+ extern bddvar bddnewvaroflev B_ARG((bddvar lev));
67
+ extern bddvar bddlevofvar B_ARG((bddvar v));
68
+ extern bddvar bddvaroflev B_ARG((bddvar lev));
69
+ extern bddvar bddvarused B_ARG((void));
70
+
71
+ /************** Basic logic operations *************/
72
+ extern bddp bddprime B_ARG((bddvar v));
73
+ extern bddvar bddtop B_ARG((bddp f));
74
+ extern bddp bddcopy B_ARG((bddp f));
75
+ extern bddp bddnot B_ARG((bddp f));
76
+ extern bddp bddand B_ARG((bddp f, bddp g));
77
+ extern bddp bddor B_ARG((bddp f, bddp g));
78
+ extern bddp bddxor B_ARG((bddp f, bddp g));
79
+ extern bddp bddnand B_ARG((bddp f, bddp g));
80
+ extern bddp bddnor B_ARG((bddp f, bddp g));
81
+ extern bddp bddxnor B_ARG((bddp f, bddp g));
82
+ extern bddp bddat0 B_ARG((bddp f, bddvar v));
83
+ extern bddp bddat1 B_ARG((bddp f, bddvar v));
84
+
85
+ /********** Memory management and observation ***********/
86
+ extern void bddfree B_ARG((bddp f));
87
+ extern bddp bddused B_ARG((void));
88
+ extern int bddgc B_ARG((void));
89
+ extern bddp bddsize B_ARG((bddp f));
90
+ extern bddp bddvsize B_ARG((bddp *p, int lim));
91
+ extern void bddexport B_ARG((FILE *strm, bddp *p, int lim));
92
+ extern int bddimport B_ARG((FILE *strm, bddp *p, int lim));
93
+ extern void bdddump B_ARG((bddp f));
94
+ extern void bddvdump B_ARG((bddp *p, int lim));
95
+ extern void bddgraph B_ARG((bddp f));
96
+ extern void bddgraph0 B_ARG((bddp f));
97
+ extern void bddvgraph B_ARG((bddp *p, int lim));
98
+ extern void bddvgraph0 B_ARG((bddp *p, int lim));
99
+
100
+ /************** Advanced logic operations *************/
101
+ extern bddp bddlshift B_ARG((bddp f, bddvar shift));
102
+ extern bddp bddrshift B_ARG((bddp f, bddvar shift));
103
+ extern bddp bddsupport B_ARG((bddp f));
104
+ extern bddp bdduniv B_ARG((bddp f, bddp g));
105
+ extern bddp bddexist B_ARG((bddp f, bddp g));
106
+ extern bddp bddcofactor B_ARG((bddp f, bddp g));
107
+ extern int bddimply B_ARG((bddp f, bddp g));
108
+ extern bddp bddrcache B_ARG((unsigned char op, bddp f, bddp g));
109
+ extern void bddwcache
110
+ B_ARG((unsigned char op, bddp f, bddp g, bddp h));
111
+
112
+ /************** ZBDD operations *************/
113
+ extern bddp bddoffset B_ARG((bddp f, bddvar v));
114
+ extern bddp bddonset B_ARG((bddp f, bddvar v));
115
+ extern bddp bddonset0 B_ARG((bddp f, bddvar v));
116
+ extern bddp bddchange B_ARG((bddp f, bddvar v));
117
+ extern bddp bddintersec B_ARG((bddp f, bddp g));
118
+ extern bddp bddunion B_ARG((bddp f, bddp g));
119
+ extern bddp bddsubtract B_ARG((bddp f, bddp g));
120
+ extern bddp bddcard B_ARG((bddp f));
121
+ extern bddp bddlit B_ARG((bddp f));
122
+ extern bddp bddlen B_ARG((bddp f));
123
+ extern int bddimportz B_ARG((FILE *strm, bddp *p, int lim));
124
+
125
+ /************** SeqBDD operations *************/
126
+ extern bddp bddpush B_ARG((bddp f, bddvar v));
127
+
128
+ #ifdef BDD_CPP
129
+ }
130
+ #endif /* BDD_CPP */
131
+
132
+ #endif /* bddc_h */
@@ -0,0 +1,25 @@
1
+ require 'mkmf'
2
+ cp = "$(srcdir)"
3
+ $CFLAGS = " -O3 -Wall -I. -I#{cp}/include -DB_STATIC -D_NO_MAIN_ -DLINE -fPIC -Wno-error=format-security"
4
+ $CPPFLAGS = " -O3 -Wall -I. -I#{cp}/include -DB_STATIC -D_NO_MAIN_ -DLINE -fPIC -Wno-error=format-security"
5
+ $CXXFLAGS = " -O3 -Wall -I. -I#{cp}/include -DB_STATIC -D_NO_MAIN_ -DLINE -fPIC -Wno-error=format-security"
6
+
7
+
8
+ $LOCAL_LIBS += " -lstdc++"
9
+
10
+ if RUBY_VERSION >= '2.0.0' then
11
+ if Gem::Platform::local.os =~ /darwin/ then
12
+ $CFLAGS += " -Wno-error=unused-command-line-argument-hard-error-in-future"
13
+ $CPPFLAGS += " -Wno-error=unused-command-line-argument-hard-error-in-future"
14
+ $LOCAL_LIBS += " -Wno-error=unused-command-line-argument-hard-error-in-future"
15
+ end
16
+ end
17
+
18
+
19
+ if RUBY_VERSION < '1.9.0'
20
+ $CFLAGS += " -o $@"
21
+ end
22
+
23
+
24
+ create_makefile("nysol/zdd_so")
25
+
@@ -0,0 +1,211 @@
1
+ /*
2
+ array-based simple heap (fixex size)
3
+ 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp,
4
+ homepage: http://research.nii.ac.jp/~uno/index.html */
5
+ /* This program is available for only academic use, basically.
6
+ Anyone can modify this program, but he/she has to write down
7
+ the change of the modification on the top of the source code.
8
+ Neither contact nor appointment to Takeaki Uno is needed.
9
+ If one wants to re-distribute this code, do not forget to
10
+ refer the newest code, and show the link to homepage of
11
+ Takeaki Uno, to notify the news about the codes for the users.
12
+ For the commercial use, please make a contact to Takeaki Uno. */
13
+
14
+ #ifndef _aheap_c_
15
+ #define _aheap_c_
16
+
17
+ #include"aheap.h"
18
+
19
+ QSORT_TYPE (AHEAP_KEY, AHEAP_KEY)
20
+ QSORT_TYPE (AHEAP_ID, AHEAP_ID)
21
+ AHEAP INIT_AHEAP = {TYPE_AHEAP,NULL,0,0};
22
+
23
+ /* allocate memory */
24
+ void AHEAP_alloc (AHEAP *H, AHEAP_ID num){
25
+ AHEAP_ID i;
26
+ #ifdef ERROR_CHECK
27
+ if ( num<0 ) error_num ("size is out of range", num, EXIT);
28
+ #endif
29
+ *H = INIT_AHEAP;
30
+ if ( num>0 ) malloc2 (H->v, num*2, "AHEAP_alloc: H->v", EXIT);
31
+ H->end = num;
32
+ ARY_FILL (H->v, 0, num*2, AHEAP_KEYHUGE);
33
+ for (i=0 ; i<num-1 ; i=i*2+1);
34
+ H->base = i - num + 1;
35
+ }
36
+
37
+ /* termination */
38
+ void AHEAP_end (AHEAP *H){
39
+ free2 (H->v);
40
+ *H = INIT_AHEAP;
41
+ }
42
+
43
+ /* return the index of the leaf having the minimum key among the descendants
44
+ of the given node i. If several leaves with the smallest key are there,
45
+ return the minimum index among them if f=0, maximum index if f=1, and
46
+ random choice if f=2 */
47
+ /* random choice version. choose one child to go down randomly for each node,
48
+ thus it is not uniformly random */
49
+ AHEAP_ID AHEAP_findmin_node (AHEAP *H, AHEAP_ID i, int f){
50
+ if ( H->end <= 0 ) return (-1);
51
+ while ( i < H->end-1 ){
52
+ if ( H->v[i*2+1] == H->v[i] )
53
+ if ( H->v[i*2+2] == H->v[i] )
54
+ if ( f == 2 ) i = i*2 + 1 + rand()%2;
55
+ else i = i*2+1+f;
56
+ else i = i*2+1;
57
+ else i = i*2+2;
58
+ }
59
+ return (AHEAP_IDX(*H, i) );
60
+ }
61
+ AHEAP_ID AHEAP_findmin_head (AHEAP *H){ return (AHEAP_findmin_node (H, 0, 0) ); }
62
+ AHEAP_ID AHEAP_findmin_tail (AHEAP *H){ return (AHEAP_findmin_node (H, 0, 1) ); }
63
+ AHEAP_ID AHEAP_findmin_rnd (AHEAP *H){ return (AHEAP_findmin_node (H, 0, 2) ); }
64
+
65
+ /* return the index of the leaf having smaller value than a among the
66
+ descendants of the given node i. If several leaves with the smallest key
67
+ are there, return the minimum index among them if f=0, maximum index if f=1,
68
+ and random choice if f=2 */
69
+ AHEAP_ID AHEAP_findlow_node (AHEAP *H, AHEAP_KEY a, AHEAP_ID i, int f){
70
+ if ( H->end == 0 ) return (-1);
71
+ if ( H->v[0] > a ) return (-1);
72
+ while ( i < H->end-1 ){
73
+ if ( f == 2 ) {
74
+ if ( H->v[i*2+1] <= a )
75
+ if ( H->v[i*2+2] <= a ) i = i*2 + 1 + rand()%2;
76
+ else i = i*2+1;
77
+ else i = i*2+2;
78
+ } else if ( H->v[i*2+1] <= a ) i = i*2+1+f; else i = i*2+2-f;
79
+ }
80
+ return (AHEAP_IDX(*H, i) );
81
+ }
82
+ AHEAP_ID AHEAP_findlow_head (AHEAP *H, AHEAP_KEY a){ return (AHEAP_findlow_node (H, a, 0, 0) ); }
83
+ AHEAP_ID AHEAP_findlow_tail (AHEAP *H, AHEAP_KEY a){ return (AHEAP_findlow_node (H, a, 0, 1) ); }
84
+ AHEAP_ID AHEAP_findlow_rnd (AHEAP *H, AHEAP_KEY a){ return (AHEAP_findlow_node (H, a, 0, 2) ); }
85
+
86
+ /* return the index of the leaf having smaller value than a next/previous to
87
+ leaf i. return -1 if such a leaf does not exist */
88
+ AHEAP_ID AHEAP_findlow_nxt (AHEAP *H, AHEAP_ID i, AHEAP_KEY a){
89
+ if ( H->end == 0 ) return (-1);
90
+ for (i=AHEAP_LEAF(*H,i); i>0 ; i=(i-1)/2){
91
+ /* i is the child of smaller index, and the key of the sibling of i is less than a */
92
+ if ( i%2 == 1 && H->v[i+1] <= a ) return (AHEAP_findlow_node (H, a, i+1, 0) );
93
+ }
94
+ return (-1);
95
+ }
96
+ AHEAP_ID AHEAP_findlow_prv (AHEAP *H, AHEAP_ID i, AHEAP_KEY a){
97
+ if ( H->end == 0 ) return (-1);
98
+ for (i=AHEAP_LEAF(*H,i); i>0 ; i=(i-1)/2){
99
+ /* i is the child of larger index, and the key of the sibling of i is less than a */
100
+ if ( i%2 == 0 && H->v[i-1] <= a ) return (AHEAP_findlow_node (H, a, i-1, 1) );
101
+ }
102
+ return (-1);
103
+ }
104
+
105
+ /* change the key of node i to a /Add a to the key of node i, and update heap H */
106
+ void AHEAP_chg (AHEAP *H, AHEAP_ID i, AHEAP_KEY a){
107
+ i = AHEAP_LEAF (*H, i);
108
+ H->v[i] = a;
109
+ AHEAP_update (H, i);
110
+ }
111
+ void AHEAP_add (AHEAP *H, AHEAP_ID i, AHEAP_KEY a){
112
+ i = AHEAP_LEAF (*H, i);
113
+ H->v[i] += a;
114
+ AHEAP_update (H, i);
115
+ }
116
+
117
+ /* update the ancestor of node i */
118
+ void AHEAP_update (AHEAP *H, AHEAP_ID i){
119
+ AHEAP_ID j;
120
+ AHEAP_KEY a = H->v[i];
121
+ while ( i>0 ){
122
+ j = i - 1 + (i%2)*2; /* j = the sibling of i */
123
+ i = (i-1) / 2;
124
+ if ( H->v[j] < a ) a = H->v[j];
125
+ if ( a == H->v[i] ) break;
126
+ H->v[i] = a;
127
+ }
128
+ }
129
+
130
+ /* find the leaf with the minimum key value among the leaves having index
131
+ smaller/larger than i, or between i and j */
132
+ AHEAP_ID AHEAP_upper_min (AHEAP *H, AHEAP_ID i){
133
+ AHEAP_ID fi=0, j = AHEAP_LEAF (*H, H->end - 1);
134
+ AHEAP_KEY fm = AHEAP_KEYHUGE;
135
+ if ( i == 0 ) return (AHEAP_findmin_head (H) );
136
+ i = AHEAP_LEAF (*H, i-1);
137
+ while ( i != j ){
138
+ if ( i%2 ){ /* if i is the child with smaller index */
139
+ if ( fm > H->v[i+1] ){
140
+ fm = H->v[i+1];
141
+ fi = i+1;
142
+ }
143
+ }
144
+ i = (i-1)/2;
145
+ if ( j == i ) break; /* stop if the right pointer and the left pointer are the same */
146
+ j = (j-1)/2;
147
+ }
148
+ while ( fi < H->end-1 ) fi = fi*2 + (H->v[fi*2+1]<=fm?1:2);
149
+ return ( AHEAP_IDX(*H, fi) );
150
+ }
151
+ AHEAP_ID AHEAP_lower_min (AHEAP *H, AHEAP_ID i){
152
+ AHEAP_ID fi=0, j = AHEAP_LEAF (*H, 0);
153
+ AHEAP_KEY fm = AHEAP_KEYHUGE;
154
+ if ( i == H->end-1 ) return (AHEAP_findmin_head (H) );
155
+ i = AHEAP_LEAF (*H, i+1);
156
+ while ( i != j ){
157
+ if ( i%2 == 0 ){ /* if i is the child of larger index */
158
+ if ( fm > H->v[i-1] ){
159
+ fm = H->v[i-1];
160
+ fi = i-1;
161
+ }
162
+ }
163
+ j = (j-1)/2;
164
+ if ( j == i ) break; /* stop if the right pointer and the left pointer are the same */
165
+ i = (i-1)/2;
166
+ }
167
+ while ( fi < H->end-1 ) fi = fi*2 + (H->v[fi*2+1]<=fm?1:2);
168
+ return (AHEAP_IDX(*H, fi) );
169
+ }
170
+
171
+ /* find the index having the minimum among given two indices */
172
+ AHEAP_ID AHEAP_interval_min (AHEAP *H, AHEAP_ID i, AHEAP_ID j){
173
+ AHEAP_ID fi=0;
174
+ AHEAP_KEY fm = AHEAP_KEYHUGE;
175
+ if ( i == 0 ) return (AHEAP_lower_min (H, j) );
176
+ if ( j == H->end-1 ) return (AHEAP_upper_min (H, i) );
177
+ i = AHEAP_LEAF (*H, i-1);
178
+ j = AHEAP_LEAF (*H, j+1);
179
+ while ( i != j && i != j-1 ){
180
+ if ( i%2 ){ /* if i is the child of smaller index */
181
+ if ( fm > H->v[i+1] ){
182
+ fm = H->v[i+1];
183
+ fi = i+1;
184
+ }
185
+ }
186
+ i = (i-1)/2;
187
+ if ( j == i || j == i+1 ) break; /* stop if the right pointer and the left pointer are the same */
188
+ if ( j%2 == 0 ){ /* if j is the child of larger index */
189
+ if ( fm > H->v[j-1] ){
190
+ fm = H->v[j-1];
191
+ fi = j-1;
192
+ }
193
+ }
194
+ j = (j-1)/2;
195
+ }
196
+ while ( fi < H->end-1 )
197
+ fi = fi*2 + (H->v[fi*2+1] <= fm?1:2);
198
+ return (AHEAP_IDX(*H, fi) );
199
+ }
200
+
201
+ /* print heap keys according to the structure of the heap */
202
+ void AHEAP_print (AHEAP *H){
203
+ AHEAP_ID i, j=1;
204
+ while ( j<=H->end*2-1 ){
205
+ FLOOP (i, j-1, MIN(j, H->end)*2-1) printf (AHEAP_KEYF ",", H->v[i] );
206
+ printf ("\n");
207
+ j = j*2;
208
+ }
209
+ }
210
+
211
+ #endif
@@ -0,0 +1,111 @@
1
+ /*
2
+ array-based simple heap (fixed size)
3
+ 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp,
4
+ homepage: http://research.nii.ac.jp/~uno/index.html */
5
+ /* This program is available for only academic use, basically.
6
+ Anyone can modify this program, but he/she has to write down
7
+ the change of the modification on the top of the source code.
8
+ Neither contact nor appointment to Takeaki Uno is needed.
9
+ If one wants to re-distribute this code, do not forget to
10
+ refer the newest code, and show the link to homepage of
11
+ Takeaki Uno, to notify the news about the codes for the users.
12
+ For the commercial use, please make a contact to Takeaki Uno. */
13
+
14
+ /* bench mark
15
+ PentiumIII 500MHz, Memory 256MB Linux
16
+ values 0-1,000,000 : set & del & get 1,000,000 times
17
+ 2.55sec
18
+
19
+ # rotation == 1/5 per 1 set/del
20
+
21
+ *** simple array ***
22
+ value 0-1,000,000 set & set & set 1,000,000 times,
23
+ 0.88sec
24
+ */
25
+
26
+ #ifndef _aheap_h_
27
+ #define _aheap_h_
28
+
29
+ #include"stdlib2.h"
30
+
31
+ #ifndef AHEAP_KEY
32
+ #ifdef AHEAP_KEY_DOUBLE
33
+ #define AHEAP_KEY double
34
+ #define AHEAP_KEYHUGE DOUBLEHUGE
35
+ #define AHEAP_KEYF "%f"
36
+ #elif defined(AHEAP_KEY_WEIGHT)
37
+ #define AHEAP_KEY WEIGHT
38
+ #define AHEAP_KEYHUGE WEIGHTHUGE
39
+ #define AHEAP_KEYF WEIGHTF
40
+ #else
41
+ #define AHEAP_KEY int
42
+ #define AHEAP_KEYHUGE INTHUGE
43
+ #define AHEAP_KEYF "%d"
44
+ #endif
45
+ #endif
46
+
47
+ #ifndef AHEAP_ID
48
+ #define AHEAP_ID int
49
+ #define AHEAP_ID_END INTHUGE
50
+ #define AHEAP_IDF "%d"
51
+ #endif
52
+
53
+ #define AHEAP_IDX(H,i) (((i)+1-(H).base)%(H).end)
54
+ #define AHEAP_LEAF(H,i) (((i)+(H).base)%(H).end+(H).end-1)
55
+ #define AHEAP_H(H,i) (H).v[(((i)+(H).base)%(H).end+(H).end-1)]
56
+
57
+ typedef struct {
58
+ unsigned char type;
59
+ AHEAP_KEY *v; /* array for heap key */
60
+ int end; /* the number of maximum elements */
61
+ int base; /* the constant for set 0 to the leftmost leaf */
62
+ } AHEAP;
63
+
64
+ QSORT_TYPE_HEADER (AHEAP_KEY, AHEAP_KEY)
65
+ QSORT_TYPE_HEADER (AHEAP_ID, AHEAP_ID)
66
+ extern AHEAP INIT_AHEAP;
67
+
68
+ /* initialization. allocate memory for H and fill it by +infinity */
69
+ void AHEAP_alloc (AHEAP *H, int num);
70
+ void AHEAP_end (AHEAP *H);
71
+
72
+ /* return the index of the leaf having the minimum key among the descendants
73
+ of the given node i. If several leaves with the smallest key are there,
74
+ return the minimum index among them if f=0, maximum index if f=1, and
75
+ random choice if f=2 */
76
+ AHEAP_ID AHEAP_findmin_node (AHEAP *H, AHEAP_ID i, int f);
77
+ AHEAP_ID AHEAP_findmin_head (AHEAP *H);
78
+ AHEAP_ID AHEAP_findmin_tail (AHEAP *H);
79
+ AHEAP_ID AHEAP_findmin_rnd (AHEAP *H);
80
+
81
+ /* return the index of the leaf having smaller value than a among the
82
+ descendants of the given node i. If several leaves with the smallest key
83
+ are there, return the minimum index among them if f=0, maximum index if f=1,
84
+ and random choice if f=2 */
85
+ AHEAP_ID AHEAP_findlow_node (AHEAP *H, AHEAP_KEY a, AHEAP_ID i, int f);
86
+ AHEAP_ID AHEAP_findlow_head (AHEAP *H, AHEAP_KEY a);
87
+ AHEAP_ID AHEAP_findlow_tail (AHEAP *H, AHEAP_KEY a);
88
+ AHEAP_ID AHEAP_findlow_rnd (AHEAP *H, AHEAP_KEY a);
89
+
90
+ /* return the index of the leaf having smaller value than a next/previous to
91
+ leaf i. return -1 if such a leaf does not exist */
92
+ AHEAP_ID AHEAP_findlow_nxt (AHEAP *H, AHEAP_ID i, AHEAP_KEY a);
93
+ AHEAP_ID AHEAP_findlow_prv (AHEAP *H, AHEAP_ID i, AHEAP_KEY a);
94
+
95
+ /* change the key of node i to a /Add a to the key of node i, and update heap H */
96
+ void AHEAP_chg (AHEAP *H, AHEAP_ID i, AHEAP_KEY a);
97
+ void AHEAP_add (AHEAP *H, AHEAP_ID i, AHEAP_KEY a);
98
+
99
+ /* update the ancestor of node i */
100
+ void AHEAP_update (AHEAP *H, AHEAP_ID i);
101
+
102
+ /* find the leaf with the minimum key value among the leaves having index
103
+ smaller/larger than i, or between i and j */
104
+ AHEAP_ID AHEAP_upper_min (AHEAP *H, AHEAP_ID i);
105
+ AHEAP_ID AHEAP_lower_min (AHEAP *H, AHEAP_ID i);
106
+ AHEAP_ID AHEAP_interval_min (AHEAP *H, AHEAP_ID i, AHEAP_ID j);
107
+
108
+ /* print heap keys according to the structure of the heap */
109
+ void AHEAP_print (AHEAP *H);
110
+
111
+ #endif