double CRateMonitor::GetRate(void) const { if (m_Rate > 0.0) return m_Rate; size_t n = m_Data.size(); if (n < 2) return GetPace(); list<TMark> gaps; if (n > 2) { TMark prev = m_Data.front(); list<TMark>::const_iterator it = m_Data.begin(); _ASSERT(prev.first - m_Data.back().first > kSpan); for (++it; it != m_Data.end(); ++it) { TMark next = *it; double dt = prev.second - next.second; if (dt < kSpan) { #ifdef DEBUG_RATE_MONITOR cout << "dt = " << dt << ",\td =" << (kSpan - dt) << ",\tn = " << distance(m_Data.begin(), it) << endl; #endif //DEBUG_RATE_MONITOR _DEBUG_ARG(list<TMark>::const_iterator beg = m_Data.begin()); _ASSERT(it == ++beg); continue; } gaps.push_back(make_pair(prev.first - next.first, dt)); prev = next; } } else { double dt = m_Data.front().second - m_Data.back().second; if (dt < kSpan) return GetPace(); gaps.push_back(make_pair(m_Data.front().first - m_Data.back ().first, dt)); } _ASSERT(!gaps.empty() && !m_Rate); double weight = 1.0; for (;;) { double rate = gaps.front().first / gaps.front().second; gaps.pop_front(); if (gaps.empty()) { m_Rate += rate * weight; break; } double w = weight * kWeight; m_Rate += rate * w; weight -= w; } return m_Rate; }
Uint4 SplitQuery_CalculateNumChunks(EBlastProgramType program, size_t *chunk_size, size_t concatenated_query_length, size_t num_queries) { if ( !SplitQuery_ShouldSplit(program, *chunk_size, concatenated_query_length, num_queries)) { _TRACE("Not splitting queries"); return 1; } size_t overlap_size = SplitQuery_GetOverlapChunkSize(program); Uint4 num_chunks = 0; _DEBUG_ARG(size_t target_chunk_size = *chunk_size); // For translated queries the chunk size should be divisible by CODON_LENGTH if (Blast_QueryIsTranslated(program)) { size_t chunk_size_delta = ((*chunk_size) % CODON_LENGTH); *chunk_size -= chunk_size_delta; _ASSERT((*chunk_size % CODON_LENGTH) == 0); } // Fix for small query size if ((*chunk_size) > overlap_size) { num_chunks = concatenated_query_length / ((*chunk_size) - overlap_size); } // Only one chunk, just return; if (num_chunks <= 1) { *chunk_size = concatenated_query_length; return 1; } // Re-adjust the chunk_size to make load even if (!Blast_QueryIsTranslated(program)) { *chunk_size = (concatenated_query_length + (num_chunks - 1) * overlap_size) / num_chunks; // Round up only if this will not decrease the number of chunks if (num_chunks < (*chunk_size) - overlap_size ) (*chunk_size)++; } _TRACE("Number of chunks: " << num_chunks << "; " "Target chunk size: " << target_chunk_size << "; " "Returned chunk size: " << *chunk_size); return num_chunks; }