Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions src/index_single_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <bitset>
#include <chrono>
#include <atomic>
#include <unordered_map>
#include <mutex>
#include <iomanip>
#include <utility>
Expand Down Expand Up @@ -697,6 +698,43 @@ index_single_mode::IndexBuilder::computeNewKminmerRanges(
return newKminmerRanges;
}

namespace {
// Collapse a node's change record to one net entry per position, to handle a node that both edits a
// seed and deletes that seed's block.
void dedupeSyncmerChangeRecord(
std::vector<std::tuple<uint64_t, panmapUtils::seedChangeType, seeding::rsyncmer_t>>& rec,
const index_single_mode::SyncmerSet& finalMap) {
if (rec.size() < 2) return;
std::unordered_map<uint64_t, std::pair<panmapUtils::seedChangeType, seeding::rsyncmer_t>> firstTouch;
firstTouch.reserve(rec.size());
std::vector<uint64_t> order;
order.reserve(rec.size());
bool anyRepeat = false;
for (const auto& [pos, type, rsync] : rec) {
auto [it, inserted] = firstTouch.try_emplace(pos, type, rsync);
if (inserted)
order.push_back(pos);
else
anyRepeat = true;
}
if (!anyRepeat) return;
std::vector<std::tuple<uint64_t, panmapUtils::seedChangeType, seeding::rsyncmer_t>> out;
out.reserve(order.size());
for (uint64_t pos : order) {
const auto& [firstType, firstRsync] = firstTouch[pos];
const bool finalHas = finalMap.find(pos) != finalMap.end();
if (firstType == panmapUtils::seedChangeType::ADD) { // parent lacked pos; keep only if it survives
if (finalHas) out.emplace_back(pos, panmapUtils::seedChangeType::ADD, seeding::rsyncmer_t());
} else { // parent had pos; restore its pre-node value
out.emplace_back(pos,
finalHas ? panmapUtils::seedChangeType::SUB : panmapUtils::seedChangeType::DEL,
firstRsync);
}
}
rec = std::move(out);
}
} // namespace

void index_single_mode::IndexBuilder::buildIndexHelper(panmanUtils::Node* node,
std::unordered_set<std::string_view>& emptyNodes,
panmapUtils::BlockSequences& blockSequences,
Expand Down Expand Up @@ -929,6 +967,7 @@ void index_single_mode::IndexBuilder::buildIndexHelper(panmanUtils::Node* node,
}
}

dedupeSyncmerChangeRecord(refOnSyncmersChangeRecord, refOnSyncmersMap);
std::vector<std::pair<index_single_mode::SyncmerSet::iterator, index_single_mode::SyncmerSet::iterator>>
newKminmerRanges = computeNewKminmerRanges(refOnSyncmersChangeRecord, dfsIndex);

Expand Down Expand Up @@ -1916,6 +1955,7 @@ void index_single_mode::IndexBuilder::processNode(panmanUtils::Node* node,
std::vector<uint64_t> addedSeedHashes;
std::vector<std::pair<uint64_t, uint64_t>> substitutedSeedHashes; // <oldHash, newHash>

dedupeSyncmerChangeRecord(refOnSyncmersChangeRecord, state.refOnSyncmersMap);
std::vector<std::pair<index_single_mode::SyncmerSet::iterator, index_single_mode::SyncmerSet::iterator>>
newKminmerRanges = computeNewKminmerRanges(refOnSyncmersChangeRecord, state, dfsIndex);

Expand Down
43 changes: 42 additions & 1 deletion src/mgsr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <tbb/enumerable_thread_specific.h>
#include <random>
#include <numeric>
#include <unordered_map>
#include <algorithm>
#include <stack>
#include <bitset>
Expand Down Expand Up @@ -3259,6 +3260,42 @@ std::vector<panmapUtils::NewSyncmerRange> mgsr::mgsrIndexBuilder::computeNewSync
return newSyncmerRanges;
}

namespace {
// Collapse a node's change record to one net entry per position
void dedupeSyncmerChangeRecord(
std::vector<std::tuple<uint64_t, panmapUtils::seedChangeType, seeding::rsyncmer_t>>& rec,
const std::set<uint64_t>& finalMap) {
if (rec.size() < 2) return;
std::unordered_map<uint64_t, std::pair<panmapUtils::seedChangeType, seeding::rsyncmer_t>> firstTouch;
firstTouch.reserve(rec.size());
std::vector<uint64_t> order;
order.reserve(rec.size());
bool anyRepeat = false;
for (const auto& [pos, type, rsync] : rec) {
auto [it, inserted] = firstTouch.try_emplace(pos, type, rsync);
if (inserted)
order.push_back(pos);
else
anyRepeat = true;
}
if (!anyRepeat) return;
std::vector<std::tuple<uint64_t, panmapUtils::seedChangeType, seeding::rsyncmer_t>> out;
out.reserve(order.size());
for (uint64_t pos : order) {
const auto& [firstType, firstRsync] = firstTouch[pos];
const bool finalHas = finalMap.find(pos) != finalMap.end();
if (firstType == panmapUtils::seedChangeType::ADD) {
if (finalHas) out.emplace_back(pos, panmapUtils::seedChangeType::ADD, seeding::rsyncmer_t());
} else {
out.emplace_back(pos,
finalHas ? panmapUtils::seedChangeType::SUB : panmapUtils::seedChangeType::DEL,
firstRsync);
}
}
rec = std::move(out);
}
} // namespace

std::vector<std::pair<std::set<uint64_t>::iterator, std::set<uint64_t>::iterator>>
mgsr::mgsrIndexBuilder::computeNewKminmerRanges(
std::vector<std::tuple<uint64_t, panmapUtils::seedChangeType, seeding::rsyncmer_t>>& refOnSyncmersChangeRecord,
Expand Down Expand Up @@ -3584,6 +3621,9 @@ void mgsr::mgsrIndexBuilder::buildIndexHelper(panmanUtils::Node* node,
if (oldExists && !newExists) {
if (blockOnSyncmers.find(blockId) != blockOnSyncmers.end()) {
for (uint64_t pos : blockOnSyncmers[blockId]) {
// Skip: this position was already deleted earlier in this node (its
// blockOnSyncmers cleanup is deferred), so refOnSyncmers is nullopt here.
if (!refOnSyncmers[pos].has_value()) continue;
refOnSyncmersChangeRecord.emplace_back(
pos, panmapUtils::seedChangeType::DEL, refOnSyncmers[pos].value());
blockOnSyncmersChangeRecord.emplace_back(blockId, pos, panmapUtils::seedChangeType::DEL);
Expand All @@ -3596,6 +3636,7 @@ void mgsr::mgsrIndexBuilder::buildIndexHelper(panmanUtils::Node* node,
}
}

dedupeSyncmerChangeRecord(refOnSyncmersChangeRecord, refOnSyncmersMap);
std::vector<std::pair<std::set<uint64_t>::iterator, std::set<uint64_t>::iterator>> newKminmerRanges =
computeNewKminmerRanges(refOnSyncmersChangeRecord, dfsIndex);

Expand Down Expand Up @@ -8264,4 +8305,4 @@ std::vector<mgsr::MgsrLiteNode*> mgsr::getNearestNodes(mgsr::MgsrLiteNode* node,
}

return result;
}
}
Loading