Utiliti tambahan Qiskit
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
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
Pakej utiliti tambahan Qiskit ialah koleksi fungsi untuk melengkapi aliran kerja yang melibatkan satu atau lebih tambahan Qiskit. Sebagai contoh, pakej ini mengandungi fungsi untuk mencipta Hamiltonian, menjana Circuit evolusi masa Trotter, serta memotong dan menggabungkan Circuit kuantum.
Pemasanganβ
Terdapat dua cara untuk memasang utiliti tambahan Qiskit: PyPI dan membina daripada sumber. Adalah disyorkan untuk memasang pakej-pakej ini dalam persekitaran maya bagi memastikan pengasingan antara kebergantungan pakej.
Pasang daripada PyPIβ
Cara paling mudah untuk memasang pakej utiliti tambahan Qiskit ialah melalui PyPI.
pip install 'qiskit-addon-utils'
Pasang daripada sumberβ
Klik di sini untuk membaca cara memasang pakej ini secara manual.
Jika anda ingin menyumbang kepada pakej ini atau mahu memasangnya secara manual, mula-mula klon repositori:
git clone git@github.com:Qiskit/qiskit-addon-utils.git
dan pasang pakej melalui pip. Jika anda merancang untuk menjalankan tutorial yang terdapat dalam repositori pakej, pasang juga kebergantungan notebook. Jika anda merancang untuk membuat pembangunan dalam repositori, pasang kebergantungan dev.
pip install tox jupyterlab -e '.[notebook-dependencies,dev]'
Mulakan dengan utilitiβ
Terdapat beberapa modul dalam pakej qiskit-addon-utils, termasuk satu untuk penjanaan masalah bagi mensimulasikan sistem kuantum, pewarnaan graf untuk meletakkan Gate dalam Circuit kuantum dengan lebih cekap, dan penghirisan Circuit, yang boleh membantu dengan penyebaran balik pengendali. Bahagian berikut merumuskan setiap modul. Dokumentasi API pakej ini juga mengandungi maklumat yang berguna.
Penjanaan masalahβ
Kandungan modul qiskit_addon_utils.problem_generators merangkumi:
- Fungsi
generate_xyz_hamiltonian(), yang menjana perwakilanSparsePauliOpyang peka kepada sambungan bagi model XYZ jenis Ising:
- Fungsi
generate_time_evolution_circuit(), yang membina Circuit yang memodelkan evolusi masa bagi pengendali yang diberikan. - Tiga objek
PauliOrderStrategyyang berbeza untuk menghitung antara pelbagai susunan rentetan Pauli. Ini amat berguna apabila digunakan bersama pewarnaan graf dan boleh digunakan sebagai argumen dalam kedua-dua fungsigenerate_xyz_hamiltonian()dangenerate_time_evolution_circuit().
Pewarnaan grafβ
Modul qiskit_addon_utils.coloring digunakan untuk mewarnai tepi dalam peta gandingan dan menggunakan pewarnaan ini untuk meletakkan Gate dalam Circuit kuantum dengan lebih cekap. Tujuan peta gandingan berwarna-tepi ini adalah untuk mencari satu set warna tepi supaya tiada dua tepi dengan warna yang sama berkongsi nod yang sama. Bagi QPU, ini bermakna Gate di sepanjang tepi berwarna sama (sambungan Qubit) boleh dijalankan serentak dan Circuit akan dilaksanakan dengan lebih pantas.
Sebagai contoh ringkas, anda boleh menggunakan fungsi auto_color_edges() untuk menjana pewarnaan tepi bagi Circuit naif yang melaksanakan CZGate di sepanjang setiap sambungan Qubit. Petikan kod di bawah menggunakan peta gandingan Backend FakeSherbrooke, mencipta Circuit naif ini, kemudian menggunakan fungsi auto_color_edges() untuk mencipta Circuit setara yang lebih cekap.
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
Penghirisanβ
Akhir sekali, modul qiskit-addon-utils.slicing mengandungi fungsi dan laluan Transpiler untuk bekerja dengan penciptaan "hirisan" Circuit, partisi seperti masa bagi QuantumCircuit yang merentangi semua Qubit. Hirisan ini digunakan terutamanya untuk penyebaran balik pengendali. Empat cara utama sebuah Circuit boleh dihiris adalah mengikut jenis Gate, kedalaman, pewarnaan, atau arahan Barrier. Output fungsi penghirisan ini mengembalikan senarai objek QuantumCircuit. Circuit yang dihiris juga boleh digabungkan semula menggunakan fungsi combine_slices(). Baca rujukan API modul untuk maklumat lanjut.
Berikut adalah beberapa contoh cara mencipta hirisan 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 kes di mana tiada cara yang jelas untuk mengeksploitasi struktur Circuit bagi penyebaran balik pengendali, anda boleh mempartisikan Circuit kepada hirisan 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 kes seperti apabila melaksanakan Circuit Trotter untuk memodelkan dinamik sistem kuantum, mungkin lebih menguntungkan untuk menghiris mengikut 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 beban kerja anda direka untuk mengeksploitasi sambungan Qubit fizikal QPU yang akan digunakannya, anda boleh mencipta hirisan berdasarkan pewarnaan tepi. Petikan kod di bawah akan menetapkan pewarnaan tiga-warna kepada tepi Circuit dan menghiris Circuit berkenaan dengan pewarnaan tepi. (Nota: ini hanya mempengaruhi Gate bukan setempat. Gate satu Qubit akan dihiris mengikut 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 anda mempunyai strategi penghirisan tersuai, anda boleh sebaliknya meletakkan barrier dalam Circuit untuk menandakan tempat penghirisan 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 diletakkan, anda boleh memeriksa setiap hirisan secara individu.
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 seterusnyaβ
- Baca gambaran keseluruhan tambahan OBP.
- Fahami cara kerja tambahan SQD.
- Biasakan diri dengan tambahan AQC-Tensor.