Reconstruct a `RerankCodec` from its byte form. The `name` tag tells us which wrapper to dispatch into; the bytes are the codec's own format.
(
name: CodecName,
bytes: &[u8],
)
| 77 | /// Reconstruct a `RerankCodec` from its byte form. The `name` tag tells us |
| 78 | /// which wrapper to dispatch into; the bytes are the codec's own format. |
| 79 | pub fn rerank_codec_from_bytes( |
| 80 | name: CodecName, |
| 81 | bytes: &[u8], |
| 82 | ) -> Result<Arc<dyn RerankCodec>, RerankError> { |
| 83 | use crate::quantize::pq::PqCodec; |
| 84 | use crate::quantize::sq8::Sq8Codec; |
| 85 | use crate::rerank::codecs::{BbqRerank, BinaryRerank, PqRerank, RaBitQRerank, Sq8Rerank}; |
| 86 | use nodedb_codec::vector_quant::bbq::BbqCodec; |
| 87 | use nodedb_codec::vector_quant::rabitq::RaBitQCodec; |
| 88 | |
| 89 | match name { |
| 90 | CodecName::Sq8 => { |
| 91 | let inner = Sq8Codec::from_bytes(bytes) |
| 92 | .map_err(|e| RerankError::BadInput(format!("sq8 from_bytes: {e}")))?; |
| 93 | Ok(Arc::new(Sq8Rerank::from_codec(inner))) |
| 94 | } |
| 95 | CodecName::Binary => { |
| 96 | // Format: [NDBIN\0 (6 bytes)][version u8 = 1][dim u32 LE (4 bytes)] — 11 bytes total. |
| 97 | if bytes.len() < 11 { |
| 98 | return Err(RerankError::BadInput("binary from_bytes: too short".into())); |
| 99 | } |
| 100 | if &bytes[..6] != b"NDBIN\0" { |
| 101 | return Err(RerankError::BadInput("binary from_bytes: bad magic".into())); |
| 102 | } |
| 103 | // bytes[6] is version, bytes[7..11] is dim as u32 LE. |
| 104 | let dim = u32::from_le_bytes([bytes[7], bytes[8], bytes[9], bytes[10]]) as usize; |
| 105 | Ok(Arc::new(BinaryRerank::new(dim))) |
| 106 | } |
| 107 | CodecName::Pq => { |
| 108 | let inner = PqCodec::from_bytes(bytes) |
| 109 | .map_err(|e| RerankError::BadInput(format!("pq from_bytes: {e}")))?; |
| 110 | Ok(Arc::new(PqRerank::from_codec(inner))) |
| 111 | } |
| 112 | CodecName::RaBitQ => { |
| 113 | let inner = RaBitQCodec::from_bytes(bytes) |
| 114 | .map_err(|e| RerankError::BadInput(format!("rabitq from_bytes: {e}")))?; |
| 115 | Ok(Arc::new(RaBitQRerank::from_codec(inner))) |
| 116 | } |
| 117 | CodecName::Bbq => { |
| 118 | let inner = BbqCodec::from_bytes(bytes) |
| 119 | .map_err(|e| RerankError::BadInput(format!("bbq from_bytes: {e}")))?; |
| 120 | Ok(Arc::new(BbqRerank::from_codec(inner))) |
| 121 | } |
| 122 | } |
| 123 | } |