ข้ามไปยังเนื้อหาหลัก

การเปลี่ยนแปลงฟีเจอร์ใน Qiskit 1.0

คู่มือนี้อธิบายเส้นทางการย้ายสำหรับการเปลี่ยนแปลงฟีเจอร์ที่สำคัญที่สุดใน Qiskit 1.0 โดยจัดเรียงตามโมดูล ใช้สารบัญทางด้านขวาเพื่อนำทางไปยังโมดูลที่ต้องการ

เครื่องมือช่วยย้าย Qiskit 1.0

เพื่อช่วยให้กระบวนการย้ายง่ายขึ้น สามารถใช้เครื่องมือ flake8-qiskit-migration เพื่อตรวจจับ import path ที่ถูกลบออกในโค้ดและเสนอทางเลือกแทน

ถ้ามี pipx ติดตั้งอยู่แล้ว ให้รันคำสั่งต่อไปนี้ได้เลย

pipx run flake8-qiskit-migration <path-to-source-directory>

คำสั่งนี้จะติดตั้งแพ็กเกจไปยัง virtual environment ชั่วคราวแล้วรันตรวจสอบโค้ด

ข้อจำกัด

เครื่องมือนี้ตรวจจับเฉพาะ 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.cnotQuantumCircuit.cx
QuantumCircuit.toffoliQuantumCircuit.ccx
QuantumCircuit.fredkinQuantumCircuit.cswap
QuantumCircuit.mctQuantumCircuit.mcx
QuantumCircuit.iQuantumCircuit.id
QuantumCircuit.squQuantumCircuit.unitary

เมธอด Circuit ต่อไปนี้ถูกลบออกแล้ว แทนที่นั้น Gate เหล่านี้สามารถ นำไปใช้กับ Circuit ได้ด้วย QuantumCircuit.append

ที่ถูกลบออกทางเลือก (append)
QuantumCircuit.diagonalDiagonalGate
QuantumCircuit.hamiltonianHamiltonianGate
QuantumCircuit.isometryIsometry
QuantumCircuit.isoIsometry
QuantumCircuit.ucUCGate
QuantumCircuit.ucrxUCRXGate
QuantumCircuit.ucryUCRYGate
QuantumCircuit.ucrzUCRZGate

ตัวอย่างเช่น สำหรับ 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_parametersQuantumCircuit.assign_parameters
QuantumCircuit.snapshotsave 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 ได้แก่:

คลาสต่อไปนี้ถูกลบออกจาก codebase แล้ว เนื่องจากฟังก์ชันการทำงาน ซ้ำซ้อนหรือเชื่อมโยงกับโมดูล extensions:

ที่ถูกลบออกทางเลือก
SingleQubitUnitaryqiskit.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 ได้:

ย้ายจากแทนด้วย
BaseEstimatorBaseEstimatorV2
BaseSamplerBaseSamplerV2

ชื่อของ qiskit core implementations ของ V2 primitives (ที่ import ได้จาก qiskit.primitives) ได้รับการแก้ไขเพื่อให้ชัดเจนว่าเป็น implementations ที่รันได้บนเครื่องของคุณด้วย statevector simulator backend ชื่อใหม่ ไม่มี suffix -V2

ย้ายจากแทนด้วย
qiskit.primitives.Estimatorqiskit.primitives.StatevectorEstimator
qiskit.primitives.Samplerqiskit.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
  1. 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 เพื่อดูแต่ละตัวอย่าง):
# 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

V2 primitives รับ PUB หลายรายการเป็นอินพุต และแต่ละ PUB จะได้ผลลัพธ์ของตัวเอง ทำให้คุณรัน Circuit ต่างๆ พร้อม parameter/observable combinations ที่หลากหลายได้ ซึ่งทำไม่ได้เสมอใน V1 interface:

# 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)
  1. 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}
  2. Sampler and Estimator: sampling overhead ที่ V1 implementations มักเปิดเผยผ่าน run option shots ตอนนี้กลายเป็น argument ของเมธอด run() ของ primitives ที่สามารถระบุได้ในระดับ PUB V2 base classes เปิดเผย arguments ในรูปแบบที่แตกต่างจาก V1 API:

    • BaseSamplerV2.run เปิดเผย argument shots (คล้ายกับ 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 แนะนำ argument precision ที่ระบุ 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.basicaerqiskit.providers.basic_provider
BasicAerProviderBasicProvider
BasicAerJobBasicProviderJob
QasmSimulatorPyBasicSimulator
Global instances

ระวัง 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 แต่การเปลี่ยนแปลงก็น้อยมาก ดูตัวอย่างการย้ายต่อไปนี้:

ที่ถูกลบออกทางเลือกใหม่
UnitarySimulatorPyquantum_info.Operator
StatevectorSimulatorPyquantum_info.Statevector

ตัวอย่างต่อไปนี้แสดงวิธีย้าย basicaer simulators:

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)

fake_provider

ส่วนประกอบที่ผู้ใช้มองเห็นได้ส่วนใหญ่ของ qiskit.providers.fake_provider ถูกย้ายไปไว้ใน Python package qiskit-ibm-runtime แล้ว ซึ่งรวมถึง fake provider classes, fake Backend เฉพาะอุปกรณ์ทั้งหมด (เช่น FakeVigo, FakeNairobiV2, และ FakeSherbrooke) และ base class ของ fake Backend คลิกที่แต่ละแท็บเพื่อดู class ที่ได้รับผลกระทบ

  • class ใดก็ตามใน qiskit.providers.fake_provider.backends
  • fake_provider.fake_backend.FakeBackend
  • fake_provider.fake_backend.FakeBackendV2

วิธีย้ายไปใช้ path ใหม่:

  1. ติดตั้ง qiskit-ibm-runtime เวอร์ชัน 0.17.1 หรือใหม่กว่า:

    pip install 'qiskit-ibm-runtime>=0.17.1'
  2. แทนที่ 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.FakeQasmBackendqiskit_ibm_runtime.fake_provider.fake_qasm_backend.FakeQasmBackend
qiskit.providers.fake_provider.FakePulseBackendqiskit_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):

นี่คือ 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.FakeBackendV2fake_provider.GenericBackendV2
fake_provider.FakeBackend5QV2fake_provider.GenericBackendV2
fake_provider.FakeBackendV2LegacyQubitPropsfake_provider.GenericBackendV2
fake_provider.FakeBackendSimplefake_provider.GenericBackendV2
fake_provider.ConfigurableFakeBackendfake_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.ParametricPulseqiskit.pulse.SymbolicPulse
pulse.library.parametric_pulses.Constantpulse.library.symbolic_pulses.Constant
pulse.library.parametric_pulses.Dragpulse.library.symbolic_pulses.Drag
pulse.library.parametric_pulses.Gaussianpulse.library.symbolic_pulses.Gaussian
qiskit.pulse.library.parametric_pulses.GaussianSquarepulse.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_gate
  • qiskit.pulse.builder.cx
  • qiskit.pulse.builder.u1
  • qiskit.pulse.builder.u2
  • qiskit.pulse.builder.u3
  • qiskit.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_settings
  • default_circuit_scheduler_settings

ฟังก์ชันเหล่านี้ก็ถูกลบออกเช่นกัน:

  • qiskit.pulse.builder.active_transpiler_settings
  • qiskit.pulse.builder.active_circuit_scheduler_settings
  • qiskit.pulse.builder.transpiler_settings
  • qiskit.pulse.builder.circuit_scheduler_settings

เหตุผลคือไม่สามารถฉีด circuit objects เข้า builder context ได้อีกแล้ว (ดู การฉีด circuit gate operations) การตั้งค่าเหล่านี้ใช้สำหรับ แปลง object ที่ฉีดเข้ามาให้เป็น pulse representations

library

discrete pulse library ถูกลบออกจาก codebase แล้ว ได้แก่:

  • qiskit.pulse.library.constant
  • qiskit.pulse.library.zero
  • qiskit.pulse.library.square
  • qiskit.pulse.library.sawtooth
  • qiskit.pulse.library.triangle
  • qiskit.pulse.library.cos
  • qiskit.pulse.library.sin
  • qiskit.pulse.library.gaussian
  • qiskit.pulse.library.gaussian_deriv
  • qiskit.pulse.library.sech
  • qiskit.pulse.library.sech_deriv
  • qiskit.pulse.library.gaussian_square
  • qiskit.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

ที่ถูกลบออกทางเลือกแทน
OneQubitEulerDecomposerqiskit.synthesis.one_qubit.OneQubitEulerDecomposer
TwoQubitBasisDecomposerqiskit.synthesis.two_qubits.TwoQubitBasisDecomposer
XXDecomposerqiskit.synthesis.two_qubits.XXDecomposer
two_qubit_cnot_decomposeqiskit.synthesis.two_qubits.two_qubit_cnot_decompose
Quaternionqiskit.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 1.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.graysynthqiskit.synthesis.synth_cnot_phase_aam
qiskit.transpiler.synthesis.cnot_synthqiskit.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.arithmetic
  • qiskit.utils.circuit_utils
  • qiskit.utils.entangler_map
  • qiskit.utils.name_unnamed_args

ฟังก์ชันเหล่านี้ถูกใช้เฉพาะในโมดูล qiskit.algorithms และ qiskit.opflow เท่านั้น ซึ่งก็ถูกลบออกไปด้วยเช่นกัน

qiskit.visualization

โมดูล qiskit.visualization.qcstyle ถูกลบออกแล้ว ให้ใช้ qiskit.visualization.circuit.qcstyle เป็นทางเลือกแทนโดยตรง

Source: IBM Quantum docs — updated 27 เม.ย. 2569
English version on doQumentation — updated 7 พ.ค. 2569
This translation based on the English version of 11 มี.ค. 2569