inline void Unitigging::removeTransitiveEdges() { layout::BetterReadSet brs(reads_, 1); for (size_t i = 0; i < no_contains_->size(); ++i) { auto better_overlap = (*no_contains_)[i]; auto overlap = better_overlap->overlap(); brs[overlap->read_one]->AddOverlap(better_overlap); brs[overlap->read_two]->AddOverlap(better_overlap); } brs.Finalize(); // for o1(x, y) and o2(x, a), o3(y, a) std::vector< size_t > erased; erased.reserve(no_contains_->size()); for (size_t i = 0; i < no_contains_->size(); ++i) { auto better_overlap = (*no_contains_)[i]; auto overlap = better_overlap->overlap(); // TODO(brahle): izdvoji ovo u zasebnu klasu iterator auto v1 = brs[overlap->read_one]->overlaps(); auto v2 = brs[overlap->read_two]->overlaps(); auto it1 = v1.begin(); auto it2 = v2.begin(); bool done = false; while (!done && it1 != v1.end() && it2 != v2.end()) { if (it1->first == overlap->read_one || it1->first == overlap->read_two) { ++it1; continue; } if (it2->first == overlap->read_one || it2->first == overlap->read_two) { ++it2; continue; } if (it1->first == it2->first) { if (isTransitive(better_overlap, it1->second, it2->second)) { (*reads_)[overlap->read_one]->addCoverage( static_cast<double> (better_overlap->Length()) / (*reads_)[overlap->read_one]->size()); (*reads_)[it1->first]->addCoverage( static_cast<double> (better_overlap->Length()) / (*reads_)[it1->first]->size()); erased.emplace_back(i); const auto& o = better_overlap->overlap(); const auto& o1 = it1->second->overlap(); const auto& o2 = it2->second->overlap(); fprintf(stderr, "Removing overlap (%d, %d) as transitive of (%d, %d), (%d, %d)\n", (*reads_)[o->read_one]->orig_id(), (*reads_)[o->read_two]->orig_id(), (*reads_)[o1->read_one]->orig_id(), (*reads_)[o1->read_two]->orig_id(), (*reads_)[o2->read_one]->orig_id(), (*reads_)[o2->read_two]->orig_id() ); done = true; } ++it1; ++it2; } else if (it1->first < it2->first) { ++it1; } else { ++it2; } } } no_transitives_ = BetterOverlapSetPtr(new BetterOverlapSet(reads_)); size_t idx = 0; for (size_t i = 0; i < no_contains_->size(); ++i) { if (idx < erased.size() && i == erased[idx]) { ++idx; continue; } auto better_overlap = (*no_contains_)[i]; no_transitives_->Add(new BetterOverlap(better_overlap)); } int transitive_edge_count = no_contains_->size() - no_transitives_->size(); fprintf( stderr, "Transitive edges = %d (%.2lf%%)\n", transitive_edge_count, (transitive_edge_count * 100.0) / no_contains_->size()); }
bool BinaryRelation::isEquivalence() const { return(isReflexive() && isSymmetric() && isTransitive()); }