10

Suppose I want to implement run several circuits one after another, but they are constructed in a similar fashion. I could reinstantiate a QuantumCircuit for each iteration, like this:

params = np.linspace(0, 2 * np.pi, num=20)
for p in params:
    circ = QuantumCircuit(q, c)
    do_stuff(circ, p)
    do_other_stuff()

but I'm afraid that creating a bunch of unnecessary circ objects takes too much memory or too many calls to the garbage collector.

Instead, I would like to remove the gates from the QuantumCircuit object and build the new circuit in the old object. Is it possible, and if so, is it reasonable?

Sanchayan Dutta
  • 17,945
  • 8
  • 50
  • 112
Alexey Uvarov
  • 716
  • 5
  • 15

1 Answers1

10

Quantum circuits have a data attribute, which is a list of all gates. You can remove elements from this as with any Python list. For example, here's a circuit

q = QuantumRegister(1)
circ = QuantumCircuit(q)

circ.h(q[0])
circ.s(q[0])
circ.x(q[0])

Let's get rid of the S gate. First, we can look at the list of gates with circ.data. This gives

[<qiskit.extensions.standard.h.HGate at 0x11721b7b8>,
 <qiskit.extensions.standard.s.SGate at 0x11721b828>,
 <qiskit.extensions.standard.x.XGate at 0x11721b7f0>]

Element 1 of this list (i.e. the second element) is the gate we want rid of. We can do this with pop.

qiskit.data.pop(1)

The resulting circuit can then be seen by print(circ)

         ┌───┐┌───┐
q0_0: |0>┤ H ├┤ X ├
         └───┘└───┘

As you can see, we have succeeded in removing the S gate.

Note that you can get information about the elements of the data list using the methods name and qargs, etc, of gate objects. For example, to see that element 0 is a Hadamard, and to see which qubit it acts on, we can use

print( circ.data[0].name )
print( circ.data[0].qargs )

This returns

h
[(QuantumRegister(1, 'q0'), 0)]
James Wootton
  • 11,700
  • 1
  • 35
  • 74