All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
ShardedIndex.search()raisesAxisErrorwhen merging results from view and active shards with a single-row 2D query of shape(1, ndim)(#22)
0.6.0 - 2026-02-22
dirtywrite counter property onNphdIndexandShardedIndexfor caller-driven flush policies (#16)- "For Coding Agents" reference page in documentation with architecture map, decision dispatch tables, constraints catalog, and task recipes
- Accept
bytesandbytearrayinpad_vectors()per-element loop (#14) - Only count existing keys in
dirtycounter onremove()(#16) - Generate API reference markdown from source for
llms-full.txtinstead of raw mkdocstrings directives
- Reduce logging verbosity: default
timerlevel from INFO to DEBUG, reserve INFO for aggregate summaries like shard load/save counts (#15) - Bump
usearch-isccminimum version to 2.24.2 - Move docs
overridesdirectory intodocs/overridesfor cleaner project root - Make
shard_size,connectivity,expansion_add,expansion_searchexplicit parameters onShardedNphdIndex.__init__(fixes griffe doc generation warnings) - Resolve all
tytype checker warnings caused by upstream type stubs and type narrowing gaps - Match
NphdIndex.search()signature to parentIndex.search()(fixes LSP violation)
0.5.0 - 2026-02-20
- Replace custom Numba NPHD metric with native usearch-iscc
MetricKind.NPHDfor 2-3x faster add and search operations - Drop
numbadependency (reduces install size and complexity) - Rewrite
pad_vectors/unpad_vectorsas plain Python/NumPy (no JIT compilation)
0.4.0 - 2026-02-19
remove()method for all sharded index variants — tombstone-based deletion for view shard entries, lazy USearch deletion for active shard entriesupsert()method for all sharded index variants — insert-or-update with last-write-wins batch deduplicationcompact()method for all sharded index variants — rebuilds view shards excluding tombstoned and cross-shard duplicate entries to reclaim space__delitem__support (del index[key]) as alias forremove()- Dedup-aware
keysandvectorsiterators — active shard authoritative, view shard entries filtered by tombstones and cross-shard overlap - Cross-shard search result suppression — tombstoned and stale view shard copies are filtered from search results with adaptive oversampling
- Persistent tombstone tracking (
tombstones.npy) — deletion state survives save/load cycles
- Widen distance tolerance for HNSW approximate search test on macOS
0.3.0 - 2026-02-17
read_onlymode for all sharded index variants — opens all shards as memory-mapped views, blocking write operations while allowing full read accessadd_once()method for skip-if-exists semantics on all sharded index variantsreset()method for releasing resources without deleting files on disk
expansion_searchsetter now propagates to view shards for consistent search quality- Batch
search()with mixed-length vectors inShardedNphdIndex save()now raisesTypeErrorif a path argument is passed toShardedIndex
ShardedIndex128.add()acceptslist[bytes]as batch keys
0.2.1 - 2026-02-16
- Shard and bloom filter saves use atomic write (temp file + rename) to prevent corruption from interrupted writes
- Fix type error in
ShardedNphdIndex.get()causing CI type check failure
0.2.0 - 2026-02-08
ShardedIndex128— sharded index with 128-bit UUID keys (bytes(16)/np.dtype('V16'))ShardedNphdIndex128— sharded NPHD index with 128-bit UUID keys for variable-length vectors_UuidKeyMixinproviding key-handling hooks, validation, and dispatch for all 128-bit subclassesScalableBloomFiltersupport forbyteskeys (add,contains,add_batch,contains_batch)- Strict validation on 128-bit key operations — wrong key type, length, or dtype raises
ValueError upsert()support for 128-bit UUID keys (singlebytes(16)and batchV16ndarray)- Python 3.10 and 3.11 support
- Extract 6 key-handling hook methods on
ShardedIndex(_is_single_key,_bloom_key,_bloom_keys,_normalize_batch_keys,_shard_batch_keys,_key_dtype) for subclass customization - Remove UUID workaround hooks (
_iter_shard_vectors,_get_shard_vector,_register_view_shard,_search_view_shards) — upstream usearch now supportsIndex.vectors,Indexes.merge(), andIndexes.search()for uuid-keyed indexes - UUID sharded indexes now use C++-optimized
Indexesmulti-shard search instead of Python-side per-shard iteration - Make
_merge_batch_matchesand_apply_radius_filterdtype-safe usingnp.zeros_like+ mask-copy instead ofnp.where(..., 0)(V16 arrays do not support scalar 0 fill) - Rewrite
ShardedIndexedKeys.__array__to shard-aware concatenation preserving correct dtype - Use
serialized_lengthinstead ofstats.allocated_bytesfor shard rotation threshold check (exactly matches on-disk file size and is faster) - Amortize rotation size check to avoid O(n)
serialized_lengthcall on everyadd()
- Fix
sizeproperty using wrong shard list — now sums_viewed_indexeswhich is always maintained - Enable
serialized_lengthproperty test (fixed upstream in usearch-iscc fork)
0.1.0 - 2026-02-06
Initial release of iscc-usearch.
NphdIndexclass extending USearchIndexwith variable-length binary vector support- Normalized Prefix Hamming Distance (NPHD) custom metric compiled via Numba
- Length-prefixed padding for storing variable-length vectors in a fixed-dimension index
ShardedIndexfor scalable vector storage beyond available RAMShardedNphdIndexcombining NPHD metric with transparent sharding- Idempotent
upsertmethod for single and batch operations - Bloom filter support for fast key membership checks
- Cross-shard
get,contains,count,keys, andvectorsoperations - Auto-detection of
ndim/max_dimwhen opening existing indexes - Timer context manager for logging operation durations
- Comprehensive test suite with 100% coverage requirement
- Documentation site using Zensical with Diataxis structure
- CI workflows for tests (Linux, macOS, Windows) and docs deployment
- Python 3.12, 3.13, and 3.14 support