113 lines
2.4 KiB
C
113 lines
2.4 KiB
C
|
#ifndef GRAPH_ATTRIBUTES_H
|
||
|
#define GRAPH_ATTRIBUTES_H
|
||
|
|
||
|
#include <numeric>
|
||
|
#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<NodeId> phi_;
|
||
|
std::vector<NodeId> rho_;
|
||
|
std::vector<NodeId> mu_;
|
||
|
std::vector<bool> 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
|