code wiki / (root) / nx_concept_embedding_test.nx

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}