qiskit-experiments icon indicating copy to clipboard operation
qiskit-experiments copied to clipboard

CircuitError: 'Index 0 out of range for size 0.'

Open kevinsung opened this issue 1 year ago • 2 comments

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)

kevinsung avatar May 17 '23 03:05 kevinsung

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.

kevinsung avatar May 17 '23 13:05 kevinsung

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.

kevinsung avatar May 18 '23 18:05 kevinsung