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}