FA-91056 / Quantum circuit simulation / Open access
Direction fixer reports self-targeting CNOT as unroutable · case 01
cx 2 2 is reported as ["unroutable", i] instead of ["invalid", i], hiding a malformed circuit behind a hardware message.
ROOT CAUSE
The c == t guard is missing, so the op falls through to the coupling lookup.
THE FAILURE
The c == t guard is missing, so the op falls through to the coupling lookup.
Unsuccessful approach: The attempted repair silently drops self-targeting CNOTs instead of reporting them.
Case contract
Input [edges, ops]; edges are directed native CNOT pairs [c, t]. Each ["cx", c, t] is kept if [c, t] is native, else rewritten as h c, h t, cx t c, h c, h t if [t, c] is native, else the result is ["unroutable", op index]; c == t gives ["invalid", op index]. Other ops pass through. A final stack pass cancels an ["h", q] against an identical immediately preceding ["h", q].
Why this case matters
Direction fixing is a mandatory transpiler pass for devices with directed couplers; errors either break hardware constraints or bloat circuits.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
edges, ops = x
allowed = {(a, b) for a, b in edges}
out = []
for idx, op in enumerate(ops):
if op[0] != 'cx':
out.append(list(op))
continue
c, t = op[1], op[2]
if (c, t) in allowed:
out.append(['cx', c, t])
elif (t, c) in allowed:
out += [['h', c], ['h', t], ['cx', t, c], ['h', c], ['h', t]]
else:
return ['unroutable', idx]
res = []
for op in out:
if op[0] == 'h' and res and res[-1] == op:
res.pop()
else:
res.append(op)
return res
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: self loop', [[[0, 1], [1, 2], [2, 3]], [['h', 0], ['cx', 2, 2]]], ['invalid', 1]], ['regression: random coupling 11', [[[2, 3], [1, 2], [3, 2], [0, 2]], [['cx', 2, 3], ['cx', 0, 2], ['h', 2], ['cx', 1, 1], ['h', 0]]], ['invalid', 3]], ['regression: random coupling 31', [[[1, 2], [1, 0], [0, 1], [0, 2]], [['cx', 1, 1]]], ['invalid', 0]], ['control: native direction', [[[0, 1], [1, 2], [2, 3]], [['cx', 0, 1]]], [['cx', 0, 1]]], ['control: reversed direction', [[[0, 1], [1, 2], [2, 3]], [['cx', 1, 0]]], [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1], ['h', 0]]], ['control: bidirectional edge', [[[0, 1], [1, 0]], [['cx', 1, 0]]], [['cx', 1, 0]]], ['control: unroutable pair', [[[0, 1], [1, 2], [2, 3]], [['h', 1], ['cx', 0, 2]]], ['unroutable', 1]]], [['regression: random coupling 42', [[[1, 0], [0, 2], [1, 2]], [['h', 1], ['cx', 1, 1], ['cx', 2, 0], ['h', 2], ['h', 3]]], ['invalid', 1]], ['regression: random coupling 48', [[[2, 1], [0, 2], [2, 3], [3, 2], [0, 1]], [['cx', 1, 1], ['cx', 1, 2], ['cx', 1, 2], ['cx', 0, 3], ['h', 0], ['cx', 0, 2]]], ['invalid', 0]], ['regression: random coupling 31', [[[1, 2], [1, 0], [0, 1], [0, 2]], [['cx', 1, 1]]], ['invalid', 0]], ['control: hadamards cancel', [[[0, 1], [1, 2], [2, 3]], [['h', 0], ['h', 0], ['x', 1]]], [['x', 1]]], ['control: hadamards on different qubits', [[[0, 1], [1, 2], [2, 3]], [['h', 0], ['h', 1]]], [['h', 0], ['h', 1]]], ['control: flip then h cancels', [[[0, 1], [1, 2], [2, 3]], [['cx', 1, 0], ['h', 0]]], [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1]]], ['control: flip then h on target cancels', [[[0, 1], [1, 2], [2, 3]], [['cx', 1, 0], ['h', 1], ['cx', 0, 1]]], [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1], ['h', 0], ['h', 1], ['cx', 0, 1]]]], [['regression: random coupling 11', [[[2, 3], [1, 2], [3, 2], [0, 2]], [['cx', 2, 3], ['cx', 0, 2], ['h', 2], ['cx', 1, 1], ['h', 0]]], ['invalid', 3]], ['regression: random coupling 31', [[[1, 2], [1, 0], [0, 1], [0, 2]], [['cx', 1, 1]]], ['invalid', 0]], ['regression: random coupling 48', [[[2, 1], [0, 2], [2, 3], [3, 2], [0, 1]], [['cx', 1, 1], ['cx', 1, 2], ['cx', 1, 2], ['cx', 0, 3], ['h', 0], ['cx', 0, 2]]], ['invalid', 0]], ['control: random coupling 0', [[[2, 1], [3, 2], [1, 2], [1, 0]], [['h', 2], ['cx', 1, 0], ['cx', 2, 0], ['x', 1]]], ['unroutable', 2]], ['control: random coupling 1', [[[2, 3], [3, 2], [0, 1], [0, 2]], [['h', 1]]], [['h', 1]]], ['control: random coupling 2', [[[0, 2], [2, 3], [2, 1]], [['h', 3]]], [['h', 3]]], ['control: random coupling 3', [[[1, 0], [2, 3]], [['cx', 1, 2], ['h', 1], ['x', 2]]], ['unroutable', 0]]], [['regression: random coupling 48', [[[2, 1], [0, 2], [2, 3], [3, 2], [0, 1]], [['cx', 1, 1], ['cx', 1, 2], ['cx', 1, 2], ['cx', 0, 3], ['h', 0], ['cx', 0, 2]]], ['invalid', 0]], ['regression: self loop', [[[0, 1], [1, 2], [2, 3]], [['h', 0], ['cx', 2, 2]]], ['invalid', 1]], ['regression: random coupling 11', [[[2, 3], [1, 2], [3, 2], [0, 2]], [['cx', 2, 3], ['cx', 0, 2], ['h', 2], ['cx', 1, 1], ['h', 0]]], ['invalid', 3]], ['control: random coupling 4', [[[0, 2], [2, 3]], [['h', 0], ['cx', 0, 3], ['cx', 2, 0], ['x', 3]]], ['unroutable', 1]], ['control: random coupling 5', [[[3, 2], [0, 2], [2, 3], [1, 2]], [['cx', 1, 0], ['h', 3], ['h', 0], ['cx', 0, 3]]], ['unroutable', 0]], ['control: random coupling 6', [[[0, 1], [2, 1]], [['cx', 2, 0], ['x', 2], ['cx', 0, 2], ['cx', 3, 0], ['h', 3], ['h', 3]]], ['unroutable', 0]], ['control: random coupling 7', [[[0, 1], [2, 3], [2, 1], [1, 2]], [['cx', 1, 3]]], ['unroutable', 0]]], [['regression: random coupling 31', [[[1, 2], [1, 0], [0, 1], [0, 2]], [['cx', 1, 1]]], ['invalid', 0]], ['regression: random coupling 42', [[[1, 0], [0, 2], [1, 2]], [['h', 1], ['cx', 1, 1], ['cx', 2, 0], ['h', 2], ['h', 3]]], ['invalid', 1]], ['regression: random coupling 48', [[[2, 1], [0, 2], [2, 3], [3, 2], [0, 1]], [['cx', 1, 1], ['cx', 1, 2], ['cx', 1, 2], ['cx', 0, 3], ['h', 0], ['cx', 0, 2]]], ['invalid', 0]], ['control: random coupling 8', [[[2, 1], [1, 2], [3, 2]], [['x', 0], ['h', 3]]], [['x', 0], ['h', 3]]], ['control: random coupling 9', [[[0, 2], [0, 1], [1, 2], [3, 2]], [['h', 1], ['cx', 0, 2]]], [['h', 1], ['cx', 0, 2]]], ['control: random coupling 10', [[[0, 2], [2, 1], [3, 2]], [['h', 2], ['cx', 1, 0]]], ['unroutable', 1]], ['control: random coupling 12', [[[0, 2], [3, 2]], [['x', 2], ['cx', 3, 1], ['h', 2], ['h', 3]]], ['unroutable', 1]]]]
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 |
|---|---|---|---|
| regression: self loop | ['unroutable', 1] | ['invalid', 1] | Failed |
| regression: random coupling 11 | ['unroutable', 3] | ['invalid', 3] | Failed |
| regression: random coupling 31 | ['unroutable', 0] | ['invalid', 0] | Failed |
| control: native direction | [['cx', 0, 1]] | [['cx', 0, 1]] | Passed |
| control: reversed direction | [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1], ['h', 0]] | [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1], ['h', 0]] | Passed |
| control: bidirectional edge | [['cx', 1, 0]] | [['cx', 1, 0]] | Passed |
| control: unroutable pair | ['unroutable', 1] | ['unroutable', 1] | Passed |
SHA-256 / 8bb8e730b434e9f083056960a8c2b610c48485d7e47f9f0d8041f3f635870d2f
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
edges, ops = x
allowed = {(a, b) for a, b in edges}
out = []
for idx, op in enumerate(ops):
if op[0] != 'cx':
out.append(list(op))
continue
c, t = op[1], op[2]
if c == t:
continue
if (c, t) in allowed:
out.append(['cx', c, t])
elif (t, c) in allowed:
out += [['h', c], ['h', t], ['cx', t, c], ['h', c], ['h', t]]
else:
return ['unroutable', idx]
res = []
for op in out:
if op[0] == 'h' and res and res[-1] == op:
res.pop()
else:
res.append(op)
return res
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: self loop', [[[0, 1], [1, 2], [2, 3]], [['h', 0], ['cx', 2, 2]]], ['invalid', 1]], ['regression: random coupling 11', [[[2, 3], [1, 2], [3, 2], [0, 2]], [['cx', 2, 3], ['cx', 0, 2], ['h', 2], ['cx', 1, 1], ['h', 0]]], ['invalid', 3]], ['regression: random coupling 31', [[[1, 2], [1, 0], [0, 1], [0, 2]], [['cx', 1, 1]]], ['invalid', 0]], ['control: native direction', [[[0, 1], [1, 2], [2, 3]], [['cx', 0, 1]]], [['cx', 0, 1]]], ['control: reversed direction', [[[0, 1], [1, 2], [2, 3]], [['cx', 1, 0]]], [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1], ['h', 0]]], ['control: bidirectional edge', [[[0, 1], [1, 0]], [['cx', 1, 0]]], [['cx', 1, 0]]], ['control: unroutable pair', [[[0, 1], [1, 2], [2, 3]], [['h', 1], ['cx', 0, 2]]], ['unroutable', 1]]], [['regression: random coupling 42', [[[1, 0], [0, 2], [1, 2]], [['h', 1], ['cx', 1, 1], ['cx', 2, 0], ['h', 2], ['h', 3]]], ['invalid', 1]], ['regression: random coupling 48', [[[2, 1], [0, 2], [2, 3], [3, 2], [0, 1]], [['cx', 1, 1], ['cx', 1, 2], ['cx', 1, 2], ['cx', 0, 3], ['h', 0], ['cx', 0, 2]]], ['invalid', 0]], ['regression: random coupling 31', [[[1, 2], [1, 0], [0, 1], [0, 2]], [['cx', 1, 1]]], ['invalid', 0]], ['control: hadamards cancel', [[[0, 1], [1, 2], [2, 3]], [['h', 0], ['h', 0], ['x', 1]]], [['x', 1]]], ['control: hadamards on different qubits', [[[0, 1], [1, 2], [2, 3]], [['h', 0], ['h', 1]]], [['h', 0], ['h', 1]]], ['control: flip then h cancels', [[[0, 1], [1, 2], [2, 3]], [['cx', 1, 0], ['h', 0]]], [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1]]], ['control: flip then h on target cancels', [[[0, 1], [1, 2], [2, 3]], [['cx', 1, 0], ['h', 1], ['cx', 0, 1]]], [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1], ['h', 0], ['h', 1], ['cx', 0, 1]]]], [['regression: random coupling 11', [[[2, 3], [1, 2], [3, 2], [0, 2]], [['cx', 2, 3], ['cx', 0, 2], ['h', 2], ['cx', 1, 1], ['h', 0]]], ['invalid', 3]], ['regression: random coupling 31', [[[1, 2], [1, 0], [0, 1], [0, 2]], [['cx', 1, 1]]], ['invalid', 0]], ['regression: random coupling 48', [[[2, 1], [0, 2], [2, 3], [3, 2], [0, 1]], [['cx', 1, 1], ['cx', 1, 2], ['cx', 1, 2], ['cx', 0, 3], ['h', 0], ['cx', 0, 2]]], ['invalid', 0]], ['control: random coupling 0', [[[2, 1], [3, 2], [1, 2], [1, 0]], [['h', 2], ['cx', 1, 0], ['cx', 2, 0], ['x', 1]]], ['unroutable', 2]], ['control: random coupling 1', [[[2, 3], [3, 2], [0, 1], [0, 2]], [['h', 1]]], [['h', 1]]], ['control: random coupling 2', [[[0, 2], [2, 3], [2, 1]], [['h', 3]]], [['h', 3]]], ['control: random coupling 3', [[[1, 0], [2, 3]], [['cx', 1, 2], ['h', 1], ['x', 2]]], ['unroutable', 0]]], [['regression: random coupling 48', [[[2, 1], [0, 2], [2, 3], [3, 2], [0, 1]], [['cx', 1, 1], ['cx', 1, 2], ['cx', 1, 2], ['cx', 0, 3], ['h', 0], ['cx', 0, 2]]], ['invalid', 0]], ['regression: self loop', [[[0, 1], [1, 2], [2, 3]], [['h', 0], ['cx', 2, 2]]], ['invalid', 1]], ['regression: random coupling 11', [[[2, 3], [1, 2], [3, 2], [0, 2]], [['cx', 2, 3], ['cx', 0, 2], ['h', 2], ['cx', 1, 1], ['h', 0]]], ['invalid', 3]], ['control: random coupling 4', [[[0, 2], [2, 3]], [['h', 0], ['cx', 0, 3], ['cx', 2, 0], ['x', 3]]], ['unroutable', 1]], ['control: random coupling 5', [[[3, 2], [0, 2], [2, 3], [1, 2]], [['cx', 1, 0], ['h', 3], ['h', 0], ['cx', 0, 3]]], ['unroutable', 0]], ['control: random coupling 6', [[[0, 1], [2, 1]], [['cx', 2, 0], ['x', 2], ['cx', 0, 2], ['cx', 3, 0], ['h', 3], ['h', 3]]], ['unroutable', 0]], ['control: random coupling 7', [[[0, 1], [2, 3], [2, 1], [1, 2]], [['cx', 1, 3]]], ['unroutable', 0]]], [['regression: random coupling 31', [[[1, 2], [1, 0], [0, 1], [0, 2]], [['cx', 1, 1]]], ['invalid', 0]], ['regression: random coupling 42', [[[1, 0], [0, 2], [1, 2]], [['h', 1], ['cx', 1, 1], ['cx', 2, 0], ['h', 2], ['h', 3]]], ['invalid', 1]], ['regression: random coupling 48', [[[2, 1], [0, 2], [2, 3], [3, 2], [0, 1]], [['cx', 1, 1], ['cx', 1, 2], ['cx', 1, 2], ['cx', 0, 3], ['h', 0], ['cx', 0, 2]]], ['invalid', 0]], ['control: random coupling 8', [[[2, 1], [1, 2], [3, 2]], [['x', 0], ['h', 3]]], [['x', 0], ['h', 3]]], ['control: random coupling 9', [[[0, 2], [0, 1], [1, 2], [3, 2]], [['h', 1], ['cx', 0, 2]]], [['h', 1], ['cx', 0, 2]]], ['control: random coupling 10', [[[0, 2], [2, 1], [3, 2]], [['h', 2], ['cx', 1, 0]]], ['unroutable', 1]], ['control: random coupling 12', [[[0, 2], [3, 2]], [['x', 2], ['cx', 3, 1], ['h', 2], ['h', 3]]], ['unroutable', 1]]]]
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 |
|---|---|---|---|
| regression: self loop | [['h', 0]] | ['invalid', 1] | Failed |
| regression: random coupling 11 | [['cx', 2, 3], ['cx', 0, 2], ['h', 2], ['h', 0]] | ['invalid', 3] | Failed |
| regression: random coupling 31 | [] | ['invalid', 0] | Failed |
| control: native direction | [['cx', 0, 1]] | [['cx', 0, 1]] | Passed |
| control: reversed direction | [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1], ['h', 0]] | [['h', 1], ['h', 0], ['cx', 0, 1], ['h', 1], ['h', 0]] | Passed |
| control: bidirectional edge | [['cx', 1, 0]] | [['cx', 1, 0]] | Passed |
| control: unroutable pair | ['unroutable', 1] | ['unroutable', 1] | Passed |
SHA-256 / 9580e692730b88d0dc74d03d6fb9a196ebf55a1de48c2f725019e0a43562ba24
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 7 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗Verification & scope
A deterministic bounded teaching model with a stipulated toy contract; amplitudes are rounded to fixed decimals for strict JSON output. It is not a production quantum SDK and claims no standards conformance. 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:51:32.333181+00:00.
Case digest / b769436402de334e904fcb02807e7279223a50115d262129e17c9df7042942af