better integrity check

This commit is contained in:
Maximilian Keßler 2023-11-06 22:03:48 +01:00
parent 497d601ffc
commit 6418c17413
Signed by: max
GPG Key ID: BCC5A619923C0BA5

View File

@ -8,10 +8,28 @@ using namespace ED;
namespace Edmonds {
void check_integrity(GraphAttributes & attrs)
NodeId get_rho(GraphAttributes const & attrs, NodeId id)
{
while(attrs.rho_[id] != id)
{
id = attrs.rho_[id];
}
return id;
}
void check_integrity(GraphAttributes const & attrs)
{
for(NodeId id = 0; id < attrs.num_nodes(); ++id)
{
// Check that rho does not have any cycles
NodeId cur_rho_id = id;
size_t count = attrs.num_nodes();
while(attrs.rho_[cur_rho_id] != cur_rho_id and count--)
{
cur_rho_id = attrs.rho_[cur_rho_id];
}
assert(count != 0);
// Check that μ encodes a valid matching
NodeId matched = attrs.mu[id];
if(matched != id)
@ -22,13 +40,13 @@ void check_integrity(GraphAttributes & attrs)
if (attrs.is_out_of_forest(id))
{
assert(attrs.phi[id] == id);
assert(attrs.rho(id) == id);
assert(get_rho(attrs, id) == id);
}
else
{
// check for a path to the root, i.e. ρ(node)
NodeId cur_node = id;
while(cur_node != attrs.rho(cur_node))
while(cur_node != get_rho(attrs, cur_node))
{
// If the condition was true, then cur_node is outer, part of a blossom
// and we want to follow its path
@ -36,8 +54,8 @@ void check_integrity(GraphAttributes & attrs)
// and point to vertices that have the same rho
assert(attrs.mu[cur_node] != cur_node);
assert(attrs.phi[cur_node] != cur_node);
assert(attrs.rho(attrs.mu[cur_node]) == attrs.rho(cur_node));
assert(attrs.rho(attrs.phi[cur_node]) == attrs.rho(cur_node));
assert(get_rho(attrs,attrs.mu[cur_node]) == get_rho(attrs,cur_node));
assert(get_rho(attrs,attrs.phi[cur_node]) == get_rho(attrs,cur_node));
// now, walk along the matched edge
cur_node = attrs.mu[cur_node];
@ -46,7 +64,7 @@ void check_integrity(GraphAttributes & attrs)
// - not be the identity
// - result in a node that has the same rho
assert(attrs.phi[cur_node] != cur_node);
assert(attrs.rho(attrs.phi[cur_node]) == attrs.rho(cur_node));
assert(get_rho(attrs, attrs.phi[cur_node]) == get_rho(attrs,cur_node));
cur_node = attrs.mu[attrs.phi[cur_node]];
}
@ -54,7 +72,7 @@ void check_integrity(GraphAttributes & attrs)
if (not attrs.is_outer(id))
{
assert(attrs.rho(id) == id);
assert(get_rho(attrs,id) == id);
}
}
}