1 | #include <containers/array.hfa> |
---|
2 | |
---|
3 | // |
---|
4 | // Type-theory demo (success is "it compiles") |
---|
5 | // |
---|
6 | |
---|
7 | forall( [Nx], [Ny], [Nz] ) |
---|
8 | void typesTest( tag(Nx), tag(Ny), tag(Nz) ) { |
---|
9 | |
---|
10 | array( float, Nx, Ny, Nz ) xyz; |
---|
11 | |
---|
12 | // numeric subscripts |
---|
13 | ptrdiff_t ix = 1, iy = 2, iz = 3; |
---|
14 | array( float, Ny, Nz ) & yz = xyz[ix]; |
---|
15 | array( float, Nz ) & z = xyz[ix][iy]; |
---|
16 | float & val = xyz[ix][iy][iz]; |
---|
17 | |
---|
18 | // deferral subscript |
---|
19 | typeof( xyz[all] ) yzx = xyz[all]; |
---|
20 | |
---|
21 | // longform check that -[all] gives intended type (user doesn't write this) |
---|
22 | arpk( Ny |
---|
23 | , array( float, Nz) |
---|
24 | , arpk( Nz |
---|
25 | , float |
---|
26 | , arpk( Nx |
---|
27 | , array( float, Ny, Nz ) |
---|
28 | , float |
---|
29 | , float |
---|
30 | ) |
---|
31 | , float |
---|
32 | ) |
---|
33 | , float |
---|
34 | ) |
---|
35 | & yzx_long = xyz[all]; |
---|
36 | & yzx_long = & yzx; |
---|
37 | & yzx = & yzx_long; |
---|
38 | } |
---|
39 | |
---|
40 | // |
---|
41 | // Runtime demo |
---|
42 | // |
---|
43 | |
---|
44 | #include <assert.h> |
---|
45 | |
---|
46 | float getMagicNumber( ptrdiff_t w, ptrdiff_t x, ptrdiff_t y, ptrdiff_t z ) { |
---|
47 | |
---|
48 | assert( 0 <= w && w < 3 ); |
---|
49 | assert( 0 <= x && x < 4 ); |
---|
50 | assert( 0 <= y && y < 5 ); |
---|
51 | assert( 0 <= z && z < 6 ); |
---|
52 | |
---|
53 | float ww = (2.0f \ w) / 1.0f; |
---|
54 | float xx = (2.0f \ x) / 100.0f; |
---|
55 | float yy = (2.0f \ y) / 10000.0f; |
---|
56 | float Nz = (2.0f \ z) / 1000000.0f; |
---|
57 | |
---|
58 | return ww+xx+yy+Nz; |
---|
59 | } |
---|
60 | |
---|
61 | forall( [Nw], [Nx], [Ny], [Nz] ) |
---|
62 | void fillHelloData( array( float, Nw, Nx, Ny, Nz ) & wxyz ) { |
---|
63 | for (w; Nw) |
---|
64 | for (x; Nx) |
---|
65 | for (y; Ny) |
---|
66 | for (z; Nz) |
---|
67 | wxyz[w][x][y][z] = getMagicNumber(w, x, y, z); |
---|
68 | } |
---|
69 | |
---|
70 | forall( [N] |
---|
71 | , S & | sized(S) |
---|
72 | ) |
---|
73 | float total1d_low( arpk(N, S, float, float ) & a ) { |
---|
74 | float total = 0.0f; |
---|
75 | for (i; N) |
---|
76 | total += a[i]; |
---|
77 | return total; |
---|
78 | } |
---|
79 | |
---|
80 | forall( [N], A & | ar(A, float, N) ) |
---|
81 | float total1d_hi( A & a ) { |
---|
82 | float total = 0.0f; |
---|
83 | for (i; N) |
---|
84 | total += a[i]; |
---|
85 | return total; |
---|
86 | } |
---|
87 | |
---|
88 | forall( [Nw], [Nx], [Ny], [Nz] ) |
---|
89 | void runtimeTest( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) { |
---|
90 | |
---|
91 | array( float, Nw, Nx, Ny, Nz ) wxyz; |
---|
92 | fillHelloData(wxyz); |
---|
93 | |
---|
94 | float expect, result; |
---|
95 | ptrdiff_t slice_ix = 1; |
---|
96 | |
---|
97 | // summing across W, with x=y=z=1 |
---|
98 | |
---|
99 | expect = 0; |
---|
100 | for (i; Nw) |
---|
101 | expect += getMagicNumber( i, slice_ix, slice_ix, slice_ix ); |
---|
102 | printf("expect Ws = %f\n", expect); |
---|
103 | |
---|
104 | result = total1d_low( wxyz[all][slice_ix][slice_ix][slice_ix] ); |
---|
105 | printf("result Ws [][][][] lo = %f\n", result); |
---|
106 | |
---|
107 | result = total1d_low( wxyz[all, slice_ix, slice_ix, slice_ix] ); |
---|
108 | printf("result Ws [,,,] lo = %f\n", result); |
---|
109 | |
---|
110 | result = total1d_hi( wxyz[all][slice_ix][slice_ix][slice_ix] ); |
---|
111 | printf("result Ws [][][][] hi = %f\n", result); |
---|
112 | |
---|
113 | result = total1d_hi( wxyz[all, slice_ix, slice_ix, slice_ix] ); |
---|
114 | printf("result Ws [,,,] hi = %f\n", result); |
---|
115 | |
---|
116 | // summing across X, with w=y=z=1 |
---|
117 | |
---|
118 | expect = 0; |
---|
119 | for (i; Nx) |
---|
120 | expect += getMagicNumber( slice_ix, i, slice_ix, slice_ix ); |
---|
121 | printf("expect Xs = %f\n", expect); |
---|
122 | |
---|
123 | result = total1d_low( wxyz[slice_ix][all][slice_ix][slice_ix] ); |
---|
124 | printf("result Xs [][][][] lo = %f\n", result); |
---|
125 | |
---|
126 | result = total1d_low( wxyz[slice_ix, all, slice_ix, slice_ix] ); |
---|
127 | printf("result Xs [,,,] lo = %f\n", result); |
---|
128 | |
---|
129 | result = total1d_hi( wxyz[slice_ix][all][slice_ix][slice_ix] ); |
---|
130 | printf("result Xs [][][][] hi = %f\n", result); |
---|
131 | |
---|
132 | result = total1d_hi( wxyz[slice_ix, all, slice_ix, slice_ix] ); |
---|
133 | printf("result Xs [,,,] hi = %f\n", result); |
---|
134 | |
---|
135 | } |
---|
136 | |
---|
137 | const size_t KW = 3, KX = 4, KY = 5, KZ = 6; |
---|
138 | |
---|
139 | int main() { |
---|
140 | |
---|
141 | typesTest ( ztag(KX), ztag(KY), ztag(KZ) ); |
---|
142 | runtimeTest( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) ); |
---|
143 | } |
---|