Ejemplo n.º 1
0
  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());
  }
Ejemplo n.º 2
0
bool BinaryRelation::isEquivalence() const {
    return(isReflexive() && isSymmetric() && isTransitive());
}