Перейти до основного вмісту

Зміни функцій у Qiskit 1.0

Цей посібник описує шляхи міграції для найважливіших змін функцій у Qiskit 1.0, організованих за модулями. Використовуй зміст праворуч для переходу до потрібного модуля.

Інструмент міграції 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 є загальною оберткою для бекендів, які не підтримують примітиви:

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. Вона перетворювала абстрактне синтаксичне дерево, згенероване застарілим парсером 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 — введення нового інтерфейсу примітивів V2. У цьому розділі показано, як перенести свій робочий процес з примітивів V1 на примітиви V2, а також кілька змін у вхідних даних, прийнятих інтерфейсом V1.

примітка

Починаючи з релізу 1.0, ми будемо називати інтерфейс примітивів до версії 1.0 «примітивами V1».

Міграція з V1 на V2

Формальна відмінність між API примітивів V1 та V2 полягає у базових класах, від яких успадковуються реалізації примітивів. Щоб перейти на нові базові класи, можна зберегти початковий шлях імпорту з qiskit.primitives:

Мігрувати зЗамінити на
BaseEstimatorBaseEstimatorV2
BaseSamplerBaseSamplerV2

Назви реалізацій примітивів V2 у ядрі Qiskit (тих, що імпортуються з qiskit.primitives), були змінені, щоб прояснити їхнє призначення як реалізацій, що можуть запускатись локально на бекенді-симуляторі statevector. Нові назви не містять суфікса -V2.

Мігрувати зЗамінити на
qiskit.primitives.Estimatorqiskit.primitives.StatevectorEstimator
qiskit.primitives.Samplerqiskit.primitives.StatevectorSampler

Є деякі концептуальні відмінності, які варто врахувати при міграції з V1 на V2. Ці відмінності визначаються базовим класом, але показані в наступних прикладах з використанням реалізацій statevector, знайдених у qiskit.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 та Estimator: Нові примітиви V2 розроблені для прийому векторизованих вхідних даних, де окремі схеми можуть групуватися зі специфікаціями у вигляді масивів. Тобто одна схема може виконуватись для масивів з n наборів параметрів, n спостережуваних, або обох одночасно (для estimator). Кожна група називається примітивним уніфікованим блоком (pub) і може бути представлена як кортеж: (1 x схема, [n x спостережуваних], [n x параметрів]). Інтерфейс 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

Примітиви V2 приймають кілька PUB як вхідні дані, і кожен 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 тепер повертає результати вимірювань у вигляді бітрядків або підрахунків, замість квазіймовірнісних розподілів з інтерфейсу V1. Бітрядки показують результати вимірювань, зберігаючи порядок шотів, в якому вони вимірювались. Об'єкти результатів 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 та Estimator: Витрати на вибірку, які зазвичай задавались через опцію запуску shots у реалізаціях V1, тепер є аргументом методу run() примітивів, який можна вказати на рівні PUB. Базові класи V2 надають аргументи у форматах, відмінних від API 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, який задає планки похибок, яких реалізація примітива має досягти для оцінок очікуваних значень:

      # 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.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
Глобальні екземпляри

Будь обережний з глобальними екземплярами при міграції на новий модуль. Немає заміни для глобального екземпляра BasicAer, який можна було безпосередньо імпортувати як qiskit.BasicAer. Це означає, що from qiskit import BasicProvider більше не є дійсним імпортом. Натомість клас провайдера потрібно імпортувати з його підмодуля та створити екземпляр самостійно:

# 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")

Симулятори унітарних матриць та 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. Це включає класи фейкових провайдерів, усі фейкові бекенди для конкретних пристроїв (такі як FakeVigo, FakeNairobiV2 та FakeSherbrooke), а також базові класи фейкових бекендів. Переглянь наступні вкладки, щоб побачити зачеплені класи.

  • Будь-який клас з 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()

Базові класи фейкових бекендів теж було перенесено, але з деякими відмінностями у шляху імпорту:

ВидаленоАльтернатива
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
примітка

Якщо ти залежиш від фейкових бекендів для юніт-тестування сторонньої бібліотеки та маєш конфлікти із залежністю qiskit-ibm-runtime, можна також знайти нові альтернативи загальних фейкових бекендів, вбудовані у Qiskit. Серед них такі класи BackendV1 (взаємозамінні замінники):

Це конфігурований клас, що повертає екземпляри BackendV2:

fake_provider (спеціальні бекенди для тестування)

Класи фейкових бекендів для спеціальних цілей тестування з qiskit.providers.fake_provider не були перенесені до qiskit_ibm_runtime.fake_provider. Рекомендований шлях міграції — використовувати новий клас GenericBackendV2 для конфігурації бекенду зі схожими властивостями або для побудови власного цільового об'єкта.

ВидаленоАльтернатива
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
  • Підтримку запуску pulse-завдань на бекендах з qiskit.providers.fake_provider було видалено у Qiskit 1.0. Це пов'язано з тим, що Qiskit Aer видалив свою функціональність симуляції для таких завдань. Для низькорівневих задач симуляції гамільтоніана розглянь використання спеціалізованої бібліотеки, як-от 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})

Вбудовування операцій вентилів схеми

Вбудовування операцій вентилів схеми у контекст конструктора імпульсів через 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

Якщо ви все ще хочете вбудовувати калібровані розклади бекенда, використовуйте наступний шаблон замість виклику команд вентилів.

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

Це пов'язано з тим, що більше неможливо вбудовувати об'єкти схем у контекст конструктора (дивіться Вбудовування операцій вентилів схеми); ці налаштування були для перетворення вбудованих об'єктів у імпульсні представлення.

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 не розкриває AST чи інші деталі реалізації парсера низького рівня. Натомість він приймає вхідні дані 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

Транспіляційний прохід NoiseAdaptiveLayout був замінений на VF2Layout та VF2PostLayout, які встановлюють розкладку на основі повідомлених характеристик шуму бекенда. Як сам прохід, так і відповідний плагін етапу розкладки "noise_adaptive" були видалені з Qiskit.

Транспіляційний прохід CrosstalkAdaptiveSchedule був видалений з кодової бази. Цей прохід більше не використовувався, оскільки його внутрішня робота залежала від спеціальних властивостей, встановлених у BackendProperties екземпляра BackendV1. Оскільки жоден бекенд не встановлює ці поля, прохід був видалений.

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 як пряму заміну.