1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
//! Distance computation for multi-vector representations.
//!
//! Provides asymmetric distance primitives for multi-vector search:
//!
//! - [`MaxSim`]: Per-query-vector maximum similarities.
//! - [`Chamfer`]: Sum of MaxSim scores (asymmetric Chamfer distance).
//! - [`QueryComputer`]: Architecture-dispatched query computer backed by
//! SIMD-accelerated block-transposed kernels.
//!
//! The fallback path uses a double-loop kernel over
//! [`InnerProduct`](diskann_vector::distance::InnerProduct). The optimised
//! path (via [`QueryComputer`]) uses block-transposed layout with
//! cache-tiled SIMD micro-kernels.
//!
//! # Example
//!
//! ```
//! use diskann_quantization::multi_vector::{
//! distance::{Chamfer, MaxSim, QueryMatRef},
//! MatRef, Standard,
//! };
//! use diskann_vector::{DistanceFunctionMut, PureDistanceFunction};
//!
//! // Query: 2 vectors of dim 3 (wrapped as QueryMatRef)
//! let query_data = [1.0f32, 0.0, 0.0, 0.0, 1.0, 0.0];
//! let query: QueryMatRef<_> = MatRef::new(
//! Standard::new(2, 3).unwrap(),
//! &query_data,
//! ).unwrap().into();
//!
//! // Doc: 2 vectors of dim 3
//! let doc_data = [1.0f32, 0.0, 0.0, 0.0, 0.0, 1.0];
//! let doc = MatRef::new(
//! Standard::new(2, 3).unwrap(),
//! &doc_data,
//! ).unwrap();
//!
//! // Chamfer distance (sum of max similarities)
//! let chamfer_dist = Chamfer::evaluate(query, doc);
//!
//! // MaxSim (per-query-vector scores)
//! let mut scores = vec![0.0f32; 2];
//! let mut max_sim = MaxSim::new(&mut scores).unwrap();
//! max_sim.evaluate(query, doc);
//! // scores[0] = -1.0 (query[0] matches doc[0]: negated max inner product)
//! // scores[1] = 0.0 (query[1] has no good match: max IP was 0)
//! ```
pub use QueryMatRef;
pub use ;
pub use QueryComputer;