nx_concept_embedding_test.nx source
↩ module page · 124 lines · 4667 B
1// nx_concept_embedding_test.nx -- smoke for typed concept manifest.
2
3import "nx_syscalls.nx"
4import "nx_tier.nx"
5import "nx_image_feature_extract.nx"
6import "nx_concept_embedding.nx"
7
8func _fill_centroid(c: *nx_int, base: nx_int) -> nx_int {
9 var i: nx_int = 0
10 while i < NX_IMAGE_FEATURE_LEN {
11 c[i] = base + i * 10
12 i = i + 1
13 }
14 return 0
15}
16
17func main() -> nx_int {
18 // === Test 1: build a valid concept ===
19 let name: *u8 = sys_mmap(64)
20 name[0] = 108 // l
21 name[1] = 105 // i
22 name[2] = 110 // n
23 name[3] = 103 // g
24 name[4] = 101 // e
25 name[5] = 114 // r
26 name[6] = 105 // i
27 name[7] = 101 // e
28 name[8] = 95 // _
29 name[9] = 114 // r
30 name[10] = 101 // e
31 name[11] = 100 // d
32 let centroid: *nx_int = (sys_mmap(NX_IMAGE_FEATURE_LEN * NX_SIZEOF_NX_INT)) as *nx_int
33 _fill_centroid(centroid, 500)
34 let src_hashes: *u8 = sys_mmap(3 * NX_CE_HASH_BYTES)
35 // populate 3 fake source hashes (any bytes; substrate doesn't care)
36 var i: nx_int = 0
37 while i < 3 * NX_CE_HASH_BYTES {
38 src_hashes[i] = i - (i / 256) * 256
39 i = i + 1
40 }
41 let iso: *u8 = sys_mmap(32)
42 iso[0] = 50 // '2'
43 iso[1] = 48 // '0'
44 iso[2] = 50 // '2'
45 iso[3] = 54 // '6'
46
47 let m: *ConceptEmbedding = (sys_mmap(10 * NX_SIZEOF_NX_INT)) as *ConceptEmbedding
48 let rc: nx_int = nx_concept_embedding_build(
49 name, 12,
50 centroid,
51 3, 850,
52 src_hashes,
53 iso, 4,
54 m
55 )
56 if rc != 0 { return 1 }
57 if m.schema_version != NX_CE_SCHEMA_VERSION { return 2 }
58 if m.name_len != 12 { return 3 }
59 if m.n_examples != 3 { return 4 }
60 if m.fidelity_q10 != 850 { return 5 }
61
62 // === Test 2: name too long -> error ===
63 let m2: *ConceptEmbedding = (sys_mmap(10 * NX_SIZEOF_NX_INT)) as *ConceptEmbedding
64 if nx_concept_embedding_build(name, 999, centroid, 1, 500, src_hashes, iso, 4, m2) == 0 { return 10 }
65
66 // === Test 3: negative n_examples -> error ===
67 if nx_concept_embedding_build(name, 12, centroid, -1, 500, src_hashes, iso, 4, m2) == 0 { return 11 }
68
69 // === Test 4: canonical-bytes serialization succeeds ===
70 let buf: *u8 = sys_mmap(2048)
71 let n_written: nx_int = nx_concept_embedding_canonical_bytes(m, buf, 2048)
72 if n_written <= 0 { return 20 }
73 // Verify the prefix is "ce.v1\n"
74 if buf[0] != 99 { return 21 } // c
75 if buf[1] != 101 { return 22 } // e
76 if buf[2] != 46 { return 23 } // .
77 if buf[3] != 118 { return 24 } // v
78 if buf[4] != 49 { return 25 } // 1
79 if buf[5] != 10 { return 26 } // \n
80
81 // === Test 5: canonical-bytes buffer-too-small -> -1 ===
82 let small: *u8 = sys_mmap(16)
83 let n2: nx_int = nx_concept_embedding_canonical_bytes(m, small, 16)
84 if n2 != -1 { return 30 }
85
86 // === Test 6: canonical-bytes determinism ===
87 // Two calls with same input -> identical bytes
88 let buf_b: *u8 = sys_mmap(2048)
89 let n_b: nx_int = nx_concept_embedding_canonical_bytes(m, buf_b, 2048)
90 if n_b != n_written { return 40 }
91 var k: nx_int = 0
92 while k < n_written {
93 if buf[k] != buf_b[k] { return 41 }
94 k = k + 1
95 }
96
97 // === Test 7: two concepts with identical centroids -> IDENTICAL ===
98 let centroid_b: *nx_int = (sys_mmap(NX_IMAGE_FEATURE_LEN * NX_SIZEOF_NX_INT)) as *nx_int
99 _fill_centroid(centroid_b, 500)
100 let m_b: *ConceptEmbedding = (sys_mmap(10 * NX_SIZEOF_NX_INT)) as *ConceptEmbedding
101 nx_concept_embedding_build(name, 12, centroid_b, 3, 850, src_hashes, iso, 4, m_b)
102 let sim: nx_int = nx_concept_embedding_compare(m, m_b)
103 if nx_concept_embedding_classify(sim) != NX_CE_BAND_IDENTICAL { return 50 }
104
105 // === Test 8: two distinct concepts -> DISTINCT band ===
106 let centroid_c: *nx_int = (sys_mmap(NX_IMAGE_FEATURE_LEN * NX_SIZEOF_NX_INT)) as *nx_int
107 var idx: nx_int = 0
108 while idx < NX_IMAGE_FEATURE_LEN {
109 centroid_c[idx] = -500
110 idx = idx + 1
111 }
112 let m_c: *ConceptEmbedding = (sys_mmap(10 * NX_SIZEOF_NX_INT)) as *ConceptEmbedding
113 nx_concept_embedding_build(name, 12, centroid_c, 3, 850, src_hashes, iso, 4, m_c)
114 let sim_neg: nx_int = nx_concept_embedding_compare(m, m_c)
115 if sim_neg >= 0 { return 60 } // anti-parallel
116 if nx_concept_embedding_classify(sim_neg) != NX_CE_BAND_DISTINCT { return 61 }
117
118 // === Test 9: sealed-enum validity ===
119 if nx_concept_embedding_band_is_valid(NX_CE_BAND_IDENTICAL) != 1 { return 70 }
120 if nx_concept_embedding_band_is_valid(NX_CE_BAND_DISTINCT) != 1 { return 71 }
121 if nx_concept_embedding_band_is_valid(99) != 0 { return 72 }
122
123 return 0
124}