inline double squared_distance(const Eigen::Matrix<double, R1, C1>& v1, const Eigen::Matrix<double, R2, C2>& v2) { check_vector("squared_distance", "v1", v1); check_vector("squared_distance", "v2", v2); check_matching_sizes("squared_distance", "v1", v1, "v2", v2); return (v1.transpose()-v2).squaredNorm(); }
inline fvar<T> squared_distance(const Eigen::Matrix<double, R, C>& v1, const Eigen::Matrix<fvar<T>, R, C>& v2) { check_vector("squared_distance", "v1", v1); check_vector("squared_distance", "v2", v2); check_matching_sizes("squared_distance", "v1", v1, "v2", v2); Eigen::Matrix<fvar<T>, R, C> v3 = subtract(v1, v2); return dot_self(v3); }
inline fvar<T> squared_distance(const Eigen::Matrix<fvar<T>, R1, C1>& v1, const Eigen::Matrix<double, R2, C2>& v2) { check_vector("squared_distance", "v1", v1); check_vector("squared_distance", "v2", v2); check_matching_sizes("squared_distance", "v1", v1, "v2", v2); Eigen::Matrix<double, R1, C1> t_v2 = v2.transpose(); Eigen::Matrix<fvar<T>, R1, C1> v3 = subtract(v1, t_v2); return dot_self(v3); }
int check_and_set_bank_swizzle(int max_slots, int *slots) { struct alu_bank_swizzle bs; int i; for (i = 0; i < max_slots; i++) { init_bank_swizzle(&bs); if (slots[i]) check_vector(&bs); } }
bool check_vector(char const * name, std::vector<double> const & want, std::vector<double> const & have, double precision, std::ostream & msg) { jspace::Vector ww(want.size()); memcpy(ww.data(), &want[0], want.size() * sizeof(double)); jspace::Vector hh(have.size()); memcpy(hh.data(), &have[0], have.size() * sizeof(double)); return check_vector(name, ww, hh, precision, msg); }
Value SYS_copy_vector(Value arg) { AbstractVector* v1 = check_vector(arg); INDEX length = v1->length(); AbstractVector* v2 = the_vector(the_symbol(S_make_array)->function()->execute(make_unsigned_fixnum(length), K_element_type, v1->element_type())); for (INDEX i = length; i-- > 0;) v2->aset(i, v1->aref(i)); return make_value(v2); }
unsigned long Array_T::set_initial_contents(unsigned long axis, unsigned long rank, unsigned long dims[], Value contents, unsigned long index) { if (rank == 0) { if (index < _total_size) _data[index] = contents; else { signal_lisp_error("Bad initial contents for array."); // not reached return 0; } ++index; } else { unsigned long dim = dims[0]; if (dim != length(contents)) { signal_lisp_error("Bad initial contents for array."); // Not reached. return 0; } unsigned long * new_dims = (unsigned long *) GC_malloc_atomic((rank - 1) * sizeof(unsigned long)); for (unsigned long i = 1; i < rank; i++) new_dims[i - 1] = dims[i]; if (listp(contents)) { for (unsigned long i = length(contents); i-- > 0;) { Value content = car(contents); index = set_initial_contents(axis + 1, rank - 1, new_dims, content, index); contents = xcdr(contents); } } else { AbstractVector * v = check_vector(contents); const unsigned long length = v->length(); for (unsigned long i = 0; i < length; i++) { Value content = v->aref(i); index = set_initial_contents(axis + 1, rank - 1, new_dims, content, index); } } } return index; }
void run_test_a_y(perf_arg_t * para, char* funcname[], a_y_func_t test_func[], a_y_func_t ref_func[], double * flops_per_elem) { VML_INT start=para->start; VML_INT end=para->end; VML_INT step=para->step; double mflops=0.0; double time=0.0, start_time, end_time; int iscomplex = (para->fp_type & 0x2) >> 1; int isdouble = (para->fp_type & 0x1); int result=0; char * result_str; int failed_count=0; VML_INT i; VML_TEST_LOG("\n"); VML_TEST_LOG("Func\tN\tTime(s)\t\tResult\n"); init_rand(end, para->a, iscomplex, isdouble); memcpy(para->ref_a, para->a, end * para->element_size * para->compose_size); for(i=start; i<=end; i+=step) { mflops=flops_per_elem[para->fp_type] * i; //need to clean cache flush_cache(para->flushcache); start_time=getRealTime(); test_func[para->fp_type](i, para->a, para->y); end_time=getRealTime(); time=end_time-start_time; mflops=mflops/(double)(1000000)/time; ref_func[para->fp_type](i, para->ref_a, para->ref_y); //check result=check_vector(i, para->a, para->ref_y, para->y, para->eps, iscomplex, isdouble); if(result==0){ result_str=STR_PASS; }else if(result==1){ result_str=STR_WARN; }else{ result_str=STR_ERR; failed_count++; } VML_TEST_LOG("%s\t%d\t%e\t%s\n", funcname[para->fp_type], i, time, result_str); } if(failed_count>0) CTEST_ERR("Result failed!\n"); }
/* ---------------------------------------------------------------------- * Extra ScaleAddI tests for sparse matrices: * A should not contain values on the diagonal, nor should it contain * sufficient storage to add those in * y should already equal A*x * --------------------------------------------------------------------*/ int Test_SUNMatScaleAddI2(SUNMatrix A, N_Vector x, N_Vector y) { int failure; SUNMatrix B, C, D; N_Vector w, z; realtype tol=100*UNIT_ROUNDOFF; /* create clones for test */ B = SUNMatClone(A); z = N_VClone(x); w = N_VClone(x); /* test 1: add I to a matrix with insufficient storage */ failure = SUNMatCopy(A, B); if (failure) { printf(">>> FAILED test -- SUNMatCopy returned %d \n", failure); SUNMatDestroy(B); N_VDestroy(z); N_VDestroy(w); return(1); } failure = SUNMatScaleAddI(NEG_ONE, B); /* B = I-A */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAddI returned %d \n", failure); SUNMatDestroy(B); N_VDestroy(z); N_VDestroy(w); return(1); } failure = SUNMatMatvec(B, x, z); if (failure) { printf(">>> FAILED test -- SUNMatMatvec returned %d \n", failure); SUNMatDestroy(B); N_VDestroy(z); N_VDestroy(w); return(1); } N_VLinearSum(ONE,x,NEG_ONE,y,w); failure = check_vector(z, w, tol); if (failure) { printf(">>> FAILED test -- SUNMatScaleAddI2 check 1 \n"); printf("\nA =\n"); SUNSparseMatrix_Print(A,stdout); printf("\nB =\n"); SUNSparseMatrix_Print(B,stdout); printf("\nz =\n"); N_VPrint_Serial(z); printf("\nw =\n"); N_VPrint_Serial(w); SUNMatDestroy(B); N_VDestroy(z); N_VDestroy(w); return(1); } else { printf(" PASSED test -- SUNMatScaleAddI2 check 1 \n"); } /* test 2: add I to a matrix with sufficient but misplaced storage */ C = SUNMatClone(A); failure = SUNSparseMatrix_Reallocate(C, SM_NNZ_S(A)+SM_ROWS_S(A)); failure = SUNMatCopy(A, C); if (failure) { printf(">>> FAILED test -- SUNMatCopy returned %d \n", failure); SUNMatDestroy(B); SUNMatDestroy(C); N_VDestroy(z); N_VDestroy(w); return(1); } failure = SUNMatScaleAddI(NEG_ONE, C); /* C = I-A */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAddI returned %d \n", failure); SUNMatDestroy(B); SUNMatDestroy(C); N_VDestroy(z); N_VDestroy(w); return(1); } failure = SUNMatMatvec(C, x, z); if (failure) { printf(">>> FAILED test -- SUNMatMatvec returned %d \n", failure); SUNMatDestroy(B); SUNMatDestroy(C); N_VDestroy(z); N_VDestroy(w); return(1); } N_VLinearSum(ONE,x,NEG_ONE,y,w); failure = check_vector(z, w, tol); if (failure) { printf(">>> FAILED test -- SUNMatScaleAddI2 check 2 \n"); printf("\nA =\n"); SUNSparseMatrix_Print(A,stdout); printf("\nC =\n"); SUNSparseMatrix_Print(C,stdout); printf("\nz =\n"); N_VPrint_Serial(z); printf("\nw =\n"); N_VPrint_Serial(w); SUNMatDestroy(B); SUNMatDestroy(C); N_VDestroy(z); N_VDestroy(w); return(1); } else { printf(" PASSED test -- SUNMatScaleAddI2 check 2 \n"); } /* test 3: add I to a matrix with appropriate structure already in place */ D = SUNMatClone(C); failure = SUNMatCopy(C, D); if (failure) { printf(">>> FAILED test -- SUNMatCopy returned %d \n", failure); SUNMatDestroy(B); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(z); N_VDestroy(w); return(1); } failure = SUNMatScaleAddI(NEG_ONE, D); /* D = A */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAddI returned %d \n", failure); SUNMatDestroy(B); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(z); N_VDestroy(w); return(1); } failure = SUNMatMatvec(D, x, z); if (failure) { printf(">>> FAILED test -- SUNMatMatvec returned %d \n", failure); SUNMatDestroy(B); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(z); N_VDestroy(w); return(1); } failure = check_vector(z, y, tol); if (failure) { printf(">>> FAILED test -- SUNMatScaleAddI2 check 3 \n"); printf("\nA =\n"); SUNSparseMatrix_Print(A,stdout); printf("\nD =\n"); SUNSparseMatrix_Print(D,stdout); printf("\nz =\n"); N_VPrint_Serial(z); printf("\ny =\n"); N_VPrint_Serial(y); SUNMatDestroy(B); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(z); N_VDestroy(w); return(1); } else { printf(" PASSED test -- SUNMatScaleAddI2 check 3 \n"); } SUNMatDestroy(B); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(z); N_VDestroy(w); return(0); }
/* ---------------------------------------------------------------------- * Extra ScaleAdd tests for sparse matrices: * A and B should have different sparsity patterns, and neither should * contain sufficient storage to for their sum * y should already equal A*x * z should already equal B*x * --------------------------------------------------------------------*/ int Test_SUNMatScaleAdd2(SUNMatrix A, SUNMatrix B, N_Vector x, N_Vector y, N_Vector z) { int failure; SUNMatrix C, D, E; N_Vector u, v; realtype tol=100*UNIT_ROUNDOFF; /* create clones for test */ C = SUNMatClone(A); u = N_VClone(y); v = N_VClone(y); /* test 1: add A to B (output must be enlarged) */ failure = SUNMatCopy(A, C); /* C = A */ if (failure) { printf(">>> FAILED test -- SUNMatCopy returned %d \n", failure); SUNMatDestroy(C); N_VDestroy(u); N_VDestroy(v); return(1); } failure = SUNMatScaleAdd(ONE, C, B); /* C = A+B */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAdd returned %d \n", failure); SUNMatDestroy(C); N_VDestroy(u); N_VDestroy(v); return(1); } failure = SUNMatMatvec(C, x, u); /* u = Cx = Ax+Bx */ if (failure) { printf(">>> FAILED test -- SUNMatMatvec returned %d \n", failure); SUNMatDestroy(C); N_VDestroy(u); N_VDestroy(v); return(1); } N_VLinearSum(ONE,y,ONE,z,v); /* v = y+z */ failure = check_vector(u, v, tol); /* u ?= v */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAdd2 check 1 \n"); printf("\nA =\n"); SUNSparseMatrix_Print(A,stdout); printf("\nB =\n"); SUNSparseMatrix_Print(B,stdout); printf("\nC =\n"); SUNSparseMatrix_Print(C,stdout); printf("\nx =\n"); N_VPrint_Serial(x); printf("\ny =\n"); N_VPrint_Serial(y); printf("\nz =\n"); N_VPrint_Serial(z); printf("\nu =\n"); N_VPrint_Serial(u); printf("\nv =\n"); N_VPrint_Serial(v); SUNMatDestroy(C); N_VDestroy(u); N_VDestroy(v); return(1); } else { printf(" PASSED test -- SUNMatScaleAdd2 check 1 \n"); } /* test 2: add A to a matrix with sufficient but misplaced storage */ D = SUNMatClone(A); failure = SUNSparseMatrix_Reallocate(D, SM_NNZ_S(A)+SM_NNZ_S(B)); failure = SUNMatCopy(A, D); /* D = A */ if (failure) { printf(">>> FAILED test -- SUNMatCopy returned %d \n", failure); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(u); N_VDestroy(v); return(1); } failure = SUNMatScaleAdd(ONE, D, B); /* D = A+B */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAdd returned %d \n", failure); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(u); N_VDestroy(v); return(1); } failure = SUNMatMatvec(D, x, u); /* u = Cx = Ax+Bx */ if (failure) { printf(">>> FAILED test -- SUNMatMatvec returned %d \n", failure); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(u); N_VDestroy(v); return(1); } N_VLinearSum(ONE,y,ONE,z,v); /* v = y+z */ failure = check_vector(u, v, tol); /* u ?= v */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAdd2 check 2 \n"); printf("\nA =\n"); SUNSparseMatrix_Print(A,stdout); printf("\nB =\n"); SUNSparseMatrix_Print(B,stdout); printf("\nD =\n"); SUNSparseMatrix_Print(D,stdout); printf("\nx =\n"); N_VPrint_Serial(x); printf("\ny =\n"); N_VPrint_Serial(y); printf("\nz =\n"); N_VPrint_Serial(z); printf("\nu =\n"); N_VPrint_Serial(u); printf("\nv =\n"); N_VPrint_Serial(v); SUNMatDestroy(C); SUNMatDestroy(D); N_VDestroy(u); N_VDestroy(v); return(1); } else { printf(" PASSED test -- SUNMatScaleAdd2 check 2 \n"); } /* test 3: add A to a matrix with the appropriate structure already in place */ E = SUNMatClone(C); failure = SUNMatCopy(C, E); /* E = A + B */ if (failure) { printf(">>> FAILED test -- SUNMatCopy returned %d \n", failure); SUNMatDestroy(C); SUNMatDestroy(D); SUNMatDestroy(E); N_VDestroy(u); N_VDestroy(v); return(1); } failure = SUNMatScaleAdd(NEG_ONE, E, B); /* E = -A */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAdd returned %d \n", failure); SUNMatDestroy(C); SUNMatDestroy(D); SUNMatDestroy(E); N_VDestroy(u); N_VDestroy(v); return(1); } failure = SUNMatMatvec(E, x, u); /* u = Ex = -Ax */ if (failure) { printf(">>> FAILED test -- SUNMatMatvec returned %d \n", failure); SUNMatDestroy(C); SUNMatDestroy(D); SUNMatDestroy(E); N_VDestroy(u); N_VDestroy(v); return(1); } N_VLinearSum(NEG_ONE,y,ZERO,z,v); /* v = -y */ failure = check_vector(u, v, tol); /* v ?= u */ if (failure) { printf(">>> FAILED test -- SUNMatScaleAdd2 check 3 \n"); printf("\nA =\n"); SUNSparseMatrix_Print(A,stdout); printf("\nB =\n"); SUNSparseMatrix_Print(B,stdout); printf("\nC =\n"); SUNSparseMatrix_Print(C,stdout); printf("\nE =\n"); SUNSparseMatrix_Print(E,stdout); printf("\nx =\n"); N_VPrint_Serial(x); printf("\ny =\n"); N_VPrint_Serial(y); printf("\nu =\n"); N_VPrint_Serial(u); printf("\nv =\n"); N_VPrint_Serial(v); SUNMatDestroy(C); SUNMatDestroy(D); SUNMatDestroy(E); N_VDestroy(u); N_VDestroy(v); return(1); } else { printf(" PASSED test -- SUNMatScaleAdd2 check 3 \n"); } SUNMatDestroy(C); SUNMatDestroy(D); SUNMatDestroy(E); N_VDestroy(u); N_VDestroy(v); return(0); }