Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KeyError when running a transpiled dynamic circuit #13332

Open
LenaPer opened this issue Oct 16, 2024 · 2 comments
Open

KeyError when running a transpiled dynamic circuit #13332

LenaPer opened this issue Oct 16, 2024 · 2 comments
Labels
bug Something isn't working

Comments

@LenaPer
Copy link

LenaPer commented Oct 16, 2024

Environment

  • Qiskit version: 1.2.4
  • Qiskit runtime version: 0.30.0
  • Python version: 3.11.3
  • Operating system: macOS

What is happening?

When I send a transpiled dynamic circuit through the runtime sampler primitive it gives me a KeyError in the isa validation step. Looking at the function it looks like the number of qubits for the instruction IfElseOp does not match the number of qubits in the block inside the IfElseOp. It looks like it's the reason why the code here fails. Taking back the code in the function that looks into it :

from qiskit.circuit import QuantumCircuit, ControlFlowOp
for instruction in trans.data:
    operation = instruction.operation
    if isinstance(operation, ControlFlowOp):
        blocks = operation.blocks
        break
print('qubits in the instruction IfElse: ', instruction.qubits)
print('qubits in the sub circuit of the instruction IFElse: ', blocks[0].qubits)

it prints 2 different qubits (the transpiled and not transpiled ones) when they should be the same

qubits in the instruction IfElse:  (Qubit(QuantumRegister(127, 'q'), 18),)
qubits in the sub circuit of the instruction IFElse:  [Qubit(QuantumRegister(1, 'my_qubit'), 0)]

How can we reproduce the issue?

from qiskit_ibm_runtime import QiskitRuntimeService, Sampler
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister

service = QiskitRuntimeService(channel='ibm_quantum')
backend = service.backend('ibm_cusco')

pm = generate_preset_pass_manager(backend=backend, optimization_level=2)

qubits = QuantumRegister(1, name='my_qubit')
clbits = ClassicalRegister(1, name='bit')
circuit = QuantumCircuit(qubits, clbits)

circuit.h(qubits[0])
circuit.measure(qubits[0], clbits[0])
with circuit.if_test((clbits[0], 0b01)): 
    circuit.x(qubits[0])
circuit.measure(qubits[0], clbits[0])

trans = pm.run(circuit)
trans.draw('mpl', idle_wires=False)

sampler = Sampler(mode=backend)
job = sampler.run([trans])

returns this error :

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[1], line 24
     21 trans.draw('mpl', idle_wires=False)
     23 sampler = Sampler(mode=backend)
---> 24 job = sampler.run([trans])

File [~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/sampler.py:123](http://localhost:8889/~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/sampler.py#line=122), in SamplerV2.run(self, pubs, shots)
    119 coerced_pubs = [SamplerPub.coerce(pub, shots) for pub in pubs]
    121 validate_classical_registers(coerced_pubs)
--> 123 return self._run(coerced_pubs)

File [~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/base_primitive.py:176](http://localhost:8889/~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/base_primitive.py#line=175), in BasePrimitiveV2._run(self, pubs)
    174 for pub in pubs:
    175     if getattr(self._backend, "target", None) and not is_simulator(self._backend):
--> 176         validate_isa_circuits([pub.circuit], self._backend.target)
    178     if isinstance(self._backend, IBMBackend):
    179         self._backend.check_faulty(pub.circuit)

File [~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/validations.py:88](http://localhost:8889/~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/validations.py#line=87), in validate_isa_circuits(circuits, target)
     81 """Validate if all circuits are ISA circuits
     82 
     83 Args:
     84     circuits: A list of QuantumCircuits.
     85     target: The backend target
     86 """
     87 for circuit in circuits:
---> 88     message = is_isa_circuit(circuit, target)
     89     if message:
     90         raise IBMInputValueError(
     91             message
     92             + " Circuits that do not match the target hardware definition are no longer "
   (...)
     97             "this coupled with operator transformations."
     98         )

File [~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/utils.py:97](http://localhost:8889/~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/utils.py#line=96), in is_isa_circuit(circuit, target)
     91     return (
     92         f"The circuit has {circuit.num_qubits} qubits "
     93         f"but the target system requires {target.num_qubits} qubits."
     94     )
     96 qubit_map = {qubit: index for index, qubit in enumerate(circuit.qubits)}
---> 97 return _is_isa_circuit_helper(circuit, target, qubit_map)

File [~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/utils.py:72](http://localhost:8889/~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/utils.py#line=71), in _is_isa_circuit_helper(circuit, target, qubit_map)
     70 if isinstance(operation, ControlFlowOp):
     71     for sub_circ in operation.blocks:
---> 72         sub_string = _is_isa_circuit_helper(sub_circ, target, qubit_map)
     73         if sub_string:
     74             return sub_string

File [~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/utils.py:60](http://localhost:8889/~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/utils.py#line=59), in _is_isa_circuit_helper(circuit, target, qubit_map)
     57 operation = instruction.operation
     59 name = operation.name
---> 60 qargs = tuple(qubit_map[bit] for bit in instruction.qubits)
     61 if (
     62     not target.instruction_supported(name, qargs)
     63     and name != "barrier"
     64     and not circuit.has_calibration_for(instruction)
     65 ):
     66     return (
     67         f"The instruction {name} on qubits {qargs} is not supported by the target system."
     68     )

File [~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/utils.py:60](http://localhost:8889/~/VirtualEnv/qiskit12/lib/python3.11/site-packages/qiskit_ibm_runtime/utils/utils.py#line=59), in <genexpr>(.0)
     57 operation = instruction.operation
     59 name = operation.name
---> 60 qargs = tuple(qubit_map[bit] for bit in instruction.qubits)
     61 if (
     62     not target.instruction_supported(name, qargs)
     63     and name != "barrier"
     64     and not circuit.has_calibration_for(instruction)
     65 ):
     66     return (
     67         f"The instruction {name} on qubits {qargs} is not supported by the target system."
     68     )

KeyError: Qubit(QuantumRegister(1, 'my_qubit'), 0)

What should happen?

The qubits of the block and the instruction should match.

Any suggestions?

No response

@LenaPer LenaPer added the bug Something isn't working label Oct 16, 2024
@jakelishman
Copy link
Member

The qubit instances in the block and in the qargs are not required to match - the point of qargs is to provide a mapping for what objects the inner qubits actually refer to.

This appears to be a bug in the Runtime ISA circuits check, not Qiskit.

@jakelishman
Copy link
Member

Fwiw, I think @yaelbh might already have fixed this bug, or have a PR somewhere around that does.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants