Encode a full-precision vector to BBQ 1-bit bytes. The serialised form is the raw `UnifiedQuantizedVector` buffer (`as_bytes()`): 32-byte `QuantHeader` followed by `dim.div_ceil(8)` sign-packed bits plus 14 bytes of corrective factors in the header.
(&self, v: &[f32])
| 130 | /// (`as_bytes()`): 32-byte `QuantHeader` followed by `dim.div_ceil(8)` |
| 131 | /// sign-packed bits plus 14 bytes of corrective factors in the header. |
| 132 | fn encode(&self, v: &[f32]) -> Result<Vec<u8>, RerankError> { |
| 133 | if v.len() != self.dim { |
| 134 | return Err(RerankError::BadInput(format!( |
| 135 | "bbq encode: vector len {} != codec dim {}", |
| 136 | v.len(), |
| 137 | self.dim |
| 138 | ))); |
| 139 | } |
| 140 | let codec = self.codec.as_ref().ok_or_else(|| { |
| 141 | RerankError::NotTrained( |
| 142 | "bbq: codec must be trained before encoding (call train() with a sample of vectors)" |
| 143 | .to_string(), |
| 144 | ) |
| 145 | })?; |
| 146 | let quantized = codec.encode(v); |
| 147 | Ok(quantized.as_ref().as_bytes().to_vec()) |
| 148 | } |
| 149 | |
| 150 | /// Prepare the query by centering it and serialising the exact FP32 centered |
| 151 | /// vector alongside the query norm. |