Changements de caractéristiques dans Qiskit 1.0
Ce guide décrit les chemins de migration pour les changements de caractéristiques les plus importants dans Qiskit 1.0, organisés par module. Utilise la table des matières du côté droit pour naviguer vers le module qui t'intéresse.
Outil de migration Qiskit 1.0
Pour faciliter le processus de migration, tu peux utiliser l'outil
flake8-qiskit-migration
pour détecter les chemins d'importation supprimés dans ton code et suggérer des alternatives.
- Exécute avec pipx
- Exécute avec venv
Si tu as pipx installé, exécute simplement
la commande suivante.
pipx run flake8-qiskit-migration <path-to-source-directory>
Cela installera le paquet dans un environnement virtuel temporaire et l'exécutera sur ton code.
Si tu ne veux pas utiliser pipx, tu peux créer manuellement un nouvel
environnement pour l'outil. Cette approche te permet aussi d'utiliser
nbqa pour vérifier les exemples de code dans
les notebooks Jupyter. Supprime l'environnement quand tu as fini.
# 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
Cet outil ne détecte que les chemins d'importation supprimés. Il ne détecte pas l'utilisation de méthodes
supprimées (comme QuantumCircuit.qasm) ni d'arguments. Il ne peut pas non plus suivre
les affectations comme qk = qiskit, bien qu'il puisse gérer les alias comme
import qiskit as qk.
Pour plus d'informations, consulte le dépôt du projet.
Instances et fonctions globales
Aer
L'objet qiskit.Aer n'est pas disponible dans Qiskit 1.0. À la place, utilise le
même objet de l'espace de noms qiskit_aer, qui est un remplacement direct.
Pour installer qiskit_aer, exécute :
pip install qiskit-aer
BasicAer
L'objet qiskit.BasicAer n'est pas disponible dans Qiskit 1.0. Consulte la
section de migration basicaer pour
les options de migration.
execute
La fonction qiskit.execute n'est pas disponible dans Qiskit 1.0. Cette
fonction servait de wrapper de haut niveau autour des fonctions
transpile et
run de Qiskit.
À la place de qiskit.execute, utilise la fonction
transpile suivie de
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)
Alternativement, la primitive Sampler
est sémantiquement équivalente à la fonction qiskit.execute supprimée.
La classe
BackendSampler est un
wrapper générique pour les backends qui ne prennent pas en charge les primitives :
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend)
job = sampler.run(circuit)
qiskit.circuit
QuantumCircuit.qasm
La méthode QuantumCircuit.qasm a été supprimée. À la place, utilise
qasm2.dump ou
qasm2.dumps.
Pour la sortie formatée par Pygments, consulte le paquet autonome
openqasm-pygments,
car qasm2.dump et qasm2.dumps ne fournissent pas de sortie colorée par 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)
Portes de QuantumCircuit
Les méthodes de porte suivantes ont été supprimées en faveur de méthodes plus établies qui ajoutent les mêmes portes :
| Supprimé | Alternative |
|---|---|
QuantumCircuit.cnot | QuantumCircuit.cx |
QuantumCircuit.toffoli | QuantumCircuit.ccx |
QuantumCircuit.fredkin | QuantumCircuit.cswap |
QuantumCircuit.mct | QuantumCircuit.mcx |
QuantumCircuit.i | QuantumCircuit.id |
QuantumCircuit.squ | QuantumCircuit.unitary |
Les méthodes de circuit suivantes ont également été supprimées. À la place, ces portes peuvent être
appliquées à un circuit avec QuantumCircuit.append.
| Supprimé | Alternative (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 |
Par exemple, pour un 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
Les méthodes de QuantumCircuit suivantes ont également été supprimées :
| Supprimé | Alternative |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | Les instructions de sauvegarde de qiskit-aer |
qiskit.converters
La fonction qiskit.converters.ast_to_dag a été supprimée de Qiskit. Elle convertissait l'
arbre de syntaxe abstraite généré par l'analyseur hérité OpenQASM 2 en
DAGCircuit. Comme l'analyseur
hérité OpenQASM 2 a été supprimé (voir qiskit.qasm), cette
fonction n'a plus de but. À la place, analyse tes fichiers OpenQASM 2 dans
un QuantumCircuit en utilisant les méthodes de constructeur
QuantumCircuit.from_qasm_file
ou
QuantumCircuit.from_qasm_str
(ou le module qiskit.qasm2), puis
convertis ce QuantumCircuit en
DAGCircuit avec
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
Le module qiskit.extensions n'est plus disponible. La plupart de ses objets ont été
intégrés dans la bibliothèque de circuits
(qiskit.circuit.library). Pour migrer vers le
nouvel emplacement, remplace simplement qiskit.extensions par qiskit.circuit.library
dans le chemin d'importation de l'objet. C'est un remplacement direct.
# Previous
from qiskit.extensions import DiagonalGate
# Current alternative
from qiskit.circuit.library import DiagonalGate
Les classes transférées à qiskit.circuit.library sont :
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
Les classes suivantes ont été supprimées du code base, car leurs
fonctions étaient redondantes ou liées au module extensions :
| Supprimé | Alternative |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | Utilise les instructions de sauvegarde de qiskit-aer |
ExtensionError | Une classe d'erreur pertinente |
qiskit.primitives
Le changement le plus notable dans le module qiskit.primitives est l'
introduction de la nouvelle interface des primitives V2. Cette section montre comment migrer ton
flux de travail des primitives V1 aux primitives V2, ainsi que les quelques changements qui ont eu lieu
dans les entrées acceptées par l'interface V1.
À partir de la version 1.0, nous nous référerons à l'interface des primitives avant 1.0 comme "primitives V1".
Migre de V1 à V2
La distinction formelle entre les API des primitives V1 et V2 sont les classes de base dont
héritent les implémentations de primitives. Pour passer aux nouvelles classes de base, tu peux conserver
le chemin d'importation d'origine de qiskit.primitives :
| Migrer de | Remplacer par |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
Les noms des implémentations principales de Qiskit des primitives V2 (celles qui peuvent être importées de qiskit.primitives),
ont été modifiés pour clarifier leur objectif en tant qu'implémentations qui peuvent s'exécuter localement
avec un backend simulateur de vecteur d'état. Les nouveaux noms n'incluent pas le suffixe -V2.
| Migrer de | Remplacer par |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.primitives.StatevectorSampler |
Il y a quelques différences conceptuelles à considérer lors de la migration de V1 à V2.
Ces différences sont dictées par la classe de base, mais sont montrées dans les exemples suivants en utilisant les implémentations
de vecteur d'état trouvées dans qiskit.primitives :
Pour les exemples suivants, suppose les importations et les initialisations de primitives suivantes :
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 et Estimator: Les nouveaux primitives V2 sont conçus pour accepter les entrées vectorisées, où un seul circuit peut être groupé avec des spécifications de valeurs de tableau. C'est-à-dire qu'un circuit peut s'exécuter pour des tableaux denensembles de paramètres,nobservables, ou les deux (dans le cas de l'estimateur). Chaque groupe s'appelle un bloc primitif unifié (pub), et peut être représenté sous la forme d'un tuple :(1 x circuit, [n x observables], [n x parameters]). L'interface V1 ne permettait pas la même flexibilité. À la place, le nombre de circuits d'entrée devait correspondre au nombre d'observables et d'ensembles de paramètres, comme le montrent les exemples suivants (sélectionne un onglet pour voir chaque exemple) :
- 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
Les primitives V2 acceptent plusieurs PUBs comme entrées, et chaque pub obtient son propre résultat. Cela te permet d'exécuter différents Circuits avec diverses combinaisons de paramètres/observables, ce qui n'était pas toujours possible dans l'interface 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 : Le Sampler V2 retourne maintenant les résultats de mesure sous la forme de chaînes de bits ou comptages, au lieu des distributions de quasi-probabilité de l'interface V1. Les chaînes de bits montrent les résultats de mesure, en préservant l'ordre des tirs dans lesquels ils ont été mesurés. Les objets de résultat du Sampler V2 organisent les données selon les noms de registres classiques de leurs circuits d'entrée, pour la compatibilité avec les circuits dynamiques.
# 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 1Nom par défaut du registre classiqueDans le circuit ci-dessus, remarque que le nom du registre classique est par défaut
"meas". Ce nom sera utilisé plus tard pour accéder aux chaînes de bits de mesure.# 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 et Estimator: La surcharge d'échantillonnage, couramment exposée par les implémentations V1 par l'option d'exécutionshots, est maintenant un argument de la méthoderun()des primitives qui peut être spécifié au niveau du PUB. Les classes de base V2 exposent les arguments dans des formats différents de l'API V1 :-
BaseSamplerV2.runexpose un argumentshots(similaire au flux de travail précédent) :# 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.runintroduit un argumentprecisionqui spécifie les barres d'erreur que la implémentation primitive doit cibler pour les estimations de valeurs d'attente :# Estimate expectation values for two PUBs, both with 0.05 precision.
estimator_v2.run([(circuit1, obs_array1), (circuit2, obs_array_2)], precision=0.05)
-
Mises à jour dans l'interface V1
-
La conversion implicite d'un
BaseOperatordense enSparsePauliOpdans les arguments d'observable d'Estimatorn'est plus autorisée. Tu dois convertir explicitement enSparsePauliOpen utilisantSparsePauliOp.from_operator(operator)à la place. -
L'utilisation d'une
PauliListdans les arguments d'observable d'Estimator n'est plus autorisée. Tu dois plutôt convertir explicitement l'argument en utilisantSparsePauliOp(pauli_list)d'abord.
qiskit.providers
basicaer
La plupart des fonctionnalités du module qiskit.providers.basicaer ont été
remplacées par le nouveau module
qiskit.providers.basic_provider,
sauf les classes UnitarySimulatorPy et StatevectorSimulatorPy,
qui ont été supprimées ; leur fonctionnalité était déjà contenue dans
le module quantum_info.
La migration vers les nouveaux chemins est directe. Tu peux remplacer la plupart des
classes de qiskit.providers.basicaer par leur homologue de
qiskit.providers.basic_provider
(remplacement direct). Note que les classes suivantes ont
de nouveaux chemins et noms :
| Supprimé | Alternative |
|---|---|
qiskit.providers.basicaer | qiskit.providers.basic_provider |
BasicAerProvider | BasicProvider |
BasicAerJob | BasicProviderJob |
QasmSimulatorPy | BasicSimulator |
Sois prudent avec les instances globales lors de la migration vers le nouveau module. Il n'existe pas de remplacement pour
l'instance globale BasicAer qui pourrait être importée directement comme qiskit.BasicAer. Cela signifie que
from qiskit import BasicProvider n'est plus une importation valide.
À la place, la classe du fournisseur doit être importée de son sous-module et instanciée par l'utilisateur :
# 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")
Les simulateurs unitaire et de vecteur d'état peuvent être remplacés par
des classes quantum_info différentes. Ce n'est pas un
remplacement direct, mais les changements sont minimes. Consulte les exemples
de migration suivants :
| Supprimé | Alternative |
|---|---|
UnitarySimulatorPy | quantum_info.Operator |
StatevectorSimulatorPy | quantum_info.Statevector |
Les exemples suivants montrent les chemins de migration des simulateurs de basicaer.
- Simulateur de vecteur d'état
- Simulateur unitaire
- Simulateur QASM
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
La plupart des composants orientés utilisateur de
qiskit.providers.fake_provider ont été
migrés vers le paquet Python qiskit-ibm-runtime. Cela inclut les
classes de fournisseur faux, tous les backends faux spécifiques aux appareils (comme
FakeVigo, FakeNairobiV2 et FakeSherbrooke), et les classes
de base de backends faux. Clique sur les onglets suivants pour voir les classes affectées.
- Backends faux
- Fournisseurs faux
- N'importe quelle classe dans
qiskit.providers.fake_provider.backends fake_provider.fake_backend.FakeBackendfake_provider.fake_backend.FakeBackendV2
fake_provider.FakeProviderfake_provider.FakeProviderForBackendV2fake_provider.FakeProviderFactory
Pour migrer vers le nouveau chemin :
-
Installe
qiskit-ibm-runtime0.17.1ou ultérieur :pip install 'qiskit-ibm-runtime>=0.17.1' -
Remplace les instances de
qiskit.providers.fake_providerdans ton code parqiskit_ibm_runtime.fake_provider. Par exemple :# 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()
Les classes de base de backends faux ont également été migrées, mais ont quelques différences dans le chemin d'importation :
| Supprimé | Alternative |
|---|---|
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 |
Si tu dépends des backends faux pour les tests unitaires dans une bibliothèque en aval et que tu as des conflits avec la
dépendance qiskit-ibm-runtime, tu peux aussi trouver de nouvelles alternatives de backends faux génériques natifs de Qiskit.
Celles-ci incluent les classes BackendV1 suivantes (remplacements directs) :
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
C'est une classe configurable qui retourne des instances BackendV2 :
fake_provider (backends spéciaux pour les tests)
Les classes de backend faux pour les buts spéciaux de test dans
qiskit.providers.fake_provider n'ont pas été
migrées vers qiskit_ibm_runtime.fake_provider. Le chemin de migration
recommandé est d'utiliser la nouvelle classe
GenericBackendV2
pour configurer un backend avec des propriétés similaires ou pour construire un
target personnalisé.
| Supprimé | Alternative |
|---|---|
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 |
Exemple : Migre vers la nouvelle classe
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.
Autres conseils de migration
-
Il n'est plus possible d'importer depuis
qiskit.providers.aer. À la place, importe depuisqiskit_aer, qui est un remplacement direct. Pour installerqiskit_aer, exécute :pip install qiskit-aer -
En Qiskit 1.0, le support pour exécuter les travaux de pulse sur les backends de
qiskit.providers.fake_providera été supprimé. C'est parce que Qiskit Aer a supprimé ses fonctionnalités de simulation pour ce type de travaux. Pour les charges de travail de simulation hamiltonienne de bas niveau, considère utiliser une bibliothèque spécialisée comme Qiskit Dynamics.
qiskit.pulse
ParametricPulse
La classe de base qiskit.pulse.library.parametric_pulses.ParametricPulse et
la bibliothèque de pulses ont été remplacées par
qiskit.pulse.SymbolicPulse
et la bibliothèque de pulses correspondante. SymbolicPulse supporte la
sérialisation 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)
| Supprimé | Alternative |
|---|---|
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 |
Amplitudes de valeur complexe
L'amplitude de pulse de valeur complexe (amp) est remplacée par le couple (amp,
angle). Cette représentation est plus intuitive, en particulier pour certaines
tâches d'étalonnage comme l'étalonnage d'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})
Injection d'opérations de porte de circuit
Il n'est plus possible d'injecter des opérations de porte de circuit dans le contexte du
constructeur de pulse par le biais de
qiskit.pulse.builder.call.
Cette suppression affecte les arguments d'entrée de type QuantumCircuit, ainsi que les
fonctions suivantes :
qiskit.pulse.builder.call_gateqiskit.pulse.builder.cxqiskit.pulse.builder.u1qiskit.pulse.builder.u2qiskit.pulse.builder.u3qiskit.pulse.builder.x
Si tu veux toujours injecter des schedules étalonnés par le backend, utilise le motif suivant au lieu d'appeler des commandes de porte.
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)
De la même manière, un QuantumCircuit peut
être injecté dans le contexte du constructeur en transpilant et en programmant manuellement l'
objet.
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)
Nous te recommandons d'écrire un programme de pulse minimal avec le constructeur et de l'attacher au
QuantumCircuit par le biais de la méthode
QuantumCircuit.add_calibration
comme microcode d'une instruction de porte, plutôt que d'écrire le programme complet
avec le modèle de pulse.
builder.build
Les arguments suivants de qiskit.pulse.builder.build ont été supprimés
sans alternative.
default_transpiler_settingsdefault_circuit_scheduler_settings
Ces fonctions ont également été supprimées :
qiskit.pulse.builder.active_transpiler_settingsqiskit.pulse.builder.active_circuit_scheduler_settingsqiskit.pulse.builder.transpiler_settingsqiskit.pulse.builder.circuit_scheduler_settings
C'est parce qu'il n'est plus possible d'injecter des objets de circuit dans le contexte du constructeur (consulte Injection d'opérations de porte de circuit) ; ces paramètres servaient à convertir les objets injectés en représentations de pulse.
library
La bibliothèque de pulses discrets a été supprimée de la base de code. Cela comprend :
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
À la place, utilise le
qiskit.pulse.SymbolicPulse
correspondant avec
SymbolicPulse.get_waveform().
Par exemple, au lieu de pulse.gaussian(100,0.5,10), utilise
pulse.Gaussian(100,0.5,10).get_waveform(). Note que la phase de
Sawtooth et de
Square est définie de telle manière qu'
une phase de 2\\pi décale un cycle complet, contrairement à son homologue discret.
Note également que les amplitudes complexes ne sont plus supportées dans la
bibliothèque de pulses symboliques ; utilise float, amp et angle à la place.
ScalableSymbolicPulse
Il n'est plus possible de charger les objets qiskit.pulse.ScalableSymbolicPulse de la
bibliothèque avec un paramètre amp complexe à partir de fichiers qpy de la version 5 ou
antérieure (Qiskit Terra < 0.23.0). Aucune action de migration n'est requise,
car le amp complexe sera automatiquement converti en float (amp, angle).
Ce changement affecte les pulses suivants :
qiskit.qasm
Le module hérité de l'analyseur OpenQASM 2 qui était dans qiskit.qasm a
été remplacé par le module qiskit.qasm2, qui
fournit un analyseur plus rapide et plus précis pour OpenQASM 2. Les méthodes
de haut niveau de QuantumCircuit
from_qasm_file()
et
from_qasm_str()
restent les mêmes, mais utiliseront le nouvel analyseur en interne. Cependant,
l'interface publique du module qasm2 n'est pas la même. Alors que le module
qiskit.qasm fournissait une interface à un arbre de syntaxe abstraite retourné
par la bibliothèque d'analyse ply, qiskit.qasm2 n'expose pas l'AST ni aucun
détail d'implémentation de bas niveau sur l'analyseur. À la place, il prend
les entrées en OpenQASM 2 et retourne un objet
QuantumCircuit.
Par exemple, si tu exécutais précédemment quelque chose comme ceci :
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)
Remplace-le par ce qui suit :
import qiskit.qasm2
qasm_circ = qiskit.qasm2.load("myfile.qasm")
qiskit.quantum_info
Le module qiskit.quantum_info.synthesis a été migré vers plusieurs emplacements dans
la base de code, principalement vers qiskit.synthesis.
| Supprimé | Alternative |
|---|---|
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 |
Ce changement n'a pas affecté le chemin d'importation habituel de Quaternion, mais tu
ne peux plus y accéder via qiskit.quantum_info.synthesis.
Enfin, cnot_rxx_decompose a été supprimé.
qiskit.test
Le module qiskit.test n'est plus un module public. Il n'a jamais été destiné à être
public ni à être utilisé en dehors de la suite de tests de Qiskit. Toute la
fonctionnalité était spécifique à Qiskit et aucune alternative n'est fournie ;
si tu avais besoin d'une fonctionnalité similaire, tu devrais l'inclure dans tes propres cadres
de test.
qiskit.tools
Le module qiskit.tools a été supprimé dans Qiskit 1.0. La plupart de cette
fonctionnalité a été remplacée par une fonctionnalité équivalente dans d'autres paquets ou
supprimée sans alternative. La principale exception est la fonction
qiskit.tools.parallel_map(), qui a été transférée au module
qiskit.utils. Tu peux
l'utiliser à partir de ce nouvel emplacement. Par exemple :
Si tu exécutais précédemment :
# Previous
from qiskit.tools import parallel_map
parallel_map(func, input)
# Current
from qiskit.utils import parallel_map
parallel_map(func, input)
jupyter
Le sous-module qiskit.tools.jupyter a été supprimé car la fonctionnalité de
ce module était liée au paquet hérité qiskit-ibmq-provider, qui n'est plus
supporté. De plus, il ne supportait que BackendV1 et non l'interface plus récente
BackendV2.
monitor
Le sous-module qiskit.tools.monitor a été supprimé car il était lié au
paquet hérité qiskit-ibmq-provider, qui n'est plus supporté (il n'était pas non plus
compatible avec l'interface BackendV1, seulement avec la plus récente
BackendV2). Aucune
alternative n'est fournie pour cette fonctionnalité.
visualization
Le sous-module qiskit.tools.visualization a été supprimé. Ce module était une
redirection héritée depuis l'emplacement d'origine du module de visualisation de
Qiskit, qui a été transféré à
qiskit.visualization dans Qiskit
0.8.0. Si tu utilises toujours ce chemin, mets à jour tes importations de
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
Le module qiskit.tools.events et l'utilitaire progressbar() qu'il exposait ont
été supprimés. La fonctionnalité de ce module n'était pas largement utilisée et
est mieux couverte par des paquets dédiés comme
tqdm.
qiskit.transpiler
synthesis
Les éléments du module qiskit.transpiler.synthesis ont été migrés vers de nouveaux emplacements :
| Supprimé | Alternative |
|---|---|
qiskit.transpiler.synthesis.aqc (sauf 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
Le transpiler pass NoiseAdaptiveLayout a été remplacé par
VF2Layout et
VF2PostLayout,
qui définissent une disposition basée sur les caractéristiques de bruit rapportées par un
backend. Le pass et le plugin d'étage de disposition "noise_adaptive"
correspondant ont tous deux été supprimés de Qiskit.
Le transpiler pass CrosstalkAdaptiveSchedule a été supprimé de la base de
code. Ce pass n'était plus utilisable car son opération interne dépendait des
propriétés personnalisées définies dans la charge BackendProperties d'une
instance BackendV1. Comme aucun backend ne définit ces champs, le pass a
été supprimé.
passmanager
Les méthodes append des classes
ConditionalController,
FlowControllerLinear et
DoWhileController
ont été supprimées. À la place, toutes les tâches doivent être fournies lors de la
construction des objets contrôleurs.
qiskit.utils
Les outils suivants de qiskit.utils ont été supprimés sans remplacement :
qiskit.utils.arithmeticqiskit.utils.circuit_utilsqiskit.utils.entangler_mapqiskit.utils.name_unnamed_args
Ces fonctions étaient utilisées exclusivement dans les modules qiskit.algorithms et
qiskit.opflow, qui ont également été supprimés.
qiskit.visualization
Le module qiskit.visualization.qcstyle a été supprimé. Utilise
qiskit.visualization.circuit.qcstyle comme remplacement direct.