static bool testNonzeroRandom (Field &F, unsigned int iterations) { int i; commentator().start ("Testing nonzero random elements", "testNonzeroRandom", iterations); bool ret = true; typename Field::Element x; typename Field::RandIter r (F); //NonzeroRandIter <Field, typename Field::RandIter> rp (F, r); Givaro::GeneralRingNonZeroRandIter <Field> rp (r); for (i = 0; i <(int) iterations; i++) { commentator().startIteration ((unsigned int)i); rp.random (x); ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION); report << "Element: "; F.write (report, x); report << endl; if (F.isZero (x)) { ret = false; commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR) << "ERROR: Element is zero" << endl; } commentator().stop ("done"); commentator().progress (); } commentator().stop (MSG_STATUS (ret), (const char *) 0, "testNonzeroRandom"); return ret; }
int main(int argc, char** argv) { size_t iter = 3; int q = 131071; size_t n = 1000; size_t k = 1000; size_t threshold = 64; bool up =true; std::string file = ""; Argument as[] = { { 'q', "-q Q", "Set the field characteristic (-1 for random).", TYPE_INT , &q }, { 'n', "-n N", "Set the dimension of the matrix C.", TYPE_INT , &n }, { 'k', "-k K", "Set the other dimension of the matrix A.", TYPE_INT , &k }, { 'u', "-u yes/no", "Updates an upper/lower triangular matrix.", TYPE_BOOL , &up }, { 'i', "-i R", "Set number of repetitions.", TYPE_INT , &iter }, { 't', "-t T", "Set the threshold to the base case.", TYPE_INT , &threshold }, END_OF_ARGUMENTS }; FFLAS::parseArguments(argc,argv,as); typedef Givaro::ModularBalanced<double> Field; typedef Field::Element Element; Field F(q); Field::Element * A, *C; FFLAS::Timer chrono; double time=0.0; FFLAS_UPLO uplo = up?FflasUpper:FflasLower; for (size_t i=0;i<=iter;++i){ A = fflas_new<Element>(n*k); size_t lda=k; C = fflas_new<Element>(n*n); size_t ldc=n; Field::RandIter G(F); RandomMatrix (F, n, k, A, k, G); RandomTriangularMatrix (F, n,n,uplo, FflasNonUnit, true, C, ldc, G); Field::Element_ptr D = FFLAS::fflas_new(F,k,1); Givaro::GeneralRingNonZeroRandIter<Field,Field::RandIter> nzG (G); for (size_t i=0; i<k; i++) nzG.random(D[i]); chrono.clear(); if (i) chrono.start(); fsyrk (F, uplo, FflasTrans, n, k, F.mOne, A, lda, D, 1, F.one, C, ldc, threshold); if (i) chrono.stop(); time+=chrono.usertime(); FFLAS::fflas_delete( A); } // ----------- // Standard output for benchmark - Alexis Breust 2014/11/14 #define CUBE(x) ((x)*(x)*(x)) std::cout << "Time: " << time / double(iter) << " Gflops: " << CUBE(double(n)/1000.)/ time * double(iter); FFLAS::writeCommandString(std::cout, as) << std::endl; return 0; }