From 8c758095e809287a0ee32b421424c3f1cdde0738 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 01:12:06 +0000 Subject: [PATCH 001/114] Bump rui314/setup-mold Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from b015f7e3f2938ad3a5ed6e5111a8c6c7c1d6db6e to bac87d5a5820d626ba77131fbbfbce77faf03b6e. - [Commits](https://github.com/rui314/setup-mold/compare/b015f7e3f2938ad3a5ed6e5111a8c6c7c1d6db6e...bac87d5a5820d626ba77131fbbfbce77faf03b6e) --- updated-dependencies: - dependency-name: rui314/setup-mold dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5331725..391889a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@b015f7e3f2938ad3a5ed6e5111a8c6c7c1d6db6e + - uses: rui314/setup-mold@bac87d5a5820d626ba77131fbbfbce77faf03b6e - name: Build run: make build @@ -32,7 +32,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@b015f7e3f2938ad3a5ed6e5111a8c6c7c1d6db6e + - uses: rui314/setup-mold@bac87d5a5820d626ba77131fbbfbce77faf03b6e - name: Check formatting and clippy run: make lint @@ -43,7 +43,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@b015f7e3f2938ad3a5ed6e5111a8c6c7c1d6db6e + - uses: rui314/setup-mold@bac87d5a5820d626ba77131fbbfbce77faf03b6e - name: Run unit tests run: make test From 10c7c26227c41bfdbd183a6f72ed50e3bf8080d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2025 01:53:49 +0000 Subject: [PATCH 002/114] Update itertools requirement from 0.12 to 0.14 --- updated-dependencies: - dependency-name: itertools dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- crates/bpe/Cargo.toml | 2 +- crates/bpe/tests/Cargo.toml | 2 +- crates/geo_filters/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bpe/Cargo.toml b/crates/bpe/Cargo.toml index d9dff96..7366c27 100644 --- a/crates/bpe/Cargo.toml +++ b/crates/bpe/Cargo.toml @@ -20,7 +20,7 @@ tiktoken = ["dep:base64"] aneubeck-daachorse = "1.1.1" base64 = { version = "0.22", optional = true } fnv = "1.0" -itertools = "0.12" +itertools = "0.14" rand = { version = "0.8", optional = true } serde = { version = "1", features = ["derive"] } diff --git a/crates/bpe/tests/Cargo.toml b/crates/bpe/tests/Cargo.toml index dcfed3e..0a55458 100644 --- a/crates/bpe/tests/Cargo.toml +++ b/crates/bpe/tests/Cargo.toml @@ -5,6 +5,6 @@ edition = "2021" [dependencies] bpe = { path = "../../bpe", features = ["rand"] } bpe-openai = { path = "../../bpe-openai" } -itertools = "0.13" +itertools = "0.14" rand = "0.8" tiktoken-rs = "0.6" diff --git a/crates/geo_filters/Cargo.toml b/crates/geo_filters/Cargo.toml index a1e596c..9c69752 100644 --- a/crates/geo_filters/Cargo.toml +++ b/crates/geo_filters/Cargo.toml @@ -26,7 +26,7 @@ evaluation = [ clap = { version = "4", optional = true, features = ["derive"] } fnv = "1.0" hyperloglogplus = { version = "0.4", optional = true } -itertools = "0.13" +itertools = "0.14" once_cell = "1.18" rand = { version = "0.8", optional = true } rayon = { version = "1.7", optional = true } From 378cdaffba1027c2093ea3cc81741499608fec67 Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Fri, 10 Jan 2025 10:49:41 -0700 Subject: [PATCH 003/114] add bpe-openai to the readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a97abe3..ae3acce 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ A collection of useful algorithms written in Rust. Currently contains: - [`geo_filters`](crates/geo_filters): probabilistic data structures that solve the [Distinct Count Problem](https://en.wikipedia.org/wiki/Count-distinct_problem) using geometric filters. - [`bpe`](crates/bpe): fast, correct, and novel algorithms for the [Byte Pair Encoding Algorithm](https://en.wikipedia.org/wiki/Large_language_model#BPE) which are particularly useful for chunking of documents. +- [`bpe-openai`](crates/bpe-openai): Fast tokenizers for OpenAI token sets based on the `bpe` crate. - [`string-offsets`](crates/string-offsets): converts string positions between bytes, chars, UTF-16 code units, and line numbers. Useful when sending string indices across language boundaries. ## Background From fdcc1cc3a6dfc85ebca6cbc62b5cc03a06fc7f9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 01:16:18 +0000 Subject: [PATCH 004/114] Bump rui314/setup-mold Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from bac87d5a5820d626ba77131fbbfbce77faf03b6e to f80524ca6eeaa76759b57fb78ddce5d87a20c720. - [Commits](https://github.com/rui314/setup-mold/compare/bac87d5a5820d626ba77131fbbfbce77faf03b6e...f80524ca6eeaa76759b57fb78ddce5d87a20c720) --- updated-dependencies: - dependency-name: rui314/setup-mold dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 391889a..4051998 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@bac87d5a5820d626ba77131fbbfbce77faf03b6e + - uses: rui314/setup-mold@f80524ca6eeaa76759b57fb78ddce5d87a20c720 - name: Build run: make build @@ -32,7 +32,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@bac87d5a5820d626ba77131fbbfbce77faf03b6e + - uses: rui314/setup-mold@f80524ca6eeaa76759b57fb78ddce5d87a20c720 - name: Check formatting and clippy run: make lint @@ -43,7 +43,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@bac87d5a5820d626ba77131fbbfbce77faf03b6e + - uses: rui314/setup-mold@f80524ca6eeaa76759b57fb78ddce5d87a20c720 - name: Run unit tests run: make test From 0d1d52aace27151b749756a86076d7b5129b7dde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 01:29:11 +0000 Subject: [PATCH 005/114] Update rand requirement from 0.8 to 0.9 Updates the requirements on [rand](https://github.com/rust-random/rand) to permit the latest version. - [Release notes](https://github.com/rust-random/rand/releases) - [Changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-random/rand/compare/0.8.0...0.9.0) --- updated-dependencies: - dependency-name: rand dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- crates/bpe/Cargo.toml | 2 +- crates/bpe/benchmarks/Cargo.toml | 2 +- crates/bpe/tests/Cargo.toml | 2 +- crates/geo_filters/Cargo.toml | 4 ++-- crates/string-offsets/Cargo.toml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/bpe/Cargo.toml b/crates/bpe/Cargo.toml index 7366c27..fc562ce 100644 --- a/crates/bpe/Cargo.toml +++ b/crates/bpe/Cargo.toml @@ -21,7 +21,7 @@ aneubeck-daachorse = "1.1.1" base64 = { version = "0.22", optional = true } fnv = "1.0" itertools = "0.14" -rand = { version = "0.8", optional = true } +rand = { version = "0.9", optional = true } serde = { version = "1", features = ["derive"] } [dev-dependencies] diff --git a/crates/bpe/benchmarks/Cargo.toml b/crates/bpe/benchmarks/Cargo.toml index 87f35c2..765b5b1 100644 --- a/crates/bpe/benchmarks/Cargo.toml +++ b/crates/bpe/benchmarks/Cargo.toml @@ -21,6 +21,6 @@ test = true bpe = { path = "../../bpe" } bpe-openai = { path = "../../bpe-openai" } criterion = "0.5" -rand = "0.8" +rand = "0.9" tiktoken-rs = "0.6" tokenizers = { version = "0.21", features = ["http"] } diff --git a/crates/bpe/tests/Cargo.toml b/crates/bpe/tests/Cargo.toml index 0a55458..fa0b0f0 100644 --- a/crates/bpe/tests/Cargo.toml +++ b/crates/bpe/tests/Cargo.toml @@ -6,5 +6,5 @@ edition = "2021" bpe = { path = "../../bpe", features = ["rand"] } bpe-openai = { path = "../../bpe-openai" } itertools = "0.14" -rand = "0.8" +rand = "0.9" tiktoken-rs = "0.6" diff --git a/crates/geo_filters/Cargo.toml b/crates/geo_filters/Cargo.toml index 9c69752..fa0f5ef 100644 --- a/crates/geo_filters/Cargo.toml +++ b/crates/geo_filters/Cargo.toml @@ -28,14 +28,14 @@ fnv = "1.0" hyperloglogplus = { version = "0.4", optional = true } itertools = "0.14" once_cell = "1.18" -rand = { version = "0.8", optional = true } +rand = { version = "0.9", optional = true } rayon = { version = "1.7", optional = true } regex = { version = "1", optional = true } [dev-dependencies] criterion = "0.5" geo_filters = { path = ".", features = ["evaluation"] } -rand = "0.8" +rand = "0.9" rand_chacha = "0.3" rayon = "1.7" diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index fd9b838..76676c6 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -10,5 +10,5 @@ keywords = ["unicode", "positions", "utf16", "characters", "lines"] categories = ["algorithms", "data-structures", "text-processing", "development-tools::ffi"] [dev-dependencies] -rand = "0.8" +rand = "0.9" rand_chacha = "0.3" From c3177e2037024647e94a1a36ffa0560ab780e9b4 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 7 Mar 2025 15:08:12 -0800 Subject: [PATCH 006/114] Fix incorrect use of usize for 32 bit systems When compiling to wasm, I noticed this library would not produce the correct outputs. After a lot of frustration, I finally tracked this issue down to the line: ``` const UTF8_WIDTH: usize = 0x4322_0000_1111_1111; (UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf ``` This works fine on 64 bit systems, but on 32 bit systems, the `usize` type is 32 bits. If you are compiling this library directly, you do get an error about this but apparently you don't if you're using it as a dependency --- crates/string-offsets/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index ee05e54..715e900 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -385,8 +385,8 @@ fn new_converter(content: &[u8]) -> StringOffsets { /// Returns 0 if the byte is not a valid first byte of a UTF-8 char. fn utf8_width(c: u8) -> usize { // Every nibble represents the utf8 length given the first 4 bits of a utf8 encoded byte. - const UTF8_WIDTH: usize = 0x4322_0000_1111_1111; - (UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf + const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111; + ((UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf).try_into().unwrap() } fn utf8_to_utf16_width(content: &[u8]) -> usize { From ab2ef12af9ecaeb34e60a8165306e2c5b4108a4a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Sat, 8 Mar 2025 00:42:48 -0800 Subject: [PATCH 007/114] Use cast instead --- crates/string-offsets/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 715e900..5aba9f1 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -386,7 +386,7 @@ fn new_converter(content: &[u8]) -> StringOffsets { fn utf8_width(c: u8) -> usize { // Every nibble represents the utf8 length given the first 4 bits of a utf8 encoded byte. const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111; - ((UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf).try_into().unwrap() + ((UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf) as usize } fn utf8_to_utf16_width(content: &[u8]) -> usize { From a94ea0b883f289e49212b1ab33890e0da5aba5a4 Mon Sep 17 00:00:00 2001 From: Greg Orzell Date: Mon, 10 Mar 2025 09:17:38 +0100 Subject: [PATCH 008/114] actions: Enable workflow dispatch for the ci workflow. --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4051998..19f9950 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,6 +2,7 @@ name: CI on: push: + workflow_dispatch: permissions: contents: read From f3b3fb52944ea48ee33c2d9fe429bfeefdb470a3 Mon Sep 17 00:00:00 2001 From: Greg Orzell Date: Mon, 10 Mar 2025 09:29:24 +0100 Subject: [PATCH 009/114] Also add pull requests so that maybe approval is triggered for outside contributors? --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 19f9950..d65b8ac 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,6 +2,7 @@ name: CI on: push: + pull_request: workflow_dispatch: permissions: From 8212e0adbeff1f7b8f910b4e22b7fc43720a3dac Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Mon, 10 Mar 2025 09:42:52 +0100 Subject: [PATCH 010/114] Update crates/string-offsets/src/lib.rs --- crates/string-offsets/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 5aba9f1..ac81552 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -385,7 +385,7 @@ fn new_converter(content: &[u8]) -> StringOffsets { /// Returns 0 if the byte is not a valid first byte of a UTF-8 char. fn utf8_width(c: u8) -> usize { // Every nibble represents the utf8 length given the first 4 bits of a utf8 encoded byte. - const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111; + const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111 ; ((UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf) as usize } From 7760fe8aea9fb3178f538f345cb0ac11fbd8aac0 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Mon, 10 Mar 2025 09:43:11 +0100 Subject: [PATCH 011/114] Update crates/string-offsets/src/lib.rs --- crates/string-offsets/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index ac81552..5aba9f1 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -385,7 +385,7 @@ fn new_converter(content: &[u8]) -> StringOffsets { /// Returns 0 if the byte is not a valid first byte of a UTF-8 char. fn utf8_width(c: u8) -> usize { // Every nibble represents the utf8 length given the first 4 bits of a utf8 encoded byte. - const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111 ; + const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111; ((UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf) as usize } From a31920e7de36b76d2c49151eb86e52388ce98474 Mon Sep 17 00:00:00 2001 From: Greg Orzell Date: Mon, 10 Mar 2025 09:52:02 +0100 Subject: [PATCH 012/114] Only run CI on push for `main` and release tags. --- .github/workflows/ci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d65b8ac..983f80e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,6 +2,8 @@ name: CI on: push: + branches: [ main ] + tags: [ *-v*.*.* ] pull_request: workflow_dispatch: From 76b864f376a91234503df166814346554c3b6504 Mon Sep 17 00:00:00 2001 From: Greg Orzell Date: Mon, 10 Mar 2025 09:58:20 +0100 Subject: [PATCH 013/114] Allow all tags on push. --- .github/workflows/ci.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 983f80e..cbe489c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -3,7 +3,6 @@ name: CI on: push: branches: [ main ] - tags: [ *-v*.*.* ] pull_request: workflow_dispatch: From a801247f949feb23f0c481aa35cc273698b9e381 Mon Sep 17 00:00:00 2001 From: Greg Orzell Date: Mon, 10 Mar 2025 10:54:13 +0100 Subject: [PATCH 014/114] Fix API breaking changes. --- crates/bpe/src/byte_pair_encoding.rs | 16 ++++++++-------- crates/bpe/tests/src/lib.rs | 6 +++--- crates/geo_filters/Cargo.toml | 2 +- crates/geo_filters/src/config.rs | 2 +- crates/geo_filters/src/config/lookup.rs | 2 +- crates/geo_filters/src/diff_count.rs | 6 +++--- crates/geo_filters/src/distinct_count.rs | 4 ++-- crates/geo_filters/src/evaluation/simulation.rs | 2 +- crates/string-offsets/Cargo.toml | 2 +- crates/string-offsets/src/bitrank.rs | 8 ++++---- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/crates/bpe/src/byte_pair_encoding.rs b/crates/bpe/src/byte_pair_encoding.rs index 9c5a014..495e6ad 100644 --- a/crates/bpe/src/byte_pair_encoding.rs +++ b/crates/bpe/src/byte_pair_encoding.rs @@ -171,9 +171,9 @@ pub fn find_hash_factor_for_dictionary(tokens: impl IntoIterator> use rand::Rng; let all_tokens = tokens.into_iter().collect_vec(); - let mut rnd = rand::thread_rng(); + let mut rnd = rand::rng(); loop { - let factor: u64 = rnd.gen(); + let factor: u64 = rnd.random(); let mut seen = HashSet::new(); if all_tokens .iter() @@ -568,7 +568,7 @@ pub fn create_test_string_with_predicate( min_bytes: usize, predicate: impl Fn(&str) -> bool, ) -> String { - use rand::{thread_rng, Rng}; + use rand::{rng, Rng}; // the string we accumulated thus far let mut result = String::new(); // the tokens we added so we can backtrack @@ -577,7 +577,7 @@ pub fn create_test_string_with_predicate( // try a few times to find a suitable token 'next: for _ in 0..8 { // pick a random token and provisionally add it - let i = thread_rng().gen_range(0..bpe.num_tokens()) as u32; + let i = rng().random_range(0..bpe.num_tokens()) as u32; // We only use tokens that are valid UTF-8. This is true for ~99% of tokens in OpenAI's // token set. The chance of constructing a valid UTF-8 character across a token boundary // by picking random tokens is so small that it is unlikely to happen anyway. @@ -603,8 +603,8 @@ pub fn create_test_string_with_predicate( #[cfg(feature = "rand")] pub fn select_test_string(text: &str, min_bytes: usize) -> &str { - use rand::{thread_rng, Rng}; - let mut start = thread_rng().gen_range(0..text.len() - min_bytes); + use rand::{rng, Rng}; + let mut start = rng().random_range(0..text.len() - min_bytes); while !text.is_char_boundary(start) { start -= 1; } @@ -618,10 +618,10 @@ pub fn select_test_string(text: &str, min_bytes: usize) -> &str { /// Generate test bytes by concatenating random tokens. #[cfg(feature = "rand")] pub fn create_test_bytes(bpe: &BytePairEncoding, min_bytes: usize) -> Vec { - use rand::{thread_rng, Rng}; + use rand::{rng, Rng}; let mut result = Vec::new(); while result.len() < min_bytes { - let i = thread_rng().gen_range(0..bpe.num_tokens()); + let i = rng().random_range(0..bpe.num_tokens()); result.extend(bpe.token_bytes(i as u32)); } result diff --git a/crates/bpe/tests/src/lib.rs b/crates/bpe/tests/src/lib.rs index eccb548..9c85b4a 100644 --- a/crates/bpe/tests/src/lib.rs +++ b/crates/bpe/tests/src/lib.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod tests { use itertools::Itertools; - use rand::{thread_rng, Rng}; + use rand::{rng, Rng}; use tiktoken_rs::cl100k_base_singleton; use bpe::appendable_encoder::AppendableEncoder; @@ -122,8 +122,8 @@ mod tests { let input = create_test_bytes(bpe, 10000); let intervals = IntervalEncoding::new(bpe, &input); for _ in 0..1000 { - let start = thread_rng().gen_range(0..input.len()); - let end = thread_rng().gen_range(0..input.len()); + let start = rng().random_range(0..input.len()); + let end = rng().random_range(0..input.len()); let range = start.min(end)..start.max(end); assert_eq!( intervals.count(range.clone()), diff --git a/crates/geo_filters/Cargo.toml b/crates/geo_filters/Cargo.toml index fa0f5ef..b8a71e4 100644 --- a/crates/geo_filters/Cargo.toml +++ b/crates/geo_filters/Cargo.toml @@ -36,7 +36,7 @@ regex = { version = "1", optional = true } criterion = "0.5" geo_filters = { path = ".", features = ["evaluation"] } rand = "0.9" -rand_chacha = "0.3" +rand_chacha = "0.9" rayon = "1.7" [[bench]] diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index b0e63bf..e22d6df 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -312,7 +312,7 @@ pub(crate) mod tests { /// Runs estimation trials and returns the average precision and variance. pub(crate) fn test_estimate>(f: impl Fn() -> C) -> (f32, f32) { - let mut rnd = rand::rngs::StdRng::from_entropy(); + let mut rnd = rand::rngs::StdRng::from_os_rng(); let cnt = 10000usize; let mut avg_precision = 0.0; let mut avg_var = 0.0; diff --git a/crates/geo_filters/src/config/lookup.rs b/crates/geo_filters/src/config/lookup.rs index 637e7ac..1e73757 100644 --- a/crates/geo_filters/src/config/lookup.rs +++ b/crates/geo_filters/src/config/lookup.rs @@ -67,7 +67,7 @@ mod tests { let phi = phi_f64(B); let buckets = HashToBucketLookup::new(B); let mut var = 0.0; - let mut rnd = rand::rngs::StdRng::from_entropy(); + let mut rnd = rand::rngs::StdRng::from_os_rng(); for _ in 0..n { let hash = rnd.next_u64(); let estimate = buckets.lookup(hash) as f64; diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 2f1ccb2..0c46263 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -446,7 +446,7 @@ mod tests { #[test] fn test_estimate_diff_size_fast() { - let mut rnd = rand::rngs::StdRng::from_entropy(); + let mut rnd = rand::rngs::StdRng::from_os_rng(); let mut a_p = GeoDiffCount7_50::default(); let mut a_hp = GeoDiffCount7::default(); let mut b_p = GeoDiffCount7_50::default(); @@ -500,7 +500,7 @@ mod tests { #[test] fn test_xor_plus_mask() { - let mut rnd = rand::rngs::StdRng::from_entropy(); + let mut rnd = rand::rngs::StdRng::from_os_rng(); let mask_size = 12; let mask = 0b100001100000; let mut a = GeoDiffCount7::default(); @@ -527,7 +527,7 @@ mod tests { #[test] fn test_bit_chunks() { - let mut rnd = rand::rngs::StdRng::from_entropy(); + let mut rnd = rand::rngs::StdRng::from_os_rng(); for _ in 0..100 { let mut expected = GeoDiffCount7::default(); for _ in 0..1000 { diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index ccd8bc8..6795cb8 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -307,7 +307,7 @@ mod tests { #[test] fn test_estimate_union_size_fast() { - let mut rnd = rand::rngs::StdRng::from_entropy(); + let mut rnd = rand::rngs::StdRng::from_os_rng(); let mut a = GeoDistinctCount7::default(); let mut b = GeoDistinctCount7::default(); for _ in 0..10000 { @@ -374,7 +374,7 @@ mod tests { #[test] fn test_bit_chunks() { - let mut rnd = rand::rngs::StdRng::from_entropy(); + let mut rnd = rand::rngs::StdRng::from_os_rng(); for _ in 0..100 { let mut expected = GeoDistinctCount7::default(); for _ in 0..1000 { diff --git a/crates/geo_filters/src/evaluation/simulation.rs b/crates/geo_filters/src/evaluation/simulation.rs index 9d3a131..ef736fd 100644 --- a/crates/geo_filters/src/evaluation/simulation.rs +++ b/crates/geo_filters/src/evaluation/simulation.rs @@ -181,7 +181,7 @@ pub fn simulate Box + Send + Sync>( .map(|_| { let mut t = f(); let mut last_set_size = 0; - let mut rnd = rand::rngs::StdRng::from_entropy(); + let mut rnd = rand::rngs::StdRng::from_os_rng(); set_sizes .iter() .map(move |set_size| { diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index 76676c6..7077a69 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -11,4 +11,4 @@ categories = ["algorithms", "data-structures", "text-processing", "development-t [dev-dependencies] rand = "0.9" -rand_chacha = "0.3" +rand_chacha = "0.9" diff --git a/crates/string-offsets/src/bitrank.rs b/crates/string-offsets/src/bitrank.rs index 6524769..e35ff7d 100644 --- a/crates/string-offsets/src/bitrank.rs +++ b/crates/string-offsets/src/bitrank.rs @@ -214,12 +214,12 @@ impl BitRank { #[cfg(test)] mod tests { - use rand::distributions::Uniform; + use super::*; + use rand::distr::Uniform; use rand::prelude::*; + use rand_chacha::rand_core::SeedableRng; use rand_chacha::ChaCha8Rng; - use super::*; - /// Creates a `BitRank` containing the integers in `iter` (which should be strictly /// increasing). pub fn bitrank>(iter: I) -> BitRank { @@ -304,7 +304,7 @@ mod tests { #[test] fn test_rank_large_random() { let mut rng = ChaCha8Rng::seed_from_u64(2); - let uniform = Uniform::::from(0..1_000_000); + let uniform = Uniform::new(0, 1_000_000).unwrap(); let mut random_bits = Vec::with_capacity(100_000); for _ in 0..100_000 { random_bits.push(uniform.sample(&mut rng)); From 46d43d0871411f4e537cacc849c41541558e73fb Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 13 Mar 2025 11:21:12 -0700 Subject: [PATCH 015/114] Add wasm+npm package This lets us compile the lib into wasm and adds a npm wrapper package for it I had to rearrange the code slightly to split out any methods using wasm incompatible types. Not sure if there's a better way to do this --- .gitignore | 1 + crates/string-offsets/.gitignore | 3 + crates/string-offsets/Cargo.toml | 8 +- crates/string-offsets/js/package-lock.json | 3870 ++++++++++++++++++++ crates/string-offsets/js/package.json | 31 + crates/string-offsets/js/test/test.js | 24 + crates/string-offsets/src/lib.rs | 97 +- 7 files changed, 3989 insertions(+), 45 deletions(-) create mode 100644 crates/string-offsets/.gitignore create mode 100644 crates/string-offsets/js/package-lock.json create mode 100644 crates/string-offsets/js/package.json create mode 100644 crates/string-offsets/js/test/test.js diff --git a/.gitignore b/.gitignore index 0654041..4bb94c0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ Cargo.lock /crates/*/target/ /crates/*/Cargo.lock .vscode/ +.DS_Store diff --git a/crates/string-offsets/.gitignore b/crates/string-offsets/.gitignore new file mode 100644 index 0000000..9f5756d --- /dev/null +++ b/crates/string-offsets/.gitignore @@ -0,0 +1,3 @@ +node_modules +pkg + diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index fd9b838..92146bd 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -9,6 +9,12 @@ license = "MIT" keywords = ["unicode", "positions", "utf16", "characters", "lines"] categories = ["algorithms", "data-structures", "text-processing", "development-tools::ffi"] +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +wasm-bindgen = "0.2" + [dev-dependencies] rand = "0.8" -rand_chacha = "0.3" +rand_chacha = "0.3" \ No newline at end of file diff --git a/crates/string-offsets/js/package-lock.json b/crates/string-offsets/js/package-lock.json new file mode 100644 index 0000000..3332873 --- /dev/null +++ b/crates/string-offsets/js/package-lock.json @@ -0,0 +1,3870 @@ +{ + "name": "string-offsets-dev", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "string-offsets-dev", + "version": "0.1.0", + "license": "MIT", + "devDependencies": { + "@types/jest": "^29.5.14", + "jest": "^29.0.0", + "wasm-pack": "^0.13.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.10" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-install": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/binary-install/-/binary-install-1.1.0.tgz", + "integrity": "sha512-rkwNGW+3aQVSZoD0/o3mfPN6Yxh3Id0R/xzTVBVVpGNlVz8EGwusksxRlbk/A5iKTZt9zkMn3qIqmAt3vpfbzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^0.26.1", + "rimraf": "^3.0.2", + "tar": "^6.1.11" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001704", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001704.tgz", + "integrity": "sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.116", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.116.tgz", + "integrity": "sha512-mufxTCJzLBQVvSdZzX1s5YAuXsN1M4tTyYxOOL1TcSKtIzQ9rjIrm7yFK80rN5dwGTePgdoABDSHpuVtRQh0Zw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/wasm-pack": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/wasm-pack/-/wasm-pack-0.13.1.tgz", + "integrity": "sha512-P9exD4YkjpDbw68xUhF3MDm/CC/3eTmmthyG5bHJ56kalxOTewOunxTke4SyF8MTXV6jUtNjXggPgrGmMtczGg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "binary-install": "^1.0.1" + }, + "bin": { + "wasm-pack": "run.js" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/crates/string-offsets/js/package.json b/crates/string-offsets/js/package.json new file mode 100644 index 0000000..c06fb8a --- /dev/null +++ b/crates/string-offsets/js/package.json @@ -0,0 +1,31 @@ +{ + "name": "string-offsets-dev", + "private": true, + "version": "0.1.0", + "description": "String offset conversions between UTF-8, UTF-16, and lines", + "main": "pkg/string_offsets_js.js", + "types": "pkg/string_offsets_js.d.ts", + "files": [ + "./pkg/string_offsets_js_bg.wasm", + "./pkg/string_offsets_js.d.ts", + "./pkg/string_offsets_js.js" + ], + "scripts": { + "build": "wasm-pack build --target nodejs --out-dir js/pkg", + "test": "jest" + }, + "keywords": [ + "string", + "utf8", + "utf16", + "wasm", + "rust" + ], + "author": "", + "license": "MIT", + "devDependencies": { + "@types/jest": "^29.5.14", + "jest": "^29.0.0", + "wasm-pack": "^0.13.1" + } +} diff --git a/crates/string-offsets/js/test/test.js b/crates/string-offsets/js/test/test.js new file mode 100644 index 0000000..ffa9671 --- /dev/null +++ b/crates/string-offsets/js/test/test.js @@ -0,0 +1,24 @@ +//@ts-check +const { StringOffsets } = require('../pkg/string_offsets.js'); + +describe('StringOffsets sanity checks', () => { + test('basic ASCII text', () => { + const text = "hello\nworld"; + const offsets = new StringOffsets(text); + + expect(offsets.lines()).toBe(2); + expect(offsets.utf8_to_utf16(0)).toBe(0); + expect(offsets.utf8_to_line(0)).toBe(0); + }); + + test('Unicode text', () => { + const text = "☀️hello\n🗺️world"; + const offsets = new StringOffsets(text); + + expect(offsets.lines()).toBe(2); + // ☀️ is 6 UTF-8 bytes and 3 UTF-16 code units + expect(offsets.utf8_to_utf16(6)).toBe(2); + // expect(offsets.utf16ToUtf8(3)).toBe(6); + expect(offsets.utf8_to_utf16(0)).toBe(0); + }); +}); diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index ee05e54..c23ca9a 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -30,6 +30,8 @@ mod bitrank; use bitrank::{BitRank, BitRankBuilder}; +use wasm_bindgen::prelude::*; + /// Converts positions within a given string between UTF-8 byte offsets (the usual in Rust), UTF-16 /// code units, Unicode code points, and line numbers. /// @@ -84,6 +86,7 @@ use bitrank::{BitRank, BitRankBuilder}; /// Most operations run in O(1) time. A few require O(log n) time. The memory consumed by this /// data structure is typically less than the memory occupied by the actual content. In the best /// case, it requires ~45% of the content space. +#[wasm_bindgen] pub struct StringOffsets { /// Vector storing, for every line, the byte position at which the line starts. line_begins: Vec, @@ -105,6 +108,7 @@ pub struct StringOffsets { } /// A position in a string, specified by line and column number. +#[wasm_bindgen] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Pos { /// Zero-indexed line number. @@ -132,8 +136,10 @@ pub struct Pos { // Question: Consider whether we should return an empty line range in this case which would // probably be consistent from a mathematical point of view. But then we should also return empty // line ranges for empty character ranges in the middle of a line... +#[wasm_bindgen] impl StringOffsets { /// Create a new converter to work with offsets into the given string. + #[wasm_bindgen(constructor)] pub fn new(content: &str) -> Self { new_converter(content.as_bytes()) } @@ -142,6 +148,7 @@ impl StringOffsets { /// /// If `content` is UTF-8, this is just like [`StringOffsets::new`]. Otherwise, the /// conversion methods will produce unspecified (but memory-safe) results. + #[wasm_bindgen(static_method_of = StringOffsets)] pub fn from_bytes(content: &[u8]) -> Self { new_converter(content) } @@ -204,26 +211,6 @@ impl StringOffsets { self.utf8_to_char(self.line_to_utf8_end(line_number)) } - /// UTF-8 offset one past the end of a line (the offset of the start of the next line). - pub fn line_to_utf8s(&self, line_number: usize) -> Range { - self.line_to_utf8_begin(line_number)..self.line_to_utf8_end(line_number) - } - - /// UTF-32 offsets for the beginning and end of a line, including the newline if any. - pub fn line_to_chars(&self, line_number: usize) -> Range { - self.utf8s_to_chars(self.line_to_utf8s(line_number)) - } - - /// UTF-8 offsets for the beginning and end of a range of lines, including the newline if any. - pub fn lines_to_utf8s(&self, line_numbers: Range) -> Range { - self.line_to_utf8_begin(line_numbers.start)..self.line_to_utf8_begin(line_numbers.end) - } - - /// UTF-32 offsets for the beginning and end of a range of lines, including the newline if any. - pub fn lines_to_chars(&self, line_numbers: Range) -> Range { - self.utf8s_to_chars(self.lines_to_utf8s(line_numbers)) - } - /// Return the zero-based line number of the line containing the specified UTF-8 offset. /// Newline characters count as part of the preceding line. pub fn utf8_to_line(&self, byte_number: usize) -> usize { @@ -254,28 +241,6 @@ impl StringOffsets { } } - /// Returns the range of line numbers containing the substring specified by the Rust-style - /// range `bytes`. Newline characters count as part of the preceding line. - /// - /// If `bytes` is an empty range at a position within or at the beginning of a line, this - /// returns a nonempty range containing the line number of that one line. An empty range at or - /// beyond the end of the string translates to an empty range of line numbers. - pub fn utf8s_to_lines(&self, bytes: Range) -> Range { - // The fiddly parts of this formula are necessary because `bytes.start` rounds down to the - // beginning of the line, but `bytes.end` "rounds up" to the end of the line. the final - // `+1` is to produce a half-open range. - self.utf8_to_line(bytes.start) - ..self - .lines() - .min(self.utf8_to_line(bytes.end.saturating_sub(1).max(bytes.start)) + 1) - } - - /// Returns the range of line numbers containing the substring specified by the UTF-32 - /// range `chars`. Newline characters count as part of the preceding line. - pub fn chars_to_lines(&self, chars: Range) -> Range { - self.utf8s_to_lines(self.chars_to_utf8s(chars)) - } - /// Converts a UTF-8 offset to a UTF-32 offset. pub fn utf8_to_char(&self, byte_number: usize) -> usize { self.utf8_to_char.rank(byte_number) @@ -318,6 +283,50 @@ impl StringOffsets { assert!(byte_number < limit); } } +} + +impl StringOffsets { + /// UTF-8 offset one past the end of a line (the offset of the start of the next line). + pub fn line_to_utf8s(&self, line_number: usize) -> Range { + self.line_to_utf8_begin(line_number)..self.line_to_utf8_end(line_number) + } + + /// UTF-32 offsets for the beginning and end of a line, including the newline if any. + pub fn line_to_chars(&self, line_number: usize) -> Range { + self.utf8s_to_chars(self.line_to_utf8s(line_number)) + } + + /// UTF-8 offsets for the beginning and end of a range of lines, including the newline if any. + pub fn lines_to_utf8s(&self, line_numbers: Range) -> Range { + self.line_to_utf8_begin(line_numbers.start)..self.line_to_utf8_begin(line_numbers.end) + } + + /// UTF-32 offsets for the beginning and end of a range of lines, including the newline if any. + pub fn lines_to_chars(&self, line_numbers: Range) -> Range { + self.utf8s_to_chars(self.lines_to_utf8s(line_numbers)) + } + + /// Returns the range of line numbers containing the substring specified by the Rust-style + /// range `bytes`. Newline characters count as part of the preceding line. + /// + /// If `bytes` is an empty range at a position within or at the beginning of a line, this + /// returns a nonempty range containing the line number of that one line. An empty range at or + /// beyond the end of the string translates to an empty range of line numbers. + pub fn utf8s_to_lines(&self, bytes: Range) -> Range { + // The fiddly parts of this formula are necessary because `bytes.start` rounds down to the + // beginning of the line, but `bytes.end` "rounds up" to the end of the line. the final + // `+1` is to produce a half-open range. + self.utf8_to_line(bytes.start) + ..self + .lines() + .min(self.utf8_to_line(bytes.end.saturating_sub(1).max(bytes.start)) + 1) + } + + /// Returns the range of line numbers containing the substring specified by the UTF-32 + /// range `chars`. Newline characters count as part of the preceding line. + pub fn chars_to_lines(&self, chars: Range) -> Range { + self.utf8s_to_lines(self.chars_to_utf8s(chars)) + } /// Converts a UTF-8 offset range to a UTF-32 offset range. pub fn utf8s_to_chars(&self, bytes: Range) -> Range { @@ -385,8 +394,8 @@ fn new_converter(content: &[u8]) -> StringOffsets { /// Returns 0 if the byte is not a valid first byte of a UTF-8 char. fn utf8_width(c: u8) -> usize { // Every nibble represents the utf8 length given the first 4 bits of a utf8 encoded byte. - const UTF8_WIDTH: usize = 0x4322_0000_1111_1111; - (UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf + const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111; + ((UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf).try_into().unwrap() } fn utf8_to_utf16_width(content: &[u8]) -> usize { From 0dd10894d7ff6a4d5f15dd46c2b1006d2ff56e94 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 13 Mar 2025 11:26:38 -0700 Subject: [PATCH 016/114] Add into on building js --- crates/string-offsets/CONTRIBUTING.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 crates/string-offsets/CONTRIBUTING.md diff --git a/crates/string-offsets/CONTRIBUTING.md b/crates/string-offsets/CONTRIBUTING.md new file mode 100644 index 0000000..e78cc66 --- /dev/null +++ b/crates/string-offsets/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Contributing + +## Building the WASM/JS package + +The code for the wasm + js wrapper package is stored in the `js` directory. To build it: + +```sh +cd js +npm i +npm run build +``` + +The npm package will be output to `js/pkg`. + +To run a quick sanity check of the JS package: + +```sh +npm test +``` + +To publish the package to npm, run: + +```sh +cd js/pkg +npm publish +``` From b23a9e2daa7397c6f1edd108220ad43c8aff1a54 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 13 Mar 2025 13:30:55 -0700 Subject: [PATCH 017/114] Add other exports --- crates/string-offsets/.gitignore | 2 +- crates/string-offsets/CONTRIBUTING.md | 6 ++--- crates/string-offsets/Cargo.toml | 3 ++- crates/string-offsets/js/.npmignore | 4 ++++ crates/string-offsets/js/package.json | 33 +++++++++++++++------------ crates/string-offsets/js/test/test.js | 4 ++-- 6 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 crates/string-offsets/js/.npmignore diff --git a/crates/string-offsets/.gitignore b/crates/string-offsets/.gitignore index 9f5756d..4a7a4cd 100644 --- a/crates/string-offsets/.gitignore +++ b/crates/string-offsets/.gitignore @@ -1,3 +1,3 @@ node_modules pkg - +.tgz \ No newline at end of file diff --git a/crates/string-offsets/CONTRIBUTING.md b/crates/string-offsets/CONTRIBUTING.md index e78cc66..c47c511 100644 --- a/crates/string-offsets/CONTRIBUTING.md +++ b/crates/string-offsets/CONTRIBUTING.md @@ -7,10 +7,10 @@ The code for the wasm + js wrapper package is stored in the `js` directory. To b ```sh cd js npm i -npm run build +npm run compile ``` -The npm package will be output to `js/pkg`. +The js code will be output to `js/pkg`. To run a quick sanity check of the JS package: @@ -21,6 +21,6 @@ npm test To publish the package to npm, run: ```sh -cd js/pkg +cd js npm publish ``` diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index 12af628..d00b2b8 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -8,11 +8,12 @@ repository = "https://github.com/github/rust-gems" license = "MIT" keywords = ["unicode", "positions", "utf16", "characters", "lines"] categories = ["algorithms", "data-structures", "text-processing", "development-tools::ffi"] +exclude = ["/js"] [lib] crate-type = ["cdylib", "rlib"] -[dependencies] +[target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2" [dev-dependencies] diff --git a/crates/string-offsets/js/.npmignore b/crates/string-offsets/js/.npmignore new file mode 100644 index 0000000..51eac1b --- /dev/null +++ b/crates/string-offsets/js/.npmignore @@ -0,0 +1,4 @@ +/* +!/pkg +pkg/*/package.json +pkg/*/README.md \ No newline at end of file diff --git a/crates/string-offsets/js/package.json b/crates/string-offsets/js/package.json index c06fb8a..902f919 100644 --- a/crates/string-offsets/js/package.json +++ b/crates/string-offsets/js/package.json @@ -1,19 +1,9 @@ { "name": "string-offsets-dev", - "private": true, "version": "0.1.0", + "author": "The blackbird team ", + "license": "MIT", "description": "String offset conversions between UTF-8, UTF-16, and lines", - "main": "pkg/string_offsets_js.js", - "types": "pkg/string_offsets_js.d.ts", - "files": [ - "./pkg/string_offsets_js_bg.wasm", - "./pkg/string_offsets_js.d.ts", - "./pkg/string_offsets_js.js" - ], - "scripts": { - "build": "wasm-pack build --target nodejs --out-dir js/pkg", - "test": "jest" - }, "keywords": [ "string", "utf8", @@ -21,11 +11,24 @@ "wasm", "rust" ], - "author": "", - "license": "MIT", + "main": "pkg/nodejs/string_offsets.js", + "types": "pkg/nodejs/string_offsets.d.ts", + "exports": { + "bundler": "./pkg/bundler/string_offsets.js", + "node": "./pkg/nodejs/string_offsets.js", + "import": "./pkg/web/string_offsets.js", + "require": "./pkg/nodejs/string_offsets.js" + }, + "scripts": { + "compile:bundler": "wasm-pack build --target bundler -d js/pkg/bundler && node -e \"fs.unlinkSync('./pkg/bundler/.gitignore')\"", + "compile:web": "wasm-pack build --target web -d js/pkg/web && node -e \"fs.unlinkSync('./pkg/web/.gitignore')\"", + "compile:nodejs": "wasm-pack build --target nodejs -d js/pkg/nodejs && node -e \"fs.unlinkSync('./pkg/nodejs/.gitignore')\"", + "compile": "npm run compile:web && npm run compile:bundler && npm run compile:nodejs", + "test": "jest" + }, "devDependencies": { "@types/jest": "^29.5.14", "jest": "^29.0.0", "wasm-pack": "^0.13.1" } -} +} \ No newline at end of file diff --git a/crates/string-offsets/js/test/test.js b/crates/string-offsets/js/test/test.js index ffa9671..b624554 100644 --- a/crates/string-offsets/js/test/test.js +++ b/crates/string-offsets/js/test/test.js @@ -1,6 +1,6 @@ //@ts-check -const { StringOffsets } = require('../pkg/string_offsets.js'); - +const { StringOffsets } = require('../'); + describe('StringOffsets sanity checks', () => { test('basic ASCII text', () => { const text = "hello\nworld"; From d01e2d3d20e979ac0101003b6c806f2978f37fa9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 13 Mar 2025 13:38:18 -0700 Subject: [PATCH 018/114] Fix rust compile --- crates/string-offsets/Cargo.toml | 2 +- crates/string-offsets/js/test/test.js | 1 - crates/string-offsets/src/lib.rs | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index d00b2b8..006cc68 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -13,7 +13,7 @@ exclude = ["/js"] [lib] crate-type = ["cdylib", "rlib"] -[target.'cfg(target_arch = "wasm32")'.dependencies] +[dependencies] wasm-bindgen = "0.2" [dev-dependencies] diff --git a/crates/string-offsets/js/test/test.js b/crates/string-offsets/js/test/test.js index b624554..553b7d0 100644 --- a/crates/string-offsets/js/test/test.js +++ b/crates/string-offsets/js/test/test.js @@ -18,7 +18,6 @@ describe('StringOffsets sanity checks', () => { expect(offsets.lines()).toBe(2); // ☀️ is 6 UTF-8 bytes and 3 UTF-16 code units expect(offsets.utf8_to_utf16(6)).toBe(2); - // expect(offsets.utf16ToUtf8(3)).toBe(6); expect(offsets.utf8_to_utf16(0)).toBe(0); }); }); diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index cb848f6..543022c 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -148,6 +148,7 @@ impl StringOffsets { /// /// If `content` is UTF-8, this is just like [`StringOffsets::new`]. Otherwise, the /// conversion methods will produce unspecified (but memory-safe) results. + #[allow(unused_variables)] #[wasm_bindgen(static_method_of = StringOffsets)] pub fn from_bytes(content: &[u8]) -> Self { new_converter(content) From c4b9c9f94d35da8362b8697dded28abe3f42a370 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 13 Mar 2025 16:24:33 -0700 Subject: [PATCH 019/114] Use better js names and add ending newlines --- crates/string-offsets/.gitignore | 2 +- crates/string-offsets/Cargo.toml | 2 +- crates/string-offsets/js/.npmignore | 2 +- crates/string-offsets/js/package-lock.json | 2 +- crates/string-offsets/js/package.json | 2 +- crates/string-offsets/js/test/test.js | 10 +++++----- crates/string-offsets/src/lib.rs | 15 +++++++++++++++ 7 files changed, 25 insertions(+), 10 deletions(-) diff --git a/crates/string-offsets/.gitignore b/crates/string-offsets/.gitignore index 4a7a4cd..8727140 100644 --- a/crates/string-offsets/.gitignore +++ b/crates/string-offsets/.gitignore @@ -1,3 +1,3 @@ node_modules pkg -.tgz \ No newline at end of file +.tgz diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index 006cc68..1baeb2b 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -18,4 +18,4 @@ wasm-bindgen = "0.2" [dev-dependencies] rand = "0.9" -rand_chacha = "0.9" \ No newline at end of file +rand_chacha = "0.9" diff --git a/crates/string-offsets/js/.npmignore b/crates/string-offsets/js/.npmignore index 51eac1b..419b728 100644 --- a/crates/string-offsets/js/.npmignore +++ b/crates/string-offsets/js/.npmignore @@ -1,4 +1,4 @@ /* !/pkg pkg/*/package.json -pkg/*/README.md \ No newline at end of file +pkg/*/README.md diff --git a/crates/string-offsets/js/package-lock.json b/crates/string-offsets/js/package-lock.json index 3332873..1e35cd9 100644 --- a/crates/string-offsets/js/package-lock.json +++ b/crates/string-offsets/js/package-lock.json @@ -3867,4 +3867,4 @@ } } } -} +} \ No newline at end of file diff --git a/crates/string-offsets/js/package.json b/crates/string-offsets/js/package.json index 902f919..8e26d6d 100644 --- a/crates/string-offsets/js/package.json +++ b/crates/string-offsets/js/package.json @@ -31,4 +31,4 @@ "jest": "^29.0.0", "wasm-pack": "^0.13.1" } -} \ No newline at end of file +} diff --git a/crates/string-offsets/js/test/test.js b/crates/string-offsets/js/test/test.js index 553b7d0..bb66ed8 100644 --- a/crates/string-offsets/js/test/test.js +++ b/crates/string-offsets/js/test/test.js @@ -1,14 +1,14 @@ //@ts-check const { StringOffsets } = require('../'); - + describe('StringOffsets sanity checks', () => { test('basic ASCII text', () => { const text = "hello\nworld"; const offsets = new StringOffsets(text); expect(offsets.lines()).toBe(2); - expect(offsets.utf8_to_utf16(0)).toBe(0); - expect(offsets.utf8_to_line(0)).toBe(0); + expect(offsets.utf8ToUtf16(0)).toBe(0); + expect(offsets.utf8ToLine(0)).toBe(0); }); test('Unicode text', () => { @@ -17,7 +17,7 @@ describe('StringOffsets sanity checks', () => { expect(offsets.lines()).toBe(2); // ☀️ is 6 UTF-8 bytes and 3 UTF-16 code units - expect(offsets.utf8_to_utf16(6)).toBe(2); - expect(offsets.utf8_to_utf16(0)).toBe(0); + expect(offsets.utf8ToUtf16(6)).toBe(2); + expect(offsets.utf8ToUtf16(0)).toBe(0); }); }); diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 543022c..6891d09 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -155,17 +155,20 @@ impl StringOffsets { } /// Returns the number of Unicode characters on the specified line. + #[wasm_bindgen(js_name = lineChars)] pub fn line_chars(&self, line_number: usize) -> usize { let r = self.utf8s_to_chars(self.line_to_utf8s(line_number)); r.end - r.start } /// Returns the number of lines in the string. + #[wasm_bindgen(js_name = lines)] pub fn lines(&self) -> usize { self.line_begins.len() - 1 } /// Returns true if the specified line is empty except for whitespace. + #[wasm_bindgen(js_name = onlyWhitespaces)] pub fn only_whitespaces(&self, line_number: usize) -> bool { self.whitespace_only .get(line_number) @@ -177,6 +180,7 @@ impl StringOffsets { /// /// If `line_number` is greater than or equal to the number of lines in the text, this returns /// the length of the string. + #[wasm_bindgen(js_name = lineToUtf8Begin)] pub fn line_to_utf8_begin(&self, line_number: usize) -> usize { self.line_begins[line_number.min(self.lines())] as usize } @@ -185,6 +189,7 @@ impl StringOffsets { /// /// That is, return the offset that would point to the start of that line in a UTF-16 /// representation of the source string. + #[wasm_bindgen(js_name = lineToUtf16Begin)] pub fn line_to_utf16_begin(&self, line_number: usize) -> usize { self.utf8_to_utf16(self.line_to_utf8_begin(line_number)) } @@ -193,33 +198,39 @@ impl StringOffsets { /// /// That is, return the offset that would point to the start of that line in a UTF-32 /// representation of the source string. + #[wasm_bindgen(js_name = lineToCharBegin)] pub fn line_to_char_begin(&self, line_number: usize) -> usize { self.utf8_to_char(self.line_to_utf8_begin(line_number)) } /// UTF-8 offset of the first character of a line. + #[wasm_bindgen(js_name = lineToUtf8End)] pub fn line_to_utf8_end(&self, line_number: usize) -> usize { self.line_to_utf8_begin(line_number + 1) } /// UTF-16 offset one past the end of a line (the offset of the start of the next line). + #[wasm_bindgen(js_name = lineToUtf16End)] pub fn line_to_utf16_end(&self, line_number: usize) -> usize { self.utf8_to_utf16(self.line_to_utf8_end(line_number)) } /// UTF-32 offset one past the end of a line (the offset of the start of the next line). + #[wasm_bindgen(js_name = lineToCharEnd)] pub fn line_to_char_end(&self, line_number: usize) -> usize { self.utf8_to_char(self.line_to_utf8_end(line_number)) } /// Return the zero-based line number of the line containing the specified UTF-8 offset. /// Newline characters count as part of the preceding line. + #[wasm_bindgen(js_name = utf8ToLine)] pub fn utf8_to_line(&self, byte_number: usize) -> usize { self.utf8_to_line.rank(byte_number) } /// Converts a UTF-8 offset to a zero-based line number and UTF-32 offset within the /// line. + #[wasm_bindgen(js_name = utf8ToCharPos)] pub fn utf8_to_char_pos(&self, byte_number: usize) -> Pos { let line = self.utf8_to_line(byte_number); let line_start_char_number = self.line_to_char_begin(line); @@ -232,6 +243,7 @@ impl StringOffsets { /// Converts a UTF-8 offset to a zero-based line number and UTF-16 offset within the /// line. + #[wasm_bindgen(js_name = utf8ToUtf16Pos)] pub fn utf8_to_utf16_pos(&self, byte_number: usize) -> Pos { let line = self.utf8_to_line(byte_number); let line_start_char_number = self.line_to_utf16_begin(line); @@ -243,16 +255,19 @@ impl StringOffsets { } /// Converts a UTF-8 offset to a UTF-32 offset. + #[wasm_bindgen(js_name = utf8ToChar)] pub fn utf8_to_char(&self, byte_number: usize) -> usize { self.utf8_to_char.rank(byte_number) } /// Converts a UTF-8 offset to a UTF-16 offset. + #[wasm_bindgen(js_name = utf8ToUtf16)] pub fn utf8_to_utf16(&self, byte_number: usize) -> usize { self.utf8_to_utf16.rank(byte_number) } /// Converts a UTF-32 offset to a UTF-8 offset. + #[wasm_bindgen(js_name = charToUtf8)] pub fn char_to_utf8(&self, char_number: usize) -> usize { let mut byte_number = char_number; for _ in 0..128 { From 36485ad307d7ce5e60f35aef36092232c3509eea Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 14 Mar 2025 15:46:14 -0700 Subject: [PATCH 020/114] Add make command and run on ci --- .github/workflows/ci.yaml | 3 +++ Makefile | 6 +++++- crates/string-offsets/js/package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cbe489c..8b11f46 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,6 +28,9 @@ jobs: - name: Build run: make build + - name: Build JS + run: make build-js + lint: name: Lint runs-on: ubuntu-latest diff --git a/Makefile b/Makefile index 862425b..c404bf3 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ .PHONY: all -all: build lint test +all: build build-js lint test .PHONY: clean clean: @@ -22,6 +22,10 @@ build: # Use --all-targets to ensure that all of the benchmarks compile. cargo build --all-targets --all-features +.PHONY: build-js +build-js: + npm --prefix crates/string-offsets/js run compile + .PHONY: test test: RUST_BACKTRACE=1 cargo test diff --git a/crates/string-offsets/js/package.json b/crates/string-offsets/js/package.json index 8e26d6d..7bca7ba 100644 --- a/crates/string-offsets/js/package.json +++ b/crates/string-offsets/js/package.json @@ -1,5 +1,5 @@ { - "name": "string-offsets-dev", + "name": "string-offsets", "version": "0.1.0", "author": "The blackbird team ", "license": "MIT", From c94f4e6b333d5b86c7d849fde6b7f2853a27cdaf Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 14 Mar 2025 15:53:36 -0700 Subject: [PATCH 021/114] Run npm install in make --- Makefile | 1 + crates/string-offsets/js/package-lock.json | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index c404bf3..770e8f3 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,7 @@ build: .PHONY: build-js build-js: + npm --prefix crates/string-offsets/js install npm --prefix crates/string-offsets/js run compile .PHONY: test diff --git a/crates/string-offsets/js/package-lock.json b/crates/string-offsets/js/package-lock.json index 1e35cd9..de0e02c 100644 --- a/crates/string-offsets/js/package-lock.json +++ b/crates/string-offsets/js/package-lock.json @@ -1,11 +1,11 @@ { - "name": "string-offsets-dev", + "name": "string-offsets", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "string-offsets-dev", + "name": "string-offsets", "version": "0.1.0", "license": "MIT", "devDependencies": { @@ -3867,4 +3867,4 @@ } } } -} \ No newline at end of file +} From 83c5facadeba55f195bc9b6e132e87d785ef939a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 18 Mar 2025 15:00:16 -0700 Subject: [PATCH 022/114] Add wasm feature to build and make wasm-bindgen optional --- crates/string-offsets/Cargo.toml | 5 +++- crates/string-offsets/js/package.json | 6 ++-- crates/string-offsets/src/lib.rs | 42 +++++++++++++-------------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index 1baeb2b..c318d0f 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -13,8 +13,11 @@ exclude = ["/js"] [lib] crate-type = ["cdylib", "rlib"] +[features] +wasm = ["wasm-bindgen"] + [dependencies] -wasm-bindgen = "0.2" +wasm-bindgen = { version = "0.2", optional = true } [dev-dependencies] rand = "0.9" diff --git a/crates/string-offsets/js/package.json b/crates/string-offsets/js/package.json index 7bca7ba..758aea7 100644 --- a/crates/string-offsets/js/package.json +++ b/crates/string-offsets/js/package.json @@ -20,9 +20,9 @@ "require": "./pkg/nodejs/string_offsets.js" }, "scripts": { - "compile:bundler": "wasm-pack build --target bundler -d js/pkg/bundler && node -e \"fs.unlinkSync('./pkg/bundler/.gitignore')\"", - "compile:web": "wasm-pack build --target web -d js/pkg/web && node -e \"fs.unlinkSync('./pkg/web/.gitignore')\"", - "compile:nodejs": "wasm-pack build --target nodejs -d js/pkg/nodejs && node -e \"fs.unlinkSync('./pkg/nodejs/.gitignore')\"", + "compile:bundler": "wasm-pack build --target bundler -d js/pkg/bundler --features wasm && node -e \"fs.unlinkSync('./pkg/bundler/.gitignore')\"", + "compile:web": "wasm-pack build --target web -d js/pkg/web --features wasm && node -e \"fs.unlinkSync('./pkg/web/.gitignore')\"", + "compile:nodejs": "wasm-pack build --target nodejs -d js/pkg/nodejs --features wasm && node -e \"fs.unlinkSync('./pkg/nodejs/.gitignore')\"", "compile": "npm run compile:web && npm run compile:bundler && npm run compile:nodejs", "test": "jest" }, diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 6891d09..739999b 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -27,9 +27,9 @@ use std::ops::Range; mod bitrank; - use bitrank::{BitRank, BitRankBuilder}; +#[cfg(feature = "wasm")] use wasm_bindgen::prelude::*; /// Converts positions within a given string between UTF-8 byte offsets (the usual in Rust), UTF-16 @@ -86,7 +86,7 @@ use wasm_bindgen::prelude::*; /// Most operations run in O(1) time. A few require O(log n) time. The memory consumed by this /// data structure is typically less than the memory occupied by the actual content. In the best /// case, it requires ~45% of the content space. -#[wasm_bindgen] +#[cfg_attr(feature = "wasm", wasm_bindgen)] pub struct StringOffsets { /// Vector storing, for every line, the byte position at which the line starts. line_begins: Vec, @@ -108,7 +108,7 @@ pub struct StringOffsets { } /// A position in a string, specified by line and column number. -#[wasm_bindgen] +#[cfg_attr(feature = "wasm", wasm_bindgen)] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Pos { /// Zero-indexed line number. @@ -136,10 +136,10 @@ pub struct Pos { // Question: Consider whether we should return an empty line range in this case which would // probably be consistent from a mathematical point of view. But then we should also return empty // line ranges for empty character ranges in the middle of a line... -#[wasm_bindgen] +#[cfg_attr(feature = "wasm", wasm_bindgen)] impl StringOffsets { /// Create a new converter to work with offsets into the given string. - #[wasm_bindgen(constructor)] + #[cfg_attr(feature = "wasm", wasm_bindgen(constructor))] pub fn new(content: &str) -> Self { new_converter(content.as_bytes()) } @@ -149,26 +149,26 @@ impl StringOffsets { /// If `content` is UTF-8, this is just like [`StringOffsets::new`]. Otherwise, the /// conversion methods will produce unspecified (but memory-safe) results. #[allow(unused_variables)] - #[wasm_bindgen(static_method_of = StringOffsets)] + #[cfg_attr(feature = "wasm", wasm_bindgen(static_method_of = StringOffsets))] pub fn from_bytes(content: &[u8]) -> Self { new_converter(content) } /// Returns the number of Unicode characters on the specified line. - #[wasm_bindgen(js_name = lineChars)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineChars))] pub fn line_chars(&self, line_number: usize) -> usize { let r = self.utf8s_to_chars(self.line_to_utf8s(line_number)); r.end - r.start } /// Returns the number of lines in the string. - #[wasm_bindgen(js_name = lines)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lines))] pub fn lines(&self) -> usize { self.line_begins.len() - 1 } /// Returns true if the specified line is empty except for whitespace. - #[wasm_bindgen(js_name = onlyWhitespaces)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = onlyWhitespaces))] pub fn only_whitespaces(&self, line_number: usize) -> bool { self.whitespace_only .get(line_number) @@ -180,7 +180,7 @@ impl StringOffsets { /// /// If `line_number` is greater than or equal to the number of lines in the text, this returns /// the length of the string. - #[wasm_bindgen(js_name = lineToUtf8Begin)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8Begin))] pub fn line_to_utf8_begin(&self, line_number: usize) -> usize { self.line_begins[line_number.min(self.lines())] as usize } @@ -189,7 +189,7 @@ impl StringOffsets { /// /// That is, return the offset that would point to the start of that line in a UTF-16 /// representation of the source string. - #[wasm_bindgen(js_name = lineToUtf16Begin)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16Begin))] pub fn line_to_utf16_begin(&self, line_number: usize) -> usize { self.utf8_to_utf16(self.line_to_utf8_begin(line_number)) } @@ -198,39 +198,39 @@ impl StringOffsets { /// /// That is, return the offset that would point to the start of that line in a UTF-32 /// representation of the source string. - #[wasm_bindgen(js_name = lineToCharBegin)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharBegin))] pub fn line_to_char_begin(&self, line_number: usize) -> usize { self.utf8_to_char(self.line_to_utf8_begin(line_number)) } /// UTF-8 offset of the first character of a line. - #[wasm_bindgen(js_name = lineToUtf8End)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8End))] pub fn line_to_utf8_end(&self, line_number: usize) -> usize { self.line_to_utf8_begin(line_number + 1) } /// UTF-16 offset one past the end of a line (the offset of the start of the next line). - #[wasm_bindgen(js_name = lineToUtf16End)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16End))] pub fn line_to_utf16_end(&self, line_number: usize) -> usize { self.utf8_to_utf16(self.line_to_utf8_end(line_number)) } /// UTF-32 offset one past the end of a line (the offset of the start of the next line). - #[wasm_bindgen(js_name = lineToCharEnd)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharEnd))] pub fn line_to_char_end(&self, line_number: usize) -> usize { self.utf8_to_char(self.line_to_utf8_end(line_number)) } /// Return the zero-based line number of the line containing the specified UTF-8 offset. /// Newline characters count as part of the preceding line. - #[wasm_bindgen(js_name = utf8ToLine)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToLine))] pub fn utf8_to_line(&self, byte_number: usize) -> usize { self.utf8_to_line.rank(byte_number) } /// Converts a UTF-8 offset to a zero-based line number and UTF-32 offset within the /// line. - #[wasm_bindgen(js_name = utf8ToCharPos)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToCharPos))] pub fn utf8_to_char_pos(&self, byte_number: usize) -> Pos { let line = self.utf8_to_line(byte_number); let line_start_char_number = self.line_to_char_begin(line); @@ -243,7 +243,7 @@ impl StringOffsets { /// Converts a UTF-8 offset to a zero-based line number and UTF-16 offset within the /// line. - #[wasm_bindgen(js_name = utf8ToUtf16Pos)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16Pos))] pub fn utf8_to_utf16_pos(&self, byte_number: usize) -> Pos { let line = self.utf8_to_line(byte_number); let line_start_char_number = self.line_to_utf16_begin(line); @@ -255,19 +255,19 @@ impl StringOffsets { } /// Converts a UTF-8 offset to a UTF-32 offset. - #[wasm_bindgen(js_name = utf8ToChar)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToChar))] pub fn utf8_to_char(&self, byte_number: usize) -> usize { self.utf8_to_char.rank(byte_number) } /// Converts a UTF-8 offset to a UTF-16 offset. - #[wasm_bindgen(js_name = utf8ToUtf16)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16))] pub fn utf8_to_utf16(&self, byte_number: usize) -> usize { self.utf8_to_utf16.rank(byte_number) } /// Converts a UTF-32 offset to a UTF-8 offset. - #[wasm_bindgen(js_name = charToUtf8)] + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = charToUtf8))] pub fn char_to_utf8(&self, char_number: usize) -> usize { let mut byte_number = char_number; for _ in 0..128 { From fd0493c7ea387b191e710a7d7f77f37f93528f90 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 18 Mar 2025 15:37:03 -0700 Subject: [PATCH 023/114] Try adding publish workflow --- .github/workflows/publish.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/publish.yaml diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..1b03fbf --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,23 @@ +name: Publish + +on: + workflow_dispatch: # Allow manual triggering of the workflow + +jobs: + publish-npm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 22 + registry-url: https://registry.npmjs.org/ + cache: npm + - run: cd crates/string-offsets/js + - run: npm ci + - run: npm run compile + - run: npm test + - run: echo "Publishing string-offsets" + - run: npm whoami; npm --ignore-scripts publish + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} \ No newline at end of file From e51571dde7c1a9559ac1fc23fa71921ae0a7e00f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Mar 2025 08:34:40 -0700 Subject: [PATCH 024/114] Add trailing newline --- .github/workflows/publish.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 1b03fbf..b84057f 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -20,4 +20,4 @@ jobs: - run: echo "Publishing string-offsets" - run: npm whoami; npm --ignore-scripts publish env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} \ No newline at end of file + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} From b1826ac1c08e1ee93ef25cc0a9eeafe2c16469fe Mon Sep 17 00:00:00 2001 From: Leo Balter <301201+leobalter@users.noreply.github.com> Date: Wed, 19 Mar 2025 08:57:50 -0700 Subject: [PATCH 025/114] Set the working-directory for the npm publish --- .github/workflows/publish.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index b84057f..18d8b92 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -6,6 +6,9 @@ on: jobs: publish-npm: runs-on: ubuntu-latest + defaults: + run: + working-directory: crates/string-offsets/js steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 @@ -13,7 +16,6 @@ jobs: node-version: 22 registry-url: https://registry.npmjs.org/ cache: npm - - run: cd crates/string-offsets/js - run: npm ci - run: npm run compile - run: npm test From 1411681b9a779db14e67a4a2f7f942dd23b1ffd6 Mon Sep 17 00:00:00 2001 From: Leo Balter <301201+leobalter@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:40:25 -0700 Subject: [PATCH 026/114] Reuse the package-lock.json in the workspace. --- .github/workflows/publish.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 18d8b92..c96faa8 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -10,8 +10,12 @@ jobs: run: working-directory: crates/string-offsets/js steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - name: Copy lock file to root for dependency scanning + run: | + cp crates/string-offsets/js/package-lock.json ${GITHUB_WORKSPACE}/package-lock.json + working-directory: . + - uses: actions/setup-node@v4 with: node-version: 22 registry-url: https://registry.npmjs.org/ From 1a7dbe9cf17fc39e45cd65ac3c51814412a578db Mon Sep 17 00:00:00 2001 From: Leo Balter <301201+leobalter@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:46:30 -0700 Subject: [PATCH 027/114] Remove lock file copy step in workflow --- .github/workflows/publish.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index c96faa8..bde4a46 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -11,15 +11,12 @@ jobs: working-directory: crates/string-offsets/js steps: - uses: actions/checkout@v4 - - name: Copy lock file to root for dependency scanning - run: | - cp crates/string-offsets/js/package-lock.json ${GITHUB_WORKSPACE}/package-lock.json - working-directory: . - uses: actions/setup-node@v4 with: node-version: 22 registry-url: https://registry.npmjs.org/ cache: npm + cache-dependency-path: crates/string-offsets/js/package-lock.json - run: npm ci - run: npm run compile - run: npm test From d669c171dcd71edb0f72116cad8919b354a79333 Mon Sep 17 00:00:00 2001 From: Greg Orzell Date: Thu, 20 Mar 2025 09:32:32 +0100 Subject: [PATCH 028/114] actions: Add explict permissions. --- .github/workflows/publish.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index bde4a46..870d107 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -3,6 +3,9 @@ name: Publish on: workflow_dispatch: # Allow manual triggering of the workflow +permissions: + contents: read + jobs: publish-npm: runs-on: ubuntu-latest From 200535465bbac38ef818ba4a5750f8e7a2b749ab Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Tue, 25 Mar 2025 12:46:46 +0100 Subject: [PATCH 029/114] add bench and speed things up --- crates/bpe/benchmarks/performance.rs | 6 +- crates/string-offsets/Cargo.toml | 6 + .../string-offsets/benchmarks/Cargo.toml.bak | 14 +++ .../string-offsets/benchmarks/performance.rs | 32 ++++++ crates/string-offsets/src/bitrank.rs | 106 +++++++----------- crates/string-offsets/src/lib.rs | 78 ++++++------- 6 files changed, 137 insertions(+), 105 deletions(-) create mode 100644 crates/string-offsets/benchmarks/Cargo.toml.bak create mode 100644 crates/string-offsets/benchmarks/performance.rs diff --git a/crates/bpe/benchmarks/performance.rs b/crates/bpe/benchmarks/performance.rs index d192225..21ebff8 100644 --- a/crates/bpe/benchmarks/performance.rs +++ b/crates/bpe/benchmarks/performance.rs @@ -9,7 +9,7 @@ use bpe_benchmarks::*; use criterion::{ criterion_group, criterion_main, AxisScale, BenchmarkId, Criterion, PlotConfiguration, }; -use rand::{thread_rng, Rng}; +use rand::{rng, Rng}; fn counting_benchmark(c: &mut Criterion) { for (name, bpe, _, _) in TOKENIZERS.iter() { @@ -22,7 +22,7 @@ fn counting_benchmark(c: &mut Criterion) { group.throughput(criterion::Throughput::Bytes(bytes as u64)); group.bench_with_input(BenchmarkId::new("interval", bytes), &bytes, |b, bytes| { b.iter_batched( - || thread_rng().gen_range(0..input.len() - bytes), + || rng().random_range(0..input.len() - bytes), |start| fast.count(start..start + bytes), criterion::BatchSize::SmallInput, ) @@ -32,7 +32,7 @@ fn counting_benchmark(c: &mut Criterion) { &bytes, |b, bytes| { b.iter_batched( - || thread_rng().gen_range(0..input.len() - bytes), + || rng().random_range(0..input.len() - bytes), |start| bpe.bpe.count(&input.as_bytes()[start..start + bytes]), criterion::BatchSize::SmallInput, ) diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index c318d0f..2289dce 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -22,3 +22,9 @@ wasm-bindgen = { version = "0.2", optional = true } [dev-dependencies] rand = "0.9" rand_chacha = "0.9" +criterion = "0.5" + +[[bench]] +name = "performance" +path = "benchmarks/performance.rs" +harness = false diff --git a/crates/string-offsets/benchmarks/Cargo.toml.bak b/crates/string-offsets/benchmarks/Cargo.toml.bak new file mode 100644 index 0000000..780e49e --- /dev/null +++ b/crates/string-offsets/benchmarks/Cargo.toml.bak @@ -0,0 +1,14 @@ +[package] +name = "string-offsets-benchmarks" +edition = "2021" + +[[bench]] +name = "performance" +path = "performance.rs" +harness = false +test = false + +[dependencies] +bpe = { path = "../../string-offsets" } +criterion = "0.5" +rand = "0.9" \ No newline at end of file diff --git a/crates/string-offsets/benchmarks/performance.rs b/crates/string-offsets/benchmarks/performance.rs new file mode 100644 index 0000000..25a45c3 --- /dev/null +++ b/crates/string-offsets/benchmarks/performance.rs @@ -0,0 +1,32 @@ +use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; +use rand::{rng, Rng}; +use string_offsets::StringOffsets; + +fn construction_benchmark(c: &mut Criterion) { + // Generate random input string + let mut group = c.benchmark_group("construction"); + for size in [1000, 10000, 100000] { + let mut rng = rng(); + let random_input: String = (0..size).map(|_| rng.random::() as char).collect(); + + // Create benchmark group for throughput measurement + + // Set throughput based on input size in bytes + group.throughput(criterion::Throughput::Bytes(random_input.len() as u64)); + + // Run the benchmark + group.bench_with_input( + BenchmarkId::from_parameter(size), + &random_input, + |b, input| b.iter(|| black_box(StringOffsets::new(input))), + ); + } + group.finish(); +} + +criterion_group!( + name = benches; + config = Criterion::default(); + targets = construction_benchmark +); +criterion_main!(benches); diff --git a/crates/string-offsets/src/bitrank.rs b/crates/string-offsets/src/bitrank.rs index e35ff7d..73d62ad 100644 --- a/crates/string-offsets/src/bitrank.rs +++ b/crates/string-offsets/src/bitrank.rs @@ -44,12 +44,12 @@ impl Block { /// This panics if the bit was already set, because that indicates that the original positions /// list is invalid/had duplicates. fn set(&mut self, index: usize) { - assert!(index < BITS_PER_BLOCK); + debug_assert!(index < BITS_PER_BLOCK); let chunk_idx = index / BITS_PER_SUB_BLOCK; let bit_idx = index % BITS_PER_SUB_BLOCK; let mask = 1 << ((BITS_PER_SUB_BLOCK - 1) - bit_idx); - assert_eq!(self.bits[chunk_idx] & mask, 0, "toggling bits off indicates that the original data was incorrect, most likely containing duplicate values."); - self.bits[chunk_idx] ^= mask; + debug_assert_eq!(self.bits[chunk_idx] & mask, 0, "toggling bits off indicates that the original data was incorrect, most likely containing duplicate values."); + self.bits[chunk_idx] |= mask; } /// The **total rank** of the block relative local index, and the index of the one @@ -107,62 +107,37 @@ pub struct BitRankBuilder { } impl BitRankBuilder { - /// Returns a new builder. - #[cfg(test)] - pub fn new() -> Self { - Self::default() - } - /// Returns a builder that can hold integers with values `0..cap`. pub fn with_capacity(cap: usize) -> Self { + const ZERO_BLOCK: Block = Block { + rank: 0, + sub_blocks: [0; SUB_BLOCKS_PER_BLOCK], + bits: [0; SUB_BLOCKS_PER_BLOCK], + }; Self { - blocks: Vec::with_capacity(cap.div_ceil(BITS_PER_BLOCK)), - } - } - - fn finish_last_block(&mut self) -> u64 { - if let Some(block) = self.blocks.last_mut() { - let mut local_rank = 0; - for (i, chunk) in block.bits.iter().enumerate() { - block.sub_blocks[i] = local_rank; - local_rank += chunk.count_ones() as u16; - } - block.rank + local_rank as u64 - } else { - 0 + blocks: vec![ZERO_BLOCK; cap.div_ceil(BITS_PER_BLOCK)], } } /// Adds a bit. Bits must be added in order of increasing `position`. pub fn push(&mut self, position: usize) { let block_id = position / BITS_PER_BLOCK; - assert!( - self.blocks.len() <= block_id + 1, - "positions must be increasing!" - ); - if block_id >= self.blocks.len() { - let curr_rank = self.finish_last_block(); - while block_id >= self.blocks.len() { - // Without this declared as a `const`, rustc 1.82 creates the Block value on the - // stack first, then `memcpy`s it into `self.blocks`. - const ZERO_BLOCK: Block = Block { - rank: 0, - sub_blocks: [0; SUB_BLOCKS_PER_BLOCK], - bits: [0; SUB_BLOCKS_PER_BLOCK], - }; - self.blocks.push(ZERO_BLOCK); - self.blocks.last_mut().expect("just inserted").rank = curr_rank; - } - } - self.blocks - .last_mut() - .expect("just ensured there are enough blocks") - .set(position % BITS_PER_BLOCK); + self.blocks[block_id].set(position % BITS_PER_BLOCK); } /// Finishes the `BitRank` by writing the last block of data. pub fn finish(mut self) -> BitRank { - self.finish_last_block(); + let mut total_rank = 0; + for block in &mut self.blocks { + block.rank = total_rank; + let mut local_rank = 0; + for (i, chunk) in block.bits.iter().enumerate() { + block.sub_blocks[i] = local_rank; + local_rank += chunk.count_ones() as u16; + } + total_rank += local_rank as u64 + } + //self.finish_last_block(); BitRank { blocks: self.blocks, } @@ -222,8 +197,8 @@ mod tests { /// Creates a `BitRank` containing the integers in `iter` (which should be strictly /// increasing). - pub fn bitrank>(iter: I) -> BitRank { - let mut builder = BitRankBuilder::new(); + pub fn bitrank>(capacity: usize, iter: I) -> BitRank { + let mut builder = BitRankBuilder::with_capacity(capacity); for position in iter { builder.push(position); } @@ -232,32 +207,32 @@ mod tests { #[test] fn test_rank_zero() { - let br = bitrank([0]); + let br = bitrank(1, [0]); assert_eq!(br.rank(0), 0); assert_eq!(br.rank(1), 1); } #[test] fn test_empty() { - let br = bitrank([]); + let br = bitrank(0, []); assert!(br.blocks.is_empty()); } #[test] fn test_index_out_of_bounds() { - let br = bitrank([BITS_PER_BLOCK - 1]); + let br = bitrank(BITS_PER_BLOCK, [BITS_PER_BLOCK - 1]); assert_eq!(br.rank(BITS_PER_BLOCK), 1); } #[test] #[should_panic] fn test_duplicate_position() { - bitrank([64, 66, 68, 68, 90]); + bitrank(91, [64, 66, 68, 68, 90]); } #[test] fn test_rank_exclusive() { - let br = bitrank(0..132); + let br = bitrank(133, 0..132); assert_eq!(br.blocks.len(), 1); assert_eq!(br.rank(64), 64); assert_eq!(br.rank(132), 132); @@ -267,13 +242,13 @@ mod tests { fn test_rank() { let mut positions: Vec = (0..132).collect(); positions.append(&mut vec![138usize, 140, 146]); - let br = bitrank(positions); + let br = bitrank(146, positions); assert_eq!(br.rank(135), 132); - let br2 = bitrank(0..BITS_PER_BLOCK - 5); + let br2 = bitrank(BITS_PER_BLOCK, 0..BITS_PER_BLOCK - 5); assert_eq!(br2.rank(169), 169); - let br3 = bitrank(0..BITS_PER_BLOCK + 5); + let br3 = bitrank(BITS_PER_BLOCK + 6, 0..BITS_PER_BLOCK + 5); assert_eq!(br3.rank(BITS_PER_BLOCK), BITS_PER_BLOCK); } @@ -281,23 +256,23 @@ mod tests { fn test_rank_idx() { let mut positions: Vec = (0..132).collect(); positions.append(&mut vec![138usize, 140, 146]); - let br = bitrank(positions); + let br = bitrank(147, positions); assert_eq!(br.rank_select(135), (132, Some(131))); let bits2: Vec = (0..BITS_PER_BLOCK - 5).collect(); - let br2 = bitrank(bits2); + let br2 = bitrank(BITS_PER_BLOCK, bits2); assert_eq!(br2.rank_select(169), (169, Some(168))); let bits3: Vec = (0..BITS_PER_BLOCK + 5).collect(); - let br3 = bitrank(bits3); + let br3 = bitrank(BITS_PER_BLOCK + 6, bits3); assert_eq!(br3.rank_select(BITS_PER_BLOCK), (BITS_PER_BLOCK, None)); let bits4: Vec = vec![1, 1000, 9999, BITS_PER_BLOCK + 1]; - let br4 = bitrank(bits4); + let br4 = bitrank(BITS_PER_BLOCK + 1, bits4); assert_eq!(br4.rank_select(10000), (3, Some(9999))); let bits5: Vec = vec![1, 1000, 9999, BITS_PER_BLOCK + 1]; - let br5 = bitrank(bits5); + let br5 = bitrank(BITS_PER_BLOCK + 1, bits5); assert_eq!(br5.rank_select(BITS_PER_BLOCK), (3, None)); } @@ -313,7 +288,7 @@ mod tests { // This isn't strictly necessary, given that the bit would just be toggled again, but it // ensures that we are meeting the contract. random_bits.dedup(); - let br = bitrank(random_bits.iter().copied()); + let br = bitrank(1_000_000, random_bits.iter().copied()); let mut rank = 0; let mut select = None; for i in 0..random_bits.capacity() { @@ -333,7 +308,7 @@ mod tests { #[test] fn test_rank_out_of_bounds() { for i in 1..30 { - let br = bitrank([BITS_PER_BLOCK * i - 1]); + let br = bitrank(BITS_PER_BLOCK * i, [BITS_PER_BLOCK * i - 1]); assert_eq!(br.max_rank(), 1); assert_eq!(br.rank(BITS_PER_BLOCK * i - 1), 0); for j in 0..10 { @@ -344,7 +319,10 @@ mod tests { #[test] fn test_large_gap() { - let br = bitrank((3..4).chain(BITS_PER_BLOCK * 15..BITS_PER_BLOCK * 15 + 17)); + let br = bitrank( + BITS_PER_BLOCK * 16, + (3..4).chain(BITS_PER_BLOCK * 15..BITS_PER_BLOCK * 15 + 17), + ); for i in 1..15 { assert_eq!(br.rank(BITS_PER_BLOCK * i), 1); } diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 739999b..89f8765 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -144,6 +144,11 @@ impl StringOffsets { new_converter(content.as_bytes()) } + /// Returns the number of bytes in the string. + pub fn len(&self) -> usize { + self.line_begins.last().copied().unwrap_or(0) as usize + } + /// Create a new converter to work with offsets into the given byte-string. /// /// If `content` is UTF-8, this is just like [`StringOffsets::new`]. Otherwise, the @@ -257,13 +262,13 @@ impl StringOffsets { /// Converts a UTF-8 offset to a UTF-32 offset. #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToChar))] pub fn utf8_to_char(&self, byte_number: usize) -> usize { - self.utf8_to_char.rank(byte_number) + self.utf8_to_char.rank(byte_number + 1) - 1 } /// Converts a UTF-8 offset to a UTF-16 offset. #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16))] pub fn utf8_to_utf16(&self, byte_number: usize) -> usize { - self.utf8_to_utf16.rank(byte_number) + self.utf8_to_char(byte_number) + self.utf8_to_utf16.rank(byte_number) } /// Converts a UTF-32 offset to a UTF-8 offset. @@ -280,7 +285,7 @@ impl StringOffsets { // If we couldn't find the char within 128 steps, then the char_number might be invalid! // This does not usually happen. For consistency with the rest of the code, we simply return // the max utf8 position in this case. - if char_number > self.utf8_to_char.max_rank() { + if char_number >= self.utf8_to_char.max_rank() { return self .line_begins .last() @@ -357,24 +362,21 @@ impl StringOffsets { fn new_converter(content: &[u8]) -> StringOffsets { let n = content.len(); - let mut utf8_builder = BitRankBuilder::with_capacity(n); - let mut utf16_builder = BitRankBuilder::with_capacity(n); - let mut line_builder = BitRankBuilder::with_capacity(n); + let mut utf8_builder = BitRankBuilder::with_capacity(n + 1); + let mut utf16_builder = BitRankBuilder::with_capacity(n + 1); + let mut line_builder = BitRankBuilder::with_capacity(n + 1); let mut line_begins = vec![0]; - let mut i = 0; let mut whitespace_only = vec![]; let mut only_whitespaces = true; // true if all characters in the current line are whitespaces. - while i < content.len() { + for i in 0..content.len() { // In case of invalid utf8, we might get a utf8_len of 0. // In this case, we just treat the single byte character. // In principle, a single incorrect byte can break the whole decoding... let c = content[i]; - let utf8_len = utf8_width(c).max(1); - if i > 0 { - utf8_builder.push(i - 1); - utf16_builder.push(i - 1); + if is_char_boundary(c) { + utf8_builder.push(i); } - if utf8_to_utf16_width(&content[i..]) > 1 { + if two_utf16(c) { utf16_builder.push(i); } if c == b'\n' { @@ -385,16 +387,12 @@ fn new_converter(content: &[u8]) -> StringOffsets { } else { only_whitespaces &= matches!(c, b'\t' | b'\r' | b' '); } - i += utf8_len; - } - if !content.is_empty() { - utf8_builder.push(content.len() - 1); - utf16_builder.push(content.len() - 1); } - if line_begins.last() != Some(&(content.len() as u32)) { + utf8_builder.push(n); + if line_begins.last() != Some(&(n as u32)) { whitespace_only.push(only_whitespaces); - line_begins.push(content.len() as u32); - line_builder.push(content.len() - 1); + line_begins.push(n as u32); + line_builder.push(n - 1); } StringOffsets { @@ -406,31 +404,35 @@ fn new_converter(content: &[u8]) -> StringOffsets { } } -/// Returns the number of bytes a UTF-8 char occupies, given the first byte of the UTF-8 encoding. -/// Returns 0 if the byte is not a valid first byte of a UTF-8 char. -fn utf8_width(c: u8) -> usize { - // Every nibble represents the utf8 length given the first 4 bits of a utf8 encoded byte. - const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111; - ((UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf) as usize +/// Returns true if, in a UTF-8 string, `b` indicates the first byte of a character. +fn is_char_boundary(b: u8) -> bool { + b as i8 >= -0x40 // NB: b < 128 || b >= 192 } -fn utf8_to_utf16_width(content: &[u8]) -> usize { - let len = utf8_width(content[0]); - match len { - 0 => 0, - 1..=3 => 1, - 4 => 2, - _ => panic!("invalid utf8 char width: {}", len), - } +fn two_utf16(c: u8) -> bool { + c & 0b1111_0000 == 0b1111_0000 } #[cfg(test)] mod tests { use super::*; - /// Returns true if, in a UTF-8 string, `b` indicates the first byte of a character. - fn is_char_boundary(b: u8) -> bool { - b as i8 >= -0x40 // NB: b < 128 || b >= 192 + /// Returns the number of bytes a UTF-8 char occupies, given the first byte of the UTF-8 encoding. + /// Returns 0 if the byte is not a valid first byte of a UTF-8 char. + fn utf8_width(c: u8) -> usize { + // Every nibble represents the utf8 length given the first 4 bits of a utf8 encoded byte. + const UTF8_WIDTH: u64 = 0x4322_0000_1111_1111; + ((UTF8_WIDTH >> ((c >> 4) * 4)) & 0xf) as usize + } + + fn utf8_to_utf16_width(content: &[u8]) -> usize { + let len = utf8_width(content[0]); + match len { + 0 => 0, + 1..=3 => 1, + 4 => 2, + _ => panic!("invalid utf8 char width: {}", len), + } } #[test] From 5c59a949be6aa5a04d020c8ce084892f582b7fd2 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 26 Mar 2025 08:40:30 +0100 Subject: [PATCH 030/114] Make features configurable --- .../string-offsets/benchmarks/performance.rs | 36 ++- crates/string-offsets/src/config.rs | 46 +++ crates/string-offsets/src/lib.rs | 286 ++++++++++-------- 3 files changed, 229 insertions(+), 139 deletions(-) create mode 100644 crates/string-offsets/src/config.rs diff --git a/crates/string-offsets/benchmarks/performance.rs b/crates/string-offsets/benchmarks/performance.rs index 25a45c3..f22d9e9 100644 --- a/crates/string-offsets/benchmarks/performance.rs +++ b/crates/string-offsets/benchmarks/performance.rs @@ -1,24 +1,36 @@ use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; use rand::{rng, Rng}; -use string_offsets::StringOffsets; +use string_offsets::{AllConfig, OnlyLines, StringOffsets}; -fn construction_benchmark(c: &mut Criterion) { - // Generate random input string - let mut group = c.benchmark_group("construction"); +fn only_lines_construction_benchmark(c: &mut Criterion) { + let mut group = c.benchmark_group("only_lines_construction"); for size in [1000, 10000, 100000] { let mut rng = rng(); - let random_input: String = (0..size).map(|_| rng.random::() as char).collect(); - - // Create benchmark group for throughput measurement - - // Set throughput based on input size in bytes + let random_input: String = (0..size) + .map(|_| rng.random_range(32u8..128u8) as char) + .collect(); group.throughput(criterion::Throughput::Bytes(random_input.len() as u64)); + group.bench_with_input( + BenchmarkId::from_parameter(size), + &random_input, + |b, input| b.iter(|| black_box(StringOffsets::::new(input))), + ); + } + group.finish(); +} - // Run the benchmark +fn full_construction_benchmark(c: &mut Criterion) { + let mut group = c.benchmark_group("full_construction"); + for size in [1000, 10000, 100000] { + let mut rng = rng(); + let random_input: String = (0..size) + .map(|_| rng.random_range(32u8..128u8) as char) + .collect(); + group.throughput(criterion::Throughput::Bytes(random_input.len() as u64)); group.bench_with_input( BenchmarkId::from_parameter(size), &random_input, - |b, input| b.iter(|| black_box(StringOffsets::new(input))), + |b, input| b.iter(|| black_box(StringOffsets::::new(input))), ); } group.finish(); @@ -27,6 +39,6 @@ fn construction_benchmark(c: &mut Criterion) { criterion_group!( name = benches; config = Criterion::default(); - targets = construction_benchmark + targets = only_lines_construction_benchmark, full_construction_benchmark ); criterion_main!(benches); diff --git a/crates/string-offsets/src/config.rs b/crates/string-offsets/src/config.rs new file mode 100644 index 0000000..bd46407 --- /dev/null +++ b/crates/string-offsets/src/config.rs @@ -0,0 +1,46 @@ + +/// Type-level boolean. +pub trait Bool { + /// The value of the boolean. + const VALUE: bool; +} +/// Type-level true. +pub struct True {} +/// Type-level false. +pub struct False {} +impl Bool for True { + const VALUE: bool = true; +} +impl Bool for False { + const VALUE: bool = false; +} + +/// Configures which features should be enabled for a [`StringOffsets`] instance. +pub trait ConfigType { + /// Whether to enable character conversions. + type HasChars: Bool; + /// Whether to enable UTF-16 conversions. + type HasUtf16: Bool; + /// Whether to enable line conversions. + type HasLines: Bool; + /// Whether to enable whitespace checks. + type HasWhitespace: Bool; +} + +/// Configuration type that enables all features. +pub struct AllConfig {} +impl ConfigType for AllConfig { + type HasChars = True; + type HasUtf16 = True; + type HasLines = True; + type HasWhitespace = True; +} + +/// Configuration type that only enables line conversions. +pub struct OnlyLines {} +impl ConfigType for OnlyLines { + type HasChars = False; + type HasUtf16 = False; + type HasLines = True; + type HasWhitespace = False; +} diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 89f8765..b9f5401 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -3,10 +3,10 @@ //! # Example //! //! ``` -//! use string_offsets::StringOffsets; +//! use string_offsets::{StringOffsets, AllConfig}; //! //! let s = "☀️hello\n🗺️world\n"; -//! let offsets = StringOffsets::new(s); +//! let offsets = StringOffsets::::new(s); //! //! // Find offsets where lines begin and end. //! assert_eq!(offsets.line_to_utf8s(0), 0..12); // note: 0-based line numbers @@ -24,10 +24,15 @@ //! See [`StringOffsets`] for details. #![deny(missing_docs)] -use std::ops::Range; +use std::{marker::PhantomData, ops::Range}; mod bitrank; +mod config; + use bitrank::{BitRank, BitRankBuilder}; +use config::{Bool, ConfigType, True}; + +pub use config::{AllConfig, OnlyLines}; #[cfg(feature = "wasm")] use wasm_bindgen::prelude::*; @@ -87,7 +92,7 @@ use wasm_bindgen::prelude::*; /// data structure is typically less than the memory occupied by the actual content. In the best /// case, it requires ~45% of the content space. #[cfg_attr(feature = "wasm", wasm_bindgen)] -pub struct StringOffsets { +pub struct StringOffsets { /// Vector storing, for every line, the byte position at which the line starts. line_begins: Vec, @@ -105,6 +110,9 @@ pub struct StringOffsets { /// Marks, for every line, whether it consists only of whitespace characters. whitespace_only: Vec, + + /// Configuration type. + _config: PhantomData, } /// A position in a string, specified by line and column number. @@ -137,18 +145,13 @@ pub struct Pos { // probably be consistent from a mathematical point of view. But then we should also return empty // line ranges for empty character ranges in the middle of a line... #[cfg_attr(feature = "wasm", wasm_bindgen)] -impl StringOffsets { +impl StringOffsets { /// Create a new converter to work with offsets into the given string. #[cfg_attr(feature = "wasm", wasm_bindgen(constructor))] pub fn new(content: &str) -> Self { new_converter(content.as_bytes()) } - /// Returns the number of bytes in the string. - pub fn len(&self) -> usize { - self.line_begins.last().copied().unwrap_or(0) as usize - } - /// Create a new converter to work with offsets into the given byte-string. /// /// If `content` is UTF-8, this is just like [`StringOffsets::new`]. Otherwise, the @@ -158,12 +161,12 @@ impl StringOffsets { pub fn from_bytes(content: &[u8]) -> Self { new_converter(content) } +} - /// Returns the number of Unicode characters on the specified line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineChars))] - pub fn line_chars(&self, line_number: usize) -> usize { - let r = self.utf8s_to_chars(self.line_to_utf8s(line_number)); - r.end - r.start +impl> StringOffsets { + /// Returns the number of bytes in the string. + pub fn len(&self) -> usize { + self.line_begins.last().copied().unwrap_or(0) as usize } /// Returns the number of lines in the string. @@ -172,15 +175,6 @@ impl StringOffsets { self.line_begins.len() - 1 } - /// Returns true if the specified line is empty except for whitespace. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = onlyWhitespaces))] - pub fn only_whitespaces(&self, line_number: usize) -> bool { - self.whitespace_only - .get(line_number) - .copied() - .unwrap_or(true) - } - /// Return the byte offset of the first character on the specified (zero-based) line. /// /// If `line_number` is greater than or equal to the number of lines in the text, this returns @@ -190,13 +184,52 @@ impl StringOffsets { self.line_begins[line_number.min(self.lines())] as usize } - /// UTF-16 offset of the first character of a line. + /// UTF-8 offset of the first character of a line. + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8End))] + pub fn line_to_utf8_end(&self, line_number: usize) -> usize { + self.line_to_utf8_begin(line_number + 1) + } + + /// Return the zero-based line number of the line containing the specified UTF-8 offset. + /// Newline characters count as part of the preceding line. + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToLine))] + pub fn utf8_to_line(&self, byte_number: usize) -> usize { + self.utf8_to_line.rank(byte_number) + } + + /// Returns the range of line numbers containing the substring specified by the Rust-style + /// range `bytes`. Newline characters count as part of the preceding line. /// - /// That is, return the offset that would point to the start of that line in a UTF-16 - /// representation of the source string. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16Begin))] - pub fn line_to_utf16_begin(&self, line_number: usize) -> usize { - self.utf8_to_utf16(self.line_to_utf8_begin(line_number)) + /// If `bytes` is an empty range at a position within or at the beginning of a line, this + /// returns a nonempty range containing the line number of that one line. An empty range at or + /// beyond the end of the string translates to an empty range of line numbers. + pub fn utf8s_to_lines(&self, bytes: Range) -> Range { + // The fiddly parts of this formula are necessary because `bytes.start` rounds down to the + // beginning of the line, but `bytes.end` "rounds up" to the end of the line. the final + // `+1` is to produce a half-open range. + self.utf8_to_line(bytes.start) + ..self + .lines() + .min(self.utf8_to_line(bytes.end.saturating_sub(1).max(bytes.start)) + 1) + } + + /// UTF-8 offset one past the end of a line (the offset of the start of the next line). + pub fn line_to_utf8s(&self, line_number: usize) -> Range { + self.line_to_utf8_begin(line_number)..self.line_to_utf8_end(line_number) + } + + /// UTF-8 offsets for the beginning and end of a range of lines, including the newline if any. + pub fn lines_to_utf8s(&self, line_numbers: Range) -> Range { + self.line_to_utf8_begin(line_numbers.start)..self.line_to_utf8_begin(line_numbers.end) + } +} + +impl> StringOffsets { + /// Returns the number of Unicode characters on the specified line. + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineChars))] + pub fn line_chars(&self, line_number: usize) -> usize { + let r = self.utf8s_to_chars(self.line_to_utf8s(line_number)); + r.end - r.start } /// UTF-32 offset of the first character of a line. @@ -208,29 +241,20 @@ impl StringOffsets { self.utf8_to_char(self.line_to_utf8_begin(line_number)) } - /// UTF-8 offset of the first character of a line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8End))] - pub fn line_to_utf8_end(&self, line_number: usize) -> usize { - self.line_to_utf8_begin(line_number + 1) - } - - /// UTF-16 offset one past the end of a line (the offset of the start of the next line). - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16End))] - pub fn line_to_utf16_end(&self, line_number: usize) -> usize { - self.utf8_to_utf16(self.line_to_utf8_end(line_number)) - } - /// UTF-32 offset one past the end of a line (the offset of the start of the next line). #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharEnd))] pub fn line_to_char_end(&self, line_number: usize) -> usize { self.utf8_to_char(self.line_to_utf8_end(line_number)) } - /// Return the zero-based line number of the line containing the specified UTF-8 offset. - /// Newline characters count as part of the preceding line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToLine))] - pub fn utf8_to_line(&self, byte_number: usize) -> usize { - self.utf8_to_line.rank(byte_number) + /// UTF-32 offsets for the beginning and end of a line, including the newline if any. + pub fn line_to_chars(&self, line_number: usize) -> Range { + self.utf8s_to_chars(self.line_to_utf8s(line_number)) + } + + /// UTF-32 offsets for the beginning and end of a range of lines, including the newline if any. + pub fn lines_to_chars(&self, line_numbers: Range) -> Range { + self.utf8s_to_chars(self.lines_to_utf8s(line_numbers)) } /// Converts a UTF-8 offset to a zero-based line number and UTF-32 offset within the @@ -246,31 +270,31 @@ impl StringOffsets { } } - /// Converts a UTF-8 offset to a zero-based line number and UTF-16 offset within the - /// line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16Pos))] - pub fn utf8_to_utf16_pos(&self, byte_number: usize) -> Pos { - let line = self.utf8_to_line(byte_number); - let line_start_char_number = self.line_to_utf16_begin(line); - let char_idx = self.utf8_to_utf16(byte_number); - Pos { - line, - col: char_idx - line_start_char_number, - } + /// Returns the range of line numbers containing the substring specified by the UTF-32 + /// range `chars`. Newline characters count as part of the preceding line. + pub fn chars_to_lines(&self, chars: Range) -> Range { + self.utf8s_to_lines(self.chars_to_utf8s(chars)) } +} +impl> StringOffsets { + /// Returns true if the specified line is empty except for whitespace. + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = onlyWhitespaces))] + pub fn only_whitespaces(&self, line_number: usize) -> bool { + self.whitespace_only + .get(line_number) + .copied() + .unwrap_or(true) + } +} + +impl> StringOffsets { /// Converts a UTF-8 offset to a UTF-32 offset. #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToChar))] pub fn utf8_to_char(&self, byte_number: usize) -> usize { self.utf8_to_char.rank(byte_number + 1) - 1 } - /// Converts a UTF-8 offset to a UTF-16 offset. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16))] - pub fn utf8_to_utf16(&self, byte_number: usize) -> usize { - self.utf8_to_char(byte_number) + self.utf8_to_utf16.rank(byte_number) - } - /// Converts a UTF-32 offset to a UTF-8 offset. #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = charToUtf8))] pub fn char_to_utf8(&self, char_number: usize) -> usize { @@ -304,67 +328,64 @@ impl StringOffsets { assert!(byte_number < limit); } } -} -impl StringOffsets { - /// UTF-8 offset one past the end of a line (the offset of the start of the next line). - pub fn line_to_utf8s(&self, line_number: usize) -> Range { - self.line_to_utf8_begin(line_number)..self.line_to_utf8_end(line_number) - } - - /// UTF-32 offsets for the beginning and end of a line, including the newline if any. - pub fn line_to_chars(&self, line_number: usize) -> Range { - self.utf8s_to_chars(self.line_to_utf8s(line_number)) + /// Converts a UTF-8 offset range to a UTF-32 offset range. + pub fn utf8s_to_chars(&self, bytes: Range) -> Range { + self.utf8_to_char(bytes.start)..self.utf8_to_char(bytes.end) } - /// UTF-8 offsets for the beginning and end of a range of lines, including the newline if any. - pub fn lines_to_utf8s(&self, line_numbers: Range) -> Range { - self.line_to_utf8_begin(line_numbers.start)..self.line_to_utf8_begin(line_numbers.end) + /// Converts a UTF-32 offset range to a UTF-8 offset range. + pub fn chars_to_utf8s(&self, chars: Range) -> Range { + self.char_to_utf8(chars.start)..self.char_to_utf8(chars.end) } +} - /// UTF-32 offsets for the beginning and end of a range of lines, including the newline if any. - pub fn lines_to_chars(&self, line_numbers: Range) -> Range { - self.utf8s_to_chars(self.lines_to_utf8s(line_numbers)) +impl> StringOffsets { + /// Converts a UTF-8 offset to a UTF-16 offset. + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16))] + pub fn utf8_to_utf16(&self, byte_number: usize) -> usize { + self.utf8_to_char(byte_number) + self.utf8_to_utf16.rank(byte_number) } +} - /// Returns the range of line numbers containing the substring specified by the Rust-style - /// range `bytes`. Newline characters count as part of the preceding line. +impl> StringOffsets { + /// UTF-16 offset of the first character of a line. /// - /// If `bytes` is an empty range at a position within or at the beginning of a line, this - /// returns a nonempty range containing the line number of that one line. An empty range at or - /// beyond the end of the string translates to an empty range of line numbers. - pub fn utf8s_to_lines(&self, bytes: Range) -> Range { - // The fiddly parts of this formula are necessary because `bytes.start` rounds down to the - // beginning of the line, but `bytes.end` "rounds up" to the end of the line. the final - // `+1` is to produce a half-open range. - self.utf8_to_line(bytes.start) - ..self - .lines() - .min(self.utf8_to_line(bytes.end.saturating_sub(1).max(bytes.start)) + 1) - } - - /// Returns the range of line numbers containing the substring specified by the UTF-32 - /// range `chars`. Newline characters count as part of the preceding line. - pub fn chars_to_lines(&self, chars: Range) -> Range { - self.utf8s_to_lines(self.chars_to_utf8s(chars)) + /// That is, return the offset that would point to the start of that line in a UTF-16 + /// representation of the source string. + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16Begin))] + pub fn line_to_utf16_begin(&self, line_number: usize) -> usize { + self.utf8_to_utf16(self.line_to_utf8_begin(line_number)) } - /// Converts a UTF-8 offset range to a UTF-32 offset range. - pub fn utf8s_to_chars(&self, bytes: Range) -> Range { - self.utf8_to_char(bytes.start)..self.utf8_to_char(bytes.end) + /// UTF-16 offset one past the end of a line (the offset of the start of the next line). + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16End))] + pub fn line_to_utf16_end(&self, line_number: usize) -> usize { + self.utf8_to_utf16(self.line_to_utf8_end(line_number)) } - /// Converts a UTF-32 offset range to a UTF-8 offset range. - pub fn chars_to_utf8s(&self, chars: Range) -> Range { - self.char_to_utf8(chars.start)..self.char_to_utf8(chars.end) + /// Converts a UTF-8 offset to a zero-based line number and UTF-16 offset within the + /// line. + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16Pos))] + pub fn utf8_to_utf16_pos(&self, byte_number: usize) -> Pos { + let line = self.utf8_to_line(byte_number); + let line_start_char_number = self.line_to_utf16_begin(line); + let char_idx = self.utf8_to_utf16(byte_number); + Pos { + line, + col: char_idx - line_start_char_number, + } } } -fn new_converter(content: &[u8]) -> StringOffsets { +fn new_converter(content: &[u8]) -> StringOffsets { let n = content.len(); - let mut utf8_builder = BitRankBuilder::with_capacity(n + 1); - let mut utf16_builder = BitRankBuilder::with_capacity(n + 1); - let mut line_builder = BitRankBuilder::with_capacity(n + 1); + let mut utf8_builder = + BitRankBuilder::with_capacity(if C::HasChars::VALUE { n + 1 } else { 0 }); + let mut utf16_builder = + BitRankBuilder::with_capacity(if C::HasUtf16::VALUE { n + 1 } else { 0 }); + let mut line_builder = + BitRankBuilder::with_capacity(if C::HasLines::VALUE { n + 1 } else { 0 }); let mut line_begins = vec![0]; let mut whitespace_only = vec![]; let mut only_whitespaces = true; // true if all characters in the current line are whitespaces. @@ -373,26 +394,36 @@ fn new_converter(content: &[u8]) -> StringOffsets { // In this case, we just treat the single byte character. // In principle, a single incorrect byte can break the whole decoding... let c = content[i]; - if is_char_boundary(c) { + if C::HasChars::VALUE && is_char_boundary(c) { utf8_builder.push(i); } - if two_utf16(c) { + if C::HasUtf16::VALUE && two_utf16(c) { utf16_builder.push(i); } if c == b'\n' { - whitespace_only.push(only_whitespaces); - line_begins.push(i as u32 + 1); - line_builder.push(i); - only_whitespaces = true; // reset for next line. - } else { - only_whitespaces &= matches!(c, b'\t' | b'\r' | b' '); + if C::HasWhitespace::VALUE { + whitespace_only.push(only_whitespaces); + only_whitespaces = true; // reset for next line. + } + if C::HasLines::VALUE { + line_begins.push(i as u32 + 1); + line_builder.push(i); + } + } else if C::HasWhitespace::VALUE { + only_whitespaces = only_whitespaces && matches!(c, b'\t' | b'\r' | b' '); } } - utf8_builder.push(n); + if C::HasChars::VALUE { + utf8_builder.push(n); + } if line_begins.last() != Some(&(n as u32)) { - whitespace_only.push(only_whitespaces); - line_begins.push(n as u32); - line_builder.push(n - 1); + if C::HasWhitespace::VALUE { + whitespace_only.push(only_whitespaces); + } + if C::HasLines::VALUE { + line_begins.push(n as u32); + line_builder.push(n - 1); + } } StringOffsets { @@ -401,6 +432,7 @@ fn new_converter(content: &[u8]) -> StringOffsets { whitespace_only, utf8_to_char: utf8_builder.finish(), utf8_to_utf16: utf16_builder.finish(), + _config: PhantomData, } } @@ -472,7 +504,7 @@ mod tests { let content = r#"a short line. followed by another one. no terminating newline!"#; - let lines = StringOffsets::new(content); + let lines = StringOffsets::::new(content); assert_eq!(lines.line_to_utf8s(0), 0..14); assert_eq!(&content[0..14], "a short line.\n"); assert_eq!(lines.line_to_utf8s(1), 14..39); @@ -518,7 +550,7 @@ no terminating newline!"#; fn test_convert_ascii() { let content = r#"line0 line1"#; - let lines = StringOffsets::new(content); + let lines = StringOffsets::::new(content); assert_eq!(lines.utf8_to_char_pos(0), pos(0, 0)); assert_eq!(lines.utf8_to_char_pos(1), pos(0, 1)); assert_eq!(lines.utf8_to_char_pos(6), pos(1, 0)); @@ -531,7 +563,7 @@ line1"#; let content = r#"❤️ line0 line1 ✅ line2"#; - let lines = StringOffsets::new(content); + let lines = StringOffsets::::new(content); assert_eq!(lines.utf8_to_char_pos(0), pos(0, 0)); // ❤️ takes 6 bytes to represent in utf8 (2 code points) assert_eq!(lines.utf8_to_char_pos(1), pos(0, 0)); assert_eq!(lines.utf8_to_char_pos(2), pos(0, 0)); @@ -562,7 +594,7 @@ line1 fn test_small() { // Á - 2 bytes utf8 let content = r#"❤️ line0 ❤️Á 👋"#; - let lines = StringOffsets::new(content); + let lines = StringOffsets::::new(content); let mut utf16_index = 0; let mut char_index = 0; for (byte_index, char) in content.char_indices() { @@ -582,7 +614,7 @@ line1 // ^~~~ utf8: 1 char, 1 byte, utf16: 1 code unit // ^~~~~ utf8: 1 char, 2 bytes, utf16: 1 code unit // ^~~~~~ utf8: 2 chars, 3 byte ea., utf16: 2 code units - let lines = StringOffsets::new(content); + let lines = StringOffsets::::new(content); // UTF-16 positions assert_eq!(lines.utf8_to_utf16_pos(0), pos(0, 0)); // ❤️ @@ -628,7 +660,7 @@ line1 #[test] fn test_critical_input_len() { let content = [b'a'; 16384]; - let lines = StringOffsets::from_bytes(&content); + let lines = StringOffsets::::from_bytes(&content); assert_eq!(lines.utf8_to_utf16_pos(16384), pos(1, 0)); } } From 897314383ef0a7275322f5d24671008c30d68706 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 26 Mar 2025 08:55:28 +0100 Subject: [PATCH 031/114] linter and comments --- .../string-offsets/benchmarks/Cargo.toml.bak | 14 ------------- .../string-offsets/benchmarks/performance.rs | 10 ++-------- crates/string-offsets/src/lib.rs | 20 +++++++++++-------- 3 files changed, 14 insertions(+), 30 deletions(-) delete mode 100644 crates/string-offsets/benchmarks/Cargo.toml.bak diff --git a/crates/string-offsets/benchmarks/Cargo.toml.bak b/crates/string-offsets/benchmarks/Cargo.toml.bak deleted file mode 100644 index 780e49e..0000000 --- a/crates/string-offsets/benchmarks/Cargo.toml.bak +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "string-offsets-benchmarks" -edition = "2021" - -[[bench]] -name = "performance" -path = "performance.rs" -harness = false -test = false - -[dependencies] -bpe = { path = "../../string-offsets" } -criterion = "0.5" -rand = "0.9" \ No newline at end of file diff --git a/crates/string-offsets/benchmarks/performance.rs b/crates/string-offsets/benchmarks/performance.rs index 25a45c3..04da9bd 100644 --- a/crates/string-offsets/benchmarks/performance.rs +++ b/crates/string-offsets/benchmarks/performance.rs @@ -3,18 +3,12 @@ use rand::{rng, Rng}; use string_offsets::StringOffsets; fn construction_benchmark(c: &mut Criterion) { - // Generate random input string let mut group = c.benchmark_group("construction"); for size in [1000, 10000, 100000] { let mut rng = rng(); - let random_input: String = (0..size).map(|_| rng.random::() as char).collect(); - - // Create benchmark group for throughput measurement - - // Set throughput based on input size in bytes + // Generate random ascii input. + let random_input: String = (0..size).map(|_| rng.random_range(32u8..128) as char).collect(); group.throughput(criterion::Throughput::Bytes(random_input.len() as u64)); - - // Run the benchmark group.bench_with_input( BenchmarkId::from_parameter(size), &random_input, diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 89f8765..93c1b32 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -95,12 +95,14 @@ pub struct StringOffsets { /// the byte belongs. utf8_to_line: BitRank, - /// Encoded bitrank where the rank of a byte position corresponds to the char position to which + /// Encoded bitrank where the start of a utf8 code point is marked with a 1 bit. + /// The rank of a byte position + 1 corresponds to the char position + 1 to which /// the byte belongs. utf8_to_char: BitRank, - /// Encoded bitrank where the rank of a byte position corresponds to the UTF-16 encoded word - /// position to which the byte belongs. + /// Encoded bitrank where a multi word utf16 code point is marked with a 1 bit. + /// Converting a byte position into a utf16 word position is achieved by combining utf8_to_char + /// and utf8_to_utf16 rank information. utf8_to_utf16: BitRank, /// Marks, for every line, whether it consists only of whitespace characters. @@ -149,6 +151,11 @@ impl StringOffsets { self.line_begins.last().copied().unwrap_or(0) as usize } + /// Returns whether there are no bytes in the string. + pub fn is_empty(&self) -> bool { + self.line_begins.is_empty() + } + /// Create a new converter to work with offsets into the given byte-string. /// /// If `content` is UTF-8, this is just like [`StringOffsets::new`]. Otherwise, the @@ -368,11 +375,8 @@ fn new_converter(content: &[u8]) -> StringOffsets { let mut line_begins = vec![0]; let mut whitespace_only = vec![]; let mut only_whitespaces = true; // true if all characters in the current line are whitespaces. - for i in 0..content.len() { - // In case of invalid utf8, we might get a utf8_len of 0. - // In this case, we just treat the single byte character. - // In principle, a single incorrect byte can break the whole decoding... - let c = content[i]; + for (i, &c) in content.into_iter().enumerate() { + // Note: We expect here proper utf8 encoded strings! Otherwise, the conversion will have undefined behaviour. if is_char_boundary(c) { utf8_builder.push(i); } From 4ced85b20c4f51bb4298823354cfecc7dcc87331 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 26 Mar 2025 08:57:08 +0100 Subject: [PATCH 032/114] Update lib.rs --- crates/string-offsets/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 93c1b32..ad3a26a 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -370,8 +370,8 @@ impl StringOffsets { fn new_converter(content: &[u8]) -> StringOffsets { let n = content.len(); let mut utf8_builder = BitRankBuilder::with_capacity(n + 1); - let mut utf16_builder = BitRankBuilder::with_capacity(n + 1); - let mut line_builder = BitRankBuilder::with_capacity(n + 1); + let mut utf16_builder = BitRankBuilder::with_capacity(n); + let mut line_builder = BitRankBuilder::with_capacity(n); let mut line_begins = vec![0]; let mut whitespace_only = vec![]; let mut only_whitespaces = true; // true if all characters in the current line are whitespaces. From ae3ada65f0a9fef0298b1b101b37d7eeffee316c Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 26 Mar 2025 09:08:10 +0100 Subject: [PATCH 033/114] simplify bitrank --- crates/string-offsets/src/bitrank.rs | 62 ++++++++-------------------- 1 file changed, 18 insertions(+), 44 deletions(-) diff --git a/crates/string-offsets/src/bitrank.rs b/crates/string-offsets/src/bitrank.rs index 73d62ad..8e685b5 100644 --- a/crates/string-offsets/src/bitrank.rs +++ b/crates/string-offsets/src/bitrank.rs @@ -6,9 +6,9 @@ type SubblockBits = u128; // Static sizing of the various components of the data structure. -const BITS_PER_BLOCK: usize = 16384; const BITS_PER_SUB_BLOCK: usize = SubblockBits::BITS as usize; -const SUB_BLOCKS_PER_BLOCK: usize = BITS_PER_BLOCK / BITS_PER_SUB_BLOCK; +const SUB_BLOCKS_PER_BLOCK: usize = 64; +const BITS_PER_BLOCK: usize = SUB_BLOCKS_PER_BLOCK * BITS_PER_SUB_BLOCK; // 8192 Bits = 1 kBytes /// A container for a portion of the total bit vector and the associated indices. /// The bits within each chunk are stored from most significant bit (msb) to least significant bit (lsb). @@ -47,7 +47,7 @@ impl Block { debug_assert!(index < BITS_PER_BLOCK); let chunk_idx = index / BITS_PER_SUB_BLOCK; let bit_idx = index % BITS_PER_SUB_BLOCK; - let mask = 1 << ((BITS_PER_SUB_BLOCK - 1) - bit_idx); + let mask = 1 << bit_idx; debug_assert_eq!(self.bits[chunk_idx] & mask, 0, "toggling bits off indicates that the original data was incorrect, most likely containing duplicate values."); self.bits[chunk_idx] |= mask; } @@ -57,7 +57,7 @@ impl Block { /// chunk, otherwise ['None']. The assumption is that if you would have to look back /// through previous chunks it would actually be cheaper to do a lookup in the original /// data structure that the bit vector was created from. - fn rank_select(&self, local_idx: usize) -> (usize, Option) { + fn rank(&self, local_idx: usize) -> usize { let mut rank = self.rank as usize; let sub_block = local_idx / BITS_PER_SUB_BLOCK; rank += self.sub_blocks[sub_block] as usize; @@ -68,15 +68,9 @@ impl Block { let masked = if remainder == 0 { 0 } else { - self.bits[last_chunk] >> (BITS_PER_SUB_BLOCK - remainder) + self.bits[last_chunk] << (BITS_PER_SUB_BLOCK - remainder) }; - rank += masked.count_ones() as usize; - let select = if masked == 0 { - None - } else { - Some(local_idx - masked.trailing_zeros() as usize - 1) - }; - (rank, select) + rank + masked.count_ones() as usize } fn total_rank(&self) -> usize { @@ -137,7 +131,6 @@ impl BitRankBuilder { } total_rank += local_rank as u64 } - //self.finish_last_block(); BitRank { blocks: self.blocks, } @@ -156,7 +149,12 @@ impl BitRank { /// The (one) rank is defined as: `rank(i) = sum(b[j] for j in 0..i)` /// i.e. the number of elements less than `i`. pub fn rank(&self, idx: usize) -> usize { - self.rank_select(idx).0 + let block_num = idx / BITS_PER_BLOCK; + if block_num >= self.blocks.len() { + self.max_rank() // fall back to 0 bits when the bitrank data structure is empty. + } else { + self.blocks[block_num].rank(idx % BITS_PER_BLOCK) + } } /// Returns the number of elements in the set. @@ -166,25 +164,6 @@ impl BitRank { .map(|b| b.total_rank()) .unwrap_or_default() // fall back to 0 when the bitrank data structure is empty. } - - /// The rank at the specified index(exclusive) and the index of the one bit that - /// establishes that rank (aka "select") **if** it occurs within that same chunk, - /// otherwise ['None']. The assumption is that if you would have to look back - /// through previous chunks it would actually be cheaper to do a lookup in the original - /// data structure that the bit vector was created from. - pub fn rank_select(&self, idx: usize) -> (usize, Option) { - let block_num = idx / BITS_PER_BLOCK; - // assert!(block_num < self.blocks.len(), "index out of bounds"); - if block_num >= self.blocks.len() { - ( - self.max_rank(), // fall back to 0 when the bitrank data structure is empty. - None, - ) - } else { - let (rank, b_idx) = self.blocks[block_num].rank_select(idx % BITS_PER_BLOCK); - (rank, b_idx.map(|i| (block_num * BITS_PER_BLOCK) + i)) - } - } } #[cfg(test)] @@ -257,23 +236,23 @@ mod tests { let mut positions: Vec = (0..132).collect(); positions.append(&mut vec![138usize, 140, 146]); let br = bitrank(147, positions); - assert_eq!(br.rank_select(135), (132, Some(131))); + assert_eq!(br.rank(135), 132); let bits2: Vec = (0..BITS_PER_BLOCK - 5).collect(); let br2 = bitrank(BITS_PER_BLOCK, bits2); - assert_eq!(br2.rank_select(169), (169, Some(168))); + assert_eq!(br2.rank(169), 169); let bits3: Vec = (0..BITS_PER_BLOCK + 5).collect(); let br3 = bitrank(BITS_PER_BLOCK + 6, bits3); - assert_eq!(br3.rank_select(BITS_PER_BLOCK), (BITS_PER_BLOCK, None)); + assert_eq!(br3.rank(BITS_PER_BLOCK), BITS_PER_BLOCK); let bits4: Vec = vec![1, 1000, 9999, BITS_PER_BLOCK + 1]; let br4 = bitrank(BITS_PER_BLOCK + 1, bits4); - assert_eq!(br4.rank_select(10000), (3, Some(9999))); + assert_eq!(br4.rank(10000), 3); let bits5: Vec = vec![1, 1000, 9999, BITS_PER_BLOCK + 1]; let br5 = bitrank(BITS_PER_BLOCK + 1, bits5); - assert_eq!(br5.rank_select(BITS_PER_BLOCK), (3, None)); + assert_eq!(br5.rank(BITS_PER_BLOCK), 3); } #[test] @@ -290,15 +269,10 @@ mod tests { random_bits.dedup(); let br = bitrank(1_000_000, random_bits.iter().copied()); let mut rank = 0; - let mut select = None; for i in 0..random_bits.capacity() { - if i % BITS_PER_SUB_BLOCK == 0 { - select = None; - } - assert_eq!(br.rank_select(i), (rank, select)); + assert_eq!(br.rank(i), rank); if i == random_bits[rank] { rank += 1; - select = Some(i); } } } From 7682f55e57c7c55a9eb9bab9e4e02d6d31038b64 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 26 Mar 2025 09:08:56 +0100 Subject: [PATCH 034/114] Update performance.rs --- crates/string-offsets/benchmarks/performance.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/string-offsets/benchmarks/performance.rs b/crates/string-offsets/benchmarks/performance.rs index 04da9bd..11859d7 100644 --- a/crates/string-offsets/benchmarks/performance.rs +++ b/crates/string-offsets/benchmarks/performance.rs @@ -7,7 +7,9 @@ fn construction_benchmark(c: &mut Criterion) { for size in [1000, 10000, 100000] { let mut rng = rng(); // Generate random ascii input. - let random_input: String = (0..size).map(|_| rng.random_range(32u8..128) as char).collect(); + let random_input: String = (0..size) + .map(|_| rng.random_range(32u8..128) as char) + .collect(); group.throughput(criterion::Throughput::Bytes(random_input.len() as u64)); group.bench_with_input( BenchmarkId::from_parameter(size), From fa6974789c299f95a749aeb104aa71738468a6e3 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 26 Mar 2025 09:20:13 +0100 Subject: [PATCH 035/114] small fixes --- crates/string-offsets/src/bitrank.rs | 6 +++--- crates/string-offsets/src/config.rs | 4 ++++ crates/string-offsets/src/lib.rs | 6 ++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/crates/string-offsets/src/bitrank.rs b/crates/string-offsets/src/bitrank.rs index 8e685b5..3461a4b 100644 --- a/crates/string-offsets/src/bitrank.rs +++ b/crates/string-offsets/src/bitrank.rs @@ -246,11 +246,11 @@ mod tests { let br3 = bitrank(BITS_PER_BLOCK + 6, bits3); assert_eq!(br3.rank(BITS_PER_BLOCK), BITS_PER_BLOCK); - let bits4: Vec = vec![1, 1000, 9999, BITS_PER_BLOCK + 1]; + let bits4: Vec = vec![1, 1000, 7777, BITS_PER_BLOCK + 1]; let br4 = bitrank(BITS_PER_BLOCK + 1, bits4); - assert_eq!(br4.rank(10000), 3); + assert_eq!(br4.rank(8000), 3); - let bits5: Vec = vec![1, 1000, 9999, BITS_PER_BLOCK + 1]; + let bits5: Vec = vec![1, 1000, 7777, BITS_PER_BLOCK + 1]; let br5 = bitrank(BITS_PER_BLOCK + 1, bits5); assert_eq!(br5.rank(BITS_PER_BLOCK), 3); } diff --git a/crates/string-offsets/src/config.rs b/crates/string-offsets/src/config.rs index bd46407..1969f12 100644 --- a/crates/string-offsets/src/config.rs +++ b/crates/string-offsets/src/config.rs @@ -1,3 +1,7 @@ +//! Configuration types for enabling/disabling features are compile time. +//! +//! By disabling features, the compiler can generate faster code which can be important for certain use cases. +//! Certain implementations/conversion operations will only be available if the corresponding features were enabled. /// Type-level boolean. pub trait Bool { diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index a09bedb..8972b84 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -389,10 +389,8 @@ fn new_converter(content: &[u8]) -> StringOffsets { let n = content.len(); let mut utf8_builder = BitRankBuilder::with_capacity(if C::HasChars::VALUE { n + 1 } else { 0 }); - let mut utf16_builder = - BitRankBuilder::with_capacity(if C::HasUtf16::VALUE { n } else { 0 }); - let mut line_builder = - BitRankBuilder::with_capacity(if C::HasLines::VALUE { n } else { 0 }); + let mut utf16_builder = BitRankBuilder::with_capacity(if C::HasUtf16::VALUE { n } else { 0 }); + let mut line_builder = BitRankBuilder::with_capacity(if C::HasLines::VALUE { n } else { 0 }); let mut line_begins = vec![0]; let mut whitespace_only = vec![]; let mut only_whitespaces = true; // true if all characters in the current line are whitespaces. From aef9a5d9589e114b61509435c70a96510b5a1b0d Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 26 Mar 2025 09:21:51 +0100 Subject: [PATCH 036/114] fix lint/test --- crates/string-offsets/src/bitrank.rs | 6 +++--- crates/string-offsets/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/string-offsets/src/bitrank.rs b/crates/string-offsets/src/bitrank.rs index 8e685b5..3461a4b 100644 --- a/crates/string-offsets/src/bitrank.rs +++ b/crates/string-offsets/src/bitrank.rs @@ -246,11 +246,11 @@ mod tests { let br3 = bitrank(BITS_PER_BLOCK + 6, bits3); assert_eq!(br3.rank(BITS_PER_BLOCK), BITS_PER_BLOCK); - let bits4: Vec = vec![1, 1000, 9999, BITS_PER_BLOCK + 1]; + let bits4: Vec = vec![1, 1000, 7777, BITS_PER_BLOCK + 1]; let br4 = bitrank(BITS_PER_BLOCK + 1, bits4); - assert_eq!(br4.rank(10000), 3); + assert_eq!(br4.rank(8000), 3); - let bits5: Vec = vec![1, 1000, 9999, BITS_PER_BLOCK + 1]; + let bits5: Vec = vec![1, 1000, 7777, BITS_PER_BLOCK + 1]; let br5 = bitrank(BITS_PER_BLOCK + 1, bits5); assert_eq!(br5.rank(BITS_PER_BLOCK), 3); } diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index ad3a26a..30b8766 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -375,7 +375,7 @@ fn new_converter(content: &[u8]) -> StringOffsets { let mut line_begins = vec![0]; let mut whitespace_only = vec![]; let mut only_whitespaces = true; // true if all characters in the current line are whitespaces. - for (i, &c) in content.into_iter().enumerate() { + for (i, &c) in content.iter().enumerate() { // Note: We expect here proper utf8 encoded strings! Otherwise, the conversion will have undefined behaviour. if is_char_boundary(c) { utf8_builder.push(i); From 9e2f0e43ce354fbe24ec01465017caae230edb66 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 26 Mar 2025 09:50:11 +0100 Subject: [PATCH 037/114] move wasm into a separate file (and wrap things) --- crates/string-offsets/src/config.rs | 2 +- crates/string-offsets/src/lib.rs | 30 ++-------- crates/string-offsets/src/wasm.rs | 90 +++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 25 deletions(-) create mode 100644 crates/string-offsets/src/wasm.rs diff --git a/crates/string-offsets/src/config.rs b/crates/string-offsets/src/config.rs index 1969f12..33b99a4 100644 --- a/crates/string-offsets/src/config.rs +++ b/crates/string-offsets/src/config.rs @@ -1,5 +1,5 @@ //! Configuration types for enabling/disabling features are compile time. -//! +//! //! By disabling features, the compiler can generate faster code which can be important for certain use cases. //! Certain implementations/conversion operations will only be available if the corresponding features were enabled. diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 8972b84..cb617fc 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -26,17 +26,19 @@ use std::{marker::PhantomData, ops::Range}; +#[cfg(feature = "wasm")] +use wasm_bindgen::prelude::*; + mod bitrank; mod config; +#[cfg(feature = "wasm")] +mod wasm; use bitrank::{BitRank, BitRankBuilder}; use config::{Bool, ConfigType, True}; pub use config::{AllConfig, OnlyLines}; -#[cfg(feature = "wasm")] -use wasm_bindgen::prelude::*; - /// Converts positions within a given string between UTF-8 byte offsets (the usual in Rust), UTF-16 /// code units, Unicode code points, and line numbers. /// @@ -91,7 +93,6 @@ use wasm_bindgen::prelude::*; /// Most operations run in O(1) time. A few require O(log n) time. The memory consumed by this /// data structure is typically less than the memory occupied by the actual content. In the best /// case, it requires ~45% of the content space. -#[cfg_attr(feature = "wasm", wasm_bindgen)] pub struct StringOffsets { /// Vector storing, for every line, the byte position at which the line starts. line_begins: Vec, @@ -146,10 +147,8 @@ pub struct Pos { // Question: Consider whether we should return an empty line range in this case which would // probably be consistent from a mathematical point of view. But then we should also return empty // line ranges for empty character ranges in the middle of a line... -#[cfg_attr(feature = "wasm", wasm_bindgen)] impl StringOffsets { /// Create a new converter to work with offsets into the given string. - #[cfg_attr(feature = "wasm", wasm_bindgen(constructor))] pub fn new(content: &str) -> Self { new_converter(content.as_bytes()) } @@ -158,8 +157,6 @@ impl StringOffsets { /// /// If `content` is UTF-8, this is just like [`StringOffsets::new`]. Otherwise, the /// conversion methods will produce unspecified (but memory-safe) results. - #[allow(unused_variables)] - #[cfg_attr(feature = "wasm", wasm_bindgen(static_method_of = StringOffsets))] pub fn from_bytes(content: &[u8]) -> Self { new_converter(content) } @@ -177,7 +174,6 @@ impl> StringOffsets { } /// Returns the number of lines in the string. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lines))] pub fn lines(&self) -> usize { self.line_begins.len() - 1 } @@ -186,20 +182,17 @@ impl> StringOffsets { /// /// If `line_number` is greater than or equal to the number of lines in the text, this returns /// the length of the string. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8Begin))] pub fn line_to_utf8_begin(&self, line_number: usize) -> usize { self.line_begins[line_number.min(self.lines())] as usize } /// UTF-8 offset of the first character of a line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8End))] pub fn line_to_utf8_end(&self, line_number: usize) -> usize { self.line_to_utf8_begin(line_number + 1) } /// Return the zero-based line number of the line containing the specified UTF-8 offset. /// Newline characters count as part of the preceding line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToLine))] pub fn utf8_to_line(&self, byte_number: usize) -> usize { self.utf8_to_line.rank(byte_number) } @@ -233,7 +226,6 @@ impl> StringOffsets { impl> StringOffsets { /// Returns the number of Unicode characters on the specified line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineChars))] pub fn line_chars(&self, line_number: usize) -> usize { let r = self.utf8s_to_chars(self.line_to_utf8s(line_number)); r.end - r.start @@ -243,13 +235,11 @@ impl> StringOffsets { /// /// That is, return the offset that would point to the start of that line in a UTF-32 /// representation of the source string. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharBegin))] pub fn line_to_char_begin(&self, line_number: usize) -> usize { self.utf8_to_char(self.line_to_utf8_begin(line_number)) } /// UTF-32 offset one past the end of a line (the offset of the start of the next line). - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharEnd))] pub fn line_to_char_end(&self, line_number: usize) -> usize { self.utf8_to_char(self.line_to_utf8_end(line_number)) } @@ -266,7 +256,6 @@ impl> StringOffsets { /// Converts a UTF-8 offset to a zero-based line number and UTF-32 offset within the /// line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToCharPos))] pub fn utf8_to_char_pos(&self, byte_number: usize) -> Pos { let line = self.utf8_to_line(byte_number); let line_start_char_number = self.line_to_char_begin(line); @@ -286,7 +275,6 @@ impl> StringOffsets { impl> StringOffsets { /// Returns true if the specified line is empty except for whitespace. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = onlyWhitespaces))] pub fn only_whitespaces(&self, line_number: usize) -> bool { self.whitespace_only .get(line_number) @@ -297,13 +285,11 @@ impl> StringOffsets { impl> StringOffsets { /// Converts a UTF-8 offset to a UTF-32 offset. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToChar))] pub fn utf8_to_char(&self, byte_number: usize) -> usize { self.utf8_to_char.rank(byte_number + 1) - 1 } /// Converts a UTF-32 offset to a UTF-8 offset. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = charToUtf8))] pub fn char_to_utf8(&self, char_number: usize) -> usize { let mut byte_number = char_number; for _ in 0..128 { @@ -349,7 +335,6 @@ impl> StringOffsets { impl> StringOffsets { /// Converts a UTF-8 offset to a UTF-16 offset. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16))] pub fn utf8_to_utf16(&self, byte_number: usize) -> usize { self.utf8_to_char(byte_number) + self.utf8_to_utf16.rank(byte_number) } @@ -360,20 +345,17 @@ impl> StringOff /// /// That is, return the offset that would point to the start of that line in a UTF-16 /// representation of the source string. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16Begin))] pub fn line_to_utf16_begin(&self, line_number: usize) -> usize { self.utf8_to_utf16(self.line_to_utf8_begin(line_number)) } /// UTF-16 offset one past the end of a line (the offset of the start of the next line). - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16End))] pub fn line_to_utf16_end(&self, line_number: usize) -> usize { self.utf8_to_utf16(self.line_to_utf8_end(line_number)) } /// Converts a UTF-8 offset to a zero-based line number and UTF-16 offset within the /// line. - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16Pos))] pub fn utf8_to_utf16_pos(&self, byte_number: usize) -> Pos { let line = self.utf8_to_line(byte_number); let line_start_char_number = self.line_to_utf16_begin(line); @@ -394,7 +376,7 @@ fn new_converter(content: &[u8]) -> StringOffsets { let mut line_begins = vec![0]; let mut whitespace_only = vec![]; let mut only_whitespaces = true; // true if all characters in the current line are whitespaces. - for (i, &c) in content.into_iter().enumerate() { + for (i, &c) in content.iter().enumerate() { // Note: We expect here proper utf8 encoded strings! Otherwise, the conversion will have undefined behaviour. if C::HasChars::VALUE && is_char_boundary(c) { utf8_builder.push(i); diff --git a/crates/string-offsets/src/wasm.rs b/crates/string-offsets/src/wasm.rs new file mode 100644 index 0000000..95ce77d --- /dev/null +++ b/crates/string-offsets/src/wasm.rs @@ -0,0 +1,90 @@ +use wasm_bindgen::prelude::*; + +use crate::{AllConfig, Pos, StringOffsets as StringOffsetsImpl}; + +#[cfg_attr(feature = "wasm", wasm_bindgen)] +pub struct StringOffsets(StringOffsetsImpl); + +#[cfg_attr(feature = "wasm", wasm_bindgen)] +impl StringOffsets { + #[cfg_attr(feature = "wasm", wasm_bindgen(constructor))] + pub fn new(content: &str) -> Self { + Self(StringOffsetsImpl::new(content)) + } + + #[allow(unused_variables)] + #[cfg_attr(feature = "wasm", wasm_bindgen(static_method_of = StringOffsets))] + pub fn from_bytes(content: &[u8]) -> Self { + Self(StringOffsetsImpl::from_bytes(content)) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lines))] + pub fn lines(&self) -> usize { + self.0.lines() + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8Begin))] + pub fn line_to_utf8_begin(&self, line_number: usize) -> usize { + self.0.line_to_utf8_begin(line_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8End))] + pub fn line_to_utf8_end(&self, line_number: usize) -> usize { + self.0.line_to_utf8_end(line_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToLine))] + pub fn utf8_to_line(&self, byte_number: usize) -> usize { + self.0.utf8_to_line(byte_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineChars))] + pub fn line_chars(&self, line_number: usize) -> usize { + self.0.line_chars(line_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharBegin))] + pub fn line_to_char_begin(&self, line_number: usize) -> usize { + self.0.line_to_char_begin(line_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharEnd))] + pub fn line_to_char_end(&self, line_number: usize) -> usize { + self.0.line_to_char_end(line_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToCharPos))] + pub fn utf8_to_char_pos(&self, byte_number: usize) -> Pos { + self.0.utf8_to_char_pos(byte_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToChar))] + pub fn utf8_to_char(&self, byte_number: usize) -> usize { + self.0.utf8_to_char(byte_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = charToUtf8))] + pub fn char_to_utf8(&self, char_number: usize) -> usize { + self.0.char_to_utf8(char_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16))] + pub fn utf8_to_utf16(&self, byte_number: usize) -> usize { + self.0.utf8_to_utf16(byte_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16Begin))] + pub fn line_to_utf16_begin(&self, line_number: usize) -> usize { + self.0.line_to_utf16_begin(line_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16End))] + pub fn line_to_utf16_end(&self, line_number: usize) -> usize { + self.0.line_to_utf16_end(line_number) + } + + #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16Pos))] + pub fn utf8_to_utf16_pos(&self, byte_number: usize) -> Pos { + self.0.utf8_to_utf16_pos(byte_number) + } +} From 1ecea60155e5c95e65b0242ce50caea9d07847a7 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Fri, 28 Mar 2025 09:44:36 +0100 Subject: [PATCH 038/114] address all review comments --- .cargo/config.toml | 14 ++++++ crates/string-offsets/src/bitrank.rs | 70 +++++++++++++--------------- crates/string-offsets/src/lib.rs | 20 ++++---- crates/string-offsets/src/wasm.rs | 49 +++++++------------ 4 files changed, 76 insertions(+), 77 deletions(-) create mode 100644 .cargo/config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..81cc4ef --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,14 @@ +# Consider adding "--codegen=link-args=-Wl,--compress-debug-sections=zlib" + +[target.x86_64-unknown-linux-gnu] +# SSE3 is requred by simd-varint. +# POPCNT makes `count_ones` (which we use in geofilter and bitrank) more efficient. +rustflags = ["-C", "target-feature=+ssse3,+avx2,+popcnt"] + +[target.x86_64-apple-darwin] +# SSE3 is requred by simd-varint. +# POPCNT makes `count_ones` (which we use in geofilter and bitrank) more efficient. +rustflags = ["-C", "target-feature=+ssse3,+avx2,+popcnt"] + +[target.aarch64-apple-darwin] +rustflags = ["-C", "target-feature=+neon"] diff --git a/crates/string-offsets/src/bitrank.rs b/crates/string-offsets/src/bitrank.rs index 3461a4b..8acc3c4 100644 --- a/crates/string-offsets/src/bitrank.rs +++ b/crates/string-offsets/src/bitrank.rs @@ -40,9 +40,6 @@ struct Block { impl Block { /// Set a bit without updating `self.sub_blocks`. - /// - /// This panics if the bit was already set, because that indicates that the original positions - /// list is invalid/had duplicates. fn set(&mut self, index: usize) { debug_assert!(index < BITS_PER_BLOCK); let chunk_idx = index / BITS_PER_SUB_BLOCK; @@ -52,11 +49,7 @@ impl Block { self.bits[chunk_idx] |= mask; } - /// The **total rank** of the block relative local index, and the index of the one - /// bit that establishes that rank (aka "select") **if** it occurs within that same - /// chunk, otherwise ['None']. The assumption is that if you would have to look back - /// through previous chunks it would actually be cheaper to do a lookup in the original - /// data structure that the bit vector was created from. + /// The **total rank** of the block relative local index. fn rank(&self, local_idx: usize) -> usize { let mut rank = self.rank as usize; let sub_block = local_idx / BITS_PER_SUB_BLOCK; @@ -65,11 +58,7 @@ impl Block { let remainder = local_idx % BITS_PER_SUB_BLOCK; let last_chunk = local_idx / BITS_PER_SUB_BLOCK; - let masked = if remainder == 0 { - 0 - } else { - self.bits[last_chunk] << (BITS_PER_SUB_BLOCK - remainder) - }; + let masked = self.bits[last_chunk] & !(SubblockBits::MAX << remainder); rank + masked.count_ones() as usize } @@ -176,42 +165,52 @@ mod tests { /// Creates a `BitRank` containing the integers in `iter` (which should be strictly /// increasing). - pub fn bitrank>(capacity: usize, iter: I) -> BitRank { - let mut builder = BitRankBuilder::with_capacity(capacity); - for position in iter { - builder.push(position); + pub fn bitrank(iter: I) -> BitRank + where + I: IntoIterator, + I::IntoIter: DoubleEndedIterator, + { + let mut iter = iter.into_iter().rev(); + if let Some(last) = iter.next() { + let mut builder = BitRankBuilder::with_capacity(last + 1); + builder.push(last); + for position in iter { + builder.push(position); + } + builder.finish() + } else { + BitRank { blocks: vec![] } } - builder.finish() } #[test] fn test_rank_zero() { - let br = bitrank(1, [0]); + let br = bitrank([0]); assert_eq!(br.rank(0), 0); assert_eq!(br.rank(1), 1); } #[test] fn test_empty() { - let br = bitrank(0, []); + let br = bitrank([]); assert!(br.blocks.is_empty()); } #[test] fn test_index_out_of_bounds() { - let br = bitrank(BITS_PER_BLOCK, [BITS_PER_BLOCK - 1]); + let br = bitrank([BITS_PER_BLOCK - 1]); assert_eq!(br.rank(BITS_PER_BLOCK), 1); } #[test] #[should_panic] fn test_duplicate_position() { - bitrank(91, [64, 66, 68, 68, 90]); + bitrank([64, 66, 68, 68, 90]); } #[test] fn test_rank_exclusive() { - let br = bitrank(133, 0..132); + let br = bitrank(0..132); assert_eq!(br.blocks.len(), 1); assert_eq!(br.rank(64), 64); assert_eq!(br.rank(132), 132); @@ -221,13 +220,13 @@ mod tests { fn test_rank() { let mut positions: Vec = (0..132).collect(); positions.append(&mut vec![138usize, 140, 146]); - let br = bitrank(146, positions); + let br = bitrank(positions); assert_eq!(br.rank(135), 132); - let br2 = bitrank(BITS_PER_BLOCK, 0..BITS_PER_BLOCK - 5); + let br2 = bitrank(0..BITS_PER_BLOCK - 5); assert_eq!(br2.rank(169), 169); - let br3 = bitrank(BITS_PER_BLOCK + 6, 0..BITS_PER_BLOCK + 5); + let br3 = bitrank(0..BITS_PER_BLOCK + 5); assert_eq!(br3.rank(BITS_PER_BLOCK), BITS_PER_BLOCK); } @@ -235,23 +234,23 @@ mod tests { fn test_rank_idx() { let mut positions: Vec = (0..132).collect(); positions.append(&mut vec![138usize, 140, 146]); - let br = bitrank(147, positions); + let br = bitrank(positions); assert_eq!(br.rank(135), 132); let bits2: Vec = (0..BITS_PER_BLOCK - 5).collect(); - let br2 = bitrank(BITS_PER_BLOCK, bits2); + let br2 = bitrank(bits2); assert_eq!(br2.rank(169), 169); let bits3: Vec = (0..BITS_PER_BLOCK + 5).collect(); - let br3 = bitrank(BITS_PER_BLOCK + 6, bits3); + let br3 = bitrank(bits3); assert_eq!(br3.rank(BITS_PER_BLOCK), BITS_PER_BLOCK); let bits4: Vec = vec![1, 1000, 7777, BITS_PER_BLOCK + 1]; - let br4 = bitrank(BITS_PER_BLOCK + 1, bits4); + let br4 = bitrank(bits4); assert_eq!(br4.rank(8000), 3); let bits5: Vec = vec![1, 1000, 7777, BITS_PER_BLOCK + 1]; - let br5 = bitrank(BITS_PER_BLOCK + 1, bits5); + let br5 = bitrank(bits5); assert_eq!(br5.rank(BITS_PER_BLOCK), 3); } @@ -267,7 +266,7 @@ mod tests { // This isn't strictly necessary, given that the bit would just be toggled again, but it // ensures that we are meeting the contract. random_bits.dedup(); - let br = bitrank(1_000_000, random_bits.iter().copied()); + let br = bitrank(random_bits.iter().copied()); let mut rank = 0; for i in 0..random_bits.capacity() { assert_eq!(br.rank(i), rank); @@ -282,7 +281,7 @@ mod tests { #[test] fn test_rank_out_of_bounds() { for i in 1..30 { - let br = bitrank(BITS_PER_BLOCK * i, [BITS_PER_BLOCK * i - 1]); + let br = bitrank([BITS_PER_BLOCK * i - 1]); assert_eq!(br.max_rank(), 1); assert_eq!(br.rank(BITS_PER_BLOCK * i - 1), 0); for j in 0..10 { @@ -293,10 +292,7 @@ mod tests { #[test] fn test_large_gap() { - let br = bitrank( - BITS_PER_BLOCK * 16, - (3..4).chain(BITS_PER_BLOCK * 15..BITS_PER_BLOCK * 15 + 17), - ); + let br = bitrank((3..4).chain(BITS_PER_BLOCK * 15..BITS_PER_BLOCK * 15 + 17)); for i in 1..15 { assert_eq!(br.rank(BITS_PER_BLOCK * i), 1); } diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index cb617fc..02a26aa 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -3,10 +3,10 @@ //! # Example //! //! ``` -//! use string_offsets::{StringOffsets, AllConfig}; +//! use string_offsets::StringOffsets; //! //! let s = "☀️hello\n🗺️world\n"; -//! let offsets = StringOffsets::::new(s); +//! let offsets: StringOffsets = StringOffsets::new(s); //! //! // Find offsets where lines begin and end. //! assert_eq!(offsets.line_to_utf8s(0), 0..12); // note: 0-based line numbers @@ -93,7 +93,9 @@ pub use config::{AllConfig, OnlyLines}; /// Most operations run in O(1) time. A few require O(log n) time. The memory consumed by this /// data structure is typically less than the memory occupied by the actual content. In the best /// case, it requires ~45% of the content space. -pub struct StringOffsets { +/// One can reduce memory requirements further by only requesting the necessary features via the +/// configuration type. +pub struct StringOffsets { /// Vector storing, for every line, the byte position at which the line starts. line_begins: Vec, @@ -488,7 +490,7 @@ mod tests { let content = r#"a short line. followed by another one. no terminating newline!"#; - let lines = StringOffsets::::new(content); + let lines: StringOffsets = StringOffsets::new(content); assert_eq!(lines.line_to_utf8s(0), 0..14); assert_eq!(&content[0..14], "a short line.\n"); assert_eq!(lines.line_to_utf8s(1), 14..39); @@ -534,7 +536,7 @@ no terminating newline!"#; fn test_convert_ascii() { let content = r#"line0 line1"#; - let lines = StringOffsets::::new(content); + let lines: StringOffsets = StringOffsets::new(content); assert_eq!(lines.utf8_to_char_pos(0), pos(0, 0)); assert_eq!(lines.utf8_to_char_pos(1), pos(0, 1)); assert_eq!(lines.utf8_to_char_pos(6), pos(1, 0)); @@ -547,7 +549,7 @@ line1"#; let content = r#"❤️ line0 line1 ✅ line2"#; - let lines = StringOffsets::::new(content); + let lines: StringOffsets = StringOffsets::new(content); assert_eq!(lines.utf8_to_char_pos(0), pos(0, 0)); // ❤️ takes 6 bytes to represent in utf8 (2 code points) assert_eq!(lines.utf8_to_char_pos(1), pos(0, 0)); assert_eq!(lines.utf8_to_char_pos(2), pos(0, 0)); @@ -578,7 +580,7 @@ line1 fn test_small() { // Á - 2 bytes utf8 let content = r#"❤️ line0 ❤️Á 👋"#; - let lines = StringOffsets::::new(content); + let lines: StringOffsets = StringOffsets::new(content); let mut utf16_index = 0; let mut char_index = 0; for (byte_index, char) in content.char_indices() { @@ -598,7 +600,7 @@ line1 // ^~~~ utf8: 1 char, 1 byte, utf16: 1 code unit // ^~~~~ utf8: 1 char, 2 bytes, utf16: 1 code unit // ^~~~~~ utf8: 2 chars, 3 byte ea., utf16: 2 code units - let lines = StringOffsets::::new(content); + let lines: StringOffsets = StringOffsets::new(content); // UTF-16 positions assert_eq!(lines.utf8_to_utf16_pos(0), pos(0, 0)); // ❤️ @@ -644,7 +646,7 @@ line1 #[test] fn test_critical_input_len() { let content = [b'a'; 16384]; - let lines = StringOffsets::::from_bytes(&content); + let lines: StringOffsets = StringOffsets::from_bytes(&content); assert_eq!(lines.utf8_to_utf16_pos(16384), pos(1, 0)); } } diff --git a/crates/string-offsets/src/wasm.rs b/crates/string-offsets/src/wasm.rs index 95ce77d..a663865 100644 --- a/crates/string-offsets/src/wasm.rs +++ b/crates/string-offsets/src/wasm.rs @@ -2,89 +2,76 @@ use wasm_bindgen::prelude::*; use crate::{AllConfig, Pos, StringOffsets as StringOffsetsImpl}; -#[cfg_attr(feature = "wasm", wasm_bindgen)] +#[wasm_bindgen] pub struct StringOffsets(StringOffsetsImpl); -#[cfg_attr(feature = "wasm", wasm_bindgen)] +#[wasm_bindgen] +#[allow(non_snake_case)] impl StringOffsets { - #[cfg_attr(feature = "wasm", wasm_bindgen(constructor))] + #[wasm_bindgen(constructor)] pub fn new(content: &str) -> Self { Self(StringOffsetsImpl::new(content)) } #[allow(unused_variables)] - #[cfg_attr(feature = "wasm", wasm_bindgen(static_method_of = StringOffsets))] + #[wasm_bindgen(static_method_of = StringOffsets)] pub fn from_bytes(content: &[u8]) -> Self { Self(StringOffsetsImpl::from_bytes(content)) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lines))] pub fn lines(&self) -> usize { self.0.lines() } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8Begin))] - pub fn line_to_utf8_begin(&self, line_number: usize) -> usize { + pub fn lineToUtf8Begin(&self, line_number: usize) -> usize { self.0.line_to_utf8_begin(line_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf8End))] - pub fn line_to_utf8_end(&self, line_number: usize) -> usize { + pub fn lineToUtf8End(&self, line_number: usize) -> usize { self.0.line_to_utf8_end(line_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToLine))] - pub fn utf8_to_line(&self, byte_number: usize) -> usize { + pub fn utf8ToLine(&self, byte_number: usize) -> usize { self.0.utf8_to_line(byte_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineChars))] - pub fn line_chars(&self, line_number: usize) -> usize { + pub fn lineChars(&self, line_number: usize) -> usize { self.0.line_chars(line_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharBegin))] - pub fn line_to_char_begin(&self, line_number: usize) -> usize { + pub fn lineToCharBegin(&self, line_number: usize) -> usize { self.0.line_to_char_begin(line_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToCharEnd))] - pub fn line_to_char_end(&self, line_number: usize) -> usize { + pub fn lineToCharEnd(&self, line_number: usize) -> usize { self.0.line_to_char_end(line_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToCharPos))] - pub fn utf8_to_char_pos(&self, byte_number: usize) -> Pos { + pub fn utf8ToCharPos(&self, byte_number: usize) -> Pos { self.0.utf8_to_char_pos(byte_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToChar))] - pub fn utf8_to_char(&self, byte_number: usize) -> usize { + pub fn utf8ToChar(&self, byte_number: usize) -> usize { self.0.utf8_to_char(byte_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = charToUtf8))] - pub fn char_to_utf8(&self, char_number: usize) -> usize { + pub fn charToUtf8(&self, char_number: usize) -> usize { self.0.char_to_utf8(char_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16))] - pub fn utf8_to_utf16(&self, byte_number: usize) -> usize { + pub fn utf8ToUtf16(&self, byte_number: usize) -> usize { self.0.utf8_to_utf16(byte_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16Begin))] - pub fn line_to_utf16_begin(&self, line_number: usize) -> usize { + pub fn lineToUtf16Begin(&self, line_number: usize) -> usize { self.0.line_to_utf16_begin(line_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = lineToUtf16End))] - pub fn line_to_utf16_end(&self, line_number: usize) -> usize { + pub fn lineToUtf16End(&self, line_number: usize) -> usize { self.0.line_to_utf16_end(line_number) } - #[cfg_attr(feature = "wasm", wasm_bindgen(js_name = utf8ToUtf16Pos))] - pub fn utf8_to_utf16_pos(&self, byte_number: usize) -> Pos { + pub fn utf8ToUtf16Pos(&self, byte_number: usize) -> Pos { self.0.utf8_to_utf16_pos(byte_number) } } From 9ae39ed6951aa24e7bbee0a76d25c0dcf148b1db Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Fri, 28 Mar 2025 09:48:14 +0100 Subject: [PATCH 039/114] increment version --- crates/string-offsets/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index 2289dce..05424d4 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "string-offsets" authors = ["The blackbird team "] -version = "0.1.0" +version = "0.2" edition = "2021" description = "Converts string offsets between UTF-8 bytes, UTF-16 code units, Unicode code points, and lines." repository = "https://github.com/github/rust-gems" From c42903940df007109fed4c2ab713f0d6bbf071a8 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Fri, 28 Mar 2025 09:49:54 +0100 Subject: [PATCH 040/114] Update Cargo.toml --- crates/string-offsets/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index 05424d4..40fab03 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "string-offsets" authors = ["The blackbird team "] -version = "0.2" +version = "0.2.0" edition = "2021" description = "Converts string offsets between UTF-8 bytes, UTF-16 code units, Unicode code points, and lines." repository = "https://github.com/github/rust-gems" From 6790989c58a42fb5e011c34ccaeff11965fcea21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 01:08:28 +0000 Subject: [PATCH 041/114] Bump rui314/setup-mold Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from f80524ca6eeaa76759b57fb78ddce5d87a20c720 to e16410e7f8d9e167b74ad5697a9089a35126eb50. - [Commits](https://github.com/rui314/setup-mold/compare/f80524ca6eeaa76759b57fb78ddce5d87a20c720...e16410e7f8d9e167b74ad5697a9089a35126eb50) --- updated-dependencies: - dependency-name: rui314/setup-mold dependency-version: e16410e7f8d9e167b74ad5697a9089a35126eb50 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8b11f46..83b2779 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@f80524ca6eeaa76759b57fb78ddce5d87a20c720 + - uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 - name: Build run: make build @@ -38,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@f80524ca6eeaa76759b57fb78ddce5d87a20c720 + - uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 - name: Check formatting and clippy run: make lint @@ -49,7 +49,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@f80524ca6eeaa76759b57fb78ddce5d87a20c720 + - uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 - name: Run unit tests run: make test From 29fc9417c1baea3594b1f32efdf0e70b299ea02a Mon Sep 17 00:00:00 2001 From: Greg Orzell Date: Mon, 7 Apr 2025 08:51:44 +0200 Subject: [PATCH 042/114] Fix lint. --- crates/bpe/src/bitfield.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bpe/src/bitfield.rs b/crates/bpe/src/bitfield.rs index e90002e..4a0b5fe 100644 --- a/crates/bpe/src/bitfield.rs +++ b/crates/bpe/src/bitfield.rs @@ -8,7 +8,7 @@ impl BitField { /// All bits are initialized to 1. pub(crate) fn new(bits: usize) -> Self { Self { - bitfield: vec![u64::MAX; (bits + 63) / 64], + bitfield: vec![u64::MAX; bits.div_ceil(64)], } } From 6566c1cee4a8878cf3df51ee16bce96c8bb4b6fe Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Mon, 5 May 2025 14:04:34 +0200 Subject: [PATCH 043/114] Add voyage3 model --- crates/bpe-openai/Cargo.toml | 1 + crates/bpe-openai/build.rs | 5 + .../bpe-openai/data/voyage3_base.tiktoken.gz | Bin 0 -> 1137146 bytes crates/bpe-openai/src/lib.rs | 82 ++++++++++++---- crates/bpe-openai/src/normalizer.rs | 56 +++++++++++ crates/bpe/benchmarks/Cargo.toml | 2 +- crates/bpe/benchmarks/equivalence.rs | 89 +++++++++++++----- crates/bpe/benchmarks/lib.rs | 14 ++- crates/bpe/benchmarks/performance.rs | 32 ++++--- 9 files changed, 221 insertions(+), 60 deletions(-) create mode 100644 crates/bpe-openai/data/voyage3_base.tiktoken.gz create mode 100644 crates/bpe-openai/src/normalizer.rs diff --git a/crates/bpe-openai/Cargo.toml b/crates/bpe-openai/Cargo.toml index 3f35ede..acc0493 100644 --- a/crates/bpe-openai/Cargo.toml +++ b/crates/bpe-openai/Cargo.toml @@ -17,6 +17,7 @@ bpe = { version = "0.2.0", path = "../bpe" } either = "1.13" regex-automata = "0.4" rmp-serde = "1" +unicode-normalization = "0.1.20" [dev-dependencies] bpe = { version = "0.2.0", path = "../bpe", features = ["rand"] } diff --git a/crates/bpe-openai/build.rs b/crates/bpe-openai/build.rs index 528eae6..6976e91 100644 --- a/crates/bpe-openai/build.rs +++ b/crates/bpe-openai/build.rs @@ -17,6 +17,11 @@ fn main() { include_bytes!("data/o200k_base.tiktoken.gz"), 17846336922010275747, ); + serialize_tiktoken_bpe( + "voyage3_base", + include_bytes!("data/voyage3_base.tiktoken.gz"), + 17846336922010275747, + ); println!("cargo::rerun-if-changed=build.rs"); } diff --git a/crates/bpe-openai/data/voyage3_base.tiktoken.gz b/crates/bpe-openai/data/voyage3_base.tiktoken.gz new file mode 100644 index 0000000000000000000000000000000000000000..96b3bc6f05e043a8922273324cbdc1c489feff8d GIT binary patch literal 1137146 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

X>e{@?mYzzkqXRS`P5 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

f4 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
  • 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%0D+k$=gVANAZnC=8L&-(eAN(v?KFna8 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%0AU$H`p2tn6AcbY)&s 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

    QX!**vsKnI~rV%f9k!ay+r9m_Ov3|(SUQ(8a(n& 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�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

    k4**V9KR`i$#?JZJ<8j&~L+GRhk$-_CMIY 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%0AeY)(v|}`$fRmR`HobAqV>E@p+2ySCJc+ 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%0D#_y{9#GI?uIp*zr4H4=Xw-Ul2Ftq|Z* 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 Yijy$H;*yee%etdEtPl42FM}=r2bN&vi~s-t literal 0 HcmV?d00001 diff --git a/crates/bpe-openai/src/lib.rs b/crates/bpe-openai/src/lib.rs index 385749e..40b90b4 100644 --- a/crates/bpe-openai/src/lib.rs +++ b/crates/bpe-openai/src/lib.rs @@ -8,6 +8,11 @@ use regex_automata::{ Anchored, Input, }; +pub mod normalizer; + +pub use bpe::*; +pub use normalizer::{Normalizable, NormalizedString}; + // Note: Below we rewrite the negative look-ahead with a positive pseudo look-ahead. // The look-ahead character is dropped from the match by the Pretokenizer iterator. // Note: The negative look-ahead `\\s+(?!\\S)` requires `\\s+\\s` but also `\\s+$` to handle end of file without dropping a character! @@ -18,7 +23,7 @@ static BPE_CL100K_BASE: LazyLock = LazyLock::new(|| { let pat1 = "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}{1,3}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+$"; let pat2 = "\\s+\\s"; let pat3 = "\\s+"; - Tokenizer::new_lookahead(bpe, &[(pat1, false), (pat2, true), (pat3, false)]) + Tokenizer::new_lookahead(bpe, &[(pat1, false), (pat2, true), (pat3, false)], false) .expect("valid regex") }); @@ -35,11 +40,19 @@ static BPE_O200K_BASE: LazyLock = LazyLock::new(|| { ].join("|"); let pat2 = "\\s+\\s"; let pat3 = "\\s+"; - Tokenizer::new_lookahead(bpe, &[(&pat1, false), (pat2, true), (pat3, false)]) + Tokenizer::new_lookahead(bpe, &[(&pat1, false), (pat2, true), (pat3, false)], false) .expect("valid regex") }); -pub use bpe::*; +static BPE_VOYAGE3_BASE: LazyLock = LazyLock::new(|| { + let bytes = include_bytes!(concat!(env!("OUT_DIR"), "/bpe_voyage3_base.dict")); + let bpe = rmp_serde::from_slice(bytes).expect("valid bpe data"); + let pat1 = "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+$"; + let pat2 = "\\s+\\s"; + let pat3 = "\\s+"; + Tokenizer::new_lookahead(bpe, &[(&pat1, false), (pat2, true), (pat3, false)], true) + .expect("valid regex") +}); /// A byte-pair encoding tokenizer that supports a pre-tokenization regex. /// The direct methods on this type pre-tokenize the input text and should @@ -52,6 +65,8 @@ pub struct Tokenizer { pub bpe: BytePairEncoding, /// The pattern regex used to split the input. pub pre: Option, + /// Indicates whether the input should be normalized with NFC. + nfc: bool, } pub struct Pretokenizer { @@ -64,9 +79,9 @@ pub struct Pretokenizer { impl Tokenizer { /// Build a tokenizer with an optional pretokenization regex pattern. #[allow(clippy::result_large_err)] - pub fn new(bpe: BytePairEncoding, pat: Option<&str>) -> Result { + pub fn new(bpe: BytePairEncoding, pat: Option<&str>, nfc: bool) -> Result { let pre = pat.map(Pretokenizer::new).transpose()?; - Ok(Self { bpe, pre }) + Ok(Self { nfc, bpe, pre }) } /// Build a tokenizer with pretokenization regex patterns. If the boolean for a pattern is true, @@ -75,15 +90,17 @@ impl Tokenizer { pub fn new_lookahead( bpe: BytePairEncoding, patterns: &[(&str, bool)], + nfc: bool, ) -> Result { let pre = Some(Pretokenizer::new_lookahead(patterns)?); - Ok(Self { bpe, pre }) + Ok(Self { nfc, bpe, pre }) } /// Count the number of tokens produced when encoding the text. Applies pre-tokenization /// before counting. - pub fn count(&self, text: &str) -> usize { - self.split(text) + pub fn count<'a, I: Normalizable<'a>>(&self, text: I) -> usize { + let text = self.normalize(text); + self.split(text.as_str()) .map(|piece| self.bpe.count(piece.as_bytes())) .sum() } @@ -91,18 +108,23 @@ impl Tokenizer { /// Returns the token count iff the total token count stays below the specified token_limit. /// Otherwise, it returns none. This function can be faster than [`Self::count`]` when the /// token limit is much smaller than the provided text. Applies pre-tokenization before counting. - pub fn count_till_limit(&self, text: &str, token_limit: usize) -> Option { - self.split(text).try_fold(0, |consumed, piece| { + /// + /// Note: This function assumes that the text is already normalized, so that this function can run + /// in roughly O(token_limit) time. + pub fn count_till_limit(&self, text: &NormalizedString, token_limit: usize) -> Option { + let res: Option = self.split(text.as_str()).try_fold(0, |consumed, piece| { self.bpe .count_till_limit(piece.as_bytes(), token_limit - consumed) .map(|piece_count| consumed + piece_count) - }) + }); + res } /// Returns the tokens for the encoding of the given text. Applies pre-tokenization before /// encoding. - pub fn encode(&self, text: &str) -> Vec { - self.split(text) + pub fn encode<'a, I: Normalizable<'a>>(&self, text: I) -> Vec { + let text: NormalizedString<'_> = self.normalize(text); + self.split(text.as_str()) .flat_map(|piece| self.bpe.encode_via_backtracking(piece.as_bytes())) .collect() } @@ -114,12 +136,18 @@ impl Tokenizer { /// Returns an iterator with the text pieces resulting from pre-tokenization. If this /// tokenizer does not have pre-tokenization, the iterator returns the full text. - pub fn split<'a>(&'a self, text: &'a str) -> impl Iterator + 'a { + pub fn split<'a>(&'a self, text: &'a str) -> impl Iterator { match &self.pre { Some(pre) => Either::Left(pre.split(text)), None => Either::Right(std::iter::once(text)), } } + + /// Returns the normalized text if the tokenizer requires normalization. + /// If the input was already normalized, this function is a noop. + pub fn normalize<'a, I: Normalizable<'a>>(&self, text: I) -> NormalizedString<'a> { + text.normalize(self.nfc) + } } impl Pretokenizer { @@ -143,7 +171,7 @@ impl Pretokenizer { } /// Returns an iterator with the text pieces after splitting with the regular expression. - pub fn split<'a>(&'a self, text: &'a str) -> impl Iterator + 'a { + pub fn split<'a>(&'a self, text: &'a str) -> impl Iterator { Splits { pat: &self.pat, lookahead: &self.lookahead, @@ -201,6 +229,10 @@ pub fn o200k_base() -> &'static Tokenizer { &BPE_O200K_BASE } +pub fn voyage3_base() -> &'static Tokenizer { + &BPE_VOYAGE3_BASE +} + #[cfg(test)] mod tests { use bpe::byte_pair_encoding::{create_test_string, select_test_string}; @@ -233,9 +265,21 @@ mod tests { #[test] fn test_count_till_limit() { - assert_eq!(cl100k_base().count_till_limit("abc", 3), Some(1)); - assert_eq!(cl100k_base().count_till_limit("abcabc", 3), Some(2)); - assert_eq!(cl100k_base().count_till_limit("abcabcabc", 3), Some(3)); - assert_eq!(cl100k_base().count_till_limit("abcabcabcabc", 3), None); + assert_eq!( + cl100k_base().count_till_limit(&cl100k_base().normalize("abc"), 3), + Some(1) + ); + assert_eq!( + cl100k_base().count_till_limit(&cl100k_base().normalize("abcabc"), 3), + Some(2) + ); + assert_eq!( + cl100k_base().count_till_limit(&cl100k_base().normalize("abcabcabc"), 3), + Some(3) + ); + assert_eq!( + cl100k_base().count_till_limit(&cl100k_base().normalize("abcabcabcabc"), 3), + None + ); } } diff --git a/crates/bpe-openai/src/normalizer.rs b/crates/bpe-openai/src/normalizer.rs new file mode 100644 index 0000000..08de365 --- /dev/null +++ b/crates/bpe-openai/src/normalizer.rs @@ -0,0 +1,56 @@ +use std::borrow::Cow; + +use unicode_normalization::UnicodeNormalization; + +/// Type which represents a normalized string. +/// This is to avoid calling normalize multiple times of forgetting to call normalization! +/// +/// TODO: Annotate the type with the normalization type, once there are more than one. +pub struct NormalizedString<'a>(Cow<'a, str>); + +impl<'a> NormalizedString<'a> { + /// Returns the normalized inner str buffer. + pub fn as_str(&self) -> &str { + &self.0 + } + + /// This function is unsafe, since the caller must ensure that the correct normalization + /// was used. The normalization may vary by tokenizer. This mostly a backdoor which might + /// be handy for certain optimizations or for testing. + pub unsafe fn from_str(s: &'a str) -> NormalizedString<'a> { + // SAFETY: This is safe because we are creating a NormalizedString from a &str + // which is guaranteed to be valid UTF-8. + NormalizedString(Cow::Borrowed(s)) + } +} + +/// Helper trait which converts string types into NormalizedString. +/// Calling normalize on a NormalizedString is a no-op. +pub trait Normalizable<'a> { + fn normalize(self, nfc: bool) -> NormalizedString<'a>; +} + +impl<'a> Normalizable<'a> for &'a str { + fn normalize(self, nfc: bool) -> NormalizedString<'a> { + if nfc { + NormalizedString(self.nfc().collect()) + } else { + NormalizedString(Cow::Borrowed(self)) + } + } +} + +impl<'a, T> Normalizable<'a> for &'a T +where + T: AsRef, +{ + fn normalize(self, nfc: bool) -> NormalizedString<'a> { + self.as_ref().normalize(nfc) + } +} + +impl<'a> Normalizable<'a> for NormalizedString<'a> { + fn normalize(self, _: bool) -> NormalizedString<'a> { + self + } +} diff --git a/crates/bpe/benchmarks/Cargo.toml b/crates/bpe/benchmarks/Cargo.toml index 765b5b1..a332b27 100644 --- a/crates/bpe/benchmarks/Cargo.toml +++ b/crates/bpe/benchmarks/Cargo.toml @@ -18,7 +18,7 @@ path = "equivalence.rs" test = true [dependencies] -bpe = { path = "../../bpe" } +bpe = { path = "../../bpe", features = ["rand", "tiktoken"] } bpe-openai = { path = "../../bpe-openai" } criterion = "0.5" rand = "0.9" diff --git a/crates/bpe/benchmarks/equivalence.rs b/crates/bpe/benchmarks/equivalence.rs index b3df973..34d13f5 100644 --- a/crates/bpe/benchmarks/equivalence.rs +++ b/crates/bpe/benchmarks/equivalence.rs @@ -1,19 +1,72 @@ +use core::panic; +use std::collections::HashSet; + use bpe::byte_pair_encoding::{create_test_string, select_test_string}; use bpe_benchmarks::*; -#[cfg(test)] -const N: usize = 32; +/// Converts bytes to unicode characters. +/// See https://github.com/openai/gpt-2/blob/master/src/encoder.py#L9 +/// Hugging face uses the same mapping to work with unicode instead of byte characters. +fn char_to_byte(c: char) -> u8 { + match c as u32 { + 0x21..0x7f => c as u8, // 94 + 0xa1..=0xac => c as u8, // 12 + 0xae..=0xff => c as u8, // 82 + 0x7f..0xa1 => c as u8 - 0x7f + 221, + 0x100..0x121 => (c as u32 - 0x100) as u8, + 0x121..0x143 => (c as u32 - 0x121) as u8 + 0x7f, + 0x143..0x144 => 0xad, + _ => panic!("Invalid character: {c} {}", c as u32), + } +} #[test] -fn test_huggingface_encoding_equivalence_without_pretokenization() { - for (_, bpe, _, huggingface) in TOKENIZERS.iter() { +fn test_compare_dictionary() { + for (name, bpe, _, huggingface) in TOKENIZERS.iter() { let huggingface = without_pretokenizer(huggingface); - let text = create_test_string(&bpe.bpe, 80_000); - let texts = (0..N) - .map(|_| select_test_string(&text, 100)) + let mut hugging_tokens = huggingface.get_vocab(false); + // HACK: There are incorrect vocabularies in huggingface which have the added tokens stored together with the base tokens.. + // This is a workaround to remove them. + for (added_token, _) in huggingface.get_added_vocabulary().get_vocab() { + hugging_tokens.remove(added_token); + } + let mut hugging_tokens: Vec<_> = hugging_tokens.into_iter().collect(); + hugging_tokens.sort_by(|(_, a), (_, b)| a.cmp(b)); + let hugging_tokens: Vec<_> = hugging_tokens + .into_iter() + .map(|(token, _)| token.chars().map(char_to_byte).collect()) + .collect(); + let bpe_tokens: Vec<_> = (0..bpe.bpe.num_tokens()) + .map(|id| bpe.bpe.token_bytes(id as u32).to_vec()) + .collect(); + let hugging_set: HashSet<_> = hugging_tokens.iter().cloned().collect(); + let bpe_set: HashSet<_> = bpe_tokens.iter().cloned().collect(); + let diff: Vec<_> = hugging_set.symmetric_difference(&bpe_set).collect(); + assert!(diff.is_empty(), "{name}: Token sets differ"); + // Uncomment the following lines to write the tokens to a file in tiktoken format + /* + let mut file = + std::fs::File::create(std::path::Path::new(_name)).expect("can create output file"); + std::io::Write::write_all( + &mut file, + bpe::byte_pair_encoding::write_tiktoken(hugging_tokens).as_bytes(), + ) + .expect("can write output to file"); + */ + } +} + +#[test] +fn test_huggingface_encoding_equivalence_without_pretokenization() { + for (name, bpe, _, huggingface) in TOKENIZERS.iter() { + let text: String = create_test_string(&bpe.bpe, 200_000); + let text = bpe.normalize(&text); + let texts = (0..300) + .map(|_| select_test_string(text.as_str(), 100)) .chain(std::iter::once( "You should see the Greek word 'kosme': \"κόσμε\"", )); + let huggingface = without_pretokenizer(huggingface); for text in texts { let out = bpe.bpe.encode_via_backtracking(text.as_bytes()); let huggingface_out = huggingface @@ -26,14 +79,10 @@ fn test_huggingface_encoding_equivalence_without_pretokenization() { let huggingface_text = huggingface.decode(&huggingface_out, true).unwrap(); if huggingface_text != text { panic!( - "huggingface tokens and text differ: {:?} != {:?}", - text, huggingface_text + "{name}: huggingface tokens and text differ: {text:?} != {huggingface_text:?}", ); } else { - panic!( - "huggingface tokens differ: {:?} != {:?}", - out, huggingface_out - ); + panic!("{name}: huggingface tokens differ: {out:?} != {huggingface_out:?}"); } } } @@ -42,9 +91,9 @@ fn test_huggingface_encoding_equivalence_without_pretokenization() { #[test] fn test_huggingface_encoding_equivalence_with_pretokenization() { - for (_, bpe, _, huggingface) in TOKENIZERS.iter() { - let text = create_test_string(&bpe.bpe, 80_000); - let texts = (0..N) + for (name, bpe, _, huggingface) in TOKENIZERS.iter() { + let text = create_test_string(&bpe.bpe, 200_000); + let texts = (0..300) .map(|_| select_test_string(&text, 100)) .chain(std::iter::once( "You should see the Greek word 'kosme': \"κόσμε\" ", @@ -62,14 +111,10 @@ fn test_huggingface_encoding_equivalence_with_pretokenization() { let huggingface_text = huggingface.decode(&huggingface_out, true).unwrap(); if huggingface_text != text { panic!( - "huggingface tokens and text differ: {:?} != {:?}", - text, huggingface_text + "{name}: huggingface tokens and text differ: {text:?} != {huggingface_text:?}", ); } else { - panic!( - "huggingface tokens differ: {:?} != {:?}", - out, huggingface_out - ); + panic!("{name}: huggingface tokens differ: {out:?} != {huggingface_out:?}"); } } } diff --git a/crates/bpe/benchmarks/lib.rs b/crates/bpe/benchmarks/lib.rs index d364df8..8b24f13 100644 --- a/crates/bpe/benchmarks/lib.rs +++ b/crates/bpe/benchmarks/lib.rs @@ -9,23 +9,29 @@ pub static TOKENIZERS: LazyLock< [( &'static str, &'static Tokenizer, - TiktokenTokenizer, + Option, HuggingfaceTokenizer, - ); 2], + ); 3], > = LazyLock::new(|| { [ ( "cl100k", bpe_openai::cl100k_base(), - tiktoken_rs::cl100k_base().expect("tokenizer available"), + Some(tiktoken_rs::cl100k_base().expect("tokenizer available")), HuggingfaceTokenizer::from_pretrained("Xenova/gpt-4", None).expect("model available"), ), ( "o200k", bpe_openai::o200k_base(), - tiktoken_rs::o200k_base().expect("tokenizer available"), + Some(tiktoken_rs::o200k_base().expect("tokenizer available")), HuggingfaceTokenizer::from_pretrained("Xenova/gpt-4o", None).expect("model available"), ), + ( + "voyage3", + bpe_openai::voyage3_base(), + None, + HuggingfaceTokenizer::from_pretrained("voyageai/voyage-code-3", None).expect("model available"), + ) ] }); diff --git a/crates/bpe/benchmarks/performance.rs b/crates/bpe/benchmarks/performance.rs index 21ebff8..4259498 100644 --- a/crates/bpe/benchmarks/performance.rs +++ b/crates/bpe/benchmarks/performance.rs @@ -163,13 +163,15 @@ fn comparison_benchmark(c: &mut Criterion) { ) }, ); - group.bench_with_input(BenchmarkId::new("tiktoken", bytes), &bytes, |b, bytes| { - b.iter_batched( - || select_test_string(&text, *bytes), - |text| tiktoken.encode_ordinary(text), - criterion::BatchSize::SmallInput, - ) - }); + if let Some(tiktoken) = tiktoken { + group.bench_with_input(BenchmarkId::new("tiktoken", bytes), &bytes, |b, bytes| { + b.iter_batched( + || select_test_string(&text, *bytes), + |text| tiktoken.encode_ordinary(text), + criterion::BatchSize::SmallInput, + ) + }); + } group.bench_with_input( BenchmarkId::new("huggingface", bytes), &bytes, @@ -206,13 +208,15 @@ fn worstcase_comparison_benchmark(c: &mut Criterion) { ) }, ); - group.bench_with_input(BenchmarkId::new("tiktoken", bytes), &bytes, |b, bytes| { - b.iter_batched( - || select_test_string(&text, *bytes), - |text| tiktoken.encode_ordinary(text), - criterion::BatchSize::SmallInput, - ) - }); + if let Some(tiktoken) = tiktoken { + group.bench_with_input(BenchmarkId::new("tiktoken", bytes), &bytes, |b, bytes| { + b.iter_batched( + || select_test_string(&text, *bytes), + |text| tiktoken.encode_ordinary(text), + criterion::BatchSize::SmallInput, + ) + }); + } group.bench_with_input( BenchmarkId::new("huggingface", bytes), &bytes, From 2a0e2729a3a5c049e50c62dcb828f16e1c80af18 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Mon, 5 May 2025 14:12:05 +0200 Subject: [PATCH 044/114] Update lib.rs --- crates/bpe-openai/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bpe-openai/src/lib.rs b/crates/bpe-openai/src/lib.rs index 40b90b4..b6d9add 100644 --- a/crates/bpe-openai/src/lib.rs +++ b/crates/bpe-openai/src/lib.rs @@ -50,7 +50,7 @@ static BPE_VOYAGE3_BASE: LazyLock = LazyLock::new(|| { let pat1 = "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+$"; let pat2 = "\\s+\\s"; let pat3 = "\\s+"; - Tokenizer::new_lookahead(bpe, &[(&pat1, false), (pat2, true), (pat3, false)], true) + Tokenizer::new_lookahead(bpe, &[(pat1, false), (pat2, true), (pat3, false)], true) .expect("valid regex") }); From c335e66f3ac5a259002c68f1af1fdb0bbe3dba19 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Mon, 5 May 2025 14:13:03 +0200 Subject: [PATCH 045/114] Update equivalence.rs --- crates/bpe/benchmarks/equivalence.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/bpe/benchmarks/equivalence.rs b/crates/bpe/benchmarks/equivalence.rs index 34d13f5..c0821a2 100644 --- a/crates/bpe/benchmarks/equivalence.rs +++ b/crates/bpe/benchmarks/equivalence.rs @@ -1,4 +1,3 @@ -use core::panic; use std::collections::HashSet; use bpe::byte_pair_encoding::{create_test_string, select_test_string}; From 3a5835c42adf6fd4287daed8839cbd4d5af62fa2 Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Tue, 6 May 2025 11:44:13 -0600 Subject: [PATCH 046/114] cargo +1.86.0 fmt --all --- crates/bpe/benchmarks/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/bpe/benchmarks/lib.rs b/crates/bpe/benchmarks/lib.rs index 8b24f13..39ccfc8 100644 --- a/crates/bpe/benchmarks/lib.rs +++ b/crates/bpe/benchmarks/lib.rs @@ -30,8 +30,9 @@ pub static TOKENIZERS: LazyLock< "voyage3", bpe_openai::voyage3_base(), None, - HuggingfaceTokenizer::from_pretrained("voyageai/voyage-code-3", None).expect("model available"), - ) + HuggingfaceTokenizer::from_pretrained("voyageai/voyage-code-3", None) + .expect("model available"), + ), ] }); From 0ebe6df5147398ce73a3cfc87a2be51f6030e1e4 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 7 May 2025 08:42:42 +0200 Subject: [PATCH 047/114] Update crates/bpe-openai/src/normalizer.rs Co-authored-by: Jason Orendorff --- crates/bpe-openai/src/normalizer.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bpe-openai/src/normalizer.rs b/crates/bpe-openai/src/normalizer.rs index 08de365..dbc6c48 100644 --- a/crates/bpe-openai/src/normalizer.rs +++ b/crates/bpe-openai/src/normalizer.rs @@ -18,8 +18,8 @@ impl<'a> NormalizedString<'a> { /// was used. The normalization may vary by tokenizer. This mostly a backdoor which might /// be handy for certain optimizations or for testing. pub unsafe fn from_str(s: &'a str) -> NormalizedString<'a> { - // SAFETY: This is safe because we are creating a NormalizedString from a &str - // which is guaranteed to be valid UTF-8. + // SAFETY: This is safe if `s` is in fact correctly normalized already. The caller is + // responsible for ensuring that. NormalizedString(Cow::Borrowed(s)) } } From e9829664a40051fae5c0b263f76de03d3bb88ddb Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 7 May 2025 08:43:00 +0200 Subject: [PATCH 048/114] Update crates/bpe-openai/src/normalizer.rs Co-authored-by: Jason Orendorff --- crates/bpe-openai/src/normalizer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bpe-openai/src/normalizer.rs b/crates/bpe-openai/src/normalizer.rs index dbc6c48..4ac949a 100644 --- a/crates/bpe-openai/src/normalizer.rs +++ b/crates/bpe-openai/src/normalizer.rs @@ -3,7 +3,7 @@ use std::borrow::Cow; use unicode_normalization::UnicodeNormalization; /// Type which represents a normalized string. -/// This is to avoid calling normalize multiple times of forgetting to call normalization! +/// This is to avoid calling normalize multiple times or forgetting to call normalization! /// /// TODO: Annotate the type with the normalization type, once there are more than one. pub struct NormalizedString<'a>(Cow<'a, str>); From 023257bdcfe8b6b843eb094d8a7b05983fe6d638 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 7 May 2025 11:44:53 +0200 Subject: [PATCH 049/114] bump version --- crates/bpe-openai/Cargo.toml | 12 ++++++------ crates/bpe-openai/src/normalizer.rs | 6 ++++-- crates/bpe/Cargo.toml | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/crates/bpe-openai/Cargo.toml b/crates/bpe-openai/Cargo.toml index acc0493..cc385c8 100644 --- a/crates/bpe-openai/Cargo.toml +++ b/crates/bpe-openai/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bpe-openai" -version = "0.2.1" +version = "0.3.0" edition = "2021" description = "Prebuilt fast byte-pair encoders for OpenAI." repository = "https://github.com/github/rust-gems" @@ -13,19 +13,19 @@ crate-type = ["lib", "staticlib"] bench = false [dependencies] -bpe = { version = "0.2.0", path = "../bpe" } +bpe = { version = "0.2", path = "../bpe" } either = "1.13" regex-automata = "0.4" rmp-serde = "1" -unicode-normalization = "0.1.20" +unicode-normalization = "0.1" [dev-dependencies] -bpe = { version = "0.2.0", path = "../bpe", features = ["rand"] } +bpe = { version = "0.2", path = "../bpe", features = ["rand"] } tiktoken-rs = "0.6" [build-dependencies] -base64 = "0.22.1" -bpe = { version = "0.2.0", path = "../bpe", features = ["tiktoken"] } +base64 = "0.22" +bpe = { version = "0.2", path = "../bpe", features = ["tiktoken"] } flate2 = "1.0" rmp-serde = "1" serde = "1" diff --git a/crates/bpe-openai/src/normalizer.rs b/crates/bpe-openai/src/normalizer.rs index 4ac949a..50f3309 100644 --- a/crates/bpe-openai/src/normalizer.rs +++ b/crates/bpe-openai/src/normalizer.rs @@ -17,9 +17,11 @@ impl<'a> NormalizedString<'a> { /// This function is unsafe, since the caller must ensure that the correct normalization /// was used. The normalization may vary by tokenizer. This mostly a backdoor which might /// be handy for certain optimizations or for testing. + /// + /// # Safety + /// This is safe if `s` is in fact correctly normalized already. The caller is + /// responsible for ensuring that. pub unsafe fn from_str(s: &'a str) -> NormalizedString<'a> { - // SAFETY: This is safe if `s` is in fact correctly normalized already. The caller is - // responsible for ensuring that. NormalizedString(Cow::Borrowed(s)) } } diff --git a/crates/bpe/Cargo.toml b/crates/bpe/Cargo.toml index fc562ce..9e10955 100644 --- a/crates/bpe/Cargo.toml +++ b/crates/bpe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bpe" -version = "0.2.0" +version = "0.2.1" edition = "2021" description = "Fast byte-pair encoding implementation." repository = "https://github.com/github/rust-gems" From 799d04e656b21b28285220ec75fbcea1a985a829 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 7 May 2025 11:49:24 +0200 Subject: [PATCH 050/114] Update lib.rs --- crates/bpe/benchmarks/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bpe/benchmarks/lib.rs b/crates/bpe/benchmarks/lib.rs index 39ccfc8..00ffd4a 100644 --- a/crates/bpe/benchmarks/lib.rs +++ b/crates/bpe/benchmarks/lib.rs @@ -5,6 +5,7 @@ use tiktoken_rs::CoreBPE as TiktokenTokenizer; use tokenizers::pre_tokenizers::byte_level::ByteLevel as HuggingfaceByteLevel; use tokenizers::tokenizer::Tokenizer as HuggingfaceTokenizer; +#[allow(clippy::type_complexity)] pub static TOKENIZERS: LazyLock< [( &'static str, From a22f108badbfc220d0b779ab0e17d09a82793cfc Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Wed, 7 May 2025 12:41:58 +0200 Subject: [PATCH 051/114] Update equivalence.rs --- crates/bpe/benchmarks/equivalence.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bpe/benchmarks/equivalence.rs b/crates/bpe/benchmarks/equivalence.rs index c0821a2..4019602 100644 --- a/crates/bpe/benchmarks/equivalence.rs +++ b/crates/bpe/benchmarks/equivalence.rs @@ -26,7 +26,7 @@ fn test_compare_dictionary() { let mut hugging_tokens = huggingface.get_vocab(false); // HACK: There are incorrect vocabularies in huggingface which have the added tokens stored together with the base tokens.. // This is a workaround to remove them. - for (added_token, _) in huggingface.get_added_vocabulary().get_vocab() { + for added_token in huggingface.get_added_vocabulary().get_vocab().keys() { hugging_tokens.remove(added_token); } let mut hugging_tokens: Vec<_> = hugging_tokens.into_iter().collect(); From ef820c9caef54001833ed7154c2aa1e811dfab51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 01:10:32 +0000 Subject: [PATCH 052/114] Update criterion requirement from 0.5 to 0.6 Updates the requirements on [criterion](https://github.com/bheisler/criterion.rs) to permit the latest version. - [Changelog](https://github.com/bheisler/criterion.rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/bheisler/criterion.rs/compare/0.5.0...0.6.0) --- updated-dependencies: - dependency-name: criterion dependency-version: 0.6.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- crates/bpe/benchmarks/Cargo.toml | 2 +- crates/geo_filters/Cargo.toml | 2 +- crates/string-offsets/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bpe/benchmarks/Cargo.toml b/crates/bpe/benchmarks/Cargo.toml index a332b27..e2f0234 100644 --- a/crates/bpe/benchmarks/Cargo.toml +++ b/crates/bpe/benchmarks/Cargo.toml @@ -20,7 +20,7 @@ test = true [dependencies] bpe = { path = "../../bpe", features = ["rand", "tiktoken"] } bpe-openai = { path = "../../bpe-openai" } -criterion = "0.5" +criterion = "0.6" rand = "0.9" tiktoken-rs = "0.6" tokenizers = { version = "0.21", features = ["http"] } diff --git a/crates/geo_filters/Cargo.toml b/crates/geo_filters/Cargo.toml index b8a71e4..e850564 100644 --- a/crates/geo_filters/Cargo.toml +++ b/crates/geo_filters/Cargo.toml @@ -33,7 +33,7 @@ rayon = { version = "1.7", optional = true } regex = { version = "1", optional = true } [dev-dependencies] -criterion = "0.5" +criterion = "0.6" geo_filters = { path = ".", features = ["evaluation"] } rand = "0.9" rand_chacha = "0.9" diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index 40fab03..656b92e 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -22,7 +22,7 @@ wasm-bindgen = { version = "0.2", optional = true } [dev-dependencies] rand = "0.9" rand_chacha = "0.9" -criterion = "0.5" +criterion = "0.6" [[bench]] name = "performance" From 01cd0872938c756ebcba7aacd2c214cfb9d84732 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 01:12:36 +0000 Subject: [PATCH 053/114] Update tiktoken-rs requirement from 0.6 to 0.7 Updates the requirements on [tiktoken-rs](https://github.com/zurawiki/tiktoken-rs) to permit the latest version. - [Release notes](https://github.com/zurawiki/tiktoken-rs/releases) - [Commits](https://github.com/zurawiki/tiktoken-rs/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: tiktoken-rs dependency-version: 0.7.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- crates/bpe-openai/Cargo.toml | 2 +- crates/bpe/Cargo.toml | 2 +- crates/bpe/benchmarks/Cargo.toml | 2 +- crates/bpe/tests/Cargo.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/bpe-openai/Cargo.toml b/crates/bpe-openai/Cargo.toml index cc385c8..c20ee2c 100644 --- a/crates/bpe-openai/Cargo.toml +++ b/crates/bpe-openai/Cargo.toml @@ -21,7 +21,7 @@ unicode-normalization = "0.1" [dev-dependencies] bpe = { version = "0.2", path = "../bpe", features = ["rand"] } -tiktoken-rs = "0.6" +tiktoken-rs = "0.7" [build-dependencies] base64 = "0.22" diff --git a/crates/bpe/Cargo.toml b/crates/bpe/Cargo.toml index 9e10955..fdf26aa 100644 --- a/crates/bpe/Cargo.toml +++ b/crates/bpe/Cargo.toml @@ -26,7 +26,7 @@ serde = { version = "1", features = ["derive"] } [dev-dependencies] bpe = { path = "." } -tiktoken-rs = "0.6" +tiktoken-rs = "0.7" [package.metadata.docs.rs] all-features = true diff --git a/crates/bpe/benchmarks/Cargo.toml b/crates/bpe/benchmarks/Cargo.toml index e2f0234..19216f1 100644 --- a/crates/bpe/benchmarks/Cargo.toml +++ b/crates/bpe/benchmarks/Cargo.toml @@ -22,5 +22,5 @@ bpe = { path = "../../bpe", features = ["rand", "tiktoken"] } bpe-openai = { path = "../../bpe-openai" } criterion = "0.6" rand = "0.9" -tiktoken-rs = "0.6" +tiktoken-rs = "0.7" tokenizers = { version = "0.21", features = ["http"] } diff --git a/crates/bpe/tests/Cargo.toml b/crates/bpe/tests/Cargo.toml index fa0b0f0..e061e95 100644 --- a/crates/bpe/tests/Cargo.toml +++ b/crates/bpe/tests/Cargo.toml @@ -7,4 +7,4 @@ bpe = { path = "../../bpe", features = ["rand"] } bpe-openai = { path = "../../bpe-openai" } itertools = "0.14" rand = "0.9" -tiktoken-rs = "0.6" +tiktoken-rs = "0.7" From 7976e67bd83c26fbcad3d493c9690d9c3f45dfc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 01:58:19 +0000 Subject: [PATCH 054/114] Bump rui314/setup-mold Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from e16410e7f8d9e167b74ad5697a9089a35126eb50 to 67424c1b3680e35255d95971cbd5de0047bf31c3. - [Commits](https://github.com/rui314/setup-mold/compare/e16410e7f8d9e167b74ad5697a9089a35126eb50...67424c1b3680e35255d95971cbd5de0047bf31c3) --- updated-dependencies: - dependency-name: rui314/setup-mold dependency-version: 67424c1b3680e35255d95971cbd5de0047bf31c3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 83b2779..d279e09 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 + - uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 - name: Build run: make build @@ -38,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 + - uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 - name: Check formatting and clippy run: make lint @@ -49,7 +49,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 + - uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 - name: Run unit tests run: make test From fac290eccd6d67416259cf2714a1f000723b1e54 Mon Sep 17 00:00:00 2001 From: Greg Orzell Date: Mon, 26 May 2025 08:36:23 -0700 Subject: [PATCH 055/114] Fix API changes. --- crates/bpe-openai/src/lib.rs | 4 ++-- crates/bpe/tests/src/lib.rs | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/bpe-openai/src/lib.rs b/crates/bpe-openai/src/lib.rs index b6d9add..51f514f 100644 --- a/crates/bpe-openai/src/lib.rs +++ b/crates/bpe-openai/src/lib.rs @@ -242,12 +242,12 @@ mod tests { #[test] fn test_cl100k() { - test_equivalence(cl100k_base(), &cl100k_base_singleton().lock()); + test_equivalence(cl100k_base(), cl100k_base_singleton()); } #[test] fn test_o200k() { - test_equivalence(o200k_base(), &o200k_base_singleton().lock()); + test_equivalence(o200k_base(), o200k_base_singleton()); } #[track_caller] diff --git a/crates/bpe/tests/src/lib.rs b/crates/bpe/tests/src/lib.rs index 9c85b4a..6ea1322 100644 --- a/crates/bpe/tests/src/lib.rs +++ b/crates/bpe/tests/src/lib.rs @@ -89,7 +89,6 @@ mod tests { .unwrap(); let bpe = &cl100k_base().bpe; let encoded1 = cl100k_base_singleton() - .lock() .encode_ordinary(input) .into_iter() .collect_vec(); From 81f1d56a7761930731eb078fe0d76638bdd03905 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 01:36:42 +0000 Subject: [PATCH 056/114] Bump rui314/setup-mold Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from 67424c1b3680e35255d95971cbd5de0047bf31c3 to b3958095189f34b95d402a680b6e96b7f194f7b9. - [Commits](https://github.com/rui314/setup-mold/compare/67424c1b3680e35255d95971cbd5de0047bf31c3...b3958095189f34b95d402a680b6e96b7f194f7b9) --- updated-dependencies: - dependency-name: rui314/setup-mold dependency-version: b3958095189f34b95d402a680b6e96b7f194f7b9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d279e09..b1e6a36 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 + - uses: rui314/setup-mold@b3958095189f34b95d402a680b6e96b7f194f7b9 - name: Build run: make build @@ -38,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 + - uses: rui314/setup-mold@b3958095189f34b95d402a680b6e96b7f194f7b9 - name: Check formatting and clippy run: make lint @@ -49,7 +49,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 + - uses: rui314/setup-mold@b3958095189f34b95d402a680b6e96b7f194f7b9 - name: Run unit tests run: make test From 115c516a74ee54fc27a126ced4dfcf830195d71e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 01:20:36 +0000 Subject: [PATCH 057/114] Bump rui314/setup-mold Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from b3958095189f34b95d402a680b6e96b7f194f7b9 to 85c79d00377f0d32cdbae595a46de6f7c2fa6599. - [Commits](https://github.com/rui314/setup-mold/compare/b3958095189f34b95d402a680b6e96b7f194f7b9...85c79d00377f0d32cdbae595a46de6f7c2fa6599) --- updated-dependencies: - dependency-name: rui314/setup-mold dependency-version: 85c79d00377f0d32cdbae595a46de6f7c2fa6599 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b1e6a36..3d4c57f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@b3958095189f34b95d402a680b6e96b7f194f7b9 + - uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 - name: Build run: make build @@ -38,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@b3958095189f34b95d402a680b6e96b7f194f7b9 + - uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 - name: Check formatting and clippy run: make lint @@ -49,7 +49,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@b3958095189f34b95d402a680b6e96b7f194f7b9 + - uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 - name: Run unit tests run: make test From 440afa11bce02c96470816fe6cf916d56bc382fa Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 18 Jul 2025 14:07:12 +0100 Subject: [PATCH 058/114] initial cut of customizable buildhashers in geo filters crate --- crates/geo_filters/evaluation/accuracy.rs | 17 ++--- crates/geo_filters/evaluation/performance.rs | 9 +-- crates/geo_filters/src/config.rs | 6 +- crates/geo_filters/src/diff_count.rs | 62 ++++++++++++------- crates/geo_filters/src/diff_count/sim_hash.rs | 16 ++--- crates/geo_filters/src/distinct_count.rs | 60 +++++++++++------- crates/geo_filters/src/evaluation/hll.rs | 12 ++-- .../geo_filters/src/evaluation/simulation.rs | 23 +++---- crates/geo_filters/src/lib.rs | 19 +++--- crates/geo_filters/tests/public_api.rs | 18 +++--- 10 files changed, 142 insertions(+), 100 deletions(-) diff --git a/crates/geo_filters/evaluation/accuracy.rs b/crates/geo_filters/evaluation/accuracy.rs index c3151b7..3db898f 100644 --- a/crates/geo_filters/evaluation/accuracy.rs +++ b/crates/geo_filters/evaluation/accuracy.rs @@ -2,6 +2,7 @@ use std::fs::File; use std::path::PathBuf; use clap::Parser; +use fnv::FnvBuildHasher; use geo_filters::config::VariableConfig; use itertools::Itertools; use once_cell::sync::Lazy; @@ -157,19 +158,19 @@ static SIMULATION_CONFIG_FROM_STR: Lazy> = Lazy::new match t { BucketType::U8 => { let c = VariableConfig::<_, u8>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) + Box::new(move || Box::new(GeoDiffCount::new(c.clone(), FnvBuildHasher::default()))) } BucketType::U16 => { let c = VariableConfig::<_, u16>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) + Box::new(move || Box::new(GeoDiffCount::new(c.clone(), FnvBuildHasher::default()))) } BucketType::U32 => { let c = VariableConfig::<_, u32>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) + Box::new(move || Box::new(GeoDiffCount::new(c.clone(), FnvBuildHasher::default()))) } BucketType::U64 => { let c = VariableConfig::<_, u64>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) + Box::new(move || Box::new(GeoDiffCount::new(c.clone(), FnvBuildHasher::default()))) } } }), @@ -186,19 +187,19 @@ static SIMULATION_CONFIG_FROM_STR: Lazy> = Lazy::new match t { BucketType::U8 => { let c = VariableConfig::<_, u8>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) + Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), FnvBuildHasher::default()))) } BucketType::U16 => { let c = VariableConfig::<_, u16>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) + Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), FnvBuildHasher::default()))) } BucketType::U32 => { let c = VariableConfig::<_, u32>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) + Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), FnvBuildHasher::default()))) } BucketType::U64 => { let c = VariableConfig::<_, u64>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) + Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), FnvBuildHasher::default()))) } } }), diff --git a/crates/geo_filters/evaluation/performance.rs b/crates/geo_filters/evaluation/performance.rs index 4d7d706..eac4d65 100644 --- a/crates/geo_filters/evaluation/performance.rs +++ b/crates/geo_filters/evaluation/performance.rs @@ -1,4 +1,5 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use fnv::FnvBuildHasher; use geo_filters::config::VariableConfig; use geo_filters::diff_count::{GeoDiffCount, GeoDiffCount13}; use geo_filters::distinct_count::GeoDistinctCount13; @@ -22,7 +23,7 @@ fn criterion_benchmark(c: &mut Criterion) { group.bench_function("geo_diff_count_var_13", |b| { let c = VariableConfig::<_, u32>::new(13, 7680, 256); b.iter(move || { - let mut gc = GeoDiffCount::new(c.clone()); + let mut gc = GeoDiffCount::new(c.clone(), FnvBuildHasher::default()); for i in 0..*size { gc.push(i); } @@ -61,7 +62,7 @@ fn criterion_benchmark(c: &mut Criterion) { group.bench_function("geo_diff_count_var_13", |b| { let c = VariableConfig::<_, u32>::new(13, 7680, 256); b.iter(move || { - let mut gc = GeoDiffCount::new(c.clone()); + let mut gc = GeoDiffCount::new(c.clone(), FnvBuildHasher::default()); for i in 0..*size { gc.push(i); black_box(gc.size()); @@ -106,8 +107,8 @@ fn criterion_benchmark(c: &mut Criterion) { group.bench_function("geo_diff_count_var_13", |b| { let c = VariableConfig::<_, u32>::new(13, 7680, 256); b.iter(move || { - let mut gc1 = GeoDiffCount::new(c.clone()); - let mut gc2 = GeoDiffCount::new(c.clone()); + let mut gc1 = GeoDiffCount::new(c.clone(), FnvBuildHasher::default()); + let mut gc2 = GeoDiffCount::new(c.clone(), FnvBuildHasher::default()); for i in 0..size { gc1.push(i * 2); gc2.push(i * 2 + 1); diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index e22d6df..013c4ce 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -306,12 +306,14 @@ pub(crate) fn take_ref(iter: &mut I, n: usize) -> impl Iterator>(f: impl Fn() -> C) -> (f32, f32) { + pub(crate) fn test_estimate>(f: impl Fn() -> C) -> (f32, f32) { let mut rnd = rand::rngs::StdRng::from_os_rng(); let cnt = 10000usize; let mut avg_precision = 0.0; diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 0c46263..07e0b12 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -2,6 +2,7 @@ use std::borrow::Cow; use std::cmp::Ordering; +use std::hash::BuildHasher; use std::mem::{size_of, size_of_val}; use crate::config::{ @@ -16,12 +17,13 @@ mod sim_hash; use bitvec::*; pub use config::{GeoDiffConfig13, GeoDiffConfig7}; +use fnv::FnvBuildHasher; /// Diff count filter with a relative error standard deviation of ~0.125. -pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7>; +pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7, FnvBuildHasher>; /// Diff count filter with a relative error standard deviation of ~0.015. -pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13>; +pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13, FnvBuildHasher>; /// Probabilistic diff count data structure based on geometric filters. /// @@ -57,14 +59,15 @@ pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13>; /// 1500 bytes achieves a precision of ~0.022 and could estimate the 10k items with an error /// of +/-22k items in the best case which is 20 times worse despite using 5 times more space! #[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord)] -pub struct GeoDiffCount<'a, C: GeoConfig> { +pub struct GeoDiffCount<'a, C: GeoConfig, H: BuildHasher + Clone> { config: C, /// The bit positions are stored from largest to smallest. msb: Cow<'a, [C::BucketType]>, lsb: BitVec<'a>, + hash_builder: H, } -impl> std::fmt::Debug for GeoDiffCount<'_, C> { +impl, H: BuildHasher + Clone> std::fmt::Debug for GeoDiffCount<'_, C, H> { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!( f, @@ -76,12 +79,13 @@ impl> std::fmt::Debug for GeoDiffCount<'_, C> { } } -impl> GeoDiffCount<'_, C> { - pub fn new(config: C) -> Self { +impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { + pub fn new(config: C, hash_builder: H) -> Self { Self { config, msb: Default::default(), lsb: Default::default(), + hash_builder, } } @@ -92,7 +96,7 @@ impl> GeoDiffCount<'_, C> { /// /// Note: we need a peekable iterator, such that we can extract the most significant bits without /// having to construct another iterator with the remaining `BitChunk`s. - fn from_bit_chunks>(config: C, chunks: I) -> Self { + fn from_bit_chunks>(config: C, hash_builder: H, chunks: I) -> Self { let mut ones = iter_ones::(chunks.peekable()); let mut msb = Vec::default(); @@ -113,6 +117,7 @@ impl> GeoDiffCount<'_, C> { config, msb: Cow::from(msb), lsb, + hash_builder, }; result.debug_assert_invariants(); result @@ -248,11 +253,12 @@ impl> GeoDiffCount<'_, C> { // Consumers the current GeoDiffCount and produces an owned GeoDiffCount that // can live arbitrarily. - pub fn into_owned(self) -> GeoDiffCount<'static, C> { + pub fn into_owned(self) -> GeoDiffCount<'static, C, H> { GeoDiffCount { config: self.config, lsb: self.lsb.into_owned(), msb: Cow::Owned(self.msb.into_owned()), + hash_builder: self.hash_builder.clone(), } } @@ -290,13 +296,14 @@ impl> GeoDiffCount<'_, C> { /// after compression : 01 0 10 1 00 0 /// bitset of the returned filter : 010 101000 #[cfg(test)] -pub(crate) fn masked>( - diff_count: &GeoDiffCount<'_, C>, +pub(crate) fn masked, H: BuildHasher + Clone>( + diff_count: &GeoDiffCount<'_, C, H>, mask: usize, modulus: usize, -) -> GeoDiffCount<'static, C> { +) -> GeoDiffCount<'static, C, H> { GeoDiffCount::from_bit_chunks( diff_count.config.clone(), + diff_count.hash_builder.clone(), mask_bit_chunks(diff_count.bit_chunks(), mask as u64, modulus).peekable(), ) } @@ -304,21 +311,33 @@ pub(crate) fn masked>( /// Computes an xor of the two underlying bitsets. /// This operation corresponds to computing the symmetric difference of the two /// sets represented by the GeoDiffCounts. -pub(crate) fn xor>( - diff_count: &GeoDiffCount<'_, C>, - other: &GeoDiffCount<'_, C>, -) -> GeoDiffCount<'static, C> { +/// +/// SAFETY: The two GeoDiffCounts must have the same configuration and hash builder. +pub(crate) fn xor, H: BuildHasher + Clone>( + diff_count: &GeoDiffCount<'_, C, H>, + other: &GeoDiffCount<'_, C, H>, +) -> GeoDiffCount<'static, C, H> { assert!( diff_count.config == other.config, "combined filters must have the same configuration" ); + + // It would be really nice to be able to asser that our hash builders have + // the same state here, but from what I can see it is not common + // for hash builders to implement `PartialEq` or `Eq`. + GeoDiffCount::from_bit_chunks( diff_count.config.clone(), + diff_count.hash_builder.clone(), xor_bit_chunks(diff_count.bit_chunks(), other.bit_chunks()).peekable(), ) } -impl> Count for GeoDiffCount<'_, C> { +impl, H: BuildHasher + Clone> Count for GeoDiffCount<'_, C, H> { + fn hasher_builder(&self) -> &H { + &self.hash_builder + } + fn push_hash(&mut self, hash: u64) { self.xor_bit(self.config.hash_to_bucket(hash)); } @@ -340,8 +359,8 @@ impl> Count for GeoDiffCount<'_, C> { } fn bytes_in_memory(&self) -> usize { - let Self { config, msb, lsb } = self; - size_of_val(config) + msb.len() * size_of::() + lsb.bytes_in_memory() + let Self { config, msb, lsb, hash_builder } = self; + size_of_val(config) + msb.len() * size_of::() + lsb.bytes_in_memory() + size_of_val(hash_builder) } } @@ -359,7 +378,7 @@ mod tests { // // scripts/accuracy -n 10000 geo_diff/u16/b=7/bytes=50/msb=10 // - type GeoDiffCount7_50<'a> = GeoDiffCount<'a, FixedConfig>; + type GeoDiffCount7_50<'a> = GeoDiffCount<'a, FixedConfig, FnvBuildHasher>; #[test] fn test_geo_count() { @@ -535,6 +554,7 @@ mod tests { } let actual = GeoDiffCount::from_bit_chunks( expected.config.clone(), + expected.hash_builder.clone(), expected.bit_chunks().peekable(), ); assert_eq!(expected, actual); @@ -550,9 +570,9 @@ mod tests { assert_eq!(vec![17, 11, 7], a.msb.iter().copied().collect_vec()); } - impl> GeoDiffCount<'_, C> { + impl> GeoDiffCount<'_, C, FnvBuildHasher> { fn from_ones(config: C, ones: impl IntoIterator) -> Self { - let mut result = Self::new(config); + let mut result = Self::new(config, FnvBuildHasher::default()); for one in ones { result.xor_bit(one); } diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index cee2370..32ca0ae 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -1,6 +1,6 @@ //! Similarity hashing allows quickly finding similar sets with a reverse index. -use std::hash::{Hash, Hasher}; +use std::hash::{BuildHasher, Hash, Hasher}; use std::ops::Range; use fnv::FnvHasher; @@ -42,7 +42,7 @@ impl SimHash { } } -impl> GeoDiffCount<'_, C> { +impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { /// Given the expected size of a diff, this function returns the range of bucket ids which should /// be searched for in order to find geometric filters of the desired similarity. If at least half /// of the buckets in the range match, one found a match that has the expected diff size (or better). @@ -107,14 +107,14 @@ impl> GeoDiffCount<'_, C> { /// /// Property 2 is used to construct all sim hashes efficiently. /// Property 3 is used to search for similar GeoDiffCounts. -struct SimHashIterator<'a, C: GeoConfig> { - filter: &'a GeoDiffCount<'a, C>, +struct SimHashIterator<'a, C: GeoConfig, H: BuildHasher + Clone> { + filter: &'a GeoDiffCount<'a, C, H>, prev_bucket_id: BucketId, sim_hash: [u64; SIM_BUCKETS], } -impl<'a, C: GeoConfig> SimHashIterator<'a, C> { - pub fn new(filter: &'a GeoDiffCount<'a, C>) -> Self { +impl<'a, C: GeoConfig, H: BuildHasher + Clone> SimHashIterator<'a, C, H> { + pub fn new(filter: &'a GeoDiffCount<'a, C, H>) -> Self { let msb = filter.nth_most_significant_one(0); let prev_bucket_id = msb.map(|b| b.into_usize() / SIM_BUCKET_SIZE).unwrap_or(0) + SIM_BUCKETS; @@ -126,7 +126,7 @@ impl<'a, C: GeoConfig> SimHashIterator<'a, C> { } } -impl> Iterator for SimHashIterator<'_, C> { +impl, H: BuildHasher + Clone> Iterator for SimHashIterator<'_, C, H> { type Item = (BucketId, SimHash); fn next(&mut self) -> Option { @@ -148,7 +148,7 @@ impl> Iterator for SimHashIterator<'_, C> { } } -impl> GeoDiffCount<'_, C> { +impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { /// n specifies the desired zero-based index of the most significant one. /// The zero-based index of the desired one bit is returned. fn nth_most_significant_one(&self, mut n: usize) -> Option { diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index 6795cb8..50296bf 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -1,6 +1,7 @@ //! Geometric filter implementation for distinct count. use std::collections::VecDeque; +use std::hash::BuildHasher; use std::mem::{size_of, size_of_val}; use crate::config::{ @@ -14,33 +15,35 @@ mod bitdeque; mod config; pub use config::{GeoDistinctConfig13, GeoDistinctConfig7}; +use fnv::FnvBuildHasher; /// Distinct count filter with a relative error standard deviation of ~0.065. /// Uses at most 168 bytes of memory. -pub type GeoDistinctCount7<'a> = GeoDistinctCount<'a, GeoDistinctConfig7>; +pub type GeoDistinctCount7<'a> = GeoDistinctCount<'a, GeoDistinctConfig7, FnvBuildHasher>; /// Distinct count filter with a relative error standard deviation of ~0.0075. /// Uses at most 9248 bytes of memory. -pub type GeoDistinctCount13<'a> = GeoDistinctCount<'a, GeoDistinctConfig13>; +pub type GeoDistinctCount13<'a> = GeoDistinctCount<'a, GeoDistinctConfig13, FnvBuildHasher>; /// Probabilistic distinct count data structure based on geometric filters. /// /// The [`GeoDistinctCount`] falls into the category of probabilistic set size estimators. /// It has some similar properties as related filters like HyperLogLog, MinHash, etc, but uses less space. #[derive(Eq, PartialEq)] -pub struct GeoDistinctCount<'a, C: GeoConfig> { +pub struct GeoDistinctCount<'a, C: GeoConfig, H: BuildHasher> { config: C, + hash_builder: H, msb: VecDeque, lsb: BitDeque<'a>, } -impl + Default> Default for GeoDistinctCount<'_, C> { +impl + Default, H: BuildHasher + Clone + Default> Default for GeoDistinctCount<'_, C, H> { fn default() -> Self { - Self::new(C::default()) + Self::new(C::default(), H::default()) } } -impl> std::fmt::Debug for GeoDistinctCount<'_, C> { +impl, H: BuildHasher + Clone> std::fmt::Debug for GeoDistinctCount<'_, C, H> { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!( f, @@ -52,17 +55,17 @@ impl> std::fmt::Debug for GeoDistinctCount<'_, C> { } } -impl> GeoDistinctCount<'_, C> { - pub fn new(config: C) -> Self { +impl, H: BuildHasher + Clone> GeoDistinctCount<'_, C, H> { + pub fn new(config: C, hash_builder: H) -> Self { let msb = Default::default(); let lsb = BitDeque::new(max_lsb_bytes::( config.max_bytes(), config.max_msb_len(), )); - Self { config, msb, lsb } + Self { config, msb, lsb, hash_builder } } - fn from_bit_chunks>(config: C, chunks: I) -> Self { + fn from_bit_chunks>(config: C, hash_builder: H, chunks: I) -> Self { let mut ones = iter_ones::(chunks.peekable()); let mut msb = VecDeque::default(); @@ -83,7 +86,7 @@ impl> GeoDistinctCount<'_, C> { max_lsb_bytes::(config.max_bytes(), config.max_msb_len()), ); - let result = Self { config, msb, lsb }; + let result = Self { config, msb, lsb, hash_builder }; result.debug_assert_invariants(); result } @@ -128,7 +131,11 @@ impl> GeoDistinctCount<'_, C> { } } -impl> Count for GeoDistinctCount<'_, C> { +impl, H: BuildHasher + Clone> Count for GeoDistinctCount<'_, C, H> { + fn hasher_builder(&self) -> &H { + &self.hash_builder + } + fn push_hash(&mut self, hash: u64) { self.set_bit(self.config.hash_to_bucket(hash)); } @@ -174,12 +181,13 @@ impl> Count for GeoDistinctCount<'_, C> { } fn bytes_in_memory(&self) -> usize { - let Self { config, msb, lsb } = self; - size_of_val(config) + msb.len() * size_of::() + lsb.bytes_in_memory() + let Self { config, msb, lsb, hash_builder } = self; + size_of_val(config) + msb.len() * size_of::() + lsb.bytes_in_memory() + + size_of_val(hash_builder) } } -impl> GeoDistinctCount<'_, C> { +impl, H: BuildHasher + Clone> GeoDistinctCount<'_, C, H> { fn insert_into_lsb(&mut self, bucket: usize) { if !self.lsb.test_bit(bucket) { self.lsb.set_bit(bucket); @@ -208,16 +216,22 @@ impl> GeoDistinctCount<'_, C> { } } -fn or>( - a: &GeoDistinctCount<'_, C>, - b: &GeoDistinctCount<'_, C>, -) -> GeoDistinctCount<'static, C> { +fn or, H: BuildHasher + Clone>( + a: &GeoDistinctCount<'_, C, H>, + b: &GeoDistinctCount<'_, C, H>, +) -> GeoDistinctCount<'static, C, H> { assert!( a.config == b.config, "combined filters must have the same configuration" ); + + // It would be really nice to be able to asser that our hash builders have + // the same state here, but from what I can see it is not common + // for hash builders to implement `PartialEq` or `Eq`. + GeoDistinctCount::from_bit_chunks( a.config.clone(), + a.hash_builder.clone(), or_bit_chunks(a.bit_chunks(), b.bit_chunks()).peekable(), ) } @@ -362,7 +376,7 @@ mod tests { 13, 7800, (7800 - (msb.round() as usize) * 8) / 3, - ))) + ), FnvBuildHasher::default())) }, 3000, &[100000], @@ -381,7 +395,7 @@ mod tests { expected.push_hash(rnd.next_u64()); } let actual = - GeoDistinctCount::from_bit_chunks(expected.config.clone(), expected.bit_chunks()); + GeoDistinctCount::from_bit_chunks(expected.config.clone(), expected.hash_builder.clone(), expected.bit_chunks()); assert_eq!(expected, actual); } } @@ -395,9 +409,9 @@ mod tests { assert_eq!(vec![17, 11, 7], a.msb.iter().copied().collect_vec()); } - impl> GeoDistinctCount<'_, C> { + impl> GeoDistinctCount<'_, C, FnvBuildHasher> { fn from_ones(config: C, ones: impl IntoIterator) -> Self { - let mut result = Self::new(config); + let mut result = Self::new(config, FnvBuildHasher::default()); for one in ones { result.set_bit(one); } diff --git a/crates/geo_filters/src/evaluation/hll.rs b/crates/geo_filters/src/evaluation/hll.rs index 30b74bf..299db81 100644 --- a/crates/geo_filters/src/evaluation/hll.rs +++ b/crates/geo_filters/src/evaluation/hll.rs @@ -87,7 +87,7 @@ impl Hasher for NoopHasher { #[inline] fn write(&mut self, _: &[u8]) { - todo!("") + unimplemented!("NoopHasher only supports writing u64 values"); } #[inline] @@ -104,13 +104,17 @@ impl BuildHasher for BuildNoopHasher { } } -impl Count for Hll { +impl Count for Hll { + fn hasher_builder(&self) -> &BuildNoopHasher { + unimplemented!() + } + fn push_hash(&mut self, hash: u64) { self.inner.borrow_mut().insert(&hash) } fn push_sketch(&mut self, _other: &Self) { - todo!() + unimplemented!() } fn size(&self) -> f32 { @@ -118,7 +122,7 @@ impl Count for Hll { } fn size_with_sketch(&self, _other: &Self) -> f32 { - todo!() + unimplemented!() } fn bytes_in_memory(&self) -> usize { diff --git a/crates/geo_filters/src/evaluation/simulation.rs b/crates/geo_filters/src/evaluation/simulation.rs index ef736fd..1698b74 100644 --- a/crates/geo_filters/src/evaluation/simulation.rs +++ b/crates/geo_filters/src/evaluation/simulation.rs @@ -1,6 +1,7 @@ use std::io::Write; use std::time::Instant; +use fnv::FnvBuildHasher; use itertools::Itertools; use rand::{RngCore, SeedableRng}; use rayon::prelude::{IntoParallelIterator, ParallelIterator}; @@ -20,37 +21,37 @@ pub trait SimulationCount { fn size(&self) -> f32; fn bytes_in_memory(&self) -> usize; } -impl + Clone> SimulationCount for GeoDiffCount<'_, C> { +impl + Clone> SimulationCount for GeoDiffCount<'_, C, FnvBuildHasher> { fn push_hash(&mut self, hash: u64) { - >::push_hash(self, hash) + >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size(self) } fn bytes_in_memory(&self) -> usize { - >::bytes_in_memory(self) + >::bytes_in_memory(self) } } -impl> SimulationCount for GeoDistinctCount<'_, C> { +impl> SimulationCount for GeoDistinctCount<'_, C, FnvBuildHasher> { fn push_hash(&mut self, hash: u64) { - >::push_hash(self, hash) + >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size(self) } fn bytes_in_memory(&self) -> usize { - >::bytes_in_memory(self) + >::bytes_in_memory(self) } } impl SimulationCount for Hll { fn push_hash(&mut self, hash: u64) { - >::push_hash(self, hash) + >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size(self) } fn bytes_in_memory(&self) -> usize { - >::bytes_in_memory(self) + >::bytes_in_memory(self) } } diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 819421b..04b7c52 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -13,7 +13,7 @@ pub mod distinct_count; #[cfg(feature = "evaluation")] pub mod evaluation; -use std::hash::{Hash, Hasher}; +use std::hash::{BuildHasher, Hash}; /// Marker trait to indicate the variant implemented by a [`Count`] instance. pub trait Method: Clone + Eq + PartialEq + Send + Sync {} @@ -29,13 +29,17 @@ pub struct Distinct {} impl Method for Distinct {} /// Trait for types solving the set cardinality estimation problem. -pub trait Count { +pub trait Count { + /// Get the current hash builder + fn hasher_builder(&self) -> &H; + /// Add the given hash to the set. fn push_hash(&mut self, hash: u64); /// Add the hash of the given item, computed with the default hasher, to the set. fn push(&mut self, item: I) { - self.push_hash(item_to_hash(item)) + let hash_builder = self.hasher_builder(); + self.push_hash(hash_builder.hash_one(item)); } /// Add the given sketch to this one. @@ -51,11 +55,4 @@ pub trait Count { /// Returns the number of bytes in memory used to represent this filter. fn bytes_in_memory(&self) -> usize; -} - -fn item_to_hash(item: I) -> u64 { - // TODO: replace with a stable hashing function! - let mut hasher = std::collections::hash_map::DefaultHasher::new(); - item.hash(&mut hasher); - hasher.finish() -} +} \ No newline at end of file diff --git a/crates/geo_filters/tests/public_api.rs b/crates/geo_filters/tests/public_api.rs index d705d2d..2e0482f 100644 --- a/crates/geo_filters/tests/public_api.rs +++ b/crates/geo_filters/tests/public_api.rs @@ -1,3 +1,5 @@ +use fnv::FnvBuildHasher; + #[test] fn can_use_predefined_diff_count() { use geo_filters::diff_count::GeoDiffCount7; @@ -11,7 +13,7 @@ fn can_use_predefined_diff_count() { fn can_use_custom_diff_count() { use geo_filters::diff_count::{GeoDiffConfig7, GeoDiffCount}; use geo_filters::Count; - let mut f = GeoDiffCount::::default(); + let mut f = GeoDiffCount::::default(); f.push(42); f.size(); } @@ -21,7 +23,7 @@ fn can_use_diff_count_with_predefined_config_value() { use geo_filters::diff_count::{GeoDiffConfig7, GeoDiffCount}; use geo_filters::Count; let c = GeoDiffConfig7::default(); - let mut f = GeoDiffCount::new(c); + let mut f = GeoDiffCount::new(c, FnvBuildHasher::default()); f.push(42); f.size(); } @@ -32,7 +34,7 @@ fn can_use_diff_count_with_fixed_config_value() { use geo_filters::diff_count::GeoDiffCount; use geo_filters::Count; let c = FixedConfig::<_, u16, 7, 128, 10>::default(); - let mut f = GeoDiffCount::new(c); + let mut f = GeoDiffCount::new(c, FnvBuildHasher::default()); f.push(42); f.size(); } @@ -43,7 +45,7 @@ fn can_use_diff_count_with_variable_config_value() { use geo_filters::diff_count::GeoDiffCount; use geo_filters::Count; let c = VariableConfig::<_, u16>::new(7, 128, 10); - let mut f = GeoDiffCount::new(c); + let mut f = GeoDiffCount::new(c, FnvBuildHasher::default()); f.push(42); f.size(); } @@ -61,7 +63,7 @@ fn can_use_predefined_distinct_count() { fn can_use_custom_distinct_count() { use geo_filters::distinct_count::{GeoDistinctConfig7, GeoDistinctCount}; use geo_filters::Count; - let mut f = GeoDistinctCount::::default(); + let mut f = GeoDistinctCount::::default(); f.push(42); f.size(); } @@ -71,7 +73,7 @@ fn can_use_distinct_count_with_predefined_config_value() { use geo_filters::distinct_count::{GeoDistinctConfig7, GeoDistinctCount}; use geo_filters::Count; let c = GeoDistinctConfig7::default(); - let mut f = GeoDistinctCount::new(c); + let mut f = GeoDistinctCount::new(c, FnvBuildHasher::default()); f.push(42); f.size(); } @@ -82,7 +84,7 @@ fn can_use_distinct_count_with_fixed_config_value() { use geo_filters::distinct_count::GeoDistinctCount; use geo_filters::Count; let c = FixedConfig::<_, u16, 7, 118, 11>::default(); - let mut f = GeoDistinctCount::new(c); + let mut f = GeoDistinctCount::new(c, FnvBuildHasher::default()); f.push(42); f.size(); } @@ -93,7 +95,7 @@ fn can_use_distinct_count_with_variable_config_value() { use geo_filters::distinct_count::GeoDistinctCount; use geo_filters::Count; let c = VariableConfig::<_, u16>::new(7, 118, 11); - let mut f = GeoDistinctCount::new(c); + let mut f = GeoDistinctCount::new(c, FnvBuildHasher::default()); f.push(42); f.size(); } From 77d67b5fbd0aefc0d0064e434946aaff0538ecf6 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 18 Jul 2025 14:21:36 +0100 Subject: [PATCH 059/114] update hardcoded test values --- crates/geo_filters/src/distinct_count.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index 50296bf..9253fcd 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -259,15 +259,20 @@ mod tests { #[test] fn test_geo_count() { + // Pairs of (n, expected) where n is the number of inserted items + // and expected is the expected size of the GeoDistinctCount. + // The output matching the expected values is dependent on the configuration + // and hashing function. Changes to these will lead to different results and the + // test will need to be updated. for (n, result) in [ (10, 10.0021105), (100, 100.21153), - (1000, 1001.81635), - (10000, 9951.017), - (30000, 29927.705), - (100000, 99553.24), - (1000000, 1003824.1), - (10000000, 10071972.0), + (1000, 1021.64075), + (10000, 11064.973), + (30000, 34484.45), + (100000, 112042.44), + (1000000, 827151.1), + (10000000, 3110472.8), ] { let mut geo_count = GeoDistinctCount13::default(); (0..n).for_each(|i| geo_count.push(i)); From c626ea29711dc93ed2c676f45db026cf5486d3e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 02:13:09 +0000 Subject: [PATCH 060/114] Bump rui314/setup-mold Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from 85c79d00377f0d32cdbae595a46de6f7c2fa6599 to 702b1908b5edf30d71a8d1666b724e0f0c6fa035. - [Commits](https://github.com/rui314/setup-mold/compare/85c79d00377f0d32cdbae595a46de6f7c2fa6599...702b1908b5edf30d71a8d1666b724e0f0c6fa035) --- updated-dependencies: - dependency-name: rui314/setup-mold dependency-version: 702b1908b5edf30d71a8d1666b724e0f0c6fa035 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3d4c57f..44e0ab7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 + - uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 - name: Build run: make build @@ -38,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 + - uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 - name: Check formatting and clippy run: make lint @@ -49,7 +49,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@85c79d00377f0d32cdbae595a46de6f7c2fa6599 + - uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 - name: Run unit tests run: make test From 4259f654d0dd9c0529de172672152bc0325e7c0f Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 09:32:47 +0100 Subject: [PATCH 061/114] wip save point --- crates/geo_filters/evaluation/accuracy.rs | 17 ++-- crates/geo_filters/evaluation/performance.rs | 8 +- crates/geo_filters/src/build_hasher.rs | 27 ++++++ crates/geo_filters/src/config.rs | 83 ++++++++++++++---- crates/geo_filters/src/diff_count.rs | 73 ++++++++++------ crates/geo_filters/src/diff_count/config.rs | 5 +- crates/geo_filters/src/diff_count/sim_hash.rs | 13 +-- crates/geo_filters/src/distinct_count.rs | 85 ++++++++++++++----- .../geo_filters/src/distinct_count/config.rs | 5 +- crates/geo_filters/src/evaluation/hll.rs | 1 + crates/geo_filters/src/lib.rs | 7 +- crates/geo_filters/tests/public_api.rs | 4 +- 12 files changed, 238 insertions(+), 90 deletions(-) create mode 100644 crates/geo_filters/src/build_hasher.rs diff --git a/crates/geo_filters/evaluation/accuracy.rs b/crates/geo_filters/evaluation/accuracy.rs index 3db898f..2deea38 100644 --- a/crates/geo_filters/evaluation/accuracy.rs +++ b/crates/geo_filters/evaluation/accuracy.rs @@ -3,6 +3,7 @@ use std::path::PathBuf; use clap::Parser; use fnv::FnvBuildHasher; +use geo_filters::build_hasher::DefaultBuildHasher; use geo_filters::config::VariableConfig; use itertools::Itertools; use once_cell::sync::Lazy; @@ -158,19 +159,19 @@ static SIMULATION_CONFIG_FROM_STR: Lazy> = Lazy::new match t { BucketType::U8 => { let c = VariableConfig::<_, u8>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone(), FnvBuildHasher::default()))) + Box::new(move || Box::new(GeoDiffCount::new(c.clone(), DefaultBuildHasher::default()))) } BucketType::U16 => { let c = VariableConfig::<_, u16>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone(), FnvBuildHasher::default()))) + Box::new(move || Box::new(GeoDiffCount::new(c.clone(), DefaultBuildHasher::default()))) } BucketType::U32 => { let c = VariableConfig::<_, u32>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone(), FnvBuildHasher::default()))) + Box::new(move || Box::new(GeoDiffCount::new(c.clone(), DefaultBuildHasher::default()))) } BucketType::U64 => { let c = VariableConfig::<_, u64>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone(), FnvBuildHasher::default()))) + Box::new(move || Box::new(GeoDiffCount::new(c.clone(), DefaultBuildHasher::default()))) } } }), @@ -187,19 +188,19 @@ static SIMULATION_CONFIG_FROM_STR: Lazy> = Lazy::new match t { BucketType::U8 => { let c = VariableConfig::<_, u8>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), FnvBuildHasher::default()))) + Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), DefaultBuildHasher::default()))) } BucketType::U16 => { let c = VariableConfig::<_, u16>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), FnvBuildHasher::default()))) + Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), DefaultBuildHasher::default()))) } BucketType::U32 => { let c = VariableConfig::<_, u32>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), FnvBuildHasher::default()))) + Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), DefaultBuildHasher::default()))) } BucketType::U64 => { let c = VariableConfig::<_, u64>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), FnvBuildHasher::default()))) + Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), DefaultBuildHasher::default()))) } } }), diff --git a/crates/geo_filters/evaluation/performance.rs b/crates/geo_filters/evaluation/performance.rs index eac4d65..2a493bd 100644 --- a/crates/geo_filters/evaluation/performance.rs +++ b/crates/geo_filters/evaluation/performance.rs @@ -23,7 +23,7 @@ fn criterion_benchmark(c: &mut Criterion) { group.bench_function("geo_diff_count_var_13", |b| { let c = VariableConfig::<_, u32>::new(13, 7680, 256); b.iter(move || { - let mut gc = GeoDiffCount::new(c.clone(), FnvBuildHasher::default()); + let mut gc = GeoDiffCount::new(c.clone()); for i in 0..*size { gc.push(i); } @@ -62,7 +62,7 @@ fn criterion_benchmark(c: &mut Criterion) { group.bench_function("geo_diff_count_var_13", |b| { let c = VariableConfig::<_, u32>::new(13, 7680, 256); b.iter(move || { - let mut gc = GeoDiffCount::new(c.clone(), FnvBuildHasher::default()); + let mut gc = GeoDiffCount::new(c.clone()); for i in 0..*size { gc.push(i); black_box(gc.size()); @@ -107,8 +107,8 @@ fn criterion_benchmark(c: &mut Criterion) { group.bench_function("geo_diff_count_var_13", |b| { let c = VariableConfig::<_, u32>::new(13, 7680, 256); b.iter(move || { - let mut gc1 = GeoDiffCount::new(c.clone(), FnvBuildHasher::default()); - let mut gc2 = GeoDiffCount::new(c.clone(), FnvBuildHasher::default()); + let mut gc1 = GeoDiffCount::new(c.clone()); + let mut gc2 = GeoDiffCount::new(c.clone()); for i in 0..size { gc1.push(i * 2); gc2.push(i * 2 + 1); diff --git a/crates/geo_filters/src/build_hasher.rs b/crates/geo_filters/src/build_hasher.rs new file mode 100644 index 0000000..f861f22 --- /dev/null +++ b/crates/geo_filters/src/build_hasher.rs @@ -0,0 +1,27 @@ +use std::hash::{BuildHasher, BuildHasherDefault, DefaultHasher, Hasher as _}; + +/// Trait for a hasher factory that can be used to produce hashers +/// for use with geometric filters. +/// +/// It is a super set of [`BuildHasher`], enforcing additional requirements +/// on the hasher builder that are required for the geometric filters and +/// surrounding code. +/// +/// When performing operations across two different geometric filters, +/// the hashers must be equal, i.e. they must produce the same hash for the +/// same input. This is checked by the `hasher_eq` method. +pub trait GeoFilterBuildHasher: BuildHasher + Default + Clone + Send + Sync { + fn hasher_eq(&self, other: &Self) -> bool { + let v1 = self.build_hasher().finish(); + let v2 = other.build_hasher().finish(); + v1 == v2 + } +} + +impl GeoFilterBuildHasher for T +where + T: BuildHasher + Default + Clone + Send + Sync, +{ +} + +pub type DefaultBuildHasher = BuildHasherDefault; \ No newline at end of file diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index 013c4ce..aaaac6c 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -2,7 +2,7 @@ use std::{marker::PhantomData, sync::Arc}; -use crate::Method; +use crate::{build_hasher::GeoFilterBuildHasher, Method}; mod bitchunks; mod buckets; @@ -79,8 +79,16 @@ pub trait GeoConfig: Clone + Eq + Sized + Send + Sync { /// Instantiating this type may panic if `T` is too small to hold the maximum possible /// bucket id determined by `B`, or `B` is larger than the largest statically defined /// lookup table. -#[derive(Clone, Eq, PartialEq)] -pub struct FixedConfig { +#[derive(Clone)] +pub struct FixedConfig< + M: Method, + T, + const B: usize, + const BYTES: usize, + const MSB: usize, + H: GeoFilterBuildHasher, +> { + build_hasher: H, _phantom: PhantomData<(M, T)>, } @@ -90,7 +98,8 @@ impl< const B: usize, const BYTES: usize, const MSB: usize, - > GeoConfig for FixedConfig + H: GeoFilterBuildHasher, + > GeoConfig for FixedConfig { type BucketType = T; @@ -148,46 +157,87 @@ impl< const B: usize, const BYTES: usize, const MSB: usize, - > Default for FixedConfig + H: GeoFilterBuildHasher, + > Default for FixedConfig { fn default() -> Self { assert_bucket_type_large_enough::(B); assert_buckets_within_estimation_bound(B, BYTES * BITS_PER_BYTE); + assert!( B < M::get_lookups().len(), "B = {} is not available for fixed config, requires B < {}", B, M::get_lookups().len() ); + Self { _phantom: PhantomData, + build_hasher: H::default(), } } } +impl< + M: Method + Lookups, + T: IsBucketType, + const B: usize, + const BYTES: usize, + const MSB: usize, + H: GeoFilterBuildHasher, + > PartialEq for FixedConfig +{ + fn eq(&self, other: &Self) -> bool { + self.build_hasher.hasher_eq(&other.build_hasher) + } +} + +impl< + M: Method + Lookups, + T: IsBucketType, + const B: usize, + const BYTES: usize, + const MSB: usize, + H: GeoFilterBuildHasher, + > Eq for FixedConfig +{ +} + /// Geometric filter configuration using dynamic lookup tables. #[derive(Clone)] -pub struct VariableConfig { +pub struct VariableConfig { b: usize, bytes: usize, msb: usize, _phantom: PhantomData<(M, T)>, lookup: Arc, + build_hasher: H, } -impl Eq for VariableConfig {} +impl Eq for VariableConfig {} -impl PartialEq for VariableConfig { +impl PartialEq for VariableConfig { fn eq(&self, other: &Self) -> bool { - self.b == other.b && self.bytes == other.bytes && self.msb == other.msb + self.b == other.b + && self.bytes == other.bytes + && self.msb == other.msb + && self.build_hasher.hasher_eq(&other.build_hasher) } } -impl VariableConfig { +impl VariableConfig { /// Returns a new configuration value. See [`FixedConfig`] for the meaning /// of the parameters. This functions computes a new lookup table every time /// it is invoked, so make sure to share the resulting value as much as possible. pub fn new(b: usize, bytes: usize, msb: usize) -> Self { + Self::with_hasher(b, bytes, msb, H::default()) + } + + /// Returns a new configuration value, specifying the [`GeoFilterBuildHasher`]. + /// Useful, for example, if you wish to use a custom seed in your hashers. + /// + /// See [`Self::new`] for more. + pub fn with_hasher(b: usize, bytes: usize, msb: usize, build_hasher: H) -> Self { assert_bucket_type_large_enough::(b); assert_buckets_within_estimation_bound(b, bytes * BITS_PER_BYTE); Self { @@ -196,6 +246,7 @@ impl VariableConfig { msb, _phantom: PhantomData, lookup: Arc::new(M::new_lookup(b)), + build_hasher, } } @@ -205,7 +256,9 @@ impl VariableConfig { } } -impl GeoConfig for VariableConfig { +impl GeoConfig + for VariableConfig +{ type BucketType = T; #[inline] @@ -306,14 +359,14 @@ pub(crate) fn take_ref(iter: &mut I, n: usize) -> impl Iterator>(f: impl Fn() -> C) -> (f32, f32) { + pub(crate) fn test_estimate>( + f: impl Fn() -> C, + ) -> (f32, f32) { let mut rnd = rand::rngs::StdRng::from_os_rng(); let cnt = 10000usize; let mut avg_precision = 0.0; diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 07e0b12..1255776 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -2,9 +2,9 @@ use std::borrow::Cow; use std::cmp::Ordering; -use std::hash::BuildHasher; use std::mem::{size_of, size_of_val}; +use crate::build_hasher::{DefaultBuildHasher, GeoFilterBuildHasher}; use crate::config::{ count_ones_from_bitchunks, count_ones_from_msb_and_lsb, iter_bit_chunks, iter_ones, mask_bit_chunks, take_ref, xor_bit_chunks, BitChunk, GeoConfig, IsBucketType, @@ -17,13 +17,12 @@ mod sim_hash; use bitvec::*; pub use config::{GeoDiffConfig13, GeoDiffConfig7}; -use fnv::FnvBuildHasher; /// Diff count filter with a relative error standard deviation of ~0.125. -pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7, FnvBuildHasher>; +pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7, DefaultBuildHasher>; /// Diff count filter with a relative error standard deviation of ~0.015. -pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13, FnvBuildHasher>; +pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13, DefaultBuildHasher>; /// Probabilistic diff count data structure based on geometric filters. /// @@ -59,15 +58,15 @@ pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13, FnvBuildHasher>; /// 1500 bytes achieves a precision of ~0.022 and could estimate the 10k items with an error /// of +/-22k items in the best case which is 20 times worse despite using 5 times more space! #[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord)] -pub struct GeoDiffCount<'a, C: GeoConfig, H: BuildHasher + Clone> { +pub struct GeoDiffCount<'a, C: GeoConfig, H: GeoFilterBuildHasher = DefaultBuildHasher> { config: C, /// The bit positions are stored from largest to smallest. msb: Cow<'a, [C::BucketType]>, lsb: BitVec<'a>, - hash_builder: H, + build_hasher: H, } -impl, H: BuildHasher + Clone> std::fmt::Debug for GeoDiffCount<'_, C, H> { +impl, H: GeoFilterBuildHasher> std::fmt::Debug for GeoDiffCount<'_, C, H> { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!( f, @@ -79,13 +78,22 @@ impl, H: BuildHasher + Clone> std::fmt::Debug for GeoDiffCoun } } -impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { - pub fn new(config: C, hash_builder: H) -> Self { +impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { + pub fn new(config: C) -> Self { Self { config, msb: Default::default(), lsb: Default::default(), - hash_builder, + build_hasher: Default::default(), + } + } + + pub fn with_build_hasher(config: C, build_hasher: H) -> Self { + Self { + config, + msb: Default::default(), + lsb: Default::default(), + build_hasher, } } @@ -96,7 +104,11 @@ impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { /// /// Note: we need a peekable iterator, such that we can extract the most significant bits without /// having to construct another iterator with the remaining `BitChunk`s. - fn from_bit_chunks>(config: C, hash_builder: H, chunks: I) -> Self { + fn from_bit_chunks>( + config: C, + hash_builder: H, + chunks: I, + ) -> Self { let mut ones = iter_ones::(chunks.peekable()); let mut msb = Vec::default(); @@ -117,7 +129,7 @@ impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { config, msb: Cow::from(msb), lsb, - hash_builder, + build_hasher: hash_builder, }; result.debug_assert_invariants(); result @@ -258,7 +270,7 @@ impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { config: self.config, lsb: self.lsb.into_owned(), msb: Cow::Owned(self.msb.into_owned()), - hash_builder: self.hash_builder.clone(), + build_hasher: self.build_hasher.clone(), } } @@ -296,14 +308,14 @@ impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { /// after compression : 01 0 10 1 00 0 /// bitset of the returned filter : 010 101000 #[cfg(test)] -pub(crate) fn masked, H: BuildHasher + Clone>( +pub(crate) fn masked, H: GeoFilterBuildHasher>( diff_count: &GeoDiffCount<'_, C, H>, mask: usize, modulus: usize, ) -> GeoDiffCount<'static, C, H> { GeoDiffCount::from_bit_chunks( diff_count.config.clone(), - diff_count.hash_builder.clone(), + diff_count.build_hasher.clone(), mask_bit_chunks(diff_count.bit_chunks(), mask as u64, modulus).peekable(), ) } @@ -311,9 +323,9 @@ pub(crate) fn masked, H: BuildHasher + Clone>( /// Computes an xor of the two underlying bitsets. /// This operation corresponds to computing the symmetric difference of the two /// sets represented by the GeoDiffCounts. -/// +/// /// SAFETY: The two GeoDiffCounts must have the same configuration and hash builder. -pub(crate) fn xor, H: BuildHasher + Clone>( +pub(crate) fn xor, H: GeoFilterBuildHasher>( diff_count: &GeoDiffCount<'_, C, H>, other: &GeoDiffCount<'_, C, H>, ) -> GeoDiffCount<'static, C, H> { @@ -328,14 +340,14 @@ pub(crate) fn xor, H: BuildHasher + Clone>( GeoDiffCount::from_bit_chunks( diff_count.config.clone(), - diff_count.hash_builder.clone(), + diff_count.build_hasher.clone(), xor_bit_chunks(diff_count.bit_chunks(), other.bit_chunks()).peekable(), ) } -impl, H: BuildHasher + Clone> Count for GeoDiffCount<'_, C, H> { +impl, H: GeoFilterBuildHasher> Count for GeoDiffCount<'_, C, H> { fn hasher_builder(&self) -> &H { - &self.hash_builder + &self.build_hasher } fn push_hash(&mut self, hash: u64) { @@ -359,8 +371,16 @@ impl, H: BuildHasher + Clone> Count for GeoDiffCount } fn bytes_in_memory(&self) -> usize { - let Self { config, msb, lsb, hash_builder } = self; - size_of_val(config) + msb.len() * size_of::() + lsb.bytes_in_memory() + size_of_val(hash_builder) + let Self { + config, + msb, + lsb, + build_hasher: hash_builder, + } = self; + size_of_val(config) + + msb.len() * size_of::() + + lsb.bytes_in_memory() + + size_of_val(hash_builder) } } @@ -378,7 +398,8 @@ mod tests { // // scripts/accuracy -n 10000 geo_diff/u16/b=7/bytes=50/msb=10 // - type GeoDiffCount7_50<'a> = GeoDiffCount<'a, FixedConfig, FnvBuildHasher>; + type GeoDiffCount7_50<'a> = + GeoDiffCount<'a, FixedConfig>; #[test] fn test_geo_count() { @@ -554,7 +575,7 @@ mod tests { } let actual = GeoDiffCount::from_bit_chunks( expected.config.clone(), - expected.hash_builder.clone(), + expected.build_hasher.clone(), expected.bit_chunks().peekable(), ); assert_eq!(expected, actual); @@ -570,9 +591,9 @@ mod tests { assert_eq!(vec![17, 11, 7], a.msb.iter().copied().collect_vec()); } - impl> GeoDiffCount<'_, C, FnvBuildHasher> { + impl> GeoDiffCount<'_, C, DefaultBuildHasher> { fn from_ones(config: C, ones: impl IntoIterator) -> Self { - let mut result = Self::new(config, FnvBuildHasher::default()); + let mut result = Self::new(config); for one in ones { result.xor_bit(one); } diff --git a/crates/geo_filters/src/diff_count/config.rs b/crates/geo_filters/src/diff_count/config.rs index 7ad7447..ecb4dc9 100644 --- a/crates/geo_filters/src/diff_count/config.rs +++ b/crates/geo_filters/src/diff_count/config.rs @@ -1,5 +1,6 @@ use once_cell::sync::Lazy; +use crate::build_hasher::DefaultBuildHasher; use crate::config::EstimationLookup; use crate::config::FixedConfig; use crate::config::HashToBucketLookup; @@ -17,7 +18,7 @@ use crate::Diff; // // scripts/accuracy -n 10000 geo_diff/u16/b=7/bytes=112/msb={8,12,16,20} // -pub type GeoDiffConfig7 = FixedConfig; +pub type GeoDiffConfig7 = FixedConfig; /// Diff count configuration with a relative error standard deviation of ~0.015. // @@ -29,7 +30,7 @@ pub type GeoDiffConfig7 = FixedConfig; // // scripts/accuracy -n 1000 geo_diff/u32/b=13/bytes=7138/msb={128,192,256,384,512} // -pub type GeoDiffConfig13 = FixedConfig; +pub type GeoDiffConfig13 = FixedConfig; impl Lookups for Diff { #[inline] diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index 32ca0ae..8050b47 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -1,10 +1,11 @@ //! Similarity hashing allows quickly finding similar sets with a reverse index. -use std::hash::{BuildHasher, Hash, Hasher}; +use std::hash::{ Hash, Hasher}; use std::ops::Range; use fnv::FnvHasher; +use crate::build_hasher::GeoFilterBuildHasher; use crate::config::{BitChunk, GeoConfig, IsBucketType}; use crate::diff_count::GeoDiffCount; use crate::Diff; @@ -42,7 +43,7 @@ impl SimHash { } } -impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { +impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { /// Given the expected size of a diff, this function returns the range of bucket ids which should /// be searched for in order to find geometric filters of the desired similarity. If at least half /// of the buckets in the range match, one found a match that has the expected diff size (or better). @@ -107,13 +108,13 @@ impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { /// /// Property 2 is used to construct all sim hashes efficiently. /// Property 3 is used to search for similar GeoDiffCounts. -struct SimHashIterator<'a, C: GeoConfig, H: BuildHasher + Clone> { +struct SimHashIterator<'a, C: GeoConfig, H: GeoFilterBuildHasher> { filter: &'a GeoDiffCount<'a, C, H>, prev_bucket_id: BucketId, sim_hash: [u64; SIM_BUCKETS], } -impl<'a, C: GeoConfig, H: BuildHasher + Clone> SimHashIterator<'a, C, H> { +impl<'a, C: GeoConfig, H: GeoFilterBuildHasher> SimHashIterator<'a, C, H> { pub fn new(filter: &'a GeoDiffCount<'a, C, H>) -> Self { let msb = filter.nth_most_significant_one(0); let prev_bucket_id = @@ -126,7 +127,7 @@ impl<'a, C: GeoConfig, H: BuildHasher + Clone> SimHashIterator<'a, C, H> { } } -impl, H: BuildHasher + Clone> Iterator for SimHashIterator<'_, C, H> { +impl, H: GeoFilterBuildHasher> Iterator for SimHashIterator<'_, C, H> { type Item = (BucketId, SimHash); fn next(&mut self) -> Option { @@ -148,7 +149,7 @@ impl, H: BuildHasher + Clone> Iterator for SimHashIterator<'_ } } -impl, H: BuildHasher + Clone> GeoDiffCount<'_, C, H> { +impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { /// n specifies the desired zero-based index of the most significant one. /// The zero-based index of the desired one bit is returned. fn nth_most_significant_one(&self, mut n: usize) -> Option { diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index 9253fcd..f8d29ff 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -1,9 +1,9 @@ //! Geometric filter implementation for distinct count. use std::collections::VecDeque; -use std::hash::BuildHasher; use std::mem::{size_of, size_of_val}; +use crate::build_hasher::GeoFilterBuildHasher; use crate::config::{ count_ones_from_bitchunks, iter_bit_chunks, iter_ones, max_lsb_bytes, or_bit_chunks, take_ref, BitChunk, GeoConfig, IsBucketType, @@ -30,20 +30,24 @@ pub type GeoDistinctCount13<'a> = GeoDistinctCount<'a, GeoDistinctConfig13, FnvB /// The [`GeoDistinctCount`] falls into the category of probabilistic set size estimators. /// It has some similar properties as related filters like HyperLogLog, MinHash, etc, but uses less space. #[derive(Eq, PartialEq)] -pub struct GeoDistinctCount<'a, C: GeoConfig, H: BuildHasher> { +pub struct GeoDistinctCount<'a, C: GeoConfig, H: GeoFilterBuildHasher> { config: C, hash_builder: H, msb: VecDeque, lsb: BitDeque<'a>, } -impl + Default, H: BuildHasher + Clone + Default> Default for GeoDistinctCount<'_, C, H> { +impl + Default, H: GeoFilterBuildHasher> Default + for GeoDistinctCount<'_, C, H> +{ fn default() -> Self { - Self::new(C::default(), H::default()) + Self::with_build_hasher(C::default(), H::default()) } } -impl, H: BuildHasher + Clone> std::fmt::Debug for GeoDistinctCount<'_, C, H> { +impl, H: GeoFilterBuildHasher> std::fmt::Debug + for GeoDistinctCount<'_, C, H> +{ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!( f, @@ -55,17 +59,30 @@ impl, H: BuildHasher + Clone> std::fmt::Debug for GeoDist } } -impl, H: BuildHasher + Clone> GeoDistinctCount<'_, C, H> { - pub fn new(config: C, hash_builder: H) -> Self { +impl, H: GeoFilterBuildHasher> GeoDistinctCount<'_, C, H> { + pub fn new(config: C) -> Self { + Self::with_build_hasher(config, H::default()) + } + + pub fn with_build_hasher(config: C, hash_builder: H) -> Self { let msb = Default::default(); let lsb = BitDeque::new(max_lsb_bytes::( config.max_bytes(), config.max_msb_len(), )); - Self { config, msb, lsb, hash_builder } + Self { + config, + msb, + lsb, + hash_builder, + } } - fn from_bit_chunks>(config: C, hash_builder: H, chunks: I) -> Self { + fn from_bit_chunks>( + config: C, + hash_builder: H, + chunks: I, + ) -> Self { let mut ones = iter_ones::(chunks.peekable()); let mut msb = VecDeque::default(); @@ -86,7 +103,12 @@ impl, H: BuildHasher + Clone> GeoDistinctCount<'_, C, H> max_lsb_bytes::(config.max_bytes(), config.max_msb_len()), ); - let result = Self { config, msb, lsb, hash_builder }; + let result = Self { + config, + msb, + lsb, + hash_builder, + }; result.debug_assert_invariants(); result } @@ -131,7 +153,9 @@ impl, H: BuildHasher + Clone> GeoDistinctCount<'_, C, H> } } -impl, H: BuildHasher + Clone> Count for GeoDistinctCount<'_, C, H> { +impl, H: GeoFilterBuildHasher> Count + for GeoDistinctCount<'_, C, H> +{ fn hasher_builder(&self) -> &H { &self.hash_builder } @@ -181,13 +205,20 @@ impl, H: BuildHasher + Clone> Count for GeoD } fn bytes_in_memory(&self) -> usize { - let Self { config, msb, lsb, hash_builder } = self; - size_of_val(config) + msb.len() * size_of::() + lsb.bytes_in_memory() + - size_of_val(hash_builder) + let Self { + config, + msb, + lsb, + hash_builder, + } = self; + size_of_val(config) + + msb.len() * size_of::() + + lsb.bytes_in_memory() + + size_of_val(hash_builder) } } -impl, H: BuildHasher + Clone> GeoDistinctCount<'_, C, H> { +impl, H: GeoFilterBuildHasher> GeoDistinctCount<'_, C, H> { fn insert_into_lsb(&mut self, bucket: usize) { if !self.lsb.test_bit(bucket) { self.lsb.set_bit(bucket); @@ -216,7 +247,7 @@ impl, H: BuildHasher + Clone> GeoDistinctCount<'_, C, H> } } -fn or, H: BuildHasher + Clone>( +fn or, H: GeoFilterBuildHasher>( a: &GeoDistinctCount<'_, C, H>, b: &GeoDistinctCount<'_, C, H>, ) -> GeoDistinctCount<'static, C, H> { @@ -241,6 +272,7 @@ mod tests { use itertools::Itertools; use rand::{RngCore, SeedableRng}; + use crate::build_hasher::DefaultBuildHasher; use crate::config::{iter_ones, tests::test_estimate, FixedConfig, VariableConfig}; use crate::evaluation::simulation::simulate; @@ -248,7 +280,7 @@ mod tests { #[test] fn test_lookup_table() { - let c = FixedConfig::::default(); + let c = FixedConfig::::default(); for i in 0..c.max_bytes() * 4 { let hash = (c.phi_f64().powf(i as f64 + 0.5) * u64::MAX as f64).round() as u64; let a = c.hash_to_bucket(hash); @@ -262,7 +294,7 @@ mod tests { // Pairs of (n, expected) where n is the number of inserted items // and expected is the expected size of the GeoDistinctCount. // The output matching the expected values is dependent on the configuration - // and hashing function. Changes to these will lead to different results and the + // and hashing function. Changes to these will lead to different results and the // test will need to be updated. for (n, result) in [ (10, 10.0021105), @@ -377,11 +409,15 @@ mod tests { let msb = golden_section_min(1.0, 1000.0, |msb| { simulate( || { - Box::new(GeoDistinctCount::new(VariableConfig::<_, u32>::new( + Box::new(GeoDistinctCount::new(VariableConfig::< + _, + u32, + DefaultBuildHasher, + >::new( 13, 7800, (7800 - (msb.round() as usize) * 8) / 3, - ), FnvBuildHasher::default())) + ))) }, 3000, &[100000], @@ -399,8 +435,11 @@ mod tests { for _ in 0..1000 { expected.push_hash(rnd.next_u64()); } - let actual = - GeoDistinctCount::from_bit_chunks(expected.config.clone(), expected.hash_builder.clone(), expected.bit_chunks()); + let actual = GeoDistinctCount::from_bit_chunks( + expected.config.clone(), + expected.hash_builder.clone(), + expected.bit_chunks(), + ); assert_eq!(expected, actual); } } @@ -416,7 +455,7 @@ mod tests { impl> GeoDistinctCount<'_, C, FnvBuildHasher> { fn from_ones(config: C, ones: impl IntoIterator) -> Self { - let mut result = Self::new(config, FnvBuildHasher::default()); + let mut result = Self::new(config); for one in ones { result.set_bit(one); } diff --git a/crates/geo_filters/src/distinct_count/config.rs b/crates/geo_filters/src/distinct_count/config.rs index 6498fe5..8118c91 100644 --- a/crates/geo_filters/src/distinct_count/config.rs +++ b/crates/geo_filters/src/distinct_count/config.rs @@ -1,5 +1,6 @@ use once_cell::sync::Lazy; +use crate::build_hasher::DefaultBuildHasher; use crate::config::EstimationLookup; use crate::config::FixedConfig; use crate::config::HashToBucketLookup; @@ -18,7 +19,7 @@ use crate::Distinct; // // scripts/accuracy -n 10000 geo_distinct/u16/b=7/bytes=136/msb={8,16,32,64} // -pub type GeoDistinctConfig7 = FixedConfig; +pub type GeoDistinctConfig7 = FixedConfig; /// Distinct count configuration with a relative error standard deviation of ~0.0075. /// Uses at most 9248 bytes of memory. @@ -31,7 +32,7 @@ pub type GeoDistinctConfig7 = FixedConfig; // // scripts/accuracy -n 10000 geo_distinct/u32/b=13/bytes=9216/msb={128,192,256,320,512,640} // -pub type GeoDistinctConfig13 = FixedConfig; +pub type GeoDistinctConfig13 = FixedConfig; impl Lookups for Distinct { #[inline] diff --git a/crates/geo_filters/src/evaluation/hll.rs b/crates/geo_filters/src/evaluation/hll.rs index 299db81..254f749 100644 --- a/crates/geo_filters/src/evaluation/hll.rs +++ b/crates/geo_filters/src/evaluation/hll.rs @@ -77,6 +77,7 @@ pub struct NoopHasher { hash: u64, } +#[derive(Clone, Default)] pub struct BuildNoopHasher {} impl Hasher for NoopHasher { diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 04b7c52..6e85136 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -12,8 +12,11 @@ pub mod diff_count; pub mod distinct_count; #[cfg(feature = "evaluation")] pub mod evaluation; +pub mod build_hasher; -use std::hash::{BuildHasher, Hash}; +use std::hash::Hash; + +use crate::build_hasher::GeoFilterBuildHasher; /// Marker trait to indicate the variant implemented by a [`Count`] instance. pub trait Method: Clone + Eq + PartialEq + Send + Sync {} @@ -29,7 +32,7 @@ pub struct Distinct {} impl Method for Distinct {} /// Trait for types solving the set cardinality estimation problem. -pub trait Count { +pub trait Count { /// Get the current hash builder fn hasher_builder(&self) -> &H; diff --git a/crates/geo_filters/tests/public_api.rs b/crates/geo_filters/tests/public_api.rs index 2e0482f..5849856 100644 --- a/crates/geo_filters/tests/public_api.rs +++ b/crates/geo_filters/tests/public_api.rs @@ -23,7 +23,7 @@ fn can_use_diff_count_with_predefined_config_value() { use geo_filters::diff_count::{GeoDiffConfig7, GeoDiffCount}; use geo_filters::Count; let c = GeoDiffConfig7::default(); - let mut f = GeoDiffCount::new(c, FnvBuildHasher::default()); + let mut f = GeoDiffCount::new(c); f.push(42); f.size(); } @@ -34,7 +34,7 @@ fn can_use_diff_count_with_fixed_config_value() { use geo_filters::diff_count::GeoDiffCount; use geo_filters::Count; let c = FixedConfig::<_, u16, 7, 128, 10>::default(); - let mut f = GeoDiffCount::new(c, FnvBuildHasher::default()); + let mut f = GeoDiffCount::new(c); f.push(42); f.size(); } From 7e35a6bf0e89eb852413b3580ee8970647cbafdd Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 12:46:56 +0100 Subject: [PATCH 062/114] clean up type parameters --- crates/geo_filters/evaluation/accuracy.rs | 33 +++--- crates/geo_filters/evaluation/performance.rs | 8 +- crates/geo_filters/src/build_hasher.rs | 36 +++--- crates/geo_filters/src/config.rs | 62 +++++------ crates/geo_filters/src/diff_count.rs | 80 ++++---------- crates/geo_filters/src/diff_count/sim_hash.rs | 17 ++- crates/geo_filters/src/distinct_count.rs | 103 +++++------------- crates/geo_filters/src/evaluation/hll.rs | 11 +- .../geo_filters/src/evaluation/simulation.rs | 5 +- crates/geo_filters/src/lib.rs | 17 ++- crates/geo_filters/tests/public_api.rs | 22 ++-- 11 files changed, 156 insertions(+), 238 deletions(-) diff --git a/crates/geo_filters/evaluation/accuracy.rs b/crates/geo_filters/evaluation/accuracy.rs index 2deea38..6ae6df3 100644 --- a/crates/geo_filters/evaluation/accuracy.rs +++ b/crates/geo_filters/evaluation/accuracy.rs @@ -2,7 +2,6 @@ use std::fs::File; use std::path::PathBuf; use clap::Parser; -use fnv::FnvBuildHasher; use geo_filters::build_hasher::DefaultBuildHasher; use geo_filters::config::VariableConfig; use itertools::Itertools; @@ -158,20 +157,20 @@ static SIMULATION_CONFIG_FROM_STR: Lazy> = Lazy::new let [b, bytes, msb] = capture_usizes(&c, [2, 3, 4]); match t { BucketType::U8 => { - let c = VariableConfig::<_, u8>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone(), DefaultBuildHasher::default()))) + let c = VariableConfig::<_, u8, DefaultBuildHasher>::new(b, bytes, msb); + Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) } BucketType::U16 => { - let c = VariableConfig::<_, u16>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone(), DefaultBuildHasher::default()))) + let c = VariableConfig::<_, u16, DefaultBuildHasher>::new(b, bytes, msb); + Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) } BucketType::U32 => { - let c = VariableConfig::<_, u32>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone(), DefaultBuildHasher::default()))) + let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(b, bytes, msb); + Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) } BucketType::U64 => { - let c = VariableConfig::<_, u64>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDiffCount::new(c.clone(), DefaultBuildHasher::default()))) + let c = VariableConfig::<_, u64, DefaultBuildHasher>::new(b, bytes, msb); + Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) } } }), @@ -187,20 +186,20 @@ static SIMULATION_CONFIG_FROM_STR: Lazy> = Lazy::new match t { BucketType::U8 => { - let c = VariableConfig::<_, u8>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), DefaultBuildHasher::default()))) + let c = VariableConfig::<_, u8, DefaultBuildHasher>::new(b, bytes, msb); + Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) } BucketType::U16 => { - let c = VariableConfig::<_, u16>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), DefaultBuildHasher::default()))) + let c = VariableConfig::<_, u16, DefaultBuildHasher>::new(b, bytes, msb); + Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) } BucketType::U32 => { - let c = VariableConfig::<_, u32>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), DefaultBuildHasher::default()))) + let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(b, bytes, msb); + Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) } BucketType::U64 => { - let c = VariableConfig::<_, u64>::new(b, bytes, msb); - Box::new(move || Box::new(GeoDistinctCount::new(c.clone(), DefaultBuildHasher::default()))) + let c = VariableConfig::<_, u64, DefaultBuildHasher>::new(b, bytes, msb); + Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) } } }), diff --git a/crates/geo_filters/evaluation/performance.rs b/crates/geo_filters/evaluation/performance.rs index 2a493bd..947eecb 100644 --- a/crates/geo_filters/evaluation/performance.rs +++ b/crates/geo_filters/evaluation/performance.rs @@ -1,5 +1,5 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use fnv::FnvBuildHasher; +use geo_filters::build_hasher::DefaultBuildHasher; use geo_filters::config::VariableConfig; use geo_filters::diff_count::{GeoDiffCount, GeoDiffCount13}; use geo_filters::distinct_count::GeoDistinctCount13; @@ -21,7 +21,7 @@ fn criterion_benchmark(c: &mut Criterion) { }) }); group.bench_function("geo_diff_count_var_13", |b| { - let c = VariableConfig::<_, u32>::new(13, 7680, 256); + let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(13, 7680, 256); b.iter(move || { let mut gc = GeoDiffCount::new(c.clone()); for i in 0..*size { @@ -60,7 +60,7 @@ fn criterion_benchmark(c: &mut Criterion) { }) }); group.bench_function("geo_diff_count_var_13", |b| { - let c = VariableConfig::<_, u32>::new(13, 7680, 256); + let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(13, 7680, 256); b.iter(move || { let mut gc = GeoDiffCount::new(c.clone()); for i in 0..*size { @@ -105,7 +105,7 @@ fn criterion_benchmark(c: &mut Criterion) { }) }); group.bench_function("geo_diff_count_var_13", |b| { - let c = VariableConfig::<_, u32>::new(13, 7680, 256); + let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(13, 7680, 256); b.iter(move || { let mut gc1 = GeoDiffCount::new(c.clone()); let mut gc2 = GeoDiffCount::new(c.clone()); diff --git a/crates/geo_filters/src/build_hasher.rs b/crates/geo_filters/src/build_hasher.rs index f861f22..dd7e37a 100644 --- a/crates/geo_filters/src/build_hasher.rs +++ b/crates/geo_filters/src/build_hasher.rs @@ -2,26 +2,34 @@ use std::hash::{BuildHasher, BuildHasherDefault, DefaultHasher, Hasher as _}; /// Trait for a hasher factory that can be used to produce hashers /// for use with geometric filters. -/// +/// /// It is a super set of [`BuildHasher`], enforcing additional requirements /// on the hasher builder that are required for the geometric filters and /// surrounding code. -/// +/// /// When performing operations across two different geometric filters, /// the hashers must be equal, i.e. they must produce the same hash for the -/// same input. This is checked by the `hasher_eq` method. -pub trait GeoFilterBuildHasher: BuildHasher + Default + Clone + Send + Sync { - fn hasher_eq(&self, other: &Self) -> bool { - let v1 = self.build_hasher().finish(); - let v2 = other.build_hasher().finish(); - v1 == v2 +/// same input. +pub trait ReproducibleBuildHasher: BuildHasher + Default + Clone { + #[inline] + fn debug_assert_hashers_eq() { + // In debug builds we check that hash outputs are the same for + // self and other. The library user should only have implemented + // our build hasher trait if this is already true, but we check + // here in case they have implemented the trait in error. + debug_assert_eq!( + Self::default().build_hasher().finish(), + Self::default().build_hasher().finish(), + "Hashers produced by GeoFilterBuildHasher do not produce the same output with the same input" + ); } } -impl GeoFilterBuildHasher for T -where - T: BuildHasher + Default + Clone + Send + Sync, -{ -} +// Note that this `BuildHasher` has a consistent implementation of `Default` +// but is NOT stable across releases of Rust. It is therefore dangerous +// to use if you plan on serializing the geofilters and reusing them due +// to the fact that you can serialize a filter made with one version and +// deserialize with another version of the hasher factor. +pub type DefaultBuildHasher = BuildHasherDefault; -pub type DefaultBuildHasher = BuildHasherDefault; \ No newline at end of file +impl ReproducibleBuildHasher for DefaultBuildHasher {} diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index aaaac6c..f1e2fa2 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -2,7 +2,7 @@ use std::{marker::PhantomData, sync::Arc}; -use crate::{build_hasher::GeoFilterBuildHasher, Method}; +use crate::{build_hasher::ReproducibleBuildHasher, Method}; mod bitchunks; mod buckets; @@ -30,8 +30,9 @@ use once_cell::sync::Lazy; /// Those conversions can be shared across multiple geo filter instances. This way, the /// conversions can also be optimized via e.g. lookup tables without paying the cost with every /// new geo filter instance again and again. -pub trait GeoConfig: Clone + Eq + Sized + Send + Sync { +pub trait GeoConfig: Clone + Eq + Sized { type BucketType: IsBucketType + 'static; + type BuildHasher: ReproducibleBuildHasher; /// The number of most-significant bits that are stored sparsely as positions. fn max_msb_len(&self) -> usize; @@ -86,10 +87,9 @@ pub struct FixedConfig< const B: usize, const BYTES: usize, const MSB: usize, - H: GeoFilterBuildHasher, + H: ReproducibleBuildHasher, > { - build_hasher: H, - _phantom: PhantomData<(M, T)>, + _phantom: PhantomData<(M, T, H)>, } impl< @@ -98,10 +98,11 @@ impl< const B: usize, const BYTES: usize, const MSB: usize, - H: GeoFilterBuildHasher, + H: ReproducibleBuildHasher, > GeoConfig for FixedConfig { type BucketType = T; + type BuildHasher = H; #[inline] fn max_msb_len(&self) -> usize { @@ -157,7 +158,7 @@ impl< const B: usize, const BYTES: usize, const MSB: usize, - H: GeoFilterBuildHasher, + H: ReproducibleBuildHasher, > Default for FixedConfig { fn default() -> Self { @@ -173,7 +174,6 @@ impl< Self { _phantom: PhantomData, - build_hasher: H::default(), } } } @@ -184,11 +184,15 @@ impl< const B: usize, const BYTES: usize, const MSB: usize, - H: GeoFilterBuildHasher, + H: ReproducibleBuildHasher, > PartialEq for FixedConfig { - fn eq(&self, other: &Self) -> bool { - self.build_hasher.hasher_eq(&other.build_hasher) + fn eq(&self, _other: &Self) -> bool { + H::debug_assert_hashers_eq(); + + // The values of the fixed config are provided at compile time + // so no runtime computation is required + true } } @@ -198,46 +202,36 @@ impl< const B: usize, const BYTES: usize, const MSB: usize, - H: GeoFilterBuildHasher, + H: ReproducibleBuildHasher, > Eq for FixedConfig { } /// Geometric filter configuration using dynamic lookup tables. #[derive(Clone)] -pub struct VariableConfig { +pub struct VariableConfig { b: usize, bytes: usize, msb: usize, - _phantom: PhantomData<(M, T)>, + _phantom: PhantomData<(M, T, H)>, lookup: Arc, - build_hasher: H, } -impl Eq for VariableConfig {} +impl Eq for VariableConfig {} -impl PartialEq for VariableConfig { +impl PartialEq for VariableConfig { fn eq(&self, other: &Self) -> bool { - self.b == other.b - && self.bytes == other.bytes - && self.msb == other.msb - && self.build_hasher.hasher_eq(&other.build_hasher) + H::debug_assert_hashers_eq(); + + self.b == other.b && self.bytes == other.bytes && self.msb == other.msb } } -impl VariableConfig { +impl VariableConfig { /// Returns a new configuration value. See [`FixedConfig`] for the meaning /// of the parameters. This functions computes a new lookup table every time /// it is invoked, so make sure to share the resulting value as much as possible. pub fn new(b: usize, bytes: usize, msb: usize) -> Self { - Self::with_hasher(b, bytes, msb, H::default()) - } - - /// Returns a new configuration value, specifying the [`GeoFilterBuildHasher`]. - /// Useful, for example, if you wish to use a custom seed in your hashers. - /// - /// See [`Self::new`] for more. - pub fn with_hasher(b: usize, bytes: usize, msb: usize, build_hasher: H) -> Self { assert_bucket_type_large_enough::(b); assert_buckets_within_estimation_bound(b, bytes * BITS_PER_BYTE); Self { @@ -246,7 +240,6 @@ impl VariableConf msb, _phantom: PhantomData, lookup: Arc::new(M::new_lookup(b)), - build_hasher, } } @@ -256,10 +249,11 @@ impl VariableConf } } -impl GeoConfig +impl GeoConfig for VariableConfig { type BucketType = T; + type BuildHasher = H; #[inline] fn max_msb_len(&self) -> usize { @@ -361,10 +355,10 @@ pub(crate) fn take_ref(iter: &mut I, n: usize) -> impl Iterator>( + pub(crate) fn test_estimate>( f: impl Fn() -> C, ) -> (f32, f32) { let mut rnd = rand::rngs::StdRng::from_os_rng(); diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 1255776..f5b366d 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -4,7 +4,6 @@ use std::borrow::Cow; use std::cmp::Ordering; use std::mem::{size_of, size_of_val}; -use crate::build_hasher::{DefaultBuildHasher, GeoFilterBuildHasher}; use crate::config::{ count_ones_from_bitchunks, count_ones_from_msb_and_lsb, iter_bit_chunks, iter_ones, mask_bit_chunks, take_ref, xor_bit_chunks, BitChunk, GeoConfig, IsBucketType, @@ -19,10 +18,10 @@ use bitvec::*; pub use config::{GeoDiffConfig13, GeoDiffConfig7}; /// Diff count filter with a relative error standard deviation of ~0.125. -pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7, DefaultBuildHasher>; +pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7>; /// Diff count filter with a relative error standard deviation of ~0.015. -pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13, DefaultBuildHasher>; +pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13>; /// Probabilistic diff count data structure based on geometric filters. /// @@ -58,15 +57,14 @@ pub type GeoDiffCount13<'a> = GeoDiffCount<'a, GeoDiffConfig13, DefaultBuildHash /// 1500 bytes achieves a precision of ~0.022 and could estimate the 10k items with an error /// of +/-22k items in the best case which is 20 times worse despite using 5 times more space! #[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord)] -pub struct GeoDiffCount<'a, C: GeoConfig, H: GeoFilterBuildHasher = DefaultBuildHasher> { +pub struct GeoDiffCount<'a, C: GeoConfig> { config: C, /// The bit positions are stored from largest to smallest. msb: Cow<'a, [C::BucketType]>, lsb: BitVec<'a>, - build_hasher: H, } -impl, H: GeoFilterBuildHasher> std::fmt::Debug for GeoDiffCount<'_, C, H> { +impl> std::fmt::Debug for GeoDiffCount<'_, C> { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!( f, @@ -78,22 +76,12 @@ impl, H: GeoFilterBuildHasher> std::fmt::Debug for GeoDiffCou } } -impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { +impl> GeoDiffCount<'_, C> { pub fn new(config: C) -> Self { Self { config, msb: Default::default(), lsb: Default::default(), - build_hasher: Default::default(), - } - } - - pub fn with_build_hasher(config: C, build_hasher: H) -> Self { - Self { - config, - msb: Default::default(), - lsb: Default::default(), - build_hasher, } } @@ -104,11 +92,7 @@ impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { /// /// Note: we need a peekable iterator, such that we can extract the most significant bits without /// having to construct another iterator with the remaining `BitChunk`s. - fn from_bit_chunks>( - config: C, - hash_builder: H, - chunks: I, - ) -> Self { + fn from_bit_chunks>(config: C, chunks: I) -> Self { let mut ones = iter_ones::(chunks.peekable()); let mut msb = Vec::default(); @@ -129,7 +113,6 @@ impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { config, msb: Cow::from(msb), lsb, - build_hasher: hash_builder, }; result.debug_assert_invariants(); result @@ -265,12 +248,11 @@ impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { // Consumers the current GeoDiffCount and produces an owned GeoDiffCount that // can live arbitrarily. - pub fn into_owned(self) -> GeoDiffCount<'static, C, H> { + pub fn into_owned(self) -> GeoDiffCount<'static, C> { GeoDiffCount { config: self.config, lsb: self.lsb.into_owned(), msb: Cow::Owned(self.msb.into_owned()), - build_hasher: self.build_hasher.clone(), } } @@ -308,14 +290,13 @@ impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { /// after compression : 01 0 10 1 00 0 /// bitset of the returned filter : 010 101000 #[cfg(test)] -pub(crate) fn masked, H: GeoFilterBuildHasher>( - diff_count: &GeoDiffCount<'_, C, H>, +pub(crate) fn masked>( + diff_count: &GeoDiffCount<'_, C>, mask: usize, modulus: usize, -) -> GeoDiffCount<'static, C, H> { +) -> GeoDiffCount<'static, C> { GeoDiffCount::from_bit_chunks( diff_count.config.clone(), - diff_count.build_hasher.clone(), mask_bit_chunks(diff_count.bit_chunks(), mask as u64, modulus).peekable(), ) } @@ -325,31 +306,22 @@ pub(crate) fn masked, H: GeoFilterBuildHasher>( /// sets represented by the GeoDiffCounts. /// /// SAFETY: The two GeoDiffCounts must have the same configuration and hash builder. -pub(crate) fn xor, H: GeoFilterBuildHasher>( - diff_count: &GeoDiffCount<'_, C, H>, - other: &GeoDiffCount<'_, C, H>, -) -> GeoDiffCount<'static, C, H> { +pub(crate) fn xor>( + diff_count: &GeoDiffCount<'_, C>, + other: &GeoDiffCount<'_, C>, +) -> GeoDiffCount<'static, C> { assert!( diff_count.config == other.config, "combined filters must have the same configuration" ); - // It would be really nice to be able to asser that our hash builders have - // the same state here, but from what I can see it is not common - // for hash builders to implement `PartialEq` or `Eq`. - GeoDiffCount::from_bit_chunks( diff_count.config.clone(), - diff_count.build_hasher.clone(), xor_bit_chunks(diff_count.bit_chunks(), other.bit_chunks()).peekable(), ) } -impl, H: GeoFilterBuildHasher> Count for GeoDiffCount<'_, C, H> { - fn hasher_builder(&self) -> &H { - &self.build_hasher - } - +impl> Count for GeoDiffCount<'_, C> { fn push_hash(&mut self, hash: u64) { self.xor_bit(self.config.hash_to_bucket(hash)); } @@ -371,16 +343,9 @@ impl, H: GeoFilterBuildHasher> Count for GeoDiffCoun } fn bytes_in_memory(&self) -> usize { - let Self { - config, - msb, - lsb, - build_hasher: hash_builder, - } = self; - size_of_val(config) - + msb.len() * size_of::() - + lsb.bytes_in_memory() - + size_of_val(hash_builder) + let Self { config, msb, lsb } = self; + + size_of_val(config) + msb.len() * size_of::() + lsb.bytes_in_memory() } } @@ -389,7 +354,10 @@ mod tests { use itertools::Itertools; use rand::{RngCore, SeedableRng}; - use crate::config::{iter_ones, tests::test_estimate, FixedConfig}; + use crate::{ + build_hasher::DefaultBuildHasher, + config::{iter_ones, tests::test_estimate, FixedConfig}, + }; use super::*; @@ -414,6 +382,7 @@ mod tests { (10000000, 10194611.0), ] { let mut geo_count = GeoDiffCount13::default(); + (0..n).for_each(|i| geo_count.push(i)); assert_eq!(result, geo_count.size()); } @@ -575,7 +544,6 @@ mod tests { } let actual = GeoDiffCount::from_bit_chunks( expected.config.clone(), - expected.build_hasher.clone(), expected.bit_chunks().peekable(), ); assert_eq!(expected, actual); @@ -591,7 +559,7 @@ mod tests { assert_eq!(vec![17, 11, 7], a.msb.iter().copied().collect_vec()); } - impl> GeoDiffCount<'_, C, DefaultBuildHasher> { + impl> GeoDiffCount<'_, C> { fn from_ones(config: C, ones: impl IntoIterator) -> Self { let mut result = Self::new(config); for one in ones { diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index 8050b47..cee2370 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -1,11 +1,10 @@ //! Similarity hashing allows quickly finding similar sets with a reverse index. -use std::hash::{ Hash, Hasher}; +use std::hash::{Hash, Hasher}; use std::ops::Range; use fnv::FnvHasher; -use crate::build_hasher::GeoFilterBuildHasher; use crate::config::{BitChunk, GeoConfig, IsBucketType}; use crate::diff_count::GeoDiffCount; use crate::Diff; @@ -43,7 +42,7 @@ impl SimHash { } } -impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { +impl> GeoDiffCount<'_, C> { /// Given the expected size of a diff, this function returns the range of bucket ids which should /// be searched for in order to find geometric filters of the desired similarity. If at least half /// of the buckets in the range match, one found a match that has the expected diff size (or better). @@ -108,14 +107,14 @@ impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { /// /// Property 2 is used to construct all sim hashes efficiently. /// Property 3 is used to search for similar GeoDiffCounts. -struct SimHashIterator<'a, C: GeoConfig, H: GeoFilterBuildHasher> { - filter: &'a GeoDiffCount<'a, C, H>, +struct SimHashIterator<'a, C: GeoConfig> { + filter: &'a GeoDiffCount<'a, C>, prev_bucket_id: BucketId, sim_hash: [u64; SIM_BUCKETS], } -impl<'a, C: GeoConfig, H: GeoFilterBuildHasher> SimHashIterator<'a, C, H> { - pub fn new(filter: &'a GeoDiffCount<'a, C, H>) -> Self { +impl<'a, C: GeoConfig> SimHashIterator<'a, C> { + pub fn new(filter: &'a GeoDiffCount<'a, C>) -> Self { let msb = filter.nth_most_significant_one(0); let prev_bucket_id = msb.map(|b| b.into_usize() / SIM_BUCKET_SIZE).unwrap_or(0) + SIM_BUCKETS; @@ -127,7 +126,7 @@ impl<'a, C: GeoConfig, H: GeoFilterBuildHasher> SimHashIterator<'a, C, H> } } -impl, H: GeoFilterBuildHasher> Iterator for SimHashIterator<'_, C, H> { +impl> Iterator for SimHashIterator<'_, C> { type Item = (BucketId, SimHash); fn next(&mut self) -> Option { @@ -149,7 +148,7 @@ impl, H: GeoFilterBuildHasher> Iterator for SimHashIterator<' } } -impl, H: GeoFilterBuildHasher> GeoDiffCount<'_, C, H> { +impl> GeoDiffCount<'_, C> { /// n specifies the desired zero-based index of the most significant one. /// The zero-based index of the desired one bit is returned. fn nth_most_significant_one(&self, mut n: usize) -> Option { diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index f8d29ff..cdb68f9 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -3,7 +3,6 @@ use std::collections::VecDeque; use std::mem::{size_of, size_of_val}; -use crate::build_hasher::GeoFilterBuildHasher; use crate::config::{ count_ones_from_bitchunks, iter_bit_chunks, iter_ones, max_lsb_bytes, or_bit_chunks, take_ref, BitChunk, GeoConfig, IsBucketType, @@ -15,39 +14,33 @@ mod bitdeque; mod config; pub use config::{GeoDistinctConfig13, GeoDistinctConfig7}; -use fnv::FnvBuildHasher; /// Distinct count filter with a relative error standard deviation of ~0.065. /// Uses at most 168 bytes of memory. -pub type GeoDistinctCount7<'a> = GeoDistinctCount<'a, GeoDistinctConfig7, FnvBuildHasher>; +pub type GeoDistinctCount7<'a> = GeoDistinctCount<'a, GeoDistinctConfig7>; /// Distinct count filter with a relative error standard deviation of ~0.0075. /// Uses at most 9248 bytes of memory. -pub type GeoDistinctCount13<'a> = GeoDistinctCount<'a, GeoDistinctConfig13, FnvBuildHasher>; +pub type GeoDistinctCount13<'a> = GeoDistinctCount<'a, GeoDistinctConfig13>; /// Probabilistic distinct count data structure based on geometric filters. /// /// The [`GeoDistinctCount`] falls into the category of probabilistic set size estimators. /// It has some similar properties as related filters like HyperLogLog, MinHash, etc, but uses less space. #[derive(Eq, PartialEq)] -pub struct GeoDistinctCount<'a, C: GeoConfig, H: GeoFilterBuildHasher> { +pub struct GeoDistinctCount<'a, C: GeoConfig> { config: C, - hash_builder: H, msb: VecDeque, lsb: BitDeque<'a>, } -impl + Default, H: GeoFilterBuildHasher> Default - for GeoDistinctCount<'_, C, H> -{ +impl + Default> Default for GeoDistinctCount<'_, C> { fn default() -> Self { - Self::with_build_hasher(C::default(), H::default()) + Self::new(C::default()) } } -impl, H: GeoFilterBuildHasher> std::fmt::Debug - for GeoDistinctCount<'_, C, H> -{ +impl> std::fmt::Debug for GeoDistinctCount<'_, C> { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!( f, @@ -59,30 +52,17 @@ impl, H: GeoFilterBuildHasher> std::fmt::Debug } } -impl, H: GeoFilterBuildHasher> GeoDistinctCount<'_, C, H> { +impl> GeoDistinctCount<'_, C> { pub fn new(config: C) -> Self { - Self::with_build_hasher(config, H::default()) - } - - pub fn with_build_hasher(config: C, hash_builder: H) -> Self { let msb = Default::default(); let lsb = BitDeque::new(max_lsb_bytes::( config.max_bytes(), config.max_msb_len(), )); - Self { - config, - msb, - lsb, - hash_builder, - } + Self { config, msb, lsb } } - fn from_bit_chunks>( - config: C, - hash_builder: H, - chunks: I, - ) -> Self { + fn from_bit_chunks>(config: C, chunks: I) -> Self { let mut ones = iter_ones::(chunks.peekable()); let mut msb = VecDeque::default(); @@ -103,12 +83,7 @@ impl, H: GeoFilterBuildHasher> GeoDistinctCount<'_, C, H> max_lsb_bytes::(config.max_bytes(), config.max_msb_len()), ); - let result = Self { - config, - msb, - lsb, - hash_builder, - }; + let result = Self { config, msb, lsb }; result.debug_assert_invariants(); result } @@ -153,13 +128,7 @@ impl, H: GeoFilterBuildHasher> GeoDistinctCount<'_, C, H> } } -impl, H: GeoFilterBuildHasher> Count - for GeoDistinctCount<'_, C, H> -{ - fn hasher_builder(&self) -> &H { - &self.hash_builder - } - +impl> Count for GeoDistinctCount<'_, C> { fn push_hash(&mut self, hash: u64) { self.set_bit(self.config.hash_to_bucket(hash)); } @@ -205,20 +174,12 @@ impl, H: GeoFilterBuildHasher> Count } fn bytes_in_memory(&self) -> usize { - let Self { - config, - msb, - lsb, - hash_builder, - } = self; - size_of_val(config) - + msb.len() * size_of::() - + lsb.bytes_in_memory() - + size_of_val(hash_builder) + let Self { config, msb, lsb } = self; + size_of_val(config) + msb.len() * size_of::() + lsb.bytes_in_memory() } } -impl, H: GeoFilterBuildHasher> GeoDistinctCount<'_, C, H> { +impl> GeoDistinctCount<'_, C> { fn insert_into_lsb(&mut self, bucket: usize) { if !self.lsb.test_bit(bucket) { self.lsb.set_bit(bucket); @@ -247,22 +208,17 @@ impl, H: GeoFilterBuildHasher> GeoDistinctCount<'_, C, H> } } -fn or, H: GeoFilterBuildHasher>( - a: &GeoDistinctCount<'_, C, H>, - b: &GeoDistinctCount<'_, C, H>, -) -> GeoDistinctCount<'static, C, H> { +fn or>( + a: &GeoDistinctCount<'_, C>, + b: &GeoDistinctCount<'_, C>, +) -> GeoDistinctCount<'static, C> { assert!( a.config == b.config, "combined filters must have the same configuration" ); - // It would be really nice to be able to asser that our hash builders have - // the same state here, but from what I can see it is not common - // for hash builders to implement `PartialEq` or `Eq`. - - GeoDistinctCount::from_bit_chunks( + GeoDistinctCount::<'static, C>::from_bit_chunks( a.config.clone(), - a.hash_builder.clone(), or_bit_chunks(a.bit_chunks(), b.bit_chunks()).peekable(), ) } @@ -299,12 +255,12 @@ mod tests { for (n, result) in [ (10, 10.0021105), (100, 100.21153), - (1000, 1021.64075), - (10000, 11064.973), - (30000, 34484.45), - (100000, 112042.44), - (1000000, 827151.1), - (10000000, 3110472.8), + (1000, 1001.81635), + (10000, 9951.017), + (30000, 29927.705), + (100000, 99553.24), + (1000000, 1003824.1), + (10000000, 10071972.0), ] { let mut geo_count = GeoDistinctCount13::default(); (0..n).for_each(|i| geo_count.push(i)); @@ -435,11 +391,8 @@ mod tests { for _ in 0..1000 { expected.push_hash(rnd.next_u64()); } - let actual = GeoDistinctCount::from_bit_chunks( - expected.config.clone(), - expected.hash_builder.clone(), - expected.bit_chunks(), - ); + let actual = + GeoDistinctCount::from_bit_chunks(expected.config.clone(), expected.bit_chunks()); assert_eq!(expected, actual); } } @@ -453,7 +406,7 @@ mod tests { assert_eq!(vec![17, 11, 7], a.msb.iter().copied().collect_vec()); } - impl> GeoDistinctCount<'_, C, FnvBuildHasher> { + impl> GeoDistinctCount<'_, C> { fn from_ones(config: C, ones: impl IntoIterator) -> Self { let mut result = Self::new(config); for one in ones { diff --git a/crates/geo_filters/src/evaluation/hll.rs b/crates/geo_filters/src/evaluation/hll.rs index 254f749..d6210f9 100644 --- a/crates/geo_filters/src/evaluation/hll.rs +++ b/crates/geo_filters/src/evaluation/hll.rs @@ -8,7 +8,10 @@ use std::{ use hyperloglogplus::{HyperLogLog, HyperLogLogPlus}; -use crate::{Count, Distinct}; +use crate::{ + build_hasher::{DefaultBuildHasher, ReproducibleBuildHasher}, + Count, Distinct, +}; /// Uses at most 192 bytes. /// The relative error has a standard deviation of ~0.065. @@ -105,11 +108,9 @@ impl BuildHasher for BuildNoopHasher { } } -impl Count for Hll { - fn hasher_builder(&self) -> &BuildNoopHasher { - unimplemented!() - } +impl ReproducibleBuildHasher for BuildNoopHasher {} +impl Count for Hll { fn push_hash(&mut self, hash: u64) { self.inner.borrow_mut().insert(&hash) } diff --git a/crates/geo_filters/src/evaluation/simulation.rs b/crates/geo_filters/src/evaluation/simulation.rs index 1698b74..badedfe 100644 --- a/crates/geo_filters/src/evaluation/simulation.rs +++ b/crates/geo_filters/src/evaluation/simulation.rs @@ -1,7 +1,6 @@ use std::io::Write; use std::time::Instant; -use fnv::FnvBuildHasher; use itertools::Itertools; use rand::{RngCore, SeedableRng}; use rayon::prelude::{IntoParallelIterator, ParallelIterator}; @@ -21,7 +20,7 @@ pub trait SimulationCount { fn size(&self) -> f32; fn bytes_in_memory(&self) -> usize; } -impl + Clone> SimulationCount for GeoDiffCount<'_, C, FnvBuildHasher> { +impl + Clone> SimulationCount for GeoDiffCount<'_, C> { fn push_hash(&mut self, hash: u64) { >::push_hash(self, hash) } @@ -32,7 +31,7 @@ impl + Clone> SimulationCount for GeoDiffCount<'_, C, FnvBuil >::bytes_in_memory(self) } } -impl> SimulationCount for GeoDistinctCount<'_, C, FnvBuildHasher> { +impl> SimulationCount for GeoDistinctCount<'_, C> { fn push_hash(&mut self, hash: u64) { >::push_hash(self, hash) } diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 6e85136..4d97e23 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -7,16 +7,16 @@ //! Supports estimating the size of the union of two sets with a precision related to the estimated size. //! It has some similar properties as related filters like HyperLogLog, MinHash, etc, but uses less space. +pub mod build_hasher; pub mod config; pub mod diff_count; pub mod distinct_count; #[cfg(feature = "evaluation")] pub mod evaluation; -pub mod build_hasher; use std::hash::Hash; -use crate::build_hasher::GeoFilterBuildHasher; +use crate::build_hasher::ReproducibleBuildHasher; /// Marker trait to indicate the variant implemented by a [`Count`] instance. pub trait Method: Clone + Eq + PartialEq + Send + Sync {} @@ -32,17 +32,14 @@ pub struct Distinct {} impl Method for Distinct {} /// Trait for types solving the set cardinality estimation problem. -pub trait Count { - /// Get the current hash builder - fn hasher_builder(&self) -> &H; - +pub trait Count { /// Add the given hash to the set. fn push_hash(&mut self, hash: u64); - /// Add the hash of the given item, computed with the default hasher, to the set. + /// Add the hash of the given item, computed with the configured hasher, to the set. fn push(&mut self, item: I) { - let hash_builder = self.hasher_builder(); - self.push_hash(hash_builder.hash_one(item)); + let build_hasher = H::default(); + self.push_hash(build_hasher.hash_one(item)); } /// Add the given sketch to this one. @@ -58,4 +55,4 @@ pub trait Count { /// Returns the number of bytes in memory used to represent this filter. fn bytes_in_memory(&self) -> usize; -} \ No newline at end of file +} diff --git a/crates/geo_filters/tests/public_api.rs b/crates/geo_filters/tests/public_api.rs index 5849856..5656286 100644 --- a/crates/geo_filters/tests/public_api.rs +++ b/crates/geo_filters/tests/public_api.rs @@ -1,4 +1,4 @@ -use fnv::FnvBuildHasher; +use geo_filters::build_hasher::DefaultBuildHasher; #[test] fn can_use_predefined_diff_count() { @@ -13,7 +13,7 @@ fn can_use_predefined_diff_count() { fn can_use_custom_diff_count() { use geo_filters::diff_count::{GeoDiffConfig7, GeoDiffCount}; use geo_filters::Count; - let mut f = GeoDiffCount::::default(); + let mut f = GeoDiffCount::::default(); f.push(42); f.size(); } @@ -33,7 +33,7 @@ fn can_use_diff_count_with_fixed_config_value() { use geo_filters::config::FixedConfig; use geo_filters::diff_count::GeoDiffCount; use geo_filters::Count; - let c = FixedConfig::<_, u16, 7, 128, 10>::default(); + let c = FixedConfig::<_, u16, 7, 128, 10, DefaultBuildHasher>::default(); let mut f = GeoDiffCount::new(c); f.push(42); f.size(); @@ -44,8 +44,8 @@ fn can_use_diff_count_with_variable_config_value() { use geo_filters::config::VariableConfig; use geo_filters::diff_count::GeoDiffCount; use geo_filters::Count; - let c = VariableConfig::<_, u16>::new(7, 128, 10); - let mut f = GeoDiffCount::new(c, FnvBuildHasher::default()); + let c = VariableConfig::<_, u16, DefaultBuildHasher>::new(7, 128, 10); + let mut f = GeoDiffCount::new(c); f.push(42); f.size(); } @@ -63,7 +63,7 @@ fn can_use_predefined_distinct_count() { fn can_use_custom_distinct_count() { use geo_filters::distinct_count::{GeoDistinctConfig7, GeoDistinctCount}; use geo_filters::Count; - let mut f = GeoDistinctCount::::default(); + let mut f = GeoDistinctCount::::default(); f.push(42); f.size(); } @@ -73,7 +73,7 @@ fn can_use_distinct_count_with_predefined_config_value() { use geo_filters::distinct_count::{GeoDistinctConfig7, GeoDistinctCount}; use geo_filters::Count; let c = GeoDistinctConfig7::default(); - let mut f = GeoDistinctCount::new(c, FnvBuildHasher::default()); + let mut f = GeoDistinctCount::new(c); f.push(42); f.size(); } @@ -83,8 +83,8 @@ fn can_use_distinct_count_with_fixed_config_value() { use geo_filters::config::FixedConfig; use geo_filters::distinct_count::GeoDistinctCount; use geo_filters::Count; - let c = FixedConfig::<_, u16, 7, 118, 11>::default(); - let mut f = GeoDistinctCount::new(c, FnvBuildHasher::default()); + let c = FixedConfig::<_, u16, 7, 118, 11, DefaultBuildHasher>::default(); + let mut f = GeoDistinctCount::new(c); f.push(42); f.size(); } @@ -94,8 +94,8 @@ fn can_use_distinct_count_with_variable_config_value() { use geo_filters::config::VariableConfig; use geo_filters::distinct_count::GeoDistinctCount; use geo_filters::Count; - let c = VariableConfig::<_, u16>::new(7, 118, 11); - let mut f = GeoDistinctCount::new(c, FnvBuildHasher::default()); + let c = VariableConfig::<_, u16, DefaultBuildHasher>::new(7, 118, 11); + let mut f = GeoDistinctCount::new(c); f.push(42); f.size(); } From 7f450d73aa92f0ac12ca76c006ff27430c384f45 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 12:53:24 +0100 Subject: [PATCH 063/114] new clippy rule --- crates/geo_filters/src/config/buckets.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/geo_filters/src/config/buckets.rs b/crates/geo_filters/src/config/buckets.rs index 0d673c0..55cac2b 100644 --- a/crates/geo_filters/src/config/buckets.rs +++ b/crates/geo_filters/src/config/buckets.rs @@ -21,8 +21,7 @@ where fn into_block(self) -> u64 { assert!( self.into_usize() < BITS_PER_BLOCK, - "position in block must be less then 64, got {:?}", - self + "position in block must be less then 64, got {self:?}", ); 1u64 << self.into_usize() } From 86e75826276b5079eba47142024ae3be9df0497b Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 14:18:19 +0100 Subject: [PATCH 064/114] docs --- .../docs/choosing-a-hash-function.md | 113 ++++++++++++++++++ crates/geo_filters/src/build_hasher.rs | 3 + 2 files changed, 116 insertions(+) create mode 100644 crates/geo_filters/docs/choosing-a-hash-function.md diff --git a/crates/geo_filters/docs/choosing-a-hash-function.md b/crates/geo_filters/docs/choosing-a-hash-function.md new file mode 100644 index 0000000..c486238 --- /dev/null +++ b/crates/geo_filters/docs/choosing-a-hash-function.md @@ -0,0 +1,113 @@ +# Choosing a hash function + +## Reproducibility + +This library uses hash functions to assign values to buckets deterministically. The same item +will hash to the same value, and modify the same bit in the geofilter. + +When comparing geofilters it is important that the same hash functions, using the same seed +values, have been used for *both* filters. Attempting to compare geofilters which have been +produced using different hash functions or the same hash function with different seeds will +produce nonsensical results. + +Similar to the Rust standard library, this crate uses the `BuildHasher` trait and creates +a new `Hasher` for every item processed. + +To help prevent mistakes caused by mismatching hash functions or seeds we introduce a trait +`ReproducibleBuildHasher` which you must implement if you wish to use a custom hashing function. +By marking a `BuildHasher` with this trait you're asserting that `Hasher`s produced using +`Default::default` will hash identical items to the same `u64` value across multiple calls +to `BuildHasher::hash_one`. + +The following is an example of some incorrect code which produces nonsense results: + +```rust +// Implement our marker trait for `RandomState`. +// You should _NOT_ do this as `RandomState::default` does not produce +// reproducible hashers. +impl ReproducibleBuildHasher for RandomState {} + +#[test] +fn test_different_hash_functions() { + // The last parameter in this FixedConfig means we're using RandomState as the BuildHasher + pub type FixedConfigRandom = FixedConfig; + + let mut a = GeoDiffCount::new(FixedConfigRandom::default()); + let mut b = GeoDiffCount::new(FixedConfigRandom::default()); + + // Add our values + for n in 0..100 { + a.push(n); + b.push(n); + } + + // We have inserted the same items into both filters so we'd expect the + // symmetric difference to be zero if all is well. + let diff_size = a.size_with_sketch(&b); + + // But all is not well. This assertion fails! + assert_eq!(diff_size, 0.0); +} +``` + +The actual value returned in this example is ~200. This makes sense because the geofilter +thinks that there are 100 unique values in each of the filters, so the difference is approximated +as being ~200. If we were to rerun the above example with a genuinely reproducable `BuildHasher` +then the resulting diff size would be `0`. + +In debug builds, as part of the config's `eq` implementation, our library will assert that the `BuildHasher`s +produce the same `u64` value when given the same input but this is not enabled in release builds. + +## Stability + +Following from this, it might be important that your hash functions and seed values are stable, meaning, +that they won't change from one release to another. + +The default function provided in this library is *NOT* stable as it is based on the Rust standard libraries +`DefaultHasher` which does not have a specified algorithm and may change across releases of Rust. + +Stability is especially important to consider if you are using serialized geofilters which may have +been created in a previous version of the Rust standard library. + +This library provides an implementation of `ReproducibleBuildHasher` for the `FnvBuildHasher` provided +by the `fnv` crate version `1.0`. This is a _stable_ hash function in that it won't change unexpectedly +but it doesn't have good diffusion properties. This means if your input items have low entropy (for +example numbers from `0..10000`) you will find that the geofilter is not able to produce accurate estimations. + +## Uniformity and Diffusion + +In order to produce accurate estimations it is important that your hash function is able to produce evenly +distributed outputs for your input items. + +This property must be balanced against the performance requirements of your system as stronger hashing +algorithms are often slower. + +Depending on your input data, different functions may be more or less appropriate. For example, if your input +items have high entropy (e.g. SHA256 values) then the diffusion of your hash function might matter less. + +## Implementing your own `ReproducibleBuildHasher` type + +If you are using a hash function that you have not implemented yourself you will not be able to implement +`ReproducibleBuildHasher` on that type directly due to Rust's orphan rules. The easiest way to get around this +is to create a newtype which proxies the underlying `BuildHasher`. + +In addition to `BuildHasher` `ReproducibleBuildHasher` needs `Default` and `Clone`, which is usually implemented +on `BuildHasher`s, so you can probably just `#[derive(...)]` those. If your `BuildHasher` doesn't have those +traits then you may need to implement them manually. + +Here is an example of how to use new types to mark your `BuildHasher` as reproducible. + +```rust +#[derive(Clone, Default)] +pub struct MyBuildHasher(BuildHasherDefault); + +impl BuildHasher for MyBuildHasher { + type Hasher = DefaultHasher; + + fn build_hasher(&self) -> Self::Hasher { + self.0.build_hasher() + } +} + +impl ReproducibleBuildHasher for MyBuildHasher {} +``` diff --git a/crates/geo_filters/src/build_hasher.rs b/crates/geo_filters/src/build_hasher.rs index dd7e37a..5fd9775 100644 --- a/crates/geo_filters/src/build_hasher.rs +++ b/crates/geo_filters/src/build_hasher.rs @@ -1,5 +1,7 @@ use std::hash::{BuildHasher, BuildHasherDefault, DefaultHasher, Hasher as _}; +use fnv::FnvBuildHasher; + /// Trait for a hasher factory that can be used to produce hashers /// for use with geometric filters. /// @@ -33,3 +35,4 @@ pub trait ReproducibleBuildHasher: BuildHasher + Default + Clone { pub type DefaultBuildHasher = BuildHasherDefault; impl ReproducibleBuildHasher for DefaultBuildHasher {} +impl ReproducibleBuildHasher for FnvBuildHasher {} From 885d8dbc3e5a21f8de39f06ef4da6af3a13d66e7 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 14:36:32 +0100 Subject: [PATCH 065/114] fix test lints --- crates/geo_filters/src/config/lookup.rs | 4 ++-- crates/geo_filters/src/evaluation/simulation.rs | 4 ++-- crates/string-offsets/src/lib.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/geo_filters/src/config/lookup.rs b/crates/geo_filters/src/config/lookup.rs index 1e73757..2081f72 100644 --- a/crates/geo_filters/src/config/lookup.rs +++ b/crates/geo_filters/src/config/lookup.rs @@ -54,13 +54,13 @@ mod tests { #[test] fn test_lookup_7() { let var = lookup_random_hashes_variance::<7>(1 << 16); - assert!(var < 1e-4, "variance {} too large", var); + assert!(var < 1e-4, "variance {var} too large"); } #[test] fn test_lookup_13() { let var = lookup_random_hashes_variance::<13>(1 << 16); - assert!(var < 1e-4, "variance {} too large", var); + assert!(var < 1e-4, "variance {var} too large"); } fn lookup_random_hashes_variance(n: u64) -> f64 { diff --git a/crates/geo_filters/src/evaluation/simulation.rs b/crates/geo_filters/src/evaluation/simulation.rs index badedfe..d6987c9 100644 --- a/crates/geo_filters/src/evaluation/simulation.rs +++ b/crates/geo_filters/src/evaluation/simulation.rs @@ -98,7 +98,7 @@ pub fn run_simulations( println!("Parameters:"); println!(); println!(" number of configs = {}", configs.len()); - println!(" number of samples = {}", samples); + println!(" number of samples = {samples}"); println!(" number of sets = {}", set_sizes.len()); println!(); @@ -107,7 +107,7 @@ pub fn run_simulations( let results = configs .iter() .map(|(name, f)| { - print!(" {} ... ", name); + print!(" {name} ... "); std::io::stdout().flush().expect("stdout can be flushed"); let t = Instant::now(); let result = simulate(f, samples, set_sizes); diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 02a26aa..35900ad 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -449,7 +449,7 @@ mod tests { 0 => 0, 1..=3 => 1, 4 => 2, - _ => panic!("invalid utf8 char width: {}", len), + _ => panic!("invalid utf8 char width: {len}"), } } From be373ee6a6116b117e07982b395eeff24e4ab9a9 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 15:09:54 +0100 Subject: [PATCH 066/114] reworks --- .../docs/choosing-a-hash-function.md | 2 ++ crates/geo_filters/src/build_hasher.rs | 12 ++++++------ crates/geo_filters/src/config.rs | 6 ++---- crates/geo_filters/src/diff_count.rs | 8 ++++++-- crates/geo_filters/src/distinct_count.rs | 4 +++- crates/geo_filters/src/evaluation/hll.rs | 8 ++++++-- .../geo_filters/src/evaluation/simulation.rs | 18 +++++++++--------- crates/geo_filters/src/lib.rs | 8 +++++--- 8 files changed, 39 insertions(+), 27 deletions(-) diff --git a/crates/geo_filters/docs/choosing-a-hash-function.md b/crates/geo_filters/docs/choosing-a-hash-function.md index c486238..e2bb0c7 100644 --- a/crates/geo_filters/docs/choosing-a-hash-function.md +++ b/crates/geo_filters/docs/choosing-a-hash-function.md @@ -22,6 +22,8 @@ to `BuildHasher::hash_one`. The following is an example of some incorrect code which produces nonsense results: ```rust +use std::hash::RandomState; + // Implement our marker trait for `RandomState`. // You should _NOT_ do this as `RandomState::default` does not produce // reproducible hashers. diff --git a/crates/geo_filters/src/build_hasher.rs b/crates/geo_filters/src/build_hasher.rs index 5fd9775..9310ac3 100644 --- a/crates/geo_filters/src/build_hasher.rs +++ b/crates/geo_filters/src/build_hasher.rs @@ -22,16 +22,16 @@ pub trait ReproducibleBuildHasher: BuildHasher + Default + Clone { debug_assert_eq!( Self::default().build_hasher().finish(), Self::default().build_hasher().finish(), - "Hashers produced by GeoFilterBuildHasher do not produce the same output with the same input" + "Hashers produced by ReproducibleBuildHasher do not produce the same output with the same input" ); } } -// Note that this `BuildHasher` has a consistent implementation of `Default` -// but is NOT stable across releases of Rust. It is therefore dangerous -// to use if you plan on serializing the geofilters and reusing them due -// to the fact that you can serialize a filter made with one version and -// deserialize with another version of the hasher factor. +/// Note that this `BuildHasher` has a consistent implementation of `Default` +/// but is NOT stable across releases of Rust. It is therefore dangerous +/// to use if you plan on serializing the geofilters and reusing them due +/// to the fact that you can serialize a filter made with one version and +/// deserialize with another version of the hasher factor. pub type DefaultBuildHasher = BuildHasherDefault; impl ReproducibleBuildHasher for DefaultBuildHasher {} diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index f1e2fa2..d66da44 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -355,12 +355,10 @@ pub(crate) fn take_ref(iter: &mut I, n: usize) -> impl Iterator>( - f: impl Fn() -> C, - ) -> (f32, f32) { + pub(crate) fn test_estimate>(f: impl Fn() -> C) -> (f32, f32) { let mut rnd = rand::rngs::StdRng::from_os_rng(); let cnt = 10000usize; let mut avg_precision = 0.0; diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index f5b366d..63d945e 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -305,7 +305,9 @@ pub(crate) fn masked>( /// This operation corresponds to computing the symmetric difference of the two /// sets represented by the GeoDiffCounts. /// -/// SAFETY: The two GeoDiffCounts must have the same configuration and hash builder. +/// # Panics +/// +/// Panics if the configuration of the geofilters is not identical. pub(crate) fn xor>( diff_count: &GeoDiffCount<'_, C>, other: &GeoDiffCount<'_, C>, @@ -321,7 +323,9 @@ pub(crate) fn xor>( ) } -impl> Count for GeoDiffCount<'_, C> { +impl> Count for GeoDiffCount<'_, C> { + type BuildHasher = C::BuildHasher; + fn push_hash(&mut self, hash: u64) { self.xor_bit(self.config.hash_to_bucket(hash)); } diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index cdb68f9..0cff6b6 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -128,7 +128,9 @@ impl> GeoDistinctCount<'_, C> { } } -impl> Count for GeoDistinctCount<'_, C> { +impl> Count for GeoDistinctCount<'_, C> { + type BuildHasher = C::BuildHasher; + fn push_hash(&mut self, hash: u64) { self.set_bit(self.config.hash_to_bucket(hash)); } diff --git a/crates/geo_filters/src/evaluation/hll.rs b/crates/geo_filters/src/evaluation/hll.rs index d6210f9..1284e73 100644 --- a/crates/geo_filters/src/evaluation/hll.rs +++ b/crates/geo_filters/src/evaluation/hll.rs @@ -91,7 +91,9 @@ impl Hasher for NoopHasher { #[inline] fn write(&mut self, _: &[u8]) { - unimplemented!("NoopHasher only supports writing u64 values"); + unimplemented!( + "NoopHasher does not support arbitrary byte sequences. Use write_u64 instead" + ); } #[inline] @@ -110,7 +112,9 @@ impl BuildHasher for BuildNoopHasher { impl ReproducibleBuildHasher for BuildNoopHasher {} -impl Count for Hll { +impl Count for Hll { + type BuildHasher = DefaultBuildHasher; + fn push_hash(&mut self, hash: u64) { self.inner.borrow_mut().insert(&hash) } diff --git a/crates/geo_filters/src/evaluation/simulation.rs b/crates/geo_filters/src/evaluation/simulation.rs index d6987c9..eedb7d7 100644 --- a/crates/geo_filters/src/evaluation/simulation.rs +++ b/crates/geo_filters/src/evaluation/simulation.rs @@ -22,35 +22,35 @@ pub trait SimulationCount { } impl + Clone> SimulationCount for GeoDiffCount<'_, C> { fn push_hash(&mut self, hash: u64) { - >::push_hash(self, hash) + >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size(self) } fn bytes_in_memory(&self) -> usize { - >::bytes_in_memory(self) + >::bytes_in_memory(self) } } impl> SimulationCount for GeoDistinctCount<'_, C> { fn push_hash(&mut self, hash: u64) { - >::push_hash(self, hash) + >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size(self) } fn bytes_in_memory(&self) -> usize { - >::bytes_in_memory(self) + >::bytes_in_memory(self) } } impl SimulationCount for Hll { fn push_hash(&mut self, hash: u64) { - >::push_hash(self, hash) + >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size(self) } fn bytes_in_memory(&self) -> usize { - >::bytes_in_memory(self) + >::bytes_in_memory(self) } } diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 4d97e23..13cf5bf 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -14,7 +14,7 @@ pub mod distinct_count; #[cfg(feature = "evaluation")] pub mod evaluation; -use std::hash::Hash; +use std::hash::{BuildHasher as _, Hash}; use crate::build_hasher::ReproducibleBuildHasher; @@ -32,13 +32,15 @@ pub struct Distinct {} impl Method for Distinct {} /// Trait for types solving the set cardinality estimation problem. -pub trait Count { +pub trait Count { + type BuildHasher: ReproducibleBuildHasher; + /// Add the given hash to the set. fn push_hash(&mut self, hash: u64); /// Add the hash of the given item, computed with the configured hasher, to the set. fn push(&mut self, item: I) { - let build_hasher = H::default(); + let build_hasher = Self::BuildHasher::default(); self.push_hash(build_hasher.hash_one(item)); } From 4eb1f73eaf6ca473bf4799fd83b9adbe3cd02667 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 15:43:23 +0100 Subject: [PATCH 067/114] Further reworks - Parametize config type aliases - Remove dependency on BuildHasher from Count - Add readme test - Clarify in type alias that default build hasher is unstable --- crates/geo_filters/evaluation/accuracy.rs | 24 +++++++++----- crates/geo_filters/evaluation/performance.rs | 8 ++--- crates/geo_filters/src/build_hasher.rs | 4 +-- crates/geo_filters/src/diff_count.rs | 12 ++++--- crates/geo_filters/src/diff_count/config.rs | 12 +++---- crates/geo_filters/src/distinct_count.rs | 15 ++++++--- .../geo_filters/src/distinct_count/config.rs | 12 ++++--- crates/geo_filters/src/evaluation/hll.rs | 9 +++-- crates/geo_filters/src/lib.rs | 11 ++----- crates/geo_filters/tests/public_api.rs | 33 +++++++++++++++---- 10 files changed, 86 insertions(+), 54 deletions(-) diff --git a/crates/geo_filters/evaluation/accuracy.rs b/crates/geo_filters/evaluation/accuracy.rs index 6ae6df3..6248f07 100644 --- a/crates/geo_filters/evaluation/accuracy.rs +++ b/crates/geo_filters/evaluation/accuracy.rs @@ -2,7 +2,7 @@ use std::fs::File; use std::path::PathBuf; use clap::Parser; -use geo_filters::build_hasher::DefaultBuildHasher; +use geo_filters::build_hasher::UnstableDefaultBuildHasher; use geo_filters::config::VariableConfig; use itertools::Itertools; use once_cell::sync::Lazy; @@ -157,19 +157,22 @@ static SIMULATION_CONFIG_FROM_STR: Lazy> = Lazy::new let [b, bytes, msb] = capture_usizes(&c, [2, 3, 4]); match t { BucketType::U8 => { - let c = VariableConfig::<_, u8, DefaultBuildHasher>::new(b, bytes, msb); + let c = VariableConfig::<_, u8, UnstableDefaultBuildHasher>::new(b, bytes, msb); Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) } BucketType::U16 => { - let c = VariableConfig::<_, u16, DefaultBuildHasher>::new(b, bytes, msb); + let c = + VariableConfig::<_, u16, UnstableDefaultBuildHasher>::new(b, bytes, msb); Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) } BucketType::U32 => { - let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(b, bytes, msb); + let c = + VariableConfig::<_, u32, UnstableDefaultBuildHasher>::new(b, bytes, msb); Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) } BucketType::U64 => { - let c = VariableConfig::<_, u64, DefaultBuildHasher>::new(b, bytes, msb); + let c = + VariableConfig::<_, u64, UnstableDefaultBuildHasher>::new(b, bytes, msb); Box::new(move || Box::new(GeoDiffCount::new(c.clone()))) } } @@ -186,19 +189,22 @@ static SIMULATION_CONFIG_FROM_STR: Lazy> = Lazy::new match t { BucketType::U8 => { - let c = VariableConfig::<_, u8, DefaultBuildHasher>::new(b, bytes, msb); + let c = VariableConfig::<_, u8, UnstableDefaultBuildHasher>::new(b, bytes, msb); Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) } BucketType::U16 => { - let c = VariableConfig::<_, u16, DefaultBuildHasher>::new(b, bytes, msb); + let c = + VariableConfig::<_, u16, UnstableDefaultBuildHasher>::new(b, bytes, msb); Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) } BucketType::U32 => { - let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(b, bytes, msb); + let c = + VariableConfig::<_, u32, UnstableDefaultBuildHasher>::new(b, bytes, msb); Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) } BucketType::U64 => { - let c = VariableConfig::<_, u64, DefaultBuildHasher>::new(b, bytes, msb); + let c = + VariableConfig::<_, u64, UnstableDefaultBuildHasher>::new(b, bytes, msb); Box::new(move || Box::new(GeoDistinctCount::new(c.clone()))) } } diff --git a/crates/geo_filters/evaluation/performance.rs b/crates/geo_filters/evaluation/performance.rs index 947eecb..31a3fee 100644 --- a/crates/geo_filters/evaluation/performance.rs +++ b/crates/geo_filters/evaluation/performance.rs @@ -1,5 +1,5 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use geo_filters::build_hasher::DefaultBuildHasher; +use geo_filters::build_hasher::UnstableDefaultBuildHasher; use geo_filters::config::VariableConfig; use geo_filters::diff_count::{GeoDiffCount, GeoDiffCount13}; use geo_filters::distinct_count::GeoDistinctCount13; @@ -21,7 +21,7 @@ fn criterion_benchmark(c: &mut Criterion) { }) }); group.bench_function("geo_diff_count_var_13", |b| { - let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(13, 7680, 256); + let c = VariableConfig::<_, u32, UnstableDefaultBuildHasher>::new(13, 7680, 256); b.iter(move || { let mut gc = GeoDiffCount::new(c.clone()); for i in 0..*size { @@ -60,7 +60,7 @@ fn criterion_benchmark(c: &mut Criterion) { }) }); group.bench_function("geo_diff_count_var_13", |b| { - let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(13, 7680, 256); + let c = VariableConfig::<_, u32, UnstableDefaultBuildHasher>::new(13, 7680, 256); b.iter(move || { let mut gc = GeoDiffCount::new(c.clone()); for i in 0..*size { @@ -105,7 +105,7 @@ fn criterion_benchmark(c: &mut Criterion) { }) }); group.bench_function("geo_diff_count_var_13", |b| { - let c = VariableConfig::<_, u32, DefaultBuildHasher>::new(13, 7680, 256); + let c = VariableConfig::<_, u32, UnstableDefaultBuildHasher>::new(13, 7680, 256); b.iter(move || { let mut gc1 = GeoDiffCount::new(c.clone()); let mut gc2 = GeoDiffCount::new(c.clone()); diff --git a/crates/geo_filters/src/build_hasher.rs b/crates/geo_filters/src/build_hasher.rs index 9310ac3..0509bfd 100644 --- a/crates/geo_filters/src/build_hasher.rs +++ b/crates/geo_filters/src/build_hasher.rs @@ -32,7 +32,7 @@ pub trait ReproducibleBuildHasher: BuildHasher + Default + Clone { /// to use if you plan on serializing the geofilters and reusing them due /// to the fact that you can serialize a filter made with one version and /// deserialize with another version of the hasher factor. -pub type DefaultBuildHasher = BuildHasherDefault; +pub type UnstableDefaultBuildHasher = BuildHasherDefault; -impl ReproducibleBuildHasher for DefaultBuildHasher {} +impl ReproducibleBuildHasher for UnstableDefaultBuildHasher {} impl ReproducibleBuildHasher for FnvBuildHasher {} diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 63d945e..7e784c6 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -2,6 +2,7 @@ use std::borrow::Cow; use std::cmp::Ordering; +use std::hash::BuildHasher as _; use std::mem::{size_of, size_of_val}; use crate::config::{ @@ -324,12 +325,15 @@ pub(crate) fn xor>( } impl> Count for GeoDiffCount<'_, C> { - type BuildHasher = C::BuildHasher; - fn push_hash(&mut self, hash: u64) { self.xor_bit(self.config.hash_to_bucket(hash)); } + fn push(&mut self, item: I) { + let build_hasher = C::BuildHasher::default(); + self.push_hash(build_hasher.hash_one(item)); + } + fn push_sketch(&mut self, other: &Self) { *self = xor(self, other); } @@ -359,7 +363,7 @@ mod tests { use rand::{RngCore, SeedableRng}; use crate::{ - build_hasher::DefaultBuildHasher, + build_hasher::UnstableDefaultBuildHasher, config::{iter_ones, tests::test_estimate, FixedConfig}, }; @@ -371,7 +375,7 @@ mod tests { // scripts/accuracy -n 10000 geo_diff/u16/b=7/bytes=50/msb=10 // type GeoDiffCount7_50<'a> = - GeoDiffCount<'a, FixedConfig>; + GeoDiffCount<'a, FixedConfig>; #[test] fn test_geo_count() { diff --git a/crates/geo_filters/src/diff_count/config.rs b/crates/geo_filters/src/diff_count/config.rs index ecb4dc9..365c04d 100644 --- a/crates/geo_filters/src/diff_count/config.rs +++ b/crates/geo_filters/src/diff_count/config.rs @@ -1,6 +1,6 @@ use once_cell::sync::Lazy; -use crate::build_hasher::DefaultBuildHasher; +use crate::build_hasher::UnstableDefaultBuildHasher; use crate::config::EstimationLookup; use crate::config::FixedConfig; use crate::config::HashToBucketLookup; @@ -18,7 +18,7 @@ use crate::Diff; // // scripts/accuracy -n 10000 geo_diff/u16/b=7/bytes=112/msb={8,12,16,20} // -pub type GeoDiffConfig7 = FixedConfig; +pub type GeoDiffConfig7 = FixedConfig; /// Diff count configuration with a relative error standard deviation of ~0.015. // @@ -30,7 +30,7 @@ pub type GeoDiffConfig7 = FixedConfig // // scripts/accuracy -n 1000 geo_diff/u32/b=13/bytes=7138/msb={128,192,256,384,512} // -pub type GeoDiffConfig13 = FixedConfig; +pub type GeoDiffConfig13 = FixedConfig; impl Lookups for Diff { #[inline] @@ -125,7 +125,7 @@ mod tests { #[test] fn test_bit_from_hash() { - let config = GeoDiffConfig7::default(); + let config = GeoDiffConfig7::::default(); assert_eq!(config.hash_to_bucket(u64::MAX), 0); assert_eq!( config.hash_to_bucket(0) as usize, @@ -170,7 +170,7 @@ mod tests { #[test] fn test_estimation_lut_7() { - let c = GeoDiffConfig7::default(); + let c = GeoDiffConfig7::::default(); let err = (0..600) .step_by(1) .map(|i| { @@ -189,7 +189,7 @@ mod tests { #[test] fn test_estimation_lut_13() { - let c = GeoDiffConfig13::default(); + let c = GeoDiffConfig13::::default(); let err = (0..24000) .step_by(100) .map(|i| { diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index 0cff6b6..8c2465c 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -1,6 +1,7 @@ //! Geometric filter implementation for distinct count. use std::collections::VecDeque; +use std::hash::BuildHasher as _; use std::mem::{size_of, size_of_val}; use crate::config::{ @@ -129,12 +130,15 @@ impl> GeoDistinctCount<'_, C> { } impl> Count for GeoDistinctCount<'_, C> { - type BuildHasher = C::BuildHasher; - fn push_hash(&mut self, hash: u64) { self.set_bit(self.config.hash_to_bucket(hash)); } + fn push(&mut self, item: I) { + let build_hasher = C::BuildHasher::default(); + self.push_hash(build_hasher.hash_one(item)); + } + fn push_sketch(&mut self, other: &Self) { *self = or(self, other) } @@ -230,7 +234,7 @@ mod tests { use itertools::Itertools; use rand::{RngCore, SeedableRng}; - use crate::build_hasher::DefaultBuildHasher; + use crate::build_hasher::UnstableDefaultBuildHasher; use crate::config::{iter_ones, tests::test_estimate, FixedConfig, VariableConfig}; use crate::evaluation::simulation::simulate; @@ -238,7 +242,8 @@ mod tests { #[test] fn test_lookup_table() { - let c = FixedConfig::::default(); + let c = + FixedConfig::::default(); for i in 0..c.max_bytes() * 4 { let hash = (c.phi_f64().powf(i as f64 + 0.5) * u64::MAX as f64).round() as u64; let a = c.hash_to_bucket(hash); @@ -370,7 +375,7 @@ mod tests { Box::new(GeoDistinctCount::new(VariableConfig::< _, u32, - DefaultBuildHasher, + UnstableDefaultBuildHasher, >::new( 13, 7800, diff --git a/crates/geo_filters/src/distinct_count/config.rs b/crates/geo_filters/src/distinct_count/config.rs index 8118c91..1ac5163 100644 --- a/crates/geo_filters/src/distinct_count/config.rs +++ b/crates/geo_filters/src/distinct_count/config.rs @@ -1,6 +1,6 @@ use once_cell::sync::Lazy; -use crate::build_hasher::DefaultBuildHasher; +use crate::build_hasher::UnstableDefaultBuildHasher; use crate::config::EstimationLookup; use crate::config::FixedConfig; use crate::config::HashToBucketLookup; @@ -19,7 +19,8 @@ use crate::Distinct; // // scripts/accuracy -n 10000 geo_distinct/u16/b=7/bytes=136/msb={8,16,32,64} // -pub type GeoDistinctConfig7 = FixedConfig; +pub type GeoDistinctConfig7 = + FixedConfig; /// Distinct count configuration with a relative error standard deviation of ~0.0075. /// Uses at most 9248 bytes of memory. @@ -32,7 +33,8 @@ pub type GeoDistinctConfig7 = FixedConfig; +pub type GeoDistinctConfig13 = + FixedConfig; impl Lookups for Distinct { #[inline] @@ -108,7 +110,7 @@ mod tests { #[test] fn test_estimation_lut_7() { - let c = GeoDistinctConfig7::default(); + let c = GeoDistinctConfig7::::default(); let err = (0..600) .step_by(1) .map(|i| { @@ -127,7 +129,7 @@ mod tests { #[test] fn test_estimation_lut_13() { - let c = GeoDistinctConfig13::default(); + let c = GeoDistinctConfig13::::default(); let err = (0..24000) .step_by(1) .map(|i| { diff --git a/crates/geo_filters/src/evaluation/hll.rs b/crates/geo_filters/src/evaluation/hll.rs index 1284e73..8c506c0 100644 --- a/crates/geo_filters/src/evaluation/hll.rs +++ b/crates/geo_filters/src/evaluation/hll.rs @@ -9,7 +9,7 @@ use std::{ use hyperloglogplus::{HyperLogLog, HyperLogLogPlus}; use crate::{ - build_hasher::{DefaultBuildHasher, ReproducibleBuildHasher}, + build_hasher::{ReproducibleBuildHasher, UnstableDefaultBuildHasher}, Count, Distinct, }; @@ -113,12 +113,15 @@ impl BuildHasher for BuildNoopHasher { impl ReproducibleBuildHasher for BuildNoopHasher {} impl Count for Hll { - type BuildHasher = DefaultBuildHasher; - fn push_hash(&mut self, hash: u64) { self.inner.borrow_mut().insert(&hash) } + fn push(&mut self, item: I) { + let build_hasher = UnstableDefaultBuildHasher::default(); + self.push_hash(build_hasher.hash_one(item)); + } + fn push_sketch(&mut self, _other: &Self) { unimplemented!() } diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 13cf5bf..8ec8fb3 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -14,9 +14,7 @@ pub mod distinct_count; #[cfg(feature = "evaluation")] pub mod evaluation; -use std::hash::{BuildHasher as _, Hash}; - -use crate::build_hasher::ReproducibleBuildHasher; +use std::hash::Hash; /// Marker trait to indicate the variant implemented by a [`Count`] instance. pub trait Method: Clone + Eq + PartialEq + Send + Sync {} @@ -33,16 +31,11 @@ impl Method for Distinct {} /// Trait for types solving the set cardinality estimation problem. pub trait Count { - type BuildHasher: ReproducibleBuildHasher; - /// Add the given hash to the set. fn push_hash(&mut self, hash: u64); /// Add the hash of the given item, computed with the configured hasher, to the set. - fn push(&mut self, item: I) { - let build_hasher = Self::BuildHasher::default(); - self.push_hash(build_hasher.hash_one(item)); - } + fn push(&mut self, item: I); /// Add the given sketch to this one. /// If only the size of the combined set is needed, [`Self::size_with_sketch`] is more efficient and should be used. diff --git a/crates/geo_filters/tests/public_api.rs b/crates/geo_filters/tests/public_api.rs index 5656286..82d435d 100644 --- a/crates/geo_filters/tests/public_api.rs +++ b/crates/geo_filters/tests/public_api.rs @@ -1,4 +1,23 @@ -use geo_filters::build_hasher::DefaultBuildHasher; +use geo_filters::build_hasher::UnstableDefaultBuildHasher; + +// Mirrors what we have in the README. +// If this breaks then it should be fixed an the readme updated. +#[test] +fn readme() { + use geo_filters::distinct_count::GeoDistinctCount13; + use geo_filters::Count; + + let mut c1 = GeoDistinctCount13::default(); + c1.push(1); + c1.push(2); + + let mut c2 = GeoDistinctCount13::default(); + c2.push(2); + c2.push(3); + + let estimated_size = c1.size_with_sketch(&c2); + assert!(estimated_size >= 3.0_f32 * 0.9 && estimated_size <= 3.0_f32 * 1.1); +} #[test] fn can_use_predefined_diff_count() { @@ -22,7 +41,7 @@ fn can_use_custom_diff_count() { fn can_use_diff_count_with_predefined_config_value() { use geo_filters::diff_count::{GeoDiffConfig7, GeoDiffCount}; use geo_filters::Count; - let c = GeoDiffConfig7::default(); + let c = GeoDiffConfig7::::default(); let mut f = GeoDiffCount::new(c); f.push(42); f.size(); @@ -33,7 +52,7 @@ fn can_use_diff_count_with_fixed_config_value() { use geo_filters::config::FixedConfig; use geo_filters::diff_count::GeoDiffCount; use geo_filters::Count; - let c = FixedConfig::<_, u16, 7, 128, 10, DefaultBuildHasher>::default(); + let c = FixedConfig::<_, u16, 7, 128, 10, UnstableDefaultBuildHasher>::default(); let mut f = GeoDiffCount::new(c); f.push(42); f.size(); @@ -44,7 +63,7 @@ fn can_use_diff_count_with_variable_config_value() { use geo_filters::config::VariableConfig; use geo_filters::diff_count::GeoDiffCount; use geo_filters::Count; - let c = VariableConfig::<_, u16, DefaultBuildHasher>::new(7, 128, 10); + let c = VariableConfig::<_, u16, UnstableDefaultBuildHasher>::new(7, 128, 10); let mut f = GeoDiffCount::new(c); f.push(42); f.size(); @@ -72,7 +91,7 @@ fn can_use_custom_distinct_count() { fn can_use_distinct_count_with_predefined_config_value() { use geo_filters::distinct_count::{GeoDistinctConfig7, GeoDistinctCount}; use geo_filters::Count; - let c = GeoDistinctConfig7::default(); + let c = GeoDistinctConfig7::::default(); let mut f = GeoDistinctCount::new(c); f.push(42); f.size(); @@ -83,7 +102,7 @@ fn can_use_distinct_count_with_fixed_config_value() { use geo_filters::config::FixedConfig; use geo_filters::distinct_count::GeoDistinctCount; use geo_filters::Count; - let c = FixedConfig::<_, u16, 7, 118, 11, DefaultBuildHasher>::default(); + let c = FixedConfig::<_, u16, 7, 118, 11, UnstableDefaultBuildHasher>::default(); let mut f = GeoDistinctCount::new(c); f.push(42); f.size(); @@ -94,7 +113,7 @@ fn can_use_distinct_count_with_variable_config_value() { use geo_filters::config::VariableConfig; use geo_filters::distinct_count::GeoDistinctCount; use geo_filters::Count; - let c = VariableConfig::<_, u16, DefaultBuildHasher>::new(7, 118, 11); + let c = VariableConfig::<_, u16, UnstableDefaultBuildHasher>::new(7, 118, 11); let mut f = GeoDistinctCount::new(c); f.push(42); f.size(); From 132a244da96ec978586e2ebcfb2050542d982e9b Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 16:17:01 +0100 Subject: [PATCH 068/114] more clippy --- crates/geo_filters/tests/public_api.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/geo_filters/tests/public_api.rs b/crates/geo_filters/tests/public_api.rs index 82d435d..8a2de2e 100644 --- a/crates/geo_filters/tests/public_api.rs +++ b/crates/geo_filters/tests/public_api.rs @@ -16,7 +16,7 @@ fn readme() { c2.push(3); let estimated_size = c1.size_with_sketch(&c2); - assert!(estimated_size >= 3.0_f32 * 0.9 && estimated_size <= 3.0_f32 * 1.1); + assert!((3.0_f32 * 0.9..=3.0_f32 * 1.1).contains(&estimated_size)); } #[test] From ea774b51dda476608c52f4a52e08ac4e342ce8b9 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 16:58:54 +0100 Subject: [PATCH 069/114] remove readme test and make readme doc tests --- crates/geo_filters/src/lib.rs | 4 ++++ crates/geo_filters/tests/public_api.rs | 19 ------------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 8ec8fb3..c810877 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -51,3 +51,7 @@ pub trait Count { /// Returns the number of bytes in memory used to represent this filter. fn bytes_in_memory(&self) -> usize; } + +#[doc = include_str!("../README.md")] +#[cfg(doctest)] +pub struct ReadmeDocTests; diff --git a/crates/geo_filters/tests/public_api.rs b/crates/geo_filters/tests/public_api.rs index 8a2de2e..4afff72 100644 --- a/crates/geo_filters/tests/public_api.rs +++ b/crates/geo_filters/tests/public_api.rs @@ -1,24 +1,5 @@ use geo_filters::build_hasher::UnstableDefaultBuildHasher; -// Mirrors what we have in the README. -// If this breaks then it should be fixed an the readme updated. -#[test] -fn readme() { - use geo_filters::distinct_count::GeoDistinctCount13; - use geo_filters::Count; - - let mut c1 = GeoDistinctCount13::default(); - c1.push(1); - c1.push(2); - - let mut c2 = GeoDistinctCount13::default(); - c2.push(2); - c2.push(3); - - let estimated_size = c1.size_with_sketch(&c2); - assert!((3.0_f32 * 0.9..=3.0_f32 * 1.1).contains(&estimated_size)); -} - #[test] fn can_use_predefined_diff_count() { use geo_filters::diff_count::GeoDiffCount7; From b9b0baec3ea1ce0ed2f8dfa3ec71324d0a9301e6 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 21 Jul 2025 17:16:33 +0100 Subject: [PATCH 070/114] fix spelling mistake --- crates/geo_filters/docs/choosing-a-hash-function.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/geo_filters/docs/choosing-a-hash-function.md b/crates/geo_filters/docs/choosing-a-hash-function.md index e2bb0c7..5115eeb 100644 --- a/crates/geo_filters/docs/choosing-a-hash-function.md +++ b/crates/geo_filters/docs/choosing-a-hash-function.md @@ -54,7 +54,7 @@ fn test_different_hash_functions() { The actual value returned in this example is ~200. This makes sense because the geofilter thinks that there are 100 unique values in each of the filters, so the difference is approximated -as being ~200. If we were to rerun the above example with a genuinely reproducable `BuildHasher` +as being ~200. If we were to rerun the above example with a genuinely reproducible `BuildHasher` then the resulting diff size would be `0`. In debug builds, as part of the config's `eq` implementation, our library will assert that the `BuildHasher`s From a61443435288ba1dccecc4a3842e7d59de1355d9 Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Mon, 21 Jul 2025 10:48:14 -0600 Subject: [PATCH 071/114] fix lints --- crates/geo_filters/src/config/buckets.rs | 3 +-- crates/geo_filters/src/config/lookup.rs | 4 ++-- crates/geo_filters/src/evaluation/simulation.rs | 4 ++-- crates/string-offsets/src/lib.rs | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/geo_filters/src/config/buckets.rs b/crates/geo_filters/src/config/buckets.rs index 0d673c0..55cac2b 100644 --- a/crates/geo_filters/src/config/buckets.rs +++ b/crates/geo_filters/src/config/buckets.rs @@ -21,8 +21,7 @@ where fn into_block(self) -> u64 { assert!( self.into_usize() < BITS_PER_BLOCK, - "position in block must be less then 64, got {:?}", - self + "position in block must be less then 64, got {self:?}", ); 1u64 << self.into_usize() } diff --git a/crates/geo_filters/src/config/lookup.rs b/crates/geo_filters/src/config/lookup.rs index 1e73757..2081f72 100644 --- a/crates/geo_filters/src/config/lookup.rs +++ b/crates/geo_filters/src/config/lookup.rs @@ -54,13 +54,13 @@ mod tests { #[test] fn test_lookup_7() { let var = lookup_random_hashes_variance::<7>(1 << 16); - assert!(var < 1e-4, "variance {} too large", var); + assert!(var < 1e-4, "variance {var} too large"); } #[test] fn test_lookup_13() { let var = lookup_random_hashes_variance::<13>(1 << 16); - assert!(var < 1e-4, "variance {} too large", var); + assert!(var < 1e-4, "variance {var} too large"); } fn lookup_random_hashes_variance(n: u64) -> f64 { diff --git a/crates/geo_filters/src/evaluation/simulation.rs b/crates/geo_filters/src/evaluation/simulation.rs index ef736fd..eedb7d7 100644 --- a/crates/geo_filters/src/evaluation/simulation.rs +++ b/crates/geo_filters/src/evaluation/simulation.rs @@ -98,7 +98,7 @@ pub fn run_simulations( println!("Parameters:"); println!(); println!(" number of configs = {}", configs.len()); - println!(" number of samples = {}", samples); + println!(" number of samples = {samples}"); println!(" number of sets = {}", set_sizes.len()); println!(); @@ -107,7 +107,7 @@ pub fn run_simulations( let results = configs .iter() .map(|(name, f)| { - print!(" {} ... ", name); + print!(" {name} ... "); std::io::stdout().flush().expect("stdout can be flushed"); let t = Instant::now(); let result = simulate(f, samples, set_sizes); diff --git a/crates/string-offsets/src/lib.rs b/crates/string-offsets/src/lib.rs index 02a26aa..35900ad 100644 --- a/crates/string-offsets/src/lib.rs +++ b/crates/string-offsets/src/lib.rs @@ -449,7 +449,7 @@ mod tests { 0 => 0, 1..=3 => 1, 4 => 2, - _ => panic!("invalid utf8 char width: {}", len), + _ => panic!("invalid utf8 char width: {len}"), } } From d90d6f0f004946f4ac05140a02bc4c5c5e50deec Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 23 Jul 2025 22:43:18 +0100 Subject: [PATCH 072/114] implement basic serialization and deserialization of diff counts as bytes --- crates/geo_filters/src/diff_count.rs | 104 +++++++++++++++++++- crates/geo_filters/src/diff_count/bitvec.rs | 64 +++++++++++- 2 files changed, 163 insertions(+), 5 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 7e784c6..fd97c15 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -4,6 +4,7 @@ use std::borrow::Cow; use std::cmp::Ordering; use std::hash::BuildHasher as _; use std::mem::{size_of, size_of_val}; +use std::ops::Deref; use crate::config::{ count_ones_from_bitchunks, count_ones_from_msb_and_lsb, iter_bit_chunks, iter_ones, @@ -77,7 +78,7 @@ impl> std::fmt::Debug for GeoDiffCount<'_, C> { } } -impl> GeoDiffCount<'_, C> { +impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { pub fn new(config: C) -> Self { Self { config, @@ -86,6 +87,49 @@ impl> GeoDiffCount<'_, C> { } } + pub fn from_bytes(c: C, buf: &'a [u8]) -> Self { + if buf.is_empty() { + return Self::new(c); + } + + // The number of most significant bits stores in the MSB sparse repr + let msb_len = (buf.len() / size_of::()).min(c.max_msb_len()); + + let msb = + unsafe { std::slice::from_raw_parts(buf.as_ptr() as *const C::BucketType, msb_len) }; + + // The number of bytes representing the MSB - this is how many bytes we need to + // skip over to reach the LSB + let msb_bytes_len = msb_len * size_of::(); + + Self { + config: c, + msb: Cow::Borrowed(msb), + lsb: BitVec::from_bytes(&buf[msb_bytes_len..]), + } + } + + pub fn write(&self, writer: &mut W) -> std::io::Result { + if self.msb.is_empty() { + return Ok(0); + } + + let msb_buckets = self.msb.deref(); + let msb_bytes = unsafe { + std::slice::from_raw_parts( + msb_buckets.as_ptr() as *const u8, + msb_buckets.len() * size_of::(), + ) + }; + writer.write_all(msb_bytes)?; + + let mut bytes_written = msb_bytes.len(); + + bytes_written += self.lsb.write(writer)?; + + Ok(bytes_written) + } + /// `BitChunk`s can be processed much more efficiently than individual one bits! /// This function makes it possible to construct a GeoDiffCount instance directly from /// `BitChunk`s. It will extract the most significant bits first and then put the remainder @@ -208,16 +252,23 @@ impl> GeoDiffCount<'_, C> { /// that makes the cost of the else case negligible. fn xor_bit(&mut self, bucket: C::BucketType) { if bucket.into_usize() < self.lsb.num_bits() { + // The bit being toggled is within our LSB bit vector + // so toggle it directly. self.lsb.toggle(bucket.into_usize()); } else { let msb = self.msb.to_mut(); match msb.binary_search_by(|k| bucket.cmp(k)) { Ok(idx) => { + // The bit is already set in the MSB sparse bitset, remove it (XOR) msb.remove(idx); + + // We have removed a value from our MSB, move a value in the + // LSB into the MSB let (first, second) = { let mut lsb = iter_ones(self.lsb.bit_chunks().peekable()); (lsb.next(), lsb.next()) }; + let new_smallest = if let Some(smallest) = first { msb.push(C::BucketType::from_usize(smallest)); second.map(|_| smallest).unwrap_or(0) @@ -229,15 +280,19 @@ impl> GeoDiffCount<'_, C> { Err(idx) => { msb.insert(idx, bucket); if msb.len() > self.config.max_msb_len() { + // We have too many values in the MSB sparse index vector, + // let's move the smalles MSB value into the LSB bit vector let smallest = msb .pop() .expect("we should have at least one element!") .into_usize(); - // ensure vector covers smallest + let new_smallest = msb .last() .expect("should have at least one element") .into_usize(); + + // ensure LSB bit vector has the space for `smallest` self.lsb.resize(new_smallest); self.lsb.toggle(smallest); } @@ -360,7 +415,10 @@ impl> Count for GeoDiffCount<'_, C> { #[cfg(test)] mod tests { use itertools::Itertools; - use rand::{RngCore, SeedableRng}; + use rand::{ + seq::{IndexedRandom, IteratorRandom}, + RngCore, SeedableRng, + }; use crate::{ build_hasher::UnstableDefaultBuildHasher, @@ -580,4 +638,44 @@ mod tests { iter_ones(self.bit_chunks().peekable()).map(C::BucketType::from_usize) } } + + #[test] + fn test_serialization_empty() { + let before = GeoDiffCount7::default(); + + let mut writer = vec![]; + before.write(&mut writer).unwrap(); + + assert_eq!(writer.len(), 0); + + let after = GeoDiffCount7::from_bytes(before.config.clone(), &writer); + + assert_eq!(before, after); + } + + #[test] + fn test_serialization_round_trip() { + let mut rnd = rand::rngs::StdRng::from_os_rng(); + + // Run 100 simulations of random values being put into + // a diff counter + for _ in 0..100 { + let mut before = GeoDiffCount7::default(); + + // Select a random number of items to insert + let items = (1..1000).choose(&mut rnd).unwrap(); + + for _ in 0..items { + before.push_hash(rnd.next_u64()); + } + + let mut writer = vec![]; + + before.write(&mut writer).unwrap(); + + let after = GeoDiffCount7::from_bytes(before.config.clone(), &writer); + + assert_eq!(before, after); + } + } } diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index c94a041..31158af 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -2,11 +2,11 @@ use std::borrow::Cow; use std::cmp::Ordering; use std::iter::Peekable; use std::mem::{size_of, size_of_val}; -use std::ops::{Index, Range}; +use std::ops::{Deref as _, Index, Range}; -use crate::config::BitChunk; use crate::config::IsBucketType; use crate::config::BITS_PER_BLOCK; +use crate::config::{BitChunk, BYTES_PER_BLOCK}; /// A bit vector where every bit occupies exactly one bit (in contrast to `Vec` where each /// bit consumes 1 byte). It only implements the minimum number of operations that we need for our @@ -34,6 +34,62 @@ impl PartialOrd for BitVec<'_> { } impl BitVec<'_> { + pub fn from_bytes(mut buf: &[u8]) -> Self { + if buf.is_empty() { + return Self::default(); + } + + // The first byte of the serialized BitVec is used to indicate how many + // of the bits in the left-most byte are *unoccupied*. + // See [`BitVec::write`] implementation for how this is done. + assert!( + buf[0] < 64, + "Number of unoccupied bits should be <64, got {}", + buf[0] + ); + + let num_bits = (buf.len() - 1) * 8 - buf[0] as usize; + buf = &buf[1..]; + + assert_eq!( + buf.len() % BYTES_PER_BLOCK, + 0, + "buffer should be a multiple of 8 bytes, got {}", + buf.len() + ); + + let blocks = unsafe { + std::mem::transmute(std::slice::from_raw_parts( + buf.as_ptr(), + buf.len() / BYTES_PER_BLOCK, + )) + }; + let blocks = Cow::Borrowed(blocks); + + Self { num_bits, blocks } + } + + pub fn write(&self, writer: &mut W) -> std::io::Result { + if self.is_empty() { + return Ok(0); + } + + // First serialize the number of unoccupied bits in the last block as one byte. + let unoccupied_bits = 63 - ((self.num_bits - 1) % 64) as u8; + + writer.write_all(&[unoccupied_bits])?; + + let blocks = self.blocks.deref(); + + let block_bytes = unsafe { + std::slice::from_raw_parts(blocks.as_ptr() as *const u8, blocks.len() * BYTES_PER_BLOCK) + }; + + writer.write_all(block_bytes)?; + + Ok(block_bytes.len() + 1) + } + /// Takes an iterator of `BitChunk` items as input and returns the corresponding `BitVec`. /// The order of `BitChunk`s doesn't matter for this function and `BitChunk` may be hitting /// the same block. In this case, the function will simply xor them together. @@ -81,6 +137,10 @@ impl BitVec<'_> { self.num_bits } + pub fn is_empty(&self) -> bool { + self.num_bits() == 0 + } + /// Tests the bit specified by the provided zero-based bit position. pub fn test_bit(&self, index: usize) -> bool { assert!(index < self.num_bits); From 3e3398846f521006e3dcc26e311f74a175e579b5 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 23 Jul 2025 23:02:22 +0100 Subject: [PATCH 073/114] Refactor serialization tests for geo diff count types The changes extract a shared test helper for verifying serialization of geo diff counts with different bucket types in MSB sparse bit field representation. --- crates/geo_filters/src/diff_count.rs | 31 +++++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index fd97c15..258fd41 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -415,10 +415,7 @@ impl> Count for GeoDiffCount<'_, C> { #[cfg(test)] mod tests { use itertools::Itertools; - use rand::{ - seq::{IndexedRandom, IteratorRandom}, - RngCore, SeedableRng, - }; + use rand::{seq::IteratorRandom, RngCore, SeedableRng}; use crate::{ build_hasher::UnstableDefaultBuildHasher, @@ -653,14 +650,17 @@ mod tests { assert_eq!(before, after); } - #[test] - fn test_serialization_round_trip() { + // This helper exists in order to easily test serializing types with different + // bucket types in the MSB sparse bit field representation. See tests below. + fn serialization_round_trip + Default>() { let mut rnd = rand::rngs::StdRng::from_os_rng(); // Run 100 simulations of random values being put into - // a diff counter + // a diff counter. "Serializing" to a vector to emulate + // writing to a disk, and then deserializing and asserting + // the filters are equal. for _ in 0..100 { - let mut before = GeoDiffCount7::default(); + let mut before = GeoDiffCount::<'_, C>::default(); // Select a random number of items to insert let items = (1..1000).choose(&mut rnd).unwrap(); @@ -670,12 +670,23 @@ mod tests { } let mut writer = vec![]; - before.write(&mut writer).unwrap(); - let after = GeoDiffCount7::from_bytes(before.config.clone(), &writer); + let after = GeoDiffCount::<'_, C>::from_bytes(before.config.clone(), &writer); assert_eq!(before, after); } } + + #[test] + fn test_serialization_round_trip_7() { + // Uses a u16 for MSB buckets + serialization_round_trip::(); + } + + #[test] + fn test_serialization_round_trip_13() { + // Uses a u32 for MSB buckets + serialization_round_trip::(); + } } From c143f4f036cd32d03a6bdfbaf856b80ddb4169ed Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 00:38:49 +0100 Subject: [PATCH 074/114] Move serialization code to dedicated module The changes split out serialization-related code from diff_count.rs and bitvec.rs into a new serde.rs module. This improves code organization by separating concerns. --- crates/geo_filters/src/diff_count.rs | 45 +------- crates/geo_filters/src/diff_count/bitvec.rs | 111 ++++++++++---------- crates/geo_filters/src/diff_count/serde.rs | 72 +++++++++++++ 3 files changed, 128 insertions(+), 100 deletions(-) create mode 100644 crates/geo_filters/src/diff_count/serde.rs diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 258fd41..bf7301a 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -4,7 +4,6 @@ use std::borrow::Cow; use std::cmp::Ordering; use std::hash::BuildHasher as _; use std::mem::{size_of, size_of_val}; -use std::ops::Deref; use crate::config::{ count_ones_from_bitchunks, count_ones_from_msb_and_lsb, iter_bit_chunks, iter_ones, @@ -14,6 +13,7 @@ use crate::{Count, Diff}; mod bitvec; mod config; +mod serde; mod sim_hash; use bitvec::*; @@ -87,49 +87,6 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { } } - pub fn from_bytes(c: C, buf: &'a [u8]) -> Self { - if buf.is_empty() { - return Self::new(c); - } - - // The number of most significant bits stores in the MSB sparse repr - let msb_len = (buf.len() / size_of::()).min(c.max_msb_len()); - - let msb = - unsafe { std::slice::from_raw_parts(buf.as_ptr() as *const C::BucketType, msb_len) }; - - // The number of bytes representing the MSB - this is how many bytes we need to - // skip over to reach the LSB - let msb_bytes_len = msb_len * size_of::(); - - Self { - config: c, - msb: Cow::Borrowed(msb), - lsb: BitVec::from_bytes(&buf[msb_bytes_len..]), - } - } - - pub fn write(&self, writer: &mut W) -> std::io::Result { - if self.msb.is_empty() { - return Ok(0); - } - - let msb_buckets = self.msb.deref(); - let msb_bytes = unsafe { - std::slice::from_raw_parts( - msb_buckets.as_ptr() as *const u8, - msb_buckets.len() * size_of::(), - ) - }; - writer.write_all(msb_bytes)?; - - let mut bytes_written = msb_bytes.len(); - - bytes_written += self.lsb.write(writer)?; - - Ok(bytes_written) - } - /// `BitChunk`s can be processed much more efficiently than individual one bits! /// This function makes it possible to construct a GeoDiffCount instance directly from /// `BitChunk`s. It will extract the most significant bits first and then put the remainder diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index 31158af..09c50a2 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -34,62 +34,6 @@ impl PartialOrd for BitVec<'_> { } impl BitVec<'_> { - pub fn from_bytes(mut buf: &[u8]) -> Self { - if buf.is_empty() { - return Self::default(); - } - - // The first byte of the serialized BitVec is used to indicate how many - // of the bits in the left-most byte are *unoccupied*. - // See [`BitVec::write`] implementation for how this is done. - assert!( - buf[0] < 64, - "Number of unoccupied bits should be <64, got {}", - buf[0] - ); - - let num_bits = (buf.len() - 1) * 8 - buf[0] as usize; - buf = &buf[1..]; - - assert_eq!( - buf.len() % BYTES_PER_BLOCK, - 0, - "buffer should be a multiple of 8 bytes, got {}", - buf.len() - ); - - let blocks = unsafe { - std::mem::transmute(std::slice::from_raw_parts( - buf.as_ptr(), - buf.len() / BYTES_PER_BLOCK, - )) - }; - let blocks = Cow::Borrowed(blocks); - - Self { num_bits, blocks } - } - - pub fn write(&self, writer: &mut W) -> std::io::Result { - if self.is_empty() { - return Ok(0); - } - - // First serialize the number of unoccupied bits in the last block as one byte. - let unoccupied_bits = 63 - ((self.num_bits - 1) % 64) as u8; - - writer.write_all(&[unoccupied_bits])?; - - let blocks = self.blocks.deref(); - - let block_bytes = unsafe { - std::slice::from_raw_parts(blocks.as_ptr() as *const u8, blocks.len() * BYTES_PER_BLOCK) - }; - - writer.write_all(block_bytes)?; - - Ok(block_bytes.len() + 1) - } - /// Takes an iterator of `BitChunk` items as input and returns the corresponding `BitVec`. /// The order of `BitChunk`s doesn't matter for this function and `BitChunk` may be hitting /// the same block. In this case, the function will simply xor them together. @@ -202,6 +146,61 @@ impl BitVec<'_> { let Self { num_bits, blocks } = self; size_of_val(num_bits) + blocks.len() * size_of::() } + + pub fn from_bytes(mut buf: &[u8]) -> Self { + if buf.is_empty() { + return Self::default(); + } + + // The first byte of the serialized BitVec is used to indicate how many + // of the bits in the left-most byte are *unoccupied*. + // See [`BitVec::write`] implementation for how this is done. + assert!( + buf[0] < 64, + "Number of unoccupied bits should be <64, got {}", + buf[0] + ); + + let num_bits = (buf.len() - 1) * 8 - buf[0] as usize; + buf = &buf[1..]; + + assert_eq!( + buf.len() % BYTES_PER_BLOCK, + 0, + "buffer should be a multiple of 8 bytes, got {}", + buf.len() + ); + + let blocks = unsafe { + std::mem::transmute(std::slice::from_raw_parts( + buf.as_ptr(), + buf.len() / BYTES_PER_BLOCK, + )) + }; + let blocks = Cow::Borrowed(blocks); + + Self { num_bits, blocks } + } + + pub fn write(&self, writer: &mut W) -> std::io::Result { + if self.is_empty() { + return Ok(0); + } + + // First serialize the number of unoccupied bits in the last block as one byte. + let unoccupied_bits = 63 - ((self.num_bits - 1) % 64) as u8; + + writer.write_all(&[unoccupied_bits])?; + + let blocks = self.blocks.deref(); + let block_bytes = unsafe { + std::slice::from_raw_parts(blocks.as_ptr() as *const u8, blocks.len() * BYTES_PER_BLOCK) + }; + + writer.write_all(block_bytes)?; + + Ok(block_bytes.len() + 1) + } } impl Index for BitVec<'_> { diff --git a/crates/geo_filters/src/diff_count/serde.rs b/crates/geo_filters/src/diff_count/serde.rs new file mode 100644 index 0000000..552f293 --- /dev/null +++ b/crates/geo_filters/src/diff_count/serde.rs @@ -0,0 +1,72 @@ +//! Convert a [`GeoDiffCount`] to and from byte arrays. +//! +//! Since most of our target platforms are little endian there are more optimised approaches +//! for little endian platforms, just splatting the bytes into the writer. This is contrary +//! to the usual "network endian" approach where big endian is the default, but most of our +//! consumers are little endian so it makes sense for this to be the optimal approach. +//! +//! We still need to support big endian platforms though, but they get a less efficient path. +use std::{borrow::Cow, ops::Deref as _}; + +use crate::{config::GeoConfig, Diff}; + +use super::{bitvec::BitVec, GeoDiffCount}; + +impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { + /// Create a new [`GeoDiffCount`] from a slice of bytes + #[cfg(target_endian = "little")] + pub fn from_bytes(c: C, buf: &'a [u8]) -> Self { + if buf.is_empty() { + return Self::new(c); + } + + // The number of most significant bits stores in the MSB sparse repr + let msb_len = (buf.len() / size_of::()).min(c.max_msb_len()); + + let msb = + unsafe { std::slice::from_raw_parts(buf.as_ptr() as *const C::BucketType, msb_len) }; + + // The number of bytes representing the MSB - this is how many bytes we need to + // skip over to reach the LSB + let msb_bytes_len = msb_len * size_of::(); + + Self { + config: c, + msb: Cow::Borrowed(msb), + lsb: BitVec::from_bytes(&buf[msb_bytes_len..]), + } + } + + /// Create a new [`GeoDiffCount`] from a slice of bytes + #[cfg(target_endian = "big")] + pub fn from_bytes(c: C, buf: &'a [u8]) -> Self { + unimplemented!("not supported on big endian platforms") + } + + #[cfg(target_endian = "little")] + pub fn write(&self, writer: &mut W) -> std::io::Result { + if self.msb.is_empty() { + return Ok(0); + } + + let msb_buckets = self.msb.deref(); + let msb_bytes = unsafe { + std::slice::from_raw_parts( + msb_buckets.as_ptr() as *const u8, + msb_buckets.len() * size_of::(), + ) + }; + writer.write_all(msb_bytes)?; + + let mut bytes_written = msb_bytes.len(); + + bytes_written += self.lsb.write(writer)?; + + Ok(bytes_written) + } + + #[cfg(target_endian = "big")] + pub fn write(&self, writer: &mut W) -> std::io::Result { + unimplemented!("not supported on big endian platforms") + } +} From fc9c45d782c7c56e6a94366ff23fe7b9c612809a Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 00:55:34 +0100 Subject: [PATCH 075/114] Modify module docs to explain that big endian is not supported. --- crates/geo_filters/src/diff_count/bitvec.rs | 1 - crates/geo_filters/src/diff_count/serde.rs | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index 09c50a2..01b2b99 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -189,7 +189,6 @@ impl BitVec<'_> { // First serialize the number of unoccupied bits in the last block as one byte. let unoccupied_bits = 63 - ((self.num_bits - 1) % 64) as u8; - writer.write_all(&[unoccupied_bits])?; let blocks = self.blocks.deref(); diff --git a/crates/geo_filters/src/diff_count/serde.rs b/crates/geo_filters/src/diff_count/serde.rs index 552f293..d0d33be 100644 --- a/crates/geo_filters/src/diff_count/serde.rs +++ b/crates/geo_filters/src/diff_count/serde.rs @@ -5,7 +5,11 @@ //! to the usual "network endian" approach where big endian is the default, but most of our //! consumers are little endian so it makes sense for this to be the optimal approach. //! -//! We still need to support big endian platforms though, but they get a less efficient path. +//! For now we do not support big endian platforms. In the future we might add a big endian +//! platform specific implementation which is able to read the little endian serialized +//! representation. For now, if you attempt to serialize a filter on a big endian platform +//! you get a panic. + use std::{borrow::Cow, ops::Deref as _}; use crate::{config::GeoConfig, Diff}; From aa215ce7fa3be40176a087db9479da413d04c9c0 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 10:01:28 +0100 Subject: [PATCH 076/114] Linting fixes and alignment testing Clippy wants explicit types on transmute calls (reasonable). Fixed issue where from_raw_parts was upset about misaligned slices. I think for all platforms we're targetting the alignment of the buckets doesn't matter. This was fixed by not casting the byte buffer pointer to the correct type and instead transmuting after the fact. Fix alignment and unsafe transmutes The changes focus on making alignment handling more safe and explicit in unsafe code blocks, while also adding test coverage for alignment issues. Fix unsafe transmutes and alignment in bitvec module The changes improve type safety in unsafe transmutes and add alignment tests for raw pointer conversions. This fixes potential undefined behavior when converting between slice types. --- crates/geo_filters/src/diff_count.rs | 13 ++++++++++++- crates/geo_filters/src/diff_count/bitvec.rs | 2 +- crates/geo_filters/src/diff_count/serde.rs | 13 +++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index bf7301a..06b7be4 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -371,6 +371,8 @@ impl> Count for GeoDiffCount<'_, C> { #[cfg(test)] mod tests { + use std::io::Write; + use itertools::Itertools; use rand::{seq::IteratorRandom, RngCore, SeedableRng}; @@ -627,9 +629,18 @@ mod tests { } let mut writer = vec![]; + + // Insert some padding to emulate alignment issues with the slices + // A previous version of this test never panicked even though we were + // violating the alignment preconditions for the `from_raw_parts` function + let pad = (0..8).choose(&mut rnd).unwrap(); + for _ in 0..pad { + writer.write(&[0x0]).unwrap(); + } + before.write(&mut writer).unwrap(); - let after = GeoDiffCount::<'_, C>::from_bytes(before.config.clone(), &writer); + let after = GeoDiffCount::<'_, C>::from_bytes(before.config.clone(), &writer[pad..]); assert_eq!(before, after); } diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index 01b2b99..9a0571b 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -172,7 +172,7 @@ impl BitVec<'_> { ); let blocks = unsafe { - std::mem::transmute(std::slice::from_raw_parts( + std::mem::transmute::<&[u8], &[u64]>(std::slice::from_raw_parts( buf.as_ptr(), buf.len() / BYTES_PER_BLOCK, )) diff --git a/crates/geo_filters/src/diff_count/serde.rs b/crates/geo_filters/src/diff_count/serde.rs index d0d33be..a52ccd7 100644 --- a/crates/geo_filters/src/diff_count/serde.rs +++ b/crates/geo_filters/src/diff_count/serde.rs @@ -27,8 +27,12 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { // The number of most significant bits stores in the MSB sparse repr let msb_len = (buf.len() / size_of::()).min(c.max_msb_len()); - let msb = - unsafe { std::slice::from_raw_parts(buf.as_ptr() as *const C::BucketType, msb_len) }; + let msb = unsafe { + std::mem::transmute::<&[u8], &[C::BucketType]>(std::slice::from_raw_parts( + buf.as_ptr(), + msb_len, + )) + }; // The number of bytes representing the MSB - this is how many bytes we need to // skip over to reach the LSB @@ -55,10 +59,7 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { let msb_buckets = self.msb.deref(); let msb_bytes = unsafe { - std::slice::from_raw_parts( - msb_buckets.as_ptr() as *const u8, - msb_buckets.len() * size_of::(), - ) + std::slice::from_raw_parts(msb_buckets.as_ptr() as *const u8, size_of_val(msb_buckets)) }; writer.write_all(msb_bytes)?; From 42f76b8db698511f1379e7b4f4a1040be6207305 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 10:05:02 +0100 Subject: [PATCH 077/114] Fix test name/config mismatch in diff_count test. Thanks Copilot! --- crates/geo_filters/src/diff_count.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 06b7be4..5dab46f 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -655,6 +655,6 @@ mod tests { #[test] fn test_serialization_round_trip_13() { // Uses a u32 for MSB buckets - serialization_round_trip::(); + serialization_round_trip::(); } } From a80c3e67e8e9cf32bfc91c042c36491db740bbc9 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 10:13:13 +0100 Subject: [PATCH 078/114] Update diff_count serialization test to use less clowny padding approach. --- crates/geo_filters/src/diff_count.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 5dab46f..2c5394e 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -633,14 +633,14 @@ mod tests { // Insert some padding to emulate alignment issues with the slices // A previous version of this test never panicked even though we were // violating the alignment preconditions for the `from_raw_parts` function - let pad = (0..8).choose(&mut rnd).unwrap(); - for _ in 0..pad { - writer.write(&[0x0]).unwrap(); - } + let padding = [0_u8; 8]; + let pad_amount = (0..8).choose(&mut rnd).unwrap(); + writer.write_all(&padding[..pad_amount]).unwrap(); before.write(&mut writer).unwrap(); - let after = GeoDiffCount::<'_, C>::from_bytes(before.config.clone(), &writer[pad..]); + let after = + GeoDiffCount::<'_, C>::from_bytes(before.config.clone(), &writer[pad_amount..]); assert_eq!(before, after); } From 3fc9ff327878982bd5a59ec9d7bb897f0e2eec26 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 13:03:23 +0100 Subject: [PATCH 079/114] Reworks for geofilter serialization work - Remove serde module. Put code into diff_count.rs. - Remove bonus comments - Remove panic-y big endian serialization stuff. - Squish together lines --- crates/geo_filters/src/diff_count.rs | 81 +++++++++++++++------ crates/geo_filters/src/diff_count/bitvec.rs | 4 +- crates/geo_filters/src/diff_count/serde.rs | 77 -------------------- 3 files changed, 63 insertions(+), 99 deletions(-) delete mode 100644 crates/geo_filters/src/diff_count/serde.rs diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 2c5394e..1b0c949 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -4,6 +4,7 @@ use std::borrow::Cow; use std::cmp::Ordering; use std::hash::BuildHasher as _; use std::mem::{size_of, size_of_val}; +use std::ops::Deref as _; use crate::config::{ count_ones_from_bitchunks, count_ones_from_msb_and_lsb, iter_bit_chunks, iter_ones, @@ -13,7 +14,6 @@ use crate::{Count, Diff}; mod bitvec; mod config; -mod serde; mod sim_hash; use bitvec::*; @@ -216,16 +216,11 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { let msb = self.msb.to_mut(); match msb.binary_search_by(|k| bucket.cmp(k)) { Ok(idx) => { - // The bit is already set in the MSB sparse bitset, remove it (XOR) msb.remove(idx); - - // We have removed a value from our MSB, move a value in the - // LSB into the MSB let (first, second) = { let mut lsb = iter_ones(self.lsb.bit_chunks().peekable()); (lsb.next(), lsb.next()) }; - let new_smallest = if let Some(smallest) = first { msb.push(C::BucketType::from_usize(smallest)); second.map(|_| smallest).unwrap_or(0) @@ -243,12 +238,10 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { .pop() .expect("we should have at least one element!") .into_usize(); - let new_smallest = msb .last() .expect("should have at least one element") .into_usize(); - // ensure LSB bit vector has the space for `smallest` self.lsb.resize(new_smallest); self.lsb.toggle(smallest); @@ -293,6 +286,57 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { self.lsb.num_bits(), ); } + + // Serialization: + // + // Since most of our target platforms are little endian there are more optimised approaches + // for little endian platforms, just splatting the bytes into the writer. This is contrary + // to the usual "network endian" approach where big endian is the default, but most of our + // consumers are little endian so it makes sense for this to be the optimal approach. + // + // For now we do not support big endian platforms. In the future we might add a big endian + // platform specific implementation which is able to read the little endian serialized + // representation. For now, if you attempt to serialize a filter on a big endian platform + // you get a panic. + + /// Create a new [`GeoDiffCount`] from a slice of bytes + #[cfg(target_endian = "little")] + pub fn from_bytes(c: C, buf: &'a [u8]) -> Self { + if buf.is_empty() { + return Self::new(c); + } + // The number of most significant bits stores in the MSB sparse repr + let msb_len = (buf.len() / size_of::()).min(c.max_msb_len()); + let msb = unsafe { + std::mem::transmute::<&[u8], &[C::BucketType]>(std::slice::from_raw_parts( + buf.as_ptr(), + msb_len, + )) + }; + // The number of bytes representing the MSB - this is how many bytes we need to + // skip over to reach the LSB + let msb_bytes_len = msb_len * size_of::(); + Self { + config: c, + msb: Cow::Borrowed(msb), + lsb: BitVec::from_bytes(&buf[msb_bytes_len..]), + } + } + + #[cfg(target_endian = "little")] + pub fn write(&self, writer: &mut W) -> std::io::Result { + if self.msb.is_empty() { + return Ok(0); + } + let msb_buckets = self.msb.deref(); + let msb_bytes = unsafe { + std::slice::from_raw_parts(msb_buckets.as_ptr() as *const u8, size_of_val(msb_buckets)) + }; + writer.write_all(msb_bytes)?; + let mut bytes_written = msb_bytes.len(); + bytes_written += self.lsb.write(writer)?; + Ok(bytes_written) + } } /// Applies a repeated bit mask to the underlying filter. @@ -611,50 +655,45 @@ mod tests { // This helper exists in order to easily test serializing types with different // bucket types in the MSB sparse bit field representation. See tests below. + #[cfg(target_endian = "little")] fn serialization_round_trip + Default>() { let mut rnd = rand::rngs::StdRng::from_os_rng(); - // Run 100 simulations of random values being put into // a diff counter. "Serializing" to a vector to emulate // writing to a disk, and then deserializing and asserting // the filters are equal. for _ in 0..100 { let mut before = GeoDiffCount::<'_, C>::default(); - - // Select a random number of items to insert + // Select a random number of items to insert. let items = (1..1000).choose(&mut rnd).unwrap(); - for _ in 0..items { before.push_hash(rnd.next_u64()); } - let mut writer = vec![]; - - // Insert some padding to emulate alignment issues with the slices + // Insert some padding to emulate alignment issues with the slices. // A previous version of this test never panicked even though we were - // violating the alignment preconditions for the `from_raw_parts` function + // violating the alignment preconditions for the `from_raw_parts` function. let padding = [0_u8; 8]; let pad_amount = (0..8).choose(&mut rnd).unwrap(); writer.write_all(&padding[..pad_amount]).unwrap(); - before.write(&mut writer).unwrap(); - let after = GeoDiffCount::<'_, C>::from_bytes(before.config.clone(), &writer[pad_amount..]); - assert_eq!(before, after); } } #[test] + #[cfg(target_endian = "little")] fn test_serialization_round_trip_7() { - // Uses a u16 for MSB buckets + // Uses a u16 for MSB buckets. serialization_round_trip::(); } #[test] + #[cfg(target_endian = "little")] fn test_serialization_round_trip_13() { - // Uses a u32 for MSB buckets + // Uses a u32 for MSB buckets. serialization_round_trip::(); } } diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index 9a0571b..e96b65c 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -147,13 +147,14 @@ impl BitVec<'_> { size_of_val(num_bits) + blocks.len() * size_of::() } + #[cfg(target_endian = "little")] pub fn from_bytes(mut buf: &[u8]) -> Self { if buf.is_empty() { return Self::default(); } // The first byte of the serialized BitVec is used to indicate how many - // of the bits in the left-most byte are *unoccupied*. + // of the bits in the left-most u64 block are *unoccupied*. // See [`BitVec::write`] implementation for how this is done. assert!( buf[0] < 64, @@ -182,6 +183,7 @@ impl BitVec<'_> { Self { num_bits, blocks } } + #[cfg(target_endian = "little")] pub fn write(&self, writer: &mut W) -> std::io::Result { if self.is_empty() { return Ok(0); diff --git a/crates/geo_filters/src/diff_count/serde.rs b/crates/geo_filters/src/diff_count/serde.rs deleted file mode 100644 index a52ccd7..0000000 --- a/crates/geo_filters/src/diff_count/serde.rs +++ /dev/null @@ -1,77 +0,0 @@ -//! Convert a [`GeoDiffCount`] to and from byte arrays. -//! -//! Since most of our target platforms are little endian there are more optimised approaches -//! for little endian platforms, just splatting the bytes into the writer. This is contrary -//! to the usual "network endian" approach where big endian is the default, but most of our -//! consumers are little endian so it makes sense for this to be the optimal approach. -//! -//! For now we do not support big endian platforms. In the future we might add a big endian -//! platform specific implementation which is able to read the little endian serialized -//! representation. For now, if you attempt to serialize a filter on a big endian platform -//! you get a panic. - -use std::{borrow::Cow, ops::Deref as _}; - -use crate::{config::GeoConfig, Diff}; - -use super::{bitvec::BitVec, GeoDiffCount}; - -impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { - /// Create a new [`GeoDiffCount`] from a slice of bytes - #[cfg(target_endian = "little")] - pub fn from_bytes(c: C, buf: &'a [u8]) -> Self { - if buf.is_empty() { - return Self::new(c); - } - - // The number of most significant bits stores in the MSB sparse repr - let msb_len = (buf.len() / size_of::()).min(c.max_msb_len()); - - let msb = unsafe { - std::mem::transmute::<&[u8], &[C::BucketType]>(std::slice::from_raw_parts( - buf.as_ptr(), - msb_len, - )) - }; - - // The number of bytes representing the MSB - this is how many bytes we need to - // skip over to reach the LSB - let msb_bytes_len = msb_len * size_of::(); - - Self { - config: c, - msb: Cow::Borrowed(msb), - lsb: BitVec::from_bytes(&buf[msb_bytes_len..]), - } - } - - /// Create a new [`GeoDiffCount`] from a slice of bytes - #[cfg(target_endian = "big")] - pub fn from_bytes(c: C, buf: &'a [u8]) -> Self { - unimplemented!("not supported on big endian platforms") - } - - #[cfg(target_endian = "little")] - pub fn write(&self, writer: &mut W) -> std::io::Result { - if self.msb.is_empty() { - return Ok(0); - } - - let msb_buckets = self.msb.deref(); - let msb_bytes = unsafe { - std::slice::from_raw_parts(msb_buckets.as_ptr() as *const u8, size_of_val(msb_buckets)) - }; - writer.write_all(msb_bytes)?; - - let mut bytes_written = msb_bytes.len(); - - bytes_written += self.lsb.write(writer)?; - - Ok(bytes_written) - } - - #[cfg(target_endian = "big")] - pub fn write(&self, writer: &mut W) -> std::io::Result { - unimplemented!("not supported on big endian platforms") - } -} From 101314068ad1b7fb329041b79552facb398a1acf Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 17:36:47 +0100 Subject: [PATCH 080/114] Add test harness for deterministic RNG in tests Fix issue where BitVec was required to be structurally identical rather than just semantically equivalent. This caused issues when bits in the LSB were toggled. This adds a test harness that provides seeded random number generators for tests, making failures reproducible via TEST_SEED env var. --- crates/geo_filters/src/diff_count.rs | 53 +++++++++++---------- crates/geo_filters/src/diff_count/bitvec.rs | 12 ++++- crates/geo_filters/src/lib.rs | 2 + crates/geo_filters/src/test_rng.rs | 24 ++++++++++ 4 files changed, 65 insertions(+), 26 deletions(-) create mode 100644 crates/geo_filters/src/test_rng.rs diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 7e784c6..93a182c 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -95,16 +95,14 @@ impl> GeoDiffCount<'_, C> { /// having to construct another iterator with the remaining `BitChunk`s. fn from_bit_chunks>(config: C, chunks: I) -> Self { let mut ones = iter_ones::(chunks.peekable()); - let mut msb = Vec::default(); take_ref(&mut ones, config.max_msb_len() - 1).for_each(|bucket| { msb.push(bucket); }); let smallest_msb = ones .next() - .map(|bucket| { - msb.push(bucket); - bucket + .inspect(|bucket| { + msb.push(*bucket); }) .unwrap_or_default(); @@ -365,6 +363,7 @@ mod tests { use crate::{ build_hasher::UnstableDefaultBuildHasher, config::{iter_ones, tests::test_estimate, FixedConfig}, + test_rng::prng_test_harness, }; use super::*; @@ -517,28 +516,32 @@ mod tests { #[test] fn test_xor_plus_mask() { - let mut rnd = rand::rngs::StdRng::from_os_rng(); - let mask_size = 12; - let mask = 0b100001100000; - let mut a = GeoDiffCount7::default(); - for _ in 0..10000 { - a.xor_bit(a.config.hash_to_bucket(rnd.next_u64())); - } - let mut expected = GeoDiffCount7::default(); - let mut b = a.clone(); for _ in 0..1000 { - let hash = rnd.next_u64(); - b.xor_bit(b.config.hash_to_bucket(hash)); - expected.xor_bit(expected.config.hash_to_bucket(hash)); - assert_eq!(expected, xor(&a, &b)); - - let masked_a = masked(&a, mask, mask_size); - let masked_b = masked(&b, mask, mask_size); - let masked_expected = masked(&expected, mask, mask_size); - // FIXME: test failed once with: - // left: ~12.37563 (msb: [390, 334, 263, 242, 222, 215, 164, 148, 100, 97, 66, 36], |lsb|: 36) - // right: ~12.37563 (msb: [390, 334, 263, 242, 222, 215, 164, 148, 100, 97, 66, 36], |lsb|: 0) - assert_eq!(masked_expected, xor(&masked_a, &masked_b)); + prng_test_harness(|mut rng| { + let mask_size = 12; + let mask = 0b100001100000; + let mut a = GeoDiffCount7::default(); + for _ in 0..10000 { + a.xor_bit(a.config.hash_to_bucket(rng.next_u64())); + } + let mut expected = GeoDiffCount7::default(); + let mut b = a.clone(); + for _ in 0..1000 { + let hash = rng.next_u64(); + b.xor_bit(b.config.hash_to_bucket(hash)); + expected.xor_bit(expected.config.hash_to_bucket(hash)); + + println!("a -> {:?}", a); + println!("b -> {:?}", b); + println!("exp -> {:?}", expected); + + assert_eq!(expected, xor(&a, &b)); + let masked_a = masked(&a, mask, mask_size); + let masked_b = masked(&b, mask, mask_size); + let masked_expected = masked(&expected, mask, mask_size); + assert_eq!(masked_expected, xor(&masked_a, &masked_b)); + } + }); } } diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index c94a041..601d663 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -12,12 +12,20 @@ use crate::config::BITS_PER_BLOCK; /// bit consumes 1 byte). It only implements the minimum number of operations that we need for our /// GeoDiffCount implementation. In particular it supports xor-ing of two bit vectors and /// iterating through one bits. -#[derive(Clone, Default, Debug, PartialEq, Eq)] +#[derive(Clone, Default, Debug)] pub(crate) struct BitVec<'a> { num_bits: usize, blocks: Cow<'a, [u64]>, } +impl PartialEq for BitVec<'_> { + fn eq(&self, other: &Self) -> bool { + self.bit_chunks().eq(other.bit_chunks()) + } +} + +impl Eq for BitVec<'_> {} + impl Ord for BitVec<'_> { fn cmp(&self, other: &Self) -> std::cmp::Ordering { match self.num_bits.cmp(&other.num_bits) { @@ -93,6 +101,8 @@ impl BitVec<'_> { assert!(index < self.num_bits); let (block_idx, bit_idx) = index.into_index_and_bit(); self.blocks.to_mut()[block_idx] ^= bit_idx.into_block(); + + if self.blocks.to_mut()[block_idx] & bit_idx.into_block() == 0 {} } /// Returns an iterator over all blocks in reverse order. diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index c810877..042c333 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -13,6 +13,8 @@ pub mod diff_count; pub mod distinct_count; #[cfg(feature = "evaluation")] pub mod evaluation; +#[cfg(test)] +mod test_rng; use std::hash::Hash; diff --git a/crates/geo_filters/src/test_rng.rs b/crates/geo_filters/src/test_rng.rs new file mode 100644 index 0000000..feb5b8d --- /dev/null +++ b/crates/geo_filters/src/test_rng.rs @@ -0,0 +1,24 @@ +use std::panic::{catch_unwind, resume_unwind, UnwindSafe}; + +use rand::{rngs::StdRng, SeedableRng as _}; + +/// Provides a seeded random number generator to tests which require some +/// degree of randomization. If the test panics the harness will print the +/// seed used for that run. You can then pass in this seed using the `TEST_SEED` +/// environment variable when running your tests. +pub fn prng_test_harness(test_fn: F) +where + F: Fn(StdRng) -> () + UnwindSafe, +{ + let seed = std::env::var("TEST_SEED") + .map(|s| s.parse::().expect("Parse TEST_SEED to u64")) + .unwrap_or_else(|_| rand::random()); + let rng = StdRng::seed_from_u64(seed); + let maybe_panic = catch_unwind(move || { + test_fn(rng); + }); + if let Err(panic_info) = maybe_panic { + eprintln!("Test failed! Reproduce with: TEST_SEED={}", seed); + resume_unwind(panic_info); + } +} From b3dc52ec2900387f3fe5e6393f6272be44728239 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 21:05:20 +0100 Subject: [PATCH 081/114] Refactor geo_filters tests to use PRNG test harness --- crates/geo_filters/src/config.rs | 39 ++++++----- crates/geo_filters/src/config/lookup.rs | 29 ++++---- crates/geo_filters/src/diff_count.rs | 77 ++++++++++----------- crates/geo_filters/src/diff_count/bitvec.rs | 2 - crates/geo_filters/src/distinct_count.rs | 47 +++++++------ crates/geo_filters/src/test_rng.rs | 21 +++--- 6 files changed, 111 insertions(+), 104 deletions(-) diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index d66da44..5d9ff9b 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -353,29 +353,30 @@ pub(crate) fn take_ref(iter: &mut I, n: usize) -> impl Iterator>(f: impl Fn() -> C) -> (f32, f32) { - let mut rnd = rand::rngs::StdRng::from_os_rng(); - let cnt = 10000usize; - let mut avg_precision = 0.0; - let mut avg_var = 0.0; - let trials = 500; - for _ in 0..trials { - let mut m = f(); - // Insert cnt many random items. - for _ in 0..cnt { - m.push_hash(rnd.next_u64()); + prng_test_harness(|rnd| { + let cnt = 10000usize; + let mut avg_precision = 0.0; + let mut avg_var = 0.0; + let trials = 500; + for _ in 0..trials { + let mut m = f(); + // Insert cnt many random items. + for _ in 0..cnt { + m.push_hash(rnd.next_u64()); + } + // Compute the relative error between estimate and actually inserted items. + let high_precision = m.size() / cnt as f32 - 1.0; + // Take the average over trials many attempts. + avg_precision += high_precision / trials as f32; + avg_var += high_precision.powf(2.0) / trials as f32; } - // Compute the relative error between estimate and actually inserted items. - let high_precision = m.size() / cnt as f32 - 1.0; - // Take the average over trials many attempts. - avg_precision += high_precision / trials as f32; - avg_var += high_precision.powf(2.0) / trials as f32; - } - (avg_precision, avg_var) + (avg_precision, avg_var) + }) } } diff --git a/crates/geo_filters/src/config/lookup.rs b/crates/geo_filters/src/config/lookup.rs index 2081f72..a453fe9 100644 --- a/crates/geo_filters/src/config/lookup.rs +++ b/crates/geo_filters/src/config/lookup.rs @@ -45,9 +45,12 @@ impl HashToBucketLookup { #[cfg(test)] mod tests { - use rand::{RngCore, SeedableRng}; + use rand::RngCore; - use crate::config::{hash_to_bucket, phi_f64}; + use crate::{ + config::{hash_to_bucket, phi_f64}, + test_rng::prng_test_harness, + }; use super::HashToBucketLookup; @@ -66,15 +69,17 @@ mod tests { fn lookup_random_hashes_variance(n: u64) -> f64 { let phi = phi_f64(B); let buckets = HashToBucketLookup::new(B); - let mut var = 0.0; - let mut rnd = rand::rngs::StdRng::from_os_rng(); - for _ in 0..n { - let hash = rnd.next_u64(); - let estimate = buckets.lookup(hash) as f64; - let real = hash_to_bucket(phi, hash) as f64; - let err = estimate - real; // assume the mean = 0.0 - var += err.powf(2.0) / n as f64; - } - var + + prng_test_harness(|rnd| { + let mut var = 0.0; + for _ in 0..n { + let hash = rnd.next_u64(); + let estimate = buckets.lookup(hash) as f64; + let real = hash_to_bucket(phi, hash) as f64; + let err = estimate - real; // assume the mean = 0.0 + var += err.powf(2.0) / n as f64; + } + var + }) } } diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 93a182c..a6d3595 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -358,7 +358,7 @@ impl> Count for GeoDiffCount<'_, C> { #[cfg(test)] mod tests { use itertools::Itertools; - use rand::{RngCore, SeedableRng}; + use rand::RngCore; use crate::{ build_hasher::UnstableDefaultBuildHasher, @@ -462,29 +462,30 @@ mod tests { #[test] fn test_estimate_diff_size_fast() { - let mut rnd = rand::rngs::StdRng::from_os_rng(); - let mut a_p = GeoDiffCount7_50::default(); - let mut a_hp = GeoDiffCount7::default(); - let mut b_p = GeoDiffCount7_50::default(); - let mut b_hp = GeoDiffCount7::default(); - for _ in 0..10000 { - let hash = rnd.next_u64(); - a_p.push_hash(hash); - a_hp.push_hash(hash); - } - for _ in 0..1000 { - let hash = rnd.next_u64(); - b_p.push_hash(hash); - b_hp.push_hash(hash); - } - let c_p = xor(&a_p, &b_p); - let c_hp = xor(&a_hp, &b_hp); + prng_test_harness(|rnd| { + let mut a_p = GeoDiffCount7_50::default(); + let mut a_hp = GeoDiffCount7::default(); + let mut b_p = GeoDiffCount7_50::default(); + let mut b_hp = GeoDiffCount7::default(); + for _ in 0..10000 { + let hash = rnd.next_u64(); + a_p.push_hash(hash); + a_hp.push_hash(hash); + } + for _ in 0..1000 { + let hash = rnd.next_u64(); + b_p.push_hash(hash); + b_hp.push_hash(hash); + } + let c_p = xor(&a_p, &b_p); + let c_hp = xor(&a_hp, &b_hp); - assert_eq!(c_p.size(), a_p.size_with_sketch(&b_p)); - assert_eq!(c_p.size(), b_p.size_with_sketch(&a_p)); + assert_eq!(c_p.size(), a_p.size_with_sketch(&b_p)); + assert_eq!(c_p.size(), b_p.size_with_sketch(&a_p)); - assert_eq!(c_hp.size(), a_hp.size_with_sketch(&b_hp)); - assert_eq!(c_hp.size(), b_hp.size_with_sketch(&a_hp)); + assert_eq!(c_hp.size(), a_hp.size_with_sketch(&b_hp)); + assert_eq!(c_hp.size(), b_hp.size_with_sketch(&a_hp)); + }); } #[test] @@ -517,24 +518,19 @@ mod tests { #[test] fn test_xor_plus_mask() { for _ in 0..1000 { - prng_test_harness(|mut rng| { + prng_test_harness(|rnd| { let mask_size = 12; let mask = 0b100001100000; let mut a = GeoDiffCount7::default(); for _ in 0..10000 { - a.xor_bit(a.config.hash_to_bucket(rng.next_u64())); + a.xor_bit(a.config.hash_to_bucket(rnd.next_u64())); } let mut expected = GeoDiffCount7::default(); let mut b = a.clone(); for _ in 0..1000 { - let hash = rng.next_u64(); + let hash = rnd.next_u64(); b.xor_bit(b.config.hash_to_bucket(hash)); expected.xor_bit(expected.config.hash_to_bucket(hash)); - - println!("a -> {:?}", a); - println!("b -> {:?}", b); - println!("exp -> {:?}", expected); - assert_eq!(expected, xor(&a, &b)); let masked_a = masked(&a, mask, mask_size); let masked_b = masked(&b, mask, mask_size); @@ -547,17 +543,18 @@ mod tests { #[test] fn test_bit_chunks() { - let mut rnd = rand::rngs::StdRng::from_os_rng(); for _ in 0..100 { - let mut expected = GeoDiffCount7::default(); - for _ in 0..1000 { - expected.push_hash(rnd.next_u64()); - } - let actual = GeoDiffCount::from_bit_chunks( - expected.config.clone(), - expected.bit_chunks().peekable(), - ); - assert_eq!(expected, actual); + prng_test_harness(|rnd| { + let mut expected = GeoDiffCount7::default(); + for _ in 0..1000 { + expected.push_hash(rnd.next_u64()); + } + let actual = GeoDiffCount::from_bit_chunks( + expected.config.clone(), + expected.bit_chunks().peekable(), + ); + assert_eq!(expected, actual); + }); } } diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index 601d663..47488f1 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -101,8 +101,6 @@ impl BitVec<'_> { assert!(index < self.num_bits); let (block_idx, bit_idx) = index.into_index_and_bit(); self.blocks.to_mut()[block_idx] ^= bit_idx.into_block(); - - if self.blocks.to_mut()[block_idx] & bit_idx.into_block() == 0 {} } /// Returns an iterator over all blocks in reverse order. diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index 8c2465c..5b24f5d 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -232,11 +232,12 @@ fn or>( #[cfg(test)] mod tests { use itertools::Itertools; - use rand::{RngCore, SeedableRng}; + use rand::RngCore; use crate::build_hasher::UnstableDefaultBuildHasher; use crate::config::{iter_ones, tests::test_estimate, FixedConfig, VariableConfig}; use crate::evaluation::simulation::simulate; + use crate::test_rng::prng_test_harness; use super::*; @@ -321,19 +322,20 @@ mod tests { #[test] fn test_estimate_union_size_fast() { - let mut rnd = rand::rngs::StdRng::from_os_rng(); - let mut a = GeoDistinctCount7::default(); - let mut b = GeoDistinctCount7::default(); - for _ in 0..10000 { - a.push_hash(rnd.next_u64()); - } - for _ in 0..1000 { - b.push_hash(rnd.next_u64()); - } - let c = or(&a, &b); + prng_test_harness(|rnd| { + let mut a = GeoDistinctCount7::default(); + let mut b = GeoDistinctCount7::default(); + for _ in 0..10000 { + a.push_hash(rnd.next_u64()); + } + for _ in 0..1000 { + b.push_hash(rnd.next_u64()); + } + let c = or(&a, &b); - assert_eq!(c.size(), a.size_with_sketch(&b)); - assert_eq!(c.size(), b.size_with_sketch(&a)); + assert_eq!(c.size(), a.size_with_sketch(&b)); + assert_eq!(c.size(), b.size_with_sketch(&a)); + }) } fn golden_section_min f32>(min: f32, max: f32, f: F) -> f32 { @@ -392,15 +394,18 @@ mod tests { #[test] fn test_bit_chunks() { - let mut rnd = rand::rngs::StdRng::from_os_rng(); for _ in 0..100 { - let mut expected = GeoDistinctCount7::default(); - for _ in 0..1000 { - expected.push_hash(rnd.next_u64()); - } - let actual = - GeoDistinctCount::from_bit_chunks(expected.config.clone(), expected.bit_chunks()); - assert_eq!(expected, actual); + prng_test_harness(|rnd| { + let mut expected = GeoDistinctCount7::default(); + for _ in 0..1000 { + expected.push_hash(rnd.next_u64()); + } + let actual = GeoDistinctCount::from_bit_chunks( + expected.config.clone(), + expected.bit_chunks(), + ); + assert_eq!(expected, actual); + }) } } diff --git a/crates/geo_filters/src/test_rng.rs b/crates/geo_filters/src/test_rng.rs index feb5b8d..fd653e2 100644 --- a/crates/geo_filters/src/test_rng.rs +++ b/crates/geo_filters/src/test_rng.rs @@ -1,4 +1,4 @@ -use std::panic::{catch_unwind, resume_unwind, UnwindSafe}; +use std::panic::{catch_unwind, resume_unwind, AssertUnwindSafe}; use rand::{rngs::StdRng, SeedableRng as _}; @@ -6,19 +6,20 @@ use rand::{rngs::StdRng, SeedableRng as _}; /// degree of randomization. If the test panics the harness will print the /// seed used for that run. You can then pass in this seed using the `TEST_SEED` /// environment variable when running your tests. -pub fn prng_test_harness(test_fn: F) +pub fn prng_test_harness(test_fn: F) -> T where - F: Fn(StdRng) -> () + UnwindSafe, + F: Fn(&mut StdRng) -> T, { let seed = std::env::var("TEST_SEED") .map(|s| s.parse::().expect("Parse TEST_SEED to u64")) .unwrap_or_else(|_| rand::random()); - let rng = StdRng::seed_from_u64(seed); - let maybe_panic = catch_unwind(move || { - test_fn(rng); - }); - if let Err(panic_info) = maybe_panic { - eprintln!("Test failed! Reproduce with: TEST_SEED={}", seed); - resume_unwind(panic_info); + let mut rng = StdRng::seed_from_u64(seed); + let maybe_panic = catch_unwind(AssertUnwindSafe(|| test_fn(&mut rng))); + match maybe_panic { + Ok(t) => t, + Err(panic_info) => { + eprintln!("Test failed! Reproduce with: TEST_SEED={}", seed); + resume_unwind(panic_info); + } } } From 0b63f37a5c0e6d78f1834373839f90815d96d5bb Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 21:09:26 +0100 Subject: [PATCH 082/114] Remove whitespace in geofilters bitvec --- crates/geo_filters/src/diff_count/bitvec.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index e96b65c..98c1498 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -152,7 +152,6 @@ impl BitVec<'_> { if buf.is_empty() { return Self::default(); } - // The first byte of the serialized BitVec is used to indicate how many // of the bits in the left-most u64 block are *unoccupied*. // See [`BitVec::write`] implementation for how this is done. @@ -161,17 +160,14 @@ impl BitVec<'_> { "Number of unoccupied bits should be <64, got {}", buf[0] ); - let num_bits = (buf.len() - 1) * 8 - buf[0] as usize; buf = &buf[1..]; - assert_eq!( buf.len() % BYTES_PER_BLOCK, 0, "buffer should be a multiple of 8 bytes, got {}", buf.len() ); - let blocks = unsafe { std::mem::transmute::<&[u8], &[u64]>(std::slice::from_raw_parts( buf.as_ptr(), @@ -179,7 +175,6 @@ impl BitVec<'_> { )) }; let blocks = Cow::Borrowed(blocks); - Self { num_bits, blocks } } @@ -188,18 +183,14 @@ impl BitVec<'_> { if self.is_empty() { return Ok(0); } - // First serialize the number of unoccupied bits in the last block as one byte. let unoccupied_bits = 63 - ((self.num_bits - 1) % 64) as u8; writer.write_all(&[unoccupied_bits])?; - let blocks = self.blocks.deref(); let block_bytes = unsafe { std::slice::from_raw_parts(blocks.as_ptr() as *const u8, blocks.len() * BYTES_PER_BLOCK) }; - writer.write_all(block_bytes)?; - Ok(block_bytes.len() + 1) } } From bd87a25ba7928db1057592e0c5a19440fa4c7ba0 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Thu, 24 Jul 2025 21:16:03 +0100 Subject: [PATCH 083/114] Clippy loves inline format string args --- crates/geo_filters/src/diff_count.rs | 2 -- crates/geo_filters/src/test_rng.rs | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index a6d3595..c3f61af 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -105,9 +105,7 @@ impl> GeoDiffCount<'_, C> { msb.push(*bucket); }) .unwrap_or_default(); - let lsb = BitVec::from_bit_chunks(ones.into_bitchunks(), smallest_msb.into_usize()); - let result = Self { config, msb: Cow::from(msb), diff --git a/crates/geo_filters/src/test_rng.rs b/crates/geo_filters/src/test_rng.rs index fd653e2..40eb35a 100644 --- a/crates/geo_filters/src/test_rng.rs +++ b/crates/geo_filters/src/test_rng.rs @@ -18,7 +18,7 @@ where match maybe_panic { Ok(t) => t, Err(panic_info) => { - eprintln!("Test failed! Reproduce with: TEST_SEED={}", seed); + eprintln!("Test failed! Reproduce with: TEST_SEED={seed}"); resume_unwind(panic_info); } } From 4261d8d19e5fa68fdbcf014a6fd617162766a62f Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 10:05:19 +0100 Subject: [PATCH 084/114] Address reworks in geo_filters work - Pass in RNG to helper functions - Add iterations to test harness --- crates/geo_filters/src/config.rs | 43 ++++----- crates/geo_filters/src/config/lookup.rs | 36 ++++---- crates/geo_filters/src/diff_count.rs | 112 +++++++++++------------ crates/geo_filters/src/distinct_count.rs | 46 +++++----- crates/geo_filters/src/test_rng.rs | 28 ++++-- 5 files changed, 141 insertions(+), 124 deletions(-) diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index 5d9ff9b..57d74e3 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -353,30 +353,31 @@ pub(crate) fn take_ref(iter: &mut I, n: usize) -> impl Iterator>(f: impl Fn() -> C) -> (f32, f32) { - prng_test_harness(|rnd| { - let cnt = 10000usize; - let mut avg_precision = 0.0; - let mut avg_var = 0.0; - let trials = 500; - for _ in 0..trials { - let mut m = f(); - // Insert cnt many random items. - for _ in 0..cnt { - m.push_hash(rnd.next_u64()); - } - // Compute the relative error between estimate and actually inserted items. - let high_precision = m.size() / cnt as f32 - 1.0; - // Take the average over trials many attempts. - avg_precision += high_precision / trials as f32; - avg_var += high_precision.powf(2.0) / trials as f32; + pub(crate) fn test_estimate>( + rnd: &mut StdRng, + f: impl Fn() -> C, + ) -> (f32, f32) { + let cnt = 10000usize; + let mut avg_precision = 0.0; + let mut avg_var = 0.0; + let trials = 500; + for _ in 0..trials { + let mut m = f(); + // Insert cnt many random items. + for _ in 0..cnt { + m.push_hash(rnd.next_u64()); } - (avg_precision, avg_var) - }) + // Compute the relative error between estimate and actually inserted items. + let high_precision = m.size() / cnt as f32 - 1.0; + // Take the average over trials many attempts. + avg_precision += high_precision / trials as f32; + avg_var += high_precision.powf(2.0) / trials as f32; + } + (avg_precision, avg_var) } } diff --git a/crates/geo_filters/src/config/lookup.rs b/crates/geo_filters/src/config/lookup.rs index a453fe9..693e6df 100644 --- a/crates/geo_filters/src/config/lookup.rs +++ b/crates/geo_filters/src/config/lookup.rs @@ -45,7 +45,7 @@ impl HashToBucketLookup { #[cfg(test)] mod tests { - use rand::RngCore; + use rand::{rngs::StdRng, RngCore}; use crate::{ config::{hash_to_bucket, phi_f64}, @@ -56,30 +56,32 @@ mod tests { #[test] fn test_lookup_7() { - let var = lookup_random_hashes_variance::<7>(1 << 16); - assert!(var < 1e-4, "variance {var} too large"); + prng_test_harness(1, |rnd| { + let var = lookup_random_hashes_variance::<7>(rnd, 1 << 16); + assert!(var < 1e-4, "variance {var} too large"); + }); } #[test] fn test_lookup_13() { - let var = lookup_random_hashes_variance::<13>(1 << 16); - assert!(var < 1e-4, "variance {var} too large"); + prng_test_harness(1, |rnd| { + let var = lookup_random_hashes_variance::<13>(rnd, 1 << 16); + assert!(var < 1e-4, "variance {var} too large"); + }); } - fn lookup_random_hashes_variance(n: u64) -> f64 { + fn lookup_random_hashes_variance(rnd: &mut StdRng, n: u64) -> f64 { let phi = phi_f64(B); let buckets = HashToBucketLookup::new(B); - prng_test_harness(|rnd| { - let mut var = 0.0; - for _ in 0..n { - let hash = rnd.next_u64(); - let estimate = buckets.lookup(hash) as f64; - let real = hash_to_bucket(phi, hash) as f64; - let err = estimate - real; // assume the mean = 0.0 - var += err.powf(2.0) / n as f64; - } - var - }) + let mut var = 0.0; + for _ in 0..n { + let hash = rnd.next_u64(); + let estimate = buckets.lookup(hash) as f64; + let real = hash_to_bucket(phi, hash) as f64; + let err = estimate - real; // assume the mean = 0.0 + var += err.powf(2.0) / n as f64; + } + var } } diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index c3f61af..6abe3bc 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -432,35 +432,39 @@ mod tests { #[test] fn test_estimate_fast() { - let (avg_precision, avg_var) = test_estimate(GeoDiffCount7::default); - println!( - "avg precision: {} with standard deviation: {}", - avg_precision, - avg_var.sqrt(), - ); - // Make sure that the estimate converges to the correct value. - assert!(avg_precision.abs() < 0.04); - // We should theoretically achieve a standard deviation of about 0.12 - assert!(avg_var.sqrt() < 0.14); + prng_test_harness(1, |rnd| { + let (avg_precision, avg_var) = test_estimate(rnd, GeoDiffCount7::default); + println!( + "avg precision: {} with standard deviation: {}", + avg_precision, + avg_var.sqrt(), + ); + // Make sure that the estimate converges to the correct value. + assert!(avg_precision.abs() < 0.04); + // We should theoretically achieve a standard deviation of about 0.12 + assert!(avg_var.sqrt() < 0.14); + }) } #[test] fn test_estimate_fast_low_precision() { - let (avg_precision, avg_var) = test_estimate(GeoDiffCount7_50::default); - println!( - "avg precision: {} with standard deviation: {}", - avg_precision, - avg_var.sqrt(), - ); - // Make sure that the estimate converges to the correct value. - assert!(avg_precision.abs() < 0.15); - // We should theoretically achieve a standard deviation of about 0.25 - assert!(avg_var.sqrt() < 0.4); + prng_test_harness(1, |rnd| { + let (avg_precision, avg_var) = test_estimate(rnd, GeoDiffCount7_50::default); + println!( + "avg precision: {} with standard deviation: {}", + avg_precision, + avg_var.sqrt(), + ); + // Make sure that the estimate converges to the correct value. + assert!(avg_precision.abs() < 0.15); + // We should theoretically achieve a standard deviation of about 0.25 + assert!(avg_var.sqrt() < 0.4); + }); } #[test] fn test_estimate_diff_size_fast() { - prng_test_harness(|rnd| { + prng_test_harness(1, |rnd| { let mut a_p = GeoDiffCount7_50::default(); let mut a_hp = GeoDiffCount7::default(); let mut b_p = GeoDiffCount7_50::default(); @@ -515,45 +519,41 @@ mod tests { #[test] fn test_xor_plus_mask() { - for _ in 0..1000 { - prng_test_harness(|rnd| { - let mask_size = 12; - let mask = 0b100001100000; - let mut a = GeoDiffCount7::default(); - for _ in 0..10000 { - a.xor_bit(a.config.hash_to_bucket(rnd.next_u64())); - } - let mut expected = GeoDiffCount7::default(); - let mut b = a.clone(); - for _ in 0..1000 { - let hash = rnd.next_u64(); - b.xor_bit(b.config.hash_to_bucket(hash)); - expected.xor_bit(expected.config.hash_to_bucket(hash)); - assert_eq!(expected, xor(&a, &b)); - let masked_a = masked(&a, mask, mask_size); - let masked_b = masked(&b, mask, mask_size); - let masked_expected = masked(&expected, mask, mask_size); - assert_eq!(masked_expected, xor(&masked_a, &masked_b)); - } - }); - } + prng_test_harness(1000, |rnd| { + let mask_size = 12; + let mask = 0b100001100000; + let mut a = GeoDiffCount7::default(); + for _ in 0..10000 { + a.xor_bit(a.config.hash_to_bucket(rnd.next_u64())); + } + let mut expected = GeoDiffCount7::default(); + let mut b = a.clone(); + for _ in 0..1000 { + let hash = rnd.next_u64(); + b.xor_bit(b.config.hash_to_bucket(hash)); + expected.xor_bit(expected.config.hash_to_bucket(hash)); + assert_eq!(expected, xor(&a, &b)); + let masked_a = masked(&a, mask, mask_size); + let masked_b = masked(&b, mask, mask_size); + let masked_expected = masked(&expected, mask, mask_size); + assert_eq!(masked_expected, xor(&masked_a, &masked_b)); + } + }); } #[test] fn test_bit_chunks() { - for _ in 0..100 { - prng_test_harness(|rnd| { - let mut expected = GeoDiffCount7::default(); - for _ in 0..1000 { - expected.push_hash(rnd.next_u64()); - } - let actual = GeoDiffCount::from_bit_chunks( - expected.config.clone(), - expected.bit_chunks().peekable(), - ); - assert_eq!(expected, actual); - }); - } + prng_test_harness(100, |rnd| { + let mut expected = GeoDiffCount7::default(); + for _ in 0..1000 { + expected.push_hash(rnd.next_u64()); + } + let actual = GeoDiffCount::from_bit_chunks( + expected.config.clone(), + expected.bit_chunks().peekable(), + ); + assert_eq!(expected, actual); + }); } #[test] diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index 5b24f5d..6587171 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -308,21 +308,23 @@ mod tests { #[test] fn test_estimate_fast() { - let (avg_precision, avg_var) = test_estimate(GeoDistinctCount7::default); - println!( - "avg precision: {} with standard deviation: {}", - avg_precision, - avg_var.sqrt(), - ); - // Make sure that the estimate converges to the correct value. - assert!(avg_precision.abs() < 0.04); - // We should theoretically achieve a standard deviation of about 0.065 - assert!(avg_var.sqrt() < 0.08); + prng_test_harness(1, |rnd| { + let (avg_precision, avg_var) = test_estimate(rnd, GeoDistinctCount7::default); + println!( + "avg precision: {} with standard deviation: {}", + avg_precision, + avg_var.sqrt(), + ); + // Make sure that the estimate converges to the correct value. + assert!(avg_precision.abs() < 0.04); + // We should theoretically achieve a standard deviation of about 0.065 + assert!(avg_var.sqrt() < 0.08); + }) } #[test] fn test_estimate_union_size_fast() { - prng_test_harness(|rnd| { + prng_test_harness(1, |rnd| { let mut a = GeoDistinctCount7::default(); let mut b = GeoDistinctCount7::default(); for _ in 0..10000 { @@ -394,19 +396,15 @@ mod tests { #[test] fn test_bit_chunks() { - for _ in 0..100 { - prng_test_harness(|rnd| { - let mut expected = GeoDistinctCount7::default(); - for _ in 0..1000 { - expected.push_hash(rnd.next_u64()); - } - let actual = GeoDistinctCount::from_bit_chunks( - expected.config.clone(), - expected.bit_chunks(), - ); - assert_eq!(expected, actual); - }) - } + prng_test_harness(100, |rnd| { + let mut expected = GeoDistinctCount7::default(); + for _ in 0..1000 { + expected.push_hash(rnd.next_u64()); + } + let actual = + GeoDistinctCount::from_bit_chunks(expected.config.clone(), expected.bit_chunks()); + assert_eq!(expected, actual); + }) } #[test] diff --git a/crates/geo_filters/src/test_rng.rs b/crates/geo_filters/src/test_rng.rs index 40eb35a..6f07a84 100644 --- a/crates/geo_filters/src/test_rng.rs +++ b/crates/geo_filters/src/test_rng.rs @@ -6,15 +6,31 @@ use rand::{rngs::StdRng, SeedableRng as _}; /// degree of randomization. If the test panics the harness will print the /// seed used for that run. You can then pass in this seed using the `TEST_SEED` /// environment variable when running your tests. -pub fn prng_test_harness(test_fn: F) -> T +/// +/// You can provide a number of `iterations` this harness will run with randomly +/// generated seeds. If a manual seed is provided via the environment then the test +/// is only ran once with this seed. +pub fn prng_test_harness(iterations: usize, mut test_fn: F) where - F: Fn(&mut StdRng) -> T, + F: FnMut(&mut StdRng) -> (), { - let seed = std::env::var("TEST_SEED") + let maybe_manual_seed = std::env::var("TEST_SEED") .map(|s| s.parse::().expect("Parse TEST_SEED to u64")) - .unwrap_or_else(|_| rand::random()); - let mut rng = StdRng::seed_from_u64(seed); - let maybe_panic = catch_unwind(AssertUnwindSafe(|| test_fn(&mut rng))); + .ok(); + let mut seed = 0; + let maybe_panic = catch_unwind(AssertUnwindSafe(|| { + if let Some(manual_seed) = maybe_manual_seed { + seed = manual_seed; + let mut rng = StdRng::seed_from_u64(seed); + test_fn(&mut rng); + } else { + for _ in 0..iterations { + seed = rand::random(); + let mut rng = StdRng::seed_from_u64(seed); + test_fn(&mut rng); + } + } + })); match maybe_panic { Ok(t) => t, Err(panic_info) => { From 8e3bff1da766f9aa62cdf2c1cf90c13e43342264 Mon Sep 17 00:00:00 2001 From: Alexander Neubeck Date: Fri, 25 Jul 2025 08:28:53 +0200 Subject: [PATCH 085/114] Ensure invariance --- crates/geo_filters/src/diff_count.rs | 17 +++++++++++------ crates/geo_filters/src/diff_count/bitvec.rs | 14 ++------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 6abe3bc..dfdab20 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -210,17 +210,16 @@ impl> GeoDiffCount<'_, C> { match msb.binary_search_by(|k| bucket.cmp(k)) { Ok(idx) => { msb.remove(idx); - let (first, second) = { + let first = { let mut lsb = iter_ones(self.lsb.bit_chunks().peekable()); - (lsb.next(), lsb.next()) + lsb.next() }; - let new_smallest = if let Some(smallest) = first { + if let Some(smallest) = first { msb.push(C::BucketType::from_usize(smallest)); - second.map(|_| smallest).unwrap_or(0) + self.lsb.resize(smallest); } else { - 0 + self.lsb.resize(0); }; - self.lsb.resize(new_smallest); } Err(idx) => { msb.insert(idx, bucket); @@ -236,6 +235,12 @@ impl> GeoDiffCount<'_, C> { .into_usize(); self.lsb.resize(new_smallest); self.lsb.toggle(smallest); + } else if msb.len() == self.config.max_msb_len() { + let smallest = msb + .last() + .expect("should have at least one element") + .into_usize(); + self.lsb.resize(smallest); } } } diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index 47488f1..bf86ecc 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -12,20 +12,12 @@ use crate::config::BITS_PER_BLOCK; /// bit consumes 1 byte). It only implements the minimum number of operations that we need for our /// GeoDiffCount implementation. In particular it supports xor-ing of two bit vectors and /// iterating through one bits. -#[derive(Clone, Default, Debug)] +#[derive(Clone, Default, Debug, Eq, PartialEq)] pub(crate) struct BitVec<'a> { num_bits: usize, blocks: Cow<'a, [u64]>, } -impl PartialEq for BitVec<'_> { - fn eq(&self, other: &Self) -> bool { - self.bit_chunks().eq(other.bit_chunks()) - } -} - -impl Eq for BitVec<'_> {} - impl Ord for BitVec<'_> { fn cmp(&self, other: &Self) -> std::cmp::Ordering { match self.num_bits.cmp(&other.num_bits) { @@ -49,11 +41,9 @@ impl BitVec<'_> { /// NOTE: If the bitchunks iterator is empty, the result is NOT sized to `num_bits` but will /// be EMPTY instead. pub fn from_bit_chunks>( - mut chunks: Peekable, + chunks: Peekable, num_bits: usize, ) -> Self { - // if there are no chunks, we keep the size zero - let num_bits = chunks.peek().map(|_| num_bits).unwrap_or_default(); let mut result = Self::default(); result.resize(num_bits); let blocks = result.blocks.to_mut(); From e2b1d0279a5712f018e3fdc2d5c580907c31a1cb Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 10:12:18 +0100 Subject: [PATCH 086/114] Remove Peekable from BitVec::from_bit_chunks, remove problematic comment. --- crates/geo_filters/src/diff_count/bitvec.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/crates/geo_filters/src/diff_count/bitvec.rs b/crates/geo_filters/src/diff_count/bitvec.rs index bf86ecc..707b1f0 100644 --- a/crates/geo_filters/src/diff_count/bitvec.rs +++ b/crates/geo_filters/src/diff_count/bitvec.rs @@ -1,6 +1,5 @@ use std::borrow::Cow; use std::cmp::Ordering; -use std::iter::Peekable; use std::mem::{size_of, size_of_val}; use std::ops::{Index, Range}; @@ -37,13 +36,7 @@ impl BitVec<'_> { /// Takes an iterator of `BitChunk` items as input and returns the corresponding `BitVec`. /// The order of `BitChunk`s doesn't matter for this function and `BitChunk` may be hitting /// the same block. In this case, the function will simply xor them together. - /// - /// NOTE: If the bitchunks iterator is empty, the result is NOT sized to `num_bits` but will - /// be EMPTY instead. - pub fn from_bit_chunks>( - chunks: Peekable, - num_bits: usize, - ) -> Self { + pub fn from_bit_chunks>(chunks: I, num_bits: usize) -> Self { let mut result = Self::default(); result.resize(num_bits); let blocks = result.blocks.to_mut(); From 1991c83012315b6262ba9069468fc64cf1ea61ee Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 10:18:33 +0100 Subject: [PATCH 087/114] Geofilter clippy lints --- crates/geo_filters/src/test_rng.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/geo_filters/src/test_rng.rs b/crates/geo_filters/src/test_rng.rs index 6f07a84..3302612 100644 --- a/crates/geo_filters/src/test_rng.rs +++ b/crates/geo_filters/src/test_rng.rs @@ -12,7 +12,7 @@ use rand::{rngs::StdRng, SeedableRng as _}; /// is only ran once with this seed. pub fn prng_test_harness(iterations: usize, mut test_fn: F) where - F: FnMut(&mut StdRng) -> (), + F: FnMut(&mut StdRng), { let maybe_manual_seed = std::env::var("TEST_SEED") .map(|s| s.parse::().expect("Parse TEST_SEED to u64")) From b48eb4ecd4d9bfa8ccdbcf9dbc9cfc6b06de72fa Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 10:27:46 +0100 Subject: [PATCH 088/114] Reduce diff count test iterations to 10 for speed --- crates/geo_filters/src/diff_count.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index dfdab20..3f66eaf 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -524,7 +524,7 @@ mod tests { #[test] fn test_xor_plus_mask() { - prng_test_harness(1000, |rnd| { + prng_test_harness(10, |rnd| { let mask_size = 12; let mask = 0b100001100000; let mut a = GeoDiffCount7::default(); From a469fdee770c331db2f9b810cabb21538a116c23 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 10:38:50 +0100 Subject: [PATCH 089/114] Remove unneeded peekable() calls --- crates/geo_filters/src/diff_count.rs | 6 ++---- crates/geo_filters/src/distinct_count.rs | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 3f66eaf..886cfc8 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -553,10 +553,8 @@ mod tests { for _ in 0..1000 { expected.push_hash(rnd.next_u64()); } - let actual = GeoDiffCount::from_bit_chunks( - expected.config.clone(), - expected.bit_chunks().peekable(), - ); + let actual = + GeoDiffCount::from_bit_chunks(expected.config.clone(), expected.bit_chunks()); assert_eq!(expected, actual); }); } diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index 6587171..60e258a 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -225,7 +225,7 @@ fn or>( GeoDistinctCount::<'static, C>::from_bit_chunks( a.config.clone(), - or_bit_chunks(a.bit_chunks(), b.bit_chunks()).peekable(), + or_bit_chunks(a.bit_chunks(), b.bit_chunks()), ) } From bba72eb3af824282d8e008e7cfee61a009c4e2bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 01:27:11 +0000 Subject: [PATCH 090/114] Update criterion requirement from 0.6 to 0.7 Updates the requirements on [criterion](https://github.com/bheisler/criterion.rs) to permit the latest version. - [Changelog](https://github.com/bheisler/criterion.rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/bheisler/criterion.rs/compare/0.6.0...0.7.0) --- updated-dependencies: - dependency-name: criterion dependency-version: 0.7.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- crates/bpe/benchmarks/Cargo.toml | 2 +- crates/geo_filters/Cargo.toml | 2 +- crates/string-offsets/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bpe/benchmarks/Cargo.toml b/crates/bpe/benchmarks/Cargo.toml index 19216f1..09f0788 100644 --- a/crates/bpe/benchmarks/Cargo.toml +++ b/crates/bpe/benchmarks/Cargo.toml @@ -20,7 +20,7 @@ test = true [dependencies] bpe = { path = "../../bpe", features = ["rand", "tiktoken"] } bpe-openai = { path = "../../bpe-openai" } -criterion = "0.6" +criterion = "0.7" rand = "0.9" tiktoken-rs = "0.7" tokenizers = { version = "0.21", features = ["http"] } diff --git a/crates/geo_filters/Cargo.toml b/crates/geo_filters/Cargo.toml index e850564..6145d87 100644 --- a/crates/geo_filters/Cargo.toml +++ b/crates/geo_filters/Cargo.toml @@ -33,7 +33,7 @@ rayon = { version = "1.7", optional = true } regex = { version = "1", optional = true } [dev-dependencies] -criterion = "0.6" +criterion = "0.7" geo_filters = { path = ".", features = ["evaluation"] } rand = "0.9" rand_chacha = "0.9" diff --git a/crates/string-offsets/Cargo.toml b/crates/string-offsets/Cargo.toml index 656b92e..e20db3b 100644 --- a/crates/string-offsets/Cargo.toml +++ b/crates/string-offsets/Cargo.toml @@ -22,7 +22,7 @@ wasm-bindgen = { version = "0.2", optional = true } [dev-dependencies] rand = "0.9" rand_chacha = "0.9" -criterion = "0.6" +criterion = "0.7" [[bench]] name = "performance" From 0c075f1174c616376c98cdc25119c997e6e4d382 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 15:00:40 +0100 Subject: [PATCH 091/114] Move test helpers from tests module to main impl --- crates/geo_filters/src/diff_count.rs | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 8fc3db2..c5e94ba 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -338,6 +338,20 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { bytes_written += self.lsb.write(writer)?; Ok(bytes_written) } + + #[cfg(test)] + pub fn from_ones(config: C, ones: impl IntoIterator) -> Self { + let mut result = Self::new(config); + for one in ones { + result.xor_bit(one); + } + result + } + + #[cfg(test)] + pub fn iter_ones(&self) -> impl Iterator + '_ { + iter_ones(self.bit_chunks().peekable()).map(C::BucketType::from_usize) + } } /// Applies a repeated bit mask to the underlying filter. @@ -423,7 +437,7 @@ mod tests { use crate::{ build_hasher::UnstableDefaultBuildHasher, - config::{iter_ones, tests::test_estimate, FixedConfig}, + config::{tests::test_estimate, FixedConfig}, test_rng::prng_test_harness, }; @@ -626,20 +640,6 @@ mod tests { assert_eq!(vec![17, 11, 7], a.msb.iter().copied().collect_vec()); } - impl> GeoDiffCount<'_, C> { - fn from_ones(config: C, ones: impl IntoIterator) -> Self { - let mut result = Self::new(config); - for one in ones { - result.xor_bit(one); - } - result - } - - fn iter_ones(&self) -> impl Iterator + '_ { - iter_ones(self.bit_chunks().peekable()).map(C::BucketType::from_usize) - } - } - #[test] fn test_serialization_empty() { let before = GeoDiffCount7::default(); From b88040922488989ff871beeee3f981bf48ce1dd0 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 16:50:37 +0100 Subject: [PATCH 092/114] Make geo_filters SimHash publically accessible --- crates/geo_filters/src/diff_count.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index c5e94ba..80423e5 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -18,6 +18,7 @@ mod sim_hash; use bitvec::*; pub use config::{GeoDiffConfig13, GeoDiffConfig7}; +pub use sim_hash::SimHash; /// Diff count filter with a relative error standard deviation of ~0.125. pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7>; From ee0f306c262072d36e66af626477fd73d36d96f9 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 18:22:13 +0100 Subject: [PATCH 093/114] Make SIM_BUCKETS and SIM_BUCKET_SIZE public --- crates/geo_filters/src/diff_count.rs | 2 +- crates/geo_filters/src/diff_count/sim_hash.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 80423e5..77ec91a 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -18,7 +18,7 @@ mod sim_hash; use bitvec::*; pub use config::{GeoDiffConfig13, GeoDiffConfig7}; -pub use sim_hash::SimHash; +pub use sim_hash::{SimHash, SIM_BUCKETS, SIM_BUCKET_SIZE}; /// Diff count filter with a relative error standard deviation of ~0.125. pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7>; diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index cee2370..6048666 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -12,9 +12,9 @@ use crate::Diff; use super::BitVec; /// Number of bits covered by each SimHash bucket. -pub(crate) const SIM_BUCKET_SIZE: usize = 6; +pub const SIM_BUCKET_SIZE: usize = 6; /// Number of consecutive SimHash buckets used for searching. -pub(crate) const SIM_BUCKETS: usize = 20; +pub const SIM_BUCKETS: usize = 20; pub type BucketId = usize; From 9e7ca13b77d5a96d1d428591c29a9f9adb99e90c Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 25 Jul 2025 18:38:45 +0100 Subject: [PATCH 094/114] Add optional serde support to SimHash and geo_filters crate --- crates/geo_filters/Cargo.toml | 2 ++ crates/geo_filters/src/diff_count/sim_hash.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/crates/geo_filters/Cargo.toml b/crates/geo_filters/Cargo.toml index 6145d87..db2a311 100644 --- a/crates/geo_filters/Cargo.toml +++ b/crates/geo_filters/Cargo.toml @@ -14,6 +14,7 @@ bench = false [features] default = [] +serde = ["dep:serde"] evaluation = [ "dep:clap", "dep:hyperloglogplus", @@ -31,6 +32,7 @@ once_cell = "1.18" rand = { version = "0.9", optional = true } rayon = { version = "1.7", optional = true } regex = { version = "1", optional = true } +serde = { version = "1.0", default-features = false, optional = true } [dev-dependencies] criterion = "0.7" diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index 6048666..c2b49a2 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -21,6 +21,8 @@ pub type BucketId = usize; /// SimHash is a hash computed over a continuous range of bits from a GeoDiffCount. /// It is used to quickly find similar sets with a reverse index. #[derive(Copy, Clone, Default, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr(feature = "serde", serde(transparent))] pub struct SimHash(pub u64); impl SimHash { From 5e594a23157c9cf46ccd1d38a98939f55a85ebe7 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 28 Jul 2025 15:53:12 +0100 Subject: [PATCH 095/114] Add pseudorandom filter test function to geo_filters Also change the RNG in the test_rng harness to use chacha12 since that's portable. --- crates/geo_filters/src/config.rs | 5 +++-- crates/geo_filters/src/config/lookup.rs | 5 +++-- crates/geo_filters/src/diff_count.rs | 19 +++++++++++++++++-- crates/geo_filters/src/test_rng.rs | 9 +++++---- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index 57d74e3..7c04022 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -353,13 +353,14 @@ pub(crate) fn take_ref(iter: &mut I, n: usize) -> impl Iterator>( - rnd: &mut StdRng, + rnd: &mut ChaCha12Rng, f: impl Fn() -> C, ) -> (f32, f32) { let cnt = 10000usize; diff --git a/crates/geo_filters/src/config/lookup.rs b/crates/geo_filters/src/config/lookup.rs index 693e6df..3f7d688 100644 --- a/crates/geo_filters/src/config/lookup.rs +++ b/crates/geo_filters/src/config/lookup.rs @@ -45,7 +45,8 @@ impl HashToBucketLookup { #[cfg(test)] mod tests { - use rand::{rngs::StdRng, RngCore}; + use rand::RngCore; + use rand_chacha::ChaCha12Rng; use crate::{ config::{hash_to_bucket, phi_f64}, @@ -70,7 +71,7 @@ mod tests { }); } - fn lookup_random_hashes_variance(rnd: &mut StdRng, n: u64) -> f64 { + fn lookup_random_hashes_variance(rnd: &mut ChaCha12Rng, n: u64) -> f64 { let phi = phi_f64(B); let buckets = HashToBucketLookup::new(B); diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 77ec91a..dda2796 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -353,6 +353,20 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { pub fn iter_ones(&self) -> impl Iterator + '_ { iter_ones(self.bit_chunks().peekable()).map(C::BucketType::from_usize) } + + /// Generate a pseudo-random filter. For a given number of items + #[cfg(test)] + pub fn pseudorandom_filter(config: C, items: usize) -> Self { + use rand::RngCore; + use rand_chacha::rand_core::SeedableRng; + + let mut rng = rand_chacha::ChaCha12Rng::seed_from_u64(items as u64); + let mut filter = Self::new(config); + for _ in 0..items { + filter.push_hash(rng.next_u64()); + } + filter + } } /// Applies a repeated bit mask to the underlying filter. @@ -434,7 +448,8 @@ mod tests { use std::io::Write; use itertools::Itertools; - use rand::{rngs::StdRng, seq::IteratorRandom, RngCore}; + use rand::{seq::IteratorRandom, RngCore}; + use rand_chacha::ChaCha12Rng; use crate::{ build_hasher::UnstableDefaultBuildHasher, @@ -658,7 +673,7 @@ mod tests { // This helper exists in order to easily test serializing types with different // bucket types in the MSB sparse bit field representation. See tests below. #[cfg(target_endian = "little")] - fn serialization_round_trip + Default>(rnd: &mut StdRng) { + fn serialization_round_trip + Default>(rnd: &mut ChaCha12Rng) { // Run 100 simulations of random values being put into // a diff counter. "Serializing" to a vector to emulate // writing to a disk, and then deserializing and asserting diff --git a/crates/geo_filters/src/test_rng.rs b/crates/geo_filters/src/test_rng.rs index 3302612..7d8a8f4 100644 --- a/crates/geo_filters/src/test_rng.rs +++ b/crates/geo_filters/src/test_rng.rs @@ -1,6 +1,7 @@ use std::panic::{catch_unwind, resume_unwind, AssertUnwindSafe}; -use rand::{rngs::StdRng, SeedableRng as _}; +use rand::SeedableRng as _; +use rand_chacha::ChaCha12Rng; /// Provides a seeded random number generator to tests which require some /// degree of randomization. If the test panics the harness will print the @@ -12,7 +13,7 @@ use rand::{rngs::StdRng, SeedableRng as _}; /// is only ran once with this seed. pub fn prng_test_harness(iterations: usize, mut test_fn: F) where - F: FnMut(&mut StdRng), + F: FnMut(&mut ChaCha12Rng), { let maybe_manual_seed = std::env::var("TEST_SEED") .map(|s| s.parse::().expect("Parse TEST_SEED to u64")) @@ -21,12 +22,12 @@ where let maybe_panic = catch_unwind(AssertUnwindSafe(|| { if let Some(manual_seed) = maybe_manual_seed { seed = manual_seed; - let mut rng = StdRng::seed_from_u64(seed); + let mut rng = ChaCha12Rng::seed_from_u64(seed); test_fn(&mut rng); } else { for _ in 0..iterations { seed = rand::random(); - let mut rng = StdRng::seed_from_u64(seed); + let mut rng = ChaCha12Rng::seed_from_u64(seed); test_fn(&mut rng); } } From 9c650698437dde05c14de331be30fc0e2af7c327 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 28 Jul 2025 16:31:42 +0100 Subject: [PATCH 096/114] Add test-support feature --- crates/geo_filters/Cargo.toml | 1 + crates/geo_filters/src/diff_count.rs | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/geo_filters/Cargo.toml b/crates/geo_filters/Cargo.toml index db2a311..c496a9f 100644 --- a/crates/geo_filters/Cargo.toml +++ b/crates/geo_filters/Cargo.toml @@ -14,6 +14,7 @@ bench = false [features] default = [] +test-support = [] serde = ["dep:serde"] evaluation = [ "dep:clap", diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index dda2796..44e7d76 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -340,7 +340,7 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { Ok(bytes_written) } - #[cfg(test)] + #[cfg(any(test, feature = "test-support"))] pub fn from_ones(config: C, ones: impl IntoIterator) -> Self { let mut result = Self::new(config); for one in ones { @@ -349,13 +349,13 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { result } - #[cfg(test)] + #[cfg(any(test, feature = "test-support"))] pub fn iter_ones(&self) -> impl Iterator + '_ { iter_ones(self.bit_chunks().peekable()).map(C::BucketType::from_usize) } /// Generate a pseudo-random filter. For a given number of items - #[cfg(test)] + #[cfg(any(test, feature = "test-support"))] pub fn pseudorandom_filter(config: C, items: usize) -> Self { use rand::RngCore; use rand_chacha::rand_core::SeedableRng; From 3941b3319a1a5d62dc9093c66dbfd6d634904903 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Mon, 28 Jul 2025 18:33:49 +0100 Subject: [PATCH 097/114] Fixup crate dependencies. --- crates/geo_filters/Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/geo_filters/Cargo.toml b/crates/geo_filters/Cargo.toml index c496a9f..18b6784 100644 --- a/crates/geo_filters/Cargo.toml +++ b/crates/geo_filters/Cargo.toml @@ -14,7 +14,7 @@ bench = false [features] default = [] -test-support = [] +test-support = ["dep:rand", "dep:rand_chacha"] serde = ["dep:serde"] evaluation = [ "dep:clap", @@ -34,6 +34,7 @@ rand = { version = "0.9", optional = true } rayon = { version = "1.7", optional = true } regex = { version = "1", optional = true } serde = { version = "1.0", default-features = false, optional = true } +rand_chacha = { version = "0.9", optional = true } [dev-dependencies] criterion = "0.7" From 899494f1d748ec66723f4c6789f748eadf6dcc39 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Tue, 29 Jul 2025 14:07:10 +0100 Subject: [PATCH 098/114] Clarify pseudorandom_filter doc comment to explain seeding --- crates/geo_filters/src/diff_count.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 44e7d76..19f69d9 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -354,7 +354,9 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { iter_ones(self.bit_chunks().peekable()).map(C::BucketType::from_usize) } - /// Generate a pseudo-random filter. For a given number of items + /// Generate a pseudo-random filter. The RNG used to build the filter + /// is seeded using the number of items so for a given number of items + /// the resulting geofilter should always be the same. #[cfg(any(test, feature = "test-support"))] pub fn pseudorandom_filter(config: C, items: usize) -> Self { use rand::RngCore; From ae7e5ea1fac6582e6b4167222064fc565f4321bd Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 12:27:39 +0100 Subject: [PATCH 099/114] Add defaulted constructors to GeoDiffCount for convenience Provide new impls for GeoDiffCount with C: Default, allowing construction from bytes, ones, or pseudorandom data without explicitly passing config. Update tests to use these new constructors. --- crates/geo_filters/evaluation/performance.rs | 4 +- crates/geo_filters/src/diff_count.rs | 45 ++++++++++++++------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/crates/geo_filters/evaluation/performance.rs b/crates/geo_filters/evaluation/performance.rs index 31a3fee..77a0ebd 100644 --- a/crates/geo_filters/evaluation/performance.rs +++ b/crates/geo_filters/evaluation/performance.rs @@ -1,4 +1,6 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use std::hint::black_box; + +use criterion::{criterion_group, criterion_main, Criterion}; use geo_filters::build_hasher::UnstableDefaultBuildHasher; use geo_filters::config::VariableConfig; use geo_filters::diff_count::{GeoDiffCount, GeoDiffCount13}; diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 19f69d9..ab41b1e 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -303,7 +303,7 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { /// Create a new [`GeoDiffCount`] from a slice of bytes #[cfg(target_endian = "little")] - pub fn from_bytes(c: C, buf: &'a [u8]) -> Self { + pub fn from_bytes_with_config(c: C, buf: &'a [u8]) -> Self { if buf.is_empty() { return Self::new(c); } @@ -341,7 +341,7 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { } #[cfg(any(test, feature = "test-support"))] - pub fn from_ones(config: C, ones: impl IntoIterator) -> Self { + pub fn from_ones_with_config(config: C, ones: impl IntoIterator) -> Self { let mut result = Self::new(config); for one in ones { result.xor_bit(one); @@ -358,7 +358,7 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { /// is seeded using the number of items so for a given number of items /// the resulting geofilter should always be the same. #[cfg(any(test, feature = "test-support"))] - pub fn pseudorandom_filter(config: C, items: usize) -> Self { + pub fn pseudorandom_filter_with_config(config: C, items: usize) -> Self { use rand::RngCore; use rand_chacha::rand_core::SeedableRng; @@ -371,6 +371,23 @@ impl<'a, C: GeoConfig> GeoDiffCount<'a, C> { } } +impl<'a, C: GeoConfig + Default> GeoDiffCount<'a, C> { + #[cfg(target_endian = "little")] + pub fn from_bytes(buf: &'a [u8]) -> Self { + Self::from_bytes_with_config(C::default(), buf) + } + + #[cfg(any(test, feature = "test-support"))] + pub fn from_ones(ones: impl IntoIterator) -> Self { + Self::from_ones_with_config(C::default(), ones) + } + + #[cfg(any(test, feature = "test-support"))] + pub fn pseudorandom_filter(items: usize) -> Self { + Self::pseudorandom_filter_with_config(C::default(), items) + } +} + /// Applies a repeated bit mask to the underlying filter. /// E.g. given the bit mask `0b110100` with modulus 6, we filter the bitset of the geometric filter as follows: /// bitset of the geometric filter: 011010 101101 001010 @@ -490,8 +507,8 @@ mod tests { #[test] fn test_xor() { - let a = GeoDiffCount7::from_ones(Default::default(), 0..1000); - let b = GeoDiffCount7::from_ones(Default::default(), 10..1010); + let a = GeoDiffCount7::from_ones(0..1000); + let b = GeoDiffCount7::from_ones(10..1010); let c = xor(&a, &b); let d = xor(&a, &b); assert_eq!(a.iter_ones().count(), 1000); @@ -511,7 +528,7 @@ mod tests { m.xor_bit(10); assert!(m.iter_ones().collect_vec().is_empty()); - let mut m = GeoDiffCount7::from_ones(Default::default(), 0..100); + let mut m = GeoDiffCount7::from_ones(0..100); assert_eq!(m.iter_ones().count(), 100); m.xor_bit(10); assert_eq!(m.iter_ones().count(), 99); @@ -593,20 +610,19 @@ mod tests { // masked bitset : 010000 100100 000000 // after compression : 01 0 10 1 00 0 // bitset of the returned filter : 010 101000 - let m = GeoDiffCount7::from_ones(Default::default(), [16, 15, 13, 11, 9, 8, 6, 3, 1]); + let m = GeoDiffCount7::from_ones([16, 15, 13, 11, 9, 8, 6, 3, 1]); let n = masked(&m, 0b110100, 6); assert_eq!(n.iter_ones().collect_vec(), vec![16, 11, 8]); for i in 0..100 { - let m = GeoDiffCount7::from_ones(Default::default(), (0..i).collect_vec()); + let m = GeoDiffCount7::from_ones((0..i).collect_vec()); let n = masked(&m, 0b111, 3); assert_eq!(m, n); } for i in 0..300 { - let m = GeoDiffCount7::from_ones(Default::default(), (0..i).collect_vec()); - let slow = - GeoDiffCount::from_ones(Default::default(), masked(&m, 0b110, 3).iter_ones()); + let m = GeoDiffCount7::from_ones((0..i).collect_vec()); + let slow = GeoDiffCount::from_ones(masked(&m, 0b110, 3).iter_ones()); let n = masked(&m, 0b110, 3); assert_eq!(slow, n, "in iteration: {i}"); } @@ -667,7 +683,7 @@ mod tests { assert_eq!(writer.len(), 0); - let after = GeoDiffCount7::from_bytes(before.config.clone(), &writer); + let after = GeoDiffCount7::from_bytes_with_config(before.config.clone(), &writer); assert_eq!(before, after); } @@ -694,7 +710,10 @@ mod tests { let pad_amount = (0..8).choose(rnd).unwrap(); writer.write_all(&padding[..pad_amount]).unwrap(); before.write(&mut writer).unwrap(); - let after = GeoDiffCount::<'_, C>::from_bytes(before.config.clone(), &writer[pad_amount..]); + let after = GeoDiffCount::<'_, C>::from_bytes_with_config( + before.config.clone(), + &writer[pad_amount..], + ); assert_eq!(before, after); } From 9e717e7fd087d0f5895bb42e689f9b9d329f7c32 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 14:57:25 +0100 Subject: [PATCH 100/114] Add TODO to migrate SimHash consts to configuration --- crates/geo_filters/src/diff_count/sim_hash.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index c2b49a2..dc8ff5b 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -11,6 +11,10 @@ use crate::Diff; use super::BitVec; +// TODO migrate these const values to be defined in configuration +// The current values are only really appropriate for smaller +// configurations + /// Number of bits covered by each SimHash bucket. pub const SIM_BUCKET_SIZE: usize = 6; /// Number of consecutive SimHash buckets used for searching. From 9779cfe3965da8b1bf77f613d56916f9f9013d22 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 14:55:55 +0100 Subject: [PATCH 101/114] Rename size methods to size_real and size_with_sketch_real Add integer-returning size and size_with_sketch methods that round the floating-point estimates. Update all usages to call the new methods. --- crates/geo_filters/src/config.rs | 2 +- crates/geo_filters/src/diff_count.rs | 6 ++-- crates/geo_filters/src/distinct_count.rs | 6 ++-- crates/geo_filters/src/evaluation/hll.rs | 4 +-- .../geo_filters/src/evaluation/simulation.rs | 6 ++-- crates/geo_filters/src/lib.rs | 36 ++++++++++++++++--- 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index 7c04022..e72c2f2 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -374,7 +374,7 @@ pub(crate) mod tests { m.push_hash(rnd.next_u64()); } // Compute the relative error between estimate and actually inserted items. - let high_precision = m.size() / cnt as f32 - 1.0; + let high_precision = m.size_real() / cnt as f32 - 1.0; // Take the average over trials many attempts. avg_precision += high_precision / trials as f32; avg_var += high_precision.powf(2.0) / trials as f32; diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index ab41b1e..3dea55d 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -443,11 +443,11 @@ impl> Count for GeoDiffCount<'_, C> { *self = xor(self, other); } - fn size(&self) -> f32 { + fn size_real(&self) -> f32 { self.estimate_size() } - fn size_with_sketch(&self, other: &Self) -> f32 { + fn size_with_sketch_real(&self, other: &Self) -> f32 { assert!( self.config == other.config, "combined filters must have the same configuration" @@ -501,7 +501,7 @@ mod tests { let mut geo_count = GeoDiffCount13::default(); (0..n).for_each(|i| geo_count.push(i)); - assert_eq!(result, geo_count.size()); + assert_eq!(result, geo_count.size_real()); } } diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index 60e258a..c4ccec1 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -143,7 +143,7 @@ impl> Count for GeoDistinctCount<'_, C> { *self = or(self, other) } - fn size(&self) -> f32 { + fn size_real(&self) -> f32 { let lowest_bucket = self.lsb.bit_range().start; let total = self.msb.len() + self @@ -159,7 +159,7 @@ impl> Count for GeoDistinctCount<'_, C> { } } - fn size_with_sketch(&self, other: &Self) -> f32 { + fn size_with_sketch_real(&self, other: &Self) -> f32 { assert!( self.config == other.config, "combined filters must have the same configuration" @@ -272,7 +272,7 @@ mod tests { ] { let mut geo_count = GeoDistinctCount13::default(); (0..n).for_each(|i| geo_count.push(i)); - assert_eq!(result, geo_count.size()); + assert_eq!(result, geo_count.size_real()); } } diff --git a/crates/geo_filters/src/evaluation/hll.rs b/crates/geo_filters/src/evaluation/hll.rs index 8c506c0..a15ff82 100644 --- a/crates/geo_filters/src/evaluation/hll.rs +++ b/crates/geo_filters/src/evaluation/hll.rs @@ -126,11 +126,11 @@ impl Count for Hll { unimplemented!() } - fn size(&self) -> f32 { + fn size_real(&self) -> f32 { self.inner.borrow_mut().count() as f32 } - fn size_with_sketch(&self, _other: &Self) -> f32 { + fn size_with_sketch_real(&self, _other: &Self) -> f32 { unimplemented!() } diff --git a/crates/geo_filters/src/evaluation/simulation.rs b/crates/geo_filters/src/evaluation/simulation.rs index eedb7d7..518483a 100644 --- a/crates/geo_filters/src/evaluation/simulation.rs +++ b/crates/geo_filters/src/evaluation/simulation.rs @@ -25,7 +25,7 @@ impl + Clone> SimulationCount for GeoDiffCount<'_, C> { >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size_real(self) } fn bytes_in_memory(&self) -> usize { >::bytes_in_memory(self) @@ -36,7 +36,7 @@ impl> SimulationCount for GeoDistinctCount<'_, C> { >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size_real(self) } fn bytes_in_memory(&self) -> usize { >::bytes_in_memory(self) @@ -47,7 +47,7 @@ impl SimulationCount for Hll { >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size(self) + >::size_real(self) } fn bytes_in_memory(&self) -> usize { >::bytes_in_memory(self) diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 042c333..18c6212 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -43,17 +43,45 @@ pub trait Count { /// If only the size of the combined set is needed, [`Self::size_with_sketch`] is more efficient and should be used. fn push_sketch(&mut self, other: &Self); - /// Return the estimated set size. - fn size(&self) -> f32; + /// Return the estimated set size rounded to the nearest unsigned integer. + fn size(&self) -> usize { + let size = self.size_real().round(); + debug_assert_f32s_in_range(size); + size as usize + } - /// Return the estimated set size when combined with the given sketch. + /// Return the estimated set size as a real number. + fn size_real(&self) -> f32; + + /// Return the estimated set size when combined with the given sketch rounded to the nearest unsigned integer. + /// If the combined set itself is not going to be used, this method is more efficient than using [`Self::push_sketch`] and [`Self::size`]. + fn size_with_sketch(&self, other: &Self) -> usize { + let size = self.size_with_sketch_real(other).round(); + debug_assert_f32s_in_range(size); + size as usize + } + + /// Return the estimated set size when combined with the given sketch as a real number. /// If the combined set itself is not going to be used, this method is more efficient than using [`Self::push_sketch`] and [`Self::size`]. - fn size_with_sketch(&self, other: &Self) -> f32; + fn size_with_sketch_real(&self, other: &Self) -> f32; /// Returns the number of bytes in memory used to represent this filter. fn bytes_in_memory(&self) -> usize; } +#[inline] +fn debug_assert_f32s_in_range(v: f32) { + // The geometric filter should never produce these values. + // These assertions failing indicates that there is a bug. + debug_assert!(v.is_finite(), "Estimated size must be finite, got {}", v); + debug_assert!(v >= 0.0, "Estimated size must be non-negative, got {}", v); + debug_assert!( + v <= usize::MAX as f32, + "Estimated size {} exceeds usize::MAX", + v + ); +} + #[doc = include_str!("../README.md")] #[cfg(doctest)] pub struct ReadmeDocTests; From a7ac5c0b63435301212db1b0c3a6d784eeb7cee5 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 15:14:58 +0100 Subject: [PATCH 102/114] linter --- crates/geo_filters/src/lib.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 18c6212..84fd320 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -73,12 +73,11 @@ pub trait Count { fn debug_assert_f32s_in_range(v: f32) { // The geometric filter should never produce these values. // These assertions failing indicates that there is a bug. - debug_assert!(v.is_finite(), "Estimated size must be finite, got {}", v); - debug_assert!(v >= 0.0, "Estimated size must be non-negative, got {}", v); + debug_assert!(v.is_finite(), "Estimated size must be finite, got {v}"); + debug_assert!(v >= 0.0, "Estimated size must be non-negative, got {v}"); debug_assert!( v <= usize::MAX as f32, - "Estimated size {} exceeds usize::MAX", - v + "Estimated size {v} exceeds usize::MAX", ); } From 8390d9916408c6140e5af260568e5c85906ce03f Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 15:20:56 +0100 Subject: [PATCH 103/114] fix doctest in readme --- crates/geo_filters/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/geo_filters/README.md b/crates/geo_filters/README.md index 69cf4f3..19739dd 100644 --- a/crates/geo_filters/README.md +++ b/crates/geo_filters/README.md @@ -32,7 +32,7 @@ let mut c2 = GeoDistinctCount13::default(); c2.push(2); c2.push(3); -let estimated_size = c1.size_with_sketch(&c2); +let estimated_size = c1.size_with_sketch_real(&c2); assert!(estimated_size >= 3.0_f32 * 0.9 && estimated_size <= 3.0_f32 * 1.1); ``` From 8e6296875f4e7bb86984298a6a79646858e88b22 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 15:26:23 +0100 Subject: [PATCH 104/114] use rounded size estimate in README --- crates/geo_filters/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/geo_filters/README.md b/crates/geo_filters/README.md index 19739dd..8b5ebf2 100644 --- a/crates/geo_filters/README.md +++ b/crates/geo_filters/README.md @@ -32,9 +32,8 @@ let mut c2 = GeoDistinctCount13::default(); c2.push(2); c2.push(3); -let estimated_size = c1.size_with_sketch_real(&c2); -assert!(estimated_size >= 3.0_f32 * 0.9 && - estimated_size <= 3.0_f32 * 1.1); +let estimated_size = c1.size_with_sketch(&c2); +assert_eq!(estimated_size, 3); ``` ## Background From eabeed9b930018e6dca2c2fe8703778f1f801c51 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 17:43:17 +0100 Subject: [PATCH 105/114] Rename size_real to size_f32 throughout codebase --- crates/geo_filters/src/config.rs | 2 +- crates/geo_filters/src/diff_count.rs | 6 +++--- crates/geo_filters/src/distinct_count.rs | 6 +++--- crates/geo_filters/src/evaluation/hll.rs | 4 ++-- crates/geo_filters/src/evaluation/simulation.rs | 6 +++--- crates/geo_filters/src/lib.rs | 8 ++++---- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/crates/geo_filters/src/config.rs b/crates/geo_filters/src/config.rs index e72c2f2..c830422 100644 --- a/crates/geo_filters/src/config.rs +++ b/crates/geo_filters/src/config.rs @@ -374,7 +374,7 @@ pub(crate) mod tests { m.push_hash(rnd.next_u64()); } // Compute the relative error between estimate and actually inserted items. - let high_precision = m.size_real() / cnt as f32 - 1.0; + let high_precision = m.size_f32() / cnt as f32 - 1.0; // Take the average over trials many attempts. avg_precision += high_precision / trials as f32; avg_var += high_precision.powf(2.0) / trials as f32; diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 3dea55d..8c5c4bf 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -443,11 +443,11 @@ impl> Count for GeoDiffCount<'_, C> { *self = xor(self, other); } - fn size_real(&self) -> f32 { + fn size_f32(&self) -> f32 { self.estimate_size() } - fn size_with_sketch_real(&self, other: &Self) -> f32 { + fn size_with_sketch_f32(&self, other: &Self) -> f32 { assert!( self.config == other.config, "combined filters must have the same configuration" @@ -501,7 +501,7 @@ mod tests { let mut geo_count = GeoDiffCount13::default(); (0..n).for_each(|i| geo_count.push(i)); - assert_eq!(result, geo_count.size_real()); + assert_eq!(result, geo_count.size_f32()); } } diff --git a/crates/geo_filters/src/distinct_count.rs b/crates/geo_filters/src/distinct_count.rs index c4ccec1..dd90759 100644 --- a/crates/geo_filters/src/distinct_count.rs +++ b/crates/geo_filters/src/distinct_count.rs @@ -143,7 +143,7 @@ impl> Count for GeoDistinctCount<'_, C> { *self = or(self, other) } - fn size_real(&self) -> f32 { + fn size_f32(&self) -> f32 { let lowest_bucket = self.lsb.bit_range().start; let total = self.msb.len() + self @@ -159,7 +159,7 @@ impl> Count for GeoDistinctCount<'_, C> { } } - fn size_with_sketch_real(&self, other: &Self) -> f32 { + fn size_with_sketch_f32(&self, other: &Self) -> f32 { assert!( self.config == other.config, "combined filters must have the same configuration" @@ -272,7 +272,7 @@ mod tests { ] { let mut geo_count = GeoDistinctCount13::default(); (0..n).for_each(|i| geo_count.push(i)); - assert_eq!(result, geo_count.size_real()); + assert_eq!(result, geo_count.size_f32()); } } diff --git a/crates/geo_filters/src/evaluation/hll.rs b/crates/geo_filters/src/evaluation/hll.rs index a15ff82..2da68ac 100644 --- a/crates/geo_filters/src/evaluation/hll.rs +++ b/crates/geo_filters/src/evaluation/hll.rs @@ -126,11 +126,11 @@ impl Count for Hll { unimplemented!() } - fn size_real(&self) -> f32 { + fn size_f32(&self) -> f32 { self.inner.borrow_mut().count() as f32 } - fn size_with_sketch_real(&self, _other: &Self) -> f32 { + fn size_with_sketch_f32(&self, _other: &Self) -> f32 { unimplemented!() } diff --git a/crates/geo_filters/src/evaluation/simulation.rs b/crates/geo_filters/src/evaluation/simulation.rs index 518483a..b4de4ed 100644 --- a/crates/geo_filters/src/evaluation/simulation.rs +++ b/crates/geo_filters/src/evaluation/simulation.rs @@ -25,7 +25,7 @@ impl + Clone> SimulationCount for GeoDiffCount<'_, C> { >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size_real(self) + >::size_f32(self) } fn bytes_in_memory(&self) -> usize { >::bytes_in_memory(self) @@ -36,7 +36,7 @@ impl> SimulationCount for GeoDistinctCount<'_, C> { >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size_real(self) + >::size_f32(self) } fn bytes_in_memory(&self) -> usize { >::bytes_in_memory(self) @@ -47,7 +47,7 @@ impl SimulationCount for Hll { >::push_hash(self, hash) } fn size(&self) -> f32 { - >::size_real(self) + >::size_f32(self) } fn bytes_in_memory(&self) -> usize { >::bytes_in_memory(self) diff --git a/crates/geo_filters/src/lib.rs b/crates/geo_filters/src/lib.rs index 84fd320..2967454 100644 --- a/crates/geo_filters/src/lib.rs +++ b/crates/geo_filters/src/lib.rs @@ -45,25 +45,25 @@ pub trait Count { /// Return the estimated set size rounded to the nearest unsigned integer. fn size(&self) -> usize { - let size = self.size_real().round(); + let size = self.size_f32().round(); debug_assert_f32s_in_range(size); size as usize } /// Return the estimated set size as a real number. - fn size_real(&self) -> f32; + fn size_f32(&self) -> f32; /// Return the estimated set size when combined with the given sketch rounded to the nearest unsigned integer. /// If the combined set itself is not going to be used, this method is more efficient than using [`Self::push_sketch`] and [`Self::size`]. fn size_with_sketch(&self, other: &Self) -> usize { - let size = self.size_with_sketch_real(other).round(); + let size = self.size_with_sketch_f32(other).round(); debug_assert_f32s_in_range(size); size as usize } /// Return the estimated set size when combined with the given sketch as a real number. /// If the combined set itself is not going to be used, this method is more efficient than using [`Self::push_sketch`] and [`Self::size`]. - fn size_with_sketch_real(&self, other: &Self) -> f32; + fn size_with_sketch_f32(&self, other: &Self) -> f32; /// Returns the number of bytes in memory used to represent this filter. fn bytes_in_memory(&self) -> usize; From ebc338c5de8faf64979477d9a62ab1fae100d2ad Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 20:13:28 +0100 Subject: [PATCH 106/114] Add min_matches method to GeoDiffCount --- crates/geo_filters/src/diff_count/sim_hash.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index dc8ff5b..8b1978a 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -49,6 +49,11 @@ impl SimHash { } impl> GeoDiffCount<'_, C> { + /// TODO document, and maybe get better name + pub fn min_matches(&self) -> usize { + SIM_BUCKETS / 2 + } + /// Given the expected size of a diff, this function returns the range of bucket ids which should /// be searched for in order to find geometric filters of the desired similarity. If at least half /// of the buckets in the range match, one found a match that has the expected diff size (or better). From 04e1d127873b681dc7ac2acd58e3e16e88088bd7 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Wed, 30 Jul 2025 20:15:29 +0100 Subject: [PATCH 107/114] Restrict sim_hash constants to module visibility --- crates/geo_filters/src/diff_count.rs | 2 +- crates/geo_filters/src/diff_count/sim_hash.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/geo_filters/src/diff_count.rs b/crates/geo_filters/src/diff_count.rs index 8c5c4bf..6b2d04c 100644 --- a/crates/geo_filters/src/diff_count.rs +++ b/crates/geo_filters/src/diff_count.rs @@ -18,7 +18,7 @@ mod sim_hash; use bitvec::*; pub use config::{GeoDiffConfig13, GeoDiffConfig7}; -pub use sim_hash::{SimHash, SIM_BUCKETS, SIM_BUCKET_SIZE}; +pub use sim_hash::SimHash; /// Diff count filter with a relative error standard deviation of ~0.125. pub type GeoDiffCount7<'a> = GeoDiffCount<'a, GeoDiffConfig7>; diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index 8b1978a..c10e4f1 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -12,13 +12,13 @@ use crate::Diff; use super::BitVec; // TODO migrate these const values to be defined in configuration -// The current values are only really appropriate for smaller -// configurations +// The current values are only really appropriate for the smaller +// diff configuration. /// Number of bits covered by each SimHash bucket. -pub const SIM_BUCKET_SIZE: usize = 6; +const SIM_BUCKET_SIZE: usize = 6; /// Number of consecutive SimHash buckets used for searching. -pub const SIM_BUCKETS: usize = 20; +const SIM_BUCKETS: usize = 20; pub type BucketId = usize; From 10591b0ba6bdd2b985ad36849330030eba833811 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 1 Aug 2025 13:45:32 +0100 Subject: [PATCH 108/114] Refactor sim_hashes_search to return min_matches and iterator --- crates/geo_filters/src/diff_count/sim_hash.rs | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index c10e4f1..9e38d1e 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -49,11 +49,6 @@ impl SimHash { } impl> GeoDiffCount<'_, C> { - /// TODO document, and maybe get better name - pub fn min_matches(&self) -> usize { - SIM_BUCKETS / 2 - } - /// Given the expected size of a diff, this function returns the range of bucket ids which should /// be searched for in order to find geometric filters of the desired similarity. If at least half /// of the buckets in the range match, one found a match that has the expected diff size (or better). @@ -82,7 +77,7 @@ impl> GeoDiffCount<'_, C> { /// The first argument in the tuple is the bucket id of the `SimHash` which can be used /// to select a certain subset of `SimHashes`. SimHashes are returned in decreasing order /// of bucket ids, since that's their natural construction order. - pub fn sim_hashes(&self) -> impl Iterator + '_ { + pub fn sim_hashes(&self) -> impl ExactSizeIterator + '_ { SimHashIterator::new(self) } @@ -94,15 +89,31 @@ impl> GeoDiffCount<'_, C> { .map(|(_, sim_hash)| sim_hash) } + /// Get the `SimHash`es for this filter for the purpose of performing a search. + /// + /// Returns an iterator of the `SimHash`es and a number representing the minimum number + /// of matches required to consider this filter a match to a given filter, given + /// the expected diff size. + /// + /// The geo_filter can be used to do an "exact" search by setting expected_diff_size to zero. + /// in this case, all the buckets must match. Similarly, small differences can be found by + /// requiring (SIM_BUCKETS - expected_diff_size) many buckets to match. For larger differences + /// SIM_BUCKETS / 2 many buckets have to match. pub fn sim_hashes_search( &self, expected_diff_size: usize, - ) -> impl Iterator + '_ { + ) -> (impl Iterator + '_, usize) { let range = self.sim_hash_range(expected_diff_size); - self.sim_hashes() + let sim_hash_iter = self.sim_hashes(); + let min_matches = sim_hash_iter + .len() + .saturating_sub(expected_diff_size) + .max(SIM_BUCKETS / 2); + let filtered_iter = sim_hash_iter .skip_while(move |(bucket_id, _)| *bucket_id >= range.end) .take_while(move |(bucket_id, _)| *bucket_id >= range.start) - .map(|(_, sim_hash)| sim_hash) + .map(|(_, sim_hash)| sim_hash); + (filtered_iter, min_matches) } } @@ -157,8 +168,14 @@ impl> Iterator for SimHashIterator<'_, C> { SimHash::new(self.prev_bucket_id, self.sim_hash[bucket]), )) } + + fn size_hint(&self) -> (usize, Option) { + (self.prev_bucket_id, Some(self.prev_bucket_id)) + } } +impl> ExactSizeIterator for SimHashIterator<'_, C> {} + impl> GeoDiffCount<'_, C> { /// n specifies the desired zero-based index of the most significant one. /// The zero-based index of the desired one bit is returned. From 04b84be0b72089eabd5c13e6ad0ad7b840db24f3 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 1 Aug 2025 14:03:12 +0100 Subject: [PATCH 109/114] Fix sim_hashes_search filtering and add unit test --- crates/geo_filters/src/diff_count/sim_hash.rs | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index 9e38d1e..747777d 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -104,12 +104,12 @@ impl> GeoDiffCount<'_, C> { expected_diff_size: usize, ) -> (impl Iterator + '_, usize) { let range = self.sim_hash_range(expected_diff_size); - let sim_hash_iter = self.sim_hashes(); - let min_matches = sim_hash_iter + let min_matches = range .len() .saturating_sub(expected_diff_size) .max(SIM_BUCKETS / 2); - let filtered_iter = sim_hash_iter + let filtered_iter = self + .sim_hashes() .skip_while(move |(bucket_id, _)| *bucket_id >= range.end) .take_while(move |(bucket_id, _)| *bucket_id >= range.start) .map(|(_, sim_hash)| sim_hash); @@ -222,3 +222,28 @@ impl BitVec<'_> { None } } + +#[cfg(test)] +mod tests { + use rand::Rng as _; + + use crate::{ + diff_count::{sim_hash::SIM_BUCKETS, GeoDiffCount7}, + test_rng::prng_test_harness, + }; + + #[test] + fn sim_hash_iter_min_matches() { + prng_test_harness(100, |rng| { + let i = rng.random_range(0..1000); + let filter = GeoDiffCount7::pseudorandom_filter(i); + let expected_diff = rng.random_range(0..i); + let (iter, min_matches) = filter.sim_hashes_search(expected_diff); + let actual_count = iter.count(); + let expected_min_matches = actual_count + .saturating_sub(expected_diff) + .max(SIM_BUCKETS / 2); + assert_eq!(min_matches, expected_min_matches) + }); + } +} From 04160acb0d7ff143620a2d7faa0558cb9a50bc52 Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 1 Aug 2025 14:03:42 +0100 Subject: [PATCH 110/114] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- crates/geo_filters/src/diff_count/sim_hash.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index 747777d..b1f3df2 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -96,7 +96,7 @@ impl> GeoDiffCount<'_, C> { /// the expected diff size. /// /// The geo_filter can be used to do an "exact" search by setting expected_diff_size to zero. - /// in this case, all the buckets must match. Similarly, small differences can be found by + /// In this case, all the buckets must match. Similarly, small differences can be found by /// requiring (SIM_BUCKETS - expected_diff_size) many buckets to match. For larger differences /// SIM_BUCKETS / 2 many buckets have to match. pub fn sim_hashes_search( From 0ae46949e4d300213d414c103aa9dd2b940c4b0b Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 1 Aug 2025 14:06:27 +0100 Subject: [PATCH 111/114] Fix sim hash filtering to use correct iterator length --- crates/geo_filters/src/diff_count/sim_hash.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index b1f3df2..ca4d8a3 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -104,12 +104,10 @@ impl> GeoDiffCount<'_, C> { expected_diff_size: usize, ) -> (impl Iterator + '_, usize) { let range = self.sim_hash_range(expected_diff_size); - let min_matches = range - .len() - .saturating_sub(expected_diff_size) - .max(SIM_BUCKETS / 2); - let filtered_iter = self - .sim_hashes() + let sim_hash_iter = self.sim_hashes(); + let n = range.len().min(sim_hash_iter.len()); + let min_matches = n.saturating_sub(expected_diff_size).max(SIM_BUCKETS / 2); + let filtered_iter = sim_hash_iter .skip_while(move |(bucket_id, _)| *bucket_id >= range.end) .take_while(move |(bucket_id, _)| *bucket_id >= range.start) .map(|(_, sim_hash)| sim_hash); From 728814cc7c7b2ffaee1220dde630eb6f5ab705ce Mon Sep 17 00:00:00 2001 From: Sam Cutler Date: Fri, 1 Aug 2025 14:36:24 +0100 Subject: [PATCH 112/114] remove needless test for geo_filters sim_hash.rs --- crates/geo_filters/src/diff_count/sim_hash.rs | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/crates/geo_filters/src/diff_count/sim_hash.rs b/crates/geo_filters/src/diff_count/sim_hash.rs index ca4d8a3..5c92aa6 100644 --- a/crates/geo_filters/src/diff_count/sim_hash.rs +++ b/crates/geo_filters/src/diff_count/sim_hash.rs @@ -220,28 +220,3 @@ impl BitVec<'_> { None } } - -#[cfg(test)] -mod tests { - use rand::Rng as _; - - use crate::{ - diff_count::{sim_hash::SIM_BUCKETS, GeoDiffCount7}, - test_rng::prng_test_harness, - }; - - #[test] - fn sim_hash_iter_min_matches() { - prng_test_harness(100, |rng| { - let i = rng.random_range(0..1000); - let filter = GeoDiffCount7::pseudorandom_filter(i); - let expected_diff = rng.random_range(0..i); - let (iter, min_matches) = filter.sim_hashes_search(expected_diff); - let actual_count = iter.count(); - let expected_min_matches = actual_count - .saturating_sub(expected_diff) - .max(SIM_BUCKETS / 2); - assert_eq!(min_matches, expected_min_matches) - }); - } -} From 0f18ad7837eaba14220c3bc8c55f3666d3b83a32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 01:43:31 +0000 Subject: [PATCH 113/114] Bump rui314/setup-mold Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from 702b1908b5edf30d71a8d1666b724e0f0c6fa035 to 7344740a9418dcdcb481c7df83d9fbd1d5072d7d. - [Commits](https://github.com/rui314/setup-mold/compare/702b1908b5edf30d71a8d1666b724e0f0c6fa035...7344740a9418dcdcb481c7df83d9fbd1d5072d7d) --- updated-dependencies: - dependency-name: rui314/setup-mold dependency-version: 7344740a9418dcdcb481c7df83d9fbd1d5072d7d dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 44e0ab7..a334ddd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 + - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d - name: Build run: make build @@ -38,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 + - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d - name: Check formatting and clippy run: make lint @@ -49,7 +49,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: rui314/setup-mold@702b1908b5edf30d71a8d1666b724e0f0c6fa035 + - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d - name: Run unit tests run: make test From f90da95ea06c597a59cb1c7d939f7336ecef19cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 01:53:22 +0000 Subject: [PATCH 114/114] Bump actions/checkout from 4 to 5 Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- .github/workflows/publish.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a334ddd..113b3a6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -21,7 +21,7 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest needs: build steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d @@ -47,7 +47,7 @@ jobs: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 870d107..1552d29 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -13,7 +13,7 @@ jobs: run: working-directory: crates/string-offsets/js steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-node@v4 with: node-version: 22

    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