Perubahan ciri Qiskit 1.0
Panduan ini menerangkan laluan migrasi untuk perubahan ciri terpenting dalam Qiskit 1.0, disusun mengikut modul. Gunakan jadual kandungan di sebelah kanan untuk menavigasi ke modul yang anda minati.
Alat migrasi Qiskit 1.0β
Untuk memudahkan proses migrasi, anda boleh menggunakan alat
flake8-qiskit-migration
untuk mengesan laluan import yang telah dibuang dalam kod anda dan mencadangkan alternatif.
- Jalankan dengan pipx
- Jalankan dengan venv
Jika anda telah memasang pipx, jalankan sahaja
arahan berikut.
pipx run flake8-qiskit-migration <path-to-source-directory>
Ini akan memasang pakej ke persekitaran maya sementara dan menjalankannya pada kod anda.
Jika anda tidak mahu menggunakan pipx, anda boleh membuat persekitaran baharu
secara manual untuk alat ini. Pendekatan ini juga membolehkan anda menggunakan
nbqa untuk menyemak contoh kod dalam
notebook Jupyter. Padam persekitaran apabila 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 mengesan laluan import yang dibuang. Ia tidak mengesan penggunaan kaedah
yang dibuang (seperti QuantumCircuit.qasm) atau argumen. Ia juga tidak dapat menjejak
tugasan seperti qk = qiskit, walaupun ia boleh mengendalikan alias seperti
import qiskit as qk.
Untuk maklumat lanjut, lihat repositori projek.
Tika global dan fungsiβ
Aerβ
Objek qiskit.Aer tidak tersedia dalam Qiskit 1.0. Sebaliknya, gunakan
objek yang sama daripada ruang nama qiskit_aer, yang merupakan pengganti langsung.
Untuk memasang qiskit_aer, jalankan:
pip install qiskit-aer
BasicAerβ
Objek qiskit.BasicAer tidak tersedia dalam Qiskit 1.0. Lihat
bahagian migrasi basicaer untuk
pilihan migrasi.
executeβ
Fungsi qiskit.execute tidak tersedia dalam Qiskit 1.0. Fungsi ini
berfungsi sebagai pembalut peringkat tinggi untuk fungsi
transpile dan
run dalam Qiskit.
Sebagai ganti qiskit.execute, gunakan fungsi
transpile diikuti dengan
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)
Sebagai alternatif, primitif Sampler
adalah setara secara semantik dengan fungsi qiskit.execute yang dibuang.
Kelas
BackendSampler ialah
pembalut generik untuk backend yang tidak menyokong primitif:
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend)
job = sampler.run(circuit)
qiskit.circuitβ
QuantumCircuit.qasmβ
Kaedah QuantumCircuit.qasm telah dibuang. Sebaliknya, gunakan
qasm2.dump atau
qasm2.dumps.
Untuk output berformat Pygments, lihat pakej kendiri
openqasm-pygments,
kerana 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β
Kaedah Gate berikut telah dibuang memandangkan wujudnya kaedah yang lebih mantap yang menambah Gate yang sama:
| Dibuang | 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 |
Kaedah Circuit berikut juga telah dibuang. Sebaliknya, Gate-gate ini boleh
digunakan pada Circuit dengan QuantumCircuit.append.
| Dibuang | 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 |
Sebagai contoh, 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
Kaedah-kaedah QuantumCircuit berikut juga telah dibuang:
| Dibuang | Alternatif |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | arahan simpan daripada qiskit-aer |
qiskit.convertersβ
Fungsi qiskit.converters.ast_to_dag telah dibuang daripada Qiskit. Ia menukar
pokok sintaks abstrak yang dijana oleh parser OpenQASM 2 lama kepada
DAGCircuit. Memandangkan
parser OpenQASM 2 lama telah dibuang (lihat qiskit.qasm), fungsi
ini tidak lagi berguna. Sebaliknya, hurai fail OpenQASM 2 anda ke dalam
QuantumCircuit menggunakan kaedah pembina
QuantumCircuit.from_qasm_file
atau
QuantumCircuit.from_qasm_str
(atau modul qiskit.qasm2), kemudian
tukar QuantumCircuit itu kepada
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. Kebanyakan objeknya telah
disepadukan ke dalam perpustakaan Circuit
(qiskit.circuit.library). Untuk berpindah ke
lokasi baharu, gantikan sahaja qiskit.extensions dengan qiskit.circuit.library
dalam laluan import objek. Ini adalah pengganti langsung.
# Previous
from qiskit.extensions import DiagonalGate
# Current alternative
from qiskit.circuit.library import DiagonalGate
Kelas yang dipindahkan ke qiskit.circuit.library adalah:
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
Kelas-kelas berikut telah dibuang daripada kod, kerana fungsinya sama ada
bertindih atau terkait dengan modul extensions:
| Dibuang | Alternatif |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | Gunakan arahan simpan daripada qiskit-aer |
ExtensionError | Kelas ralat yang berkaitan |
qiskit.primitivesβ
Perubahan paling ketara dalam modul qiskit.primitives ialah
pengenalan antara muka primitif V2 yang baharu. Bahagian ini menunjukkan cara untuk memindahkan
aliran kerja anda daripada primitif V1 ke primitif V2, serta beberapa perubahan kecil yang berlaku
pada input yang diterima oleh antara muka V1.
Bermula dengan keluaran 1.0, kami akan merujuk antara muka primitif pra-1.0 sebagai "primitif V1".
Migrasi dari V1 ke V2β
Perbezaan formal antara API primitif V1 dan V2 ialah kelas asas yang diwarisi oleh
pelaksanaan primitif. Untuk beralih ke kelas asas baharu, anda boleh mengekalkan
laluan import asal daripada qiskit.primitives:
| Migrasi dari | Ganti dengan |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
Nama pelaksanaan teras qiskit bagi primitif V2 (yang boleh diimport daripada qiskit.primitives),
telah diubah suai untuk menjelaskan tujuannya sebagai pelaksanaan yang boleh dijalankan secara tempatan
dengan Backend simulator statevector. Nama baharu tidak mengandungi akhiran -V2.
| Migrasi dari | Ganti dengan |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.primitives.StatevectorSampler |
Terdapat beberapa perbezaan konsep yang perlu dipertimbangkan semasa berpindah dari V1 ke V2.
Perbezaan ini ditentukan oleh kelas asas, tetapi ditunjukkan dalam contoh berikut menggunakan pelaksanaan
statevector yang terdapat dalam qiskit.primitives:
Untuk contoh berikut, anggap import dan permulaan primitif berikut:
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 and Estimator: Primitif V2 baharu direka untuk menerima input bervektorkan, di mana satu Circuit boleh dikumpulkan dengan spesifikasi bernilai tatasusunan. Iaitu, satu Circuit boleh dilaksanakan untuk tatasusunannset parameter,npemerhati, atau kedua-duanya (dalam kes Estimator). Setiap kumpulan dipanggil primitive unified bloc (PUB), dan boleh diwakili sebagai tuple:(1 x circuit, [n x observables], [n x parameters]). Antara muka V1 tidak membenarkan fleksibiliti yang sama. Sebaliknya, bilangan Circuit input perlu sepadan dengan bilangan pemerhati dan set parameter, seperti yang ditunjukkan dalam contoh berikut (pilih tab untuk melihat setiap contoh):
- Estimator, 1 circuit, 4 observables
- Sampler, 1 circuit, 3 parameter sets
- Estimator, 1 circuit, 4 observables, 2 parameter sets
# 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
Primitif V2 menerima berbilang PUB sebagai input, dan setiap PUB mendapat hasilnya sendiri. Ini membolehkan anda menjalankan Circuit berbeza dengan pelbagai kombinasi parameter/pemerhati, yang tidak sentiasa mungkin dalam antara muka V1:
- Sampler, 2 circuits, 1 parameter set
- Estimator, 2 circuits, 2 different observables
# 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 kiraan, berbanding dengan taburan kuasi-kebarangkalian daripada antara muka V1. Bitstring menunjukkan hasil pengukuran, mengekalkan susunan shot semasa diukur. Objek hasil Sampler V2 mengatur data mengikut nama daftar klasik Circuit input, untuk keserasian dengan Circuit dinamik.
# 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 daftar klasik lalaiDalam Circuit di atas, perhatikan bahawa nama daftar klasik lalai kepada
"meas". Nama ini akan digunakan kemudian 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 and Estimator: Overhed pensampelan, yang biasanya didedahkan oleh pelaksanaan V1 melalui pilihan jalankanshots, kini merupakan argumen kaedahrun()primitif yang boleh ditentukan pada peringkat PUB. Kelas asas V2 mendedahkan argumen dalam format berbeza daripada API V1:-
BaseSamplerV2.runmendedahkan argumenshots(serupa dengan aliran 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 bar ralat yang perlu disasarkan oleh pelaksanaan primitif untuk anggaran nilai jangkaan:# Estimate expectation values for two PUBs, both with 0.05 precision.
estimator_v2.run([(circuit1, obs_array1), (circuit2, obs_array_2)], precision=0.05)
-
Kemas kini dalam antara muka V1β
-
Penukaran tersirat daripada
BaseOperatorpadat kepadaSparsePauliOpdalam argumen pemerhatiEstimatortidak lagi dibenarkan. Anda perlu menukar secara eksplisit kepadaSparsePauliOpmenggunakanSparsePauliOp.from_operator(operator)sebagai gantinya. -
Menggunakan
PauliListdalam argumen pemerhati Estimator tidak lagi dibenarkan. Sebaliknya anda perlu menukar argumen secara eksplisit menggunakanSparsePauliOp(pauli_list)terlebih dahulu.