Qiskit / qiskit

Qiskit is an open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.
https://www.ibm.com/quantum/qiskit
Apache License 2.0
5.11k stars 2.34k forks source link

Transpiling 1q circuit at optimization level 3 breaks in 1q basis #4826

Closed Cryoris closed 4 years ago

Cryoris commented 4 years ago

Information

What is the current behavior?

The following code breaks if basis_gates=['u3'] and optimization_level=3. It works for basis_gates=['u3','cx'] or if optimization_level<=2.

qc = QuantumCircuit(1)
qc.x(0)
transpile(qc, basis_gates=['u3'], optimization_level=3)

Edit: changed to a simpler example.

Traceback

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jul/Work/Qiskit/qiskit-terra/qiskit/compiler/transpile.py", line 214, in transpile
    circuits = parallel_map(_transpile_circuit, list(zip(circuits, transpile_args)))
  File "/Users/jul/Work/Qiskit/qiskit-terra/qiskit/tools/parallel.py", line 108, in parallel_map
    return [task(values[0], *task_args, **task_kwargs)]
  File "/Users/jul/Work/Qiskit/qiskit-terra/qiskit/compiler/transpile.py", line 304, in _transpile_circuit
    pass_manager = level_3_pass_manager(pass_manager_config)
  File "/Users/jul/Work/Qiskit/qiskit-terra/qiskit/transpiler/preset_passmanagers/level3.py", line 176, in level_3_pass_manager
    ConsolidateBlocks(basis_gates=basis_gates),
  File "/Users/jul/Work/Qiskit/qiskit-terra/qiskit/transpiler/basepasses.py", line 31, in __call__
    pass_instance = type.__call__(cls, *args, **kwargs)
  File "/Users/jul/Work/Qiskit/qiskit-terra/qiskit/transpiler/passes/optimization/consolidate_blocks.py", line 63, in __init__
    self.decomposer = TwoQubitBasisDecomposer(kak_basis_gate)
  File "/Users/jul/Work/Qiskit/qiskit-terra/qiskit/quantum_info/synthesis/two_qubit_decompose.py", line 293, in __init__
    basis = self.basis = TwoQubitWeylDecomposition(Operator(gate).data)
  File "/Users/jul/Work/Qiskit/qiskit-terra/qiskit/quantum_info/operators/operator.py", line 103, in __init__
    raise QiskitError("Invalid input data format for Operator")
qiskit.exceptions.QiskitError: 'Invalid input data format for Operator'

What is the expected behavior?

Transpile with only a single qubit gate, if possible (or throw a meaningful error).

anto-pv commented 4 years ago

i got expected behaviour , try updating or moving to another low version of terra or other

Cryoris commented 4 years ago

On stable it still works, right, but we should fix it on the master version (ideally before the release). Which versions did you try for transpiling? I'm running on 5bdd12db84b2ef13292d26cd6750fa8fabd61bb3 (version of July 30th).