Perubahan fitur Qiskit 1.0
Panduan ini menjelaskan jalur migrasi untuk perubahan fitur terpenting di Qiskit 1.0, yang diorganisasi berdasarkan modul. Gunakan daftar isi di sisi kanan untuk navigasi ke modul yang kamu butuhkan.
Alat migrasi Qiskit 1.0β
Untuk mempermudah proses migrasi, kamu bisa menggunakan alat
flake8-qiskit-migration
untuk mendeteksi jalur impor yang sudah dihapus di kode kamu dan menyarankan alternatifnya.
- Jalankan dengan pipx
- Jalankan dengan venv
Kalau kamu sudah menginstal pipx, cukup jalankan
perintah berikut.
pipx run flake8-qiskit-migration <path-to-source-directory>
Ini akan menginstal paket ke virtual environment sementara dan menjalankannya pada kode kamu.
Kalau kamu tidak ingin menggunakan pipx, kamu bisa membuat environment baru
secara manual untuk alat ini. Pendekatan ini juga memungkinkan kamu menggunakan
nbqa untuk memeriksa contoh kode di
notebook Jupyter. Hapus environment-nya setelah selesai.
# Make new environment and install
python -m venv .flake8-qiskit-migration-venv
source .flake8-qiskit-migration-venv/bin/activate
pip install flake8-qiskit-migration
# Run plugin on Python code
flake8 --select QKT100 <path-to-source-directory> # e.g. `src/`
# (Optional) run plugin on notebooks
pip install nbqa
nbqa flake8 ./**/*.ipynb --select QKT100
# Deactivate and delete environment
deactivate
rm -r .flake8-qiskit-migration-venv
Alat ini hanya mendeteksi jalur impor yang sudah dihapus. Alat ini tidak mendeteksi penggunaan
metode yang sudah dihapus (seperti QuantumCircuit.qasm) maupun argumennya. Alat ini juga tidak
bisa melacak assignment seperti qk = qiskit, meskipun bisa menangani alias seperti
import qiskit as qk.
Untuk informasi lebih lanjut, lihat repositori proyek ini.
Instance dan fungsi globalβ
Aerβ
Objek qiskit.Aer tidak tersedia di Qiskit 1.0. Sebagai gantinya, gunakan
objek yang sama dari namespace qiskit_aer, yang merupakan pengganti langsung.
Untuk menginstal qiskit_aer, jalankan:
pip install qiskit-aer
BasicAerβ
Objek qiskit.BasicAer tidak tersedia di Qiskit 1.0. Lihat
bagian migrasi basicaer untuk
pilihan migrasi.
executeβ
Fungsi qiskit.execute tidak tersedia di Qiskit 1.0. Fungsi ini
berperan sebagai wrapper tingkat tinggi di sekitar fungsi
transpile dan
run di Qiskit.
Alih-alih qiskit.execute, gunakan fungsi
transpile diikuti oleh
backend.run().
# Legacy path
from qiskit import execute
job = execute(circuit, backend)
# New path
from qiskit import transpile
new_circuit = transpile(circuit, backend)
job = backend.run(new_circuit)
Alternatifnya, primitif Sampler
secara semantis setara dengan fungsi qiskit.execute yang sudah dihapus.
Kelas BackendSampler adalah
wrapper generik untuk Backend yang tidak mendukung primitif:
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend)
job = sampler.run(circuit)
qiskit.circuitβ
QuantumCircuit.qasmβ
Metode QuantumCircuit.qasm telah dihapus. Sebagai gantinya, gunakan
qasm2.dump atau
qasm2.dumps.
Untuk output yang diformat dengan Pygments, lihat paket standalone
openqasm-pygments,
karena qasm2.dump dan qasm2.dumps tidak menyediakan output berwarna Pygments.
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
# Old
qasm_str = qc.qasm()
# Alternative
from qiskit.qasm2 import dumps
qasm_str = dumps(qc)
# Alternative: Write to file
from qiskit.qasm2 import dump
with open("my_file.qasm", "w") as f:
dump(qc, f)
Gate QuantumCircuitβ
Metode-metode Gate berikut telah dihapus demi metode yang lebih mapan yang menambahkan Gate yang sama:
| Dihapus | Alternatif |
|---|---|
QuantumCircuit.cnot | QuantumCircuit.cx |
QuantumCircuit.toffoli | QuantumCircuit.ccx |
QuantumCircuit.fredkin | QuantumCircuit.cswap |
QuantumCircuit.mct | QuantumCircuit.mcx |
QuantumCircuit.i | QuantumCircuit.id |
QuantumCircuit.squ | QuantumCircuit.unitary |
Metode-metode Circuit berikut telah dihapus. Sebagai gantinya, Gate-gate ini bisa
ditambahkan ke Circuit dengan QuantumCircuit.append.
| Dihapus | Alternatif (append) |
|---|---|
QuantumCircuit.diagonal | DiagonalGate |
QuantumCircuit.hamiltonian | HamiltonianGate |
QuantumCircuit.isometry | Isometry |
QuantumCircuit.iso | Isometry |
QuantumCircuit.uc | UCGate |
QuantumCircuit.ucrx | UCRXGate |
QuantumCircuit.ucry | UCRYGate |
QuantumCircuit.ucrz | UCRZGate |
Contohnya, untuk DiagonalGate:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import DiagonalGate # new location in the circuit library
circuit = QuantumCircuit(2)
circuit.h([0, 1]) # some initial state
gate = DiagonalGate([1, -1, -1, 1])
qubits = [0, 1] # qubit indices on which to apply the gate
circuit.append(gate, qubits) # apply the gate
Metode-metode QuantumCircuit berikut juga telah dihapus:
| Dihapus | Alternatif |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | instruksi save dari qiskit-aer |
qiskit.convertersβ
Fungsi qiskit.converters.ast_to_dag telah dihapus dari Qiskit. Fungsi ini mengonversi
abstract syntax tree yang dihasilkan oleh parser OpenQASM 2 lawas ke sebuah
DAGCircuit. Karena parser
OpenQASM 2 lawas sudah dihapus (lihat qiskit.qasm), fungsi ini
tidak lagi berguna. Sebagai gantinya, parse file OpenQASM 2 kamu ke
QuantumCircuit menggunakan metode konstruktor
QuantumCircuit.from_qasm_file
atau
QuantumCircuit.from_qasm_str
(atau modul qiskit.qasm2), lalu
konversi QuantumCircuit tersebut ke
DAGCircuit dengan
circuit_to_dag.
# Previous
from qiskit.converters import ast_to_dag
from qiskit.qasm import Qasm
dag = ast_to_dag(Qasm(filename="myfile.qasm").parse())
# Current alternative
import qiskit.qasm2
from qiskit.converters import circuit_to_dag
dag = circuit_to_dag(qiskit.qasm2.load("myfile.qasm"))
qiskit.extensionsβ
Modul qiskit.extensions tidak lagi tersedia. Sebagian besar objeknya telah
diintegrasikan ke dalam circuit library
(qiskit.circuit.library). Untuk migrasi ke
lokasi baru, cukup ganti qiskit.extensions dengan qiskit.circuit.library
di jalur impor objek. Ini adalah pengganti langsung.
# Previous
from qiskit.extensions import DiagonalGate
# Current alternative
from qiskit.circuit.library import DiagonalGate
Kelas-kelas yang dipindahkan ke qiskit.circuit.library adalah:
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
Kelas-kelas berikut telah dihapus dari codebase, karena fungsinya
sudah redundan atau terkait dengan modul extensions:
| Dihapus | Alternatif |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | Gunakan instruksi save dari qiskit-aer |
ExtensionError | Kelas error yang relevan |
qiskit.primitivesβ
Perubahan paling menonjol dalam modul qiskit.primitives adalah
diperkenalkannya antarmuka primitives V2 yang baru. Bagian ini menjelaskan cara migrasi
alur kerjamu dari primitives V1 ke primitives V2, serta beberapa perubahan pada
input yang diterima oleh antarmuka V1.
Mulai dari rilis 1.0, antarmuka primitives sebelum 1.0 akan disebut sebagai "primitives V1".
Migrasi dari V1 ke V2β
Perbedaan formal antara API primitives V1 dan V2 adalah kelas dasar tempat
implementasi primitives mewarisi sifatnya. Untuk beralih ke kelas dasar yang baru, kamu bisa tetap
menggunakan jalur impor asli dari qiskit.primitives:
| Migrasi dari | Ganti dengan |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
Nama implementasi inti qiskit dari primitives V2 (yang bisa diimpor dari qiskit.primitives)
telah diubah untuk memperjelas fungsinya sebagai implementasi yang bisa dijalankan secara lokal
dengan Backend simulator statevector. Nama baru tidak menyertakan sufiks -V2.
| Migrasi dari | Ganti dengan |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.primitives.StatevectorSampler |
Ada beberapa perbedaan konseptual yang perlu diperhatikan saat migrasi dari V1 ke V2.
Perbedaan ini ditentukan oleh kelas dasar, namun ditunjukkan dalam contoh berikut menggunakan implementasi
statevector yang ada di qiskit.primitives:
Untuk contoh-contoh berikut, asumsikan impor dan inisialisasi primitives berikut ini:
from qiskit.primitives import (
Sampler,
StatevectorSampler,
Estimator,
StatevectorEstimator,
)
estimator_v1 = Estimator()
sampler_v1 = Sampler()
estimator_v2 = StatevectorEstimator()
sampler_v2 = StatevectorSampler()
# define circuits, observables and parameter values
Sampler dan Estimator: Primitives V2 yang baru dirancang untuk menerima input yang divektorisasi, di mana Circuit tunggal bisa dikelompokkan dengan spesifikasi bernilai array. Artinya, satu Circuit bisa dieksekusi untuk arraynset parameter,nobservables, atau keduanya (dalam kasus estimator). Setiap kelompok disebut primitive unified bloc (PUB), dan bisa direpresentasikan sebagai tuple:(1 x circuit, [n x observables], [n x parameters]). Antarmuka V1 tidak memungkinkan fleksibilitas yang sama. Sebaliknya, jumlah Circuit input harus cocok dengan jumlah observables dan set parameter, seperti yang ditunjukkan dalam contoh berikut (pilih tab untuk melihat setiap contoh):
- Estimator, 1 Circuit, 4 observable
- Sampler, 1 Circuit, 3 set parameter
- Estimator, 1 Circuit, 4 observable, 2 set parameter
# executing 1 circuit with 4 observables using Estimator V1
job = estimator_v1.run([circuit] * 4, [obs1, obs2, obs3, obs4])
evs = job.result().values
# executing 1 circuit with 4 observables using Estimator V2
job = estimator_v2.run([(circuit, [obs1, obs2, obs3, obs4])])
evs = job.result()[0].data.evs
# executing 1 circuit with 3 parameter sets using Sampler V1
job = sampler_v1.run([circuit] * 3, [vals1, vals2, vals3])
dists = job.result().quasi_dists
# executing 1 circuit with 3 parameter sets using Sampler V2
job = sampler_v2.run([(circuit, [vals1, vals2, vals3])])
counts = job.result()[0].data.meas.get_counts()
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V1
job = estimator_v1.run([circuit] * 8, [obs1, obs2, obs3, obs4] * 2, [vals1, vals2] * 4)
evs = job.result().values
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V2
job = estimator_v2.run([(circuit, [[obs1, obs2, obs3, obs4]], [[vals1], [vals2]])])
evs = job.result()[0].data.evs
Primitives V2 menerima beberapa PUB sebagai input, dan setiap PUB mendapatkan hasilnya sendiri. Ini memungkinkan kamu menjalankan Circuit yang berbeda dengan berbagai kombinasi parameter/observable, yang tidak selalu mungkin dilakukan di antarmuka V1:
- Sampler, 2 Circuit, 1 set parameter
- Estimator, 2 Circuit, 2 observable berbeda
# executing 2 circuits with 1 parameter set using Sampler V1
job = sampler_v1.run([circuit1, circuit2], [vals1] * 2)
dists = job.result().quasi_dists
# executing 2 circuits with 1 parameter set using Sampler V2
job = sampler_v2.run([(circuit1, vals1), (circuit2, vals1)])
counts1 = job.result()[0].data.meas.get_counts() # result for pub 1 (circuit 1)
counts2 = job.result()[1].data.meas.get_counts() # result for pub 2 (circuit 2)
# executing 2 circuits with 2 different observables using Estimator V1
job = estimator_v1.run([circuit1, circuit2] , [obs1, obs2])
evs = job.result().values
# executing 2 circuits with 2 different observables using Estimator V2
job = estimator_v2.run([(circuit1, obs1), (circuit2, obs2)])
evs1 = job.result()[0].data.evs # result for pub 1 (circuit 1)
evs2 = job.result()[1].data.evs # result for pub 2 (circuit 2)
-
Sampler: Sampler V2 kini mengembalikan sampel hasil pengukuran dalam bentuk bitstring atau counts, bukan distribusi quasi-probabilitas dari antarmuka V1. Bitstring menampilkan hasil pengukuran sambil mempertahankan urutan shot saat diukur. Objek hasil Sampler V2 mengorganisasi data berdasarkan nama register klasik Circuit input, untuk kompatibilitas dengan dynamic circuits.
# Define quantum circuit with 2 qubits
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure_all()
circuit.draw()βββββ β βββ
q_0: β€ H ββββ ββββββ€Mββββ
ββββββββ΄ββ β ββ₯ββββ
q_1: ββββββ€ X ββββββ«ββ€Mβ
βββββ β β ββ₯β
meas: 2/βββββββββββββββ©βββ©β
0 1Nama register klasik defaultPada Circuit di atas, perhatikan bahwa nama register klasik defaultnya adalah
"meas". Nama ini akan digunakan nanti untuk mengakses bitstring pengukuran.# Run using V1 sampler
result = sampler_v1.run(circuit).result()
quasi_dist = result.quasi_dists[0]
print(f"The quasi-probability distribution is: {quasi_dist}")The quasi-probability distribution is: {0: 0.5, 3: 0.5}# Run using V2 sampler
result = sampler_v2.run([circuit]).result()
# Access result data for pub 0
data_pub = result[0].data
# Access bitstrings for the classical register "meas"
bitstrings = data_pub.meas.get_bitstrings()
print(f"The number of bitstrings is: {len(bitstrings)}")
# Get counts for the classical register "meas"
counts = data_pub.meas.get_counts()
print(f"The counts are: {counts}")The number of bitstrings is: 1024
The counts are: {'00': 523, '11': 501} -
Sampler dan Estimator: Overhead sampling, yang umumnya diekspos oleh implementasi V1 melalui opsi runshots, kini merupakan argumen dari metoderun()primitives yang bisa ditentukan di level PUB. Kelas dasar V2 mengekspos argumen dalam format yang berbeda dari API V1:-
BaseSamplerV2.runmengekspos argumenshots(mirip dengan alur kerja sebelumnya):# Sample two circuits at 128 shots each.
sampler_v2.run([circuit1, circuit2], shots=128)
# Sample two circuits at different amounts of shots. The "None"s are necessary
# as placeholders
# for the lack of parameter values in this example.
sampler_v2.run([(circuit1, None, 123), (circuit2, None, 456)]) -
EstimatorV2.runmemperkenalkan argumenprecisionyang menentukan error bar yang harus ditargetkan oleh implementasi primitives untuk estimasi nilai ekspektasi:# Estimate expectation values for two PUBs, both with 0.05 precision.
estimator_v2.run([(circuit1, obs_array1), (circuit2, obs_array_2)], precision=0.05)
-
Pembaruan pada antarmuka V1β
-
Konversi implisit dari
BaseOperatorpadat keSparsePauliOpdalam argumen observableEstimatortidak lagi diizinkan. Kamu harus melakukan konversi secara eksplisit keSparsePauliOpmenggunakanSparsePauliOp.from_operator(operator)sebagai gantinya. -
Menggunakan
PauliListdalam argumen observable Estimator tidak lagi diizinkan. Sebagai gantinya, kamu harus mengonversi argumen secara eksplisit menggunakanSparsePauliOp(pauli_list)terlebih dahulu.
qiskit.providersβ
basicaerβ
Sebagian besar fungsionalitas dalam modul qiskit.providers.basicaer telah
digantikan oleh modul
qiskit.providers.basic_provider
yang baru, kecuali untuk kelas UnitarySimulatorPy dan StatevectorSimulatorPy
yang telah dihapus; fungsionalitasnya sudah tersedia dalam
modul quantum_info.
Migrasi ke jalur baru sangat mudah. Kamu bisa mengganti sebagian besar
kelas di qiskit.providers.basicaer dengan padanannya di
qiskit.providers.basic_provider
(pengganti langsung/drop-in replacement). Perlu diperhatikan bahwa kelas-kelas berikut memiliki
jalur dan nama baru:
| Dihapus | Alternatif |
|---|---|
qiskit.providers.basicaer | qiskit.providers.basic_provider |
BasicAerProvider | BasicProvider |
BasicAerJob | BasicProviderJob |
QasmSimulatorPy | BasicSimulator |
Perhatikan instance global apapun saat migrasi ke modul baru. Tidak ada pengganti untuk
instance global BasicAer yang bisa diimpor langsung sebagai qiskit.BasicAer. Artinya,
from qiskit import BasicProvider bukan lagi impor yang valid.
Sebagai gantinya, kelas provider harus diimpor dari submodulnya dan diinstansiasi oleh pengguna:
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("backend_name")
# Current
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("backend_name")
Simulator unitary dan statevector bisa digantikan dengan
kelas quantum_info yang berbeda. Ini bukan
pengganti langsung, namun perubahannya minimal. Lihat contoh migrasi berikut:
| Dihapus | Alternatif |
|---|---|
UnitarySimulatorPy | quantum_info.Operator |
StatevectorSimulatorPy | quantum_info.Statevector |
Contoh berikut menunjukkan jalur migrasi simulator basicaer.
- Simulator Statevector
- Simulator Unitary
- Simulator QASM
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("statevector_simulator")
statevector = backend.run(qc).result().get_statevector()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Statevector
statevector = Statevector(qc)
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("unitary_simulator")
result = backend.run(qc).result()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Operator
result = Operator(qc).data
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("qasm_simulator")
result = backend.run(qc).result()
# One current option
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("basic_simulator")
result = backend.run(qc).result()
# Another current option is to specify it directly
from qiskit.providers.basic_provider import BasicSimulator
backend = BasicSimulator()
result = backend.run(qc).result()
fake_providerβ
Sebagian besar komponen qiskit.providers.fake_provider yang menghadap pengguna telah
dimigrasikan ke paket Python qiskit-ibm-runtime. Ini termasuk
kelas fake provider, semua fake Backend spesifik perangkat (seperti
FakeVigo, FakeNairobiV2, dan FakeSherbrooke), serta kelas dasar fake Backend. Klik tab berikut untuk melihat kelas yang terpengaruh.
- Fake Backend
- Fake Provider
- Kelas apapun di
qiskit.providers.fake_provider.backends fake_provider.fake_backend.FakeBackendfake_provider.fake_backend.FakeBackendV2
fake_provider.FakeProviderfake_provider.FakeProviderForBackendV2fake_provider.FakeProviderFactory
Untuk migrasi ke jalur baru:
-
Install
qiskit-ibm-runtimeversi0.17.1atau lebih baru:pip install 'qiskit-ibm-runtime>=0.17.1' -
Ganti instance
qiskit.providers.fake_providerdalam kode kamu denganqiskit_ibm_runtime.fake_provider. Contohnya:# Old
from qiskit.providers.fake_provider import FakeProvider
backend1 = FakeProvider().get_backend("fake_ourense")
from qiskit.providers.fake_provider import FakeSherbrooke
backend2 = FakeSherbrooke()
# Alternative
from qiskit_ibm_runtime.fake_provider import FakeProvider
backend1 = FakeProvider().get_backend("fake_ourense")
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend2 = FakeSherbrooke()
Kelas dasar fake Backend juga telah dimigrasikan, namun ada beberapa perbedaan pada jalur impor:
| Dihapus | Alternatif |
|---|---|
qiskit.providers.fake_provider.FakeQasmBackend | qiskit_ibm_runtime.fake_provider.fake_qasm_backend.FakeQasmBackend |
qiskit.providers.fake_provider.FakePulseBackend | qiskit_ibm_runtime.fake_provider.fake_pulse_backend.FakePulseBackend |
Jika kamu mengandalkan fake Backend untuk pengujian unit library downstream dan memiliki konflik dengan
dependensi qiskit-ibm-runtime, kamu juga bisa menemukan alternatif fake Backend generik bawaan Qiskit.
Ini mencakup kelas BackendV1 berikut (pengganti langsung/drop-in replacement):
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
Ini adalah kelas yang bisa dikonfigurasi dan mengembalikan instance BackendV2:
fake_provider (Backend pengujian khusus)β
Kelas fake Backend untuk keperluan pengujian khusus dalam
qiskit.providers.fake_provider tidak dimigrasikan ke qiskit_ibm_runtime.fake_provider. Jalur migrasi yang direkomendasikan
adalah menggunakan kelas
GenericBackendV2
yang baru untuk mengkonfigurasi Backend dengan properti serupa atau membangun target kustom.
| Dihapus | Alternatif |
|---|---|
fake_provider.FakeBackendV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackend5QV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendV2LegacyQubitProps | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendSimple | fake_provider.GenericBackendV2 |
fake_provider.ConfigurableFakeBackend | fake_provider.GenericBackendV2 |
Contoh: Migrasi ke kelas
GenericBackendV2
yang baru:
# Legacy path
from qiskit.providers.fake_provider import FakeBackend5QV2
backend = FakeBackend5QV2()
# New path
from qiskit.providers.fake_provider import GenericBackendV2
backend = GenericBackendV2(num_qubits=5)
# Note that this class generates a 5q backend with generic
# properties that serves the same purpose as FakeBackend5QV2
# but will not be identical.
Tips migrasi lainnyaβ
-
Mengimpor dari
qiskit.providers.aertidak lagi memungkinkan. Sebagai gantinya, impor dariqiskit_aer, yang merupakan pengganti langsung. Untuk menginstallqiskit_aer, jalankan:pip install qiskit-aer -
Dukungan untuk menjalankan pulse job pada Backend dari
qiskit.providers.fake_providertelah dihapus di Qiskit 1.0. Ini karena Qiskit Aer menghapus fungsionalitas simulasi untuk job semacam itu. Untuk beban kerja simulasi Hamiltonian tingkat rendah, pertimbangkan menggunakan library khusus seperti Qiskit Dynamics.
qiskit.pulseβ
ParametricPulseβ
Kelas dasar qiskit.pulse.library.parametric_pulses.ParametricPulse dan
pustaka pulse-nya sudah digantikan oleh
qiskit.pulse.SymbolicPulse
beserta pustaka pulse yang sesuai. SymbolicPulse mendukung serialisasi
QPY:
from qiskit import pulse, qpy
with pulse.build() as schedule:
pulse.play(pulse.Gaussian(100, 0.1, 25), pulse.DriveChannel(0))
with open('schedule.qpy', 'wb') as fd:
qpy.dump(schedule, fd)
| Dihapus | Alternatif |
|---|---|
pulse.library.parametric_pulses.ParametricPulse | qiskit.pulse.SymbolicPulse |
pulse.library.parametric_pulses.Constant | pulse.library.symbolic_pulses.Constant |
pulse.library.parametric_pulses.Drag | pulse.library.symbolic_pulses.Drag |
pulse.library.parametric_pulses.Gaussian | pulse.library.symbolic_pulses.Gaussian |
qiskit.pulse.library.parametric_pulses.GaussianSquare | pulse.library.symbolic_pulses.GaussianSquare |
Amplitudo bernilai kompleksβ
Amplitudo pulse bernilai kompleks (amp) digantikan oleh pasangan (amp,
angle). Representasi ini lebih intuitif, terutama untuk beberapa tugas
kalibrasi seperti kalibrasi sudut:
from qiskit import pulse
from qiskit.circuit import Parameter
from math import pi
with pulse.build() as schedule:
angle = Parameter("ΞΈ")
pulse.play(pulse.Gaussian(100, 0.1, 25, angle=angle), pulse.DriveChannel(0))
schedule.assign_parameters({angle: pi})
Menyisipkan operasi gate Circuitβ
Menyisipkan operasi gate Circuit ke dalam konteks pulse builder melalui
qiskit.pulse.builder.call sudah tidak bisa dilakukan lagi.
Penghapusan ini berdampak pada argumen input bertipe QuantumCircuit, maupun
fungsi-fungsi berikut:
qiskit.pulse.builder.call_gateqiskit.pulse.builder.cxqiskit.pulse.builder.u1qiskit.pulse.builder.u2qiskit.pulse.builder.u3qiskit.pulse.builder.x
Kalau kamu masih ingin menyisipkan jadwal yang sudah dikalibrasi oleh backend, gunakan pola berikut sebagai pengganti pemanggilan perintah gate.
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit import pulse
backend = GenericBackendV2(num_qubits=5)
sched = backend.target["x"][(qubit,)].calibration
with pulse.build() as only_pulse_scheds:
pulse.call(sched)
Begitu pula, sebuah QuantumCircuit bisa
disisipkan ke dalam konteks builder dengan cara melakukan transpilasi dan penjadwalan objek tersebut secara manual.
from math import pi
from qiskit.compiler import schedule, transpile
qc = QuantumCircuit(2)
qc.rz(pi / 2, 0)
qc.sx(0)
qc.rz(pi / 2, 0)
qc.cx(0, 1)
qc_t = transpile(qc, backend)
sched = schedule(qc_t, backend)
with pulse.build() as only_pulse_scheds:
pulse.call(sched)
Kami menyarankan untuk menulis program pulse minimal dengan builder dan melampirkannya ke
QuantumCircuit melalui metode
QuantumCircuit.add_calibration
sebagai mikrokode dari instruksi gate, daripada menulis seluruh program dengan model pulse.
builder.buildβ
Argumen-argumen berikut dalam qiskit.pulse.builder.build telah dihapus tanpa
ada penggantinya.
default_transpiler_settingsdefault_circuit_scheduler_settings
Fungsi-fungsi ini juga telah dihapus:
qiskit.pulse.builder.active_transpiler_settingsqiskit.pulse.builder.active_circuit_scheduler_settingsqiskit.pulse.builder.transpiler_settingsqiskit.pulse.builder.circuit_scheduler_settings
Ini karena injeksi objek Circuit ke dalam konteks builder sudah tidak mungkin dilakukan (lihat Menyisipkan operasi gate Circuit); pengaturan ini memang digunakan untuk mengonversi objek yang disisipkan menjadi representasi pulse.
libraryβ
Pustaka pulse diskret telah dihapus dari kode. Ini mencakup:
qiskit.pulse.library.constantqiskit.pulse.library.zeroqiskit.pulse.library.squareqiskit.pulse.library.sawtoothqiskit.pulse.library.triangleqiskit.pulse.library.cosqiskit.pulse.library.sinqiskit.pulse.library.gaussianqiskit.pulse.library.gaussian_derivqiskit.pulse.library.sechqiskit.pulse.library.sech_derivqiskit.pulse.library.gaussian_squareqiskit.pulse.library.drag
Sebagai gantinya, gunakan
qiskit.pulse.SymbolicPulse
yang sesuai, dengan
SymbolicPulse.get_waveform().
Misalnya, alih-alih pulse.gaussian(100,0.5,10), gunakan
pulse.Gaussian(100,0.5,10).get_waveform(). Perlu diingat bahwa fase dari
Sawtooth dan
Square didefinisikan sedemikian rupa
sehingga fase 2\\pi bergeser satu siklus penuh, berbeda dari versi diskretnya. Perlu dicatat juga bahwa amplitudo kompleks tidak lagi didukung di
pustaka pulse simbolik; gunakan float, amp, dan angle sebagai gantinya.
ScalableSymbolicPulseβ
Tidak lagi memungkinkan untuk memuat objek qiskit.pulse.ScalableSymbolicPulse
dari pustaka dengan parameter amp kompleks dari file qpy versi 5 atau lebih lama
(Qiskit Terra < 0.23.0). Tidak perlu tindakan migrasi, karena amp kompleks akan
secara otomatis dikonversi menjadi float (amp, angle).
Perubahan ini berlaku untuk pulse-pulse berikut:
qiskit.qasmβ
Modul parser OpenQASM 2 lawas yang sebelumnya ada di qiskit.qasm kini sudah
digantikan oleh modul qiskit.qasm2, yang
menyediakan parser yang lebih cepat dan akurat untuk OpenQASM 2. Metode tingkat tinggi
QuantumCircuit yaitu
from_qasm_file()
dan
from_qasm_str()
tetap sama, tapi akan menggunakan parser baru secara internal. Namun, antarmuka publik
untuk modul qasm2 tidak sama. Sementara modul qiskit.qasm menyediakan antarmuka
ke pohon sintaks abstrak yang dikembalikan oleh pustaka parser ply,
qiskit.qasm2 tidak mengekspos AST atau detail implementasi tingkat rendah
tentang parser. Sebagai gantinya, ia menerima input OpenQASM 2 dan
menghasilkan objek QuantumCircuit.
Misalnya, jika sebelumnya kamu menjalankan sesuatu seperti ini:
import qiskit.qasm
from qiskit.converters import ast_to_dag, dag_to_circuit
ast = qiskit.qasm.Qasm(filename="myfile.qasm").parse()
dag = ast_to_dag(ast)
qasm_circ = dag_to_circuit(dag)
Ganti dengan yang berikut:
import qiskit.qasm2
qasm_circ = qiskit.qasm2.load("myfile.qasm")
qiskit.quantum_infoβ
Modul qiskit.quantum_info.synthesis telah dipindahkan ke berbagai
lokasi dalam codebase, sebagian besar ke qiskit.synthesis.
| Dihapus | Alternatif |
|---|---|
OneQubitEulerDecomposer | qiskit.synthesis.one_qubit.OneQubitEulerDecomposer |
TwoQubitBasisDecomposer | qiskit.synthesis.two_qubits.TwoQubitBasisDecomposer |
XXDecomposer | qiskit.synthesis.two_qubits.XXDecomposer |
two_qubit_cnot_decompose | qiskit.synthesis.two_qubits.two_qubit_cnot_decompose |
Quaternion | qiskit.quantum_info.Quaternion |
Perpindahan ini tidak mempengaruhi jalur impor biasa dari Quaternion, tapi kamu tidak bisa lagi mengaksesnya
melalui qiskit.quantum_info.synthesis.
Terakhir, cnot_rxx_decompose telah dihapus.
qiskit.testβ
Modul qiskit.test tidak lagi merupakan modul publik. Ini memang tidak pernah dimaksudkan untuk menjadi publik,
dan tidak dimaksudkan untuk digunakan di luar suite pengujian Qiskit. Semua fungsionalitasnya spesifik untuk Qiskit dan tidak
ada alternatif yang disediakan; jika kamu membutuhkan fungsionalitas serupa, kamu harus memasukkannya ke dalam
test harness milikmu sendiri.
qiskit.toolsβ
Modul qiskit.tools dihapus di Qiskit 1.0. Sebagian besar fungsionalitasnya
sudah digantikan oleh fungsionalitas serupa di paket lain atau dihapus tanpa ada alternatif.
Pengecualian utamanya adalah fungsi qiskit.tools.parallel_map(), yang telah dipindahkan ke
modul qiskit.utils. Fungsi ini bisa digunakan
dari lokasi baru ini. Misalnya:
Jika sebelumnya kamu menjalankan:
# Previous
from qiskit.tools import parallel_map
parallel_map(func, input)
# Current
from qiskit.utils import parallel_map
parallel_map(func, input)
jupyterβ
Submodul qiskit.tools.jupyter telah dihapus karena fungsionalitas
dalam modul ini terkait dengan paket qiskit-ibmq-provider lawas, yang
sudah tidak didukung lagi. Submodul ini juga hanya mendukung BackendV1 dan bukan antarmuka
BackendV2 yang lebih baru.
monitorβ
Submodul qiskit.tools.monitor telah dihapus karena terkait dengan
paket qiskit-ibmq-provider lawas, yang sudah tidak didukung lagi (submodul ini juga
hanya mendukung antarmuka BackendV1 dan bukan antarmuka
BackendV2 yang lebih baru). Tidak ada
alternatif yang disediakan untuk fungsionalitas ini.
visualizationβ
Submodul qiskit.tools.visualization telah dihapus. Modul ini adalah
pengalihan lawas dari lokasi asli modul visualisasi Qiskit yang
dipindahkan ke qiskit.visualization di Qiskit
0.8.0. Jika kamu masih menggunakan jalur ini, perbarui impormu dari
qiskit.tools.visualization ke
qiskit.visualization.
# Previous
from qiskit.tools.visualization import plot_histogram
plot_histogram(counts)
# Current
from qiskit.visualization import plot_histogram
plot_histogram(counts)
eventsβ
Modul qiskit.tools.events dan utilitas progressbar() yang dieksposnya
telah dihapus. Fungsionalitas modul ini tidak banyak digunakan dan
lebih baik ditangani oleh paket khusus seperti
tqdm.
qiskit.transpilerβ
synthesisβ
Item-item dalam modul qiskit.transpiler.synthesis telah dipindahkan ke lokasi baru:
| Dihapus | Alternatif |
|---|---|
qiskit.transpiler.synthesis.aqc (kecuali AQCSynthesisPlugin) | qiskit.synthesis.unitary.aqc |
qiskit.transpiler.synthesis.graysynth | qiskit.synthesis.synth_cnot_phase_aam |
qiskit.transpiler.synthesis.cnot_synth | qiskit.synthesis.synth_cnot_count_full_pmh |
passesβ
Pass Transpiler NoiseAdaptiveLayout telah digantikan oleh
VF2Layout dan
VF2PostLayout,
yang menetapkan layout berdasarkan karakteristik noise yang dilaporkan oleh
backend. Baik pass maupun plugin stage layout "noise_adaptive" yang bersesuaian
telah dihapus dari Qiskit.
Pass Transpiler CrosstalkAdaptiveSchedule telah dihapus dari
codebase. Pass ini tidak bisa lagi digunakan karena operasi internalnya
bergantung pada properti kustom yang diatur dalam payload BackendProperties dari
sebuah instansi BackendV1. Karena tidak ada backend yang mengatur field-field ini, pass tersebut
telah dihapus.
passmanagerβ
Metode append dari kelas
ConditionalController,
FlowControllerLinear, dan
DoWhileController
telah dihapus. Sebagai gantinya, semua tugas harus disediakan saat objek controller
dibuat.
qiskit.utilsβ
Alat-alat berikut dalam qiskit.utils telah dihapus tanpa pengganti:
qiskit.utils.arithmeticqiskit.utils.circuit_utilsqiskit.utils.entangler_mapqiskit.utils.name_unnamed_args
Fungsi-fungsi ini hanya digunakan di modul qiskit.algorithms dan
qiskit.opflow, yang juga sudah dihapus.
qiskit.visualizationβ
Modul qiskit.visualization.qcstyle telah dihapus. Gunakan
qiskit.visualization.circuit.qcstyle sebagai penggantinya secara langsung.