3
$\begingroup$

I just started studying IBM Qiskit, and cannot find details about the barrier method on the QuantumCircuit class. It is shown in the circuit drawing, but I never heard about it after reading quantum computing text books. Is it a unitary gate? If so, how is it defined? Thanks.

$\endgroup$
8
$\begingroup$

You won't find the barrier in quantum computing textbooks because it isn't a standard primitive of quantum information theory like unitary gates and quantum circuits.

The barrier as a directive for circuit compilation to separate pieces of a circuit so that any optimizations or re-writes are constrained to only act between barriers (and if there a no barriers they act on the whole circuit). This only comes into play when using the transpile or execute functions in Qiskit (execute includes a transpile step).

Below is an example, and you can find more examples in these Qiskit tutorial notebooks:

Example

If a circuit has several 1-qubit gates in a row acting on the same qubit these can be combined into a single 1-qubit gate. If you wanted to explicitly prevent this sort of behaviour you can place a barrier between them.

Create a 1-qubit circuit with several gates

from qiskit import QuantumCircuit, QuantumRegister, transpile

qr = QuantumRegister(1)
circuit1 = QuantumCircuit(qr)
circuit1.u1(0.2, qr[0])
circuit1.u2(0.1,0.2, qr[0])
circuit1.u3(0.1, 0.2, 0.3, qr[0])
circuit1.draw()

This circuit is

         ┌─────────┐┌─────────────┐┌─────────────────┐
q0_0: |0>┤ U1(0.2) ├┤ U2(0.1,0.2) ├┤ U3(0.1,0.2,0.3) ├
         └─────────┘└─────────────┘└─────────────────┘

If we transpile it these gates are combined using the default settings

circuit1t = transpile(circuit1)
circuit1t.draw()

The returned circuit is

         ┌───────────────────────────┐
q0_0: |0>┤ U3(1.6629,0.6018,0.43905) ├
         └───────────────────────────┘

Now if we wanted to stop the gates being combined we could add barriers:

qr = QuantumRegister(1)
circuit2 = QuantumCircuit(qr)
circuit2.u1(0.2, qr[0])
circuit2.barrier(qr)
circuit2.u2(0.1,0.2, qr[0])
circuit2.barrier(qr)
circuit2.u3(0.1, 0.2, 0.3, qr[0])
circuit2.draw()

         ┌─────────┐ ░ ┌─────────────┐ ░ ┌─────────────────┐
q1_0: |0>┤ U1(0.2) ├─░─┤ U2(0.1,0.2) ├─░─┤ U3(0.1,0.2,0.3) ├
         └─────────┘ ░ └─────────────┘ ░ └─────────────────┘

In this case transpiling wont change the circuit:

circuit2t = transpile(circuit2)
circuit2t.draw()
         ┌─────────┐ ░ ┌─────────────┐ ░ ┌─────────────────┐
q1_0: |0>┤ U1(0.2) ├─░─┤ U2(0.1,0.2) ├─░─┤ U3(0.1,0.2,0.3) ├
         └─────────┘ ░ └─────────────┘ ░ └─────────────────┘
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.