[PYTHON] À propos de la profondeur dans Qiskit (circuit normal et QuantumVolume)

À propos de la profondeur de Qiskit

■ `` profondeur '' qui représente la profondeur d'un circuit normal

from qiskit.circuit.random import random_circuit

(1) Nombre de bits quantiques: 1, valeur de profondeur: 5

circ_r1 = random_circuit(num_qubits=1, depth=5)
print('depth =', circ_r1.depth())
circ_r1.draw(output='mpl')
depth = 5

image.png

(2) Nombre de bits quantiques: 5, valeur de profondeur: 5

circ_r2 = random_circuit(num_qubits=5, depth=5)
print('depth =', circ_r2.depth())
circ_r2.draw(output='mpl')
depth = 5

image.png

③ Nombre de bits quantiques: 1, valeur de profondeur: 10,

circ_r3 = random_circuit(num_qubits=1, depth=10)
print('depth =', circ_r3.depth())
circ_r3.draw(output='mpl')
depth = 10

image.png

④ Nombre de bits quantiques: 5, valeur de profondeur: 10

circ_r4 = random_circuit(num_qubits=5, depth=10)
print('depth =', circ_r4.depth())
circ_r4.draw(output='mpl')
depth = 10

image.png

Il est difficile de comprendre intuitivement la valeur de profondeur lorsque le nombre de bits quantiques (num_qubits) est multiple, mais si le nombre de bits quantiques est réglé sur 1, le nombre de profondeurs sera le même que le nombre de portes.

depth``` en QuantumVolume (QV)

from qiskit.circuit.library import QuantumVolume

(1) Nombre de bits quantiques: 5, valeur de profondeur (QV): 5

circ_q1 = QuantumVolume(num_qubits=5, depth=5)
print('depth =', circ_q1.depth())
circ_q1.draw('mpl')
depth = 1

image.png

La figure ci-dessus montre les différentes portes combinées en une seule. Si vous mesurez la `profondeur` '' telle qu'elle est, ce sera" 1 "comme il en a l'air. Je ne suis pas sûr que ce soit le cas, alors vérifiez-le par décomposer '' (décomposition = expansion du circuit).

circ_q1_d1 = circ_q1.decompose()
print('depth =', circ_q1_d1.depth())
circ_q1_d1.draw('mpl')
depth = 5

image.png

Bien qu'il ait été déployé, plusieurs portes sont toujours en cours de montage. C'est un peu difficile à comprendre, mais comme les portes de la deuxième rangée (su4_83) et les portes de la troisième rangée (su4_767) fonctionnent sur des bits quantiques différents, elles peuvent être comptées comme "1" à l'avant.

Le gif du document suivant est facile à comprendre. Document Qiskit --circuit * Développez les propriétés du circuit quantique et vous trouverez un gif.

À propos, `` su4 '' est la porte d'une matrice unitaire aléatoire 4x4.

À partir de là, `` décomposez '' davantage pour en faire une unité de porte normale.

circ_q1_d2 = circ_q1_d1.decompose()
print('depth =', circ_q1_d2.depth())
circ_q1_d2.draw('mpl')
depth = 35

image.png

On voit que su4 est composé de portes CNOT et U3. De plus, lorsque la valeur de profondeur pour QV est de 5, on peut voir que la valeur de profondeur dans le circuit normal est de 35.

(2) Nombre de bits quantiques: 3, valeur de profondeur (QV): 5

Cette fois, réduisez le nombre de bits quantiques (5 → 3) et vérifiez.

circ_q2 = QuantumVolume(num_qubits=3, depth=5)
print('depth =', circ_q2.depth())
circ_q2.draw('mpl')
depth = 1

image.png

circ_q2_d1 = circ_q2.decompose()
print('depth =', circ_q2_d1.depth())
circ_q2_d1.draw('mpl')
depth = 5

image.png

circ_q2_d2 = circ_q2_d1.decompose()
print('depth =', circ_q2_d2.depth())
circ_q2_d2.draw('mpl')
depth = 35

image.png

On peut voir que lorsque la valeur de profondeur de QV est de 5 quel que soit le nombre de bits quantiques, la valeur de profondeur du circuit normal est de 35.

③ Nombre de bits quantiques: 3, valeur de profondeur (QV): 3

Réduisez encore la valeur de profondeur (5 → 3) et vérifiez.

circ_q3 = QuantumVolume(num_qubits=3, depth=3)
print('depth =', circ_q3.depth())
circ_q3.draw('mpl')
depth = 1

image.png

circ_q3_d1 = circ_q3.decompose()
print('depth =', circ_q3_d1.depth())
circ_q3_d1.draw('mpl')
depth = 3

image.png

circ_q3_d2 = circ_q3_d1.decompose()
print('depth =', circ_q3_d2.depth())
circ_q3_d2.draw('mpl')
depth = 21

image.png

On peut voir que lorsque la valeur de profondeur de QV change, la valeur de profondeur du circuit normal change également.

Comment générer un circuit QV

import qiskit.ignis.verification.quantum_volume as qv
qubit_lists = [[0,1,3,5,7]]
ntrials = 50
qv_circs, qv_circs_nomeas = qv.qv_circuits(qubit_lists, ntrials)

Il existe deux types de circuits générés, l'un avec mesure ( qv_circs '') et l'autre sans mesure ( qv_circs_nomeas ''). Tout d'abord, vérifiez le circuit avec la mesure.

print("depth =", qv_circs[0][0].decompose().depth())
qv_circs[0][0].decompose().draw('mpl')
depth = 36

image.png

La valeur de profondeur est de 36. Lorsque la valeur de profondeur de QV est de 5, la valeur de profondeur du circuit normal est de 35, mais elle est de +1 en raison de l'ajout de l'opération de mesure.

Ensuite, vérifiez le circuit sans mesure.

print("depth =", qv_circs_nomeas[0][0].decompose().depth())
qv_circs_nomeas[0][0].decompose().draw('mpl')
depth = 36

image.png

La valeur de profondeur est également de 36, mais comme la dernière couche est une porte U3 pratiquement sans opération, elle peut être considérée comme une valeur de profondeur de 35.

Ensuite, vérifions la profondeur après avoir converti le circuit sans mesure avec un transpileur.

import qiskit.compiler.transpile
qv_circs_nomeas[0] = qiskit.compiler.transpile(qv_circs_nomeas[0], basis_gates=['u1','u2','u3','cx'])
print("depth =", qv_circs_nomeas[0].depth())
qv_circs_nomeas[0].draw('mpl')
depth = 31

image.png

La valeur de profondeur était de 31. C'est un résultat naturel car le nombre de portes a changé en fonction du transpileur, mais on peut voir que la valeur de profondeur du circuit normal n'est pas directement liée à la mesure de la valeur QV.

Reference

Recommended Posts

À propos de la profondeur dans Qiskit (circuit normal et QuantumVolume)
À propos de Python et Cython dtype
À propos de _ et __
Pensez aux recherches de priorité de profondeur et de priorité de largeur en Python
À propos de la différence entre "==" et "is" en python
À propos de l'erreur d'importation de numpy et scipy dans anaconda
Tracer et comprendre la distribution normale multivariée en Python