Зміни функцій у Qiskit v1.0
Цей посібник описує шляхи міграції для найважливіших змін функцій у Qiskit v1.0, організованих за модулями. Використовуй зміст праворуч для переходу до потрібного модуля.
Інструмент міграції Qiskit v1.0
Щоб спростити процес міграції, можна скористатись інструментом
flake8-qiskit-migration
для виявлення видалених шляхів імпорту у твоєму коді та отримання альтернатив.
- Run with pipx
- Run with venv
Якщо у тебе встановлено pipx, просто виконай
таку команду.
pipx run flake8-qiskit-migration <path-to-source-directory>
Це встановить пакет у тимчасове віртуальне середовище та запустить його на твоєму коді.
Якщо ти не хочеш використовувати pipx, можна вручну створити нове
середовище для інструмента. Цей підхід також дозволяє використовувати
nbqa для перевірки прикладів коду в
Jupyter-ноутбуках. Видали середовище після завершення.
# Make new environment and install
python -m venv .flake8-qiskit-migration-venv
source .flake8-qiskit-migration-venv/bin/activate
pip install flake8-qiskit-migration
# Run plugin on Python code
flake8 --select QKT100 <path-to-source-directory> # e.g. `src/`
# (Optional) run plugin on notebooks
pip install nbqa
nbqa flake8 ./**/*.ipynb --select QKT100
# Deactivate and delete environment
deactivate
rm -r .flake8-qiskit-migration-venv
Цей інструмент виявляє лише видалені шляхи імпорту. Він не виявляє використання видалених
методів (наприклад, 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 є
загальною оберткою для бекендів, які не підтримують примітиви:
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.cnot | QuantumCircuit.cx |
QuantumCircuit.toffoli | QuantumCircuit.ccx |
QuantumCircuit.fredkin | QuantumCircuit.cswap |
QuantumCircuit.mct | QuantumCircuit.mcx |
QuantumCircuit.i | QuantumCircuit.id |
QuantumCircuit.squ | QuantumCircuit.unitary |
Наступні методи схеми було видалено. Натомість ці вентилі можна
додати до схеми за допомогою QuantumCircuit.append.
| Видалено | Альтернатива (append) |
|---|---|
QuantumCircuit.diagonal | DiagonalGate |
QuantumCircuit.hamiltonian | HamiltonianGate |
QuantumCircuit.isometry | Isometry |
QuantumCircuit.iso | Isometry |
QuantumCircuit.uc | UCGate |
QuantumCircuit.ucrx | UCRXGate |
QuantumCircuit.ucry | UCRYGate |
QuantumCircuit.ucrz | UCRZGate |
Наприклад, для DiagonalGate:
from qiskit.circuit import QuantumCircuit
# new location in the circuit library:
from qiskit.circuit.library import DiagonalGate
circuit = QuantumCircuit(2)
circuit.h([0, 1]) # some initial state
gate = DiagonalGate([1, -1, -1, 1])
qubits = [0, 1] # qubit indices on which to apply the gate
circuit.append(gate, qubits) # apply the gate
Також були видалені такі методи QuantumCircuit:
| Видалено | Альтернатива |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | інструкції збереження від 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:
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
Наступні класи було повністю видалено з кодової бази, оскільки їхні
функції були або надлишковими, або пов'язаними з модулем extensions:
| Видалено | Альтернатива |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | Використовуй інструкції збереження від qiskit-aer |
ExtensionError | Відповідний клас помилки |
qiskit.primitives
Найважливіша зміна в модулі qiskit.primitives —
введення нового інтерфейсу примітивів V2. У цьому розділі показано, як перенести свій
робочий процес з примітивів V1 на примітиви V2, а також кілька змін у вхідних даних,
прийнятих інтерфейсом V1.
Починаючи з релізу v1.0, ми будемо називати інтерфейс примітивів до версії 1.0 «примітивами V1».
Міграція з V1 на V2
Формальна відмінність між API примітивів V1 та V2 полягає у базових класах, від яких
успадковуються реалізації примітивів. Щоб перейти на нові базові класи, можна
зберегти початковий шлях імпорту з qiskit.primitives:
| Мігрувати з | Замінити на |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
Назви реалізацій примітивів V2 у ядрі Qiskit (тих, що імпортуються з qiskit.primitives),
були змінені, щоб прояснити їхнє призначення як реалізацій, що можуть запускатись локально
на бекенді-симуляторі statevector. Нові назви не містять суфікса -V2.
| Мігрувати з | Замінити на |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.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
Sampler та Estimator: Нові примітиви V2 розроблені для прийому векторизованих вхідних даних, де окремі схеми можуть групуватися зі специфікаціями у вигляді масивів. Тобто одна схема може виконуватись для масивів зnнаборів параметрів,nспостережуваних, або обох одночасно (для Estimator). Кожна група називається примітивним уніфікованим блоком (pub) і може бути представлена як кортеж:(1 x схема, [n x спостережуваних], [n x параметрів]). Інтерфейс V1 не мав такої гнучкості. Натомість кількість вхідних схем мала відповідати кількості спостережуваних і наборів параметрів, як показано в наступних прикладах (вибери вкладку, щоб переглянути кожен приклад):
- Estimator, 1 circuit, 4 observables
- Sampler, 1 circuit, 3 parameter sets
- Estimator, 1 circuit, 4 observables, 2 parameter sets
# executing 1 circuit with 4 observables using Estimator V1
job = estimator_v1.run([circuit] * 4, [obs1, obs2, obs3, obs4])
evs = job.result().values
# executing 1 circuit with 4 observables using Estimator V2
job = estimator_v2.run([(circuit, [obs1, obs2, obs3, obs4])])
evs = job.result()[0].data.evs
# executing 1 circuit with 3 parameter sets using Sampler V1
job = sampler_v1.run([circuit] * 3, [vals1, vals2, vals3])
dists = job.result().quasi_dists
# executing 1 circuit with 3 parameter sets using Sampler V2
job = sampler_v2.run([(circuit, [vals1, vals2, vals3])])
counts = job.result()[0].data.meas.get_counts()
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V1
job = estimator_v1.run([circuit] * 8, [obs1, obs2, obs3, obs4] * 2, [vals1, vals2] * 4)
evs = job.result().values
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V2
job = estimator_v2.run([(circuit, [[obs1, obs2, obs3, obs4]], [[vals1], [vals2]])])
evs = job.result()[0].data.evs
Примітиви V2 приймають кілька PUB як вхідні дані, і кожен pub отримує власний результат. Це дозволяє запускати різні схеми з різними комбінаціями параметрів/спостережуваних, що не завжди було можливим в інтерфейсі V1:
- Sampler, 2 circuits, 1 parameter set
- Estimator, 2 circuits, 2 different observables
# executing 2 circuits with 1 parameter set using Sampler V1
job = sampler_v1.run([circuit1, circuit2], [vals1] * 2)
dists = job.result().quasi_dists
# executing 2 circuits with 1 parameter set using Sampler V2
job = sampler_v2.run([(circuit1, vals1), (circuit2, vals1)])
counts1 = job.result()[0].data.meas.get_counts() # result for pub 1 (circuit 1)
counts2 = job.result()[1].data.meas.get_counts() # result for pub 2 (circuit 2)
# executing 2 circuits with 2 different observables using Estimator V1
job = estimator_v1.run([circuit1, circuit2] , [obs1, obs2])
evs = job.result().values
# executing 2 circuits with 2 different observables using Estimator V2
job = estimator_v2.run([(circuit1, obs1), (circuit2, obs2)])
evs1 = job.result()[0].data.evs # result for pub 1 (circuit 1)
evs2 = job.result()[1].data.evs # result for pub 2 (circuit 2)
-
Sampler: Sampler V2 тепер повертає результати вимірювань у вигляді бітрядків або підрахунків, замість квазіймовірнісних розподілів з інтерфейсу V1. Бітрядки показують результати вимірювань, зберігаючи порядок шотів, в якому вони вимірювались. Об'єкти результатів Sampler V2 організовують дані за назвами класичних регістрів вхідних схем для сумісності з динамічними схемами.
# Define quantum circuit with 2 qubitscircuit = QuantumCircuit(2)circuit.h(0)circuit.cx(0, 1)circuit.measure_all()circuit.draw()┌───┐ ░ ┌─┐q_0: ┤ H ├──■───░─┤M├───└───┘┌─┴─┐ ░ └╥┘┌─┐q_1: ─────┤ X ├─░──╫─┤M├└───┘ ░ ║ └╥┘meas: 2/══════════════╩══╩═0 1Назва класичного регістру за замовчуваннямУ схемі вище зверни увагу, що ім'я класичного регістру за замовчуванням —
"meas". Це ім'я використовуватиметься далі для доступу до бітрядків вимірювань.# Run using V1 Samplerresult = sampler_v1.run(circuit).result()quasi_dist = result.quasi_dists[0]print(f"The quasi-probability distribution is: {quasi_dist}")The quasi-probability distribution is: {0: 0.5, 3: 0.5}# Run using V2 Samplerresult = sampler_v2.run([circuit]).result()# Access result data for pub 0data_pub = result[0].data# Access bitstrings for the classical register "meas"bitstrings = data_pub.meas.get_bitstrings()print(f"The number of bitstrings is: {len(bitstrings)}")# Get counts for the classical register "meas"counts = data_pub.meas.get_counts()print(f"The counts are: {counts}")The number of bitstrings is: 1024The counts are: {'00': 523, '11': 501} -
Sampler та 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.basicaer | qiskit.providers.basic_provider |
BasicAerProvider | BasicProvider |
BasicAerJob | BasicProviderJob |
QasmSimulatorPy | BasicSimulator |
Будь обережний з глобальними екземплярами при міграції на новий модуль. Немає заміни
для глобального екземпляра 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. Це не
взаємозамінна заміна, але зміни мінімальні. Дивись наступні приклади
міграції:
| Видалено | Альтернатива |
|---|---|
UnitarySimulatorPy | quantum_info.Operator |
StatevectorSimulatorPy | quantum_info.Statevector |
Наступні приклади демонструють шляхи міграції симуляторів basicaer.
- Statevector simulator
- Unitary simulator
- QASM simulator
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("statevector_simulator")
statevector = backend.run(qc).result().get_statevector()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Statevector
statevector = Statevector(qc)
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("unitary_simulator")
result = backend.run(qc).result()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Operator
result = Operator(qc).data
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("qasm_simulator")
result = backend.run(qc).result()
# One current option
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("basic_simulator")
result = backend.run(qc).result()
# Another current option is to specify it directly
from qiskit.providers.basic_provider import BasicSimulator
backend = BasicSimulator()
result = backend.run(qc).result()
fake_provider
Більшість користувацьких компонентів
qiskit.providers.fake_provider було перенесено до пакета Python qiskit-ibm-runtime. Це включає
класи фейкових провайдерів, усі фейкові бекенди для конкретних пристроїв (такі як
FakeVigo, FakeNairobiV2 та FakeSherbrooke), а також базові класи фейкових бекендів. Переглянь наступні вкладки, щоб побачити зачеплені класи.
- Fake Backends
- Fake Providers
- Будь-який клас з
qiskit.providers.fake_provider.backends fake_provider.fake_backend.FakeBackendfake_provider.fake_backend.FakeBackendV2
fake_provider.FakeProviderfake_provider.FakeProviderForBackendV2fake_provider.FakeProviderFactory
Щоб перейти на новий шлях:
-
Встанови
qiskit-ibm-runtimeверсії0.17.1або новішу:pip install 'qiskit-ibm-runtime>=0.17.1' -
Заміни всі входження
qiskit.providers.fake_providerу своєму коді наqiskit_ibm_runtime.fake_provider. Наприклад:# Oldfrom qiskit.providers.fake_provider import FakeProviderbackend1 = FakeProvider().get_backend("fake_ourense")from qiskit.providers.fake_provider import FakeSherbrookebackend2 = FakeSherbrooke()# Alternativefrom qiskit_ibm_runtime.fake_provider import FakeProviderbackend1 = FakeProvider().get_backend("fake_ourense")from qiskit_ibm_runtime.fake_provider import FakeSherbrookebackend2 = FakeSherbrooke()
Базові класи фейкових бекендів теж було перенесено, але з деякими відмінностями у шляху імпорту:
| Видалено | Альтернатива |
|---|---|
qiskit.providers.fake_provider.FakeQasmBackend | qiskit_ibm_runtime.fake_provider.fake_qasm_backend.FakeQasmBackend |
qiskit.providers.fake_provider.FakePulseBackend | qiskit_ibm_runtime.fake_provider.fake_pulse_backend.FakePulseBackend |
Якщо ти залежиш від фейкових бекендів для юніт-тестування сторонньої бібліотеки та маєш конфлікти із залежністю
qiskit-ibm-runtime, можна також знайти нові альтернативи загальних фейкових бекендів, вбудовані у Qiskit.
Серед них такі класи BackendV1 (взаємозамінні замінники):
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
Це конфігурований клас, що повертає екземпляри BackendV2:
fake_provider (спеціальні бекенди для тестування)
Класи фейкових бекендів для спеціальних цілей тестування з
qiskit.providers.fake_provider не були перенесені до qiskit_ibm_runtime.fake_provider. Рекомендований
шлях міграції — використовувати новий клас
GenericBackendV2
для конфігурації бекенду зі схожими властивостями або для побудови власного
цільового об'єкта.
| Видалено | Альтернатива |
|---|---|
fake_provider.FakeBackendV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackend5QV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendV2LegacyQubitProps | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendSimple | fake_provider.GenericBackendV2 |
fake_provider.ConfigurableFakeBackend | fake_provider.GenericBackendV2 |
Приклад: Міграція на новий клас
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 v1.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.ParametricPulse | qiskit.pulse.SymbolicPulse |
pulse.library.parametric_pulses.Constant | pulse.library.symbolic_pulses.Constant |
pulse.library.parametric_pulses.Drag | pulse.library.symbolic_pulses.Drag |
pulse.library.parametric_pulses.Gaussian | pulse.library.symbolic_pulses.Gaussian |
qiskit.pulse.library.parametric_pulses.GaussianSquare | pulse.library.symbolic_pulses.GaussianSquare |
Амплітуда комплексного значення
Амплітуда імпульсу комплексного значення (amp) замінюється парою (amp,
angle). Це представлення більш інтуїтивне, особливо для деяких
задач калібрування, як-от калібрування кута:
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_gateqiskit.pulse.builder.cxqiskit.pulse.builder.u1qiskit.pulse.builder.u2qiskit.pulse.builder.u3qiskit.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_settingsdefault_circuit_scheduler_settings
Ці функції також були видалені:
qiskit.pulse.builder.active_transpiler_settingsqiskit.pulse.builder.active_circuit_scheduler_settingsqiskit.pulse.builder.transpiler_settingsqiskit.pulse.builder.circuit_scheduler_settings
Це пов'язано з тим, що більше неможливо вбудовувати об'єкти схем у контекст конструктора (дивись Вбудовування операцій вентилів схеми); ці налаштування були для перетворення вбудованих об'єктів у імпульсні представлення.
library
Дискретна бібліотека імпульсів була видалена з кодової бази. Це включає:
qiskit.pulse.library.constantqiskit.pulse.library.zeroqiskit.pulse.library.squareqiskit.pulse.library.sawtoothqiskit.pulse.library.triangleqiskit.pulse.library.cosqiskit.pulse.library.sinqiskit.pulse.library.gaussianqiskit.pulse.library.gaussian_derivqiskit.pulse.library.sechqiskit.pulse.library.sech_derivqiskit.pulse.library.gaussian_squareqiskit.pulse.library.drag
Замість цього використовуй відповідний
qiskit.pulse.SymbolicPulse,
з
SymbolicPulse.get_waveform().
Наприклад, замість pulse.gaussian(100,0.5,10) використовуй
pulse.Gaussian(100,0.5,10).get_waveform(). Зверни увагу, що фаза як
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.
| Видалено | Альтернатива |
|---|---|
OneQubitEulerDecomposer | qiskit.synthesis.one_qubit.OneQubitEulerDecomposer |
TwoQubitBasisDecomposer | qiskit.synthesis.two_qubits.TwoQubitBasisDecomposer |
XXDecomposer | qiskit.synthesis.two_qubits.XXDecomposer |
two_qubit_cnot_decompose | qiskit.synthesis.two_qubits.two_qubit_cnot_decompose |
Quaternion | qiskit.quantum_info.Quaternion |
Це переміщення не вплинуло на звичайний шлях імпорту 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.graysynth | qiskit.synthesis.synth_cnot_phase_aam |
qiskit.transpiler.synthesis.cnot_synth | qiskit.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.arithmeticqiskit.utils.circuit_utilsqiskit.utils.entangler_mapqiskit.utils.name_unnamed_args
Ці функції використовувалися виключно в модулях qiskit.algorithms та
qiskit.opflow, які також були видалені.
qiskit.visualization
Модуль qiskit.visualization.qcstyle був видалений. Використовуй
qiskit.visualization.circuit.qcstyle як пряму заміну.