uint static_sequence_wvtree::rankLessThan(uint &symbol, uint pos) {
uint s = am->map(symbol);
// std::cout << "lessthan..." << std::endl;
- uint r = root->rankLessThan(s, pos, 0, c);
+ uint r = root->rankLessThan(s, pos);
symbol = am->unmap(s);
return r;
}
public:
virtual ~wt_node() {}
virtual uint rank(uint symbol, uint pos, uint l, wt_coder * c)=0;
- virtual uint rankLessThan(uint &symbol, uint pos, uint level, wt_coder * c) = 0;
virtual uint rankLessThan(uint &symbol, uint pos) = 0;
virtual uint select(uint symbol, uint pos, uint l, wt_coder * c)=0;
virtual uint access(uint pos)=0;
// return value is rank of symbol (less or equal to the given symbol) that has rank > 0,
// the parameter symbol is updated accordinly
-uint wt_node_internal::rankLessThan(uint &symbol, uint pos, uint l, wt_coder * c)
-{
- bool is_set = c->is_set(symbol,l);
- using std::cout;
- using std::endl;
-// cout << "l = " << l << ", symbol = " << (uchar)symbol << ", rank0 = " << bitmap->rank0(pos) << ", rank1 = " << bitmap->rank1(pos) << endl;
-
- uint result = -1;
- if(!is_set) {
- if(left_child==NULL) return -1;
- uint rank = bitmap->rank0(pos);
- if(rank != 0)
- result = left_child->rankLessThan(symbol,rank-1,l+1,c);
- return result;
- }
-
- uint rank = bitmap->rank1(pos);
- if (rank != 0 && right_child != NULL)
- result = right_child->rankLessThan(symbol, rank-1,l+1,c);
-
-// cout << "recursion to leftchild at l = " << l << ", symbol = " << (uchar)symbol << ", rank0 = " << bitmap->rank0(pos) << ", rank1 = " << bitmap->rank1(pos) << endl;
- // check left child for symbols <= givenSymbol
- if (result != (uint)-1 || left_child == NULL)
- return result;
- return left_child->rankLessThan(symbol, bitmap->rank0(pos)-1);
-}
-
uint wt_node_internal::rankLessThan(uint &symbol, uint pos)
{
uint result = -1;
using std::cout;
using std::endl;
-// cout << "pos = " << pos << ", symbol = " << (uchar)symbol << endl;
+// cout << "pos = " << pos << ", symbol = " << symbol << endl;
if (pos == (uint)-1)
return (uint)-1;
}
}
-
+// Count
uint wt_node_internal::access(uint i, uint j, uint min, uint max, uint l, uint pivot)
{
uint count = 0;
wt_node_internal(uchar * seq, uint n, uint l, wt_coder * c, static_bitsequence_builder * bmb, uint, uint *);
virtual ~wt_node_internal();
virtual uint rank(uint symbol, uint pos, uint level, wt_coder * c);
- virtual uint rankLessThan(uint &symbol, uint pos, uint level, wt_coder * c);
virtual uint rankLessThan(uint &symbol, uint pos);
virtual uint select(uint symbol, uint pos, uint level, wt_coder * c);
virtual uint access(uint pos);
return pos;
}
-uint wt_node_leaf::rankLessThan(uint &symbol, uint pos, uint l, wt_coder * c) {
-// std::cout <<"this-symbol: " << (uchar)this->symbol << ", symbol = " << (uchar)symbol << ", pos = " << pos << std::endl;
- if(symbol > this->symbol) return -1;
- symbol = this->symbol;
- pos++;
- return pos;
-}
-
uint wt_node_leaf::rankLessThan(uint &symbol, uint pos) {
// std::cout <<"this-symbol: " << (uchar)this->symbol << ", symbol = " << (uchar)symbol << ", pos = " << pos << std::endl;
- if (pos == (uint)-1)
+ if (pos == (uint)-1 || symbol < this->symbol)
return -1;
symbol = this->symbol;
pos++;
wt_node_leaf(uint symbol, uint count);
virtual ~wt_node_leaf();
virtual uint rank(uint symbol, uint pos, uint l, wt_coder * c);
- virtual uint rankLessThan(uint &symbol, uint pos, uint level, wt_coder * c);
virtual uint rankLessThan(uint &symbol, uint pos);
virtual uint select(uint symbol, uint pos, uint l, wt_coder * c);
virtual uint access(uint pos);