code wiki / (root) / nx_linalg_affine_factor_canonical_gate_t361.nx

nx_linalg_affine_factor_canonical_gate_t361.nx source

↩ module page · 140 lines · 9219 B

1// nx_linalg_affine_factor_canonical_gate_t361.nx -- Tests affine interval calculations for various edge cases in floating-point arithmetic. 2import "nx_linalg_affine_t34.nx" 3import "nx_gate_verdict.nx" 4func main()->i64{ 5 let ctr:*i64=sys_mmap(16) as *i64;let out:*i64=sys_mmap(48) as *i64;let input:*i64=sys_mmap(104) as *i64;let scratch:*i64=sys_mmap(384) as *i64 6 out[0]=717;out[1]=818 7 gv_check("zero exact declared interval",la_iv_f32(0,0,out)==0&&out[0]==0&&out[1]==0,ctr) 8 out[0]=717;out[1]=818 9 gv_check("negative-zero exact declared interval",la_iv_f32(2147483648,0,out)==0&&out[0]==0&&out[1]==0,ctr) 10 out[0]=717;out[1]=818 11 gv_check("subnormal exact declared interval",la_iv_f32(1,0,out)==0&&out[0]==0&&out[1]==1,ctr) 12 out[0]=717;out[1]=818 13 gv_check("negative-subnormal exact declared interval",la_iv_f32(2147483649,0,out)==0&&out[0]==-1&&out[1]==0,ctr) 14 out[0]=717;out[1]=818 15 gv_check("32768 exact declared interval",la_iv_f32(1191182336,0,out)==0&&out[0]==35184372088832&&out[1]==35184372088832,ctr) 16 out[0]=717;out[1]=818 17 gv_check("negative32768 exact declared interval",la_iv_f32(3338665984,0,out)==0&&out[0]==-35184372088832&&out[1]==-35184372088832,ctr) 18 out[0]=717;out[1]=818 19 gv_check("actual-scale exact declared interval",la_iv_f32(1197943849,0,out)==0&&out[0]==63544213110784&&out[1]==63544213110784,ctr) 20 out[0]=717;out[1]=818 21 gv_check("negative-actual-scale exact declared interval",la_iv_f32(3345427497,0,out)==0&&out[0]==-63544213110784&&out[1]==-63544213110784,ctr) 22 out[0]=717;out[1]=818 23 gv_check("below-domain exact declared interval",la_iv_f32(1199570943,0,out)==0&&out[0]==70368739983360&&out[1]==70368739983360,ctr) 24 out[0]=717;out[1]=818 25 gv_check("negative-below-domain exact declared interval",la_iv_f32(3347054591,0,out)==0&&out[0]==-70368739983360&&out[1]==-70368739983360,ctr) 26 out[0]=717;out[1]=818 27 gv_check("domain exact declared interval",la_iv_f32(1199570944,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 28 out[0]=717;out[1]=818 29 gv_check("negative-domain exact declared interval",la_iv_f32(3347054592,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 30 out[0]=717;out[1]=818 31 gv_check("above-domain exact declared interval",la_iv_f32(1199570945,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 32 out[0]=717;out[1]=818 33 gv_check("negative-above-domain exact declared interval",la_iv_f32(3347054593,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 34 out[0]=717;out[1]=818 35 gv_check("positive-infinity exact declared interval",la_iv_f32(2139095040,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 36 out[0]=717;out[1]=818 37 gv_check("negative-infinity exact declared interval",la_iv_f32(4286578688,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 38 out[0]=717;out[1]=818 39 gv_check("nan exact declared interval",la_iv_f32(2143289344,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 40 out[0]=717;out[1]=818 41 gv_check("maximum-finite exact declared interval",la_iv_f32(2139095039,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 42 out[0]=717;out[1]=818 43 gv_check("negative-maximum-finite exact declared interval",la_iv_f32(4286578687,0,out)==LA_AFFINE_RANGE&&out[0]==717&&out[1]==818,ctr) 44 out[0]=717;out[1]=818 45 gv_check("source-shift exact declared interval",la_iv_f32(1199570944,-10,out)==0&&out[0]==68719476736&&out[1]==68719476736,ctr) 46 out[0]=717;out[1]=818 47 gv_check("base-shift exact declared interval",la_iv_f32(1107296256,10,out)==0&&out[0]==35184372088832&&out[1]==35184372088832,ctr) 48 input[0]=3209134080 49 input[1]=3194355712 50 input[2]=3216244736 51 input[3]=1061683200 52 input[4]=1052770304 53 input[5]=1069481984 54 input[6]=0 55 input[7]=1065353216 56 input[8]=925768117 57 input[9]=1197943849 58 input[10]=0 59 input[11]=0 60 input[12]=0 61 let rc:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48) 62 gv_check("actual static source full affine admits",rc==0,ctr) 63 gv_check("native bounds enclose retained independent all-vertex f32 oracle extrema",rc==0&&out[0]<=-123&&out[1]<=-222&&out[2]<=-59&&out[3]>=123&&out[4]>=235&&out[5]>=36,ctr) 64 var i:i64=0;while i<6{gv_num(out[i]);gv_puts(" ");i=i+1};gv_puts("\n") 65 var held:*i64=sys_mmap(48) as *i64;i=0;while i<6{held[i]=out[i];i=i+1} 66 input[9]=1199570944 67 let bad:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48);var same:i64=1;i=0;while i<6{if out[i]!=held[i]{same=0};i=i+1} 68 gv_check("equivalent scale factor above prior input bound admits",bad==0,ctr);i=0;while i<6{held[i]=out[i];i=i+1} 69 input[9]=1197943849;input[10]=1199570944 70 let tr:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48);same=1;i=0;while i<6{if out[i]!=held[i]{same=0};i=i+1} 71 gv_check("translation boundary refuses unchanged",tr==LA_AFFINE_RANGE&&same==1,ctr) 72 input[10]=2139095040 73 let nf:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48);same=1;i=0;while i<6{if out[i]!=held[i]{same=0};i=i+1} 74 gv_check("nonfinite translation refuses unchanged",nf==LA_AFFINE_RANGE&&same==1,ctr) 75 76 input[0]=3212836864;input[1]=3212836864;input[2]=3212836864 77 input[3]=1065353216;input[4]=1065353216;input[5]=1065353216 78 input[6]=0;input[7]=1065353216;input[10]=0;input[11]=0;input[12]=0 79 var exponent:i64=0-120;var sweep_ok:i64=1 80 while exponent<=120{ 81 input[8]=(127-exponent)<<23;input[9]=(127+exponent)<<23 82 let s:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48) 83 if s!=0{sweep_ok=0} 84 i=0;while i<3{let ftz:i64=la_static_ftz_error_q30(la_static_product_subset_power(input));let extra:i64=(ftz+((1<<LA_STATIC_Q8_SHIFT)-1))>>LA_STATIC_Q8_SHIFT;if out[i]>-256||out[i]<-257-extra||out[i+3]<256||out[i+3]>257+extra{sweep_ok=0};i=i+1} 85 exponent=exponent+1 86 } 87 gv_check("241 reciprocal binary32 power factorizations enclose same unit cube",sweep_ok==1,ctr) 88 input[8]=2113929216;input[9]=1 89 let sub:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48) 90 gv_check("positive subnormal scale with finite reciprocal base admitted",sub==0&&out[0]<=-1&&out[3]>=1,ctr) 91 input[8]=1065353216;input[9]=2139095040 92 i=0;while i<6{held[i]=out[i];i=i+1} 93 let inf:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48);same=1;i=0;while i<6{if held[i]!=out[i]{same=0};i=i+1} 94 gv_check("nonfinite instance scale refuses without output mutation",inf==LA_AFFINE_RANGE&&same==1,ctr) 95 input[8]=2130706432;input[9]=2130706432 96 let overflow:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48);same=1;i=0;while i<6{if held[i]!=out[i]{same=0};i=i+1} 97 gv_check("true product overflow still refused unchanged",overflow==LA_AFFINE_RANGE&&same==1,ctr) 98 99 input[0]=3198779392 100 input[1]=3192324096 101 input[2]=0 102 input[3]=1051295744 103 input[4]=1041498112 104 input[5]=1071693824 105 input[6]=0 106 input[7]=1065353216 107 input[8]=925768117 108 input[9]=1203686663 109 input[10]=0 110 input[11]=0 111 input[12]=0 112 let actual_rc:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48) 113 gv_check("captured served Alpha13bits admitted",actual_rc==0,ctr) 114 gv_check("captured Alpha bounds enclose independent exact-operation f32 corners",actual_rc==0&&out[0]<=-86&&out[1]<=0&&out[2]<=-38&&out[3]>=86&&out[4]>=456&&out[5]>=51,ctr) 115 gv_puts("ACTUAL-ALPHA-Q8 ");i=0;while i<6{gv_num(out[i]);gv_puts(" ");held[i]=out[i];i=i+1};gv_puts("\n") 116 input[0]=1082130432;input[1]=1082130432;input[2]=1082130432;input[3]=1082130432;input[4]=1082130432;input[5]=1082130432;input[8]=2139095039;input[9]=4194304 117 let reassoc:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48);same=1;i=0;while i<6{if out[i]!=held[i]{same=0};i=i+1} 118 gv_check("finite real product with reassociation overflow refuses unchanged",reassoc==LA_AFFINE_RANGE&&same==1,ctr) 119 input[0]=1065353216;input[1]=1065353216;input[2]=1065353216;input[3]=1065353216;input[4]=1065353216;input[5]=1065353216;input[8]=2113929216;input[9]=1 120 let ftz_rc:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48) 121 gv_check("admitted subnormal input includes allowed FTZ zero result",ftz_rc==0&&out[0]<=0&&out[1]<=0&&out[2]<=0&&out[3]>=0&&out[4]>=0&&out[5]>=0,ctr) 122 gv_check("FTZ coefficient and exact power conversion",LA_STATIC_FTZ_COEFFICIENT==68&&la_static_ftz_error_q30(96)==68&&la_static_ftz_error_q30(0)==1,ctr) 123 124 i=0;while i<6{held[i]=out[i];i=i+1} 125 input[8]=1065353216;input[9]=0 126 let zero_scale:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48) 127 input[9]=2147483648 128 let negzero_scale:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48) 129 input[9]=3212836864 130 let negative_scale:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,48) 131 same=1;i=0;while i<6{if out[i]!=held[i]{same=0};i=i+1} 132 gv_check("zero negative-zero negative instance scales refuse unchanged",zero_scale==LA_AFFINE_RANGE&&negzero_scale==LA_AFFINE_RANGE&&negative_scale==LA_AFFINE_RANGE&&same==1,ctr) 133 input[9]=1065353216 134 let no_scratch:i64=la_static_yaw_bounds_f32(input,13,out,6,0 as *i64,48) 135 let short_scratch:i64=la_static_yaw_bounds_f32(input,13,out,6,scratch,47) 136 let no_input:i64=la_static_yaw_bounds_f32(0 as *i64,13,out,6,scratch,48) 137 same=1;i=0;while i<6{if out[i]!=held[i]{same=0};i=i+1} 138 gv_check("absent or undersized caller storage refuses before dereference unchanged",no_scratch==LA_AFFINE_RANGE&&short_scratch==LA_AFFINE_RANGE&&no_input==LA_AFFINE_RANGE&&same==1,ctr) 139 return gv_verdict("NX-AFFINE-DECLARED-DOMAIN",ctr,"Unchanged Q30 domain; finite reassociation guard, absolute FTZ allowance, actual Alpha input") 140}