Gate broadcasting over multiple registers unrolls to the wrong circuit
维护者通常 1 天内回复
评估
这个 Issue 还没有评估数据。
描述
Limitation
Broadcasting defines register arguments as an
element-wise shorthand: every register operand must have the same length, and the gate is
applied once per index, pairing operands positionally. Single-qubit operands are repeated.
The spec's own example:
qubit[1] qr0;
qubit[3] qr1;
qubit[2] qr2;
qubit[3] qr3;
g4 qr0[0], qr1, qr2[0], qr3; // ok
is stated to be equivalent to
g4 qr0[0], qr1[0], qr2[0], qr3[0];
g4 qr0[0], qr1[1], qr2[0], qr3[1];
g4 qr0[0], qr1[2], qr2[0], qr3[2];
pyqasm instead flattens every operand into one list and slices it into consecutive chunks
of the gate's arity. For a two-register call this produces a different circuit with no
error raised, and for the mixed register/qubit form it raises a spurious validation error.
Example QASM failure
Wrong output, silently:
OPENQASM 3.0;
include "stdgates.inc";
qubit[4] q;
qubit[4] r;
cx q, r;
>>> import pyqasm
>>> m = pyqasm.loads(qasm); m.unroll(); print(pyqasm.dumps(m))
OPENQASM 3.0;
include "stdgates.inc";
qubit[4] q;
qubit[4] r;
cx q[0], q[1];
cx q[2], q[3];
cx r[0], r[1];
cx r[2], r[3];
Expected per spec:
cx q[0], r[0];
cx q[1], r[1];
cx q[2], r[2];
cx q[3], r[3];
Spurious rejection of the mixed form:
OPENQASM 3.0;
include "stdgates.inc";
qubit[4] q;
qubit[1] r;
cx q, r[0];
// ValidationError: Invalid number of qubits 5 for operation cx
OPENQASM 3.0;
gate g4 a, b, c, d { }
qubit[1] qr0; qubit[3] qr1; qubit[2] qr2; qubit[3] qr3;
g4 qr0[0], qr1, qr2[0], qr3;
// ValidationError: Qubit count mismatch for gate 'g4'. Expected 4 qubits, but got 8 instead.
Change Requested
Replace the flatten-and-chunk expansion with spec broadcasting:
- Resolve each operand to a list of qubits, keeping operand boundaries.
- Let
nbe the length of the register operands. All register operands must share the same
n; otherwise raise aValidationErrornaming the two mismatched operands. - Emit
ngate applications; at iterationitake elementifrom each register operand
and repeat single-qubit operands unchanged. - If there are no register operands, emit exactly one application.
Implementation Details
-
The defect is in
Qasm3Visitor._unroll_multiple_target_qubits
(src/pyqasm/visitor.py:1039). It callsself._get_op_bits(operation, qubits=True), which
already discards operand boundaries, then chunks linearly:for i in range(0, len(op_qubits), gate_qubit_count): qubit_subsets.append(op_qubits[i : i + gate_qubit_count]) -
_get_op_bitsneeds a variant that returnslist[list[...]](one inner list per operand)
so the boundary information survives._broadcast_gate_operation(visitor.py:1067)
consumes the result and needs no change. -
This is a deliberate behaviour change, not a pure bug fix. The current docstring
documents flatten-and-chunk as intended:'cx q[0], q[1], q[2], q[3]'→
[[q[0], q[1]], [q[2], q[3]]]. That calling form — four single-qubit operands for a
two-qubit gate — is not valid OpenQASM 3 broadcasting in the first place. Maintainers
should decide whether to keep it as a documented pyqasm extension or reject it; either way
the register case above must change. -
The same expansion path serves the modifier route at
visitor.py:1241andvisitor.py:1463,
soctrl @/inv @broadcasts are affected identically and need coverage. -
Tests: add
tests/qasm3/test_gate.pycases for two-registercx, mixed register/qubit,
the specg4example, the size-mismatch error, and a broadcast underctrl @.
- 主要语言
- Python
- 星标
- 29
- 派生
- 33
- 平均合并
- 2 天 4 小时
- 30 天内合并 PR
- 15
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
qBraid/pyqasm 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 63/100
维护者通常 1 天内回复
-
enhancement error-handling program-validation
难度 2/5 1-3 小时 新手友好度 65/100
维护者通常 1 天内回复
-
Move the QASM 2 printer and its branch pre-processing out of qasm2.py可能已有人在做 @danielgaskins 于 9 天前认领。 未关闭enhancement qasm2
难度 4/5 3-5 天 新手友好度 22/100
维护者通常 1 天内回复
-
[BUG] dumps() emits extern calls without a semicolon, producing unparsable QASM可能已有人在做 @Jah-yee 于 18 天前认领。 未关闭bug
难度 2/5 1-3 小时 新手友好度 25/100
维护者通常 1 天内回复
-
Parse failures raise ValidationError with an empty message; the ANTLR diagnostic is lost可能已有人在做 @tonycoder-hub 于 11 天前认领。 未关闭bug
难度 2/5 1-3 小时 新手友好度 22/100
维护者通常 1 天内回复
相似的 Issue
-
[Resource]: Lore未关闭resource-submission validation-passed
难度 1/5 1 小时以内 新手友好度 88/100
hesreallyhim/awesome-claude-code#3234 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
openminion/openminion#376 ·
维护者通常 1 天内回复
-
Type: ☹︎ Bug
难度 2/5 1-3 小时 新手友好度 78/100
posit-dev/great-tables#1028 ·
维护者通常 1 天内回复
-
integration: apple_tv
难度 2/5 1-3 小时 新手友好度 78/100
home-assistant/core#188282 · 1 条评论 ·
维护者通常 1 天内回复
-
A "since" range is worded as a career: "the past two seasons" says "regular season career (2025 on)"未关闭P4: low
难度 2/5 1-3 小时 新手友好度 65/100
jeffknupp/association#538 ·