qiskit-experiments
qiskit-experiments copied to clipboard
CircuitError: 'Index 0 out of range for size 0.'
Informations
- Qiskit Experiments version: 0.5.2
- Python version: 3.10.11
- Operating system: Fedora 37
What is the current behavior?
I tried running ProcessTomography and it throws an error.
Steps to reproduce the problem
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import CircuitInstruction
from qiskit.circuit.library import IGate
from qiskit_aer import AerSimulator
from qiskit_experiments.library import ProcessTomography
backend = AerSimulator()
register = QuantumRegister(2, name="q")
a, b = register
circuit = QuantumCircuit.from_instructions(
[
CircuitInstruction(IGate(), (a,)),
CircuitInstruction(IGate(), (b,)),
],
qubits=register
)
experiment = ProcessTomography(circuit)
data = experiment.run(backend, shots=10000)
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
~/projects/qiskit-terra/qiskit/circuit/quantumcircuit.py in _bit_argument_conversion_scalar(specifier, bit_sequence, bit_set, type_)
5151 try:
-> 5152 return bit_sequence[specifier]
5153 except IndexError as ex:
IndexError: list index out of range
The above exception was the direct cause of the following exception:
CircuitError Traceback (most recent call last)
<ipython-input-1-0736fc67b8f1> in <module>
19
20 experiment = ProcessTomography(circuit)
---> 21 data = experiment.run(backend, shots=10000)
~/.local/share/virtualenvs/qiskit-terra-rZn7sWYf/lib64/python3.10/site-packages/qiskit_experiments/framework/base_experiment.py in run(self, backend, analysis, timeout, **run_options)
236
237 # Generate and transpile circuits
--> 238 transpiled_circuits = experiment._transpiled_circuits()
239
240 # Initialize result container
~/.local/share/virtualenvs/qiskit-terra-rZn7sWYf/lib64/python3.10/site-packages/qiskit_experiments/framework/base_experiment.py in _transpiled_circuits(self)
317 transpile_opts = copy.copy(self.transpile_options.__dict__)
318 transpile_opts["initial_layout"] = list(self.physical_qubits)
--> 319 transpiled = transpile(self.circuits(), self.backend, **transpile_opts)
320
321 return transpiled
~/.local/share/virtualenvs/qiskit-terra-rZn7sWYf/lib64/python3.10/site-packages/qiskit_experiments/library/tomography/tomography_experiment.py in circuits(self)
217 # Add tomography preparation
218 prep_circ = self._prep_circ_basis.circuit(prep_element, self._prep_physical_qubits)
--> 219 circ.reset(self._prep_indices)
220 circ.compose(prep_circ, self._prep_indices, inplace=True)
221 circ.barrier(*self._prep_indices)
~/projects/qiskit-terra/qiskit/circuit/quantumcircuit.py in reset(self, qubit)
2278 qiskit.circuit.InstructionSet: handle to the added instruction.
2279 """
-> 2280 return self.append(Reset(), [qubit], [])
2281
2282 def measure(self, qubit: QubitSpecifier, cbit: ClbitSpecifier) -> InstructionSet:
~/projects/qiskit-terra/qiskit/circuit/quantumcircuit.py in append(self, instruction, qargs, cargs)
1284 operation = copy.deepcopy(operation)
1285
-> 1286 expanded_qargs = [self.qbit_argument_conversion(qarg) for qarg in qargs or []]
1287 expanded_cargs = [self.cbit_argument_conversion(carg) for carg in cargs or []]
1288
~/projects/qiskit-terra/qiskit/circuit/quantumcircuit.py in <listcomp>(.0)
1284 operation = copy.deepcopy(operation)
1285
-> 1286 expanded_qargs = [self.qbit_argument_conversion(qarg) for qarg in qargs or []]
1287 expanded_cargs = [self.cbit_argument_conversion(carg) for carg in cargs or []]
1288
~/projects/qiskit-terra/qiskit/circuit/quantumcircuit.py in qbit_argument_conversion(self, qubit_representation)
1165 List(Qubit): the resolved instances of the qubits.
1166 """
-> 1167 return _bit_argument_conversion(
1168 qubit_representation, self.qubits, self._qubit_indices, Qubit
1169 )
~/projects/qiskit-terra/qiskit/circuit/quantumcircuit.py in _bit_argument_conversion(specifier, bit_sequence, bit_set, type_)
5130 return bit_sequence[specifier]
5131 try:
-> 5132 return [
5133 _bit_argument_conversion_scalar(index, bit_sequence, bit_set, type_)
5134 for index in specifier
~/projects/qiskit-terra/qiskit/circuit/quantumcircuit.py in <listcomp>(.0)
5131 try:
5132 return [
-> 5133 _bit_argument_conversion_scalar(index, bit_sequence, bit_set, type_)
5134 for index in specifier
5135 ]
~/projects/qiskit-terra/qiskit/circuit/quantumcircuit.py in _bit_argument_conversion_scalar(specifier, bit_sequence, bit_set, type_)
5152 return bit_sequence[specifier]
5153 except IndexError as ex:
-> 5154 raise CircuitError(
5155 f"Index {specifier} out of range for size {len(bit_sequence)}."
5156 ) from ex
CircuitError: 'Index 0 out of range for size 0.'
What is the expected behavior?
No error.
Suggested solutions
If I initialize the circuit differently, as below, then it works.
register = QuantumRegister(2, name="q")
circuit = QuantumCircuit(register)
a, b = register
circuit.id(a)
circuit.id(b)
The issue is here, where the assumption is made that the circuit contains registers: https://github.com/Qiskit/qiskit-experiments/blob/0ce3f85d7609a81febf745bea84d9d000f8533b4/qiskit_experiments/library/tomography/tomography_experiment.py#L193C27-L195
template = QuantumCircuit(
*self._circuit.qregs, *self._circuit.cregs, meas_creg, name=null
)
In my repro, circuit.qregs
is an empty list, violating the assumption.
I tried replacing that line with
template = QuantumCircuit(
self._circuit.qubits, self._circuit.clbits, meas_creg, name=null
)
but then ran into https://github.com/Qiskit/qiskit-terra/issues/10125.