@@ -278,6 +278,8 @@ void Graph::Construct(
278278 ram::MinimizerEngine minimizer_engine{thread_pool_, kmer_len, window_len};
279279
280280 if (stage_ == -5 ) { // find overlaps and create piles
281+ constexpr std::size_t kMaxNumOverlaps = 32 ;
282+
281283 for (const auto & it : sequences) {
282284 piles_.emplace_back (new Pile (it->id , it->inflated_len ));
283285 }
@@ -347,9 +349,9 @@ void Graph::Construct(
347349
348350 num_overlaps[i] = std::min (
349351 overlaps[i].size (),
350- static_cast <std:: size_t >( 16 ) );
352+ kMaxNumOverlaps );
351353
352- if (overlaps[i].size () < 16 ) {
354+ if (overlaps[i].size () < kMaxNumOverlaps ) {
353355 return ;
354356 }
355357
@@ -360,7 +362,10 @@ void Graph::Construct(
360362 });
361363
362364 std::vector<biosoup::Overlap> tmp;
363- tmp.insert (tmp.end (), overlaps[i].begin (), overlaps[i].begin () + 16 ); // NOLINT
365+ tmp.insert (
366+ tmp.end (),
367+ overlaps[i].begin (),
368+ overlaps[i].begin () + kMaxNumOverlaps );
364369 tmp.swap (overlaps[i]);
365370 },
366371 it->id ()));
@@ -442,66 +447,59 @@ void Graph::Construct(
442447 if (stage_ == -5 ) { // resolve chimeric sequences
443448 timer.Start ();
444449
445- while (true ) {
446- auto components = connected_components ();
447- for (const auto & it : components) {
448- std::vector<std::uint16_t > medians;
449- for (const auto & jt : it) {
450- medians.emplace_back (piles_[jt]->median ());
451- }
452- std::nth_element (
453- medians.begin (),
454- medians.begin () + medians.size () / 2 ,
455- medians.end ());
456- std::uint16_t median = medians[medians.size () / 2 ];
450+ std::vector<std::uint16_t > medians;
451+ for (const auto & it : piles_) {
452+ if (it->median () != 0 ) {
453+ medians.emplace_back (it->median ());
454+ }
455+ }
456+ std::nth_element (
457+ medians.begin (),
458+ medians.begin () + medians.size () / 2 ,
459+ medians.end ());
460+ std::uint16_t median = medians[medians.size () / 2 ];
457461
458- std::vector<std::future<void >> thread_futures;
459- for (const auto & jt : it) {
460- thread_futures.emplace_back (thread_pool_->Submit (
461- [&] (std::uint32_t i) -> void {
462- piles_[i]->ClearChimericRegions (median);
463- if (piles_[i]->is_invalid ()) {
464- std::vector<biosoup::Overlap>().swap (overlaps[i]);
465- }
466- },
467- jt));
468- }
469- for (const auto & it : thread_futures) {
470- it.wait ();
471- }
472- thread_futures.clear ();
462+ std::vector<std::future<void >> thread_futures;
463+ for (const auto & it : piles_) {
464+ if (it->is_invalid ()) {
465+ continue ;
473466 }
467+ thread_futures.emplace_back (thread_pool_->Submit (
468+ [&] (std::uint32_t i) -> void {
469+ piles_[i]->ClearChimericRegions (median);
470+ if (piles_[i]->is_invalid ()) {
471+ std::vector<biosoup::Overlap>().swap (overlaps[i]);
472+ }
473+ },
474+ it->id ()));
475+ }
476+ for (const auto & it : thread_futures) {
477+ it.wait ();
478+ }
474479
475- bool is_changed = false ;
476- for (std::uint32_t i = 0 ; i < overlaps.size (); ++i) {
477- std::uint32_t k = 0 ;
478- for (std::uint32_t j = 0 ; j < overlaps[i].size (); ++j) {
479- if (overlap_update (overlaps[i][j])) {
480- overlaps[i][k++] = overlaps[i][j];
481- } else {
482- is_changed = true ;
483- }
480+ for (std::uint32_t i = 0 ; i < overlaps.size (); ++i) {
481+ std::uint32_t k = 0 ;
482+ for (std::uint32_t j = 0 ; j < overlaps[i].size (); ++j) {
483+ if (overlap_update (overlaps[i][j])) {
484+ overlaps[i][k++] = overlaps[i][j];
484485 }
485- overlaps[i].resize (k);
486486 }
487+ overlaps[i].resize (k);
488+ }
487489
488- if (!is_changed) {
489- for (const auto & it : overlaps) {
490- for (const auto & jt : it) {
491- std::uint32_t type = overlap_type (jt);
492- if (type == 1 ) {
493- piles_[jt.lhs_id ]->set_is_contained ();
494- piles_[jt.lhs_id ]->set_is_invalid ();
495- } else if (type == 2 ) {
496- piles_[jt.rhs_id ]->set_is_contained ();
497- piles_[jt.rhs_id ]->set_is_invalid ();
498- }
499- }
490+ for (const auto & it : overlaps) {
491+ for (const auto & jt : it) {
492+ std::uint32_t type = overlap_type (jt);
493+ if (type == 1 ) {
494+ piles_[jt.lhs_id ]->set_is_contained ();
495+ piles_[jt.lhs_id ]->set_is_invalid ();
496+ } else if (type == 2 ) {
497+ piles_[jt.rhs_id ]->set_is_contained ();
498+ piles_[jt.rhs_id ]->set_is_invalid ();
500499 }
501- overlaps.clear ();
502- break ;
503500 }
504501 }
502+ overlaps.clear ();
505503
506504 std::cerr << " [raven::Graph::Construct] removed chimeric sequences "
507505 << std::fixed << timer.Stop () << " s"
0 commit comments