انتقل إلى المحتوى الرئيسي
هذا المشروع في مرحلة تجريبية. وجدت خطأ؟ افتح مشكلة على GitHub. لديك سؤال أو فكرة؟ اسأل في Discussions — نحب سماع ملاحظاتك!
كيف جودة الترجمة في هذه الصفحة؟

تغييرات ميزات Qiskit v1.0

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

أداة ترحيل Qiskit v1.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 v1.0. استخدم بدلاً منه نفس الكائن من مساحة الاسم qiskit_aer، وهو بديل متوافق تماماً. لتثبيت qiskit_aer، شغّل:

pip install qiskit-aer

BasicAer​

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

execute​

دالة qiskit.execute غير متاحة في Qiskit v1.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
# 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_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.

ملاحظة

ابتداءً من إصدار v1.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: صُممت النسخة الجديدة V2 من العناصر الأولية (primitives) لقبول مدخلات متجهة (vectorized)، حيث يمكن تجميع دوائر مفردة مع مواصفات ذات قيم مصفوفية. أي أنه يمكن تنفيذ دائرة واحدة لمصفوفات من n مجموعة معاملات، أو n مُلاحَظ، أو كليهما (في حالة Estimator). تُسمى كل مجموعة كتلة أولية موحدة (pub)، ويمكن تمثيلها كصف: (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 التالية (استبدال مباشر):

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 v1.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 v1.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، اللذان يحددان التخطيط بناءً على خصائص الضوضاء المُبلَّغ عنها لخلفية ما. تمت إزالة كل من الممر ومكوّن إضافي مرحلة التخطيط "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 كبديل مباشر لها.