Backport changes from the grammar branch
[SXSI/XMLTree.git] / bp.h
1 #ifndef BP_H_
2 #define BP_H_
3
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include "darray.h"
7
8 #define OP 1
9 #define CP 0
10
11 #define OPT_MIN 0
12 #define OPT_MAX 1
13 #define OPT_LEFT 0
14 #define OPT_RIGHT 2
15
16 #define OPT_LEAF (1<<0)
17 #define OPT_INORDER (1<<1)
18 #define OPT_DEGREE (1<<2)
19 #define OPT_FAST_PREORDER_SELECT (1<<3)
20 #define OPT_FAST_LEAF_SELECT (1<<4)
21 #define OPT_FAST_INORDER_SELECT (1<<5)
22 #define OPT_FAST_POSTORDER_SELECT (1<<6)
23 #define OPT_DFUDS_LEAF (1<<7)
24 #define OPT_FAST_DFUDS_LEAF_SELECT (1<<8)
25
26 //#define logSB 9
27 #define logSB 7
28 //#define logSB 2
29 #define SB (1<<logSB)
30 //#define logMB 16
31 //#define logMB 12
32 #define logMB 15
33 //#define logMB 3
34 #define MB (1<<logMB)
35
36 #define ETW 8   // width of excess lookup table
37 #define W1 2    // branching factor
38
39
40
41 typedef struct {
42   int n;
43   pb *B;
44   darray *da;
45   byte *sm, *sM;
46   byte *sd;
47   int *mm, *mM;
48   int *md;
49   int m_ofs;
50
51   darray *da_leaf;
52   darray *da_inorder;
53   darray *da_postorder;
54   darray *da_dfuds_leaf;
55   int idx_size;
56   int opt;
57 } bp;
58
59 int bp_construct(bp *b,int n, pb *B, int opt);
60 void printbp(bp *b, int s, int t);
61
62
63 int rank_open(bp *b, int s);
64 int rank_close(bp *b, int s);
65 int select_open(bp *b, int s);
66 int select_close(bp *b, int s);
67
68
69 int root_node(bp *b);
70 int find_close(bp *b,int s);
71 int find_open(bp *b,int s);
72 int enclose(bp *b,int s);
73 int parent(bp *b,int s);
74 int level_ancestor(bp *b,int s,int d);
75 int depth(bp *b, int s);
76 int preorder_rank(bp *b,int s);
77 int postorder_rank(bp *b,int s);
78 int inspect(bp *b, int s);
79 int isleaf(bp *b, int s);
80 int rmq(bp *b, int s, int t, int opt);
81 int subtree_size(bp *b, int s);
82 int first_child(bp *b, int s);
83 int next_sibling(bp *b, int s);
84 int prev_sibling(bp *b, int s);
85 int deepest_node(bp *b,int s);
86 int subtree_height(bp *b,int s);
87 int is_ancestor(bp *b, int s, int t);
88 int distance(bp *b, int s, int t);
89 int level_lefthmost(bp *b, int d);
90 int level_rigthmost(bp *b, int d);
91 int degree(bp *b,int s);
92
93 // not efficient
94 int naive_degree(bp *b, int s);
95 int naive_child(bp *b, int s, int d);
96 int naive_child_rank(bp *b, int t);
97 int naive_rmq(bp *b, int s, int t,int opt);
98 int postorder_select(bp *b,int s);
99
100 // using preorder select index
101 int preorder_select(bp *b,int s);
102
103 // using leaf index
104 int leaf_rank(bp *b,int s);
105 int leaf_size(bp *b, int s);
106 int leftmost_leaf(bp *b, int s);
107 int rightmost_leaf(bp *b, int s);
108
109 // using leaf select index
110 int leaf_select(bp *b,int s);
111
112 // using inorder index
113 int inorder_rank(bp *b,int s);
114
115 // using inorder select index
116 int inorder_select(bp *b,int s);
117
118 // using degree index
119 int fast_degree(bp *b,int s, int t, int ith);
120 int child_rank(bp *b, int t);
121 int child(bp *b, int s, int d);
122
123
124 // new functions for persistence purposes, added by Diego Arroyuelo
125 void saveTree(bp *b, FILE *fp);
126 void loadTree(bp *b, FILE *fp);
127 void destroyTree(bp *b);
128
129
130 inline int blog(int x)
131 {
132   int l;
133   l = 0;
134   while (x>0) {
135     x>>=1;
136     l++;
137   }
138   return l;
139 }
140
141 pb getpat_preorder(pb *b);
142 pb getpat_leaf(pb *b);
143 pb getpat_inorder(pb *b);
144 pb getpat_postorder(pb *b);
145
146
147 int fwd_excess(bp *b,int s, int rel);
148 int bwd_excess(bp *b,int s, int rel);
149
150 extern int *matchtbl,*parenttbl;
151 void make_naivetbl(pb *B,int n);
152
153 extern int popCount[1<<ETW];
154 extern int fwdtbl[(2*ETW+1)*(1<<ETW)];
155 extern int bwdtbl[(2*ETW+1)*(1<<ETW)];
156 extern int mintbl_li[1<<ETW], mintbl_lv[1<<ETW];
157 extern int mintbl_ri[1<<ETW], mintbl_rv[1<<ETW];
158 extern int maxtbl_li[1<<ETW], maxtbl_lv[1<<ETW];
159 extern int maxtbl_ri[1<<ETW], maxtbl_rv[1<<ETW];
160
161 extern int minmaxtbl_i[4][1<<ETW], minmaxtbl_v[4][1<<ETW];
162 extern int degtbl[1<<ETW];
163 extern int degtbl2[(2*ETW+1)*(1<<ETW)];
164 extern int childtbl[(ETW)*(1<<ETW)];
165 extern int depthtbl[(2*ETW+1)*(1<<ETW)];
166 extern int childtbl2[2*ETW+1][ETW][(1<<ETW)];
167
168
169 #endif