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}