FA-70751 / GIS polygon topology / Open access
Node degree classification in an arc-node topology: pseudo node degree · case 01
Four-way junctions are reported as pseudo-nodes.
ROOT CAUSE
Any even degree is labelled pseudo, including real four-way junctions.
VERIFIED REPAIR
At the pseudo node degree step restore `elif d == 2:`, leaving the rest of the model unchanged.
Unsuccessful approach: Degree 3 junctions are now labelled pseudo.
Case contract
Input [nodes, arcs] with integer node ids and arcs [arc_id, from, to]. Degree counts arc ends, so a loop adds 2 to its node. Label degree 0 "isolated", 1 "dangle", 2 "pseudo", 3 or more "node". Return [[node, degree, label], ...] in ascending numeric node order, including isolated nodes.
Why this case matters
Topology QA flags dangles (undershoots) and pseudo-nodes (unnecessary splits); miscounting loops turns valid island rings into errors.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
nodes, arcs = x
deg = {n: 0 for n in nodes}
for aid, u, v in arcs:
deg[u] = deg.get(u, 0) + 1
deg[v] = deg.get(v, 0) + 1
out = []
for n in sorted(deg):
d = deg[n]
if d == 0:
label = 'isolated'
elif d == 1:
label = 'dangle'
elif d % 2 == 0:
label = 'pseudo'
else:
label = 'node'
out.append([n, d, label])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']])], [('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #9', [[1, 2, 3, 4], [[1, 1, 2], [2, 2, 3], [3, 3, 1], [4, 1, 4], [5, 4, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']])], [('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #9', [[1, 2, 3, 4], [[1, 1, 2], [2, 2, 3], [3, 3, 1], [4, 1, 4], [5, 4, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])], [('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])], [('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control #0 | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | Passed |
| control #1 | [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']] | [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']] | Passed |
| regression #2 | [[7, 2, 'pseudo']] | [[7, 2, 'pseudo']] | Passed |
| regression #3 | [[7, 3, 'node'], [8, 1, 'dangle']] | [[7, 3, 'node'], [8, 1, 'dangle']] | Passed |
| control #4 | [[1, 4, 'pseudo'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']] | [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']] | Failed |
| regression #5 | [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']] | [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']] | Passed |
| regression #6 | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']] | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']] | Passed |
| regression #7 | [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | Passed |
SHA-256 / 5ca682cccf6f4e83910d128cfa9bdfa488bc33faab99158c2900828bed4a7ac8
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
nodes, arcs = x
deg = {n: 0 for n in nodes}
for aid, u, v in arcs:
deg[u] = deg.get(u, 0) + 1
deg[v] = deg.get(v, 0) + 1
out = []
for n in sorted(deg):
d = deg[n]
if d == 0:
label = 'isolated'
elif d == 1:
label = 'dangle'
elif d <= 3:
label = 'pseudo'
else:
label = 'node'
out.append([n, d, label])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']])], [('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #9', [[1, 2, 3, 4], [[1, 1, 2], [2, 2, 3], [3, 3, 1], [4, 1, 4], [5, 4, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']])], [('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #9', [[1, 2, 3, 4], [[1, 1, 2], [2, 2, 3], [3, 3, 1], [4, 1, 4], [5, 4, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])], [('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])], [('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control #0 | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | Passed |
| control #1 | [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']] | [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']] | Passed |
| regression #2 | [[7, 2, 'pseudo']] | [[7, 2, 'pseudo']] | Passed |
| regression #3 | [[7, 3, 'pseudo'], [8, 1, 'dangle']] | [[7, 3, 'node'], [8, 1, 'dangle']] | Failed |
| control #4 | [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']] | [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']] | Passed |
| regression #5 | [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']] | [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']] | Passed |
| regression #6 | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']] | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']] | Passed |
| regression #7 | [[1, 3, 'pseudo'], [2, 3, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | Failed |
SHA-256 / ac8aa5fbac4d0cd069c0af628a452de0b779b3df39322637981543592a98924f
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
nodes, arcs = x
deg = {n: 0 for n in nodes}
for aid, u, v in arcs:
deg[u] = deg.get(u, 0) + 1
deg[v] = deg.get(v, 0) + 1
out = []
for n in sorted(deg):
d = deg[n]
if d == 0:
label = 'isolated'
elif d == 1:
label = 'dangle'
elif d == 2:
label = 'pseudo'
else:
label = 'node'
out.append([n, d, label])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']])], [('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #9', [[1, 2, 3, 4], [[1, 1, 2], [2, 2, 3], [3, 3, 1], [4, 1, 4], [5, 4, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']])], [('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #9', [[1, 2, 3, 4], [[1, 1, 2], [2, 2, 3], [3, 3, 1], [4, 1, 4], [5, 4, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])], [('control #0', [[1, 2, 3, 4], [[10, 1, 2], [11, 2, 3], [12, 3, 4], [13, 4, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('control #1', [[1, 2, 3], [[10, 1, 2], [11, 2, 3]]], [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']]), ('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #10', [[12, 3, 25, 100], [[1, 3, 12], [2, 12, 25], [3, 25, 3], [4, 100, 3]]], [[3, 3, 'node'], [12, 2, 'pseudo'], [25, 2, 'pseudo'], [100, 1, 'dangle']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])], [('regression #2', [[7], [[30, 7, 7]]], [[7, 2, 'pseudo']]), ('regression #3', [[7, 8], [[30, 7, 7], [31, 7, 8]]], [[7, 3, 'node'], [8, 1, 'dangle']]), ('control #4', [[1, 2, 3, 4, 5], [[1, 1, 2], [2, 1, 3], [3, 1, 4], [4, 1, 5]]], [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']]), ('regression #5', [[2, 10, 11, 3], [[1, 2, 10], [2, 10, 11], [3, 11, 3], [4, 3, 2]]], [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']]), ('regression #6', [[1, 2, 9, 10], [[1, 1, 2], [2, 2, 10], [3, 10, 1]]], [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']]), ('regression #7', [[1, 2, 3, 4], [[1, 1, 2], [2, 1, 2], [3, 1, 2], [4, 3, 4], [5, 4, 3]]], [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']]), ('boundary #8', [[5], []], [[5, 0, 'isolated']]), ('control #11', [[1, 2, 3, 4, 5, 6], [[1, 1, 2], [2, 2, 3], [3, 3, 4], [4, 4, 5], [5, 5, 6], [6, 6, 1], [7, 1, 4]]], [[1, 3, 'node'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 3, 'node'], [5, 2, 'pseudo'], [6, 2, 'pseudo']])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control #0 | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | Passed |
| control #1 | [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']] | [[1, 1, 'dangle'], [2, 2, 'pseudo'], [3, 1, 'dangle']] | Passed |
| regression #2 | [[7, 2, 'pseudo']] | [[7, 2, 'pseudo']] | Passed |
| regression #3 | [[7, 3, 'node'], [8, 1, 'dangle']] | [[7, 3, 'node'], [8, 1, 'dangle']] | Passed |
| control #4 | [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']] | [[1, 4, 'node'], [2, 1, 'dangle'], [3, 1, 'dangle'], [4, 1, 'dangle'], [5, 1, 'dangle']] | Passed |
| regression #5 | [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']] | [[2, 2, 'pseudo'], [3, 2, 'pseudo'], [10, 2, 'pseudo'], [11, 2, 'pseudo']] | Passed |
| regression #6 | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']] | [[1, 2, 'pseudo'], [2, 2, 'pseudo'], [9, 0, 'isolated'], [10, 2, 'pseudo']] | Passed |
| regression #7 | [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | [[1, 3, 'node'], [2, 3, 'node'], [3, 2, 'pseudo'], [4, 2, 'pseudo']] | Passed |
SHA-256 / 1a38bec1be31087e7428ed97e96e36fca0d8b1612c53ef3c652f14da126a6058
Verification & scope
Stipulated deterministic toy contract on a bounded input domain; results are rounded as stated and no conformance with any published standard or library is claimed. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:48:23.584578+00:00.
Case digest / ee0dada36dd019af1728cc9e5880c2600cb0f691f980a5e0fca463109f76eba4