Přeskočit na hlavní obsah

Sestavení Circuit

Verze balíčků

Kód na této stránce byl vyvinut s použitím následujících požadavků. Doporučujeme používat tyto nebo novější verze.

qiskit[all]~=2.3.0

Tato stránka se podrobněji věnuje třídě QuantumCircuit v Qiskit SDK, včetně některých pokročilejších metod, které můžeš použít k vytváření kvantových Circuit.

Co je kvantový Circuit?

Jednoduchý kvantový Circuit je kolekce Qubitů a seznam instrukcí, které na tyto Qubity působí. Pro ilustraci následující buňka vytvoří nový Circuit se dvěma novými Qubity a poté zobrazí atribut qubits tohoto Circuit, což je seznam Qubitů seřazených od nejméně významného bitu q0q_0 po nejvýznamnější bit qnq_n.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.qubits
[<Qubit register=(2, "q"), index=0>, <Qubit register=(2, "q"), index=1>]

Více objektů QuantumRegister a ClassicalRegister lze zkombinovat a vytvořit tak Circuit. Každý QuantumRegister a ClassicalRegister lze také pojmenovat.

from qiskit.circuit import QuantumRegister, ClassicalRegister

qr1 = QuantumRegister(2, "qreg1") # Create a QuantumRegister with 2 qubits
qr2 = QuantumRegister(1, "qreg2") # Create a QuantumRegister with 1 qubit
cr1 = ClassicalRegister(3, "creg1") # Create a ClassicalRegister with 3 cbits

combined_circ = QuantumCircuit(
qr1, qr2, cr1
) # Create a quantum circuit with 2 QuantumRegisters and 1 ClassicalRegister
combined_circ.qubits
[<Qubit register=(2, "qreg1"), index=0>,
<Qubit register=(2, "qreg1"), index=1>,
<Qubit register=(1, "qreg2"), index=0>]

Index a registr Qubitu lze zjistit pomocí metody find_bit Circuit a jejích atributů.

desired_qubit = qr2[0]  # Qubit 0 of register 'qreg2'

print("Index:", combined_circ.find_bit(desired_qubit).index)
print("Register:", combined_circ.find_bit(desired_qubit).registers)
Index: 2
Register: [(QuantumRegister(1, 'qreg2'), 0)]

Přidání instrukce do Circuit připojí tuto instrukci k atributu data daného Circuit. Výstup následující buňky ukazuje, že data je seznam objektů CircuitInstruction, z nichž každý má atribut operation a atribut qubits.

qc.x(0)  # Add X-gate to qubit 0
qc.data
[CircuitInstruction(operation=Instruction(name='x', num_qubits=1, num_clbits=0, params=[]), qubits=(<Qubit register=(2, "q"), index=0>,), clbits=())]

Nejjednodušší způsob, jak tyto informace zobrazit, je metoda draw, která vrátí vizualizaci Circuit. Různé způsoby zobrazení kvantových Circuit najdeš v části Vizualizace Circuit.

qc.draw("mpl")

Output of the previous code cell

Objekty instrukcí Circuit mohou obsahovat „definiční" Circuit, které popisují danou instrukci pomocí základnějších instrukcí. Například X-Gate je definován jako speciální případ U3-Gate, obecnějšího jednoqubitového Gate.

# Draw definition circuit of 0th instruction in `qc`
qc.data[0].operation.definition.draw("mpl")

Output of the previous code cell

Instrukce a Circuit jsou si podobné v tom, že obě popisují operace na bitech a Qubitech, ale mají různé účely:

  • Instrukce jsou považovány za neměnné a jejich metody obvykle vrátí nové instrukce (aniž by mutovaly původní objekt).
  • Circuit jsou navrženy tak, aby se sestavovaly postupně přes mnoho řádků kódu, a metody QuantumCircuit často mutují stávající objekt.

Co je hloubka Circuit?

Hloubka (depth()) kvantového Circuit je míra počtu „vrstev" kvantových Gate prováděných paralelně, které jsou potřeba k dokončení výpočtu definovaného tímto Circuit. Protože implementace kvantových Gate trvá určitou dobu, hloubka Circuit přibližně odpovídá době, po kterou kvantový počítač Circuit provádí. Hloubka Circuit je proto jednou z důležitých veličin používaných k posouzení, zda lze daný kvantový Circuit na zařízení spustit.

Zbytek této stránky ukazuje, jak kvantové Circuit manipulovat.

Sestavení Circuit

Metody jako QuantumCircuit.h a QuantumCircuit.cx přidávají do Circuit konkrétní instrukce. Pro obecnější přidávání instrukcí do Circuit použij metodu append. Ta přijímá instrukci a seznam Qubitů, na které se má instrukce aplikovat. Seznam podporovaných instrukcí najdeš v dokumentaci API Circuit Library.

from qiskit.circuit.library import HGate

qc = QuantumCircuit(1)
qc.append(
HGate(), # New HGate instruction
[0], # Apply to qubit 0
)
qc.draw("mpl")

Output of the previous code cell

Pro spojení dvou Circuit použij metodu compose. Ta přijímá další QuantumCircuit a volitelný seznam mapování Qubitů.

poznámka

Metoda compose vrátí nový Circuit a nemutuje žádný z Circuit, na které působí. Chceš-li mutovat Circuit, na kterém metodu compose voláš, použij argument inplace=True.

qc_a = QuantumCircuit(4)
qc_a.x(0)

qc_b = QuantumCircuit(2, name="qc_b")
qc_b.y(0)
qc_b.z(1)

# compose qubits (0, 1) of qc_a to qubits (1, 3) of qc_b respectively
combined = qc_a.compose(qc_b, qubits=[1, 3])
combined.draw("mpl")

Output of the previous code cell

Možná budeš také chtít zkompilovat Circuit do instrukcí, aby byly tvoje Circuit přehledné. Circuit lze převést na instrukci pomocí metody to_instruction a tuto instrukci pak připojit k jinému Circuit stejně jako jakoukoli jinou instrukci. Circuit nakreslený v následující buňce je funkčně ekvivalentní Circuit nakreslenému v předchozí buňce.

inst = qc_b.to_instruction()
qc_a.append(inst, [1, 3])
qc_a.draw("mpl")

Output of the previous code cell

Je-li tvůj Circuit unitární, můžeš jej převést na Gate pomocí metody to_gate. Objekty Gate jsou specifické typy instrukcí s některými extra funkcemi, například metodou control, která přidá kvantové řízení.

gate = qc_b.to_gate().control()
qc_a.append(gate, [0, 1, 3])
qc_a.draw("mpl")

Output of the previous code cell

Chceš-li vidět, co se děje, můžeš použít metodu decompose, která každou instrukci rozloží na její definici.

poznámka

Metoda decompose vrátí nový Circuit a nemutuje Circuit, na který působí.

qc_a.decompose().draw("mpl")

Output of the previous code cell

Měření Qubitů

Měření slouží k vzorkování stavů jednotlivých Qubitů a přenosu výsledků do klasického registru. Pokud odesíláš Circuit do primitiva Sampler, měření jsou povinná. Circuit odesílané do primitiva Estimator naopak měření nesmějí obsahovat.

Qubity lze měřit třemi metodami: measure, measure_all a measure_active. Jak vizualizovat naměřené výsledky se dozvíš na stránce Vizualizace výsledků.

  1. QuantumCircuit.measure : měří každý Qubit uvedený v prvním argumentu na klasický bit zadaný jako druhý argument. Tato metoda umožňuje plnou kontrolu nad tím, kam se výsledek měření uloží.

  2. QuantumCircuit.measure_all : nepřijímá žádný argument a lze ji použít pro kvantové Circuit bez předem definovaných klasických bitů. Vytvoří klasické dráty a ukládá výsledky měření v pořadí. Například měření Qubitu qiq_i se uloží do cbitu measimeas_i). Před měřením také přidá bariéru.

  3. QuantumCircuit.measure_active : podobná metodě measure_all, ale měří pouze Qubity, které mají operace.

qc1 = QuantumCircuit(2, 2)
qc1.measure(0, 1)
qc1.draw("mpl", cregbundle=False)

Output of the previous code cell

qc2 = QuantumCircuit(2)
qc2.measure_all()
qc2.draw("mpl", cregbundle=False)

Output of the previous code cell

qc3 = QuantumCircuit(2)
qc3.x(1)
qc3.measure_active()
qc3.draw("mpl", cregbundle=False)

Output of the previous code cell

Parametrizované Circuit

Mnoho krátkodobých kvantových algoritmů zahrnuje provádění mnoha variací kvantového Circuit. Protože sestavování a optimalizace rozsáhlých Circuit může být výpočetně nákladné, Qiskit podporuje parametrizované Circuit. Tyto Circuit mají nedefinované parametry, jejichž hodnoty nemusí být určeny až do okamžiku těsně před spuštěním Circuit. To ti umožňuje přesunout sestavení a optimalizaci Circuit mimo hlavní programovou smyčku. Následující buňka vytvoří a zobrazí parametrizovaný Circuit.

from qiskit.transpiler import generate_preset_pass_manager
from qiskit.circuit import Parameter

angle = Parameter("angle") # undefined number

# Create and optimize circuit once
qc = QuantumCircuit(1)
qc.rx(angle, 0)
qc = generate_preset_pass_manager(
optimization_level=3, basis_gates=["u", "cx"]
).run(qc)

qc.draw("mpl")

Output of the previous code cell

Následující buňka vytvoří mnoho variací tohoto Circuit a zobrazí jednu z nich.

circuits = []
for value in range(100):
circuits.append(qc.assign_parameters({angle: value}))

circuits[0].draw("mpl")

Output of the previous code cell

Seznam nedefinovaných parametrů Circuit najdeš v jeho atributu parameters.

qc.parameters
ParameterView([Parameter(angle)])

Změna názvu parametru

Výchozí názvy parametrů parametrizovaného Circuit mají předponu x – například x[0]. Tyto názvy lze změnit poté, co jsou definovány, jak ukazuje následující příklad.

from qiskit.circuit.library import z_feature_map
from qiskit.circuit import ParameterVector

# Define a parameterized circuit with default names
# For example, x[0]
circuit = z_feature_map(2)

# Set new parameter names
# They will now be prefixed by `hi` instead
# For example, hi[0]
training_params = ParameterVector("hi", 2)

# Assign parameter names to the quantum circuit
circuit = circuit.assign_parameters(parameters=training_params)
Zapomněl/a jsi název metody? Zkus se zeptat Qiskit Code Assistant.

Další kroky

Doporučení