code wiki / (root) / nx_morf_eval_core_gate.nx

nx_morf_eval_core_gate.nx source

↩ module page · 84 lines · 5209 B

1// ORIGINAL. Canonical arithmetic and ownership checks; real NXA parity is a separate required run. 2import "nx_syscalls.nx" 3import "nx_gate_verdict.nx" 4import "nx_morf_eval_core.nx" 5 6func mvcg_same(a: *i64, b: *i64, n: i64) -> i64 { 7 var i: i64 = 0 8 while i < n { if a[i] != b[i] { return 0 }; i = i+1 } 9 return 1 10} 11func main() -> i64 { 12 let ctr: *i64 = gv_ctr() 13 gv_head("caller-owned MORF arithmetic before skinning" as *u8) 14 let view: *MvcView = sys_mmap(__size_of(MvcView)) as *MvcView 15 let bind: *i64 = sys_mmap(72) as *i64 16 let face: *i64 = sys_mmap(16) as *i64 17 let delta: *i64 = sys_mmap(96) as *i64 18 let weights: *i64 = sys_mmap(16) as *i64 19 let first: *i64 = sys_mmap(72) as *i64 20 let second: *i64 = sys_mmap(72) as *i64 21 let expected: *i64 = sys_mmap(72) as *i64 22 var i: i64 = 0 23 while i < 9 { bind[i] = i+1; expected[i] = i+1; i = i+1 } 24 face[0] = 1; face[1] = 2 25 delta[0] = 100; delta[1] = 0; delta[2] = 0-50 26 delta[3] = 0; delta[4] = 100; delta[5] = 0 27 delta[6] = 0-20; delta[7] = 40; delta[8] = 0 28 delta[9] = 10; delta[10] = 0; delta[11] = 0 29 view.bind = bind; view.bind_words = 9 30 view.face = face; view.face_words = 2 31 view.delta = delta; view.delta_words = 12 32 view.vertices = 3; view.faces = 2; view.channels = 2; view.unit = 1000 33 weights[0] = 1000; weights[1] = 500 34 expected[3] = 94; expected[4] = 25; expected[5] = 0-44 35 expected[6] = 12; expected[7] = 108; expected[8] = 9 36 gv_check_eq("two-channel result moves two FACE vertices" as *u8,mvc_apply(view,weights,2,first,9),2,ctr) 37 gv_check("exact coordinates and untouched non-FACE vertex" as *u8,mvcg_same(first,expected,9),ctr) 38 gv_check_eq("repeat from bind has same moved count" as *u8,mvc_apply(view,weights,2,first,9),2,ctr) 39 gv_check("repeated frame never accumulates displacement" as *u8,mvcg_same(first,expected,9),ctr) 40 weights[0] = 0; weights[1] = 0 41 gv_check_eq("second entity zero weights" as *u8,mvc_apply(view,weights,2,second,9),0,ctr) 42 gv_check("second entity is bind pose" as *u8,mvcg_same(second,bind,9),ctr) 43 gv_check("second entity leaves first output unchanged" as *u8,mvcg_same(first,expected,9),ctr) 44 weights[0] = 0-500 45 gv_check_eq("signed half weight" as *u8,mvc_apply(view,weights,2,second,9),2,ctr) 46 gv_check_eq("negative x contribution" as *u8,second[3],0-46,ctr) 47 gv_check_eq("negative delta times negative weight" as *u8,second[5],31,ctr) 48 weights[0] = 1 49 gv_check_eq("integer truncation to zero" as *u8,mvc_apply(view,weights,2,second,9),0,ctr) 50 gv_check("sub-quantum weights do not perturb bind" as *u8,mvcg_same(second,bind,9),ctr) 51 // Two half-unit contributions truncate separately; summing numerators first 52 // would incorrectly move x by one and fails this known-answer case. 53 delta[0] = 1; delta[6] = 1; weights[0] = 500; weights[1] = 500 54 gv_check_eq("two active half contributions retain other motion" as *u8,mvc_apply(view,weights,2,second,9),2,ctr) 55 gv_check_eq("each channel truncates before accumulation" as *u8,second[3],bind[3],ctr) 56 delta[0] = MVC_I64_MAX; delta[6] = 0-MVC_I64_MAX-1 57 weights[0] = 0; weights[1] = 0 58 gv_check_eq("zero weights ignore extreme signed deltas" as *u8,mvc_apply(view,weights,2,second,9),0,ctr) 59 gv_check("extreme inactive channels exactly preserve bind" as *u8,mvcg_same(second,bind,9),ctr) 60 delta[0] = 100; delta[6] = 0-20 61 weights[0] = 1 62 gv_check_eq("immutable bind alias refused" as *u8,mvc_apply(view,weights,2,bind,9),MVC_E_ALIAS,ctr) 63 gv_check_eq("short output refused" as *u8,mvc_apply(view,weights,2,first,8),MVC_E_SHAPE,ctr) 64 gv_check("shape refusal preserves existing output" as *u8,mvcg_same(first,expected,9),ctr) 65 face[1] = 3 66 gv_check_eq("out-of-range FACE rejected" as *u8,mvc_apply(view,weights,2,first,9),MVC_E_SHAPE,ctr) 67 gv_check("late membership failure commits nothing" as *u8,mvcg_same(first,expected,9),ctr) 68 face[1] = 2 69 delta[0] = MVC_I64_MAX; weights[0] = 2 70 gv_check_eq("multiplication overflow refused" as *u8,mvc_apply(view,weights,2,first,9),MVC_E_PRODUCT,ctr) 71 gv_check("product overflow commits nothing" as *u8,mvcg_same(first,expected,9),ctr) 72 delta[0] = 100; weights[0] = 1000; bind[3] = MVC_I64_MAX 73 gv_check_eq("vertex sum overflow refused" as *u8,mvc_apply(view,weights,2,first,9),MVC_E_SUM,ctr) 74 gv_check("sum overflow commits nothing" as *u8,mvcg_same(first,expected,9),ctr) 75 bind[3] = 4 76 let minimum: i64 = 0-MVC_I64_MAX-1 77 gv_check_eq("minimum times minus one overflow" as *u8,mvc_product_ok(minimum,0-1),0,ctr) 78 gv_check_eq("minimum times one representable" as *u8,mvc_product_ok(minimum,1),1,ctr) 79 gv_check_eq("minimum plus negative overflow" as *u8,mvc_sum_ok(minimum,0-1),0,ctr) 80 view.channels = 0; view.faces = 0; view.face_words = 0; view.delta_words = 0 81 gv_check_eq("no-MORF copy uses no weights" as *u8,mvc_apply(view,0 as *i64,0,first,9),0,ctr) 82 gv_check("no-MORF exactly preserves all bind vertices" as *u8,mvcg_same(first,bind,9),ctr) 83 return gv_verdict("NX-MORF-EVAL-CORE" as *u8,ctr,"canonical arithmetic, atomic refusal, immutable bind and isolated per-entity output" as *u8) 84}