DAPPLE Example: tester
Source code:
// @TITLE "tester.cc -- test program"
//
// tester -- test driver for DAPPLE
//
// David Kotz 1994
// $Id: tester.cc,v 2.12 94/08/29 23:16:33 dfk SCOTT Locker: dfk $
#include
#include
#include "dapple.h"
const int N = 5; // Vectors are size N
const int rows = N; // Matrices are size N by M
const int cols = 4; // Matrices are size N by M
// which VP am I? useful for VP-specific math
const intVector VP(N, Identity);
// which row or column am I? useful for VP-specific math
const intMatrix VProw(rows, cols, IdentityR);
const intMatrix VPcol(rows, cols, IdentityC);
static int square(const int x) { return (x*x); }
int array[N] = {3, 4, 0, -3, 2};
int P_array[N] = {4, 2, 0, 1, 3}; // a permutation
int
main(int argc, char **argv)
{
intVector A(N, array), B(N, 4), C(N);
const intVector P(N, P_array);
intMatrix M(rows, cols);
int x;
boolean b;
cout << "Vector size is " << N << endl;
cout << "A: " << A << endl;
cout << "B: " << B << endl;
B = 3;
cout << "B = 3: " << B << endl;
C = apply(square, A);
cout << "C = apply(square, A): " << C << endl;
C = plus_scan(A);
cout << "C = plus_scan(A): " << C << endl;
C = max_scan(A);
cout << "C = max_scan(A): " << C << endl;
C = min_scan(A);
cout << "C = min_scan(A): " << C << endl;
cout << "booleanVector(A): " << booleanVector(A) << endl;
C = or_scan(booleanVector(A));
cout << "C = or_scan(booleanVector(A)): " << C << endl;
C = and_scan(booleanVector(A));
cout << "C = and_scan(booleanVector(A)): " << C << endl;
x = sum(A);
cout << "x = sum(A): ";
cout << x;
cout << endl;
b = any(A);
cout << "b = any(A): ";
cout << b;
cout << endl;
b = all(A);
cout << "b = all(A): ";
cout << b;
cout << endl;
x = n_nonzeros(A);
cout << "x = n_nonzeros(A): ";
cout << x;
cout << endl;
x = max_value(A);
cout << "x = max_value(A): ";
cout << x;
cout << endl;
x = min_value(A);
cout << "x = min_value(A): ";
cout << x;
cout << endl;
x = max_index(A);
cout << "x = max_index(A): ";
cout << x;
cout << endl;
x = min_index(A);
cout << "x = min_index(A): ";
cout << x;
cout << endl;
cout << "A: " << A << endl;
cout << "P: " << P << endl;
C = permute(A, P);
cout << "C = permute(A, P): " << C << endl;
C = shift(A, 1);
cout << "C = shift(A, 1): " << C << endl;
C = shift(A, -3);
cout << "C = shift(A, -3): " << C << endl;
C = shift(A, 10);
cout << "C = shift(A, 10): " << C << endl;
C = rotate(A, 1);
cout << "C = rotate(A, 1): " << C << endl;
C = rotate(A, -3);
cout << "C = rotate(A, -3): " << C << endl;
C = rotate(A, 5);
cout << "C = rotate(A, 5): " << C << endl;
C = rotate(A, -8);
cout << "C = rotate(A, -8): " << C << endl;
cout << "VP: " << VP << endl;
ifp (VP % 2 == 1)
C = VP * 2;
cout << "ifp(VP % 2) C = VP * 2: " << C << endl;
ifp (VP % 2 == 1) {
C = VP * 2;
ifp (C % 3 == 1)
C = 66;
else
C = 77;
}
cout << "ifp(VP % 2) ...: " << C << endl;
ifp (VP % 2 == 1)
C = rotate(VP, 2);
cout << "ifp(VP % 2) C = rotate(VP, 2): " << C << endl;
ifp (VP % 2 == 0)
C = rotate(VP, -1);
cout << "ifp(VP % 2 == 0) C = rotate(VP, -1): " << C << endl;
ifp (VP % 2 == 0)
C = shift(VP, -2);
cout << "ifp(VP % 2 == 0) C = shift(VP, -2): " << C << endl;
ifp (VP % 2 == 1)
C = shift(VP, 1);
cout << "ifp(VP % 2) C = shift(VP, 1): " << C << endl;
C = pack(A);
cout << "C = pack(A): " << C << endl;
C = A + B;
cout << "C = A + B: " << C << endl;
C = A + 4;
cout << "C = A + 4: " << C << endl;
C = 4 + A;
cout << "C = 4 + A: " << C << endl;
C = A - B;
cout << "C = A - B: " << C << endl;
C = A - 4;
cout << "C = A - 4: " << C << endl;
C = 4 - A;
cout << "C = 4 - A: " << C << endl;
C = A * B;
cout << "C = A * B: " << C << endl;
C = A * 4;
cout << "C = A * 4: " << C << endl;
C = 4 * A;
cout << "C = 4 * A: " << C << endl;
C = -A / B;
cout << "C = -A / B: " << C << endl;
C = +A / 4;
cout << "C = +A / 4: " << C << endl;
C = A + B - 45 / B;
cout << "C = A + B - 45 / B: " << C << endl;
C.store(array);
cout << "C.store(array): ";
cout << array[0];
for (int i = 1; i < N; i++)
cout << "\t" << array[i];
cout << endl;
B.load(array);
cout << "B.load(array): " << B << endl;
cout << "before ifp " << endl;
cout << "A: " << A << endl;
ifp (A % 2 == 0) {
A = B * VP / 3;
} else
A = 100;
cout << "after ifp " << endl;
cout << "A: " << A << endl;
cout << "B: " << B << endl;
cout << "C: " << C << endl;
C = B == C;
cout << "B == C: " << C << endl;
C = A < -B;
cout << "C = A < -B: " << C << endl;
B += 10;
cout << "B += 10: " << B << endl;
A /= 10;
A *= -3;
cout << "A /= 10; A *= -3: " << A << endl;
C = A++;
cout << "C = A++: " << C << endl;
cout << "A: " << A << endl;
C = --A;
cout << "C = --A: " << C << endl;
cout << "A: " << A << endl;
A += B;
cout << "A += B: " << A << endl;
C = A >= B;
cout << "C = A >= B: " << C << endl;
C = !(A >= B && -B != 9);
cout << "C = !(A >= B && -B != 9): " << C << endl;
C = (A >= B || 14);
cout << "C = (A >= B || 14): " << C << endl;
cout << "A: " << A << endl;
cout << "B: " << B << endl;
cout << "C: " << C << endl;
C = A += B;
cout << "C = A += B:" << endl;
cout << " A: " << A << endl;
cout << " B: " << B << endl;
cout << " C: " << C << endl;
cout << endl;
cout << "VProw:" << endl;
cout << VProw << endl;
cout << "VPcol:" << endl;
cout << VPcol << endl;
M = VProw * VPcol;
cout << "M = VProw * VPcol:" << endl;
cout << M << endl;
M = shift(VProw, -1, 0);
cout << "M = shift(VProw, -1, 0):" << endl;
cout << M << endl;
M = rotate(VPcol, 0, 2);
cout << "M = rotate(VPcol, 0, 2):" << endl;
cout << M << endl;
M = rotate(VProw, 2, 0);
cout << "M = rotate(VProw, 2, 0):" << endl;
cout << M << endl;
M = rotate(VPcol * VProw, 3, 2);
cout << "M = rotate(VPcol * VProw, 3, 2):" << endl;
cout << M << endl;
M = shift(VPcol * VProw, 3, -2);
cout << "M = shift(VPcol * VProw, 3, -2):" << endl;
cout << M << endl;
M = VProw * VPcol;
cout << "M = VProw * VPcol:" << endl;
cout << M << endl;
cout << "M[3]: " << M[3] << endl;
cout << "M[3][_]: " << M[3][_] << endl;
cout << "M[_][2]: " << M[_][2] << endl;
M[_][1] = A;
cout << "M[_][1] = A; M:" << endl;
cout << M << endl;
cout << "min_scan_rows(M):" << endl;
cout << min_scan_rows(M) << endl;
cout << "max_scan_cols(M):" << endl;
cout << max_scan_cols(M) << endl;
cout << "plus_scan_cols(M):" << endl;
cout << plus_scan_cols(M) << endl;
cout << "or_scan_cols(VProw % 2 == 1):" << endl;
cout << or_scan_cols(VProw % 2 == 1) << endl;
cout << "M[_][1] / 4: " << M[_][1] / 4 << endl;
cout << "4 / M[_][1]: " << 4 / M[_][1] << endl;
cout << "A / M[_][1]: " << A / M[_][1] << endl;
cout << "M[_][1] / A: " << M[_][1] / A << endl;
cout << "M[_][2] / M[_][1]: " << M[_][2] / M[_][1] << endl;
return(0);
}
Demonstration:
tester
Vector size is 5
A: 3 4 0 -3 2
B: 4 4 4 4 4
B = 3: 3 3 3 3 3
C = apply(square, A): 9 16 0 9 4
C = plus_scan(A): 0 3 7 7 4
C = max_scan(A): -2147483647 3 4 4 4
C = min_scan(A): 2147483647 3 3 0 -3
booleanVector(A): 1 1 0 1 1
C = or_scan(booleanVector(A)): 0 1 1 1 1
C = and_scan(booleanVector(A)): 1 1 1 0 0
x = sum(A): 6
b = any(A): 1
b = all(A): 0
x = n_nonzeros(A): 4
x = max_value(A): 4
x = min_value(A): -3
x = max_index(A): 1
x = min_index(A): 3
A: 3 4 0 -3 2
P: 4 2 0 1 3
C = permute(A, P): 0 -3 4 2 3
C = shift(A, 1): 0 3 4 0 -3
C = shift(A, -3): -3 2 0 0 0
C = shift(A, 10): 0 0 0 0 0
C = rotate(A, 1): 2 3 4 0 -3
C = rotate(A, -3): -3 2 3 4 0
C = rotate(A, 5): 3 4 0 -3 2
C = rotate(A, -8): -3 2 3 4 0
VP: 0 1 2 3 4
ifp(VP % 2) C = VP * 2: -3 2 3 6 0
ifp(VP % 2) ...: -3 77 3 77 0
ifp(VP % 2) C = rotate(VP, 2): -3 4 3 1 0
ifp(VP % 2 == 0) C = rotate(VP, -1): 1 4 3 1 0
ifp(VP % 2 == 0) C = shift(VP, -2): 2 4 4 1 0
ifp(VP % 2) C = shift(VP, 1): 2 0 4 2 0
C = pack(A): 3 4 -3 2 0
C = A + B: 6 7 3 0 5
C = A + 4: 7 8 4 1 6
C = 4 + A: 7 8 4 1 6
C = A - B: 0 1 -3 -6 -1
C = A - 4: -1 0 -4 -7 -2
C = 4 - A: 1 0 4 7 2
C = A * B: 9 12 0 -9 6
C = A * 4: 12 16 0 -12 8
C = 4 * A: 12 16 0 -12 8
C = -A / B: -1 -1 0 1 0
C = +A / 4: 0 1 0 0 0
C = A + B - 45 / B: -9 -8 -12 -15 -10
C.store(array): -9 -8 -12 -15 -10
B.load(array): -9 -8 -12 -15 -10
before ifp
A: 3 4 0 -3 2
after ifp
A: 100 -2 -8 100 -13
B: -9 -8 -12 -15 -10
C: -9 -8 -12 -15 -10
B == C: 1 1 1 1 1
C = A < -B: 0 1 1 0 1
B += 10: 1 2 -2 -5 0
A /= 10; A *= -3: -30 0 0 -30 3
C = A++: -30 0 0 -30 3
A: -29 1 1 -29 4
C = --A: -30 0 0 -30 3
A: -30 0 0 -30 3
A += B: -29 2 -2 -35 3
C = A >= B: 0 1 1 0 1
C = !(A >= B && -B != 9): 1 0 0 1 0
C = (A >= B || 14): 1 1 1 1 1
A: -29 2 -2 -35 3
B: 1 2 -2 -5 0
C: 1 1 1 1 1
C = A += B:
A: -28 4 -4 -40 3
B: 1 2 -2 -5 0
C: -28 4 -4 -40 3
VProw:
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
VPcol:
0 1 2 3
0 1 2 3
0 1 2 3
0 1 2 3
0 1 2 3
M = VProw * VPcol:
0 0 0 0
0 1 2 3
0 2 4 6
0 3 6 9
0 4 8 12
M = shift(VProw, -1, 0):
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
0 0 0 0
M = rotate(VPcol, 0, 2):
2 3 0 1
2 3 0 1
2 3 0 1
2 3 0 1
2 3 0 1
M = rotate(VProw, 2, 0):
3 3 3 3
4 4 4 4
0 0 0 0
1 1 1 1
2 2 2 2
M = rotate(VPcol * VProw, 3, 2):
4 6 0 2
6 9 0 3
8 12 0 4
0 0 0 0
2 3 0 1
M = shift(VPcol * VProw, 3, -2):
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2 3 0 0
M = VProw * VPcol:
0 0 0 0
0 1 2 3
0 2 4 6
0 3 6 9
0 4 8 12
M[3]: 0 3 6 9
M[3][_]: 0 3 6 9
M[_][2]: 0 2 4 6 8
M[_][1] = A; M:
0 -28 0 0
0 4 2 3
0 -4 4 6
0 -40 6 9
0 3 8 12
min_scan_rows(M):
2147483647 0 -28 -28
2147483647 0 0 0
2147483647 0 -4 -4
2147483647 0 -40 -40
2147483647 0 0 0
max_scan_cols(M):
-2147483647 -2147483647 -2147483647 -2147483647
0 -28 0 0
0 4 2 3
0 4 4 6
0 4 6 9
plus_scan_cols(M):
0 0 0 0
0 -28 0 0
0 -24 2 3
0 -28 6 9
0 -68 12 18
or_scan_cols(VProw % 2 == 1):
0 0 0 0
0 0 0 0
1 1 1 1
1 1 1 1
1 1 1 1
M[_][1] / 4: -7 1 -1 -10 0
4 / M[_][1]: 0 1 -1 0 1
A / M[_][1]: 1 1 1 1 1
M[_][1] / A: 1 1 1 1 1
M[_][2] / M[_][1]: 0 0 -1 0 2