source: tests/array-collections/array-basic.cfa @ 1f11818

Last change on this file since 1f11818 was 0b8c951d, checked in by Peter A. Buhr <pabuhr@…>, 15 months ago

more rename directories containers to collections

  • Property mode set to 100644
File size: 3.6 KB
RevLine 
[55b060d]1#include <collections/array.hfa>
[c7625e0]2
3//
4// Type-theory demo (success is "it compiles")
5//
6
[b9dae14c]7forall( [Nx], [Ny], [Nz] )
[c7625e0]8void 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
46float 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
[b9dae14c]61forall( [Nw], [Nx], [Ny], [Nz] )
[c7625e0]62void fillHelloData( array( float, Nw, Nx, Ny, Nz ) & wxyz ) {
[6e50a6b]63    for (w; Nw)
64    for (x; Nx)
65    for (y; Ny)
66    for (z; Nz)
[c7625e0]67        wxyz[w][x][y][z] = getMagicNumber(w, x, y, z);
68}
69
[6e50a6b]70forall( [N]
[c7625e0]71      , S & | sized(S)
72      )
[6e50a6b]73float total1d_low( arpk(N, S, float, float ) & a ) {
[c7625e0]74    float total = 0.0f;
[6e50a6b]75    for (i; N)
[c7625e0]76        total += a[i];
77    return total;
78}
79
[a5e2682]80forall( [N], A & | ar(A, float, N) )
[c7625e0]81float total1d_hi( A & a ) {
82    float total = 0.0f;
[a5e2682]83    for (i; N)
[c7625e0]84        total += a[i];
85    return total;
86}
87
[b9dae14c]88forall( [Nw], [Nx], [Ny], [Nz] )
[c7625e0]89void 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;
[6e50a6b]100    for (i; Nw)
[c7625e0]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
[1d71208]107    result = total1d_low( wxyz[all, slice_ix, slice_ix, slice_ix] );
[63a4b92]108    printf("result Ws [,,,]    lo = %f\n", result);
[c7625e0]109
110    result = total1d_hi( wxyz[all][slice_ix][slice_ix][slice_ix] );
111    printf("result Ws [][][][] hi = %f\n", result);
112
[1d71208]113    result = total1d_hi( wxyz[all, slice_ix, slice_ix, slice_ix] );
[63a4b92]114    printf("result Ws [,,,]    hi = %f\n", result);
[c7625e0]115
116    // summing across X, with w=y=z=1
117
118    expect = 0;
[6e50a6b]119    for (i; Nx)
[c7625e0]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
[1d71208]126    result = total1d_low( wxyz[slice_ix, all, slice_ix, slice_ix] );
[63a4b92]127    printf("result Xs [,,,]    lo = %f\n", result);
[c7625e0]128
129    result = total1d_hi( wxyz[slice_ix][all][slice_ix][slice_ix] );   
130    printf("result Xs [][][][] hi = %f\n", result);
131
[1d71208]132    result = total1d_hi( wxyz[slice_ix, all, slice_ix, slice_ix] );
[63a4b92]133    printf("result Xs [,,,]    hi = %f\n", result);
[c7625e0]134
135}
136
137const size_t  KW = 3,  KX = 4,  KY = 5,  KZ = 6;
138
139int main() {
140
141    typesTest  (           ztag(KX), ztag(KY), ztag(KZ) );
142    runtimeTest( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) );
143}
Note: See TracBrowser for help on using the repository browser.