Skip to content

Transpiler misses control pattern simplification #15348

@Mostafa-Atallah2020

Description

@Mostafa-Atallah2020

Environment

  • Qiskit: 2.2.1
  • Python: 3.14.0

What is happening?

Two multi-controlled RX gates with control patterns '11' and '10' should combine into a single controlled gate, but the transpiler produces 6x more gates.

Reproduction

import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit.circuit.library import RXGate
from qiskit.quantum_info import Statevector, state_fidelity

theta = np.pi / 4
qc = QuantumCircuit(3)
qc.append(RXGate(theta).control(2, ctrl_state='11'), [0, 1, 2])
qc.append(RXGate(theta).control(2, ctrl_state='01'), [0, 1, 2])

qc_opt = transpile(qc, basis_gates=['cx', 'u3'], optimization_level=3)
print(f"Transpiled: {len(qc_opt.data)} gates")  # Output: 31 gates

Expected behavior

Patterns '11' (q0=1 AND q1=1) and '10' (q0=1 AND q1=0) are complementary - they cover all cases where q0=1. They should combine into a single CRX controlled by q0:

optimal = QuantumCircuit(3)
optimal.append(RXGate(theta).control(1, ctrl_state='1'), [0, 2])
optimal_opt = transpile(optimal, basis_gates=['cx', 'u3'], optimization_level=3)
print(f"Optimal: {len(optimal_opt.data)} gates")  # Output: 5 gates

Expected: 5 gates
Actual: 31 gates (26 extra, 520% overhead)

Verification

Both circuits are equivalent (fidelity=1.0 on all 8 computational basis states):

for i in range(8):
    init = QuantumCircuit(3)
    for q in range(3):
        if (i >> q) & 1:
            init.x(q)

    test1, test2 = init.copy(), init.copy()
    test1.compose(qc, inplace=True)
    test2.compose(optimal, inplace=True)

    fid = state_fidelity(Statevector.from_instruction(test1),
                         Statevector.from_instruction(test2))
    print(f"|{i:03b}>: {fid:.10f}")  # All: 1.0000000000

Impact

This pattern appears in Hamiltonian simulation, variational algorithms, and any multi-controlled gate circuits. The overhead significantly impacts NISQ devices where gate count is critical.

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions