Create branch library-split
[SXSI/XMLTree.git] / libcds / tests / test_rrr02.cpp
1
2 #include <iostream>
3 #include <sstream>
4 #include <basics.h>
5 #include <static_bitsequence.h>
6
7 using namespace std;
8
9 int main(int argc, char ** argv) {
10         if(argc!=3) {
11                 cout << "usage: " << argv[0] << " <bitmap_file> <sample_rate>" << endl;
12                 return 0;
13         }
14         FILE * fp = fopen(argv[1],"r");
15         if(fp==NULL) {
16                 cout << "Error opening " << argv[1] << endl;
17                 return -1;
18         }
19         uint *bitseq, len;
20         uint l=fread(&len, sizeof(uint), 1, fp);
21         bitseq = new uint[uint_len(len,1)];
22         l+=fread(bitseq, sizeof(uint), uint_len(len,1), fp);
23         fclose(fp);
24
25         static_bitsequence * bs = new static_bitsequence_rrr02(bitseq,len);
26         
27         char * fname = new char[string(argv[1]).length()+10];
28         sprintf(fname,"%s.rrr",argv[1]);
29         
30         fp = fopen(fname,"w");
31         cout << "Save: " << bs->save(fp) << endl;
32         fclose(fp);
33         delete bs;
34
35         fp = fopen(fname,"r");
36         bs = static_bitsequence::load(fp);
37         uint sample_rate;
38         stringstream ss(argv[2]);
39         ss >> sample_rate;
40         ((static_bitsequence_rrr02*)bs)->create_sampling(sample_rate);
41         fclose(fp);
42         delete [] fname;
43
44         cout << "Bitmap length: " << len << " =? " << bs->length() << endl;
45   cout << "Ones: " << bs->count_one() << endl;
46         cout << "Bitmap size: " << bs->size() << endl;
47         /*for(uint i=0;i<64;i++) {
48                 if(i%15==0) cout << " ";
49                 cout << (bs->access(i)?"1":"0");
50         }
51         cout << endl;*/
52         uint ones = 0;
53         for(uint i=0;i<len;i++) {
54                 //cout << "i="<<i<< endl;
55                 if(i%max(1,(bs->length()/100))==0) cout << i/max(1,(bs->length()/100)) << "%" << endl;
56                 if(bitget(bitseq,i)) ones++;
57                 if(bs->access(i) != (bitget(bitseq,i)!=0)) {
58                         cout << "Access error for position " << i << endl;
59                         cout << " got: " << bs->access(i) << " expected: " << (bitget(bitseq,i)!=0) << endl;
60                 }
61                 if(bs->rank1(i) != ones) {
62                         cout << "Rank1 error for position " << i << endl;
63                         cout << " got: " << bs->rank1(i) << " expected: " << ones << endl;
64                 } 
65                 if(bitget(bitseq,i) && bs->select1(ones) != i) {
66                         cout << "Select1 error for position " << i << " ones:" << ones << endl;
67                         cout << " got: " << bs->select1(ones) << " expected: " << i << endl;
68                 }
69                 if(bs->rank0(i) != i+1-ones) {
70                         cout << "Rank0 error for position " << i << endl;
71                         cout << " got: " << bs->rank0(i) << " expected: " << ones << endl;
72                 }
73                 if(!bitget(bitseq,i) && bs->select0(i+1-ones) != i) {
74                         cout << "Select0 error for position " << i << endl;
75                         cout << " got: " << bs->select0(i+1-ones) << " expected: " << i << endl;
76                 }
77         }
78         delete bs;
79   //static_bitsequence_rrr02::delete_E();
80   delete [] bitseq;
81         cout << "Test completed." << endl;
82         return 0;
83 }
84