package org.rdfhdt.hdt.compact.bitmap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.BitSet; import java.util.Random; import org.junit.Before; import org.junit.Test; import org.rdfhdt.hdt.util.io.IOUtil; public class BitSequence375Test { final static int num=10000; Bitmap375 bitseq; BitSet bitset; @Before public void setUp() throws Exception { Random r = new Random(1); bitseq = new Bitmap375(num); bitset = new BitSet(); for(int i=0;i<num;i++) { boolean value =r.nextBoolean(); bitset.set(i, value); bitseq.set(i, value); } } // Naive impl of select0 // public long select0b(long x) { // if(x<=0) { // return -1; // } // long numzeros=0; // for(long i=0;i<getNumBits();i++) { // if(!access(i)) { // numzeros++; // } // if(numzeros==x) { // return i; // } // } // return getNumBits(); // } @Test public void testLoadSave() { try { ByteArrayOutputStream out = new ByteArrayOutputStream(); bitseq.save(out, null); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); Bitmap375 loaded = new Bitmap375(); loaded.load(in, null); assertEquals("Save/Load different number of elements", bitseq.getNumBits(), loaded.getNumBits()); for(int i=0;i<bitseq.getNumBits();i++) { assertEquals("Save/Load different value", bitseq.access(i), loaded.access(i)); } } catch (IOException e) { fail("Exception thrown: "+e); } } @Test public void testNumbits() { assertEquals(0, Bitmap64.lastWordNumBits(0)); assertEquals(1, Bitmap64.lastWordNumBits(1)); assertEquals(64, Bitmap64.lastWordNumBits(64)); assertEquals(1, Bitmap64.lastWordNumBits(65)); assertEquals(64, Bitmap64.lastWordNumBits(128)); assertEquals(1, Bitmap64.lastWordNumBits(129)); // assertEquals(0, Bitmap64.numWords(0)); assertEquals(1, Bitmap64.numWords(1)); assertEquals(1, Bitmap64.numWords(64)); assertEquals(2, Bitmap64.numWords(65)); assertEquals(5, Bitmap64.numWords(257)); // for(int i=0;i<1000;i++) { // int words=(int) Bitmap64.numWords(i); // int bitsLast=Bitmap64.lastWordNumBits(i); // int bytes = (int) Bitmap64.numBytes(i); // System.out.println(i+" bits "+bytes+" bytes "+words+" words / "+bitsLast+" bits last."); // } } @Test public void testSize() { assertEquals(bitseq.getNumBits(), num); } @Test public void testAccess() { for(int i=0;i<bitset.size();i++) { assertEquals(bitset.get(i), bitseq.access(i)); } } @Test public void testRank1() { long count = 0; for(long i=0;i<bitseq.getNumBits();i++) { if(bitseq.access(i)) { count++; // assertEquals("Wrong rank1", count, bitseq.rank1(i)); // assertEquals("Wrong rank new", bitseq.rank1(i), bitnew.rank1(i)); if(bitseq.rank1(i)!=count) { System.out.println("Different"); long a= bitseq.rank1(i); } assertEquals(count, bitseq.rank1(i)); } } } @Test public void testSelect1() { for(long i=0;i<bitseq.getNumBits();i++) { // System.out.print("***"+i+"> "+(bitseq.access(i)?1:0)+ " \t Rank1("+i+"): "+ bitseq.rank1(i) + " Select1("+bitseq.rank1(i)+"): " + bitseq.select1(bitseq.rank1(i))+ " SelectNext1("+i+"): "+ bitseq.selectNext1(i)); if(bitseq.access(i)) { assertEquals("Select1 wrong",i, (bitseq.select1(bitseq.rank1(i)))); } } } public long select0b(Bitmap375 bitseq, long x) { if(x<=0) { return -1; } long numzeros=0; for(long i=0;i<bitseq.getNumBits();i++) { if(!bitseq.access(i)) { numzeros++; } if(numzeros==x) { return i; } } return bitseq.getNumBits(); } @Test public void testSelect0() { long numzeros=0; for(long i=0;i<bitseq.getNumBits();i++) { // System.out.print("***"+i+"> "+(bitseq.access(i)?1:0)+ " \t Rank1("+i+"): "+ bitseq.rank1(i) + " Select1("+bitseq.rank1(i)+"): " + bitseq.select1(bitseq.rank1(i))+ " SelectNext1("+i+"): "+ bitseq.selectNext1(i)); if(bitseq.access(i)) { // assertEquals("Select0 wrong",i, (bitseq.select0(bitseq.rank0(i)))); } else { numzeros++; } long rk = bitseq.rank0(i); long sel = bitseq.select0(rk); long selb = select0b(bitseq, rk); // System.out.println(i+" => "+ (bitseq.access(i) ? "1" : "0") +" Zeros: "+numzeros+" Rank0="+rk+ " Sel0="+sel+" Sel0b="+selb); assertEquals("Select0 wrong", sel, selb); } } @Test public void testCountOnes() { int count = 0; for(int i=0;i<bitseq.getNumBits();i++) { if(bitseq.access(i)) { count++; } } assertEquals("Wrong count ones", count, bitseq.countOnes()); } @Test public void testCountZeros() { int count = 0; for(int i=0;i<bitseq.getNumBits();i++) { if(!bitseq.access(i)) { count++; } } assertEquals("Wrong count zeros", count, bitseq.countZeros()); } @Test public void testBitutilSelect0() { // IOUtil.printBitsln(bitseq.words[0],64); int numbits = 64-Long.bitCount(bitseq.words[0]); // for(int i=1;i<=numbits;i++) { // System.out.println("Select0("+i+") = "+BitUtil.select0(bitseq.words[0], i)); // } } }