diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index dd0a3c0a0..9d5d321bb 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -42,7 +42,7 @@ Make sure to compare your version against the latest available version at https:
**Java version:**
-Please tell us which Java version you are using.
+Please tell us which Java version you are using.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 9d8aa8f83..18c2b823c 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -6,4 +6,3 @@
### Automated Checks
- [ ] I have run `./gradlew test` and made sure that my PR does not break any unit test.
-- [ ] I have run `./gradlew checkstyleMain` or the equivalent and corrected the formatting warnings reported.
diff --git a/.github/workflows/checkascii.yml b/.github/workflows/checkascii.yml
index 720bedd4b..29317dcac 100644
--- a/.github/workflows/checkascii.yml
+++ b/.github/workflows/checkascii.yml
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Check ASCII
run: |
find . -type f -name '*.java' | xargs file | grep -qv ASCII || exit 0 && exit 1
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index a6923df69..14d4bc438 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml
index 497d1f389..375241d72 100644
--- a/.github/workflows/gradle-wrapper-validation.yml
+++ b/.github/workflows/gradle-wrapper-validation.yml
@@ -6,5 +6,5 @@ jobs:
name: "validation"
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: gradle/wrapper-validation-action@v1
diff --git a/.github/workflows/java-all-versions.yml b/.github/workflows/java-all-versions.yml
index 35474f684..ecfa7471d 100644
--- a/.github/workflows/java-all-versions.yml
+++ b/.github/workflows/java-all-versions.yml
@@ -1,4 +1,4 @@
-name: Java 8, 11, 17 CI
+name: Java 8, 11, 17, 21 CI
on: [push,pull_request]
@@ -7,22 +7,23 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - name: Set up JDKs 8, 11, 17
- uses: actions/setup-java@v3
+ - uses: actions/checkout@v4
+ - name: Set up JDKs 8, 11, 17, 21
+ uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: |
8
11
17
+ 21
- name: Build with Gradle
run: ./gradlew assemble
- - name: Style check
- run: ./gradlew checkstyleMain
- name: Test with Java 8
run: ./gradlew test -PtestOnJava=8 --stacktrace
- name: Test with Java 11
run: ./gradlew test -PtestOnJava=11 --stacktrace
- name: Test with Java 17
run: ./gradlew test -PtestOnJava=17 --stacktrace
+ - name: Test with Java 21
+ run: ./gradlew test -PtestOnJava=21 --stacktrace
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index ff4acb6b0..dcfa5e89a 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -7,9 +7,9 @@ jobs:
runs-on: macos-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Set up JDK 11
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 11
diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml
index 65939873e..d2c44f100 100644
--- a/.github/workflows/releases.yml
+++ b/.github/workflows/releases.yml
@@ -1,22 +1,30 @@
-name: "tagged-release"
-
+name: Publish package to GitHub Packages
on:
- push:
- tags:
- - "(\\d)+\\.(\\d)+\\.(\\d)+"
-
+ release:
+ types: [created]
jobs:
- tagged-release:
- name: "Tagged Release"
- runs-on: "ubuntu-latest"
-
+ publish:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
steps:
- - name: "Creating a release"
- run: |
- echo "done!"
-
- - uses: "marvinpinto/action-automatic-releases@latest"
+ - uses: actions/checkout@v4
with:
- repo_token: "${{ secrets.GITHUB_TOKEN }}"
- prerelease: false
-
+ path: roaring
+ - uses: actions/setup-java@v4
+ with:
+ java-version: '11'
+ distribution: 'temurin'
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
+ - name: Build with Gradle
+ run: ./gradlew build -x test -i
+ working-directory: ./roaring
+ - name: Publish package
+ run: ./gradlew publishSonatypePublicationToGitHubPackagesRepository -i
+ working-directory: ./roaring
+ env:
+ GITHUB_USER: ${{ github.actor }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
diff --git a/.gitignore b/.gitignore
index 5ec4ec483..0d544b3ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@ build/
# OS X
.DS_Store
+.java-version
# intellij
.idea
@@ -30,5 +31,4 @@ pom.xml.tag
# We ignore .bin files as they may be generated by fuzz-tests
# Beware there is real .bin files in /testdata
-# git add --force ./RoaringBitmap/src/test/resources/testdata/*.bin
*.bin
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 2492d43e9..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-language: java
-sudo: false
-
-jdk:
- - openjdk8
- - openjdk11
- - openjdk14
- - oraclejdk11
-
-
-############
-# We still support and test jdk8 for clients, but on travis we no longer build with jkd8, see
-# https://github.com/RoaringBitmap/RoaringBitmap/pull/290 for rationale.
-##########
-# we removed oraclejdk7 as per https://github.com/RoaringBitmap/RoaringBitmap/pull/176#issuecomment-322257170
-#########
-
-# from https://docs.travis-ci.com/user/languages/java/#caching
-before_cache:
- - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
-cache:
- directories:
- - $HOME/.gradle/caches/
- - $HOME/.gradle/wrapper/
-
-# Install silently to ensure all pom are installed and compilation is OK: actual checks will be processed by script:
-# Including testClasses so tests will compile too.
-install: "./gradlew assemble testClasses"
-
-branches:
- only:
- - master
-
-script:
- # run checkstyle, etc, without the tests to fail fast
- - ./gradlew check -x test
- - ./gradlew test jacocoTestReport -DBITMAP_TYPES=ROARING_ONLY
-
-after_success:
- - ./gradlew coveralls
diff --git a/LICENSE-2.0.txt b/LICENSE-2.0.txt
index efa0e258b..3bdd00362 100644
--- a/LICENSE-2.0.txt
+++ b/LICENSE-2.0.txt
@@ -187,7 +187,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright 2013-2016 the RoaringBitmap authors
+ Copyright 2013-2016 the RoaringBitmap authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/README.md b/README.md
index e86816eee..c583fa4c7 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,34 @@ RoaringBitmap
[![docs-badge][]][docs]
![Java 11 CI](https://github.com/RoaringBitmap/RoaringBitmap/workflows/Java%2011%20CI/badge.svg)
+- [Introduction](#introduction)
+- [When should you use a bitmap?](#when-should-you-use-a-bitmap)
+- [When should you use compressed bitmaps?](#when-should-you-use-compressed-bitmaps)
+- [How does Roaring compare with the alternatives?](#how-does-roaring-compare-with-the-alternatives)
+- [Code sample](#code-sample)
+- [API docs](#api-docs)
+- [Download](#download)
+- [Usage within a Maven project](#usage-within-a-maven-project)
+- [Usage within a gradle project](#usage-within-a-gradle-project)
+- [Scientific Documentation](#scientific-documentation)
+- [Unsigned integers](#unsigned-integers)
+- [Working with memory-mapped bitmaps](#working-with-memory-mapped-bitmaps)
+- [Thread safety](#thread-safety)
+- [Kryo](#kryo)
+- [64-bit integers (long)](#64-bit-integers-long)
+- [Range Bitmaps](#range-bitmaps)
+- [Prerequisites](#prerequisites)
+- [Usage for RoaringBitmap Developers](#usage-for-roaringbitmap-developers)
+- [IntelliJ and Eclipse](#intellij-and-eclipse)
+- [Contributing](#contributing)
+- [FAQ](#faq)
+- [Benchmark](#benchmark)
+- [Mailing list/discussion group](#mailing-listdiscussion-group)
+- [Funding](#funding)
+
+Introduction
+-------------
+
Bitsets, also called bitmaps, are commonly used as fast data structures.
Unfortunately, they can use too much memory. To compensate, we often use
compressed bitmaps.
@@ -37,10 +65,12 @@ This library is used by
* [SirixDB](https://sirix.io)
* [EvitaDB](https://evitadb.io/)
* [Apache Iceberg](https://iceberg.apache.org/)
+* [Apache Pulsar](https://pulsar.apache.org/)
+The library is mature and has been used in production for many years.
The YouTube SQL Engine, [Google Procella](https://research.google/pubs/pub48388/), uses Roaring bitmaps for indexing. [Apache Lucene](http://lucene.apache.org/) uses Roaring bitmaps, though they have their own [independent implementation](https://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/RoaringDocIdSet.java?view=markup&pathrev=1629606). Derivatives of Lucene such as Solr and Elastic also use Roaring bitmaps.
-Other platforms such as [Whoosh](https://pypi.python.org/pypi/Whoosh/), [Microsoft Visual Studio Team Services (VSTS)](https://www.visualstudio.com/team-services/) and [Pilosa](https://github.com/pilosa/pilosa) also use Roaring bitmaps with their own implementations. You find Roaring bitmaps in [InfluxDB](https://www.influxdata.com), [Bleve](http://www.blevesearch.com), [Cloud Torrent](https://github.com/jpillora/cloud-torrent), and so forth.
+Other platforms such as [Whoosh](https://pypi.python.org/pypi/Whoosh/), [Microsoft Visual Studio Team Services (VSTS)](https://www.visualstudio.com/team-services/) and [Pilosa](https://github.com/pilosa/pilosa) also use Roaring bitmaps with their own implementations. You find Roaring bitmaps in [InfluxDB](https://www.influxdata.com), [Bleve](http://www.blevesearch.com), [Cloud Torrent](https://github.com/jpillora/cloud-torrent), [Redpanda](https://github.com/redpanda-data/redpanda), and so forth.
[There is a serialized format specification for interoperability between implementations](https://github.com/RoaringBitmap/RoaringFormatSpec/).
@@ -54,7 +84,7 @@ This code is licensed under Apache License, Version 2.0 (AL2.0).
When should you use a bitmap?
-===================================
+-------------------------------
Sets are a fundamental abstraction in
@@ -82,12 +112,12 @@ When the bitset approach is applicable, it can be orders of
magnitude faster than other possible implementation of a set (e.g., as a hash set)
while using several times less memory.
-However, a bitset, even a compressed one is not always applicable. For example, if
+However, a bitset, even a compressed one is not always applicable. For example, if
you have 1000 random-looking integers, then a simple array might be the best representation.
We refer to this case as the "sparse" scenario.
When should you use compressed bitmaps?
-===================================
+--------------------------
An uncompressed BitSet can use a lot of memory. For example, if you take a BitSet
and set the bit at position 1,000,000 to true and you have just over 100kB. That is over 100kB
@@ -108,8 +138,7 @@ Keep in mind that random-looking data is usually not compressible. E.g., if you
and attempts at compression can be counterproductive.
How does Roaring compare with the alternatives?
-==================================================
-
+------------------------------------------------
Most alternatives to Roaring are part of a larger family of compressed bitmaps that are run-length-encoded
bitmaps. They identify long runs of 1s or 0s and they represent them with a marker word.
@@ -139,25 +168,10 @@ formats like WAH, EWAH, Concise... Maybe surprisingly, Roaring also generally of
-API docs
----------
-
-http://www.javadoc.io/doc/org.roaringbitmap/RoaringBitmap/
-
-Scientific Documentation
---------------------------
-
-- Daniel Lemire, Owen Kaser, Nathan Kurz, Luca Deri, Chris O'Hara, François Saint-Jacques, Gregory Ssi-Yan-Kai, Roaring Bitmaps: Implementation of an Optimized Software Library, Software: Practice and Experience 48 (4), 2018 [arXiv:1709.07821](https://arxiv.org/abs/1709.07821)
-- Samy Chambi, Daniel Lemire, Owen Kaser, Robert Godin,
-Better bitmap performance with Roaring bitmaps,
-Software: Practice and Experience 46 (5), 2016. [arXiv:1402.6407](http://arxiv.org/abs/1402.6407) This paper used data from http://lemire.me/data/realroaring2014.html
-- Daniel Lemire, Gregory Ssi-Yan-Kai, Owen Kaser, Consistently faster and smaller compressed bitmaps with Roaring, Software: Practice and Experience 46 (11), 2016. [arXiv:1603.06549](http://arxiv.org/abs/1603.06549)
-- Samy Chambi, Daniel Lemire, Robert Godin, Kamel Boukhalfa, Charles Allen, Fangjin Yang, Optimizing Druid with Roaring bitmaps, IDEAS 2016, 2016. http://r-libre.teluq.ca/950/
-
Code sample
-------------
-```java
+```java
import org.roaringbitmap.RoaringBitmap;
public class Basic {
@@ -188,6 +202,203 @@ public class Basic {
Please see the examples folder for more examples, which you can run with `./gradlew :examples:runAll`, or run a specific one with `./gradlew :examples:runExampleBitmap64`, etc.
+API docs
+---------
+
+http://www.javadoc.io/doc/org.roaringbitmap/RoaringBitmap/
+
+
+Download
+---------
+
+You can download releases from github:
+https://github.com/RoaringBitmap/RoaringBitmap/releases
+
+Usage within a Maven project
+---------
+
+### 1. Using JitPack
+
+
+Add the following dependency to your pom.xml file...
+
+```xml
+
+ com.github.RoaringBitmap.RoaringBitmap
+ roaringbitmap
+ 1.3.16
+
+```
+
+You may adjust the version number.
+
+Then add the repository to your pom.xml file:
+
+```xml
+
+
+ jitpack.io
+ https://jitpack.io
+
+
+```
+See https://github.com/RoaringBitmap/JitPackRoaringBitmapProject for a complete example.
+
+
+### 2. Using GitHub Packages
+
+Add the following dependency to your `pom.xml` file inside the `` element...
+
+```xml
+
+ org.roaringbitmap
+ roaringbitmap
+ 1.3.16
+
+```
+
+Add the GitHub repository inside the `` element (`pom.xml` file)...
+
+```xml
+
+
+ github
+ Roaring Maven Packages
+ https://maven.pkg.github.com/RoaringBitmap/RoaringBitmap
+ true
+ true
+
+
+```
+
+See https://github.com/RoaringBitmap/MavenRoaringBitmapProject for a complete example.
+
+The registry access is is protected by an authorisation. So you have to add your GitHub credentials to your global settings.xml: `$HOME\.m2\settings.xml`.
+
+You will need a token which you can generate on GitHub.
+
+```
+GitHub > Settings > Developer Settings > Personal access tokens > Generate new token
+```
+
+The token needs the read:packages permission. The token identifier is a long string such as `ghp_ieOkN`.
+
+Put the following in your `settings.xml` file, within the `` element.
+
+```xml
+
+ github
+ lemire
+ ghp_ieOkN
+
+```
+
+Replace `lemire` by your GitHub username and `ghp_ieOkN` by the token identifier
+you just generated.
+
+Usage within a gradle project
+------------------
+
+### 1. Using JitPack
+
+Then all you need is to edit your `build.gradle` file like so:
+
+
+```groovy
+plugins {
+ id 'java'
+}
+
+group 'org.roaringbitmap' // name of your project
+version '1.0-SNAPSHOT' // version of your project
+
+repositories {
+ mavenCentral()
+ maven {
+ url 'https://jitpack.io'
+ }
+}
+
+dependencies {
+ implementation 'com.github.RoaringBitmap.RoaringBitmap:roaringbitmap:1.3.16'
+ testImplementation 'junit:junit:3.8.1'
+}
+```
+
+
+See https://github.com/RoaringBitmap/JitPackRoaringBitmapProject for a complete example.
+
+
+### 2. Using GitHub Packages
+
+
+You first need your GitHub credentials. Go
+to
+
+```
+GitHub > Settings > Developer Settings > Personal access tokens > Generate new token
+```
+
+And create a token with read:packages permission.
+
+If your GitHub user name is `lemire` and your GitHub personal token `ghp_ieOkN`,
+then you can set them using system variables. Under bash, you can do it like so:
+```
+export GITHUB_USER=lemire
+export GITHUB_PASSWORD=ghp_ieOkN
+```
+
+
+If you prefer you can write your GitHub credentials in your gradle.properties
+file
+
+```
+# gradle.properties
+githubUser=lemire
+githubPassword=ghp_ieOkN
+```
+
+Then all you need is to edit your `build.gradle` file like so:
+
+```groovy
+plugins {
+ id 'java'
+}
+
+group 'org.roaringbitmap' // name of your project
+version '1.0-SNAPSHOT' // version of your project
+
+repositories {
+ mavenCentral()
+ maven {
+ url 'https://maven.pkg.github.com/RoaringBitmap/RoaringBitmap'
+ credentials {
+ username = System.properties['githubUser'] ?: System.env.GITHUB_USER
+ password = System.properties['githubPassword'] ?: System.env.GITHUB_PASSWORD
+ }
+ }
+}
+
+dependencies {
+ implementation 'org.roaringbitmap:roaringbitmap:1.3.16'
+ testImplementation 'junit:junit:3.8.1'
+}
+```
+
+See https://github.com/RoaringBitmap/MavenRoaringBitmapProject for a complete example.
+
+
+
+Scientific Documentation
+--------------------------
+
+- Daniel Lemire, Owen Kaser, Nathan Kurz, Luca Deri, Chris O'Hara, François Saint-Jacques, Gregory Ssi-Yan-Kai, Roaring Bitmaps: Implementation of an Optimized Software Library, Software: Practice and Experience 48 (4), 2018 [arXiv:1709.07821](https://arxiv.org/abs/1709.07821)
+- Samy Chambi, Daniel Lemire, Owen Kaser, Robert Godin,
+Better bitmap performance with Roaring bitmaps,
+Software: Practice and Experience 46 (5), 2016. [arXiv:1402.6407](http://arxiv.org/abs/1402.6407) This paper used data from http://lemire.me/data/realroaring2014.html
+- Daniel Lemire, Gregory Ssi-Yan-Kai, Owen Kaser, Consistently faster and smaller compressed bitmaps with Roaring, Software: Practice and Experience 46 (11), 2016. [arXiv:1603.06549](http://arxiv.org/abs/1603.06549)
+- Samy Chambi, Daniel Lemire, Robert Godin, Kamel Boukhalfa, Charles Allen, Fangjin Yang, Optimizing Druid with Roaring bitmaps, IDEAS 2016, 2016. http://r-libre.teluq.ca/950/
+
Unsigned integers
------------------
@@ -264,7 +475,7 @@ generate a RoaringBitmap which lies in RAM. As the name suggest, the
ImmutableRoaringBitmap itself cannot be modified.
-This design was inspired by Druid.
+This design was inspired by Apache Druid.
One can find a complete working example in the test file TestMemoryMapping.java.
@@ -273,6 +484,10 @@ from the org.roaringbitmap.buffer package. They are incompatible. They serialize
to the same output however. The performance of the code in org.roaringbitmap package is
generally superior because there is no overhead due to the use of ByteBuffer instances.
+Thread safety
+-----
+
+In general, it is unsafe to access the same bitmaps using different threads--the bitmaps are unsynchronized for performance. Should you want to access a Bitmap from more than one thread, you should provide synchronization. However, you can access an immutable bitmap from multiple threads, as long as you abide by the `ImmutableBitmapDataProvider` interface.
Kryo
-----
@@ -317,14 +532,14 @@ the most significant 32~bits of elements
whereas the values of the tree are 32-bit Roaring bitmaps. The 32-bit Roaring bitmaps represent the least significant
bits of a set of elements.
-The newer `Roaring64Bitmap` approach relies on the ART data structure to hold the key/value pair. The key
+The newer `Roaring64Bitmap` approach relies on the ART data structure to hold the key/value pair. The key
is made of the most significant 48~bits of elements whereas the values are 16-bit Roaring containers. It is inspired by
[The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases](https://db.in.tum.de/~leis/papers/ART.pdf) by Leis et al. (ICDE '13).
```java
import org.roaringbitmap.longlong.*;
-
+
// first Roaring64NavigableMap
LongBitmapDataProvider r = Roaring64NavigableMap.bitmapOf(1,2,100,1000);
r.addLong(1234);
@@ -360,12 +575,12 @@ Range Bitmaps
`RangeBitmap` is a succinct data structure supporting range queries.
Each value added to the bitmap is associated with an incremental identifier,
and queries produce a `RoaringBitmap` of the identifiers associated with values
-that satisfy the query. Every value added to the bitmap is stored separately,
-so that if a value is added twice, it will be stored twice, and if that value
+that satisfy the query. Every value added to the bitmap is stored separately,
+so that if a value is added twice, it will be stored twice, and if that value
is less than some threshold, there will be at least two integers in the resultant
`RoaringBitmap`.
-It is more efficient - in terms of both time and space - to
+It is more efficient - in terms of both time and space - to
provide a maximum value. If you don't know the maximum value,
provide a `Long.MAX_VALUE`. Unsigned order is used like elsewhere in
the library.
@@ -405,34 +620,10 @@ Prerequisites
- Version 0.6.x requires JDK 7 or better
- Version 0.5.x requires JDK 6 or better
-To build the project you need maven (version 3).
-Download
----------
-
-You can download releases from github:
-https://github.com/RoaringBitmap/RoaringBitmap/releases
-
-Maven repository
-----------------
-If your project depends on roaring, you can specify the dependency in the Maven "pom.xml" file:
-```xml
-
-
- org.roaringbitmap
- RoaringBitmap
- 0.9.9
-
-
-```
-
-where you should replace the version number by the version you require.
-
-[For up-to-date releases, we recommend configuring maven and gradle to depend on the Jitpack repository](https://jitpack.io/#RoaringBitmap/RoaringBitmap).
-
-Usage
+Usage for RoaringBitmap Developers
------
* Get java
@@ -442,23 +633,23 @@ Usage
* ``./gradlew test `` will run the tests
* ``./gradlew :roaringbitmap:test --tests TestIterators.testIndexIterator4`` runs just the test `TestIterators.testIndexIterator4`; `./gradlew -i :roaringbitmap:test --tests TestRoaringBitmap.issue623` runs just the test `issue623` in the class ` TestRoaringBitmap` while printing out to the console.
* ``./gradlew bsi:test --tests BufferBSITest.testEQ`` run just the test `BufferBSITest.testEQ` in the `bsi` submodule
-* ``./gradlew checkstyleMain`` will check that you abide by the code style and that the code compiles. We enforce a strict style so that there is no debate as to the proper way to format the code.
IntelliJ and Eclipse
--------
-If you plan to contribute to RoaringBitmap, you can have load
+If you plan to contribute to RoaringBitmap, you can load
it up in your favorite IDE.
- For IntelliJ, in the IDE create a new project, possibly from existing sources, choose import, gradle.
-- For Eclipse: File, Import, Existing Gradle Projects, Select RoaringBitmap on my disk
+- For Eclipse: File, Import, Existing Gradle Projects, Select RoaringBitmap from your disk.
Contributing
------------
-Contributions are invited. We enforce the Google Java style.
-Please run ``./gradlew checkstyleMain`` on your code before submitting
-a patch.
+Contributions are invited. We use the Google Java style (see `roaring_google_checks.xml`). It can be applied
+automatically to your code with `./gradlew spotlessApply`
+
+Please do not reformat the code needlessly (especially on comments/javadoc).
FAQ
----
@@ -512,11 +703,16 @@ application, you might be better served with a conventional bitset (e.g., Java's
Benchmark
-----------
-To run JMH benchmarks, use the following command:
+To run JMH benchmarks, use the following commands:
+
+ $ ./gradlew jmh::shadowJar
+ $ java -jar jmh/build/libs/benchmarks.jar
+
+You can also run a specific benchmark:
- $ ./gradlew jmhJar
+ $ java -jar jmh/build/libs/benchmarks.jar 'org.roaringbitmap.aggregation.and.identical.*'
-You can also run specific benchmarks...
+If you have a bash shell, you can also run our script which automatically builds and run specific tests...
$ ./jmh/run.sh 'org.roaringbitmap.aggregation.and.identical.*'
@@ -524,7 +720,7 @@ You can also run specific benchmarks...
Mailing list/discussion group
-----------------------------
-https://groups.google.com/forum/#!forum/roaring-bitmaps
+https://groups.google.com/forum/#!forum/roaringbitmaps
Funding
----------
diff --git a/RoaringBitmap/src/main/java/org/roaringbitmap/art/NodeType.java b/RoaringBitmap/src/main/java/org/roaringbitmap/art/NodeType.java
deleted file mode 100644
index ab7bacbc6..000000000
--- a/RoaringBitmap/src/main/java/org/roaringbitmap/art/NodeType.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.roaringbitmap.art;
-
-public enum NodeType {
- NODE4, NODE16, NODE48, NODE256, LEAF_NODE, DUMMY_ROOT;
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/ContainerBatchIteratorTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/ContainerBatchIteratorTest.java
deleted file mode 100644
index f7a577976..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/ContainerBatchIteratorTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package org.roaringbitmap;
-
-
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static java.util.Arrays.copyOfRange;
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class ContainerBatchIteratorTest {
-
- private static int[][] DATA;
-
- @BeforeAll
- public static void setup() {
- DATA = Stream.of(IntStream.range(0, 20000).toArray(),
- IntStream.range(0, 1 << 16).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> i < 500 || i > 2000).filter(i -> i < (1 << 15) || i > ((1 << 15) | (1 << 8))).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 12) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 11) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 10) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 9) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 8) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 7) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 6) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 5) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 4) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 3) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 2) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 1) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 3) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 5) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 7) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 9) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 271) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 1000) == 0).toArray(),
- IntStream.empty().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray()).toArray(int[][]::new);
- }
-
- @AfterAll
- public static void clear() {
- DATA = null;
- }
-
-
- public static Stream params() {
- return Stream.of(DATA)
- .flatMap(array -> IntStream.concat(IntStream.of(
- 512, 1024, 2048, 4096, 8192, 65536
- ), IntStream.range(0, 100).map(i -> ThreadLocalRandom.current().nextInt(1, 65536)))
- .mapToObj(i -> Arguments.of(array, i)));
- }
-
- @ParameterizedTest(name = "{1}")
- @MethodSource("params")
- public void test(int[] expectedValues, int batchSize) {
- int[] buffer = new int[batchSize];
- Container container = createContainer(expectedValues);
- ContainerBatchIterator it = container.getBatchIterator();
- int cardinality = 0;
- while (it.hasNext()) {
- int from = cardinality;
- cardinality += it.next(0, buffer);
- assertArrayEquals(
- copyOfRange(expectedValues, from, cardinality), copyOfRange(buffer, 0, cardinality - from),
- "Failure with batch size " + batchSize);
- }
- assertEquals(expectedValues.length, cardinality);
- }
-
- @ParameterizedTest(name = "{1}")
- @MethodSource("params")
- public void testAdvanceIfNeeded(int[] expectedValues, int batchSize) {
- if (expectedValues.length < 2) {
- return;
- }
- int[] buffer = new int[batchSize];
- Container container = createContainer(expectedValues);
- ContainerBatchIterator it = container.getBatchIterator();
- int cardinality = expectedValues.length / 2;
- int advanceUntil = expectedValues[cardinality];
- it.advanceIfNeeded((char) advanceUntil);
- while (it.hasNext()) {
- int from = cardinality;
- cardinality += it.next(0, buffer);
- assertArrayEquals(
- copyOfRange(expectedValues, from, cardinality), copyOfRange(buffer, 0, cardinality - from),
- "Failure with batch size " + batchSize + " and container type " + container.getContainerName());
- }
- assertEquals(expectedValues.length, cardinality);
- }
-
- private Container createContainer(int[] expectedValues) {
- Container container = new ArrayContainer();
- for (int value : expectedValues) {
- container = container.add((char) value);
- }
- return container.runOptimize();
- }
-}
\ No newline at end of file
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/KryoTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/KryoTest.java
deleted file mode 100644
index 258ba7271..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/KryoTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.roaringbitmap;
-
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.KryoDataInput;
-import com.esotericsoftware.kryo.io.KryoDataOutput;
-import com.esotericsoftware.kryo.io.Output;
-import org.junit.jupiter.api.Test;
-
-import java.io.*;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class KryoTest {
- public static Kryo createKryo() {
- Kryo kryo = new Kryo();
- kryo.setRegistrationRequired(false);
- kryo.register(RoaringBitmap.class, new RoaringSerializer());
- return kryo;
- }
-
- public static void writeRoaringToFile(File f,
- RoaringBitmap roaring,
- Serializer serializer) throws FileNotFoundException {
- Kryo kryo = createKryo();
- Output kryoOutputMap = new Output(new FileOutputStream(f));
- kryo.writeObjectOrNull(kryoOutputMap, roaring, serializer);
- kryoOutputMap.flush();
- kryoOutputMap.close();
- }
-
- public static RoaringBitmap readRoaringFromFile(File f,
- Serializer serializer) throws FileNotFoundException {
- Kryo kryo = createKryo();
- Input inputMap = new Input(new FileInputStream(f));
- RoaringBitmap roaring = kryo.readObjectOrNull(inputMap, RoaringBitmap.class, serializer);
- inputMap.close();
- return roaring;
- }
-
- @Test
- public void roaringTest() throws IOException {
- RoaringSerializer serializer = new RoaringSerializer();
- RoaringBitmap roaringDense = new RoaringBitmap();
- for (int i = 0; i < 100_000; i++) {
- roaringDense.add(i);
- }
- File tmpfiledense = File.createTempFile("roaring_dense", "bin");
- tmpfiledense.deleteOnExit();
- writeRoaringToFile(tmpfiledense, roaringDense, serializer);
- RoaringBitmap denseRoaringFromFile = readRoaringFromFile(tmpfiledense, serializer);
- assertEquals(denseRoaringFromFile, roaringDense);
-
- RoaringBitmap roaringSparse = new RoaringBitmap();
- for (int i = 0; i < 100_000; i++) {
- if (i % 11 == 0) {
- roaringSparse.add(i);
- }
- }
- File tmpfilesparse = File.createTempFile("roaring_sparse", "bin");
- writeRoaringToFile(tmpfilesparse, roaringSparse, serializer);
- RoaringBitmap sparseRoaringFromFile = readRoaringFromFile(tmpfilesparse, serializer);
- assertEquals(sparseRoaringFromFile, roaringSparse);
- }
-
-}
-
-class RoaringSerializer extends Serializer {
- @Override
- public void write(Kryo kryo, Output output, RoaringBitmap bitmap) {
- try {
- bitmap.serialize(new KryoDataOutput(output));
- } catch (IOException e) {
- e.printStackTrace();
- throw new RuntimeException();
- }
- }
-
- @Override
- public RoaringBitmap read(Kryo kryo, Input input, Class extends RoaringBitmap> type) {
- RoaringBitmap bitmap = new RoaringBitmap();
- try {
- bitmap.deserialize(new KryoDataInput(input));
- } catch (IOException e) {
- e.printStackTrace();
- throw new RuntimeException();
- }
- return bitmap;
- }
-
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/OrNotTruncationTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/OrNotTruncationTest.java
deleted file mode 100644
index 77314b3f9..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/OrNotTruncationTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.roaringbitmap;
-
-
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.function.Consumer;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.roaringbitmap.SeededTestData.TestDataSet.testCase;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class OrNotTruncationTest {
-
- private static final Consumer NO_OP = x -> {
- };
-
-
- public static Stream params() {
- return Stream.of(
- Arguments.of(new RoaringBitmap(), NO_OP),
- Arguments.of(new RoaringBitmap(), (Consumer) x -> x.add(2)),
- Arguments.of(new RoaringBitmap(), (Consumer) x -> x.add(2L, 5L)),
- Arguments.of(new RoaringBitmap(), (Consumer) x -> x.add(3L, 5L)),
- Arguments.of(new RoaringBitmap(), (Consumer) x -> {
- x.add(1L, 10L);
- x.remove(2L, 10L);
- }),
- Arguments.of(new RoaringBitmap(), (Consumer) x -> {
- for (int i : new int[]{0, 1, 2, 3, 4, 5, 6})
- x.add(i);
- }),
- Arguments.of(RoaringBitmap.bitmapOf(2), NO_OP),
- Arguments.of(RoaringBitmap.bitmapOf(2, 3, 4), NO_OP),
- Arguments.of(testCase().withArrayAt(0).build(), NO_OP),
- Arguments.of(testCase().withRunAt(0).build(), NO_OP),
- Arguments.of(testCase().withBitmapAt(0).build(), NO_OP),
- Arguments.of(testCase().withArrayAt(0).withRunAt(1).build(), NO_OP),
- Arguments.of(testCase().withRunAt(0).withRunAt(1).build(), NO_OP),
- Arguments.of(testCase().withBitmapAt(0).withRunAt(1).build(), NO_OP),
- Arguments.of(testCase().withArrayAt(1).build(), NO_OP),
- Arguments.of(testCase().withRunAt(1).build(), NO_OP),
- Arguments.of(testCase().withBitmapAt(1).build(), NO_OP),
- Arguments.of(testCase().withArrayAt(1).withRunAt(2).build(), NO_OP),
- Arguments.of(testCase().withRunAt(1).withRunAt(2).build(), NO_OP),
- Arguments.of(testCase().withBitmapAt(1).withRunAt(2).build(), NO_OP)
- );
- }
-
- @ParameterizedTest
- @MethodSource("params")
- public void testTruncation(RoaringBitmap other, Consumer init) {
- RoaringBitmap one = new RoaringBitmap();
- one.add(0);
- one.add(10);
- init.accept(other);
- one.orNot(other, 7);
- assertTrue(one.contains(10));
- }
-
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapBatchIteratorTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapBatchIteratorTest.java
deleted file mode 100644
index 3ad09607f..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapBatchIteratorTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-package org.roaringbitmap;
-
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.concurrent.TimeUnit;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.roaringbitmap.RoaringBitmapWriter.writer;
-import static org.roaringbitmap.SeededTestData.TestDataSet.testCase;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class RoaringBitmapBatchIteratorTest {
-
- private static RoaringBitmap[] BITMAPS;
- private static final int[] SIZES = {
- 128, 256, 1024, 8192, 5, 127, 1023
- };
-
- private static void initBitmaps() {
- BITMAPS = new RoaringBitmap[] {
- testCase().withArrayAt(0).withArrayAt(2).withArrayAt(4).withArrayAt((1 << 15) | (1 << 14)).build(),
- testCase().withRunAt(0).withRunAt(2).withRunAt(4).withRunAt((1 << 15) | (1 << 14)).build(),
- testCase().withBitmapAt(0).withRunAt(2).withBitmapAt(4).withBitmapAt((1 << 15) | (1 << 14)).build(),
- testCase().withArrayAt(0).withBitmapAt(2).withRunAt(4).withBitmapAt((1 << 15) | (1 << 14)).build(),
- testCase().withRunAt(0).withArrayAt(2).withBitmapAt(4).withRunAt((1 << 15) | (1 << 14)).build(),
- testCase().withBitmapAt(0).withRunAt(2).withArrayAt(4).withBitmapAt((1 << 15) | (1 << 14)).build(),
- testCase().withArrayAt(0).withBitmapAt(2).withRunAt(4).withArrayAt((1 << 15) | (1 << 14)).build(),
- testCase().withBitmapAt(0).withArrayAt(2).withBitmapAt(4).withRunAt((1 << 15) | (1 << 14)).build(),
- testCase().withRunAt((1 << 15) | (1 << 11)).withBitmapAt((1 << 15) | (1 << 12)).withArrayAt((1 << 15) | (1 << 13)).withBitmapAt((1 << 15) | (1 << 14)).build(),
- RoaringBitmap.bitmapOf(IntStream.range(1 << 10, 1 << 26).filter(i -> (i & 1) == 0).toArray()),
- RoaringBitmap.bitmapOf(IntStream.range(1 << 10, 1 << 25).filter(i -> ((i >>> 8) & 1) == 0).toArray()),
- RoaringBitmap.bitmapOf(IntStream.range(0,127).toArray()),
- RoaringBitmap.bitmapOf(IntStream.range(0,1024).toArray()),
- RoaringBitmap.bitmapOf(IntStream.concat(IntStream.range(0,256), IntStream.range(1 << 16, (1 << 16) | 256)).toArray()),
- RoaringBitmap.bitmapOf(8511),
- new RoaringBitmap()
- };
- }
-
- @BeforeAll
- public static void beforeAll() throws InterruptedException {
- int tryIndex = 0;
- int maxTryIndex = 3;
- while (++tryIndex < maxTryIndex) {
- try {
- initBitmaps();
- } catch (OutOfMemoryError e) {
- if (tryIndex == maxTryIndex) {
- throw e;
- }
- e.printStackTrace();
- System.out.println("RoaringBitmapBatchIteratorTest.beforeAll Issue on try #" + tryIndex + ". Sleeping 5s for other tests to complete");
- TimeUnit.SECONDS.sleep(5);
- }
- }
- }
-
- @AfterAll
- public static void clear() {
- BITMAPS = null;
- }
-
-
- public static Stream params() {
- return Stream.of(BITMAPS)
- .flatMap(bitmap -> IntStream.of(SIZES).mapToObj(i -> Arguments.of(bitmap, i)));
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void testBatchIteratorAsIntIterator(RoaringBitmap bitmap, int size) {
- IntIterator it = bitmap.getBatchIterator().asIntIterator(new int[size]);
- RoaringBitmapWriter w = writer().constantMemory()
- .initialCapacity(bitmap.highLowContainer.size).get();
- while (it.hasNext()) {
- w.add(it.next());
- }
- RoaringBitmap copy = w.get();
- assertEquals(bitmap, copy);
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void test(RoaringBitmap bitmap, int batchSize) {
- int[] buffer = new int[batchSize];
- RoaringBitmap result = new RoaringBitmap();
- RoaringBatchIterator it = bitmap.getBatchIterator();
- int cardinality = 0;
- while (it.hasNext()) {
- int batch = it.nextBatch(buffer);
- for (int i = 0; i < batch; ++i) {
- result.add(buffer[i]);
- }
- cardinality += batch;
- }
- assertEquals(bitmap, result);
- assertEquals(bitmap.getCardinality(), cardinality);
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void testBatchIteratorAdvancedIfNeeded(RoaringBitmap bitmap, int batchSize) {
- final int cardinality = bitmap.getCardinality();
- if (cardinality < 2) {
- return;
- }
- int midpoint = bitmap.select(cardinality / 2);
- int[] buffer = new int[batchSize];
- RoaringBitmap result = new RoaringBitmap();
- RoaringBatchIterator it = bitmap.getBatchIterator();
- it.advanceIfNeeded(midpoint);
- int consumed = 0;
- while (it.hasNext()) {
- int batch = it.nextBatch(buffer);
- for (int i = 0; i < batch; ++i) {
- result.add(buffer[i]);
- }
- consumed += batch;
- }
- RoaringBitmap expected = bitmap.clone();
- expected.remove(0, midpoint & 0xFFFFFFFFL);
- assertEquals(expected, result);
- assertEquals(expected.getCardinality(), consumed);
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void testBatchIteratorAdvancedIfNeededToAbsentValue(RoaringBitmap bitmap, int batchSize) {
- long firstAbsent = bitmap.nextAbsentValue(0);
- int[] buffer = new int[batchSize];
- RoaringBitmap result = new RoaringBitmap();
- BatchIterator it = bitmap.getBatchIterator();
- it.advanceIfNeeded((int) firstAbsent);
- int consumed = 0;
- while (it.hasNext()) {
- int batch = it.nextBatch(buffer);
- for (int i = 0; i < batch; ++i) {
- result.add(buffer[i]);
- }
- consumed += batch;
- }
- RoaringBitmap expected = bitmap.clone();
- expected.remove(0, firstAbsent & 0xFFFFFFFFL);
- assertEquals(expected, result);
- assertEquals(expected.getCardinality(), consumed);
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void testBatchIteratorAdvancedIfNeededBeyondLastValue(RoaringBitmap bitmap, int batchSize) {
- long advanceTo = bitmap.isEmpty() ? 0 : bitmap.last() + 1;
- int[] buffer = new int[batchSize];
- RoaringBitmap result = new RoaringBitmap();
- BatchIterator it = bitmap.getBatchIterator();
- it.advanceIfNeeded((int) advanceTo);
- int consumed = 0;
- while (it.hasNext()) {
- int batch = it.nextBatch(buffer);
- for (int i = 0; i < batch; ++i) {
- result.add(buffer[i]);
- }
- consumed += batch;
- }
- assertEquals(0, consumed);
- assertTrue(result.isEmpty());
- }
-
- @Test
- public void testTimelyTermination() {
- RoaringBitmap bm = RoaringBitmap.bitmapOf(8511);
- BatchIterator bi = bm.getBatchIterator();
- int[] batch = new int[10];
- assertTrue(bi.hasNext());
- int n = bi.nextBatch(batch);
- assertEquals(n, 1);
- assertEquals(batch[0], 8511);
- assertFalse(bi.hasNext());
- }
-
- @Test
- public void testTimelyTerminationAfterAdvanceIfNeeded() {
- RoaringBitmap bm = RoaringBitmap.bitmapOf(8511);
- BatchIterator bi = bm.getBatchIterator();
- assertTrue(bi.hasNext());
- bi.advanceIfNeeded(8512);
- assertFalse(bi.hasNext());
- }
-
- @Test
- public void testBatchIteratorWithAdvanceIfNeeded() {
- RoaringBitmap bitmap = RoaringBitmap.bitmapOf(3 << 16, (3 << 16) + 5, (3 << 16) + 10);
- BatchIterator it = bitmap.getBatchIterator();
- it.advanceIfNeeded(6);
- assertTrue(it.hasNext());
- int[] batch = new int[10];
- int n = it.nextBatch(batch);
- assertEquals(n, 3);
- assertEquals(batch[0], 3 << 16);
- assertEquals(batch[1], (3 << 16) + 5);
- assertEquals(batch[2], (3 << 16) + 10);
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapSubsetTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapSubsetTest.java
deleted file mode 100644
index b1d4477ac..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapSubsetTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package org.roaringbitmap;
-
-import com.google.common.collect.*;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.Set;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class RoaringBitmapSubsetTest {
-
-
- private static final Predicate DIVISIBLE_BY_4 = i -> i % 4 == 0;
-
- private static final Predicate DIVISIBLE_BY_3 = i -> i % 3 == 0;
-
- public static Stream params() {
- return Stream.of(
- Arguments.of( // array vs array
- ImmutableSet.of(1, 2, 3, 4),
- ImmutableSet.of(2, 3)
- ),
- Arguments.of( // array vs empty
- ImmutableSet.of(1, 2, 3, 4),
- ImmutableSet.of()
- ),
- Arguments.of( // identical arrays
- ImmutableSet.of(1, 2, 3, 4),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of( // disjoint arrays
- ImmutableSet.of(10, 12, 14, 15),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of(// disjoint arrays, cardinality mismatch
- ImmutableSet.of(10, 12, 14),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of( // run vs array, subset
- ContiguousSet.create(Range.closed(1, 1 << 8), DiscreteDomain.integers()),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of( // run vs array, subset
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers()),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of( // run vs empty
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers()),
- ImmutableSet.of()
- ),
- Arguments.of( // identical runs, 1 container
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers()),
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers())
- ),
- Arguments.of( // identical runs, 2 containers
- ContiguousSet.create(Range.closed(1, 1 << 20), DiscreteDomain.integers()),
- ContiguousSet.create(Range.closed(1, 1 << 20), DiscreteDomain.integers())
- ),
- Arguments.of( // disjoint array vs run, either side of container boundary
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers()),
- ImmutableSet.of((1 << 16) + 1, (1 << 16) + 2, (1 << 16) + 3, (1 << 16) + 4)
- ),
- Arguments.of( // disjoint array vs run
- ContiguousSet.create(Range.closed(3, 1 << 16), DiscreteDomain.integers()),
- ImmutableSet.of(1, 2)
- ),
- Arguments.of( // run vs run, overlap with shift
- ContiguousSet.create(Range.closed(1, 1 << 8), DiscreteDomain.integers()),
- ContiguousSet.create(Range.closed(1 << 4, 1 << 12), DiscreteDomain.integers())
- ),
- Arguments.of( // run vs run, subset
- ContiguousSet.create(Range.closed(1, 1 << 20), DiscreteDomain.integers()),
- ImmutableSet.of(1, 1 << 8)
- ),
- Arguments.of( // run vs run, overlap with shift, 2 containers
- ContiguousSet.create(Range.closed(1, 1 << 20), DiscreteDomain.integers()),
- ImmutableSet.of(1 << 6, 1 << 26)
- ),
- Arguments.of( // run vs 2 container run, overlap
- ImmutableSet.of(1, 1 << 16),
- ContiguousSet.create(Range.closed(0, 1 << 20), DiscreteDomain.integers())
- ),
- Arguments.of( // bitmap vs intersecting array
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test)),
- ImmutableSet.of(4, 8)
- ),
- Arguments.of( // bitmap vs bitmap, cardinality mismatch
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 16),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test)),
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test))
- ),
- Arguments.of( // bitmap vs empty
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test)),
- ImmutableSet.of()
- ),
- Arguments.of( // identical bitmaps
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test)),
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test))
- ),
- Arguments.of( // bitmap vs overlapping but disjoint array
- ImmutableSet.of(3, 7),
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test))
- ),
- Arguments.of( // bitmap vs overlapping but disjoint bitmap
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_3::test)),
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test))
- ),
- Arguments.of( // disjoint, large (signed-negative) keys
- ImmutableSet.of(0xbf09001d, 0xbf090169),
- ImmutableSet.of(0x8088000e, 0x80880029)
- ));
- }
-
-
- @ParameterizedTest(name = "assert that {1} is subset of {0}")
- @MethodSource("params")
- public void testProperSubset(Set superSet, Set subSet) {
- RoaringBitmap superSetRB = create(superSet);
- RoaringBitmap subSetRB = create(subSet);
- assertEquals(superSet.containsAll(subSet), superSetRB.contains(subSetRB));
- // reverse the test
- assertEquals(subSet.containsAll(superSet), subSetRB.contains(superSetRB));
- }
-
- private RoaringBitmap create(Set set) {
- RoaringBitmap rb = new RoaringBitmap();
- if (set instanceof ContiguousSet) {
- ContiguousSet contiguousSet = (ContiguousSet) set;
- rb.add(contiguousSet.first().longValue(), contiguousSet.last().longValue());
- } else {
- for (Integer i : set) {
- rb.add(i);
- }
- }
- return rb;
- }
-
-
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapWriterRandomisedTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapWriterRandomisedTest.java
deleted file mode 100644
index 78ca1c4cb..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/RoaringBitmapWriterRandomisedTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package org.roaringbitmap;
-
-
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.Arrays;
-import java.util.Random;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.roaringbitmap.RoaringBitmapWriter.writer;
-import static org.roaringbitmap.Util.toUnsignedLong;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class RoaringBitmapWriterRandomisedTest {
-
- private static int[][] ARRAYS;
-
- @BeforeAll
- public static void init() {
- ARRAYS = new int[][] {
- new int[]{0, 1, 2, 3},
- randomArray(0),
- randomArray(10),
- randomArray(100),
- randomArray(1000),
- randomArray(10_000),
- randomArray(100_000),
- randomArray(1000_000),
- randomArray(10_000_000)
- };
- }
-
- @AfterAll
- public static void clear() {
- ARRAYS = null;
- }
-
- public static Stream tests() {
- return Stream.of(ARRAYS).map(Arguments::of);
- }
-
- @ParameterizedTest(name = "-")
- @MethodSource("tests")
- public void shouldBuildSameBitmapAsBitmapOf(int[] values) {
- RoaringBitmapWriter writer = writer()
- .expectedRange(toUnsignedLong(min()), toUnsignedLong(max(values)))
- .get();
- for (int i : values) {
- writer.add(i);
- }
- writer.flush();
- verify(writer.getUnderlying(), values);
- }
-
- @ParameterizedTest(name = "-")
- @MethodSource("tests")
- public void shouldBuildSameBitmapAsBitmapOfWithAddMany(int[] values) {
- RoaringBitmapWriter writer = writer()
- .expectedRange(toUnsignedLong(min()), toUnsignedLong(max(values)))
- .get();
- writer.addMany(values);
- writer.flush();
- verify(writer.getUnderlying(), values);
- }
-
- @ParameterizedTest(name = "-")
- @MethodSource("tests")
- public void getShouldFlushToTheUnderlyingBitmap(int[] values) {
- RoaringBitmapWriter writer = writer()
- .expectedRange(toUnsignedLong(min()), toUnsignedLong(max(values)))
- .get();
- writer.addMany(values);
- verify(writer.get(), values);
- }
-
- @ParameterizedTest(name = "-")
- @MethodSource("tests")
- public void getShouldFlushToTheUnderlyingBitmap_ConstantMemory(int[] values) {
- RoaringBitmapWriter writer = writer()
- .constantMemory()
- .get();
- writer.addMany(values);
- verify(writer.get(), values);
- }
-
- @ParameterizedTest(name = "-")
- @MethodSource("tests")
- public void shouldBuildSameBitmapAsBitmapOf_ConstantMemory(int[] values) {
- RoaringBitmapWriter writer = writer()
- .constantMemory()
- .expectedRange(toUnsignedLong(min()), toUnsignedLong(max(values)))
- .get();
- for (int i : values) {
- writer.add(i);
- }
- writer.flush();
- verify(writer.getUnderlying(), values);
- }
-
- @ParameterizedTest(name = "-")
- @MethodSource("tests")
- public void shouldBuildSameBitmapAsBitmapOfWithAddMany_ConstantMemory(int[] values) {
- RoaringBitmapWriter writer = writer()
- .constantMemory()
- .expectedRange(toUnsignedLong(min()), toUnsignedLong(max(values)))
- .get();
- writer.addMany(values);
- writer.flush();
- verify(writer.getUnderlying(), values);
- }
-
- private void verify(RoaringBitmap rb, int[] values) {
- RoaringBitmap baseline = RoaringBitmap.bitmapOf(values);
- RoaringArray baselineHLC = baseline.highLowContainer;
- RoaringArray rbHLC = rb.highLowContainer;
- assertEquals(baselineHLC.size, rbHLC.size);
- for (int i = 0; i < baselineHLC.size; ++i) {
- Container baselineContainer = baselineHLC.getContainerAtIndex(i);
- Container rbContainer = rbHLC.getContainerAtIndex(i);
- assertEquals(baselineContainer, rbContainer);
- }
- assertEquals(baseline, rb);
- }
-
- private static int[] randomArray(int size) {
- Random random = new Random(1234);
- int[] data = new int[size];
- int last = 0;
- int i = 0;
- while (i < size) {
- if (random.nextGaussian() > 0.1) {
- int runLength = random.nextInt(Math.min(size - i, 1 << 16));
- for (int j = 1; j < runLength; ++j) {
- data[i + j] = last + 1;
- last = data[i + j];
- }
- i += runLength;
- } else {
- data[i] = last + 1 + random.nextInt(999);
- last = data[i];
- ++i;
- }
- }
- Arrays.sort(data);
- return data;
- }
-
- private int max(int[] values) {
- return values.length == 0 ? 0 : values[values.length - 1];
- }
-
- private int min() {
- return 0;
- }
-}
\ No newline at end of file
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestAdversarialInputs.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestAdversarialInputs.java
deleted file mode 100644
index 91ce47b7d..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestAdversarialInputs.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.roaringbitmap;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.io.*;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-
-public class TestAdversarialInputs {
-
- public static Stream badFiles() {
- return IntStream.rangeClosed(1, 7)
- .mapToObj(i -> Arguments.of("/testdata/crashproneinput" + i + ".bin"));
- }
-
- // open a stream without copying files
- public static InputStream openInputstream(String resourceName) throws IOException {
- InputStream resourceAsStream = TestAdversarialInputs.class.getResourceAsStream(resourceName);
- if(resourceAsStream == null) {
- throw new IOException("Cannot get resource \"" + resourceName + "\".");
- }
- return resourceAsStream;
- }
-
- @Test
- public void testInputGoodFile1() throws IOException {
- InputStream inputStream = openInputstream("/testdata/bitmapwithruns.bin");
- RoaringBitmap rb = new RoaringBitmap();
- // should not throw an exception
- rb.deserialize(new DataInputStream(inputStream));
- assertEquals(rb.getCardinality(), 200100);
- }
-
- @Test
- public void testInputGoodFile2() throws IOException {
- InputStream inputStream = openInputstream("/testdata/bitmapwithoutruns.bin");
- RoaringBitmap rb = new RoaringBitmap();
- // should not throw an exception
- rb.deserialize(new DataInputStream(inputStream));
- assertEquals(rb.getCardinality(), 200100);
- }
-
- @ParameterizedTest
- @MethodSource("badFiles")
- public void testInputBadFile8(String fileName) {
- assertThrows(IOException.class, () -> deserialize(fileName));
- }
-
-
- private void deserialize(String fileName) throws IOException {
- InputStream inputStream = openInputstream(fileName);
- RoaringBitmap rb = new RoaringBitmap();
- // should not work
- rb.deserialize(new DataInputStream(inputStream));
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestArrayContainer.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestArrayContainer.java
deleted file mode 100644
index f7602e731..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestArrayContainer.java
+++ /dev/null
@@ -1,953 +0,0 @@
-package org.roaringbitmap;
-
-import com.google.common.primitives.Ints;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.Arrays;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.roaringbitmap.ValidationRangeConsumer.Value.*;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestArrayContainer {
-
- @Test
- public void testConst() {
- ArrayContainer ac1 = new ArrayContainer(5, 15);
- char[] data = {5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
- ArrayContainer ac2 = new ArrayContainer(data);
- assertEquals(ac1, ac2);
- }
-
- @Test
- public void testRemove() {
- ArrayContainer ac1 = new ArrayContainer(5, 15);
- ac1.remove((char)14);
- ArrayContainer ac2 = new ArrayContainer(5, 14);
- assertEquals(ac1, ac2);
- }
-
- @Test
- public void arrayContainersNeverFull() {
- assertFalse(new ArrayContainer(5, 15).isFull());
- }
-
- @Test
- public void testToString() {
- ArrayContainer ac1 = new ArrayContainer(5, 15);
- ac1.add((char) -3);
- ac1.add((char) -17);
- assertEquals("{5,6,7,8,9,10,11,12,13,14,65519,65533}", ac1.toString());
- }
-
- @Test
- public void testIandNot() {
- ArrayContainer ac1 = new ArrayContainer(5, 15);
- ArrayContainer ac2 = new ArrayContainer(10, 15);
- BitmapContainer bc = new BitmapContainer(5, 10);
- ArrayContainer ac3 = ac1.iandNot(bc);
- assertEquals(ac2, ac3);
- }
-
- @Test
- public void testReverseArrayContainerShortIterator() {
- //Test Clone
- ArrayContainer ac1 = new ArrayContainer(5, 15);
- ReverseArrayContainerCharIterator rac1 = new ReverseArrayContainerCharIterator(ac1);
- CharIterator rac2 = rac1.clone();
- assertNotNull(rac2);
- assertEquals(asList(rac1), asList(rac2));
- }
-
- private static List asList(CharIterator ints) {
- int[] values = new int[10];
- int size = 0;
- while (ints.hasNext()) {
- if (!(size < values.length)) {
- values = Arrays.copyOf(values, values.length * 2);
- }
- values[size++] = ints.next();
- }
- return Ints.asList(Arrays.copyOf(values, size));
- }
-
- @Test
- public void roundtrip() throws Exception {
- Container ac = new ArrayContainer();
- ac = ac.add(1, 5);
- final ByteArrayOutputStream bos = new ByteArrayOutputStream();
- try (ObjectOutputStream oo = new ObjectOutputStream(bos)) {
- ac.writeExternal(oo);
- }
- Container ac2 = new ArrayContainer();
- final ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- ac2.readExternal(new ObjectInputStream(bis));
-
- assertEquals(4, ac2.getCardinality());
- for (int i = 1; i < 5; i++) {
- assertTrue(ac2.contains((char) i));
- }
- }
-
- @Test
- public void intersectsArray() {
- Container ac = new ArrayContainer();
- ac = ac.add(1, 10);
- Container ac2 = new ArrayContainer();
- ac2 = ac2.add(5, 25);
- assertTrue(ac.intersects(ac2));
- }
-
- @Test
- public void orFullToRunContainer() {
- ArrayContainer ac = new ArrayContainer(0, 1 << 12);
- BitmapContainer half = new BitmapContainer(1 << 12, 1 << 16);
- Container result = ac.or(half);
- assertEquals(1 << 16, result.getCardinality());
- assertTrue(result instanceof RunContainer);
- }
-
- @Test
- public void orFullToRunContainer2() {
- ArrayContainer ac = new ArrayContainer(0, 1 << 15);
- ArrayContainer half = new ArrayContainer(1 << 15, 1 << 16);
- Container result = ac.or(half);
- assertEquals(1 << 16, result.getCardinality());
- assertTrue(result instanceof RunContainer);
- }
-
- @Test
- public void iandBitmap() {
- Container ac = new ArrayContainer();
- ac = ac.add(1, 10);
- Container bc = new BitmapContainer();
- bc = bc.add(5, 25);
- ac.iand(bc);
- assertEquals(5, ac.getCardinality());
- for (int i = 5; i < 10; i++) {
- assertTrue(ac.contains((char) i));
- }
- }
-
- @Test
- public void iandRun() {
- Container ac = new ArrayContainer();
- ac = ac.add(1, 10);
- Container rc = new RunContainer();
- rc = rc.add(5, 25);
- ac = ac.iand(rc);
- assertEquals(5, ac.getCardinality());
- for (int i = 5; i < 10; i++) {
- assertTrue(ac.contains((char) i));
- }
- }
-
- @Test
- public void addEmptyRange() {
- Container ac = new ArrayContainer();
- ac = ac.add(1,1);
- assertEquals(0, ac.getCardinality());
- }
-
- @Test
- public void addInvalidRange() {
- assertThrows(IllegalArgumentException.class, () -> {
- Container ac = new ArrayContainer();
- ac.add(13, 1);
- });
- }
-
- @Test
- public void iaddEmptyRange() {
- Container ac = new ArrayContainer();
- ac = ac.iadd(1,1);
- assertEquals(0, ac.getCardinality());
- }
-
- @Test
- public void iaddInvalidRange() {
- assertThrows(IllegalArgumentException.class, () -> {
- Container ac = new ArrayContainer();
- ac.iadd(13, 1);
- });
- }
-
- @Test
- public void iaddSanityTest() {
- Container ac = new ArrayContainer();
- ac = ac.iadd(10,20);
- //insert disjoint at end
- ac = ac.iadd(30,70);
- //insert disjoint between
- ac = ac.iadd(25,26);
- //insert disjoint at start
- ac = ac.iadd(1,2);
- //insert overlap at end
- ac = ac.iadd(60,80);
- //insert overlap between
- ac = ac.iadd(10,30);
- //insert overlap at start
- ac = ac.iadd(1,20);
- assertEquals(79, ac.getCardinality());
- }
-
- @Test
- public void clear() {
- Container ac = new ArrayContainer();
- ac = ac.add(1, 10);
- ac.clear();
- assertEquals(0, ac.getCardinality());
- }
-
- @Test
- public void testLazyORFull() {
- ArrayContainer ac = new ArrayContainer(0, 1 << 15);
- ArrayContainer ac2 = new ArrayContainer(1 << 15, 1 << 16);
- Container rbc = ac.lazyor(ac2);
- assertEquals(-1, rbc.getCardinality());
- Container repaired = rbc.repairAfterLazy();
- assertEquals(1 << 16, repaired.getCardinality());
- assertTrue(repaired instanceof RunContainer);
- }
-
- @Test
- public void testFirst_Empty() {
- assertThrows(NoSuchElementException.class, () -> new ArrayContainer().first());
- }
-
- @Test
- public void testLast_Empty() {
- assertThrows(NoSuchElementException.class, () -> new ArrayContainer().last());
- }
-
- @Test
- public void testFirstLast() {
- Container rc = new ArrayContainer();
- final int firstInclusive = 1;
- int lastExclusive = firstInclusive;
- for (int i = 0; i < 1 << 16 - 10; ++i) {
- int newLastExclusive = lastExclusive + 10;
- rc = rc.add(lastExclusive, newLastExclusive);
- assertEquals(firstInclusive, rc.first());
- assertEquals(newLastExclusive - 1, rc.last());
- lastExclusive = newLastExclusive;
- }
- }
-
- @Test
- public void testContainsBitmapContainer_ExcludeShiftedSet() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new BitmapContainer().add(2,12);
- assertFalse(ac.contains(subset));
- }
-
- @Test
- public void testContainsBitmapContainer_AlwaysFalse() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new BitmapContainer().add(0,10);
- assertFalse(ac.contains(subset));
- }
-
- @Test
- public void testContainsBitmapContainer_ExcludeSuperSet() {
- Container ac = new ArrayContainer().add(0,10);
- Container superset = new BitmapContainer().add(0,20);
- assertFalse(ac.contains(superset));
- }
-
- @Test
- public void testContainsBitmapContainer_ExcludeDisJointSet() {
- Container ac = new ArrayContainer().add(0,10);
- Container disjoint = new BitmapContainer().add(20, 40);
- assertFalse(ac.contains(disjoint));
- assertFalse(disjoint.contains(ac));
- }
-
- @Test
- public void testContainsRunContainer_EmptyContainsEmpty() {
- Container ac = new ArrayContainer();
- Container subset = new RunContainer();
- assertTrue(ac.contains(subset));
- }
-
- @Test
- public void testContainsRunContainer_IncludeProperSubset() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new RunContainer().add(0,9);
- assertTrue(ac.contains(subset));
- }
-
- @Test
- public void testContainsRunContainer_IncludeSelf() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new RunContainer().add(0,10);
- assertTrue(ac.contains(subset));
- }
-
- @Test
- public void testContainsRunContainer_ExcludeSuperSet() {
- Container ac = new ArrayContainer().add(0,10);
- Container superset = new RunContainer().add(0,20);
- assertFalse(ac.contains(superset));
- }
-
- @Test
- public void testContainsRunContainer_IncludeProperSubsetDifferentStart() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new RunContainer().add(1,9);
- assertTrue(ac.contains(subset));
- }
-
- @Test
- public void testContainsRunContainer_ExcludeShiftedSet() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new RunContainer().add(2,12);
- assertFalse(ac.contains(subset));
- }
-
- @Test
- public void testContainsRunContainer_ExcludeDisJointSet() {
- Container ac = new ArrayContainer().add(0,10);
- Container disjoint = new RunContainer().add(20, 40);
- assertFalse(ac.contains(disjoint));
- assertFalse(disjoint.contains(ac));
- }
-
- @Test
- public void testContainsArrayContainer_EmptyContainsEmpty() {
- Container ac = new ArrayContainer();
- Container subset = new ArrayContainer();
- assertTrue(ac.contains(subset));
- }
-
- @Test
- public void testContainsArrayContainer_IncludeProperSubset() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new ArrayContainer().add(0,9);
- assertTrue(ac.contains(subset));
- }
-
- @Test
- public void testContainsArrayContainer_IncludeProperSubsetDifferentStart() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new ArrayContainer().add(2,9);
- assertTrue(ac.contains(subset));
- }
-
- @Test
- public void testContainsArrayContainer_ExcludeShiftedSet() {
- Container ac = new ArrayContainer().add(0,10);
- Container shifted = new ArrayContainer().add(2,12);
- assertFalse(ac.contains(shifted));
- }
-
- @Test
- public void testContainsArrayContainer_IncludeSelf() {
- Container ac = new ArrayContainer().add(0,10);
- Container subset = new ArrayContainer().add(0,10);
- assertTrue(ac.contains(subset));
- }
-
- @Test
- public void testContainsArrayContainer_ExcludeSuperSet() {
- Container ac = new ArrayContainer().add(0,10);
- Container superset = new ArrayContainer().add(0,20);
- assertFalse(ac.contains(superset));
- }
-
- @Test
- public void testContainsArrayContainer_ExcludeDisJointSet() {
- Container ac = new ArrayContainer().add(0, 10);
- Container disjoint = new ArrayContainer().add(20, 40);
- assertFalse(ac.contains(disjoint));
- assertFalse(disjoint.contains(ac));
- }
-
- @Test
- public void iorNotIncreaseCapacity() {
- Container ac1 = new ArrayContainer();
- Container ac2 = new ArrayContainer();
- ac1.add((char) 128);
- ac1.add((char) 256);
- ac2.add((char) 1024);
-
- ac1.ior(ac2);
- assertTrue(ac1.contains((char) 128));
- assertTrue(ac1.contains((char) 256));
- assertTrue(ac1.contains((char) 1024));
- }
-
- @Test
- public void iorIncreaseCapacity() {
- Container ac1 = new ArrayContainer();
- Container ac2 = new ArrayContainer();
- ac1.add((char) 128);
- ac1.add((char) 256);
- ac1.add((char) 512);
- ac1.add((char) 513);
- ac2.add((char) 1024);
-
- ac1.ior(ac2);
- assertTrue(ac1.contains((char) 128));
- assertTrue(ac1.contains((char) 256));
- assertTrue(ac1.contains((char) 512));
- assertTrue(ac1.contains((char) 513));
- assertTrue(ac1.contains((char) 1024));
- }
-
- @Test
- public void iorSanityCheck() {
- Container ac = new ArrayContainer().add(0, 10);
- Container disjoint = new ArrayContainer().add(20, 40);
- ac.ior(disjoint);
- assertTrue(ac.contains(disjoint));
- }
-
- @Test
- public void iorNot() {
- Container rc1 = new ArrayContainer();
- Container rc2 = new ArrayContainer();
-
- rc1.iadd(257, 258);
- rc2.iadd(128, 256);
- rc1 = rc1.iorNot(rc2, 258);
- assertEquals(130, rc1.getCardinality());
-
- PeekableCharIterator iterator = rc1.getCharIterator();
- for (int i = 0; i < 128; i++) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertTrue(iterator.hasNext());
- assertEquals(256, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(257, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void iorNot2() {
- Container rc1 = new ArrayContainer();
- Container rc2 = new ArrayContainer();
- rc2.iadd(128, 256).iadd(257, 260);
- rc1 = rc1.iorNot(rc2, 261);
- assertEquals(130, rc1.getCardinality());
-
- PeekableCharIterator iterator = rc1.getCharIterator();
- for (int i = 0; i < 128; i++) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertTrue(iterator.hasNext());
- assertEquals(256, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(260, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void iorNot3() {
- Container rc1 = new ArrayContainer();
- Container rc2 = new BitmapContainer();
-
- rc1.iadd(257, 258);
- rc2.iadd(128, 256);
- rc1 = rc1.iorNot(rc2, 258);
- assertEquals(130, rc1.getCardinality());
-
- PeekableCharIterator iterator = rc1.getCharIterator();
- for (int i = 0; i < 128; i++) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertTrue(iterator.hasNext());
- assertEquals(256, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(257, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void iorNot4() {
- Container rc1 = new ArrayContainer();
- Container rc2 = new RunContainer();
-
- rc1.iadd(257, 258);
- rc2.iadd(128, 256);
- rc1 = rc1.iorNot(rc2, 258);
- assertEquals(130, rc1.getCardinality());
-
- PeekableCharIterator iterator = rc1.getCharIterator();
- for (int i = 0; i < 128; i++) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertTrue(iterator.hasNext());
- assertEquals(256, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(257, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNot() {
- final Container rc1 = new ArrayContainer();
-
- {
- Container rc2 = new ArrayContainer();
- rc2.iadd(128, 256);
- Container res = rc1.orNot(rc2, 257);
- assertEquals(129, res.getCardinality());
-
- PeekableCharIterator iterator = res.getCharIterator();
- for (int i = 0; i < 128; i++) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertTrue(iterator.hasNext());
- assertEquals(256, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- {
- Container rc2 = new BitmapContainer();
- rc2.iadd(128, 256);
- Container res = rc1.orNot(rc2, 257);
- assertEquals(129, res.getCardinality());
-
- PeekableCharIterator iterator = res.getCharIterator();
- for (int i = 0; i < 128; i++) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertTrue(iterator.hasNext());
- assertEquals(256, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- {
- Container rc2 = new RunContainer();
- rc2.iadd(128, 256);
- Container res = rc1.orNot(rc2, 257);
- assertEquals(129, res.getCardinality());
-
- PeekableCharIterator iterator = res.getCharIterator();
- for (int i = 0; i < 128; i++) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertTrue(iterator.hasNext());
- assertEquals(256, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- }
-
- @Test
- public void orNot2() {
- Container rc1 = new ArrayContainer();
- Container rc2 = new ArrayContainer();
- rc2.iadd(128, 256).iadd(257, 260);
- rc1 = rc1.orNot(rc2, 261);
- assertEquals(130, rc1.getCardinality());
-
- PeekableCharIterator iterator = rc1.getCharIterator();
- for (int i = 0; i < 128; i++) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertTrue(iterator.hasNext());
- assertEquals(256, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(260, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void testIntersectsWithRange() {
- Container container = new ArrayContainer().add(0, 10);
- assertTrue(container.intersects(0, 1));
- assertTrue(container.intersects(0, 101));
- assertTrue(container.intersects(0, lower16Bits(-1)));
- assertFalse(container.intersects(11, lower16Bits(-1)));
- }
-
-
- @Test
- public void testIntersectsWithRange2() {
- Container container = new ArrayContainer().add(lower16Bits(-50), lower16Bits(-10));
- assertFalse(container.intersects(0, 1));
- assertTrue(container.intersects(0, lower16Bits(-40)));
- assertFalse(container.intersects(lower16Bits(-100), lower16Bits(-55)));
- assertFalse(container.intersects(lower16Bits(-9), lower16Bits(-1)));
- assertTrue(container.intersects(11, 1 << 16));
- }
-
-
- @Test
- public void testIntersectsWithRange3() {
- Container container = new ArrayContainer()
- .add((char) 1)
- .add((char) 300)
- .add((char) 1024);
- assertTrue(container.intersects(0, 300));
- assertTrue(container.intersects(1, 300));
- assertFalse(container.intersects(2, 300));
- assertFalse(container.intersects(2, 299));
- assertTrue(container.intersects(0, lower16Bits(-1)));
- assertFalse(container.intersects(1025, 1 << 16));
- }
-
-
- @Test
- public void testContainsRange() {
- Container ac = new ArrayContainer().add(20, 100);
- assertFalse(ac.contains(1, 21));
- assertFalse(ac.contains(1, 19));
- assertTrue(ac.contains(20, 100));
- assertTrue(ac.contains(20, 99));
- assertTrue(ac.contains(21, 100));
- assertFalse(ac.contains(21, 101));
- assertFalse(ac.contains(19, 99));
- assertFalse(ac.contains(190, 9999));
- }
-
- @Test
- public void testContainsRange2() {
- Container ac = new ArrayContainer()
- .add((char)1).add((char)10)
- .add(20, 100);
- assertFalse(ac.contains(1, 21));
- assertFalse(ac.contains(1, 20));
- assertTrue(ac.contains(1, 2));
- }
-
- @Test
- public void testContainsRangeUnsigned() {
- Container ac = new ArrayContainer().add(1 << 15, 1 << 8 | 1 << 15);
- assertTrue(ac.contains(1 << 15, 1 << 8 | 1 << 15));
- assertTrue(ac.contains(1 + (1 << 15), (1 << 8 | 1 << 15) - 1));
- assertFalse(ac.contains(1 + (1 << 15), (1 << 8 | 1 << 15) + 1));
- assertFalse(ac.contains((1 << 15) - 1, (1 << 8 | 1 << 15) - 1));
- assertFalse(ac.contains(0, 1 << 15));
- assertFalse(ac.contains(1 << 8 | 1 << 15 | 1, 1 << 16));
- }
-
- @Test
- public void testNextValueBeforeStart() {
- ArrayContainer container = new ArrayContainer(new char[] { 10, 20, 30});
- assertEquals(10, container.nextValue((char)5));
- }
-
- @Test
- public void testNextValue() {
- ArrayContainer container = new ArrayContainer(new char[] { 10, 20, 30});
- assertEquals(10, container.nextValue((char)10));
- assertEquals(20, container.nextValue((char)11));
- assertEquals(30, container.nextValue((char)30));
- }
-
- @Test
- public void testNextValueAfterEnd() {
- ArrayContainer container = new ArrayContainer(new char[] { 10, 20, 30});
- assertEquals(-1, container.nextValue((char)31));
- }
-
- @Test
- public void testNextValue2() {
- Container container = new ArrayContainer().iadd(64, 129);
- assertTrue(container instanceof ArrayContainer);
- assertEquals(64, container.nextValue((char)0));
- assertEquals(64, container.nextValue((char)64));
- assertEquals(65, container.nextValue((char)65));
- assertEquals(128, container.nextValue((char)128));
- assertEquals(-1, container.nextValue((char)129));
- assertEquals(-1, container.nextValue((char)5000));
- }
-
- @Test
- public void testNextValueBetweenRuns() {
- Container container = new ArrayContainer().iadd(64, 129).iadd(256, 321);
- assertTrue(container instanceof ArrayContainer);
- assertEquals(64, container.nextValue((char)0));
- assertEquals(64, container.nextValue((char)64));
- assertEquals(65, container.nextValue((char)65));
- assertEquals(128, container.nextValue((char)128));
- assertEquals(256, container.nextValue((char)129));
- assertEquals(-1, container.nextValue((char)512));
- }
-
- @Test
- public void testNextValue3() {
- Container container = new ArrayContainer().iadd(64, 129).iadd(200, 501).iadd(5000, 5201);
- assertTrue(container instanceof ArrayContainer);
- assertEquals(64, container.nextValue((char)0));
- assertEquals(64, container.nextValue((char)63));
- assertEquals(64, container.nextValue((char)64));
- assertEquals(65, container.nextValue((char)65));
- assertEquals(128, container.nextValue((char)128));
- assertEquals(200, container.nextValue((char)129));
- assertEquals(200, container.nextValue((char)199));
- assertEquals(200, container.nextValue((char)200));
- assertEquals(250, container.nextValue((char)250));
- assertEquals(5000, container.nextValue((char)2500));
- assertEquals(5000, container.nextValue((char)5000));
- assertEquals(5200, container.nextValue((char)5200));
- assertEquals(-1, container.nextValue((char)5201));
- }
-
- @Test
- public void testPreviousValue1() {
- Container container = new ArrayContainer().iadd(64, 129);
- assertTrue(container instanceof ArrayContainer);
- assertEquals(-1, container.previousValue((char)0));
- assertEquals(-1, container.previousValue((char)63));
- assertEquals(64, container.previousValue((char)64));
- assertEquals(65, container.previousValue((char)65));
- assertEquals(128, container.previousValue((char)128));
- assertEquals(128, container.previousValue((char)129));
- }
-
- @Test
- public void testPreviousValue2() {
- Container container = new ArrayContainer().iadd(64, 129).iadd(200, 501).iadd(5000, 5201);
- assertTrue(container instanceof ArrayContainer);
- assertEquals(-1, container.previousValue((char)0));
- assertEquals(-1, container.previousValue((char)63));
- assertEquals(64, container.previousValue((char)64));
- assertEquals(65, container.previousValue((char)65));
- assertEquals(128, container.previousValue((char)128));
- assertEquals(128, container.previousValue((char)129));
- assertEquals(128, container.previousValue((char)199));
- assertEquals(200, container.previousValue((char)200));
- assertEquals(250, container.previousValue((char)250));
- assertEquals(500, container.previousValue((char)2500));
- assertEquals(5000, container.previousValue((char)5000));
- assertEquals(5200, container.previousValue((char)5200));
- }
-
- @Test
- public void testPreviousValueBeforeStart() {
- ArrayContainer container = new ArrayContainer(new char[] { 10, 20, 30});
- assertEquals(-1, container.previousValue((char)5));
- }
-
- @Test
- public void testPreviousValueSparse() {
- ArrayContainer container = new ArrayContainer(new char[] { 10, 20, 30});
- assertEquals(-1, container.previousValue((char)9));
- assertEquals(10, container.previousValue((char)10));
- assertEquals(10, container.previousValue((char)11));
- assertEquals(20, container.previousValue((char)21));
- assertEquals(30, container.previousValue((char)30));
- }
-
- @Test
- public void testPreviousValueUnsigned() {
- ArrayContainer container = new ArrayContainer(new char[] { (char)((1 << 15) | 5), (char)((1 << 15) | 7)});
- assertEquals(-1, container.previousValue((char)((1 << 15) | 4)));
- assertEquals(((1 << 15) | 5), container.previousValue((char)((1 << 15) | 5)));
- assertEquals(((1 << 15) | 5), container.previousValue((char)((1 << 15) | 6)));
- assertEquals(((1 << 15) | 7), container.previousValue((char)((1 << 15) | 7)));
- assertEquals(((1 << 15) | 7), container.previousValue((char)((1 << 15) | 8)));
- }
-
- @Test
- public void testNextValueUnsigned() {
- ArrayContainer container = new ArrayContainer(new char[] { (char)((1 << 15) | 5), (char)((1 << 15) | 7)});
- assertEquals(((1 << 15) | 5), container.nextValue((char)((1 << 15) | 4)));
- assertEquals(((1 << 15) | 5), container.nextValue((char)((1 << 15) | 5)));
- assertEquals(((1 << 15) | 7), container.nextValue((char)((1 << 15) | 6)));
- assertEquals(((1 << 15) | 7), container.nextValue((char)((1 << 15) | 7)));
- assertEquals(-1, container.nextValue((char)((1 << 15) | 8)));
- }
-
- @Test
- public void testPreviousValueAfterEnd() {
- ArrayContainer container = new ArrayContainer(new char[] { 10, 20, 30});
- assertEquals(30, container.previousValue((char)31));
- }
-
- @Test
- public void testPreviousAbsentValue1() {
- Container container = new ArrayContainer().iadd(64, 129);
- assertEquals(0, container.previousAbsentValue((char)0));
- assertEquals(63, container.previousAbsentValue((char)63));
- assertEquals(63, container.previousAbsentValue((char)64));
- assertEquals(63, container.previousAbsentValue((char)65));
- assertEquals(63, container.previousAbsentValue((char)128));
- assertEquals(129, container.previousAbsentValue((char)129));
- }
-
- @Test
- public void testPreviousAbsentValue2() {
- Container container = new ArrayContainer().iadd(64, 129).iadd(200, 501).iadd(5000, 5201);
- assertEquals(0, container.previousAbsentValue((char)0));
- assertEquals(63, container.previousAbsentValue((char)63));
- assertEquals(63, container.previousAbsentValue((char)64));
- assertEquals(63, container.previousAbsentValue((char)65));
- assertEquals(63, container.previousAbsentValue((char)128));
- assertEquals(129, container.previousAbsentValue((char)129));
- assertEquals(199, container.previousAbsentValue((char)199));
- assertEquals(199, container.previousAbsentValue((char)200));
- assertEquals(199, container.previousAbsentValue((char)250));
- assertEquals(2500, container.previousAbsentValue((char)2500));
- assertEquals(4999, container.previousAbsentValue((char)5000));
- assertEquals(4999, container.previousAbsentValue((char)5200));
- }
-
- @Test
- public void testPreviousAbsentValueEmpty() {
- ArrayContainer container = new ArrayContainer();
- for (int i = 0; i < 1000; i++) {
- assertEquals(i, container.previousAbsentValue((char)i));
- }
- }
-
- @Test
- public void testPreviousAbsentValueSparse() {
- ArrayContainer container = new ArrayContainer(new char[] { 10, 20, 30});
- assertEquals(9, container.previousAbsentValue((char)9));
- assertEquals(9, container.previousAbsentValue((char)10));
- assertEquals(11, container.previousAbsentValue((char)11));
- assertEquals(21, container.previousAbsentValue((char)21));
- assertEquals(29, container.previousAbsentValue((char)30));
- }
-
- @Test
- public void testPreviousAbsentValueUnsigned() {
- ArrayContainer container = new ArrayContainer(new char[] { (char)((1 << 15) | 5), (char)((1 << 15) | 7)});
- assertEquals(((1 << 15) | 4), container.previousAbsentValue((char)((1 << 15) | 4)));
- assertEquals(((1 << 15) | 4), container.previousAbsentValue((char)((1 << 15) | 5)));
- assertEquals(((1 << 15) | 6), container.previousAbsentValue((char)((1 << 15) | 6)));
- assertEquals(((1 << 15) | 6), container.previousAbsentValue((char)((1 << 15) | 7)));
- assertEquals(((1 << 15) | 8), container.previousAbsentValue((char)((1 << 15) | 8)));
- }
-
-
- @Test
- public void testNextAbsentValue1() {
- Container container = new ArrayContainer().iadd(64, 129);
- assertEquals(0, container.nextAbsentValue((char)0));
- assertEquals(63, container.nextAbsentValue((char)63));
- assertEquals(129, container.nextAbsentValue((char)64));
- assertEquals(129, container.nextAbsentValue((char)65));
- assertEquals(129, container.nextAbsentValue((char)128));
- assertEquals(129, container.nextAbsentValue((char)129));
- }
-
- @Test
- public void testNextAbsentValue2() {
- Container container = new ArrayContainer().iadd(64, 129).iadd(200, 501).iadd(5000, 5201);
- assertEquals(0, container.nextAbsentValue((char)0));
- assertEquals(63, container.nextAbsentValue((char)63));
- assertEquals(129, container.nextAbsentValue((char)64));
- assertEquals(129, container.nextAbsentValue((char)65));
- assertEquals(129, container.nextAbsentValue((char)128));
- assertEquals(129, container.nextAbsentValue((char)129));
- assertEquals(199, container.nextAbsentValue((char)199));
- assertEquals(501, container.nextAbsentValue((char)200));
- assertEquals(501, container.nextAbsentValue((char)250));
- assertEquals(2500, container.nextAbsentValue((char)2500));
- assertEquals(5201, container.nextAbsentValue((char)5000));
- assertEquals(5201, container.nextAbsentValue((char)5200));
- }
-
- @Test
- public void testNextAbsentValueEmpty() {
- ArrayContainer container = new ArrayContainer();
- for (int i = 0; i < 1000; i++) {
- assertEquals(i, container.nextAbsentValue((char)i));
- }
- }
-
- @Test
- public void testNextAbsentValueSparse() {
- ArrayContainer container = new ArrayContainer(new char[] { 10, 20, 30});
- assertEquals(9, container.nextAbsentValue((char)9));
- assertEquals(11, container.nextAbsentValue((char)10));
- assertEquals(11, container.nextAbsentValue((char)11));
- assertEquals(21, container.nextAbsentValue((char)21));
- assertEquals(31, container.nextAbsentValue((char)30));
- }
-
- @Test
- public void testNextAbsentValueUnsigned() {
- ArrayContainer container = new ArrayContainer(new char[] { (char)((1 << 15) | 5), (char)((1 << 15) | 7)});
- assertEquals(((1 << 15) | 4), container.nextAbsentValue((char)((1 << 15) | 4)));
- assertEquals(((1 << 15) | 6), container.nextAbsentValue((char)((1 << 15) | 5)));
- assertEquals(((1 << 15) | 6), container.nextAbsentValue((char)((1 << 15) | 6)));
- assertEquals(((1 << 15) | 8), container.nextAbsentValue((char)((1 << 15) | 7)));
- assertEquals(((1 << 15) | 8), container.nextAbsentValue((char)((1 << 15) | 8)));
- }
-
- @Test
- public void testRangeConsumer() {
- char[] entries = new char[] {3, 4, 7, 8, 10, 65530, 65534, 65535};
- ArrayContainer container = new ArrayContainer(entries);
-
- ValidationRangeConsumer consumer = ValidationRangeConsumer.validate(new ValidationRangeConsumer.Value[] {
- ABSENT, ABSENT, ABSENT, PRESENT, PRESENT, ABSENT, ABSENT, PRESENT, PRESENT, ABSENT, PRESENT
- });
- container.forAllUntil(0, (char) 11, consumer);
- assertEquals(11, consumer.getNumberOfValuesConsumed());
-
- ValidationRangeConsumer consumer2 = ValidationRangeConsumer.validate(new ValidationRangeConsumer.Value[] {
- PRESENT, ABSENT, ABSENT, PRESENT, PRESENT
- });
- container.forAllInRange((char) 4, (char) 9, consumer2);
- assertEquals(5, consumer2.getNumberOfValuesConsumed());
-
- ValidationRangeConsumer consumer3 = ValidationRangeConsumer.validate(new ValidationRangeConsumer.Value[] {
- PRESENT, ABSENT, ABSENT, ABSENT, PRESENT, PRESENT
- });
- container.forAllFrom((char) 65530, consumer3);
- assertEquals(6, consumer3.getNumberOfValuesConsumed());
-
- ValidationRangeConsumer consumer4 = ValidationRangeConsumer.ofSize(BitmapContainer.MAX_CAPACITY);
- container.forAll(0, consumer4);
- consumer4.assertAllAbsentExcept(entries, 0);
-
- ValidationRangeConsumer consumer5 = ValidationRangeConsumer.ofSize(2 * BitmapContainer.MAX_CAPACITY);
- consumer5.acceptAllAbsent(0, BitmapContainer.MAX_CAPACITY);
- container.forAll(BitmapContainer.MAX_CAPACITY, consumer5);
- consumer5.assertAllAbsentExcept(entries, BitmapContainer.MAX_CAPACITY);
-
- container = new ArrayContainer();
- ValidationRangeConsumer consumer6 = ValidationRangeConsumer.ofSize(BitmapContainer.MAX_CAPACITY);
- container.forAll(0, consumer6);
- consumer6.assertAllAbsent();
-
- container = new ArrayContainer();
- Container c = container.iadd(0, ArrayContainer.DEFAULT_MAX_SIZE);
- assertTrue(container == c, "Container type changed!");
- ValidationRangeConsumer consumer7 = ValidationRangeConsumer.ofSize(ArrayContainer.DEFAULT_MAX_SIZE);
- container.forAllUntil(0, (char) ArrayContainer.DEFAULT_MAX_SIZE, consumer7);
- consumer7.assertAllPresent();
- }
-
- private static int lower16Bits(int x) {
- return ((char)x) & 0xFFFF;
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestEmptyRoaringBatchIterator.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestEmptyRoaringBatchIterator.java
deleted file mode 100644
index 466adcc4f..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestEmptyRoaringBatchIterator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.roaringbitmap;
-
-import org.junit.jupiter.api.Test;
-import org.roaringbitmap.buffer.ImmutableRoaringBitmap;
-import org.roaringbitmap.buffer.MutableRoaringBitmap;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class TestEmptyRoaringBatchIterator {
-
- @Test
- public void testEmptyMutableRoaringBitmap(){
- MutableRoaringBitmap mutableRoaringBitmap = new MutableRoaringBitmap();
- BatchIterator iterator = mutableRoaringBitmap.getBatchIterator();
- int[] ints = new int[1024];
- int cnt = iterator.nextBatch(ints);
- assertEquals(0, cnt);
-
- mutableRoaringBitmap.add(1);
- iterator = mutableRoaringBitmap.getBatchIterator();
- cnt = iterator.nextBatch(ints);
- assertEquals(1, cnt);
- }
-
- @Test
- public void testEmptyImmutableRoaringBitmap(){
- MutableRoaringBitmap mutableRoaringBitmap = new MutableRoaringBitmap();
- ImmutableRoaringBitmap immutableRoaringBitmap = mutableRoaringBitmap.toImmutableRoaringBitmap();
- BatchIterator iterator = immutableRoaringBitmap.getBatchIterator();
- int[] ints = new int[1024];
- int cnt = iterator.nextBatch(ints);
- assertEquals(0, cnt);
-
- mutableRoaringBitmap.add(1);
- iterator = mutableRoaringBitmap.toImmutableRoaringBitmap().getBatchIterator();
- cnt = iterator.nextBatch(ints);
- assertEquals(1, cnt);
- }
-
- @Test
- public void testEmptyRoaringBitmap(){
- RoaringBitmap roaringBitmap = new RoaringBitmap();
- BatchIterator iterator = roaringBitmap.getBatchIterator();
- int[] ints = new int[1024];
- int cnt = iterator.nextBatch(ints);
- assertEquals(0, cnt);
-
- roaringBitmap.add(1);
- iterator = roaringBitmap.getBatchIterator();
- cnt = iterator.nextBatch(ints);
- assertEquals(1, cnt);
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestFastAggregation.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestFastAggregation.java
deleted file mode 100644
index 07d9b0671..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestFastAggregation.java
+++ /dev/null
@@ -1,283 +0,0 @@
-package org.roaringbitmap;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.roaringbitmap.SeededTestData.TestDataSet.testCase;
-
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestFastAggregation {
-
- @Test
- public void horizontal_or() {
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(0, 1, 2);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(0, 5, 6);
- RoaringBitmap rb3 = RoaringBitmap.bitmapOf(1<<16, 2<<16);
- RoaringBitmap result = FastAggregation.horizontal_or(Arrays.asList(rb1, rb2, rb3));
- RoaringBitmap expected = RoaringBitmap.bitmapOf(0, 1, 2, 5, 6, 1<<16, 2<<16);
- assertEquals(expected, result);
- }
-
- @Test
- public void or() {
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(0, 1, 2);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(0, 5, 6);
- RoaringBitmap rb3 = RoaringBitmap.bitmapOf(1<<16, 2<<16);
- RoaringBitmap result = FastAggregation.or(rb1, rb2, rb3);
- RoaringBitmap expected = RoaringBitmap.bitmapOf(0, 1, 2, 5, 6, 1<<16, 2<<16);
- assertEquals(expected, result);
- }
-
- @Test
- public void horizontal_or2() {
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(0, 1, 2);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(0, 5, 6);
- RoaringBitmap rb3 = RoaringBitmap.bitmapOf(1<<16, 2<<16);
- RoaringBitmap result = FastAggregation.horizontal_or(rb1, rb2, rb3);
- RoaringBitmap expected = RoaringBitmap.bitmapOf(0, 1, 2, 5, 6, 1<<16, 2<<16);
- assertEquals(expected, result);
- }
-
- @Test
- public void priorityqueue_or() {
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(0, 1, 2);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(0, 5, 6);
- RoaringBitmap rb3 = RoaringBitmap.bitmapOf(1<<16, 2<<16);
- RoaringBitmap result = FastAggregation.priorityqueue_or(Arrays.asList(rb1, rb2, rb3).iterator());
- RoaringBitmap expected = RoaringBitmap.bitmapOf(0, 1, 2, 5, 6, 1<<16, 2<<16);
- assertEquals(expected, result);
- }
-
- @Test
- public void priorityqueue_or2() {
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(0, 1, 2);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(0, 5, 6);
- RoaringBitmap rb3 = RoaringBitmap.bitmapOf(1<<16, 2<<16);
- RoaringBitmap result = FastAggregation.priorityqueue_or(rb1, rb2, rb3);
- RoaringBitmap expected = RoaringBitmap.bitmapOf(0, 1, 2, 5, 6, 1<<16, 2<<16);
- assertEquals(expected, result);
- }
-
- private static class ExtendedRoaringBitmap extends RoaringBitmap {}
-
-
- @Test
- public void testWorkShyAnd() {
- final RoaringBitmap b1 = RoaringBitmap.bitmapOf(1, 2, 0x10001, 0x20001, 0x30001);
- final RoaringBitmap b2 = RoaringBitmap.bitmapOf(2, 3, 0x20002, 0x30001);
- final RoaringBitmap bResult = FastAggregation.workShyAnd(new long[1024], b1, b2);
- assertFalse(bResult.contains(1));
- assertTrue(bResult.contains(2));
- assertFalse(bResult.contains(3));
- }
-
- @Test
- public void testAndWithIterator() {
- final RoaringBitmap b1 = RoaringBitmap.bitmapOf(1, 2);
- final RoaringBitmap b2 = RoaringBitmap.bitmapOf(2, 3);
- final RoaringBitmap bResult = FastAggregation.and(Arrays.asList(b1, b2).iterator());
- assertFalse(bResult.contains(1));
- assertTrue(bResult.contains(2));
- assertFalse(bResult.contains(3));
-
- final ExtendedRoaringBitmap eb1 = new ExtendedRoaringBitmap();
- eb1.add(1);
- eb1.add(2);
- final ExtendedRoaringBitmap eb2 = new ExtendedRoaringBitmap();
- eb2.add(2);
- eb2.add(3);
- final RoaringBitmap ebResult = FastAggregation.and(Arrays.asList(b1, b2).iterator());
- assertFalse(ebResult.contains(1));
- assertTrue(ebResult.contains(2));
- assertFalse(ebResult.contains(3));
- }
-
- @Test
- public void testNaiveAndWithIterator() {
- final RoaringBitmap b1 = RoaringBitmap.bitmapOf(1, 2);
- final RoaringBitmap b2 = RoaringBitmap.bitmapOf(2, 3);
- final RoaringBitmap bResult = FastAggregation.naive_and(Arrays.asList(b1, b2).iterator());
- assertFalse(bResult.contains(1));
- assertTrue(bResult.contains(2));
- assertFalse(bResult.contains(3));
-
- final ExtendedRoaringBitmap eb1 = new ExtendedRoaringBitmap();
- eb1.add(1);
- eb1.add(2);
- final ExtendedRoaringBitmap eb2 = new ExtendedRoaringBitmap();
- eb2.add(2);
- eb2.add(3);
- final RoaringBitmap ebResult = FastAggregation.naive_and(Arrays.asList(b1, b2).iterator());
- assertFalse(ebResult.contains(1));
- assertTrue(ebResult.contains(2));
- assertFalse(ebResult.contains(3));
- }
-
- @Test
- public void testOrWithIterator() {
- final RoaringBitmap b1 = RoaringBitmap.bitmapOf(1, 2);
- final RoaringBitmap b2 = RoaringBitmap.bitmapOf(2, 3);
- final RoaringBitmap bItResult = FastAggregation.or(Arrays.asList(b1, b2).iterator());
- assertTrue(bItResult.contains(1));
- assertTrue(bItResult.contains(2));
- assertTrue(bItResult.contains(3));
-
- final ExtendedRoaringBitmap eb1 = new ExtendedRoaringBitmap();
- eb1.add(1);
- eb1.add(2);
- final ExtendedRoaringBitmap eb2 = new ExtendedRoaringBitmap();
- eb2.add(2);
- eb2.add(3);
- final RoaringBitmap ebItResult = FastAggregation.or(Arrays.asList(b1, b2).iterator());
- assertTrue(ebItResult.contains(1));
- assertTrue(ebItResult.contains(2));
- assertTrue(ebItResult.contains(3));
- }
-
- @Test
- public void testNaiveOrWithIterator() {
- final RoaringBitmap b1 = RoaringBitmap.bitmapOf(1, 2);
- final RoaringBitmap b2 = RoaringBitmap.bitmapOf(2, 3);
- final RoaringBitmap bResult = FastAggregation.naive_or(Arrays.asList(b1, b2).iterator());
- assertTrue(bResult.contains(1));
- assertTrue(bResult.contains(2));
- assertTrue(bResult.contains(3));
-
- final ExtendedRoaringBitmap eb1 = new ExtendedRoaringBitmap();
- eb1.add(1);
- eb1.add(2);
- final ExtendedRoaringBitmap eb2 = new ExtendedRoaringBitmap();
- eb2.add(2);
- eb2.add(3);
- final RoaringBitmap ebResult = FastAggregation.naive_or(Arrays.asList(b1, b2).iterator());
- assertTrue(ebResult.contains(1));
- assertTrue(ebResult.contains(2));
- assertTrue(ebResult.contains(3));
- }
-
- @Test
- public void testNaiveXorWithIterator() {
- final RoaringBitmap b1 = RoaringBitmap.bitmapOf(1, 2);
- final RoaringBitmap b2 = RoaringBitmap.bitmapOf(2, 3);
- final RoaringBitmap bResult = FastAggregation.naive_xor(Arrays.asList(b1, b2).iterator());
- assertTrue(bResult.contains(1));
- assertFalse(bResult.contains(2));
- assertTrue(bResult.contains(3));
-
- final ExtendedRoaringBitmap eb1 = new ExtendedRoaringBitmap();
- eb1.add(1);
- eb1.add(2);
- final ExtendedRoaringBitmap eb2 = new ExtendedRoaringBitmap();
- eb2.add(2);
- eb2.add(3);
- final RoaringBitmap ebResult = FastAggregation.naive_xor(Arrays.asList(b1, b2).iterator());
- assertTrue(ebResult.contains(1));
- assertFalse(ebResult.contains(2));
- assertTrue(ebResult.contains(3));
- }
-
- public static Stream bitmaps() {
- return Stream.of(
- Arguments.of(Arrays.asList(
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build(),
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build(),
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withBitmapAt(0).withRunAt(1).withArrayAt(2).build(),
- testCase().withBitmapAt(0).withRunAt(1).withArrayAt(2).build(),
- testCase().withBitmapAt(0).withRunAt(1).withArrayAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withRunAt(1).withBitmapAt(2).build(),
- testCase().withArrayAt(0).withRunAt(1).withBitmapAt(2).build(),
- testCase().withArrayAt(0).withRunAt(1).withBitmapAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build(),
- testCase().withBitmapAt(0).withArrayAt(3).withRunAt(4).build(),
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withBitmapAt(1).withRunAt(2).build(),
- testCase().withRunAt(0).withArrayAt(1).withBitmapAt(2).build(),
- testCase().withBitmapAt(0).withRunAt(1).withArrayAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build(),
- testCase().withBitmapAt(0).withArrayAt(2).withRunAt(4).build(),
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withArrayAt(1).withArrayAt(2).build(),
- testCase().withBitmapAt(0).withBitmapAt(2).withBitmapAt(4).build(),
- testCase().withRunAt(0).withRunAt(1).withRunAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withArrayAt(1).withArrayAt(2).build(),
- testCase().withBitmapAt(0).withBitmapAt(2).withArrayAt(4).build(),
- testCase().withRunAt(0).withRunAt(1).withArrayAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withArrayAt(1).withBitmapAt(2).build(),
- testCase().withBitmapAt(0).withBitmapAt(2).withBitmapAt(4).build(),
- testCase().withRunAt(0).withRunAt(1).withBitmapAt(2).build()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(20).build(),
- testCase().withBitmapAt(0).withBitmapAt(1).withBitmapAt(4).build(),
- testCase().withRunAt(0).withRunAt(1).withBitmapAt(3).build()
- ))
- );
- }
-
-
- @MethodSource("bitmaps")
- @ParameterizedTest(name = "testWorkShyAnd")
- public void testWorkShyAnd(List list) {
- RoaringBitmap[] bitmaps = list.toArray(new RoaringBitmap[0]);
- long[] buffer = new long[1024];
- RoaringBitmap result = FastAggregation.and(buffer, bitmaps);
- RoaringBitmap expected = FastAggregation.naive_and(bitmaps);
- assertEquals(expected, result);
- result = FastAggregation.and(bitmaps);
- assertEquals(expected, result);
- result = FastAggregation.workAndMemoryShyAnd(buffer, bitmaps);
- assertEquals(expected, result);
- }
-
- @MethodSource("bitmaps")
- @ParameterizedTest(name = "testAndCardinality")
- public void testAndCardinality(List list) {
- RoaringBitmap[] bitmaps = list.toArray(new RoaringBitmap[0]);
- for (int length = 0; length <= bitmaps.length; length++) {
- RoaringBitmap[] subset = Arrays.copyOf(bitmaps, length);
- RoaringBitmap and = FastAggregation.and(subset);
- int andCardinality = FastAggregation.andCardinality(subset);
- assertEquals(and.getCardinality(), andCardinality);
- }
- }
-
- @MethodSource("bitmaps")
- @ParameterizedTest(name = "testOrCardinality")
- public void testOrCardinality(List list) {
- RoaringBitmap[] bitmaps = list.toArray(new RoaringBitmap[0]);
- for (int length = 0; length <= bitmaps.length; length++) {
- RoaringBitmap[] subset = Arrays.copyOf(bitmaps, length);
- RoaringBitmap or = FastAggregation.or(subset);
- int orCardinality = FastAggregation.orCardinality(subset);
- assertEquals(or.getCardinality(), orCardinality);
- }
- }
-
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestForEach.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestForEach.java
deleted file mode 100644
index 3279d4fa1..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestForEach.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.roaringbitmap;
-
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class TestForEach {
-
- @Test
- public void testContinuous() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.add(100L, 10000L);
-
- final MutableInteger cardinality = new MutableInteger();
- bitmap.forEach(new IntConsumer() {
- int expected = 100;
-
- @Override
- public void accept(int value) {
- cardinality.value++;
- assertEquals(value, expected++);
- }
- });
- assertEquals(cardinality.value, bitmap.getCardinality());
- }
-
- @Test
- public void testDense() {
- RoaringBitmap bitmap = new RoaringBitmap();
- for (int k = 0; k < 100000; k += 3)
- bitmap.add(k);
-
- final MutableInteger cardinality = new MutableInteger();
- bitmap.forEach(new IntConsumer() {
- int expected = 0;
-
- @Override
- public void accept(int value) {
- cardinality.value++;
- assertEquals(value, expected);
- expected += 3;
- }
- });
- assertEquals(cardinality.value, bitmap.getCardinality());
- }
-
-
- @Test
- public void testSparse() {
- RoaringBitmap bitmap = new RoaringBitmap();
- for (int k = 0; k < 100000; k += 3000)
- bitmap.add(k);
-
- final MutableInteger cardinality = new MutableInteger();
- bitmap.forEach(new IntConsumer() {
- int expected = 0;
-
- @Override
- public void accept(int value) {
- cardinality.value++;
- assertEquals(value, expected);
- expected += 3000;
- }
- });
- assertEquals(cardinality.value, bitmap.getCardinality());
- }
-}
-
-
-class MutableInteger {
- public int value = 0;
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestImmutableRoaringBitmap.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestImmutableRoaringBitmap.java
deleted file mode 100644
index 323ce4764..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestImmutableRoaringBitmap.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.roaringbitmap;
-
-import org.junit.jupiter.api.Test;
-import org.roaringbitmap.buffer.ImmutableRoaringBitmap;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-
-public class TestImmutableRoaringBitmap {
-
- @Test
- public void xor() {
- ImmutableRoaringBitmap a = ImmutableRoaringBitmap.bitmapOf(1, 73647, 83469);
- ImmutableRoaringBitmap b = ImmutableRoaringBitmap.bitmapOf(1, 5, 10<<16);
- ImmutableRoaringBitmap xor = ImmutableRoaringBitmap.xor(a, b);
- ImmutableRoaringBitmap expected = ImmutableRoaringBitmap.bitmapOf(5, 73647, 83469, 10<<16);
- assertEquals(expected, xor);
- }
-
- @Test
- public void or() {
- ImmutableRoaringBitmap a = ImmutableRoaringBitmap.bitmapOf(1, 73647, 83469);
- ImmutableRoaringBitmap b = ImmutableRoaringBitmap.bitmapOf(1, 5, 10<<16);
- ImmutableRoaringBitmap expected = ImmutableRoaringBitmap.bitmapOf(1, 5, 73647, 83469, 10<<16);
- assertEquals(expected, ImmutableRoaringBitmap.or(a, b));
- assertEquals(expected, ImmutableRoaringBitmap.or(b, a));
- }
-
- @Test
- public void andNot() {
- ImmutableRoaringBitmap a = ImmutableRoaringBitmap.bitmapOf(1<<16, 2<<16);
- ImmutableRoaringBitmap b = ImmutableRoaringBitmap.bitmapOf(11, 12, 13, 2<<16);
- ImmutableRoaringBitmap andNot = ImmutableRoaringBitmap.andNot(a, b);
- ImmutableRoaringBitmap expected = ImmutableRoaringBitmap.bitmapOf(1<<16);
- assertEquals(expected, andNot);
- }
-
- @Test
- public void flipInvalidRange() {
- assertThrows(RuntimeException.class, () -> {
- ImmutableRoaringBitmap a = ImmutableRoaringBitmap.bitmapOf(1, 5, 7, 13);
- ImmutableRoaringBitmap.flip(a, 7L, 5L);
- });
- }
-
- @Test
- public void flipInvalidRange2() {
- assertThrows(IllegalArgumentException.class, () -> {
- ImmutableRoaringBitmap a = ImmutableRoaringBitmap.bitmapOf(1, 5, 7, 13);
- ImmutableRoaringBitmap.flip(a, 1L << 32, 1L << 33);
- });
- }
-
- @Test
- public void flipInvalidRange3() {
- assertThrows(IllegalArgumentException.class, () -> {
- ImmutableRoaringBitmap a = ImmutableRoaringBitmap.bitmapOf(1, 5, 7, 13);
- ImmutableRoaringBitmap.flip(a, 1L, 1L << 33);
- });
- }
-
-
-
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestRangeCardinality.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestRangeCardinality.java
deleted file mode 100644
index a09463834..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestRangeCardinality.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.roaringbitmap;
-
-
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class TestRangeCardinality {
-
- public static Stream data() {
- return Stream.of(
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 3, 8, 3),
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 2, 8, 3),
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 3, 7, 2),
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 0, 7, 3),
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 0, 6, 3),
- Arguments.of(new int[]{1, 3, 5, 7, 9, Short.MAX_VALUE}, 0, Short.MAX_VALUE + 1, 6),
- Arguments.of(new int[]{1, 10000, 25000, Short.MAX_VALUE - 1}, 0, Short.MAX_VALUE, 4),
- Arguments.of(new int[]{1 << 3, 1 << 8, 511,512,513, 1 << 12, 1 << 14}, 0, Short.MAX_VALUE, 7)
- );
- }
-
- @ParameterizedTest
- @MethodSource("data")
- public void testCardinalityInBitmapWordRange(int[] elements, int begin, int end, int expected) {
- BitmapContainer bc = new BitmapContainer();
- for (int e : elements) {
- bc.add((char) e);
- }
- assertEquals(expected, Util.cardinalityInBitmapRange(bc.bitmap, begin, end));
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestRoaringBitmap.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestRoaringBitmap.java
deleted file mode 100644
index 47c52db0f..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestRoaringBitmap.java
+++ /dev/null
@@ -1,5478 +0,0 @@
-/*
- * (c) the authors Licensed under the Apache License, Version 2.0.
- */
-package org.roaringbitmap;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.ContiguousSet;
-import com.google.common.collect.DiscreteDomain;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Range;
-import org.apache.commons.lang3.ArrayUtils;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-
-import java.io.*;
-import java.nio.ByteBuffer;
-import java.util.*;
-import java.util.stream.IntStream;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.roaringbitmap.RoaringBitmapWriter.writer;
-
-/**
- * Generic testing of the roaring bitmaps
- */
-@SuppressWarnings({"static-method"})
-@Execution(ExecutionMode.CONCURRENT)
-public class TestRoaringBitmap {
- @Test
- public void intersectBitmapWithRangeHighBits() {
- Container[] values = new Container[1];
- RoaringArray ra = new RoaringArray(new char[1], values, 1);
- long[] bitmap = new long[1024];
- Arrays.fill(bitmap, 0, 512, 0xAAAAAAAAAAAAAAAAL);
- values[0] = new BitmapContainer(bitmap, 512 * Long.bitCount(0xAAAAAAAAAAAAAAAAL));
- RoaringBitmap rr1 = new RoaringBitmap(ra);
- assertFalse(rr1.intersects((1 << 15), 0xFFFF));
- }
-
- @Test
- public void testRangeCardinality() {
- RoaringBitmap r = new RoaringBitmap();
- long Min = 0L;
- long Max = 1000000L;
- r.add(Min, Max);
- for (long s = Min; s <= Max; s += 100) {
- for (long e = s; e <= Max; e += 100) {
- assertEquals(e - s, r.rangeCardinality(s, e));
- }
- }
- }
-
- @Test
- public void testRangeCardinality2() {
- RoaringBitmap r = new RoaringBitmap();
- long Min = 1L << 16;
- long Max = 1L << 18;
- r.add(Min, Max);
- for (long s = Min; s <= Max; s += 1024) {
- for (long e = s; e <= Max; e += 1024) {
- assertEquals(e - s, r.rangeCardinality(s, e));
- }
- }
- }
-
- @Test
- public void testMultipleAdd() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.add(1);
- bitmap.add(1, 2, 3);
- bitmap.add(0xFFFFFFFF);
- bitmap.add(0xFFFFFFFEL, 0xFFFFFFFFL);
- assertEquals("{1,2,3,4294967294,4294967295}", bitmap.toString());
- }
-
- @Test
- public void testAddN() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.addN(new int[]{1, 2, 3, 4, 5}, 1, 3);
- assertEquals("{2,3,4}", bitmap.toString());
- }
-
- @Test
- public void testStringer() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.add(1);
- bitmap.add(2);
- bitmap.add(3);
- bitmap.add(0xFFFFFFFF);
- assertEquals("{1,2,3,4294967295}", bitmap.toString());
- }
-
- @Test
- public void report128() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.add(59798854);
- bitmap.add(91274955);
- bitmap.add(97569495);
- bitmap.add(101993170);
- PeekableIntIterator it = bitmap.getIntIterator();
- it.advanceIfNeeded(100620278);
- assertTrue(it.hasNext());
- assertEquals(101993170, it.next());
- assertFalse(it.hasNext());
- }
-
- @Test
- public void report128_fly() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.add(59798854);
- bitmap.add(91274955);
- bitmap.add(97569495);
- bitmap.add(101993170);
- IntIteratorFlyweight it = new IntIteratorFlyweight();
- it.wrap(bitmap);
- it.advanceIfNeeded(100620278);
- assertTrue(it.hasNext());
- assertEquals(101993170, it.next());
- assertFalse(it.hasNext());
- }
-
- @Test
- public void limitBug2() {
- class MyConsumer implements IntConsumer {
- public int count = 0;
-
- @Override
- public void accept(int value) {
- count++;
- }
- }
-
- RoaringBitmap r = new RoaringBitmap();
- int count = 0;
- for (int i = 0; i < 500; i++) {
- for (int j = 0; j < 9943; j++) {
- if (i % 2 == 0) r.add(count);
- count++;
- }
- }
- RoaringBitmap limited = r.limit(1000000);
- assertEquals(1000000, limited.getCardinality());
- MyConsumer c = new MyConsumer();
- limited.forEach(c);
- assertEquals(1000000, c.count);
- assertEquals(1000000, limited.toArray().length);
-
- }
-
- @Test
- public void limitTest() {
- RoaringBitmap r = new RoaringBitmap();
- r.add(0l, 10000000l);
- assertEquals(1, r.limit(1).getCardinality());
- assertEquals(10, r.limit(10).getCardinality());
- assertEquals(100, r.limit(100).getCardinality());
- assertEquals(1000, r.limit(1000).getCardinality());
- assertEquals(10000, r.limit(10000).getCardinality());
- assertEquals(100000, r.limit(100000).getCardinality());
- assertEquals(1000000, r.limit(1000000).getCardinality());
- }
-
- @Test
- public void pointerContainerTest() {
- RoaringBitmap rb = new RoaringBitmap();
- for (int i = 0; i < (1 << 16); i += 2) {
- rb.add(i);
- }
- for (int i = (1 << 16); i < 2 * ((1 << 16)); i += 512) {
- rb.add(i);
- }
- for (int i = 2 * (1 << 16); i < 3 * ((1 << 16)); i++) {
- rb.add(i);
- }
- rb.runOptimize();
- ContainerPointer cp = rb.getContainerPointer();
- ContainerPointer cpo = (ContainerPointer) cp.clone();
- assertNotEquals(cp.getContainer(), null);
- assertNotEquals(cpo.getContainer(), null);
-
- assertEquals(cp.compareTo(cpo), 0);
-
- assertEquals(cp.getCardinality(), (1 << 16) / 2);
- assertTrue(cp.isBitmapContainer());
- assertFalse(cp.isRunContainer());
-
- cp.advance();
- assertTrue(cp.compareTo(cpo) > 0);
- assertNotEquals(cp.getContainer(), null);
- assertEquals(cp.getCardinality(), (1 << 16) / 512);
- assertFalse(cp.isBitmapContainer());
- assertFalse(cp.isRunContainer());
-
- cp.advance();
- assertTrue(cp.compareTo(cpo) > 0);
- assertNotEquals(cp.getContainer(), null);
- assertEquals(cp.getCardinality(), (1 << 16));
- assertFalse(cp.isBitmapContainer());
- assertTrue(cp.isRunContainer());
-
- cpo.advance();
- assertTrue(cp.compareTo(cpo) > 0);
- cpo.advance();
- assertEquals(0, cp.compareTo(cpo));
-
- cp.advance();
-
- assertNull(cp.getContainer());
- }
-
-
- public static int[][] randomlists = {{127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
- 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
- 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
- 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195,
- 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
- 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
- 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252,
- 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
- 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290,
- 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309,
- 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328,
- 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347,
- 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366,
- 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385,
- 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404,
- 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423,
- 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442,
- 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461,
- 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480,
- 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499,
- 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518,
- 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537,
- 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556,
- 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575,
- 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594,
- 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613,
- 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632,
- 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651,
- 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670,
- 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689,
- 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708,
- 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727,
- 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746,
- 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765,
- 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784,
- 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803,
- 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822,
- 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841,
- 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860,
- 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879,
- 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898,
- 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917,
- 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936,
- 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955,
- 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974,
- 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993,
- 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009,
- 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024,
- 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
- 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054,
- 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069,
- 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084,
- 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099,
- 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114,
- 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129,
- 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144,
- 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159,
- 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174,
- 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189,
- 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204,
- 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219,
- 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234,
- 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249,
- 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264,
- 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279,
- 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294,
- 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309,
- 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324,
- 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339,
- 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354,
- 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369,
- 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384,
- 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399,
- 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414,
- 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429,
- 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444,
- 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459,
- 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474,
- 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489,
- 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504,
- 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519,
- 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534,
- 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549,
- 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564,
- 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579,
- 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594,
- 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609,
- 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624,
- 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639,
- 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654,
- 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669,
- 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684,
- 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699,
- 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714,
- 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729,
- 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744,
- 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759,
- 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774,
- 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789,
- 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804,
- 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819,
- 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834,
- 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849,
- 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864,
- 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879,
- 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894,
- 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909,
- 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924,
- 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939,
- 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954,
- 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969,
- 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984,
- 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014,
- 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029,
- 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044,
- 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059,
- 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074,
- 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089,
- 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104,
- 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119,
- 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134,
- 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149,
- 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164,
- 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179,
- 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194,
- 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209,
- 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224,
- 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239,
- 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254,
- 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269,
- 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284,
- 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299,
- 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314,
- 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329,
- 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344,
- 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359,
- 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374,
- 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389,
- 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404,
- 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419,
- 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434,
- 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449,
- 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464,
- 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479,
- 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494,
- 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509,
- 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524,
- 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539,
- 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554,
- 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569,
- 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584,
- 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599,
- 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614,
- 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629,
- 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644,
- 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659,
- 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674,
- 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689,
- 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704,
- 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719,
- 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734,
- 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749,
- 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764,
- 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779,
- 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794,
- 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809,
- 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824,
- 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839,
- 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854,
- 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869,
- 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884,
- 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899,
- 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914,
- 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929,
- 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944,
- 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959,
- 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974,
- 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989,
- 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004,
- 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019,
- 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034,
- 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049,
- 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064,
- 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079,
- 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094,
- 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109,
- 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124,
- 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139,
- 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154,
- 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169,
- 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184,
- 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199,
- 3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214,
- 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229,
- 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244,
- 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259,
- 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274,
- 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289,
- 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304,
- 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319,
- 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334,
- 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349,
- 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364,
- 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379,
- 3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394,
- 3395, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409,
- 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424,
- 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439,
- 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454,
- 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469,
- 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484,
- 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499,
- 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514,
- 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529,
- 3530, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544,
- 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559,
- 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574,
- 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589,
- 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604,
- 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619,
- 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634,
- 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649,
- 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664,
- 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679,
- 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694,
- 3695, 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709,
- 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724,
- 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739,
- 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, 3749, 3750, 3751, 3752, 3753, 3754,
- 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 3768, 3769,
- 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3784,
- 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799,
- 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 3811, 3812, 3813, 3814,
- 3815, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, 3829,
- 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844,
- 3845, 3846, 3847, 3848, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859,
- 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874,
- 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3888, 3889,
- 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, 3904,
- 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919,
- 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934,
- 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949,
- 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964,
- 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979,
- 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994,
- 3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009,
- 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 4024,
- 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039,
- 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, 4053, 4054,
- 4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069,
- 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, 4084,
- 4085, 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099,
- 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4114,
- 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129,
- 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144,
- 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159,
- 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174,
- 4175, 4176, 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, 4188, 4189,
- 4190, 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, 4203, 4204,
- 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219,
- 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234,
- 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249,
- 4250, 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264,
- 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279,
- 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294,
- 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309,
- 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324,
- 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339,
- 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354,
- 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369,
- 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384,
- 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399,
- 4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414,
- 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429,
- 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444,
- 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459,
- 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474,
- 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489,
- 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, 4498, 4499, 4500, 4501, 4502, 4503, 4504,
- 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4519,
- 4520, 4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534,
- 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4549,
- 4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564,
- 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 4579,
- 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, 4592, 4593, 4594,
- 4595, 4596, 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608, 4609,
- 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624,
- 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639,
- 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, 4654,
- 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, 4667, 4668, 4669,
- 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, 4684,
- 4685, 4686, 4687, 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699,
- 4700, 4701, 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714,
- 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, 4728, 4729,
- 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744,
- 4745, 4746, 4747, 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, 4759,
- 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774,
- 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787, 4788, 4789,
- 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, 4804,
- 4805, 4806, 4807, 4808, 4809, 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819,
- 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4830, 4831, 4832, 4833, 4834,
- 4835, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, 4847, 4848, 4849,
- 4850, 4851, 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, 4861, 4862, 4863, 4864,
- 4865, 4866, 4867, 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, 4876, 4877, 4878, 4879,
- 4880, 4881, 4882, 4883, 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891, 4892, 4893, 4894,
- 4895, 4896, 4897, 4898, 4899, 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909,
- 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924,
- 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939,
- 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954,
- 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969,
- 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984,
- 4985, 4986, 4987, 4988, 4989, 4990, 4991, 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999,
- 5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014,
- 5015, 5016, 5017, 5018, 5019, 5020, 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 5029,
- 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044,
- 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, 5059,
- 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074,
- 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 5089,
- 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 5101, 5102, 5103, 5104,
- 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 5113, 5114, 5115, 5116, 5117, 5118, 5119,
- 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5129, 5130, 5131, 5132, 5133, 5134,
- 5135, 5136, 5137, 5138, 5139, 5140, 5141, 5142, 5143, 5144, 5145, 5146, 5147, 5148, 5149,
- 5150, 5151, 5152, 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, 5161, 5162, 5163, 5164,
- 5165, 5166, 5167, 5168, 5169, 5170, 5171, 5172, 5173, 5174, 5175, 5176, 5177, 5178, 5179,
- 5180, 5181, 5182, 5183, 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191, 5192, 5193, 5194,
- 5195, 5196, 5197, 5198, 5199, 5200, 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, 5209,
- 5210, 5211, 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, 5220, 5221, 5222, 5223, 5224,
- 5225, 5226, 5227, 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5235, 5236, 5237, 5238, 5239,
- 5240, 5241, 5242, 5243, 5244, 5245, 5246, 5247, 5248, 5249, 5250, 5251, 5252, 5253, 5254,
- 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, 5263, 5264, 5265, 5266, 5267, 5268, 5269,
- 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, 5280, 5281, 5282, 5283, 5284,
- 5285, 5286, 5287, 5288, 5289, 5290, 5291, 5292, 5293, 5294, 5295, 5296, 5297, 5298, 5299,
- 5300, 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5312, 5313, 5314,
- 5315, 5316, 5317, 5318, 5319, 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, 5328, 5329,
- 5330, 5331, 5332, 5333, 5334, 5335, 5336, 5337, 5338, 5339, 5340, 5341, 5342, 5343, 5344,
- 5345, 5346, 5347, 5348, 5349, 5350, 5351, 5352, 5353, 5354, 5355, 5356, 5357, 5358, 5359,
- 5360, 5361, 5362, 5363, 5364, 5365, 5366, 5367, 5368, 5369, 5370, 5371, 5372, 5373, 5374,
- 5375, 5376, 5377, 5378, 5379, 5380, 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388, 5389,
- 5390, 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399, 5400, 5401, 5402, 5403, 5404,
- 5405, 5406, 5407, 5408, 5409, 5410, 5411, 5412, 5413, 5414, 5415, 5416, 5417, 5418, 5419,
- 5420, 5421, 5422, 5423, 5424, 5425, 5426, 5427, 5428, 5429, 5430, 5431, 5432, 5433, 5434,
- 5435, 5436, 5437, 5438, 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449,
- 5450, 5451, 5452, 5453, 5454, 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, 5463, 5464,
- 5465, 5466, 5467, 5468, 5469, 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477, 5478, 5479,
- 5480, 5481, 5482, 5483, 5484, 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, 5493, 5494,
- 5495, 5496, 5497, 5498, 5499, 5500, 5501, 5502, 5503, 5504, 5505, 5506, 5507, 5508, 5509,
- 5510, 5511, 5512, 5513, 5514, 5515, 5516, 5517, 5518, 5519, 5520, 5521, 5522, 5523, 5524,
- 5525, 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, 5537, 5538, 5539,
- 5540, 5541, 5542, 5543, 5544, 5545, 5546, 5547, 5548, 5549, 5550, 5551, 5552, 5553, 5554,
- 5555, 5556, 5557, 5558, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 5566, 5567, 5568, 5569,
- 5570, 5571, 5572, 5573, 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, 5582, 5583, 5584,
- 5585, 5586, 5587, 5588, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 5599,
- 5600, 5601, 5602, 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610, 5611, 5612, 5613, 5614,
- 5615, 5616, 5617, 5618, 5619, 5620, 5621, 5622, 5623, 5624, 5625, 5626, 5627, 5628, 5629,
- 5630, 5631, 5632, 5633, 5634, 5635, 5636, 5637, 5638, 5639, 5640, 5641, 5642, 5643, 5644,
- 5645, 5646, 5647, 5648, 5649, 5650, 5651, 5652, 5653, 5654, 5655, 5656, 5657, 5658, 5659,
- 5660, 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5668, 5669, 5670, 5671, 5672, 5673, 5674,
- 5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, 5683, 5684, 5685, 5686, 5687, 5688, 5689,
- 5690, 5691, 5692, 5693, 5694, 5695, 5696, 5697, 5698, 5699, 5700, 5701, 5702, 5703, 5704,
- 5705, 5706, 5707, 5708, 5709, 5710, 5711, 5712, 5713, 5714, 5715, 5716, 5717, 5718, 5719,
- 5720, 5721, 5722, 5723, 5724, 5725, 5726, 5727, 5728, 5729, 5730, 5731, 5732, 5733, 5734,
- 5735, 5736, 5737, 5738, 5739, 5740, 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, 5749,
- 5750, 5751, 5752, 5753, 5754, 5755, 5756, 5757, 5758, 5759, 5760, 5761, 5762, 5763, 5764,
- 5765, 5766, 5767, 5768, 5769, 5770, 5771, 5772, 5773, 5774, 5775, 5776, 5777, 5778, 5779,
- 5780, 5781, 5782, 5783, 5784, 5785, 5786, 5787, 5788, 5789, 5790, 5791, 5792, 5793, 5794,
- 5795, 5796, 5797, 5798, 5799, 5800, 5801, 5802, 5803, 5804, 5805, 5806, 5807, 5808, 5809,
- 5810, 5811, 5812, 5813, 5814, 5815, 5816, 5817, 5818, 5819, 5820, 5821, 5822, 5823, 5824,
- 5825, 5826, 5827, 5828, 5829, 5830, 5831, 5832, 5833, 5834, 5835, 5836, 5837, 5838, 5839,
- 5840, 5841, 5842, 5843, 5844, 5845, 5846, 5847, 5848, 5849, 5850, 5851, 5852, 5853, 5854,
- 5855, 5856, 5857, 5858, 5859, 5860, 5861, 5862, 5863, 5864, 5865, 5866, 5867, 5868, 5869,
- 5870, 5871, 5872, 5873, 5874, 5875, 5876, 5877, 5878, 5879, 5880, 5881, 5882, 5883, 5884,
- 5885, 5886, 5887, 5888, 5889, 5890, 5891, 5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899,
- 5900, 5901, 5902, 5903, 5904, 5905, 5906, 5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914,
- 5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 5927, 5928, 5929,
- 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944,
- 5945, 5946, 5947, 5948, 5949, 5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957, 5958, 5959,
- 5960, 5961, 5962, 5963, 5964, 5965, 5966, 5967, 5968, 5969, 5970, 5971, 5972, 5973, 5974,
- 5975, 5976, 5977, 5978, 5979, 5980, 5981, 5982, 5983, 5984, 5985, 5986, 5987, 5988, 5989,
- 5990, 5991, 5992, 5993, 5994, 5995, 5996, 5997, 5998, 5999, 6000, 6001, 6002, 6003, 6004,
- 6005, 6006, 6007, 6008, 6009, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6019,
- 6020, 6021, 6022, 6023, 6024, 6025, 6026, 6027, 6028, 6029, 6030, 6031, 6032, 6033, 6034,
- 6035, 6036, 6037, 6038, 6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049,
- 6050, 6051, 6052, 6053, 6054, 6055, 6056, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 6064,
- 6065, 6066, 6067, 6068, 6069, 6070, 6071, 6072, 6073, 6074, 6075, 6076, 6077, 6078, 6079,
- 6080, 6081, 6082, 6083, 6084, 6085, 6086, 6087, 6088, 6089, 6090, 6091, 6092, 6093, 6094,
- 6095, 6096, 6097, 6098, 6099, 6100, 6101, 6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109,
- 6110, 6111, 6112, 6113, 6114, 6115, 6116, 6117, 6118, 6119, 6120, 6121, 6122, 6123, 6124,
- 6125, 6126, 6127, 6128, 6129, 6130, 6131, 6132, 6133, 6134, 6135, 6136, 6137, 6138, 6139,
- 6140, 6141, 6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149, 6150, 6151, 6152, 6153, 6154,
- 6155, 6156, 6157, 6158, 6159, 6160, 6161, 6162, 6163, 6164, 6165, 6166, 6167, 6168, 6169,
- 6170, 6171, 6172, 6173, 6174, 6175, 6176, 6177, 6178, 6179, 6180, 6181, 6182, 6183, 6184,
- 6185, 6186, 6187, 6188, 6189, 6190, 6191, 6192, 6193, 6194, 6195, 6196, 6197, 6198, 6199,
- 6200, 6201, 6202, 6203, 6204, 6205, 6206, 6207, 6208, 6209, 6210, 6211, 6212, 6213, 6214,
- 6215, 6216, 6217, 6218, 6219, 6220, 6221, 6222, 6223, 6224, 6225, 6226, 6227, 6228, 6229,
- 6230, 6231, 6232, 6233, 6234, 6235, 6236, 6237, 6238, 6239, 6240, 6241, 6242, 6243, 6244,
- 6245, 6246, 6247, 6248, 6249, 6250, 6251, 6252, 6253, 6254, 6255, 6256, 6257, 6258, 6259,
- 6260, 6261, 6262, 6263, 6264, 6265, 6266, 6267, 6268, 6269, 6270, 6271, 6272, 6273, 6274,
- 6275, 6276, 6277, 6278, 6279, 6280, 6281, 6282, 6283, 6284, 6285, 6286, 6287, 6288, 6289,
- 6290, 6291, 6292, 6293, 6294, 6295, 6296, 6297, 6298, 6299, 6300, 6301, 6302, 6303, 6304,
- 6305, 6306, 6307, 6308, 6309, 6310, 6311, 6312, 6313, 6314, 6315, 6316, 6317, 6318, 6319,
- 6320, 6321, 6322, 6323, 6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 6332, 6333, 6334,
- 6335, 6336, 6337, 6338, 6339, 6340, 6341, 6342, 6343, 6344, 6345, 6346, 6347, 6348, 6349,
- 6350, 6351, 6352, 6353, 6354, 6355, 6356, 6357, 6358, 6359, 6360, 6361, 6362, 6363, 6364,
- 6365, 6366, 6367, 6368, 6369, 6370, 6371, 6372, 6373, 6374, 6375, 6376, 6377, 6378, 6379,
- 6380, 6381, 6382, 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, 6391, 6392, 6393, 6394,
- 6395, 6396, 6397, 6398, 6399, 6400, 6401, 6402, 6403, 6404, 6405, 6406, 6407, 6408, 6409,
- 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, 6419, 6420, 6421, 6422, 6423, 6424,
- 6425, 6426, 6427, 6428, 6429, 6430, 6431, 6432, 6433, 6434, 6435, 6436, 6437, 6438, 6439,
- 6440, 6441, 6442, 6443, 6444, 6445, 6446, 6447, 6448, 6449, 6450, 6451, 6452, 6453, 6454,
- 6455, 6456, 6457, 6458, 6459, 6460, 6461, 6462, 6463, 6464, 6465, 6466, 6467, 6468, 6469,
- 6470, 6471, 6472, 6473, 6474, 6475, 6476, 6477, 6478, 6479, 6480, 6481, 6482, 6483, 6484,
- 6485, 6486, 6487, 6488, 6489, 6490, 6491, 6492, 6493, 6494, 6495, 6496, 6497, 6498, 6499,
- 6500, 6501, 6502, 6503, 6504, 6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 6513, 6514,
- 6515, 6516, 6517, 6518, 6519, 6520, 6521, 6522, 6523, 6524, 6525, 6526, 6527, 6528, 6529,
- 6530, 6531, 6532, 6533, 6534, 6535, 6536, 6537, 6538, 6539, 6540, 6541, 6542, 6543, 6544,
- 6545, 6546, 6547, 6548, 6549, 6550, 6551, 6552, 6553, 6554, 6555, 6556, 6557, 6558, 6559,
- 6560, 6561, 6562, 6563, 6564, 6565, 6566, 6567, 6568, 6569, 6570, 6571, 6572, 6573, 6574,
- 6575, 6576, 6577, 6578, 6579, 6580, 6581, 6582, 6583, 6584, 6585, 6586, 6587, 6588, 6589,
- 6590, 6591, 6592, 6593, 6594, 6595, 6596, 6597, 6598, 6599, 6600, 6601, 6602, 6603, 6604,
- 6605, 6606, 6607, 6608, 6609, 6610, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, 6619,
- 6620, 6621, 6622, 6623, 6624, 6625, 6626, 6627, 6628, 6629, 6630, 6631, 6632, 6633, 6634,
- 6635, 6636, 6637, 6638, 6639, 6640, 6641, 6642, 6643, 6644, 6645, 6646, 6647, 6648, 6649,
- 6650, 6651, 6652, 6653, 6654, 6655, 6656, 6657, 6658, 6659, 6660, 6661, 6662, 6663, 6664,
- 6665, 6666, 6667, 6668, 6669, 6670, 6671, 6672, 6673, 6674, 6675, 6676, 6677, 6678, 6679,
- 6680, 6681, 6682, 6683, 6684, 6685, 6686, 6687, 6688, 6689, 6690, 6691, 6692, 6693, 6694,
- 6695, 6696, 6697, 6698, 6699, 6700, 6701, 6702, 6703, 6704, 6705, 6706, 6707, 6708, 6709,
- 6710, 6711, 6712, 6713, 6714, 6715, 6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723, 6724,
- 6725, 6726, 6727, 6728, 6729, 6730, 6731, 6732, 6733, 6734, 6735, 6736, 6737, 6738, 6739,
- 6740, 6741, 6742, 6743, 6744, 6745, 6746, 6747, 6748, 6749, 6750, 6751, 6752, 6753, 6754,
- 6755, 6756, 6757, 6758, 6759, 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, 6768, 6769,
- 6770, 6771, 6772, 6773, 6774, 6775, 6776, 6777, 6778, 6779, 6780, 6781, 6782, 6783, 6784,
- 6785, 6786, 6787, 6788, 6789, 6790, 6791, 6792, 6793, 6794, 6795, 6796, 6797, 6798, 6799,
- 6800, 6801, 6802, 6803, 6804, 6805, 6806, 6807, 6808, 6809, 6810, 6811, 6812, 6813, 6814,
- 6815, 6816, 6817, 6818, 6819, 6820, 6821, 6822, 6823, 6824, 6825, 6826, 6827, 6828, 6829,
- 6830, 6831, 6832, 6833, 6834, 6835, 6836, 6837, 6838, 6839, 6840, 6841, 6842, 6843, 6844,
- 6845, 6846, 6847, 6848, 6849, 6850, 6851, 6852, 6853, 6854, 6855, 6856, 6857, 6858, 6859,
- 6860, 6861, 6862, 6863, 6864, 6865, 6866, 6867, 6868, 6869, 6870, 6871, 6872, 6873, 6874,
- 6875, 6876, 6877, 6878, 6879, 6880, 6881, 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889,
- 6890, 6891, 6892, 6893, 6894, 6895, 6896, 6897, 6898, 6899, 6900, 6901, 6902, 6903, 6904,
- 6905, 6906, 6907, 6908, 6909, 6910, 6911, 6912, 6913, 6914, 6915, 6916, 6917, 6918, 6919,
- 6920, 6921, 6922, 6923, 6924, 6925, 6926, 6927, 6928, 6929, 6930, 6931, 6932, 6933, 6934,
- 6935, 6936, 6937, 6938, 6939, 6940, 6941, 6942, 6943, 6944, 6945, 6946, 6947, 6948, 6949,
- 6950, 6951, 6952, 6953, 6954, 6955, 6956, 6957, 6958, 6959, 6960, 6961, 6962, 6963, 6964,
- 6965, 6966, 6967, 6968, 6969, 6970, 6971, 6972, 6973, 6974, 6975, 6976, 6977, 6978, 6979,
- 6980, 6981, 6982, 6983, 6984, 6985, 6986, 6987, 6988, 6989, 6990, 6991, 6992, 6993, 6994,
- 6995, 6996, 6997, 6998, 6999, 7000, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009,
- 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020, 7021, 7022, 7023, 7024,
- 7025, 7026, 7027, 7028, 7029, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039,
- 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7047, 7048, 7049, 7050, 7051, 7052, 7053, 7054,
- 7055, 7056, 7057, 7058, 7059, 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, 7068, 7069,
- 7070, 7071, 7072, 7073, 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, 7084,
- 7085, 7086, 7087, 7088, 7089, 7090, 7091, 7092, 7093, 7094, 7095, 7096, 7097, 7098, 7099,
- 7100, 7101, 7102, 7103, 7104, 7105, 7106, 7107, 7108, 7109, 7110, 7111, 7112, 7113, 7114,
- 7115, 7116, 7117, 7118, 7119, 7120, 7121, 7122, 7123, 7124, 7125, 7126, 7127, 7128, 7129,
- 7130, 7131, 7132, 7133, 7134, 7135, 7136, 7137, 7138, 7139, 7140, 7141, 7142, 7143, 7144,
- 7145, 7146, 7147, 7148, 7149, 7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7158, 7159,
- 7160, 7161, 7162, 7163, 7164, 7165, 7166, 7167, 7168, 7169, 7170, 7171, 7172, 7173, 7174,
- 7175, 7176, 7177, 7178, 7179, 7180, 7181, 7182, 7183, 7184, 7185, 7186, 7187, 7188, 7189,
- 7190, 7191, 7192, 7193, 7194, 7195, 7196, 7197, 7198, 7199, 7200, 7201, 7202, 7203, 7204,
- 7205, 7206, 7207, 7208, 7209, 7210, 7211, 7212, 7213, 7214, 7215, 7216, 7217, 7218, 7219,
- 7220, 7221, 7222, 7223, 7224, 7225, 7226, 7227, 7228, 7229, 7230, 7231, 7232, 7233, 7234,
- 7235, 7236, 7237, 7238, 7239, 7240, 7241, 7242, 7243, 7244, 7245, 7246, 7247, 7248, 7249,
- 7250, 7251, 7252, 7253, 7254, 7255, 7256, 7257, 7258, 7259, 7260, 7261, 7262, 7263, 7264,
- 7265, 7266, 7267, 7268, 7269, 7270, 7271, 7272, 7273, 7274, 7275, 7276, 7277, 7278, 7279,
- 7280, 7281, 7282, 7283, 7284, 7285, 7286, 7287, 7288, 7289, 7290, 7291, 7292, 7293, 7294,
- 7295, 7296, 7297, 7298, 7299, 7300, 7301, 7302, 7303, 7304, 7305, 7306, 7307, 7308, 7309,
- 7310, 7311, 7312, 7313, 7314, 7315, 7316, 7317, 7318, 7319, 7320, 7321, 7322, 7323, 7324,
- 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, 7333, 7334, 7335, 7336, 7337, 7338, 7339,
- 7340, 7341, 7342, 7343, 7344, 7345, 7346, 7347, 7348, 7349, 7350, 7351, 7352, 7353, 7354,
- 7355, 7356, 7357, 7358, 7359, 7360, 7361, 7362, 7363, 7364, 7365, 7366, 7367, 7368, 7369,
- 7370, 7371, 7372, 7373, 7374, 7375, 7376, 7377, 7378, 7379, 7380, 7381, 7382, 7383, 7384,
- 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7393, 7394, 7395, 7396, 7397, 7398, 7399,
- 7400, 7401, 7402, 7403, 7404, 7405, 7406, 7407, 7408, 7409, 7410, 7411, 7412, 7413, 7414,
- 7415, 7416, 7417, 7418, 7419, 7420, 7421, 7422, 7423, 7424, 7425, 7426, 7427, 7428, 7429,
- 7430, 7431, 7432, 7433, 7434, 7435, 7436, 7437, 7438, 7439, 7440, 7441, 7442, 7443, 7444,
- 7445, 7446, 7447, 7448, 7449, 7450, 7451, 7452, 7453, 7454, 7455, 7456, 7457, 7458, 7459,
- 7460, 7461, 7462, 7463, 7464, 7465, 7466, 7467, 7468, 7469, 7470, 7471, 7472, 7473, 7474,
- 7475, 7476, 7477, 7478, 7479, 7480, 7481, 7482, 7483, 7484, 7485, 7486, 7487, 7488, 7489,
- 7490, 7491, 7492, 7493, 7494, 7495, 7496, 7497, 7498, 7499, 7500, 7501, 7502, 7503, 7504,
- 7505, 7506, 7507, 7508, 7509, 7510, 7511, 7512, 7513, 7514, 7515, 7516, 7517, 7518, 7519,
- 7520, 7521, 7522, 7523, 7524, 7525, 7526, 7527, 7528, 7529, 7530, 7531, 7532, 7533, 7534,
- 7535, 7536, 7537, 7538, 7539, 7540, 7541, 7542, 7543, 7544, 7545, 7546, 7547, 7548, 7549,
- 7550, 7551, 7552, 7553, 7554, 7555, 7556, 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564,
- 7565, 7566, 7567, 7568, 7569, 7570, 7571, 7572, 7573, 7574, 7575, 7576, 7577, 7578, 7579,
- 7580, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7592, 7593, 7594,
- 7595, 7596, 7597, 7598, 7599, 7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, 7608, 7609,
- 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7617, 7618, 7619, 7620, 7621, 7622, 7623, 7624,
- 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639,
- 7640, 7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, 7654,
- 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669,
- 7670, 7671, 7672, 7673, 7674, 7675, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7683, 7684,
- 7685, 7686, 7687, 7688, 7689, 7690, 7691, 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699,
- 7700, 7701, 7702, 7703, 7704, 7705, 7706, 7707, 7708, 7709, 7710, 7711, 7712, 7713, 7714,
- 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, 7726, 7727, 7728, 7729,
- 7730, 7731, 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7743, 7744,
- 7745, 7746, 7747, 7748, 7749, 7750, 7751, 7752, 7753, 7754, 7755, 7756, 7757, 7758, 7759,
- 7760, 7761, 7762, 7763, 7764, 7765, 7766, 7767, 7768, 7769, 7770, 7771, 7772, 7773, 7774,
- 7775, 7776, 7777, 7778, 7779, 7780, 7781, 7782, 7783, 7784, 7785, 7786, 7787, 7788, 7789,
- 7790, 7791, 7792, 7793, 7794, 7795, 7796, 7797, 7798, 7799, 7800, 7801, 7802, 7803, 7804,
- 7805, 7806, 7807, 7808, 7809, 7810, 7811, 7812, 7813, 7814, 7815, 7816, 7817, 7818, 7819,
- 7820, 7821, 7822, 7823, 7824, 7825, 7826, 7827, 7828, 7829, 7830, 7831, 7832, 7833, 7834,
- 7835, 7836, 7837, 7838, 7839, 7840, 7841, 7842, 7843, 7844, 7845, 7846, 7847, 7848, 7849,
- 7850, 7851, 7852, 7853, 7854, 7855, 7856, 7857, 7858, 7859, 7860, 7861, 7862, 7863, 7864,
- 7865, 7866, 7867, 7868, 7869, 7870, 7871, 7872, 7873, 7874, 7875, 7876, 7877, 7878, 7879,
- 7880, 7881, 7882, 7883, 7884, 7885, 7886, 7887, 7888, 7889, 7890, 7891, 7892, 7893, 7894,
- 7895, 7896, 7897, 7898, 7899, 7900, 7901, 7902, 7903, 7904, 7905, 7906, 7907, 7908, 7909,
- 7910, 7911, 7912, 7913, 7914, 7915, 7916, 7917, 7918, 7919, 7920, 7921, 7922, 7923, 7924,
- 7925, 7926, 7927, 7928, 7929, 7930, 7931, 7932, 7933, 7934, 7935, 7936, 7937, 7938, 7939,
- 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7948, 7949, 7950, 7951, 7952, 7953, 7954,
- 7955, 7956, 7957, 7958, 7959, 7960, 7961, 7962, 7963, 7964, 7965, 7966, 7967, 7968, 7969,
- 7970, 7971, 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7979, 7980, 7981, 7982, 7983, 7984,
- 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7993, 7994, 7995, 7996, 7997, 7998, 7999},
- {95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
- 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126}};
-
- public static boolean equals(BitSet bs, RoaringBitmap rr) {
- final int[] a = new int[bs.cardinality()];
- int pos = 0;
- for (int x = bs.nextSetBit(0); x >= 0; x = bs.nextSetBit(x + 1)) {
- a[pos++] = x;
- }
- return Arrays.equals(rr.toArray(), a);
- }
-
- private static Iterator toIterator(final T[] x) {
- return new Iterator() {
- int pos = 0;
-
- @Override
- public boolean hasNext() {
- return pos < x.length;
- }
-
- @Override
- public T next() {
- return x[pos++];
- }
-
- @Override
- public void remove() {
- }
- };
-
- }
-
-
- @Test
- public void andBigIntsTest() {
- RoaringBitmap rb = new RoaringBitmap();
- RoaringBitmap rb2 = new RoaringBitmap();
- HashSet hs = new HashSet();
-
- for (int i = 1 << 31; i < (1 << 31) + 65536; i += 2) {
- rb.add(i);
- }
- for (int i = (1 << 31) + 3 * 65536; i < (1 << 31) + 4 * 65536; i += 3) {
- rb.add(i);
- }
- for (int i = (1 << 31) + 5 * 65536; i < (1 << 31) + 7 * 65536; i += 3) {
- rb.add(i);
- }
- for (int i = (1 << 31) + 6 * 65536; i < (1 << 31) + 7 * 65536; i += 4) {
- rb.add(i);
- }
- for (int i = (1 << 31) + 9 * 65536; i < (1 << 31) + 10 * 65536; i += 5) {
- rb.add(i);
- }
-
- for (int i = (1 << 31) + 3 * 65536; i < (1 << 31) + 4 * 65536; i += 3) {
- hs.add(i);
- rb2.add(i);
- }
- for (int i = (1 << 31) + 6 * 65536; i < (1 << 31) + 7 * 65536; i += 4) {
- hs.add(i);
- rb2.add(i);
- }
- for (int i = (1 << 31) + 9 * 65536; i < (1 << 31) + 10 * 65536; i += 5) {
- hs.add(i);
- rb2.add(i);
- }
- for (int i = (1 << 31) + 13 * 65536; i < (1 << 31) + 14 * 65536; i += 7) {
- rb2.add(i);
- }
-
- RoaringBitmap rband = RoaringBitmap.and(rb, rb2);
-
- Object[] correct = hs.toArray();
- Arrays.sort(correct);
- Integer[] resand = ArrayUtils.toObject(rband.toArray());
- assertArrayEquals(correct, resand);
- }
-
- @Test
- public void andcounttest() {
- // This is based on andtest
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rr.add(k);
- }
- rr.add(100000);
- rr.add(110000);
- final RoaringBitmap rr2 = new RoaringBitmap();
- rr2.add(13);
- final RoaringBitmap rrand = RoaringBitmap.and(rr, rr2);
- assertEquals(rrand.getCardinality(), RoaringBitmap.andCardinality(rr, rr2));
- assertEquals(rrand.getCardinality(), RoaringBitmap.andCardinality(rr2, rr));
- rr.and(rr2);
- assertEquals(rrand.getCardinality(), RoaringBitmap.andCardinality(rr2, rr));
- }
-
- @Test
- public void andCounttest3() {
- // This is based on andtest3
- final int[] arrayand = new int[11256];
- int pos = 0;
- final RoaringBitmap rr = new RoaringBitmap();
- 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 + 1000; ++k) {
- rr.add(k);
- }
- for (int k = 3 * 65536 + 1000; k < 3 * 65536 + 7000; ++k) {
- rr.add(k);
- }
- for (int k = 3 * 65536 + 7000; k < 3 * 65536 + 9000; ++k) {
- rr.add(k);
- }
- for (int k = 4 * 65536; k < 4 * 65536 + 7000; ++k) {
- rr.add(k);
- }
- for (int k = 6 * 65536; k < 6 * 65536 + 10000; ++k) {
- rr.add(k);
- }
- for (int k = 8 * 65536; k < 8 * 65536 + 1000; ++k) {
- rr.add(k);
- }
- for (int k = 9 * 65536; k < 9 * 65536 + 30000; ++k) {
- rr.add(k);
- }
- final RoaringBitmap rr2 = new RoaringBitmap();
- for (int k = 4000; k < 4256; ++k) {
- rr2.add(k);
- arrayand[pos++] = k;
- }
- for (int k = 65536; k < 65536 + 4000; ++k) {
- rr2.add(k);
- arrayand[pos++] = k;
- }
- for (int k = 3 * 65536 + 1000; k < 3 * 65536 + 7000; ++k) {
- rr2.add(k);
- arrayand[pos++] = k;
- }
- for (int k = 6 * 65536; k < 6 * 65536 + 1000; ++k) {
- rr2.add(k);
- arrayand[pos++] = k;
- }
- for (int k = 7 * 65536; k < 7 * 65536 + 1000; ++k) {
- rr2.add(k);
- }
- for (int k = 10 * 65536; k < 10 * 65536 + 5000; ++k) {
- rr2.add(k);
- }
-
- final RoaringBitmap rrand = RoaringBitmap.and(rr, rr2);
- final int rrandCount = RoaringBitmap.andCardinality(rr, rr2);
-
- assertEquals(rrand.getCardinality(), rrandCount);
- }
-
- @Test
- public void andNot() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- rb.add(1);
- rb.add(1 << 16);
- rb2.add(1 << 16);
- rb.add(2 << 16);
- rb.add(3 << 16);
- rb2.add(3 << 16);
- rb.andNot(rb2);
-
- final IntIterator i = rb.getIntIterator();
- assertTrue(i.hasNext());
- assertEquals(1, i.next());
- assertTrue(i.hasNext());
- assertEquals(2 << 16, i.next());
- assertFalse(i.hasNext());
- }
-
- @Test
- public void andNotBigIntsTest() {
- RoaringBitmap rb = new RoaringBitmap();
- RoaringBitmap rb2 = new RoaringBitmap();
- HashSet hs = new HashSet();
-
- for (int i = 1 << 31; i < (1 << 31) + 65536; i += 2) {
- rb.add(i);
- hs.add(i);
- }
- for (int i = (1 << 31) + 3 * 65536; i < (1 << 31) + 4 * 65536; i += 3) {
- rb.add(i);
- }
- for (int i = (1 << 31) + 5 * 65536; i < (1 << 31) + 6 * 65536; i += 3) {
- hs.add(i);
- rb.add(i);
- }
- for (int i = (1 << 31) + 9 * 65536; i < (1 << 31) + 10 * 65536; i += 5) {
- rb.add(i);
- }
-
- for (int i = (1 << 31) + 3 * 65536; i < (1 << 31) + 4 * 65536; i += 3) {
- rb2.add(i);
- }
- for (int i = (1 << 31) + 6 * 65536; i < (1 << 31) + 7 * 65536; i += 4) {
- rb2.add(i);
- }
- for (int i = (1 << 31) + 9 * 65536; i < (1 << 31) + 10 * 65536; i += 5) {
- rb2.add(i);
- }
- for (int i = (1 << 31) + 13 * 65536; i < (1 << 31) + 14 * 65536; i += 7) {
- rb2.add(i);
- }
-
- RoaringBitmap rbandnot = RoaringBitmap.andNot(rb, rb2);
-
- Object[] correct = hs.toArray();
- Arrays.sort(correct);
- Integer[] resandNot = ArrayUtils.toObject(rbandnot.toArray());
- assertArrayEquals(correct, resandNot);
- }
-
- @Test
- public void ANDNOTtest() {
- final RoaringBitmap rr = new RoaringBitmap();
- 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 RoaringBitmap rr2 = new RoaringBitmap();
- 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 RoaringBitmap correct = RoaringBitmap.andNot(rr, rr2);
- rr.andNot(rr2);
- assertEquals(correct, rr);
- }
-
- @Test
- public void andnottest4() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- for (int i = 0; i < 200000; i += 4) {
- rb2.add(i);
- }
- for (int i = 200000; i < 400000; i += 14) {
- rb2.add(i);
- }
- rb2.getCardinality();
-
- // check or against an empty bitmap
- final RoaringBitmap andNotresult = RoaringBitmap.andNot(rb, rb2);
- final RoaringBitmap off = RoaringBitmap.andNot(rb2, rb);
-
- assertEquals(rb, andNotresult);
- assertEquals(rb2, off);
- rb2.andNot(rb);
- assertEquals(rb2, off);
- }
-
- @Test
- public void andtest() {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rr.add(k);
- }
- rr.add(100000);
- rr.add(110000);
- final RoaringBitmap rr2 = new RoaringBitmap();
- rr2.add(13);
- final RoaringBitmap rrand = RoaringBitmap.and(rr, rr2);
- int[] array = rrand.toArray();
-
- assertEquals(array.length, 1);
- assertEquals(array[0], 13);
- rr.and(rr2);
- array = rr.toArray();
- assertEquals(array.length, 1);
- assertEquals(array[0], 13);
-
- }
-
- @Test
- public void ANDtest() {
- final RoaringBitmap rr = new RoaringBitmap();
- 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 RoaringBitmap rr2 = new RoaringBitmap();
- 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 RoaringBitmap correct = RoaringBitmap.and(rr, rr2);
- rr.and(rr2);
- assertEquals(correct, rr);
- }
-
- @Test
- public void andtest2() {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rr.add(k);
- }
- rr.add(100000);
- rr.add(110000);
- final RoaringBitmap rr2 = new RoaringBitmap();
- rr2.add(13);
- final RoaringBitmap rrand = RoaringBitmap.and(rr, rr2);
-
- final int[] array = rrand.toArray();
- assertEquals(array.length, 1);
- assertEquals(array[0], 13);
- }
-
- @Test
- public void andtest3() {
- final int[] arrayand = new int[11256];
- int pos = 0;
- final RoaringBitmap rr = new RoaringBitmap();
- 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 + 1000; ++k) {
- rr.add(k);
- }
- for (int k = 3 * 65536 + 1000; k < 3 * 65536 + 7000; ++k) {
- rr.add(k);
- }
- for (int k = 3 * 65536 + 7000; k < 3 * 65536 + 9000; ++k) {
- rr.add(k);
- }
- for (int k = 4 * 65536; k < 4 * 65536 + 7000; ++k) {
- rr.add(k);
- }
- for (int k = 6 * 65536; k < 6 * 65536 + 10000; ++k) {
- rr.add(k);
- }
- for (int k = 8 * 65536; k < 8 * 65536 + 1000; ++k) {
- rr.add(k);
- }
- for (int k = 9 * 65536; k < 9 * 65536 + 30000; ++k) {
- rr.add(k);
- }
-
- final RoaringBitmap rr2 = new RoaringBitmap();
- for (int k = 4000; k < 4256; ++k) {
- rr2.add(k);
- arrayand[pos++] = k;
- }
- for (int k = 65536; k < 65536 + 4000; ++k) {
- rr2.add(k);
- arrayand[pos++] = k;
- }
- for (int k = 3 * 65536 + 1000; k < 3 * 65536 + 7000; ++k) {
- rr2.add(k);
- arrayand[pos++] = k;
- }
- for (int k = 6 * 65536; k < 6 * 65536 + 1000; ++k) {
- rr2.add(k);
- arrayand[pos++] = k;
- }
- for (int k = 7 * 65536; k < 7 * 65536 + 1000; ++k) {
- rr2.add(k);
- }
- for (int k = 10 * 65536; k < 10 * 65536 + 5000; ++k) {
- rr2.add(k);
- }
-
- final RoaringBitmap rrand = RoaringBitmap.and(rr, rr2);
-
- final int[] arrayres = rrand.toArray();
-
- assertArrayEquals(arrayand, arrayres);
-
- }
-
- @Test
- public void andtest4() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- 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 RoaringBitmap andresult = RoaringBitmap.and(rb, rb2);
- final RoaringBitmap off = RoaringBitmap.and(rb2, rb);
- assertEquals(andresult, off);
-
- 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 RoaringBitmap andresult2 = RoaringBitmap.and(rb, rb2);
- assertEquals(0, andresult.getCardinality());
-
- 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);
- }
- assertEquals(0, andresult.getCardinality());
- final RoaringBitmap rc = RoaringBitmap.and(rb, rb2);
- rb.and(rb2);
- assertEquals(rc.getCardinality(), rb.getCardinality());
-
- }
-
- @Test
- public void ArrayContainerCardinalityTest() {
- final ArrayContainer ac = new ArrayContainer();
- for (char k = 0; k < 100; ++k) {
- ac.add(k);
- assertEquals(ac.getCardinality(), k + 1);
- }
- for (char k = 0; k < 100; ++k) {
- ac.add(k);
- assertEquals(ac.getCardinality(), 100);
- }
- }
-
- @Test
- public void arraytest() {
- final ArrayContainer rr = new ArrayContainer();
- rr.add((char) 110);
- rr.add((char) 114);
- rr.add((char) 115);
- final char[] array = new char[3];
- int pos = 0;
- for (final char i : rr) {
- array[pos++] = i;
- }
- assertEquals(array[0], (char) 110);
- assertEquals(array[1], (char) 114);
- assertEquals(array[2], (char) 115);
- }
-
- @Test
- public void basictest() {
- final RoaringBitmap rr = new RoaringBitmap();
- final int[] a = new int[4002];
- int pos = 0;
- for (int k = 0; k < 4000; ++k) {
- rr.add(k);
- a[pos++] = k;
- }
- rr.add(100000);
- a[pos++] = 100000;
- rr.add(110000);
- a[pos++] = 110000;
- final int[] array = rr.toArray();
-
-
- assertArrayEquals(array, a);
- }
-
- @Test
- public void BitmapContainerCardinalityTest() {
- final BitmapContainer ac = new BitmapContainer();
- for (char k = 0; k < 100; ++k) {
- ac.add(k);
- assertEquals(ac.getCardinality(), k + 1);
- }
- for (char k = 0; k < 100; ++k) {
- ac.add(k);
- assertEquals(ac.getCardinality(), 100);
- }
- }
-
- @Test
- public void bitmapOfTest() {
- int[] cuiRelsArray = new int[1024];
- for (int k = 0; k < cuiRelsArray.length; ++k) {
- cuiRelsArray[k] = k;
- }
- RoaringBitmap rr1 = RoaringBitmap.bitmapOf(cuiRelsArray);
- int[] back = rr1.toArray();
- assertArrayEquals(cuiRelsArray, back);
- }
-
- @Test
- public void bitmaptest() {
- final BitmapContainer rr = new BitmapContainer();
- rr.add((char) 110);
- rr.add((char) 114);
- rr.add((char) 115);
- final char[] array = new char[3];
- int pos = 0;
- for (final char i : rr) {
- array[pos++] = i;
- }
- assertEquals(array[0], (char) 110);
- assertEquals(array[1], (char) 114);
- assertEquals(array[2], (char) 115);
- }
-
- @Test
- public void cardinalityTest() {
- final int N = 1024;
- for (int gap = 7; gap < 100000; gap *= 10) {
- for (int offset = 2; offset <= 1024; offset *= 2) {
- final RoaringBitmap rb = new RoaringBitmap();
- // check the add of new values
- for (int k = 0; k < N; k++) {
- rb.add(k * gap);
- assertEquals(rb.getCardinality(), k + 1);
- }
- assertEquals(rb.getCardinality(), N);
- // check the add of existing values
- for (int k = 0; k < N; k++) {
- rb.add(k * gap);
- assertEquals(rb.getCardinality(), N);
- }
-
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- for (int k = 0; k < N; k++) {
- rb2.add(k * gap * offset);
- assertEquals(rb2.getCardinality(), k + 1);
- }
-
- assertEquals(rb2.getCardinality(), N);
-
- for (int k = 0; k < N; k++) {
- rb2.add(k * gap * offset);
- assertEquals(rb2.getCardinality(), N);
- }
- assertEquals(RoaringBitmap.and(rb, rb2).getCardinality(), N / offset);
- assertEquals(RoaringBitmap.or(rb, rb2).getCardinality(), 2 * N - N / offset);
- assertEquals(RoaringBitmap.xor(rb, rb2).getCardinality(), 2 * N - 2 * N / offset);
- }
- }
- }
-
- @Test
- public void clearTest() {
- final RoaringBitmap rb = new RoaringBitmap();
- for (int i = 0; i < 200000; i += 7) {
- // dense
- rb.add(i);
- }
- for (int i = 200000; i < 400000; i += 177) {
- // sparse
- rb.add(i);
- }
-
- final RoaringBitmap rb2 = new RoaringBitmap();
- final RoaringBitmap rb3 = new RoaringBitmap();
- for (int i = 0; i < 200000; i += 4) {
- rb2.add(i);
- }
- for (int i = 200000; i < 400000; i += 14) {
- rb2.add(i);
- }
-
- rb.clear();
- assertEquals(0, rb.getCardinality());
- assertTrue(0 != rb2.getCardinality());
-
- rb.add(4);
- rb3.add(4);
- final RoaringBitmap andresult = RoaringBitmap.and(rb, rb2);
- final RoaringBitmap orresult = RoaringBitmap.or(rb, rb2);
-
- assertEquals(1, andresult.getCardinality());
- assertEquals(rb2.getCardinality(), orresult.getCardinality());
-
- for (int i = 0; i < 200000; i += 4) {
- rb.add(i);
- rb3.add(i);
- }
- for (int i = 200000; i < 400000; i += 114) {
- rb.add(i);
- rb3.add(i);
- }
-
- final int[] arrayrr = rb.toArray();
- final int[] arrayrr3 = rb3.toArray();
-
- assertArrayEquals(arrayrr, arrayrr3);
- }
-
- @Test
- public void ContainerFactory() {
- BitmapContainer bc1, bc2, bc3;
- ArrayContainer ac1, ac2, ac3;
-
- bc1 = new BitmapContainer();
- bc2 = new BitmapContainer();
- bc3 = new BitmapContainer();
- ac1 = new ArrayContainer();
- ac2 = new ArrayContainer();
- ac3 = new ArrayContainer();
-
- for (char i = 0; i < 5000; i++) {
- bc1.add((char) (i * 70));
- }
- for (char i = 0; i < 5000; i++) {
- bc2.add((char) (i * 70));
- }
- for (char i = 0; i < 5000; i++) {
- bc3.add((char) (i * 70));
- }
-
- for (char i = 0; i < 4000; i++) {
- ac1.add((char) (i * 50));
- }
- for (char i = 0; i < 4000; i++) {
- ac2.add((char) (i * 50));
- }
- for (char i = 0; i < 4000; i++) {
- ac3.add((char) (i * 50));
- }
-
- BitmapContainer rbc;
-
- rbc = ac1.clone().toBitmapContainer();
- assertTrue(validate(rbc, ac1));
- rbc = ac2.clone().toBitmapContainer();
- assertTrue(validate(rbc, ac2));
- rbc = ac3.clone().toBitmapContainer();
- assertTrue(validate(rbc, ac3));
- }
-
- @Test
- public void containerSharingWithXor() {
- RoaringBitmap r1 = new RoaringBitmap();
- r1.flip(131000L, 131001L);
- RoaringBitmap r2 = new RoaringBitmap();
- r2.add(220000);
- RoaringBitmap r3 = new RoaringBitmap();
- int killingPosition = 66000;
- r3.add(killingPosition);
- assertFalse(r1.contains(killingPosition));
- r2.xor(r1);
- assertTrue(r2.contains(131000));
- assertFalse(r1.contains(killingPosition));
- r2.or(r3);
- assertTrue(r2.contains(131000));
- assertTrue(r2.contains(killingPosition));
- assertFalse(r1.contains(killingPosition));
- }
-
- // From a bug report contributed by Kevin Karpenske
- // this had created an array out of bounds error
- @Test
- public void fliptest_Karpenske() {
- long[] array = new long[]{343798, 343799, 343800, 343801, 343803, 343804, 343805, 343807, 343809,
- 343811, 343812, 343815, 343816, 343817, 343818, 343819, 343821, 343825, 343827, 343828,
- 343830, 343831, 343832, 343833, 343835, 343836, 343837, 343838, 343839, 343840, 343841,
- 343842, 343843, 343844, 343845, 343847, 343848, 343849, 343850, 343851, 343853, 343854,
- 343855, 343856, 343858, 343859, 343860, 343861, 343862, 343863, 343864, 343865, 343866,
- 343868, 343869, 343874, 343875, 343877, 343879, 343880, 343881, 343882, 343883, 343887,
- 343889, 343890, 343891, 343894, 343895, 343898, 343899, 343900, 343901, 343902, 343904,
- 343906, 343907, 343908, 343909, 343910, 343911, 343912, 343913, 343914, 343915, 343916,
- 343917, 343918, 343919, 343921, 343922, 343923, 343924, 343927, 343928, 343929, 343930,
- 343931, 343932, 343933, 343934, 343935, 343938, 343939, 343941, 343942, 343943, 343944,
- 343945, 343946, 343949, 343951, 343953, 343954, 343955, 343956, 343958, 343959, 343961,
- 343962, 343964, 343965, 343966, 343967, 343968, 343969, 343971, 343972, 343973, 343974,
- 343976, 343978, 343979, 343981, 343982, 343983, 343985, 343987, 343988, 343989, 343992,
- 343993, 343994, 343995, 343996, 343997, 343998, 344000, 344001, 344002, 344003, 344004,
- 344006, 344008, 344009, 344011, 344012, 344013, 344015, 344017, 344019, 344020, 344021,
- 344023, 344025, 344026, 344027, 344028, 344029, 344030, 344031, 344034, 344035, 344036,
- 344037, 344038, 344039, 344040, 344042, 344043, 344046, 344047};
- RoaringBitmap bitmap = new RoaringBitmap();
- long[] indexes = array;
- int rangeStart = 0;
- for (int rangeEnd = 1; rangeEnd < indexes.length; rangeEnd++) {
- if (indexes[rangeEnd - 1] + 1 != indexes[rangeEnd]) {
- if (rangeStart == rangeEnd - 1) {
- bitmap.add((int) indexes[rangeStart]);
- } else {
- bitmap.flip(indexes[rangeStart], indexes[rangeEnd - 1] + 1);
- }
- rangeStart = rangeEnd;
- }
- }
- if (rangeStart == indexes.length - 1) {
- bitmap.add((int) indexes[rangeStart]);
- } else {
- bitmap.flip(indexes[rangeStart], indexes[indexes.length - 1] + 1);
- }
- assertEquals(182, bitmap.getCardinality());
- }
-
- @Test
- public void flipTest1() {
- final RoaringBitmap rb = new RoaringBitmap();
-
- rb.flip(100000L, 200000L); // in-place on empty bitmap
- final int rbcard = rb.getCardinality();
- assertEquals(100000, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 100000; i < 200000; ++i) {
- bs.set(i);
- }
- assertTrue(equals(bs, rb));
- }
-
- @Test
- public void flipTest1A() {
- final RoaringBitmap rb = new RoaringBitmap();
-
- final RoaringBitmap rb1 = RoaringBitmap.flip(rb, 100000L, 200000L);
- final int rbcard = rb1.getCardinality();
- assertEquals(100000, rbcard);
- assertEquals(0, rb.getCardinality());
-
- final BitSet bs = new BitSet();
- assertTrue(equals(bs, rb)); // still empty?
- for (int i = 100000; i < 200000; ++i) {
- bs.set(i);
- }
- assertTrue(equals(bs, rb1));
- }
-
- @Test
- public void flipTest2() {
- final RoaringBitmap rb = new RoaringBitmap();
-
- rb.flip(100000L, 100000L);
- final int rbcard = rb.getCardinality();
- assertEquals(0, rbcard);
-
- final BitSet bs = new BitSet();
- assertTrue(equals(bs, rb));
- }
-
- @Test
- public void flipTest2A() {
- final RoaringBitmap rb = new RoaringBitmap();
-
- final RoaringBitmap rb1 = RoaringBitmap.flip(rb, 100000L, 100000L);
- rb.add(1); // will not affect rb1 (no shared container)
- final int rbcard = rb1.getCardinality();
- assertEquals(0, rbcard);
- assertEquals(1, rb.getCardinality());
-
- final BitSet bs = new BitSet();
- assertTrue(equals(bs, rb1));
- bs.set(1);
- assertTrue(equals(bs, rb));
- }
-
- @Test
- public void flipTest3() {
- final RoaringBitmap rb = new RoaringBitmap();
-
- rb.flip(100000L, 200000L); // got 100k-199999
- rb.flip(100000L, 199991L); // give back 100k-199990
- final int rbcard = rb.getCardinality();
-
- assertEquals(9, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 199991; i < 200000; ++i) {
- bs.set(i);
- }
-
- assertTrue(equals(bs, rb));
- }
-
- @Test
- public void flipTest3A() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb1 = RoaringBitmap.flip(rb, 100000L, 200000L);
- final RoaringBitmap rb2 = RoaringBitmap.flip(rb1, 100000L, 199991L);
- final int rbcard = rb2.getCardinality();
-
- assertEquals(9, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 199991; i < 200000; ++i) {
- bs.set(i);
- }
-
- assertTrue(equals(bs, rb2));
- }
-
- @Test
- public void flipTest4() { // fits evenly on both ends
- final RoaringBitmap rb = new RoaringBitmap();
- rb.flip(100000L, 200000L); // got 100k-199999
- rb.flip(65536L, 4 * 65536L);
- final int rbcard = rb.getCardinality();
-
- // 65536 to 99999 are 1s
- // 200000 to 262143 are 1s: total card
-
- assertEquals(96608, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 65536; i < 100000; ++i) {
- bs.set(i);
- }
- for (int i = 200000; i < 262144; ++i) {
- bs.set(i);
- }
-
- assertTrue(equals(bs, rb));
- }
-
- @Test
- public void flipTest4A() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb1 = RoaringBitmap.flip(rb, 100000L, 200000L);
- final RoaringBitmap rb2 = RoaringBitmap.flip(rb1, 65536L, 4 * 65536L);
- final int rbcard = rb2.getCardinality();
-
- assertEquals(96608, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 65536; i < 100000; ++i) {
- bs.set(i);
- }
- for (int i = 200000; i < 262144; ++i) {
- bs.set(i);
- }
-
- assertTrue(equals(bs, rb2));
- }
-
- @Test
- public void flipTest5() { // fits evenly on small end, multiple
- // containers
- final RoaringBitmap rb = new RoaringBitmap();
- rb.flip(100000L, 132000L);
- rb.flip(65536L, 120000L);
- final int rbcard = rb.getCardinality();
-
- // 65536 to 99999 are 1s
- // 120000 to 131999
-
- assertEquals(46464, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 65536; i < 100000; ++i) {
- bs.set(i);
- }
- for (int i = 120000; i < 132000; ++i) {
- bs.set(i);
- }
- assertTrue(equals(bs, rb));
- }
-
- @Test
- public void flipTest5A() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb1 = RoaringBitmap.flip(rb, 100000L, 132000L);
- final RoaringBitmap rb2 = RoaringBitmap.flip(rb1, 65536L, 120000L);
- final int rbcard = rb2.getCardinality();
-
- assertEquals(46464, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 65536; i < 100000; ++i) {
- bs.set(i);
- }
- for (int i = 120000; i < 132000; ++i) {
- bs.set(i);
- }
- assertTrue(equals(bs, rb2));
- }
-
- @Test
- public void flipTest6() { // fits evenly on big end, multiple containers
- final RoaringBitmap rb = new RoaringBitmap();
- rb.flip(100000L, 132000L);
- rb.flip(99000L, 2 * 65536L);
- final int rbcard = rb.getCardinality();
-
- // 99000 to 99999 are 1000 1s
- // 131072 to 131999 are 928 1s
-
- assertEquals(1928, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 99000; i < 100000; ++i) {
- bs.set(i);
- }
- for (int i = 2 * 65536; i < 132000; ++i) {
- bs.set(i);
- }
- assertTrue(equals(bs, rb));
- }
-
- @Test
- public void flipTest6A() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb1 = RoaringBitmap.flip(rb, 100000L, 132000L);
- final RoaringBitmap rb2 = RoaringBitmap.flip(rb1, 99000L, 2 * 65536L);
- final int rbcard = rb2.getCardinality();
-
- assertEquals(1928, rbcard);
-
- final BitSet bs = new BitSet();
- for (int i = 99000; i < 100000; ++i) {
- bs.set(i);
- }
- for (int i = 2 * 65536; i < 132000; ++i) {
- bs.set(i);
- }
- assertTrue(equals(bs, rb2));
- }
-
- @Test
- public void flipTest7() { // within 1 word, first container
- final RoaringBitmap rb = new RoaringBitmap();
- rb.flip(650L, 132000L);
- rb.flip(648L, 651L);
- final int rbcard = rb.getCardinality();
-
- // 648, 649, 651-131999
-
- assertEquals(132000 - 651 + 2, rbcard);
-
- final BitSet bs = new BitSet();
- bs.set(648);
- bs.set(649);
- for (int i = 651; i < 132000; ++i) {
- bs.set(i);
- }
- assertTrue(equals(bs, rb));
- }
-
- @Test
- public void flipTest7A() { // within 1 word, first container
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb1 = RoaringBitmap.flip(rb, 650L, 132000L);
- final RoaringBitmap rb2 = RoaringBitmap.flip(rb1, 648L, 651L);
- final int rbcard = rb2.getCardinality();
-
- // 648, 649, 651-131999
-
- assertEquals(132000 - 651 + 2, rbcard);
-
- final BitSet bs = new BitSet();
- bs.set(648);
- bs.set(649);
- for (int i = 651; i < 132000; ++i) {
- bs.set(i);
- }
- assertTrue(equals(bs, rb2));
- }
-
- @Test
- public void flipTest8() {
- final RoaringBitmap rb = new RoaringBitmap();
- rb.add(0);
- rb.add(2);
- final RoaringBitmap rb2 = RoaringBitmap.flip(rb, 0L, 3L);
-
- final BitSet bs = new BitSet();
- bs.set(1);
- assertTrue(equals(bs, rb2));
- }
-
-
- @Test
- public void flipTestBigInt() {
- final RoaringBitmap rb = new RoaringBitmap();
- rb.add(Integer.MAX_VALUE + 100000);
- rb.add(Integer.MAX_VALUE + 100002);
- final RoaringBitmap rb2 = RoaringBitmap.flip(rb, Integer.MAX_VALUE + 100001L,
- Integer.MAX_VALUE + 200000L);
- assertEquals(99999, rb2.getCardinality());
- assertTrue(rb2.contains(Integer.MAX_VALUE + 100000));
- assertFalse(rb2.contains(Integer.MAX_VALUE + 100002));
- assertTrue(rb2.contains(Integer.MAX_VALUE + 199999));
- }
-
-
- @Test
- public void flipTestBig() {
- final int numCases = 1000;
- final RoaringBitmap rb = new RoaringBitmap();
- final BitSet bs = new BitSet();
- final Random r = new Random(3333);
- int checkTime = 2;
-
- for (int i = 0; i < numCases; ++i) {
- final long start = r.nextInt(65536 * 20);
- long end = r.nextInt(65536 * 20);
- if (r.nextDouble() < 0.1) {
- end = start + r.nextInt(100);
- }
- rb.flip(start, end);
- if (start < end) {
- bs.flip((int) start, (int) end); // throws exception
- }
- // otherwise
- // insert some more ANDs to keep things sparser
- if (r.nextDouble() < 0.2) {
- final RoaringBitmap mask = new RoaringBitmap();
- final BitSet mask1 = new BitSet();
- final long startM = r.nextInt(65536 * 20);
- final long endM = startM + 100000;
- mask.flip(startM, endM);
- mask1.flip((int) startM, (int) endM);
- mask.flip(0L, 65536L * 20 + 100000);
- mask1.flip(0, 65536 * 20 + 100000);
- rb.and(mask);
- bs.and(mask1);
- }
- // see if we can detect incorrectly shared containers
- if (r.nextDouble() < 0.1) {
- final RoaringBitmap irrelevant = RoaringBitmap.flip(rb, 10L, 100000L);
- irrelevant.flip(5L, 200000L);
- irrelevant.flip(190000L, 260000L);
- }
- if (i > checkTime) {
- assertTrue(equals(bs, rb));
- checkTime *= 1.5;
- }
- }
- }
-
- @Test
- public void flipTestBigA() {
- final int numCases = 1000;
- final BitSet bs = new BitSet();
- final Random r = new Random(3333);
- int checkTime = 2;
- RoaringBitmap rb1 = new RoaringBitmap(), rb2 = null; // alternate
- // between
- // them
- for (int i = 0; i < numCases; ++i) {
- final int start = r.nextInt(65536 * 20);
- int end = r.nextInt(65536 * 20);
- if (r.nextDouble() < 0.1) {
- end = start + r.nextInt(100);
- }
-
- if ((i & 1) == 0) {
- rb2 = RoaringBitmap.flip(rb1, (long) start, (long) end);
- // tweak the other, catch bad sharing
- long r1 = r.nextInt(65536 * 20);
- long r2 = r.nextInt(65536 * 20);
- rb1.flip(r1, r2);
- } else {
- rb1 = RoaringBitmap.flip(rb2, (long) start, (long) end);
- long r1 = r.nextInt(65536 * 20);
- long r2 = r.nextInt(65536 * 20);
- rb2.flip(r1, r2);
- }
-
- if (start < end) {
- bs.flip(start, end); // throws exception
- // otherwise
- }
- // insert some more ANDs to keep things sparser
- if (r.nextDouble() < 0.2 && (i & 1) == 0) {
- final RoaringBitmap mask = new RoaringBitmap();
- final BitSet mask1 = new BitSet();
- final int startM = r.nextInt(65536 * 20);
- final int endM = startM + 100000;
- mask.flip((long) startM, (long) endM);
- mask1.flip(startM, endM);
- mask.flip(0L, 65536L * 20 + 100000);
- mask1.flip(0, 65536 * 20 + 100000);
- rb2.and(mask);
- bs.and(mask1);
- }
- if (i > checkTime) {
- final RoaringBitmap rb = (i & 1) == 0 ? rb2 : rb1;
- final boolean status = equals(bs, rb);
- assertTrue(status);
- checkTime *= 1.5;
- }
- }
- }
-
- @Test
- public void intersecttest() {
- final RoaringBitmap rr1 = new RoaringBitmap();
- final RoaringBitmap rr2 = new RoaringBitmap();
- for (int k = 0; k < 40000; ++k) {
- rr1.add(2 * k);
- rr2.add(2 * k + 1);
- }
- assertFalse(RoaringBitmap.intersects(rr1, rr2));
- rr1.add(2 * 500 + 1);
- assertTrue(RoaringBitmap.intersects(rr1, rr2));
- final RoaringBitmap rr3 = new RoaringBitmap();
- rr3.add(2 * 501 + 1);
- assertTrue(RoaringBitmap.intersects(rr3, rr2));
- assertFalse(RoaringBitmap.intersects(rr3, rr1));
- for (int k = 0; k < 40000; ++k) {
- rr1.add(2 * k + 1);
- }
- rr1.runOptimize();
- assertTrue(RoaringBitmap.intersects(rr1, rr2));
- }
-
- @Test
- public void intersecttestWithRange() {
- RoaringBitmap rr1 = new RoaringBitmap();
- RoaringBitmap rr2 = new RoaringBitmap();
- RoaringBitmap rr3 = new RoaringBitmap();
-
- // This bitmap containers will be Run Containers
- rr1.add(1L, 4L);
- rr1.add(6L, 10L);
-
-
- // This one will be Array Containers
- rr2.add(0);
- rr2.add(2);
-
- rr2.add(6);
- rr2.add(7);
- rr2.add(9);
-
- assertFalse(rr1.intersects(0, 1));
- assertTrue(rr1.intersects(0, 3));
- assertTrue(rr1.intersects(0, 11));
- assertFalse(rr1.intersects(12, 14));
- assertFalse(rr1.intersects(4, 5));
- assertTrue(rr1.intersects(2, 3));
- assertTrue(rr1.intersects(4, 8));
- assertTrue(rr1.intersects(8, 12));
-
- assertTrue(rr2.intersects(0, 11));
- assertFalse(rr2.intersects(12, 14));
- assertFalse(rr2.intersects(4, 5));
- assertTrue(rr2.intersects(2, 3));
- assertTrue(rr2.intersects(4, 8));
- assertTrue(rr2.intersects(8, 12));
-
- rr3.add(5L, 10L);
- assertTrue(rr3.intersects(5, 10));
- }
-
-
- @Test
- public void shouldNotIntersectWithDisjointRangeBelowBitmapFirst() {
- char[] keys = new char[1];
- Container[] values = new Container[1];
- RoaringBitmap bitmap = new RoaringBitmap(new RoaringArray(keys, values, 1));
- keys[0] = (char) (1 << 15);
- long[] bits = new long[1024];
- long word = 1789303257167203747L;
- Arrays.fill(bits, word);
- values[0] = new BitmapContainer(bits, 1024 * Long.bitCount(word));
- assertFalse(bitmap.intersects(0, bitmap.first() & 0xFFFFFFFFL));
- }
-
- @Test
- public void shouldIntersectWithFirstWhenBitmapAtStart() {
- char[] keys = new char[1];
- Container[] values = new Container[1];
- RoaringBitmap bitmap = new RoaringBitmap(new RoaringArray(keys, values, 1));
- keys[0] = (char) (1 << 15);
- long[] bits = new long[1024];
- long word = 2697219678014362575L;
- Arrays.fill(bits, word);
- values[0] = new BitmapContainer(bits, 1024 * Long.bitCount(word));
- long first = (bitmap.first() & 0xFFFFFFFFL);
- assertTrue(bitmap.intersects(first - 1, first + 1));
- assertTrue(bitmap.intersects(first, first + 1));
- assertFalse(bitmap.intersects(first - 1, first));
- }
-
- @Test
- public void orBigIntsTest() {
- RoaringBitmap rb = new RoaringBitmap();
- RoaringBitmap rb2 = new RoaringBitmap();
- HashSet hs = new HashSet();
-
- for (int i = 1 << 31; i < (1 << 31) + 65536; i += 2) {
- rb.add(i);
- hs.add(i);
- }
- for (int i = (1 << 31) + 3 * 65536; i < (1 << 31) + 4 * 65536; i += 3) {
- hs.add(i);
- rb.add(i);
- }
- for (int i = (1 << 31) + 5 * 65536; i < (1 << 31) + 7 * 65536; i += 5) {
- hs.add(i);
- rb.add(i);
- }
- for (int i = (1 << 31) + 9 * 65536; i < (1 << 31) + 10 * 65536; i += 3) {
- hs.add(i);
- rb.add(i);
- }
-
- for (int i = 1 << 31 + 3 * 65536; i < (1 << 31) + 4 * 65536; i += 5) {
- hs.add(i);
- rb2.add(i);
- }
- for (int i = (1 << 31) + 6 * 65536; i < (1 << 31) + 7 * 65536; i += 3) {
- hs.add(i);
- rb2.add(i);
- }
- for (int i = (1 << 31) + 9 * 65536; i < (1 << 31) + 11 * 65536; i += 5) {
- hs.add(i);
- rb2.add(i);
- }
- for (int i = (1 << 31) + 13 * 65536; i < (1 << 31) + 14 * 65536; i += 7) {
- hs.add(i);
- rb2.add(i);
- }
-
- RoaringBitmap rbor = RoaringBitmap.or(rb, rb2);
-
- Object[] correct = hs.toArray();
- Arrays.sort(correct);
- Integer[] resor = ArrayUtils.toObject(rbor.toArray());
- assertArrayEquals(correct, resor);
- }
-
- @Test
- public void orcount() {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rr.add(k);
- }
- rr.add(100000);
- rr.add(110000);
- final RoaringBitmap rr2 = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rr2.add(k);
- }
-
- final RoaringBitmap rror = RoaringBitmap.or(rr, rr2);
- assertEquals(rror.getCardinality(), RoaringBitmap.orCardinality(rr, rr2));
-
- }
-
- @Test
- public void testXorCardinality() {
- final RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rb.add(k);
- }
- rb.add(100000);
- rb.add(110000);
- rb.add(1L << 20, 1L << 21);
- rb.flip((1 << 20) | (1 << 19));
- final RoaringBitmap rb2 = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rb2.add(k);
- }
- RoaringBitmap xor = RoaringBitmap.xor(rb, rb2);
- assertEquals(xor.getCardinality(), RoaringBitmap.xorCardinality(rb, rb2));
- }
-
- @Test
- public void testAndNotCardinality() {
- final RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rb.add(k);
- }
- rb.add(100000);
- rb.add(110000);
- rb.add(1L << 20, 1L << 21);
- rb.flip((1 << 20) | (1 << 19));
- final RoaringBitmap rb2 = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rb2.add(k);
- }
- RoaringBitmap andNot = RoaringBitmap.andNot(rb, rb2);
- assertEquals(andNot.getCardinality(), RoaringBitmap.andNotCardinality(rb, rb2));
- }
-
- @Test
- public void testAndNotCardinalityBigVsSmall() {
- RoaringBitmap small = RoaringBitmap.bitmapOf(1, 2, 3);
- RoaringBitmap big = new RoaringBitmap();
- for (int i = 0; i < 4000; ++i) {
- big.add(1 + i * 0x1000);
- }
- RoaringBitmap andNot = RoaringBitmap.andNot(big, small);
- assertEquals(andNot.getCardinality(), RoaringBitmap.andNotCardinality(big, small));
- }
-
- @Test
- public void testAndNotCardinalitySmallVsBig() {
- RoaringBitmap small = RoaringBitmap.bitmapOf(1, 2, 3);
- RoaringBitmap big = new RoaringBitmap();
- for (int i = 0; i < 4000; ++i) {
- big.add(1 + i * 0x1000);
- }
- RoaringBitmap andNot = RoaringBitmap.andNot(small, big);
- assertEquals(andNot.getCardinality(), RoaringBitmap.andNotCardinality(small, big));
- }
-
- @Test
- public void testAndNotCardinality_646() {
- RoaringBitmap rb = RoaringBitmap.bitmapOf(-587409880, 605467000);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(-587409880, 347844183);
-
- RoaringBitmap andNot = RoaringBitmap.andNot(rb, rb2);
- assertEquals(andNot.getCardinality(), RoaringBitmap.andNotCardinality(rb, rb2));
- }
-
- @Test
- public void testAndNotCardinality_648() {
- RoaringBitmap s1 = RoaringBitmap.bitmapOf(-1388308580, 236217409, -805382570, 612285977, 1389629939, 851442526, 375756307, 61533603, 1908301308, 2097309572, 204769050, 703198559, -545810986, 2090296816, -87319453, 158018332, -685188145, -566739002, -1446363859, -372441875, -957637004, -1144076256, -1248859542, -160225853, 14707613, 866274329, 1550526350, 877999004, -1784269953, 1274953255, 1490490469, -1340013077, 2067958239, 51232349, 2060711699, -1802459974, 2039829040, -2079650027, -278950425, 1145674649, 298101576, 1687655442, 1209489632, -762136131, 399832491, 1077638711, -635674559, -1643781464, -1067907341, 144525399, 651571848, 1893053071, -2058528151, 1592871441, 84583235, 374119809, -867104416, -1941224259, 787356209, 1972857336, -720703901, -1310021857, -1831922816, 181898740, 600942551, -1745822849, -856908487, 2060184086, -1217485514, -1680395029, 1539735915, 2042390564, -1539856946, 1824974207, 1695025297, 1908431629, -395090370, -1688185468, 570601902, -701368853, -1211735380, -825285093, 788089714, -857723909, 1400502194, 285106906, -1450842998, -2125215206, 1451519492, -1559357910, 1157633452, -387704829, 2036134025, 1051239778, -1542956455, 357879569, 1962230155, -1994777800, 672516512, 174507423, -299175291, 821891018, 1062886766, -1313955904, 1732661804, -767116537, 1352149580, 2001322279, 1698147357, 40451458, 996819026, 1904959950, 2058544757, 1514282221, 234242255, -1364505429, 1498471146, 1134429786, -918860049, 1430732385, 644983298, 793600316, -1726956640, -538511147, -1945670935, 291567421, 1033590420, -1831809482, 985031287, -773476240, 1724734191, -1364525376, 1208307142, -2126741265, -1851759120, 1083333467, 185208087, -375950074, 48210573, -843304856, -295266615, -843941360, -524390895, -102924717, 836117637, 683196001, -1824825594, -1470017798, -1554712054, 291236023, -907874606, 2068945326, -899352179, -1488751007, -449279886, -1085935420, -2094131785, -474243782, 1306756671, 1353254318, 86944198, 1148225154, 487252515, -229770314, -1484325603, 109043190, -252122045, 1431750974, 1667547537, -1775516477, -512978266, -216545450, -486550865, -1193721685, -1108677522, -628326149, -1568065979, -675571394);
- RoaringBitmap s2 = RoaringBitmap.bitmapOf(2060184086, 704452713, 1236293943, -178539376, 2037977331, -78910667, -587409880, 204769050, -854426111, 90628341, -1411939301, -927754519, -211274987, 998450197, -1515133464, -1652963250, 499001553, 383696025, -2019580769, 1583380373, -79264832, 1065614902, 1243463658, 424214238, 1124141647, 271662535, 1415634429, 1893053071, -1624960757, -1933550809, -1170233109, -542340662, -1681838238, 292656484, 1587781520, -1463647396, -124042559, -162307067, 1411905814, -1524651941, 1935844108, 1992426746, 422443777, 679395872, -764857187, -401706366, -2007177999, 1044794027, -1561188953, 1627034126, -401273669, -123973748, -694963705, 838892817, -1640102435, 852253834, -23120023, -2072644924, 1140820264, -550227319, -1692730465, 1491150291, 1607642920, -1015774573, -1801713682, -752796152, -439281693, -792361100, -188208805, 808883165, -1364525376, 896915854, -1672522244, -1718572341);
- RoaringBitmap s3 = RoaringBitmap.bitmapOf(-30718004, -1652963250, -762136131, -1552606582, -1933550809, -1230616126, 736584428, -2136360654, 1097548480, 192408815, -295266615);
- RoaringBitmap s1AndS2 = RoaringBitmap.and(s1, s2);
- assertEquals(RoaringBitmap.andNot(s1AndS2, s3).getCardinality(), RoaringBitmap.andNotCardinality(s1AndS2, s3));
- }
-
- @Test
- public void ortest() {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rr.add(k);
- }
- rr.add(100000);
- rr.add(110000);
- final RoaringBitmap rr2 = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rr2.add(k);
- }
-
- final RoaringBitmap rror = RoaringBitmap.or(rr, rr2);
-
- final int[] array = rror.toArray();
- final int[] arrayrr = rr.toArray();
-
- assertArrayEquals(array, arrayrr);
-
- rr.or(rr2);
- final int[] arrayirr = rr.toArray();
- assertArrayEquals(array, arrayirr);
-
- }
-
- @Test
- public void ORtest() {
- final RoaringBitmap rr = new RoaringBitmap();
- 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 RoaringBitmap rr2 = new RoaringBitmap();
- 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 RoaringBitmap correct = RoaringBitmap.or(rr, rr2);
- rr.or(rr2);
- assertEquals(correct, rr);
- }
-
- @Test
- public void ortest2() {
- final int[] arrayrr = new int[4000 + 4000 + 2];
- int pos = 0;
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rr.add(k);
- arrayrr[pos++] = k;
- }
- rr.add(100000);
- rr.add(110000);
- final RoaringBitmap rr2 = new RoaringBitmap();
- for (int k = 4000; k < 8000; ++k) {
- rr2.add(k);
- arrayrr[pos++] = k;
- }
-
- arrayrr[pos++] = 100000;
- arrayrr[pos++] = 110000;
-
- final RoaringBitmap rror = RoaringBitmap.or(rr, rr2);
-
- final int[] arrayor = rror.toArray();
-
- assertArrayEquals(arrayor, arrayrr);
- }
-
- @Test
- public void ortest3() {
- final HashSet V1 = new HashSet();
- final HashSet V2 = new HashSet();
-
- final RoaringBitmap rr = new RoaringBitmap();
- final RoaringBitmap rr2 = new RoaringBitmap();
- // For the first 65536: rr2 has a bitmap container, and rr has
- // an array container.
- // We will check the union between a BitmapCintainer and an
- // arrayContainer
- for (int k = 0; k < 4000; ++k) {
- rr2.add(k);
- V1.add(k);
- }
- for (int k = 3500; k < 4500; ++k) {
- rr.add(k);
- V1.add(k);
- }
- for (int k = 4000; k < 65000; ++k) {
- rr2.add(k);
- V1.add(k);
- }
-
- // In the second node of each roaring bitmap, we have two bitmap
- // containers.
- // So, we will check the union between two BitmapContainers
- for (int k = 65536; k < 65536 + 10000; ++k) {
- rr.add(k);
- V1.add(k);
- }
-
- for (int k = 65536; k < 65536 + 14000; ++k) {
- rr2.add(k);
- V1.add(k);
- }
-
- // In the 3rd node of each Roaring Bitmap, we have an
- // ArrayContainer, so, we will try the union between two
- // ArrayContainers.
- for (int k = 4 * 65535; k < 4 * 65535 + 1000; ++k) {
- rr.add(k);
- V1.add(k);
- }
-
- for (int k = 4 * 65535; k < 4 * 65535 + 800; ++k) {
- rr2.add(k);
- V1.add(k);
- }
-
- // For the rest, we will check if the union will take them in
- // the result
- for (int k = 6 * 65535; k < 6 * 65535 + 1000; ++k) {
- rr.add(k);
- V1.add(k);
- }
-
- for (int k = 7 * 65535; k < 7 * 65535 + 2000; ++k) {
- rr2.add(k);
- V1.add(k);
- }
-
- final RoaringBitmap rror = RoaringBitmap.or(rr, rr2);
- boolean valide = true;
-
- // Si tous les elements de rror sont dans V1 et que tous les
- // elements de
- // V1 sont dans rror(V2)
- // alors V1 == rror
-
- final Object[] tab = V1.toArray();
- final Vector vector = new Vector();
- for (Object aTab : tab) {
- vector.add((Integer) aTab);
- }
-
- for (final int i : rror.toArray()) {
- if (!vector.contains(i)) {
- valide = false;
- }
- V2.add(i);
- }
- for (int i = 0; i < V1.size(); i++) {
- if (!V2.contains(vector.elementAt(i))) {
- valide = false;
- }
- }
-
- assertTrue(valide);
- }
-
- @Test
- public void ortest4() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- 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 RoaringBitmap orresult = RoaringBitmap.or(rb, rb2);
- final RoaringBitmap off = RoaringBitmap.or(rb2, rb);
- assertEquals(orresult, off);
-
- 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 RoaringBitmap orresult2 = RoaringBitmap.or(rb, rb2);
- assertEquals(rb2card, orresult.getCardinality());
-
- assertEquals(rb2.getCardinality() + rb.getCardinality(), orresult2.getCardinality());
- rb.or(rb2);
- assertEquals(rb, orresult2);
-
- }
-
- @Test
- public void orNot() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- rb.add(2);
- rb.add(1);
- rb.add(1 << 16); // 65536
- rb.add(2 << 16); //131072
- rb.add(3 << 16); //196608
-
- rb2.add(1 << 16);// 65536
- rb2.add(3 << 16);//196608
-
- rb.orNot(rb2, (4 << 16) - 1);
-
- assertEquals((4 << 16) - 1, rb.getCardinality());
-
- final IntIterator iterator = rb.getIntIterator();
-
- for (int i = 0; i < (4 << 16) - 1; ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next());
- }
- assertFalse(iterator.hasNext());
- }
-
-
- @Test
- public void orNotRegressionTest() {
- long len = 3L;
- long orLen = 3L;
-
- RoaringBitmap one = new RoaringBitmap();
- RoaringBitmap other = new RoaringBitmap();
- other.add(0L, len);
-
- one.orNot(other, orLen);
- }
-
- @Test
- public void orNotZeroRangeEndPreservesBitmap() {
- RoaringBitmap one = new RoaringBitmap();
- one.add(32);
-
- RoaringBitmap other = new RoaringBitmap();
- other.add(0L, 100);
-
- one.orNot(other, 0);
- assertEquals(one, RoaringBitmap.bitmapOf(32));
- }
-
- @Test
- public void orNotLimitLowerThanFirstPreservesBitmap() {
- RoaringBitmap one = new RoaringBitmap();
- one.add(32);
-
- RoaringBitmap other = new RoaringBitmap();
- other.add(0L, 100);
-
- one.orNot(other, 10);
- assertEquals(one, RoaringBitmap.bitmapOf(32));
- }
-
-
- @Test
- public void orNotLimitHigherThanFirstBitPreservesBitmap() {
- RoaringBitmap one = new RoaringBitmap();
- one.add(32);
-
- RoaringBitmap other = new RoaringBitmap();
- other.add(0L, 100);
-
- one.orNot(other, 35);
- assertEquals(one, RoaringBitmap.bitmapOf(32));
- }
-
- @Test
- public void orNotWithSparseBitmaps() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- rb.add(0);
- rb.add(1 << 16); // 65536
- rb.add(3 << 16); //196608
-
- rb2.add((4 << 16) - 1); //262143
-
- rb.orNot(rb2, 4 << 16);
-
- assertEquals((4 << 16) - 1, rb.getCardinality());
-
- final IntIterator iterator = rb.getIntIterator();
-
- for (int i = 0; i < (4 << 16) - 1; ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next());
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNotWithOtherBiggerThanOriginal() {
- final RoaringBitmap rb = new RoaringBitmap();
- rb.add(1);
-
- final RoaringBitmap rb2 = new RoaringBitmap();
- rb2.add(1 << 14); //16384
- rb2.add(3 << 16); //196608
-
- rb.orNot(rb2, (5 << 16));
- assertEquals((5 << 16) - 2, rb.getCardinality());
-
- final IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (5 << 16); ++i) {
- if ((i != (1 << 14)) && (i != (3 << 16))) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNotWithOtherBiggerThanOriginalAndEndRange() {
- final RoaringBitmap rb = new RoaringBitmap();
- rb.add(1);
-
- final RoaringBitmap rb2 = new RoaringBitmap();
- rb2.add(3 << 16); //196608
-
- rb.orNot(rb2, (2 << 16) + (2 << 14)); //131072 + 32768 = 163840
- assertEquals((2 << 16) + (2 << 14), rb.getCardinality());
-
- final IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (2 << 16) + (2 << 14); ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNotWithOriginalBiggerThanOther() {
- final RoaringBitmap rb = new RoaringBitmap();
-
- rb.add(1);
- rb.add(1 << 16); // 65536
- rb.add(2 << 16); //131072
- rb.add(3 << 16); //196608
-
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- rb.orNot(rb2, (5 << 16));
- assertEquals((5 << 16), rb.getCardinality());
-
- final IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (5 << 16); ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNotWithOriginalBiggerThanOther2() {
- final RoaringBitmap rb = new RoaringBitmap();
-
- rb.add(1);
- rb.add((1 << 16) - 1); // 65535
- rb.add(1 << 16); // 65536
- rb.add(2 << 16); //131072
- rb.add(3 << 16); //196608
-
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- rb.orNot(rb2, (1 << 14));
-
- // {[0, 2^14], 65535, 65536, 131072, 196608}
- assertEquals((1 << 14) + 4, rb.getCardinality());
-
- final IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (1 << 14); ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
-
- assertTrue(iterator.hasNext());
- assertEquals((1 << 16) - 1, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(1 << 16, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(2 << 16, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(3 << 16, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void randomTest() {
- rTest(15);
- rTest(1024);
- rTest(4096);
- rTest(65536);
- rTest(65536 * 16);
- }
-
- public void rTest(final int N) {
- for (int gap = 1; gap <= 65536; gap *= 2) {
- final BitSet bs1 = new BitSet();
- final RoaringBitmap rb1 = new RoaringBitmap();
- 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 RoaringBitmap rb2 = new RoaringBitmap();
- 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, RoaringBitmap.and(rb1, rb2))) {
- throw new RuntimeException("bug and");
- }
- {
- final RoaringBitmap t = rb1.clone();
- t.and(rb2);
- if (!equals(clonebs1, t)) {
- throw new RuntimeException("bug inplace and");
- }
- if (!t.equals(RoaringBitmap.and(rb1, rb2))) {
- System.out
- .println(t.highLowContainer.getContainerAtIndex(0).getClass().getCanonicalName());
- System.out.println(RoaringBitmap.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, RoaringBitmap.or(rb1, rb2))) {
- throw new RuntimeException("bug or");
- }
- {
- final RoaringBitmap t = rb1.clone();
- t.or(rb2);
- if (!equals(clonebs1, t)) {
- throw new RuntimeException("bug or");
- }
- if (!t.equals(RoaringBitmap.or(rb1, rb2))) {
- throw new RuntimeException("bug or");
- }
- if (!t.toString().equals(RoaringBitmap.or(rb1, rb2).toString())) {
- throw new RuntimeException("bug or");
- }
-
- }
- // testing XOR
- clonebs1 = (BitSet) bs1.clone();
- clonebs1.xor(bs2);
- if (!equals(clonebs1, RoaringBitmap.xor(rb1, rb2))) {
- throw new RuntimeException("bug xor");
- }
- {
- final RoaringBitmap t = rb1.clone();
- t.xor(rb2);
- if (!equals(clonebs1, t)) {
- throw new RuntimeException("bug xor");
- }
- if (!t.equals(RoaringBitmap.xor(rb1, rb2))) {
- throw new RuntimeException("bug xor");
- }
- }
- // testing NOTAND
- clonebs1 = (BitSet) bs1.clone();
- clonebs1.andNot(bs2);
- if (!equals(clonebs1, RoaringBitmap.andNot(rb1, rb2))) {
- throw new RuntimeException("bug andnot");
- }
- clonebs1 = (BitSet) bs2.clone();
- clonebs1.andNot(bs1);
- if (!equals(clonebs1, RoaringBitmap.andNot(rb2, rb1))) {
- throw new RuntimeException("bug andnot");
- }
- {
- final RoaringBitmap t = rb2.clone();
- t.andNot(rb1);
- if (!equals(clonebs1, t)) {
- throw new RuntimeException("bug inplace andnot");
- }
- final RoaringBitmap g = RoaringBitmap.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, RoaringBitmap.andNot(rb1, rb2))) {
- throw new RuntimeException("bug andnot");
- }
- {
- final RoaringBitmap t = rb1.clone();
- t.andNot(rb2);
- if (!equals(clonebs1, t)) {
- throw new RuntimeException("bug andnot");
- }
- final RoaringBitmap g = RoaringBitmap.andNot(rb1, rb2);
- if (!equals(clonebs1, g)) {
- throw new RuntimeException("bug andnot");
- }
- if (!t.equals(g)) {
- throw new RuntimeException("bug");
- }
- }
- }
- }
- }
-
- @Test
- public void sillytestHighBits() {
- RoaringBitmap rb = RoaringBitmap.bitmapOf(-1, 0);
- int[] array = rb.toArray();
- assertEquals(0, array[0]);
- assertEquals(array[1], -1);
- }
-
- @Test
- public void simplecardinalityTest() {
- final int N = 512;
- final int gap = 70;
-
- final RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < N; k++) {
- rb.add(k * gap);
- assertEquals(rb.getCardinality(), k + 1);
- }
- assertEquals(rb.getCardinality(), N);
- for (int k = 0; k < N; k++) {
- rb.add(k * gap);
- assertEquals(rb.getCardinality(), N);
- }
-
- }
-
- @Test
- public void sparseAnd() {
- final RoaringBitmap rr1 = new RoaringBitmap();
- rr1.add(1);
- rr1.add(1 << 31);
- final RoaringBitmap rr2 = new RoaringBitmap();
- rr2.add(1 << 31);
- RoaringBitmap and = RoaringBitmap.and(rr1, rr2);
- assertEquals(1, and.getCardinality());
- assertTrue(and.contains(1 << 31));
- rr1.and(rr2);
- assertEquals(1, rr1.getCardinality());
- assertTrue(and.contains(1 << 31));
- }
-
- @Test
- public void sparseAndNot() {
- final RoaringBitmap rr1 = new RoaringBitmap();
- rr1.add(1);
- rr1.add(1 << 31);
- final RoaringBitmap rr2 = new RoaringBitmap();
- rr2.add(1 << 31);
- RoaringBitmap andNot = RoaringBitmap.andNot(rr1, rr2);
- assertEquals(1, andNot.getCardinality());
- assertTrue(andNot.contains(1));
- rr1.andNot(rr2);
- assertEquals(1, rr1.getCardinality());
- assertTrue(andNot.contains(1));
- }
-
- @Test
- public void sparseOr() {
- final RoaringBitmap rr1 = new RoaringBitmap();
- rr1.add(1);
- rr1.add(1 << 31);
- final RoaringBitmap rr2 = new RoaringBitmap();
- rr2.add(1 << 31);
- RoaringBitmap or = RoaringBitmap.or(rr1, rr2);
- assertEquals(2, or.getCardinality());
- assertTrue(or.contains(1));
- assertTrue(or.contains(1 << 31));
- rr1.or(rr2);
- assertEquals(2, rr1.getCardinality());
- assertTrue(or.contains(1));
- assertTrue(or.contains(1 << 31));
- }
-
-
- @Test
- public void sparseXor() {
- final RoaringBitmap rr1 = new RoaringBitmap();
- rr1.add(1);
- rr1.add(1 << 31);
- final RoaringBitmap rr2 = new RoaringBitmap();
- rr2.add(1 << 31);
- RoaringBitmap xor = RoaringBitmap.xor(rr1, rr2);
- assertEquals(1, xor.getCardinality());
- assertTrue(xor.contains(1));
- rr1.xor(rr2);
- assertEquals(1, rr1.getCardinality());
- assertTrue(xor.contains(1));
- }
-
- @Test
- public void testAndNot() {
- int[] array1 = {39173, 39174, 39175, 39176, 39177, 39178, 39179, 39180, 39181, 39182, 39183,
- 39184, 39185, 39186, 39187, 39188};
- int[] array2 = {14205};
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(array1);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(array2);
- RoaringBitmap answer = RoaringBitmap.andNot(rb1, rb2);
- assertEquals(answer.getCardinality(), array1.length);
- }
-
- @Test
- public void testAstesana() {
- RoaringBitmap r1 = new RoaringBitmap();
- // Strange thing: Replace this line by r1.add(131000) and the bug vanishes!
- r1.flip(131000L, 131001L);
- RoaringBitmap r2 = new RoaringBitmap();
- r2.add(220000);
- RoaringBitmap r3 = new RoaringBitmap();
- int killingPosition = 66000;
- r3.add(killingPosition);
- assertFalse(r1.contains(killingPosition)); // ok
- r2.or(r1);
- assertFalse(r1.contains(killingPosition)); // ok
- r2.or(r3);
- assertFalse(r1.contains(killingPosition)); // ko
- }
-
- @Test
- public void testCheckedAdd() {
- RoaringBitmap rb = new RoaringBitmap();
- // checking if the true value is well returned
- // when adding new ints
- for (int i = 0; i < 2 * (1 << 16); i += 2) {
- assertTrue(rb.checkedAdd(i));
- }
- for (int i = 1; i < 2 * (1 << 16); i += 2) {
- assertTrue(rb.checkedAdd(i));
- }
- // Checking if the false value is well returned
- // when adding already existing ints
- for (int i = 0; i < 2 * (1 << 16); i += 2) {
- assertFalse(rb.checkedAdd(i));
- }
- for (int i = 1; i < 2 * (1 << 16) + 1; i += 2) {
- assertFalse(rb.checkedAdd(i));
- }
- }
-
- @Test
- public void testCheckedRemove() {
- RoaringBitmap rb = new RoaringBitmap();
- // checking if the true value is well returned
- // when adding new ints
- for (int i = 0; i < 2 * (1 << 16); i++) {
- rb.add(i);
- }
- for (int i = 0; i < 2 * (1 << 16); i += 2) {
- assertTrue(rb.checkedRemove(i));
- }
- for (int i = 0; i < 2 * (1 << 16); i += 2) {
- assertFalse(rb.checkedRemove(i));
- }
- for (int i = 1; i < 2 * (1 << 16); i += 2) {
- assertTrue(rb.checkedRemove(i));
- }
- for (int i = 1; i < 2 * (1 << 16) + 1; i += 2) {
- assertFalse(rb.checkedRemove(i));
- }
- }
-
- @Test
- public void testContains() throws IOException {
- RoaringBitmap rbm1 = new RoaringBitmap();
- for (int k = 0; k < 1000; ++k) {
- rbm1.add(17 * k);
- }
- for (int k = 0; k < 17 * 1000; ++k) {
- assertEquals(rbm1.contains(k), (k / 17 * 17 == k));
- }
- }
-
- @Test
- public void testEqual() {
- RoaringBitmap rr1 = RoaringBitmap.bitmapOf(1, 2, 100000);
- RoaringBitmap rr2 = RoaringBitmap.bitmapOf(3, 4, 100001);
- RoaringBitmap rr3 = RoaringBitmap.bitmapOf(1, 2, 100000);
- assertEquals(rr1, rr3);
- assertNotEquals(rr1, rr2);
- assertNotEquals(rr3, rr2);
- }
-
- // tests for how range falls on container boundaries
-
- @Test
- public void testFlip() {
- RoaringBitmap rb = new RoaringBitmap();
- for (int i = 0; i < 1 << 20; ++i) {
- rb.flip(i);
- assertEquals(rb.getCardinality(), i + 1);
- }
- for (int i = (1 << 20) - 1; i >= 0; --i) {
- rb.flip(i);
- assertEquals(rb.getCardinality(), i);
- }
- }
-
- @Test
- public void testFlipBigInts() {
- RoaringBitmap rb = new RoaringBitmap();
- for (int i = 0; i < 1 << 20; ++i) {
- rb.flip((1 << 31) + i);
- assertEquals(rb.getCardinality(), i + 1);
- }
- for (int i = (1 << 20) - 1; i >= 0; --i) {
- rb.flip((1 << 31) + i);
- assertEquals(rb.getCardinality(), i);
- }
- }
-
-
- @Test
- public void testFlipOnEmpty() {
- RoaringBitmap r1 = new RoaringBitmap();
- r1.flip(0L, 10L);
- assertEquals(10, r1.getCardinality());
- }
-
- @Test
- public void testHash() {
- RoaringBitmap rbm1 = new RoaringBitmap();
- rbm1.add(17);
- RoaringBitmap rbm2 = new RoaringBitmap();
- rbm2.add(17);
- assertEquals(rbm1.hashCode(), rbm2.hashCode());
- rbm2 = rbm1.clone();
- assertEquals(rbm1.hashCode(), rbm2.hashCode());
- }
-
- @Test
- public void testHighBits() {
- for (int offset = 1 << 14; offset < 1 << 18; offset *= 2) {
- RoaringBitmap rb = new RoaringBitmap();
- for (long k = Integer.MIN_VALUE; k < Integer.MAX_VALUE; k += offset) {
- rb.add((int) k);
- }
- int cardinality = 0;
- for (long k = Integer.MIN_VALUE; k < Integer.MAX_VALUE; k += offset) {
- assertTrue(rb.contains((int) k));
- ++cardinality;
- }
- int[] array = rb.toArray();
- assertEquals(array.length, cardinality);
- for (int k = 0; k < array.length - 1; ++k) {
- assertTrue((0xFFFFFFFFL & array[k]) <= (0xFFFFFFFFL & array[k + 1]));
- }
- }
- }
-
- @Test
- public void testHorizontalOrCardinality() {
- int[] vals = {65535, 131071, 196607, 262143, 327679, 393215, 458751, 524287};
- final RoaringBitmap[] b = new RoaringBitmap[2];
- b[0] = RoaringBitmap.bitmapOf(vals);
- b[1] = RoaringBitmap.bitmapOf(vals);
- RoaringBitmap a = FastAggregation.or(new Iterator() {
- int k = 0;
-
- @Override
- public boolean hasNext() {
- return k < b.length;
- }
-
- @Override
- public RoaringBitmap next() {
- return b[k++];
- }
-
- @Override
- public void remove() {
- }
- });
- assertEquals(8, a.getCardinality());
- }
-
-
- @Test
- public void testHorizontalOrCardinalityBigInts() {
- int[] vals = {(1 << 31) + 65535, (1 << 31) + 131071, (1 << 31) + 196607, (1 << 31) + 262143, (1 << 31) + 327679, (1 << 31) + 393215, (1 << 31) + 458751, (1 << 31) + 524287};
- final RoaringBitmap[] b = new RoaringBitmap[2];
- b[0] = RoaringBitmap.bitmapOf(vals);
- b[1] = RoaringBitmap.bitmapOf(vals);
- RoaringBitmap a = FastAggregation.or(new Iterator() {
- int k = 0;
-
- @Override
- public boolean hasNext() {
- return k < b.length;
- }
-
- @Override
- public RoaringBitmap next() {
- return b[k++];
- }
-
- @Override
- public void remove() {
- }
- });
- assertEquals(8, a.getCardinality());
- }
-
-
- @Test
- public void testIterator() {
- RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rb.add(k);
- }
- for (int k = 0; k < 1000; ++k) {
- rb.add(k * 100);
- }
- RoaringBitmap copy1 = new RoaringBitmap();
- for (int x : rb) {
- copy1.add(x);
- }
- assertEquals(copy1, rb);
- RoaringBitmap copy2 = new RoaringBitmap();
- IntIterator i = rb.getIntIterator();
- while (i.hasNext()) {
- copy2.add(i.next());
- }
- assertEquals(copy2, rb);
- }
-
-
- @Test
- public void testIteratorBigInts() {
- RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 4000; ++k) {
- rb.add((1 << 31) + k);
- }
- for (int k = 0; k < 1000; ++k) {
- rb.add((1 << 31) + k * 100);
- }
- RoaringBitmap copy1 = new RoaringBitmap();
- for (int x : rb) {
- copy1.add(x);
- }
- assertEquals(copy1, rb);
- RoaringBitmap copy2 = new RoaringBitmap();
- IntIterator i = rb.getIntIterator();
- while (i.hasNext()) {
- copy2.add(i.next());
- }
- assertEquals(copy2, rb);
- }
-
-
- @Test
- public void testLimit() {
- for (int gap = 1; gap <= 1024; gap *= 2) {
- RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 100000; k += gap) {
- rb.add(k);
- }
- int thiscard = rb.getCardinality();
- for (int k = 0; k < thiscard; k += 100) {
- RoaringBitmap limited = rb.limit(k);
- assertEquals(limited.getCardinality(), k);
- }
- assertEquals(rb.limit(thiscard).getCardinality(), thiscard);
- assertEquals(rb.limit(thiscard + 1).getCardinality(), thiscard);
- }
- }
-
-
- @Test
- public void testLimitBigInts() {
- for (int gap = 1; gap <= 1024; gap *= 2) {
- RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 100000; k += gap) {
- rb.add((1 << 31) + k);
- }
- int thiscard = rb.getCardinality();
- for (int k = 0; k < thiscard; k += 100) {
- RoaringBitmap limited = rb.limit(k);
- assertEquals(limited.getCardinality(), k);
- }
- assertEquals(rb.limit(thiscard).getCardinality(), thiscard);
- assertEquals(rb.limit(thiscard + 1).getCardinality(), thiscard);
- }
- }
-
-
- /**
- * Test massive and.
- */
- @Test
- public void testMassiveAnd() {
- RoaringBitmap[] ewah = new RoaringBitmap[1024];
- for (int k = 0; k < ewah.length; ++k) {
- ewah[k] = new RoaringBitmap();
- }
- 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(13L, (long) howmany / 2);
- }
- for (int N = 2; N < ewah.length; ++N) {
- RoaringBitmap answer = ewah[0];
- for (int k = 1; k < N; ++k) {
- RoaringBitmap oldAnswer = answer;
- answer = RoaringBitmap.and(oldAnswer, ewah[k]);
- assertEquals(answer.getCardinality(),
- RoaringBitmap.andCardinality(oldAnswer, ewah[k]));
- }
- RoaringBitmap answer2 = FastAggregation.and(Arrays.copyOf(ewah, N));
- assertEquals(answer, answer2);
- RoaringBitmap answer2b = FastAggregation.and(toIterator(Arrays.copyOf(ewah, N)));
- assertEquals(answer, answer2b);
- }
- }
-
- @Test
- public void testMassiveAndBigInts() {
- RoaringBitmap[] ewah = new RoaringBitmap[1024];
- for (int k = 0; k < ewah.length; ++k) {
- ewah[k] = new RoaringBitmap();
- }
- int howmany = 1000000;
- for (int k = 0; k < howmany; ++k) {
- ewah[Math.abs(k + 2 * k * k) % ewah.length].add((1 << 31) + k);
- }
- for (int k = 3; k < ewah.length; k += 3) {
- ewah[k].flip((1L << 31) + 13L, (1L << 31) + (long) howmany / 2);
- }
- for (int N = 2; N < ewah.length; ++N) {
- RoaringBitmap answer = ewah[0];
- for (int k = 1; k < N; ++k) {
- RoaringBitmap oldAnswer = answer;
- answer = RoaringBitmap.and(oldAnswer, ewah[k]);
- assertEquals(answer.getCardinality(),
- RoaringBitmap.andCardinality(oldAnswer, ewah[k]));
- }
- RoaringBitmap answer2 = FastAggregation.and(Arrays.copyOf(ewah, N));
- assertEquals(answer, answer2);
- RoaringBitmap answer2b = FastAggregation.and(toIterator(Arrays.copyOf(ewah, N)));
- assertEquals(answer, answer2b);
- }
- }
-
- private static class ExtendedRoaringBitmap extends RoaringBitmap {
- }
-
- /**
- * Tests that the static #or operation works correctly with an iterator of
- * RoaringBitmap extended classes.
- */
- @Test
- public void testOrWithIterator() {
- final RoaringBitmap b1 = new RoaringBitmap();
- b1.add(13);
- final RoaringBitmap b2 = new RoaringBitmap();
- b2.add(42);
-
- final RoaringBitmap result = RoaringBitmap.or(Arrays.asList(b1, b2).iterator());
- assertTrue(result.contains(13));
- assertTrue(result.contains(42));
- }
-
- /**
- * Tests that the static #or operation works correctly with an iterator of
- * RoaringBitmap extended classes.
- */
- @Test
- public void testOrWithIteratorOfExtendedRoaringBitmaps() {
- final ExtendedRoaringBitmap b1 = new ExtendedRoaringBitmap();
- b1.add(1);
- final ExtendedRoaringBitmap b2 = new ExtendedRoaringBitmap();
- b2.add(2);
-
- final RoaringBitmap result = RoaringBitmap.or(Arrays.asList(b1, b2).iterator());
- assertTrue(result.contains(1));
- assertTrue(result.contains(2));
- }
-
- /**
- * Test massive or.
- */
- @Test
- public void testMassiveOr() {
- final int N = 128;
- for (int howmany = 512; howmany <= 1000000; howmany *= 2) {
- RoaringBitmap[] ewah = new RoaringBitmap[N];
- for (int k = 0; k < ewah.length; ++k) {
- ewah[k] = new RoaringBitmap();
- }
- 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(13L, (long) howmany / 2);
- }
- RoaringBitmap answer = ewah[0];
- for (int k = 1; k < ewah.length; ++k) {
- answer = RoaringBitmap.or(answer, ewah[k]);
- }
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(randomlists[0]);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(randomlists[1]);
- List rbl = new ArrayList<>();
- rbl.add(rb1);
- rbl.add(rb2);
-
- ArrayList arrayList = new ArrayList<>();
- arrayList.add(rb1);
- arrayList.add(rb2);
- Iterator rbi = arrayList.iterator();
-
- RoaringBitmap rbor = RoaringBitmap.or(rb1, rb2);
- RoaringBitmap answer2 = FastAggregation.or(ewah);
- RoaringBitmap answer3 = FastAggregation.horizontal_or(ewah);
- RoaringBitmap answer3b = FastAggregation.or(toIterator(ewah));
- assertEquals(answer, answer2);
- assertEquals(answer, answer3);
- assertEquals(answer, answer3b);
- assertEquals(rbor, FastAggregation.horizontal_or(rbl));
- assertEquals(rbor, FastAggregation.priorityqueue_or(rb1, rb2));
- assertEquals(rbor, FastAggregation.priorityqueue_or(rbi));
- }
- }
-
- @Test
- public void testMassiveOrBigInts() {
- final int N = 128;
- for (int howmany = 512; howmany <= 1000000; howmany *= 2) {
- RoaringBitmap[] ewah = new RoaringBitmap[N];
- for (int k = 0; k < ewah.length; ++k) {
- ewah[k] = new RoaringBitmap();
- }
- for (int k = 0; k < howmany; ++k) {
- ewah[Math.abs(k + 2 * k * k) % ewah.length].add((1 << 31) + k);
- }
- for (int k = 3; k < ewah.length; k += 3) {
- ewah[k].flip((1L << 31) + 13L, (1L << 31) + (long) howmany / 2);
- }
- RoaringBitmap answer = ewah[0];
- for (int k = 1; k < ewah.length; ++k) {
- answer = RoaringBitmap.or(answer, ewah[k]);
- }
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(randomlists[0]);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(randomlists[1]);
- List rbl = new ArrayList<>();
- rbl.add(rb1);
- rbl.add(rb2);
-
- ArrayList arrayList = new ArrayList<>();
- arrayList.add(rb1);
- arrayList.add(rb2);
- Iterator rbi = arrayList.iterator();
-
- RoaringBitmap rbor = RoaringBitmap.or(rb1, rb2);
- RoaringBitmap answer2 = FastAggregation.or(ewah);
- RoaringBitmap answer3 = FastAggregation.horizontal_or(ewah);
- RoaringBitmap answer3b = FastAggregation.or(toIterator(ewah));
- assertEquals(answer, answer2);
- assertEquals(answer, answer3);
- assertEquals(answer, answer3b);
- assertEquals(rbor, FastAggregation.horizontal_or(rbl));
- assertEquals(rbor, FastAggregation.priorityqueue_or(rb1, rb2));
- assertEquals(rbor, FastAggregation.priorityqueue_or(rbi));
- }
- }
-
-
- /**
- * Test massive xor.
- */
- @Test
- public void testMassiveXOr() {
- final int N = 128;
- for (int howmany = 512; howmany <= 1000000; howmany *= 2) {
- RoaringBitmap[] ewah = new RoaringBitmap[N];
- for (int k = 0; k < ewah.length; ++k) {
- ewah[k] = new RoaringBitmap();
- }
- 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(13L, (long) howmany / 2);
- }
-
- RoaringBitmap answer = ewah[0];
- for (int k = 1; k < ewah.length; ++k) {
- answer = RoaringBitmap.xor(answer, ewah[k]);
- }
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(randomlists[0]);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(randomlists[1]);
- RoaringBitmap rxor = FastAggregation.xor(rb1, rb2);
- RoaringBitmap answer2 = FastAggregation.xor(ewah);
- RoaringBitmap answer3 = FastAggregation.horizontal_xor(ewah);
- assertEquals(answer, answer2);
- assertEquals(answer, answer3);
- assertEquals(rxor, FastAggregation.priorityqueue_xor(rb1, rb2));
- }
- }
-
-
- @Test
- public void testMassiveXOrBigInts() {
- final int N = 128;
- for (int howmany = 512; howmany <= 1000000; howmany *= 2) {
- RoaringBitmap[] ewah = new RoaringBitmap[N];
- for (int k = 0; k < ewah.length; ++k) {
- ewah[k] = new RoaringBitmap();
- }
- for (int k = 0; k < howmany; ++k) {
- ewah[Math.abs(k + 2 * k * k) % ewah.length].add((1 << 31) + k);
- }
- for (int k = 3; k < ewah.length; k += 3) {
- ewah[k].flip((1L << 31) + 13L, (1L << 31) + (long) howmany / 2);
- }
-
- RoaringBitmap answer = ewah[0];
- for (int k = 1; k < ewah.length; ++k) {
- answer = RoaringBitmap.xor(answer, ewah[k]);
- }
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(randomlists[0]);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(randomlists[1]);
- RoaringBitmap rxor = FastAggregation.xor(rb1, rb2);
- RoaringBitmap answer2 = FastAggregation.xor(ewah);
- RoaringBitmap answer3 = FastAggregation.horizontal_xor(ewah);
- assertEquals(answer, answer2);
- assertEquals(answer, answer3);
- assertEquals(rxor, FastAggregation.priorityqueue_xor(rb1, rb2));
- }
- }
-
- @Test
- public void testOr001() {
- int[] array1 = {22871, 22873, 22876, 22880, 22886, 22889, 22893, 22897, 22901, 22905, 22910,
- 22915, 22919, 22927, 22934, 22940, 24750, 38579, 48470, 50533, 53256, 53717, 53752, 53802,
- 53938, 54727, 54865, 55202, 55815, 55822, 55940, 56711, 56977, 57122, 59933, 60037, 60402,
- 60520, 60853, 61163, 61340, 61549, 61632, 62097, 62373, 62961, 62993, 63031, 63075, 64209,
- 64644, 64762, 64893, 64927, 64997, 65117, 65128, 65173, 65201, 65472, 65536, 65622, 66092,
- 66162, 66302, 66381, 66551, 103979, 104644, 106866, 117285, 123372, 127548, 132167, 132168,
- 136283, 136433, 137661, 138019, 138239, 138380, 138816, 138916, 138933, 139414, 140342,
- 140914, 142751, 142994, 143895, 145081, 147331, 147686, 148021, 148375, 148587, 149114,
- 149734, 152696, 153608, 154741, 154932, 155263, 157121, 158947, 159444, 161102, 161383,
- 162735, 164298, 168043, 169398, 169536, 170419, 170846, 171153, 177016, 177471, 178305,
- 178673, 183731, 183936, 184083, 184106, 185663, 188371, 189495, 189531, 196189, 198419,
- 198758, 198796, 200645, 201137, 216865, 216936, 217770, 217810, 217836, 217909, 218569,
- 218700, 218931, 219363, 220009, 225925, 234706, 241183, 241561, 242140, 242281, 245018,
- 245056, 249935, 250442, 250615, 251696, 252825, 254178, 256788, 256906, 257289, 258833,
- 260432, 260563, 260930, 262684, 262834, 263128, 265919, 268662, 269542, 270217, 271673,
- 273776, 274560, 275649, 305458, 306241, 306550, 307580, 310891, 312701, 313514, 318134,
- 319185, 320757, 321280, 322046, 322743, 323211, 324667, 325382, 326450, 327159, 328836,
- 329075, 331179, 332836, 332997, 333071, 333205, 333488, 333595, 335045, 335803, 336417,
- 336610, 338487, 339827, 339992, 346123, 348858, 351257, 351957, 353896, 354559, 357142,
- 358253, 366662, 378768, 391984, 392282, 415077, 429446, 429449, 429452, 429453, 429476,
- 429480, 429486, 429492, 429497, 429501, 429504, 429505, 429510, 429515, 429519, 429524,
- 429530, 429533, 429541, 429546, 429553, 429554, 429564, 429572, 429577, 429579, 429586,
- 429589, 429596, 429604, 429606, 429612, 429615, 429616, 429624, 429632, 429639, 429642,
- 429646, 429651, 429656, 429664, 429670, 429674, 429678, 429681, 429686, 429695, 429701,
- 429706, 429717, 429721, 429725, 429733, 429736, 429739, 429743, 429748, 429754, 429761,
- 429767, 429772, 429780, 429791, 429792, 429793, 429794, 429795, 429817, 429822, 429823,
- 429831, 429836, 429842, 429849, 429855, 429859, 429863, 429866, 429873, 429876, 429882,
- 429885, 429900, 429903, 429913, 429921, 429923, 429927, 429932, 429939, 429947, 429950,
- 429955, 429964, 429968, 429974, 429982, 429987, 429993, 429999, 430003, 430011, 430015,
- 430023, 430028, 430033, 430039, 430044, 430048, 430053, 430057, 430059, 430063, 430068,
- 430073, 430077, 430082, 430086, 430093, 430098, 430101, 430114, 430120, 430126, 430131,
- 430135, 430139, 430144, 430149, 430155, 430157, 430167, 430175, 430181, 430186, 430194,
- 430195, 430196, 430214, 430223, 430228, 430236, 430253, 430258, 430263, 430269, 430277,
- 430284, 430288, 430293, 430297, 430303, 430309, 430316, 430321, 430332, 430338, 430343,
- 430346, 430348, 430355, 430358, 430369, 430375, 430384, 430391, 430397, 430410, 430415,
- 430420, 430424, 430430, 430435, 430437, 430445, 430449, 430461, 430467, 430473, 430482,
- 430486, 430490, 430496, 430500, 430506, 430511, 430515, 430535, 430539, 430550, 430568,
- 430575, 430581, 430588, 430591, 430596, 430605, 430612, 430617, 430625, 430629, 430633,
- 430638, 430643, 430649, 430656, 430663, 430666, 430672, 430679, 430684, 430692, 430696,
- 430700, 430707, 430716, 430723, 430728, 430733, 430745, 430751, 430755, 430759, 430767,
- 430770, 430782, 430787, 430791, 430804, 430810, 430814, 430821, 430825, 430829, 430833,
- 430838, 430844, 430849, 430852, 430859, 430864, 430867, 430870, 430877, 430881, 430887,
- 430891, 430896, 430901, 430907, 430912, 430917, 430923, 430927, 430932, 430936, 430944,
- 430947, 430953, 430959, 430967, 430971, 430979, 430985, 430989, 430993, 430997, 431003,
- 431006, 431015, 431021, 431022, 431033, 431039, 431046, 431050, 431054, 431059, 431065,
- 431069, 431074, 431081, 431085, 431092, 431097, 431104, 431110, 431120, 431125, 431133,
- 431138, 431142, 431147, 431157, 431164, 431171, 431175, 431180, 431186, 431190, 431195,
- 431207, 431213, 431218, 431220, 431224, 431228, 431233, 431235, 431240, 431245, 431251,
- 431259, 431264, 431271, 431272, 431280, 431287, 431294, 431299, 431307, 431315, 431319,
- 431324, 431330, 431334, 431339, 431345, 431352, 431356, 431363, 431375, 431379, 431383,
- 431388, 431393, 431398, 431405, 431409, 431416, 431422, 431426, 431433, 431438, 431444,
- 431451, 431455, 431464, 431469, 431472, 431477, 431483, 431490, 431496, 431506, 431513,
- 431516, 431521, 431526, 431534, 431536, 431545, 431550, 431559, 431564, 431571, 431573,
- 431579, 431584, 431587, 431592, 431604, 431614, 431624, 431629, 431634, 431638, 431645,
- 431651, 431659, 431663, 431674, 431678, 431684, 431692, 431696, 431700, 431706, 431712,
- 431719, 431723, 431729, 431736, 431741, 431747, 431755, 431758, 431762, 431767, 431777,
- 431782, 431787, 431791, 431796, 431799, 431805, 431809, 431814, 431819, 431823, 431828,
- 431832, 431838, 431842, 431849, 431853, 431858, 431862, 431866, 431869, 431874, 431881,
- 431887, 431894, 431900, 431906, 431912, 431917, 431925, 431931, 431936, 431943, 431948,
- 431956, 431958, 431964, 431971, 431976, 431981, 431988, 431994, 431998, 432008, 432012,
- 432024, 432029, 432033, 432038, 432045, 432048, 432058, 432062, 432066, 432070, 432076,
- 432077, 432087, 432093, 432098, 432104, 432114, 432123, 432128, 432133, 432139, 432145,
- 432151, 432161, 432168, 432177, 432181, 432188, 432189, 432203, 432209, 432216, 432222,
- 432227, 432232, 432242, 432247, 432256, 432259, 432264, 432269, 432271, 432277, 432286,
- 432294, 432297, 432302, 432308, 432313, 432319, 432326, 432331, 432337, 432345, 432349,
- 432353, 432356, 432361, 432366, 432370, 432378, 432384, 432390, 432391, 432397, 432400,
- 432403, 432408, 432413, 432419, 432422, 432427, 432433, 432440, 432443, 432450, 432455,
- 432460, 432466, 432467, 432481, 432489, 432493, 432498, 432504, 432511, 432513, 432517,
- 432525, 432531, 432537, 432544, 432546, 432555, 432561, 432565, 432569, 432574, 432579,
- 432586, 432590, 432597, 432605, 432611, 432619, 432626, 432630, 432637, 432644, 432646,
- 432653, 432654, 432664, 432670, 432674, 432679, 432682, 432687, 432694, 432706, 432711,
- 432714, 432721, 432726, 432732, 432741, 432747, 432753, 432755, 432761, 432764, 432768,
- 432774, 432779, 432784, 432792, 432798, 432801, 432808, 432815, 432823, 432825, 432833,
- 432838, 432842, 432847, 432853, 432861, 432866, 432873, 432879, 432889, 432895, 432901,
- 432906, 432913, 432917, 432920, 432926, 432935, 432940, 432949, 432953, 432958, 432960,
- 432966, 432967, 432968, 432969, 432970, 432971, 432972, 432996, 432999, 433004, 433010,
- 433020, 433026, 433029, 433033, 433042, 433045, 433050, 433054, 433058, 433062, 433065,
- 433070, 433076, 433086, 433095, 433101, 433102, 433116, 433122, 433129, 433132, 433140,
- 433146, 433151, 433157, 433163, 433169, 433176, 433181, 433188, 433198, 433204, 433219,
- 433229, 433236, 433240, 433246, 433250, 433259, 433263, 433274, 433277, 433282, 433286,
- 433291, 433295, 433299, 433306, 433316, 433318, 433322, 433327, 433335, 433342, 433348,
- 433351, 433359, 433362, 433367, 433371, 433377, 433384, 433393, 433398, 433403, 433407,
- 433411, 433425, 433430, 433437, 433441, 433445, 433452, 433453, 433458, 433462, 433469,
- 433473, 433478, 433484, 433490, 433495, 433501, 433506, 433514, 433517, 433521, 433527,
- 433534, 433544, 433549, 433552, 433561, 433565, 433569, 433576, 433585, 433589, 433594,
- 433597, 433600, 433603, 433606, 433613, 433619, 433623, 433627, 433639, 433643, 433648,
- 433654, 433658, 433665, 433673, 433678, 433681, 433689, 433696, 433704, 433709, 433716,
- 433721, 433725, 433729, 433734, 433738, 433744, 433749, 433755, 433760, 433766, 433771,
- 433776, 433781, 433785, 433790, 433798, 433803, 433810, 433814, 433817, 433822, 433828,
- 433833, 433837, 433843, 433849, 433852, 433858, 433863, 433871, 433875, 433881, 433883,
- 433884, 433897, 433903, 433909, 433913, 433921, 433926, 433932, 433936, 433942, 433946,
- 433951, 433959, 433965, 433976, 433981, 433989, 433996, 434004, 434011, 434013, 434019,
- 434023, 434029, 434036, 434041, 434048, 434050, 434056, 434060, 434068, 434074, 434079,
- 434085, 434091, 434096, 434100, 434105, 434110, 434119, 434123, 434129, 434133, 434139,
- 434146, 434150, 434156, 434161, 434168, 434173, 434183, 434188, 434193, 434200, 434208,
- 434213, 434219, 434223, 434229, 434235, 434241, 434247, 434258, 434262, 434269, 434275,
- 434282, 434287, 434291, 434296, 434303, 434308, 434313, 434316, 434323, 434327, 434335,
- 434342, 434349, 434353, 434360, 434366, 434372, 434373, 434381, 434387, 434392, 434397,
- 434401, 434403, 434409, 434414, 434420, 434427, 434433, 434440, 434445, 434449, 434454,
- 434460, 434467, 434473, 434479, 434481, 434490, 434494, 434501, 434505, 434510, 434517,
- 434526, 434537, 434542, 434548, 434553, 434558, 434563, 434569, 434574, 434580, 434586,
- 434588, 434595, 434603, 434606, 434617, 434620, 434626, 434630, 434638, 434644, 434647,
- 434651, 434658, 434666, 434671, 434679, 434681, 434685, 434692, 434699, 434703, 434708,
- 434713, 434720, 434723, 434729, 434734, 434738, 434742, 434746, 434753, 434762, 434766,
- 434773, 434781, 434790, 434799, 434805, 434810, 434814, 434823, 434831, 434839, 434845,
- 434850, 434856, 434859, 434863, 434869, 434870, 434882, 434890, 434896, 434899, 434906,
- 434912, 434917, 434921, 434930, 434935, 434940, 434945, 434949, 434956, 434961, 434967,
- 434977, 434982, 434987, 434992, 434995, 435002, 435005, 435009, 435016, 435021, 435025,
- 435028, 435034, 435041, 435050, 435055, 435065, 435069, 435075, 435078, 435083, 435091,
- 435097, 435102, 435105, 435107, 435113, 435118, 435124, 435131, 435141, 435144, 435150,
- 435154, 435159, 435167, 435171, 435177, 435181, 435187, 435192, 435198, 435204, 435211,
- 435212, 435221, 435228, 435231, 435237, 435244, 435246, 435254, 435258, 435264, 435275,
- 435283, 435289, 435301, 435304, 435312, 435318, 435323, 435329, 435334, 435340, 435343,
- 435347, 435351, 435358, 435363, 435368, 435375, 435382, 435388, 435391, 435396, 435399,
- 435405, 435412, 435416, 435422, 435425, 435429, 435437, 435444, 435447, 435453, 435458,
- 435470, 435477, 435486, 435491, 435497, 435500, 435511, 435516, 435520, 435526, 435533,
- 435539, 435545, 435551, 435559, 435564, 435569, 435575, 435579, 435585, 435590, 435597,
- 435599, 435600, 435610, 435616, 435618, 435623, 435628, 435636, 435643, 435649, 435654,
- 435659, 435663, 435671, 435675, 435678, 435683, 435689, 435702, 435705, 435712, 435718,
- 435749, 435755, 435759, 435764, 435771, 435775, 435780, 435785, 435791, 435794, 435802,
- 435811, 435816, 435822, 435828, 435833, 435838, 435844, 435851, 435859, 435861, 435866,
- 435869, 435876, 435882, 435890, 435897, 435900, 435908, 435913, 435923, 435929, 435934,
- 435937, 435942, 435945, 435951, 435953, 435959, 435965, 435969, 435975, 435982, 435987,
- 435992, 436000, 436008, 436013, 436017, 436022, 436027, 436033, 436038, 436043, 436048,
- 436052, 436062, 436065, 436069, 436073, 436079, 436088, 436092, 436100, 436106, 436116,
- 436123, 436127, 436133, 436139, 436147, 436153, 436159, 436165, 436172, 436179, 436184,
- 436190, 436194, 436199, 436206, 436210, 436211, 436217, 436223, 436229, 436234, 436240,
- 436245, 436253, 436258, 436262, 436268, 436273, 436282, 436287, 436294, 436303, 436306,
- 436313, 436316, 436321, 436329, 436337, 436341, 436349, 436353, 436358, 436365, 436368,
- 436373, 436378, 436387, 436391, 436396, 436401, 436408, 436412, 436420, 436423, 436428,
- 436435, 436441, 436447, 436451, 436461, 436463, 436467, 436471, 436477, 436479, 436485,
- 436489, 436494, 436502, 436509, 436512, 436518, 436529, 436538, 436543, 436552, 436553,
- 436560, 436564, 436569, 436575, 436580, 436585, 436591, 436597, 436603, 436605, 436610,
- 436616, 436619, 436628, 436633, 436637, 436640, 436644, 436649, 436653, 436659, 436666,
- 436674, 436681, 436687, 436694, 436700, 436703, 436710, 436720, 436723, 436730, 436735,
- 436742, 436748, 436756, 436761, 436766, 436772, 436778, 436783, 436787, 436792, 436799,
- 436808, 436810, 436812, 436817, 436823, 436832, 436838, 436845, 436849, 436853, 436859,
- 436865, 436872, 436878, 436882, 436885, 436891, 436898, 436903, 436910, 436911, 436922,
- 436928, 436932, 436939, 436942, 436948, 436950, 436956, 436963, 436968, 436975, 436984,
- 436988, 436994, 437003, 437009, 437013, 437020, 437023, 437028, 437033, 437043, 437053,
- 437058, 437063, 437073, 437076, 437079, 437089, 437093, 437095, 437101, 437111, 437119,
- 437121, 437127, 437135, 437140, 437147, 437151, 437155, 437160, 437165, 437171, 437173,
- 437180, 437186, 437194, 437199, 437205, 437213, 437217, 437223, 437227, 437231, 437243,
- 437250, 437256, 437261, 437267, 437271, 437277, 437284, 437289, 437295, 437300, 437304,
- 437312, 437322, 437326, 437333, 437338, 437354, 437357, 437362, 437366, 437370, 437374,
- 437380, 437386, 437391, 437395, 437399, 437404, 437412, 437416, 437419, 437427, 437432,
- 437433, 437451, 437456, 437461, 437467, 437468, 437477, 437485, 437492, 437495, 437501,
- 437502, 437506, 437513, 437524, 437526, 437539, 437544, 437552, 437558, 437562, 437568,
- 437573, 437578, 437587, 437592, 437596, 437600, 437605, 437610, 437619, 437625, 437630,
- 437631, 437639, 437647, 437648, 437655, 437661, 437667, 437672, 437676, 437680, 437687,
- 437689, 437693, 437697, 437704, 437707, 437716, 437723, 437730, 437737, 437740, 437741,
- 437757, 437763, 437771, 437778, 437784, 437789, 437793, 437800, 437804, 437811, 437812,
- 437819, 437823, 437827, 437833, 437841, 437844, 437853, 437857, 437861, 437866, 437874,
- 437881, 437886, 437892, 437901, 437902, 437909, 437914, 437922, 437928, 437934, 437939,
- 437948, 437951, 437957, 437963, 437965, 437971, 437980, 437985, 437990, 437996, 438002,
- 438008, 438013, 438017, 438025, 438030, 438036, 438041, 438052, 438060, 438065, 438072,
- 438073, 438079, 438084, 438091, 438097, 438099, 438107, 438111, 438119, 438125, 438136,
- 438144, 438148, 438153, 438158, 438164, 438166, 438173, 438176, 438183, 438184, 438192,
- 438198, 438204, 438209, 438216, 438228, 438231, 438237, 438243, 438248, 438257, 438267,
- 438269, 438274, 438282, 438287, 438295, 438301, 438306, 438313, 438318, 438323, 438328,
- 438335, 438339, 438346, 438352, 438357, 438363, 438370, 438374, 438380, 438384, 438388,
- 438394, 438399, 438404, 438409, 438413, 438422, 438428, 438436, 438439, 438444, 438453,
- 438461, 438471, 438477, 438483, 438491, 438503, 438505, 438511, 438518, 438527, 438531,
- 438541, 438546, 438552, 438556, 438562, 438566, 438570, 438580, 438585, 438593, 438595,
- 438603, 438605, 438607, 438614, 438619, 438626, 438631, 438634, 438641, 438646, 438652,
- 438657, 438663, 438664, 438665, 438673, 438677, 438682, 438692, 438700, 438706, 438708,
- 438715, 438723, 438727, 438737, 438742, 438753, 438760, 438764, 438771, 438775, 438780,
- 438783, 438789, 438797, 438806, 438810, 438815, 438832, 438837, 438841, 438845, 438852,
- 438860, 438865, 438873, 438883, 438884, 438896, 438908, 438912, 438920, 438924, 438927,
- 438934, 438936, 438940, 438946, 438953, 438961, 438968, 438976, 438980, 438985, 438994,
- 439006, 439011, 439017, 439021, 439027, 439032, 439036, 439043, 439047, 439055, 439059,
- 439065, 439070, 439075, 439083, 439087, 439093, 439099, 439104, 439109, 439114, 439120,
- 439123, 439128, 439130, 439134, 439139, 439147, 439157, 439162, 439167, 439172, 439178,
- 439183, 439187, 439194, 439201, 439205, 439210, 439216, 439222, 439225, 439231, 439235,
- 439245, 439251, 439255, 439261, 439277, 439282, 439288, 439295, 439302, 439308, 439309,
- 439314, 439320, 439328, 439332, 439339, 439345, 439350, 439354, 439359, 439365, 439372,
- 439377, 439379, 439386, 439391, 439404, 439410, 439416, 439419, 439425, 439430, 439434,
- 439438, 439455, 439461, 439465, 439472, 439476, 439482, 439488, 439493, 439496, 439506,
- 439510, 439516, 439521, 439527, 439536, 439543, 439551, 439554, 439557, 439564, 439569,
- 439574, 439577, 439584, 439588, 439593, 439597, 439602, 439607, 439613, 439618, 439624,
- 439625, 439633, 439638, 439641, 439645, 439650, 439655, 439659, 439669, 439670, 439671,
- 439682, 439692, 439696, 439701, 439709, 439718, 439725, 439730, 439733, 439739, 439745,
- 439757, 439764, 439768, 439771, 439778, 439783, 439788, 439796, 439805, 439811, 439815,
- 439820, 439827, 439830, 439840, 439846, 439850, 439854, 439865, 439873, 439879, 439886,
- 439891, 439898, 439903, 439909, 439917, 439925, 439928, 439933, 439938, 439944, 439948,
- 439955, 439959, 439965, 439969, 439974, 439988, 439989, 440005, 440008, 440011, 440015,
- 440020, 440026, 440030, 440035, 440043, 440044, 440055, 440060, 440078, 440091, 440096,
- 440101, 440106, 440111, 440116, 440120, 440134, 440139, 440143, 440149, 440157, 440163,
- 440167, 440171, 440179, 440187, 440191, 440196, 440201, 440207, 440213, 440218, 440223,
- 440228, 440233, 440239, 440244, 440249, 440256, 440262, 440268, 440274, 440277, 440282,
- 440289, 440295, 440307, 440311, 440315, 440321, 440327, 440331, 440336, 440341, 440346,
- 440355, 440361, 440368, 440375, 440379, 440388, 440394, 440399, 440402, 440410, 440413,
- 440421, 440427, 440431, 440435, 440440, 440446, 440454, 440461, 440467, 440476, 440481,
- 440486, 440490, 440495, 440500, 440506, 440512, 440523, 440529, 440533, 440539, 440546,
- 440552, 440560, 440568, 440578, 440584, 440590, 440594, 440598, 440606, 440612, 440620,
- 440623, 440629, 440634, 440641, 440647, 440651, 440655, 440663, 440669, 440674, 440682,
- 440689, 440694, 440698, 440702, 440706, 440713, 440719, 440727, 440733, 440737, 440743,
- 440747, 440753, 440760, 440767, 440772, 440779, 440783, 440789, 440792, 440798, 440806,
- 440808, 440812, 440819, 440823, 440826, 440830, 440835, 440840, 440845, 440853, 440856,
- 440861, 440867, 440872, 440876, 440882, 440888, 440893, 440903, 440910, 440915, 440921,
- 440927, 440933, 440938, 440945, 440950, 440958, 440966, 440969, 440973, 440977, 440983,
- 440987, 440992, 440996, 441005, 441008, 441013, 441028, 441035, 441042, 441047, 441052,
- 441056, 441061, 441068, 441075, 441080, 441087, 441094, 441097, 441106, 441111, 441115,
- 441121, 441125, 441132, 441136, 441143, 441150, 441157, 441161, 441167, 441171, 441175,
- 441179, 441185, 441193, 441196, 441200, 441204, 441210, 441216, 441223, 441226, 441234,
- 441238, 441243, 441253, 441260, 441268, 441276, 441287, 441294, 441297, 441306, 441313,
- 441315, 441323, 441332, 441339, 441346, 441353, 441358, 441362, 441368, 441373, 441378,
- 441382, 441390, 441394, 441399, 441404, 441411, 441416, 441420, 441427, 441432, 441440,
- 441445, 441448, 441453, 441456, 441461, 441467, 441473, 441479, 441484, 441491, 441497,
- 441506, 441509, 441515, 441521, 441526, 441531, 441535, 441542, 441547, 441551, 441555,
- 441559, 441565, 441569, 441574, 441579, 441596, 441599, 441605, 441610, 441617, 441619,
- 441623, 441628, 441630, 441636, 441637, 441651, 441652, 441662, 441664, 441667, 441671,
- 441681, 441684, 441689, 441693, 441701, 441705, 441710, 441718, 441720, 441726, 441740,
- 441746, 441757, 441759, 441766, 441773, 441775, 441780, 441793, 441794, 441799, 441807,
- 441817, 441822, 441828, 441831, 441834, 441838, 441845, 441853, 441857, 441863, 441866,
- 441872, 441880, 441883, 441886, 441891, 441895, 441900, 441910, 441915, 441921, 441928,
- 441934, 441939, 441945, 441947, 441952, 441957, 441964, 441971, 441974, 441980, 441985,
- 441990, 441994, 441998, 442002, 442007, 442010, 442017, 442019, 442027, 442043, 442046,
- 442054, 442060, 442067, 442074, 442076, 442081, 442086, 442093, 442099, 442103, 442108,
- 442112, 442120, 442131, 442135, 442139, 442144, 442148, 442156, 442161, 442165, 442170,
- 442181, 442186, 442192, 442197, 442203, 442220, 442226, 442233, 442239, 442245, 442249,
- 442254, 442259, 442267, 442275, 442281, 442284, 442287, 442292, 442299, 442308, 442314,
- 442318, 442325, 442332, 442333, 442334, 442346, 442351, 442354, 442358, 442364, 442370,
- 442372, 442377, 442381, 442389, 442397, 442402, 442409, 442415, 442419, 442424, 442430,
- 442438, 442443, 442451, 442459, 442470, 442473, 442482, 442490, 442496, 442501, 442506,
- 442514, 442520, 442524, 442530, 442534, 442541, 442546, 442549, 442554, 442558, 442563,
- 442573, 442586, 442591, 442595, 442600, 442607, 442613, 442618, 442624, 442628, 442632,
- 442640, 442647, 442651, 442657, 442666, 442674, 442679, 442682, 442686, 442692, 442699,
- 442705, 442714, 442718, 442722, 442729, 442734, 442739, 442748, 442751, 442754, 442757,
- 442765, 442770, 442778, 442783, 442792, 442798, 442802, 442813, 442820, 442829, 442833,
- 442841, 442845, 442851, 442857, 442860, 442865, 442871, 442877, 442882, 442886, 442892,
- 442898, 442904, 442906, 442911, 442915, 442922, 442929, 442934, 442940, 442944, 442946,
- 442952, 442956, 442963, 442971, 442973, 442979, 442985, 442997, 443001, 443006, 443017,
- 443019, 443024, 443027, 443036, 443046, 443050, 443057, 443066, 443069, 443078, 443083,
- 443089, 443093, 443100, 443104, 443109, 443118, 443126, 443134, 443141, 443146, 443151,
- 443158, 443164, 443169, 443174, 443179, 443182, 443189, 443195, 443198, 443206, 443211,
- 443213, 443214, 443222, 443224, 443228, 443235, 443240, 443246, 443255, 443259, 443269,
- 443270, 443277, 443285, 443291, 443299, 443303, 443311, 443313, 443319, 443322, 443328,
- 443338, 443342, 443350, 443351, 443356, 443362, 443365, 443368, 443371, 443375, 443378,
- 443384, 443388, 443391, 443397, 443404, 443412, 443416, 443421, 443424, 443428, 443433,
- 443438, 443442, 443449, 443462, 443463, 443470, 443474, 443482, 443490, 443495, 443499,
- 443506, 443519, 443523, 443527, 443533, 443540, 443548, 443550, 443556, 443559, 443564,
- 443568, 443574, 443582, 443589, 443594, 443596, 443602, 443610, 443612, 443616, 443620,
- 443625, 443631, 443638, 443643, 443649, 443656, 443660, 443669, 443672, 443680, 443691,
- 443695, 443699, 443706, 443710, 443714, 443718, 443721, 443726, 443734, 443739, 443745,
- 443752, 443758, 443765, 443771, 443774, 443781, 443786, 443789, 443793, 443797, 443802,
- 443811, 443812, 443820, 443829, 443832, 443838, 443847, 443851, 443856, 443857, 443864,
- 443871, 443877, 443886, 443892, 443896, 443903, 443909, 443913, 443920, 443925, 443930,
- 443935, 443942, 443946, 443954, 443963, 443966, 443969, 443975, 443979, 443982, 443988,
- 443996, 443999, 444003, 444007, 444012, 444019, 444026, 444030, 444040, 444049, 444056,
- 444060, 444064, 444069, 444073, 444075, 444078, 444083, 444091, 444098, 444103, 444111,
- 444121, 444124, 444130, 444136, 444140, 444145, 444150, 444156, 444162, 444168, 444172,
- 444179, 444182, 444186, 444189, 444193, 444198, 444203, 444208, 444212, 444218, 444225,
- 444231, 444234, 444240, 444246, 444258, 444265, 444273, 444277, 444281, 444288, 444292,
- 444298, 444301, 444309, 444314, 444319, 444327, 444332, 444338, 444349, 444354, 444359,
- 444364, 444374, 444377, 444381, 444386, 444388, 444394, 444401, 444406, 444417, 444422,
- 444429, 444438, 444439, 444448, 444449, 444456, 444461, 444467, 444473, 444480, 444486,
- 444490, 444495, 444500, 444503, 444508, 444514, 444518, 444525, 444528, 444535, 444540,
- 444544, 444550, 444556, 444563, 444570, 444576, 444580, 444583, 444587, 444591, 444599,
- 444605, 444608, 444612, 444619, 444629, 444635, 444643, 444646, 444652, 444660, 444671,
- 444676, 444681, 444686, 444690, 444696, 444703, 444710, 444711, 444720, 444723, 444734,
- 444742, 444752, 444758, 444763, 444767, 444770, 444774, 444786, 444789, 444794, 444800,
- 444809, 444818, 444822, 444830, 444836, 444841, 444846, 444853, 444859, 444866, 444873,
- 444878, 444885, 444890, 444896, 444904, 444907, 444914, 444922, 444924, 444931, 446357,
- 488475, 495304, 496119, 497438, 498593, 498603, 498917, 499048, 499713, 500776, 501348,
- 503424, 508844, 518359, 519305, 519446, 523627, 523776, 523878, 523902, 524135, 524329,
- 524515, 524611, 524686, 524798, 524852, 525209, 525700, 525913, 525954, 526158, 526332,
- 526356, 536810, 537279, 563933, 578719, 579248, 579791, 584191, 591485, 592871, 613176,
- 615012, 616428, 619153, 636103, 640708, 643141, 645080, 646349, 647043, 649345, 651085,
- 652849, 653092, 653169, 653227, 653586, 655241, 656093, 658355, 658564, 659381, 659518,
- 690513, 693218, 693746, 694340, 694842, 695155, 695563, 695776, 696380, 697608, 697797,
- 698222, 698835, 699307, 700154, 700203, 700235, 700404, 700806, 700900, 701796, 702155,
- 702956, 702998, 705105, 705377, 705631, 708650, 709265, 709787, 725122, 735376, 737115,
- 737174, 738005, 741377, 741986, 746045, 746404, 746590, 748212, 753574, 754379, 764728,
- 765776, 766863, 769126, 782626, 782723, 783529, 786875, 787544, 807281, 811132, 821933,
- 822194, 829768, 830997, 831095, 832481, 834082, 844664, 845574, 845764, 846820, 849481,
- 855607, 857775, 872350, 876126, 902029, 903509, 904449, 904469, 905915, 910463, 911856,
- 924365, 928664, 929314, 929606, 929983, 930478, 933195, 933819, 935628, 935911, 935922,
- 936002, 937668, 941895, 942677, 943721, 944661, 944980, 945121, 945268, 945360, 950756,
- 951007, 959993, 960787, 961048, 961084, 961238, 961589, 962000, 962797, 962827, 962910,
- 963788, 964272, 964343, 964431, 964573, 964949, 965017, 965036, 965041, 965598, 965674,
- 965957, 966014, 966032, 966092, 966144, 966226, 966234, 966265, 966291, 978103, 980858,
- 987212, 987458, 987498, 988368, 988513, 988939, 990571, 993183, 1005493, 1007972, 1008230,
- 1009675, 1010075, 1010685, 1011441, 1011828, 1012269, 1012310, 1013612, 1013907, 1014379,
- 1018659, 1018923, 1022035, 1024567, 1024568, 1025024, 1026699, 1027212, 1027840, 1029108,
- 1031846, 1032670, 1032970, 1034016, 1039255, 1040626, 1040796, 1043457, 1043632, 1051053,
- 1052581, 1091611, 1092316, 1092564, 1092634, 1096386, 1096820, 1098606, 1104201, 1107101,
- 1110019, 1111384, 1111707, 1128990, 1129111, 1129147, 1129160, 1129367, 1129408, 1129508,
- 1129577, 1129699, 1129750, 1129840, 1129951, 1129988, 1130041, 1130139, 1130177, 1130241,
- 1130248, 1130268, 1130276, 1130367, 1130540, 1130562, 1130636, 1130637, 1130662, 1130716,
- 1131139, 1131218, 1131250, 1131454, 1131541, 1131775, 1132208, 1132280, 1132901, 1133264,
- 1133474, 1133475, 1133764, 1133841, 1133988, 1134290, 1134533, 1134553, 1134614, 1134667,
- 1134710, 1134861, 1134896, 1135008, 1135178, 1135544, 1135551, 1135573, 1136260, 1136385,
- 1136458, 1136782, 1136960, 1137342, 1137713, 1137824, 1138160, 1138291, 1138340, 1138457,
- 1138468, 1138516, 1138526, 1138610, 1138648, 1138700, 1138801, 1138869, 1138999, 1139010,
- 1139102, 1139114, 1139145, 1139302, 1139322, 1139417, 1139496, 1139581, 1139668, 1139852,
- 1139930, 1139958, 1140325, 1140616, 1140811, 1140861, 1141056, 1141197, 1141311, 1141346,
- 1141551, 1141666, 1141735, 1141786, 1141895, 1142017, 1142228, 1142242, 1142415, 1142484,
- 1142579, 1142599, 1142867, 1142929, 1143057, 1143132, 1143191, 1143203, 1143293, 1143476,
- 1143860, 1143997, 1144044, 1144321, 1144338, 1144459, 1144548, 1144564, 1144588, 1144592,
- 1144606, 1144623, 1144718, 1144792, 1144906, 1144997, 1145007, 1145082, 1145274, 1145380,
- 1145430, 1145584, 1145731, 1145778, 1145869, 1145914, 1145925, 1146025, 1146158, 1146212,
- 1146223, 1146448, 1146594, 1146663, 1146761, 1146803, 1146826, 1146833, 1146898, 1147078,
- 1147099, 1147330, 1147382, 1147424, 1147431, 1147472, 1147545, 1147592, 1147627, 1147657,
- 1147742, 1148005, 1148699, 1155013, 1155166, 1155915, 1178902, 1179255, 1180871, 1184802,
- 1187587, 1190670, 1198632, 1198646, 1198832, 1199211, 1199259, 1199330, 1200318, 1200824,
- 1200959, 1201200, 1202513, 1210077, 1210208, 1210296, 1211774, 1211775, 1211776, 1211777,
- 1212528, 1212529, 1212843, 1216377, 1219904, 1220650, 1232492, 1235492, 1243381, 1243807,
- 1267467, 1267561, 1267615, 1267691, 1267708, 1267731, 1267797, 1273165, 1278015, 1278076,
- 1278615, 1279032, 1279185, 1279756, 1281009, 1281074, 1282368, 1284002, 1284572, 1285041,
- 1285278, 1285788, 1285969, 1286573, 1286679, 1287001, 1287466, 1287714, 1287819, 1288542,
- 1288897, 1289486, 1290086, 1290286, 1291047, 1291363, 1291498, 1291749, 1291853, 1292129,
- 1292571, 1292828, 1292855, 1292859, 1292892, 1292893, 1292909, 1292910, 1292956, 1292957,
- 1292985, 1293133, 1293185, 1293926, 1294446, 1294490, 1294571, 1294966, 1295003, 1295395,
- 1295491, 1296604, 1298327, 1298527, 1298685, 1300235, 1300501, 1301193, 1301345, 1301536,
- 1301908, 1301969, 1301988, 1302146, 1302158, 1302810, 1303060, 1303244, 1303275, 1303487,
- 1303721, 1303831, 1303943, 1304875, 1305210, 1305677, 1305687, 1306397, 1306865, 1307044,
- 1307745, 1307926, 1308080, 1308680, 1309204, 1309475, 1310596, 1312574, 1313313, 1313764,
- 1313792, 1313963, 1314093, 1314284, 1314743, 1315154, 1315292, 1315503, 1315994, 1316517,
- 1316872, 1316909, 1317089, 1317327, 1318223, 1319657, 1321070, 1321083, 1321495, 1321517,
- 1322195, 1322221, 1322293, 1322330, 1322471, 1322496, 1322569, 1322634, 1322716, 1322859,
- 1323066, 1323356, 1323530, 1323539, 1323614, 1323868, 1323925, 1328650, 1329210, 1332937,
- 1333431, 1335482, 1338092, 1342268, 1345890, 1346245, 1346532, 1346613, 1346783, 1347371,
- 1347858, 1348077, 1348468, 1349166, 1349298, 1349335, 1350775, 1350809, 1351329, 1352877};
- int[] array2 = {14402, 14403, 14404, 14405, 14406, 14407, 23246, 23247, 23248, 23249, 23250,
- 23936, 23937, 23938, 23939, 23940, 23941, 23942, 29721, 29722, 29723, 29724, 29725, 30226,
- 30227, 30228, 30229, 30230, 32141, 32142, 32143, 47737, 47738, 47739, 47740, 47741, 47742,
- 47743, 47744, 47745, 47746, 47747, 47748, 47749, 47750, 47751, 47752, 68770, 68771, 68772,
- 68773, 68774, 68775, 68776, 68777, 68778, 68779, 68780, 72301, 72302, 83071, 83072, 83073,
- 83074, 85302, 85303, 85304, 85305, 85306, 85307, 85308, 85309, 85310, 85311, 85312, 85313,
- 85314, 85315, 85316, 97108, 97109, 97110, 97111, 103442, 103443, 103444, 103445, 103446,
- 103447, 103448, 103449, 103450, 103451, 103452, 103453, 103454, 103455, 103456, 103457,
- 103458, 103459, 103460, 103461, 103462, 103463, 103464, 103465, 103466, 103467, 103468,
- 103469, 128488, 128489, 128490, 128491, 128492, 128493, 135003, 135004, 135005, 135006,
- 135007, 135008, 135009, 135010, 135011, 135012, 135013, 135014, 140363, 140364, 140365,
- 140366, 140367, 140368, 140369, 140370, 140371, 140372, 149844, 149845, 149846, 149847,
- 149848, 149849, 149850, 149851, 149852, 149853, 149854, 149855, 149856, 149857, 149858,
- 149859, 149860, 149861, 149862, 149863, 149864, 172805, 172806, 172807, 172808, 172809,
- 172810, 172811, 172812, 172813, 172814, 172815, 172816, 172817, 172818, 172819, 172820,
- 172821, 172822, 172823, 172824, 172825, 172826, 172827, 172828, 172829, 172830, 172831,
- 172832, 172833, 172834, 172835, 172836, 172837, 172838, 172839, 172840, 172841, 172842,
- 172843, 172844, 172845, 172846, 172847, 172848, 172849, 172850, 172851, 172852, 172853,
- 172854, 172855, 172856, 172857, 172858, 172859, 172860, 172861, 172862, 172863, 172864,
- 172865, 172866, 172867, 172868, 172869, 172870, 172871, 202530, 202531, 202532, 209488,
- 209489, 209490, 209491, 209492, 209493, 209494, 209495, 209496, 209497, 209498, 209499,
- 209500, 209501, 209502, 209503, 209504, 209505, 209506, 225554, 225555, 225556, 225557,
- 225558, 225559, 225560, 225561, 225562, 225563, 225564, 225565, 225566, 225567, 225568,
- 225569, 225570, 225571, 225572, 225573, 225574, 225575, 225576, 225577, 225578, 225579,
- 225580, 225581, 227917, 227918, 227919, 227920, 227921, 227922, 227923, 227924, 227925,
- 227926, 227927, 227928, 227929, 227930, 227931, 227932, 227933, 227934, 227935, 227936,
- 227937, 227938, 227939, 252773, 252774, 252775, 252776, 252777, 252778, 252779, 252780,
- 252781, 252782, 252783, 252784, 252785, 252786, 252787, 252788, 252789, 252790, 252791,
- 252792, 252793, 252794, 278695, 278696, 278697, 278698, 278699, 301237, 301238, 301239,
- 301240, 301241, 301242, 301243, 301244, 301245, 301246, 301247, 301248, 301249, 301250,
- 301251, 301252, 301253, 301254, 301255, 301256, 301257, 301258, 301259, 301260, 301261,
- 301262, 301263, 301264, 301265, 320515, 320516, 320517, 320518, 320519, 320520, 320521,
- 320522, 320523, 320524, 320525, 320526, 320527, 320528, 320529, 320530, 320531, 320532,
- 320533, 320534, 320535, 320536, 320537, 320538, 320539, 320540, 320541, 320542, 320543,
- 320544, 320545, 320546, 320547, 320548, 329641, 329642, 329643, 329644, 329645, 329646,
- 329647, 329648, 329649, 329650, 329651, 329652, 329653, 329654, 329655, 329656, 329657,
- 329658, 329659, 342703, 342704, 342705, 342706, 349520, 349521, 349522, 349523, 349524,
- 349525, 349526, 349527, 349528, 349529, 349530, 362716, 362717, 362718, 362719, 362720,
- 362721, 362722, 362723, 362724, 362725, 362726, 362727, 378643, 378644, 378645, 378646,
- 390154, 390155, 390156, 390157, 390158, 390159, 390160, 390161, 390162, 390163, 390164,
- 390165, 390166, 390167, 390168, 390169, 395108, 395109, 395110, 395111, 395112, 395113,
- 395114, 395115, 403260, 403261, 403262, 403263, 403264, 403265, 403266, 403267, 403268,
- 403269, 403270, 403271, 417315, 417316, 417317, 417318, 417319, 417320, 432653, 432654,
- 432655, 432656, 432657, 432658, 432659, 432660, 432661, 432662, 432663, 432664, 432665,
- 432666, 432667, 432668, 432669, 432670, 432671, 432672, 432673, 432674, 432675, 432676,
- 432677, 432678, 449394, 449395, 449396, 449397, 449398, 459961, 459962, 459963, 459964,
- 474537, 474538, 474539, 474540, 474541, 474542, 474543, 474544, 474545, 474546, 474547,
- 474548, 474549, 474550, 474551, 474552, 474553, 474554, 474555, 474556, 474557, 474558,
- 474559, 474560, 474561, 474562, 474563, 474564, 474565, 474566, 474567, 474568, 474569,
- 474570, 474571, 474572, 474573, 474574, 474575, 474576, 474577, 474578, 474579, 474580,
- 474581, 474582, 474583, 474584, 474585, 474586, 474587, 474588, 474589, 474590, 474591,
- 474592, 474593, 474594, 474595, 474596, 474597, 483571, 483572, 483573, 483574, 483575,
- 483576, 489641, 489642, 489643, 489644, 489645, 489646, 489647, 489648, 489649, 489650,
- 489651, 491296, 491297, 491298, 495868, 495869, 495870, 502769, 502770, 502771, 502772,
- 502773, 502774, 502775, 502776, 502777, 502778, 502779, 502780, 502781, 502782, 502783,
- 513810, 513811, 513812, 513813, 513814, 513815, 513816, 513817, 513818, 513819, 513820,
- 513821, 513822, 513823, 513824, 513825, 513826, 513827, 513828, 513829, 513830, 513831,
- 513832, 517220, 517221, 517222, 517223, 517224, 517225, 517226, 517227, 519778, 519779,
- 519780, 519781, 519782, 519783, 519784, 519785, 524240, 524241, 524242, 524243, 524244,
- 524245, 524246, 524247, 524248, 524249, 527255, 527256, 527257, 527258, 527259, 533697,
- 533698, 533699, 533700, 533701, 533702, 533703, 533704, 533705, 533706, 533707, 533708,
- 533709, 539237, 539238, 539239, 539240, 539241, 539242, 539243, 562203, 562204, 562205,
- 562206, 569773, 569774, 569775, 569776, 569777, 569778, 569779, 569780, 569781, 569782,
- 569783, 569784, 569785, 569786, 569787, 569788, 569789, 569790, 569791, 569792, 569793,
- 569794, 569795, 569796, 569797, 569798, 569799, 569800, 569801, 569802, 569803, 569804,
- 569805, 569806, 569807, 569808, 569809, 569810, 569811, 569812, 569813, 569814, 569815,
- 569816, 569817, 569818, 569819, 569820, 569821, 580161, 580162, 580163, 580164, 580165,
- 580166, 580167, 580168, 580169, 580170, 580171, 580172, 580173, 580174, 580175, 580176,
- 588299, 588300, 588301, 588302, 588303, 588304, 588305, 588306, 588307, 588308, 588309,
- 588310, 588311, 588312, 588313, 588314, 588315, 588316, 588317, 588318, 588319, 588320,
- 588321, 588322, 588323, 588324, 588325, 588326, 588327, 588328, 588329, 588330, 588331,
- 588332, 588333, 588334, 588335, 608580, 608581, 608582, 608583, 608584, 608585, 608586,
- 608587, 608588, 608589, 608590, 608591, 608592, 608593, 608594, 608595, 608596, 608597,
- 608598, 608599, 608600, 608601, 608602, 608603, 608604, 608605, 618326, 618327, 618328,
- 618329, 618330, 618331, 618332, 618333, 618334, 618335, 618336, 618337, 618338, 618339,
- 618340, 618341, 618342, 618343, 618344, 618345, 618346, 618347, 618348, 618349, 626895,
- 626896, 626897, 626898, 626899, 626900, 635313, 635314, 635315, 635316, 635317, 635318,
- 635319, 635320, 635321, 635322, 635323, 635324, 635325, 635326, 635327, 635328, 635329,
- 635330, 635331, 635332, 635333, 635334, 635335, 635336, 635337, 635338, 635339, 635340,
- 635341, 635342, 635343, 635344, 635345, 635346, 635347, 635348, 635349, 635350, 635351,
- 635352, 635353, 635354, 635355, 648087, 648088, 648089, 648090, 648091, 648092, 648093,
- 648094, 648095, 648096, 648097, 648098, 648099, 648100, 648101, 648102, 648103, 648104,
- 648105, 648106, 648107, 648108, 648109, 648110, 661574, 661575, 661576, 661577, 674566,
- 674567, 674568, 674569, 674570, 674571, 674572, 674573, 674574, 674575, 674576, 674577,
- 674578, 674579, 674580, 674581, 674582, 674583, 674584, 674585, 689328, 689329, 689330,
- 689331, 689332, 689333, 689334, 689335, 689336, 689337, 697978, 697979, 697980, 697981,
- 697982, 697983, 697984, 697985, 697986, 697987, 697988, 697989, 697990, 697991, 697992,
- 697993, 697994, 726676, 726677, 726678, 726679, 726680, 726681, 782220, 782221, 782222,
- 782223, 782224, 782225, 782226, 782227, 782228, 782229, 782230, 782231, 782232, 782233,
- 782234, 782235, 782236, 782237, 782238, 782239, 797574, 797575, 797576, 797577, 797578,
- 797579, 797580, 797581, 797582, 804283, 804284, 804285, 822332, 822333, 822334, 822335,
- 822336, 831020, 831021, 831022, 831023, 831024, 831025, 831026, 831027, 831028, 831029,
- 831030, 831031, 831032, 831033, 831034, 831035, 831036, 831037, 831038, 831039, 831040,
- 847227, 847228, 847229, 847230, 847231, 847232, 847233, 847234, 847235, 847236, 847237,
- 847238, 847239, 847240, 847241, 847242, 847243, 847244, 847245, 857616, 857617, 857618,
- 857619, 857620, 857621, 857622, 857623, 857624, 857625, 867324, 867325, 867326, 867327,
- 867328, 867329, 867330, 867331, 867332, 867333, 867334, 867335, 867336, 867337, 867338,
- 867339, 877587, 877588, 877589, 877590, 877591, 877592, 877593, 877594, 877595, 877596,
- 877597, 877598, 877599, 877600, 877601, 877602, 877603, 877604, 877605, 877606, 877607,
- 877608, 877609, 877610, 877611, 877612, 877613, 877614, 877615, 896235, 896236, 896237,
- 896238, 896239, 896240, 916629, 916630, 916631, 916632, 929361, 929362, 929363, 929364,
- 929365, 929366, 929367, 929368, 929369, 929370, 929371, 948695, 948696, 948697, 948698,
- 948699, 948700, 948701, 948702, 949573, 949574, 957768, 957769, 957770, 957771, 957772,
- 957773, 957774, 957775, 961032, 961033, 961034, 961035, 987440, 987441, 987442, 987443,
- 1001434, 1001435, 1001436, 1001437, 1001438, 1001439, 1001440, 1001441, 1001442, 1001443,
- 1001444, 1001445, 1001446, 1001447, 1001448, 1001449, 1001450, 1001451, 1001452, 1001453,
- 1001454, 1001455, 1001456, 1001457, 1001458, 1001459, 1001460, 1009985, 1009986, 1009987,
- 1009988, 1009989, 1037191, 1037192, 1037193, 1037194, 1037195, 1037196, 1037197, 1037198,
- 1037199, 1037200, 1037201, 1037202, 1037203, 1037204, 1053198, 1053199, 1053200, 1053201,
- 1053202, 1053203, 1053204, 1053205, 1053206, 1053207, 1053208, 1053209, 1053210, 1053211,
- 1053212, 1053213, 1053214, 1053215, 1053216, 1053217, 1053218, 1053219, 1053220, 1053221,
- 1053222, 1053223, 1053224, 1084019, 1084020, 1084021, 1084022, 1084023, 1084024, 1084025,
- 1088361, 1088362, 1088363, 1088364, 1088365, 1088366, 1089312, 1089313, 1089314, 1089315,
- 1089316, 1089317, 1089318, 1092235, 1092236, 1092237, 1092238, 1092239, 1092240, 1092241,
- 1092242, 1092243, 1092244, 1102836, 1102837, 1102838, 1102839, 1102840, 1102841, 1102842,
- 1102843, 1102844, 1102845, 1102846, 1102847, 1108575, 1108576, 1108577, 1108578, 1108579,
- 1108580, 1108581, 1108582, 1108583, 1108584, 1108585, 1108586, 1108587, 1108588, 1108589,
- 1108590, 1108591, 1108592, 1108593, 1108594, 1108595, 1108596, 1108597, 1108598, 1134091,
- 1134092, 1134093, 1134094, 1134095, 1134096, 1134097, 1134098, 1134099, 1134100, 1134101,
- 1134102, 1134103, 1134104, 1134105, 1134106, 1134107, 1134108, 1134109, 1134110, 1134111,
- 1134112, 1134113, 1134114, 1134115, 1134116, 1134117, 1134118, 1134119, 1134120, 1134121,
- 1134122, 1134123, 1134124, 1134125, 1134126, 1134127, 1134128, 1134129, 1151732, 1151733,
- 1151734, 1151735, 1151736, 1151737, 1151738, 1151739, 1151740, 1151741, 1151742, 1151743,
- 1151744, 1151745, 1151746, 1151747, 1199223, 1199224, 1199225, 1199226, 1203252, 1203253,
- 1203254, 1203255, 1203256, 1203257, 1203258, 1203259, 1203260, 1217223, 1217224, 1217225,
- 1217226, 1226505, 1226506, 1226507, 1226508, 1226509, 1226510, 1226511, 1226512, 1231411,
- 1231412, 1231413, 1231414, 1231415, 1231416, 1231417, 1231418, 1231419, 1231420, 1231421,
- 1231422, 1231423, 1243464, 1243465, 1243466, 1243467, 1243468, 1243469, 1243470, 1247919,
- 1247920, 1247921, 1255972, 1255973, 1255974, 1255975, 1255976, 1255977, 1255978, 1255979,
- 1255980, 1263675, 1263676, 1263677, 1263678, 1263679, 1277693, 1277694, 1277695, 1277696,
- 1277697, 1277698, 1277699, 1277700, 1283492, 1283493, 1283494, 1283495, 1283496, 1283497,
- 1283498, 1283499, 1283500, 1283501, 1283502, 1283503, 1283504, 1283505, 1283506, 1283507,
- 1283508, 1283509, 1283510, 1283511, 1283512, 1283513, 1283514, 1325789, 1325790, 1325791,
- 1325792, 1325793, 1325794, 1325795, 1325796, 1325797, 1325798, 1325799};
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(array1);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(array2);
- RoaringBitmap rrb1 = rb1.clone();
- RoaringBitmap rrb2 = rb2.clone();
- rrb1.runOptimize();
- rrb2.runOptimize();
- assertEquals(RoaringBitmap.or(rb1, rb2), RoaringBitmap.or(rrb1, rrb2));
- }
-
- @Test
- public void testRandomLists() {
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(randomlists[0]);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(randomlists[1]);
- RoaringBitmap rbor = RoaringBitmap.or(rb1, rb2);
- assertEquals(rbor, FastAggregation.horizontal_or(rb1, rb2));
- }
-
- @Test
- public void testRank() {
- RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 100000; k += 7) {
- rb.add(k);
- }
- for (int k = 100000; k < 200000; k += 1000) {
- rb.add(k);
- }
- for (int k = 0; k < 100000; ++k) {
- assertEquals(1 + k / 7, rb.rank(k));
- }
- for (int k = 100000; k < 200000; ++k) {
- assertEquals(1 + 100000 / 7 + 1 + (k - 100000) / 1000, rb.rank(k));
- }
- }
-
- @Test
- public void testRankBigInts() {
- RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 100000; k += 7) {
- rb.add((1 << 31) + k);
- }
- for (int k = 100000; k < 200000; k += 1000) {
- rb.add((1 << 31) + k);
- }
- for (int k = 0; k < 100000; ++k) {
- assertEquals(1 + k / 7, rb.rank((1 << 31) + k));
- }
- for (int k = 100000; k < 200000; ++k) {
- assertEquals(1 + 100000 / 7 + 1 + (k - 100000) / 1000, rb.rank((1 << 31) + k));
- }
- }
-
-
- @Test
- public void testSelect() {
- long w = ~0l;
- for (int k = 0; k < 64; ++k) {
- assertEquals(k, Util.select(w, k));
- }
- for (int k = 0; k < 64; ++k) {
- assertEquals(k, Util.select(1l << k, 0));
- }
- for (int k = 1; k < 64; ++k) {
- assertEquals(k, Util.select((1l << k) + 1, 1));
- }
- assertEquals(0, Util.select(1, 0));
- assertEquals(0, Util.select(5, 0));
- assertEquals(2, Util.select(5, 1));
- for (int gap = 1; gap <= 1024; gap *= 2) {
- RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 100000; k += gap) {
- rb.add(k);
- }
- for (int k = 0; k < 100000 / gap; ++k) {
- assertEquals(k * gap, rb.select(k));
- }
- }
- }
-
-
- @Test
- public void testSelectBigInts() {
- for (int gap = 1; gap <= 1024; gap *= 2) {
- RoaringBitmap rb = new RoaringBitmap();
- for (int k = 0; k < 100000; k += gap) {
- rb.add((1 << 31) + k);
- }
- for (int k = 0; k < 100000 / gap; ++k) {
- assertEquals((1 << 31) + k * gap, rb.select(k));
- }
- }
- }
-
-
- @Test
- public void testSerialization() throws IOException, ClassNotFoundException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++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 RoaringBitmap rrback = new RoaringBitmap();
- final ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- rrback.readExternal(new ObjectInputStream(bis));
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
-
- @Test
- public void testSerializationBigInts() throws IOException, ClassNotFoundException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++k) {
- rr.add((1 << 31) + 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 RoaringBitmap rrback = new RoaringBitmap();
- final ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- rrback.readExternal(new ObjectInputStream(bis));
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
-
- @Test
- public void testSerialization2() throws IOException, ClassNotFoundException {
- final RoaringBitmap rr = new RoaringBitmap();
- 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 RoaringBitmap rrback = new RoaringBitmap();
- final ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- rrback.readExternal(new ObjectInputStream(bis));
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
- @Test
- public void testSerialization3() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++k) {
- rr.add(k);
- }
- rr.add(1444000);
- 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())));
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- // Deserialize DataInput with a buffer
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())), null);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
- @Test
- public void testSerialization4() throws IOException, ClassNotFoundException {
- final RoaringBitmap rr = new RoaringBitmap();
- 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())));
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- // Deserialize DataInput with a buffer
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())), null);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
-
- @Test
- public void testSerializationDataInputWithBuffer() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++k) {
- 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())), null);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
-
- @Test
- public void testSerializationDataInputWithBufferBigInts() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++k) {
- rr.add((1 << 31) + 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())), null);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
-
- @Test
- public void testSerializationDataInputWithBuffer2() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- 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
- int howmuch = rr.serializedSizeInBytes();
- final DataOutputStream oo = new DataOutputStream(bos);
- rr.serialize(oo);
- oo.close();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())), null);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
- @Test
- public void testSerializationDataInputWithBuffer3() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++k) {
- rr.add(k);
- }
- rr.add(1444000);
- 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())), null);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
- @Test
- public void testSerializationDataInputWithBuffer4() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- rrback.deserialize(new DataInputStream(new ByteArrayInputStream(bos.toByteArray())), null);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
- @Test
- public void testSerializationByteBuffer() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++k) {
- 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- final ByteBuffer buf = ByteBuffer.wrap(bos.toByteArray());
- rrback.deserialize(buf);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
-
- @Test
- public void testSerializationByteBufferBigInts() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++k) {
- rr.add((1 << 31) + 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- final ByteBuffer buf = ByteBuffer.wrap(bos.toByteArray());
- rrback.deserialize(buf);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
-
- @Test
- public void testSerializationByteBuffer2() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- 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
- int howmuch = rr.serializedSizeInBytes();
- final DataOutputStream oo = new DataOutputStream(bos);
- rr.serialize(oo);
- oo.close();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- final ByteBuffer buf = ByteBuffer.wrap(bos.toByteArray());
- rrback.deserialize(buf);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
- @Test
- public void testSerializationByteBuffer3() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- for (int k = 65000; k < 2 * 65000; ++k) {
- rr.add(k);
- }
- rr.add(1444000);
- 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- final ByteBuffer buf = ByteBuffer.wrap(bos.toByteArray());
- rrback.deserialize(buf);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
- @Test
- public void testSerializationByteBuffer4() throws IOException {
- final RoaringBitmap rr = new RoaringBitmap();
- 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();
- assertEquals(howmuch, bos.toByteArray().length);
- final RoaringBitmap rrback = new RoaringBitmap();
- final ByteBuffer buf = ByteBuffer.wrap(bos.toByteArray());
- rrback.deserialize(buf);
- assertEquals(rr.getCardinality(), rrback.getCardinality());
- assertEquals(rr, rrback);
- }
-
- @Test
- public void testSetUtilIntersection() {
- char[] data1 = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18};
- char[] data2 = {0, 3, 6, 9, 12, 15, 18};
- char[] result = new char[data1.length + data2.length];
- char[] expectedresult = {0, 6, 12, 18};
- int nl = Util.unsignedLocalIntersect2by2(data1, data1.length, data2, data2.length, result);
- result = Arrays.copyOf(result, nl);
- assertArrayEquals(expectedresult, result);
- }
-
- @Test
- public void testXORSimple() {
- RoaringBitmap a = RoaringBitmap.bitmapOf(73647, 83469);
- RoaringBitmap b = RoaringBitmap.bitmapOf(1, 2, 3, 5, 6, 8, 9, 10, 11, 13, 14, 16, 17, 18, 19,
- 20, 21, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 39, 40, 41, 50, 51, 69, 79, 80, 81,
- 88, 89, 172);
- RoaringBitmap rxor = RoaringBitmap.xor(a, b);
- RoaringBitmap ror = RoaringBitmap.or(a, b);
- assertEquals(rxor, ror);
- }
-
- @Test
- public void trimArrayContainerCardinalityTest() {
- final ArrayContainer ac = new ArrayContainer();
- ac.trim();
- for (char k = 0; k < 100; ++k) {
- ac.add(k);
- ac.trim();
- assertEquals(ac.getCardinality(), k + 1);
- }
- for (char k = 0; k < 100; ++k) {
- ac.add(k);
- ac.trim();
- assertEquals(ac.getCardinality(), 100);
- }
- }
-
- boolean validate(BitmapContainer bc, ArrayContainer ac) {
- // Checking the cardinalities of each container
-
- if (bc.getCardinality() != ac.getCardinality()) {
- System.out.println("cardinality differs");
- return false;
- }
- // Checking that the two containers contain the same values
- int counter = 0;
-
- int i = bc.nextSetBit(0);
- while (i >= 0) {
- ++counter;
- if (!ac.contains((char) i)) {
- System.out.println("content differs");
- System.out.println(bc);
- System.out.println(ac);
- return false;
- }
- i = bc.nextSetBit(i + 1);
- }
-
- // checking the cardinality of the BitmapContainer
- return counter == bc.getCardinality();
- }
-
- @Test
- public void trimTest() {
- // with bitmap containing 4k containers
- RoaringBitmap rb = new RoaringBitmap();
- for (int i = 0; i < 4000; i++) {
- rb.add((1 << 16) * i);
- }
-
- rb.trim();
-
- int wastedBytes = 0;
- final int javaReferenceSize = 4; // or 8 depending on factors
- RoaringArray ra = rb.highLowContainer;
- wastedBytes += Short.BYTES * (ra.keys.length - ra.size);
- wastedBytes += javaReferenceSize * (ra.values.length - ra.size);
- ContainerPointer cp = ra.getContainerPointer();
- while (cp.getContainer() != null) {
- if (cp.isBitmapContainer()) {
- ; //nothing wasted
- } else if (cp.isRunContainer()) {
- ; //not able to access information about wasted bytes
- } else {
- ArrayContainer ac = (ArrayContainer) cp.getContainer();
- wastedBytes += Short.BYTES * (ac.content.length - ac.cardinality);
- }
- cp.advance();
- }
- assertEquals(0, wastedBytes);
- }
-
- @Test
- public void xorBigIntsTest() {
- RoaringBitmap rb = new RoaringBitmap();
- RoaringBitmap rb2 = new RoaringBitmap();
- HashSet hs = new HashSet();
-
- for (int i = 1 << 31; i < (1 << 31) + 65536; i += 2) {
- hs.add(i);
- rb.add(i);
- }
- for (int i = (1 << 31) + 3 * 65536; i < (1 << 31) + 4 * 65536; i += 3) {
- rb.add(i);
- }
- for (int i = (1 << 31) + 5 * 65536; i < (1 << 31) + 7 * 65536; i += 5) {
- rb.add(i);
- }
- for (int i = (1 << 31) + 9 * 65536; i < (1 << 31) + 10 * 65536; i += 7) {
- rb.add(i);
- }
- for (int i = (1 << 31) + 11 * 65536; i < (1 << 31) + 12 * 65536; i += 6) {
- hs.add(i);
- rb.add(i);
- }
-
- for (int i = (1 << 31) + 3 * 65536; i < (1 << 31) + 4 * 65536; i += 3) {
- rb2.add(i);
- }
- for (int i = (1 << 31) + 5 * 65536; i < (1 << 31) + 7 * 65536; i += 5) {
- rb2.add(i);
- }
- for (int i = (1 << 31) + 9 * 65536; i < (1 << 31) + 10 * 65536; i += 7) {
- rb2.add(i);
- }
- for (int i = (1 << 31) + 13 * 65536; i < (1 << 31) + 14 * 65536; i += 2) {
- hs.add(i);
- rb2.add(i);
- }
-
- RoaringBitmap rbxor = RoaringBitmap.xor(rb, rb2);
-
- Object[] correct = hs.toArray();
- Arrays.sort(correct);
- Integer[] resxor = ArrayUtils.toObject(rbxor.toArray());
- assertArrayEquals(correct, resxor);
- }
-
-
- @Test
- public void XORtest() {
- final RoaringBitmap rr = new RoaringBitmap();
- 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 RoaringBitmap rr2 = new RoaringBitmap();
- 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 RoaringBitmap correct = RoaringBitmap.xor(rr, rr2);
- rr.xor(rr2);
- assertEquals(correct, rr);
- }
-
- @Test
- public void xortest1() {
- final HashSet V1 = new HashSet();
- final HashSet V2 = new HashSet();
-
- final RoaringBitmap rr = new RoaringBitmap();
- final RoaringBitmap rr2 = new RoaringBitmap();
- // For the first 65536: rr2 has a bitmap container, and rr has
- // an array container.
- // We will check the union between a BitmapCintainer and an
- // arrayContainer
- for (int k = 0; k < 4000; ++k) {
- rr2.add(k);
- if (k < 3500) {
- V1.add(k);
- }
- }
- for (int k = 3500; k < 4500; ++k) {
- rr.add(k);
- }
- for (int k = 4000; k < 65000; ++k) {
- rr2.add(k);
- if (k >= 4500) {
- V1.add(k);
- }
- }
-
- // In the second node of each roaring bitmap, we have two bitmap
- // containers.
- // So, we will check the union between two BitmapContainers
- for (int k = 65536; k < 65536 + 30000; ++k) {
- rr.add(k);
- }
-
- for (int k = 65536; k < 65536 + 50000; ++k) {
- rr2.add(k);
- if (k >= 65536 + 30000) {
- V1.add(k);
- }
- }
-
- // In the 3rd node of each Roaring Bitmap, we have an
- // ArrayContainer. So, we will try the union between two
- // ArrayContainers.
- for (int k = 4 * 65535; k < 4 * 65535 + 1000; ++k) {
- rr.add(k);
- if (k >= 4 * 65535 + 800) {
- V1.add(k);
- }
- }
-
- for (int k = 4 * 65535; k < 4 * 65535 + 800; ++k) {
- rr2.add(k);
- }
-
- // For the rest, we will check if the union will take them in
- // the result
- for (int k = 6 * 65535; k < 6 * 65535 + 1000; ++k) {
- rr.add(k);
- V1.add(k);
- }
-
- for (int k = 7 * 65535; k < 7 * 65535 + 2000; ++k) {
- rr2.add(k);
- V1.add(k);
- }
-
- final RoaringBitmap rrxor = RoaringBitmap.xor(rr, rr2);
- boolean valide = true;
-
- // Si tous les elements de rror sont dans V1 et que tous les
- // elements de
- // V1 sont dans rror(V2)
- // alors V1 == rror
- final Object[] tab = V1.toArray();
- final Vector vector = new Vector();
- for (Object aTab : tab) {
- vector.add((Integer) aTab);
- }
-
- for (final int i : rrxor.toArray()) {
- if (!vector.contains(i)) {
- valide = false;
- }
- V2.add(i);
- }
- for (int i = 0; i < V1.size(); i++) {
- if (!V2.contains(vector.elementAt(i))) {
- valide = false;
- }
- }
-
- assertTrue(valide);
- }
-
- @Test
- public void xortest4() {
- final RoaringBitmap rb = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
-
- 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 RoaringBitmap xorresult = RoaringBitmap.xor(rb, rb2);
- final RoaringBitmap off = RoaringBitmap.or(rb2, rb);
- assertEquals(xorresult, off);
-
- assertEquals(rb2card, xorresult.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 RoaringBitmap xorresult2 = RoaringBitmap.xor(rb, rb2);
- assertEquals(rb2card, xorresult.getCardinality());
-
- assertEquals(rb2.getCardinality() + rb.getCardinality(), xorresult2.getCardinality());
- rb.xor(rb2);
- assertEquals(xorresult2, rb);
-
- }
-
-
- // is this better in testRange?
- @Test
- public void testRangedOr() {
- int length = 1000;
- int NUM_ITER = 10;
- Random random = new Random(1234);// please use deterministic tests
- for (int test = 0; test < 50; ++test) {
-
- final RoaringBitmap rb1 = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
- Set set1 = new HashSet<>();
- Set set2 = new HashSet<>();
- int numBitsToSet = length / 2;
- for (int i = 0; i < numBitsToSet; i++) {
- int val1 = random.nextInt(length);
- int val2 = random.nextInt(length);
-
- rb1.add(val1);
- set1.add(val1);
-
- rb2.add(val2);
- set2.add(val2);
- }
- Set unionSet = new TreeSet<>();
- unionSet.addAll(set1);
- unionSet.addAll(set2);
- for (int iter = 0; iter < NUM_ITER; iter++) {
- int rangeStart = random.nextInt(length - 1);
- // +1 to ensure rangeEnd >rangeStart, may
- int rangeLength = random.nextInt(length - rangeStart) + 1;
- int rangeEnd = rangeStart + rangeLength;
- Set expectedResultSet = new TreeSet<>();
- for (int i = rangeStart; i < rangeEnd; i++) {
- if (unionSet.contains(i)) {
- expectedResultSet.add(i);
- }
- }
- List list = new ArrayList<>();
- list.add(rb1);
- list.add(rb2);
- RoaringBitmap result = RoaringBitmap.or(list.iterator(), (long) rangeStart, (long) rangeEnd);
- Set actualResultSet = new TreeSet<>();
- IntIterator intIterator = result.getIntIterator();
- while (intIterator.hasNext()) {
- actualResultSet.add(intIterator.next());
- }
- assertEquals(expectedResultSet, actualResultSet);
- }
- }
- }
-
- @Test
- public void testRangedOrBigInts() {
- int length = 1000;
- int NUM_ITER = 10;
- Random random = new Random(1234);// please use deterministic tests
- for (int test = 0; test < 50; ++test) {
-
- final RoaringBitmap rb1 = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
- Set set1 = new HashSet<>();
- Set set2 = new HashSet<>();
- int numBitsToSet = length / 2;
- for (int i = 0; i < numBitsToSet; i++) {
- int val1 = random.nextInt(length);
- int val2 = random.nextInt(length);
-
- rb1.add((1 << 31) + val1);
- set1.add((1 << 31) + val1);
-
- rb2.add((1 << 31) + val2);
- set2.add((1 << 31) + val2);
- }
- Set unionSet = new TreeSet<>();
- unionSet.addAll(set1);
- unionSet.addAll(set2);
- for (int iter = 0; iter < NUM_ITER; iter++) {
- long rangeStart1 = random.nextInt(length - 1);
- long rangeStart = (1L << 31) + rangeStart1;
- long rangeLength = random.nextInt((int) (length - rangeStart1)) + 1;
- long rangeEnd = rangeStart + rangeLength;
- Set expectedResultSet = new TreeSet<>();
- for (int i = (int) rangeStart; i < (int) rangeEnd; i++) {
- if (unionSet.contains(i)) {
- expectedResultSet.add(i);
- }
- }
- List list = new ArrayList<>();
- list.add(rb1);
- list.add(rb2);
- RoaringBitmap result = RoaringBitmap.or(list.iterator(), rangeStart, rangeEnd);
- Set actualResultSet = new TreeSet<>();
- IntIterator intIterator = result.getIntIterator();
- while (intIterator.hasNext()) {
- actualResultSet.add(intIterator.next());
- }
- assertEquals(expectedResultSet, actualResultSet);
- }
- }
- }
-
-
- @Test
- public void testRangedAnd() {
- int length = 1000;
- int NUM_ITER = 10;
- Random random = new Random(1234);// please use deterministic tests
- for (int test = 0; test < 50; ++test) {
- final RoaringBitmap rb1 = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
- Set set1 = new HashSet<>();
- Set set2 = new HashSet<>();
- int numBitsToSet = length / 2;
- for (int i = 0; i < numBitsToSet; i++) {
- int val1 = random.nextInt(length);
- int val2 = random.nextInt(length);
-
- rb1.add(val1);
- set1.add(val1);
-
- rb2.add(val2);
- set2.add(val2);
- }
- Set intersectionSet = new TreeSet<>(set1);
- intersectionSet.retainAll(set2);
- for (int iter = 0; iter < NUM_ITER; iter++) {
- int rangeStart = random.nextInt(length - 1);
- // +1 to ensure rangeEnd >rangeStart, may
- int rangeLength = random.nextInt(length - rangeStart) + 1;
- int rangeEnd = rangeStart + rangeLength;
- Set expectedResultSet = new TreeSet<>();
- for (int i = rangeStart; i < rangeEnd; i++) {
- if (intersectionSet.contains(i)) {
- expectedResultSet.add(i);
- }
- }
- List list = new ArrayList<>();
- list.add(rb1);
- list.add(rb2);
- RoaringBitmap result = RoaringBitmap.and(list.iterator(), (long) rangeStart, (long) rangeEnd);
- Set actualResultSet = new TreeSet<>();
- IntIterator intIterator = result.getIntIterator();
- while (intIterator.hasNext()) {
- actualResultSet.add(intIterator.next());
- }
- assertEquals(expectedResultSet, actualResultSet);
- }
- }
- }
-
- @Test
- public void testRangedAndBigInts() {
- int length = 1000;
- int NUM_ITER = 10;
- Random random = new Random(1234);// please use deterministic tests
- for (int test = 0; test < 50; ++test) {
- final RoaringBitmap rb1 = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
- Set set1 = new HashSet<>();
- Set set2 = new HashSet<>();
- int numBitsToSet = length / 2;
- for (int i = 0; i < numBitsToSet; i++) {
- int val1 = random.nextInt(length);
- int val2 = random.nextInt(length);
-
- rb1.add((1 << 31) + val1);
- set1.add((1 << 31) + val1);
-
- rb2.add((1 << 31) + val2);
- set2.add((1 << 31) + val2);
- }
- Set intersectionSet = new TreeSet<>(set1);
- intersectionSet.retainAll(set2);
- for (int iter = 0; iter < NUM_ITER; iter++) {
- long rangeStart1 = random.nextInt(length - 1);
- long rangeStart = (1L << 31) + rangeStart1;
- long rangeLength = random.nextInt((int) (length - rangeStart1)) + 1;
- long rangeEnd = rangeStart + rangeLength;
- Set expectedResultSet = new TreeSet<>();
- for (int i = (int) rangeStart; i < (int) rangeEnd; i++) {
- if (intersectionSet.contains(i)) {
- expectedResultSet.add(i);
- }
- }
- List list = new ArrayList<>();
- list.add(rb1);
- list.add(rb2);
- RoaringBitmap result = RoaringBitmap.and(list.iterator(), rangeStart, rangeEnd);
- Set actualResultSet = new TreeSet<>();
- IntIterator intIterator = result.getIntIterator();
- while (intIterator.hasNext()) {
- actualResultSet.add(intIterator.next());
- }
- assertEquals(expectedResultSet, actualResultSet);
- }
- }
- }
-
-
- @Test
- public void testRangedXor() {
- int length = 1000;
- int NUM_ITER = 10;
- Random random = new Random(1234);// please use deterministic tests
- for (int test = 0; test < 50; ++test) {
- final RoaringBitmap rb1 = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
- Set set1 = new HashSet<>();
- Set set2 = new HashSet<>();
- int numBitsToSet = length / 2;
- for (int i = 0; i < numBitsToSet; i++) {
- int val1 = random.nextInt(length);
- int val2 = random.nextInt(length);
-
- rb1.add(val1);
- set1.add(val1);
-
- rb2.add(val2);
- set2.add(val2);
- }
- Set xorSet = new TreeSet<>();
- xorSet.addAll(set1);
- xorSet.addAll(set2);
- Set andSet = new TreeSet<>(set1);
- andSet.retainAll(set2);
-
- xorSet.removeAll(andSet);
- for (int iter = 0; iter < NUM_ITER; iter++) {
- int rangeStart = random.nextInt(length - 1);
- // +1 to ensure rangeEnd >rangeStart, may
- int rangeLength = random.nextInt(length - rangeStart) + 1;
- int rangeEnd = rangeStart + rangeLength;
- Set expectedResultSet = new TreeSet<>();
- for (int i = rangeStart; i < rangeEnd; i++) {
- if (xorSet.contains(i)) {
- expectedResultSet.add(i);
- }
- }
- List list = new ArrayList<>();
- list.add(rb1);
- list.add(rb2);
- RoaringBitmap result = RoaringBitmap.xor(list.iterator(), (long) rangeStart, (long) rangeEnd);
- Set actualResultSet = new TreeSet<>();
- IntIterator intIterator = result.getIntIterator();
- while (intIterator.hasNext()) {
- actualResultSet.add(intIterator.next());
- }
- assertEquals(expectedResultSet, actualResultSet);
- }
- }
- }
-
-
- @Test
- public void testRangedXorBigInts() {
- int length = 1000;
- int NUM_ITER = 10;
- Random random = new Random(1234);// please use deterministic tests
- for (int test = 0; test < 50; ++test) {
- final RoaringBitmap rb1 = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
- Set set1 = new HashSet<>();
- Set set2 = new HashSet<>();
- int numBitsToSet = length / 2;
- for (int i = 0; i < numBitsToSet; i++) {
- int val1 = random.nextInt(length);
- int val2 = random.nextInt(length);
-
- rb1.add((1 << 31) + val1);
- set1.add((1 << 31) + val1);
-
- rb2.add((1 << 31) + val2);
- set2.add((1 << 31) + val2);
- }
- Set xorSet = new TreeSet<>();
- xorSet.addAll(set1);
- xorSet.addAll(set2);
- Set andSet = new TreeSet<>(set1);
- andSet.retainAll(set2);
-
- xorSet.removeAll(andSet);
- for (int iter = 0; iter < NUM_ITER; iter++) {
- long rangeStart1 = random.nextInt(length - 1);
- long rangeStart = (1L << 31) + rangeStart1;
- long rangeLength = random.nextInt((int) (length - rangeStart1)) + 1;
- long rangeEnd = rangeStart + rangeLength;
- Set expectedResultSet = new TreeSet<>();
- for (int i = (int) rangeStart; i < (int) rangeEnd; i++) {
- if (xorSet.contains(i)) {
- expectedResultSet.add(i);
- }
- }
- List list = new ArrayList<>();
- list.add(rb1);
- list.add(rb2);
- RoaringBitmap result = RoaringBitmap.xor(list.iterator(), rangeStart, rangeEnd);
- Set actualResultSet = new TreeSet<>();
- IntIterator intIterator = result.getIntIterator();
- while (intIterator.hasNext()) {
- actualResultSet.add(intIterator.next());
- }
- assertEquals(expectedResultSet, actualResultSet);
- }
- }
- }
-
-
- @Test
- public void testRangedAndNot() {
- int length = 1000;
- int NUM_ITER = 10;
- Random random = new Random(1234);// please use deterministic tests
- for (int test = 0; test < 50; ++test) {
- final RoaringBitmap rb1 = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
- Set set1 = new HashSet<>();
- Set set2 = new HashSet<>();
- int numBitsToSet = length / 2;
- for (int i = 0; i < numBitsToSet; i++) {
- int val1 = random.nextInt(length);
- int val2 = random.nextInt(length);
-
- rb1.add(val1);
- set1.add(val1);
-
- rb2.add(val2);
- set2.add(val2);
- }
- Set andNotSet = new TreeSet<>();
- for (int i : set1) {
- if (!set2.contains(i)) {
- andNotSet.add(i);
- }
- }
- for (int iter = 0; iter < NUM_ITER; iter++) {
- int rangeStart = random.nextInt(length - 1);
- // +1 to ensure rangeEnd >rangeStart, may
- int rangeLength = random.nextInt(length - rangeStart) + 1;
- int rangeEnd = rangeStart + rangeLength;
- Set expectedResultSet = new TreeSet<>();
- for (int i = rangeStart; i < rangeEnd; i++) {
- if (andNotSet.contains(i)) {
- expectedResultSet.add(i);
- }
- }
- RoaringBitmap result = RoaringBitmap.andNot(rb1, rb2, (long) rangeStart, (long) rangeEnd);
- Set actualResultSet = new TreeSet<>();
- IntIterator intIterator = result.getIntIterator();
- while (intIterator.hasNext()) {
- actualResultSet.add(intIterator.next());
- }
- assertEquals(expectedResultSet, actualResultSet);
- }
- }
- }
-
-
- @Test
- public void testRangedAndNotBigInts() {
- int length = 1000;
- int NUM_ITER = 10;
- Random random = new Random(1234);// please use deterministic tests
- for (int test = 0; test < 50; ++test) {
- final RoaringBitmap rb1 = new RoaringBitmap();
- final RoaringBitmap rb2 = new RoaringBitmap();
- Set set1 = new HashSet<>();
- Set set2 = new HashSet<>();
- int numBitsToSet = length / 2;
- for (int i = 0; i < numBitsToSet; i++) {
- int val1 = random.nextInt(length);
- int val2 = random.nextInt(length);
-
- rb1.add((1 << 31) + val1);
- set1.add((1 << 31) + val1);
-
- rb2.add((1 << 31) + val2);
- set2.add((1 << 31) + val2);
- }
- Set andNotSet = new TreeSet<>();
- for (int i : set1) {
- if (!set2.contains(i)) {
- andNotSet.add(i);
- }
- }
- for (int iter = 0; iter < NUM_ITER; iter++) {
- long rangeStart1 = random.nextInt(length - 1);
- long rangeStart = (1L << 31) + rangeStart1;
- long rangeLength = random.nextInt((int) (length - rangeStart1)) + 1;
- long rangeEnd = rangeStart + rangeLength;
- Set expectedResultSet = new TreeSet<>();
- for (int i = (int) rangeStart; i < (int) rangeEnd; i++) {
- if (andNotSet.contains(i)) {
- expectedResultSet.add(i);
- }
- }
- RoaringBitmap result = RoaringBitmap.andNot(rb1, rb2, rangeStart, rangeEnd);
- Set actualResultSet = new TreeSet<>();
- IntIterator intIterator = result.getIntIterator();
- while (intIterator.hasNext()) {
- actualResultSet.add(intIterator.next());
- }
- assertEquals(expectedResultSet, actualResultSet);
- }
- }
- }
-
-
- @Test
- public void testOr() {
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5);
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(4, 7, 8, 9);
- RoaringBitmap rb3 = RoaringBitmap.bitmapOf(12, 13, 15, 19, 21);
- RoaringBitmap rb4 = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5, 7, 8, 9);
- RoaringBitmap rb5 = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5, 7, 8, 9, 12, 13, 15, 19, 21);
- assertEquals(rb4, RoaringBitmap.lazyorfromlazyinputs(rb1, rb2));
- assertEquals(rb5, RoaringBitmap.or(rb1, rb2, rb3));
- }
-
- @Test
- public void testLazyOr() {
- RoaringBitmap rb1 = RoaringBitmap.bitmapOf(1 << 16, 1 << 18, 1 << 19);
- rb1.lazyor(RoaringBitmap.bitmapOf(4, 7, 8, 9));
- rb1.lazyor(RoaringBitmap.bitmapOf(1, 2, 3, 4, 5, 1 << 16, 1 << 17, 1 << 20));
- RoaringBitmap rb2 = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5, 7, 8, 9, 1 << 16, 1 << 17, 1 << 18, 1 << 19, 1 << 20);
- assertEquals(rb2, rb1);
- }
-
- @Test
- public void testFirstLast_CreateSparseContainers() {
- RoaringBitmap rb = new RoaringBitmap();
- for (int i = 0; i < 20; ++i) {
- int x = 1 << i;
- rb.add(x);
- assertEquals(1, rb.first());
- assertEquals(x, rb.last());
- }
- }
-
- @Test
- public void testFirstLast_CreateSparseContainersAfterRun() {
- RoaringBitmap rb = new RoaringBitmap();
- rb.add(1L, 1 << 14);
- for (int i = 18; i < 31; ++i) {
- int x = 1 << i;
- rb.add(x);
- assertEquals(1, rb.first());
- assertEquals(x, rb.last());
- }
- }
-
- @Test
- public void testFirstLast_AfterLazyMutation1() {
- RoaringBitmap rb = new RoaringBitmap();
- rb.add(1, 3, 5, 7);
- assertEquals(1, rb.first());
- assertEquals(7, rb.last());
- RoaringBitmap mutator = new RoaringBitmap();
- mutator.add(0, 2, 4, 6, 8);
- rb.lazyor(mutator);
- assertEquals(0, rb.first());
- assertEquals(8, rb.last());
- }
-
-
- @Test
- public void testFirstLast_AfterLazyMutation2() {
- RoaringBitmap rb = new RoaringBitmap();
- Iterable willForceUseOfBitmapContainer = Iterables.filter(
- ContiguousSet.create(Range.openClosed(0, 1 << 16), DiscreteDomain.integers()),
- new Predicate() {
- @Override
- public boolean apply(Integer input) {
- return input % 3 == 0;
- }
- }
- );
- int max = 0;
- for (Integer i : willForceUseOfBitmapContainer) {
- rb.add(i);
- max = i;
- }
- assertEquals(3, rb.first());
- assertEquals(max, rb.last());
- RoaringBitmap mutator = new RoaringBitmap();
- mutator.add(0, 2, 4, 6, 8);
- rb.lazyor(mutator);
- assertEquals(0, rb.first());
- assertEquals(max, rb.last());
- }
-
-
- @Test
- public void testEmptyFirst() {
- assertThrows(NoSuchElementException.class, () -> new RoaringBitmap().first());
- }
-
- @Test
- public void testEmptyLast() {
- assertThrows(NoSuchElementException.class, () -> new RoaringBitmap().last());
- }
-
- @Test
- public void testFirstLast() {
- RoaringBitmap rb = new RoaringBitmap();
-
- rb.add(2);
- rb.add(4);
- rb.add(8);
- assertEquals(2, rb.first());
- assertEquals(8, rb.last());
-
- rb.add(1L << 5, 1L << 14);
- assertEquals(2, rb.first());
- assertEquals((1 << 14) - 1, rb.last());
-
- rb.add(1L << 15, 1L << 30);
- assertEquals(2, rb.first());
- assertEquals((1L << 30) - 1, rb.last());
- }
-
- @Test
- public void testIsHammingSimilar_AtStart() {
- // similar bitmaps in the first container
- RoaringBitmap baseline = RoaringBitmap.bitmapOf(2, 4, 8, 1 << 17, 1 << 22);
- assertTrue(baseline.isHammingSimilar(baseline, 0));
- RoaringBitmap other = baseline.clone();
- other.flip(0L, 9);
- for (int i = 0; i < 9; ++i) {
- assertFalse(baseline.isHammingSimilar(other, i));
- }
- assertTrue(baseline.isHammingSimilar(other, 9));
- other.add(0L, 9L);
- for (int i = 0; i < 6; ++i) {
- assertFalse(baseline.isHammingSimilar(other, i));
- }
- assertTrue(baseline.isHammingSimilar(other, 6));
- }
-
- @Test
- public void testHammingSimilarity_BigVsSmall() {
- RoaringBitmap big = new RoaringBitmap();
- big.add(1, 2, 3, 4);
- big.add(1L << 17, 1L << 30);
- big.flip((1 << 17) | (1 << 16));
- for (int i = 1 << 18; i < 1 << 19; ++i) {
- if (i % 3 == 0) {
- big.flip(i);
- }
- }
- RoaringBitmap small = RoaringBitmap.bitmapOf(1, 2, 3, 4);
- assertFalse(small.isHammingSimilar(big, 1));
- assertFalse(big.isHammingSimilar(small, 1));
- }
-
- @Test
- public void testHammingSimilarity_Shifted() {
- RoaringBitmap baseline = RoaringBitmap.bitmapOf(1, 2, 3, 4);
- RoaringBitmap shifted = RoaringBitmap.bitmapOf((1 << 17) + 1, (1 << 17) + 2, (1 << 17) + 3,
- (1 << 17) + 4);
- assertFalse(baseline.isHammingSimilar(shifted, 0));
- }
-
- @Test
- public void testIsHammingSimilar_AtEnd() {
- // reject bitmaps that are identical for many chunks but differ at the end
- RoaringBitmap baseline = new RoaringBitmap();
- for (int i = 0; i < 1 << 15; ++i) {
- if (i % 3 == 0) {
- baseline.add(i);
- }
- }
- baseline.add((1L << 16) + 1, 1L << 18);
- baseline.add((1L << 19) + 1, 1L << 20);
- baseline.add((1 << 21) + 1);
- baseline.add((1 << 21) + 3);
- baseline.add((1 << 21) + 5);
- assertEquals(baseline.getCardinality(), RoaringBitmap.andCardinality(baseline, baseline));
- assertTrue(baseline.isHammingSimilar(baseline, 0));
- RoaringBitmap other = baseline.clone();
- other.flip((1 << 21) + 1);
- assertTrue(baseline.isHammingSimilar(other, 1));
- assertFalse(baseline.isHammingSimilar(other, 0));
- other.add((1 << 21) + 2);
- assertTrue(baseline.isHammingSimilar(other, 2));
- assertFalse(baseline.isHammingSimilar(other, 1));
- other.flip((1 << 21) + 3);
- assertTrue(baseline.isHammingSimilar(other, 3));
- assertFalse(baseline.isHammingSimilar(other, 2));
- }
-
- @Test
- public void testAndCardinality() {
- RoaringBitmap baseline = new RoaringBitmap();
- baseline.add((1L << 16) + 1, 1L << 18);
- baseline.add((1L << 19) + 1, 1L << 20);
- baseline.add((1 << 21) + 1);
- baseline.add((1 << 21) + 3);
- baseline.add((1 << 21) + 5);
- assertEquals(baseline, RoaringBitmap.and(baseline, baseline));
- assertEquals(baseline.getCardinality(), RoaringBitmap.andCardinality(baseline, baseline));
- }
-
-
- @Test
- public void testRankOverflow() {
- assertEquals(0, RoaringBitmap.bitmapOf(65537).rank(1));
- assertEquals(1, RoaringBitmap.bitmapOf(65537).rank(65537));
- assertEquals(1, RoaringBitmap.bitmapOf(65537).rank(65538));
- }
-
-
- @Test
- public void testNegativeAdd() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.add(-7);
-
- assertEquals("{4294967289}", bitmap.toString());
- }
-
- @Test
- public void testNegative_last() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.add(-7);
- bitmap.add(777);
-
- assertEquals(-7, bitmap.last());
- }
-
- @Test
- public void testContainsRange_ContiguousBitmap() {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.add(0L, 1_000_000L);
- assertTrue(bitmap.contains(1L, 999_999L));
- assertFalse(bitmap.contains(1L, 1_000_001L));
- bitmap.flip(500_000);
- assertFalse(bitmap.contains(1L, 999_999L));
- bitmap.flip(500_000);
- bitmap.flip(500_000L, 600_000L);
- assertFalse(bitmap.contains(1L, 999_999L));
- assertTrue(bitmap.contains(0L, 500_000L));
- assertFalse(bitmap.contains(2_000_001L, 10_000_000L));
- }
-
- @Test
- public void testContainsRange_SmallBitmap() {
- RoaringBitmap bitmap = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5, 6);
- assertTrue(bitmap.contains(1, 6));
- assertTrue(bitmap.contains(1, 5));
- assertTrue(bitmap.contains(2, 6));
- assertTrue(bitmap.contains(2, 7));
- assertFalse(bitmap.contains(2, 8));
- assertFalse(bitmap.contains(0, 6));
- assertFalse(bitmap.contains(0, 1));
- assertFalse(bitmap.contains(6, 10));
- assertFalse(bitmap.contains(7, 1 << 16));
- assertFalse(bitmap.contains(1 << 17, 1 << 19));
- }
-
- @Test
- public void testContainsRange_DirtyBitmap() {
- RoaringBitmapWriter writer = writer().constantMemory().get();
- IntStream.range(0, 1_000_000)
- .map(i -> i * 2)
- .forEach(writer::add);
- writer.flush();
- RoaringBitmap bitmap = writer.getUnderlying();
- assertFalse(bitmap.contains(0L, 2_000_000L));
- assertFalse(bitmap.contains(0L, 2L));
- assertTrue(bitmap.contains(0L, 1L));
- assertTrue(bitmap.contains(1L << 10, 1 | (1L << 10)));
- assertFalse(bitmap.contains(1L << 31, 1L << 32));
- }
-
- @Test
- public void addoffset() {
- final RoaringBitmap rb = new RoaringBitmap();
- rb.add(10);
- rb.add(0xFFFF);
- rb.add(0x010101);
- for (int i = 100000; i < 200000; i += 4) {
- rb.add(i);
- }
- rb.add(400000L, 1400000L);
- for (int offset = 3; offset < 1000000; offset *= 3) {
- RoaringBitmap rboff = RoaringBitmap.addOffset(rb, offset);
- IntIterator i = rb.getIntIterator();
- IntIterator j = rboff.getIntIterator();
- while (i.hasNext() && j.hasNext()) {
- int val1 = i.next() + offset;
- int val2 = j.next();
- assertEquals(val1, val2);
- }
- assertEquals(i.hasNext(), j.hasNext());
- }
- for (int offset = 1024; offset < 1000000; offset *= 2) {
- RoaringBitmap rboff = RoaringBitmap.addOffset(rb, offset);
- IntIterator i = rb.getIntIterator();
- IntIterator j = rboff.getIntIterator();
- while (i.hasNext() && j.hasNext()) {
- assertEquals(i.next() + offset, j.next());
- }
- assertEquals(i.hasNext(), j.hasNext());
- }
- }
-
- @Test
- public void issue418() {
- final RoaringBitmap rb = new RoaringBitmap();
- rb.add(0);
- assertEquals(rb.contains(0), true);
- assertEquals(rb.getCardinality(), 1);
- long vals[] = { 100, 0xFFFF0000L, 0xFFFF0001L };
- for(long s : vals) {
- RoaringBitmap shifted = RoaringBitmap.addOffset(rb, s);
- System.out.println("moved "+shifted);
- assertEquals(shifted.contains((int)s), true);
- assertEquals(shifted.getCardinality(), 1);
- System.out.println("moving back by "+(-s));
-
- shifted = RoaringBitmap.addOffset(shifted, -s);
- System.out.println("back "+shifted);
-
- assertEquals(shifted.contains(0), true);
- assertEquals(shifted.getCardinality(), 1);
- }
- }
-
- @Test
- public void addNegativeOffset() {
- final RoaringBitmap rb = new RoaringBitmap();
- rb.add(10);
- rb.add(0xFFFF);
- rb.add(0x010101);
- for (int i = 100000; i < 200000; i += 4) {
- rb.add(i);
- }
- rb.add(400000L, 1400000L);
- for (int offset = 3; offset < 1000000; offset *= 3) {
- RoaringBitmap rboffpos = RoaringBitmap.addOffset(rb, offset);
- RoaringBitmap rboff = RoaringBitmap.addOffset(rboffpos, -offset);
-
- IntIterator i = rb.getIntIterator();
- IntIterator j = rboff.getIntIterator();
- while (i.hasNext() && j.hasNext()) {
- int val1 = i.next();
- int val2 = j.next();
- if (val1 != val2)
- assertEquals(val1, val2);
- }
- assertEquals(i.hasNext(), j.hasNext());
- }
- for (int offset = 1024; offset < 1000000; offset *= 2) {
- RoaringBitmap rboffpos = RoaringBitmap.addOffset(rb, offset);
- RoaringBitmap rboff = RoaringBitmap.addOffset(rboffpos, -offset);
- IntIterator i = rb.getIntIterator();
- IntIterator j = rboff.getIntIterator();
- while (i.hasNext() && j.hasNext()) {
- assertEquals(i.next(), j.next());
- }
- assertEquals(i.hasNext(), j.hasNext());
- }
- }
-
-
- @Test
- public void testNextValue() {
- RoaringBitmap bitmap = SeededTestData.TestDataSet.testCase()
- .withRunAt(0)
- .withBitmapAt(1)
- .withArrayAt(2)
- .withRunAt(3)
- .withBitmapAt(4)
- .withArrayAt(5)
- .build();
-
- BitSet bitset = new BitSet();
- bitmap.forEach((IntConsumer) bitset::set);
- long b1 = 0;
- int b2 = 0;
- while (b1 >= 0 && b2 >= 0) {
- b1 = bitmap.nextValue((int) b1 + 1);
- b2 = bitset.nextSetBit(b2 + 1);
- assertEquals(b1, b2);
- }
- }
-
- @Test
- public void testPreviousValue() {
- RoaringBitmap bitmap = SeededTestData.TestDataSet.testCase()
- .withRunAt(0)
- .withBitmapAt(1)
- .withArrayAt(2)
- .withRunAt(3)
- .withBitmapAt(4)
- .withArrayAt(5)
- .build();
-
- BitSet bitset = new BitSet();
- bitmap.forEach((IntConsumer) bitset::set);
- long b1 = Util.toUnsignedLong(bitmap.last());
- int b2 = bitset.previousSetBit(Integer.MAX_VALUE);
- int i = bitmap.getCardinality();
- while (b1 > 0 && b2 > 0) {
- assertEquals(b1, b2);
- b1 = bitmap.previousValue((int) (b1 - 1));
- b2 = bitset.previousSetBit(b2 - 1);
- assertEquals(b1, b2, "mismatch at " + i + "(bitset=" + b2 + ", rb=" + b1 + ")");
- --i;
- }
- }
-
- @Test
- public void testPreviousValueRegression() {
- // see https://github.com/RoaringBitmap/RoaringBitmap/issues/564
- assertEquals(-1, RoaringBitmap.bitmapOf(27399807).previousValue(403042));
- assertEquals(-1, RoaringBitmap.bitmapOf().previousValue(403042));
- }
-
- @Test
- public void testRangeCardinalityAtBoundary() {
- // See https://github.com/RoaringBitmap/RoaringBitmap/issues/285
- RoaringBitmap r = new RoaringBitmap();
- r.add(66236);
- assertEquals(1, r.rangeCardinality(60000, 70000));
- }
-
- @Test
- public void testNextValueArray() {
- RoaringBitmap r = new RoaringBitmap();
- r.add(0, 1, 2, 4, 6);
- assertEquals(-1, r.nextValue(7));
- }
-
- @Test
- public void regressionTestEquals370() {
- // see https://github.com/RoaringBitmap/RoaringBitmap/issues/370
- int[] a = {239, 240, 241, 242, 243, 244, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 273, 274, 275, 276, 277, 278, 398, 399, 400, 401, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 420, 421, 422, 509, 510, 511, 512, 513, 514, 539, 540, 541, 542, 543, 544, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 624, 625, 634, 635, 636, 649, 650, 651, 652, 653, 654, 714, 715, 716, 718, 719, 720, 721, 722, 723, 724, 725, 726, 728, 729, 730, 731, 732, 733, 734, 735, 736, 739, 740, 741, 742, 743, 744, 771, 772, 773};
- int[] b = {239, 240, 241, 242, 243, 244, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 273, 274, 275, 276, 277, 278, 398, 399, 400, 401, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 420, 421, 422, 509, 510, 511, 512, 513, 514, 539, 540, 541, 542, 543, 544, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 578, 579, 580, 581, 582, 583, 584, 585, 586, 607, 608, 634, 635, 636, 649, 650, 651, 652, 653, 654, 714, 715, 716, 718, 719, 720, 721, 722, 723, 724, 725, 726, 728, 729, 730, 731, 732, 733, 734, 735, 736, 739, 740, 741, 742, 743, 744, 771, 772, 773};
-
- RoaringBitmap rbA = RoaringBitmap.bitmapOf(a);
- RoaringBitmap rbB = RoaringBitmap.bitmapOf(b);
-
- assertNotEquals(rbB, rbA);
- rbA.runOptimize();
- assertNotEquals(rbB, rbA);
- rbB.runOptimize();
- assertNotEquals(rbB, rbA);
- }
-
- @Test
- public void regressionTestRemove377() {
- // https://github.com/RoaringBitmap/RoaringBitmap/issues/377
- RoaringBitmap map = new RoaringBitmap();
- map.add(0L, 64L);
- for (int i = 0; i < 64; i++) {
- if (i != 30 && i != 32) {
- map.remove(i);
- }
- }
- map.remove(0L, 31L);
- assertFalse(map.contains(30));
- assertTrue(map.contains(32));
- }
-
- @Test
- public void invalidCookieBuffer() {
- assertThrows(IOException.class, () -> {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.deserialize(ByteBuffer.allocate(4));
- });
- }
-
- @Test
- public void invalidCookieDataInput() {
- assertThrows(IOException.class, () -> {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.deserialize(new DataInputStream(new ByteArrayInputStream(new byte[4])));
- });
- }
-
- @Test
- public void invalidCookieDataInputWithBuffer() {
- assertThrows(IOException.class, () -> {
- RoaringBitmap bitmap = new RoaringBitmap();
- bitmap.deserialize(new DataInputStream(new ByteArrayInputStream(new byte[4])), new byte[8]);
- });
- }
-
- @Test
- public void testCardinalityExceeds() {
- RoaringBitmap bitmap = new RoaringBitmap();
- long runLength = 20_000L;
- bitmap.add(0L, runLength);
- for (int i = (1 << 16) + 1; i < 1 << 17; i+= 2) {
- bitmap.add(i);
- }
- long bitmapCount = 1 << 15;
- bitmap.add((1 << 17) | 1);
- bitmap.add((1 << 17) | 2);
- bitmap.add((1 << 17) | 3);
- long arrayCount = 3;
- bitmap.runOptimize();
- assertFalse(bitmap.cardinalityExceeds(Integer.MAX_VALUE));
- assertFalse(bitmap.cardinalityExceeds(runLength + bitmapCount + arrayCount));
- assertTrue(bitmap.cardinalityExceeds(runLength + bitmapCount + 1));
- assertTrue(bitmap.cardinalityExceeds(runLength + bitmapCount - 1));
- assertTrue(bitmap.cardinalityExceeds(runLength - 1));
- }
-
-
- @Test
- public void testWithYourself() {
- RoaringBitmap b1 = RoaringBitmap.bitmapOf(1,2,3,4,5,6,7,8,9,10);
- b1.runOptimize();
- b1.or(b1);
- assertTrue(b1.equals(RoaringBitmap.bitmapOf(1,2,3,4,5,6,7,8,9,10)));
- b1.xor(b1);
- assertTrue(b1.isEmpty());
- b1 = RoaringBitmap.bitmapOf(1,2,3,4,5,6,7,8,9,10);
- b1.and(b1);
- assertTrue(b1.equals(RoaringBitmap.bitmapOf(1,2,3,4,5,6,7,8,9,10)));
- b1.andNot(b1);
- assertTrue(b1.isEmpty());
- }
-
- @Test
- public void testIssue566() {
- RoaringBitmap roaringBitMap = new RoaringBitmap();
- BitSet bitSet = new BitSet(5000);
- double prob = 0.001;
- Random random = new Random();
- for (int i = 0; i < 5000; i++) {
- if (random.nextDouble() < prob) {
- bitSet.set(i);
- roaringBitMap.add(i);
- }
- }
- long roaringbits = roaringBitMap.getSizeInBytes() * 8;
- long bitsetbits = bitSet.size();
- System.out.println("[issue566] cardinality: "+ roaringBitMap.getCardinality());
- System.out.println("[issue566] bitset bits: "+ bitsetbits);
- System.out.println("[issue566] bitset bits per entry: " + bitsetbits * 1.0 / bitSet.cardinality());
- System.out.println("[issue566] RoaringBitmap bits: " + roaringbits);
- System.out.println("[issue566] RoaringBitmap bits per entry: " + roaringbits * 1.0 / roaringBitMap.getCardinality());
- assertTrue(roaringbits < bitsetbits);
- }
- @Test
- public void issue623() {
- RoaringBitmap r = new RoaringBitmap();
- r.add(65535);
- r.add(65535+1);
- assertTrue(r.contains(65535));
- assertTrue(r.contains(65535 + 1));
- assertTrue(r.contains(65535L, 65535L + 1));
- for (long i = 1; i <= 10_000_000; i++) {
- r.add(i, i + 1);
- }
- for (long i = 1; i <= 10_000_000; i++) {
- assertTrue(r.contains(i, i + 1));
- }
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestRoaringBitmapWriter.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestRoaringBitmapWriter.java
deleted file mode 100644
index 0250bfae6..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestRoaringBitmapWriter.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package org.roaringbitmap;
-
-
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.function.Supplier;
-import java.util.stream.Stream;
-
-import static java.lang.Integer.*;
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.roaringbitmap.RoaringBitmapWriter.bufferWriter;
-import static org.roaringbitmap.RoaringBitmapWriter.writer;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestRoaringBitmapWriter {
-
- public static Stream params() {
- return Stream.of(
- Arguments.of(writer().optimiseForArrays()),
- Arguments.of(writer().optimiseForRuns()),
- Arguments.of(writer().constantMemory()),
- Arguments.of(writer().optimiseForArrays().fastRank()),
- Arguments.of(writer().optimiseForRuns().fastRank()),
- Arguments.of(writer().constantMemory().fastRank()),
- Arguments.of(writer().expectedDensity(0.001)),
- Arguments.of(writer().expectedDensity(0.01)),
- Arguments.of(writer().expectedDensity(0.1)),
- Arguments.of(writer().expectedDensity(0.6)),
- Arguments.of(writer().expectedDensity(0.001).fastRank()),
- Arguments.of(writer().expectedDensity(0.01).fastRank()),
- Arguments.of(writer().expectedDensity(0.1).fastRank()),
- Arguments.of(writer().expectedDensity(0.6).fastRank()),
- Arguments.of(writer().initialCapacity(1)),
- Arguments.of(writer().initialCapacity(8)),
- Arguments.of(writer().initialCapacity(8192)),
- Arguments.of(writer().initialCapacity(1).fastRank()),
- Arguments.of(writer().initialCapacity(8).fastRank()),
- Arguments.of(writer().initialCapacity(8192).fastRank()),
- Arguments.of(writer().optimiseForArrays().expectedRange(0, toUnsignedLong(MIN_VALUE))),
- Arguments.of(writer().optimiseForRuns().expectedRange(0, toUnsignedLong(MIN_VALUE))),
- Arguments.of(writer().constantMemory().expectedRange(0, toUnsignedLong(MIN_VALUE))),
- Arguments.of(writer().optimiseForArrays().expectedRange(0, toUnsignedLong(MIN_VALUE)).fastRank()),
- Arguments.of(writer().optimiseForRuns().expectedRange(0, toUnsignedLong(MIN_VALUE)).fastRank()),
- Arguments.of(writer().constantMemory().expectedRange(0, toUnsignedLong(MIN_VALUE)).fastRank()),
- Arguments.of(writer().optimiseForArrays().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE))),
- Arguments.of(writer().optimiseForRuns().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE))),
- Arguments.of(writer().constantMemory().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE))),
- Arguments.of(writer().optimiseForArrays().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).fastRank()),
- Arguments.of(writer().optimiseForRuns().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).fastRank()),
- Arguments.of(writer().constantMemory().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).fastRank()),
- Arguments.of(bufferWriter().optimiseForArrays()),
- Arguments.of(bufferWriter().optimiseForRuns()),
- Arguments.of(bufferWriter().constantMemory()),
- Arguments.of(bufferWriter().expectedDensity(0.001)),
- Arguments.of(bufferWriter().expectedDensity(0.01)),
- Arguments.of(bufferWriter().expectedDensity(0.1)),
- Arguments.of(bufferWriter().expectedDensity(0.6)),
- Arguments.of(bufferWriter().initialCapacity(1)),
- Arguments.of(bufferWriter().initialCapacity(8)),
- Arguments.of(bufferWriter().initialCapacity(8192)),
- Arguments.of(bufferWriter().optimiseForArrays().expectedRange(0, toUnsignedLong(MIN_VALUE))),
- Arguments.of(bufferWriter().optimiseForRuns().expectedRange(0, toUnsignedLong(MIN_VALUE))),
- Arguments.of(bufferWriter().constantMemory().expectedRange(0, toUnsignedLong(MIN_VALUE))),
- Arguments.of(bufferWriter().optimiseForArrays().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE))),
- Arguments.of(bufferWriter().optimiseForRuns().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE))),
- Arguments.of(bufferWriter().constantMemory().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE))),
- Arguments.of(writer().optimiseForArrays().runCompress(false)),
- Arguments.of(writer().optimiseForRuns().runCompress(false)),
- Arguments.of(writer().constantMemory().runCompress(false)),
- Arguments.of(writer().optimiseForArrays().fastRank().runCompress(false)),
- Arguments.of(writer().optimiseForRuns().fastRank().runCompress(false)),
- Arguments.of(writer().constantMemory().fastRank().runCompress(false)),
- Arguments.of(writer().expectedDensity(0.001).runCompress(false)),
- Arguments.of(writer().expectedDensity(0.01).runCompress(false)),
- Arguments.of(writer().expectedDensity(0.1).runCompress(false)),
- Arguments.of(writer().expectedDensity(0.6).runCompress(false)),
- Arguments.of(writer().expectedDensity(0.001).fastRank().runCompress(false)),
- Arguments.of(writer().expectedDensity(0.01).fastRank().runCompress(false)),
- Arguments.of(writer().expectedDensity(0.1).fastRank().runCompress(false)),
- Arguments.of(writer().expectedDensity(0.6).fastRank().runCompress(false)),
- Arguments.of(writer().initialCapacity(1).runCompress(false)),
- Arguments.of(writer().initialCapacity(8).runCompress(false)),
- Arguments.of(writer().initialCapacity(8192).runCompress(false)),
- Arguments.of(writer().initialCapacity(1).fastRank().runCompress(false)),
- Arguments.of(writer().initialCapacity(8).fastRank().runCompress(false)),
- Arguments.of(writer().initialCapacity(8192).fastRank().runCompress(false)),
- Arguments.of(writer().optimiseForArrays().expectedRange(0, toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(writer().optimiseForRuns().expectedRange(0, toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(writer().constantMemory().expectedRange(0, toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(writer().optimiseForArrays().expectedRange(0, toUnsignedLong(MIN_VALUE)).fastRank().runCompress(false)),
- Arguments.of(writer().optimiseForRuns().expectedRange(0, toUnsignedLong(MIN_VALUE)).fastRank().runCompress(false)),
- Arguments.of(writer().constantMemory().expectedRange(0, toUnsignedLong(MIN_VALUE)).fastRank().runCompress(false)),
- Arguments.of(writer().optimiseForArrays().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(writer().optimiseForRuns().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(writer().constantMemory().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(writer().optimiseForArrays().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).fastRank().runCompress(false)),
- Arguments.of(writer().optimiseForRuns().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).fastRank().runCompress(false)),
- Arguments.of(writer().constantMemory().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).fastRank().runCompress(false)),
- Arguments.of(bufferWriter().optimiseForArrays().runCompress(false)),
- Arguments.of(bufferWriter().optimiseForRuns().runCompress(false)),
- Arguments.of(bufferWriter().constantMemory().runCompress(false)),
- Arguments.of(bufferWriter().expectedDensity(0.001).runCompress(false)),
- Arguments.of(bufferWriter().expectedDensity(0.01).runCompress(false)),
- Arguments.of(bufferWriter().expectedDensity(0.1).runCompress(false)),
- Arguments.of(bufferWriter().expectedDensity(0.6).runCompress(false)),
- Arguments.of(bufferWriter().initialCapacity(1).runCompress(false)),
- Arguments.of(bufferWriter().initialCapacity(8).runCompress(false)),
- Arguments.of(bufferWriter().initialCapacity(8192).runCompress(false)),
- Arguments.of(bufferWriter().optimiseForArrays().expectedRange(0, toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(bufferWriter().optimiseForRuns().expectedRange(0, toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(bufferWriter().constantMemory().expectedRange(0, toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(bufferWriter().optimiseForArrays().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(bufferWriter().optimiseForRuns().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).runCompress(false)),
- Arguments.of(bufferWriter().constantMemory().expectedRange(toUnsignedLong(MAX_VALUE), toUnsignedLong(MIN_VALUE)).runCompress(false))
- );
- }
-
- @ParameterizedTest
- @MethodSource("params")
- public void addInReverseOrder(Supplier> supplier) {
- RoaringBitmapWriter extends BitmapDataProvider> writer = supplier.get();
- writer.add(1 << 17);
- writer.add(0);
- writer.flush();
- assertArrayEquals(RoaringBitmap.bitmapOf(0, 1 << 17).toArray(), writer.getUnderlying().toArray());
- }
-
- @ParameterizedTest
- @MethodSource("params")
- public void bitmapShouldContainAllValuesAfterFlush(Supplier> supplier) {
- RoaringBitmapWriter extends BitmapDataProvider> writer = supplier.get();
- writer.add(0);
- writer.add(1 << 17);
- writer.flush();
- assertTrue(writer.getUnderlying().contains(0));
- assertTrue(writer.getUnderlying().contains(1 << 17));
- }
-
-
- @ParameterizedTest
- @MethodSource("params")
- public void newKeyShouldTriggerFlush(Supplier> supplier) {
- RoaringBitmapWriter extends BitmapDataProvider> writer = supplier.get();
- writer.add(0);
- writer.add(1 << 17);
- assertTrue(writer.getUnderlying().contains(0));
- writer.add(1 << 18);
- assertTrue(writer.getUnderlying().contains(1 << 17));
- }
-
- @ParameterizedTest
- @MethodSource("params")
- public void writeSameKeyAfterManualFlush(Supplier> supplier) {
- RoaringBitmapWriter extends BitmapDataProvider> writer = supplier.get();
- writer.add(0);
- writer.flush();
- writer.add(1);
- writer.flush();
- assertArrayEquals(RoaringBitmap.bitmapOf(0, 1).toArray(), writer.getUnderlying().toArray());
- }
-
-
- @ParameterizedTest
- @MethodSource("params")
- public void writeRange(Supplier> supplier) {
- RoaringBitmapWriter extends BitmapDataProvider> writer = supplier.get();
- writer.add(0);
- writer.add(65500L, 65600L);
- writer.add(1);
- writer.add(65610);
- writer.flush();
- RoaringBitmap expected = RoaringBitmap.bitmapOf(0, 1, 65610);
- expected.add(65500L, 65600L);
- assertArrayEquals(expected.toArray(), writer.getUnderlying().toArray());
- }
-
- @ParameterizedTest
- @MethodSource("params")
- public void testWriteToMaxKeyAfterFlush(Supplier> supplier) {
- RoaringBitmapWriter writer = supplier.get();
- writer.add(0);
- writer.add(-2);
- writer.flush();
- assertArrayEquals(RoaringBitmap.bitmapOf(0, -2).toArray(), writer.get().toArray());
- writer.add(-1);
- assertArrayEquals(RoaringBitmap.bitmapOf(0, -2, -1).toArray(), writer.get().toArray());
- }
-
-
- @ParameterizedTest
- @MethodSource("params")
- public void testWriteBitmapAfterReset(Supplier> supplier) {
- RoaringBitmapWriter writer = supplier.get();
- writer.add(0);
- writer.add(-2);
- assertArrayEquals(new int[]{0, -2}, writer.get().toArray());
- writer.reset();
- writer.add(100);
- writer.addMany(4, 5, 6);
- assertArrayEquals(new int[]{4, 5, 6, 100}, writer.get().toArray());
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/TestUtil.java b/RoaringBitmap/src/test/java/org/roaringbitmap/TestUtil.java
deleted file mode 100644
index 9fd5ada5e..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/TestUtil.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package org.roaringbitmap;
-
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.Arrays;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.roaringbitmap.SeededTestData.*;
-import static org.roaringbitmap.SeededTestData.sparseRegion;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestUtil {
-
- @Test
- public void testUtilUnsignedIntersection() {
- char[] data1 = fromShorts(new short[]{-19, -17, -15, -13, -11, -9, -7, -5, -3, -1});
- char[] data2 = fromShorts(new short[]{-18, -16, -14, -12, -10, -8, -1});
- assertTrue(Util.unsignedIntersects(data1, data1.length, data2, data2.length));
- char[] data3 = fromShorts(new short[]{-19, -17, -15, -13, -11, -9, -7});
- char[] data4 = fromShorts(new short[]{-18, -16, -14, -12, -10, -8, -6, -4, -2, 0});
- assertFalse(Util.unsignedIntersects(data3, data3.length, data4, data4.length));
- char[] data5 = {};
- char[] data6 = {};
- assertFalse(Util.unsignedIntersects(data5, data5.length, data6, data6.length));
- }
-
- @Test
- public void testBranchyUnsignedBinarySearch() {
- char[] data1 = fromShorts(new short[]{-19, -17, -15, -13, -11, -9, -7, -5, -3});
- assertEquals(8, Util.branchyUnsignedBinarySearch(data1, 0, data1.length, data1[8]));
- assertEquals(0, Util.branchyUnsignedBinarySearch(data1, 0, data1.length, data1[0]));
- assertEquals(data1.length-1, Util.branchyUnsignedBinarySearch(data1, data1.length-1, data1.length, data1[data1.length-1]));
- assertEquals(-1, Util.branchyUnsignedBinarySearch(data1, 0, 0, (char)0));
- assertEquals(-10, Util.branchyUnsignedBinarySearch(data1, 0, data1.length, (char) -1));
- }
-
- @Test
- public void testPartialRadixSortEmpty() {
- int[] data = new int[] {};
- int[] test = Arrays.copyOf(data, data.length);
- Util.partialRadixSort(test);
- assertArrayEquals(data, test);
- }
-
- @Test
- public void testPartialRadixSortIsStableInSameKey() {
- int[] data = new int[] {25, 1, 0, 10};
- for (int key : new int[]{0, 1 << 16, 1 << 17, 1 << 24, 1 << 25}) {
- // clear the old key and prepend the new key
- for (int i = 0; i < data.length; ++i) {
- data[i] &= 0xFFFF;
- data[i] |= key;
- }
- int[] test = Arrays.copyOf(data, data.length);
- Util.partialRadixSort(test);
- assertArrayEquals(data, test);
- }
- }
-
- @Test
- public void testPartialRadixSortSortsKeysCorrectly() {
- int[] keys = {
- // the test expects the first key to be less than the second key,
- // neither should have any of the lower 16 bits set
- 1 << 16, 1 << 25,
- 1 << 16, 1 << 17,
- 1 << 17, 1 << 18,
- 1 << 25, 1 << 26,
- 1 << 23, 1 << 25,
- 1 << 24, 1 << 25,
- 1 << 25, 1 << 27,
- 1 << 29, 1 << 30,
- };
- for (int i = 0; i < keys.length; i += 2) {
- int key1 = keys[i];
- int key2 = keys[i+1];
- int[] data = new int[]{key2 | 25, key1 | 1, 0, key2 | 10, 25, key1 | 10, key1, 10};
- // sort by keys, leave values stable
- int[] expected = new int[]{0, 25, 10, key1 | 1, key1 | 10, key1, key2 | 25, key2 | 10};
- int[] test = Arrays.copyOf(data, data.length);
- Util.partialRadixSort(test);
- assertArrayEquals(expected, test);
- }
- }
-
- @Test
- public void testPartialRadixSortSortsKeysCorrectlyWithDuplicates() {
- int[] keys = {
- // the test expects the first key to be less than the second key,
- // neither should have any of the lower 16 bits set
- 1 << 16, 1 << 25,
- 1 << 16, 1 << 17,
- 1 << 17, 1 << 18,
- 1 << 25, 1 << 26,
- 1 << 23, 1 << 25,
- 1 << 24, 1 << 25,
- 1 << 25, 1 << 27,
- 1 << 29, 1 << 30,
- };
- for (int i = 0; i < keys.length; i += 2) {
- int key1 = keys[i];
- int key2 = keys[i + 1];
- int[] data = new int[]{key2 | 25, key1 | 1, 0, key2 | 10, 25, key1 | 10, key1, 10,
- key2 | 25, key1 | 1, 0, key2 | 10, 25, key1 | 10, key1, 10};
- // sort by keys, leave values stable
- int[] expected = new int[]{0, 25, 10, 0, 25, 10, key1 | 1, key1 | 10, key1, key1 | 1, key1 | 10, key1,
- key2 | 25, key2 | 10, key2 | 25, key2 | 10};
- int[] test = Arrays.copyOf(data, data.length);
- Util.partialRadixSort(test);
- assertArrayEquals(expected, test);
- }
- }
-
- @Test
- public void testAdvanceUntil() {
- char[] data = fromShorts(new short[]{0, 3, 16, 18, 21, 29, 30,-342});
- assertEquals(1, Util.advanceUntil(data, -1, data.length, (char) 3));
- assertEquals(5, Util.advanceUntil(data, -1, data.length, (char) 28));
- assertEquals(5, Util.advanceUntil(data, -1, data.length, (char) 29));
- assertEquals(7, Util.advanceUntil(data, -1, data.length, (char) -342));
- }
-
- @Test
- public void testReverseUntil() {
- char[] data = fromShorts(new short[]{1, 3, 16, 18, 21, 29, 30,-342});
- assertEquals(0, Util.reverseUntil(data, data.length, data.length, (char) 0));
- assertEquals(1, Util.reverseUntil(data, data.length, data.length, (char) 3));
- assertEquals(4, Util.reverseUntil(data, data.length, data.length, (char) 28));
- assertEquals(5, Util.reverseUntil(data, data.length, data.length, (char) 29));
- assertEquals(6, Util.reverseUntil(data, data.length, data.length, (char) 30));
- assertEquals(6, Util.reverseUntil(data, data.length, data.length, (char) 31));
- assertEquals(7, Util.reverseUntil(data, data.length, data.length, (char) -342));
- }
-
- @Test
- public void testIterateUntil() {
- char[] data = fromShorts(new short[]{0, 3, 16, 18, 21, 29, 30,-342});
- assertEquals(1, Util.iterateUntil(data, 0, data.length, ((char) 3)));
- assertEquals(5, Util.iterateUntil(data, 0, data.length, ((char) 28)));
- assertEquals(5, Util.iterateUntil(data, 0, data.length, ((char) 29)));
- assertEquals(7, Util.iterateUntil(data, 0, data.length, ((char) -342)));
- }
-
- static char[] fromShorts(short[] array) {
- char[] result = new char[array.length];
- for (int i = 0 ; i < array.length; ++i) {
- result[i] = (char)(array[i] & 0xFFFF);
- }
- return result;
- }
-
- public static Stream sets() {
- return Stream.of(
- Arguments.of(rleRegion().toArray(), rleRegion().toArray()),
- Arguments.of(denseRegion().toArray(), rleRegion().toArray()),
- Arguments.of(sparseRegion().toArray(), rleRegion().toArray()),
- Arguments.of(rleRegion().toArray(), denseRegion().toArray()),
- Arguments.of(denseRegion().toArray(), denseRegion().toArray()),
- Arguments.of(sparseRegion().toArray(), denseRegion().toArray()),
- Arguments.of(rleRegion().toArray(), sparseRegion().toArray()),
- Arguments.of(denseRegion().toArray(), sparseRegion().toArray()),
- Arguments.of(sparseRegion().toArray(), sparseRegion().toArray())
- );
- }
-
-
- @MethodSource("sets")
- @ParameterizedTest
- public void testIntersectBitmapWithArray(int[] set1, int[] set2) {
- long[] bitmap = new long[1024];
- for (int i : set1) {
- bitmap[i >>> 6] |= 1L << i;
- }
- long[] referenceBitmap = new long[1024];
- char[] array = new char[set2.length];
- int pos = 0;
- for (int i : set2) {
- referenceBitmap[i >>> 6] |= 1L << i;
- array[pos++] = (char)i;
- }
- int expectedCardinality = 0;
- for (int i = 0; i < 1024; ++i) {
- referenceBitmap[i] &= bitmap[i];
- expectedCardinality += Long.bitCount(referenceBitmap[i]);
- }
- int cardinality = Util.intersectArrayIntoBitmap(bitmap, array, array.length);
- assertEquals(expectedCardinality, cardinality);
- assertArrayEquals(referenceBitmap, bitmap);
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/UnorderedRoaringBitmapWriterRandomisedTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/UnorderedRoaringBitmapWriterRandomisedTest.java
deleted file mode 100644
index 4fff1ae22..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/UnorderedRoaringBitmapWriterRandomisedTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.roaringbitmap;
-
-
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-
-@Execution(ExecutionMode.CONCURRENT)
-public class UnorderedRoaringBitmapWriterRandomisedTest {
-
-
- public static Stream tests() {
- return Stream.of(
- Arguments.of(generateUnorderedArray(0)),
- Arguments.of(generateUnorderedArray(10)),
- Arguments.of(generateUnorderedArray(100)),
- Arguments.of(generateUnorderedArray(1000)),
- Arguments.of(generateUnorderedArray(10000)),
- Arguments.of(generateUnorderedArray(100000)),
- Arguments.of(generateUnorderedArray(1000000)));
- }
-
- @ParameterizedTest
- @MethodSource("tests")
- public void bitmapOfUnorderedShouldBuildSameBitmapAsBitmapOf(int[] data) {
- RoaringBitmap baseline = RoaringBitmap.bitmapOf(data);
- RoaringBitmap test = RoaringBitmap.bitmapOfUnordered(data);
- RoaringArray baselineHLC = baseline.highLowContainer;
- RoaringArray testHLC = test.highLowContainer;
- assertEquals(baselineHLC.size, testHLC.size);
- for (int i = 0; i < baselineHLC.size; ++i) {
- Container baselineContainer = baselineHLC.getContainerAtIndex(i);
- Container rbContainer = testHLC.getContainerAtIndex(i);
- assertEquals(baselineContainer, rbContainer);
- }
- assertEquals(baseline, test);
- }
-
- private static int[] generateUnorderedArray(int size) {
- if (size == 0) {
- return new int[0];
- }
- Random random = new Random();
- List ints = new ArrayList<>(size);
- int last = 0;
- for (int i = 0; i < size; ++i) {
- if (random.nextGaussian() > 0.1) {
- last = last + 1;
- } else {
- last = last + 1 + random.nextInt(99);
- }
- ints.add(last);
- }
- Collections.shuffle(ints);
- int[] data = new int[size];
- int i = 0;
- for (Integer value : ints) {
- data[i++] = value;
- }
- return data;
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/BufferContainerBatchIteratorTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/BufferContainerBatchIteratorTest.java
deleted file mode 100644
index f446e9b3d..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/BufferContainerBatchIteratorTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package org.roaringbitmap.buffer;
-
-
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.roaringbitmap.Container;
-import org.roaringbitmap.ContainerBatchIterator;
-import org.roaringbitmap.SeededTestData;
-
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static java.util.Arrays.copyOfRange;
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class BufferContainerBatchIteratorTest {
-
- private static int[][] DATA;
-
- @BeforeAll
- public static void setup() {
- DATA = Stream.of(
- IntStream.range(0, 20000).toArray(),
- IntStream.range(0, 1 << 16).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> i < 500 || i > 2000).filter(i -> i < (1 << 15) || i > ((1 << 15) | (1 << 8))).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 12) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 11) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 10) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 9) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 8) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 7) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 6) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 5) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 4) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 3) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 2) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> ((i >>> 1) & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i & 1) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 3) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 5) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 7) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 9) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 271) == 0).toArray(),
- IntStream.range(0, 1 << 16).filter(i -> (i % 1000) == 0).toArray(),
- IntStream.empty().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.sparseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.denseRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray(),
- SeededTestData.rleRegion().toArray()).toArray(int[][]::new);
- }
-
- @AfterAll
- public static void clear() {
- DATA = null;
- }
-
- public static Stream params() {
- return Stream.of(DATA)
- .flatMap(array -> IntStream.concat(IntStream.of(
- 512, 1024, 2048, 4096, 8192, 65536
- ), IntStream.range(0, 100).map(i -> ThreadLocalRandom.current().nextInt(1, 65536)))
- .mapToObj(i -> Arguments.of(array, i)));
- }
-
-
- @ParameterizedTest(name = "{1}")
- @MethodSource("params")
- public void test(int[] expectedValues, int batchSize) {
- int[] buffer = new int[batchSize];
- MappeableContainer container = createContainer(expectedValues);
- ContainerBatchIterator it = container.getBatchIterator();
- int cardinality = 0;
- while (it.hasNext()) {
- int from = cardinality;
- cardinality += it.next(0, buffer);
- assertArrayEquals(
- copyOfRange(expectedValues, from, cardinality), copyOfRange(buffer, 0, cardinality - from),
- "Failure with batch size " + batchSize);
- }
- assertEquals(expectedValues.length, cardinality);
- }
-
-
- @ParameterizedTest(name = "{1}")
- @MethodSource("params")
- public void testAdvanceIfNeeded(int[] expectedValues, int batchSize) {
- if (expectedValues.length < 2) {
- return;
- }
- int[] buffer = new int[batchSize];
- MappeableContainer container = createContainer(expectedValues);
- ContainerBatchIterator it = container.getBatchIterator();
- int cardinality = expectedValues.length / 2;
- int advanceUntil = expectedValues[cardinality];
- it.advanceIfNeeded((char) advanceUntil);
- while (it.hasNext()) {
- int from = cardinality;
- cardinality += it.next(0, buffer);
- assertArrayEquals(
- copyOfRange(expectedValues, from, cardinality), copyOfRange(buffer, 0, cardinality - from),
- "Failure with batch size " + batchSize + " and container type " + container.getContainerName());
- }
- assertEquals(expectedValues.length, cardinality);
- }
-
- private MappeableContainer createContainer(int[] expectedValues) {
- MappeableContainer container = new MappeableArrayContainer();
- for (int value : expectedValues) {
- container = container.add((char) value);
- }
- return container.runOptimize();
- }
-}
\ No newline at end of file
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/ImmutableRoaringBitmapBatchIteratorTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/ImmutableRoaringBitmapBatchIteratorTest.java
deleted file mode 100644
index 4adeb5654..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/ImmutableRoaringBitmapBatchIteratorTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package org.roaringbitmap.buffer;
-
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.roaringbitmap.BatchIterator;
-import org.roaringbitmap.IntIterator;
-import org.roaringbitmap.RoaringBitmapWriter;
-
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.roaringbitmap.RoaringBitmapWriter.bufferWriter;
-import static org.roaringbitmap.SeededTestData.TestDataSet.testCase;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class ImmutableRoaringBitmapBatchIteratorTest {
-
- private static ImmutableRoaringBitmap[] BITMAPS;
-
- private static final int[] SIZES = {
- 128, 256, 1024, 8192, 5, 127, 1023
- };
-
- @BeforeAll
- public static void beforeAll() {
- BITMAPS = new ImmutableRoaringBitmap[] {
- testCase().withArrayAt(0).withArrayAt(2).withArrayAt(4).withArrayAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- testCase().withRunAt(0).withRunAt(2).withRunAt(4).withRunAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withRunAt(2).withBitmapAt(4).withBitmapAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- testCase().withArrayAt(0).withBitmapAt(2).withRunAt(4).withBitmapAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- testCase().withRunAt(0).withArrayAt(2).withBitmapAt(4).withRunAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withRunAt(2).withArrayAt(4).withBitmapAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- testCase().withArrayAt(0).withBitmapAt(2).withRunAt(4).withArrayAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withArrayAt(2).withBitmapAt(4).withRunAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- testCase().withRunAt((1 << 15) | (1 << 11)).withBitmapAt((1 << 15) | (1 << 12)).withArrayAt((1 << 15) | (1 << 13)).withBitmapAt((1 << 15) | (1 << 14)).build().toMutableRoaringBitmap(),
- MutableRoaringBitmap.bitmapOf(IntStream.range(1 << 10, 1 << 26).filter(i -> (i & 1) == 0).toArray()),
- MutableRoaringBitmap.bitmapOf(IntStream.range(1 << 10, 1 << 25).filter(i -> ((i >>> 8) & 1) == 0).toArray()),
- MutableRoaringBitmap.bitmapOf(IntStream.range(0,127).toArray()),
- MutableRoaringBitmap.bitmapOf(IntStream.range(0,1024).toArray()),
- MutableRoaringBitmap.bitmapOf(IntStream.concat(IntStream.range(0,256), IntStream.range(1 << 16, (1 << 16) | 256)).toArray()),
- ImmutableRoaringBitmap.bitmapOf(8511),
- new MutableRoaringBitmap()
- };
- }
-
- @AfterAll
- public static void clear() {
- BITMAPS = null;
- }
-
- public static Stream params() {
- return Stream.of(BITMAPS)
- .flatMap(bitmap -> IntStream.of(SIZES).mapToObj(i -> Arguments.of(bitmap, i)));
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void testBatchIteratorAsIntIterator(MutableRoaringBitmap bitmap, int batchSize) {
- IntIterator it = bitmap.getBatchIterator().asIntIterator(new int[batchSize]);
- RoaringBitmapWriter w = bufferWriter().constantMemory()
- .initialCapacity(bitmap.highLowContainer.size()).get();
- while (it.hasNext()) {
- w.add(it.next());
- }
- MutableRoaringBitmap copy = w.get();
- assertEquals(bitmap, copy);
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void test(MutableRoaringBitmap bitmap, int batchSize) {
- int[] buffer = new int[batchSize];
- MutableRoaringBitmap result = new MutableRoaringBitmap();
- BatchIterator it = bitmap.getBatchIterator();
- int cardinality = 0;
- while (it.hasNext()) {
- int batch = it.nextBatch(buffer);
- for (int i = 0; i < batch; ++i) {
- result.add(buffer[i]);
- }
- cardinality += batch;
- }
- assertEquals(bitmap, result);
- assertEquals(bitmap.getCardinality(), cardinality);
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void testBatchIteratorAdvancedIfNeeded(MutableRoaringBitmap bitmap, int batchSize) {
- final int cardinality = bitmap.getCardinality();
- if (cardinality < 2) {
- return;
- }
- int midpoint = bitmap.select(cardinality / 2);
- int[] buffer = new int[batchSize];
- MutableRoaringBitmap result = new MutableRoaringBitmap();
- BatchIterator it = bitmap.getBatchIterator();
- it.advanceIfNeeded(midpoint);
- int consumed = 0;
- while (it.hasNext()) {
- int batch = it.nextBatch(buffer);
- for (int i = 0; i < batch; ++i) {
- result.add(buffer[i]);
- }
- consumed += batch;
- }
- MutableRoaringBitmap expected = bitmap.clone();
- expected.remove(0, midpoint & 0xFFFFFFFFL);
- assertEquals(expected, result);
- assertEquals(expected.getCardinality(), consumed);
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void testBatchIteratorAdvancedIfNeededToAbsentValue(MutableRoaringBitmap bitmap, int batchSize) {
- long firstAbsent = bitmap.nextAbsentValue(0);
- int[] buffer = new int[batchSize];
- MutableRoaringBitmap result = new MutableRoaringBitmap();
- BatchIterator it = bitmap.getBatchIterator();
- it.advanceIfNeeded((int) firstAbsent);
- int consumed = 0;
- while (it.hasNext()) {
- int batch = it.nextBatch(buffer);
- for (int i = 0; i < batch; ++i) {
- result.add(buffer[i]);
- }
- consumed += batch;
- }
- MutableRoaringBitmap expected = bitmap.clone();
- expected.remove(0, firstAbsent & 0xFFFFFFFFL);
- assertEquals(expected, result);
- assertEquals(expected.getCardinality(), consumed);
- }
-
- @ParameterizedTest(name="offset={1}")
- @MethodSource("params")
- public void testBatchIteratorAdvancedIfNeededBeyondLastValue(MutableRoaringBitmap bitmap, int batchSize) {
- long advanceTo = bitmap.isEmpty() ? 0 : bitmap.last() + 1;
- int[] buffer = new int[batchSize];
- MutableRoaringBitmap result = new MutableRoaringBitmap();
- BatchIterator it = bitmap.getBatchIterator();
- it.advanceIfNeeded((int) advanceTo);
- int consumed = 0;
- while (it.hasNext()) {
- int batch = it.nextBatch(buffer);
- for (int i = 0; i < batch; ++i) {
- result.add(buffer[i]);
- }
- consumed += batch;
- }
- assertEquals(0, consumed);
- assertTrue(result.isEmpty());
- }
-
- @Test
- public void testTimelyTermination() {
- ImmutableRoaringBitmap bm = ImmutableRoaringBitmap.bitmapOf(8511);
- BatchIterator bi = bm.getBatchIterator();
- int[] batch = new int[10];
- assertTrue(bi.hasNext());
- int n = bi.nextBatch(batch);
- assertEquals(n, 1);
- assertEquals(batch[0], 8511);
- assertFalse(bi.hasNext());
- }
- @Test
- public void testTimelyTerminationAfterAdvanceIfNeeded() {
- ImmutableRoaringBitmap bm = ImmutableRoaringBitmap.bitmapOf(8511);
- BatchIterator bi = bm.getBatchIterator();
- assertTrue(bi.hasNext());
- bi.advanceIfNeeded(8512);
- assertFalse(bi.hasNext());
- }
-
- @Test
- public void testBatchIteratorWithAdvanceIfNeeded() {
- MutableRoaringBitmap bitmap = MutableRoaringBitmap.bitmapOf(3 << 16, (3 << 16) + 5, (3 << 16) + 10);
- BatchIterator it = bitmap.getBatchIterator();
- it.advanceIfNeeded(6);
- assertTrue(it.hasNext());
- int[] batch = new int[10];
- int n = it.nextBatch(batch);
- assertEquals(n, 3);
- assertEquals(batch[0], 3 << 16);
- assertEquals(batch[1], (3 << 16) + 5);
- assertEquals(batch[2], (3 << 16) + 10);
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/MutableRoaringBitmapSubsetTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/MutableRoaringBitmapSubsetTest.java
deleted file mode 100644
index c3c35222e..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/MutableRoaringBitmapSubsetTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.roaringbitmap.buffer;
-
-import com.google.common.collect.*;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.util.Set;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class MutableRoaringBitmapSubsetTest {
-
-
- private static final Predicate DIVISIBLE_BY_4 = i -> i % 4 == 0;
-
- private static final Predicate DIVISIBLE_BY_3 = i -> i % 3 == 0;
-
-
- public static Stream params() {
- return Stream.of(
- Arguments.of( // array vs array
- ImmutableSet.of(1, 2, 3, 4),
- ImmutableSet.of(2, 3)
- ),
- Arguments.of( // array vs empty
- ImmutableSet.of(1, 2, 3, 4),
- ImmutableSet.of()
- ),
- Arguments.of( // identical arrays
- ImmutableSet.of(1, 2, 3, 4),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of( // disjoint arrays
- ImmutableSet.of(10, 12, 14, 15),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of(// disjoint arrays, cardinality mismatch
- ImmutableSet.of(10, 12, 14),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of( // run vs array, subset
- ContiguousSet.create(Range.closed(1, 1 << 8), DiscreteDomain.integers()),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of( // run vs array, subset
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers()),
- ImmutableSet.of(1, 2, 3, 4)
- ),
- Arguments.of( // run vs empty
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers()),
- ImmutableSet.of()
- ),
- Arguments.of( // identical runs, 1 container
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers()),
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers())
- ),
- Arguments.of( // identical runs, 2 containers
- ContiguousSet.create(Range.closed(1, 1 << 20), DiscreteDomain.integers()),
- ContiguousSet.create(Range.closed(1, 1 << 20), DiscreteDomain.integers())
- ),
- Arguments.of( // disjoint array vs run, either side of container boundary
- ContiguousSet.create(Range.closed(1, 1 << 16), DiscreteDomain.integers()),
- ImmutableSet.of((1 << 16) + 1, (1 << 16) + 2, (1 << 16) + 3, (1 << 16) + 4)
- ),
- Arguments.of( // disjoint array vs run
- ContiguousSet.create(Range.closed(3, 1 << 16), DiscreteDomain.integers()),
- ImmutableSet.of(1, 2)
- ),
- Arguments.of( // run vs run, overlap with shift
- ContiguousSet.create(Range.closed(1, 1 << 8), DiscreteDomain.integers()),
- ContiguousSet.create(Range.closed(1 << 4, 1 << 12), DiscreteDomain.integers())
- ),
- Arguments.of( // run vs run, subset
- ContiguousSet.create(Range.closed(1, 1 << 20), DiscreteDomain.integers()),
- ImmutableSet.of(1, 1 << 8)
- ),
- Arguments.of( // run vs run, overlap with shift, 2 containers
- ContiguousSet.create(Range.closed(1, 1 << 20), DiscreteDomain.integers()),
- ImmutableSet.of(1 << 6, 1 << 26)
- ),
- Arguments.of( // run vs 2 container run, overlap
- ImmutableSet.of(1, 1 << 16),
- ContiguousSet.create(Range.closed(0, 1 << 20), DiscreteDomain.integers())
- ),
- Arguments.of( // bitmap vs intersecting array
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test)),
- ImmutableSet.of(4, 8)
- ),
- Arguments.of( // bitmap vs bitmap, cardinality mismatch
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 16),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test)),
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test))
- ),
- Arguments.of( // bitmap vs empty
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test)),
- ImmutableSet.of()
- ),
- Arguments.of( // identical bitmaps
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test)),
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test))
- ),
- Arguments.of( // bitmap vs overlapping but disjoint array
- ImmutableSet.of(3, 7),
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test))
- ),
- Arguments.of( // bitmap vs overlapping but disjoint bitmap
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_3::test)),
- ImmutableSet.copyOf(Iterables.filter(ContiguousSet.create(Range.closed(1, 1 << 15),
- DiscreteDomain.integers()),
- DIVISIBLE_BY_4::test))
- ),
- Arguments.of( // disjoint, large (signed-negative) keys
- ImmutableSet.of(0xbf09001d, 0xbf090169),
- ImmutableSet.of(0x8088000e, 0x80880029)
- ));
- }
-
-
- @ParameterizedTest
- @MethodSource("params")
- public void testProperSubset(Set superSet, Set subSet) {
- MutableRoaringBitmap superSetRB = create(superSet);
- MutableRoaringBitmap subSetRB = create(subSet);
- assertEquals(superSet.containsAll(subSet), superSetRB.contains(subSetRB));
- // reverse the test
- assertEquals(subSet.containsAll(superSet), subSetRB.contains(superSetRB));
- }
-
- private MutableRoaringBitmap create(Set set) {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- if (set instanceof ContiguousSet) {
- ContiguousSet contiguousSet = (ContiguousSet) set;
- rb.add(contiguousSet.first().longValue(), contiguousSet.last().longValue());
- } else {
- for (Integer i : set) {
- rb.add(i);
- }
- }
- return rb;
- }
-
-
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/RoaringBitmapIntervalIntersectionTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/RoaringBitmapIntervalIntersectionTest.java
deleted file mode 100644
index 9a6dcb1f3..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/RoaringBitmapIntervalIntersectionTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.roaringbitmap.buffer;
-
-
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.roaringbitmap.RoaringBitmap;
-
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.roaringbitmap.SeededTestData.TestDataSet.testCase;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class RoaringBitmapIntervalIntersectionTest {
-
- private static Arguments[] ARGS;
-
- @BeforeAll
- public static void before() {
- ARGS = new Arguments[] {
- Arguments.of(RoaringBitmap.bitmapOf(1, 2, 3).toMutableRoaringBitmap(), 0, 1 << 16),
- Arguments.of(RoaringBitmap.bitmapOf(1, 2, 3).toMutableRoaringBitmap(), 1, 1),
- Arguments.of(RoaringBitmap.bitmapOf(1 << 31 | 1 << 30).toMutableRoaringBitmap(), 0, 1 << 16),
- Arguments.of(RoaringBitmap.bitmapOf(1 << 31 | 1 << 30).toMutableRoaringBitmap(), 0, 256),
- Arguments.of(RoaringBitmap.bitmapOf(1, 1 << 31 | 1 << 30).toMutableRoaringBitmap(), 0, 256),
- Arguments.of(RoaringBitmap.bitmapOf(1, 1 << 16, 1 << 31 | 1 << 30).toMutableRoaringBitmap(), 0, 1L << 32),
- Arguments.of(testCase().withArrayAt(10).withBitmapAt(20).withRunAt(30)
- .withRange(70000L, 150000L).build().toMutableRoaringBitmap(), 70000L, 150000L),
- Arguments.of(testCase().withArrayAt(10).withBitmapAt(20).withRunAt(30)
- .withRange(70000L, 150000L).build().toMutableRoaringBitmap(), 71000L, 140000L),
- Arguments.of(testCase().withArrayAt(0).withBitmapAt(1).withRunAt(20).build().toMutableRoaringBitmap(), 67000, 150000),
- Arguments.of(testCase().withBitmapAt(0).withArrayAt(1).withRunAt(20).build().toMutableRoaringBitmap(), 67000, 150000),
- Arguments.of(testCase().withBitmapAt(0).withRunAt(1).withArrayAt(20).build().toMutableRoaringBitmap(), 67000, 150000),
- Arguments.of(testCase().withArrayAt(0)
- .withArrayAt(1)
- .withArrayAt(2)
- .withBitmapAt(200)
- .withRunAt(205).build().toMutableRoaringBitmap(), 199 * (1 << 16), 200 * (1 << 16) + (1 << 14))
- };
- }
-
- @AfterAll
- public static void after() {
- ARGS = null;
- }
-
-
- public static Stream params() {
- return Stream.of(ARGS);
- }
-
-
- @ParameterizedTest
- @MethodSource("params")
- public void test(MutableRoaringBitmap bitmap, long minimum, long supremum) {
- MutableRoaringBitmap test = new MutableRoaringBitmap();
- test.add(minimum, supremum);
- assertEquals(ImmutableRoaringBitmap.intersects(bitmap, test), bitmap.intersects(minimum, supremum));
- }
-
- @ParameterizedTest
- @MethodSource("params")
- public void testIntersects(MutableRoaringBitmap bitmap, long minimum, long supremum) {
- MutableRoaringBitmap test = new MutableRoaringBitmap();
- test.add(minimum, supremum);
- assertEquals(MutableRoaringBitmap.intersects(bitmap, test), bitmap.intersects(minimum, supremum));
- }
-
- @ParameterizedTest
- @MethodSource("params")
- public void testContains(MutableRoaringBitmap bitmap, long minimum, long supremum) {
- MutableRoaringBitmap test = new MutableRoaringBitmap();
- test.add(minimum, supremum);
- assertEquals(!test.isEmpty() && bitmap.contains(test), bitmap.contains(minimum, supremum));
- assertTrue(test.isEmpty() || test.contains(minimum, supremum));
- }
-
- @ParameterizedTest
- @MethodSource("params")
- public void ifContainsThenIntersects(MutableRoaringBitmap bitmap, long minimum, long supremum) {
- boolean contains = bitmap.contains(minimum, supremum);
- boolean intersects = bitmap.intersects(minimum, supremum);
- assertTrue(!contains || intersects);
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestBufferAdversarialInputs.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestBufferAdversarialInputs.java
deleted file mode 100644
index cd3cf3c7c..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestBufferAdversarialInputs.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.roaringbitmap.buffer;
-
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.roaringbitmap.TestAdversarialInputs;
-
-import java.io.*;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.file.CopyOption;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-
-public class TestBufferAdversarialInputs {
-
- public static Stream badFiles() {
- return TestAdversarialInputs.badFiles();
- }
-
- // copy to a temporary file
- protected static File copy(String resourceName) throws IOException {
- File tmpFile = File.createTempFile(TestBufferAdversarialInputs.class.getName(), "bin");
- tmpFile.deleteOnExit();
-
- try (InputStream input = TestAdversarialInputs.openInputstream(resourceName)) {
- Files.copy(input, tmpFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
- }
-
- return tmpFile;
- }
-
- public ByteBuffer memoryMap(String resourceName) throws IOException {
- File tmpfile = copy(resourceName);
- long totalcount = tmpfile.length();
- RandomAccessFile memoryMappedFile = new RandomAccessFile(tmpfile, "r");
- ByteBuffer bb = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, totalcount); // even though we have two bitmaps, we have one map, maps are expensive!!!
- memoryMappedFile.close(); // we can safely close
- bb.position(0);
- return bb;
- }
-
- @Test
- public void testInputGoodFile1() throws IOException {
- File file = copy("/testdata/bitmapwithruns.bin");
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- // should not throw an exception
- rb.deserialize(new DataInputStream(new FileInputStream(file)));
- assertEquals(rb.getCardinality(), 200100);
- file.delete();
- }
-
- @Test
- public void testInputGoodFile1Mapped() throws IOException {
- ByteBuffer bb = memoryMap("/testdata/bitmapwithruns.bin");
- ImmutableRoaringBitmap rb = new ImmutableRoaringBitmap(bb);
- assertEquals(rb.getCardinality(), 200100);
- }
-
- @Test
- public void testInputGoodFile2() throws IOException {
- File file = copy("/testdata/bitmapwithoutruns.bin");
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- // should not throw an exception
- rb.deserialize(new DataInputStream(new FileInputStream(file)));
- assertEquals(rb.getCardinality(), 200100);
- file.delete();
- }
-
- @Test
- public void testInputGoodFile2Mapped() throws IOException {
- ByteBuffer bb = memoryMap("/testdata/bitmapwithoutruns.bin");
- ImmutableRoaringBitmap rb = new ImmutableRoaringBitmap(bb);
- assertEquals(rb.getCardinality(), 200100);
- }
-
- @ParameterizedTest
- @MethodSource("badFiles")
- public void testInputBadFileDeserialize(String file) {
- assertThrows(IOException.class, () -> deserialize(file));
- }
-
- @ParameterizedTest
- @MethodSource("badFiles")
- public void testInputBadFileMap(String file) {
- if (file.endsWith("7.bin")) {
- assertThrows(IllegalArgumentException.class, () -> map(file));
- } else {
- assertThrows(IndexOutOfBoundsException.class, () -> map(file));
- }
- }
-
- private void deserialize(String fileName) throws IOException {
- File file = copy(fileName);
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- // should not work
- rb.deserialize(new DataInputStream(new FileInputStream(file)));
- file.delete();
- }
-
- private void map(String fileName) throws IOException {
- ByteBuffer bb = memoryMap(fileName);
- ImmutableRoaringBitmap rb = new ImmutableRoaringBitmap(bb);
- System.out.println(rb.getCardinality()); // won't get here
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestBufferRangeCardinality.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestBufferRangeCardinality.java
deleted file mode 100644
index cf9efd946..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestBufferRangeCardinality.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.roaringbitmap.buffer;
-
-
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.nio.ByteBuffer;
-import java.nio.LongBuffer;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-
-public class TestBufferRangeCardinality {
-
-
- public static Stream data() {
- return Stream.of(
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 3, 8, 3),
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 2, 8, 3),
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 3, 7, 2),
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 0, 7, 3),
- Arguments.of(new int[]{1, 3, 5, 7, 9}, 0, 6, 3),
- Arguments.of(new int[]{1, 3, 5, 7, 9, Short.MAX_VALUE}, 0, Short.MAX_VALUE + 1, 6),
- Arguments.of(new int[]{1, 10000, 25000, Short.MAX_VALUE - 1}, 0, Short.MAX_VALUE, 4),
- Arguments.of(new int[]{1 << 3, 1 << 8, 511, 512, 513, 1 << 12, 1 << 14}, 0, Short.MAX_VALUE, 7)
- );
- }
-
- @ParameterizedTest(name = "{index}: cardinalityInBitmapRange({0},{1},{2})={3}")
- @MethodSource("data")
- public void testCardinalityInBitmapWordRange(int[] elements, int begin, int end, int expected) {
- LongBuffer array = ByteBuffer.allocateDirect(MappeableBitmapContainer.MAX_CAPACITY / 8).asLongBuffer();
- MappeableBitmapContainer bc = new MappeableBitmapContainer(array, 0);
- for (int e : elements) {
- bc.add((char) e);
- }
- assertFalse(bc.isArrayBacked());
- assertEquals(expected, BufferUtil.cardinalityInBitmapRange(bc.bitmap, begin, end));
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestFastAggregation.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestFastAggregation.java
deleted file mode 100644
index 3674be408..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestFastAggregation.java
+++ /dev/null
@@ -1,301 +0,0 @@
-package org.roaringbitmap.buffer;
-
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.roaringbitmap.SeededTestData.TestDataSet.testCase;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestFastAggregation {
-
- private static ImmutableRoaringBitmap toDirect(MutableRoaringBitmap r) {
- ByteBuffer buffer = ByteBuffer.allocateDirect(r.serializedSizeInBytes());
- r.serialize(buffer);
- buffer.flip();
- return new ImmutableRoaringBitmap(buffer);
- }
-
- private static ImmutableRoaringBitmap toMapped(MutableRoaringBitmap r) {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- DataOutputStream dos = new DataOutputStream(bos);
- try {
- r.serialize(dos);
- dos.close();
- } catch (IOException e) {
- throw new RuntimeException(e.toString());
- }
- ByteBuffer bb = ByteBuffer.wrap(bos.toByteArray());
- return new ImmutableRoaringBitmap(bb);
- }
-
- @Test
- public void testNaiveAnd() {
- int[] array1 = {39173, 39174};
- int[] array2 = {39173, 39174, 39175, 39176, 39177, 39178, 39179};
- int[] array3 = {39173, 39174};
- int[] array4 = {};
- MutableRoaringBitmap data1 = MutableRoaringBitmap.bitmapOf(array1);
- MutableRoaringBitmap data2 = MutableRoaringBitmap.bitmapOf(array2);
- MutableRoaringBitmap data3 = MutableRoaringBitmap.bitmapOf(array3);
- MutableRoaringBitmap data4 = MutableRoaringBitmap.bitmapOf(array4);
- assertEquals(data3, BufferFastAggregation.naive_and(data1, data2));
- assertEquals(new MutableRoaringBitmap(), BufferFastAggregation.naive_and(data4));
- }
-
- @Test
- public void testPriorityQueueOr() {
- int[] array1 = {1232, 3324, 123, 43243, 1322, 7897, 8767};
- int[] array2 = {39173, 39174, 39175, 39176, 39177, 39178, 39179};
- int[] array3 =
- {1232, 3324, 123, 43243, 1322, 7897, 8767, 39173, 39174, 39175, 39176, 39177, 39178, 39179};
- int[] array4 = {};
- ArrayList data5 = new ArrayList<>();
- ArrayList data6 = new ArrayList<>();
- MutableRoaringBitmap data1 = MutableRoaringBitmap.bitmapOf(array1);
- MutableRoaringBitmap data2 = MutableRoaringBitmap.bitmapOf(array2);
- MutableRoaringBitmap data3 = MutableRoaringBitmap.bitmapOf(array3);
- MutableRoaringBitmap data4 = MutableRoaringBitmap.bitmapOf(array4);
- data5.add(data1);
- data5.add(data2);
- assertEquals(data3, BufferFastAggregation.priorityqueue_or(data1, data2));
- assertEquals(data1, BufferFastAggregation.priorityqueue_or(data1));
- assertEquals(data1, BufferFastAggregation.priorityqueue_or(data1, data4));
- assertEquals(data3, BufferFastAggregation.priorityqueue_or(data5.iterator()));
- assertEquals(new MutableRoaringBitmap(),
- BufferFastAggregation.priorityqueue_or(data6.iterator()));
- data6.add(data1);
- assertEquals(data1, BufferFastAggregation.priorityqueue_or(data6.iterator()));
- }
-
- @Test
- public void testPriorityQueueXor() {
- assertThrows(IllegalArgumentException.class, () -> {
- int[] array1 = {1232, 3324, 123, 43243, 1322, 7897, 8767};
- int[] array2 = {39173, 39174, 39175, 39176, 39177, 39178, 39179};
- int[] array3 =
- {1232, 3324, 123, 43243, 1322, 7897, 8767, 39173, 39174, 39175, 39176, 39177, 39178, 39179};
- ImmutableRoaringBitmap data1 = MutableRoaringBitmap.bitmapOf(array1);
- ImmutableRoaringBitmap data2 = MutableRoaringBitmap.bitmapOf(array2);
- ImmutableRoaringBitmap data3 = MutableRoaringBitmap.bitmapOf(array3);
- assertEquals(data3, BufferFastAggregation.priorityqueue_xor(data1, data2));
- BufferFastAggregation.priorityqueue_xor(data1);
- });
- }
-
-
- @Test
- public void testNaiveAndMapped() {
- int[] array1 = {39173, 39174};
- int[] array2 = {39173, 39174, 39175, 39176, 39177, 39178, 39179};
- int[] array3 = {39173, 39174};
- int[] array4 = {};
- ImmutableRoaringBitmap data1 = toMapped(MutableRoaringBitmap.bitmapOf(array1));
- ImmutableRoaringBitmap data2 = toMapped(MutableRoaringBitmap.bitmapOf(array2));
- ImmutableRoaringBitmap data3 = toMapped(MutableRoaringBitmap.bitmapOf(array3));
- ImmutableRoaringBitmap data4 = toMapped(MutableRoaringBitmap.bitmapOf(array4));
- assertEquals(data3, BufferFastAggregation.naive_and(data1, data2));
- assertEquals(new MutableRoaringBitmap(), BufferFastAggregation.naive_and(data4));
- }
-
- @Test
- public void testPriorityQueueOrMapped() {
- int[] array1 = {1232, 3324, 123, 43243, 1322, 7897, 8767};
- int[] array2 = {39173, 39174, 39175, 39176, 39177, 39178, 39179};
- int[] array3 =
- {1232, 3324, 123, 43243, 1322, 7897, 8767, 39173, 39174, 39175, 39176, 39177, 39178, 39179};
- int[] array4 = {};
- ArrayList data5 = new ArrayList<>();
- ArrayList data6 = new ArrayList<>();
- ImmutableRoaringBitmap data1 = toMapped(MutableRoaringBitmap.bitmapOf(array1));
- ImmutableRoaringBitmap data2 = toMapped(MutableRoaringBitmap.bitmapOf(array2));
- ImmutableRoaringBitmap data3 = toMapped(MutableRoaringBitmap.bitmapOf(array3));
- ImmutableRoaringBitmap data4 = toMapped(MutableRoaringBitmap.bitmapOf(array4));
- data5.add(data1);
- data5.add(data2);
- assertEquals(data3, BufferFastAggregation.priorityqueue_or(data1, data2));
- assertEquals(data1, BufferFastAggregation.priorityqueue_or(data1));
- assertEquals(data1, BufferFastAggregation.priorityqueue_or(data1, data4));
- assertEquals(data3, BufferFastAggregation.priorityqueue_or(data5.iterator()));
- assertEquals(new MutableRoaringBitmap(),
- BufferFastAggregation.priorityqueue_or(data6.iterator()));
- data6.add(data1);
- assertEquals(data1, BufferFastAggregation.priorityqueue_or(data6.iterator()));
- }
-
- public void testBigOrMapped() {
- MutableRoaringBitmap rb1 = new MutableRoaringBitmap();
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
- MutableRoaringBitmap rb3 = new MutableRoaringBitmap();
- for(int k = 100; k < 10000; ++k) {
- if((k % 3) == 0) {
- rb1.add(k);
- }
- if((k % 3) == 1) {
- rb2.add(k);
- }
- if((k % 3) == 2) {
- rb3.add(k);
- }
- }
- ImmutableRoaringBitmap data1 = toMapped(rb1);
- ImmutableRoaringBitmap data2 = toMapped(rb2);
- ImmutableRoaringBitmap data3 = toMapped(rb3);
- MutableRoaringBitmap mrb = data1.clone().toMutableRoaringBitmap();
- mrb.add(100L,10000L);
- assertEquals(mrb, BufferFastAggregation.or(data1,data2,data3));
- }
-
- @Test
- public void testPriorityQueueXorMapped() {
- assertThrows(IllegalArgumentException.class, () -> {
- int[] array1 = {1232, 3324, 123, 43243, 1322, 7897, 8767};
- int[] array2 = {39173, 39174, 39175, 39176, 39177, 39178, 39179};
- int[] array3 =
- {1232, 3324, 123, 43243, 1322, 7897, 8767, 39173, 39174, 39175, 39176, 39177, 39178, 39179};
- ImmutableRoaringBitmap data1 = toMapped(MutableRoaringBitmap.bitmapOf(array1));
- ImmutableRoaringBitmap data2 = toMapped(MutableRoaringBitmap.bitmapOf(array2));
- ImmutableRoaringBitmap data3 = toMapped(MutableRoaringBitmap.bitmapOf(array3));
- assertEquals(data3, BufferFastAggregation.priorityqueue_xor(data1, data2));
- BufferFastAggregation.priorityqueue_xor(data1);
- });
- }
-
-
- public static Stream bitmaps() {
- return Stream.of(
- Arguments.of(Arrays.asList(
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withBitmapAt(0).withRunAt(1).withArrayAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withRunAt(1).withArrayAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withRunAt(1).withArrayAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withRunAt(1).withBitmapAt(2).build().toMutableRoaringBitmap(),
- testCase().withArrayAt(0).withRunAt(1).withBitmapAt(2).build().toMutableRoaringBitmap(),
- testCase().withArrayAt(0).withRunAt(1).withBitmapAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withArrayAt(3).withRunAt(4).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withBitmapAt(1).withRunAt(2).build().toMutableRoaringBitmap(),
- testCase().withRunAt(0).withArrayAt(1).withBitmapAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withRunAt(1).withArrayAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withArrayAt(2).withRunAt(4).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withArrayAt(1).withRunAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withArrayAt(1).withArrayAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withBitmapAt(2).withBitmapAt(4).build().toMutableRoaringBitmap(),
- testCase().withRunAt(0).withRunAt(1).withRunAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withArrayAt(1).withArrayAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withBitmapAt(2).withArrayAt(4).build().toMutableRoaringBitmap(),
- testCase().withRunAt(0).withRunAt(1).withArrayAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(0).withArrayAt(1).withBitmapAt(2).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withBitmapAt(2).withBitmapAt(4).build().toMutableRoaringBitmap(),
- testCase().withRunAt(0).withRunAt(1).withBitmapAt(2).build().toMutableRoaringBitmap()
- )),
- Arguments.of(Arrays.asList(
- testCase().withArrayAt(20).build().toMutableRoaringBitmap(),
- testCase().withBitmapAt(0).withBitmapAt(1).withBitmapAt(4).build().toMutableRoaringBitmap(),
- testCase().withRunAt(0).withRunAt(1).withBitmapAt(3).build().toMutableRoaringBitmap()
- ))
- );
- }
-
-
- @MethodSource("bitmaps")
- @ParameterizedTest(name = "testWorkShyAnd")
- public void testWorkShyAnd(List list) {
- ImmutableRoaringBitmap[] bitmaps = list.toArray(new ImmutableRoaringBitmap[0]);
- long[] buffer = new long[1024];
- MutableRoaringBitmap result = BufferFastAggregation.and(buffer, bitmaps);
- MutableRoaringBitmap expected = BufferFastAggregation.naive_and(bitmaps);
- assertEquals(expected, result);
- result = BufferFastAggregation.and(bitmaps);
- assertEquals(expected, result);
- result = BufferFastAggregation.workAndMemoryShyAnd(buffer, bitmaps);
- assertEquals(expected, result);
- }
-
- @MethodSource("bitmaps")
- @ParameterizedTest(name = "testWorkShyAnd")
- public void testWorkShyAndIterator(List bitmaps) {
- long[] buffer = new long[1024];
- MutableRoaringBitmap result = BufferFastAggregation.and(buffer, bitmaps.iterator());
- MutableRoaringBitmap expected = BufferFastAggregation.naive_and(bitmaps.iterator());
- assertEquals(expected, result);
- result = BufferFastAggregation.and(bitmaps.iterator());
- assertEquals(expected, result);
- }
-
- @MethodSource("bitmaps")
- @ParameterizedTest(name = "testWorkShyAnd")
- public void testWorkShyAndDirect(List list) {
- ImmutableRoaringBitmap[] bitmaps = list.toArray(new ImmutableRoaringBitmap[0]);
- for (int i = 0; i < bitmaps.length; ++i) {
- bitmaps[i] = toDirect((MutableRoaringBitmap)bitmaps[i]);
- }
- long[] buffer = new long[1024];
- MutableRoaringBitmap result = BufferFastAggregation.and(buffer, bitmaps);
- MutableRoaringBitmap expected = BufferFastAggregation.naive_and(bitmaps);
- assertEquals(expected, result);
- result = BufferFastAggregation.and(bitmaps);
- assertEquals(expected, result);
- result = BufferFastAggregation.workAndMemoryShyAnd(buffer, bitmaps);
- assertEquals(expected, result);
- }
-
- @MethodSource("bitmaps")
- @ParameterizedTest(name = "testAndCardinality")
- public void testAndCardinality(List list) {
- ImmutableRoaringBitmap[] bitmaps = list.toArray(new ImmutableRoaringBitmap[0]);
- for (int length = 0; length <= bitmaps.length; length++) {
- ImmutableRoaringBitmap[] subset = Arrays.copyOf(bitmaps, length);
- ImmutableRoaringBitmap and = BufferFastAggregation.and(subset);
- int andCardinality = BufferFastAggregation.andCardinality(subset);
- assertEquals(and.getCardinality(), andCardinality);
- }
- }
-
- @MethodSource("bitmaps")
- @ParameterizedTest(name = "testOrCardinality")
- public void testOrCardinality(List list) {
- ImmutableRoaringBitmap[] bitmaps = list.toArray(new ImmutableRoaringBitmap[0]);
- for (int length = 0; length <= bitmaps.length; length++) {
- ImmutableRoaringBitmap[] subset = Arrays.copyOf(bitmaps, length);
- ImmutableRoaringBitmap or = BufferFastAggregation.or(subset);
- int andCardinality = BufferFastAggregation.orCardinality(subset);
- assertEquals(or.getCardinality(), andCardinality);
- }
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestImmutableRoaringBitmapOrNot.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestImmutableRoaringBitmapOrNot.java
deleted file mode 100644
index 09cd36706..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestImmutableRoaringBitmapOrNot.java
+++ /dev/null
@@ -1,426 +0,0 @@
-package org.roaringbitmap.buffer;
-
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.roaringbitmap.IntIterator;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Base64;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.roaringbitmap.Util.toUnsignedLong;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestImmutableRoaringBitmapOrNot {
-
- @Test
- public void orNot1() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
-
- rb.add(2);
- rb.add(1);
- rb.add(1 << 16); // 65536
- rb.add(2 << 16); //131072
- rb.add(3 << 16); //196608
-
- rb2.add(1 << 16);// 65536
- rb2.add(3 << 16);//196608
-
- rb.orNot(rb2, (4 << 16) - 1);
-
- assertEquals((4 << 16) - 1, rb.getCardinality());
-
- IntIterator iterator = rb.getIntIterator();
-
- for (int i = 0; i < (4 << 16) - 1; ++i) {
- assertTrue(iterator.hasNext());
- assertEquals(i, iterator.next());
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNot2() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
-
- rb.add(0);
- rb.add(1 << 16); // 65536
- rb.add(3 << 16); //196608
-
- rb2.add((4 << 16) - 1); //262143
-
- rb.orNot(rb2, 4 << 16);
-
- assertEquals((4 << 16) - 1, rb.getCardinality());
-
- IntIterator iterator = rb.getIntIterator();
-
- for (int i = 0; i < (4 << 16) - 1; ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next());
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNot3() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- rb.add(2 << 16);
-
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
- rb2.add(1 << 14); //16384
- rb2.add(3 << 16); //196608
-
- rb.orNot(rb2, (5 << 16));
- assertEquals((5 << 16) - 2, rb.getCardinality());
-
- IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (5 << 16); ++i) {
- if ((i != (1 << 14)) && (i != (3 << 16))) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNot4() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- rb.add(1);
-
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
- rb2.add(3 << 16); //196608
-
- rb.orNot(rb2, (2 << 16) + (2 << 14)); //131072 + 32768 = 163840
- assertEquals((2 << 16) + (2 << 14), rb.getCardinality());
-
- IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (2 << 16) + (2 << 14); ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNot5() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
-
- rb.add(1);
- rb.add(1 << 16); // 65536
- rb.add(2 << 16); //131072
- rb.add(3 << 16); //196608
-
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
-
- rb.orNot(rb2, (5 << 16));
- assertEquals((5 << 16), rb.getCardinality());
-
- IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (5 << 16); ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNot6() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
-
- rb.add(1);
- rb.add((1 << 16) - 1); // 65535
- rb.add(1 << 16); // 65536
- rb.add(2 << 16); //131072
- rb.add(3 << 16); //196608
-
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
-
- rb.orNot(rb2, (1 << 14));
-
- // {[0, 2^14], 65535, 65536, 131072, 196608}
- assertEquals((1 << 14) + 4, rb.getCardinality());
-
- IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (1 << 14); ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
-
- assertTrue(iterator.hasNext());
- assertEquals((1 << 16) - 1, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(1 << 16, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(2 << 16, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(3 << 16, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
- @Test
- public void orNot7() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
-
- rb.add(1 << 16); // 65536
- rb.add(2 << 16); //131072
- rb.add(3 << 16); //196608
-
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
-
- rb.orNot(rb2, (1 << 14));
-
- // {[0, 2^14], 65536, 131072, 196608}
- assertEquals((1 << 14) + 3, rb.getCardinality());
-
- IntIterator iterator = rb.getIntIterator();
- for (int i = 0; i < (1 << 14); ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
-
-
- assertTrue(iterator.hasNext());
- assertEquals(1 << 16, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(2 << 16, iterator.next());
-
- assertTrue(iterator.hasNext());
- assertEquals(3 << 16, iterator.next());
-
- assertFalse(iterator.hasNext());
- }
-
-
-
- @Test
- public void orNot9() {
- MutableRoaringBitmap rb1 = new MutableRoaringBitmap();
-
- rb1.add(1 << 16); // 65536
- rb1.add(2 << 16); //131072
- rb1.add(3 << 16); //196608
-
-
- {
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
- MutableRoaringBitmap answer1 = ImmutableRoaringBitmap.orNot(rb1, rb2, (1 << 14));
-
- // {[0, 2^14] | {65536} {131072} {196608}}
- assertEquals((1 << 14) + 3, answer1.getCardinality());
-
- IntIterator iterator1 = answer1.getIntIterator();
- for (int i = 0; i < (1 << 14); ++i) {
- assertTrue(iterator1.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator1.next(), "Error on iteration " + i);
- }
- assertEquals(1 << 16, iterator1.next());
- assertEquals(2 << 16, iterator1.next());
- assertEquals(3 << 16, iterator1.next());
- }
-
- {
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
- MutableRoaringBitmap answer = ImmutableRoaringBitmap.orNot(rb1, rb2, (2 << 16));
-
- // {[0, 2^16] | 131072, 196608}
- assertEquals((2 << 16) + 2, answer.getCardinality());
-
- IntIterator iterator = answer.getIntIterator();
- for (int i = 0; i < (2 << 16) + 1; ++i) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- assertEquals(196608, iterator.next());
- }
-
-
- {
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
- rb2.add((1 << 16) + (1 << 13));
- rb2.add((1 << 16) + (1 << 14));
- rb2.add((1 << 16) + (1 << 15));
- MutableRoaringBitmap answer = ImmutableRoaringBitmap.orNot(rb1, rb2, (2 << 16));
-
- // {[0, 2^16] | 196608}
- assertEquals((2 << 16) - 1, answer.getCardinality());
-
- IntIterator iterator = answer.getIntIterator();
- for (int i = 0; i < (2 << 16) + 1; ++i) {
- if ((i != (1 << 16) + (1 << 13)) && (i != (1 << 16) + (1 << 14)) && (i != (1 << 16) + (1 << 15))) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- }
- assertEquals(196608, iterator.next());
- }
-
- {
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
- rb2.add(1 << 16);
- rb2.add(3 << 16);
- rb2.add(4 << 16);
-
- MutableRoaringBitmap answer = ImmutableRoaringBitmap.orNot(rb1, rb2, (5 << 16));
-
- // {[0, 2^16]}
- assertEquals((5 << 16) - 1, answer.getCardinality());
-
- IntIterator iterator = answer.getIntIterator();
- for (int i = 0; i < (5 << 16); ++i) {
- if (i != (4 << 16)) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- }
- assertFalse(iterator.hasNext(), "Number of elements " + (2 << 16));
- }
-
- {
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
- rb2.add(1 << 16);
- rb2.add(3 << 16);
- rb2.add(4 << 16);
-
- MutableRoaringBitmap answer = ImmutableRoaringBitmap.orNot(rb2, rb1, (5 << 16));
-
- // {[0, 2^16]}
- assertEquals((5 << 16) - 1, answer.getCardinality());
-
- IntIterator iterator = answer.getIntIterator();
- for (int i = 0; i < (5 << 16); ++i) {
- if (i != (2 << 16)) {
- assertTrue(iterator.hasNext(), "Error on iteration " + i);
- assertEquals(i, iterator.next(), "Error on iteration " + i);
- }
- }
- assertFalse(iterator.hasNext(), "Number of elements " + (2 << 16));
- }
- }
-
- @Test
- public void orNot10() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
-
- rb.add(5);
- rb2.add(10);
-
- rb.orNot(rb2, 6);
-
- assertEquals(5, rb.last());
- }
-
- @Test
- public void orNot11() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- MutableRoaringBitmap rb2 = new MutableRoaringBitmap();
-
- rb.add((int) (65535L * 65536L + 65523));
- rb2.add((int) (65493L * 65536L + 65520));
-
- MutableRoaringBitmap rb3 = ImmutableRoaringBitmap.orNot(rb, rb2, 65535L * 65536L + 65524);
-
- assertEquals((int)(65535L * 65536L + 65523), rb3.last());
- }
-
- @Test
- public void orNotAgainstFullBitmap() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- MutableRoaringBitmap full = new MutableRoaringBitmap();
- full.add(0, 0x40000L);
- rb.orNot(full, 0x30000L);
- assertTrue(rb.isEmpty());
- }
-
- @Test
- public void orNotNonEmptyAgainstFullBitmap() {
- MutableRoaringBitmap rb = MutableRoaringBitmap.bitmapOf(1, 0x10001, 0x20001);
- MutableRoaringBitmap full = new MutableRoaringBitmap();
- full.add((long)0, (long)0x40000);
- rb.orNot(full, 0x30000);
- assertEquals(MutableRoaringBitmap.bitmapOf(1, 0x10001, 0x20001), rb);
- }
-
- @Test
- public void orNotAgainstFullBitmapStatic() {
- MutableRoaringBitmap rb = new MutableRoaringBitmap();
- MutableRoaringBitmap full = new MutableRoaringBitmap();
- full.add(0, 0x40000L);
- MutableRoaringBitmap result = ImmutableRoaringBitmap.orNot(rb, full, 0x30000L);
- assertTrue(result.isEmpty());
- }
-
- @Test
- public void orNotNonEmptyAgainstFullBitmapStatic() {
- MutableRoaringBitmap rb = MutableRoaringBitmap.bitmapOf(1, 0x10001, 0x20001);
- MutableRoaringBitmap full = new MutableRoaringBitmap();
- full.add(0, 0x40000L);
- assertEquals(MutableRoaringBitmap.bitmapOf(1, 0x10001, 0x20001), ImmutableRoaringBitmap.orNot(rb, full, 0x30000L));
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void testBigOrNot() throws IOException {
- byte[] bytes = Files.readAllBytes(Paths.get("src/test/resources/testdata/ornot-fuzz-failure.json"));
- Map info = new ObjectMapper().readerFor(Map.class).readValue(bytes);
- List base64Bitmaps = (List)info.get("bitmaps");
- ByteBuffer lBuffer = ByteBuffer.wrap(Base64.getDecoder().decode(base64Bitmaps.get(0)));
- ByteBuffer rBuffer = ByteBuffer.wrap(Base64.getDecoder().decode(base64Bitmaps.get(1)));
- MutableRoaringBitmap l = new MutableRoaringBitmap();
- l.deserialize(lBuffer);
- MutableRoaringBitmap r = new MutableRoaringBitmap();
- r.deserialize(rBuffer);
-
- MutableRoaringBitmap range = new MutableRoaringBitmap();
- long limit = toUnsignedLong(l.last()) + 1;
- range.add(0, limit);
- range.andNot(r);
- MutableRoaringBitmap expected = MutableRoaringBitmap.or(l, range);
-
- MutableRoaringBitmap actual = l.clone();
- actual.orNot(r, limit);
- assertEquals(expected, actual);
- }
-
-
- @Test
- @SuppressWarnings("unchecked")
- public void testBigOrNotStatic() throws IOException {
- byte[] bytes = Files.readAllBytes(Paths.get("src/test/resources/testdata/ornot-fuzz-failure.json"));
- Map info = new ObjectMapper().readerFor(Map.class).readValue(bytes);
- List base64Bitmaps = (List)info.get("bitmaps");
- ByteBuffer lBuffer = ByteBuffer.wrap(Base64.getDecoder().decode(base64Bitmaps.get(0)));
- ByteBuffer rBuffer = ByteBuffer.wrap(Base64.getDecoder().decode(base64Bitmaps.get(1)));
- MutableRoaringBitmap l = new MutableRoaringBitmap();
- l.deserialize(lBuffer);
- MutableRoaringBitmap r = new MutableRoaringBitmap();
- r.deserialize(rBuffer);
-
- MutableRoaringBitmap range = new MutableRoaringBitmap();
- long limit = toUnsignedLong(l.last()) + 1;
- range.add(0, limit);
- range.andNot(r);
- MutableRoaringBitmap expected = MutableRoaringBitmap.or(l, range);
-
- MutableRoaringBitmap actual = ImmutableRoaringBitmap.orNot(l, r, limit);
- assertEquals(expected, actual);
- }
-
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestMappeableBitmapContainerCharIterator.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestMappeableBitmapContainerCharIterator.java
deleted file mode 100644
index 85b3f190f..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestMappeableBitmapContainerCharIterator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.roaringbitmap.buffer;
-
-import com.google.common.primitives.Ints;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.roaringbitmap.PeekableCharIterator;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.roaringbitmap.buffer.MappeableArrayContainer.DEFAULT_MAX_SIZE;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestMappeableBitmapContainerCharIterator {
-
- private static List asList(PeekableCharIterator ints) {
- int[] values = new int[10];
- int size = 0;
- while (ints.hasNext()) {
- if (!(size < values.length)) {
- values = Arrays.copyOf(values, values.length * 2);
- }
- values[size++] = ints.next();
- }
- return Ints.asList(Arrays.copyOf(values, size));
- }
-
- @Test
- public void testClone() {
- MappeableBitmapContainer mappeableBitmapContainer = new MappeableBitmapContainer();
- for (int k = 0; k < 2 * DEFAULT_MAX_SIZE; ++k) {
- mappeableBitmapContainer.add((char) (k * 10));
- }
- MappeableBitmapContainerCharIterator tmbc = new MappeableBitmapContainerCharIterator(mappeableBitmapContainer);
- PeekableCharIterator tmbcClone = tmbc.clone();
- assertNotNull(tmbcClone);
- final List tmbcList = asList(tmbc);
- final List tmbcCloneList = asList(tmbcClone);
- assertEquals(tmbcList, tmbcCloneList);
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestReverseMappeableRunContainer.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestReverseMappeableRunContainer.java
deleted file mode 100644
index ea5949550..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestReverseMappeableRunContainer.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.roaringbitmap.buffer;
-
-import com.google.common.primitives.Ints;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.roaringbitmap.CharIterator;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestReverseMappeableRunContainer {
-
- private static List asList(CharIterator ints) {
- int[] values = new int[10];
- int size = 0;
- while (ints.hasNext()) {
- if (!(size < values.length)) {
- values = Arrays.copyOf(values, values.length * 2);
- }
- values[size++] = ints.next();
- }
- return Ints.asList(Arrays.copyOf(values, size));
- }
-
- @Test
- public void testClone() {
- MappeableRunContainer mappeableRunContainer = new MappeableRunContainer();
- for (char i = 10; i < 20; ++i) {
- mappeableRunContainer.add(i);
- }
- ReverseMappeableRunContainerCharIterator rmr = new ReverseMappeableRunContainerCharIterator(mappeableRunContainer);
- CharIterator rmrClone = rmr.clone();
- final List rmrList = asList(rmr);
- assertNotNull(rmrClone);
- final List rmrCloneList = asList(rmrClone);
- assertEquals(rmrList, rmrCloneList);
- }
-
- @Test
- public void testNextAsInt() {
- MappeableRunContainer mappeableRunContainer = new MappeableRunContainer();
- for (char i = 10; i < 15; ++i) {
- mappeableRunContainer.add(i);
- }
- ReverseMappeableRunContainerCharIterator rmr = new ReverseMappeableRunContainerCharIterator(mappeableRunContainer);
- assertEquals(14, rmr.nextAsInt());
- rmr.next();
- rmr.next();
- rmr.next();
- rmr.next();
- rmr.next();
- rmr.nextAsInt();
- rmr.nextAsInt();
- rmr.nextAsInt();
- rmr.nextAsInt();
- rmr.nextAsInt();
- assertEquals(13, rmr.nextAsInt());
- }
-}
-
-
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestUtil.java b/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestUtil.java
deleted file mode 100644
index db70f4c07..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/buffer/TestUtil.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.roaringbitmap.buffer;
-
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.Execution;
-import org.junit.jupiter.api.parallel.ExecutionMode;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.roaringbitmap.Util;
-
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.LongBuffer;
-import java.util.Arrays;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.roaringbitmap.SeededTestData.*;
-import static org.roaringbitmap.SeededTestData.sparseRegion;
-
-@Execution(ExecutionMode.CONCURRENT)
-public class TestUtil {
-
- @Test
- public void testCopy() {
- CharBuffer sb = CharBuffer.allocate(64);
- sb.position(32);
- CharBuffer slice = sb.slice();
- CharBuffer dest = CharBuffer.allocate(64);
- for(int k = 0; k < 32; ++k)
- slice.put(k, (char) k);
- BufferUtil.arraycopy(slice, 16, dest, 16, 16);
- for(int k = 16; k < 32; ++k)
- assertEquals((char)k,dest.get(k));
- BufferUtil.arraycopy(slice, 0, dest, 16, 16);
- for(int k = 16; k < 32; ++k)
- assertEquals((char)(k-16),dest.get(k));
- BufferUtil.arraycopy(slice, 16, dest, 0, 16);
- for(int k = 0; k < 16; ++k)
- assertEquals((char)(k+16),dest.get(k));
-
- }
-
- @Test
- public void testFillArrayANDNOT() {
- LongBuffer data1 = LongBuffer.wrap(new long[]{1, 2, 4, 8, 16});
- LongBuffer data2 = LongBuffer.wrap(new long[]{2, 1, 3, 7, 15});
- char[] content = new char[5];
- char[] result = {0, 65, 130, 195, 260};
- BufferUtil.fillArrayANDNOT(content, data1, data2);
- assertTrue(Arrays.equals(content, result));
- }
-
- @Test
- public void testFillArrayANDNOTException() {
- assertThrows(IllegalArgumentException.class, () -> {
- LongBuffer data1 = LongBuffer.wrap(new long[]{1, 2, 4, 8, 16});
- LongBuffer data2 = LongBuffer.wrap(new long[]{2, 1, 3, 7});
- char[] content = new char[5];
- BufferUtil.fillArrayANDNOT(content, data1, data2);
- });
- }
-
-
-
- @Test
- public void testUnsignedIntersects() {
- CharBuffer data1 = CharBuffer.wrap(fromShorts(new short[]{-100, -98, -96, -94, -92, -90, -88, -86, -84, -82, -80}));
- CharBuffer data2 = CharBuffer.wrap(fromShorts(new short[]{-99, -97, -95, -93, -91, -89, -87, -85, -83, -81, -79}));
- CharBuffer data3 = CharBuffer.wrap(fromShorts(new short[]{-99, -97, -95, -93, -91, -89, -87, -85, -83, -81, -80}));
- CharBuffer data4 = CharBuffer.wrap(new char[]{});
- CharBuffer data5 = CharBuffer.wrap(new char[]{});
- assertFalse(BufferUtil.unsignedIntersects(data1, data1.limit(), data2, data2.limit()));
- assertTrue(BufferUtil.unsignedIntersects(data1, data1.limit(), data3, data3.limit()));
- assertFalse(BufferUtil.unsignedIntersects(data4, data4.limit(), data5, data5.limit()));
- }
-
- @Test
- public void testAdvanceUntil() {
- CharBuffer data = CharBuffer.wrap(fromShorts(new short[] {0, 3, 16, 18, 21, 29, 30, -342}));
- assertEquals(1, BufferUtil.advanceUntil(data, -1, data.limit(), (char) 3));
- assertEquals(5, BufferUtil.advanceUntil(data, -1, data.limit(), (char) 28));
- assertEquals(5, BufferUtil.advanceUntil(data, -1, data.limit(), (char) 29));
- assertEquals(7, BufferUtil.advanceUntil(data, -1, data.limit(), (char) -342));
- }
-
- @Test
- public void testIterateUntil() {
- CharBuffer data = CharBuffer.wrap(fromShorts(new short[] {0, 3, 16, 18, 21, 29, 30, -342}));
- assertEquals(1, BufferUtil.iterateUntil(data, 0, data.limit(), ((char) 3)));
- assertEquals(5, BufferUtil.iterateUntil(data, 0, data.limit(), ((char) 28)));
- assertEquals(5, BufferUtil.iterateUntil(data, 0, data.limit(), ((char) 29)));
- assertEquals(7, BufferUtil.iterateUntil(data, 0, data.limit(), ((char) -342)));
- }
-
- static char[] fromShorts(short[] array) {
- char[] result = new char[array.length];
- for (int i = 0 ; i < array.length; ++i) {
- result[i] = (char)(array[i] & 0xFFFF);
- }
- return result;
- }
-
- public static Stream sets() {
- return Stream.of(true, false)
- .flatMap(direct -> Stream.of(
- Arguments.of(direct, rleRegion().toArray(), rleRegion().toArray()),
- Arguments.of(direct, denseRegion().toArray(), rleRegion().toArray()),
- Arguments.of(direct, sparseRegion().toArray(), rleRegion().toArray()),
- Arguments.of(direct, rleRegion().toArray(), denseRegion().toArray()),
- Arguments.of(direct, denseRegion().toArray(), denseRegion().toArray()),
- Arguments.of(direct, sparseRegion().toArray(), denseRegion().toArray()),
- Arguments.of(direct, rleRegion().toArray(), sparseRegion().toArray()),
- Arguments.of(direct, denseRegion().toArray(), sparseRegion().toArray()),
- Arguments.of(direct, sparseRegion().toArray(), sparseRegion().toArray())));
- }
-
-
- @MethodSource("sets")
- @ParameterizedTest(name = "direct={0}")
- public void testIntersectBitmapWithArray(boolean direct, int[] set1, int[] set2) {
- LongBuffer bitmap = direct ? ByteBuffer.allocateDirect(8192).asLongBuffer() : LongBuffer.allocate(1024);
- for (int i : set1) {
- bitmap.put(i >>> 6, bitmap.get(i >>> 6) | (1L << i));
- }
- LongBuffer referenceBitmap = direct ? ByteBuffer.allocateDirect(8192).asLongBuffer() : LongBuffer.allocate(1024);
- CharBuffer array = direct ? ByteBuffer.allocateDirect(2 * set2.length).asCharBuffer() : CharBuffer.allocate(set2.length);
- int pos = 0;
- for (int i : set2) {
- referenceBitmap.put(i >>> 6, referenceBitmap.get(i >>> 6) | (1L << i));
- array.put(pos++, (char)i);
- }
- int expectedCardinality = 0;
- for (int i = 0; i < 1024; ++i) {
- referenceBitmap.put(i, referenceBitmap.get(i) & bitmap.get(i));
- expectedCardinality += Long.bitCount(referenceBitmap.get(i));
- }
- int cardinality = BufferUtil.intersectArrayIntoBitmap(bitmap, array, set2.length);
- assertEquals(expectedCardinality, cardinality);
- for (int i = 0; i < bitmap.limit(); ++i) {
- assertEquals(bitmap.get(i), referenceBitmap.get(i), "mismatch at " + i);
- }
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/longlong/JolBenchmarksTest.java b/RoaringBitmap/src/test/java/org/roaringbitmap/longlong/JolBenchmarksTest.java
deleted file mode 100644
index 3e2c0b46b..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/longlong/JolBenchmarksTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.roaringbitmap.longlong;
-
-import com.google.common.primitives.Ints;
-import org.openjdk.jol.info.GraphLayout;
-
-import java.util.Arrays;
-import java.util.Random;
-import java.util.stream.IntStream;
-import java.util.stream.LongStream;
-
-/**
- * This runs benchmarks over {@link Roaring64NavigableMap} memory layout, as suggested in
- * https://github.com/RoaringBitmap/RoaringBitmap/issues/346
- */
-// https://github.com/openjdk/jol
-// https://github.com/RoaringBitmap/RoaringBitmap/issues/346
-public class JolBenchmarksTest {
-
- @SuppressWarnings("restriction")
- public static void main(String[] args) {
- // distinctHigherRadices();
- // sameHigherRadix();
- statisticsWithGrowingSizes();
- }
-
- private static void distinctHigherRadices() {
- int valuesPerRadix = 1 << 16;
- int distance = 2000;
- Roaring64NavigableMap bitmapMap = new Roaring64NavigableMap();
- long[] radices = new long[1024];
- for (int i = 0; i < radices.length; ++i) {
- radices[i] = ((long) i) << 48;
- }
- for (int i = 0; i < radices.length; i++) {
- for (int j = 0; j < valuesPerRadix; ++j) {
- bitmapMap.addLong(radices[i] | (j * distance));
- }
- }
-
- long[] bitmapArray = bitmapMap.toArray();
-
- Roaring64Bitmap bitmapArt = new Roaring64Bitmap();
- bitmapArt.add(bitmapArray);
-
- System.out.println("---distinctHigherRadices---");
- System.out.println(GraphLayout.parseInstance(bitmapArray).toFootprint());
-
- System.out.println("---");
- System.out.println(GraphLayout.parseInstance(bitmapMap).toFootprint());
- System.out.println(bitmapMap.getLongSizeInBytes());
- bitmapMap.runOptimize();
- System.out.println(GraphLayout.parseInstance(bitmapMap).toFootprint());
- System.out.println(bitmapMap.getLongSizeInBytes());
-
- System.out.println("---");
- System.out.println(GraphLayout.parseInstance(bitmapArt).toFootprint());
- System.out.println(bitmapArt.getLongSizeInBytes());
- bitmapArt.runOptimize();
- System.out.println(GraphLayout.parseInstance(bitmapArt).toFootprint());
- System.out.println(bitmapArt.getLongSizeInBytes());
- }
-
- private static void sameHigherRadix() {
- int numValues = (1 << 16) * 1024;
- int distance = 2000;
- Roaring64NavigableMap bitmap = new Roaring64NavigableMap();
-
- long x = 0L;
- for (int i = 0; i < numValues; i++) {
- bitmap.addLong(x);
- x += distance;
- }
-
- long[] array = bitmap.toArray();
-
- Roaring64Bitmap bitmapOpt = new Roaring64Bitmap();
- bitmapOpt.add(array);
-
- System.out.println("---sameHigherRadix---");
- System.out.println(GraphLayout.parseInstance(array).toFootprint());
-
- System.out.println("---");
- System.out.println(GraphLayout.parseInstance(bitmap).toFootprint());
- bitmap.runOptimize();
- System.out.println(GraphLayout.parseInstance(bitmap).toFootprint());
-
- System.out.println("---");
- System.out.println(GraphLayout.parseInstance(bitmapOpt).toFootprint());
- bitmapOpt.runOptimize();
- System.out.println(GraphLayout.parseInstance(bitmapOpt).toFootprint());
- }
-
- public static void statisticsWithGrowingSizes() {
- Random r = new Random();
-
- // We re-use the bitmaps so that we accumulate the longs into them
- // We then expect to have denser buckets (around 0)
- Roaring64Bitmap bitmap64Art = new Roaring64Bitmap();
- Roaring64NavigableMap bitmap64Map = new Roaring64NavigableMap();
-
- for (long size = 0 ; size < 1024 ; size++) {
- long max = (1L + size*size*size*size*size);
- System.out.println(size + " in [-" + max + ", " + max + "[");
-
- long fSize = size;
- long[] array = IntStream.range(0, Ints.checkedCast(size))
- .mapToLong(i -> i)
- .flatMap(i -> LongStream.generate(() -> r.nextLong() % max).limit(fSize))
- .toArray();
-
- reportBitmapsMemory(array, bitmap64Art, bitmap64Map);
- }
- }
-
- private static void reportBitmapsMemory(long[] array, LongBitmapDataProvider bitmap, LongBitmapDataProvider bitmap2) {
- reportBitmapsMemory(array, bitmap);
- reportBitmapsMemory(array, bitmap2);
-
- if (!Arrays.equals(bitmap.toArray(), bitmap.toArray())) {
- throw new IllegalStateException("Issue with: " + Arrays.toString(array));
- }
- }
-
- private static void reportBitmapsMemory(long[] array, LongBitmapDataProvider bitmap) {
- LongStream.of(array).forEach(bitmap::addLong);
- long jolSize = GraphLayout.parseInstance(bitmap).totalSize();
- long ownEstimation = bitmap.getLongSizeInBytes();
- System.out.println(bitmap.getClass().getSimpleName()
- + ": " + String.format("%,d", jolSize) + "(real) vs "
- + String.format("%,d", ownEstimation) + "(estimated) "
- + (ownEstimation < jolSize ? "optimistic" : "pessimistic"));
- }
-}
diff --git a/RoaringBitmap/src/test/java/org/roaringbitmap/longlong/TestLongUtils.java b/RoaringBitmap/src/test/java/org/roaringbitmap/longlong/TestLongUtils.java
deleted file mode 100644
index 5bff24bd4..000000000
--- a/RoaringBitmap/src/test/java/org/roaringbitmap/longlong/TestLongUtils.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.roaringbitmap.longlong;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-public class TestLongUtils {
- @Test
- public void testHighPart() {
- Assertions.assertFalse(LongUtils.isMaxHigh(LongUtils.highPart(0)));
- Assertions.assertFalse(LongUtils.isMaxHigh(LongUtils.highPart(Long.MAX_VALUE)));
- Assertions.assertFalse(LongUtils.isMaxHigh(LongUtils.highPart(Long.MIN_VALUE)));
-
- Assertions.assertTrue(LongUtils.isMaxHigh(LongUtils.highPart(-1L)));
- }
-}
diff --git a/bsi/build.gradle.kts b/bsi/build.gradle.kts
index 4eb92a893..69171d56e 100644
--- a/bsi/build.gradle.kts
+++ b/bsi/build.gradle.kts
@@ -1,7 +1,7 @@
val deps: Map by extra
dependencies {
- implementation(project(":RoaringBitmap"))
+ implementation(project(":roaringbitmap"))
testImplementation("org.junit.jupiter:junit-jupiter-api:${deps["jupiter"]}")
testImplementation("org.junit.jupiter:junit-jupiter-params:${deps["jupiter"]}")
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/BitmapSliceIndex.java b/bsi/src/main/java/org/roaringbitmap/bsi/BitmapSliceIndex.java
index 4b717b435..b087d081d 100644
--- a/bsi/src/main/java/org/roaringbitmap/bsi/BitmapSliceIndex.java
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/BitmapSliceIndex.java
@@ -12,9 +12,9 @@
* 2. high compression ratio for number
* Given that,we have a table T(c1,c2,c3....Cn). As we know,most database has rowId for each row.
* then table T is actually T(rowId,c1,c2,c3,Cn).
- * 1. if column c1 is string, we can encode c1 using dictionary. By bsi,
+ * 1. if column c1 is string, we can encode c1 using dictionary. By bsi,
* we can only use 33 bit slice express 2^32 cardinality dim.
- * 2. if column c2 is int32(that is 4Byte), for 1_000_000 rows, the size
+ * 2. if column c2 is int32(that is 4Byte), for 1_000_000 rows, the size
* of c2 is more than 3.81MB. however,
* by bsi, the size might be less than 1MB.
*
@@ -41,7 +41,6 @@ enum Operation {
long getLongCardinality();
-
/**
* set value for bsi, setValue will set each bit slice according to the input value
* given that we have bsi as follow
@@ -76,7 +75,8 @@ enum Operation {
* and avoiding bsi expend slice array capacity.
*/
@Deprecated
- void setValues(List> values, Integer currentMaxValue, Integer currentMinValue);
+ void setValues(
+ List> values, Integer currentMaxValue, Integer currentMinValue);
/**
* Set a batch of values.
@@ -89,7 +89,4 @@ enum Operation {
void serialize(DataOutput output) throws IOException;
int serializedSizeInBytes();
-
-
}
-
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/Pair.java b/bsi/src/main/java/org/roaringbitmap/bsi/Pair.java
index db471e453..270b5925b 100644
--- a/bsi/src/main/java/org/roaringbitmap/bsi/Pair.java
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/Pair.java
@@ -18,8 +18,7 @@ public class Pair implements Serializable {
/**
* Default constructor.
*/
- public Pair() {
- }
+ public Pair() {}
/**
* Constructor
@@ -96,17 +95,16 @@ public void setSecond(T2 b) {
@Override
@SuppressWarnings("rawtypes")
public boolean equals(Object other) {
- return other instanceof Pair && equals(left, ((Pair) other).left) && equals(right, ((Pair) other).right);
+ return other instanceof Pair
+ && equals(left, ((Pair) other).left)
+ && equals(right, ((Pair) other).right);
}
@Override
public int hashCode() {
- if (left == null)
- return (right == null) ? 0 : right.hashCode() + 1;
- else if (right == null)
- return left.hashCode() + 2;
- else
- return left.hashCode() * 17 + right.hashCode();
+ if (left == null) return (right == null) ? 0 : right.hashCode() + 1;
+ else if (right == null) return left.hashCode() + 2;
+ else return left.hashCode() * 17 + right.hashCode();
}
@Override
@@ -114,5 +112,3 @@ public String toString() {
return "{" + getLeft() + "," + getRight() + "}";
}
}
-
-
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/RoaringBitmapSliceIndex.java b/bsi/src/main/java/org/roaringbitmap/bsi/RoaringBitmapSliceIndex.java
index 35ddd417a..048e8a37d 100644
--- a/bsi/src/main/java/org/roaringbitmap/bsi/RoaringBitmapSliceIndex.java
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/RoaringBitmapSliceIndex.java
@@ -1,6 +1,5 @@
package org.roaringbitmap.bsi;
-import java.util.Objects;
import org.roaringbitmap.RoaringBitmap;
import java.io.DataInput;
@@ -8,6 +7,7 @@
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.List;
+import java.util.Objects;
import java.util.stream.IntStream;
/**
@@ -34,7 +34,6 @@ public class RoaringBitmapSliceIndex implements BitmapSliceIndex {
*/
private RoaringBitmap ebM;
-
private Boolean runOptimized = false;
/**
@@ -54,7 +53,6 @@ public RoaringBitmapSliceIndex(int minValue, int maxValue) {
this.ebM = new RoaringBitmap();
}
-
/**
* NewDefaultBSI constructs an auto-sized BSI
*/
@@ -62,7 +60,6 @@ public RoaringBitmapSliceIndex() {
this(0, 0);
}
-
public void add(RoaringBitmapSliceIndex otherBsi) {
if (null == otherBsi || otherBsi.ebM.isEmpty()) {
return;
@@ -85,13 +82,12 @@ public void add(RoaringBitmapSliceIndex otherBsi) {
private void addDigit(RoaringBitmap foundSet, int i) {
RoaringBitmap carry = RoaringBitmap.and(this.bA[i], foundSet);
this.bA[i].xor(foundSet);
- if (carry.getCardinality() > 0) {
+ if (!carry.isEmpty()) {
if (i + 1 >= this.bitCount()) {
grow(this.bitCount() + 1);
}
this.addDigit(carry, i + 1);
}
-
}
private int minValue() {
@@ -152,7 +148,6 @@ public void runOptimize() {
/**
* hasRunCompression returns true if the bitmap benefits from run compression
*/
-
public boolean hasRunCompression() {
return this.runOptimized;
}
@@ -160,12 +155,10 @@ public boolean hasRunCompression() {
/**
* GetExistenceBitmap returns a pointer to the underlying existence bitmap of the BSI
*/
-
public RoaringBitmap getExistenceBitmap() {
return this.ebM;
}
-
public int bitCount() {
return this.bA.length;
}
@@ -174,7 +167,6 @@ public long getLongCardinality() {
return this.ebM.getLongCardinality();
}
-
/**
* GetValue gets the value at the column ID. Second param will be false for non-existence values.
*/
@@ -187,7 +179,6 @@ public Pair getValue(int columnId) {
return Pair.newPair(valueAt(columnId), true);
}
-
private void clear() {
this.maxValue = 0;
this.minValue = 0;
@@ -249,7 +240,6 @@ public void serialize(ByteBuffer buffer) {
for (RoaringBitmap rb : this.bA) {
rb.serialize(buffer);
}
-
}
public void deserialize(ByteBuffer buffer) throws IOException {
@@ -285,7 +275,6 @@ public int serializedSizeInBytes() {
return 4 + 4 + 1 + 4 + this.ebM.serializedSizeInBytes() + size;
}
-
/**
* valueExists tests whether the value exists.
*/
@@ -348,8 +337,10 @@ private void grow(int newBitDepth) {
@Override
public void setValues(List> values) {
- int maxValue = values.stream().mapToInt(Pair::getRight).filter(Objects::nonNull).max().getAsInt();
- int minValue = values.stream().mapToInt(Pair::getRight).filter(Objects::nonNull).min().getAsInt();
+ int maxValue =
+ values.stream().mapToInt(Pair::getRight).filter(Objects::nonNull).max().getAsInt();
+ int minValue =
+ values.stream().mapToInt(Pair::getRight).filter(Objects::nonNull).min().getAsInt();
ensureCapacityInternal(minValue, maxValue);
for (Pair pair : values) {
setValueInternal(pair.getKey(), pair.getValue());
@@ -360,9 +351,16 @@ public void setValues(List> values) {
* Replaced by {@code setValues(values)}
*/
@Deprecated
- public void setValues(List> values, Integer currentMaxValue, Integer currentMinValue) {
- int maxValue = currentMaxValue != null ? currentMaxValue : values.stream().mapToInt(Pair::getRight).max().getAsInt();
- int minValue = currentMinValue != null ? currentMinValue : values.stream().mapToInt(Pair::getRight).min().getAsInt();
+ public void setValues(
+ List> values, Integer currentMaxValue, Integer currentMinValue) {
+ int maxValue =
+ currentMaxValue != null
+ ? currentMaxValue
+ : values.stream().mapToInt(Pair::getRight).max().getAsInt();
+ int minValue =
+ currentMinValue != null
+ ? currentMinValue
+ : values.stream().mapToInt(Pair::getRight).min().getAsInt();
ensureCapacityInternal(minValue, maxValue);
for (Pair pair : values) {
this.setValue(pair.getKey(), pair.getValue());
@@ -404,7 +402,6 @@ public void merge(RoaringBitmapSliceIndex otherBsi) {
this.minValue = Integer.min(this.minValue, otherBsi.minValue);
}
-
public RoaringBitmapSliceIndex clone() {
RoaringBitmapSliceIndex bitSliceIndex = new RoaringBitmapSliceIndex();
bitSliceIndex.minValue = this.minValue;
@@ -429,14 +426,14 @@ public RoaringBitmapSliceIndex clone() {
* @return columnId set we found in this bsi with giving conditions, using RoaringBitmap to express
* see https://github.com/lemire/BitSliceIndex/blob/master/src/main/java/org/roaringbitmap/circuits/comparator/BasicComparator.java
*/
- private RoaringBitmap oNeilCompare(BitmapSliceIndex.Operation operation, int predicate, RoaringBitmap foundSet) {
+ private RoaringBitmap oNeilCompare(
+ BitmapSliceIndex.Operation operation, int predicate, RoaringBitmap foundSet) {
RoaringBitmap fixedFoundSet = foundSet == null ? this.ebM : foundSet;
RoaringBitmap GT = new RoaringBitmap();
RoaringBitmap LT = new RoaringBitmap();
RoaringBitmap EQ = this.ebM;
-
for (int i = this.bitCount() - 1; i >= 0; i--) {
int bit = (predicate >> i) & 1;
if (bit == 1) {
@@ -446,7 +443,6 @@ private RoaringBitmap oNeilCompare(BitmapSliceIndex.Operation operation, int pre
GT = RoaringBitmap.or(GT, RoaringBitmap.and(EQ, this.bA[i]));
EQ = RoaringBitmap.andNot(EQ, this.bA[i]);
}
-
}
EQ = RoaringBitmap.and(fixedFoundSet, EQ);
switch (operation) {
@@ -459,9 +455,9 @@ private RoaringBitmap oNeilCompare(BitmapSliceIndex.Operation operation, int pre
case LT:
return RoaringBitmap.and(LT, fixedFoundSet);
case LE:
- return RoaringBitmap.or(LT, EQ);
+ return RoaringBitmap.and(RoaringBitmap.or(LT, EQ), fixedFoundSet);
case GE:
- return RoaringBitmap.or(GT, EQ);
+ return RoaringBitmap.and(RoaringBitmap.or(GT, EQ), fixedFoundSet);
default:
throw new IllegalArgumentException("");
}
@@ -479,7 +475,8 @@ private RoaringBitmap oNeilCompare(BitmapSliceIndex.Operation operation, int pre
* @param foundSet columnId set we want compare,using RoaringBitmap to express
* @return columnId set we found in this bsi with giving conditions, using RoaringBitmap to express
*/
- public RoaringBitmap compare(BitmapSliceIndex.Operation operation, int startOrValue, int end, RoaringBitmap foundSet) {
+ public RoaringBitmap compare(
+ BitmapSliceIndex.Operation operation, int startOrValue, int end, RoaringBitmap foundSet) {
RoaringBitmap result = compareUsingMinMax(operation, startOrValue, end, foundSet);
if (result != null) {
return result;
@@ -492,27 +489,36 @@ public RoaringBitmap compare(BitmapSliceIndex.Operation operation, int startOrVa
return oNeilCompare(Operation.NEQ, startOrValue, foundSet);
case GE:
return oNeilCompare(Operation.GE, startOrValue, foundSet);
- case GT: {
- return oNeilCompare(BitmapSliceIndex.Operation.GT, startOrValue, foundSet);
- }
+ case GT:
+ {
+ return oNeilCompare(BitmapSliceIndex.Operation.GT, startOrValue, foundSet);
+ }
case LT:
return oNeilCompare(BitmapSliceIndex.Operation.LT, startOrValue, foundSet);
case LE:
return oNeilCompare(BitmapSliceIndex.Operation.LE, startOrValue, foundSet);
- case RANGE: {
- RoaringBitmap left = oNeilCompare(Operation.GE, startOrValue, foundSet);
- RoaringBitmap right = oNeilCompare(BitmapSliceIndex.Operation.LE, end, foundSet);
-
- return RoaringBitmap.and(left, right);
- }
+ case RANGE:
+ {
+ if (startOrValue < minValue) {
+ startOrValue = minValue;
+ }
+ if (end > maxValue) {
+ end = maxValue;
+ }
+ RoaringBitmap left = oNeilCompare(Operation.GE, startOrValue, foundSet);
+ RoaringBitmap right = oNeilCompare(BitmapSliceIndex.Operation.LE, end, foundSet);
+
+ return RoaringBitmap.and(left, right);
+ }
default:
throw new IllegalArgumentException("not support operation!");
}
}
- private RoaringBitmap compareUsingMinMax(BitmapSliceIndex.Operation operation, int startOrValue, int end, RoaringBitmap foundSet) {
+ private RoaringBitmap compareUsingMinMax(
+ BitmapSliceIndex.Operation operation, int startOrValue, int end, RoaringBitmap foundSet) {
RoaringBitmap all = foundSet == null ? ebM.clone() : RoaringBitmap.and(ebM, foundSet);
RoaringBitmap empty = new RoaringBitmap();
@@ -584,12 +590,11 @@ public Pair sum(RoaringBitmap foundSet) {
}
long count = foundSet.getLongCardinality();
- Long sum = IntStream.range(0, this.bitCount())
- .mapToLong(x -> (long) (1 << x) * RoaringBitmap.andCardinality(this.bA[x], foundSet))
- .sum();
+ Long sum =
+ IntStream.range(0, this.bitCount())
+ .mapToLong(x -> (long) (1 << x) * RoaringBitmap.andCardinality(this.bA[x], foundSet))
+ .sum();
return Pair.newPair(sum, count);
}
-
}
-
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/WritableUtils.java b/bsi/src/main/java/org/roaringbitmap/bsi/WritableUtils.java
index a56b85b45..6a1c248c9 100644
--- a/bsi/src/main/java/org/roaringbitmap/bsi/WritableUtils.java
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/WritableUtils.java
@@ -73,7 +73,6 @@ public static void writeVLong(DataOutput stream, long i) throws IOException {
}
}
-
/**
* Reads a zero-compressed encoded long from input stream and returns it.
*
@@ -136,4 +135,3 @@ public static int decodeVIntSize(byte value) {
return -111 - value;
}
}
-
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/buffer/BitSliceIndexBase.java b/bsi/src/main/java/org/roaringbitmap/bsi/buffer/BitSliceIndexBase.java
index c40c836b0..b835fdc74 100644
--- a/bsi/src/main/java/org/roaringbitmap/bsi/buffer/BitSliceIndexBase.java
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/buffer/BitSliceIndexBase.java
@@ -1,11 +1,9 @@
-
package org.roaringbitmap.bsi.buffer;
import org.roaringbitmap.BatchIterator;
import org.roaringbitmap.IntConsumer;
-import org.roaringbitmap.IntIterator;
-import org.roaringbitmap.RoaringBitmap;
import org.roaringbitmap.bsi.BitmapSliceIndex;
+import org.roaringbitmap.bsi.BitmapSliceIndex.Operation;
import org.roaringbitmap.bsi.Pair;
import org.roaringbitmap.buffer.BufferFastAggregation;
import org.roaringbitmap.buffer.ImmutableRoaringBitmap;
@@ -48,7 +46,6 @@ public class BitSliceIndexBase {
*/
protected ImmutableRoaringBitmap ebM;
-
public int bitCount() {
return this.bA.length;
}
@@ -74,7 +71,6 @@ public Pair getValue(int columnId) {
return Pair.newPair(value, true);
}
-
/**
* valueExists tests whether the value exists.
*/
@@ -82,9 +78,9 @@ public boolean valueExist(Long columnId) {
return this.ebM.contains(columnId.intValue());
}
- //=====================================================================================
+ // =====================================================================================
// parallel execute frame
- //======================================================================================
+ // ======================================================================================
/**
* use java threadPool to parallel exec
@@ -95,10 +91,11 @@ public boolean valueExist(Long columnId) {
* @param pool threadPool to exec
* @return a list of completable futures
*/
- protected List> parallelExec(Function func,
- int parallelism,
- ImmutableRoaringBitmap foundSet,
- ExecutorService pool) {
+ protected List> parallelExec(
+ Function func,
+ int parallelism,
+ ImmutableRoaringBitmap foundSet,
+ ExecutorService pool) {
int batchSize = foundSet.getCardinality() / parallelism;
// fix when batchSize < parallelism
batchSize = Math.max(batchSize, parallelism);
@@ -106,7 +103,6 @@ protected List> parallelExec(Function func,
// todo RoaringBitmap's batchIterator return max 2^16
batchSize = Math.min(batchSize, 65536);
-
List batches = new ArrayList<>();
final BatchIterator batchIterator = foundSet.getBatchIterator();
@@ -126,9 +122,13 @@ protected List> parallelExec(Function func,
List> futures = new ArrayList<>();
for (int[] batch : batches) {
- CompletableFuture future = invokeAsync(() -> {
- return func.apply(batch);
- }, null, pool);
+ CompletableFuture future =
+ invokeAsync(
+ () -> {
+ return func.apply(batch);
+ },
+ null,
+ pool);
futures.add(future);
}
return futures;
@@ -137,20 +137,19 @@ protected List> parallelExec(Function func,
protected CompletableFuture> allOf(List> futuresList) {
CompletableFuture allFuturesResult =
CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[0]));
- return allFuturesResult.thenApply(v ->
- futuresList.stream().
- map(CompletableFuture::join).
- collect(Collectors.toList())
- );
+ return allFuturesResult.thenApply(
+ v -> futuresList.stream().map(CompletableFuture::join).collect(Collectors.toList()));
}
- protected ImmutableRoaringBitmap parallelMR(int parallelism,
- ImmutableRoaringBitmap foundSet,
- Function func,
- ExecutorService pool)
+ protected ImmutableRoaringBitmap parallelMR(
+ int parallelism,
+ ImmutableRoaringBitmap foundSet,
+ Function func,
+ ExecutorService pool)
throws InterruptedException, ExecutionException {
- List> futures = parallelExec(func, parallelism, foundSet, pool);
+ List> futures =
+ parallelExec(func, parallelism, foundSet, pool);
allOf(futures);
@@ -162,19 +161,20 @@ protected ImmutableRoaringBitmap parallelMR(int parallelism,
return MutableRoaringBitmap.or(rbs);
}
- protected CompletableFuture invokeAsync(Supplier supplier,
- Function exceptionHandler,
- Executor forkJoinExecutor) {
- return CompletableFuture.supplyAsync(() -> {
- try {
- return supplier.get();
- } catch (Exception e) {
- if (exceptionHandler == null) {
- throw e;
- }
- return exceptionHandler.apply(e);
- }
- }, forkJoinExecutor);
+ protected CompletableFuture invokeAsync(
+ Supplier supplier, Function exceptionHandler, Executor forkJoinExecutor) {
+ return CompletableFuture.supplyAsync(
+ () -> {
+ try {
+ return supplier.get();
+ } catch (Exception e) {
+ if (exceptionHandler == null) {
+ throw e;
+ }
+ return exceptionHandler.apply(e);
+ }
+ },
+ forkJoinExecutor);
}
/**
@@ -186,28 +186,33 @@ protected CompletableFuture invokeAsync(Supplier supplier,
* @return ImmutableRoaringBitmap
* see https://github.com/lemire/BitSliceIndex/blob/master/src/main/java/org/roaringbitmap/circuits/comparator/BasicComparator.java
*/
- private ImmutableRoaringBitmap oNeilCompare(BitmapSliceIndex.Operation operation,
- int predicate,
- ImmutableRoaringBitmap foundSet) {
+ private ImmutableRoaringBitmap oNeilCompare(
+ BitmapSliceIndex.Operation operation, int predicate, ImmutableRoaringBitmap foundSet) {
ImmutableRoaringBitmap fixedFoundSet = foundSet == null ? this.ebM : foundSet;
- MutableRoaringBitmap GT = new MutableRoaringBitmap();
- MutableRoaringBitmap LT = new MutableRoaringBitmap();
+ MutableRoaringBitmap GT =
+ operation == Operation.GT || operation == Operation.GE ? new MutableRoaringBitmap() : null;
+ MutableRoaringBitmap LT =
+ operation == Operation.LT || operation == Operation.LE ? new MutableRoaringBitmap() : null;
ImmutableRoaringBitmap EQ = this.ebM;
-
for (int i = this.bitCount() - 1; i >= 0; i--) {
int bit = (predicate >> i) & 1;
if (bit == 1) {
- LT = ImmutableRoaringBitmap.or(LT, ImmutableRoaringBitmap.andNot(EQ, this.bA[i]));
+ if (operation == Operation.LT || operation == Operation.LE) {
+ LT = ImmutableRoaringBitmap.or(LT, ImmutableRoaringBitmap.andNot(EQ, this.bA[i]));
+ }
EQ = ImmutableRoaringBitmap.and(EQ, this.bA[i]);
} else {
- GT = ImmutableRoaringBitmap.or(GT, ImmutableRoaringBitmap.and(EQ, this.bA[i]));
+ if (operation == Operation.GT || operation == Operation.GE) {
+ GT = ImmutableRoaringBitmap.or(GT, ImmutableRoaringBitmap.and(EQ, this.bA[i]));
+ }
EQ = ImmutableRoaringBitmap.andNot(EQ, this.bA[i]);
}
-
}
- EQ = ImmutableRoaringBitmap.and(fixedFoundSet, EQ);
+ if (operation != Operation.LT && operation != Operation.GT) {
+ EQ = ImmutableRoaringBitmap.and(fixedFoundSet, EQ);
+ }
switch (operation) {
case EQ:
return EQ;
@@ -231,8 +236,7 @@ private ImmutableRoaringBitmap oNeilCompare(BitmapSliceIndex.Operation operation
* @return ImmutableRoaringBitmap
* see https://github.com/lemire/BitSliceIndex/blob/master/src/main/java/org/roaringbitmap/circuits/comparator/OwenComparator.java
*/
- private ImmutableRoaringBitmap owenGreatEqual(int predicate,
- ImmutableRoaringBitmap foundSet) {
+ private ImmutableRoaringBitmap owenGreatEqual(int predicate, ImmutableRoaringBitmap foundSet) {
ImmutableRoaringBitmap lastSpineGate = null;
int beGtrThan = predicate - 1;
List orInputs = new ArrayList<>();
@@ -241,21 +245,20 @@ private ImmutableRoaringBitmap owenGreatEqual(int predicate,
for (int workingBit = this.bitCount() - 1; workingBit >= leastSignifZero; --workingBit) {
if ((beGtrThan & (1L << workingBit)) == 0L) {
if (lastSpineGate == null) // don't make a singleton AND!
- orInputs.add(this.bA[workingBit]);
+ orInputs.add(this.bA[workingBit]);
else {
// really make the AND
orInputs.add(MutableRoaringBitmap.and(lastSpineGate, this.bA[workingBit]));
}
} else {
- if (lastSpineGate == null)
- lastSpineGate = this.bA[workingBit];
- else
- lastSpineGate = ImmutableRoaringBitmap.and(lastSpineGate, this.bA[workingBit]);
+ if (lastSpineGate == null) lastSpineGate = this.bA[workingBit];
+ else lastSpineGate = ImmutableRoaringBitmap.and(lastSpineGate, this.bA[workingBit]);
}
}
- ImmutableRoaringBitmap result = BufferFastAggregation.horizontal_or(orInputs.toArray(new ImmutableRoaringBitmap[0]));
- //horizontal_or the performance is better
+ ImmutableRoaringBitmap result =
+ BufferFastAggregation.horizontal_or(orInputs.toArray(new ImmutableRoaringBitmap[0]));
+ // horizontal_or the performance is better
// return BufferFastAggregation.or(orInputs.toArray(new ImmutableRoaringBitmap[0]))
if (null == foundSet) {
@@ -265,18 +268,21 @@ private ImmutableRoaringBitmap owenGreatEqual(int predicate,
}
}
- //------------------------------------------------------------------------------------------------------------
+ // ------------------------------------------------------------------------------------------------------------
// See Bit-Sliced Index Arithmetic
- // Finding the rows with the k largest values in a BSI. Given a BSI, S = S^P,S^(P-1)...S^1,S^0 over a table T
- // and a positive integer k<= |T|, we wish to find the bitmap F (for "found set") of rows r with the k largest
+ // Finding the rows with the k largest values in a BSI. Given a BSI, S = S^P,S^(P-1)...S^1,S^0
+ // over a table T
+ // and a positive integer k<= |T|, we wish to find the bitmap F (for "found set") of rows r with
+ // the k largest
// S-values, S(r), in T.
// Algorithm 4.1. Find k rows with largest values in a BSI.
- //------------------------------------------------------------------------------------------------------------
+ // ------------------------------------------------------------------------------------------------------------
// if (k > COUNT(EBM) or k < 0) -- test if parameter k is valid
// Error ("k is invalid") -- if not, exit; otherwise, kth largest S-value exists
// G = empty set; E = EBM; -- G starts with no rows; E with all rows
// for (i = P; i >= 0; i--) { -- i is a descending loop index for bit-slice number
- // X = G OR (E AND S^i) -- X is trial set: G OR {rows in E with 1-bit in position i}
+ // X = G OR (E AND S^i) -- X is trial set: G OR {rows in E with 1-bit in position
+ // i}
// if ((n = COUNT(X) ) > k) -- if n = COUNT(X) has more than k rows
// E = E AND S^i -- E in next pass contains only rows r with bit i on in S(r)
// else if (n < k) { -- if n = COUNT(X) has less than k rows
@@ -290,19 +296,20 @@ private ImmutableRoaringBitmap owenGreatEqual(int predicate,
// } -- we know at this point that COUNT(G) <= k
// F = G OR E -- might be too many rows in F; check below
// if ((n = (COUNT(F) - k) > 0) -- if n too many rows in F
- // {turn off n bits from E in F}; -- throw out some ties to return exactly k rows
+ // {turn off n bits from E in F}; -- throw out some ties to return exactly k rows
public MutableRoaringBitmap topK(ImmutableRoaringBitmap foundSet, int k) {
ImmutableRoaringBitmap fixedFoundSet = foundSet == null ? this.ebM : foundSet;
if (k > fixedFoundSet.getLongCardinality() || k < 0) {
- throw new IllegalArgumentException("TopK param error,cardinality:"
- + fixedFoundSet.getLongCardinality() + " k:" + k);
+ throw new IllegalArgumentException(
+ "TopK param error,cardinality:" + fixedFoundSet.getLongCardinality() + " k:" + k);
}
MutableRoaringBitmap G = new MutableRoaringBitmap();
ImmutableRoaringBitmap E = fixedFoundSet;
for (int i = this.bitCount() - 1; i >= 0; i--) {
- MutableRoaringBitmap X = ImmutableRoaringBitmap.or(G, ImmutableRoaringBitmap.and(E, this.bA[i]));
+ MutableRoaringBitmap X =
+ ImmutableRoaringBitmap.or(G, ImmutableRoaringBitmap.and(E, this.bA[i]));
long n = X.getLongCardinality();
if (n > k) {
E = ImmutableRoaringBitmap.and(E, this.bA[i]);
@@ -317,24 +324,11 @@ public MutableRoaringBitmap topK(ImmutableRoaringBitmap foundSet, int k) {
MutableRoaringBitmap F = ImmutableRoaringBitmap.or(G, E);
long n = F.getLongCardinality() - k;
- if (n > 0) {
- // TODO: make faster
- IntIterator i = F.getIntIterator();
- MutableRoaringBitmap turnoff = new MutableRoaringBitmap();
- while (i.hasNext() && n > 0) {
- turnoff.add(i.next());
- --n;
- }
- F.andNot(turnoff);
- }
-
- if (F.getCardinality() != k)
- throw new RuntimeException("bugs found when compute topK");
-
+ F.remove(0L, (long) F.select((int) n));
+ assert (F.getLongCardinality() == k);
return F;
}
-
/**
* EQ: =
*
@@ -351,7 +345,8 @@ public ImmutableRoaringBitmap rangeEQ(ImmutableRoaringBitmap foundSet, int predi
}
// https://github.com/RoaringBitmap/RoaringBitmap/issues/549
- ImmutableRoaringBitmap result = compareUsingMinMax(BitmapSliceIndex.Operation.EQ, predicate, 0, foundSet);
+ ImmutableRoaringBitmap result =
+ compareUsingMinMax(BitmapSliceIndex.Operation.EQ, predicate, 0, foundSet);
if (result != null) {
return result;
}
@@ -398,7 +393,6 @@ public ImmutableRoaringBitmap rangeGE(ImmutableRoaringBitmap foundSet, int predi
public ImmutableRoaringBitmap range(ImmutableRoaringBitmap foundSet, int start, int end) {
return compare(BitmapSliceIndex.Operation.RANGE, start, end, foundSet);
-
}
/**
@@ -413,7 +407,11 @@ public ImmutableRoaringBitmap range(ImmutableRoaringBitmap foundSet, int start,
* @param foundSet columnId set we want compare,using RoaringBitmap to express
* @return columnId set we found in this bsi with giving conditions, using RoaringBitmap to express
*/
- public ImmutableRoaringBitmap compare(BitmapSliceIndex.Operation operation, int startOrValue, int end, ImmutableRoaringBitmap foundSet) {
+ public ImmutableRoaringBitmap compare(
+ BitmapSliceIndex.Operation operation,
+ int startOrValue,
+ int end,
+ ImmutableRoaringBitmap foundSet) {
ImmutableRoaringBitmap result = compareUsingMinMax(operation, startOrValue, end, foundSet);
if (result != null) {
return result;
@@ -426,28 +424,41 @@ public ImmutableRoaringBitmap compare(BitmapSliceIndex.Operation operation, int
return rangeNEQ(foundSet, startOrValue);
case GE:
return owenGreatEqual(startOrValue, foundSet);
- case GT: {
- return oNeilCompare(BitmapSliceIndex.Operation.GT, startOrValue, foundSet);
- }
+ case GT:
+ {
+ return oNeilCompare(BitmapSliceIndex.Operation.GT, startOrValue, foundSet);
+ }
case LT:
return oNeilCompare(BitmapSliceIndex.Operation.LT, startOrValue, foundSet);
case LE:
return oNeilCompare(BitmapSliceIndex.Operation.LE, startOrValue, foundSet);
- case RANGE: {
- ImmutableRoaringBitmap left = owenGreatEqual(startOrValue, foundSet);
- ImmutableRoaringBitmap right = oNeilCompare(BitmapSliceIndex.Operation.LE, end, foundSet);
-
- return ImmutableRoaringBitmap.and(left, right);
- }
+ case RANGE:
+ {
+ if (startOrValue < minValue) {
+ startOrValue = minValue;
+ }
+ if (end > maxValue) {
+ end = maxValue;
+ }
+ ImmutableRoaringBitmap left = owenGreatEqual(startOrValue, foundSet);
+ ImmutableRoaringBitmap right = oNeilCompare(BitmapSliceIndex.Operation.LE, end, foundSet);
+
+ return ImmutableRoaringBitmap.and(left, right);
+ }
default:
throw new IllegalArgumentException("not support operation!");
}
}
- private ImmutableRoaringBitmap compareUsingMinMax(BitmapSliceIndex.Operation operation, int startOrValue, int end, ImmutableRoaringBitmap foundSet) {
- ImmutableRoaringBitmap all = foundSet == null ? this.ebM.clone() : ImmutableRoaringBitmap.and(this.ebM, foundSet);
+ private ImmutableRoaringBitmap compareUsingMinMax(
+ BitmapSliceIndex.Operation operation,
+ int startOrValue,
+ int end,
+ ImmutableRoaringBitmap foundSet) {
+ ImmutableRoaringBitmap all =
+ foundSet == null ? this.ebM.clone() : ImmutableRoaringBitmap.and(this.ebM, foundSet);
ImmutableRoaringBitmap empty = new MutableRoaringBitmap();
switch (operation) {
@@ -518,27 +529,33 @@ public Pair sum(ImmutableRoaringBitmap foundSet) {
}
long count = foundSet.getLongCardinality();
- Long sum = IntStream.range(0, this.bitCount())
- .mapToLong(x -> (long) (1 << x) * ImmutableRoaringBitmap.andCardinality(this.bA[x], foundSet))
- .sum();
+ Long sum =
+ IntStream.range(0, this.bitCount())
+ .mapToLong(
+ x -> (long) (1 << x) * ImmutableRoaringBitmap.andCardinality(this.bA[x], foundSet))
+ .sum();
return Pair.newPair(sum, count);
}
public List> toPairList() {
List> pairList = new ArrayList<>();
- this.ebM.forEach((IntConsumer) cid -> {
- pairList.add(Pair.newPair(cid, this.getValue(cid).getKey()));
- });
+ this.ebM.forEach(
+ (IntConsumer)
+ cid -> {
+ pairList.add(Pair.newPair(cid, this.getValue(cid).getKey()));
+ });
return pairList;
}
public List> toPairList(ImmutableRoaringBitmap foundSet) {
List> pairList = new ArrayList<>();
ImmutableRoaringBitmap bitmap = ImmutableRoaringBitmap.and(this.ebM, foundSet);
- bitmap.forEach((IntConsumer) cid -> {
- pairList.add(Pair.newPair(cid, this.getValue(cid).getKey()));
- });
+ bitmap.forEach(
+ (IntConsumer)
+ cid -> {
+ pairList.add(Pair.newPair(cid, this.getValue(cid).getKey()));
+ });
return pairList;
}
@@ -569,17 +586,18 @@ protected MutableBitSliceIndex transposeWithCount(int[] batch) {
* @param foundSet
* @return the transpose
*/
- public MutableBitSliceIndex parallelTransposeWithCount(ImmutableRoaringBitmap foundSet,
- int parallelism,
- ExecutorService pool)
+ public MutableBitSliceIndex parallelTransposeWithCount(
+ ImmutableRoaringBitmap foundSet, int parallelism, ExecutorService pool)
throws ExecutionException, InterruptedException {
ImmutableRoaringBitmap fixedFoundSet = foundSet == null ? this.ebM : foundSet;
- Function func = (int[] batch) -> {
- return transposeWithCount(batch);
- };
- List> futures = parallelExec(func, parallelism, fixedFoundSet, pool);
+ Function func =
+ (int[] batch) -> {
+ return transposeWithCount(batch);
+ };
+ List> futures =
+ parallelExec(func, parallelism, fixedFoundSet, pool);
allOf(futures);
@@ -591,7 +609,7 @@ public MutableBitSliceIndex parallelTransposeWithCount(ImmutableRoaringBitmap fo
}
/**
- * parallelIn search the given Set values,
+ * parallelIn search the given Set values,
* we scan the bsi,if the value in values, we add it to result Bitmap
*
* @param parallelism
@@ -602,23 +620,20 @@ public MutableBitSliceIndex parallelTransposeWithCount(ImmutableRoaringBitmap fo
* @throws ExecutionException
* @throws InterruptedException
*/
- public ImmutableRoaringBitmap parallelIn(int parallelism,
- ImmutableRoaringBitmap foundSet,
- Set values,
- ExecutorService pool
- ) throws ExecutionException, InterruptedException {
+ public ImmutableRoaringBitmap parallelIn(
+ int parallelism, ImmutableRoaringBitmap foundSet, Set values, ExecutorService pool)
+ throws ExecutionException, InterruptedException {
ImmutableRoaringBitmap fixedFoundSet = foundSet == null ? this.ebM : foundSet;
- Function func = (int[] batch) -> {
- return batchIn(batch, values);
- };
+ Function func =
+ (int[] batch) -> {
+ return batchIn(batch, values);
+ };
return parallelMR(parallelism, fixedFoundSet, func, pool);
-
}
-
protected ImmutableRoaringBitmap batchIn(int[] batch, Set values) {
MutableRoaringBitmap result = new MutableRoaringBitmap();
@@ -632,4 +647,3 @@ protected ImmutableRoaringBitmap batchIn(int[] batch, Set values) {
return result;
}
}
-
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/buffer/ImmutableBitSliceIndex.java b/bsi/src/main/java/org/roaringbitmap/bsi/buffer/ImmutableBitSliceIndex.java
index 0c2cc1e13..21849d852 100644
--- a/bsi/src/main/java/org/roaringbitmap/bsi/buffer/ImmutableBitSliceIndex.java
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/buffer/ImmutableBitSliceIndex.java
@@ -28,16 +28,15 @@ public class ImmutableBitSliceIndex extends BitSliceIndexBase implements BitmapS
* @param maxValue
* @param minValue
*/
-
- public ImmutableBitSliceIndex(int maxValue, int minValue, ImmutableRoaringBitmap[] bA, ImmutableRoaringBitmap ebM) {
+ public ImmutableBitSliceIndex(
+ int maxValue, int minValue, ImmutableRoaringBitmap[] bA, ImmutableRoaringBitmap ebM) {
this.maxValue = maxValue;
this.minValue = minValue;
this.bA = bA;
this.ebM = ebM;
}
- public ImmutableBitSliceIndex() {
- }
+ public ImmutableBitSliceIndex() {}
/**
* constructs a BSI from byteBuffer
@@ -70,12 +69,10 @@ public ImmutableBitSliceIndex(ByteBuffer buffer) throws IOException {
this.bA = ba;
}
-
public void addDigit(ImmutableRoaringBitmap foundSet, int i) {
throw new UnsupportedOperationException("ImmutableBSI don't support setValue");
}
-
public ImmutableRoaringBitmap getExistenceBitmap() {
return this.ebM;
}
@@ -84,10 +81,9 @@ public void setValue(int cid, int value) {
throw new UnsupportedOperationException("ImmutableBSI don't support setValue");
}
-
@Override
- public void setValues(List> values,
- Integer currentMaxValue, Integer currentMinValue) {
+ public void setValues(
+ List> values, Integer currentMaxValue, Integer currentMinValue) {
throw new UnsupportedOperationException("ImmutableBSI don't support setValues");
}
@@ -96,7 +92,6 @@ public void setValues(List> values) {
throw new UnsupportedOperationException("ImmutableBSI does not support setting values");
}
-
public void add(BitmapSliceIndex otherBitmapSliceIndex) {
throw new UnsupportedOperationException("ImmutableBSI don't support add");
}
@@ -141,7 +136,6 @@ public void serialize(DataOutput output) throws IOException {
}
}
-
public int serializedSizeInBytes() {
int size = 0;
for (ImmutableRoaringBitmap rb : this.bA) {
@@ -150,15 +144,15 @@ public int serializedSizeInBytes() {
return 4 + 4 + 1 + 4 + this.ebM.serializedSizeInBytes() + size;
}
-
public MutableBitSliceIndex toMutableBitSliceIndex() {
MutableRoaringBitmap[] ibA = new MutableRoaringBitmap[this.bA.length];
for (int i = 0; i < this.bA.length; i++) {
ibA[i] = this.bA[i].toMutableRoaringBitmap();
}
- MutableBitSliceIndex bsi = new MutableBitSliceIndex(
- this.maxValue, this.minValue, ibA, this.ebM.toMutableRoaringBitmap());
+ MutableBitSliceIndex bsi =
+ new MutableBitSliceIndex(
+ this.maxValue, this.minValue, ibA, this.ebM.toMutableRoaringBitmap());
return bsi;
}
@@ -175,7 +169,4 @@ public ImmutableBitSliceIndex clone() {
return bsi;
}
-
-
}
-
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/buffer/MutableBitSliceIndex.java b/bsi/src/main/java/org/roaringbitmap/bsi/buffer/MutableBitSliceIndex.java
index 3abdb0ed3..a3940b2fc 100644
--- a/bsi/src/main/java/org/roaringbitmap/bsi/buffer/MutableBitSliceIndex.java
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/buffer/MutableBitSliceIndex.java
@@ -1,17 +1,17 @@
package org.roaringbitmap.bsi.buffer;
-import java.util.Objects;
-import org.roaringbitmap.RoaringBitmap;
import org.roaringbitmap.bsi.BitmapSliceIndex;
import org.roaringbitmap.bsi.Pair;
import org.roaringbitmap.bsi.WritableUtils;
import org.roaringbitmap.buffer.ImmutableRoaringBitmap;
import org.roaringbitmap.buffer.MutableRoaringBitmap;
+
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.List;
+import java.util.Objects;
import java.util.OptionalInt;
/**
@@ -29,15 +29,14 @@ public class MutableBitSliceIndex extends BitSliceIndexBase implements BitmapSli
* @param bA bit slices for this bsi.using MutableRoaringBitmap array express
* @param ebM exits value bitmap,use MutableRoaringBitmap express
*/
- public MutableBitSliceIndex(int maxValue, int minValue,
- MutableRoaringBitmap[] bA, MutableRoaringBitmap ebM) {
+ public MutableBitSliceIndex(
+ int maxValue, int minValue, MutableRoaringBitmap[] bA, MutableRoaringBitmap ebM) {
this.maxValue = maxValue;
this.minValue = minValue;
this.bA = bA;
this.ebM = ebM;
}
-
/**
* construct a new MutableBitSliceIndex.
* Min/Max values are optional. If set to 0 then the underlying BSI will be automatically sized.
@@ -101,7 +100,6 @@ private void grow(int newBitDepth) {
this.bA = newBA;
}
-
/**
* RunOptimize attempts to further compress the runs of consecutive values found in the bitmap
*/
@@ -121,7 +119,7 @@ public boolean hasRunCompression() {
public void addDigit(MutableRoaringBitmap foundSet, int i) {
MutableRoaringBitmap carry = MutableRoaringBitmap.and(this.bA[i], foundSet);
this.getMutableSlice(i).xor(foundSet);
- if (carry.getCardinality() > 0) {
+ if (!carry.isEmpty()) {
if (i + 1 >= this.bitCount()) {
grow(this.bitCount() + 1);
}
@@ -160,13 +158,16 @@ private void setValueInternal(int columnId, int value) {
this.getExistenceBitmap().add(columnId);
}
-
- public void setValues(List> values,
- Integer currentMaxValue, Integer currentMinValue) {
- OptionalInt maxValue = currentMaxValue != null
- ? OptionalInt.of(currentMaxValue) : values.stream().mapToInt(Pair::getRight).max();
- OptionalInt minValue = currentMinValue != null
- ? OptionalInt.of(currentMinValue) : values.stream().mapToInt(Pair::getRight).min();
+ public void setValues(
+ List> values, Integer currentMaxValue, Integer currentMinValue) {
+ OptionalInt maxValue =
+ currentMaxValue != null
+ ? OptionalInt.of(currentMaxValue)
+ : values.stream().mapToInt(Pair::getRight).max();
+ OptionalInt minValue =
+ currentMinValue != null
+ ? OptionalInt.of(currentMinValue)
+ : values.stream().mapToInt(Pair::getRight).min();
if (!maxValue.isPresent() || !minValue.isPresent()) {
throw new IllegalArgumentException("wrong input values list");
@@ -176,7 +177,6 @@ public void setValues(List> values,
for (Pair pair : values) {
this.setValue(pair.getKey(), pair.getValue());
}
-
}
/**
@@ -186,8 +186,10 @@ public void setValues(List> values,
*/
@Override
public void setValues(List> values) {
- int maxValue = values.stream().mapToInt(Pair::getRight).filter(Objects::nonNull).max().getAsInt();
- int minValue = values.stream().mapToInt(Pair::getRight).filter(Objects::nonNull).min().getAsInt();
+ int maxValue =
+ values.stream().mapToInt(Pair::getRight).filter(Objects::nonNull).max().getAsInt();
+ int minValue =
+ values.stream().mapToInt(Pair::getRight).filter(Objects::nonNull).min().getAsInt();
ensureCapacityInternal(minValue, maxValue);
for (Pair pair : values) {
setValueInternal(pair.getKey(), pair.getValue());
@@ -281,10 +283,10 @@ public void merge(MutableBitSliceIndex otherBsi) {
int bitDepth = Integer.max(this.bitCount(), otherBsi.bitCount());
MutableRoaringBitmap[] newBA = new MutableRoaringBitmap[bitDepth];
for (int i = 0; i < bitDepth; i++) {
- MutableRoaringBitmap current = i < this.bA.length
- ? this.getMutableSlice(i) : new MutableRoaringBitmap();
- MutableRoaringBitmap other = i < otherBsi.bA.length
- ? otherBsi.getMutableSlice(i) : new MutableRoaringBitmap();
+ MutableRoaringBitmap current =
+ i < this.bA.length ? this.getMutableSlice(i) : new MutableRoaringBitmap();
+ MutableRoaringBitmap other =
+ i < otherBsi.bA.length ? otherBsi.getMutableSlice(i) : new MutableRoaringBitmap();
newBA[i] = MutableRoaringBitmap.or(current, other);
if (this.runOptimized || otherBsi.runOptimized) {
newBA[i].runOptimize();
@@ -310,7 +312,6 @@ public MutableBitSliceIndex clone() {
bitSliceIndex.runOptimized = this.runOptimized;
return bitSliceIndex;
-
}
public void serialize(ByteBuffer buffer) {
@@ -351,7 +352,6 @@ private void clear() {
this.bA = null;
}
-
public void deserialize(ByteBuffer buffer) throws IOException {
this.clear();
// read meta
@@ -406,7 +406,7 @@ public int serializedSizeInBytes() {
size += rb.serializedSizeInBytes();
}
return 4 + 4 + 1 + 4 + this.ebM.serializedSizeInBytes() + size;
- }
+ }
public ImmutableBitSliceIndex toImmutableBitSliceIndex() {
ImmutableRoaringBitmap[] ibA = new ImmutableRoaringBitmap[this.bA.length];
@@ -414,9 +414,8 @@ public ImmutableBitSliceIndex toImmutableBitSliceIndex() {
ibA[i] = this.bA[i];
}
- ImmutableBitSliceIndex bsi = new ImmutableBitSliceIndex(
- this.maxValue, this.minValue, ibA, this.ebM);
+ ImmutableBitSliceIndex bsi =
+ new ImmutableBitSliceIndex(this.maxValue, this.minValue, ibA, this.ebM);
return bsi;
}
}
-
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/longlong/Roaring64BitmapSliceIndex.java b/bsi/src/main/java/org/roaringbitmap/bsi/longlong/Roaring64BitmapSliceIndex.java
new file mode 100644
index 000000000..5b573e837
--- /dev/null
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/longlong/Roaring64BitmapSliceIndex.java
@@ -0,0 +1,627 @@
+package org.roaringbitmap.bsi.longlong;
+
+import org.roaringbitmap.bsi.BitmapSliceIndex;
+import org.roaringbitmap.bsi.Pair;
+import org.roaringbitmap.bsi.WritableUtils;
+import org.roaringbitmap.longlong.Roaring64Bitmap;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.IntStream;
+
+public class Roaring64BitmapSliceIndex {
+ /**
+ * the maxValue of this bsi
+ */
+ private long maxValue;
+
+ /**
+ * the minValue of this bsi
+ */
+ private long minValue;
+
+ /**
+ * the bit component slice Array of this bsi
+ */
+ private Roaring64Bitmap[] bA;
+
+ /**
+ * the exist bitmap of this bsi which means the columnId have value in this bsi
+ */
+ private Roaring64Bitmap ebM;
+
+ private Boolean runOptimized = false;
+
+ /**
+ * NewBSI constructs a new BSI. Min/Max values are optional. If set to 0
+ * then the underlying BSI will be automatically sized.
+ */
+ public Roaring64BitmapSliceIndex(long minValue, long maxValue) {
+ if (minValue < 0) {
+ throw new IllegalArgumentException("Values should be non-negative");
+ }
+
+ this.bA = new Roaring64Bitmap[64 - Long.numberOfLeadingZeros(maxValue)];
+ for (int i = 0; i < bA.length; i++) {
+ this.bA[i] = new Roaring64Bitmap();
+ }
+
+ this.ebM = new Roaring64Bitmap();
+ }
+
+ /**
+ * NewDefaultBSI constructs an auto-sized BSI
+ */
+ public Roaring64BitmapSliceIndex() {
+ this(0L, 0L);
+ }
+
+ public void add(Roaring64BitmapSliceIndex otherBsi) {
+ if (null == otherBsi || otherBsi.ebM.isEmpty()) {
+ return;
+ }
+
+ this.ebM.or(otherBsi.ebM);
+ if (otherBsi.bitCount() > this.bitCount()) {
+ grow(otherBsi.bitCount());
+ }
+
+ for (int i = 0; i < otherBsi.bitCount(); i++) {
+ this.addDigit(otherBsi.bA[i], i);
+ }
+
+ // update min and max after adding
+ this.minValue = minValue();
+ this.maxValue = maxValue();
+ }
+
+ private void addDigit(Roaring64Bitmap foundSet, int i) {
+ Roaring64Bitmap carry = Roaring64Bitmap.and(this.bA[i], foundSet);
+ this.bA[i].xor(foundSet);
+ if (!carry.isEmpty()) {
+ if (i + 1 >= this.bitCount()) {
+ grow(this.bitCount() + 1);
+ }
+ this.addDigit(carry, i + 1);
+ }
+ }
+
+ private long minValue() {
+ if (ebM.isEmpty()) {
+ return 0;
+ }
+
+ Roaring64Bitmap minValuesId = ebM;
+ for (int i = bA.length - 1; i >= 0; i -= 1) {
+ Roaring64Bitmap tmp = Roaring64Bitmap.andNot(minValuesId, bA[i]);
+ if (!tmp.isEmpty()) {
+ minValuesId = tmp;
+ }
+ }
+
+ return valueAt(minValuesId.first());
+ }
+
+ private long maxValue() {
+ if (ebM.isEmpty()) {
+ return 0;
+ }
+
+ Roaring64Bitmap maxValuesId = ebM;
+ for (int i = bA.length - 1; i >= 0; i -= 1) {
+ Roaring64Bitmap tmp = Roaring64Bitmap.and(maxValuesId, bA[i]);
+ if (!tmp.isEmpty()) {
+ maxValuesId = tmp;
+ }
+ }
+
+ return valueAt(maxValuesId.first());
+ }
+
+ private long valueAt(long columnId) {
+ long value = 0;
+ for (int i = 0; i < this.bitCount(); i += 1) {
+ if (this.bA[i].contains(columnId)) {
+ value |= (1L << i);
+ }
+ }
+
+ return value;
+ }
+
+ /**
+ * RunOptimize attempts to further compress the runs of consecutive values found in the bitmap
+ */
+ public void runOptimize() {
+ this.ebM.runOptimize();
+
+ for (Roaring64Bitmap integers : this.bA) {
+ integers.runOptimize();
+ }
+ this.runOptimized = true;
+ }
+
+ /**
+ * hasRunCompression returns true if the bitmap benefits from run compression
+ */
+ public boolean hasRunCompression() {
+ return this.runOptimized;
+ }
+
+ /**
+ * GetExistenceBitmap returns a pointer to the underlying existence bitmap of the BSI
+ */
+ public Roaring64Bitmap getExistenceBitmap() {
+ return this.ebM;
+ }
+
+ public int bitCount() {
+ return this.bA.length;
+ }
+
+ public long getLongCardinality() {
+ return this.ebM.getLongCardinality();
+ }
+
+ /**
+ * GetValue gets the value at the column ID. Second param will be false for non-existence values.
+ */
+ public Pair getValue(long columnId) {
+ boolean exists = this.ebM.contains(columnId);
+ if (!exists) {
+ return Pair.newPair(0L, false);
+ }
+
+ return Pair.newPair(valueAt(columnId), true);
+ }
+
+ private void clear() {
+ this.maxValue = 0;
+ this.minValue = 0;
+ this.ebM = null;
+ this.bA = null;
+ }
+
+ public void serialize(DataOutput output) throws IOException {
+ // write meta
+ WritableUtils.writeVLong(output, minValue);
+ WritableUtils.writeVLong(output, maxValue);
+ output.writeBoolean(this.runOptimized);
+
+ // write ebm
+ this.ebM.serialize(output);
+
+ // write ba
+ WritableUtils.writeVInt(output, this.bA.length);
+ for (Roaring64Bitmap rb : this.bA) {
+ rb.serialize(output);
+ }
+ }
+
+ public void deserialize(DataInput in) throws IOException {
+ this.clear();
+
+ // read meta
+ this.minValue = WritableUtils.readVInt(in);
+ this.maxValue = WritableUtils.readVInt(in);
+ this.runOptimized = in.readBoolean();
+
+ // read ebm
+ Roaring64Bitmap ebm = new Roaring64Bitmap();
+ ebm.deserialize(in);
+ this.ebM = ebm;
+
+ // read ba
+ int bitDepth = WritableUtils.readVInt(in);
+ Roaring64Bitmap[] ba = new Roaring64Bitmap[bitDepth];
+ for (int i = 0; i < bitDepth; i++) {
+ Roaring64Bitmap rb = new Roaring64Bitmap();
+ rb.deserialize(in);
+ ba[i] = rb;
+ }
+ this.bA = ba;
+ }
+
+ public void serialize(ByteBuffer buffer) throws IOException {
+ // write meta
+ buffer.putLong(this.minValue);
+ buffer.putLong(this.maxValue);
+ buffer.put(this.runOptimized ? (byte) 1 : (byte) 0);
+ // write ebm
+ this.ebM.serialize(buffer);
+
+ // write ba
+ buffer.putInt(this.bA.length);
+ for (Roaring64Bitmap rb : this.bA) {
+ rb.serialize(buffer);
+ }
+ }
+
+ public void deserialize(ByteBuffer buffer) throws IOException {
+ this.clear();
+ // read meta
+ this.minValue = buffer.getLong();
+ this.maxValue = buffer.getLong();
+ this.runOptimized = buffer.get() == (byte) 1;
+
+ // read ebm
+ Roaring64Bitmap ebm = new Roaring64Bitmap();
+ ebm.deserialize(buffer);
+ this.ebM = ebm;
+ // read back
+ buffer.position(buffer.position() + ebm.getSizeInBytes());
+ int bitDepth = buffer.getInt();
+ Roaring64Bitmap[] ba = new Roaring64Bitmap[bitDepth];
+ for (int i = 0; i < bitDepth; i++) {
+ Roaring64Bitmap rb = new Roaring64Bitmap();
+ rb.deserialize(buffer);
+ ba[i] = rb;
+ buffer.position(buffer.position() + rb.getSizeInBytes());
+ }
+ this.bA = ba;
+ }
+
+ public int serializedSizeInBytes() {
+ int size = 0;
+ for (Roaring64Bitmap rb : this.bA) {
+ size += rb.getSizeInBytes();
+ }
+ return 8 + 8 + 1 + 4 + this.ebM.getSizeInBytes() + size;
+ }
+
+ /**
+ * valueExists tests whether the value exists.
+ */
+ public boolean valueExist(Long columnId) {
+ return this.ebM.contains(columnId);
+ }
+
+ /**
+ * SetValue sets a value for a given columnID.
+ */
+ public void setValue(long columnId, long value) {
+ ensureCapacityInternal(value, value);
+ setValueInternal(columnId, value);
+ }
+
+ private void setValueInternal(long columnId, long value) {
+ for (int i = 0; i < this.bitCount(); i += 1) {
+ if ((value & (1L << i)) > 0) {
+ this.bA[i].add(columnId);
+ } else {
+ this.bA[i].remove(columnId);
+ }
+ }
+ this.ebM.add(columnId);
+ }
+
+ private void ensureCapacityInternal(long minValue, long maxValue) {
+ if (ebM.isEmpty()) {
+ this.minValue = minValue;
+ this.maxValue = maxValue;
+ grow(Long.toBinaryString(maxValue).length());
+ } else if (this.minValue > minValue) {
+ this.minValue = minValue;
+ } else if (this.maxValue < maxValue) {
+ this.maxValue = maxValue;
+ grow(Long.toBinaryString(maxValue).length());
+ }
+ }
+
+ private void grow(int newBitDepth) {
+ int oldBitDepth = this.bA.length;
+
+ if (oldBitDepth >= newBitDepth) {
+ return;
+ }
+
+ Roaring64Bitmap[] newBA = new Roaring64Bitmap[newBitDepth];
+ if (oldBitDepth != 0) {
+ System.arraycopy(this.bA, 0, newBA, 0, oldBitDepth);
+ }
+
+ for (int i = newBitDepth - 1; i >= oldBitDepth; i--) {
+ newBA[i] = new Roaring64Bitmap();
+ if (this.runOptimized) {
+ newBA[i].runOptimize();
+ }
+ }
+ this.bA = newBA;
+ }
+
+ public void setValues(List> values) {
+ long maxValue =
+ values.stream().mapToLong(Pair::getRight).filter(Objects::nonNull).max().getAsLong();
+ long minValue =
+ values.stream().mapToLong(Pair::getRight).filter(Objects::nonNull).min().getAsLong();
+ ensureCapacityInternal(minValue, maxValue);
+ for (Pair pair : values) {
+ setValueInternal(pair.getKey(), pair.getValue());
+ }
+ }
+
+ /**
+ * merge will merge 2 bsi into current
+ * merge API was designed for distributed computing
+ * note: current and other bsi has no intersection
+ *
+ * @param otherBsi other bsi we need merge
+ */
+ public void merge(Roaring64BitmapSliceIndex otherBsi) {
+
+ if (null == otherBsi || otherBsi.ebM.isEmpty()) {
+ return;
+ }
+
+ // todo whether we need this
+ if (Roaring64Bitmap.intersects(this.ebM, otherBsi.ebM)) {
+ throw new IllegalArgumentException("merge can be used only in bsiA bsiB is null");
+ }
+
+ int bitDepth = Integer.max(this.bitCount(), otherBsi.bitCount());
+ Roaring64Bitmap[] newBA = new Roaring64Bitmap[bitDepth];
+ for (int i = 0; i < bitDepth; i++) {
+ Roaring64Bitmap current = i < this.bA.length ? this.bA[i] : new Roaring64Bitmap();
+ Roaring64Bitmap other = i < otherBsi.bA.length ? otherBsi.bA[i] : new Roaring64Bitmap();
+ newBA[i] = Roaring64Bitmap.or(current, other);
+ if (this.runOptimized || otherBsi.runOptimized) {
+ newBA[i].runOptimize();
+ }
+ }
+ this.bA = newBA;
+ this.ebM.or(otherBsi.ebM);
+ this.runOptimized = this.runOptimized || otherBsi.runOptimized;
+ this.maxValue = Long.max(this.maxValue, otherBsi.maxValue);
+ this.minValue = Long.min(this.minValue, otherBsi.minValue);
+ }
+
+ @Override
+ public Roaring64BitmapSliceIndex clone() {
+ Roaring64BitmapSliceIndex bitSliceIndex = new Roaring64BitmapSliceIndex();
+ bitSliceIndex.minValue = this.minValue;
+ bitSliceIndex.maxValue = this.maxValue;
+ bitSliceIndex.ebM = this.ebM.clone();
+ Roaring64Bitmap[] cloneBA = new Roaring64Bitmap[this.bitCount()];
+ for (int i = 0; i < cloneBA.length; i++) {
+ cloneBA[i] = this.bA[i].clone();
+ }
+ bitSliceIndex.bA = cloneBA;
+ bitSliceIndex.runOptimized = this.runOptimized;
+
+ return bitSliceIndex;
+ }
+
+ /**
+ * O'Neil range using a bit-sliced index
+ *
+ * @param operation compare operation
+ * @param predicate the value we found filter
+ * @param foundSet columnId set we want compare,using RoaringBitmap to express
+ * @return columnId set we found in this bsi with giving conditions, using RoaringBitmap to express
+ * see https://github.com/lemire/BitSliceIndex/blob/master/src/main/java/org/roaringbitmap/circuits/comparator/BasicComparator.java
+ */
+ private Roaring64Bitmap oNeilCompare(
+ BitmapSliceIndex.Operation operation, long predicate, Roaring64Bitmap foundSet) {
+ Roaring64Bitmap fixedFoundSet = foundSet == null ? this.ebM : foundSet;
+
+ Roaring64Bitmap GT = new Roaring64Bitmap();
+ Roaring64Bitmap LT = new Roaring64Bitmap();
+ Roaring64Bitmap EQ = this.ebM;
+
+ for (int i = this.bitCount() - 1; i >= 0; i--) {
+ int bit = (int) ((predicate >> i) & 1);
+ if (bit == 1) {
+ LT = Roaring64Bitmap.or(LT, Roaring64Bitmap.andNot(EQ, this.bA[i]));
+ EQ = Roaring64Bitmap.and(EQ, this.bA[i]);
+ } else {
+ GT = Roaring64Bitmap.or(GT, Roaring64Bitmap.and(EQ, this.bA[i]));
+ EQ = Roaring64Bitmap.andNot(EQ, this.bA[i]);
+ }
+ }
+ EQ = Roaring64Bitmap.and(fixedFoundSet, EQ);
+ switch (operation) {
+ case EQ:
+ return EQ;
+ case NEQ:
+ return Roaring64Bitmap.andNot(fixedFoundSet, EQ);
+ case GT:
+ return Roaring64Bitmap.and(GT, fixedFoundSet);
+ case LT:
+ return Roaring64Bitmap.and(LT, fixedFoundSet);
+ case LE:
+ return Roaring64Bitmap.and(Roaring64Bitmap.or(LT, EQ), fixedFoundSet);
+ case GE:
+ return Roaring64Bitmap.and(Roaring64Bitmap.or(GT, EQ), fixedFoundSet);
+ default:
+ throw new IllegalArgumentException("");
+ }
+ }
+
+ /**
+ * BSI Compare using single thread
+ * this Function compose algorithm from O'Neil and Owen Kaser
+ * the GE algorithm is from Owen since the performance is better. others are from O'Neil
+ *
+ * @param operation
+ * @param startOrValue the start or value of comparison, when the comparison operation is range, it's start,
+ * when others,it's value.
+ * @param end the end value of comparison. when the comparison operation is not range,the end = 0
+ * @param foundSet columnId set we want compare,using RoaringBitmap to express
+ * @return columnId set we found in this bsi with giving conditions, using RoaringBitmap to express
+ */
+ public Roaring64Bitmap compare(
+ BitmapSliceIndex.Operation operation, long startOrValue, long end, Roaring64Bitmap foundSet) {
+ Roaring64Bitmap result = compareUsingMinMax(operation, startOrValue, end, foundSet);
+ if (result != null) {
+ return result;
+ }
+
+ switch (operation) {
+ case EQ:
+ return oNeilCompare(BitmapSliceIndex.Operation.EQ, startOrValue, foundSet);
+ case NEQ:
+ return oNeilCompare(BitmapSliceIndex.Operation.NEQ, startOrValue, foundSet);
+ case GE:
+ return oNeilCompare(BitmapSliceIndex.Operation.GE, startOrValue, foundSet);
+ case GT:
+ {
+ return oNeilCompare(BitmapSliceIndex.Operation.GT, startOrValue, foundSet);
+ }
+ case LT:
+ return oNeilCompare(BitmapSliceIndex.Operation.LT, startOrValue, foundSet);
+
+ case LE:
+ return oNeilCompare(BitmapSliceIndex.Operation.LE, startOrValue, foundSet);
+
+ case RANGE:
+ {
+ if (startOrValue < minValue) {
+ startOrValue = minValue;
+ }
+ if (end > maxValue) {
+ end = maxValue;
+ }
+ Roaring64Bitmap left =
+ oNeilCompare(BitmapSliceIndex.Operation.GE, startOrValue, foundSet);
+ Roaring64Bitmap right = oNeilCompare(BitmapSliceIndex.Operation.LE, end, foundSet);
+
+ return Roaring64Bitmap.and(left, right);
+ }
+ default:
+ throw new IllegalArgumentException("not support operation!");
+ }
+ }
+
+ private Roaring64Bitmap compareUsingMinMax(
+ BitmapSliceIndex.Operation operation, long startOrValue, long end, Roaring64Bitmap foundSet) {
+ Roaring64Bitmap all = foundSet == null ? ebM.clone() : Roaring64Bitmap.and(ebM, foundSet);
+ Roaring64Bitmap empty = new Roaring64Bitmap();
+
+ switch (operation) {
+ case LT:
+ if (startOrValue > maxValue) {
+ return all;
+ } else if (startOrValue <= minValue) {
+ return empty;
+ }
+
+ break;
+ case LE:
+ if (startOrValue >= maxValue) {
+ return all;
+ } else if (startOrValue < minValue) {
+ return empty;
+ }
+
+ break;
+ case GT:
+ if (startOrValue < minValue) {
+ return all;
+ } else if (startOrValue >= maxValue) {
+ return empty;
+ }
+
+ break;
+ case GE:
+ if (startOrValue <= minValue) {
+ return all;
+ } else if (startOrValue > maxValue) {
+ return empty;
+ }
+
+ break;
+ case EQ:
+ if (minValue == maxValue && minValue == startOrValue) {
+ return all;
+ } else if (startOrValue < minValue || startOrValue > maxValue) {
+ return empty;
+ }
+
+ break;
+ case NEQ:
+ if (minValue == maxValue) {
+ return minValue == startOrValue ? empty : all;
+ }
+
+ break;
+ case RANGE:
+ if (startOrValue <= minValue && end >= maxValue) {
+ return all;
+ } else if (startOrValue > maxValue || end < minValue) {
+ return empty;
+ }
+
+ break;
+ default:
+ return null;
+ }
+
+ return null;
+ }
+
+ public Pair sum(Roaring64Bitmap foundSet) {
+ if (null == foundSet || foundSet.isEmpty()) {
+ return Pair.newPair(0L, 0L);
+ }
+ long count = foundSet.getLongCardinality();
+
+ Long sum =
+ IntStream.range(0, this.bitCount())
+ .mapToLong(x -> (1L << x) * Roaring64Bitmap.andCardinality(this.bA[x], foundSet))
+ .sum();
+
+ return Pair.newPair(sum, count);
+ }
+
+ public Roaring64Bitmap topK(Roaring64Bitmap foundSet, long k) {
+ if (null == foundSet || foundSet.isEmpty()) {
+ return new Roaring64Bitmap();
+ }
+ if (k >= foundSet.getLongCardinality()) {
+ return foundSet;
+ }
+ Roaring64Bitmap re = new Roaring64Bitmap();
+ Roaring64Bitmap candidates = foundSet.clone();
+
+ for (int x = this.bitCount() - 1; x >= 0 && !candidates.isEmpty() && k > 0; x--) {
+ long cardinality = Roaring64Bitmap.and(candidates, this.bA[x]).getLongCardinality();
+
+ if (cardinality > k) {
+ candidates.and(this.bA[x]);
+ } else {
+ re.or(Roaring64Bitmap.and(candidates, this.bA[x]));
+ candidates.andNot(this.bA[x]);
+ k -= cardinality;
+ }
+ }
+ return re;
+ }
+
+ public Roaring64Bitmap transpose(Roaring64Bitmap foundSet) {
+ Roaring64Bitmap re = new Roaring64Bitmap();
+ Roaring64Bitmap fixedFoundSet =
+ foundSet == null ? this.ebM : Roaring64Bitmap.and(foundSet, this.ebM);
+ fixedFoundSet.forEach((long x) -> re.add(this.getValue(x).getKey()));
+ return re;
+ }
+
+ public Roaring64BitmapSliceIndex transposeWithCount(Roaring64Bitmap foundSet) {
+ Roaring64BitmapSliceIndex re = new Roaring64BitmapSliceIndex();
+ Roaring64Bitmap fixedFoundSet =
+ foundSet == null ? this.ebM : Roaring64Bitmap.and(foundSet, this.ebM);
+ fixedFoundSet.forEach(
+ (long x) -> {
+ long nk = this.getValue(x).getKey();
+ if (re.valueExist(nk)) {
+ re.setValue(nk, re.getValue(nk).getKey() + 1);
+ } else {
+ re.setValue(nk, 1);
+ }
+ });
+ return re;
+ }
+}
diff --git a/bsi/src/main/java/org/roaringbitmap/bsi/longlong/Roaring64NavigableMapSliceIndex.java b/bsi/src/main/java/org/roaringbitmap/bsi/longlong/Roaring64NavigableMapSliceIndex.java
new file mode 100644
index 000000000..ffbcf1cad
--- /dev/null
+++ b/bsi/src/main/java/org/roaringbitmap/bsi/longlong/Roaring64NavigableMapSliceIndex.java
@@ -0,0 +1,731 @@
+package org.roaringbitmap.bsi.longlong;
+
+import org.roaringbitmap.bsi.BitmapSliceIndex;
+import org.roaringbitmap.bsi.Pair;
+import org.roaringbitmap.longlong.Roaring64NavigableMap;
+
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.IntStream;
+
+/**
+ * Roaring64NavigableMap based bsi implementation.
+ *
+ * See {@link #serialize} for more information for serialization format}
+ */
+public class Roaring64NavigableMapSliceIndex {
+ /**
+ * the maxValue of this bsi
+ */
+ private long maxValue;
+
+ /**
+ * the minValue of this bsi
+ */
+ private long minValue;
+
+ /**
+ * the bit component slice Array of this bsi
+ */
+ private Roaring64NavigableMap[] bA;
+
+ /**
+ * the exist bitmap of this bsi which means the columnId have value in this bsi
+ */
+ private Roaring64NavigableMap ebM;
+
+ private Boolean runOptimized = false;
+
+ /**
+ * bsi serialization mode compatible with roaring(go)
+ */
+ public static int BSI64_SERIALIZATION_MODE_COMPATIBLE_WITH_GO = 0;
+
+ /**
+ * The serialization format for Roaring64NavigableMapSliceIndex.
+ * Currently, {@link #BSI64_SERIALIZATION_MODE_COMPATIBLE_WITH_GO} is supported.
+ * Other serialization formats maybe added in the future, and the serialization formats may change.
+ * See {@link #serialize} for more information for serialization format}
+ */
+ public static int DEFAULT_BSI64_NAVIGABLE_SERIALIZATION_MODE =
+ BSI64_SERIALIZATION_MODE_COMPATIBLE_WITH_GO;
+
+ /**
+ * NewDefaultBSI constructs an auto-sized BSI.
+ */
+ public Roaring64NavigableMapSliceIndex() {
+ this(0L, 0L);
+ }
+
+ /**
+ * NewBSI constructs a new BSI. Min/Max values are optional. If set to 0
+ * then the underlying BSI will be automatically sized.
+ */
+ public Roaring64NavigableMapSliceIndex(long minValue, long maxValue) {
+ if (minValue < 0) {
+ throw new IllegalArgumentException("Values should be non-negative");
+ }
+ if (maxValue < minValue) {
+ throw new IllegalArgumentException("maxValue should GE minValue");
+ }
+
+ this.bA = new Roaring64NavigableMap[64 - Long.numberOfLeadingZeros(maxValue)];
+ for (int i = 0; i < bA.length; i++) {
+ this.bA[i] = new Roaring64NavigableMap();
+ }
+
+ this.ebM = new Roaring64NavigableMap();
+ }
+
+ /**
+ * add all content from another BSI instance, current bsi is modified
+ */
+ public void add(Roaring64NavigableMapSliceIndex otherBsi) {
+ if (null == otherBsi || otherBsi.ebM.isEmpty()) {
+ return;
+ }
+
+ this.ebM.or(otherBsi.ebM);
+ if (otherBsi.bitCount() > this.bitCount()) {
+ grow(otherBsi.bitCount());
+ }
+
+ for (int i = 0; i < otherBsi.bitCount(); i++) {
+ this.addDigit(otherBsi.bA[i], i);
+ }
+
+ // update min and max after adding
+ this.minValue = minValue();
+ this.maxValue = maxValue();
+ }
+
+ /**
+ * add the specify slice to current 'bA[]' at index 'i', and 'carry' will be processed automatically
+ */
+ private void addDigit(Roaring64NavigableMap foundSet, int i) {
+ Roaring64NavigableMap carry = Roaring64NavigableMap.and(this.bA[i], foundSet);
+ this.bA[i].xor(foundSet);
+ if (!carry.isEmpty()) {
+ if (i + 1 >= this.bitCount()) {
+ grow(this.bitCount() + 1);
+ }
+ this.addDigit(carry, i + 1);
+ }
+ }
+
+ /**
+ * get the min value from the bsi
+ */
+ public long minValue() {
+ if (ebM.isEmpty()) {
+ return 0;
+ }
+
+ Roaring64NavigableMap minValuesId = ebM;
+ for (int i = bA.length - 1; i >= 0; i -= 1) {
+ Roaring64NavigableMap tmp = Roaring64NavigableMap.andNot(minValuesId, bA[i]);
+ if (!tmp.isEmpty()) {
+ minValuesId = tmp;
+ }
+ }
+
+ return valueAt(minValuesId.first());
+ }
+
+ /**
+ * get the max value from the bsi
+ */
+ public long maxValue() {
+ if (ebM.isEmpty()) {
+ return 0;
+ }
+
+ Roaring64NavigableMap maxValuesId = ebM;
+ for (int i = bA.length - 1; i >= 0; i -= 1) {
+ Roaring64NavigableMap tmp = Roaring64NavigableMap.and(maxValuesId, bA[i]);
+ if (!tmp.isEmpty()) {
+ maxValuesId = tmp;
+ }
+ }
+
+ return valueAt(maxValuesId.first());
+ }
+
+ /**
+ * return the value associated with the input columnId
+ * @param columnId the column id
+ * @return the value associated with the input columnId
+ */
+ private long valueAt(long columnId) {
+ long value = 0;
+ for (int i = 0; i < this.bitCount(); i += 1) {
+ if (this.bA[i].contains(columnId)) {
+ value |= (1L << i);
+ }
+ }
+
+ return value;
+ }
+
+ /**
+ * RunOptimize attempts to further compress the runs of consecutive values found in the bitmap
+ */
+ public void runOptimize() {
+ this.ebM.runOptimize();
+
+ for (Roaring64NavigableMap integers : this.bA) {
+ integers.runOptimize();
+ }
+ this.runOptimized = true;
+ }
+
+ /**
+ * hasRunCompression returns true if the bitmap benefits from run compression
+ */
+ public boolean hasRunCompression() {
+ return this.runOptimized;
+ }
+
+ /**
+ * GetExistenceBitmap returns a pointer to the underlying existence bitmap of the BSI
+ */
+ public Roaring64NavigableMap getExistenceBitmap() {
+ return this.ebM;
+ }
+
+ /**
+ * the number of slice
+ */
+ public int bitCount() {
+ return this.bA.length;
+ }
+
+ /**
+ * get the cardinality of the bsi (the number of distinct values added to the ebM)
+ */
+ public long getLongCardinality() {
+ return this.ebM.getLongCardinality();
+ }
+
+ /**
+ * get the value at the column ID.
+ */
+ public Pair getValue(long columnId) {
+ boolean exists = this.ebM.contains(columnId);
+ if (!exists) {
+ return Pair.newPair(0L, false);
+ }
+
+ return Pair.newPair(valueAt(columnId), true);
+ }
+
+ private void clear() {
+ this.maxValue = 0;
+ this.minValue = 0;
+ this.ebM = null;
+ this.bA = null;
+ }
+
+ /**
+ * Serialize the BSI.
+ *