#ifndef GRAPH_ATTRIBUTES_H #define GRAPH_ATTRIBUTES_H #include #include "graph.hpp" namespace ED { struct GraphAttributes { explicit GraphAttributes(NodeId num_nodes); [[nodiscard]] NodeId num_nodes() const; [[nodiscard]] NodeId matched_neighbor(NodeId id) const; [[nodiscard]] NodeId phi(NodeId id) const; [[nodiscard]] NodeId rho(NodeId id) const; [[nodiscard]] bool is_outer(NodeId id) const; [[nodiscard]] bool is_inner(NodeId id) const; [[nodiscard]] bool is_out_of_forest(NodeId id) const; void reset_forest(); void reset_matching(); std::vector phi_; std::vector rho_; std::vector mu_; std::vector scanned_; }; inline GraphAttributes::GraphAttributes(const ED::NodeId num_nodes): phi_(num_nodes), rho_(num_nodes), mu_(num_nodes), scanned_(num_nodes) { } inline NodeId GraphAttributes::num_nodes() const { assert(phi_.size() == rho_.size()); assert(phi_.size() == mu_.size()); assert(phi_.size() == scanned_.size()); return phi_.size(); } inline NodeId GraphAttributes::matched_neighbor(NodeId const id) const { assert(id <= num_nodes()); return mu_[id]; } inline NodeId GraphAttributes::phi(const NodeId id) const { assert(id <= num_nodes()); return phi_[id]; } inline NodeId GraphAttributes::rho(const NodeId id) const { assert(id <= num_nodes()); return rho_[id]; } inline bool GraphAttributes::is_outer(NodeId const id) const { return matched_neighbor(id) == id or \ phi(matched_neighbor(id)) != matched_neighbor(id); } inline bool GraphAttributes::is_inner(NodeId const id) const { return phi(id) != id and \ phi(matched_neighbor(id)) == matched_neighbor(id); } inline bool GraphAttributes::is_out_of_forest(const ED::NodeId id) const { return matched_neighbor(id) != id and \ phi(id) == id and \ phi(matched_neighbor(id)) == matched_neighbor(id); } inline void GraphAttributes::reset_forest() { std::iota(phi_.begin(), phi_.end(), 0); std::iota(rho_.begin(), rho_.end(), 0); std::fill(scanned_.begin(), scanned_.end(), false); } inline void GraphAttributes::reset_matching() { std::iota(mu_.begin(), mu_.end(), 0); } } #endif //GRAPH_ATTRIBUTES_H