#include <basics.h>
#include <iostream>
+#include <vector>
#define WVTREE_HDR 2
#define GMR_CHUNK_HDR 3
//assert(0); // Implemented only in static_sequence_wvtree
return -1;
}
-
+
+ // Returns all elements from interval [i, j] such that
+ // their value is in [min, max].
+ virtual vector<int> access(uint i, uint j, uint min, uint max)
+ {
+ //assert(0); // Implemented only in static_sequence_wvtree
+ return vector<int>();
+ }
+
+ // Returns all elements from interval [i, j]
+ virtual vector<int> accessAll(uint i, uint j)
+ {
+ //assert(0); // Implemented only in static_sequence_wvtree
+ return vector<int>();
+ }
+
+ // Counts the number of elements in interval [i,j] such that
+ // their values are in [min,max]
+ virtual uint count(uint i, uint j, uint min, uint max)
+ {
+ //assert(0); // Implemented only in static_sequence_wvtree
+ return 0;
+ }
/** Returns the length of the sequence */
virtual uint length();
return am->unmap(root->access(pos));
}
+vector<int> static_sequence_wvtree::access(uint i, uint j, uint min, uint max)
+{
+ vector<int> resultSet;
+ root->access(resultSet, i, j, am->map(min), am->map(max), c->depth()-1, 0);
+ for (vector<int>::iterator it = resultSet.begin(); it != resultSet.end(); ++it)
+ *it = am->unmap(*it);
+ return resultSet;
+}
+
+vector<int> static_sequence_wvtree::accessAll(uint i, uint j)
+{
+ vector<int> resultSet;
+ if (j > i)
+ return resultSet;
+
+ resultSet.reserve(j-i+1);
+ root->access(resultSet, i, j);
+ for (vector<int>::iterator it = resultSet.begin(); it != resultSet.end(); ++it)
+ *it = am->unmap(*it);
+ return resultSet;
+}
+
+uint static_sequence_wvtree::count(uint i, uint j, uint min, uint max)
+{
+ return root->access(i, j, am->map(min), am->map(max), c->depth()-1, 0);
+}
+
+
uint static_sequence_wvtree::size() {
/*cout << "WT: " << root->size() << endl;
cout << "Coder: " << c->size() << endl;
return root->access(pos, rank);
}
+ // Returns all elements from interval [i, j] such that
+ // their value is in [min, max].
+ virtual vector<int> access(uint i, uint j, uint min, uint max);
+ virtual vector<int> accessAll(uint i, uint j);
+ virtual uint count(uint i, uint j, uint min, uint max);
+
virtual uint count(uint s);
virtual uint size();
virtual bool done(uint symbol, uint l)=0;
/** Returns the size of the coder */
virtual uint size()=0;
+ /** Returns the depth of the tree */
+ virtual uint depth() {
+ return -1; // Implemented in wt_coder_binary
+ }
/** Saves the coder to a file, returns 0 in case of success */
virtual uint save(FILE *fp)=0;
/** Loads a coder from a file, returns NULL in case of error */
virtual ~wt_coder_binary();
virtual bool is_set(uint symbol, uint l);
virtual bool done(uint symbol, uint l);
+ virtual uint depth() { return h; }
virtual uint size();
virtual uint save(FILE *fp);
static wt_coder_binary * load(FILE *fp);
#include <basics.h>
#include <wt_coder.h>
+#include <vector>
#define WT_NODE_NULL_HDR 0
#define WT_NODE_INTERNAL_HDR 2
assert(0); // Implemented only in wt_node_internal
return -1;
}
+ virtual void access(std::vector<int> &result, uint i, uint j, uint min, uint max, uint l, uint pivot)=0;
+ virtual void access(std::vector<int> &result, uint i, uint j)=0;
+ virtual uint access(uint i, uint j, uint min, uint max, uint l, uint pivot)=0;
virtual uint size()=0;
virtual uint save(FILE *fp)=0;
static wt_node * load(FILE *fp);
}
}
+void wt_node_internal::access(vector<int> &result, uint i, uint j, uint min, uint max, uint l, uint pivot)
+{
+ uint symbol = pivot | (1 << l);
+// std::cout << "At l = " << l << ", [" << i << ", " << j << "], [" << min << ", " << max << "], symbol = " << symbol << std::endl;
+
+ if (j < i || max < min)
+ return;
+
+ if (min < symbol)
+ {
+ // Recurse left
+ uint newi = 0;
+ if (i > 0)
+ newi = bitmap->rank0(i - 1);
+ uint newj = bitmap->rank0(j);
+
+ uint newmax = max < symbol - 1 ? max : symbol - 1;
+ if (left_child != NULL && newj > 0)
+ left_child->access(result, newi, newj-1, min, newmax, l-1, pivot);
+ }
+
+ if (max >= symbol)
+ {
+ // Recurse right
+ uint newi = 0;
+ if (i > 0)
+ newi = bitmap->rank1(i - 1);
+ uint newj = bitmap->rank1(j);
+
+ uint newmin = min > symbol ? min : symbol;
+ if (right_child != NULL && newj > 0)
+ right_child->access(result, newi, newj-1, newmin, max, l-1, symbol);
+ }
+}
+
+void wt_node_internal::access(vector<int> &result, uint i, uint j)
+{
+// std::cout << "At l = " << l << ", [" << i << ", " << j << "], [" << min << ", " << max << "], symbol = " << symbol << std::endl;
+
+ if (j < i)
+ return;
+
+ {
+ // Recurse left
+ uint newi = 0;
+ if (i > 0)
+ newi = bitmap->rank0(i - 1);
+ uint newj = bitmap->rank0(j);
+
+ if (left_child != NULL && newj > 0)
+ left_child->access(result, newi, newj-1);
+ }
+
+ {
+ // Recurse right
+ uint newi = 0;
+ if (i > 0)
+ newi = bitmap->rank1(i - 1);
+ uint newj = bitmap->rank1(j);
+
+ if (right_child != NULL && newj > 0)
+ right_child->access(result, newi, newj-1);
+ }
+}
+
+
+uint wt_node_internal::access(uint i, uint j, uint min, uint max, uint l, uint pivot)
+{
+ uint count = 0;
+ uint symbol = pivot | (1 << l);
+// std::cout << "At l = " << l << ", [" << i << ", " << j << "], [" << min << ", " << max << "], symbol = " << symbol << std::endl;
+
+ if (j < i || max < min)
+ return 0;
+
+ if (min < symbol)
+ {
+ // Recurse left
+ uint newi = 0;
+ if (i > 0)
+ newi = bitmap->rank0(i - 1);
+ uint newj = bitmap->rank0(j);
+
+ uint newmax = max < symbol - 1 ? max : symbol - 1;
+ if (left_child != NULL && newj > 0)
+ count += left_child->access(newi, newj-1, min, newmax, l-1, pivot);
+ }
+
+ if (max >= symbol)
+ {
+ // Recurse right
+ uint newi = 0;
+ if (i > 0)
+ newi = bitmap->rank1(i - 1);
+ uint newj = bitmap->rank1(j);
+
+ uint newmin = min > symbol ? min : symbol;
+ if (right_child != NULL && newj > 0)
+ count += right_child->access(newi, newj-1, newmin, max, l-1, symbol);
+ }
+ return count;
+}
+
+
uint wt_node_internal::size() {
uint s = bitmap->size()+sizeof(wt_node_internal);
if(left_child!=NULL)
virtual uint select(uint symbol, uint pos, uint level, wt_coder * c);
virtual uint access(uint pos);
virtual uint access(uint pos, uint &rank);
+ virtual void access(vector<int> &result, uint i, uint j, uint min, uint max, uint l, uint pivot);
+ virtual void access(vector<int> &result, uint i, uint j);
+ virtual uint access(uint i, uint j, uint min, uint max, uint l, uint pivot);
virtual uint size();
virtual uint save(FILE *fp);
static wt_node_internal * load(FILE *fp);
return symbol;
}
+void wt_node_leaf::access(vector<int> &result, uint i, uint j, uint min, uint max, uint l, uint pivot)
+{
+// std::cout << "At l = " << l << ", [" << i << ", " << j << "], [" << min << ", " << max << "], symbol = " << symbol << std::endl;
+
+ if (i <= j && symbol >= min && symbol <= max)
+ result.push_back((int)symbol);
+}
+
+void wt_node_leaf::access(vector<int> &result, uint i, uint j)
+{
+// std::cout << "At l = " << l << ", [" << i << ", " << j << "], [" << min << ", " << max << "], symbol = " << symbol << std::endl;
+
+ if (i <= j)
+ result.push_back((int)symbol);
+}
+
+uint wt_node_leaf::access(uint i, uint j, uint min, uint max, uint l, uint pivot)
+{
+// std::cout << "At l = " << l << ", [" << i << ", " << j << "], [" << min << ", " << max << "], symbol = " << symbol << std::endl;
+
+ if (i <= j && symbol >= min && symbol <= max)
+ return 1;
+ return 0;
+}
+
uint wt_node_leaf::size() {
return sizeof(wt_node_leaf);
}
#include <basics.h>
#include <wt_coder.h>
#include <cassert>
+#include <vector>
/** Class for representing leaves of the wavelet tree.
*
virtual uint rankLessThan(uint &symbol, uint pos);
virtual uint select(uint symbol, uint pos, uint l, wt_coder * c);
virtual uint access(uint pos);
+ virtual void access(std::vector<int> &result, uint i, uint j, uint min, uint max, uint l, uint pivot);
+ virtual void access(std::vector<int> &result, uint i, uint j);
+ virtual uint access(uint i, uint j, uint min, uint max, uint l, uint pivot);
virtual uint size();
virtual uint save(FILE *fp);
static wt_node_leaf * load(FILE *fp);