@Test public void ortest4() { final MutableRoaringBitmap rb = new MutableRoaringBitmap(); final MutableRoaringBitmap rb2 = new MutableRoaringBitmap(); for (int i = 0; i < 200000; i += 4) rb2.add(i); for (int i = 200000; i < 400000; i += 14) rb2.add(i); final int rb2card = rb2.getCardinality(); // check or against an empty bitmap final MutableRoaringBitmap orresult = MutableRoaringBitmap.or(rb, rb2); final MutableRoaringBitmap off = MutableRoaringBitmap.or(rb2, rb); Assert.assertTrue(orresult.equals(off)); Assert.assertEquals(rb2card, orresult.getCardinality()); for (int i = 500000; i < 600000; i += 14) rb.add(i); for (int i = 200000; i < 400000; i += 3) rb2.add(i); // check or against an empty bitmap final MutableRoaringBitmap orresult2 = MutableRoaringBitmap.or(rb, rb2); Assert.assertEquals(rb2card, orresult.getCardinality()); Assert.assertEquals(rb2.getCardinality() + rb.getCardinality(), orresult2.getCardinality()); rb.or(rb2); Assert.assertTrue(rb.equals(orresult2)); }
@Test public void andtest4() { final MutableRoaringBitmap rb = new MutableRoaringBitmap(); final MutableRoaringBitmap rb2 = new MutableRoaringBitmap(); for (int i = 0; i < 200000; i += 4) rb2.add(i); for (int i = 200000; i < 400000; i += 14) rb2.add(i); // check or against an empty bitmap final MutableRoaringBitmap andresult = MutableRoaringBitmap.and(rb, rb2); final MutableRoaringBitmap off = MutableRoaringBitmap.and(rb2, rb); Assert.assertTrue(andresult.equals(off)); Assert.assertEquals(0, andresult.getCardinality()); for (int i = 500000; i < 600000; i += 14) rb.add(i); for (int i = 200000; i < 400000; i += 3) rb2.add(i); // check or against an empty bitmap final MutableRoaringBitmap andresult2 = MutableRoaringBitmap.and(rb, rb2); Assert.assertEquals(0, andresult.getCardinality()); Assert.assertEquals(0, andresult2.getCardinality()); for (int i = 0; i < 200000; i += 4) rb.add(i); for (int i = 200000; i < 400000; i += 14) rb.add(i); Assert.assertEquals(0, andresult.getCardinality()); final MutableRoaringBitmap rc = MutableRoaringBitmap.and(rb, rb2); rb.and(rb2); Assert.assertEquals(rc.getCardinality(), rb.getCardinality()); }
@Test public void ORtest() { final MutableRoaringBitmap rr = new MutableRoaringBitmap(); for (int k = 4000; k < 4256; ++k) rr.add(k); for (int k = 65536; k < 65536 + 4000; ++k) rr.add(k); for (int k = 3 * 65536; k < 3 * 65536 + 9000; ++k) rr.add(k); for (int k = 4 * 65535; k < 4 * 65535 + 7000; ++k) rr.add(k); for (int k = 6 * 65535; k < 6 * 65535 + 10000; ++k) rr.add(k); for (int k = 8 * 65535; k < 8 * 65535 + 1000; ++k) rr.add(k); for (int k = 9 * 65535; k < 9 * 65535 + 30000; ++k) rr.add(k); final MutableRoaringBitmap rr2 = new MutableRoaringBitmap(); for (int k = 4000; k < 4256; ++k) { rr2.add(k); } for (int k = 65536; k < 65536 + 4000; ++k) { rr2.add(k); } for (int k = 3 * 65536 + 2000; k < 3 * 65536 + 6000; ++k) { rr2.add(k); } for (int k = 6 * 65535; k < 6 * 65535 + 1000; ++k) { rr2.add(k); } for (int k = 7 * 65535; k < 7 * 65535 + 1000; ++k) { rr2.add(k); } for (int k = 10 * 65535; k < 10 * 65535 + 5000; ++k) { rr2.add(k); } final MutableRoaringBitmap correct = MutableRoaringBitmap.or(rr, rr2); rr.or(rr2); Assert.assertTrue(correct.equals(rr)); }
@Test public void testIterator() { MutableRoaringBitmap rb = new MutableRoaringBitmap(); for (int k = 0; k < 4000; ++k) rb.add(k); for (int k = 0; k < 1000; ++k) rb.add(k * 100); MutableRoaringBitmap copy1 = new MutableRoaringBitmap(); for (int x : rb) { copy1.add(x); } Assert.assertTrue(copy1.equals(rb)); MutableRoaringBitmap copy2 = new MutableRoaringBitmap(); IntIterator i = rb.getIntIterator(); Iterator<Integer> is = rb.iterator(); while (i.hasNext()) { if (!is.hasNext()) throw new RuntimeException("bug"); int x = i.next(); copy2.add(x); int xs = is.next(); if (x != xs) throw new RuntimeException("values differ " + x + " " + xs); } if (is.hasNext()) throw new RuntimeException("bug: more data available"); Assert.assertTrue(copy2.equals(rb)); }
@Test public void testSerialization2() throws IOException, ClassNotFoundException { final MutableRoaringBitmap rr = new MutableRoaringBitmap(); for (int k = 200; k < 400; ++k) rr.add(k); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); // Note: you could use a file output steam instead of // ByteArrayOutputStream final ObjectOutputStream oo = new ObjectOutputStream(bos); rr.writeExternal(oo); oo.close(); final MutableRoaringBitmap rrback = new MutableRoaringBitmap(); final ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); rrback.readExternal(new ObjectInputStream(bis)); Assert.assertEquals(rr.getCardinality(), rrback.getCardinality()); Assert.assertTrue(rr.equals(rrback)); }
/** Test massive and. */ @Test public void testMassiveAnd() { System.out.println("testing massive logical and"); MutableRoaringBitmap[] ewah = new MutableRoaringBitmap[1024]; for (int k = 0; k < ewah.length; ++k) ewah[k] = new MutableRoaringBitmap(); int howmany = 1000000; for (int k = 0; k < howmany; ++k) { ewah[Math.abs(k + 2 * k * k) % ewah.length].add(k); } for (int k = 3; k < ewah.length; k += 3) ewah[k].flip(13, howmany / 2); for (int N = 2; N < ewah.length; ++N) { MutableRoaringBitmap answer = ewah[0]; for (int k = 1; k < N; ++k) answer = MutableRoaringBitmap.and(answer, ewah[k]); MutableRoaringBitmap answer2 = BufferFastAggregation.and(Arrays.copyOf(ewah, N)); Assert.assertTrue(answer.equals(answer2)); } }
@Test public void testSerialization4() throws IOException, ClassNotFoundException { final MutableRoaringBitmap rr = new MutableRoaringBitmap(); for (int k = 1; k <= 10000000; k += 10) rr.add(k); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); // Note: you could use a file output steam instead of // ByteArrayOutputStream int howmuch = rr.serializedSizeInBytes(); final DataOutputStream oo = new DataOutputStream(bos); rr.serialize(oo); oo.close(); Assert.assertEquals(howmuch, bos.toByteArray().length); final MutableRoaringBitmap rrback = new MutableRoaringBitmap(); final ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); rrback.deserialize(new DataInputStream(bis)); Assert.assertEquals(rr.getCardinality(), rrback.getCardinality()); Assert.assertTrue(rr.equals(rrback)); }
/** Test massive or. */ @Test public void testMassiveOr() { System.out.println("testing massive logical or (can take a couple of minutes)"); final int N = 128; for (int howmany = 512; howmany <= 1000000; howmany *= 2) { MutableRoaringBitmap[] ewah = new MutableRoaringBitmap[N]; for (int k = 0; k < ewah.length; ++k) ewah[k] = new MutableRoaringBitmap(); for (int k = 0; k < howmany; ++k) { ewah[Math.abs(k + 2 * k * k) % ewah.length].add(k); } for (int k = 3; k < ewah.length; k += 3) ewah[k].flip(13, howmany / 2); MutableRoaringBitmap answer = ewah[0]; for (int k = 1; k < ewah.length; ++k) { answer = MutableRoaringBitmap.or(answer, ewah[k]); } MutableRoaringBitmap answer2 = BufferFastAggregation.or(ewah); MutableRoaringBitmap answer3 = BufferFastAggregation.horizontal_or(ewah); Assert.assertTrue(answer.equals(answer2)); Assert.assertTrue(answer.equals(answer3)); } }
public void rTest(final int N) { System.out.println("rtest N=" + N); for (int gap = 1; gap <= 65536; gap *= 2) { final BitSet bs1 = new BitSet(); final MutableRoaringBitmap rb1 = new MutableRoaringBitmap(); for (int x = 0; x <= N; x += gap) { bs1.set(x); rb1.add(x); } if (bs1.cardinality() != rb1.getCardinality()) throw new RuntimeException("different card"); if (!equals(bs1, rb1)) throw new RuntimeException("basic bug"); for (int offset = 1; offset <= gap; offset *= 2) { final BitSet bs2 = new BitSet(); final MutableRoaringBitmap rb2 = new MutableRoaringBitmap(); for (int x = 0; x <= N; x += gap) { bs2.set(x + offset); rb2.add(x + offset); } if (bs2.cardinality() != rb2.getCardinality()) throw new RuntimeException("different card"); if (!equals(bs2, rb2)) throw new RuntimeException("basic bug"); BitSet clonebs1; // testing AND clonebs1 = (BitSet) bs1.clone(); clonebs1.and(bs2); if (!equals(clonebs1, MutableRoaringBitmap.and(rb1, rb2))) throw new RuntimeException("bug and"); { final MutableRoaringBitmap t = rb1.clone(); t.and(rb2); if (!equals(clonebs1, t)) throw new RuntimeException("bug inplace and"); if (!t.equals(MutableRoaringBitmap.and(rb1, rb2))) { System.out.println( t.highLowContainer.getContainerAtIndex(0).getClass().getCanonicalName()); System.out.println( MutableRoaringBitmap.and(rb1, rb2) .highLowContainer .getContainerAtIndex(0) .getClass() .getCanonicalName()); throw new RuntimeException("bug inplace and"); } } // testing OR clonebs1 = (BitSet) bs1.clone(); clonebs1.or(bs2); if (!equals(clonebs1, MutableRoaringBitmap.or(rb1, rb2))) throw new RuntimeException("bug or"); { final MutableRoaringBitmap t = rb1.clone(); t.or(rb2); if (!equals(clonebs1, t)) throw new RuntimeException("bug or"); if (!t.equals(MutableRoaringBitmap.or(rb1, rb2))) throw new RuntimeException("bug or"); if (!t.toString().equals(MutableRoaringBitmap.or(rb1, rb2).toString())) throw new RuntimeException("bug or"); } // testing XOR clonebs1 = (BitSet) bs1.clone(); clonebs1.xor(bs2); if (!equals(clonebs1, MutableRoaringBitmap.xor(rb1, rb2))) { throw new RuntimeException("bug xor"); } { final MutableRoaringBitmap t = rb1.clone(); t.xor(rb2); if (!equals(clonebs1, t)) throw new RuntimeException("bug xor"); if (!t.equals(MutableRoaringBitmap.xor(rb1, rb2))) { System.out.println(t); System.out.println(MutableRoaringBitmap.xor(rb1, rb2)); System.out.println( Arrays.equals(t.toArray(), MutableRoaringBitmap.xor(rb1, rb2).toArray())); throw new RuntimeException("bug xor"); } } // testing NOTAND clonebs1 = (BitSet) bs1.clone(); clonebs1.andNot(bs2); if (!equals(clonebs1, MutableRoaringBitmap.andNot(rb1, rb2))) { throw new RuntimeException("bug andnot"); } clonebs1 = (BitSet) bs2.clone(); clonebs1.andNot(bs1); if (!equals(clonebs1, MutableRoaringBitmap.andNot(rb2, rb1))) { throw new RuntimeException("bug andnot"); } { final MutableRoaringBitmap t = rb2.clone(); t.andNot(rb1); if (!equals(clonebs1, t)) { throw new RuntimeException("bug inplace andnot"); } final MutableRoaringBitmap g = MutableRoaringBitmap.andNot(rb2, rb1); if (!equals(clonebs1, g)) { throw new RuntimeException("bug andnot"); } if (!t.equals(g)) throw new RuntimeException("bug"); } clonebs1 = (BitSet) bs1.clone(); clonebs1.andNot(bs2); if (!equals(clonebs1, MutableRoaringBitmap.andNot(rb1, rb2))) { throw new RuntimeException("bug andnot"); } { final MutableRoaringBitmap t = rb1.clone(); t.andNot(rb2); if (!equals(clonebs1, t)) { throw new RuntimeException("bug andnot"); } final MutableRoaringBitmap g = MutableRoaringBitmap.andNot(rb1, rb2); if (!equals(clonebs1, g)) { throw new RuntimeException("bug andnot"); } if (!t.equals(g)) throw new RuntimeException("bug"); } } } }