Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
4b1a3ea
feat[turboquant]: add TurboQuant vector quantization encoding
lwwmanning Mar 25, 2026
4793647
feat[turboquant]: add TurboQuantCompressor and WriteStrategyBuilder i…
lwwmanning Mar 25, 2026
66e1b3d
refactor[turboquant]: integrate into BtrBlocks compressor directly
lwwmanning Mar 25, 2026
f7ffa3a
bench[turboquant]: add compression/decompression throughput benchmarks
lwwmanning Mar 25, 2026
10bf854
perf[turboquant]: replace dense rotation with randomized Hadamard tra…
lwwmanning Mar 25, 2026
6b440a3
test[turboquant]: add theoretical error bound and inner product bias …
lwwmanning Mar 25, 2026
255bda0
chore[turboquant]: fix review issues and generate public-api.lock
lwwmanning Mar 25, 2026
fb03467
chore[turboquant]: review cleanup — tighter tests, naming, validation
lwwmanning Mar 25, 2026
cff0412
docs[turboquant]: add crate-level docs with compression ratios and er…
lwwmanning Mar 25, 2026
6d1c383
feat[turboquant]: support 1-8 bit quantization
lwwmanning Mar 25, 2026
2355ff1
feat[turboquant]: support 9-bit Prod for tensor core int8 GEMM
lwwmanning Mar 25, 2026
522d067
bench[turboquant]: add dim 1024 and 1536 benchmarks
lwwmanning Mar 26, 2026
3ef4eff
feat[turboquant]: add rotation sign export/import and hot-path inverse
lwwmanning Mar 26, 2026
7d5e951
feat[turboquant]: define TurboQuantMSEArray and TurboQuantQJLArray
lwwmanning Mar 26, 2026
da306b1
feat[turboquant]: add new compression functions for cascaded arrays
lwwmanning Mar 26, 2026
c4ac11e
refactor[btrblocks]: simplify TurboQuant compressor for cascaded arrays
lwwmanning Mar 26, 2026
3a69c0a
chore[turboquant]: regenerate public-api.lock for new array types
lwwmanning Mar 26, 2026
0a40464
refactor[turboquant]: restructure into subdirectory modules, delete d…
lwwmanning Mar 26, 2026
5816a3f
test[turboquant]: improve test coverage and add explanatory comments
lwwmanning Mar 26, 2026
51648cc
perf[turboquant]: restore fast SIMD-friendly decode by expanding stor…
lwwmanning Mar 26, 2026
5a7a948
fix[turboquant]: address PR review findings
lwwmanning Mar 27, 2026
4b4b192
fix[turboquant]: second-round review fixes and merge conflict resolution
lwwmanning Mar 27, 2026
f7faccb
refactor[turboquant]: simplify code from review findings
lwwmanning Mar 27, 2026
252bb0f
fix[turboquant]: address PR review comments from AdamGS
lwwmanning Mar 27, 2026
cdaff82
chore[turboquant]: cleanup from second simplify pass
lwwmanning Mar 27, 2026
3b3caa0
chore[turboquant]: address review — hot loop opts, tests, perf TODOs
lwwmanning Mar 28, 2026
63d7709
cleanup
lwwmanning Mar 30, 2026
0d301ff
cleanup
lwwmanning Mar 30, 2026
e63157b
cleanup
lwwmanning Mar 30, 2026
a1ac3f7
refactor
lwwmanning Mar 30, 2026
f18735f
wip on refactoring
lwwmanning Mar 30, 2026
a541970
claude fixed my stuff
lwwmanning Mar 30, 2026
2b2dbbe
merge TQ back into single array with option QJL correction
lwwmanning Mar 30, 2026
59787ca
wip
lwwmanning Mar 30, 2026
cc3287a
more
lwwmanning Mar 30, 2026
3fb62a5
samply optimizations
lwwmanning Mar 30, 2026
a9f4607
truncation
lwwmanning Mar 30, 2026
65f6392
cleanup
lwwmanning Mar 30, 2026
683467d
share rotation matrix between MSE and QJL
lwwmanning Mar 30, 2026
f978d7b
Revert "share rotation matrix between MSE and QJL"
lwwmanning Mar 30, 2026
5582f1e
holy moly simd
lwwmanning Mar 30, 2026
a872ba9
fix review comments
lwwmanning Mar 30, 2026
5ca6c9f
add turboquant compute and refactor to use FSL children internally
lwwmanning Mar 30, 2026
c09177b
review
lwwmanning Mar 30, 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
22 changes: 22 additions & 0 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ members = [
"encodings/zstd",
"encodings/bytebool",
"encodings/parquet-variant",
"encodings/turboquant",
# Benchmarks
"benchmarks/lance-bench",
"benchmarks/compress-bench",
Expand Down Expand Up @@ -285,6 +286,7 @@ vortex-sequence = { version = "0.1.0", path = "encodings/sequence", default-feat
vortex-session = { version = "0.1.0", path = "./vortex-session", default-features = false }
vortex-sparse = { version = "0.1.0", path = "./encodings/sparse", default-features = false }
vortex-tensor = { version = "0.1.0", path = "./vortex-tensor", default-features = false }
vortex-turboquant = { version = "0.1.0", path = "./encodings/turboquant", default-features = false }
vortex-utils = { version = "0.1.0", path = "./vortex-utils", default-features = false }
vortex-zigzag = { version = "0.1.0", path = "./encodings/zigzag", default-features = false }
vortex-zstd = { version = "0.1.0", path = "./encodings/zstd", default-features = false }
Expand Down
33 changes: 33 additions & 0 deletions encodings/turboquant/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
[package]
name = "vortex-turboquant"
authors = { workspace = true }
categories = { workspace = true }
description = "Vortex TurboQuant vector quantization encoding"
edition = { workspace = true }
homepage = { workspace = true }
include = { workspace = true }
keywords = { workspace = true }
license = { workspace = true }
readme = { workspace = true }
repository = { workspace = true }
rust-version = { workspace = true }
version = { workspace = true }

[lints]
workspace = true

[dependencies]
half = { workspace = true }
prost = { workspace = true }
rand = { workspace = true }
vortex-array = { workspace = true }
vortex-buffer = { workspace = true }
vortex-error = { workspace = true }
vortex-fastlanes = { workspace = true }
vortex-session = { workspace = true }
vortex-utils = { workspace = true }

[dev-dependencies]
rand_distr = { workspace = true }
rstest = { workspace = true }
vortex-array = { workspace = true, features = ["_test-harness"] }
185 changes: 185 additions & 0 deletions encodings/turboquant/public-api.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
pub mod vortex_turboquant

pub struct vortex_turboquant::QjlCorrection

impl vortex_turboquant::QjlCorrection

pub fn vortex_turboquant::QjlCorrection::residual_norms(&self) -> &vortex_array::array::ArrayRef

pub fn vortex_turboquant::QjlCorrection::rotation_signs(&self) -> &vortex_array::array::ArrayRef

pub fn vortex_turboquant::QjlCorrection::signs(&self) -> &vortex_array::array::ArrayRef

impl core::clone::Clone for vortex_turboquant::QjlCorrection

pub fn vortex_turboquant::QjlCorrection::clone(&self) -> vortex_turboquant::QjlCorrection

impl core::fmt::Debug for vortex_turboquant::QjlCorrection

pub fn vortex_turboquant::QjlCorrection::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result

pub struct vortex_turboquant::TurboQuant

impl vortex_turboquant::TurboQuant

pub const vortex_turboquant::TurboQuant::ID: vortex_array::vtable::dyn_::ArrayId

impl core::clone::Clone for vortex_turboquant::TurboQuant

pub fn vortex_turboquant::TurboQuant::clone(&self) -> vortex_turboquant::TurboQuant

impl core::fmt::Debug for vortex_turboquant::TurboQuant

pub fn vortex_turboquant::TurboQuant::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result

impl vortex_array::arrays::dict::take::TakeExecute for vortex_turboquant::TurboQuant

pub fn vortex_turboquant::TurboQuant::take(array: &vortex_turboquant::TurboQuantArray, indices: &vortex_array::array::ArrayRef, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<core::option::Option<vortex_array::array::ArrayRef>>

impl vortex_array::arrays::slice::SliceReduce for vortex_turboquant::TurboQuant

pub fn vortex_turboquant::TurboQuant::slice(array: &vortex_turboquant::TurboQuantArray, range: core::ops::range::Range<usize>) -> vortex_error::VortexResult<core::option::Option<vortex_array::array::ArrayRef>>

impl vortex_array::vtable::VTable for vortex_turboquant::TurboQuant

pub type vortex_turboquant::TurboQuant::Array = vortex_turboquant::TurboQuantArray

pub type vortex_turboquant::TurboQuant::Metadata = vortex_array::metadata::ProstMetadata<vortex_turboquant::array::TurboQuantMetadata>

pub type vortex_turboquant::TurboQuant::OperationsVTable = vortex_turboquant::TurboQuant

pub type vortex_turboquant::TurboQuant::ValidityVTable = vortex_array::vtable::validity::ValidityVTableFromChild

pub fn vortex_turboquant::TurboQuant::array_eq(array: &vortex_turboquant::TurboQuantArray, other: &vortex_turboquant::TurboQuantArray, precision: vortex_array::hash::Precision) -> bool

pub fn vortex_turboquant::TurboQuant::array_hash<H: core::hash::Hasher>(array: &vortex_turboquant::TurboQuantArray, state: &mut H, precision: vortex_array::hash::Precision)

pub fn vortex_turboquant::TurboQuant::buffer(_array: &vortex_turboquant::TurboQuantArray, idx: usize) -> vortex_array::buffer::BufferHandle

pub fn vortex_turboquant::TurboQuant::buffer_name(_array: &vortex_turboquant::TurboQuantArray, _idx: usize) -> core::option::Option<alloc::string::String>

pub fn vortex_turboquant::TurboQuant::build(dtype: &vortex_array::dtype::DType, len: usize, metadata: &Self::Metadata, _buffers: &[vortex_array::buffer::BufferHandle], children: &dyn vortex_array::serde::ArrayChildren) -> vortex_error::VortexResult<vortex_turboquant::TurboQuantArray>

pub fn vortex_turboquant::TurboQuant::child(array: &vortex_turboquant::TurboQuantArray, idx: usize) -> vortex_array::array::ArrayRef

pub fn vortex_turboquant::TurboQuant::child_name(_array: &vortex_turboquant::TurboQuantArray, idx: usize) -> alloc::string::String

pub fn vortex_turboquant::TurboQuant::deserialize(bytes: &[u8], _dtype: &vortex_array::dtype::DType, _len: usize, _buffers: &[vortex_array::buffer::BufferHandle], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult<Self::Metadata>

pub fn vortex_turboquant::TurboQuant::dtype(array: &vortex_turboquant::TurboQuantArray) -> &vortex_array::dtype::DType

pub fn vortex_turboquant::TurboQuant::execute(array: alloc::sync::Arc<vortex_array::vtable::typed::Array<Self>>, ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::executor::ExecutionResult>

pub fn vortex_turboquant::TurboQuant::execute_parent(array: &vortex_array::vtable::typed::Array<Self>, parent: &vortex_array::array::ArrayRef, child_idx: usize, ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<core::option::Option<vortex_array::array::ArrayRef>>

pub fn vortex_turboquant::TurboQuant::id(&self) -> vortex_array::vtable::dyn_::ArrayId

pub fn vortex_turboquant::TurboQuant::len(array: &vortex_turboquant::TurboQuantArray) -> usize

pub fn vortex_turboquant::TurboQuant::metadata(array: &vortex_turboquant::TurboQuantArray) -> vortex_error::VortexResult<Self::Metadata>

pub fn vortex_turboquant::TurboQuant::nbuffers(_array: &vortex_turboquant::TurboQuantArray) -> usize

pub fn vortex_turboquant::TurboQuant::nchildren(array: &vortex_turboquant::TurboQuantArray) -> usize

pub fn vortex_turboquant::TurboQuant::reduce_parent(array: &vortex_array::vtable::typed::Array<Self>, parent: &vortex_array::array::ArrayRef, child_idx: usize) -> vortex_error::VortexResult<core::option::Option<vortex_array::array::ArrayRef>>

pub fn vortex_turboquant::TurboQuant::serialize(metadata: Self::Metadata) -> vortex_error::VortexResult<core::option::Option<alloc::vec::Vec<u8>>>

pub fn vortex_turboquant::TurboQuant::stats(array: &vortex_turboquant::TurboQuantArray) -> vortex_array::stats::array::StatsSetRef<'_>

pub fn vortex_turboquant::TurboQuant::vtable(_array: &Self::Array) -> &Self

pub fn vortex_turboquant::TurboQuant::with_children(array: &mut Self::Array, children: alloc::vec::Vec<vortex_array::array::ArrayRef>) -> vortex_error::VortexResult<()>

impl vortex_array::vtable::operations::OperationsVTable<vortex_turboquant::TurboQuant> for vortex_turboquant::TurboQuant

pub fn vortex_turboquant::TurboQuant::scalar_at(array: &vortex_turboquant::TurboQuantArray, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>

impl vortex_array::vtable::validity::ValidityChild<vortex_turboquant::TurboQuant> for vortex_turboquant::TurboQuant

pub fn vortex_turboquant::TurboQuant::validity_child(array: &vortex_turboquant::TurboQuantArray) -> &vortex_array::array::ArrayRef

pub struct vortex_turboquant::TurboQuantArray

impl vortex_turboquant::TurboQuantArray

pub fn vortex_turboquant::TurboQuantArray::bit_width(&self) -> u8

pub fn vortex_turboquant::TurboQuantArray::centroids(&self) -> &vortex_array::array::ArrayRef

pub fn vortex_turboquant::TurboQuantArray::codes(&self) -> &vortex_array::array::ArrayRef

pub fn vortex_turboquant::TurboQuantArray::dimension(&self) -> u32

pub fn vortex_turboquant::TurboQuantArray::has_qjl(&self) -> bool

pub fn vortex_turboquant::TurboQuantArray::norms(&self) -> &vortex_array::array::ArrayRef

pub fn vortex_turboquant::TurboQuantArray::padded_dim(&self) -> u32

pub fn vortex_turboquant::TurboQuantArray::qjl(&self) -> core::option::Option<&vortex_turboquant::QjlCorrection>

pub fn vortex_turboquant::TurboQuantArray::rotation_signs(&self) -> &vortex_array::array::ArrayRef

pub fn vortex_turboquant::TurboQuantArray::try_new_mse(dtype: vortex_array::dtype::DType, codes: vortex_array::array::ArrayRef, norms: vortex_array::array::ArrayRef, centroids: vortex_array::array::ArrayRef, rotation_signs: vortex_array::array::ArrayRef, dimension: u32, bit_width: u8) -> vortex_error::VortexResult<Self>

pub fn vortex_turboquant::TurboQuantArray::try_new_qjl(dtype: vortex_array::dtype::DType, codes: vortex_array::array::ArrayRef, norms: vortex_array::array::ArrayRef, centroids: vortex_array::array::ArrayRef, rotation_signs: vortex_array::array::ArrayRef, qjl: vortex_turboquant::QjlCorrection, dimension: u32, bit_width: u8) -> vortex_error::VortexResult<Self>

impl vortex_turboquant::TurboQuantArray

pub fn vortex_turboquant::TurboQuantArray::to_array(&self) -> vortex_array::array::ArrayRef

impl core::clone::Clone for vortex_turboquant::TurboQuantArray

pub fn vortex_turboquant::TurboQuantArray::clone(&self) -> vortex_turboquant::TurboQuantArray

impl core::convert::AsRef<dyn vortex_array::array::DynArray> for vortex_turboquant::TurboQuantArray

pub fn vortex_turboquant::TurboQuantArray::as_ref(&self) -> &dyn vortex_array::array::DynArray

impl core::convert::From<vortex_turboquant::TurboQuantArray> for vortex_array::array::ArrayRef

pub fn vortex_array::array::ArrayRef::from(value: vortex_turboquant::TurboQuantArray) -> vortex_array::array::ArrayRef

impl core::fmt::Debug for vortex_turboquant::TurboQuantArray

pub fn vortex_turboquant::TurboQuantArray::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result

impl core::ops::deref::Deref for vortex_turboquant::TurboQuantArray

pub type vortex_turboquant::TurboQuantArray::Target = dyn vortex_array::array::DynArray

pub fn vortex_turboquant::TurboQuantArray::deref(&self) -> &Self::Target

impl vortex_array::array::IntoArray for vortex_turboquant::TurboQuantArray

pub fn vortex_turboquant::TurboQuantArray::into_array(self) -> vortex_array::array::ArrayRef

pub struct vortex_turboquant::TurboQuantConfig

pub vortex_turboquant::TurboQuantConfig::bit_width: u8

pub vortex_turboquant::TurboQuantConfig::seed: core::option::Option<u64>

impl core::clone::Clone for vortex_turboquant::TurboQuantConfig

pub fn vortex_turboquant::TurboQuantConfig::clone(&self) -> vortex_turboquant::TurboQuantConfig

impl core::default::Default for vortex_turboquant::TurboQuantConfig

pub fn vortex_turboquant::TurboQuantConfig::default() -> Self

impl core::fmt::Debug for vortex_turboquant::TurboQuantConfig

pub fn vortex_turboquant::TurboQuantConfig::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result

pub const vortex_turboquant::FIXED_SHAPE_TENSOR_EXT_ID: &str

pub const vortex_turboquant::VECTOR_EXT_ID: &str

pub fn vortex_turboquant::initialize(session: &mut vortex_session::VortexSession)

pub fn vortex_turboquant::turboquant_encode_mse(fsl: &vortex_array::arrays::fixed_size_list::array::FixedSizeListArray, config: &vortex_turboquant::TurboQuantConfig) -> vortex_error::VortexResult<vortex_array::array::ArrayRef>

pub fn vortex_turboquant::turboquant_encode_qjl(fsl: &vortex_array::arrays::fixed_size_list::array::FixedSizeListArray, config: &vortex_turboquant::TurboQuantConfig) -> vortex_error::VortexResult<vortex_array::array::ArrayRef>
Loading
Loading