Initial merge of Diego's cleaned up XMLTree class.
[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 #ifndef min
40  #define min(x,y) ((x)<(y)?(x):(y))
41 #endif
42 #ifndef max
43  #define max(x,y) ((x)>(y)?(x):(y))
44 #endif
45
46
47 typedef struct {
48   int n;
49   pb *B;
50   darray *da;
51   byte *sm, *sM;
52   byte *sd;
53   int *mm, *mM;
54   int *md;
55   int m_ofs;
56
57   darray *da_leaf;
58   darray *da_inorder;
59   darray *da_postorder;
60   darray *da_dfuds_leaf;
61   int idx_size;
62   int opt;
63 } bp;
64
65 int bp_construct(bp *b,int n, pb *B, int opt);
66 void printbp(bp *b, int s, int t);
67
68
69 int rank_open(bp *b, int s);
70 int rank_close(bp *b, int s);
71 int select_open(bp *b, int s);
72 int select_close(bp *b, int s);
73
74
75 int root_node(bp *b);
76 int find_close(bp *b,int s);
77 int find_open(bp *b,int s);
78 int enclose(bp *b,int s);
79 int parent(bp *b,int s);
80 int level_ancestor(bp *b,int s,int d);
81 int depth(bp *b, int s);
82 int preorder_rank(bp *b,int s);
83 int postorder_rank(bp *b,int s);
84 int inspect(bp *b, int s);
85 int isleaf(bp *b, int s);
86 int rmq(bp *b, int s, int t, int opt);
87 int subtree_size(bp *b, int s);
88 int first_child(bp *b, int s);
89 int next_sibling(bp *b, int s);
90 int prev_sibling(bp *b, int s);
91 int deepest_node(bp *b,int s);
92 int subtree_height(bp *b,int s);
93 int is_ancestor(bp *b, int s, int t);
94 int distance(bp *b, int s, int t);
95 int level_lefthmost(bp *b, int d);
96 int level_rigthmost(bp *b, int d);
97 int degree(bp *b,int s);
98
99 // not efficient
100 int naive_degree(bp *b, int s);
101 int naive_child(bp *b, int s, int d);
102 int naive_child_rank(bp *b, int t);
103 int naive_rmq(bp *b, int s, int t,int opt);
104 int postorder_select(bp *b,int s);
105
106 // using preorder select index
107 int preorder_select(bp *b,int s);
108
109 // using leaf index
110 int leaf_rank(bp *b,int s);
111 int leaf_size(bp *b, int s);
112 int leftmost_leaf(bp *b, int s);
113 int rightmost_leaf(bp *b, int s);
114
115 // using leaf select index
116 int leaf_select(bp *b,int s);
117
118 // using inorder index
119 int inorder_rank(bp *b,int s);
120
121 // using inorder select index
122 int inorder_select(bp *b,int s);
123
124 // using degree index
125 int fast_degree(bp *b,int s, int t, int ith);
126 int child_rank(bp *b, int t);
127 int child(bp *b, int s, int d);
128
129
130 // new functions for persistence purposes, added by Diego Arroyuelo
131 void saveTree(bp *b, FILE *fp);
132 void loadTree(bp *b, FILE *fp);
133 void destroyTree(bp *b);
134
135 int blog(int x);
136 pb getpat_preorder(pb *b);
137 pb getpat_leaf(pb *b);
138 pb getpat_inorder(pb *b);
139 pb getpat_postorder(pb *b);
140
141
142 int fwd_excess(bp *b,int s, int rel);
143 int bwd_excess(bp *b,int s, int rel);
144
145 extern int *matchtbl,*parenttbl;
146 void make_naivetbl(pb *B,int n);
147
148 extern int popCount[1<<ETW];
149 extern int fwdtbl[(2*ETW+1)*(1<<ETW)];
150 extern int bwdtbl[(2*ETW+1)*(1<<ETW)];
151 extern int mintbl_li[1<<ETW], mintbl_lv[1<<ETW];
152 extern int mintbl_ri[1<<ETW], mintbl_rv[1<<ETW];
153 extern int maxtbl_li[1<<ETW], maxtbl_lv[1<<ETW];
154 extern int maxtbl_ri[1<<ETW], maxtbl_rv[1<<ETW];
155
156 extern int minmaxtbl_i[4][1<<ETW], minmaxtbl_v[4][1<<ETW];
157 extern int degtbl[1<<ETW];
158 extern int degtbl2[(2*ETW+1)*(1<<ETW)];
159 extern int childtbl[(ETW)*(1<<ETW)];
160 extern int depthtbl[(2*ETW+1)*(1<<ETW)];
161 extern int childtbl2[2*ETW+1][ETW][(1<<ETW)];
162
163 #endif