topk_verify/
topk_verify.rs

1use ed25519_dalek::SigningKey;
2use lllv_core::{Capsule, CapsuleFlags};
3use lllv_index::{IndexPackBuilder, QueryRequest};
4
5fn f32_to_bytes(v: &[f32]) -> Vec<u8> {
6    let mut out = Vec::with_capacity(v.len() * 4);
7    for x in v {
8        out.extend_from_slice(&x.to_le_bytes());
9    }
10    out
11}
12
13fn main() {
14    let dim: u16 = 3;
15    let sk = SigningKey::from_bytes(&[1u8; 32]);
16    let v1 = vec![1.0, 0.0, 0.0]; // a
17    let v2 = vec![0.0, 1.0, 0.0]; // b
18    let v3 = vec![0.0, 0.0, 1.0]; // c
19
20    let cap_a = Capsule::create(dim, &f32_to_bytes(&v1), CapsuleFlags::NONE, &sk).unwrap();
21    let cap_b = Capsule::create(dim, &f32_to_bytes(&v2), CapsuleFlags::NONE, &sk).unwrap();
22    let cap_c = Capsule::create(dim, &f32_to_bytes(&v3), CapsuleFlags::NONE, &sk).unwrap();
23
24    let mut b = IndexPackBuilder::new(dim);
25    b.add_capsule("a".into(), cap_a).unwrap();
26    b.add_capsule("b".into(), cap_b).unwrap();
27    b.add_capsule("c".into(), cap_c).unwrap();
28
29    let pack = b.build(None).unwrap();
30    let ev = pack.query(&QueryRequest::from_vec(&v1), 3).unwrap();
31    pack.verify(&ev).unwrap();
32
33    println!("Pack CID  : {}", ev.index_pack_cid);
34    for (i, r) in ev.results.iter().enumerate() {
35        println!(
36            "#{i} id={} score={:.4} leaf={} path_len={}",
37            r.id,
38            r.score,
39            r.leaf_hex,
40            r.path.len()
41        );
42    }
43}