Změny funkcí v Qiskit 1.0
Tento průvodce popisuje migrační cesty pro nejdůležitější změny funkcí v Qiskit 1.0, uspořádané podle modulů. Pro přechod na modul, který tě zajímá, použij obsah na pravé straně.
Nástroj pro migraci na Qiskit 1.0
Pro usnadnění procesu migrace můžeš použít nástroj
flake8-qiskit-migration,
který detekuje odstraněné importní cesty v tvém kódu a navrhuje alternativy.
- Spustit s pipx
- Spustit s venv
Pokud máš nainstalovaný pipx, jednoduše spusť
následující příkaz.
pipx run flake8-qiskit-migration <path-to-source-directory>
Tím se balíček nainstaluje do dočasného virtuálního prostředí a spustí se na tvém kódu.
Pokud nechceš používat pipx, můžeš ručně vytvořit nové
prostředí pro nástroj. Tento přístup ti také umožní použít
nbqa ke kontrole ukázek kódu v
Jupyter noteboocích. Až skončíš, prostředí smaž.
# 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
Tento nástroj detekuje pouze odstraněné importní cesty. Nezjišťuje použití odstraněných
metod (jako například QuantumCircuit.qasm) ani argumentů. Také nedokáže sledovat
přiřazení jako qk = qiskit, i když zvládá aliasy jako
import qiskit as qk.
Více informací najdeš v repozitáři projektu.
Globální instance a funkce
Aer
Objekt qiskit.Aer není v Qiskit 1.0 dostupný. Místo toho použij
stejný objekt z namespace qiskit_aer, který je přímou náhradou.
Chceš-li nainstalovat qiskit_aer, spusť:
pip install qiskit-aer
BasicAer
Objekt qiskit.BasicAer není v Qiskit 1.0 dostupný. Možnosti migrace najdeš v
sekci migrace basicaer.
execute
Funkce qiskit.execute není v Qiskit 1.0 dostupná. Tato funkce sloužila jako
vysokoúrovňový obal kolem funkcí
transpile a
run v Qiskit.
Místo qiskit.execute použij funkci
transpile následovanou
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)
Alternativně je primitiv Sampler
sémanticky ekvivalentní odstraněné funkci qiskit.execute.
Třída BackendSampler je
obecný obal pro Backend, který nepodporují primitivy:
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend)
job = sampler.run(circuit)
qiskit.circuit
QuantumCircuit.qasm
Metoda QuantumCircuit.qasm byla odstraněna. Místo ní použij
qasm2.dump nebo
qasm2.dumps.
Pro výstup formátovaný pomocí Pygments se podívej na samostatný balíček
openqasm-pygments,
protože qasm2.dump a qasm2.dumps barevný výstup přes Pygments neposkytují.
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 gates
Následující metody Gate byly odstraněny ve prospěch zavedených metod, které přidávají stejné Gate:
| Odstraněno | Alternativa |
|---|---|
QuantumCircuit.cnot | QuantumCircuit.cx |
QuantumCircuit.toffoli | QuantumCircuit.ccx |
QuantumCircuit.fredkin | QuantumCircuit.cswap |
QuantumCircuit.mct | QuantumCircuit.mcx |
QuantumCircuit.i | QuantumCircuit.id |
QuantumCircuit.squ | QuantumCircuit.unitary |
Následující metody Circuit byly odstraněny. Tyto Gate lze místo toho
přidat do Circuit pomocí QuantumCircuit.append.
| Odstraněno | Alternativa (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 |
Například pro 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
Následující metody QuantumCircuit byly rovněž odstraněny:
| Odstraněno | Alternativa |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | instrukce pro ukládání v qiskit-aer (save instructions) |
qiskit.converters
Funkce qiskit.converters.ast_to_dag byla z Qiskitu odstraněna. Převáděla
abstraktní syntaktický strom generovaný starým parserem OpenQASM 2 na
DAGCircuit. Protože starý
parser OpenQASM 2 byl odstraněn (viz qiskit.qasm), tato
funkce již nemá opodstatnění. Místo ní načti soubory OpenQASM 2 do
QuantumCircuit pomocí konstruktorových metod
QuantumCircuit.from_qasm_file
nebo
QuantumCircuit.from_qasm_str
(nebo modulu qiskit.qasm2) a poté převeď
výsledný QuantumCircuit na
DAGCircuit pomocí
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
Modul qiskit.extensions již není dostupný. Většina jeho objektů byla
začleněna do knihovny Circuit
(qiskit.circuit.library). Při migraci
na nové umístění jednoduše nahraď qiskit.extensions za qiskit.circuit.library
v cestě importu objektu. Jde o náhradu beze změny rozhraní.
# Previous
from qiskit.extensions import DiagonalGate
# Current alternative
from qiskit.circuit.library import DiagonalGate
Třídy přesunuté do qiskit.circuit.library jsou:
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
Následující třídy byly z kódu odstraněny, protože jejich funkce byly buď
nadbytečné, nebo svázané s modulem extensions:
| Odstraněno | Alternativa |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | Použij instrukce pro ukládání z qiskit-aer |
ExtensionError | Příslušná třída chyby |
qiskit.primitives
Nejvýznamnější změnou v modulu qiskit.primitives je
zavedení nového rozhraní primitives V2. Tato sekce ukazuje, jak migrovat svůj
pracovní postup z primitives V1 na primitives V2, a také popisuje dílčí změny
ve vstupech přijímaných rozhraním V1.
Od verze 1.0 budeme označovat rozhraní primitives z doby před verzí 1.0 jako „primitives V1".
Migrate from V1 to V2
Formální rozdíl mezi API primitiv V1 a V2 spočívá v základních třídách, ze kterých implementace primitiv dědí. Při přechodu na nové základní třídy můžeš zachovat původní cestu importu z qiskit.primitives:
| Migruj z | Nahraď za |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
Názvy implementací primitiv V2 v jádru Qiskitu (těch, které lze importovat z qiskit.primitives),
byly upraveny, aby lépe vyjadřovaly jejich účel jako implementací spustitelných lokálně
se stavovektorovým simulátorovým Backend. Nové názvy neobsahují příponu -V2.
| Migruj z | Nahraď za |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.primitives.StatevectorSampler |
Při migraci z V1 na V2 je třeba vzít v úvahu několik koncepčních rozdílů.
Tyto rozdíly jsou dány základní třídou, ale jsou ukázány v následujících příkladech s použitím stavovektorových
implementací dostupných v qiskit.primitives:
Pro následující příklady předpokládej tyto importy a inicializace primitiv:
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 a Estimator: Nová primitiva V2 jsou navržena tak, aby přijímala vektorizované vstupy, kde lze jedny Circuit seskupit se specifikacemi ve formě polí. To znamená, že jeden Circuit lze spustit pro polensad parametrů,nobservables nebo obojí (v případě Estimatoru). Každá taková skupina se nazývá primitivní unifikovaný blok (PUB) a lze ji vyjádřit jako n-tici:(1 x circuit, [n x observables], [n x parameters]). Rozhraní V1 neumožňovalo stejnou flexibilitu. Místo toho musel počet vstupních Circuit odpovídat počtu observables a sad parametrů, jak ukazují následující příklady (vyber záložku pro zobrazení každého příkladu):
- Estimator, 1 Circuit, 4 observables
- Sampler, 1 Circuit, 3 sady parametrů
- Estimator, 1 Circuit, 4 observables, 2 sady parametrů
# 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
Primitiva V2 přijímají více PUBů jako vstupy a každý PUB získá vlastní výsledek. To ti umožňuje spouštět různé Circuit s různými kombinacemi parametrů/observables, což v rozhraní V1 nebylo vždy možné:
- Sampler, 2 Circuit, 1 sada parametrů
- Estimator, 2 Circuit, 2 různé 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: V2 Sampler nyní vrací vzorky výsledků měření ve formě bitových řetězců nebo počtů, místo kvazi-pravděpodobnostních distribucí z rozhraní V1. Bitové řetězce zobrazují výsledky měření a zachovávají pořadí shotů, ve kterém byly změřeny. Výsledkové objekty V2 Sampleru organizují data podle názvů klasických registrů vstupních Circuit, kvůli kompatibilitě s dynamickými Circuit.
# 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 1Výchozí název klasického registruV Circuit výše si všimni, že název klasického registru je ve výchozím nastavení
"meas". Tento název bude použit později pro přístup k bitovým řetězcům měření.# 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} -
Sampler and Estimator: Režijní náklady na vzorkování, které implementace V1 běžně zpřístupňovaly přes možnost spuštěníshots, jsou nyní argumentem metodyrun()primitiv a lze je specifikovat na úrovni PUB. Základní třídy V2 vystavují argumenty ve formátech odlišných od API V1:-
BaseSamplerV2.runvystavuje argumentshots(podobně jako v předchozím pracovním postupu):# 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.runzavádí argumentprecision, který určuje chybové úsečky, na které by se implementace primitiva měla zaměřit při odhadech očekávaných hodnot:# Estimate expectation values for two PUBs, both with 0.05 precision.
estimator_v2.run([(circuit1, obs_array1), (circuit2, obs_array_2)], precision=0.05)
-
Aktualizace v rozhraní V1
-
Implicitní převod z hustého
BaseOperatornaSparsePauliOpv argumentech observable proEstimatorjiž není povolen. Argument bys měl/a explicitně převést naSparsePauliOppomocíSparsePauliOp.from_operator(operator). -
Použití
PauliListv argumentech observable pro Estimator již není povoleno. Místo toho bys měl/a argument explicitně převést pomocíSparsePauliOp(pauli_list).
qiskit.providers
basicaer
Většina funkcionality modulu qiskit.providers.basicaer byla nahrazena novým modulem
qiskit.providers.basic_provider,
s výjimkou tříd UnitarySimulatorPy a StatevectorSimulatorPy,
které byly odstraněny; jejich funkcionalita byla již obsažena v modulu
quantum_info.
Přechod na nové cesty je přímočarý. Většinu tříd z qiskit.providers.basicaer můžeš nahradit
jejich protějškem z
qiskit.providers.basic_provider
(náhrada kompatibilní bez dalších úprav). Upozorňujeme, že následující třídy mají
nové cesty a názvy:
| Odstraněno | Alternativa |
|---|---|
qiskit.providers.basicaer | qiskit.providers.basic_provider |
BasicAerProvider | BasicProvider |
BasicAerJob | BasicProviderJob |
QasmSimulatorPy | BasicSimulator |
Při migraci na nový modul dávej pozor na globální instance. Neexistuje žádná náhrada za
globální instanci BasicAer, kterou bylo možné přímo importovat jako qiskit.BasicAer. To znamená, že
from qiskit import BasicProvider již není platný import.
Místo toho musí být třída poskytovatele importována z příslušného submodulu a uživatel ji musí sám instanciovat:
# 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")
Unitární a stavový vektorový simulátor lze nahradit různými třídami z modulu
quantum_info. Nejde o náhradu kompatibilní bez dalších úprav,
ale změny jsou minimální. Viz následující příklady migrace:
| Odstraněno | Alternativa |
|---|---|
UnitarySimulatorPy | quantum_info.Operator |
StatevectorSimulatorPy | quantum_info.Statevector |
Následující příklady ukazují způsoby migrace simulátorů z basicaer.
- Simulátor stavového vektoru
- Unitární simulátor
- QASM simulátor
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
Většina uživatelsky orientovaných komponent
qiskit.providers.fake_provider byla
přesunuta do Python balíčku qiskit-ibm-runtime. Patří sem
třídy fake providerů, všechny falešné Backend specifické pro konkrétní zařízení (jako například
FakeVigo, FakeNairobiV2 a FakeSherbrooke) a základní
třídy fake Backendů. Kliknutím na záložky níže zobrazíš seznam ovlivněných tříd.
- Fake Backends
- Fake Providers
- Libovolná třída v
qiskit.providers.fake_provider.backends fake_provider.fake_backend.FakeBackendfake_provider.fake_backend.FakeBackendV2
fake_provider.FakeProviderfake_provider.FakeProviderForBackendV2fake_provider.FakeProviderFactory
Postup migrace na novou cestu:
-
Nainstaluj
qiskit-ibm-runtimeverze0.17.1nebo novější:pip install 'qiskit-ibm-runtime>=0.17.1' -
Nahraď výskyty
qiskit.providers.fake_providerve svém kódu zaqiskit_ibm_runtime.fake_provider. Například:# 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()
Základní třídy fake Backendů byly rovněž přesunuty, ale import path se mírně liší:
| Odstraněno | Alternativa |
|---|---|
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 |
Pokud závisíš na fake Backendech pro unit testování downstream knihovny a máš konflikty se závislostí
qiskit-ibm-runtime, najdeš také nové alternativy generických fake Backendů nativních pro Qiskit.
Patří sem následující třídy BackendV1 (jako přímé náhrady):
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
Toto je konfigurovatelná třída, která vrací instance BackendV2:
fake_provider (speciální testovací Backend)
Třídy fake Backendů pro speciální testovací účely v
qiskit.providers.fake_provider nebyly
přesunuty do qiskit_ibm_runtime.fake_provider. Doporučeným
způsobem migrace je použití nové třídy
GenericBackendV2
pro nakonfigurování Backendu s podobnými vlastnostmi, nebo vytvoření vlastního
targetu.
| Odstraněno | Alternativa |
|---|---|
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 |
Příklad: Migrace na novou třídu
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.
Další tipy pro migraci
-
Import z
qiskit.providers.aerjiž není možný. Místo toho importuj zqiskit_aer, což je přímá náhrada. Chceš-li nainstalovatqiskit_aer, spusť:pip install qiskit-aer -
Podpora spouštění pulse úloh na Backendech z
qiskit.providers.fake_providerbyla v Qiskit 1.0 odstraněna. Důvodem je, že Qiskit Aer odstranil svou simulační funkcionalitu pro takovéto úlohy. Pro nízkoúrovňové workloady hamiltonovské simulace zvaž použití specializované knihovny, jako je Qiskit Dynamics.
qiskit.pulse
ParametricPulse
Základní třída qiskit.pulse.library.parametric_pulses.ParametricPulse a
knihovna pulsů byly nahrazeny třídou
qiskit.pulse.SymbolicPulse
a odpovídající knihovnou pulsů. SymbolicPulse podporuje
serializaci pomocí 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)
| Odstraněno | Alternativa |
|---|---|
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 |
Complex-valued amplitude
Amplituda pulsu s komplexní hodnotou (amp) je nahrazena dvojicí (amp,
angle). Tato reprezentace je intuitivnější, zejména pro některé
kalibrační úlohy, jako je kalibrace úhlu:
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})
Injecting circuit gate operations
Vkládání operací Gate z Circuit do kontextu pulse builderu přes
qiskit.pulse.builder.call již není možné.
Toto odstranění se týká vstupních argumentů typu QuantumCircuit a také
následujících funkcí:
qiskit.pulse.builder.call_gateqiskit.pulse.builder.cxqiskit.pulse.builder.u1qiskit.pulse.builder.u2qiskit.pulse.builder.u3qiskit.pulse.builder.x
Pokud stále chceš vkládat harmonogramy kalibrované Backendem, použij místo volání příkazů Gate následující vzor.
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)
Podobně lze QuantumCircuit vložit
do kontextu builderu ručním transpilováním a naplánováním objektu.
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)
Doporučujeme napsat minimální pulsový program pomocí builderu a připojit ho k
QuantumCircuit prostřednictvím metody
QuantumCircuit.add_calibration
jako mikrokód instrukce Gate, místo psaní celého programu v pulsovém modelu.
builder.build
Následující argumenty funkce qiskit.pulse.builder.build byly odstraněny
bez náhrady.
default_transpiler_settingsdefault_circuit_scheduler_settings
Byly odstraněny také tyto funkce:
qiskit.pulse.builder.active_transpiler_settingsqiskit.pulse.builder.active_circuit_scheduler_settingsqiskit.pulse.builder.transpiler_settingsqiskit.pulse.builder.circuit_scheduler_settings
Důvodem je to, že do kontextu builderu již není možné vkládat objekty Circuit (viz Vkládání operací Circuit Gate); tato nastavení sloužila k převodu vložených objektů do podoby pulsů.
library
Diskrétní knihovna pulsů byla z kódu odstraněna. To se týká:
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
Místo toho použij odpovídající
qiskit.pulse.SymbolicPulse
s metodou
SymbolicPulse.get_waveform().
Například místo pulse.gaussian(100,0.5,10) použij
pulse.Gaussian(100,0.5,10).get_waveform(). Vezmi na vědomí, že fáze
Sawtooth i
Square je definována tak,
že fáze 2\\pi posune průběh o celý cyklus, což je opačně než u jejich
diskrétních protějšků. Dále si všimni, že komplexní amplitudy již nejsou
v knihovně symbolických pulsů podporovány; použij místo toho float, amp
a angle.
ScalableSymbolicPulse
Objekty knihovny qiskit.pulse.ScalableSymbolicPulse s komplexním parametrem
amp z qpy souborů verze 5 a starší (Qiskit Terra < 0.23.0) již nelze
načíst. Žádná migrační akce není nutná, protože komplexní amp bude
automaticky převeden na float (amp, angle).
Tato změna se týká těchto pulsů:
qiskit.qasm
Starší modul parseru OpenQASM 2, který byl dříve součástí qiskit.qasm,
byl nahrazen modulem qiskit.qasm2, jenž
poskytuje rychlejší a přesnější parser pro OpenQASM 2. Vysokoúrovňové
metody třídy QuantumCircuit
from_qasm_file()
a
from_qasm_str()
zůstávají stejné, ale interně budou používat nový parser. Veřejné rozhraní
modulu qasm2 však není totožné. Zatímco modul qiskit.qasm poskytoval
rozhraní k abstraktnímu syntaktickému stromu vráceného knihovnou parseru ply,
modul qiskit.qasm2 AST ani žádné nižší implementační detaily parseru
nezveřejňuje. Místo toho přijímá vstup ve formátu OpenQASM 2 a na výstupu
vrací objekt QuantumCircuit.
Pokud jsi například dříve spouštěl něco jako toto:
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)
Nahraď to následujícím:
import qiskit.qasm2
qasm_circ = qiskit.qasm2.load("myfile.qasm")
qiskit.quantum_info
Modul qiskit.quantum_info.synthesis byl přesunut na různá místa v kódu,
převážně do qiskit.synthesis.
| Odstraněno | Alternativa |
|---|---|
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 |
Tento přesun neovlivnil obvyklou importní cestu Quaternion, ale přes
qiskit.quantum_info.synthesis k ní již přistoupit nelze.
Nakonec byl odstraněn cnot_rxx_decompose.
qiskit.test
Modul qiskit.test již není veřejným modulem. Nikdy nebylo zamýšleno, aby byl
veřejný ani aby byl používán mimo testovací sadu Qiskit. Veškerá funkčnost
byla specifická pro Qiskit a žádná alternativa není poskytována; pokud
podobnou funkčnost potřebuješ, zahrň ji do vlastních testovacích prostředí.
qiskit.tools
Modul qiskit.tools byl v Qiskit 1.0 odstraněn. Většina jeho funkcionality byla
buď nahrazena podobnou funkcionalitou v jiných balíčcích, nebo odstraněna bez náhrady.
Hlavní výjimkou je funkce qiskit.tools.parallel_map(), která byla přesunuta do
modulu qiskit.utils. Místo toho ji můžeš používat
z tohoto nového umístění. Například:
Pokud jsi dříve používal/a:
# Previous
from qiskit.tools import parallel_map
parallel_map(func, input)
# Current
from qiskit.utils import parallel_map
parallel_map(func, input)
jupyter
Submodul qiskit.tools.jupyter byl odstraněn, protože jeho funkcionalita
je svázána se starším balíčkem qiskit-ibmq-provider, který již není
podporován. Také podporoval pouze BackendV1, nikoli novější
rozhraní BackendV2.
monitor
Submodul qiskit.tools.monitor byl odstraněn, protože byl svázán se
starš ím balíčkem qiskit-ibmq-provider, který již není podporován (také
podporoval pouze rozhraní BackendV1, nikoli novější
rozhraní BackendV2). Pro tuto funkcionalitu
není k dispozici žádná náhrada.
visualization
Submodul qiskit.tools.visualization byl odstraněn. Tento modul byl
starším přesměrováním z původního umístění vizualizačního modulu Qiskit, který byl
přesunut do qiskit.visualization v Qiskit
0.8.0. Pokud tuto cestu stále používáš, aktualizuj své importy z
qiskit.tools.visualization na
qiskit.visualization.
# Previous
from qiskit.tools.visualization import plot_histogram
plot_histogram(counts)
# Current
from qiskit.visualization import plot_histogram
plot_histogram(counts)
events
Modul qiskit.tools.events a utilita progressbar(), kterou zpřístupňoval,
byly odstraněny. Funkcionalita tohoto modulu nebyla příliš využívána a je
lépe pokryta specializovanými balíčky, jako je
tqdm.
qiskit.transpiler
synthesis
Položky v modulu qiskit.transpiler.synthesis byly přesunuty na nová umístění:
| Odstraněno | Alternativa |
|---|---|
qiskit.transpiler.synthesis.aqc (kromě 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
Transpiler pass NoiseAdaptiveLayout byl nahrazen
VF2Layout a
VF2PostLayout,
které nastavují rozvržení na základě hlášených charakteristik šumu
backendu. Jak tento pass, tak odpovídající plugin fáze rozvržení "noise_adaptive"
byly z Qiskitu odstraněny.
Transpiler pass CrosstalkAdaptiveSchedule byl odstraněn ze
zdrojového kódu. Tento pass již nebylo možné používat, protože jeho vnitřní operace
závisela na vlastních vlastnostech nastavených v payloadu BackendProperties
instance BackendV1. Protože žádné backendy tato pole nenastavují, byl pass
odstraněn.
passmanager
Metody append tříd
ConditionalController,
FlowControllerLinear a
DoWhileController
byly odstraněny. Místo toho musí být všechny úlohy poskytnuty při vytváření
objektů kontroléru.
qiskit.utils
Následující nástroje v qiskit.utils byly odstraněny bez náhrady:
qiskit.utils.arithmeticqiskit.utils.circuit_utilsqiskit.utils.entangler_mapqiskit.utils.name_unnamed_args
Tyto funkce byly používány výhradně v modulech qiskit.algorithms a
qiskit.opflow, které byly také odstraněny.
qiskit.visualization
Modul qiskit.visualization.qcstyle byl odstraněn. Jako přímou náhradu použij
qiskit.visualization.circuit.qcstyle.