انتقل إلى المحتوى الرئيسي

تغييرات ميزات Qiskit 1.0

يصف هذا الدليل مسارات الترحيل لأهم تغييرات الميزات في Qiskit 1.0، مرتبةً حسب الوحدة البرمجية (module). استخدم جدول المحتويات على الجانب الأيمن للتنقل إلى الوحدة التي تريدها.

أداة ترحيل Qiskit 1.0

لتسهيل عملية الترحيل، يمكنك استخدام أداة flake8-qiskit-migration للكشف عن مسارات الاستيراد المحذوفة في كودك واقتراح بدائل لها.

إذا كان لديك pipx مثبتاً، فقط شغّل الأمر التالي.

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

سيثبّت هذا الحزمة في بيئة افتراضية مؤقتة ويشغّلها على كودك.

القيود

هذه الأداة تكتشف فقط مسارات الاستيراد المحذوفة. لا تكتشف استخدام الدوال المحذوفة (مثل QuantumCircuit.qasm) ولا الوسيطات المحذوفة. كما أنها لا تتتبع الإسنادات مثل qk = qiskit، وإن كانت تتعامل مع الأسماء المستعارة مثل import qiskit as qk.

لمزيد من المعلومات، اطلع على مستودع المشروع.

الكائنات والدوال العامة

Aer

كائن qiskit.Aer غير متاح في Qiskit 1.0. استخدم بدلاً منه نفس الكائن من مساحة الاسم qiskit_aer، وهو بديل متوافق تماماً. لتثبيت qiskit_aer، شغّل:

pip install qiskit-aer

BasicAer

كائن qiskit.BasicAer غير متاح في Qiskit 1.0. اطلع على قسم ترحيل basicaer للاطلاع على خيارات الترحيل المتاحة.

execute

دالة qiskit.execute غير متاحة في Qiskit 1.0. كانت هذه الدالة بمثابة غلاف عالي المستوى حول دالتَي 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)

بديلاً عن ذلك، البدائي Sampler يعادل دلالياً دالة qiskit.execute المحذوفة. الصنف BackendSampler هو غلاف عام للـ backends التي لا تدعم البدائيات (primitives):

from qiskit.primitives import BackendSampler

sampler = BackendSampler(backend)
job = sampler.run(circuit)

qiskit.circuit

QuantumCircuit.qasm

تم حذف الدالة QuantumCircuit.qasm. استخدم بدلاً منها qasm2.dump أو qasm2.dumps.

للحصول على مخرجات منسقة بـ Pygments، اطلع على حزمة openqasm-pygments المستقلة، إذ لا توفر qasm2.dump وqasm2.dumps مخرجات ملوّنة بـ 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)

بوابات QuantumCircuit

تم حذف دوال البوابات التالية لصالح دوال أكثر شيوعاً تُضيف البوابات ذاتها:

المحذوفالبديل
QuantumCircuit.cnotQuantumCircuit.cx
QuantumCircuit.toffoliQuantumCircuit.ccx
QuantumCircuit.fredkinQuantumCircuit.cswap
QuantumCircuit.mctQuantumCircuit.mcx
QuantumCircuit.iQuantumCircuit.id
QuantumCircuit.squQuantumCircuit.unitary

تم حذف دوال الدائرة التالية أيضاً. يمكن بدلاً منها إضافة هذه البوابات إلى الدائرة باستخدام 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.snapshotتعليمات الحفظ في qiskit-aer

qiskit.converters

تم حذف دالة qiskit.converters.ast_to_dag من Qiskit. كانت تحوّل شجرة الصياغة المجردة (abstract syntax tree) التي ينتجها محلل OpenQASM 2 القديم إلى DAGCircuit. بما أن محلل OpenQASM 2 القديم قد أُزيل (انظر qiskit.qasm)، لم تعد لهذه الدالة أي غاية. بدلاً منها، حوّل ملفات OpenQASM 2 إلى QuantumCircuit باستخدام 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 لم تعد متاحة. معظم كائناتها تم دمجها في مكتبة الدوائر (qiskit.circuit.library). للترحيل إلى الموقع الجديد، استبدل ببساطة qiskit.extensions بـ qiskit.circuit.library في مسار استيراد الكائن. وهذا بديل متوافق تماماً.

# Previous
from qiskit.extensions import DiagonalGate

# Current alternative
from qiskit.circuit.library import DiagonalGate

الأصناف التي انتقلت إلى qiskit.circuit.library هي:

تم حذف الأصناف التالية من قاعدة الكود بشكل نهائي، إذ كانت وظائفها إما مكررة أو مرتبطة بوحدة extensions:

المحذوفالبديل
SingleQubitUnitaryqiskit.circuit.library.UnitaryGate
Snapshotاستخدم تعليمات الحفظ في qiskit-aer
ExtensionErrorصنف خطأ مناسب

qiskit.primitives

أبرز تغيير في وحدة qiskit.primitives هو إطلاق واجهة primitives V2 الجديدة. يوضح هذا القسم كيفية الانتقال من primitives V1 إلى primitives V2، إلى جانب التغييرات الطفيفة التي طرأت على المدخلات التي تقبلها واجهة V1.

ملاحظة

ابتداءً من إصدار 1.0، سنشير إلى واجهة primitives السابقة للإصدار 1.0 بـ "primitives V1".

الانتقال من V1 إلى V2

الفارق الجوهري بين واجهتَي primitives V1 وV2 هو الفئات الأساسية التي ترث منها تطبيقات primitives. للانتقال إلى الفئات الأساسية الجديدة، يمكنك الإبقاء على مسار الاستيراد الأصلي من qiskit.primitives:

الانتقال منالاستبدال بـ
BaseEstimatorBaseEstimatorV2
BaseSamplerBaseSamplerV2

تم تعديل أسماء تطبيقات Qiskit الأساسية لـ V2 primitives (تلك التي يمكن استيرادها من qiskit.primitives)، وذلك لتوضيح غرضها كتطبيقات قابلة للتشغيل محلياً باستخدام محاكي statevector. الأسماء الجديدة لا تتضمن اللاحقة ‎-V2.

الانتقال منالاستبدال بـ
qiskit.primitives.Estimatorqiskit.primitives.StatevectorEstimator
qiskit.primitives.Samplerqiskit.primitives.StatevectorSampler

ثمة فروق مفاهيمية ينبغي مراعاتها عند الانتقال من V1 إلى V2. تفرضها الفئة الأساسية، وتوضحها الأمثلة التالية باستخدام تطبيقات statevector الموجودة في qiskit.primitives:

ملاحظة

في الأمثلة التالية، افترض الاستيرادات وتهيئات primitive التالية:

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: صُمِّمت primitives V2 الجديدة لقبول مدخلات متجهية (vectorized inputs)، حيث يمكن تجميع دائرة واحدة مع مواصفات ذات قيم مصفوفية. بمعنى أنه يمكن تنفيذ دائرة واحدة على مصفوفات من n مجموعة معاملات أو n مؤثراً (observable)، أو كليهما معاً (في حالة المُقدِّر Estimator). يُسمى كل تجمع primitive unified bloc (PUB)، ويمكن تمثيله كصف (tuple): (1 x circuit, [n x observables], [n x parameters]). لم تتح واجهة V1 هذه المرونة؛ إذ كان لا بد أن يتطابق عدد دوائر الإدخال مع عدد المؤثرات ومجموعات المعاملات، كما توضح الأمثلة التالية (اختر تبويباً لرؤية كل مثال):
# 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

تقبل primitives V2 عدة PUBs كمدخلات، ولكل PUB نتيجته الخاصة. يتيح ذلك تشغيل دوائر مختلفة بتركيبات متنوعة من المعاملات والمؤثرات، وهو ما لم يكن ممكناً دائماً في واجهة V1:

# 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: يُعيد Sampler في V2 الآن نتائج قياسات على شكل سلاسل بتية (bitstrings) أو عدادات (counts)، بدلاً من التوزيعات الشبه-احتمالية (quasi-probability distributions) التي كانت تُنتجها واجهة V1. تعرض سلاسل البتات نتائج القياسات مع الحفاظ على ترتيب القياسات (shot order). تُنظِّم كائنات نتائج Sampler V2 البيانات وفق أسماء السجلات الكلاسيكية للدوائر المدخلة، لضمان التوافق مع الدوائر الديناميكية.

    # 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
    اسم السجل الكلاسيكي الافتراضي

    في الدائرة أعلاه، لاحظ أن اسم السجل الكلاسيكي يكون افتراضياً "meas". سيُستخدم هذا الاسم لاحقاً للوصول إلى سلاسل بتات القياس.

    # 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: التكلفة الحسابية الناجمة عن أخذ العينات (shots)، التي كانت تُحدَّد في تطبيقات V1 عبر خيار التشغيل shots، أصبحت الآن وسيطةً (argument) في دالة run() الخاصة بـ primitives، يمكن تحديدها على مستوى PUB بشكل مستقل. تعرض الفئتان الأساسيتان V2 هذه الوسيطات بصيغة تختلف عن واجهة V1:

    • BaseSamplerV2.run تعرض وسيطة shots (مشابهة للأسلوب السابق):

      # 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 تُقدِّم وسيطة precision التي تحدد هامش الخطأ الذي ينبغي أن يستهدفه تطبيق primitive في تقدير قيم التوقع:

      # 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

  • لم يعد مسموحاً بالتحويل الضمني من BaseOperator كثيف إلى SparsePauliOp في وسيطات المؤثرات الخاصة بـ Estimator. ينبغي التحويل الصريح إلى SparsePauliOp باستخدام SparsePauliOp.from_operator(operator) بدلاً من ذلك.

  • لم يعد مسموحاً باستخدام PauliList في وسيطات المؤثرات الخاصة بـ Estimator. ينبغي التحويل الصريح للوسيطة باستخدام SparsePauliOp(pauli_list) أولاً.

qiskit.providers

basicaer

استُبدل معظم ما في وحدة qiskit.providers.basicaer بالوحدة الجديدة qiskit.providers.basic_provider، باستثناء فئتَي UnitarySimulatorPy وStatevectorSimulatorPy اللتين أُزيلتا تماماً؛ إذ كانت وظيفتهما متاحة مسبقاً في وحدة quantum_info.

الانتقال إلى المسارات الجديدة أمر بسيط. يمكنك استبدال معظم فئات qiskit.providers.basicaer بما يقابلها في qiskit.providers.basic_provider (استبدال مباشر). لاحظ أن الفئات التالية لها مسارات وأسماء جديدة:

المُزالالبديل
qiskit.providers.basicaerqiskit.providers.basic_provider
BasicAerProviderBasicProvider
BasicAerJobBasicProviderJob
QasmSimulatorPyBasicSimulator
النسخ العامة (Global instances)

انتبه إلى أي نسخ عامة عند الانتقال إلى الوحدة الجديدة. لا يوجد بديل للنسخة العامة BasicAer التي كان يمكن استيرادها مباشرةً كـ qiskit.BasicAer. هذا يعني أن from qiskit import BasicProvider لم تعد صيغة استيراد صحيحة. بدلاً من ذلك، يجب استيراد فئة provider من وحدتها الفرعية وإنشاء نسخة منها يدوياً:

# 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 بفئات مختلفة من quantum_info. هذا ليس استبدالاً مباشراً، لكن التغييرات بسيطة. انظر أمثلة الانتقال التالية:

المُزالالبديل
UnitarySimulatorPyquantum_info.Operator
StatevectorSimulatorPyquantum_info.Statevector

توضح الأمثلة التالية مسارات الانتقال لمحاكيات basicaer.

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 الخاصة بـ qiskit-ibm-runtime. يشمل ذلك فئات fake provider، وجميع الـ backends الوهمية المخصصة للأجهزة (مثل FakeVigo وFakeNairobiV2 وFakeSherbrooke)، والفئات الأساسية للـ backends الوهمية. انقر على التبويبات التالية لعرض الفئات المتأثرة.

  • أي فئة في qiskit.providers.fake_provider.backends
  • fake_provider.fake_backend.FakeBackend
  • fake_provider.fake_backend.FakeBackendV2

للانتقال إلى المسار الجديد:

  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()

جرى ترحيل الفئات الأساسية للـ backends الوهمية أيضاً، لكن مع بعض الاختلاف في مسار الاستيراد:

المُزالالبديل
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
ملاحظة

إذا كنت تعتمد على backends وهمية في اختبارات الوحدة لمكتبة تابعة، وواجهت تعارضاً مع تبعية qiskit-ibm-runtime، يمكنك الاستعاضة عنها ببدائل Qiskit-native للـ backends الوهمية العامة. وتشمل هذه فئات BackendV1 التالية (استبدال مباشر):

وهذه فئة قابلة للتهيئة تُعيد نسخاً من BackendV2:

fake_provider (backends اختبار خاصة)

فئات fake backend المخصصة لأغراض الاختبار الخاصة في qiskit.providers.fake_provider لم يجرِ ترحيلها إلى qiskit_ibm_runtime.fake_provider. مسار الانتقال الموصى به هو استخدام فئة 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

مثال: الانتقال إلى فئة 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.

نصائح انتقال أخرى

  • لم يعد الاستيراد من qiskit.providers.aer متاحاً. بدلاً من ذلك، استورد من qiskit_aer، وهو بديل مباشر. لتثبيت qiskit_aer، شغِّل:

    pip install qiskit-aer
  • أُزيل في Qiskit 1.0 دعم تشغيل مهام pulse على backends من qiskit.providers.fake_provider، وذلك لأن Qiskit Aer أزال وظيفة المحاكاة الخاصة بمثل هذه المهام. للأعمال المتعلقة بمحاكاة Hamiltonian على المستوى المنخفض، يُنصح باستخدام مكتبة متخصصة مثل Qiskit Dynamics.

qiskit.pulse

ParametricPulse

تم استبدال الفئة الأساسية qiskit.pulse.library.parametric_pulses.ParametricPulse ومكتبة النبضات بـ qiskit.pulse.SymbolicPulse والمكتبة المقابلة لها. تدعم 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). هذا التمثيل أكثر وضوحاً وبديهية، خاصةً في بعض مهام المعايرة مثل معايرة الزاوية:

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 في سياق منشئ النبضات عبر 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، استخدم النمط الآتي بدلاً من استدعاء أوامر البوابات:

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 في سياق المنشئ عبر الترجمة والجدولة اليدوية للكائن:

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)

نوصي بكتابة برنامج نبضي بسيط باستخدام المنشئ وإرفاقه بـ QuantumCircuit عبر طريقة QuantumCircuit.add_calibration كرمز مصغر لتعليمة بوابة، بدلاً من كتابة البرنامج بأكمله باستخدام نموذج النبضات.

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 في سياق المنشئ (انظر حقن عمليات بوابات الدائرة)؛ إذ كانت هذه الإعدادات مخصصة لتحويل الكائنات المحقونة إلى تمثيلات نبضية.

library

تمت إزالة مكتبة النبضات المتقطعة من قاعدة الكود بالكامل. ويشمل ذلك:

  • 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(). لاحظ أن طور كلٍّ من Sawtooth و Square معرَّف بحيث يُحدث طور 2\\pi إزاحةً بمقدار دورة كاملة، خلافاً للنظير المتقطع. لاحظ أيضاً أن السعات العقدية لم تعد مدعومة في مكتبة النبضات الرمزية؛ استخدم float وamp وangle بدلاً منها.

ScalableSymbolicPulse

لم يعد بالإمكان تحميل كائنات qiskit.pulse.ScalableSymbolicPulse من مكتبة النبضات التي تحتوي على معامل amp عقدي من ملفات qpy الإصدار 5 أو أقدم (Qiskit Terra < 0.23.0). لا يلزم اتخاذ أي إجراء للترحيل، إذ سيتم تحويل amp العقدي تلقائياً إلى float من النوع (amp, angle).

ينطبق هذا التغيير على هذه النبضات:

qiskit.qasm

تم استبدال وحدة المحلل اللغوي القديمة لـ OpenQASM 2 التي كانت في qiskit.qasm بوحدة qiskit.qasm2، التي توفر محللاً أسرع وأدق لـ OpenQASM 2. تبقى طرق QuantumCircuit عالية المستوى from_qasm_file() و from_qasm_str() كما هي، لكنها ستستخدم المحلل الجديد داخلياً. غير أن الواجهة العامة لوحدة qasm2 مختلفة. بينما كانت وحدة qiskit.qasm توفر واجهةً لشجرة البنية المجردة التي يُعيدها مكتبة ply، فإن qiskit.qasm2 لا تكشف عن شجرة البنية أو أي تفاصيل تنفيذية للمحلل. بدلاً من ذلك، تأخذ مدخلاً بتنسيق OpenQASM 2 وتُخرج كائن QuantumCircuit.

على سبيل المثال، إذا كنت تشغّل شيئاً كهذا سابقاً:

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 إلى مواقع متعددة في قاعدة الكود، معظمها في 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

لم يؤثر هذا النقل على مسار الاستيراد المعتاد لـ Quaternion، لكن لم يعد بإمكانك الوصول إليه عبر qiskit.quantum_info.synthesis.

أخيراً، تمت إزالة cnot_rxx_decompose.

qiskit.test

وحدة qiskit.test لم تعد وحدة عامة. لم يُقصد بها يوماً أن تكون عامة أو تُستخدم خارج مجموعة اختبارات Qiskit. جميع وظائفها كانت مخصصة لـ Qiskit ولا يوجد بديل مقدَّم لها؛ إذا كنت تحتاج وظائف مماثلة، ينبغي إدراجها في أدوات اختبار خاصة بك.

qiskit.tools

تمت إزالة وحدة qiskit.tools في Qiskit 1.0. معظم وظائفها إما حلّت محلها وظائف مماثلة في حزم أخرى، أو أُزيلت دون توفير بديل. الاستثناء الرئيسي هو دالة 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

تمت إزالة الوحدة الفرعية qiskit.tools.jupyter لأن وظائفها مرتبطة بحزمة qiskit-ibmq-provider القديمة التي لم تعد مدعومة. كما أنها كانت تدعم BackendV1 فقط دون واجهة BackendV2 الأحدث.

monitor

تمت إزالة الوحدة الفرعية qiskit.tools.monitor لأنها كانت مرتبطة بحزمة qiskit-ibmq-provider القديمة التي لم تعد مدعومة (كما أنها كانت تدعم واجهة BackendV1 فقط دون واجهة BackendV2 الأحدث). لا يوجد بديل مقدَّم لهذه الوظيفة.

visualization

تمت إزالة الوحدة الفرعية qiskit.tools.visualization. كانت هذه الوحدة إعادة توجيه قديمة من الموقع الأصلي لوحدة تصوير Qiskit، والتي انتقلت إلى qiskit.visualization في Qiskit 0.8.0. إذا كنت لا تزال تستخدم هذا المسار، حدّث استيراداتك من 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 وأداة progressbar() التي كانت تعرضها. وظائف هذه الوحدة لم تكن مستخدمة على نطاق واسع، وتغطيها بشكل أفضل حزم متخصصة مثل tqdm.

qiskit.transpiler

synthesis

تم نقل عناصر وحدة qiskit.transpiler.synthesis إلى مواقع جديدة:

المُزالالبديل
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 ‏NoiseAdaptiveLayout بـ VF2Layout و VF2PostLayout، اللتان تضعان تخطيطاً بناءً على خصائص الضوضاء المُبلَّغ عنها من الـ Backend. وقد تمت إزالة كلتا التمريرتين والمكوّن الإضافي لمرحلة التخطيط "noise_adaptive" المقابل له من Qiskit.

تمت إزالة تمريرة الـ Transpiler ‏CrosstalkAdaptiveSchedule من قاعدة الكود. لم تعد هذه التمريرة قابلة للاستخدام لأن عملها الداخلي كان يعتمد على خصائص مخصصة مضبوطة في حمولة BackendProperties لنسخة BackendV1. وبما أن لا Backends تضبط هذه الحقول، فقد تمت إزالة التمريرة.

passmanager

تمت إزالة طرق append في فئات ConditionalController و FlowControllerLinear و DoWhileController. بدلاً من ذلك، يجب توفير جميع المهام عند إنشاء كائنات التحكم.

qiskit.utils

تمت إزالة الأدوات التالية في 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 كبديل مباشر لها.