Utilitas addon Qiskit
Versi paket
Kode di halaman ini dikembangkan menggunakan persyaratan berikut. Kami menyarankan untuk menggunakan versi ini atau yang lebih baru.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
qiskit-addon-utils~=0.3.0
# Added by doQumentation β required packages for this notebook
!pip install -q numpy qiskit qiskit-addon-utils qiskit-ibm-runtime
Paket utilitas addon Qiskit adalah kumpulan fungsionalitas untuk melengkapi workflow yang melibatkan satu atau lebih addon Qiskit. Misalnya, paket ini berisi fungsi-fungsi untuk membuat Hamiltonian, menghasilkan Circuit evolusi waktu Trotter, serta memotong dan menggabungkan Circuit kuantum.
Instalasiβ
Ada dua cara untuk menginstal utilitas addon Qiskit: dari PyPI dan membangun dari sumber. Disarankan untuk menginstal paket-paket ini di virtual environment agar dependensi paket tetap terpisah.
Instal dari PyPIβ
Cara paling mudah untuk menginstal paket utilitas addon Qiskit adalah melalui PyPI.
pip install 'qiskit-addon-utils'
Instal dari sumberβ
Klik di sini untuk membaca cara menginstal paket ini secara manual.
Jika kamu ingin berkontribusi pada paket ini atau ingin menginstalnya secara manual, clone dulu repositorinya:
git clone git@github.com:Qiskit/qiskit-addon-utils.git
lalu instal paket melalui pip. Jika kamu berencana menjalankan tutorial yang ada di repositori paket, instal juga dependensi notebook-nya. Jika kamu berencana untuk mengembangkan di repositori tersebut, instal dependensi dev.
pip install tox jupyterlab -e '.[notebook-dependencies,dev]'
Mulai menggunakan utilitasβ
Ada beberapa modul dalam paket qiskit-addon-utils, termasuk satu untuk pembuatan masalah dalam simulasi sistem kuantum, pewarnaan graf untuk penempatan Gate yang lebih efisien dalam Circuit kuantum, dan pemotongan Circuit, yang dapat membantu dengan propagasi balik operator. Bagian-bagian berikut merangkum setiap modul. Dokumentasi API paket ini juga berisi informasi yang berguna.
Pembuatan masalahβ
Isi dari modul qiskit_addon_utils.problem_generators meliputi:
- Fungsi
generate_xyz_hamiltonian(), yang menghasilkan representasiSparsePauliOpyang sadar konektivitas dari model XYZ tipe Ising:
- Fungsi
generate_time_evolution_circuit(), yang membangun Circuit yang memodelkan evolusi waktu dari operator yang diberikan. - Tiga objek
PauliOrderStrategyberbeda untuk menghitung antara berbagai urutan string Pauli. Ini sangat berguna saat digunakan bersama pewarnaan graf dan bisa dipakai sebagai argumen di fungsigenerate_xyz_hamiltonian()maupungenerate_time_evolution_circuit().
Pewarnaan grafβ
Modul qiskit_addon_utils.coloring digunakan untuk mewarnai tepi-tepi dalam coupling map dan menggunakan pewarnaan ini untuk menempatkan Gate dalam Circuit kuantum secara lebih efisien. Tujuan dari coupling map tepi-berwarna ini adalah untuk menemukan sekumpulan warna tepi sehingga tidak ada dua tepi dengan warna yang sama yang berbagi node yang sama. Untuk QPU, ini berarti Gate di sepanjang tepi dengan warna yang sama (koneksi Qubit) bisa dijalankan secara bersamaan sehingga Circuit akan dieksekusi lebih cepat.
Sebagai contoh singkat, kamu bisa menggunakan fungsi auto_color_edges() untuk menghasilkan pewarnaan tepi bagi Circuit naif yang mengeksekusi CZGate di setiap koneksi Qubit. Cuplikan kode di bawah ini menggunakan coupling map Backend FakeSherbrooke, membuat Circuit naif ini, lalu menggunakan fungsi auto_color_edges() untuk membuat Circuit ekivalen yang lebih efisien.
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit import QuantumCircuit
from qiskit_addon_utils.coloring import auto_color_edges
from qiskit_addon_utils.slicing import combine_slices, slice_by_depth
from collections import defaultdict
backend = FakeSherbrooke()
coupling_map = backend.coupling_map
# Create naive circuit
circuit = QuantumCircuit(backend.num_qubits)
for edge in coupling_map.graph.edge_list():
circuit.cz(edge[0], edge[1])
# Color the edges of the coupling map
coloring = auto_color_edges(coupling_map)
circuit_with_coloring = QuantumCircuit(backend.num_qubits)
# Make a reverse coloring dict in order to make the circuit
color_to_edge = defaultdict(list)
for edge, color in coloring.items():
color_to_edge[color].append(edge)
# Place edges in order of color
for edges in color_to_edge.values():
for edge in edges:
circuit_with_coloring.cz(edge[0], edge[1])
print(f"The circuit without using edge coloring has depth: {circuit.depth()}")
print(
f"The circuit using edge coloring has depth: {circuit_with_coloring.depth()}"
)
The circuit without using edge coloring has depth: 37
The circuit using edge coloring has depth: 3
Pemotonganβ
Terakhir, modul qiskit-addon-utils.slicing berisi fungsi-fungsi dan pass Transpiler untuk bekerja dengan pembuatan "irisan" Circuit, partisi mirip-waktu dari QuantumCircuit yang mencakup semua Qubit. Irisan-irisan ini terutama digunakan untuk propagasi balik operator. Empat cara utama sebuah Circuit bisa dipotong adalah berdasarkan jenis Gate, kedalaman, pewarnaan, atau instruksi Barrier. Output dari fungsi-fungsi pemotongan ini menghasilkan daftar objek QuantumCircuit. Circuit yang sudah dipotong juga bisa digabungkan kembali menggunakan fungsi combine_slices(). Baca referensi API modul ini untuk informasi lebih lanjut.
Di bawah ini adalah beberapa contoh cara membuat irisan-irisan ini menggunakan Circuit berikut:
import numpy as np
from qiskit import QuantumCircuit
num_qubits = 9
qc = QuantumCircuit(num_qubits)
qc.ry(np.pi / 4, range(num_qubits))
qubits_1 = [i for i in range(num_qubits) if i % 2 == 0]
qubits_2 = [i for i in range(num_qubits) if i % 2 == 1]
qc.cx(qubits_1[:-1], qubits_2)
qc.cx(qubits_2, qubits_1[1:])
qc.cx(qubits_1[-1], qubits_1[0])
qc.rx(np.pi / 4, range(num_qubits))
qc.rz(np.pi / 4, range(num_qubits))
qc.draw("mpl", scale=0.6)
Dalam kasus di mana tidak ada cara yang jelas untuk memanfaatkan struktur Circuit untuk propagasi balik operator, kamu bisa mempartisi Circuit menjadi irisan dengan kedalaman tertentu.
# Slice circuit into partitions of depth 1
slices = slice_by_depth(qc, 1)
# Recombine slices in order to visualize the partitions together
combined_slices = combine_slices(slices, include_barriers=True)
combined_slices.draw("mpl", scale=0.6)
Dalam kasus seperti saat mengeksekusi Circuit Trotter untuk memodelkan dinamika sistem kuantum, mungkin lebih menguntungkan untuk memotong berdasarkan jenis Gate.
from qiskit_addon_utils.slicing import slice_by_gate_types
slices = slice_by_gate_types(qc)
# Recombine slices in order to visualize the partitions together
combined_slices = combine_slices(slices, include_barriers=True)
combined_slices.draw("mpl", scale=0.6)
Jika workload kamu dirancang untuk memanfaatkan konektivitas Qubit fisik dari QPU yang akan digunakan, kamu bisa membuat irisan berdasarkan pewarnaan tepi. Cuplikan kode di bawah ini akan menetapkan pewarnaan tiga-warna pada tepi-tepi Circuit dan memotong Circuit berdasarkan pewarnaan tepi tersebut. (Catatan: ini hanya mempengaruhi Gate non-lokal. Gate satu-Qubit akan dipotong berdasarkan jenis Gate).
from qiskit_addon_utils.slicing import slice_by_coloring
# Assign a color to each set of connected qubits
coloring = {}
for i in range(num_qubits - 1):
coloring[(i, i + 1)] = i % 3
coloring[(num_qubits - 1, 0)] = 2
# Create a circuit with operations added in order of color
qc = QuantumCircuit(num_qubits)
qc.ry(np.pi / 4, range(num_qubits))
edges = [
edge for color in range(3) for edge in coloring if coloring[edge] == color
]
for edge in edges:
qc.cx(edge[0], edge[1])
qc.rx(np.pi / 4, range(num_qubits))
qc.rz(np.pi / 4, range(num_qubits))
# Create slices by edge color
slices = slice_by_coloring(qc, coloring=coloring)
# Recombine slices in order to visualize the partitions together
combined_slices = combine_slices(slices, include_barriers=True)
combined_slices.draw("mpl", scale=0.6)
Jika kamu punya strategi pemotongan kustom, kamu bisa menempatkan Barrier dalam Circuit untuk menandai di mana Circuit harus dipotong dan menggunakan fungsi slice_by_barriers.
qc = QuantumCircuit(num_qubits)
qc.ry(np.pi / 4, range(num_qubits))
qc.barrier()
qubits_1 = [i for i in range(num_qubits) if i % 2 == 0]
qubits_2 = [i for i in range(num_qubits) if i % 2 == 1]
qc.cx(qubits_1[:-1], qubits_2)
qc.cx(qubits_2, qubits_1[1:])
qc.cx(qubits_1[-1], qubits_1[0])
qc.barrier()
qc.rx(np.pi / 4, range(num_qubits))
qc.rz(np.pi / 4, range(num_qubits))
qc.draw("mpl", scale=0.6)
Setelah Barrier ditempatkan, kamu bisa memeriksa setiap irisan secara individual.
from qiskit_addon_utils.slicing import slice_by_barriers
slices = slice_by_barriers(qc)
slices[0].draw("mpl", scale=0.6)
slices[1].draw("mpl", scale=0.6)
slices[2].draw("mpl", scale=0.6)
Langkah selanjutnyaβ
- Baca ikhtisar addon OBP.
- Pahami cara kerja addon SQD.
- Kenali addon AQC-Tensor.