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}