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 po nejvýznamnější bit .
# 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")
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")
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")
Pro spojení dvou Circuit použij metodu compose. Ta přijímá další QuantumCircuit a volitelný seznam mapování Qubitů.
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")
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")
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")
Chceš-li vidět, co se děje, můžeš použít metodu decompose, která každou instrukci rozloží na její definici.
Metoda decompose vrátí nový Circuit a nemutuje Circuit, na který působí.
qc_a.decompose().draw("mpl")
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ů.
-
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ží. -
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 se uloží do cbitu ). Před měřením také přidá bariéru. -
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)
qc2 = QuantumCircuit(2)
qc2.measure_all()
qc2.draw("mpl", cregbundle=False)
qc3 = QuantumCircuit(2)
qc3.x(1)
qc3.measure_active()
qc3.draw("mpl", cregbundle=False)
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")
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")
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)
Další kroky
- Chceš-li se dozvědět více o krátkodobých kvantových algoritmech, absolvuj kurz Návrh variačních algoritmů.
- Podívej se na příklad použití Circuit v tutoriálu Groverův algoritmus.
- Pracuj s jednoduchými Circuit pomocí IBM Quantum Composer.