การเปลี่ยนแปลงฟีเจอร์ใน Qiskit v1.0
คู่มือนี้อธิบายเส้นทางการย้ายสำหรับการเปลี่ยนแปลงฟีเจอร์ที่สำคัญที่สุดใน Qiskit v1.0 โดยจัดเรียงตามโมดูล ใช้สารบัญทางด้านขวาเพื่อนำทางไปยังโมดูลที่ต้องการ
เครื่องมือช่วยย้าย Qiskit v1.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 v1.0 แล้ว ให้ใช้
object เดิมจาก namespace qiskit_aer แทน ซึ่งเป็น drop-in replacement
ติดตั้ง qiskit_aer ด้วยคำสั่ง:
pip install qiskit-aer
BasicAer
qiskit.BasicAer object ไม่มีอยู่ใน Qiskit v1.0 แล้ว ดู
ส่วน migration ของ basicaer สำหรับ
ตัวเลือกการย้าย
execute
ฟังก์ชัน qiskit.execute ไม่มีอยู่ใน Qiskit v1.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
# new location in the circuit library:
from qiskit.circuit.library import DiagonalGate
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 รับ
ตั้งแต่รุ่น v1.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 qubitscircuit = 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 Samplerresult = 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 Samplerresult = sampler_v2.run([circuit]).result()# Access result data for pub 0data_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: 1024The 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เช่น:# Oldfrom qiskit.providers.fake_provider import FakeProviderbackend1 = FakeProvider().get_backend("fake_ourense")from qiskit.providers.fake_provider import FakeSherbrookebackend2 = FakeSherbrooke()# Alternativefrom qiskit_ibm_runtime.fake_provider import FakeProviderbackend1 = FakeProvider().get_backend("fake_ourense")from qiskit_ibm_runtime.fake_provider import FakeSherbrookebackend2 = 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 v1.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 |
แอมพลิจูดแบบจำนวนเชิงซ้อน
แอมพลิจูด (amp) แบบจำนวนเชิงซ้อนถูกแทนที่ด้วยคู่ (amp,
angle) การแทนแบบนี้เข้าใจง่ายกว่า โดยเฉพาะสำหรับงาน
calibration บางอย่าง เช่น การ calibrate มุม:
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})
การฉีด circuit gate operations
การฉีด circuit gate operations เข้าไปใน pulse builder context ผ่าน
qiskit.pulse.builder.call ไม่สามารถทำได้อีกต่อไปแล้ว
การลบออกนี้ส่งผลต่ออาร์กิวเมนต์ที่เป็นประเภท QuantumCircuit รวมถึง
ฟังก์ชันต่อไปนี้:
qiskit.pulse.builder.call_gateqiskit.pulse.builder.cxqiskit.pulse.builder.u1qiskit.pulse.builder.u2qiskit.pulse.builder.u3qiskit.pulse.builder.x
ถ้ายังอยากฉีด backend-calibrated schedules เข้าไป ให้ใช้รูปแบบนี้ แทนการเรียก gate commands
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)
ในทำนองเดียวกัน QuantumCircuit สามารถ
ฉีดเข้า builder context ได้โดย transpile และ schedule object นั้นก่อนด้วยตัวเอง
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)
แนะนำให้เขียน pulse program ขนาดเล็กที่สุดด้วย builder แล้วแนบเข้ากับ
QuantumCircuit ผ่านเมธอด
QuantumCircuit.add_calibration
ในรูปแบบ microcode ของ gate instruction แทนที่จะเขียนโปรแกรมทั้งหมดด้วย pulse model
builder.build
อาร์กิวเมนต์ต่อไปนี้ใน qiskit.pulse.builder.build ถูกลบออกโดยไม่มีทางเลือกแทน
default_transpiler_settingsdefault_circuit_scheduler_settings
ฟังก์ชันเหล่านี้ก็ถูกลบออกเช่นกัน:
qiskit.pulse.builder.active_transpiler_settingsqiskit.pulse.builder.active_circuit_scheduler_settingsqiskit.pulse.builder.transpiler_settingsqiskit.pulse.builder.circuit_scheduler_settings
เหตุผลคือไม่สามารถฉีด circuit objects เข้า builder context ได้อีกแล้ว (ดู การฉีด circuit gate operations) การตั้งค่าเหล่านี้ใช้สำหรับ แปลง object ที่ฉีดเข้ามาให้เป็น pulse representations
library
discrete pulse library ถูกลบออกจาก codebase แล้ว ได้แก่:
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
ให้ใช้
qiskit.pulse.SymbolicPulse
ที่สอดคล้องกันแทน พร้อมกับ
SymbolicPulse.get_waveform()
ตัวอย่างเช่น แทนที่จะใช้ pulse.gaussian(100,0.5,10) ให้ใช้
pulse.Gaussian(100,0.5,10).get_waveform() แทน โปรดทราบว่า phase ของทั้ง
Sawtooth และ
Square ถูกนิยามให้
phase 2\\pi เลื่อนไปหนึ่งรอบเต็ม ต่างจาก discrete counterpart นอกจากนี้
symbolic pulse library ไม่รองรับ complex amplitudes อีกต่อไป ให้ใช้ float, amp, และ angle แทน
ScalableSymbolicPulse
ไม่สามารถโหลด qiskit.pulse.ScalableSymbolicPulse objects
ที่มีพารามิเตอร์ amp เป็น complex จากไฟล์ qpy เวอร์ชัน 5 หรือก่อนหน้า
(Qiskit Terra < 0.23.0) ได้อีกแล้ว ไม่จำเป็นต้องทำอะไร เพราะ complex amp จะถูก
แปลงเป็น float (amp, angle) โดยอัตโนมัติ
การเปลี่ยนแปลงนี้มีผลกับ pulse เหล่านี้:
qiskit.qasm
โมดูล legacy OpenQASM 2 parser ที่เคยอยู่ใน qiskit.qasm
ถูกแทนที่ด้วยโมดูล qiskit.qasm2 ซึ่ง
มี parser ที่เร็วกว่าและแม่นยำกว่าสำหรับ OpenQASM 2 เมธอด high-level
QuantumCircuit อย่าง
from_qasm_file()
และ
from_qasm_str()
ยังคงเหมือนเดิม แต่จะใช้ parser ใหม่ภายใน อย่างไรก็ตาม
public interface ของโมดูล qasm2 ไม่เหมือนเดิม ในขณะที่โมดูล qiskit.qasm
ให้ interface สำหรับ abstract syntax tree ที่ parser library ply คืนค่ามา แต่ qiskit.qasm2 ไม่เปิดเผย AST
หรือรายละเอียด implementation ระดับล่างของ parser แต่รับ OpenQASM 2 เป็น input และ
คืนค่าเป็น QuantumCircuit object แทน
ตัวอย่างเช่น ถ้าเคยรันโค้ดแบบนี้:
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)
ให้แทนด้วยสิ่งนี้:
import qiskit.qasm2
qasm_circ = qiskit.qasm2.load("myfile.qasm")
qiskit.quantum_info
โมดูล qiskit.quantum_info.synthesis ถูกย้ายไปยังที่ต่างๆ ใน codebase
ส่วนใหญ่ไปที่ qiskit.synthesis
| ที่ถูกลบออก | ทางเลือกแทน |
|---|---|
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 |
การย้ายนี้ไม่ได้กระทบ import path ปกติของ Quaternion แต่ไม่สามารถเข้าถึง
มันผ่าน qiskit.quantum_info.synthesis ได้อีกแล้ว
สุดท้าย cnot_rxx_decompose ถูกลบออกแล้ว
qiskit.test
โมดูล qiskit.test ไม่ใช่ public module อีกต่อไปแล้ว โมดูลนี้ไม่เคยถูกออกแบบให้เป็น public
หรือให้ใช้นอก Qiskit test suite ฟังก์ชันทั้งหมดเป็น specific ต่อ Qiskit และไม่มีทางเลือกแทน
ถ้าต้องการฟังก์ชันที่คล้ายกัน ให้รวมไว้ใน test harnesses ของตัวเองแทน
qiskit.tools
โมดูล qiskit.tools ถูกลบออกใน Qiskit v1.0 ฟังก์ชันส่วนใหญ่ถูก
แทนที่ด้วยฟังก์ชันที่คล้ายกันใน package อื่น หรือถูกลบออกโดยไม่มีทางเลือกแทน
ข้อยกเว้นหลักคือฟังก์ชัน qiskit.tools.parallel_map() ซึ่งย้ายไปที่
โมดูล qiskit.utils แล้ว สามารถใช้ได้จาก
ที่ใหม่นี้แทน ตัวอย่างเช่น:
ถ้าเคยรัน:
# Previous
from qiskit.tools import parallel_map
parallel_map(func, input)
# Current
from qiskit.utils import parallel_map
parallel_map(func, input)
jupyter
submodule qiskit.tools.jupyter ถูกลบออกแล้ว เพราะฟังก์ชันใน
โมดูลนี้ผูกกับ package qiskit-ibmq-provider รุ่นเก่า ซึ่งไม่รองรับอีกต่อไปแล้ว
นอกจากนี้ยังรองรับแค่ BackendV1 ไม่รองรับ interface
BackendV2 ที่ใหม่กว่า
monitor
submodule qiskit.tools.monitor ถูกลบออกแล้ว เพราะผูกกับ
package qiskit-ibmq-provider รุ่นเก่า ซึ่งไม่รองรับอีกต่อไปแล้ว (รองรับแค่ interface BackendV1
ไม่รองรับ
BackendV2 ที่ใหม่กว่า) ไม่มีทางเลือกแทนสำหรับฟังก์ชันนี้
visualization
submodule qiskit.tools.visualization ถูกลบออกแล้ว โมดูลนี้เป็น
legacy redirect จากที่ตั้งเดิมของ Qiskit visualization module และ
ย้ายไปที่ qiskit.visualization ตั้งแต่ Qiskit
0.8.0 แล้ว ถ้ายังใช้ path นี้อยู่ ให้อัปเดต import จาก
qiskit.tools.visualization เป็น
qiskit.visualization
# Previous
from qiskit.tools.visualization import plot_histogram
plot_histogram(counts)
# Current
from qiskit.visualization import plot_histogram
plot_histogram(counts)
events
โมดูล qiskit.tools.events และ utility progressbar() ที่มีอยู่
ถูกลบออกแล้ว ฟังก์ชันของโมดูลนี้ไม่ได้ถูกใช้กันมากนัก และ
package เฉพาะทางอย่าง tqdm ครอบคลุมได้ดีกว่า
qiskit.transpiler
synthesis
items ใน qiskit.transpiler.synthesis module ถูกย้ายไปยังที่ใหม่:
| ที่ถูกลบออก | ทางเลือกแทน |
|---|---|
qiskit.transpiler.synthesis.aqc (ยกเว้น 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
Transpiler pass NoiseAdaptiveLayout ถูกแทนที่ด้วย
VF2Layout และ
VF2PostLayout
ซึ่งกำหนด layout ตามลักษณะ noise ที่รายงานมาจาก backend ทั้ง pass และ layout stage
plugin "noise_adaptive" ที่สอดคล้องกันถูกลบออกจาก Qiskit แล้ว
Transpiler pass CrosstalkAdaptiveSchedule ถูกลบออกจาก codebase แล้ว
pass นี้ใช้งานไม่ได้อีกต่อไปเพราะ internal operation
ของมันขึ้นอยู่กับ custom properties ที่ต้องตั้งค่าใน BackendProperties payload
ของ instance BackendV1 เนื่องจากไม่มี backend ใดตั้งค่า fields เหล่านี้ จึงลบ pass ออก
passmanager
เมธอด append ของคลาส
ConditionalController,
FlowControllerLinear, และ
DoWhileController
ถูกลบออกแล้ว ต้องส่ง tasks ทั้งหมดตอนสร้าง controller
objects แทน
qiskit.utils
tools ต่อไปนี้ใน qiskit.utils ถูกลบออกโดยไม่มีทางเลือกแทน:
qiskit.utils.arithmeticqiskit.utils.circuit_utilsqiskit.utils.entangler_mapqiskit.utils.name_unnamed_args
ฟังก์ชันเหล่านี้ถูกใช้เฉพาะในโมดูล qiskit.algorithms และ
qiskit.opflow เท่านั้น ซึ่งก็ถูกลบออกไปด้วยเช่นกัน
qiskit.visualization
โมดูล qiskit.visualization.qcstyle ถูกลบออกแล้ว ให้ใช้
qiskit.visualization.circuit.qcstyle เป็นทางเลือกแทนโดยตรง