double spectral_game(int n) { double *A; double u[n] __attribute__ ((aligned (16))); double v[n] __attribute__ ((aligned (16))); int i, j; /* Aligned allocation. */ /* A = (double *)malloc(n*n*sizeof(double)); */ if ( posix_memalign( (void **)&A , 4*sizeof(double) , sizeof(double) * n * n ) != 0 ) { printf( "spectral_game:%i: call to posix_memalign failed.\n" , __LINE__ ); abort(); } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { A[i*n+j] = Ac(i, j); } } for (i = 0; i < n; i++) { u[i] = 1.0; } for (i = 0; i < 10; i++) { AvA(n, A, u, v); AvA(n, A, v, u); } free(A); return sqrt(dot_product2(n, u, v) / dot_product2(n, v, v)); }
Vector<value_type> lin_solve(Matrix<value_type> const & A, Vector<value_type> const & bin) { //Create A=QR if(A.dimension().first > A.dimension().second) return lin_solve(A.trans()*A,A.trans()*bin); Matrix<value_type> Ac(std::max(A.dimension().first,A.dimension().second),A.dimension().second); Ac = A; QR_Givens<value_type> qr(Ac); /*std::cout << "A:\n " << A << " b: " << bin << "\n\n" ; std::cout << "Q: " << qr.get_q() << " R: " << qr.get_r() << "\n"; std::cout << "a=QR: " << qr.get_q() * qr.get_r() << "\n";*/ // calc b=QT*bin Vector<value_type> b = qr.get_q().trans()*bin; //std::cout << "Qb: \n" << b << "\n\n"; // backtrack Rx=b Vector<value_type> x(A.dimension().second); // If check if zerolines for overdefined size_type dim1 = A.dimension().first, dim2 = A.dimension().second; for(size_type i=dim1-1;i!=0;--i) if(qr.get_r().is_zero(i)) { x[i] = 1.0; //std::cout << "found zeroline\n"; } else { dim1 = i+1; break; } if(dim1 < dim2) { //=> extend R to nxn and set k xs to 1 and beging at n-k line in backtracking for(size_type i = dim1; i<dim2;++i) { x[i] = 1.0; } } // real backtracking: for(size_type i = dim1-1;;--i) { x[i] = b[i]; for(size_type j = i+1;j<dim2;++j) { x[i] -= qr.get_r()[i][j]*x[j]; } x[i]/= qr.get_r()[i][i]; if(i==0) break; } //std::cout << "x: \n" << x << "\n"; return x; }
long sprGetCol() { long j, i; sparse_int_t *ir = new sparse_int_t[10]; sparse_int_t *jc = new sparse_int_t[4]; real_t *val = new real_t[10]; real_t *col = new real_t[4]; /* Test matrix: * * [ 0 3 6 ] * [ 1 0 7 ] * [ 2 0 8 ] * [ 0 4 9 ] * [ 0 5 10 ] */ jc[0] = 0; jc[1] = 2; jc[2] = 5; jc[3] = 10; ir[0] = 1; ir[1] = 2; ir[2] = 0; ir[3] = 3; ir[4] = 4; ir[5] = 0; ir[6] = 1; ir[7] = 2; ir[8] = 3; ir[9] = 4; for (i = 0; i < 10; i++) val[i] = 1.0+i; SparseMatrix Ac(5, 3, ir, jc, val); real_t *Acv = Ac.full(); // row major format SparseMatrixRow A(5, 3, 3, Acv); delete[] Acv; Ac.free (); // or delete[] val,jc,ir; Indexlist rows(4); rows.addNumber(2); rows.addNumber(4); rows.addNumber(3); rows.addNumber(0); /* Indexed matrix: * * [ 2 0 8 ] * [ 0 5 10 ] * [ 0 4 9 ] * [ 0 3 6 ] */ for (j = 0; j < 3; j++) { fprintf(stdFile, "Column %ld:\n", j); A.getCol(j, &rows, 1.0, col); for (i = 0; i < 4; i++) fprintf(stdFile, " %3.0f\n", col[i]); } delete[] col; A.free (); // or delete[] val,jc,ir; return 0; }
long sprTimes() { long i; sparse_int_t *ir = new sparse_int_t[10]; sparse_int_t *jc = new sparse_int_t[6]; real_t *val = new real_t[10]; real_t *x = new real_t[5*2]; real_t *y = new real_t[3*2]; real_t Ax[] = {-23, -11, -26, 42, 74, 99}; real_t ATy[] = {-63, -69, -222, -423, -359, 272, 126, 663, 1562, 1656}; real_t err = 0.0; for (i = 0; i < 10; i++) x[i] = -4.0+i; /* Test matrix: * * [ 0 3 4 6 0 ] * [ 1 0 0 7 9 ] * [ 2 0 5 8 10 ] */ jc[0] = 0; jc[1] = 2; jc[2] = 3; jc[3] = 5; jc[4] = 8; jc[5] = 10; ir[0] = 1; ir[1] = 2; ir[2] = 0; ir[3] = 0; ir[4] = 2; ir[5] = 0; ir[6] = 1; ir[7] = 2; ir[8] = 1; ir[9] = 2; for (i = 0; i < 10; i++) val[i] = 1.0+i; SparseMatrix Ac(3, 5, ir, jc, val); // reference to ir, jc, val real_t *Acv = Ac.full(); // row major format SparseMatrixRow A(3, 5, 5, Acv); delete[] Acv; Ac.free (); // or delete[] val,jc,ir; A.times(2, 1.0, x, 5, 0.0, y, 3); for (i = 0; i < 6; i++) if (fabs(y[i] - Ax[i]) > err) err = fabs(y[i] - Ax[i]); fprintf(stdFile, "Error in sparse A*x: %9.2e\n", err); A.transTimes(2, 1.0, y, 3, 0.0, x, 5); err = 0.0; for (i = 0; i < 10; i++) if (fabs(x[i] - ATy[i]) > err) err = fabs(x[i] - ATy[i]); fprintf(stdFile, "Error in sparse A'*x: %9.2e\n", err); A.free (); // or delete[] val,ir,jc delete[] y; delete[] x; return 0; }
long sprGetRow() { long j, i; sparse_int_t *ir = new sparse_int_t[10]; sparse_int_t *jc = new sparse_int_t[6]; real_t *val = new real_t[10]; real_t *row = new real_t[4]; /* Test matrix: * * [ 0 3 4 6 0 ] * [ 1 0 0 7 9 ] * [ 2 0 5 8 10 ] */ jc[0] = 0; jc[1] = 2; jc[2] = 3; jc[3] = 5; jc[4] = 8; jc[5] = 10; ir[0] = 1; ir[1] = 2; ir[2] = 0; ir[3] = 0; ir[4] = 2; ir[5] = 0; ir[6] = 1; ir[7] = 2; ir[8] = 1; ir[9] = 2; for (i = 0; i < 10; i++) val[i] = 1.0+i; SparseMatrix Ac(3, 5, ir, jc, val); real_t *Acv = Ac.full(); // row major format SparseMatrixRow A(3, 5, 5, Acv); delete[] Acv; Ac.free (); // or delete[] val,jc,ir; Indexlist cols(4); cols.addNumber(2); cols.addNumber(4); cols.addNumber(3); cols.addNumber(1); /* Indexed matrix: * * [ 4 0 6 3 ] * [ 0 9 7 0 ] * [ 5 10 8 0 ] */ for (j = 0; j < 3; j++) { A.getRow(j, &cols, 1.0, row); for (i = 0; i < 4; i++) fprintf(stdFile, " %3.0f", row[i]); fprintf(stdFile, "\n"); } delete[] row; A.free (); return 0; }
int main() { const int sz=7; CArray A(sz); A(0) = complex<float>(1,2); A(1) = complex<float>(3,4); Array<float,1> Ar = real(A); BZTEST(int(Ar(0)) == 1 && int(Ar(1)) == 3); Array<float,1> Ai = imag(A); BZTEST(int(Ai(0)) == 2 && int(Ai(1)) == 4); CArray Ac(sz); Ac = conj(A); BZTEST(Ac(0) == complex<float>(1,-2)); BZTEST(Ac(1) == complex<float>(3,-4)); Array<float,1> Ab(sz); Ab = abs(A); BZTEST(fabs(Ab(0) - 2.236068) < eps); BZTEST(fabs(Ab(1) - 5.0) < eps); Ab = arg(A); BZTEST(fabs(Ab(0) - atan(2.0)) < eps); BZTEST(fabs(Ab(1) - atan(4.0/3.0)) < eps); Array<float,1> r(sz), theta(sz); r(0) = 4.0f; r(1) = 15.0f; theta(0) = float(3.141592/3.0); theta(1) = float(3.0*3.141592/2.0); Ac = blitz::polar(r,theta); BZTEST(fabs(real(Ac(0)) - 2) < eps); BZTEST(fabs(imag(Ac(0)) - 3.4641012) < eps); BZTEST(fabs(real(Ac(1)) - 0.0) < eps); BZTEST(fabs(imag(Ac(1)) + 15.0) < eps); Array<complex<long double>,1> A11(5),B11(5),C11(5); A11=1,2,3,4,5; B11=1,2,3,4,5; C11=A11+B11; BZTEST(fabs(real(C11(0)) - 2.) < eps); C11=A11/B11; BZTEST(fabs(real(C11(1)) - 1.) < eps); C11=1.0l/A11; BZTEST(fabs(real(C11(2)) - 1/3.) < eps); C11=A11/1.0l; BZTEST(fabs(real(C11(3)) - 4.) < eps); C11=complex<long double>(0,1)/A11; BZTEST(fabs(imag(C11(4)) - 1/5.) < eps); C11=A11/complex<long double>(0,1); BZTEST(fabs(imag(C11(0)) - -1.) < eps); return 0; }
long sprIndTimes() { const long N = 4; long i, j; long nRows = 2 * N + 1; long nCols = N; long nnz = 3 * N; sparse_int_t *ir = new sparse_int_t[nnz]; sparse_int_t *jc = new sparse_int_t[nCols+1]; real_t *val = new real_t[nnz]; real_t *xc = new real_t[3*2]; real_t *yc = new real_t[4*2]; real_t Ax[] = {0.31, 0.05, 0.06, 0.30, 0.76, 0.20, 0.24, 0.60}; real_t ATy[] = {0.278, 0.000, 0.548, 0.776, 0.000, 1.208}; Indexlist rows(4), cols(3), allcols(nCols); rows.addNumber(2); rows.addNumber(4); rows.addNumber(3); rows.addNumber(0); cols.addNumber(1); cols.addNumber(3); cols.addNumber(0); for (i = 0; i < nCols; i++) allcols.addNumber(i); // build test matrix for (i = 0; i <= N; i++) jc[i] = 3*i; for (j = 0; j < N; j++) for (i = 0; i < 3; i++) { ir[j*3+i] = 2*j + i; val[j*3+i] = 1.0 - 0.1 * (j*3+i); } SparseMatrix Ac(nRows, nCols, ir, jc, val); real_t *Acv = Ac.full(); // row major format SparseMatrixRow A(nRows, nCols, nCols, Acv); delete[] Acv; Ac.free (); // or delete[] val,jc,ir; fprintf(stdFile, "Test matrix A =\n"); for (j = 0; j < nRows; j++) { A.getRow(j, &allcols, 1.0, xc); for (i = 0; i < nCols; i++) fprintf(stdFile, "%6.2f", xc[i]); fprintf(stdFile, "\n"); } for (i = 0; i < 6; i++) xc[i] = (1.0 + i) * 0.1; A.times(&rows, &cols, 2, 1.0, xc, 3, 0.0, yc, 4, BT_TRUE); real_t err = 0.0; for (i = 0; i < 8; i++) if (fabs(yc[i] - Ax[i]) > err) err = fabs(yc[i] - Ax[i]); fprintf(stdFile, "Error in sparse indexed A*x: %9.2e\n", err); A.transTimes(&rows, &cols, 2, 1.0, yc, 4, 0.0, xc, 3); for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) fprintf(stdFile, "%6.2f", ATy[i + j*3]); fprintf(stdFile, "\n"); } for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) fprintf(stdFile, "%6.2f", xc[i + j*3]); fprintf(stdFile, "\n"); } err = 0.0; for (i = 0; i < 6; i++) if (fabs(xc[i] - ATy[i]) > err) err = fabs(xc[i] - ATy[i]); fprintf(stdFile, "Error in sparse indexed A'*y: %9.2e\n", err); delete[] xc; delete[] yc; A.free (); return 0; }