Notes de publication de Qiskit 1.0
1.0.2
Prélude
Qiskit 1.0.2 est une version mineure de correction de bugs pour la série 1.0.
Corrections des erreurs
-
Correction d'un problème avec
convert_to_target()où le convertisseur ignorait à tort les instructions de flux de contrôle si elles étaient spécifiées dans l'attributBackendConfiguration.supported_instructions, qui est l'endroit typique où les instructions de flux de contrôle sont spécifiées dans un objetBackendConfigurationobjet. Correction #11872. -
L'appel à
EquivalenceLibrary.set_entry()mettra désormais correctement à jour l'objet graphique interne de la bibliothèque. Auparavant, les métadonnées étaient mises à jour, mais la structure du graphe restait inchangée, ce qui signifiait que des utilisateurs tels queBasisTranslatorcontinueraient à utiliser les anciennes règles. Correction #11958. -
La fonction
EvolvedOperatorAnsatzgère désormais correctement le cas où l'argumentoperatorsest une liste vide. Auparavant, cela entraînait une erreur. -
Correction d'un problème de cohérence avec les instances
EvolvedOperatorAnsatzavec des qubits nuls. Auparavant, ces instances contenaient un seulQuantumRegisterinqregsavec zéro qubit, mais maintenant aucun registre n'est créé. Ce comportement est plus cohérent avec celui de la superclasseQuantumCircuit. -
Correction d'un crash dans
convert_to_target()qui se produisait lorsque les propriétés d'un qubit (soit T1, T2 ou la fréquence) étaient manquantes. Les valeurs manquantes dansQubitPropertiessont maintenant remplies avecNone. -
Correction d'un problème de performance dans la fonction
qpy.load()lors de la désérialisation de charges utiles QPY avec un grand nombre de qubits ou de clbits dans un circuit. -
Correction d'un bogue dans lequel
EstimatorPub.coerce()etSamplerPub.coerce()géraient de manière incorrecte un paramètre de typeBindingsArray. Auparavant, une exceptionValueErrorétait levée à tort. -
Les gestionnaires de passage prédéfinis utilisés par
transpile()n'échoueront plus sur les circuits avec flux de contrôle lorsqu'aucune cible matérielle ou aucun jeu de portes de base n'est spécifié. Ils traiteront désormais ces cibles abstraites comme autorisant toutes les opérations de flux de contrôle. Correction #11906. -
Correction de
coerce()pour qu'il renvoie un tableau de 0-d lorsque l'entrée est un seul observable non noué. Auparavant, il est passé par erreur à une dimension unique, avec la forme(1,). -
Parametera été mis à jour de manière à ce que les instances qui se comparent entre elles aient toujours le même hachage. Auparavant, seul leParameter.uuidétait comparée, de sorte que les instancesParameterayant des noms différents pouvaient être comparées entre elles si elles avaient été construites en utilisant une valeur commune pour le paramètreuuid(qui n'est généralement pas transmis explicitement). -
Correction d'un bogue dans
QuantumCircuit.draw()qui entraînait la modification des dictionnaires de styles personnalisés pour le tiroir Matplotlib lors de l'exécution.
1.0.1
Prélude
Qiskit 1.0.1 est une version corrective qui corrige un petit nombre de bogues identifiés dans la version Qiskit 1.0.0.
Corrections des erreurs
-
Correction d'un bogue dans la conversion des instructions d'impulsion personnalisées au format legacy
qiskit.qobjancien. Le bogue a été introduit dans Qiskit 1.0.0 et provoquait une erreur lors de la conversion d'instructions avec des formes d'impulsion personnalisées. Après la correction, la conversion s'effectue correctement et l'impulsion personnalisée est convertie enpulse.Waveformcomme il se doit. Correction #11828. -
Correction d'un problème dans la passe
InverseCancellationqui, dans certains cas, annulait incorrectement une porte paramétrée auto-inverse même si la valeur du paramètre ne correspondait pas. Correction #11815. -
BasePassManager.run()ne laissera plus échapper l'ancienPropertySetdans les nouveaux flux de travail lorsqu'elle est appelée plusieurs fois. Auparavant, les mêmesPropertySetque précédemment était utilisée pour initialiser les exécutions suivantes, ce qui pouvait signifier que des informations non valides sur les propriétés étaient communiquées aux tâches. Le comportement correspond désormais à celui de Qiskit 0.44. Correction #11784. -
Un bogue a été corrigé dans
convert_durations_to_dt(): la fonction supposait que ses entrées étaient toutes exprimées en secondes, au lieu de lire l'unité réelle. Cela pourrait conduire à des ordres de grandeur erronés dans les durées de circuit rapportées.
1.0.0
Prélude
Nous sommes très heureux de publier Qiskit 1.0.0. Cette version est l'aboutissement de 7 années de développement pour faire de Qiskit un SDK stable et performant pour l'informatique quantique, et marque le début d'une nouvelle ère pour le projet Qiskit et sa communauté. Outre les améliorations générales des performances et de la stabilité, les changements les plus importants de la version 1.0.0 concernent la politique de stabilité, les cycles de publication et les versions. Qiskit utilise désormais officiellement le versionnage sémantique, ce qui signifie que, pour l'ensemble du cycle de vie de la série de versions 1.x, le projet s'engage à maintenir la compatibilité ascendante dans ses API publiques documentées. Nous commençons également à proposer une assistance pour les corrections de bogues pour les versions majeures, de sorte que vous continuiez à disposer d'une branche assistée pendant 6 mois après la sortie de la prochaine version majeure. Cela commence maintenant avec les séries majeures 1.x et 0.x : la version 0.46.x continuera à être prise en charge, avec des versions de correctifs périodiques qui contiennent des corrections de bogues, pendant 6 mois après la sortie de 1.0. En d'autres termes, le site 0.46.x sera soutenu jusqu'en 2024-08. Vous pouvez consulter tous les détails de la nouvelle politique ici :
start/install#qiskit-versioning
Le changement d'emballage est également d'une importance capitale pour cette version. Depuis la version de Qiskit 0.7 en 2018-12, lorsque Qiskit a introduit son modèle d' éléments, le paquet qiskit que vous installez est un méta-paquet (ou paquet de paquets) qui installe les éléments combinés qui composent Qiskit. Comme annoncé dans les versions précédentes (pour plus de détails, voir la section 0.44.0, 0.45.3, et 0.46.0 ainsi que ce billet de blog ), avec la version 1.0, nous achevons la transition vers un paquetage unique qiskit exposant uniquement le SDK de base (ce qui était auparavant qiskit-terra). Cela signifie que pour les versions >= 1.0.0, nous avons cessé d'utiliser le paquet qiskit-terra et ne publierons plus que qiskit. Comme ce changement dans la structure de l'emballage n'est pas entièrement pris en charge par l'installateur de paquets Python pip, il n'est pas possible d'utiliser pip install -U qiskit pour mettre à niveau qiskit 0.46.0 vers 1.0.0. Il est fortement recommandé de créer un environnement virtuel séparé pour isoler l'installation lors de la mise à jour vers Qiskit 1.0.0. Il existe un guide de migration détaillé qui explique les changements de packaging et la façon d'installer Qiskit 1.0.0 dans différents scénarios, qui peut être trouvé ici :
https://qisk.it/1-0-packaging-migration
Comme toutes nos versions majeures, Qiskit 1.0.0 a également une pléthore de nouvelles fonctionnalités, les points forts de cette version sont les suivants :
- La classe
QuantumCircuitla structure interne de la classedataa été réécrite en Rust afin d'améliorer considérablement l'efficacité de la mémoire des objets en mettant en cache les arguments des instructionsQuantumCircuiten mettant en cache les arguments des instructions.- Une nouvelle version de la définition de l'interface des primitives en
qiskit.primitivesavec les élémentsBaseSamplerV2etBaseEstimatorV2et les classes abstraites. Cette nouvelle version de l'interface permet d'effectuer des appels vectorisés à la primitive afin de spécifier efficacement les balayages sur les ensembles de valeurs des paramètres et les observables.- Un nouveau parseur expérimental natif OpenQASM 3
qiskit.qasm3.loads_experimental()etqiskit.qasm3.load_experimental(). Ce nouvel analyseur est encore en cours de développement et présente encore plusieurs limitations. Cependant, là où il est utilisable, le nouvel analyseur est nettement plus rapide et dispose d'un meilleur message d'erreur de diagnostic qui permet de déboguer les cas où un programme OpenQASM 3 n'est pas valide. Ce nouvel analyseur est écrit en Rust et basé sur une bibliothèque Rust nouvellement développée pour l'analyse de OpenQASM3 qui peut être trouvée ici : https://github.com/Qiskit/openqasm3_parser
Enfin, la version de Qiskit 1.0.0 a été l'occasion de nettoyer une partie de la dette technique accumulée au cours des 7 dernières années de développement. Vous remarquerez que la version de Qiskit 1.0.0 est pratiquement exempte d'émissions de DeprecationWarninget que, dans le même temps, la section relative à la mise à niveau des notes de version de 1.0.0 est plus longue que d'habitude. Il s'agit là de conséquences directes de l'assainissement de la dette technique. Pour faciliter la migration de 0.46.x vers 1.0.0, outre les notes de version, nous avons également publié un guide de migration spécifique qui peut être consulté ici :
Qiskit 1.0 : changements de fonctionnalités
Ce guide a pour but de compléter les notes de version et de donner des conseils ciblés sur la manière de migrer les modifications de l'API après la suppression des fonctionnalités obsolètes de la version 0.46.0.
Caractéristiques des circuits
-
Ajout d'un nouvel argument,
annotated, aux méthodesQuantumCircuit.inverse(),circuit.Instruction.inverse()et.inverse()des méthodes deInstruction(telles queSwapGateouSGate) pour qu'elles renvoient éventuellement un argumentAnnotatedOperation. La valeur par défaut deannotatedestFalseet correspond au comportement préexistant de la méthode. En outre, pour les portes standard dont la méthodeinverseest explicitement définie, l'argumentannotatedn'a aucun effet, par exemple, les deux :SwapGate().inverse(annotated=False) SwapGate().inverse(annotated=True)retourner a
SwapGateet les deux :SGate().inverse(annotated=False) SGate().inverse(annotated=True)renvoyer un
SdgGate. La différence se manifeste pour les instructions personnalisées sans inverse explicitement défini. Avecannotated=False, la méthode renvoie une nouvelle instruction avec la définition inversée récursivement, comme précédemment. Tandis queannotated=Truerenvoie unAnnotatedOperationqui représente l'instruction modifiée avec leInverseModifier. -
Ajout d'une bibliothèque de commutation à la
CommutationChecker. Cette bibliothèque stocke toutes les relations de commutation des portes standard non paramétrables dans un dictionnaire qui permet une recherche efficace au moment de l'exécution. Cela accélère l'exécution de la classeCommutationCheckeret, par extension, de la passeCommutationAnalysiscar au lieu de calculer si deux portes standard non paramétrables commutent, il suffit de le chercher dans la bibliothèque.En outre, l'outil
CommutationCheckera été remanié et dispose désormais d'une limite supérieure pour le nombre de relations de commutation mises en cache qui ne se trouvent pas dans la bibliothèque de commutation. Cette question a été abordée : #8020 et #7101 -
QuantumCircuit.assign_parameters()accepte désormais les clés de type chaîne de caractères dans la forme de mappage de l'entrée. Ces noms sont utilisés pour rechercher l'instance correspondanteParametercorrespondante en utilisantget_parameter(). Cela vous permet de faire :from qiskit.circuit import QuantumCircuit, Parameter a = Parameter("a") qc = QuantumCircuit(1) qc.rx(a, 0) qc.assign_parameters({"a": 1}) == qc.assign_parameters({a: 1}) -
QuantumCircuita deux nouvelles méthodes,get_parameter()ethas_parameter()qui permettent respectivement de récupérer une instance deParameterutilisée dans le circuit par son nom, et renvoient un booléen indiquant si un paramètre portant le même nom (ou l'instance exacte donnée) est utilisé dans le circuit. -
A
uuida été ajoutée à la classeqiskit.circuit.Parameterclasse. Dans les cas d'utilisation avancée, cette propriété peut être utilisée pour créer des instances qui se comparent l'une à l'autreqiskit.circuit.Parameterqui se comparent l'une à l'autre. -
Ajout d'une nouvelle méthode,
ParameterExpression.numeric()qui convertit une expression de paramètre entièrement liée dans le type numérique intégré Python le plus restrictif qui décrit précisément le résultat de l'évaluation symbolique. Par exemple, un entier symbolique deviendra uninttandis qu'un nombre réel symbolique deviendra unfloatet un nombre complexe deviendra acomplex. Cette méthode comprend plusieurs solutions de contournement pour les particularités des contextes d'évaluation desymengine, qui peuvent parfois conduire à des résultats erronés lors de l'appel decomplexoufloatsur une expression directement.
Fonctionnalités primitives
-
La version 2 des primitives est introduite par le biais d'une nouvelle classe de base pour l'échantillonneur et l'estimateur, ainsi que de nouveaux types pour leurs entrées et sorties. Cette nouvelle version met l'accent sur l'exécution d'appels vectorisés aux méthodes primitives
run(), de sorte que les balayages sur les ensembles de valeurs des paramètres et les observables puissent être spécifiés efficacement. VoirStatevectorSampleretStatevectorEstimatorpour les implémentations de référence des primitives V2.En outre, l'estimateur a gagné un argument
precisiondans la méthoderun()qui spécifie la précision ciblée des estimations de la valeur de l'espérance. De la même manière, l'échantillonneur a déplacéshotsdes options vers les arguments de la méthoderun()méthode. L'échantillonneur a également été modifié pour renvoyer les sorties (par exemple des chaînes de bits) de chaque prise, plutôt que de fournir un retour de typeCounts-et également pour stocker les données de plusieursClassicalRegisters. Cela permet aux classes dérivées de mettre en œuvre la prise en charge de l'échantillonneur pour les circuits avec un flux de contrôle classique.Les classes de base primitives de V2 sont les suivantes
Les nouveaux types utilisés pour les entrées et les sorties sont les suivants :
SamplerPubLikebloc primitif unifié ( PUB ) des entrées de l'échantillonneur; type d'union des entrées autorisées pour un échantillonneurEstimatorPubLike: Bloc primitif unifié ( PUB ) des entrées de l'estimateur; type d'union des entrées autorisées d'un estimateurPubResultles données et métadonnées résultant de l'exécution d'un seul site PUBDataBin: Un espace de noms pour contenir les données de l'exécution d'un seul PUBBitArrayune collection de valeurs de bits sous forme de tableau dans un format densePrimitiveResult: un itérable dePubResultavec des métadonnées
-
La mise en œuvre de référence
StatevectorEstimatordeBaseEstimatorV2a été ajoutée. Comme le montre l'exemple ci-dessous, cet estimateur (et tous les estimateurs V2 ) permet de fournir des tableaux d'observables et/ou des tableaux d'ensembles de valeurs de paramètres attachés à des circuits particuliers.Chaque tuple de
(circuit, observables, <optional> parameter values, <optional> precision), appelé bloc unifié primitif d'estimateur ( PUB ), produit son propre résultat sous forme de tableau. La méthoderun()peut être appliquée à plusieurs pubs à la fois.from qiskit.circuit import Parameter, QuantumCircuit from qiskit.primitives import StatevectorEstimator from qiskit.quantum_info import Pauli, SparsePauliOp import matplotlib.pyplot as plt import numpy as np # Define a circuit with two parameters. circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.ry(Parameter("a"), 0) circuit.rz(Parameter("b"), 0) circuit.cx(0, 1) circuit.h(0) # Define a sweep over parameter values, where the second axis is over # the two parameters in the circuit. params = np.vstack([ np.linspace(-np.pi, np.pi, 100), np.linspace(-4 * np.pi, 4 * np.pi, 100) ]).T # Define three observables. Many formats are supported here including # classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1 # lists cause this array of observables to have shape (3, 1), rather # than shape (3,) if they were omitted. observables = [ [SparsePauliOp(["XX", "IY"], [0.5, 0.5])], [Pauli("XX")], [Pauli("IY")] ] # Instantiate a new statevector simulation based estimator object. estimator = StatevectorEstimator() # Estimate the expectation value for all 300 combinations of # observables and parameter values, where the pub result will have # shape (3, 100). This shape is due to our array of parameter # bindings having shape (100,), combined with our array of observables # having shape (3, 1) pub = (circuit, observables, params) job = estimator.run([pub]) # Extract the result for the 0th pub (this example only has one pub). result = job.result()[0] # Error-bar information is also available, but the error is 0 # for this StatevectorEstimator. result.data.stds # Pull out the array-based expectation value estimate data from the # result and plot a trace for each observable. for idx, pauli in enumerate(observables): plt.plot(result.data.evs[idx], label=pauli) plt.legend() -
La mise en œuvre de référence
StatevectorSamplerdeBaseSamplerV2a été ajoutée. Comme le montre l'exemple ci-dessous, cet échantillonneur (et tous les échantillonneurs V2 ) permet de fournir des tableaux d'ensembles de valeurs de paramètres à lier à un seul circuit.Chaque tuple de
(circuit, <optional> parameter values, <optional> shots), appelé bloc unifié primitif de l'échantillonneur ( PUB ), produit son propre résultat sous forme de tableau. La méthoderun()peut être appliquée à plusieurs pubs à la fois.from qiskit.circuit import ( Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister ) from qiskit.primitives import StatevectorSampler import matplotlib.pyplot as plt import numpy as np # Define our circuit registers, including classical registers # called 'alpha' and 'beta'. qreg = QuantumRegister(3) alpha = ClassicalRegister(2, "alpha") beta = ClassicalRegister(1, "beta") # Define a quantum circuit with two parameters. circuit = QuantumCircuit(qreg, alpha, beta) circuit.h(0) circuit.cx(0, 1) circuit.cx(1, 2) circuit.ry(Parameter("a"), 0) circuit.rz(Parameter("b"), 0) circuit.cx(1, 2) circuit.cx(0, 1) circuit.h(0) circuit.measure([0, 1], alpha) circuit.measure([2], beta) # Define a sweep over parameter values, where the second axis is over. # the two parameters in the circuit. params = np.vstack([ np.linspace(-np.pi, np.pi, 100), np.linspace(-4 * np.pi, 4 * np.pi, 100) ]).T # Instantiate a new statevector simulation based sampler object. sampler = StatevectorSampler() # Start a job that will return shots for all 100 parameter value sets. pub = (circuit, params) job = sampler.run([pub], shots=256) # Extract the result for the 0th pub (this example only has one pub). result = job.result()[0] # There is one BitArray object for each ClassicalRegister in the # circuit. Here, we can see that the BitArray for alpha contains data # for all 100 sweep points, and that it is indeed storing data for 2 # bits over 256 shots. assert result.data.alpha.shape == (100,) assert result.data.alpha.num_bits == 2 assert result.data.alpha.num_shots == 256 # We can work directly with a binary array in performant applications. raw = result.data.alpha.array # For small registers where it is anticipated to have many counts # associated with the same bitstrings, we can turn the data from, # for example, the 22nd sweep index into a dictionary of counts. counts = result.data.alpha.get_counts(22) # Or, convert into a list of bitstrings that preserve shot order. bitstrings = result.data.alpha.get_bitstrings(22) print(bitstrings)
Fonctionnalités des fournisseurs
-
Ajout d'une nouvelle classe,
GenericBackendV2au moduleqiskit.providers.fake_providermodule. Cette classe est configurable et construit une instance deBackendV2qui peut être exécutée localement (dans l'esprit des faux backends). Les utilisateurs peuvent configurer le nombre de qubits, les portes de base, la carte de couplage, la capacité à exécuter des circuits dynamiques (instructions de flux de contrôle), les calibrations d'instructions et le pas de temps de mesure du backend sans avoir à s'occuper de la construction manuelle de la cible. Les propriétés du Qubit et de la porte (durée, erreur) sont générées par un échantillonnage aléatoire à partir des plages par défaut. La graine de cette génération aléatoire peut être fixée pour garantir la reproductibilité de la sortie du backend. Il est important de noter que ce backend ne prend en charge que les portes de la bibliothèque standard. Si vous avez besoin d'un backend plus flexible, vous avez toujours la possibilité d'instancier directement un objetTargetà utiliser pour la transpilation.Exemple d'utilisation 1 :
from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import GenericBackendV2 # Create a simple circuit circuit = QuantumCircuit(3) circuit.h(0) circuit.cx(0,1) circuit.cx(0,2) circuit.measure_all() circuit.draw('mpl') # Define backend with 3 qubits backend = GenericBackendV2(num_qubits=3) # Transpile and run transpiled_circuit = transpile(circuit, backend) result = backend.run(transpiled_circuit).result()Exemple d'utilisation 2 :
from qiskit import QuantumCircuit, ClassicalRegister, transpile from qiskit.providers.fake_provider import GenericBackendV2 # Create a circuit with classical control creg = ClassicalRegister(19) qc = QuantumCircuit(25) qc.add_register(creg) qc.h(0) for i in range(18): qc.cx(0, i + 1) for i in range(18): qc.measure(i, creg[i]) with qc.if_test((creg, 0)): qc.ecr(20, 21) # Define backend with custom basis gates and control flow instructions backend = GenericBackendV2( num_qubits=25, basis_gates=["ecr", "id", "rz", "sx", "x"], control_flow=True, ) #Transpile transpiled_qc = transpile(qc, backend)RemarqueLes propriétés du bruit généré par cette classe n'imitent aucun dispositif quantique concret et ne doivent pas être utilisées pour mesurer des comportements concrets. Il s'agit de "valeurs par défaut raisonnables" qui peuvent être utilisées pour tester la fonctionnalité de l'interface backend et non de valeurs de bruit spécifiques liées à des systèmes quantiques réels. Pour une simulation plus précise des dispositifs existants, vous pouvez construire manuellement un modèle de bruit à partir du backend réel à l'aide de la fonctionnalité offerte dans le fichier
qiskit_aer. -
Le module
qiskit.providers.fake_providercomprend désormais une série de faux backends génériques suivant l'interfaceBackendV1l'interface. Ils ont été introduits comme une alternative aux faux backends basés sur des instantanés, exposés dans la version obsolète deFakeProvider(FakeVigo,FakeTokyo, etc). La liste des nouveaux faux backends comprend-
Backends sans capacité d'impulsion :
-
Backends avec capacités d'impulsion :
Ils peuvent être importés en suivant le modèle suivant :
from qiskit.providers.fake_provider import Fake5QV1. Vous trouverez plus de détails sur les propriétés du backend dans la documentation de l'API de chaque backend. -
OpenQASM Caractéristiques
-
Le paquet
qiskit.qasm3contient maintenant un analyseur intégré, basé sur Rust, pour lire les programmes OpenQASM 3 dansQuantumCircuitque l'on trouve à l'adresseqiskit.qasm3.load_experimental()etloads_experimental(). Ils sont généralement plusieurs fois plus rapides que les systèmes existants, purement Pythonload()etloads()qui nécessitent l'installation deqiskit-qasm3-import.Par exemple, nous pouvons créer un enchevêtrement de 20 000 instructions
QuantumCircuit:import numpy as np import qiskit.qasm3 from qiskit.circuit.library import RealAmplitudes qc = RealAmplitudes(100, reps=100, flatten=True) qc = qc.assign_parameters(np.random.rand(qc.num_parameters)) oq3 = qiskit.qasm3.dumps(qc)L'ancien programme
qasm3.loads()prenait environ 7.3s pour charger le programme OpenQASM 3 résultant, alors queqasm3.loads_experimental()a pris moins de 300ms sur un Macbook Pro grand public ( i7, 2020)-une accélération de 25x!L'ensemble des fonctionnalités supportées par l'analyseur expérimental est très limité dans cette version de prévisualisation, mais il s'étendra au fur et à mesure que le côté Qiskit et l' analyseur natif basé sur Rust s 'amélioreront.
L'un de nos principaux objectifs avec ce nouvel analyseur, outre les énormes améliorations en termes de vitesse, est de fournir des diagnostics d'erreur de grande qualité. Comme pour les autres parties de l'analyseur, il s'agit d'un travail en cours, mais vous commencerez à voir des messages d'erreur de bien meilleure qualité s'afficher lorsque vous analyserez des programmes OpenQASM 3 invalides avec l'analyseur expérimental.
-
L'exportateur OpenQASM 3 (voir
dump()etdumps()dansqiskit.qasm3) supporte désormais par défaut la syntaxe stabilisée de la déclarationswitchdans OpenQASM 3. La syntaxe de pré-certification de la déclarationswitchest toujours disponible en utilisant l'indicateurExperimentalFeatures.SWITCH_CASE_V1dans l'argumentexperimentalde l'exportateur. Aucun indicateur de fonctionnalité n'est requis pour la syntaxe stabilisée, mais si vous êtes en interface avec d'autres outils qui n'ont pas encore été mis à jour, vous devrez peut-être passer l'indicateur expérimental.La syntaxe de la forme stabilisée est légèrement différente en ce qui concerne la terminaison des instructions
break(qui n'est plus requise ni autorisée), et les cas multiples sont désormais combinés en une seule lignecase, plutôt que d'utiliser les retombées à la manière du langage C. Pour plus de détails, voir la documentation de OpenQASM 3 sur la construction switch-case.
Caractéristiques du QPY
-
Ajout d'une nouvelle classe d'avertissement,
QPYLoadingDeprecatedFeatureWarningau module QPY. Cette classe permet de faire apparaître les avertissements de dépréciation même si la fonction dépréciée est accessible à un point variable de la pile d'appels, comme c'est le cas pour de nombreuses fonctions de chargement QPY qui sont appelées de manière récursive. -
Ajout d'un nouvel indicateur,
version, à la fonctionqpy.dump()fonction. Cela permetqpy.dump()de prendre optionnellement une valeur entière pour la version du format QPY à émettre. Ceci est utile si vous devez générer un fichier QPY qui sera chargé par une ancienne version de Qiskit. Cependant, les versions supportées pour l'émission sont limitées, seules les versions entre la dernière version de QPY (qui est la version par défaut), et la version de compatibilité de QPY qui est la version 10 (qui a été introduite dans Qiskit 0.45.0 ) peuvent être utilisées. La version de compatibilité restera fixe pendant toute la série de versions majeures de 1.x.y. Cela ne modifie pas les garanties de rétrocompatibilité du format QPY lors de l'appel deqpy.load()cela permet simplement aux utilisateurs d'émettre une version plus ancienne de QPY afin de maintenir la compatibilité et l'interopérabilité entre les séries de versions 0.x et 1.x.
Caractéristiques de l'information quantique
-
Ajout d'une méthode
qiskit.quantum_info.StabilizerState.from_stabilizer_list()qui génère un état de stabilisation à partir d'une liste de stabilisateurs :from qiskit.quantum_info import StabilizerState stabilizer_list = ["ZXX", "-XYX", "+ZYY"] stab = StabilizerState.from_stabilizer_list(stabilizer_list) -
SparsePauliOp.from_operator()utilise maintenant une implémentation de "l'algorithme de décomposition de Pauli tensorisé" présenté dans Hatznko, Binkowski et Gupta (2023). La méthode est désormais plus rapide de plusieurs ordres de grandeur; par exemple, il est possible de décomposer un opérateur aléatoire de 10 qubits en environ 250ms sur un Macbook Pro grand public (Intel i7, 2020).
Caractéristiques de la synthèse
-
Ajout d'une
qiskit.synthesis.synth_circuit_from_stabilizers()qui renvoie un circuit qui produit l'état stabilisé par une série de stabilisateurs donnés. -
La méthode du plugin de synthèse unitaire de l'AQC utilise désormais par défaut une évaluation plus rapide de la fonction objective, ce qui se traduit par une amélioration substantielle du temps de synthèse.
-
Ajouter une nouvelle méthode de synthèse
synth_qft_line()d'un circuit QFT pour la connectivité linéaire du plus proche voisin, qui réduit considérablement le nombre de SWAP pour un grand nombre de qubits par rapport à SABRE. -
La classe
TwoQubitWeylDecompositiona été ajoutée à l'API publique dansqiskit.synthesis. Cette classe permet d'appliquer la décomposition de Weyl aux unitaires à deux qubits. Si vous avez importé cette classe alors qu'il s'agissait d'une classe non publique dans le moduleqiskit.quantum_info.synthesis, désormais supprimé, vous devez mettre à jour vos chemins d'importation.
Fonctionnalités du transpilateur
-
Ajout d'une nouvelle classe d'exception :
InvalidLayoutError. Il s'agit d'une sous-classe deTranspilerErrorqui apparaît lorsqu'une disposition fournie par l'utilisateur n'est pas valide (taille inadaptée, qubits en double, etc.). -
Ajout d'un nouveau mot-clé,
num_processes, àtranspile()et à la méthodePassManager.run()méthode. Cela permet de remplacer à la foisQISKIT_NUM_PROCSet le champnum_processesdans les fichiers de configuration de l'utilisateur pour chaque transpile. Par exemple :from qiskit import transpile, QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() transpile([qc]*10, basis_gates=['u', 'cz'], num_processes=2)exécutera le transpile sur les 10 circuits d'entrée en utilisant seulement 2 processus et remplacera la valeur par défaut du système, la variable d'environnement ou le fichier de configuration de l'utilisateur pour ce
transpile()appel. -
Ajout d'une nouvelle passe de transposition,
OptimizeAnnotatedqui optimise les opérations annotées sur un circuit quantique.Prenons l'exemple suivant :
from qiskit.circuit import QuantumCircuit from qiskit.circuit.annotated_operation import ( AnnotatedOperation, InverseModifier, ControlModifier, ) from qiskit.circuit.library import CXGate, SwapGate from qiskit.transpiler.passes import OptimizeAnnotated # Create a quantum circuit with multiple annotated gates gate1 = AnnotatedOperation( SwapGate(), [InverseModifier(), ControlModifier(2), InverseModifier(), ControlModifier(1)], ) gate2 = AnnotatedOperation( SwapGate(), [InverseModifier(), InverseModifier()] ) gate3 = AnnotatedOperation( AnnotatedOperation(CXGate(), ControlModifier(2)), ControlModifier(1) ) qc = QuantumCircuit(6) qc.append(gate1, [3, 2, 4, 0, 5]) qc.append(gate2, [1, 5]) qc.append(gate3, [5, 4, 3, 2, 1]) # Optimize the circuit using OptimizeAnnotated transpiler pass qc_optimized = OptimizeAnnotated()(qc) # This is how the optimized circuit should look like gate1_expected = AnnotatedOperation(SwapGate(), ControlModifier(3)) gate2_expected = SwapGate() gate3_expected = AnnotatedOperation(CXGate(), ControlModifier(3)) qc_expected = QuantumCircuit(6) qc_expected.append(gate1_expected, [3, 2, 4, 0, 5]) qc_expected.append(gate2_expected, [1, 5]) qc_expected.append(gate3_expected, [5, 4, 3, 2, 1]) assert qc_optimized == qc_expectedDans le cas de
gate1, les modificateurs de la porte de swap annotée sont ramenés à la forme canonique : les deux s s'annulent et les deux s s'annulentInverseModifiers'annulent et les deuxControlModifiersont combinés. Dans le cas degate2, tous les modificateurs sont supprimés et l'opération annotée est remplacée par son opération de base. Dans le cas degate3, plusieurs couches d'annotations sont combinées en une seule.Le constructeur du
OptimizeAnnotatedaccepte les arguments optionnelstarget,equivalence_library,basis_gatesetrecurse. LorsquerecurseestTrue(valeur par défaut) et quetargetoubasis_gatessont spécifiés, la passe descend récursivement dans les circuitsdefinitionde la porte, à l'exception des portes qui sont déjà supportées par la cible ou qui appartiennent à la bibliothèque d'équivalence. En revanche, lorsque nitargetnibasis_gatesne sont spécifiés, ou lorsquerecurseest défini commeFalse, la passe ne synthétise que les opérations annotées de "niveau supérieur", c'est-à-dire qu'elle ne descend pas récursivement dans les circuitsdefinition. Ce comportement est cohérent avec celui de la passeHighLevelSynthesisqui doit être appelée pour "dérouler" les opérations annotées en portes à 1 et 2 qubits. -
Ajout d'un nouveau
HighLevelSynthesisPluginpourPermutationGatebasé sur l'algorithme d'échange de jetons de Qiskit. Pour utiliser ce plugin, spécifieztoken_swapperlors de la définition de la configuration de la synthèse à haut niveau.Ce plugin de synthèse peut être exécuté avant ou après la définition de la mise en page. Lorsque la synthèse réussit, le plugin produit un circuit quantique composé uniquement de portes de permutation. Lorsque la synthèse n'aboutit pas, le plugin émet
None.Le code suivant illustre la manière dont le nouveau plugin peut être exécuté :
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PermutationGate from qiskit.transpiler import PassManager, CouplingMap from qiskit.transpiler.passes.synthesis.high_level_synthesis import HighLevelSynthesis, HLSConfig # This creates a circuit with a permutation gate. qc = QuantumCircuit(8) perm_gate = PermutationGate([0, 1, 4, 3, 2]) qc.append(perm_gate, [3, 4, 5, 6, 7]) # This defines the coupling map. coupling_map = CouplingMap.from_ring(8) # This high-level-synthesis config specifies that we want to use # the "token_swapper" plugin for synthesizing permutation gates, # with the option to use 10 trials. synthesis_config = HLSConfig(permutation=[("token_swapper", {"trials": 10})]) # This creates the pass manager that runs high-level-synthesis on our circuit. # The option use_qubit_indices=True indicates that synthesis is run after the layout is set, # and hence should preserve the specified coupling map. pm = PassManager( HighLevelSynthesis( synthesis_config, coupling_map=coupling_map, target=None, use_qubit_indices=True ) ) qc_transpiled = pm.run(qc) -
Ajout de deux nouveaux arguments,
matrix_basedetmax_qubits, au constructeur de la passe deCommutativeInverseCancellationtranspiler pass. Lorsquematrix_basedestTrue, la passe utilise des représentations matricielles pour vérifier si deux opérations sont l'inverse l'une de l'autre. Cela rend les vérifications plus puissantes et permet en outre d'annuler des paires d'opérations inverses jusqu'à une phase, tout en mettant à jour la phase globale du circuit en conséquence. Cela permet généralement d'obtenir davantage de réductions au prix d'une augmentation de la durée d'exécution. L'argumentmax_qubitslimite le nombre de qubits dans les vérifications de commutativité et d'inversion basées sur les matrices. Par exemple :import numpy as np from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager from qiskit.transpiler.passes import CommutativeInverseCancellation circuit = QuantumCircuit(1) circuit.rz(np.pi / 4, 0) circuit.p(-np.pi / 4, 0) passmanager = PassManager(CommutativeInverseCancellation(matrix_based=True)) new_circuit = passmanager.run(circuit)La passe est capable d'annuler les portes
RZetP, tout en ajustant la phase globale du circuit à . -
Ajout d'une nouvelle fonction,
high_level_synthesis_plugin_names()qui peut être utilisée pour obtenir la liste des plugins de synthèse de haut niveau installés pour un nom d'opération donné.
Fonctionnalités de visualisation
-
Les sorties
textetmplpour leQuantumCircuit.draw()etcircuit_drawer()affichent désormais des informations détaillées pour les opérations deAnnotatedOperation. Si le siteAnnotatedOperation.modifierscontient unControlModifierl'opération sera affichée de la même manière que les portes contrôlées. Si leInverseModifierouPowerModifiersont utilisés, ils seront indiqués avec le nom de l'opération de base. Par exemple :from qiskit.circuit import ( AnnotatedOperation, ControlModifier, PowerModifier, InverseModifier, QuantumCircuit ) from qiskit.circuit.library import SGate annotated_op = AnnotatedOperation(SGate(), [PowerModifier(3.4), ControlModifier(3), InverseModifier()]) qc = QuantumCircuit(4) qc.append(annotated_op, range(4)) qc.draw("mpl")
Divers. Fonctions
-
Ajout d'une nouvelle classe de base d'avertissement,
QiskitWarning. Qiskit continuera d'utiliser les avertissements intégrés de Python (tels queDeprecationWarning) lorsque ceux-ci sont les plus appropriés, pour les cas plus spécifiques à Qiskit, les avertissements seront des sous-classes deQiskitWarning. -
Les testeurs de fonctionnalités optionnelles (
qiskit.utils.optionals) distingueront désormais une dépendance optionnelle totalement introuvable (situation normale) d'une dépendance qui a été trouvée, mais qui a déclenché des erreurs lors de son importation. Dans ce dernier cas, ils émettront maintenant unOptionalDependencyImportWarningpour vous expliquer ce qui s'est passé, car cela peut indiquer un échec de l'installation ou une version incompatible.
Mise à niveau
-
Qiskit 1.0 nécessite désormais la version 0.14.0 de
rustworkx. La version minimale requise a été augmentée pour prendre en charge le nouveau plugin de synthèsetoken_swapperPermutationGatepour le plugin de synthèseHighLevelSynthesisPlugin. -
La version minimale de Rust supportée pour construire Qiskit à partir des sources est maintenant 1.70. Cette version a été augmentée par rapport à la version Rust minimale supportée de 1.64 dans les séries de versions de Qiskit 0.45.x et 0.46.0.
-
La dépendance à l'égard de psutil a été supprimée. La bibliothèque psutil n'était auparavant utilisée que pour détecter le nombre de CPU physiques et la mémoire totale du système. Cependant, cette information fournie n'apporte pas une valeur ajoutée suffisante pour justifier les dépendances et les frais généraux supplémentaires, et elle a donc été supprimée. Cela signifie que le nombre par défaut de processus utilisés par
parallel_map()et les fonctions qui peuvent être utilisées en interneparallel_map()commetranspile()etPassManager.run()peuvent utiliser plus ou moins de processus parallèles que dans les versions précédentes. Si vous souhaitez ajuster le nombre de processus utilisés, vous pouvez utiliser le nouvel argumentnum_processespour ces fonctions, ou la variable d'environnementQISKIT_NUM_PROCSou le champnum_processesdans un fichier de configuration utilisateur (voir le guide de configuration locale pour plus de détails) si vous avez besoin d'ajuster le nombre de processus que Qiskit utilise potentiellement. -
Les méthodes
scoped_parametersetsearch_parametersont été supprimées de la classeScheduleBlockde la classe. Ces méthodes renvoientParameterqui sont partiellement liés aux paramètres de l'instanceScheduleBlockmais l'attribution de valeurs à l'aide de ces objets ne fonctionnait pas correctement. Les utilisateurs doivent utiliserScheduleBlock.parametersà la place et itérer à traversScheduleBlock.referenceset les comparer aux attributsSchedule.parametersdes sous-références lorsqu'il s'agit de déterminer dans quelle sous-routine un paramètre est utilisé. Voir #11654 pour plus d'informations. -
Suppression de la logique d'injection de
QuantumCircuitetGatedans le contexte de l'impulsion (comme danspulse.builder.call()), qui était un comportement hérité et déprécié dans Qiskit 0.46. Les programmes d'impulsions doivent être élaborés dans le contexte d'un programme complet; les circuits et les portes constituent un niveau d'abstraction plus élevé.Cela inclut la suppression des fonctions correspondantes :
pulse.builder.call_gatepulse.builder.cxpulse.builder.u1pulse.builder.u2pulse.builder.u3pulse.builder.xpulse.builder.active_transpiler_settingspulse.builder.active_circuit_scheduler_settingspulse.builder.transpiler_settingspulse.builder.circuit_scheduler_settings
Les arguments
default_transpiler_settingsetdefault_circuit_scheduler_settingsdepulse.builder.build()sont également supprimés.from qiskit import transpile, schedule, QuantumCircuit, pulse from qiskit.providers.fake_provider import Fake7QPulseV1 backend = Fake7QPulseV1() # Create a schedule from a hardware-based circuit. qc = QuantumCircuit(2) qc.cx(0, 1) qc = transpile(qc, backend) sched = schedule(qc, backend) # These pulse schedules can still be called in builder contexts. with pulse.build(backend) as qc_sched: pulse.call(sched) # Schedules for certain operations can also be directly retrieved # from BackendV1 instances: sched = backend.defaults().instruction_schedule_map.get('x', (0,)) # ... and from BackendV2 instances: sched = backend.target['x'][(0,)].calibration -
La version minimale requise pour symengine a été portée à >= 0.11.
Notes sur la mise à niveau des circuits
-
Suppression de la méthode
Instruction.qasm, qui était obsolète dans Qiskit 0.45.0. Utiliserqiskit.qasm2.dump()avec unQuantumCircuità la place. -
Les propriétés
Bit.registeretBit.indexsont supprimées. Ils ont été supprimés dans Qiskit 0.25 (publié en 2021-04). Les qubits et les bits ne vivent plus que dans le contexte d'uneQuantumCircuit. L'alternative aux propriétés est d'utiliserQuantumCircuit.find_bit()pour trouver tous les registres contenant un circuit et l'index du bit dans le circuit. -
La méthode
QuantumCircuit.bind_parametersa été supprimée, suite à sa dépréciation dans Qiskit 0.45. Vous pouvez utiliserQuantumCircuit.assign_parameters()comme un remplacement direct avec toutes ses valeurs par défaut, et il expose également des fonctionnalités supplémentaires par rapport à l'ancienne méthode. -
L'importation de
Int1,Int2,BooleanFunction,classical_function()à partir deqiskit.circuitest désormais désactivée. Au lieu de cela, importez les objets du sous-moduleqiskit.circuit.classicalfunctionqui nécessite le paquetagetweedledum. -
Les attributs
headeretextension_libréservés aux données deQuantumCircuitsont supprimés suite à leur dépréciation dans Qiskit 0.45. Il s'agissait de détails internes de l'exportateur OpenQASM 2 qui ne sont plus utilisés. -
Suppression du module
qiskit.extensions, qui était en attente de dépréciation depuis la version 0.45 et a été complètement déprécié dans la version 0.46. Les opérations suivantes de ce module sont disponibles dansqiskit.circuit.library:DiagonalGate,HamiltonianGateGate,Initialize,Isometry,MCGupDiag,UCGate,UCPauliRotGate,UCRXGate,UCRYGate,UCRZGate,UnitaryGate.
Les objets suivants ont été supprimés :
SingleQubitUnitary(utilisez plutôtlibrary.UnitaryGate),Snapshot(remplacé par les instructions Aer's save),ExtensionError,
ainsi que les méthodes de circuit suivantes :
QuantumCircuit.snapshot,QuantumCircuit.squ,QuantumCircuit.diagonal,QuantumCircuit.hamiltonian,QuantumCircuit.isometryetQuantumCircuit.iso,QuantumCircuit.uc,QuantumCircuit.ucrx,QuantumCircuit.ucry,QuantumCircuit.ucrz.
Ces opérations peuvent toujours être effectuées en ajoutant l'instruction appropriée à un circuit quantique.
-
Suppression des méthodes
QuantumCircuitméthodes. Exemples :QuantumCircuit.cnotau lieu de cela, utilisezQuantumCircuit.cx(),QuantumCircuit.toffoliau lieu de cela, utilisezQuantumCircuit.ccx(),QuantumCircuit.fredkinau lieu de cela, utilisezQuantumCircuit.cswap(),QuantumCircuit.mctau lieu de cela, utilisezQuantumCircuit.mcx(),QuantumCircuit.iau lieu de cela, utilisezQuantumCircuit.id().
-
Vous ne pouvez plus définir
QuantumCircuit.metadataàNone, suite à la dépréciation de Qiskit 0.43.0. Son type estdictpour l'effacer, il faut donc lui attribuer la valeur{}. -
L'attribut
.Register.name_formata été supprimé suite à sa dépréciation dans Qiskit 0.40.0. Il n'y a plus de restriction sur les noms de registre, et l'expression régulière était simplement[a-z][a-zA-Z0-9_]*.
Notes de mise à niveau des primitives
- Ajout de la classe
BasePrimitiveJoben tant que classe d'emploi abstraite pour les primitives et a fait en sorte que la classePrimitiveJobhériterBasePrimitiveJobau lieu deJobV1.
Notes de mise à niveau des fournisseurs
-
Modification de la valeur par défaut de deux arguments (
add_delayetfilter_faulty) dans la fonctionconvert_to_target()fonction. Cette fonction de conversion ajoute désormais des instructions de retard et supprime les instructions défectueuses par défaut. -
Les
BackendPropertiesetPulseDefaultsutilisés par leFakeOpenPulse2Qont été mis à jour pour assurer la cohérence interne et ajouter les instructions manquantes. Si vous utilisiez les objets du modèle précédent comme cible de compilation, vous pouvez utiliser le backend avec Qiskit 0.46 et exporter un fichierQuantumCircuitgénéré avectranspile()et le sérialiser en utilisantqpy.dumppour y accéder dans cette version. -
Le module
qiskit.providers.basicaer, exposé en tant queqiskit.BasicAer, a été supprimé suite à sa dépréciation dans la version 0.46. Sa fonctionnalité a été remplacée par le moduleqiskit.quantum_infoet le nouveau moduleqiskit.providers.basic_providermodule.La migration de l'utilisation de
qiskit.providers.basicaer(qiskit.BasicAer) versqiskit.providers.basic_providerpeut être effectuée comme suit :Migration à partir de :Remplacer parqiskit.BasicAerLe nouveau fournisseur n'a pas d'instance globale, les importations doivent provenir de qiskit.providers.basic_providerqiskit.providers.basicaerbasic_providerBasicAerProviderBasicProviderBasicAerJobBasicProviderJobQasmSimulatorPyBasicSimulatorUnitarySimulatorPyutiliser OperatorStatevectorSimulatorPyutiliser StatevectorUne différence notable est que le nouveau fournisseur n'est plus exposé par le biais d'une instance globale (comme
BasicAer), de sorte qu'il ne sera pas possible de fairefrom qiskit import BasicProvider. Au lieu de cela, la classe du fournisseur doit être importée de son sous-module et instanciée manuellement :from qiskit.providers.basic_provider import BasicProvider provider = BasicProvider() backend = provider.get_backend("basic_simulator")Les exemples suivants montrent les chemins de migration des trois simulateurs dans
BasicAer.-
Simulateur de vecteur d'état :
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) # Former path from qiskit import BasicAer backend = BasicAer.get_backend("statevector_simulator") statevector = backend.run(qc).result().get_statevector() # New path from qiskit.quantum_info import Statevector statevector = Statevector(qc) -
Simulateur unitaire :
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) # Former path from qiskit import BasicAer backend = BasicAer.get_backend("unitary_simulator") result = backend.run(qc).result() # New path from qiskit.quantum_info import Operator result = Operator(qc).data -
Simulateur Qasm :
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) qc.measure_all() # Former path from qiskit import BasicAer backend = BasicAer.get_backend("qasm_simulator") result = backend.run(qc).result() # New path from qiskit.providers.basic_provider import BasicProvider backend = BasicProvider().get_backend("basic_simulator") result = backend.run(qc).result() # or, directly from qiskit.providers.basic_provider import BasicSimulator backend = BasicSimulator() result = backend.run(qc).result()
-
-
Suppression de la classe
ConfigurableFakeBackend, obsolète dans Qiskit 0.46.0. Au lieu de cela, on peut utiliser unFakeBackendpeut être utilisé. -
Le module
qiskit.providers.fake_providera été migré vers le paquetqiskit-ibm-runtimePython. Pour cette raison, les éléments suivants de la sectionqiskit.providers.fake_provideront été supprimés à la suite de leur dépréciation dans Qiskit 0.46:qiskit.providers.fake_provider.FakeProviderqiskit.providers.fake_provider.FakeProviderForBackendV2qiskit.providers.fake_provider.FakeProviderFactoryqiskit.providers.fake_provider.fake_backends.FakeBackendV2- tout faux backend contenu dans
qiskit.providers.fake_provider.backends(accessible via le fournisseur) qiskit.providers.fake_provider.FakeQasmSimulatorqiskit.providers.fake_provider.FakeJobqiskit.providers.fake_provider.FakeQobj
Pour utiliser le nouveau module "fake provider", vous pouvez lancer
pip install qiskit-ibm-runtimeet remplacer le chemin d'importation de qiskit (qiskit.providers.fake_provider) par le nouveau chemin d'importation (qiskit_ibm_runtime.fake_provider). Exemple de migration :# Legacy path from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke backend1 = FakeProvider().get_backend("fake_ourense") backend2 = FakeSherbrooke() # New path # run "pip install qiskit-ibm-runtime" from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke backend1 = FakeProvider().get_backend("fake_ourense") backend2 = FakeSherbrooke()En outre, les faux backends suivants, conçus à des fins de test spéciales, ont été remplacés par la nouvelle classe
GenericBackendV2et sont également supprimés suite à leur dépréciation dans Qiskit 0.46:qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2`qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitPropsqiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple
Exemple de migration vers la nouvelle
GenericBackendV2classe :# 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 will generate 5q backend with generic # properties that serves the same purpose as FakeBackend5QV2 # but will generate different results
Notes de mise à jour Pulse
-
Suppression de la classe dépréciée
qiskit.pulse.instructions.CallAucune autre instruction d'impulsion n'est fournie. -
Suppression des méthodes obsolètes dans
InstructionToQobjConverteretQobjToInstructionConverter. Cela inclut :InstructionToQobjConverter.convert_acquire()InstructionToQobjConverter.convert_bundled_acquires()InstructionToQobjConverter.convert_set_frequency()InstructionToQobjConverter.convert_shift_frequency()InstructionToQobjConverter.convert_set_phase()InstructionToQobjConverter.convert_shift_phase()InstructionToQobjConverter.convert_delay()InstructionToQobjConverter.convert_play()InstructionToQobjConverter.convert_snapshot()QobjToInstructionConverter.convert_acquire()QobjToInstructionConverter.convert_set_phase()QobjToInstructionConverter.convert_shift_phase()QobjToInstructionConverter.convert_set_frequency()QobjToInstructionConverter.convert_shift_frequency()QobjToInstructionConverter.convert_delay()QobjToInstructionConverter.bind_pulse()QobjToInstructionConverter.convert_parametric()QobjToInstructionConverter.convert_snapshot()
Ces méthodes publiques sont toutes remplacées par des méthodes protégées qui sont implicitement appelées à partir du point d'entrée unique, c'est-à-dire en appelant la classe comme une fonction.
-
La classe
qiskit.pulse.library.ParametricPulseet toutes les sous-classes sont supprimées. Ils sont dépréciés depuis Qiskit 0.39 (avec qiskit-terra 0.22 ), publié en 2022-10. Utilisez plutôtSymbolicPulseet consultez sa documentation pour plus de détails.
OpenQASM Notes de mise à jour
- Les méthodes
qasm()des classesQuantumRegisteretClassicalRegisteront été supprimées. Aucun remplacement n'est nécessaire; il s'agissait d'un détail interne d'une ancienne implémentation de l'exportateur OpenQASM 2. Pour exporter un programme vers OpenQASM 2, utilisezqasm2.dump()ouqasm2.dumps().
Notes de mise à niveau QPY
-
La dernière version du format de QPY est maintenant la version 11 et c'est ce qui est émis par défaut lorsque l'on exécute
qpy.dump(). -
Le chemin du module
qiskit.circuit.qpy_serializationa été supprimé, suite à sa dépréciation dans Qiskit 0.40.0. Pour la sérialisation QPY, utilisezqiskit.qpyqui est le nouvel emplacement.
Notes de mise à jour sur les informations quantiques
-
Suppression des méthodes magiques
__getitem__/__setitem__deClifford. Ces méthodes sont obsolètes depuis Qiskit 0.44, publié en 2023-07. Au lieu de cela, il faut indexer ou itérer à travers l'attributClifford.tableau. -
Suppression du module
qiskit.quantum_info.synthesis, qui est obsolète depuis la version 0.46. Les objets suivants ont été déplacés versqiskit.synthesis:OneQubitEulerDecomposera été déplacé versqiskit.synthesis.one_qubitTwoQubitBasisDecomposera été déplacé versqiskit.synthesis.two_qubitsXXDecomposera été déplacé versqiskit.synthesis.two_qubitstwo_qubit_cnot_decompose()a été déplacé versqiskit.synthesis.two_qubits
Cette fonction a été supprimée, car elle a déjà été mise au rancart dans la version 0.46 : *
cnot_rxx_decomposeCes fonctions ont été supprimées, car elles ont déjà été mises au rancart dans une version précédente : *
decompose_clifford(utilisersynth_clifford_full()à la place) *decompose_cnotdihedral(utilisersynth_cnotdihedral_full()à la place) -
Les fonctions
process_fidelity(),average_gate_fidelity(),gate_error()etdiamond_norm()n'essaieront plus de contraindre des entrées arbitraires à leurs types attendus marqués, suite à la dépréciation dans Qiskit 0.25.0. Passer les entrées des types marqués à chaque argument directement.
Notes de mise à niveau de Synthesis
-
Les fonctions dépréciées suivantes, qui se trouvaient auparavant dans
qiskit.quantum_infoont été supprimées. Ces fonctions ont été marquées comme dépréciées dans la version 2023-01 de Qiskit 0.40.0.decompose_clifford: vous devez utiliser la fonctionqiskit.synthesis.synth_clifford_full()à la place.decompose_cnotdihedral: vous devez utiliser la fonctionqiskit.synthesis.synth_cnotdihedral_full()à la place.
Notes de mise à niveau du transpilateur
-
La méthode
Target.aquire_alignment, obsolète, a été supprimée. Il a été marqué comme obsolète dans Qiskit 0.43 (version 2023-05). La méthodeTarget.acquire_alignment()doit être utilisée à la place. -
Suppression de la fonction obsolète
qiskit.transpiler.preset_passmanagers.common.get_vf2_call_limit. Utilisez plutôtget_vf2_limits(). -
L'utilisation implicite de
approximation_degree!=1.0par défaut dans la fonctiongenerate_preset_pass_manager()a été désactivée. L'ancienne valeur par défaut pouvait entraîner des approximations excessives et inattendues, en particulier dans les charges de travail impliquant la trotterisation ou des séries d'opérations similaires qui sont proches de l'identité, mais pas du tout égales.Cette modification permet d'aligner les valeurs par défaut de la génération du gestionnaire de passe interne sur celles de
transpile()ce qui a toujours été l'intention. Voir #8595 pour plus de détails. -
Suppression de la classe dépréciée
Unrollerdansqiskit.transpiler.passes.basis. Cette classe a été supprimée dans Qiskit 0.45 et son utilisation peut être remplacée par l'utilisation combinée deBasisTranslatoretUnrollCustomDefinitions.Il convient de noter que
BasisTranslatoretUnrollCustomDefinitionsprennent des arguments différents deUnroller, car ils nécessitent la transmission d'un objetEquivalenceLibrary.Là où l'on pouvait auparavant utiliser
Unroller(basis_gates), on peut désormais utiliser :from qiskit.circuit.library.standard_gates.equivalence_library import ( StandardEquivalenceLibrary as std_eqlib, ) pm = PassManager([ UnrollCustomDefinitions(std_eqlib, basis_gates) BasisTranslator(std_eqlib, basis_gates), ]) translated = pm.run(circuit) -
La passe de transpilation
NoiseAdaptiveLayout, obsolète, a été supprimée. Il a été marqué comme obsolète dans Qiskit 0.46.0. Ce laissez-passer a été largement remplacé parVF2LayoutetVF2PostLayoutqui définira une disposition basée sur les caractéristiques de bruit rapportées d'un backend. En même temps que le laissez-passer, le pluginlayout_method"noise_adaptive"a été supprimé. -
La passe de transpilation
CrosstalkAdaptiveSchedule, obsolète, a été supprimée. Il a été marqué comme obsolète dans Qiskit 0.46.0. Cette passe n'était plus utilisable car son fonctionnement interne dépendait de la définition de propriétés personnalisées dans la charge utile d'unBackendPropertiesd'uneBackendV1instance. Comme aucun backend ne définit ces champs, la passe a été supprimée. Si vous dépendez de la passe pour un flux de travail personnalisé, vous pouvez utiliser la version de Qiskit 0.46.x. -
Suppression du module
qiskit.transpiler.synthesis, qui est obsolète depuis la version 0.46. Les objets suivants ont été déplacés :qiskit.transpiler.synthesis.aqca été déplacé versqiskit.synthesis.unitary.aqc(à l'exception deqiskit.synthesis.unitary.aqc.AQCSynthesisPlugin).qiskit.synthesis.unitary.aqc.AQCSynthesisPlugina été déplacé surqiskit.transpiler.passes.synthesis.AQCSynthesisPlugin.qiskit.transpiler.synthesis.graysynth()a été déplacé versqiskit.synthesis.synth_cnot_phase_aam().qiskit.transpiler.synthesis.cnot_synth()a été déplacé versqiskit.synthesis.synth_cnot_count_full_pmh().
-
L'alias du mot-clé
targetlors de l'appel d'instances en tant que fonctions a été supprimé suite à sa suppression dans QiskitTwoQubitBasisDecomposeren tant que fonctions a été supprimé suite à sa dépréciation dans Qiskit 0.40.0. Vous devez passer l'argument positionnellement comme premier argument, ou utiliser le nouveau nomunitary. -
La passe de transpilation spécialisée
LinearFunctionsSynthesisa été supprimée suite à sa dépréciation dans Qiskit 0.40.0. Depuis sa dépréciation, il s'agit simplement d'une enveloppe très fine autour deHighLevelSynthesisque vous devriez utiliser à la place. -
Le chemin d'importation
qiskit.transpiler.passes.scheduling.calibration_creatorsest supprimé. Le transpondeur le passe logé,RZXCalibrationBuilderetRZXCalibrationBuilderNoEchopeut être importé directement depuisqiskit.transpiler.passes. -
Le chemin d'importation
qiskit.transpiler.passes.scheduling.rzx_templatesest supprimé. Vous devez importerrzx_templates()deqiskit.transpiler.passesdirectement. -
Un modèle pour la construction de la ligne de passage a été mis à jour. Le sucre syntaxique illustré ci-dessous pour l'instanciation du contrôleur de flux a été supprimé.
from qiskit.transpiler import PassManager pm = PassManager() pm.append(my_pass, condition=condition_callable, do_while=do_while_callable)Au lieu d'utiliser ce modèle d'argument de mot-clé, vous devriez instancier explicitement le contrôleur de flux.
from qiskit.passmanager import ConditionalController, DoWhileController from qiskit.transpiler import PassManager pm = PassManager() pm.append( ConditionalController( DoWhileController(my_pass, do_while=do_while_callable), condition=condition_callable, ) )Notez que vous pouvez gérer l'ordre des contrôleurs lorsque vous souhaitez les imbriquer, ce qui n'était pas possible avec les arguments de type mot-clé. Vous pouvez également construire le pipeline avec le constructeur du gestionnaire de passe comme ci-dessous car il n'y a pas de raison d'appeler la méthode append maintenant.
pm = PassManager( ConditionalController( DoWhileController(my_pass, do_while=do_while_callable), condition=condition_callable, ) ) -
La méthode append des contrôleurs de flux intégrés a été supprimée. Cela inclut :
ConditionalController.appendDoWhileController.appendFlowControllerLinear.append
Le pipeline de tâches d'un contrôleur de flux est gelé et doit être transmis lors de la création de l'instance du contrôleur.
-
Suppression des méthodes
passessdePassManageretStagedPassManagerqui renvoyaient une représentation des passes incluses sous la forme d'une liste de dictionnaires. Toutefois, ce format ne permet pas de représenter efficacement des circuits de passage plus complexes, qui peuvent inclure des branchements conditionnels et des conditions imbriquées. Au lieu d'utiliser cette représentation, veuillez utiliser le modèle suivantpm = PassManager(...) pm.to_flow_controller().tasksCette fonction renvoie directement une base linéarisée d'instances de tâches au format tuple.
-
L'argument
max_iterationa été supprimé dePassManager.append()etPassManager.replace(). -
Les classes héritées suivantes ont été supprimées des modules de gestion des passes et de transposition à la suite de leur dépréciation dans Qiskit 0.46:
qiskit.passmanager.flow_controllers.FlowControllerqiskit.transpiler.fencedobjs.FencedObjectqiskit.transpiler.fencedobjs.FencedPropertySetqiskit.transpiler.fencedobjs.FencedDAGCircuitqiskit.transpiler.runningpassmanager.RunningPassManager
Notes de mise à niveau de la visualisation
-
Le style par défaut pour la visualisation des circuits utilisant Matplotlib a été modifié en
"iqp", correspondant à la plate-forme Quantum IBM. -
Le module obsolète
qiskit.visualization.qcstylea été supprimé. Ce module a été marqué comme obsolète depuis Qiskit 0.39.0. Au lieu de cela, vous devez utiliser le siteqiskit.visualization.circuit.qcstyle. -
La prise en charge obsolète du passage d'un
QuasiDistribution,ProbDistributionou un dictionnaire de distribution à l'argumentdatade la visualisationplot_histogram()a été supprimé. Cette fonctionnalité a été marquée comme obsolète dans la version de Qiskit 0.39.0 (2022-10). Au lieu de cela, si vous souhaitez tracer un histogramme à partir de aQuasiDistribution,ProbDistributionou d'un dictionnaire de distribution, vous devriez plutôt utiliser la fonctionplot_distribution()à la place. -
La clé
link_interval_dtdeQiskitTimelineStylea été supprimée. Vous devez utiliser le nouveau nomlink_interval_percent.
Divers. Mise à niveau
-
L'objet
qiskit.Aera été supprimé suite à sa dépréciation dans Qiskit 0.46. Vous pouvez utiliserqiskit_aer.Aer, qui est un remplacement direct. -
L'importation à partir de
qiskit.providers.aerne fonctionnera plus, suite à sa dépréciation dans Qiskit 0.46. Vous devriez plutôt importer deqiskit_aer, qui est un remplacement direct. -
Les travaux Pulse ne sont plus pris en charge dans les faux backends, suite à la dépréciation et à la suppression de la fonctionnalité de simulation sous-jacente dans Aer. Pour la simulation au niveau des impulsions, en dehors du contexte des objets de circuit, il convient d'envisager l'utilisation d'une bibliothèque spécialisée telle que Qiskit Dynamics.
-
La fonction
execute()de Qiskit est supprimée. Cette fonction sert d'enveloppe de haut niveau pour la transposition d'un circuit à l'aide de certaines options de transposition et son exécution sur un backend à l'aide de certaines options d'exécution. Pour faire la même chose, vous pouvez utiliser explicitement la fonctiontranspile()(avec les options de transposition appropriées) suivie debackend.run()(avec les options d'exécution appropriées).Par exemple, au lieu de courir :
from qiskit import execute job = execute(circuit, backend)vous pouvez courir :
from qiskit import transpile new_circuit = transpile(circuit, backend) job = backend.run(new_circuit)Alternativement, la primitive
Samplerest sémantiquement équivalente à la fonction dépréciéeexecute(). La classeBackendSamplerest une enveloppe générique pour les backends qui ne supportent pas les primitives :from qiskit.primitives import BackendSampler sampler = BackendSampler(backend) job = sampler.run(circuit) -
L'objet
qiskit.IBMQ, obsolète, a été supprimé. Cet objet alias a été marqué comme obsolète dans la version de Qiskit 0.40.0. Cet objet alias redirigeait paresseusement l'accès aux attributs versqiskit.providers.ibmq.IBMQ. Comme le paquetqiskit-ibmq-providera été retiré et remplacé par le paquetqiskit-ibm-providerqui a son propre espace de noms, le maintien de cet alias n'est plus pertinent. Si vous utilisiez l'aliasqiskit.IBMQ, vous devez migrer votre utilisation vers le paquetqiskit-ibm-provider, voir le guide de migration pour plus de détails. -
Suppression du module obsolète
qiskit.tools.jupyterqui incluait auparavant des magiques Jupyter et des widgets pour visualiser interactivement certaines données de Qiskit. Ce module a été supprimé dans Qiskit 0.46.0. La plupart de ces fonctionnalités étaient directement liées à l'ancien paquetageqiskit-ibmq-provideret n'étaient plus valables; le module a donc été supprimé. Une fonctionnalité similaire est disponible dans le moduleqiskit_ibm_provider.jupyterdu paquet qiskit-ibm-provider. -
Suppression du module obsolète
qiskit.tools.monitorqui incluait auparavant des outils pour suivre les instances de travail, principalement à partir de l'ancien paquetageJobV1principalement à partir de l'ancien paquetageqiskit-ibm-provider. Ce module a été marqué comme obsolète dans Qiskit 0.46.0. Il est supprimé parce qu'il était directement lié à l'ancien paquetqiskit-ibm-provider. -
Suppression du chemin d'importation obsolète
qiskit.test.mockqui était utilisé pour rediriger les importations pour les backends fictifs vers leur nouvel emplacement dans le fichierqiskit.providers.fake_provider. Ce module a été marqué comme obsolète dans Qiskit 0.37.0. Si vous utilisiez ce module, vous devriez mettre à jour vos importations deqiskit.test.mockversqiskit.providers.fake_providerà la place. -
Le module
qiskit.testn'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. Toutes les fonctionnalités étaient spécifiques à Qiskit et aucune alternative n'est fournie; si vous aviez besoin de fonctionnalités similaires, vous devriez les inclure dans vos propres harnais de test. -
Le module
qiskit.tools.visualization, obsolète, a été supprimé. Ce module a été supprimé dans la version de Qiskit 0.46.0. Ce module était une redirection héritée de l'emplacement original du module de visualisation de Qiskit et a été déplacé versqiskit.visualizationdans Qiskit 0.8.0. Si vous utilisez toujours ce chemin, vous pouvez simplement mettre à jour vos importations deqiskit.tools.visualizationàqiskit.visualization. -
Le module
qiskit.tools.eventset l'utilitaireqiskit.tools.progressbarqu'il exposait ont été supprimés. Il a été supprimé dans la version de Qiskit 0.46.0. Les fonctionnalités de ce module n'ont pas été largement utilisées et ont été mieux couvertes par des logiciels spécialisés tels que tqdm. -
Le module
qiskit.toolsa été retiré. Ce module a été supprimé dans Qiskit 0.46.0. Tout le contenu de ce module a été supprimé, à l'exception de la fonctionqiskit.tools.parallel_mapqui peut désormais être utilisée à partir deqiskit.utils.parallel_map()à la place.
Primitives obsolètes
- Les méthodes
PrimitiveJob.submit()etPrimitiveJob.wait_for_final_state()ont été supprimées suite à leur dépréciation dans Qiskit 0.46. Ces méthodes n'étaient pas censées être publiques, mais étaient le résultat d'une structure d'héritage incorrecte.
Corrections des erreurs
-
Correction du retour de programmes de mesure incorrects lorsque seul un sous-ensemble de qubits était demandé. Auparavant, un programme de mesures pour tous les qubits était renvoyé.
-
Correction d'un problème dans le tiroir du circuit
textlors de l'affichage d'opérations qui n'étaient pas de typecircuit.instruction.Instructionclasse. Ces opérations entraîneraient la défaillance du tiroir. Voici quelques exemplesCliffordetAnnotatedOperation. -
Correction d'un problème avec la passe
SetLayoutoù une entrée de liste d'entiers invalide qui contenait des entrées dupliquées entraînait la génération d'unLayoutétait généré et les passes de transposition suivantes échouaient avec une erreur cryptique. Ce problème est désormais résolu lorsqueSetLayout.run()est appelé, une erreurInvalidLayoutErrorune erreur sera soulevée indiquant qu'il y a des entrées en double dans la liste des entiers. -
QPY (en utilisant
qpy.dump()etqpy.load()) sérialisera et désérialisera désormais correctement les circuits quantiques avec des opérations annotées (AnnotatedOperation). -
Appel
copy()oucopy_empty_like()sur un siteBlueprintCircuitpropage désormais correctement la mentionglobal_phaseà la copie. Auparavant, la phase globale était toujours nulle après la copie. -
QuantumCircuit.compose()lèvera désormais correctement unCircuitErrorlorsqu'il y a des doublons dans les argumentsqubitsouclbits. -
QPY (en utilisant
qpy.dump()etqpy.load()) sérialisera et désérialisera désormais correctement les circuits quantiques avec des opérateurs de Clifford (Clifford). -
Correction d'un problème dans le tiroir du circuit
mploù le texte s'imprimait au-delà de la fin de la case pour unSwitchCaseOpsi la case par défaut était vide. -
La diffusion de l'argument qubit de
QuantumCircuit.delay()produit maintenant correctement des instructions individuellesDelaypour chaque qubit, comme prévu. Auparavant, lorsqu'on lui donnait certains itérables (tels quesets), il produisait silencieusement un circuit invalide qui pouvait échouer à des endroits inhabituels. -
Correction d'un problème lors de l'utilisation
transpile()ou lors de l'exécution d'un gestionnaire de passe prédéfini (tel que généré pargenerate_preset_pass_manager()) en ciblant un backend qui a une connectivité disjointe ajoutant des barrières supplémentaires à la sortieQuantumCircuit. Dans certains cas, plusieurs directivesBarrierseraient incluses dans le circuit de sortie juste avant les mesures finales dans le circuit. Il s'agissait d'un état interne généré par le traitement interne de la connectivité disjointe qui était incorrectement ajoutée dans le circuit de sortie. Corrigé #11649 -
Correction d'une erreur lorsqu'un utilisateur tente de charger les données d'étalonnage d'une porte à partir d'un fichier de données
Targetdans une situation particulière. Cela se produit lorsque le backend ne communique que des données d'étalonnage partielles, par exemple en faisant référence à une impulsion de forme d'onde dans une définition de commande mais sans inclure cette impulsion de forme d'onde dans la bibliothèque d'impulsions. Dans cette situation, l'objet d'impulsion Qiskit n'a pas pu être construit, ce qui a entraîné l'échec de la construction de l'horaire d'impulsion pour l'étalonnage. Désormais, lorsque les données d'étalonnage sont incomplètes, leTargettraite cette situation comme si aucun étalonnage n'était signalé et ne soulève pas d'exception. -
La méthode
Operator.power()fonctionne désormais avec des exposants en virgule flottante, ce qui correspond à la description documentée. -
Correction d'un problème avec la passe
OptimizeSwapBeforeMeasurequi optimisait de manière incorrecte les circuits impliquant des instructions d'échange et de mesure. Par exemple :from qiskit import QuantumCircuit from qiskit.transpiler.passes import OptimizeSwapBeforeMeasure pass_ = OptimizeSwapBeforeMeasure() qc = QuantumCircuit(2, 1) qc.swap(0, 1) qc.measure(0, 0) qc.measure(0, 0) print(qc.draw()) print(pass_(qc).draw())s'imprimerait auparavant :
┌─┐┌─┐ q_0: ─X─┤M├┤M├ │ └╥┘└╥┘ q_1: ─X──╫──╫─ ║ ║ c: 1/════╩══╩═ 0 0 ┌─┐ q_0: ┤M├─── └╥┘┌─┐ q_1: ─╫─┤M├ ║ └╥┘ c: 1/═╩══╩═ 0 0et maintenant le deuxième circuit est correctement optimisé pour :
q_0: ────── ┌─┐┌─┐ q_1: ┤M├┤M├ └╥┘└╥┘ c: 1/═╩══╩═ 0 0 -
Correction d'un problème avec la sérialisation QPY lorsqu'un fichier
QuantumCircuitcontenait plusieurs instances d'instructions personnalisées ayant le même attributnameattribut. Dans les versions du format QPY antérieures à la version 11, la charge utile QPY ne faisait pas de différence entre ces instances et ne sérialisait que les propriétés de la première instance d'un circuit. Cela pourrait potentiellement entraîner une désérialisation incorrecte si les autres propriétés de l'instruction personnalisée étaient différentes mais que les noms étaient les mêmes. Ce problème a été corrigé dans la version 11 de QPY afin que chaque instance d'une instruction personnalisée soit sérialisée individuellement et qu'il n'y ait plus de conflit potentiel avec des noms qui se chevauchent. Corrige #8941. -
Correction d'un problème avec la fonction
qpy.dump()où, lorsque l'indicateuruse_symengineétait défini sur un objet véridique évalué àTruemais qui n'était pas en fait le booléenTrue, la charge utile QPY générée était corrompue. Par exemple, si vous attribuez àuse_symenginela valeurHAS_SYMENGINEcet objet est évalué àTruelorsqu'il est converti en bool, mais n'est pas réellementTrue. -
Correction d'un bug dans la représentation des
StabilizerStatedans la représentation des chaînes de caractères. -
Un bogue où
convert_to_target()etBackendV2Converterprovoquaient une erreur inattendue a été résolu. Le bogue se produisait lorsque le backend à convertir incluait des calibrations pour une porte qui n'avait pas de définition dans les propriétés du backend. Cette porte est désormais diffusée à tous les qubits en tant qu'instruction idéale sans erreur, même lorsque des calibrations pour un ensemble fini de qubits sont rapportées. -
Correction d'un problème avec la fonction
circuit_drawer()fonction etQuantumCircuit.draw()lors du chargement d'un style matplotlib via le fichier de configuration utilisateur. -
InstructionDurations.from_backend()renvoie désormais une instance de n'importe quelle sous-classe deInstructionDurationsau lieu de la classe de base. -
La passe
UnitarySynthesisgénère désormais une erreur à l'initialisation lorsqu'un greffon de synthèse inexistant est spécifié, au lieu d'attendre l'exécution pour le signaler. Correction #11355. -
Le site OpenQASM 3 exportateurs
qasm3.dump()etdumps()produiront désormais correctement des fichiers revendiquant la version3.0plutôt que la version non qualifiée3, puisque le projet OpenQASM 3 a maintenant normalisé la gestion des versions. -
La forme paramétrique de
XXPlusYYGateetXXMinusYYGaterenvoyée parget_standard_gate_name_mapping()inclut désormais correctement le paramètre ainsi que la rotation initiale . -
La passe
TemplateOptimizationrenvoie désormais les expressions paramétriques en utilisant le format d'expression symbolique natif deParameterExpressionau lieu de toujours utiliser Sympy. Pour la plupart des plates-formes prises en charge, cela signifie que les expressions seront des objets Symengine. Auparavant, la passe pouvait renvoyer des objets non concordants, ce qui pouvait entraîner des échecs ultérieurs dans le code de traitement des paramètres.