https://github.com/tue-alga/CoordinatedSchematization
Raw File
Tip revision: 9ffc292c946498d56f7938a86628adba534a9085 authored by TUE\bacusters on 01 July 2021, 09:20:10 UTC
Add base schematization library
Tip revision: 9ffc292
BidirectionalCanonicalGraph.cpp
#include "SchematLib/Models/BidirectionalCanonicalGraph.h"

namespace SchematLib::Models
{
    BidirectionalCanonicalGraph::custom_edge_iterator::custom_edge_iterator(const BaseGraph* graph,
                                                                            GT::edge_iterator baseIt,
                                                                            GT::edge_iterator endIt):
        GT::edge_iterator(baseIt),
        m_graph(graph), endIt(endIt)
    {
        toNextCanonical();
    }

    BidirectionalCanonicalGraph::custom_edge_iterator::custom_edge_iterator(const BaseGraph* graph,
                                                                            GT::edge_iterator baseIt,
                                                                            GT::edge_iterator endIt,
                                                                            bool uniqueEdges):
        GT::edge_iterator(baseIt),
        m_graph(graph), m_filterUniqueEdges(uniqueEdges), endIt(endIt)
    {
        toNextCanonical();
    }

    BidirectionalCanonicalGraph::custom_edge_iterator::custom_edge_iterator()
    {
    }

    BidirectionalCanonicalGraph::custom_edge_iterator& BidirectionalCanonicalGraph::custom_edge_iterator::operator++()
    {
        GT::edge_iterator::operator++();
        toNextCanonical();
        return *this;
    }

    void BidirectionalCanonicalGraph::custom_edge_iterator::toNextCanonical()
    {
        if (!m_filterUniqueEdges) return;
        if (*this == endIt) return;

        using SEF = MapSimplification::SpecialEdgeIdFunctions;
        auto eId = boost::get(GCpp::DS::edge_id_t{}, *m_graph, this->operator*());
        while(SEF::isNonCanonical(eId))
        {
            BaseIt::operator++();
            if (*this == endIt) break;
            eId = boost::get(GCpp::DS::edge_id_t{}, *m_graph, this->operator*());
        }
    }

    std::pair<BidirectionalCanonicalGraph::edge_iterator, BidirectionalCanonicalGraph::edge_iterator>
    BidirectionalCanonicalGraph::edges() const
    {
        auto its = boost::edges(m_graph);
        edge_iterator begin(&m_graph, its.first, its.second, !m_use_canonical_edges_ids);
        edge_iterator end(&m_graph, its.second, its.second, !m_use_canonical_edges_ids);
        return std::make_pair(begin, end);
    }

    BidirectionalCanonicalGraph::edge_descriptor BidirectionalCanonicalGraph::twin(edge_descriptor e) const
    {
        return boost::lookup_edge(boost::target(e, m_graph), boost::source(e, m_graph), m_graph).first;
    }

    std::size_t BidirectionalCanonicalGraph::number_of_edges() const
    {
        if (m_use_canonical_edges_ids) return boost::num_edges(m_graph);
        else
        {
            auto baseEdges = boost::num_edges(m_graph);
            assert(baseEdges % 2 == 0); // Require even number of edges
            return baseEdges/2;
        }
    }
}
back to top