2023-11-06 13:24:25 +01:00
|
|
|
#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]] 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();
|
|
|
|
|
2023-11-06 18:45:08 +01:00
|
|
|
NodeId rho(NodeId id);
|
|
|
|
|
2023-11-06 13:24:25 +01:00
|
|
|
void reset_matching();
|
|
|
|
|
2023-11-06 13:45:57 +01:00
|
|
|
std::vector<NodeId> phi;
|
2023-11-06 18:45:08 +01:00
|
|
|
std::vector<NodeId> rho_;
|
2023-11-06 13:45:57 +01:00
|
|
|
std::vector<NodeId> mu;
|
|
|
|
std::vector<bool> scanned;
|
2023-11-06 13:24:25 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
inline
|
|
|
|
GraphAttributes::GraphAttributes(const ED::NodeId num_nodes):
|
2023-11-06 13:45:57 +01:00
|
|
|
phi(num_nodes),
|
2023-11-06 18:45:08 +01:00
|
|
|
rho_(num_nodes),
|
2023-11-06 13:45:57 +01:00
|
|
|
mu(num_nodes),
|
|
|
|
scanned(num_nodes)
|
2023-11-06 13:24:25 +01:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
inline
|
|
|
|
NodeId GraphAttributes::num_nodes() const
|
|
|
|
{
|
2023-11-06 18:45:08 +01:00
|
|
|
assert(phi.size() == rho_.size());
|
2023-11-06 13:45:57 +01:00
|
|
|
assert(phi.size() == mu.size());
|
|
|
|
assert(phi.size() == scanned.size());
|
|
|
|
return phi.size();
|
2023-11-06 13:24:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline
|
|
|
|
bool GraphAttributes::is_outer(NodeId const id) const {
|
2023-11-06 13:51:56 +01:00
|
|
|
return mu[id] == id or phi[mu[id]] != mu[id];
|
2023-11-06 13:24:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline
|
|
|
|
bool GraphAttributes::is_inner(NodeId const id) const
|
|
|
|
{
|
2023-11-06 13:45:57 +01:00
|
|
|
return phi[id] != id and phi[mu[id]] == mu[id];
|
2023-11-06 13:24:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline
|
|
|
|
bool GraphAttributes::is_out_of_forest(const ED::NodeId id) const
|
|
|
|
{
|
2023-11-06 13:45:57 +01:00
|
|
|
return mu[id] != id and phi[id] == id and phi[mu[id]] == mu[id];
|
2023-11-06 13:24:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline
|
|
|
|
void GraphAttributes::reset_forest()
|
|
|
|
{
|
2023-11-06 13:45:57 +01:00
|
|
|
std::iota(phi.begin(), phi.end(), 0);
|
2023-11-06 18:45:08 +01:00
|
|
|
std::iota(rho_.begin(), rho_.end(), 0);
|
2023-11-06 13:45:57 +01:00
|
|
|
std::fill(scanned.begin(), scanned.end(), false);
|
2023-11-06 13:24:25 +01:00
|
|
|
}
|
|
|
|
|
2023-11-06 18:45:08 +01:00
|
|
|
inline
|
|
|
|
NodeId GraphAttributes::rho(NodeId id)
|
|
|
|
{
|
|
|
|
while(rho_[id] != id)
|
|
|
|
{
|
|
|
|
rho_[id] = rho_[rho_[id]];
|
|
|
|
id = rho_[id];
|
|
|
|
}
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
2023-11-06 13:24:25 +01:00
|
|
|
inline
|
|
|
|
void GraphAttributes::reset_matching()
|
|
|
|
{
|
2023-11-06 13:45:57 +01:00
|
|
|
std::iota(mu.begin(), mu.end(), 0);
|
2023-11-06 13:24:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif //GRAPH_ATTRIBUTES_H
|