code wiki / (root) / nx_mvault_embed.nx

nx_mvault_embed.nx source

↩ module page · 46 lines · 1801 B

1// nx_mvault_embed.nx -- embedding-vector storage for the vault (seg-store blobs). 2// 3// The NishiCaption/SOTA tagger produces per-item EMBEDDINGS the schema must 4// retain so the expensive pass runs once: 5// - face embedding (ArcFace-class) -> identity CLUSTERING -> performer: tags 6// - image embedding (CLIP/SigLIP) -> SEMANTIC search + near-dup detection 7// - pose (DWPose) feature vector -> pose archetypes 8// Stored CID+model-keyed on the sovereign seg-store (additive, versioned), so 9// re-clustering / re-search never needs re-inference. Composes nx_registry 10// (reg_put/reg_get) -- no new store format. license_tier: ORIGINAL 11 12import "nx_syscalls.nx" 13import "nx_registry.nx" 14 15func eb_cat(dst: *u8, off: i64, s: *u8) -> i64 { 16 var i: i64 = 0 17 while s[i] != (0 as u8) { dst[off + i] = s[i]; i = i + 1 } 18 return off + i 19} 20 21// key-prefix = "emb:<model>:" so each model's vectors are a distinct plane. 22func mv_embed_kp(out: *u8, model: *u8) -> i64 { 23 let p: *u8 = "emb:" as *u8 24 let c: *u8 = ":" as *u8 25 var o: i64 = eb_cat(out, 0, p) 26 o = eb_cat(out, o, model) 27 o = eb_cat(out, o, c) 28 out[o] = 0 as u8 29 return o 30} 31 32// Store an embedding vector (raw bytes; dtype/dim are the caller's convention) 33// under emb:<model>:<cid> on the seg-store; additive. 34func mv_embed_put(prefix: *u8, cid: *u8, model: *u8, vec: *u8, vlen: i64) -> i64 { 35 let kp: *u8 = sys_mmap(256) 36 mv_embed_kp(kp, model) 37 let idx: *u8 = "emb:ids" as *u8 38 return reg_put(prefix, kp, idx, cid, vec, vlen) 39} 40 41// Read the embedding for (cid, model): outp[0]=addr, outl[0]=len; 1=found. 42func mv_embed_get(prefix: *u8, cid: *u8, model: *u8, outp: *i64, outl: *i64) -> i64 { 43 let kp: *u8 = sys_mmap(256) 44 mv_embed_kp(kp, model) 45 return reg_get(prefix, kp, cid, outp, outl) 46}