การเปลี่ยนแปลงฟีเจอร์ใน Qiskit 1.0
คู่มือนี้อธิบายเส้นทางการย้ายสำหรับการเปลี่ยนแปลงฟีเจอร์ที่สำคัญที่สุดใน Qiskit 1.0 โดยจัดเรียงตามโมดูล ใช้สารบัญทางด้านขวาเพื่อนำทางไปยังโมดูลที่ต้องการ
เครื่องมือช่วยย้าย Qiskit 1.0
เพื่อช่วยให้กระบวนการย้ายง่ายขึ้น สามารถใช้เครื่องมือ
flake8-qiskit-migration
เพื่อตรวจจับ import path ที่ถูกลบออกในโค้ดและเสนอทางเลือกแทน
- Run with pipx
- Run with venv
ถ้ามี pipx ติดตั้งอยู่แล้ว ให้รันคำสั่งต่อไปนี้ได้เลย
pipx run flake8-qiskit-migration <path-to-source-directory>
คำสั่งนี้จะติดตั้งแพ็กเกจไปยัง virtual environment ชั่วคราวแล้วรันตรวจสอบโค้ด
ถ้าไม่อยากใช้ pipx สามารถสร้าง environment ใหม่สำหรับเครื่องมือนี้ได้เอง วิธีนี้ยังเปิดให้ใช้
nbqa ตรวจสอบตัวอย่างโค้ดใน Jupyter notebook ได้ด้วย
ลบ environment ออกเมื่อเสร็จแล้ว
# 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
เครื่องมือนี้ตรวจจับเฉพาะ import path ที่ถูกลบออกเท่านั้น ไม่ตรวจจับการใช้เมธอดที่ถูกลบ
(เช่น QuantumCircuit.qasm) หรืออาร์กิวเมนต์ และไม่สามารถติดตามการกำหนดค่าเช่น qk = qiskit
แต่สามารถจัดการกับ alias เช่น import qiskit as qk ได้
ดูข้อมูลเพิ่มเติมได้ที่ repository ของโปรเจกต์
Global instances และ functions
Aer
qiskit.Aer object ไม่มีอยู่ใน Qiskit 1.0 แล้ว ให้ใช้
object เดิมจาก namespace qiskit_aer แทน ซึ่งเป็น drop-in replacement
ติดตั้ง qiskit_aer ด้วยคำสั่ง:
pip install qiskit-aer
BasicAer
qiskit.BasicAer object ไม่มีอยู่ใน Qiskit 1.0 แล้ว ดู
ส่วน migration ของ basicaer สำหรับ
ตัวเลือกการย้าย
execute
ฟังก์ชัน qiskit.execute ไม่มีอยู่ใน Qiskit 1.0 แล้ว ฟังก์ชันนี้เคยทำหน้าที่เป็น
wrapper ระดับสูงรอบๆ ฟังก์ชัน
transpile และ
run ใน Qiskit
แทนที่ qiskit.execute ให้ใช้ฟังก์ชัน
transpile ตามด้วย
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)
อีกทางเลือกหนึ่ง primitive Sampler
มีความหมายเทียบเท่ากับฟังก์ชัน qiskit.execute ที่ถูกลบออก
คลาส BackendSampler เป็น
wrapper ทั่วไปสำหรับ Backend ที่ไม่รองรับ primitive:
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend)
job = sampler.run(circuit)
qiskit.circuit
QuantumCircuit.qasm
เมธอด QuantumCircuit.qasm ถูกลบออกแล้ว ให้ใช้
qasm2.dump หรือ
qasm2.dumps แทน
สำหรับ output ที่ฟอร์แมตด้วย Pygments ดูที่แพ็กเกจแบบ standalone
openqasm-pygments
เนื่องจาก qasm2.dump และ qasm2.dumps ไม่รองรับ output สีแบบ 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
เมธอด Gate ต่อไปนี้ถูกลบออกเพื่อสนับสนุนเมธอดที่ใช้กันแพร่หลายกว่า ซึ่ง append Gate เดิมเหมือนกัน:
| ที่ถูกลบออก | ทางเลือก |
|---|---|
QuantumCircuit.cnot | QuantumCircuit.cx |
QuantumCircuit.toffoli | QuantumCircuit.ccx |
QuantumCircuit.fredkin | QuantumCircuit.cswap |
QuantumCircuit.mct | QuantumCircuit.mcx |
QuantumCircuit.i | QuantumCircuit.id |
QuantumCircuit.squ | QuantumCircuit.unitary |
เมธอด Circuit ต่อไปนี้ถูกลบออกแล้ว แทนที่นั้น Gate เหล่านี้สามารถ
นำไปใช้กับ Circuit ได้ด้วย QuantumCircuit.append
| ที่ถูกลบออก | ทางเลือก (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 |
ตัวอย่างเช่น สำหรับ 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
เมธอด QuantumCircuit ต่อไปนี้ถูกลบออกด้วยเช่นกัน:
| ที่ถูกลบออก | ทางเลือก |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | save instructions ของ qiskit-aer |
qiskit.converters
ฟังก์ชัน qiskit.converters.ast_to_dag ถูกลบออกจาก Qiskit แล้ว ฟังก์ชันนี้เคยแปลง
abstract syntax tree ที่สร้างโดย OpenQASM 2 parser รุ่นเก่าไปยัง
DAGCircuit เนื่องจาก OpenQASM 2 parser รุ่นเก่า
ถูกลบออกแล้ว (ดู qiskit.qasm) ฟังก์ชันนี้จึงไม่มีความจำเป็นอีกต่อไป
แทนที่นั้น ให้แปลงไฟล์ OpenQASM 2 เป็น QuantumCircuit โดยใช้
เมธอด constructor
QuantumCircuit.from_qasm_file
หรือ
QuantumCircuit.from_qasm_str
(หรือโมดูล qiskit.qasm2) แล้ว
แปลง QuantumCircuit นั้นไปยัง
DAGCircuit ด้วย
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
โมดูล qiskit.extensions ไม่มีให้ใช้งานอีกต่อไป object ส่วนใหญ่ถูกรวมเข้าไปใน
circuit library
(qiskit.circuit.library) แล้ว
ในการย้ายไปยังตำแหน่งใหม่ ให้แทนที่ qiskit.extensions ด้วย qiskit.circuit.library
ใน import path ของ object ซึ่งเป็น drop-in replacement
# Previous
from qiskit.extensions import DiagonalGate
# Current alternative
from qiskit.circuit.library import DiagonalGate
คลาสที่ย้ายไปยัง qiskit.circuit.library ได้แก่:
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
คลาสต่อไปนี้ถูกลบออกจาก codebase แล้ว เนื่องจากฟังก์ชันการทำงาน
ซ้ำซ้อนหรือเชื่อมโยงกับโมดูล extensions:
| ที่ถูกลบออก | ทางเลือก |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | ใช้ save instructions ของ qiskit-aer |
ExtensionError | คลาส error ที่เกี่ยวข้อง |
qiskit.primitives
การเปลี่ยนแปลงที่สำคัญที่สุดในโมดูล qiskit.primitives คือการเปิดตัว primitives V2 interface ใหม่ ส่วนนี้ แสดงวิธีย้าย workflow จาก primitives V1 ไปยัง primitives V2 รวมถึงการเปลี่ยนแปลงเล็กน้อยในอินพุตที่ V1 interface รับ
ตั้งแต่รุ่น 1.0 เป็นต้นไป เราจะเรียก primitives interface ก่อนหน้า 1.0 ว่า "primitives V1"
ย้ายจาก V1 ไปยัง V2
ความแตกต่างอย่างเป็นทางการระหว่าง primitives V1 และ V2 API คือ base class ที่ primitives implementations สืบทอดมา ในการเปลี่ยนไปใช้ base class ใหม่ คุณยังคงใช้ import path เดิมจาก qiskit.primitives ได้:
| ย้ายจาก | แทนด้วย |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
ชื่อของ qiskit core implementations ของ V2 primitives (ที่ import ได้จาก qiskit.primitives) ได้รับการแก้ไขเพื่อให้ชัดเจนว่าเป็น implementations ที่รันได้บนเครื่องของคุณด้วย statevector simulator backend ชื่อใหม่ ไม่มี suffix -V2
| ย้ายจาก | แทนด้วย |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.primitives.StatevectorSampler |
มีความแตกต่างเชิงแนวคิดบางอย่างที่ต้องพิจารณาเมื่อย้ายจาก V1 ไปยัง V2 ความแตกต่างเหล่านี้ถูกกำหนดโดย base class แต่แสดงผ่านตัวอย่างต่อไ ปนี้โดยใช้ statevector implementations ที่พบใน qiskit.primitives:
สำหรับตัวอย่างต่อไปนี้ สมมติว่ามี imports และการเริ่มต้น primitives ดังนี้:
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: V2 primitives ใหม่ถูกออกแบบให้รับ vectorized inputs โดยที่ Circuit เดียวสามารถจับคู่กับ specifications แบบ array ได้ นั่นคือ Circuit หนึ่งสามารถรันได้สำหรับ parameter set จำนวนnชุด, observables จำนวนnตัว หรือทั้งสองอย่าง (ในกรณีของ estimator) แต่ละกลุ่มเรียกว่า primitive unified bloc (PUB) และแสดงเป็น tuple ได้ว่า:(1 x circuit, [n x observables], [n x parameters])V1 interface ไม่มีความยืดหยุ่นแบบเดียวกัน แต่ต้องการให้จำนวน Circuit อินพุตตรงกับจำนวน observables และ parameter set ดังที่แสดงในตัวอย่างต่อไปนี้ (เลือก tab เพื่อดูแต่ละตัวอย่าง):
- 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
V2 primitives รับ PUB หลายรายการเป็นอินพุต และแต่ละ PUB จะได้ผลลัพธ์ของตัวเอง ทำให้คุณรัน Circuit ต่างๆ พร้อม parameter/observable combinations ที่หลากหลายได้ ซึ่งทำไม่ได้เสมอใน V1 interface:
- 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: V2 Sampler ตอนนี้คืน measurement outcome samples ในรูปแบบ bitstrings หรือ counts แทน quasi-probability distributions จาก V1 interface bitstrings แสดง measurement outcomes โดยรักษาลำดับ shot ที่วัดไว้ ออบเจกต์ผลลัพธ์ของ V2 Sampler จัดระเบียบข้อมูลตามชื่อ classical register ของ Circuit อินพุต เพื่อความเข้ากันได้กับ 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 1ชื่อ classical register เริ่มต้นใน Circuit ข้างต้น สังเกตว่าชื่อของ classical register เริ่มต้นเป็น
"meas"ชื่อนี้จะถูกใช้ในภายหลังเพื่อเข้าถึง measurement bitstrings# 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: sampling overhead ที่ V1 implementations มักเ ปิดเผยผ่าน run optionshotsตอนนี้กลายเป็น argument ของเมธอดrun()ของ primitives ที่สามารถระบุได้ในระดับ PUB V2 base classes เปิดเผย arguments ในรูปแบบที่แตกต่างจาก V1 API:-
BaseSamplerV2.runเปิดเผย argumentshots(คล้ายกับ workflow เดิม):# 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.runแนะนำ argumentprecisionที่ระบุ error bars ที่ primitive implementation ควรตั้งเป้าสำหรับ expectation values estimates:# Estimate expectation values for two PUBs, both with 0.05 precision.
estimator_v2.run([(circuit1, obs_array1), (circuit2, obs_array_2)], precision=0.05)
-
การอัปเดตใน V1 interface
-
การแปลงโดยปริยายจาก
BaseOperatorแบบ dense ไปยังSparsePauliOpใน arguments ของ observable ของEstimatorไม่ได้รับอนุญาตอีกต่อไป ควรแปลงอย่างชัดเจนเป็นSparsePauliOpโดยใช้SparsePauliOp.from_operator(operator)แทน -
การใช้
PauliListใน arguments ของ observable ของ Estimator ไม่ได้รับอนุญาตอีกต่อไป แต่ควรแปลง argument อย่างชัดเจนโดยใช้SparsePauliOp(pauli_list)ก่อน
qiskit.providers
basicaer
ฟังก์ชันส่วนใหญ่ใน module qiskit.providers.basicaer ถูกแทนที่ด้วย
module ใหม่
qiskit.providers.basic_provider
ยกเว้น class UnitarySimulatorPy และ StatevectorSimulatorPy
ที่ถูกลบออกไปแล้ว เพราะฟังก์ชันการทำงานของทั้งสองถูกรวมไว้ใน
module quantum_info อยู่แล้ว
การย้ายไปใช้ path ใหม่ทำได้ไม่ยาก ส่วนใหญ่สามารถแทนที่ class ใน
qiskit.providers.basicaer ด้วย class คู่ขนานใน
qiskit.providers.basic_provider
ได้เลย (drop-in replacement) โดยควรสังเกตว่า class เหล่านี้มี path
และชื่อใหม่:
| ที่ถูกลบออก | ทางเลือกใหม่ |
|---|---|
qiskit.providers.basicaer | qiskit.providers.basic_provider |
BasicAerProvider | BasicProvider |
BasicAerJob | BasicProviderJob |
QasmSimulatorPy | BasicSimulator |
ระวัง global instances เมื่อย้ายไปใช้ module ใหม่ ไม่มีการแทนที่
global instance BasicAer ที่สามารถ import ตรงจาก qiskit.BasicAer ได้
นั่นหมายความว่า from qiskit import BasicProvider ไม่ใช่ import ที่ถูกต้องอีกต่อไป
แต่ต้องใช้การ import provider class จาก submodule และสร้าง instance เองดังนี้:
# 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")
สำหรับ unitary และ statevector simulator สามารถแทนที่ด้วย class ต่างๆ ใน
quantum_info แทนได้
แม้ไม่ใช่ drop-in replacement แต่การเปลี่ยนแปลงก็น้อยมาก ดูตัวอย่างการย้ายต่อไปนี้:
| ที่ถูกลบออก | ทางเลือกใหม่ |
|---|---|
UnitarySimulatorPy | quantum_info.Operator |
StatevectorSimulatorPy | quantum_info.Statevector |
ตัวอย่างต่อไปนี้แสดงวิธีย้าย basicaer simulators:
- Statevector simulator
- Unitary simulator
- QASM simulator
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
ส่วนประกอบที่ผู้ใช้มองเห็นได้ส่วนใหญ่ของ qiskit.providers.fake_provider
ถูกย้ายไปไว้ใน Python package qiskit-ibm-runtime แล้ว ซึ่งรวมถึง
fake provider classes, fake Backend เฉพาะอุปกรณ์ทั้งหมด (เช่น
FakeVigo, FakeNairobiV2, และ FakeSherbrooke) และ base class ของ
fake Backend คลิกที่แต่ละแท็บเพื่อดู class ที่ได้รับผลกระทบ
- Fake Backends
- Fake Providers
- class ใดก็ตามใน
qiskit.providers.fake_provider.backends fake_provider.fake_backend.FakeBackendfake_provider.fake_backend.FakeBackendV2
fake_provider.FakeProviderfake_provider.FakeProviderForBackendV2fake_provider.FakeProviderFactory
วิธีย้ายไปใช้ path ใหม่:
-
ติดตั้ง
qiskit-ibm-runtimeเวอร์ชัน0.17.1หรือใหม่กว่า:pip install 'qiskit-ibm-runtime>=0.17.1' -
แทนที่
qiskit.providers.fake_providerในโค้ดด้วยqiskit_ibm_runtime.fake_providerเช่น:# 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()
fake Backend base class ก็ถูกย้ายแล้วเช่นกัน แต่มีความแตกต่างใน import path:
| ที่ถูกลบออก | ทางเลือกใหม่ |
|---|---|
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 |
ถ้าต้องการใช้ fake Backend สำหรับ unit testing ใน downstream library และมีปัญหา
กับ dependency qiskit-ibm-runtime สามารถหา fake Backend ทางเลือกแบบ
Qiskit-native ได้เช่นกัน ซึ่งรวมถึง class BackendV1 ต่อไปนี้ (drop-in replacements):
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
นี่คือ class ที่กำหนดค่าได้ซึ่ง return instance BackendV2:
fake_provider (special testing backends)
fake Backend class สำหรับการทดสอบพิเศษใน
qiskit.providers.fake_provider ไม่ได้ ถูกย้ายไปที่
qiskit_ibm_runtime.fake_provider ทางที่แนะนำคือใช้ class
GenericBackendV2
ใหม่เพื่อกำหนดค่า Backend ที่มีคุณสมบัติคล้ายกัน หรือสร้าง target เอง
| ที่ถูกลบออก | ทางเลือกใหม่ |
|---|---|
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 |
ตัวอย่าง: ย้ายไปใช้ class
GenericBackendV2
ใหม่:
# 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.
Other migration tips
-
ไม่สามารถ import จาก
qiskit.providers.aerได้อีกต่อไป ให้ import จากqiskit_aerแทน ซึ่งเป็น drop-in replacement สมบูรณ์ ในการติดตั้งqiskit_aerให้รัน:pip install qiskit-aer -
การรัน pulse jobs บน Backend จาก
qiskit.providers.fake_providerถูกลบออกใน Qiskit 1.0 แล้ว เพราะ Qiskit Aer ได้ลบฟังก์ชันการจำลองสำหรับ jobs ประเภทนี้ออกไป สำหรับ workload Hamiltonian-simulation ระดับต ่ำ ให้พิจารณาใช้ library เฉพาะทาง เช่น Qiskit Dynamics
qiskit.pulse
ParametricPulse
คลาสฐาน qiskit.pulse.library.parametric_pulses.ParametricPulse และ
pulse library ถูกแทนที่ด้วย
qiskit.pulse.SymbolicPulse
และ pulse library ที่สอดคล้องกัน SymbolicPulse รองรับ
การซีเรียลไลซ์ด้วย 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)
| ที่ถูกลบออก | ทางเลือกแทน |
|---|---|
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 |