MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / distance_prepared

Method distance_prepared

nodedb-vector/src/rerank/codecs/pq.rs:134–165  ·  view source on GitHub ↗

Compute asymmetric ADC distance from a prepared query to a PQ-encoded candidate. Expects `PreparedQuery::Lut` produced by `prepare_query`.

(
        &self,
        prepared: &PreparedQuery,
        encoded: &[u8],
    )

Source from the content-addressed store, hash-verified

132 ///
133 /// Expects `PreparedQuery::Lut` produced by `prepare_query`.
134 fn distance_prepared(
135 &self,
136 prepared: &PreparedQuery,
137 encoded: &[u8],
138 ) -> Result<f32, RerankError> {
139 let lut = match prepared {
140 PreparedQuery::Lut(t) => t,
141 _ => {
142 return Err(RerankError::BadInput(
143 "pq distance: expected PreparedQuery::Lut".to_string(),
144 ));
145 }
146 };
147
148 let packed_len = pq_packed_bits_len(self.m);
149 let uqv_ref = UnifiedQuantizedVectorRef::from_bytes(encoded, packed_len).map_err(|e| {
150 RerankError::BadInput(format!("pq distance: failed to parse encoded bytes: {e}"))
151 })?;
152
153 let packed = uqv_ref.packed_bits();
154 // ADC: sum lut[sub][code[sub]] for each subspace.
155 let dist = packed
156 .iter()
157 .enumerate()
158 .map(|(sub, &code)| {
159 lut.get(sub)
160 .and_then(|row| row.get(code as usize).copied())
161 .unwrap_or(0.0)
162 })
163 .sum();
164 Ok(dist)
165 }
166
167 fn name(&self) -> CodecName {
168 CodecName::Pq

Callers 1

Calls 6

pq_packed_bits_lenFunction · 0.85
to_stringMethod · 0.80
packed_bitsMethod · 0.80
sumMethod · 0.80
iterMethod · 0.45
getMethod · 0.45

Tested by 1