Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
62b46ec
fix: derive artifact read bounds from declared sizes in ordvec-manifest
Fieldnote-Echo Jul 3, 2026
f1409c7
test: pin sign candidate-generation contract ahead of tiled internals
Fieldnote-Echo Jul 3, 2026
41c3c03
fix: give the primary index artifact an opt-in read ceiling
Fieldnote-Echo Jul 3, 2026
763dffc
fix: bound sqlite cache-key hashes by declared sizes
Fieldnote-Echo Jul 3, 2026
8af3352
perf: stream the corpus once per call in sign candidate generation
Fieldnote-Echo Jul 3, 2026
3f65e03
perf: keep the dense partition path for single-query candidates
Fieldnote-Echo Jul 3, 2026
a913b39
perf: parallel finite validation and scratch-based rank encode
Fieldnote-Echo Jul 3, 2026
a9dac16
Merge branch 'perf/encode-path' into integration/full-stack
Fieldnote-Echo Jul 3, 2026
9eb1e52
perf: reduce collector boundary test to a cached worst-bound compare
Fieldnote-Echo Jul 3, 2026
675d096
Merge branch 'perf/collector-worst-bound' into integration/full-stack
Fieldnote-Echo Jul 3, 2026
90f2873
Merge branch 'fix/manifest-derived-limits' into integration/full-stack
Fieldnote-Echo Jul 3, 2026
1f014a5
perf: LUT + parallel constant-composition check on RankQuant load
Fieldnote-Echo Jul 3, 2026
522bade
Merge branch 'perf/parallel-load-validation' into integration/full-stack
Fieldnote-Echo Jul 3, 2026
168c7da
docs: changelog perf entries and 0.6.0 downstream un-patch checklist
Fieldnote-Echo Jul 3, 2026
f713472
feat: index-ceiling CLI parity and zero-size shape checks (CIPHER-04)
Fieldnote-Echo Jul 3, 2026
5763f7b
fix: refuse non-regular artifact files before hashing
Fieldnote-Echo Jul 3, 2026
183a5af
Merge branch 'fix/manifest-derived-limits' into integration/full-stack
Fieldnote-Echo Jul 3, 2026
62eb4f6
docs: scope the serial CSR contract to scan and selection
Fieldnote-Echo Jul 3, 2026
b18ebaf
fix: retry interrupted reads in bounded streaming hash
Fieldnote-Echo Jul 4, 2026
9350b41
fix: assert whole-row query buffers in the streamed core
Fieldnote-Echo Jul 4, 2026
8bcd71c
Merge branch 'perf/tiled-batch-candgen' into perf/collector-worst-bound
Fieldnote-Echo Jul 4, 2026
7aec40f
Merge branches 'fix/manifest-derived-limits' and 'perf/collector-wors…
Fieldnote-Echo Jul 4, 2026
b4b6a64
Merge branch 'fix/manifest-derived-limits' into feat/index-ceiling-cl…
Fieldnote-Echo Jul 4, 2026
a88ac23
perf: transpose-tree horizontal reduction in the batched sign kernel
Fieldnote-Echo Jul 4, 2026
99a5532
Merge branch 'perf/kernel-transpose-reduce' into integration/full-stack
Fieldnote-Echo Jul 4, 2026
9d500bb
docs: scope the serial-contract claim in the tiled candgen entry
Fieldnote-Echo Jul 4, 2026
ae7bd69
Merge branch 'integration/full-stack' into docs/release-hygiene
Fieldnote-Echo Jul 4, 2026
8676f17
bench: regenerate committed synthetic results at the 0.6.0 heads
Fieldnote-Echo Jul 4, 2026
f128d83
docs: refresh README benchmarks at the 0.6.0 heads
Fieldnote-Echo Jul 4, 2026
673fbbf
docs: transcribe the refreshed hnsw nDCG in the tradeoff table
Fieldnote-Echo Jul 4, 2026
929439f
fix: land the EINTR retry on the bounded hash and bump to 0.6.0
Fieldnote-Echo Jul 4, 2026
4d239f0
Merge branch 'fix/manifest-derived-limits' into feat/index-ceiling-cl…
Fieldnote-Echo Jul 4, 2026
5f376c9
Merge branch 'fix/manifest-derived-limits' into integration/full-stack
Fieldnote-Echo Jul 4, 2026
92e09c9
Merge branch 'integration/full-stack' into docs/release-hygiene
Fieldnote-Echo Jul 4, 2026
0bcfb93
chore: track 0.6.0 in the fuzz workspace lock
Fieldnote-Echo Jul 4, 2026
c2be965
Merge branch 'fix/manifest-derived-limits' into feat/index-ceiling-cl…
Fieldnote-Echo Jul 4, 2026
577611b
Merge branch 'fix/manifest-derived-limits' into integration/full-stack
Fieldnote-Echo Jul 4, 2026
60b4d62
Merge branch 'integration/full-stack' into docs/release-hygiene
Fieldnote-Echo Jul 4, 2026
661529a
chore: lockstep all workspace member versions at 0.6.0
Fieldnote-Echo Jul 4, 2026
364f176
Merge branch 'fix/manifest-derived-limits' into feat/index-ceiling-cl…
Fieldnote-Echo Jul 4, 2026
e55025f
Merge branch 'fix/manifest-derived-limits' into integration/full-stack
Fieldnote-Echo Jul 4, 2026
744c03f
Merge branch 'integration/full-stack' into docs/release-hygiene
Fieldnote-Echo Jul 4, 2026
c30baf1
chore: complete the 0.6.0 release shape
Fieldnote-Echo Jul 4, 2026
3e654f7
Merge branch 'fix/manifest-derived-limits' into feat/index-ceiling-cl…
Fieldnote-Echo Jul 4, 2026
cea1d4b
Merge branch 'fix/manifest-derived-limits' into integration/full-stack
Fieldnote-Echo Jul 4, 2026
c078c33
Merge branch 'integration/full-stack' into docs/release-hygiene
Fieldnote-Echo Jul 4, 2026
cf357e5
fix: checked selection-state bounds in the streamed candidate core
Fieldnote-Echo Jul 4, 2026
89abfb5
Merge branch 'perf/tiled-batch-candgen' into perf/collector-worst-bound
Fieldnote-Echo Jul 4, 2026
1b20caf
Merge branch 'perf/tiled-batch-candgen' into integration/full-stack
Fieldnote-Echo Jul 4, 2026
767760e
Merge branch 'integration/full-stack' into docs/release-hygiene
Fieldnote-Echo Jul 4, 2026
974d49d
Merge remote-tracking branches 'origin/perf/collector-worst-bound' an…
Fieldnote-Echo Jul 4, 2026
4b35a34
fix: single-snapshot create hashing, strict read bounds, zero-size pr…
Fieldnote-Echo Jul 4, 2026
e091df5
perf: build query bitmaps in place in the streamed core
Fieldnote-Echo Jul 4, 2026
69cbebc
Merge branch 'fix/manifest-derived-limits' into feat/index-ceiling-cl…
Fieldnote-Echo Jul 4, 2026
4569943
Merge branch 'perf/tiled-batch-candgen' into perf/collector-worst-bound
Fieldnote-Echo Jul 4, 2026
66dd1e1
Merge branches 'perf/collector-worst-bound' and 'feat/index-ceiling-c…
Fieldnote-Echo Jul 4, 2026
ee94a09
Merge branch 'integration/full-stack' into docs/release-hygiene
Fieldnote-Echo Jul 4, 2026
1c193c5
fix: apply the index ceiling on the create path
Fieldnote-Echo Jul 4, 2026
69bb693
Merge branch 'fix/manifest-derived-limits' into integration/full-stack
Fieldnote-Echo Jul 4, 2026
9cc58a0
Merge branch 'integration/full-stack' into docs/release-hygiene
Fieldnote-Echo Jul 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,88 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

_No unreleased changes._

## 0.6.0 - 2026-07-04

### Performance

- **Batched sign candidate generation now streams the corpus once per call.**
`SignBitmap::top_m_candidates_batched_serial_csr` previously looped the
single-query path, re-streaming the full sign bitmap per query (the
documented-naive first cut). The internals now scan the corpus once per call
in L2-sized doc blocks, score every query of the call against each hot block
in query tiles via the existing batched kernel, and select per-query top-m
with bounded `(hamming, doc_id)` min-collectors — bit-identical to a full
sort by construction, independent of processing order (the key *is* the
contract's sort key), pinned by an independent oracle suite
(`tests/tiled_candgen.rs`) across random, tie-heavy, duplicate-run, and edge
geometries. Per-query corpus traffic drops by the call's query count: at
1.26M rows × dim=1024, a 2048-query call reads the 161 MB sign sidecar once
instead of 2048 times. `top_m_candidates` routes through the same core
(dropping its per-call n-row Hamming materialisation) except at `nq=1`,
which keeps the dense partition path — the streamed core measured +50–90%
single-query time at small/medium `n` with `m` in the hundreds (bounded heap
`O(n log m)` vs `select_nth_unstable_by` `O(n)`), while the dense path is
parity-or-better at every measured size. The serial contract covers the
candidate scan and selection (no rayon there; callers own that
parallelism) — input finite-validation on large query buffers may
briefly use the global rayon pool (order-independent, deterministic).
`top_m_candidates_batched` (the internally-parallel convenience) is
unchanged by this work. Together with the collector worst-bound change below, measured
downstream in a two-stage retrieval stack at 1.26M × 1024: batched search
throughput 220 → 10.2k queries/s, results bit-identical.
- **Candidate-collector accept test reduced to a cached worst-bound compare.**
Doc ids visit each per-query heap strictly ascending, so a candidate tying
the worst kept hamming always loses the `(hamming, doc_id)` tie-break — once
the collector is full, the accept test is exactly `hamming < worst kept
hamming`. That bound is now cached in a register-friendly `u32` (`u32::MAX`
while filling), skipping the heap peek + tuple compare on the ~99.8% reject
path. Bit-identical by construction; pinned by the tie-heavy and
duplicate-run oracle suites.
- **Parallel finite-input validation and scratch-based rank encode.**
`assert_all_finite` paid a full serial pass per add/search batch — measured
~0.1 s per GiB, twice per ingest batch counting the caller layer. Scans of
1M+ floats now split across the rayon pool (4.4× measured).
`RankQuant::add`'s per-row closure allocated a fresh ranks `Vec` per vector
inside the parallel loop; it now reuses a per-worker scratch via
`rank_transform_into`. Measured on a 1.26M × 1024 corpus slice: encode-path
validation attribution 0.097 s serial scan → 0.022 s parallel, with the
per-vector allocation churn removed from the hot loop.
- **LUT + parallel constant-composition check on `RankQuant` load.**
`load_rankquant`'s forged-buffer defense histogrammed every packed code
serially — 1.29 billion shift/mask ops at 1.26M × 1024, ~1 s of the 1.27 s
verified open. A 4 KB per-byte bucket-count LUT replaces the per-code inner
loop and rows validate in parallel; `find_first` keeps the
lowest-offending-row error contract, with a scalar recheck producing the
identical message. The security property is unchanged: every row still
proves uniform composition before the index is usable. Measured verified
open at 1.26M × 1024: 1.27 s → 0.38 s.

### Changed

- **ordvec-manifest: derived artifact size bounds.** Verification now bounds
every artifact read by its manifest-declared `file_size_bytes` (the manifest
itself remains hard-capped at 1 MiB and SHA-256 pins content); manifest
creation bounds reads by the artifact's observed size. The flat
`ResourceLimits` byte caps (`max_auxiliary_artifact_bytes`,
`max_calibration_profile_bytes`, `max_encoder_distortion_profile_bytes`)
are now explicit opt-in ceilings and default to unbounded — previously the
64 MiB auxiliary default made legitimate large sign sidecars (>524,288 rows
at dim=1024) impossible to write with default options.
- **ordvec-manifest: primary artifact reads are now bounded.** The primary
index artifact is hashed under its declared size (new
`artifact_file_too_large` reason code); previously this read was unbounded.
An artifact grown past its declaration now fails fast at the read bound
instead of surfacing as a digest mismatch after hashing the excess.
- **ordvec-manifest: primary index artifact gains an opt-in ceiling.** New
`ResourceLimits::max_index_artifact_bytes` (default unbounded) mirrors the
auxiliary/profile ceilings; the create path also bounds the primary read by
its observed size. Note: a grown artifact now surfaces as
`*_file_too_large` (fail-fast) rather than `*_file_size_mismatch`, which
now indicates truncation only.
- **ordvec-manifest: bounded hashing streams with constant memory.**
`sha256_file_bounded` no longer materialises the file in memory before
hashing.

## 0.5.0 - 2026-06-19

### Security
Expand Down
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "ordvec"
version = "0.5.0"
version = "0.6.0"
edition = "2021"
rust-version = "1.89" # AVX-512 intrinsics stabilized in 1.89.0; also clears the 1.87 floor from u64::is_multiple_of
description = "Training-free ordinal & sign quantization for vector retrieval"
Expand Down
55 changes: 31 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,10 @@ append-friendly, and graph-optional.
> trec-covid run below; the harness also supports nfcorpus and fiqa. ordvec wins
> single-query latency against exact `flat` on the committed 171K-doc run and on
> operability (no build, no tuning, append-only); in the committed default-method
> threaded view, HNSW still wins highly-parallel batched serving. Larger-corpus
> and alternate-encoder studies are active research, not public release claims
> until their artifacts land in this repository.**
> threaded view, HNSW still leads highly-parallel batched serving, though 0.6.0's
> once-per-call corpus streaming narrowed that margin (see the threaded view
> below). Larger-corpus and alternate-encoder studies are active research, not
> public release claims until their artifacts land in this repository.**

**Public evidence snapshot.** The load-bearing result in this README is narrower
than the research backlog: Harrier-Q8 embeddings on public BEIR data, scored
Expand All @@ -60,8 +61,8 @@ and the gap widens over the committed subsampling sweep:
![ordvec speedup over exact search grows with corpus size](https://raw.githubusercontent.com/Project-Navi/ordvec/main/benchmarks/beir/figures/scaling_curve.png)

- **~100× faster than exact `flat`, single query, at 171K docs.** Single-query
latency: exact `flat` 56 ms vs ordvec `Sign→rq2` **0.53 ms** — the gap over `flat`
grows with the corpus (it is ~5× at 1K docs).
latency: exact `flat` 52.4 ms vs ordvec `Sign→rq2` **0.52 ms (≈101×)** — the gap
over `flat` grows with the corpus (it is ~4.4× at 1K docs).
- **8–16× smaller for the reported qrel rows.** The b=2 rank code is 256 B/vector
(16× smaller than 4096 B floats), b=4 is 512 B (8×), and the reported two-stage
`sign→rq2` row accounts for both stage-1 sign codes and the RankQuant reranker
Expand All @@ -70,8 +71,10 @@ and the gap widens over the committed subsampling sweep:
followed by RankQuant b=2 rerank. At **nDCG@10 within bootstrap noise of exact**
(on trec-covid the ordinal rows even edge ahead; see [Benchmarks](#benchmarks)).
- **vs HNSW (the honest public scale story).** On the committed trec-covid run,
ordvec wins single-query latency while HNSW wins the highly-parallel threaded
view. That is the public comparison here. At larger corpora, graph or shard
ordvec wins single-query latency (≈3× at batch 1) while HNSW leads the
highly-parallel threaded view — by 1.6× over `sign→rq2` and 1.2× over
`bitmap→rq2` after 0.6.0's batched candidate generation (previously ≈2.3×).
That is the public comparison here. At larger corpora, graph or shard
layers are the right comparison target; this README does not claim public
million-scale HNSW crossover or GPU bandwidth numbers until the underlying run
artifacts are committed.
Expand Down Expand Up @@ -209,7 +212,7 @@ Details in [`docs/RANK_MODES.md`](docs/RANK_MODES.md).

```toml
[dependencies]
ordvec = "0.5"
ordvec = "0.6"

# Or, to track unreleased `main`, use a git dependency instead:
# ordvec = { git = "https://github.com/Project-Navi/ordvec" }
Expand Down Expand Up @@ -384,13 +387,13 @@ run; regenerate your own with `make benchmark-beir`.

| Dataset | Method | Bytes/vec | nDCG@10 | Δ vs flat (95% CI) |
|---|---|--:|--:|---|
| scifact (5,183) | `flat` (exact) | 4096 | 0.7551 | (baseline) |
| | `hnsw` M=32 | 4096 + graph | 0.7554 | +0.0003 * |
| | **ordvec rq4** | **512** | **0.7549** | −0.0003 * |
| | ordvec rq2 | 256 | 0.7471 | −0.0080 * |
| | ordvec sign→rq2 | 384 | 0.7471 | −0.0080 * |
| scifact (5,183) | `flat` (exact) | 4096 | 0.7559 | (baseline) |
| | `hnsw` M=32 | 4096 + graph | 0.7573 | +0.0014 * |
| | **ordvec rq4** | **512** | **0.7580** | +0.0021 * |
| | ordvec rq2 | 256 | 0.7484 | −0.0075 * |
| | ordvec sign→rq2 | 384 | 0.7484 | −0.0075 * |
| trec-covid (171,332) | `flat` (exact) | 4096 | 0.7574 | (baseline) |
| | `hnsw` M=32 | 4096 + graph | 0.7555 | −0.0019 * |
| | `hnsw` M=32 | 4096 + graph | 0.7600 | +0.0026 * |
| | ordvec rq2 | 256 | 0.7632 | +0.0057 * |
| | **ordvec rq4** | **512** | **0.7636** | +0.0062 * |
| | ordvec sign→rq2 | 384 | 0.7638 | +0.0064 * |
Expand All @@ -411,34 +414,38 @@ views (trec-covid, 171,332 docs, 1024-d):

![single-query latency bars](https://raw.githubusercontent.com/Project-Navi/ordvec/main/benchmarks/beir/figures/bars_single_thread.png)

`flat` 56 ms → ordvec `sign→rq2` **0.53 ms (≈106×)**, `bitmap→rq2` 0.62 ms (≈91×),
`hnsw` 1.5 ms (37×). The scaling curve [above](#benchmark-at-a-glance) is this
`flat` 52.4 ms → ordvec `sign→rq2` **0.52 ms (≈101×)**, `bitmap→rq2` 0.58 ms (≈90×),
`hnsw` 1.5 ms (≈34×). The scaling curve [above](#benchmark-at-a-glance) is this
view swept over the committed subsamples — the speedup over `flat` grows across
that public sweep.

**2. Batched throughput (batch = 32, 1 thread)** — when many queries arrive at
once, `flat`'s GEMM amortizes the corpus stream across the batch (56→4 ms),
narrowing the gap: ordvec `sign→rq2`/`bitmap→rq2` stay ≈8–9.5× ahead.
once, `flat`'s GEMM amortizes the corpus stream across the batch (52→3.8 ms).
Since 0.6.0, ordvec's batched candidate generation amortizes the same way — the
serial CSR path streams the corpus **once per call** instead of once per query
(1.69× on the committed synthetic two-stage bench) — so `sign→rq2` 0.33 ms /
`bitmap→rq2` 0.38 ms stay **≈10–12× ahead** of batched `flat`.

**3. Many cores (batch = 32, 32 threads)** — everything parallelizes and the
field compresses; `hnsw` threads best:

![threaded throughput bars](https://raw.githubusercontent.com/Project-Navi/ordvec/main/benchmarks/beir/figures/bars_threaded.png)

`hnsw` 4.8× vs `flat`, ordvec `bitmap→rq2` 3.7×, `rq2` 2.5×, `sign→rq2` 2.1×.
`hnsw` 4.9× vs `flat`, ordvec `bitmap→rq2` 4.0×, `sign→rq2` 3.1×, `rq2` 2.2×.
This committed chart uses the default `sign-rq2` row, not the newer
within-query-threaded `sign-rq2-threaded` probe row; regenerate public figures
before using that probe for release claims. In this default-method view,
**HNSW wins this regime** — by a hair on threaded throughput. The honest
**HNSW still leads this regime** — 1.6× over `sign→rq2` (≈2.3× before 0.6.0's
once-per-call corpus streaming) and 1.2× over `bitmap→rq2`. The honest
ordvec-vs-HNSW tradeoff, all from this same run (trec-covid, 171,332 docs):

| | HNSW M=32 | ordvec `sign→rq2` |
|---|---|---|
| threaded latency (32 threads, batch 32) | **0.23 ms** ✅ | 0.52 ms |
| single-query latency (batch 1) | 1.52 ms | **0.53 ms** ✅ (~3×) |
| threaded latency (32 threads, batch 32) | **0.20 ms** ✅ | 0.32 ms |
| single-query latency (batch 1) | 1.52 ms | **0.52 ms** ✅ (~3×) |
| index size / vector | 4096 B + graph | **256–384 B** ✅ (8–16× less) |
| build time, 171K docs | **51.4 s** | **0.26 s** ✅ (training-free) |
| nDCG@10 (trec-covid) | 0.7555 | **0.7638** ✅ |
| build time, 171K docs | **47.1 s** | **0.21 s** ✅ (training-free) |
| nDCG@10 (trec-covid) | 0.7600 | **0.7638** ✅ |

So even where HNSW edges ahead on threaded latency, ordvec gets there with **no
graph to build** (instant, training-free, and rebuilt for free when the corpus
Expand Down
5 changes: 5 additions & 0 deletions RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,11 @@ the OIDC exchange (no risk of a bad publish; just a failed run).
lockstep versions, MSRV/docs drift, registry metadata parity, Python
classifier/URL parity, docs.rs feature policy, package contents, and
release workflow invariants.
- **Downstream un-patch (one-time, 0.6.0):** OrdinalDB's workspace
`Cargo.toml` carries a `[patch.crates-io]` block pointing `ordvec` and
`ordvec-manifest` at this repo's `integration/full-stack` git branch.
When 0.6.0 publishes, that block must be removed so OrdinalDB consumes
the published crates.io releases instead of the pre-release git branch.
4. Confirm CI is **green for current `main` HEAD**. `require-ci-green` checks
`main` HEAD's SHA — which needs a **completed, successful** (not
`cancelled`, not in-progress) run of `ci.yml`, `python.yml`, `fuzz.yml`,
Expand Down
15 changes: 14 additions & 1 deletion THREAT_MODEL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Threat Model — `ordvec`

> **Status:** v0.5.0 (pre-1.0), 2026-06-15. This is the maintained threat model
> **Status:** v0.6.0 (pre-1.0), 2026-06-15. This is the maintained threat model
> for the `ordvec` Rust crate, C ABI, Go wrapper, PyO3/maturin Python bindings,
> and the `ordvec-manifest` sidecar verifier. It is reviewed when the
> attack surface changes (new persistence formats, new `unsafe` kernels, new
Expand Down Expand Up @@ -397,6 +397,19 @@ enforce service-level quotas — by design (it is a library, not a server).
batch size, `k`, request rate, and corpus size; a configurable `max_nq` /
`max_k` at the binding level is a possible future convenience.

**THREAT-QUERY-003 (P2): Artifact read bounds are derived, not flat.**
Verification bounds every artifact read by its manifest-declared
`file_size_bytes` (the manifest itself is hard-capped at 1 MiB before JSON
parsing, and SHA-256 pins artifact content); manifest creation bounds reads
by the artifact's observed size. Bounded hashing streams with constant
memory, so a hostile manifest cannot cause unbounded memory growth — but it
CAN still cause I/O and CPU proportional to the byte size it declares and
actually supplies on disk. The flat `ResourceLimits` byte caps are opt-in
ceilings (unbounded by default) for deployments that must bound worst-case
verification time on attacker-supplied bundles. A `VerifiedLoadPlan` remains
a verification snapshot, not a byte pin: bytes can change between
verification and use by a local actor with write access (see scope).

**THREAT-QUERY-002 (P3): Panic on contract violation in Rust server contexts.**
Rust APIs fail fast on invalid contract input (non-finite floats, dimension /
shape violations) via `assert!` / `expect`. In a Rust-native server an
Expand Down
Binary file modified benchmarks/beir/figures/bars_single_thread.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified benchmarks/beir/figures/bars_threaded.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified benchmarks/beir/figures/scaling_curve.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading