Перейти до основного вмісту

Бібліотека схем

Версії пакетів

Код на цій сторінці розроблено з такими залежностями. Рекомендуємо використовувати ці або новіші версії.

qiskit[all]~=2.3.0

Qiskit SDK містить бібліотеку популярних схем, які можна використовувати як будівельні блоки у власних програмах. Використання готових схем заощаджує час на дослідження, написання коду та налагодження. Бібліотека включає популярні схеми у квантових обчисленнях, схеми, що складно моделювати класичними методами, і схеми, корисні для бенчмаркінгу квантового залізо.

На цій сторінці перелічено різні категорії схем, що надає бібліотека. Повний перелік схем — у документації API бібліотеки схем.

Стандартні гейти

Бібліотека схем також містить стандартні квантові гейти. Одні з них є більш фундаментальними (наприклад, UGate), інші — мультикубітні гейти, які зазвичай будуються з однокубітних і двокубітних гейтів. Щоб додати імпортований гейт до схеми, використовуй метод append; перший аргумент — гейт, наступний — список кубітів, до яких він застосовується.

Наприклад, наступний рядок коду створює схему з гейтом Адамара та мультиконтрольованим X-гейтом.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
from qiskit.circuit.library import HGate, MCXGate

mcx_gate = MCXGate(3)
hadamard_gate = HGate()

qc = QuantumCircuit(4)
qc.append(hadamard_gate, [0])
qc.append(mcx_gate, [0, 1, 2, 3])
qc.draw("mpl")

Output of the previous code cell

Дивись Standard gates у документації API бібліотеки схем.

Not sure what your gate's called? Try asking Qiskit Code Assistant.

N-локальні схеми

Ці схеми чергують шари однокубітних гейтів обертання з шарами мультикубітних заплутувальних гейтів.

Ця сімейство схем популярна у варіаційних квантових алгоритмах, оскільки може породжувати широкий спектр квантових станів. Варіаційні алгоритми підлаштовують параметри гейтів, щоб знаходити стани з певними властивостями (наприклад, стани, що відповідають вдалому розв'язку задачі оптимізації). Для цього багато схем у бібліотеці є параметризованими — тобто їх можна визначати без фіксованих значень.

Наступний рядок коду імпортує схему n_local, де заплутувальними гейтами є двокубітні гейти. Ця схема чергує блоки параметризованих однокубітних гейтів із заплутувальними блоками двокубітних гейтів. Код нижче створює трикубітну схему з однокубітними RX-гейтами та двокубітними CZ-гейтами.

from qiskit.circuit.library import n_local

two_local = n_local(3, "rx", "cz")
two_local.draw("mpl")

Output of the previous code cell

Список-подібний об'єкт параметрів схеми можна отримати через атрибут parameters.

two_local.parameters
ParameterView([ParameterVectorElement(θ[0]), ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]), ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]), ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]), ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]), ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]), ParameterVectorElement(θ[11])])

Можна також присвоїти цим параметрам конкретні значення за допомогою словника виду { Parameter: number }. Для демонстрації наступний рядок коду присвоює кожному параметру схеми значення 0.

bound_circuit = two_local.assign_parameters(
{p: 0 for p in two_local.parameters}
)
bound_circuit.decompose().draw("mpl")

Output of the previous code cell

Більше інформації — у розділі N-local gates документації API бібліотеки схем або у курсі Variational algorithm design на IBM Quantum Learning.

Схеми кодування даних

Ці параметризовані схеми кодують дані у квантові стани для подальшої обробки алгоритмами квантового машинного навчання. Деякі підтримувані Qiskit підходи:

  • Амплітудне кодування — кожне число кодується в амплітуду базисного стану. Це дозволяє зберігати 2n2^n чисел в одному стані, але може бути дорогим у реалізації.
  • Базисне кодування — ціле число kk кодується підготовкою відповідного базисного стану k|k\rangle.
  • Кутове кодування — кожне число у даних задається як кут обертання у параметризованій схемі.

Найкращий підхід залежить від специфіки застосунку. Однак на сучасних квантових комп'ютерах зазвичай використовують схеми кутового кодування, наприклад zz_feature_map.

from qiskit.circuit.library import zz_feature_map

features = [0.2, 0.4, 0.8]
feature_map = zz_feature_map(feature_dimension=len(features))

encoded = feature_map.assign_parameters(features)
encoded.draw("mpl")

Output of the previous code cell

Дивись Data encoding circuits у документації API бібліотеки схем.

Схеми часової еволюції

Ці схеми моделюють еволюцію квантового стану в часі. Використовуй схеми часової еволюції для дослідження фізичних ефектів — теплопередачі або фазових переходів у системі. Схеми часової еволюції є також фундаментальним будівельним блоком хвильових функцій у хімії (наприклад, унітарних зв'язаних кластерних пробних станів) і алгоритму QAOA, що застосовується для розв'язання задач оптимізації.

from qiskit.circuit.library import PauliEvolutionGate
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp

# Prepare an initial state with a Hadamard on the middle qubit
state = QuantumCircuit(3)
state.h(1)

hamiltonian = SparsePauliOp(["ZZI", "IZZ"])
evolution = PauliEvolutionGate(hamiltonian, time=1)

# Evolve state by appending the evolution gate
state.compose(evolution, inplace=True)

state.draw("mpl")

Output of the previous code cell

Читай документацію API PauliEvolutionGate.

Схеми для бенчмаркінгу та теорії складності

Схеми бенчмаркінгу дають уявлення про те, наскільки добре працює залізо насправді, а схеми теорії складності допомагають зрозуміти, наскільки важкими є задачі, що ми хочемо розв'язати.

Наприклад, бенчмарк «квантового об'єму» вимірює, наскільки точно квантовий комп'ютер виконує певний тип випадкових квантових схем. Оцінка комп'ютера зростає разом із розміром схеми, яку він здатен надійно виконувати. Це враховує всі аспекти комп'ютера: кількість кубітів, точність інструкцій, зв'язність кубітів і програмний стек, що транспілює та постобробляє результати. Більше про квантовий об'єм — у оригінальній статті про quantum volume.

Нижче показано приклад схеми квантового об'єму, побудованої в Qiskit для чотирьох кубітів (блоки unitary — це рандомізовані двокубітні гейти).

from qiskit.circuit.library import quantum_volume

quantum_volume(4).draw("mpl")

Output of the previous code cell

Бібліотека схем також включає схеми, які, імовірно, складно моделювати класично, зокрема схеми миттєвих квантових поліномів (IQP). Ці схеми «обгортають» певні діагональні гейти (у обчислювальному базисі) блоками гейтів Адамара.

Серед інших схем — grover_operator для алгоритму Гровера та схема fourier_checking для задачі перевірки Фур'є. Дивись ці схеми у розділі Particular quantum circuits документації API бібліотеки схем.

Арифметичні схеми

Арифметичні операції — це класичні функції, як-от додавання цілих чисел і побітові операції. Вони можуть бути корисними в алгоритмах на кшталт оцінки амплітуд для фінансових застосунків і в алгоритмі HHL, що розв'язує системи лінійних рівнянь.

Як приклад, спробуймо скласти два тризначних числа за допомогою схеми «поширення переносу» для виконання додавання на місці (FullAdderGate). Цей суматор додає два числа (назвемо їх «A» і «B») і записує результат у регістр, де зберігалося B. У наступному прикладі A=2 і B=3.

from qiskit.circuit.library import FullAdderGate
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister

adder = FullAdderGate(3) # Adder of 3-bit numbers

# Create the number A=2
reg_a = QuantumRegister(3, "a")
number_a = QuantumCircuit(reg_a)
number_a.initialize(2) # Number 2; |010>

# Create the number B=3
reg_b = QuantumRegister(3, "b")
number_b = QuantumCircuit(reg_b)
number_b.initialize(3) # Number 3; |011>

# Create a circuit to hold everything, including a classical register for
# the result
qregs = [
QuantumRegister(1, "cin"),
QuantumRegister(3, "a"),
QuantumRegister(3, "b"),
QuantumRegister(1, "cout"),
]
reg_result = ClassicalRegister(3)
circuit = QuantumCircuit(*qregs, reg_result)

# Compose number initializers with the adder. Adder stores the result to
# register B, so we'll measure those qubits.
circuit = (
circuit.compose(number_a, qubits=reg_a)
.compose(number_b, qubits=reg_b)
.compose(adder)
)
circuit.measure(reg_b, reg_result)
circuit.draw("mpl")

Output of the previous code cell

Симуляція схеми показує, що вона повертає 5 для всіх 1024 запусків (тобто вимірюється з імовірністю 1.0).

from qiskit.primitives import StatevectorSampler

result = StatevectorSampler().run([circuit]).result()

print(f"Count data:\n {result[0].data.c0.get_int_counts()}")
Count data:
{5: 1024}

Дивись Arithmetic у документації API бібліотеки схем.

Наступні кроки

Рекомендації
  • Вивчи розширені методи створення схем у розділі Construct circuits.
  • Переглянь приклад використання схем у туторіалі Grover's Algorithm.
  • Ознайомся з довідником circuit library API.