[PYTHON] Über die Tiefe in Qiskit (normale Schaltung und QuantumVolume)

Über die Tiefe von Qiskit

■ `` `Tiefe```, die die Tiefe eines normalen Stromkreises darstellt

from qiskit.circuit.random import random_circuit

(1) Anzahl der Quantenbits: 1, Tiefenwert: 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) Anzahl der Quantenbits: 5, Tiefenwert: 5

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

image.png

③ Anzahl der Quantenbits: 1, Tiefenwert: 10,

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

image.png

④ Anzahl der Quantenbits: 5, Tiefenwert: 10

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

image.png

Es ist schwierig, den Tiefenwert intuitiv zu verstehen, wenn die Anzahl der Quantenbits (num_qubits) mehrfach ist. Wenn jedoch die Anzahl der Quantenbits auf 1 gesetzt ist, entspricht die Anzahl der Tiefen der Anzahl der Gatter.

■ `` `Tiefe``` in QuantumVolume (QV)

from qiskit.circuit.library import QuantumVolume

(1) Anzahl der Quantenbits: 5, (QV) Tiefenwert: 5

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

image.png

Die obige Abbildung zeigt die verschiedenen Tore in einem. Wenn Sie die Tiefe so messen, wie sie ist, wird sie so aussehen, wie sie aussieht. Ich bin mir nicht sicher, ob dies der Fall ist, also überprüfe es durch `` `Zerlegen``` (Zerlegung = Schaltungserweiterung).

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

image.png

Obwohl es bereitgestellt wurde, werden immer noch mehrere Tore zusammengesetzt. Es ist etwas schwer zu verstehen, aber da die Gatter in der zweiten Reihe (su4_83) und die Gatter in der dritten Reihe (su4_767) mit unterschiedlichen Quantenbits arbeiten, können sie vorne als "1" gezählt werden.

Das GIF des folgenden Dokuments ist leicht zu verstehen. Qiskit Document --circuit * Erweitern Sie die Eigenschaften der Quantenschaltung, und Sie finden ein GIF.

Übrigens ist `` `su4``` das Gate einer 4x4 zufälligen Einheitsmatrix.

Von hier aus weiter zerlegen, um es zu einer normalen Gate-Einheit zu machen.

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

image.png

Es ist ersichtlich, dass su4 aus CNOT- und U3-Gates besteht. Wenn der Tiefenwert für QV 5 beträgt, ist ersichtlich, dass der Tiefenwert in der normalen Schaltung 35 beträgt.

(2) Anzahl der Quantenbits: 3, (QV) Tiefenwert: 5

Reduzieren Sie nun die Anzahl der Quantenbits (5 → 3) und prüfen Sie.

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

Es ist ersichtlich, dass, wenn der Tiefenwert von QV unabhängig von der Anzahl der Quantenbits 5 beträgt, der Tiefenwert der normalen Schaltung 35 beträgt.

③ Anzahl der Quantenbits: 3, (QV) Tiefenwert: 3

Reduzieren Sie den Tiefenwert (5 → 3) weiter und prüfen Sie.

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

Es ist ersichtlich, dass sich auch der Tiefenwert der normalen Schaltung ändert, wenn sich der Tiefenwert von QV ändert.

So erzeugen Sie eine QV-Schaltung

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)

Es sind zwei Arten von Schaltkreisen zu erzeugen: mit Messung (`` qv_circs```) und ohne Messung ( `qv_circs_nomeas```). Überprüfen Sie zuerst den Stromkreis mit der Messung.

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

image.png

Der Tiefenwert beträgt 36. Wenn der Tiefenwert von QV 5 ist, ist der Tiefenwert der normalen Schaltung 35, aber er ist +1 aufgrund der Hinzufügung des Messvorgangs.

Überprüfen Sie als nächstes die Schaltung ohne Messung.

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

image.png

Der Tiefenwert beträgt ebenfalls 36, aber da die letzte Schicht ein U3-Gate mit praktisch keiner Operation ist, kann sie als Tiefenwert von 35 angesehen werden.

Als nächstes überprüfen wir die Tiefe nach dem Umrüsten der Schaltung ohne Messung mit einem Transpiler.

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

Der Tiefenwert betrug 31. Dies ist ein natürliches Ergebnis, da sich die Anzahl der Gates je nach Transpiler geändert hat. Es ist jedoch ersichtlich, dass der Tiefenwert des normalen Stromkreises nicht direkt mit der Messung des QV-Werts zusammenhängt.

Reference

Recommended Posts

Über die Tiefe in Qiskit (normale Schaltung und QuantumVolume)
Über Python und Cython dtype
Über _ und __
Denken Sie an Suchvorgänge mit Tiefenpriorität und Breitenpriorität in Python
Über den Unterschied zwischen "==" und "is" in Python
Über Importfehler von numpy und scipy in anaconda
Zeichnen und verstehen Sie die multivariate Normalverteilung in Python