inline Vector speed_test( void test(size_t size, size_t repeat), const Vector& size_vec , double time_min ) { // check that size_vec is a simple vector with size_t elements CheckSimpleVector<size_t, Vector>(); size_t n = size_vec.size(); Vector rate_vec(n); size_t i; for(i = 0; i < n; i++) { size_t size = size_vec[i]; size_t repeat = 1; double s0 = elapsed_seconds(); double s1 = elapsed_seconds(); while( s1 - s0 < time_min ) { repeat = 2 * repeat; s0 = elapsed_seconds(); test(size, repeat); s1 = elapsed_seconds(); } rate_vec[i] = (size_t)(.5 + repeat / (s1 - s0)); } return rate_vec; }
bool speed_test(void) { bool ok = true; // size of the test cases vector<size_t> size_vec(2); size_vec[0] = 40; size_vec[1] = 80; // minimum amount of time to run test double time_min = 0.5; // run the test cases vector<size_t> rate_vec(2); rate_vec = CppAD::speed_test(test, size_vec, time_min); // time per repeat loop (note counting setup or teardown) double time_0 = 1. / double(rate_vec[0]); double time_1 = 1. / double(rate_vec[1]); // for this case, time should be linear w.r.t size double check = double(size_vec[1]) * time_0 / double(size_vec[0]); double rel_diff = (check - time_1) / time_1; ok &= (std::fabs(rel_diff) <= .1); if( ! ok ) std::cout << std::endl << "rel_diff = " << rel_diff << std::endl; a.clear(); b.clear(); c.clear(); return ok; }
vector<double> ribo_model::build_rate_vec(rid_t t) { vector<double> rate_vec(codon_vec_len(t),0); // build elongation rate vector for (size_t i=0; i!=rate_vec.size(); ++i) rate_vec[i] = get_erate(model[t].codon_id_map[i]); // insert initiation rate at the beginning of rate vector rate_vec.insert(rate_vec.begin(), get_irate(t)); return rate_vec; }
void ribo_model::update_profile(const ribo_profile& rprofile, bool ignore_no_map, int nproc) { omp_set_num_threads(nproc); #pragma omp parallel for schedule(static) for (size_t t=0; t<rprofile.number_of_transcripts(); ++t) { if (ignore_no_map and rprofile.get_tot_count(t) == 0) continue; tmodel& m = get_model_ref(t); if (get_obj(t)<0) continue; vector<double> rate_vec(build_rate_vec(t)); double trate = compute_profile(rate_vec, m.profile); if (trate>0) set_trate(t, trate); else compute_translation_rate(t, rate_vec); compute_transcript_abundance(t, rprofile.get_read_assignments(t)); } }