#include "SchematLib/Models/SchematizationStages.h" namespace SchematLib::Models { void SchematizationStages::reset() { m_currentStage = 0; } SchematizationStages::CanonicalAccessGuard::CanonicalAccessGuard(SchematizationStages* parent, bool use_canonical): m_parent(parent), m_use_canonical(use_canonical) { for (std::size_t i = 0; i < m_parent->totalStages(); ++i) { auto graph = m_parent->stageGraphAt(i); previousAccess.push_back(graph->m_use_canonical_edges_ids); graph->m_use_canonical_edges_ids = m_use_canonical; } } SchematizationStages::CanonicalAccessGuard::~CanonicalAccessGuard() { if (m_wasReset) return; for (std::size_t i = 0; i < m_parent->totalStages(); ++i) { auto graph = m_parent->stageGraphAt(i); graph->m_use_canonical_edges_ids = previousAccess[i]; } } SchematizationStages::CanonicalAccessGuard SchematizationStages::guardChangeAccess(bool useCanonical) { return CanonicalAccessGuard(this, useCanonical); } std::size_t SchematizationStages::totalStages() const { return m_currentStage; } const std::vector& SchematizationStages::stageNames() const { return m_simplificationStageName; } std::shared_ptr SchematizationStages::stageGraphAt(std::size_t stage) const { return m_simplificationStages[stage]; } const MapSimplification::EdgeTrackingObserver& SchematizationStages::observerAt(std::size_t stage) const { return m_simplificationTrackerPerStage[stage]; } std::string SchematizationStages::nameAt(std::size_t stage) const { return m_simplificationStageName[stage]; } void SchematizationStages::assignNextStage(const std::string& stageName, const Graph& graph, const MapSimplification::EdgeTrackingObserver& observer) { if (m_currentStage >= m_simplificationStageName.size()) { addNewBlankStage(); } std::cout << "Assigning stage " << m_currentStage << ": " << stageName << "\n"; m_simplificationStageName[m_currentStage] = stageName; if(m_validate) { std::set currentEdgeIds; std::set currentVertexIds; GCpp::DS::computeEdgeIdSet(graph, currentEdgeIds); GCpp::DS::computeVertexIdSet(graph, currentVertexIds); if (!GCpp::DS::hasUniqueVertexIds(graph)) throw std::runtime_error("Duplicate vertex ID!"); if (currentEdgeIds.size() != boost::num_edges(graph)) throw std::runtime_error("Duplicate edge ID!"); observer.verifyIntegrity(currentEdgeIds, currentVertexIds); } m_simplificationTrackerPerStage[m_currentStage] = observer; *m_simplificationStages[m_currentStage] = graph; ++m_currentStage; } std::size_t SchematizationStages::currentStageToAssign() const { return m_currentStage; } std::shared_ptr SchematizationStages::currentStageGraph() const { return m_simplificationStages[m_currentStage]; } std::shared_ptr SchematizationStages::prevStageGraph() const { verifyNotFirst(); return m_simplificationStages[m_currentStage - 1]; } void SchematizationStages::verifyNotFirst() const { if (m_currentStage == 0) throw std::runtime_error("Cannot access to prev stage when at 0!"); } void SchematizationStages::setNames(const std::vector& names) { if (names.size() != m_simplificationStageName.size()) throw std::runtime_error("Incompatible sizes"); m_simplificationStageName = names; } void SchematizationStages::resize(std::size_t numberOfStages) { m_simplificationStages.clear(); for (auto i = 0; i < numberOfStages; ++i) m_simplificationStages.push_back(std::make_shared()); m_simplificationTrackerPerStage.resize(numberOfStages, { }); m_simplificationStageName.clear(); m_simplificationStageName.resize(numberOfStages, ""); } void SchematizationStages::addNewBlankStage() { m_simplificationStages.push_back(std::make_shared()); m_simplificationTrackerPerStage.push_back({ }); m_simplificationStageName.push_back(""); } }