stress.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:117k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: stress.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:40:47  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: stress.cpp,v 1000.1 2004/06/01 19:40:47 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:  Anatoliy Kuznetsov
  35. *
  36. *
  37. */
  38. //#define BM64OPT
  39. //#define BM_SET_MMX_GUARD
  40. //#define BMSSE2OPT
  41. #define BMCOUNTOPT
  42. #include <ncbi_pch.hpp>
  43. #include <stdio.h>
  44. #include <stdlib.h>
  45. #include <assert.h>
  46. #include <memory.h>
  47. #include <iostream>
  48. #include <time.h>
  49. #include <util/bitset/bm.h>
  50. #include <util/bitset/bmalgo.h>
  51. using namespace bm;
  52. using namespace std;
  53. #include "rlebtv.h"
  54. #include <util/bitset/encoding.h>
  55. #include <limits.h>
  56. #define POOL_SIZE 5000
  57. //#define MEM_POOL
  58. template<class T> T* pool_allocate(T** pool, int& i, size_t n)
  59. {
  60.     return i ? pool[i--] : (T*) ::malloc(n * sizeof(T));
  61. }
  62. inline void* pool_allocate2(void** pool, int& i, size_t n)
  63. {
  64.     return i ? pool[i--] : malloc(n * sizeof(void*));
  65. }
  66. template<class T> void pool_free(T** pool, int& i, T* p)
  67. {
  68.     i < POOL_SIZE ? (free(p),(void*)0) : pool[++i]=p;
  69. }
  70. class pool_block_allocator
  71. {
  72. public:
  73.     static bm::word_t* allocate(size_t n, const void *)
  74.     {
  75.         int *idx = 0;
  76.         bm::word_t** pool = 0;
  77.         switch (n)
  78.         {
  79.         case bm::set_block_size:
  80.             idx = &bit_blocks_idx_;
  81.             pool = free_bit_blocks_;
  82.             break;
  83.         case 64:
  84.             idx = &gap_blocks_idx0_;
  85.             pool = gap_bit_blocks0_;
  86.             break;
  87.         case 128:
  88.             idx = &gap_blocks_idx1_;
  89.             pool = gap_bit_blocks1_;
  90.             break;
  91.         
  92.         case 256:
  93.             idx = &gap_blocks_idx2_;
  94.             pool = gap_bit_blocks2_;
  95.             break;
  96.         case 512:
  97.             idx = &gap_blocks_idx3_;
  98.             pool = gap_bit_blocks3_;
  99.             break;
  100.         default:
  101.             assert(0);
  102.         }
  103.         return pool_allocate(pool, *idx, n);
  104.     }
  105.     static void deallocate(bm::word_t* p, size_t n)
  106.     {
  107.         int *idx = 0;
  108.         bm::word_t** pool = 0;
  109.         switch (n)
  110.         {
  111.         case bm::set_block_size:
  112.             idx = &bit_blocks_idx_;
  113.             pool = free_bit_blocks_;
  114.             break;
  115.         case 64:
  116.             idx = &gap_blocks_idx0_;
  117.             pool = gap_bit_blocks0_;
  118.             break;
  119.         case 128:
  120.             idx = &gap_blocks_idx1_;
  121.             pool = gap_bit_blocks1_;
  122.             break;
  123.         
  124.         case 256:
  125.             idx = &gap_blocks_idx2_;
  126.             pool = gap_bit_blocks2_;
  127.             break;
  128.         case 512:
  129.             idx = &gap_blocks_idx3_;
  130.             pool = gap_bit_blocks3_;
  131.             break;
  132.         default:
  133.             assert(0);
  134.         }
  135.         pool_free(pool, *idx, p);
  136.     }
  137. private:
  138.     static bm::word_t* free_bit_blocks_[];
  139.     static int         bit_blocks_idx_;
  140.     static bm::word_t* gap_bit_blocks0_[];
  141.     static int         gap_blocks_idx0_;
  142.     static bm::word_t* gap_bit_blocks1_[];
  143.     static int         gap_blocks_idx1_;
  144.     static bm::word_t* gap_bit_blocks2_[];
  145.     static int         gap_blocks_idx2_;
  146.     static bm::word_t* gap_bit_blocks3_[];
  147.     static int         gap_blocks_idx3_;
  148. };
  149. bm::word_t* pool_block_allocator::free_bit_blocks_[POOL_SIZE];
  150. int pool_block_allocator::bit_blocks_idx_ = 0;
  151. bm::word_t* pool_block_allocator::gap_bit_blocks0_[POOL_SIZE];
  152. int pool_block_allocator::gap_blocks_idx0_ = 0;
  153. bm::word_t* pool_block_allocator::gap_bit_blocks1_[POOL_SIZE];
  154. int pool_block_allocator::gap_blocks_idx1_ = 0;
  155. bm::word_t* pool_block_allocator::gap_bit_blocks2_[POOL_SIZE];
  156. int pool_block_allocator::gap_blocks_idx2_ = 0;
  157. bm::word_t* pool_block_allocator::gap_bit_blocks3_[POOL_SIZE];
  158. int pool_block_allocator::gap_blocks_idx3_ = 0;
  159. class pool_ptr_allocator
  160. {
  161. public:
  162.     static void* allocate(size_t n, const void *)
  163.     {
  164.         return pool_allocate2(free_ptr_blocks_, ptr_blocks_idx_, n);
  165.     }
  166.     static void deallocate(void* p, size_t)
  167.     {
  168.         pool_free(free_ptr_blocks_, ptr_blocks_idx_, p);
  169.     }
  170. private:
  171.     static void*  free_ptr_blocks_[];
  172.     static int    ptr_blocks_idx_;
  173. };
  174. void* pool_ptr_allocator::free_ptr_blocks_[POOL_SIZE];
  175. int pool_ptr_allocator::ptr_blocks_idx_ = 0;
  176. //#define MEM_DEBUG
  177.  
  178. #ifdef MEM_DEBUG
  179. class dbg_block_allocator
  180. {
  181. public:
  182. static unsigned na_;
  183. static unsigned nf_;
  184.     static bm::word_t* allocate(size_t n, const void *)
  185.     {
  186.         ++na_;
  187.         assert(n);
  188.         bm::word_t* p =
  189.             (bm::word_t*) ::malloc((n+1) * sizeof(bm::word_t));
  190.         *p = n;
  191.         return ++p;
  192.     }
  193.     static void deallocate(bm::word_t* p, size_t n)
  194.     {
  195.         ++nf_;
  196.         --p;
  197.         if(*p != n)
  198.         {
  199.             printf("Block memory deallocation error!n");
  200.             exit(1);
  201.         }
  202.         ::free(p);
  203.     }
  204.     static int balance()
  205.     {
  206.         return nf_ - na_;
  207.     }
  208. };
  209. unsigned dbg_block_allocator::na_ = 0;
  210. unsigned dbg_block_allocator::nf_ = 0;
  211. class dbg_ptr_allocator
  212. {
  213. public:
  214. static unsigned na_;
  215. static unsigned nf_;
  216.     static void* allocate(size_t n, const void *)
  217.     {
  218.         ++na_;
  219.         assert(sizeof(size_t) == sizeof(void*));
  220.         void* p = ::malloc((n+1) * sizeof(void*));
  221.         size_t* s = (size_t*) p;
  222.         *s = n;
  223.         return (void*)++s;
  224.     }
  225.     static void deallocate(void* p, size_t n)
  226.     {
  227.         ++nf_;
  228.         size_t* s = (size_t*) p;
  229.         --s;
  230.         if(*s != n)
  231.         {
  232.             printf("Ptr memory deallocation error!n");
  233.             exit(1);
  234.         }
  235.         ::free(s);
  236.     }
  237.     static int balance()
  238.     {
  239.         return nf_ - na_;
  240.     }
  241. };
  242. unsigned dbg_ptr_allocator::na_ = 0;
  243. unsigned dbg_ptr_allocator::nf_ = 0;
  244. typedef mem_alloc<dbg_block_allocator, dbg_ptr_allocator> dbg_alloc;
  245. typedef bm::bvector<dbg_alloc> bvect;
  246. typedef bm::bvector_mini<dbg_block_allocator> bvect_mini;
  247. #else
  248. #ifdef MEM_POOL
  249. typedef mem_alloc<pool_block_allocator, pool_ptr_allocator> pool_alloc;
  250. typedef bm::bvector<pool_alloc> bvect;
  251. typedef bm::bvector_mini<bm::block_allocator> bvect_mini;
  252. #else
  253. typedef bm::bvector<> bvect;
  254. typedef bm::bvector_mini<bm::block_allocator> bvect_mini;
  255. #endif
  256. #endif
  257. //const unsigned BITVECT_SIZE = 100000000 * 8;
  258. // This this setting program will consume around 150M of RAM
  259. const unsigned BITVECT_SIZE = 100000000 * 2;
  260. const unsigned ITERATIONS = 100000;
  261. const unsigned PROGRESS_PRINT = 2000000;
  262. void CheckVectors(bvect_mini &bvect_min, 
  263.                   bvect      &bvect_full,
  264.                   unsigned size,
  265.                   bool     detailed = false);
  266. unsigned random_minmax(unsigned min, unsigned max)
  267. {
  268.     unsigned r = (rand() << 16) | rand();
  269.     return r % (max-min) + min;
  270. }
  271. void FillSets(bvect_mini* bvect_min, 
  272.               bvect* bvect_full,
  273.               unsigned min, 
  274.               unsigned max,
  275.               unsigned fill_factor)
  276. {
  277.     unsigned i;
  278.     unsigned id;
  279.     //Random filling
  280.     if(fill_factor == 0)
  281.     {
  282.         unsigned n_id = (max - min) / 100;
  283.         printf("random filling : %in", n_id);
  284.         for (i = 0; i < n_id; i++)
  285.         {
  286.             id = random_minmax(min, max);
  287.             bvect_min->set_bit(id);
  288.             bvect_full->set_bit(id);
  289.             if (PROGRESS_PRINT)
  290.             {
  291.                 if ( (i % PROGRESS_PRINT) == 0)
  292.                 {
  293.                     cout << "+" << flush;
  294.                 }
  295.             }
  296.         }
  297.         cout << endl;
  298.     }
  299.     else
  300.     {
  301.         printf("fill_factor random filling : factor = %in", fill_factor);
  302.         for(i = 0; i < fill_factor; i++)
  303.         {
  304.             int k = rand() % 10;
  305.             if (k == 0)
  306.                 k+=2;
  307.             //Calculate start
  308.             unsigned start = min + (max - min) / (fill_factor * k);
  309.             //Randomize start
  310.             start += random_minmax(1, (max - min) / (fill_factor * 10));
  311.             if (start > max)
  312.             {
  313.                 start = min;
  314.             }
  315.             
  316.             //Calculate end 
  317.             unsigned end = start + (max - start) / (fill_factor *2);
  318.             //Randomize end
  319.             end -= random_minmax(1, (max - start) / (fill_factor * 10));
  320.             if (end > max )
  321.             {
  322.                 end = max;
  323.             }
  324.             
  325.             if (fill_factor > 1)
  326.             {
  327.                 for(; start < end;)
  328.                 {
  329.                     int r = rand() % 8;
  330.                     if (r > 7)
  331.                     {
  332.                         int inc = rand() % 3;
  333.                         ++inc;
  334.                         unsigned end2 = start + rand() % 1000;
  335.                         if (end2 > end)
  336.                             end2 = end;
  337.                         while (start < end2)
  338.                         {
  339.                             bvect_min->set_bit(start);
  340.                             bvect_full->set_bit(start);  
  341.                             start += inc;
  342.                         }
  343.                         if (PROGRESS_PRINT)
  344.                         {
  345.                             if ( ( ((i+1)*(end-start))  % PROGRESS_PRINT) == 0)
  346.                             {
  347.                                 cout << "+" << flush;
  348.                             }
  349.                         }
  350.                         continue;
  351.                     }
  352.                     if (r)
  353.                     {
  354.                         bvect_min->set_bit(start);
  355.                         bvect_full->set_bit(start);
  356.                         ++start;
  357.                     }
  358.                     else
  359.                     {
  360.                         start+=r;
  361.                         bvect_min->set_bit(start);
  362.                         bvect_full->set_bit(start);
  363.                     }
  364.                     if (PROGRESS_PRINT)
  365.                     {
  366.                         if ( ( ((i+1)*(end-start))  % PROGRESS_PRINT) == 0)
  367.                         {
  368.                             cout << "+" << flush;
  369.                         }
  370.                     }
  371.                 }
  372.             }
  373.             else
  374.             {
  375.                 int c = rand() % 15;
  376.                 if (c == 0)
  377.                     ++c;
  378.                 for(; start < end; ++start)
  379.                 {
  380.                     bvect_min->set_bit(start);
  381.                     bvect_full->set_bit(start);
  382.                     if (start % c)
  383.                     {
  384.                         start += c;
  385.                     }
  386.                     if (PROGRESS_PRINT)
  387.                     {
  388.                         if ( ( ((i+1)*(end-start))  % PROGRESS_PRINT) == 0)
  389.                         {
  390.                             cout << "+" << flush;
  391.                         }
  392.                     }
  393.                 }
  394.             }
  395.             cout << endl;
  396.         }
  397.     }
  398. }
  399. //
  400. // Interval filling.
  401. // 111........111111........111111..........11111111.......1111111...
  402. //
  403. void FillSetsIntervals(bvect_mini* bvect_min, 
  404.               bvect* bvect_full,
  405.               unsigned min, 
  406.               unsigned max,
  407.               unsigned fill_factor,
  408.               bool set_flag=true)
  409. {
  410.     while(fill_factor==0)
  411.     {
  412.         fill_factor=rand()%10;
  413.     }
  414.     cout << "Intervals filling. Factor=" 
  415.          <<  fill_factor << endl << endl;
  416.     unsigned i, j;
  417.     unsigned factor = 70 * fill_factor;
  418.     for (i = min; i < max; ++i)
  419.     {
  420.         unsigned len, end; 
  421.         do
  422.         {
  423.             len = rand() % factor;
  424.             end = i+len;
  425.             
  426.         } while (end >= max);
  427. /*
  428.         if (set_flag == false)
  429.         {
  430.             cout << "Cleaning: " << i << "-" << end << endl;
  431.         }
  432.         else
  433.         {
  434.             cout << "Add: " << i << "-" << end << endl;
  435.         }
  436. */
  437.         if (i < end)
  438.         {
  439.             bvect_full->set_range(i, end-1, set_flag);
  440.         }
  441.        
  442.         for (j = i; j < end; ++j)
  443.         {
  444.             if (set_flag)
  445.             {
  446.                 bvect_min->set_bit(j);
  447.                 //bvect_full->set_bit(j);
  448.             }
  449.             else
  450.             {
  451.                 bvect_min->clear_bit(j);
  452.                 //bvect_full->clear_bit(j);
  453. /*
  454.         if (g_cnt_check)
  455.         {
  456.             bool b = bvect_full->count_check();
  457.             if(!b)
  458.             {
  459.                 cout << "Count check failed (clear)!" << endl;
  460.                 cout << "bit=" << j << endl;
  461.                 exit(1);
  462.             }
  463.         }
  464. */
  465.             }
  466.                            
  467.         } // j
  468. //cout << "Checking range filling " << from << "-" << to << endl;
  469. //CheckVectors(*bvect_min, *bvect_full, 100000000);
  470.         i = end;
  471.         len = rand() % (factor* 10 * bm::gap_max_bits);
  472.         if (len % 2)
  473.         {
  474.             len *= rand() % (factor * 10);
  475.         }
  476.         i+=len;
  477.         if ( (len % 6) == 0)  
  478.         {
  479. /*
  480. if (set_flag == false)
  481. {
  482.     cout << "Additional Cleaning: " << i << "-" << end << endl;
  483. }
  484. */
  485.             for(unsigned k=0; k < 1000 && i < max; k+=3,i+=3)
  486.             {
  487.                 if (set_flag)
  488.                 {
  489.                     bvect_min->set_bit(i);
  490.                     bvect_full->set_bit(i);            
  491.                 }
  492.                 else
  493.                 {
  494.                     bvect_min->clear_bit(j);
  495.                     bvect_full->clear_bit(j);
  496.                 }
  497.             }
  498.         }
  499.     } // for i
  500. }
  501. void FillSetClearIntervals(bvect_mini* bvect_min, 
  502.               bvect* bvect_full,
  503.               unsigned min, 
  504.               unsigned max,
  505.               unsigned fill_factor)
  506. {
  507.     FillSetsIntervals(bvect_min, bvect_full, min, max, fill_factor, true);
  508.     FillSetsIntervals(bvect_min, bvect_full, min, max, fill_factor, false);
  509. }
  510. void FillSetsRandom(bvect_mini* bvect_min, 
  511.               bvect* bvect_full,
  512.               unsigned min, 
  513.               unsigned max,
  514.               unsigned fill_factor)
  515. {
  516.     unsigned diap = max - min;
  517.     unsigned count;
  518.     switch (fill_factor)
  519.     {
  520.     case 0:
  521.         count = diap / 1000;
  522.         break;
  523.     case 1:
  524.         count = diap / 100;
  525.         break;
  526.     default:
  527.         count = diap / 10;
  528.         break;
  529.     }
  530.     for (unsigned i = 0; i < count; ++i)
  531.     {
  532.         unsigned bn = rand() % count;
  533.         bn += min;
  534.         if (bn > max)
  535.         {
  536.             bn = max;
  537.         }
  538.         bvect_min->set_bit(bn);
  539.         bvect_full->set_bit(bn);   
  540.         
  541.         if ( (i  % PROGRESS_PRINT) == 0)
  542.         {
  543.             cout << "+" << flush;
  544.         }
  545.     }
  546.     cout << "Ok" << endl;
  547. }
  548. //
  549. //  Quasi random filling with choosing randomizing method.
  550. //
  551. //
  552. void FillSetsRandomMethod(bvect_mini* bvect_min, 
  553.                           bvect* bvect_full,
  554.                           unsigned min, 
  555.                           unsigned max,
  556.                           int optimize = 0,
  557.                           int method = -1)
  558. {
  559.     if (method == -1)
  560.     {
  561.         method = rand() % 5;
  562.     }
  563.     unsigned factor;
  564. //method = 4;
  565.     switch (method)
  566.     {
  567.     case 0:
  568.         cout << "Random filling: method - FillSets - factor(0)" << endl;
  569.         FillSets(bvect_min, bvect_full, min, max, 0);
  570.         break;
  571.     case 1:
  572.         cout << "Random filling: method - FillSets - factor(random)" << endl;
  573.         factor = rand()%3;
  574.         FillSets(bvect_min, bvect_full, min, max, factor?factor:1);
  575.         break;
  576.     case 2:
  577.         cout << "Random filling: method - Set-Clear Intervals - factor(random)" << endl;
  578.         factor = rand()%10;
  579.         FillSetClearIntervals(bvect_min, bvect_full, min, max, factor);
  580.         break;
  581.     case 3:
  582.         cout << "Random filling: method - FillRandom - factor(random)" << endl;
  583.         factor = rand()%3;
  584.         FillSetsRandom(bvect_min, bvect_full, min, max, factor?factor:1);
  585.         break;
  586.     default:
  587.         cout << "Random filling: method - Set Intervals - factor(random)" << endl;
  588.         factor = rand()%10;
  589.         FillSetsIntervals(bvect_min, bvect_full, min, max, factor);
  590.         break;
  591.     } // switch
  592.     if (optimize && (method <= 1))
  593.     {
  594.         cout << "Vector optimization..." << flush;
  595.         bvect_full->optimize();
  596.         cout << "OK" << endl;
  597.     }
  598. }
  599. void print_mv(const bvect_mini &bvect_min, unsigned size)
  600. {
  601.     unsigned i;
  602.     for (i = 0; i < size; ++i)
  603.     {
  604.         bool bflag = bvect_min.is_bit_true(i) != 0; 
  605.         if (bflag)
  606.             printf("1");
  607.         else
  608.             printf("0");
  609.         if ((i % 31) == 0 && (i != 0))
  610.             printf(".");
  611.     }
  612.     printf("n");
  613. }
  614. void print_gap(const gap_vector& gap_vect, unsigned size)
  615. {
  616.     const gap_word_t *buf = gap_vect.get_buf();
  617.     unsigned len = gap_length(buf);
  618.     printf("[%i:]", *buf++ & 1);
  619.     for (unsigned i = 1; i < len; ++i)
  620.     {
  621.         printf("%i,", *buf++);
  622.     }
  623.     printf("n");
  624. }
  625. void CheckGAPMin(const gap_vector& gapv, const bvect_mini& bvect_min, unsigned len)
  626. {
  627.     for (unsigned i = 0; i < len; ++i)
  628.     {
  629.         int bit1 = (gapv.is_bit_true(i) == 1);
  630.         int bit2 = (bvect_min.is_bit_true(i) != 0);
  631.         if(bit1 != bit2)
  632.         {
  633.            cout << "Bit comparison failed. " << "Bit N=" << i << endl;
  634.            assert(0);
  635.            exit(1);
  636.         }
  637.     }
  638. }
  639. void CheckIntervals(const bvect& bv, unsigned max_bit)
  640. {
  641.     unsigned cnt0 = count_intervals(bv);
  642.     unsigned cnt1 = 1;
  643.     bool bit_prev = bv.test(0);
  644.     for (unsigned i = 1; i < max_bit; ++i)
  645.     {
  646.         bool bit = bv.test(i);
  647.         cnt1 += bit_prev ^ bit;
  648.         bit_prev = bit;
  649.     }
  650.     if (cnt0 != cnt1)
  651.     {
  652.         cout << "CheckIntervals error. " << "bm count=" << cnt0
  653.              << " Control = " << cnt1 << endl;
  654.         exit(1);
  655.     }
  656. }
  657. template<class T> void CheckCountRange(const T& vect, 
  658.                                        unsigned left, 
  659.                                        unsigned right,
  660.                                        unsigned* block_count_arr=0)
  661. {
  662.     unsigned cnt1 = vect.count_range(left, right, block_count_arr);
  663.     unsigned cnt2 = 0;
  664. //cout << endl;
  665.     for (unsigned i = left; i <= right; ++i)
  666.     {
  667.         if (vect.test(i))
  668.         {
  669. //            cout << i << " " << flush;
  670.             ++cnt2;
  671.         }
  672.     }
  673. //cout << endl;
  674.     if (cnt1 != cnt2)
  675.     {
  676.         cout << "Bitcount range failed!" << "left=" << left 
  677.              << " right=" << right << endl
  678.              << "count_range()=" << cnt1 
  679.              << " check=" << cnt2;
  680.         exit(1);
  681.     }
  682. }
  683. unsigned BitCountChange(unsigned word)
  684. {
  685.     unsigned count = 1;
  686.     unsigned bit_prev = word & 1;
  687.     word >>= 1;
  688.     for (unsigned i = 1; i < 32; ++i)
  689.     {
  690.         unsigned bit = word & 1;
  691.         count += bit ^ bit_prev;
  692.         bit_prev = bit;
  693.         word >>= 1;
  694.     }
  695.     return count;
  696. }
  697. void DetailedCheckVectors(const bvect_mini &bvect_min, 
  698.                           const bvect      &bvect_full,
  699.                           unsigned size)
  700. {
  701.     cout << "Detailed check" << endl;
  702.     //bvect_full.stat();
  703.     // detailed bit by bit comparison. Paranoia check.
  704.     unsigned i;
  705.     for (i = 0; i < size; ++i)
  706.     {
  707.         bool bv_m_flag = bvect_min.is_bit_true(i) != 0; 
  708.         bool bv_f_flag = bvect_full.get_bit(i) != 0;
  709.         if (bv_m_flag != bv_f_flag)
  710.         {
  711.             printf("Bit %u is non conformant. vect_min=%i vect_full=%in",
  712.                 i, (int)bv_m_flag, (int)bv_f_flag);
  713.             cout << "Non-conformant block number is: " << unsigned(i >>  bm::set_block_shift) << endl;
  714. //            throw 110;
  715.             exit(1);
  716.         }
  717.         if (PROGRESS_PRINT)
  718.         {
  719.             if ( (i % PROGRESS_PRINT) == 0)
  720.             {
  721.                 printf(".");
  722.             }
  723.         }
  724.              
  725.     }
  726.     
  727.     printf("n detailed check ok.n");
  728. }
  729. // vectors comparison check
  730. void CheckVectors(bvect_mini &bvect_min, 
  731.                   bvect      &bvect_full,
  732.                   unsigned size,
  733.                   bool     detailed)
  734. {
  735.     cout << "nVectors checking...bits to compare = " << size << endl;
  736.     cout << "Bitcount summary : " << endl;
  737.     unsigned min_count = bvect_min.bit_count();
  738.     cout << "minvector count = " << min_count << endl;
  739.     unsigned count = bvect_full.count();
  740.     unsigned full_count = bvect_full.recalc_count();
  741.     cout << "fullvector re-count = " << full_count << endl;
  742.     
  743.     if (min_count != full_count)
  744.     {
  745.         cout << "fullvector count = " << count << endl;
  746.         cout << "Count comparison failed !!!!" << endl;
  747.         bvect_full.stat();
  748.         DetailedCheckVectors(bvect_min, bvect_full, size);
  749.         exit(1);  
  750.     } 
  751.     if (full_count)
  752.     {
  753.         bool any = bvect_full.any();
  754.         if (!any)
  755.         {
  756.             cout << "Anycheck failed!" << endl;
  757.             exit(1);
  758.         }
  759.     }
  760.     // get_next comparison
  761.     cout << "Positive bits comparison..." << flush;
  762.     unsigned nb_min = bvect_min.get_first();
  763.     unsigned nb_ful = bvect_full.get_first();
  764.     bvect::counted_enumerator en = bvect_full.first();
  765.     unsigned nb_en = *en;
  766.     if (nb_min != nb_ful)
  767.     {
  768.          cout << "!!!! First bit comparison failed. Full id = " 
  769.               << nb_ful << " Min id = " << nb_min 
  770.               << endl;
  771.          bool bit_f = bvect_full.get_bit(nb_ful);
  772.          cout << "Full vector'd bit #" << nb_ful << "is:" 
  773.               << bit_f << endl;
  774.          bool bit_m = (bvect_min.is_bit_true(nb_min) == 1);
  775.          cout << "Min vector'd bit #" << nb_min << "is:" 
  776.               << bit_m << endl;
  777.          bvect_full.stat();
  778.          DetailedCheckVectors(bvect_min, bvect_full, size);
  779.          exit(1);
  780.     }
  781.     if (full_count)
  782.     {
  783.        unsigned bit_count = 1;
  784.        unsigned en_prev = nb_en;
  785.        do
  786.        {
  787.            nb_min = bvect_min.get_next(nb_min);
  788.            if (nb_min == 0)
  789.            {
  790.                break;
  791.            }
  792.            en_prev = nb_en;
  793.            ++en;
  794.            nb_en = *en;
  795. //           nb_en = bvect_full.get_next(nb_en);
  796.            ++bit_count;
  797.            if (nb_en != nb_min)
  798.            {
  799.                nb_ful = bvect_full.get_next(en_prev);
  800.                cout << "!!!!! next bit comparison failed. Full id = " 
  801.                     << nb_ful << " Min id = " << nb_min 
  802.                     << " Enumerator = " << nb_en
  803.                     << endl;
  804.      //          bvect_full.stat();
  805.      //          DetailedCheckVectors(bvect_min, bvect_full, size);
  806.                exit(1);
  807.            }
  808.             if ( (bit_count % PROGRESS_PRINT) == 0)
  809.            {
  810.                 cout << "." << flush;
  811.             }
  812.        } while (en.valid());
  813.        if (bit_count != min_count)
  814.        {
  815.            cout << " Bit count failed."  
  816.                 << " min = " << min_count 
  817.                 << " bit = " << bit_count 
  818.                 << endl;
  819.            exit(1);
  820.        }
  821.     }
  822.     cout << "OK" << endl;
  823.     return;
  824.     
  825. }
  826. void ClearAllTest()
  827. {
  828.     bvect     bvect_full;
  829.     for (int i = 0; i < 100000; ++i)
  830.     {
  831.         bvect_full.set_bit(i);
  832.     }
  833.     bvect_full.optimize();
  834.     bvect_full.clear();
  835.     bvect_full.stat();
  836.     int count = bvect_full.count();
  837.     assert(count == 0);
  838.     bvect_full.stat();
  839. }
  840. void WordCmpTest()
  841. {
  842.     cout << "---------------------------- WordCmp test" << endl;
  843.     for (int i = 0; i < 10000000; ++i)
  844.     {
  845.         unsigned w1 = rand();
  846.         unsigned w2 = rand();
  847.         int res = wordcmp0(w1, w2);
  848.         int res2 = wordcmp(w1, w2);
  849.         if (res != res2)
  850.         {
  851.             printf("WordCmp failed !n");
  852.             exit(1);
  853.         }
  854.         res = wordcmp0((unsigned)0U, (unsigned)w2);
  855.         res2 = wordcmp((unsigned)0U, (unsigned)w2);
  856.         if (res != res2)
  857.         {
  858.             printf("WordCmp 0 test failed !n");
  859.             exit(1);
  860.         }
  861.         res = wordcmp0((unsigned)~0U, (unsigned)w2);
  862.         res2 = wordcmp((unsigned)~0U, (unsigned)w2);
  863.         if (res != res2)
  864.         {
  865.             printf("WordCmp ~0 test failed !n");
  866.             exit(1);
  867.         }
  868.         res = wordcmp0((unsigned)w2, (unsigned)0);
  869.         res2 = wordcmp((unsigned)w2, (unsigned)0);
  870.         if (res != res2)
  871.         {
  872.             printf("WordCmp 0-2 test failed !n");
  873.             exit(1);
  874.         }
  875.     }
  876.     cout << "Ok." << endl;
  877. }
  878. void BasicFunctionalityTest()
  879. {
  880.     cout << "---------------------------- Basic functinality test" << endl;
  881.     assert(ITERATIONS < BITVECT_SIZE);
  882.     bvect_mini     bvect_min(BITVECT_SIZE);
  883.     bvect          bvect_full;
  884.     bvect          bvect_full1;
  885.     printf("nBasic functionality test.n");
  886.     
  887.     // filling vectors with regular values
  888.     unsigned i;
  889.     for (i = 0; i < ITERATIONS; ++i)
  890.     {
  891.         bvect_min.set_bit(i);
  892.         bvect_full.set_bit(i);
  893.     }
  894.     
  895.     bvect_full1.set_range(0, ITERATIONS-1);
  896.     
  897.     CheckCountRange(bvect_full, 0, ITERATIONS);
  898.     CheckCountRange(bvect_full, 10, ITERATIONS+10);
  899.     if (bvect_full1 != bvect_full)
  900.     {
  901.         cout << "set_range failed!" << endl;
  902.         bvect_full1.stat();
  903.         exit(1);
  904.     }
  905.     bvect_full.stat();
  906.     bvect_full1.stat();
  907.     // checking the results
  908.     unsigned count_min = 0;
  909.     for (i = 0; i < ITERATIONS; ++i)
  910.     {
  911.         if (bvect_min.is_bit_true(i))
  912.             ++count_min;
  913.     }
  914.     
  915.     unsigned count_full = bvect_full.count();
  916.     if (count_min == count_full)
  917.     {
  918.         printf("simple count test ok.n");
  919.     }
  920.     else
  921.     {
  922.         printf("simple count test failed count_min = %i  count_full = %in", 
  923.                count_min, count_full);
  924.         exit(1);
  925.     }
  926.     // detailed vectors verification
  927.     CheckVectors(bvect_min, bvect_full, ITERATIONS);
  928.     // now clearning
  929.     for (i = 0; i < ITERATIONS; i+=2)
  930.     {
  931.         bvect_min.clear_bit(i);
  932.         bvect_full.clear_bit(i);
  933.         bvect_full1.set_range(i, i, false);
  934.     }
  935.     CheckVectors(bvect_min, bvect_full, ITERATIONS);
  936.     CheckVectors(bvect_min, bvect_full1, ITERATIONS);
  937.     for (i = 0; i < ITERATIONS; ++i)
  938.     {
  939.         bvect_min.clear_bit(i);
  940.     }
  941.     bvect_full.clear();
  942.     CheckVectors(bvect_min, bvect_full, ITERATIONS);
  943.     cout << "Random step filling" << endl;
  944.     for (i = rand()%10; i < ITERATIONS; i+=rand()%10)
  945.     {
  946.         bvect_min.clear_bit(i);
  947.         bvect_full.clear_bit(i);
  948.     }
  949.     
  950.     CheckVectors(bvect_min, bvect_full, ITERATIONS);
  951.     bvect bv1;
  952.     bvect bv2;
  953.     bv1[10] = true;
  954.     bv1[1000] = true;
  955.     bv2[200] = bv2[700] = bv2[500] = true;
  956.     bv1.swap(bv2);
  957.     if (bv1.count() != 3)
  958.     {
  959.         cout << "Swap test failed!" << endl;
  960.         exit(1);
  961.     }
  962.     if (bv2.count() != 2)
  963.     {
  964.         cout << "Swap test failed!" << endl;
  965.         exit(1);
  966.     }
  967. }
  968. void SimpleRandomFillTest()
  969. {
  970.     assert(ITERATIONS < BITVECT_SIZE);
  971.     cout << "-------------------------- SimpleRandomFillTest" << endl;
  972.     {
  973.     printf("Simple random fill test 1.");
  974.     bvect_mini   bvect_min(BITVECT_SIZE);
  975.     bvect      bvect_full;
  976.     bvect_full.set_new_blocks_strat(bm::BM_BIT);
  977.     unsigned iter = ITERATIONS / 5;
  978.     printf("nSimple Random fill test ITERATIONS = %in", iter);
  979.     bvect_min.set_bit(0);
  980.     bvect_full.set_bit(0);
  981.     unsigned i;
  982.     for (i = 0; i < iter; ++i)
  983.     {
  984.         unsigned num = ::rand() % iter;
  985.         bvect_min.set_bit(num);
  986.         bvect_full.set_bit(num);
  987.         if ((i % 1000) == 0) cout << "." << flush;
  988.         CheckCountRange(bvect_full, 0, num);
  989.         CheckCountRange(bvect_full, num, num+iter);
  990.     }
  991.     CheckVectors(bvect_min, bvect_full, iter);
  992.     CheckCountRange(bvect_full, 0, iter);
  993.     printf("Simple random fill test 2.");
  994.     for(i = 0; i < iter; ++i)
  995.     {
  996.         unsigned num = ::rand() % iter;
  997.         bvect_min.clear_bit(num);
  998.         bvect_full.clear_bit(num);
  999.     }
  1000.     CheckVectors(bvect_min, bvect_full, iter);
  1001.     }
  1002.     {
  1003.     printf("nSimple random fill test 3.n");
  1004.     bvect_mini   bvect_min(BITVECT_SIZE);
  1005.     bvect      bvect_full(bm::BM_GAP);
  1006.     unsigned iter = ITERATIONS;
  1007.     printf("nSimple Random fill test ITERATIONS = %in", iter);
  1008.     unsigned i;
  1009.     for(i = 0; i < iter; ++i)
  1010.     {
  1011.         unsigned num = ::rand() % iter;
  1012.         bvect_min.set_bit(num);
  1013.         bvect_full.set_bit(num);
  1014.         CheckCountRange(bvect_full, 0, 65535);
  1015.         CheckCountRange(bvect_full, 0, num);
  1016.         CheckCountRange(bvect_full, num, num+iter);
  1017.         if ((i % 1000) == 0) cout << "." << flush;
  1018.     }
  1019.     CheckVectors(bvect_min, bvect_full, iter);
  1020.     printf("Simple random fill test 4.");
  1021.     for(i = 0; i < iter; ++i)
  1022.     {
  1023.         unsigned num = ::rand() % iter;
  1024.         bvect_min.clear_bit(num);
  1025.         bvect_full.clear_bit(num);
  1026.         CheckCountRange(bvect_full, 0, num);
  1027.         CheckCountRange(bvect_full, num, num+iter);
  1028.         if ((i % 1000) == 0) cout << "." << flush;
  1029.     }
  1030.     CheckVectors(bvect_min, bvect_full, iter);
  1031.     CheckCountRange(bvect_full, 0, iter);
  1032.     }
  1033. }
  1034. void RangeRandomFillTest()
  1035. {
  1036.     assert(ITERATIONS < BITVECT_SIZE);
  1037.     cout << "----------------------------------- RangeRandomFillTest" << endl;
  1038.     {
  1039.     bvect_mini   bvect_min(BITVECT_SIZE);
  1040.     bvect     bvect_full;
  1041.     printf("Range Random fill testn");
  1042.     unsigned min = BITVECT_SIZE / 2;
  1043.     unsigned max = BITVECT_SIZE / 2 + ITERATIONS;
  1044.     if (max > BITVECT_SIZE) 
  1045.         max = BITVECT_SIZE - 1;
  1046.     FillSets(&bvect_min, &bvect_full, min, max, 0);
  1047.     CheckVectors(bvect_min, bvect_full, BITVECT_SIZE);
  1048.     CheckCountRange(bvect_full, min, max);
  1049.     }
  1050.     
  1051.     {
  1052.     bvect_mini   bvect_min(BITVECT_SIZE);
  1053.     bvect     bvect_full;
  1054.     printf("Range Random fill testn");
  1055.     unsigned min = BITVECT_SIZE / 2;
  1056.     unsigned max = BITVECT_SIZE / 2 + ITERATIONS;
  1057.     if (max > BITVECT_SIZE) 
  1058.         max = BITVECT_SIZE - 1;
  1059.     FillSetsIntervals(&bvect_min, &bvect_full, min, max, 4);
  1060.     CheckVectors(bvect_min, bvect_full, BITVECT_SIZE);
  1061.     CheckCountRange(bvect_full, min, max);
  1062.     }
  1063.     
  1064. }
  1065. void AndOperationsTest()
  1066. {
  1067.     assert(ITERATIONS < BITVECT_SIZE);
  1068.     cout << "----------------------------------- AndOperationTest" << endl;
  1069.     {
  1070.     bvect_mini   bvect_min1(256);
  1071.     bvect_mini   bvect_min2(256);
  1072.     bvect        bvect_full1;
  1073.     bvect        bvect_full2;
  1074.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1075.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1076.     printf("AND testn");
  1077.     bvect_min1.set_bit(1);
  1078.     bvect_min1.set_bit(12);
  1079.     bvect_min1.set_bit(13);
  1080.     bvect_min2.set_bit(12);
  1081.     bvect_min2.set_bit(13);
  1082.     bvect_min1.combine_and(bvect_min2);
  1083.     bvect_full1.set_bit(1);
  1084.     bvect_full1.set_bit(12);
  1085.     bvect_full1.set_bit(13);
  1086.     bvect_full2.set_bit(12);
  1087.     bvect_full2.set_bit(13);
  1088.     bm::id_t predicted_count = bm::count_and(bvect_full1, bvect_full2);
  1089.     bvect_full1.bit_and(bvect_full2);
  1090.     bm::id_t count = bvect_full1.count();
  1091.     if (count != predicted_count)
  1092.     {
  1093.         cout << "Predicted count error!" << endl;
  1094.         exit(1);
  1095.     }
  1096.     CheckVectors(bvect_min1, bvect_full1, 256);
  1097.     CheckCountRange(bvect_full1, 0, 256);
  1098.     }
  1099.     {
  1100.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1101.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1102.     bvect        bvect_full1;
  1103.     bvect        bvect_full2;
  1104.     printf("AND test stage 1.n");
  1105.     for (int i = 0; i < 112; ++i)
  1106.     {
  1107.         bvect_min1.set_bit(i);
  1108.         bvect_full1.set_bit(i);
  1109.         bvect_min2.set_bit(i);
  1110.         bvect_full2.set_bit(i);
  1111.     }
  1112.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE/10+10);
  1113.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE/10+10);
  1114. //    FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/7, 0);
  1115. //    FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/7, 0);
  1116.     bvect_min1.combine_and(bvect_min2);
  1117.     bm::id_t predicted_count = bm::count_and(bvect_full1,bvect_full2);
  1118.     bvect_full1.bit_and(bvect_full2);
  1119.     bm::id_t count = bvect_full1.count();
  1120.     if (count != predicted_count)
  1121.     {
  1122.         cout << "Predicted count error!" << endl;
  1123.         exit(1);
  1124.     }
  1125.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE/10+10);
  1126.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE/10+10);
  1127.     }
  1128.     {
  1129.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1130.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1131.     bvect        bvect_full1;
  1132.     bvect        bvect_full2;
  1133.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1134.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1135.     printf("AND test stage 2.n");
  1136.     FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/7, 0);
  1137.     FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/7, 0);
  1138.     bm::id_t predicted_count = bm::count_and(bvect_full1,bvect_full2);
  1139.     bvect_min1.combine_and(bvect_min2);
  1140.     bvect_full1.bit_and(bvect_full2);
  1141.     bm::id_t count = bvect_full1.count();
  1142.     if (count != predicted_count)
  1143.     {
  1144.         cout << "Predicted count error!" << endl;
  1145.         bvect_full1.stat();
  1146.         exit(1);
  1147.     }
  1148.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE/10+10);
  1149.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE/10+10);
  1150.     }
  1151.     {
  1152.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1153.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1154.     bvect        bvect_full1;
  1155.     bvect        bvect_full2;
  1156.     bvect_full1.set_new_blocks_strat(bm::BM_BIT);
  1157.     bvect_full2.set_new_blocks_strat(bm::BM_BIT);
  1158.     cout << "------------------------------" << endl;
  1159.     printf("AND test stage 3.n");
  1160.     FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/5, 2);
  1161.     FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/5, 2);
  1162.     bvect_min1.combine_and(bvect_min2);
  1163.     bm::id_t predicted_count = bm::count_and(bvect_full1, bvect_full2);
  1164.     bvect_full1.bit_and(bvect_full2);
  1165.     bm::id_t count = bvect_full1.count();
  1166.     if (count != predicted_count)
  1167.     {
  1168.         cout << "Predicted count error!" << endl;
  1169.         exit(1);
  1170.     }
  1171.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1172.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE);
  1173.     bvect_full1.optimize();
  1174.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1175.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE);
  1176.     CheckCountRange(bvect_full1, BITVECT_SIZE/2, BITVECT_SIZE);
  1177.     }
  1178. }
  1179. void OrOperationsTest()
  1180. {
  1181.     assert(ITERATIONS < BITVECT_SIZE);
  1182.     cout << "----------------------------------- OrOperationTest" << endl;
  1183.     {
  1184.     bvect_mini   bvect_min1(256);
  1185.     bvect_mini   bvect_min2(256);
  1186.     bvect        bvect_full1;
  1187.     bvect        bvect_full2;
  1188.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1189.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1190.     printf("OR testn");
  1191.     bvect_min1.set_bit(1);
  1192.     bvect_min1.set_bit(12);
  1193.     bvect_min1.set_bit(13);
  1194.     bvect_min2.set_bit(12);
  1195.     bvect_min2.set_bit(13);
  1196.     bvect_min1.combine_or(bvect_min2);
  1197.     bvect_full1.set_bit(1);
  1198.     bvect_full1.set_bit(12);
  1199.     bvect_full1.set_bit(13);
  1200.     bvect_full2.set_bit(12);
  1201.     bvect_full2.set_bit(13);
  1202.     
  1203.     bm::id_t predicted_count = bm::count_or(bvect_full1, bvect_full2);    
  1204.     bvect_full1.bit_or(bvect_full2);
  1205.     bm::id_t count = bvect_full1.count();
  1206.     if (count != predicted_count)
  1207.     {
  1208.         cout << "Predicted count error!" << endl;
  1209.         cout << predicted_count << " " << count << endl;
  1210.         bvect_full1.stat();
  1211.         exit(1);
  1212.     }
  1213.     CheckVectors(bvect_min1, bvect_full1, 256);
  1214.     CheckCountRange(bvect_full1, 0, 256);
  1215.     CheckCountRange(bvect_full1, 128, 256);
  1216.     }
  1217.     {
  1218.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1219.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1220.     bvect        bvect_full1;
  1221.     bvect        bvect_full2;
  1222.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1223.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1224.     printf("OR test stage 2.n");
  1225.     FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/7, 0);
  1226.     FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/7, 0);
  1227.     bvect_min1.combine_or(bvect_min2);
  1228.     bm::id_t predicted_count = bm::count_or(bvect_full1, bvect_full2);    
  1229.     bvect_full1.bit_or(bvect_full2);
  1230.     bm::id_t count = bvect_full1.count();
  1231.     if (count != predicted_count)
  1232.     {
  1233.         cout << "Predicted count error!" << endl;
  1234.         exit(1);
  1235.     }
  1236.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE/10+10);
  1237.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE/10+10);
  1238.     }
  1239.     {
  1240.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1241.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1242.     bvect        bvect_full1;
  1243.     bvect        bvect_full2;
  1244.     bvect_full1.set_new_blocks_strat(bm::BM_BIT);
  1245.     bvect_full2.set_new_blocks_strat(bm::BM_BIT);
  1246.     cout << "------------------------------" << endl;
  1247.     printf("OR test stage 3.n");
  1248.     FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/5, 2);
  1249.     FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/5, 2);
  1250.     bvect_min1.combine_or(bvect_min2);
  1251.     
  1252.     bm::id_t predicted_count = bm::count_or(bvect_full1, bvect_full2);    
  1253.     bvect_full1.bit_or(bvect_full2);
  1254.     bm::id_t count = bvect_full1.count();
  1255.     if (count != predicted_count)
  1256.     {
  1257.         cout << "Predicted count error!" << endl;
  1258.         exit(1);
  1259.     }
  1260.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1261.     bvect_full1.optimize();
  1262.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1263.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE);
  1264.     }
  1265.     
  1266.     cout << "Testing combine_or" << endl;
  1267.     
  1268.     {
  1269.     
  1270.     bvect        bvect_full1;
  1271.     bvect        bvect_full2;
  1272.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1273.     
  1274.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1275.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1276.     unsigned ids[10000];
  1277.     unsigned to_add = 10000;
  1278.     
  1279.     unsigned bn = 0;
  1280.     for (unsigned i = 0; i < to_add; ++i)
  1281.     {
  1282.         ids[i] = bn;
  1283.         bvect_full2.set(bn);
  1284.         bvect_min1.set_bit(bn);
  1285.         bn += 15;
  1286.     }
  1287.     
  1288.     unsigned* first = ids;
  1289.     unsigned* last = ids + to_add;
  1290.     
  1291.     bm::combine_or(bvect_full1, first, last);
  1292.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1293.     
  1294.     bm::combine_or(bvect_full1, first, last);
  1295.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1296.     
  1297.     }
  1298.     
  1299.     
  1300.     {
  1301.     unsigned ids[] = {0, 65536, 65535, 65535*3, 65535*2, 10};
  1302.     unsigned to_add = sizeof(ids)/sizeof(unsigned);
  1303.     bvect        bvect_full1;
  1304.     bvect        bvect_full2;    
  1305.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1306.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1307.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1308.     
  1309.     unsigned bn = 0;
  1310.     for (unsigned i = 0; i < to_add; ++i)
  1311.     {
  1312.         ids[i] = bn;
  1313.         bvect_full2.set(bn);
  1314.         bvect_min1.set_bit(bn);
  1315.         bn += 15;
  1316.     }
  1317.     
  1318.     unsigned* first = ids;
  1319.     unsigned* last = ids + to_add;
  1320.     
  1321.     bm::combine_or(bvect_full1, first, last);
  1322.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1323.     bm::combine_or(bvect_full1, first, last);
  1324.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);    
  1325.     }
  1326.     
  1327. }
  1328. void SubOperationsTest()
  1329. {
  1330.     assert(ITERATIONS < BITVECT_SIZE);
  1331.     cout << "----------------------------------- SubOperationTest" << endl;
  1332.     {
  1333.     bvect_mini   bvect_min1(256);
  1334.     bvect_mini   bvect_min2(256);
  1335.     bvect        bvect_full1;
  1336.     bvect        bvect_full2;
  1337.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1338.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1339.     printf("SUB testn");
  1340.     bvect_min1.set_bit(1);
  1341.     bvect_min1.set_bit(12);
  1342.     bvect_min1.set_bit(13);
  1343.     bvect_min2.set_bit(12);
  1344.     bvect_min2.set_bit(13);
  1345.     bvect_min1.combine_sub(bvect_min2);
  1346.     bvect_full1.set_bit(1);
  1347.     bvect_full1.set_bit(12);
  1348.     bvect_full1.set_bit(13);
  1349.     bvect_full2.set_bit(12);
  1350.     bvect_full2.set_bit(13);
  1351.     bm::id_t predicted_count = bm::count_sub(bvect_full1, bvect_full2);
  1352.     bvect_full1.bit_sub(bvect_full2);
  1353.     
  1354.     bm::id_t count = bvect_full1.count();
  1355.     if (count != predicted_count)
  1356.     {
  1357.         cout << "Predicted count error!" << endl;
  1358.         exit(1);
  1359.     }
  1360.     CheckVectors(bvect_min1, bvect_full1, 256);
  1361.     CheckCountRange(bvect_full1, 0, 256);
  1362.     }
  1363.     {
  1364.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1365.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1366.     bvect        bvect_full1;
  1367.     bvect        bvect_full2;
  1368.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1369.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1370.     printf("SUB test stage 2.n");
  1371.     FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/7, 0);
  1372.     FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/7, 0);
  1373.     bvect_min1.combine_sub(bvect_min2);
  1374.     bm::id_t predicted_count = bm::count_sub(bvect_full1, bvect_full2);
  1375.     bvect_full1.bit_sub(bvect_full2);
  1376.     
  1377.     bm::id_t count = bvect_full1.count();
  1378.     if (count != predicted_count)
  1379.     {
  1380.         cout << "Predicted count error!" << endl;
  1381.         cout << predicted_count << " " << count << endl;
  1382. bvect_full1.stat();    
  1383.         
  1384.         exit(1);
  1385.     }
  1386.     
  1387.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE/10+10);
  1388.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE/10+10);
  1389.     }
  1390.     {
  1391.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1392.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1393.     bvect        bvect_full1;
  1394.     bvect        bvect_full2;
  1395.     bvect_full1.set_new_blocks_strat(bm::BM_BIT);
  1396.     bvect_full2.set_new_blocks_strat(bm::BM_BIT);
  1397.     cout << "------------------------------" << endl;
  1398.     printf("SUB test stage 3.n");
  1399.     FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/5, 2);
  1400.     FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/5, 2);
  1401.     bvect_min1.combine_sub(bvect_min2);
  1402.     
  1403.     bm::id_t predicted_count = bm::count_sub(bvect_full1, bvect_full2);
  1404.     bvect_full1.bit_sub(bvect_full2);
  1405.     bm::id_t count = bvect_full1.count();
  1406.     if (count != predicted_count)
  1407.     {
  1408.         cout << "Predicted count error!" << endl;
  1409.         exit(1);
  1410.     }
  1411.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1412.     bvect_full1.optimize();
  1413.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1414.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE);
  1415.     }
  1416. }
  1417. void XorOperationsTest()
  1418. {
  1419.     assert(ITERATIONS < BITVECT_SIZE);
  1420.     cout << "----------------------------------- XorOperationTest" << endl;
  1421.     {
  1422.     bvect_mini   bvect_min1(256);
  1423.     bvect_mini   bvect_min2(256);
  1424.     bvect        bvect_full1;
  1425.     bvect        bvect_full2;
  1426.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1427.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1428.     printf("XOR testn");
  1429.     bvect_min1.set_bit(1);
  1430.     bvect_min1.set_bit(12);
  1431.     bvect_min1.set_bit(13);
  1432.     bvect_min2.set_bit(12);
  1433.     bvect_min2.set_bit(13);
  1434.     bvect_min1.combine_xor(bvect_min2);
  1435.     bvect_full1.set_bit(1);
  1436.     bvect_full1.set_bit(12);
  1437.     bvect_full1.set_bit(13);
  1438.     bvect_full2.set_bit(12);
  1439.     bvect_full2.set_bit(13);
  1440.     bm::id_t predicted_count = bm::count_xor(bvect_full1, bvect_full2);
  1441.     bvect_full1.bit_xor(bvect_full2);
  1442.     bm::id_t count = bvect_full1.count();
  1443.     if (count != predicted_count)
  1444.     {
  1445.         cout << "1.Predicted count error!" << endl;
  1446.         exit(1);
  1447.     }
  1448.     CheckVectors(bvect_min1, bvect_full1, 256);
  1449.     CheckCountRange(bvect_full1, 0, 256);
  1450.     CheckCountRange(bvect_full1, 128, 256);
  1451.     }
  1452.     {
  1453.         bvect  bvect1;
  1454.         bvect_mini  bvect_min1(BITVECT_SIZE);
  1455.         bvect  bvect2;
  1456.         bvect_mini  bvect_min2(BITVECT_SIZE);
  1457.         for (int i = 0; i < 150000; ++i)
  1458.         {
  1459.             bvect2.set_bit(i);
  1460.             bvect_min2.set_bit(i);
  1461.         }
  1462.         bvect2.optimize();
  1463.         bm::id_t predicted_count = bm::count_xor(bvect1, bvect2);
  1464.         bvect1.bit_xor(bvect2);
  1465.         
  1466.         bm::id_t count = bvect1.count();
  1467.         if (count != predicted_count)
  1468.         {
  1469.             cout << "2.Predicted count error!" << endl;
  1470.             exit(1);
  1471.         }
  1472.         
  1473.         bvect_min1.combine_xor(bvect_min2);
  1474.         CheckVectors(bvect_min1, bvect1, BITVECT_SIZE, true);
  1475.         CheckCountRange(bvect1, 0, BITVECT_SIZE);
  1476.     }
  1477.     {
  1478.         bvect  bvect1;
  1479.         bvect_mini  bvect_min1(BITVECT_SIZE);
  1480.         bvect  bvect2;
  1481.         bvect_mini  bvect_min2(BITVECT_SIZE);
  1482.         for (int i = 0; i < 150000; ++i)
  1483.         {
  1484.             bvect1.set_bit(i);
  1485.             bvect_min1.set_bit(i);
  1486.         }
  1487.         bvect1.optimize();
  1488.         
  1489.         bm::id_t predicted_count = bm::count_xor(bvect1, bvect2);
  1490.         bvect1.bit_xor(bvect2);
  1491.         bm::id_t count = bvect1.count();
  1492.         if (count != predicted_count)
  1493.         {
  1494.             cout << "3.Predicted count error!" << endl;
  1495.             exit(1);
  1496.         }
  1497.         
  1498.         bvect_min1.combine_xor(bvect_min2);
  1499.         CheckVectors(bvect_min1, bvect1, BITVECT_SIZE, true);
  1500.     }
  1501.     {
  1502.         bvect  bvect1;
  1503.         bvect_mini  bvect_min1(BITVECT_SIZE);
  1504.         bvect  bvect2;
  1505.         bvect_mini  bvect_min2(BITVECT_SIZE);
  1506.         for (int i = 0; i < 150000; ++i)
  1507.         {
  1508.             bvect1.set_bit(i);
  1509.             bvect_min1.set_bit(i);
  1510.             bvect2.set_bit(i);
  1511.             bvect_min2.set_bit(i);
  1512.         }
  1513.         bvect1.optimize();
  1514.         
  1515.         bm::id_t predicted_count = bm::count_xor(bvect1, bvect2);
  1516.         bvect1.bit_xor(bvect2);
  1517.         bm::id_t count = bvect1.count();
  1518.         if (count != predicted_count)
  1519.         {
  1520.             cout << "4.Predicted count error!" << endl;
  1521.             cout << count << " " << predicted_count << endl;
  1522.             
  1523.             exit(1);
  1524.         }
  1525.         
  1526.         bvect_min1.combine_xor(bvect_min2);
  1527.         CheckVectors(bvect_min1, bvect1, BITVECT_SIZE, true);
  1528.     }
  1529.     {
  1530.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1531.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1532.     bvect        bvect_full1;
  1533.     bvect        bvect_full2;
  1534.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1535.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1536.     printf("XOR test stage 2.n");
  1537.     FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/7, 0);
  1538.     FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/7, 0);
  1539.     bvect_min1.combine_xor(bvect_min2);
  1540.     
  1541.     bm::id_t predicted_count = bm::count_xor(bvect_full1, bvect_full2);
  1542.     
  1543.     bvect_full1.bit_xor(bvect_full2);
  1544.     
  1545.     bm::id_t count = bvect_full1.count();
  1546.     if (count != predicted_count)
  1547.     {
  1548.         cout << "5.Predicted count error!" << endl;
  1549.         cout << count << " " << predicted_count << endl;
  1550.         bvect_full1.stat();
  1551.         exit(1);
  1552.     }
  1553.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE/10+10);
  1554.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE/10+10);
  1555.     }
  1556.     {
  1557.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1558.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1559.     bvect        bvect_full1;
  1560.     bvect        bvect_full2;
  1561.     bvect_full1.set_new_blocks_strat(bm::BM_BIT);
  1562.     bvect_full2.set_new_blocks_strat(bm::BM_BIT);
  1563.     cout << "------------------------------" << endl;
  1564.     printf("XOR test stage 3.n");
  1565.     FillSets(&bvect_min1, &bvect_full1, 1, BITVECT_SIZE/5, 2);
  1566.     FillSets(&bvect_min2, &bvect_full2, 1, BITVECT_SIZE/5, 2);
  1567.     bm::id_t predicted_count = bm::count_xor(bvect_full1, bvect_full2);
  1568.     bvect_min1.combine_xor(bvect_min2);
  1569.     bvect_full1.bit_xor(bvect_full2);
  1570.     bm::id_t count = bvect_full1.count();
  1571.     if (count != predicted_count)
  1572.     {
  1573.         cout << "6.Predicted count error!" << endl;
  1574.         exit(1);
  1575.     }
  1576.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1577.     bvect_full1.optimize();
  1578.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1579.     CheckCountRange(bvect_full1, 0, BITVECT_SIZE);
  1580.     }
  1581.     cout << "Testing combine_xor" << endl;
  1582.     
  1583.     {
  1584.     
  1585.     bvect        bvect_full1;
  1586.     bvect        bvect_full2;
  1587.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1588.     
  1589.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1590.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1591.     unsigned ids[10000];
  1592.     unsigned to_add = 10000;
  1593.     
  1594.     unsigned bn = 0;
  1595.     for (unsigned i = 0; i < to_add; ++i)
  1596.     {
  1597.         ids[i] = bn;
  1598.         bvect_full2.set(bn);
  1599.         bvect_min1.set_bit(bn);
  1600.         bn += 15;
  1601.     }
  1602.     
  1603.     unsigned* first = ids;
  1604.     unsigned* last = ids + to_add;
  1605.     
  1606.     bm::combine_xor(bvect_full1, first, last);
  1607.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1608.     
  1609.     bm::combine_xor(bvect_full1, first, last);
  1610.     if (bvect_full1.count())
  1611.     {
  1612.         cout << "combine_xor count failed!" << endl;
  1613.         exit(1);
  1614.     }
  1615.     
  1616.     }
  1617.     {
  1618.     
  1619.     bvect        bvect_full1;
  1620.     bvect        bvect_full2;
  1621.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1622.     
  1623.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1624.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1625.     unsigned ids[10000]={0,};
  1626.     unsigned to_add = 10000;
  1627.     
  1628.     for (unsigned i = 0; i < to_add; i+=100)
  1629.     {
  1630.         ids[i] = i;
  1631.         bvect_full2.set(i);
  1632.         bvect_min1.set_bit(i);
  1633.     }
  1634.     unsigned* first = ids;
  1635.     unsigned* last = ids + to_add;
  1636.     
  1637.     bm::combine_xor(bvect_full1, first, last);
  1638.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1639.     
  1640.     bm::combine_xor(bvect_full1, first, last);
  1641.     if (bvect_full1.count())
  1642.     {
  1643.         cout << "combine_xor count failed!" << endl;
  1644.         exit(1);
  1645.     }
  1646.     
  1647.     }
  1648.     
  1649.     {
  1650.     unsigned ids[] = {0, 65536, 65535, 65535*3, 65535*2, 10};
  1651.     unsigned to_add = sizeof(ids)/sizeof(unsigned);
  1652.     bvect        bvect_full1;
  1653.     bvect        bvect_full2;    
  1654.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1655.     bvect_full1.set_new_blocks_strat(bm::BM_BIT);
  1656.     bvect_full2.set_new_blocks_strat(bm::BM_BIT);
  1657.     
  1658.     unsigned bn = 0;
  1659.     for (unsigned i = 0; i < to_add; ++i)
  1660.     {
  1661.         ids[i] = bn;
  1662.         bvect_full2.set(bn);
  1663.         bvect_min1.set_bit(bn);
  1664.         bn += 15;
  1665.     }
  1666.     
  1667.     unsigned* first = ids;
  1668.     unsigned* last = ids + to_add;
  1669.     
  1670.     bm::combine_xor(bvect_full1, first, last);
  1671.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1672.     bm::combine_xor(bvect_full1, first, last);
  1673.     if (bvect_full1.count())
  1674.     {
  1675.         cout << "combine_xor count failed!" << endl;
  1676.         exit(1);
  1677.     }
  1678.     }
  1679.     
  1680.     
  1681.     {
  1682.     unsigned ids[] = {0, 65536, 65535, 65535*3, 65535*2, 10};
  1683.     unsigned to_add = sizeof(ids)/sizeof(unsigned);
  1684.     bvect        bvect_full1;
  1685.     bvect        bvect_full2;    
  1686.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1687.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  1688.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  1689.     
  1690.     unsigned bn = 0;
  1691.     for (unsigned i = 0; i < to_add; ++i)
  1692.     {
  1693.         ids[i] = bn;
  1694.         bvect_full2.set(bn);
  1695.         bvect_min1.set_bit(bn);
  1696.         bn += 15;
  1697.     }
  1698.     
  1699.     unsigned* first = ids;
  1700.     unsigned* last = ids + to_add;
  1701.     
  1702.     bm::combine_xor(bvect_full1, first, last);
  1703.     CheckVectors(bvect_min1, bvect_full1, BITVECT_SIZE);
  1704.     bm::combine_xor(bvect_full1, first, last);
  1705.     if (bvect_full1.count())
  1706.     {
  1707.         cout << "combine_xor count failed!" << endl;
  1708.         exit(1);
  1709.     }
  1710.     }
  1711. }
  1712. void ComparisonTest()
  1713. {
  1714.     cout << "-------------------------------------- ComparisonTest" << endl;
  1715.     bvect_mini   bvect_min1(BITVECT_SIZE);
  1716.     bvect_mini   bvect_min2(BITVECT_SIZE);
  1717.     bvect        bvect_full1;
  1718.     bvect        bvect_full2;
  1719.     int res1, res2;
  1720.     bvect_full1.set_bit(31); 
  1721.     bvect_full2.set_bit(63); 
  1722.     res1 = bvect_full1.compare(bvect_full2);
  1723.     if (res1 != 1)
  1724.     {
  1725.         printf("Comparison test failed 1n");
  1726.         exit(1);
  1727.     }
  1728.     bvect_full1.clear();
  1729.     bvect_full2.clear();
  1730.     bvect_min1.set_bit(10);
  1731.     bvect_min2.set_bit(10);
  1732.     bvect_full1.set_bit(10);
  1733.     bvect_full2.set_bit(10);
  1734.     res1 = bvect_min1.compare(bvect_min2);
  1735.     res2 = bvect_full1.compare(bvect_full2);
  1736.     if (res1 != res2)
  1737.     {
  1738.         printf("Comparison test failed 1n");
  1739.         exit(1);
  1740.     }
  1741.     printf("Comparison 2.n");
  1742.     bvect_min1.set_bit(11);
  1743.     bvect_full1.set_bit(11);
  1744.     res1 = bvect_min1.compare(bvect_min2);
  1745.     res2 = bvect_full1.compare(bvect_full2);
  1746.     if (res1 != res2 && res1 != 1)
  1747.     {
  1748.         printf("Comparison test failed 2n");
  1749.         exit(1);
  1750.     }
  1751.     res1 = bvect_min2.compare(bvect_min1);
  1752.     res2 = bvect_full2.compare(bvect_full1);
  1753.     if (res1 != res2 && res1 != -1)
  1754.     {
  1755.         printf("Comparison test failed 2.1n");
  1756.         exit(1);
  1757.     }
  1758.     printf("Comparison 3.n");
  1759.     bvect_full1.optimize();
  1760.     res1 = bvect_min1.compare(bvect_min2);
  1761.     res2 = bvect_full1.compare(bvect_full2);
  1762.     if (res1 != res2 && res1 != 1)
  1763.     {
  1764.         printf("Comparison test failed 3n");
  1765.         exit(1);
  1766.     }
  1767.     res1 = bvect_min2.compare(bvect_min1);
  1768.     res2 = bvect_full2.compare(bvect_full1);
  1769.     if (res1 != res2 && res1 != -1)
  1770.     {
  1771.         printf("Comparison test failed 3.1n");
  1772.         exit(1);
  1773.     }
  1774.     printf("Comparison 4.n");
  1775.     bvect_full2.optimize();
  1776.     res1 = bvect_min1.compare(bvect_min2);
  1777.     res2 = bvect_full1.compare(bvect_full2);
  1778.     if (res1 != res2 && res1 != 1)
  1779.     {
  1780.         printf("Comparison test failed 4n");
  1781.         exit(1);
  1782.     }
  1783.     res1 = bvect_min2.compare(bvect_min1);
  1784.     res2 = bvect_full2.compare(bvect_full1);
  1785.     if (res1 != res2 && res1 != -1)
  1786.     {
  1787.         printf("Comparison test failed 4.1n");
  1788.         exit(1);
  1789.     }
  1790.     printf("Comparison 5.n");
  1791.     unsigned i;
  1792.     for (i = 0; i < 65536; ++i)
  1793.     {
  1794.         bvect_full1.set_bit(i);
  1795.     }
  1796.     res1 = bvect_min1.compare(bvect_min2);
  1797.     res2 = bvect_full1.compare(bvect_full2);
  1798.     if (res1 != res2 && res1 != 1)
  1799.     {
  1800.         printf("Comparison test failed 5n");
  1801.         exit(1);
  1802.     }
  1803.     bvect_full1.optimize();
  1804.     res1 = bvect_min2.compare(bvect_min1);
  1805.     res2 = bvect_full2.compare(bvect_full1);
  1806.     if (res1 != res2 && res1 != -1)
  1807.     {
  1808.         printf("Comparison test failed 5.1n");
  1809.         exit(1);
  1810.     }
  1811. }
  1812. void DesrializationTest2()
  1813. {
  1814.    bvect  bvtotal;
  1815.    unsigned size = BITVECT_SIZE - 10;
  1816.    bvect  bv1;
  1817.    bvect  bv2;
  1818.    int i;
  1819.    for (i = 10; i < 165536; i+=2)
  1820.    {
  1821.       bv1.set_bit(i);
  1822.    }
  1823.    bv1.optimize();
  1824.    bv1.stat();
  1825.    struct bvect::statistics st1;
  1826.    bv1.calc_stat(&st1);
  1827.    unsigned char* sermem = new unsigned char[st1.max_serialize_mem];
  1828.    unsigned slen2 = bv1.serialize(sermem);
  1829.    assert(slen2);
  1830.    slen2 = 0;
  1831.    bvtotal.deserialize(sermem);
  1832.    bvtotal.optimize();
  1833.    for (i = 55000; i < 165536; ++i)
  1834.    {
  1835.       bv2.set_bit(i);
  1836.    }
  1837.    bv2.optimize();
  1838.    bv2.stat();
  1839.    struct bvect::statistics st2;
  1840.    bv2.calc_stat(&st2);
  1841.    unsigned char* sermem2 = new unsigned char[st2.max_serialize_mem];
  1842.    unsigned slen = bv2.serialize(sermem2);
  1843.    assert(slen);
  1844.    slen = 0;
  1845.    bvtotal.deserialize(sermem2);
  1846.    bvtotal.stat();
  1847. //   bvtotal.optimize();
  1848.  //  bvtotal.stat();
  1849.    bvtotal.deserialize(sermem2);
  1850.    bvtotal.deserialize(sermem);
  1851.    delete [] sermem;
  1852.    delete [] sermem2;
  1853.    bvtotal.clear();
  1854.    int clcnt = 0;
  1855.    int repetitions = 25;
  1856.    for (i = 0; i < repetitions; ++i)
  1857.    {
  1858.         cout << endl << "Deserialization STEP " << i << endl;
  1859.         bvect_mini*   bvect_min1= new bvect_mini(size);
  1860.         bvect*        bvect_full1= new bvect();
  1861.         FillSetsRandomMethod(bvect_min1, bvect_full1, 1, size, 1);
  1862.        struct bvect::statistics st;
  1863.        bvect_full1->calc_stat(&st);
  1864.        unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  1865.        unsigned slen = bvect_full1->serialize(sermem);
  1866.        unsigned char* smem = new unsigned char[slen];
  1867.        ::memcpy(smem, sermem, slen);
  1868. //       cout << "Serialized vector" << endl;
  1869. //       bvect_full1->stat();
  1870. //       cout << "Before deserialization" << endl;
  1871. //       bvtotal.stat();
  1872.        bvtotal.deserialize(smem);
  1873. //       cout << "After deserialization" << endl;
  1874. //       bvtotal.stat();
  1875.        bvtotal.optimize();
  1876. //       cout << "After optimization" << endl;
  1877. //       bvtotal.stat();
  1878.        if (++clcnt == 5)
  1879.        {
  1880.           clcnt = 0;
  1881.           bvtotal.clear();
  1882. //          cout << "Post clear." << endl;
  1883. //          bvtotal.stat();
  1884.        }
  1885.        delete [] sermem;
  1886.        delete [] smem;
  1887.        delete bvect_min1;
  1888.        delete bvect_full1;
  1889.    } // for i
  1890. }
  1891. void StressTest(int repetitions)
  1892. {
  1893.    unsigned RatioSum = 0;
  1894.    unsigned SRatioSum = 0;
  1895.    unsigned DeltaSum = 0;
  1896.    unsigned SDeltaSum = 0;
  1897.    unsigned clear_count = 0;
  1898.    bvect  bvtotal;
  1899.    bvtotal.set_new_blocks_strat(bm::BM_GAP);
  1900.    cout << "----------------------------StressTest" << endl;
  1901.    unsigned size = BITVECT_SIZE - 10;
  1902. //size = BITVECT_SIZE / 10;
  1903.    int i;
  1904.    for (i = 0; i < repetitions; ++i)
  1905.    {
  1906.         cout << endl << " - - - - - - - - - - - - STRESS STEP " << i << endl;
  1907.         switch (rand() % 3)
  1908.         {
  1909.         case 0:
  1910.             size = BITVECT_SIZE / 10;
  1911.             break;
  1912.         case 1:
  1913.             size = BITVECT_SIZE / 2;
  1914.             break;
  1915.         default:
  1916.             size = BITVECT_SIZE - 10;
  1917.             break;
  1918.         } // switch
  1919.         bvect_mini*   bvect_min1= new bvect_mini(size);
  1920.         bvect_mini*   bvect_min2= new bvect_mini(size);
  1921.         bvect*        bvect_full1= new bvect();
  1922.         bvect*        bvect_full2= new bvect();
  1923.         bvect_full1->set_new_blocks_strat(i&1 ? bm::BM_GAP : bm::BM_BIT);
  1924.         bvect_full2->set_new_blocks_strat(i&1 ? bm::BM_GAP : bm::BM_BIT);
  1925.         int opt = rand() % 2;
  1926.         unsigned start1 = 0;
  1927.         switch (rand() % 3)
  1928.         {
  1929.         case 1:
  1930.             start1 += size / 5;
  1931.             break;
  1932.         default:
  1933.             break;
  1934.         }
  1935.         unsigned start2 = 0;
  1936.         switch (rand() % 3)
  1937.         {
  1938.         case 1:
  1939.             start2 += size / 5;
  1940.             break;
  1941.         default:
  1942.             break;
  1943.         }
  1944. /*
  1945.         if (i == 3)
  1946.         {
  1947.             g_cnt_check = 1;
  1948.         }
  1949. */
  1950.         FillSetsRandomMethod(bvect_min1, bvect_full1, start1, size, opt);
  1951.         FillSetsRandomMethod(bvect_min2, bvect_full2, start2, size, opt);
  1952.         unsigned arr[bm::set_total_blocks]={0,};
  1953.         bm::id_t cnt = bvect_full1->count();
  1954.         unsigned last_block = bvect_full1->count_blocks(arr);
  1955.         unsigned sum = bm::sum_arr(&arr[0], &arr[last_block+1]);
  1956.         if (sum != cnt)
  1957.         {
  1958.             cout << "Error in function count_blocks." << endl;
  1959.             cout << "Array sum = " << sum << endl;
  1960.             cout << "BitCount = " << cnt << endl;
  1961.             cnt = bvect_full1->count();
  1962.             for (unsigned i = 0; i <= last_block; ++i)
  1963.             {
  1964.                 if (arr[i])
  1965.                 {
  1966.                     cout << "[" << i << ":" << arr[i] << "]";
  1967.                 }
  1968.             }
  1969.             cout << endl;
  1970.             cout << "================" << endl;
  1971.             bvect_full1->stat();
  1972.             exit(1);
  1973.         }
  1974.         CheckCountRange(*bvect_full1, start1, BITVECT_SIZE, arr);
  1975.         CheckIntervals(*bvect_full1, BITVECT_SIZE);
  1976.         
  1977.         CheckCountRange(*bvect_full2, start2, BITVECT_SIZE);
  1978.         CheckCountRange(*bvect_full1, 0, start1, arr);
  1979.         CheckCountRange(*bvect_full2, 0, start2);
  1980. /*        
  1981.         cout << "!!!!!!!!!!!!!!!" << endl;
  1982.         CheckVectors(*bvect_min1, *bvect_full1, size);
  1983.         cout << "!!!!!!!!!!!!!!!" << endl;
  1984.         CheckVectors(*bvect_min2, *bvect_full2, size);
  1985.         cout << "!!!!!!!!!!!!!!!" << endl;
  1986.  
  1987.         
  1988.          bvect_full1->stat();
  1989.          cout << " --" << endl;
  1990.          bvect_full2->stat();
  1991. */
  1992.         int operation = rand()%4;
  1993. //operation = 2;
  1994.         switch(operation)
  1995.         {
  1996.         case 0:
  1997.             cout << "Operation OR" << endl;
  1998.             bvect_min1->combine_or(*bvect_min2);
  1999.             break;
  2000.         case 1:
  2001.             cout << "Operation SUB" << endl;
  2002.             bvect_min1->combine_sub(*bvect_min2);
  2003.             break;
  2004.         case 2:
  2005.             cout << "Operation XOR" << endl;
  2006.             bvect_min1->combine_xor(*bvect_min2);
  2007.             break;
  2008.         default:
  2009.             cout << "Operation AND" << endl;
  2010.             bvect_min1->combine_and(*bvect_min2);
  2011.             break;
  2012.         }
  2013.         int cres1 = bvect_min1->compare(*bvect_min2);
  2014.         delete bvect_min2;
  2015.         switch(operation)
  2016.         {
  2017.         case 0:
  2018.             {
  2019.             cout << "Operation OR" << endl;
  2020.             bm::id_t predicted_count = bm::count_or(*bvect_full1, *bvect_full2);
  2021.             
  2022.             bvect_full1->bit_or(*bvect_full2);
  2023.             
  2024.             bm::id_t count = bvect_full1->count();
  2025.             if (count != predicted_count)
  2026.             {
  2027.                 cout << "Predicted count error!" << endl;
  2028.                 cout << "Count = " << count << "Predicted count = " << predicted_count << endl;
  2029.                 exit(1);
  2030.             }
  2031.             
  2032.             }
  2033.             break;
  2034.         case 1:
  2035.             {
  2036.             cout << "Operation SUB" << endl;
  2037.             
  2038.             bm::id_t predicted_count = bm::count_sub(*bvect_full1, *bvect_full2);
  2039.             
  2040.             bvect_full1->bit_sub(*bvect_full2);
  2041.             
  2042.             bm::id_t count = bvect_full1->count();
  2043.             if (count != predicted_count)
  2044.             {
  2045.                 cout << "Predicted count error!" << endl;
  2046.                 cout << "Count = " << count << "Predicted count = " << predicted_count << endl;
  2047.                 exit(1);
  2048.             }
  2049.             
  2050.             
  2051.             }
  2052.             break;
  2053.         case 2:
  2054.             {
  2055.             cout << "Operation XOR" << endl;
  2056.            
  2057.             bm::id_t predicted_count = bm::count_xor(*bvect_full1, *bvect_full2);
  2058.             
  2059.             bvect_full1->bit_xor(*bvect_full2);
  2060.             
  2061.             bm::id_t count = bvect_full1->count();
  2062.             if (count != predicted_count)
  2063.             {
  2064.                 cout << "Predicted count error!" << endl;
  2065.                 cout << "Count = " << count << "Predicted count = " << predicted_count << endl;
  2066.                 exit(1);
  2067.             }
  2068.             
  2069.             }
  2070.             
  2071.             break;
  2072.         default:
  2073.             {
  2074.             cout << "Operation AND" << endl;
  2075.             bm::id_t predicted_count = bm::count_and(*bvect_full1, *bvect_full2);
  2076.             bvect_full1->bit_and(*bvect_full2);
  2077.             bm::id_t count = bvect_full1->count();
  2078.             if (count != predicted_count)
  2079.             {
  2080.                 cout << "Predicted count error!" << endl;
  2081.                 cout << "Count = " << count << "Predicted count = " << predicted_count << endl;
  2082.                 exit(1);
  2083.             }
  2084.             }
  2085.             break;
  2086.         }
  2087.         cout << "Operation comparison" << endl;
  2088.         CheckVectors(*bvect_min1, *bvect_full1, size);
  2089.         int cres2 = bvect_full1->compare(*bvect_full2);
  2090.         CheckIntervals(*bvect_full1, BITVECT_SIZE);
  2091.         if (cres1 != cres2)
  2092.         {
  2093.             cout << cres1 << " " << cres2 << endl;
  2094.             cout << bvect_full1->get_first() << " " << bvect_full1->count() << endl;
  2095.             cout << bvect_full2->get_first() << " " << bvect_full2->count() << endl;
  2096.            // bvect_full1->stat(1000);
  2097.             cout << endl;
  2098.            // bvect_full2->stat(1000);
  2099.             printf("Bitset comparison operation failed.n");
  2100.             exit(1);
  2101.         }
  2102.         delete bvect_full2;
  2103.         struct bvect::statistics st1;
  2104.         bvect_full1->calc_stat(&st1);
  2105.         bvect_full1->optimize();
  2106.         bvect_full1->optimize_gap_size();
  2107.         struct bvect::statistics st2;
  2108.         bvect_full1->calc_stat(&st2);
  2109.         unsigned Ratio = (st2.memory_used * 100)/st1.memory_used;
  2110.         RatioSum+=Ratio;
  2111.         DeltaSum+=st1.memory_used - st2.memory_used;
  2112.         cout << "Optimization statistics: " << endl  
  2113.              << "   MemUsedBefore=" << st1.memory_used
  2114.              << "   MemUsed=" << st2.memory_used 
  2115.              << "   Ratio=" << Ratio << "%"
  2116.              << "   Delta=" << st1.memory_used - st2.memory_used
  2117.              << endl;
  2118.                 
  2119.         cout << "Optimization comparison" << endl;
  2120.         CheckVectors(*bvect_min1, *bvect_full1, size);
  2121.         bvect_full1->set_gap_levels(gap_len_table_min<true>::_len);
  2122.         CheckVectors(*bvect_min1, *bvect_full1, size);
  2123.         CheckIntervals(*bvect_full1, BITVECT_SIZE);
  2124.         //CheckCountRange(*bvect_full1, 0, size);
  2125.         // Serialization
  2126.         bvect_full1->calc_stat(&st2);
  2127.         cout << "Memory allocation: " << st2.max_serialize_mem << endl;
  2128.         unsigned char* sermem = new unsigned char[st2.max_serialize_mem];
  2129. //    bvect_full1->stat();
  2130.         cout << "Serialization...";
  2131.         unsigned slen = bvect_full1->serialize(sermem);
  2132.         cout << "Ok" << endl;
  2133.         delete bvect_full1;
  2134.         unsigned SRatio = (slen*100)/st2.memory_used;
  2135.         SRatioSum+=SRatio;
  2136.         SDeltaSum+=st2.memory_used - slen;
  2137.         cout << "Serialized mem_max = " << st2.max_serialize_mem 
  2138.              << " size= " << slen 
  2139.              << " Ratio=" << SRatio << "%"
  2140.              << " Delta=" << st2.memory_used - slen
  2141.              << endl;
  2142.         bvect*        bvect_full3= new bvect();
  2143.         unsigned char* new_sermem = new unsigned char[slen];
  2144.         memcpy(new_sermem, sermem, slen);
  2145.         delete [] sermem;
  2146.         cout << "Deserialization...";
  2147.         bvect_full3->deserialize(new_sermem);
  2148.         bvtotal.deserialize(new_sermem);
  2149.         cout << "Ok." << endl;
  2150.         delete [] new_sermem;
  2151.         cout << "Optimization...";
  2152.         bvtotal.optimize();
  2153.         cout << "Ok." << endl;
  2154.         ++clear_count;
  2155.         if (clear_count == 4)
  2156.         {
  2157.            bvtotal.clear();
  2158.            clear_count = 0;
  2159.         }
  2160.         cout << "Serialization comparison" << endl;
  2161.         CheckVectors(*bvect_min1, *bvect_full3, size, true);
  2162.         delete bvect_min1;
  2163.         delete bvect_full3;
  2164.     }
  2165.     --i;
  2166.     cout << "Repetitions:" << i <<
  2167.             " AVG optimization ratio:" << RatioSum/i 
  2168.          << " AVG Delta:" << DeltaSum/i
  2169.          << endl
  2170.          << " AVG serialization Ratio:"<< SRatioSum/i
  2171.          << " Delta:" << SDeltaSum/i
  2172.          << endl;
  2173. }
  2174. void GAPCheck()
  2175. {
  2176.    cout << "-------------------------------------------GAPCheck" << endl;
  2177.     {
  2178.     gap_vector   gapv(0);
  2179.     bvect_mini  bvect_min(bm::gap_max_bits);
  2180.     unsigned i;
  2181.     for( i = 0; i < 454; ++i)
  2182.     {
  2183.         bvect_min.set_bit(i);
  2184.         gapv.set_bit(i);
  2185.     }
  2186.     for(i = 0; i < 254; ++i)
  2187.     {
  2188.         bvect_min.clear_bit(i);
  2189.         gapv.clear_bit(i);
  2190.     }
  2191.     for(i = 5; i < 10; ++i)
  2192.     {
  2193.         bvect_min.set_bit(i);
  2194.         gapv.set_bit(i);
  2195.     }
  2196.     for( i = 0; i < bm::gap_max_bits; ++i)
  2197.     {
  2198.         int bit1 = (gapv.is_bit_true(i) == 1);
  2199.         int bit2 = (bvect_min.is_bit_true(i) != 0);
  2200.         int bit3 = (gapv.test(i) == 1);
  2201.         if (bit1 != bit2)
  2202.         {
  2203.             cout << "problem with bit comparison " << i << endl;
  2204.             exit(1);
  2205.         }
  2206.         if (bit1 != bit3)
  2207.         {
  2208.             cout << "problem with bit test comparison " << i << endl;
  2209.             exit(1);
  2210.         }
  2211.     }
  2212.     }
  2213.    {
  2214.    gap_vector gapv(1);
  2215.    int bit = gapv.is_bit_true(65535);
  2216.    if (bit != 1)
  2217.    {
  2218.       cout << "Bit != 1" << endl;
  2219.       exit(1);
  2220.    }
  2221.    
  2222.    int i;
  2223.    for (i = 0; i < 65536; ++i)
  2224.    {
  2225.         bit = gapv.is_bit_true(i);
  2226.         if (bit != 1)
  2227.         {
  2228.             cout << "2.Bit != 1" << endl;
  2229.             exit(1);
  2230.         }
  2231.    }
  2232.    unsigned cnt = gapv.count_range(0, 65535);
  2233.    if (cnt != 65536)
  2234.    {
  2235.        cout << "count_range failed:" << cnt << endl;
  2236.        exit(1);
  2237.    }
  2238.    
  2239.    CheckCountRange(gapv, 10, 20);
  2240.    CheckCountRange(gapv, 0, 20);
  2241.    printf("gapv 1 check okn");
  2242.    }
  2243.    {
  2244.    gap_vector gapv(0);
  2245.    int bit = gapv.is_bit_true(65535);
  2246.    int bit1 = gapv.test(65535);
  2247.    if(bit != 0)
  2248.    {
  2249.       cout << "Bit != 0" << endl;
  2250.       exit(1);
  2251.    }
  2252.       
  2253.    int i;
  2254.    for (i = 0; i < 65536; ++i)
  2255.    {
  2256.         bit = gapv.is_bit_true(i);
  2257.         bit1 = gapv.test(i);
  2258.         if (bit != 0)
  2259.         {
  2260.             cout << "2.Bit != 0 bit =" << i << endl;
  2261.             exit(1);
  2262.         }
  2263.         if (bit1 != 0)
  2264.         {
  2265.             cout << "2.Bit test != 0 bit =" << i << endl;
  2266.             exit(1);
  2267.         }
  2268.    }
  2269.    unsigned cnt = gapv.count_range(0, 65535);
  2270.    if (cnt != 0)
  2271.    {
  2272.        cout << "count_range failed:" << cnt << endl;
  2273.        exit(1);
  2274.    }
  2275.    CheckCountRange(gapv, 10, 20);
  2276.    CheckCountRange(gapv, 0, 20);
  2277.    printf("gapv 2 check okn");
  2278.    }
  2279.    {
  2280.    gap_vector gapv(0);
  2281.    gapv.set_bit(1);
  2282.    gapv.set_bit(0);
  2283.    gapv.control();
  2284.    CheckCountRange(gapv, 0, 20);
  2285.    int bit = gapv.is_bit_true(0);
  2286.    if (bit != 1)
  2287.    {
  2288.       cout << "Trouble" << endl;
  2289.       exit(1);
  2290.    }
  2291.    
  2292.    bit = gapv.is_bit_true(1);
  2293.    if (bit != 1)
  2294.    {
  2295.       cout << "Trouble 2." << endl;
  2296.       exit(1);
  2297.    }
  2298.    bit = gapv.is_bit_true(2);
  2299.    if(bit != 0)
  2300.    {
  2301.       cout << "Trouble 3." << endl;
  2302.       exit(1);
  2303.    }
  2304.    }
  2305.    {
  2306.    gap_vector gapv(0);
  2307.    gapv.set_bit(0);
  2308.    gapv.control();
  2309.    gapv.set_bit(1);
  2310.    gapv.control();
  2311.    gapv.set_bit(4);
  2312.    gapv.control();
  2313.    gapv.set_bit(5);
  2314.    gapv.control();
  2315.    CheckCountRange(gapv, 4, 5);
  2316.    CheckCountRange(gapv, 3, 5);
  2317.    gapv.set_bit(3);
  2318.    CheckCountRange(gapv, 3, 3);
  2319.    CheckCountRange(gapv, 3, 5);
  2320.    gapv.control();
  2321.    
  2322.    int bit = gapv.is_bit_true(0);
  2323.    if(bit!=1)
  2324.    {
  2325.       cout << "Bug" << endl;
  2326.    }
  2327.    bit = gapv.is_bit_true(1);
  2328.    if(bit!=1)
  2329.    {
  2330.       cout << "Bug2" << endl;
  2331.    }
  2332.    gapv.control();
  2333.    gapv.set_bit(4);
  2334.    gapv.control();
  2335.    printf("gapv 3 check okn");
  2336.    }
  2337.    {
  2338.         gap_vector gapv(0);
  2339.         bvect_mini   bvect_min(bm::gap_max_bits);
  2340. cout << "++++++1" << endl;
  2341. print_gap(gapv, 10);
  2342.         gapv.set_bit(bm::gap_max_bits-1);
  2343.         gapv.control();
  2344.         print_gap(gapv, 10);
  2345. //cout << "++++++2" << endl;
  2346. //cout << "m_buf=" << bvect_min.m_buf << endl;
  2347.         bvect_min.set_bit(bm::gap_max_bits-1);
  2348. cout << "++++++3" << endl;
  2349.         gapv.set_bit(5);
  2350.         print_gap(gapv,15);
  2351.         gapv.control();
  2352.         bvect_min.set_bit(5);
  2353. cout << "++++++4" << endl;
  2354.         CheckCountRange(gapv, 13, 150);
  2355.         gapv.control();
  2356.         unsigned i;
  2357.         for (i = 0; i < bm::gap_max_bits; ++i)
  2358.         {
  2359.             if (i == 65535)
  2360.                 printf("%in", i);
  2361.             int bit1 = (gapv.is_bit_true(i) == 1);
  2362.             int bit2 = (bvect_min.is_bit_true(i) != 0);
  2363.             int bit3 = (gapv.test(i) == 1);
  2364.             if (bit1 != bit2)
  2365.             {
  2366.                 cout << "problem with bit comparison " << i << endl;
  2367.             }
  2368.             if (bit1 != bit3)
  2369.             {
  2370.                 cout << "problem with bit test comparison " << i << endl;
  2371.             }
  2372.         }
  2373.         gapv.clear_bit(5);
  2374.         bvect_min.clear_bit(5);
  2375.         gapv.control();
  2376.         for ( i = 0; i < bm::gap_max_bits; ++i)
  2377.         {
  2378.             if (i == 65535)
  2379.                 printf("%in", i);
  2380.             int bit1 = (gapv.is_bit_true(i) == 1);
  2381.             int bit2 = (bvect_min.is_bit_true(i) != 0);
  2382.             int bit3 = (gapv.test(i) == 1);
  2383.             if (bit1 != bit2)
  2384.             {
  2385.                 cout << "2.problem with bit comparison " << i << endl;
  2386.             }
  2387.             if (bit1 != bit3)
  2388.             {
  2389.                 cout << "2.problem with bit test comparison " << i << endl;
  2390.             }
  2391.         }
  2392.    printf("gapv check 4 ok.n");
  2393.    }
  2394.    {
  2395.         gap_vector gapv(0);
  2396.         bvect_mini   bvect_min(65536);
  2397.         
  2398.         int i;
  2399.         for (i = 10; i > 0; i-=2)
  2400.         {
  2401.             bvect_min.set_bit(i);
  2402.             gapv.set_bit(i);
  2403.             gapv.control();
  2404.             CheckCountRange(gapv, 0, i);
  2405.             int bit1 = (gapv.is_bit_true(i) == 1);
  2406.             int bit2 = (bvect_min.is_bit_true(i) != 0);
  2407.             int bit3 = (gapv.test(i) != 0);
  2408.             if (bit1 != bit2)
  2409.             {
  2410.                 cout << "3.problem with bit comparison " << i << endl;
  2411.             }
  2412.             if (bit1 != bit3)
  2413.             {
  2414.                 cout << "3.problem with bit test comparison " << i << endl;
  2415.             }
  2416.         }
  2417.         for (i = 0; i < (int)bm::gap_max_bits; ++i)
  2418.         {
  2419.             int bit1 = (gapv.is_bit_true(i) == 1);
  2420.             int bit2 = (bvect_min.is_bit_true(i) != 0);
  2421.             int bit3 = (gapv.test(i) == 1);
  2422.             if (bit1 != bit2)
  2423.             {
  2424.                 cout << "3.problem with bit comparison " << i << endl;
  2425.             }
  2426.             if (bit1 != bit3)
  2427.             {
  2428.                 cout << "3.problem with bit test comparison " << i << endl;
  2429.             }
  2430.         }
  2431.    printf("gapv check 5 ok.n");
  2432.    }
  2433.    {
  2434.         gap_vector gapv(0);
  2435.         bvect_mini   bvect_min(bm::gap_max_bits);
  2436.         
  2437.         int i;
  2438.         for (i = 0; i < 25; ++i)
  2439.         {
  2440.             unsigned id = random_minmax(0, bm::gap_max_bits);
  2441.             bvect_min.set_bit(id);
  2442.             gapv.set_bit(id);
  2443.             gapv.control();
  2444.             CheckCountRange(gapv, 0, id);
  2445.             CheckCountRange(gapv, id, 65535);
  2446.         }
  2447.         for (i = 0; i < (int)bm::gap_max_bits; ++i)
  2448.         {
  2449.             int bit1 = (gapv.is_bit_true(i) == 1);
  2450.             int bit2 = (bvect_min.is_bit_true(i) != 0);
  2451.             if (bit1 != bit2)
  2452.             {
  2453.                 cout << "4.problem with bit comparison " << i << endl;
  2454.             }
  2455.         }
  2456.         for (i = bm::gap_max_bits; i < 0; --i)
  2457.         {
  2458.             int bit1 = (gapv.is_bit_true(i) == 1);
  2459.             int bit2 = (bvect_min.is_bit_true(i) != 0);
  2460.             if (bit1 != bit2)
  2461.             {
  2462.                 cout << "5.problem with bit comparison " << i << endl;
  2463.             }
  2464.         }
  2465.    printf("gapv check 6 ok.n");
  2466.    }
  2467.    printf("gapv random bit set check ok.n");
  2468.    // conversion functions test
  2469.    
  2470.    {
  2471.    // aligned position test
  2472.    bvect        bvect;
  2473.    bvect.set_bit(1);
  2474.    bvect.clear();
  2475.    unsigned* buf = (unsigned*) bvect.get_block(0);
  2476.    bm::or_bit_block(buf, 0, 4);
  2477.    unsigned cnt = bm::bit_block_calc_count_range(buf, 0, 3);
  2478.    assert(cnt == 4);
  2479.    
  2480.    bool bit = bvect.get_bit(0);
  2481.    assert(bit);
  2482.    bit = bvect.get_bit(1);
  2483.    assert(bit);
  2484.    bit = bvect.get_bit(2);
  2485.    assert(bit);
  2486.    bit = bvect.get_bit(3);
  2487.    assert(bit);
  2488.    bit = bvect.get_bit(4);
  2489.    assert(bit==0);
  2490.    bm::or_bit_block(buf, 0, 36); 
  2491.    cnt = bm::bit_block_calc_count_range(buf, 0, 35);
  2492.    assert(cnt == 36);
  2493.    for (int i = 0; i < 36; ++i)
  2494.    {
  2495.         bit = (bvect.get_bit(i) != 0);
  2496.         assert(bit);
  2497.    }
  2498.    bit = (bvect.get_bit(36) != 0);
  2499.    assert(bit==0);
  2500.    unsigned count = bvect.recalc_count();
  2501.    assert(count == 36);   
  2502.    
  2503.    cout << "Aligned position test ok." << endl; 
  2504.    }
  2505.    {
  2506.    // unaligned position test
  2507.    bvect   bvect;
  2508.    bvect.set_bit(0);
  2509.    bvect.clear();
  2510.    unsigned* buf = (unsigned*) bvect.get_block(0);
  2511.    bm::or_bit_block(buf, 5, 32);
  2512.    bool bit = (bvect.get_bit(4) != 0);
  2513.    assert(bit==0);
  2514.    unsigned cnt = bm::bit_block_calc_count_range(buf, 5, 5+32-1);
  2515.    assert(cnt == 32);
  2516.    cnt = bm::bit_block_calc_count_range(buf, 5, 5+32);
  2517.    assert(cnt == 32);
  2518.    int i;
  2519.    for (i = 5; i < 4 + 32; ++i)
  2520.    {
  2521.         bit = bvect.get_bit(i);
  2522.         assert(bit);
  2523.    }
  2524.    int count = bvect.recalc_count();
  2525.    assert(count==32);
  2526.    cout << "Unaligned position ok." << endl;
  2527.    } 
  2528.    // random test
  2529.    {
  2530.    cout << "random test" << endl;
  2531.    bvect   bvect;
  2532.    bvect.set_bit(0);
  2533.    bvect.clear();
  2534.    unsigned* buf = (unsigned*) bvect.get_block(0);
  2535.    for (int i = 0; i < 5000; ++i)
  2536.    {
  2537.         unsigned start = rand() % 65535;
  2538.         unsigned end = rand() % 65535;
  2539.         if (start > end)
  2540.         {
  2541.             unsigned tmp = end;
  2542.             end = start;
  2543.             start = tmp;
  2544.         }
  2545.         unsigned len = end - start;
  2546.         if (len)
  2547.         {
  2548.            bm::or_bit_block(buf, start, len);
  2549.            unsigned cnt = bm::bit_block_calc_count_range(buf, start, end);
  2550.            if (cnt != len)
  2551.            {
  2552.             cout << "random test: count_range comparison failed. " 
  2553.                  << " LEN = " << len << " cnt = " << cnt
  2554.                  << endl;
  2555.                  exit(1);
  2556.            }
  2557.            unsigned count = bvect.recalc_count();
  2558.            if (count != len)
  2559.            {
  2560.             cout << "random test: count comparison failed. " 
  2561.                  << " LEN = " << len << " count = " << count
  2562.                  << endl;
  2563.                  exit(1);
  2564.            }            
  2565.            for (unsigned j = start; j < end; ++j)
  2566.            {
  2567.                 bool bit = bvect.get_bit(j);
  2568.                 if (!bit)
  2569.                 {
  2570.                     cout << "random test: bit comparison failed. bit#" 
  2571.                          << i << endl;
  2572.                     exit(1);
  2573.                 } 
  2574.            } // for j
  2575.         } 
  2576.         bvect.clear();
  2577.         if ((i % 100)==0)
  2578.         {
  2579.             cout << "*" << flush;
  2580.         }
  2581.    } // for i
  2582.    cout << endl << "Random test Ok." << endl;
  2583.    }
  2584.    // conversion test
  2585.  
  2586.    cout << "Conversion test" << endl;
  2587.     
  2588.    {
  2589.    
  2590.    gap_vector gapv(0);
  2591.    bvect   bvect;
  2592.    gapv.set_bit(0);
  2593.    gapv.set_bit(2);
  2594.    gapv.set_bit(10);
  2595.    gapv.set_bit(11);
  2596.    gapv.set_bit(12);
  2597.    
  2598.    CheckCountRange(gapv, 3, 15);
  2599.    print_gap(gapv, 100);
  2600.    bvect.set_bit(0);
  2601.    bvect.clear();
  2602.    unsigned* buf = (unsigned*) bvect.get_block(0);
  2603.    gapv.convert_to_bitset(buf);
  2604.    unsigned bitcount = bvect.recalc_count();
  2605.    if (bitcount != 5)
  2606.    {
  2607.       cout << "test failed: bitcout = " << bitcount << endl;
  2608.       exit(1);
  2609.    }
  2610.    gap_vector gapv1(0);
  2611.    gap_word_t* gap_buf = gapv1.get_buf();
  2612.    *gap_buf = 0;
  2613.    bit_convert_to_gap(gap_buf, buf, bm::gap_max_bits, bm::gap_max_buff_len);
  2614.    print_gap(gapv1, 100);
  2615.    bitcount = gapv1.bit_count();
  2616.    if(bitcount != 5)
  2617.    {
  2618.       cout << "2.test_failed: bitcout = " << bitcount << endl;
  2619.       exit(1);
  2620.    }
  2621.    printf("conversion test ok.n");
  2622.     
  2623.    }
  2624.    // gap AND test
  2625.    {
  2626.    // special case 1: operand is all 1
  2627.    gap_vector gapv1(0);
  2628.    gapv1.set_bit(2);
  2629.    gap_vector gapv2(1); 
  2630.    gapv1.combine_and(gapv2.get_buf());
  2631.    gapv1.control();
  2632.    print_gap(gapv1, 0);
  2633.    int count = gapv1.bit_count();
  2634.    assert(count == 1);
  2635.    int bit = gapv1.is_bit_true(2);
  2636.    if(bit == 0)
  2637.    {
  2638.       cout << "Wrong bit" << endl;
  2639.       exit(1);
  2640.    }
  2641.    CheckCountRange(gapv1, 0, 17);
  2642.    }
  2643.    {
  2644.    // special case 2: src is all 1
  2645.    gap_vector gapv1(1);
  2646.    gap_vector gapv2(0); 
  2647.    gapv2.set_bit(2);
  2648.    gapv1.combine_and(gapv2.get_buf());
  2649.    gapv1.control();
  2650.    print_gap(gapv1, 0);
  2651.    int count = gapv1.bit_count();
  2652.    assert(count == 1);
  2653.    int bit = gapv1.is_bit_true(2);
  2654.    assert(bit);
  2655.    }
  2656.    {
  2657.    gap_vector gapv;
  2658.    gap_vector gapv1(0);
  2659.    gapv1.set_bit(3);
  2660.    gapv1.set_bit(4);
  2661.    print_gap(gapv1, 0);
  2662.    gap_vector gapv2(0); 
  2663.    gapv2.set_bit(2);
  2664.    gapv2.set_bit(3);
  2665.    print_gap(gapv2, 0);
  2666.    bm::gap_buff_op((gap_word_t*)gapv.get_buf(), 
  2667.                          gapv1.get_buf(), 0,
  2668.                          gapv2.get_buf(), 0, bm::and_op); 
  2669.    print_gap(gapv, 0);
  2670.    gapv.control();
  2671.     int bit1 = (gapv.is_bit_true(3) == 1);
  2672.     if(bit1 == 0)
  2673.     {
  2674.        cout << "Checking failed." << endl;
  2675.        exit(0);
  2676.     }
  2677.    gapv1.combine_or(gapv2);
  2678.    print_gap(gapv1, 0);
  2679.    gapv1.control();
  2680.    }
  2681.    {
  2682.         printf("gap AND test 1.n");
  2683.         gap_vector gapv1(0);
  2684.         gap_vector gapv2(0);
  2685.         bvect_mini   bvect_min1(65536);
  2686.         bvect_mini   bvect_min2(65536);
  2687.         gapv1.set_bit(65535);
  2688.         bvect_min1.set_bit(65535);
  2689.         gapv1.set_bit(4);
  2690.         bvect_min1.set_bit(4);
  2691.         gapv2.set_bit(65535);
  2692.         bvect_min2.set_bit(65535);
  2693.         gapv2.set_bit(3);
  2694.         bvect_min2.set_bit(3);
  2695.         CheckCountRange(gapv2, 3, 65535);
  2696.         gapv2.control();
  2697.         printf("vect1:"); print_gap(gapv1, 0);
  2698.         printf("vect2:");print_gap(gapv2, 0);
  2699.         gapv1.combine_and(gapv2.get_buf());
  2700.         printf("vect1:");print_gap(gapv1, 0);
  2701.         gapv1.control();
  2702.         unsigned bit1 = gapv1.is_bit_true(65535);
  2703.         assert(bit1);
  2704.         bvect_min1.combine_and(bvect_min2);
  2705.         CheckGAPMin(gapv1, bvect_min1, bm::gap_max_bits);
  2706.    }
  2707.    {
  2708.         printf("gap random AND test.n");
  2709.         gap_vector gapv1(0);
  2710.         gap_vector gapv2(0);
  2711.         bvect_mini   bvect_min1(65536);
  2712.         bvect_mini   bvect_min2(65536);
  2713.         
  2714.         int i;
  2715.         for (i = 0; i < 25; ++i)
  2716.         {
  2717.             unsigned id = random_minmax(0, 65535);
  2718.             bvect_min1.set_bit(id);
  2719.             gapv1.set_bit(id);
  2720.             gapv1.control();
  2721.             CheckCountRange(gapv1, 0, id);
  2722.             CheckCountRange(gapv1, id, 65535);
  2723.         }
  2724.         for (i = 0; i < 25; ++i)
  2725.         {
  2726.             unsigned id = random_minmax(0, 65535);
  2727.             bvect_min2.set_bit(id);
  2728.             gapv2.set_bit(id);
  2729.             gapv2.control();
  2730.         }
  2731.         gapv1.combine_and(gapv2.get_buf());
  2732.         gapv1.control();
  2733.         gapv2.control();
  2734.         bvect_min1.combine_and(bvect_min2);
  2735.         CheckGAPMin(gapv1, bvect_min1, bm::gap_max_bits);
  2736.         printf("gap random AND test ok.n");
  2737.    }
  2738.    {
  2739.         printf("gap OR test.n");
  2740.         gap_vector gapv1(0);
  2741.         gap_vector gapv2(0);
  2742.         gapv1.set_bit(2);
  2743.         gapv2.set_bit(3);
  2744.         gapv1.combine_or(gapv2);
  2745.         gapv1.control();
  2746.         print_gap(gapv1, 0);   
  2747.         int bit1 = (gapv1.is_bit_true(0) == 1);
  2748.         assert(bit1==0);
  2749.         bit1=(gapv1.is_bit_true(2) == 1);
  2750.         assert(bit1);
  2751.         bit1=(gapv1.is_bit_true(3) == 1);
  2752.         assert(bit1);
  2753.    }
  2754.    {
  2755.         printf("gap XOR test.n");
  2756.         gap_vector gapv1(0);
  2757.         gap_vector gapv2(0);
  2758.         gapv1.set_bit(2);
  2759.         gapv2.set_bit(3);
  2760.         gapv1.set_bit(4);
  2761.         gapv2.set_bit(4);
  2762.         print_gap(gapv1, 0);   
  2763.         print_gap(gapv2, 0);   
  2764.         gapv1.combine_xor(gapv2);
  2765.         gapv1.control();
  2766.         print_gap(gapv1, 0);   
  2767.         int bit1 = (gapv1.is_bit_true(0) == 0);
  2768.         assert(bit1);
  2769.         bit1=(gapv1.is_bit_true(2) == 1);
  2770.         assert(bit1);
  2771.         bit1=(gapv1.is_bit_true(3) == 1);
  2772.         assert(bit1);
  2773.         bit1=(gapv1.is_bit_true(4) == 0);
  2774.         assert(bit1);
  2775.    }
  2776.    {
  2777.         int i;
  2778.         printf("gap random OR test.n");
  2779.         gap_vector gapv1(0);
  2780.         gap_vector gapv2(0);
  2781.         bvect_mini   bvect_min1(bm::gap_max_bits);
  2782.         bvect_mini   bvect_min2(bm::gap_max_bits);
  2783.         
  2784.         for (i = 0; i < 10; ++i)
  2785.         {
  2786.             unsigned id = random_minmax(0, 100);
  2787.             bvect_min1.set_bit(id);
  2788.             gapv1.set_bit(id);
  2789.             gapv1.control();
  2790.         }
  2791.         for (i = 0; i < 10; ++i)
  2792.         {
  2793.             unsigned id = random_minmax(0, 100);
  2794.             bvect_min2.set_bit(id);
  2795.             gapv2.set_bit(id);
  2796.             gapv2.control();
  2797.         }
  2798.         print_mv(bvect_min1, 64);
  2799.         print_mv(bvect_min2, 64);
  2800.         gapv1.combine_or(gapv2);
  2801.         gapv1.control();
  2802.         gapv2.control();
  2803.         bvect_min1.combine_or(bvect_min2);
  2804.         print_mv(bvect_min1, 64);
  2805.         CheckGAPMin(gapv1, bvect_min1, bm::gap_max_bits);
  2806.         printf("gap random OR test ok.n");
  2807.    }
  2808.    {
  2809.         int i;
  2810.         printf("gap random SUB test.n");
  2811.         gap_vector gapv1(0);
  2812.         gap_vector gapv2(0);
  2813.         bvect_mini   bvect_min1(bm::gap_max_bits);
  2814.         bvect_mini   bvect_min2(bm::gap_max_bits);
  2815.         
  2816.         for (i = 0; i < 25; ++i)
  2817.         {
  2818.             unsigned id = random_minmax(0, 100);
  2819.             bvect_min1.set_bit(id);
  2820.             gapv1.set_bit(id);
  2821.             gapv1.control();
  2822.         }
  2823.         for (i = 0; i < 25; ++i)
  2824.         {
  2825.             unsigned id = random_minmax(0, 100);
  2826.             bvect_min2.set_bit(id);
  2827.             gapv2.set_bit(id);
  2828.             gapv2.control();
  2829.         }
  2830.         print_mv(bvect_min1, 64);
  2831.         print_mv(bvect_min2, 64);
  2832.         gapv1.combine_sub(gapv2);
  2833.         gapv1.control();
  2834.         gapv2.control();
  2835.         bvect_min1.combine_sub(bvect_min2);
  2836.         print_mv(bvect_min1, 64);
  2837.         CheckGAPMin(gapv1, bvect_min1, bm::gap_max_bits);
  2838.         printf("gap random SUB test ok.n");
  2839.    }
  2840.    {
  2841.        printf("GAP comparison test.n");
  2842.        gap_vector gapv1(0);
  2843.        gap_vector gapv2(0);
  2844.        gapv1.set_bit(3);
  2845.        gapv2.set_bit(3);
  2846.        int res = gapv1.compare(gapv2);
  2847.        if (res != 0)
  2848.        {
  2849.            printf("GAP comparison failed!");
  2850.            exit(1);
  2851.        }
  2852.        gapv1.set_bit(4);
  2853.        gapv2.set_bit(4);
  2854.        res = gapv1.compare(gapv2);
  2855.        if (res != 0)
  2856.        {
  2857.            printf("GAP comparison failed!");
  2858.            exit(1);
  2859.        }
  2860.        gapv1.set_bit(0);
  2861.        gapv1.set_bit(1);
  2862.        res = gapv1.compare(gapv2);
  2863.        if (res != 1)
  2864.        {
  2865.            printf("GAP comparison failed!");
  2866.            exit(1);
  2867.        }
  2868.        gapv2.set_bit(0);
  2869.        gapv2.set_bit(1);
  2870.        res = gapv1.compare(gapv2);
  2871.        if (res != 0)
  2872.        {
  2873.            printf("GAP comparison failed!");
  2874.            exit(1);
  2875.        }
  2876.        gapv1.clear_bit(1);
  2877.        res = gapv1.compare(gapv2);
  2878.        if (res != -1)
  2879.        {
  2880.            printf("GAP comparison failed!");
  2881.            exit(1);
  2882.        }
  2883.    }
  2884. }
  2885. // -----------------------------------------------------------------------------
  2886. void MutationTest()
  2887. {
  2888.     cout << "--------------------------------- MutationTest" << endl;
  2889.     bvect_mini     bvect_min(BITVECT_SIZE);
  2890.     bvect          bvect_full;
  2891.     printf("nMutation test.n");
  2892.     bvect_full.set_new_blocks_strat(bm::BM_GAP);
  2893.     bvect_full.set_bit(5);
  2894.     bvect_full.set_bit(5);
  2895.     bvect_min.set_bit(5);
  2896.     bvect_full.set_bit(65535);
  2897.     bvect_full.set_bit(65537);
  2898.     bvect_min.set_bit(65535);
  2899.     bvect_min.set_bit(65537);
  2900.     bvect_min.set_bit(100000);
  2901.     bvect_full.set_bit(100000);
  2902. bvect_full.stat();
  2903.     // detailed vectors verification
  2904.     ::CheckVectors(bvect_min, bvect_full, ITERATIONS, false);
  2905.     int i;
  2906.     for (i = 5; i < 20000; i+=3)
  2907.     {
  2908.         bvect_min.set_bit(i);
  2909.         bvect_full.set_bit(i);
  2910.     }
  2911. bvect_full.stat();
  2912.     ::CheckVectors(bvect_min, bvect_full, ITERATIONS, false);
  2913.     for (i = 100000; i < 200000; i+=3)
  2914.     {
  2915.         bvect_min.set_bit(i);
  2916.         bvect_full.set_bit(i);
  2917.     }
  2918.     ::CheckVectors(bvect_min, bvect_full, 300000);
  2919.     // set-clear functionality
  2920.     {
  2921.         printf("Set-clear functionality test.");
  2922.         bvect_mini     bvect_min(BITVECT_SIZE);
  2923.         bvect          bvect_full;
  2924.         bvect_full.set_new_blocks_strat(bm::BM_GAP);
  2925.         int i;
  2926.         for (i = 100000; i < 100010; ++i)
  2927.         {
  2928.             bvect_min.set_bit(i);
  2929.             bvect_full.set_bit(i);            
  2930.         }
  2931.         ::CheckVectors(bvect_min, bvect_full, 300000);
  2932.         for (i = 100000; i < 100010; ++i)
  2933.         {
  2934.             bvect_min.clear_bit(i);
  2935.             bvect_full.clear_bit(i);            
  2936.         }
  2937.         ::CheckVectors(bvect_min, bvect_full, 300000);
  2938.         
  2939.         bvect_full.optimize();
  2940.         CheckVectors(bvect_min, bvect_full, 65536);//max+10);
  2941.     }
  2942. }
  2943. void MutationOperationsTest()
  2944. {
  2945.    cout << "------------------------------------ MutationOperationsTest" << endl;
  2946.    printf("Mutation operations test 1.n");
  2947.    {
  2948.     bvect_mini   bvect_min1(BITVECT_SIZE);
  2949.     bvect_mini   bvect_min2(BITVECT_SIZE);
  2950.     bvect        bvect_full1;
  2951.     bvect        bvect_full2;
  2952.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  2953.     bvect_full2.set_new_blocks_strat(bm::BM_BIT);
  2954.     bvect_full1.set_bit(100);
  2955.     bvect_min1.set_bit(100);
  2956.     int i;
  2957.     for(i = 0; i < 10000; i+=2)
  2958.     {
  2959.        bvect_full2.set_bit(i);
  2960.        bvect_min2.set_bit(i);
  2961.     }
  2962.     bvect_full2.stat();
  2963.     CheckVectors(bvect_min2, bvect_full2, 65536, true);
  2964.     
  2965.     bvect_min1.combine_and(bvect_min2);
  2966.     bvect_full1.bit_and(bvect_full2);
  2967.     CheckVectors(bvect_min1, bvect_full1, 65536);//max+10);
  2968.    }
  2969.    printf("Mutation operations test 2.n");
  2970.    {
  2971.     unsigned delta = 65536;
  2972.     bvect_mini   bvect_min1(BITVECT_SIZE);
  2973.     bvect_mini   bvect_min2(BITVECT_SIZE);
  2974.     bvect        bvect_full1;
  2975.     bvect        bvect_full2;
  2976.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  2977.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  2978.     int i;
  2979.     for(i = 0; i < 1000; i+=1)
  2980.     {
  2981.        bvect_full1.set_bit(delta+i);
  2982.        bvect_min1.set_bit(delta+i);
  2983.     }
  2984.     for(i = 0; i < 100; i+=2)
  2985.     {
  2986.        bvect_full2.set_bit(delta+i);
  2987.        bvect_min2.set_bit(delta+i);
  2988.     }
  2989. //    CheckVectors(bvect_min2, bvect_full2, 65536);
  2990.     
  2991.     bvect_min1.combine_and(bvect_min2);
  2992.     bvect_full1.bit_and(bvect_full2);
  2993.     CheckVectors(bvect_min1, bvect_full1, 65536);//max+10);
  2994.     bvect_full1.optimize();
  2995.     CheckVectors(bvect_min1, bvect_full1, 65536);//max+10);
  2996.    }
  2997.    {
  2998.     bvect_mini   bvect_min1(BITVECT_SIZE);
  2999.     bvect        bvect_full1;
  3000.     bvect_full1.set_bit(3);
  3001.     bvect_min1.set_bit(3);
  3002.     struct bvect::statistics st;
  3003.     bvect_full1.calc_stat(&st);
  3004.     // serialization
  3005.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3006.     unsigned slen = bvect_full1.serialize(sermem);
  3007.     cout << "BVECTOR SERMEM=" << slen << endl;
  3008.     bvect        bvect_full3;
  3009.     bvect_full3.deserialize(sermem);
  3010.     bvect_full3.stat();
  3011.     CheckVectors(bvect_min1, bvect_full3, 100, true);
  3012.    }
  3013.    printf("Mutation operations test 3.n");
  3014.    {
  3015.     bvect_mini   bvect_min1(BITVECT_SIZE);
  3016.     bvect_mini   bvect_min2(BITVECT_SIZE);
  3017.     bvect        bvect_full1;
  3018.     bvect        bvect_full2;
  3019.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  3020.     bvect_full2.set_new_blocks_strat(bm::BM_GAP);
  3021.    
  3022.     unsigned min = BITVECT_SIZE / 2 - ITERATIONS;
  3023.     unsigned max = BITVECT_SIZE / 2 + ITERATIONS;
  3024.     if (max > BITVECT_SIZE) 
  3025.         max = BITVECT_SIZE - 1;
  3026.     unsigned len = max - min;
  3027.     FillSets(&bvect_min1, &bvect_full1, min, max, 0);
  3028.     FillSets(&bvect_min1, &bvect_full1, 0, len, 5);
  3029.     printf("Bvect_FULL 1 STATn");
  3030.     bvect_full1.stat();
  3031. //    CheckVectors(bvect_min1, bvect_full1, max+10, false);
  3032.     FillSets(&bvect_min2, &bvect_full2, min, max, 0);
  3033.     FillSets(&bvect_min2, &bvect_full2, 0, len, 0);
  3034.     printf("Bvect_FULL 2 STATn");
  3035.     bvect_full2.stat();
  3036. //    CheckVectors(bvect_min2, bvect_full2, max+10);
  3037.     
  3038.     bvect_min1.combine_and(bvect_min2);
  3039.     bvect_full1.bit_and(bvect_full2);
  3040.     printf("Bvect_FULL 1 STAT after ANDn");
  3041.     bvect_full1.stat();
  3042.     CheckVectors(bvect_min1, bvect_full1, max+10, false);
  3043.     struct bvect::statistics st;
  3044.     bvect_full1.calc_stat(&st);
  3045.     cout << "BVECTOR: GAP=" << st.gap_blocks << " BIT=" << st.bit_blocks 
  3046.          << " MEM=" << st.memory_used << " SERMAX=" << st.max_serialize_mem
  3047.          << endl;
  3048.     cout << "MINIVECT: " << bvect_min1.mem_used() << endl;
  3049.     bvect_full1.optimize();
  3050.     bvect_full1.stat();
  3051.     CheckVectors(bvect_min1, bvect_full1, max+10, false);
  3052.     bvect_full1.calc_stat(&st);
  3053.     cout << "BVECTOR: GAP=" << st.gap_blocks << " BIT=" << st.bit_blocks 
  3054.          << " MEM=" << st.memory_used << " SERMAX=" << st.max_serialize_mem
  3055.          << endl;
  3056.     cout << "MINIVECT: " << bvect_min1.mem_used() << endl;
  3057.     // serialization
  3058.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3059.     unsigned slen = bvect_full1.serialize(sermem);
  3060.     cout << "BVECTOR SERMEM=" << slen << endl;
  3061.     
  3062.     bvect        bvect_full3;
  3063.     bvect_full3.deserialize(sermem);
  3064.     bvect_full3.stat();
  3065.     CheckVectors(bvect_min1, bvect_full3, max+10, true);
  3066.     
  3067.     delete [] sermem;
  3068.     
  3069.     cout << "Copy constructor check." << endl;
  3070.     {
  3071.     bvect       bvect_full4(bvect_full3);
  3072.     bvect_full3.stat();
  3073.     CheckVectors(bvect_min1, bvect_full4, max+10, true);
  3074.     }
  3075.     
  3076.    }
  3077. }
  3078. void SerializationTest()
  3079. {
  3080.    cout << " ----------------------------------- SerializationTest" << endl;
  3081.    cout << "Serialization STEP 0" << endl;
  3082.    {
  3083.     unsigned size = BITVECT_SIZE/6000;
  3084.     bvect_mini*   bvect_min1= new bvect_mini(BITVECT_SIZE);
  3085.     bvect*        bvect_full1= new bvect();
  3086.     bvect*        bvect_full2= new bvect();
  3087.     bvect_full1->set_new_blocks_strat(bm::BM_BIT);
  3088.     bvect_full2->set_new_blocks_strat(bm::BM_BIT);
  3089.     for(unsigned i = 0; i < size; ++i)
  3090.     {
  3091.         bvect_full1->set_bit(i);
  3092.         bvect_min1->set_bit(i);
  3093.     }
  3094.     bvect_full1->optimize();
  3095.     CheckVectors(*bvect_min1, *bvect_full1, size, true);
  3096.     bvect::statistics st;
  3097.     bvect_full1->calc_stat(&st);
  3098.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3099.     unsigned slen = bvect_full1->serialize(sermem);
  3100.     cout << "Serialized mem_max = " << st.max_serialize_mem 
  3101.          << " size= " << slen 
  3102.          << " Ratio=" << (slen*100)/st.max_serialize_mem << "%"
  3103.          << endl;
  3104.     bvect_full2->deserialize(sermem);
  3105.     delete [] sermem;
  3106.     CheckVectors(*bvect_min1, *bvect_full2, size, true);
  3107.     delete bvect_full2;
  3108.     delete bvect_min1;
  3109.     delete bvect_full1;
  3110.     }
  3111.    {
  3112.     unsigned size = BITVECT_SIZE/6000;
  3113.     bvect_mini*   bvect_min1= new bvect_mini(BITVECT_SIZE);
  3114.     bvect*        bvect_full1= new bvect();
  3115.     bvect*        bvect_full2= new bvect();
  3116.     bvect_full1->set_new_blocks_strat(bm::BM_BIT);
  3117.     bvect_full2->set_new_blocks_strat(bm::BM_BIT);
  3118.         bvect_full1->set_bit(131072);
  3119.         bvect_min1->set_bit(131072);
  3120.     
  3121.     bvect_full1->optimize();
  3122.     bvect::statistics st;
  3123.     bvect_full1->calc_stat(&st);
  3124.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3125.     unsigned slen = bvect_full1->serialize(sermem);
  3126.     cout << "Serialized mem_max = " << st.max_serialize_mem 
  3127.          << " size= " << slen 
  3128.          << " Ratio=" << (slen*100)/st.max_serialize_mem << "%"
  3129.          << endl;
  3130.     bvect_full2->deserialize(sermem);
  3131.     delete [] sermem;
  3132.     CheckVectors(*bvect_min1, *bvect_full2, size, true);
  3133.     delete bvect_full2;
  3134.     delete bvect_min1;
  3135.     delete bvect_full1;
  3136.     }
  3137.     cout << "Serialization STEP 1." << endl;
  3138.     {
  3139.     bvect_mini   bvect_min1(BITVECT_SIZE);
  3140.     bvect        bvect_full1;
  3141.     bvect_full1.set_new_blocks_strat(bm::BM_GAP);
  3142.    
  3143.     unsigned min = BITVECT_SIZE / 2 - ITERATIONS;
  3144.     unsigned max = BITVECT_SIZE / 2 + ITERATIONS;
  3145.     if (max > BITVECT_SIZE) 
  3146.         max = BITVECT_SIZE - 1;
  3147.     unsigned len = max - min;
  3148.     FillSets(&bvect_min1, &bvect_full1, min, max, 0);
  3149.     FillSets(&bvect_min1, &bvect_full1, 0, len, 5);
  3150.     // shot some random bits
  3151.     int i;
  3152.     for (i = 0; i < 10000; ++i)
  3153.     {
  3154.         unsigned bit = rand() % BITVECT_SIZE;
  3155.         bvect_full1.set_bit(bit);
  3156.         bvect_min1.set_bit(bit);
  3157.     }
  3158.     bvect::statistics st;
  3159.     bvect_full1.calc_stat(&st);
  3160.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3161.     bvect_full1.stat();
  3162.     
  3163.     unsigned slen = bvect_full1.serialize(sermem);
  3164.     cout << "Serialized len = " << slen << endl;
  3165.     bvect        bvect_full3;
  3166.     bvect_full3.deserialize(sermem);
  3167.     CheckVectors(bvect_min1, bvect_full3, max+10, true);
  3168.     delete [] sermem;
  3169.     }
  3170.    cout << "Stage 2" << endl;
  3171.    {
  3172.     bvect_mini*   bvect_min1= new bvect_mini(BITVECT_SIZE);
  3173. //    bm::bvect_mini*   bvect_min2= new bm::bvect_mini(BITVECT_SIZE);
  3174.     bvect*        bvect_full1= new bvect();
  3175.     bvect*        bvect_full2= new bvect();
  3176.     bvect_full1->set_new_blocks_strat(bm::BM_GAP);
  3177.     bvect_full2->set_new_blocks_strat(bm::BM_GAP);
  3178.     FillSetsRandomMethod(bvect_min1, bvect_full1, 1, BITVECT_SIZE-10, 1);
  3179. //    FillSetsRandomMethod(bvect_min2, bvect_full2, 1, BITVECT_SIZE-10, 1);
  3180. //bvect_full1->stat();
  3181. cout << "Filling. OK." << endl;
  3182.     bvect::statistics st;
  3183.     bvect_full1->calc_stat(&st);
  3184. cout << st.max_serialize_mem << endl;
  3185.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3186. cout << "Serialization" << endl;
  3187.     unsigned slen = bvect_full1->serialize(sermem);
  3188.     cout << "Serialized mem_max = " << st.max_serialize_mem 
  3189.          << " size= " << slen 
  3190.          << " Ratio=" << (slen*100)/st.max_serialize_mem << "%"
  3191.          << endl;
  3192. cout << "Deserialization" << endl;
  3193.     bvect_full2->deserialize(sermem);
  3194. cout << "Deserialization ok" << endl;
  3195.     CheckVectors(*bvect_min1, *bvect_full2, BITVECT_SIZE, true);
  3196.     delete [] sermem;
  3197.     delete bvect_full2;
  3198.     delete bvect_min1;
  3199.     delete bvect_full1;
  3200.     }
  3201.    cout << "Stage 3" << endl;
  3202.    {
  3203.     bvect_mini*   bvect_min1= new bvect_mini(BITVECT_SIZE);
  3204.     bvect_mini*   bvect_min2= new bvect_mini(BITVECT_SIZE);
  3205.     bvect*        bvect_full1= new bvect();
  3206.     bvect*        bvect_full2= new bvect();
  3207.     bvect_full1->set_new_blocks_strat(bm::BM_GAP);
  3208.     bvect_full2->set_new_blocks_strat(bm::BM_GAP);
  3209.     FillSetsRandomMethod(bvect_min1, bvect_full1, 1, BITVECT_SIZE-10, 1);
  3210.     FillSetsRandomMethod(bvect_min2, bvect_full2, 1, BITVECT_SIZE-10, 1);
  3211.     bvect::statistics st;
  3212.     bvect_full1->calc_stat(&st);
  3213.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3214.     unsigned slen = bvect_full1->serialize(sermem);
  3215.     delete bvect_full1;
  3216.     cout << "Serialized mem_max = " << st.max_serialize_mem 
  3217.          << " size= " << slen 
  3218.          << " Ratio=" << (slen*100)/st.max_serialize_mem << "%"
  3219.          << endl;
  3220.     bvect_full2->deserialize(sermem);
  3221.     delete [] sermem;
  3222.     
  3223.     bvect_min2->combine_or(*bvect_min1);
  3224.     delete bvect_min1;
  3225.     CheckVectors(*bvect_min2, *bvect_full2, BITVECT_SIZE, true);
  3226.     delete bvect_full2;
  3227.     delete bvect_min2;    
  3228.     }
  3229.    cout << "Stage 4. " << endl;
  3230.    {
  3231.     unsigned size = BITVECT_SIZE/3;
  3232.     bvect_mini*   bvect_min1= new bvect_mini(BITVECT_SIZE);
  3233.     bvect*        bvect_full1= new bvect();
  3234.     bvect*        bvect_full2= new bvect();
  3235.     bvect_full1->set_new_blocks_strat(bm::BM_BIT);
  3236.     bvect_full2->set_new_blocks_strat(bm::BM_BIT);
  3237.     unsigned i;
  3238.     for(i = 0; i < 65000; ++i)
  3239.     {
  3240.         bvect_full1->set_bit(i);
  3241.         bvect_min1->set_bit(i);
  3242.     }
  3243.     for(i = 65536; i < 65536+65000; ++i)
  3244.     {
  3245.         bvect_full1->set_bit(i);
  3246.         bvect_min1->set_bit(i);
  3247.     }
  3248.     for (i = 65536*2; i < size/6; ++i)
  3249.     {
  3250.         bvect_full1->set_bit(i);
  3251.         bvect_min1->set_bit(i);
  3252.     }
  3253.     bvect_full1->optimize();
  3254.     bvect_full1->stat();
  3255.     bvect::statistics st;
  3256.     bvect_full1->calc_stat(&st);
  3257.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3258.     unsigned slen = bvect_full1->serialize(sermem);
  3259.     cout << "Serialized mem_max = " << st.max_serialize_mem 
  3260.          << " size= " << slen 
  3261.          << " Ratio=" << (slen*100)/st.max_serialize_mem << "%"
  3262.          << endl;
  3263.     
  3264.     unsigned char* new_sermem = new unsigned char[st.max_serialize_mem];
  3265.     ::memcpy(new_sermem, sermem, slen);
  3266.     bvect_full2->deserialize(new_sermem);
  3267.     delete [] sermem;
  3268.     delete [] new_sermem;
  3269.     CheckVectors(*bvect_min1, *bvect_full2, size, true);
  3270.     delete bvect_full2;
  3271.     delete bvect_min1;
  3272.     delete bvect_full1;
  3273.     }
  3274. }
  3275. void GetNextTest()
  3276. {
  3277.    cout << "-------------------------------------------- GetNextTest" << endl;
  3278.    int i;
  3279.    for(i = 0; i < 2; ++i)
  3280.    {
  3281.       cout << "Strategy " << i << endl;
  3282.    {
  3283.       bvect       bvect_full1;
  3284.       bvect_mini  bvect_min1(BITVECT_SIZE);
  3285.       bvect_full1.set_new_blocks_strat(i ? bm::BM_GAP : bm::BM_BIT);
  3286.       bvect_full1.set_bit(0);
  3287.       bvect_min1.set_bit(0);
  3288.       bvect_full1.set_bit(65536);
  3289.       bvect_min1.set_bit(65536);
  3290.       unsigned nbit1 = bvect_full1.get_first();
  3291.       unsigned nbit2 = bvect_min1.get_first();
  3292.       if (nbit1 != nbit2)
  3293.       {
  3294.          cout << "1. get_first failed() " <<  nbit1 << " " << nbit2 << endl;
  3295.          exit(1);
  3296.       }
  3297.       nbit1 = bvect_full1.get_next(nbit1);
  3298.       nbit2 = bvect_min1.get_next(nbit2);
  3299.       if ((nbit1 != nbit2) || (nbit1 != 65536))
  3300.       {
  3301.          cout << "1. get_next failed() " <<  nbit1 << " " << nbit2 << endl;
  3302.          exit(1);
  3303.       }
  3304.    }
  3305.    {
  3306.       bvect       bvect_full1;
  3307.       bvect_mini  bvect_min1(BITVECT_SIZE);
  3308.       bvect_full1.set_new_blocks_strat(i ? bm::BM_GAP : bm::BM_BIT);
  3309.       bvect_full1.set_bit(65535);
  3310.       bvect_min1.set_bit(65535);
  3311.       unsigned nbit1 = bvect_full1.get_first();
  3312.       unsigned nbit2 = bvect_min1.get_first();
  3313.       if ((nbit1 != nbit2) || (nbit1 != 65535))
  3314.       {
  3315.          cout << "1. get_first failed() " <<  nbit1 << " " << nbit2 << endl;
  3316.          exit(1);
  3317.       }
  3318.       nbit1 = bvect_full1.get_next(nbit1);
  3319.       nbit2 = bvect_min1.get_next(nbit2);
  3320.       if (nbit1 != nbit2 )
  3321.       {
  3322.          cout << "1. get_next failed() " <<  nbit1 << " " << nbit2 << endl;
  3323.          exit(1);
  3324.       }
  3325.    }
  3326.    {
  3327.       cout << "--------------" << endl;
  3328.       bvect       bvect_full1;
  3329.       bvect_mini  bvect_min1(BITVECT_SIZE);
  3330.       bvect_full1.set_new_blocks_strat(i ? bm::BM_GAP : bm::BM_BIT);
  3331.       bvect_full1.set_bit(655350);
  3332.       bvect_min1.set_bit(655350);
  3333.       unsigned nbit1 = bvect_full1.get_first();
  3334.       unsigned nbit2 = bvect_min1.get_first();
  3335.       if (nbit1 != nbit2 || nbit1 != 655350)
  3336.       {
  3337.          cout << "1. get_first failed() " <<  nbit1 << " " << nbit2 << endl;
  3338.          exit(1);
  3339.       }
  3340.       nbit1 = bvect_full1.get_next(nbit1);
  3341.       nbit2 = bvect_min1.get_next(nbit2);
  3342.       if (nbit1 != nbit2)
  3343.       {
  3344.          cout << "1. get_next failed() " <<  nbit1 << " " << nbit2 << endl;
  3345.          exit(1);
  3346.       }
  3347.    }
  3348.    {
  3349.    bvect       bvect_full1;
  3350.    bvect_mini  bvect_min1(BITVECT_SIZE);
  3351.    bvect_full1.set_new_blocks_strat(i ? bm::BM_GAP : bm::BM_BIT);
  3352.    bvect_full1.set_bit(256);
  3353.    bvect_min1.set_bit(256);
  3354. //   bvect_full1.clear_bit(256);
  3355.    bvect_full1.set_bit(65536);
  3356.    bvect_min1.set_bit(65536);
  3357.    unsigned nbit1 = bvect_full1.get_first();
  3358.    unsigned nbit2 = bvect_min1.get_first();
  3359.    if (nbit1 != nbit2)
  3360.    {
  3361.       cout << "get_first failed " <<  nbit1 << " " << nbit2 << endl;
  3362.       exit(1);
  3363.    }
  3364.    while (nbit1)
  3365.    {
  3366.       cout << nbit1 << endl;
  3367.       nbit1 = bvect_full1.get_next(nbit1);
  3368.       nbit2 = bvect_min1.get_next(nbit2);
  3369.       if (nbit1 != nbit2)
  3370.       {
  3371.          cout << "get_next failed " <<  nbit1 << " " << nbit2 << endl;
  3372.          exit(1);
  3373.       }
  3374.    } // while
  3375.    }
  3376.    
  3377.    }// for
  3378. }
  3379. // Test contributed by Maxim Shemanarev.
  3380. void MaxSTest()
  3381. {
  3382.    bvect vec;
  3383.    int i, j;
  3384.    unsigned id;
  3385.    for(i = 0; i < 100; i++)
  3386.    {
  3387.       int n = rand() % 2000 + 1;
  3388.       id = 1;
  3389.       for(j = 0; j < n; j++)
  3390.       {
  3391.          id += rand() % 10 + 1;
  3392.          vec.set_bit(id);
  3393.       }
  3394.       vec.optimize();
  3395.       vec.clear();
  3396.       fprintf(stderr, ".");
  3397.    }
  3398. }
  3399. void CalcBeginMask()
  3400. {
  3401.     printf("BeginMask:n");
  3402.     int i;
  3403.     for (i = 0; i < 32; ++i)
  3404.     {
  3405.     unsigned mask = 0;
  3406.         for(int j = i; j < 32; ++j)
  3407.         {
  3408.             unsigned nbit  = j; 
  3409.             nbit &= bm::set_word_mask;
  3410.             bm::word_t  mask1 = (((bm::word_t)1) << j);
  3411.             mask |= mask1;
  3412.         }
  3413.         printf("0x%x, ", mask);
  3414.         
  3415.     } 
  3416.     printf("n");
  3417. }
  3418. void CalcEndMask()
  3419. {
  3420.     printf("EndMask:n");
  3421.     int i;
  3422.     for (i = 0; i < 32; ++i)
  3423.     {
  3424.     unsigned mask = 1;
  3425.         for(int j = i; j > 0; --j)
  3426.         {
  3427.             unsigned nbit  = j; 
  3428.             nbit &= bm::set_word_mask;
  3429.             bm::word_t  mask1 = (((bm::word_t)1) << j);
  3430.             mask |= mask1;
  3431.         }
  3432.         printf("0x%x,", mask);
  3433.         
  3434.     } 
  3435.     printf("n");
  3436. }
  3437. void EnumeratorTest()
  3438. {
  3439.     cout << "-------------------------------------------- EnumeratorTest" << endl;
  3440.     {
  3441.     bvect bvect1;
  3442.     bvect1.set_bit(100);
  3443.     bvect::enumerator en = bvect1.first();
  3444.     if (*en != 100)
  3445.     {
  3446.         cout << "Enumerator error !" << endl;
  3447.         exit(1);
  3448.     }
  3449.     bvect1.clear_bit(100);
  3450.     bvect1.set_bit(2000000000);
  3451.     en.go_first();
  3452.     if (*en != 2000000000)
  3453.     {
  3454.         cout << "Enumerator error !" << endl;
  3455.         exit(1);
  3456.     }
  3457.     }
  3458.     {
  3459.         bvect bvect1;
  3460.         bvect1.set_bit(0);
  3461.         bvect1.set_bit(10);
  3462.         bvect1.set_bit(35);
  3463.         bvect1.set_bit(1000);
  3464.         bvect1.set_bit(2016519);
  3465.         bvect1.set_bit(2034779);
  3466.         bvect1.set_bit(bm::id_max-1);
  3467.         bvect::enumerator en = bvect1.first();
  3468.         unsigned num = bvect1.get_first();
  3469.         bvect::enumerator end = bvect1.end();
  3470.         while (en < end)
  3471.         {
  3472.             if (*en != num)
  3473.             {
  3474.                 cout << "Enumeration comparison failed !" << 
  3475.                         " enumerator = " << *en <<
  3476.                         " get_next() = " << num << endl; 
  3477.                 exit(1);
  3478.             }
  3479.             ++en;
  3480.             num = bvect1.get_next(num);
  3481.         }
  3482.         if (num != 0)
  3483.         {
  3484.             cout << "Enumeration error!" << endl;
  3485.             exit(1);
  3486.         }
  3487.     }
  3488. /*
  3489.     {
  3490.         bvect bvect1;
  3491.         bvect1.set();
  3492.         bvect::enumerator en = bvect1.first();
  3493.         unsigned num = bvect1.get_first();
  3494.         while (en < bvect1.end())
  3495.         {
  3496.             if (*en != num)
  3497.             {
  3498.                 cout << "Enumeration comparison failed !" << 
  3499.                         " enumerator = " << *en <<
  3500.                         " get_next() = " << num << endl; 
  3501.                 exit(1);
  3502.             }
  3503.             ++en;
  3504.             num = bvect1.get_next(num);
  3505.         }
  3506.         if (num != 0)
  3507.         {
  3508.             cout << "Enumeration error!" << endl;
  3509.             exit(1);
  3510.         }
  3511.     }
  3512. */
  3513.     {
  3514.         bvect bvect1;
  3515.         int i;
  3516.         for(i = 0; i < 65536; ++i)
  3517.         {
  3518.             bvect1.set_bit(i);
  3519.         }
  3520. /*
  3521.         for(i = 65536*10; i < 65536*20; i+=3)
  3522.         {
  3523.             bvect1.set_bit(i);
  3524.         }
  3525. */
  3526.         bvect::enumerator en = bvect1.first();
  3527.         unsigned num = bvect1.get_first();
  3528.         while (en < bvect1.end())
  3529.         {
  3530.             if (*en != num)
  3531.             {
  3532.                 cout << "Enumeration comparison failed !" << 
  3533.                         " enumerator = " << *en <<
  3534.                         " get_next() = " << num << endl; 
  3535.                 exit(1);
  3536.             }
  3537.             ++en;
  3538.             num = bvect1.get_next(num);
  3539.             if (num == 31)
  3540.             {
  3541.                 num = num + 0;
  3542.             }
  3543.         }
  3544.         if (num != 0)
  3545.         {
  3546.             cout << "Enumeration error!" << endl;
  3547.             exit(1);
  3548.         }
  3549.     }
  3550.     {
  3551.     bvect bvect1;
  3552.     bvect1.set_new_blocks_strat(bm::BM_GAP);
  3553.     bvect1.set_bit(100);
  3554.     bvect::enumerator en = bvect1.first();
  3555.     if (*en != 100)
  3556.     {
  3557.         cout << "Enumerator error !" << endl;
  3558.         exit(1);
  3559.     }
  3560.     bvect1.clear_bit(100);
  3561.     bvect1.set_bit(2000000);
  3562.     en.go_first();
  3563.     if (*en != 2000000)
  3564.     {
  3565.         cout << "Enumerator error !" << endl;
  3566.         exit(1);
  3567.     }
  3568.     bvect1.stat();
  3569.     }
  3570.     {
  3571.         bvect bvect1;
  3572.         bvect1.set_new_blocks_strat(bm::BM_GAP);
  3573.         bvect1.set_bit(0);
  3574.         bvect1.set_bit(1);
  3575.         bvect1.set_bit(10);
  3576.         bvect1.set_bit(100);
  3577.         bvect1.set_bit(1000);
  3578.         bvect::enumerator en = bvect1.first();
  3579.         unsigned num = bvect1.get_first();
  3580.         while (en < bvect1.end())
  3581.         {
  3582.             if (*en != num)
  3583.             {
  3584.                 cout << "Enumeration comparison failed !" << 
  3585.                         " enumerator = " << *en <<
  3586.                         " get_next() = " << num << endl; 
  3587.                 exit(1);
  3588.             }
  3589.             ++en;
  3590.             num = bvect1.get_next(num);
  3591.         }
  3592.         if (num != 0)
  3593.         {
  3594.             cout << "Enumeration error!" << endl;
  3595.             exit(1);
  3596.         }
  3597.     }
  3598. }
  3599. void BlockLevelTest()
  3600. {
  3601.     bvect  bv;
  3602.     bvect  bv2;
  3603.     bv.set_new_blocks_strat(bm::BM_GAP);
  3604.     bv2.set_new_blocks_strat(bm::BM_GAP);
  3605.     int i;
  3606.     for (i = 0; i < 500; i+=1)
  3607.     {
  3608.         bv.set_bit(i);
  3609.     }
  3610.     bv.stat();
  3611.     for (i = 0; i < 1000; i+=2)
  3612.     {
  3613.         bv2.set_bit(i);
  3614.     }
  3615.     bv2.stat();
  3616.     struct bvect::statistics st;
  3617.     bv2.calc_stat(&st);
  3618.     unsigned char* sermem = new unsigned char[st.max_serialize_mem];
  3619.     unsigned slen = bv2.serialize(sermem);
  3620.     assert(slen);
  3621.     slen = 0;
  3622.     
  3623.     bv.deserialize(sermem);
  3624. //    bv.optimize();
  3625.     bv.stat();
  3626. }
  3627. /*
  3628. __int64 CalcBitCount64(__int64 b)
  3629. {
  3630.     b = (b & 0x5555555555555555) + (b >> 1 & 0x5555555555555555);
  3631.     b = (b & 0x3333333333333333) + (b >> 2 & 0x3333333333333333);
  3632.     b = b + (b >> 4) & 0x0F0F0F0F0F0F0F0F;
  3633.     b = b + (b >> 8);
  3634.     b = b + (b >> 16);
  3635.     b = b + (b >> 32) & 0x0000007F;
  3636.     return b;
  3637. }
  3638. unsigned CalcBitCount32(unsigned b)
  3639. {
  3640.     b = (b & 0x55555555) + (b >> 1 & 0x55555555);
  3641.     b = (b & 0x33333333) + (b >> 2 & 0x33333333);
  3642.     b = b + (b >> 4) & 0x0F0F0F0F;
  3643.     b = b + (b >> 8);
  3644.     b = b + (b >> 16) & 0x0000003F;
  3645.     return b;
  3646. }
  3647. */
  3648. void SyntaxTest()
  3649. {
  3650.     cout << "----------------------------- Syntax test." << endl;
  3651.     bvect bv1;
  3652.     bvect bv2(bv1);
  3653.     bvect bv3;
  3654.     bv3.swap(bv1);
  3655.      
  3656.     bv1[100] = true;
  3657.     bool v = bv1[100];
  3658.     assert(v);
  3659.     v = false;
  3660.     bv1[100] = false;
  3661.     bv2 |= bv1;
  3662.     bv2 &= bv1;
  3663.     bv2 ^= bv1;
  3664.     bv2 -= bv1;
  3665.     bv3 = bv1 | bv2;
  3666.     if (bv1 < bv2)
  3667.     {
  3668.     }
  3669.     bvect::reference ref = bv1[10];
  3670.     bool bn = !ref;
  3671.     bool bn2 = ~ref;
  3672.     bn = bn2 = false;
  3673.     ref.flip();
  3674.     bvect bvn = ~bv1;
  3675.     cout << "----------------------------- Syntax test ok." << endl;
  3676. }
  3677. void SetTest()
  3678. {
  3679.     unsigned cnt;
  3680.     bvect bv;
  3681.     bv.set();
  3682.     cnt = bv.count();
  3683.     if (cnt != bm::id_max)
  3684.     {
  3685.         cout << "Set test failed!." << endl;
  3686.         exit(1);
  3687.     }
  3688.     bv.invert();
  3689.     cnt = bv.count();
  3690.     if (cnt != 0)
  3691.     {
  3692.         cout << "Set invert test failed!." << endl;
  3693.         exit(1);
  3694.     }
  3695.     bv.set(0);
  3696.     bv.set(bm::id_max-1);
  3697.     cnt = bv.count();
  3698.     assert(cnt == 2);
  3699.     bv.invert();
  3700.     bv.stat();
  3701.     cnt = bv.count();
  3702.     if (cnt != bm::id_max-2)
  3703.     {
  3704.         cout << "Set invert test failed!." << endl;
  3705.         exit(1);
  3706.     }
  3707. }
  3708. template<class A, class B> void CompareMiniSet(const A& ms,
  3709.                                           const B& bvm)
  3710. {
  3711.     for (unsigned i = 0; i < bm::set_total_blocks; ++i)
  3712.     {
  3713.         bool ms_val = ms.test(i)!=0;
  3714.         bool bvm_val = bvm.is_bit_true(i)!=0;
  3715.         if (ms_val != bvm_val)
  3716.         {
  3717.             printf("MiniSet comparison error: %un",i);
  3718.             exit(1);
  3719.         }
  3720.     }
  3721. }
  3722. void MiniSetTest()
  3723. {
  3724.     cout << "----------------------- MiniSetTest" << endl;
  3725.     {
  3726.     bm::miniset<bm::block_allocator, bm::set_total_blocks> ms;
  3727.     bvect_mini bvm(bm::set_total_blocks);
  3728.     CompareMiniSet(ms, bvm);
  3729.     ms.set(1);
  3730.     bvm.set_bit(1);
  3731.     CompareMiniSet(ms, bvm);
  3732.     unsigned i;
  3733.     for (i = 1; i < 10; i++)
  3734.     {
  3735.         ms.set(i);
  3736.         bvm.set_bit(i);
  3737.     }
  3738.     CompareMiniSet(ms, bvm);
  3739.     for (i = 1; i < 10; i++)
  3740.     {
  3741.         ms.set(i, false);
  3742.         bvm.clear_bit(i);
  3743.     }
  3744.     CompareMiniSet(ms, bvm);
  3745.     for (i = 1; i < 10; i+=3)
  3746.     {
  3747.         ms.set(i);
  3748.         bvm.set_bit(i);
  3749.     }
  3750.     CompareMiniSet(ms, bvm);
  3751.     for (i = 1; i < 5; i+=3)
  3752.     {
  3753.         ms.set(i, false);
  3754.         bvm.clear_bit(i);
  3755.     }
  3756.     CompareMiniSet(ms, bvm);
  3757.     }
  3758.     {
  3759.     bm::miniset<bm::block_allocator, bm::set_total_blocks> ms;
  3760.     bvect_mini bvm(bm::set_total_blocks);
  3761.     ms.set(1);
  3762.     bvm.set_bit(1);
  3763.     CompareMiniSet(ms, bvm);
  3764.     unsigned i;
  3765.     for (i = 1; i < bm::set_total_blocks; i+=3)
  3766.     {
  3767.         ms.set(i);
  3768.         bvm.set_bit(i);
  3769.     }
  3770.     CompareMiniSet(ms, bvm);
  3771.     for (i = 1; i < bm::set_total_blocks/2; i+=3)
  3772.     {
  3773.         ms.set(i, false);
  3774.         bvm.clear_bit(i);
  3775.     }
  3776.     CompareMiniSet(ms, bvm);
  3777.     }
  3778.     {
  3779.     bm::bvmini<bm::set_total_blocks> ms(0);
  3780.     bvect_mini bvm(bm::set_total_blocks);
  3781.     CompareMiniSet(ms, bvm);
  3782.     ms.set(1);
  3783.     bvm.set_bit(1);
  3784.     CompareMiniSet(ms, bvm);
  3785.     unsigned i;
  3786.     for (i = 1; i < 10; i++)
  3787.     {
  3788.         ms.set(i);
  3789.         bvm.set_bit(i);
  3790.     }
  3791.     CompareMiniSet(ms, bvm);
  3792.     for (i = 1; i < 10; i++)
  3793.     {
  3794.         ms.set(i, false);
  3795.         bvm.clear_bit(i);
  3796.     }
  3797.     CompareMiniSet(ms, bvm);
  3798.     for (i = 1; i < bm::set_total_blocks; i+=3)
  3799.     {
  3800.         ms.set(i);
  3801.         bvm.set_bit(i);
  3802.     }
  3803.     CompareMiniSet(ms, bvm);
  3804.     for (i = 1; i < bm::set_total_blocks/2; i+=3)
  3805.     {
  3806.         ms.set(i, false);
  3807.         bvm.clear_bit(i);
  3808.     }
  3809.     CompareMiniSet(ms, bvm);
  3810.     }
  3811.     {
  3812.     bm::miniset<bm::block_allocator, bm::set_total_blocks> ms;
  3813.     bvect_mini bvm(bm::set_total_blocks);
  3814.     ms.set(1);
  3815.     bvm.set_bit(1);
  3816.     CompareMiniSet(ms, bvm);
  3817.     unsigned i;
  3818.     for (i = 1; i < 15; i+=3)
  3819.     {
  3820.         ms.set(i);
  3821.         bvm.set_bit(i);
  3822.     }
  3823.     CompareMiniSet(ms, bvm);
  3824.     for (i = 1; i < 7; i+=3)
  3825.     {
  3826.         ms.set(i, false);
  3827.         bvm.clear_bit(i);
  3828.     }
  3829.     CompareMiniSet(ms, bvm);
  3830.     }
  3831.     cout << "----------------------- MiniSetTest ok" << endl;
  3832. }
  3833. unsigned CalcBitCount32(unsigned b)
  3834. {
  3835.     b = (b & 0x55555555) + (b >> 1 & 0x55555555);
  3836.     b = (b & 0x33333333) + (b >> 2 & 0x33333333);
  3837.     b = b + (b >> 4) & 0x0F0F0F0F;
  3838.     b = b + (b >> 8);
  3839.     b = b + (b >> 16) & 0x0000003F;
  3840.     return b;
  3841. }
  3842. void PrintGapLevels(const gap_word_t* glevel)
  3843. {
  3844.     cout << "Gap levels:" << endl;
  3845.     unsigned i;
  3846.     for (i = 0; i < bm::gap_levels; ++i)
  3847.     {
  3848.         cout << glevel[i] << ",";
  3849.     }
  3850.     cout << endl;
  3851. }
  3852. void OptimGAPTest()
  3853. {
  3854.     gap_word_t    glevel[bm::gap_levels];
  3855.     ::memcpy(glevel, gap_len_table<true>::_len, bm::gap_levels * sizeof(gap_word_t));
  3856.     {
  3857.     gap_word_t  length[] = { 2, 2, 5, 5, 10, 11, 12 };
  3858.     unsigned lsize = sizeof(length) / sizeof(gap_word_t);
  3859.     bm::improve_gap_levels(length, length + lsize, glevel);
  3860.     PrintGapLevels(glevel);
  3861.     }
  3862.     {
  3863.     gap_word_t  length[] = { 3, 5, 15, 15, 100, 110, 120 };
  3864.     unsigned lsize = sizeof(length) / sizeof(gap_word_t);
  3865.     bm::improve_gap_levels(length, length + lsize, glevel);
  3866.     PrintGapLevels(glevel);
  3867.     }
  3868.     {
  3869.     gap_word_t  length[] = { 15, 80, 5, 3, 100, 110, 95 };
  3870.     unsigned lsize = sizeof(length) / sizeof(gap_word_t);
  3871.     bm::improve_gap_levels(length, length + lsize, glevel);
  3872.     PrintGapLevels(glevel);
  3873.     }
  3874.     {
  3875.     gap_word_t  length[] = 
  3876.     { 16,30,14,24,14,30,18,14,12,16,8,38,28,4,20,18,28,22,32,14,12,16,10,8,14,18,14,8,
  3877.       16,30,8,8,58,28,18,4,26,14,52,12,18,10,14,18,22,18,20,70,12,6,26,6,8,22,12,4,8,8,
  3878.       8,54,18,6,8,4,4,10,4,4,4,4,4,6,22,14,38,40,56,50,6,10,8,18,82,16,6,18,20,12,12,
  3879.       16,8,14,14,10,16,12,10,16,14,12,18,14,18,34,14,12,18,18,10,20,10,18,8,14,14,22,16,
  3880.       10,10,18,8,20,14,10,14,12,12,14,16,16,6,10,14,6,10,10,10,10,12,4,8,8,8,10,10,8,
  3881.       8,12,10,10,14,14,14,8,4,4,10,10,4,10,4,8,6,52,104,584,218
  3882.     };
  3883.     unsigned lsize = sizeof(length) / sizeof(gap_word_t);
  3884.     bm::improve_gap_levels(length, length + lsize, glevel);
  3885.     PrintGapLevels(glevel);
  3886.     }
  3887.     {
  3888.     gap_word_t  length[] = {
  3889.      30,46,26,4,4,68,72,6,10,4,6,14,6,42,198,22,12,4,6,24,12,8,18,4,6,10,6,4,6,6,12,6
  3890.     ,6,4,4,78,38,8,52,4,8,10,6,8,8,6,10,4,6,6,4,10,6,8,16,22,28,14,10,10,16,10,20,10
  3891.     ,14,12,8,18,4,8,10,6,10,4,6,12,16,12,6,4,8,4,14,14,6,8,4,10,10,8,8,6,8,6,8,4,8,4
  3892.     ,8,10,6,4,6 
  3893.     };
  3894.     unsigned lsize = sizeof(length) / sizeof(gap_word_t);
  3895.     bm::improve_gap_levels(length, length + lsize, glevel);
  3896.     PrintGapLevels(glevel);
  3897.     }
  3898. }
  3899. void BitCountChangeTest()
  3900. {
  3901.     cout << "---------------------------- BitCountChangeTest " << endl;
  3902.     unsigned i;
  3903.     for(i = 0xFFFFFFFF; i; i <<= 1) 
  3904.     { 
  3905.         unsigned a0 = bm::bit_count_change(i);
  3906.         unsigned a1 = BitCountChange(i);
  3907.         
  3908.         if (a0 != a1)
  3909.         {
  3910.             cout << hex 
  3911.                  << "Bit count change test failed!" 
  3912.                  << " i = " << i << " return = " 
  3913.                  << a0 << " check = " << a1
  3914.                  << endl;
  3915.             exit(1);
  3916.         }
  3917.     }
  3918.     cout << "---------------------------- STEP 2 " << endl;
  3919.     for(i = 0xFFFFFFFF; i; i >>= 1) 
  3920.     { 
  3921.         unsigned a0 = bm::bit_count_change(i);
  3922.         unsigned a1 = BitCountChange(i);
  3923.         
  3924.         if (a0 != a1)
  3925.         {
  3926.             cout << "Bit count change test failed!" 
  3927.                  << " i = " << i << " return = " 
  3928.                  << a0 << " check = " << a1
  3929.                  << endl;
  3930.             exit(1);
  3931.         }
  3932.     }
  3933.     cout << "---------------------------- STEP 3 " << endl;
  3934.     for (i = 0; i < 0xFFFFFFF; ++i)
  3935.     {
  3936.         unsigned a0 = bm::bit_count_change(i);
  3937.         unsigned a1 = BitCountChange(i);
  3938.         
  3939.         if (a0 != a1)
  3940.         {
  3941.             cout << "Bit count change test failed!" 
  3942.                  << " i = " << i << " return = " 
  3943.                  << a0 << " check = " << a1
  3944.                  << endl;
  3945.             exit(1);
  3946.         }
  3947.     }
  3948.    
  3949.     bm::word_t   arr[16] = {0,};
  3950.     arr[0] = (bm::word_t)(1 << 31);
  3951.     arr[1] = 1; //(bm::word_t)(1 << 31);
  3952.     
  3953.     bm::id_t cnt;
  3954.     
  3955.     cnt = bm::bit_count_change(arr[1]);
  3956.     cout << cnt << endl;
  3957.     if (cnt != 2)
  3958.     {
  3959.         cout << "0.count_change() failed " << cnt << endl;
  3960.         exit(1);
  3961.     }
  3962.     
  3963.     cnt = bm::bit_block_calc_count_change(arr, arr+4);
  3964.     
  3965.     if (cnt != 3)
  3966.     {
  3967.         cout << "1.count_intervals() failed " << cnt << endl;
  3968.         exit(1);
  3969.     }
  3970.     arr[0] = arr[1] = arr[2] = 0xFFFFFFFF;
  3971.     arr[3] = (bm::word_t)(0xFFFFFFFF >> 1);
  3972.     
  3973.     cnt = bm::bit_block_calc_count_change(arr, arr+4);
  3974.     cout << cnt << endl;
  3975.     
  3976.     if (cnt != 2)
  3977.     {
  3978.         cout << "1.1 count_intervals() failed " << cnt << endl;
  3979.         exit(1);
  3980.     }
  3981.     
  3982.  
  3983.     cout << "---------------------------- STEP 4 " << endl;
  3984.     bvect   bv1;
  3985.     cnt = bm::count_intervals(bv1);
  3986.     
  3987.     if (cnt != 1)
  3988.     {
  3989.         cout << "1.count_intervals() failed " << cnt << endl;
  3990.         exit(1);
  3991.     }
  3992.     CheckIntervals(bv1, 65536);
  3993.     
  3994.     bv1.invert();
  3995.     cnt = count_intervals(bv1);
  3996.     cout << "Inverted cnt=" << cnt << endl;
  3997.     
  3998.     if (cnt != 2)
  3999.     {
  4000.         cout << "2.inverted count_intervals() failed " << cnt << endl;
  4001.         exit(1);
  4002.     }
  4003.     
  4004.     bv1.invert();
  4005.         
  4006.     for (i = 10; i < 100000; ++i)
  4007.     {
  4008.         bv1.set(i);
  4009.     }
  4010.     
  4011.     cnt = count_intervals(bv1);
  4012.     
  4013.     if (cnt != 3)
  4014.     {
  4015.         cout << "3.count_intervals() failed " << cnt << endl;
  4016.         exit(1);
  4017.     }
  4018.     cout << "-----" << endl;
  4019.     CheckIntervals(bv1, 65536*2);
  4020.     cout << "Optmization..." << endl; 
  4021.     bv1.optimize();
  4022.     cnt = count_intervals(bv1);
  4023.     
  4024.     if (cnt != 3)
  4025.     {
  4026.         cout << "4.count_intervals() failed " << cnt << endl;
  4027.         exit(1);
  4028.     }
  4029.     
  4030.     CheckIntervals(bv1, 65536*2);
  4031.     cout << "---------------------------- BitCountChangeTest Ok." << endl;
  4032. }
  4033. /*
  4034. #define POWER_CHECK(w, mask) 
  4035.     (bm::bit_count_table<true>::_count[(w&mask) ^ ((w&mask)-1)])
  4036. void BitListTest()
  4037. {
  4038.     unsigned bits[64] = {0,};
  4039.     unsigned w = 0;
  4040.     w = (1 << 3) | 1;
  4041.     int bn3 = POWER_CHECK(w, 1 << 3) - 1;
  4042.     int bn2 = POWER_CHECK(w, 1 << 2) - 1;
  4043.     int bn0 = POWER_CHECK(w, 1 << 0) - 1;
  4044.     bit_list(w, bits+1);
  4045.   
  4046. }
  4047. */
  4048. int main(void)
  4049. {
  4050.     time_t      start_time = time(0);
  4051.     time_t      finish_time;
  4052.     OptimGAPTest();
  4053.     CalcBeginMask();
  4054.     CalcEndMask();
  4055. //   cout << sizeof(__int64) << endl;
  4056. //   ::srand((unsigned)::time(NULL));
  4057.      MiniSetTest();
  4058.      SyntaxTest();
  4059.      SetTest();
  4060.     
  4061.      BitCountChangeTest();
  4062.      EnumeratorTest();
  4063.      BasicFunctionalityTest();
  4064.      ClearAllTest();
  4065.      GAPCheck();
  4066.      MaxSTest();
  4067.      GetNextTest();
  4068.      SimpleRandomFillTest();
  4069.      
  4070.      RangeRandomFillTest();
  4071.      AndOperationsTest();   
  4072.            
  4073.      OrOperationsTest();
  4074.      XorOperationsTest();
  4075.      SubOperationsTest();
  4076.      WordCmpTest();
  4077.      ComparisonTest();
  4078.      MutationTest();
  4079.      MutationOperationsTest();
  4080.    
  4081.      SerializationTest();
  4082.      DesrializationTest2();
  4083.      BlockLevelTest();
  4084.      StressTest(800);
  4085.     finish_time = time(0);
  4086.     cout << "Test execution time = " << finish_time - start_time << endl;
  4087. #ifdef MEM_DEBUG
  4088.     cout << "Number of BLOCK allocations = " <<  dbg_block_allocator::na_ << endl;
  4089.     cout << "Number of PTR allocations = " <<  dbg_ptr_allocator::na_ << endl << endl;
  4090.     assert(dbg_block_allocator::balance() == 0);
  4091.     assert(dbg_ptr_allocator::balance() == 0);
  4092. #endif
  4093.     return 0;
  4094. }