code wiki / (root) / nx_gm_xpbd_correct_gate_t138.nx

nx_gm_xpbd_correct_gate_t138.nx source

↩ module page · 104 lines · 6247 B

1// Private analytic correction gate, not whole-character acceptance. 2import "nx_gm_cloth_lib_t138.nx" 3import "nx_gate_verdict.nx" 4func ca_reset(v: *i64, w: *i64) -> i64 { 5 var i:i64=0 6 while i<6 {v[i]=0;w[i]=0;i=i+1} 7 v[3]=2000 8 return 0 9} 10func ca_print(s:*u8,n:i64)->i64 {gv_puts(s);gv_num(n);gv_puts("\n" as *u8);return 0} 11func main()->i64 { 12 let ctr:*i64=gv_ctr() 13 let v:*i64=sys_mmap(48) as *i64 14 let w:*i64=sys_mmap(48) as *i64 15 let bank:*i64=sys_mmap(48) as *i64 16 let e:*i64=sys_mmap(32) as *i64 17 let p:*i64=sys_mmap(8) as *i64 18 e[0]=0;e[1]=1;e[2]=1000;e[3]=GM_C_STRUCT;p[0]=0 19 ca_reset(v,w) 20 gm_xpbd_step_banked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,bank) 21 let rigid:i64=gm_dist(v,0,1) 22 ca_print("rigid_free_free_actual=" as *u8,rigid) 23 gv_check("Rigid free/free analytic1000" as *u8,rigid==1000,ctr) 24 ca_reset(v,w) 25 gm_xpbd_step_banked(v,w,2,e,1,p,1,0,ST_DT_REF_US,1,0,0,bank) 26 ca_print("rigid_pin_free_actual=" as *u8,gm_dist(v,0,1)) 27 gv_check("Pinned/free analytic1000" as *u8,gm_dist(v,0,1)==1000 && v[0]==0,ctr) 28 ca_print("alpha_relative1_dsum2=" as *u8,st_alpha_tilde(4096,2,ST_DT_REF_US)) 29 ca_print("alpha_relative1_dsum8192=" as *u8,st_alpha_tilde(4096,8192,ST_DT_REF_US)) 30 gv_check("Shared helper unchanged returns dsum units" as *u8,st_alpha_tilde(4096,2,ST_DT_REF_US)==2,ctr) 31 ca_reset(v,w) 32 gm_xpbd_step_banked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,4096,4096,bank) 33 let soft1:i64=gm_dist(v,0,1) 34 ca_print("soft_iteration1=" as *u8,soft1) 35 ca_reset(v,w) 36 gm_xpbd_step_banked(v,w,2,e,1,p,0,0,ST_DT_REF_US,8,4096,4096,bank) 37 let soft8:i64=gm_dist(v,0,1) 38 ca_print("soft_iteration8=" as *u8,soft8) 39 gv_check("Compliant equilibrium1500 at1 and8 iterations" as *u8,soft1==1500 && soft8==1500,ctr) 40 ca_reset(v,w);v[3]=1000 41 gm_xpbd_step_banked(v,w,2,e,1,p,0,0,ST_DT_REF_US,8,4096,4096,bank) 42 gv_check("CONTROL rest edge stays1000" as *u8,gm_dist(v,0,1)==1000,ctr) 43 v[0]=0;v[1]=0;v[2]=0;w[0]=0;w[1]=7;w[2]=0 44 let hit0:i64=gm_capsule_project(v,w,1,0,0,0-1000,0,0,1000,100) 45 ca_print("axis_hit=" as *u8,hit0);ca_print("axis_radial_squared=" as *u8,v[0]*v[0]+v[1]*v[1]) 46 gv_check("Capsule axis separates deterministically" as *u8,hit0==1 && v[0]*v[0]+v[1]*v[1]>=10000,ctr) 47 v[0]=50;v[1]=0;v[2]=0;w[0]=7;w[1]=11;w[2]=0 48 let hit1:i64=gm_capsule_project(v,w,1,0,0,0-1000,0,0,1000,100) 49 ca_print("nonaxis_projected_x=" as *u8,v[0]);ca_print("outward_velocity_after=" as *u8,w[0]);ca_print("tangent_velocity_after=" as *u8,w[1]) 50 gv_check("Contact preserves outward and tangent velocity" as *u8,hit1==1 && v[0]==102 && w[0]==7 && w[1]==11,ctr) 51 v[0]=200;v[1]=0;v[2]=0;w[0]=7;w[1]=11;w[2]=0 52 let hit2:i64=gm_capsule_project(v,w,1,0,0,0-1000,0,0,1000,100) 53 gv_check("CONTROL outside contact leaves position and velocity" as *u8,hit2==0 && v[0]==200 && w[0]==7 && w[1]==11,ctr) 54 let ws:*i64=sys_mmap(4096) as *i64 55 let masses:*i64=sys_mmap(16) as *i64 56 masses[0]=ST_Q12;masses[1]=ST_Q12*3 57 ca_reset(v,w) 58 let mr:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,masses,2,ws,512) 59 gv_check("Unequal inverse masses correction250/750" as *u8,mr==0 && v[0]==250 && v[3]==1250,ctr) 60 ca_reset(v,w);e[1]=2 61 let bad:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,masses,2,ws,512) 62 gv_check("Invalid index refuses before caller mutation" as *u8,bad<0 && v[0]==0 && v[3]==2000 && w[0]==0,ctr) 63 e[1]=1 64 let shortws:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,masses,2,ws,1) 65 gv_check("Insufficient workspace refuses" as *u8,shortws<0 && v[3]==2000,ctr) 66 let badtime:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,0,1,0,0,masses,2,ws,512) 67 gv_check("Nonpositive timestep refuses" as *u8,badtime<0 && v[3]==2000,ctr) 68 v[3]=GMC_MAX 69 let overflow:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,masses,2,ws,512) 70 gv_check("Arithmetic overflow refuses without partial commit" as *u8,overflow==0-2 && v[3]==GMC_MAX && v[0]==0,ctr) 71 ca_reset(v,w) 72 gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US*2,8,4096,4096,0 as *i64,0,ws,512) 73 gv_check("Double-dt compliant analytic1200" as *u8,gm_dist(v,0,1)==1200,ctr) 74 ca_reset(v,w) 75 gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US/2,8,4096,4096,0 as *i64,0,ws,512) 76 let halfdist:i64=gm_dist(v,0,1) 77 ca_print("halfdt_compliant_distance=" as *u8,halfdist) 78 gv_check("Half-dt compliant analytic1800 within2 mesh quanta" as *u8,halfdist>=1798 && halfdist<=1802,ctr) 79 ca_reset(v,w) 80 var tick:i64=0 81 while tick<10 {gm_xpbd_step_checked(v,w,1,e,0,p,0,100,10000,0,0,0,0 as *i64,0,ws,512);tick=tick+1} 82 let z10:i64=v[2];let vs10:i64=w[2]*100 83 ca_reset(v,w);tick=0 84 while tick<5 {gm_xpbd_step_checked(v,w,1,e,0,p,0,400,20000,0,0,0,0 as *i64,0,ws,512);tick=tick+1} 85 ca_print("physical100ms_10ms_z=" as *u8,z10);ca_print("physical100ms_20ms_z=" as *u8,v[2]) 86 gv_check("Equal physical time free flight: analytic5000 plus semiimplicit errors500/1000" as *u8,z10==5500 && v[2]==6000 && vs10==100000 && w[2]*50==100000,ctr) 87 v[0]=50;v[1]=0;v[2]=0;w[0]=0-7;w[1]=11;w[2]=0 88 gm_capsule_project(v,w,1,0,0,0-1000,0,0,1000,100) 89 gv_check("Inward normal removed; tangent preserved" as *u8,w[0]==0 && w[1]==11,ctr) 90 v[0]=50;v[1]=0;v[2]=0;w[0]=0;w[1]=11;w[2]=0 91 let moving:i64=gm_capsule_project_checked(v,w,1,0,0,0-1000,0,0,1000,100,p,0,5,0,0,ws,512) 92 gv_check("Moving collider relative normal respected" as *u8,moving==1 && w[0]==5 && w[1]==11,ctr) 93 v[0]=50;v[1]=0;v[2]=0;w[0]=7;w[1]=11;w[2]=0 94 let conflict:i64=gm_capsule_project_checked(v,w,1,0,0,0-1000,0,0,1000,100,p,1,0,0,0,ws,512) 95 gv_check("Pinned contact conflict explicit without mutation" as *u8,conflict==0-6 && v[0]==50 && w[0]==7,ctr) 96 ca_reset(v,w);tick=0 97 while tick<4 {gm_xpbd_step_checked(v,w,2,e,1,p,1,0,ST_DT_REF_US,8,4096,4096,0 as *i64,0,ws,512);tick=tick+1} 98 let spring4:i64=v[3] 99 ca_reset(v,w);tick=0 100 while tick<2 {gm_xpbd_step_checked(v,w,2,e,1,p,1,0,ST_DT_REF_US*2,8,4096,4096,0 as *i64,0,ws,512);tick=tick+1} 101 ca_print("spring_equal_time_4small=" as *u8,spring4);ca_print("spring_equal_time_2large=" as *u8,v[3]) 102 gv_check("Spring equal physical time matches implicit discrete recurrence750/880 within4 units" as *u8,st_abs(spring4-750)<=4 && st_abs(v[3]-880)<=4,ctr) 103 return gv_verdict("GM-XPBD-PRIVATE-CORRECTION" as *u8,ctr,"Analytic fixed-point solver and capsule fixtures; not whole-character or served acceptance." as *u8) 104}