Qiskit SDK 2.0 notes de mise à jour
2.0.3
Prélude
Qiskit v2.0.3 est une version de correction de bogues pour la série de versions mineures v2.0.
Corrections des erreurs
-
ApplyLayouttraitera désormais correctement le cas de l'application d'un qubit zéroLayout. Auparavant, il affirmait qu'aucune disposition n'avait été définie, même si le champ"layout"du fichierPropertySetétait égal àLayout(). -
Correction d'un problème dans la passe
ElidePermutationsoù la permutation de sortie n'était pas mise à jour correctement en présence d'opérationsPermutationGateopérations. Il en résulterait un circuit de sortie incorrect et une propriétévirtual_permutation_layoutincorrecte sur le siteproperty_set. Lorsqu'il est exécuté dans le cadre d'unPassManageril en résulterait également unTranspileLayoutdans le circuit de sortieQuantumCircuit.layoutdans le circuit de sortie. -
Correction d'un bug dans la fonction
HighLevelSynthesislors du déroulement d'objets imbriqués/personnalisésInstructionimbriqués. Si leQuantumCircuitrenvoyée parInstruction.definitiond'un objet personnalisé contenait des objetsClbitces bits classiques utiliseraient à tort l'index interne de l'objet personnaliséInstruction.definitionQuantumCircuitau lieu de les faire correspondre à l'index correspondant dans l'objet externeQuantumCircuit. -
Correction d'un bogue dans les
PauliEvolutionSynthesisDefaultetPauliEvolutionSynthesisRustiqqui modifiait l'attribut.synthesis du circuit original lors du réglage depreserve_order=False. Le comportement des plugins a été rétabli et le circuit d'origine est désormais préservé tout au long du pipeline de transpilation. -
Correction d'un problème de compatibilité avec la version minimale supportée de rustworkx, 0.15. Pour certaines entrées, les boutons
VF2LayoutetVF2PostLayoututilisaient auparavant une méthode rustworkx qui avait été ajoutée dans rustworkx 0.16.0 et qui provoquait une erreur lors de l'utilisation d'une version plus ancienne de rustworkx qui est listée comme étant supportée. -
SabreLayoutetSabreSwapne paniquera plus lorsqu'il appliquera le résultat du routage à un circuit qui utiliseexpr.VarouStretchdans une portée de flux de contrôle imbriquée. -
qiskit.circuit.library.quantum_volume()a été mis à jour pour gérer unnumpy.random.Generatorcomme entrée de son argumentseed. Auparavant, un tel argument relatif au générateur entraînait l'envoi deTypeError.
2.0.2
Prélude
Qiskit v2.0.2 est une version de correction de bogues pour la série de versions mineures v2.0.
Corrections des erreurs
-
Fixe l'attribut
namede la classeOrGatepour qu'il soit désormais défini sur"or"afin d'identifier cette porte de manière unique. Il était auparavant incorrectement réglé sur"and", ce qui ne permettait pas de le distinguer deAndGateou d'avoir des plugins de synthèse pour synthétiser unOrGate. -
Correction d'un problème dans la passe de
ConsolidateBlocksoù la consolidation de certains blocs échouait si la porte KAK sélectionnée (directement ou par l'intermédiaire de la cible) était supercontrôlée et nonCXGate. Corrigé #14413 -
Correction d'un bug dans les fonctions du circuit
evolved_operator_ansatz(),qaoa_ansatz()ethamiltonian_variational_ansatz()où les paramètres avaient une composante complexe nulle. Cela ne pose normalement pas de problème, sauf si le paramètre est traduit en SymPy à l'aide de la méthodeParameterExpression.sympify()ce qui provoquerait une erreur.
2.0.1
Prélude
Qiskit v2.0.1 est une version mineure de correction de bogues pour la série de versions v2.0.x.
Corrections des erreurs
-
Correction d'un bug de visualisation dans le tiroir du circuit de texte où les opérations de flux de contrôle post-transpilation pouvaient avoir leur "crochet" de fermeture rendu verticalement dans le désordre. Voir #14271 pour plus de détails.
-
Correction d'un bug dans la passe de
UnitarySynthesisqui ignorait le paramètresynth_gateset ne synthétisait que les portesunitary. La passe synthétise maintenant correctement toutes les portes spécifiées dans le paramètresynth_gates. Correction #14343. -
Ajout de la prise en charge manquante de
reprpourDuration. -
Ajout d'un support manquant pour le décapage Python de
Duration. Cela empêchait la transpilation parallèle de circuits avec des instructions utilisant des expressions de duréedelay()qui utilisent des expressions de durée. -
Correction d'un problème dans la passe de
HighLevelSynthesisqui l'amenait à se terminer prématurément sur certains circuits avec des opérations de flux de contrôle. Corrigé #14338 -
Fixer la construction de circuits en temps polynomial quantique instantané (IQP) en
IQPet pariqp(). L'implémentation précédente utilisait incorrectement les puissances de la porte au lieu des puissances de la porte . -
SabreLayoutpropage désormais correctement les éléments suivants d'un circuitnameetmetadatad'un circuit lorsqu'il est exécuté en tant que passe conjointe de mise en page et de routage. -
Correction d'un problème dans le plugin de synthèse unitaire
SolovayKitaevSynthesisoù l'exécution répétée du plugin avec différentes portes de base réutilisait incorrectement les portes de base de la première exécution seulement. Ce problème était dû au fait que les portes de base étaient ignorées lors de la mise en cache des approximations de base. -
Correction d'un problème dans la passe
SolovayKitaevoù la passe pouvait se bloquer en raison d'une rotation de 180 degrés dans la récursion interne, qui n'était pas gérée correctement. -
Correction d'un problème dans la passe de
SolovayKitaevoù l'approximation générée pouvait avoir une phase qui différait de de la valeur correcte. Cela est dû à la représentation interne , qui nécessite une manipulation supplémentaire pour obtenir le signe correct de la matrice de la porte du qubit. Corrigé #9552 -
Les circuits contenant des retards avec des étirements (voir
QuantumCircuit.add_stretch()) peuvent maintenant être compilés avec succès en utilisant les gestionnaires de passage prédéfinis (transpile()etgenerate_preset_pass_manager()) lorsqu'ils visent un backend qui a des contraintes d'alignement, par exemple IBM Quantum Eagle devices likeibm_sherbrooke. -
L'heuristique de l'erreur de repli dans
VF2LayoutetVF2PostLayoututilisée lorsqu'il n'y avait pas de taux d'erreur signalés, pouvait précédemment attribuer des erreurs supérieures à un et avoir des effets imprévisibles sur les scores de présentation obtenus.
2.0.0
Prélude
Nous sommes heureux de publier Qiskit v2.0.0, avec de nouvelles fonctionnalités qui améliorent ses performances et ses capacités. Les caractéristiques principales de Qiskit v2.0.0 sont les suivantes :
- L'introduction d'une API C pour construire des objets et interagir avec eux
SparseObservableet d'interagir avec eux. Cette première interface en langage compilé représente une étape importante dans l'évolution de Qiskit et son champ d'application s'étendra tout au long de la série de versions v2.x. L'itération initiale de l'API C est une fonctionnalité expérimentale, et il est possible que des changements radicaux soient apportés à l'API dans les versions mineures, conformément à notre stratégie de version.- L'ajout d'un nouvel
BoxOpcontrol-flow op qui correspond au concept de boîte de OpenQASM 3 et permet de regrouper des séries d'instructions en vue d'un traitement ultérieur et d'une programmation personnalisée. Cet opérateur est utile pour des applications telles que le tournoiement, l'apprentissage du bruit et l'ordonnancement basé sur l'étirement, entre autres.- La possibilité de créer des durées
stretchpour les instructions, ce qui permet d'exprimer les relations entre les instructions sensibles au tempsDelayqui permettent d'exprimer les relations entre les instructions sensibles au temps. Le nouveau typeStretchétend le système d'expression classique existant, ce qui permet de saisir l'intention de conception au moment de la construction du circuit et de la résoudre au moment de la compilation. Voir la documentation de OpenQASM pour plus de détails.- Synthèse améliorée lorsqu'un
Targetcontient des portes de base fractionnaires à deux qubits avec prise en charge d'angles arbitraires tels queRZXGateouRZZGatece qui réduit considérablement le nombre de portes dans les circuits synthétisés.- Amélioration des performances d'exécution, en particulier lors de l'étape de construction du circuit, où le benchmarking benchpress montre une accélération de 2x par rapport à Qiskit v1.3. Cette amélioration est obtenue grâce à une combinaison de contributions, notamment l'exploitation de représentations natives supplémentaires de la porte Rust, telles que
UnitaryGateet la suppression d'éléments de modèles de données hérités.
Conformément à notre politique de versionnement sémantique, documentée à l'époque de la version v1.0.0, cette version majeure comprend également des modifications de l'API qui ne sont pas rétrocompatibles avec la série de versions v1.x. En particulier, plusieurs composants obsolètes du modèle de données Qiskit ont été supprimés, tels que la méthode .c_if() , le module qobj , BackendV1 et qiskit.pulse, ainsi que les implémentations de référence primitives obsolètes V1. Vous pouvez vous référer aux notes de mise à jour pour plus de détails sur toutes ces suppressions et modifications de l'API. Les API supprimées sont toujours prises en charge dans la version de Qiskit v1.4.x qui recevra des corrections de bogues pendant encore six mois et des mises à jour de sécurité pendant un an.
Nouvelles fonctions
-
Le support de la plateforme Linux aarch64 a été promu au niveau 1 comme indiqué dans le document :
/guides/install-qiskit#operating-system-support
de son niveau de soutien précédent, le niveau 2, dans la série de publications v1.x.
-
Introduction d'une nouvelle API en C pour construire et interagir avec des observables éparses. Bien que la surface de l'API dans cette version soit relativement petite - couvrant seulement la classe
SparseObservableelle représente une étape importante dans l'évolution de Qiskit, car c'est la première fois que le SDK expose une interface publique en C et elle jette les bases de futures extensions de l'interface C de Qiskit. Comme il s'agit de la première interface publique en C, il s'agit d'une fonctionnalité expérimentale et, si nécessaire, l'API peut être modifiée dans une version mineure.Une syntaxe détaillée et des informations supplémentaires sont disponibles dans la documentation de l'API C. Un exemple minimal pour construire l'observable de 100 qubits
2 X0 Y1 Z2est le suivant :#include <complex.h> #include <qiskit.h> #include <stdint.h> #include <stdio.h> int main(int argc, char *argv[]) { // build a 100-qubit empty observable uint32_t num_qubits = 100; QkObs *obs = qk_obs_zero(num_qubits); // add the term 2 * (X0 Y1 Z2) to the observable complex double coeff = 2; QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z}; uint32_t indices[3] = {0, 1, 2}; QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits}; qk_obs_add_term(obs, &term); // print some properties printf("num_qubits: %u\n", qk_obs_num_qubits(obs)); printf("num_terms: %lu\n", qk_obs_num_terms(obs)); // free the memory allocated for the observable qk_obs_free(obs); return 0; }
Caractéristiques des circuits
-
Ajout d'une nouvelle fonction de commodité
get_control_flow_name_mapping()qui renvoie une correspondance entre les noms des opérations du flux de contrôle Qiskit et les classes correspondantes.Exemple d'utilisation :
from qiskit.circuit import get_control_flow_name_mapping ctrl_flow_name_map = get_control_flow_name_mapping() if_else_object = ctrl_flow_name_map["if_else"] print(if_else_object)<class 'qiskit.circuit.controlflow.if_else.IfElseOp'> -
Ajout d'une nouvelle méthode de circuit,
QuantumCircuit.estimate_duration()pour estimer la durée d'un circuit programmé après transpilation. La durée du circuit est estimée en trouvant le chemin le plus long sur un circuit programmé sur la base des durées fournies par un circuit donnéTarget. Cette méthode ne fonctionne que pour les circuits simples qui ne contiennent pas de flux de contrôle ou d'autres opérations classiques en amont.Utilisez cette méthode au lieu de l'attribut
QuantumCircuit.durationsi vous avez besoin d'une estimation de la durée totale du circuit.Exemple d'utilisation :
from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2(num_qubits=3, seed=42) circ = QuantumCircuit(3) circ.cx(0, 1) circ.measure_all() circ.delay(1e15, 2) circuit_dt = transpile(circ, backend, scheduling_method="asap") duration = circuit_dt.estimate_duration(backend.target, unit="s") print("Estimated duration: ", duration) -
Ajout de deux nouvelles classes :
BitFlipOracleGateetPhaseOracleGate.BitFlipOracleGatea été introduit comme alternative à la synthèse directe deBooleanExpression, qui a été supprimée dans Qiskit v2.0.PhaseOracleGatea été ajouté comme alternative àPhaseOraclecar cette dernière sera dépréciée au fil des versions de v2.x. Les deux classes partagent l'interface dePhaseOracleà l'exception de la méthodeevaluate_bitstring, qui n'existe plus.BitFlipOracleGatesynthétise un oracle à retournement de bit au lieu d'un oracle à retournement de phase, ce qui signifie qu'il agit sur un qubit supplémentaire et peut être considéré comme appliquant une opération X contrôlée, où le contrôle est déterminé par la valeur de l'expression codée par l'oracle.from qiskit import QuantumCircuit from qiskit.circuit.library.bit_flip_oracle import BitFlipOracleGate qc = QuantumCircuit(5) bool_expr = "(x0 & x1 | ~x2) & x4" oracle = BitFlipOracleGate(bool_expr) qc.compose(oracle, inplace=True) qc.draw('mpl') qc.decompose().draw('mpl')
from qiskit import QuantumCircuit from qiskit.circuit.library.phase_oracle import PhaseOracleGate qc = QuantumCircuit(5) bool_expr = "(x0 & x1 | ~x2) & x4" oracle = PhaseOracleGate(bool_expr) qc.compose(oracle, inplace=True) qc.draw('mpl') qc.decompose().draw('mpl')
-
Un nouveau flux de contrôle op,
BoxOpla méthode et le gestionnaire de contexte qui lui sont associés sont désormais disponiblesQuantumCircuit.box()et son gestionnaire de contexte sont maintenant disponibles à partir deqiskit.circuit.La façon normale de construire une boîte est d'utiliser le
QuantumCircuit.box()gestionnaire de contexte :from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(5) with qc.box(): # This box "uses" qubits 0 and 1. qc.x(0) qc.z(1) # Boxes can be assigned a duration. with qc.box(duration=100, unit="ms"): # This box "uses" qubits 2, 3 and 4. # Qubit 4 undergoes no operations. qc.cx(2, 3) qc.noop(4)La "boîte" Qiskit correspond presque directement au concept de boîte de OpenQASM 3.
Tous les qubits "utilisés" par la boîte sont synchronisés au début et à la fin de la boîte. En d'autres termes, la boîte a la même "durée" pour chaque qubit qu'elle utilise, et les points de départ sont synchronisés. Les autres opérations ayant la même portée que l'opération
BoxOpelle-même considèrent la boîte comme atomique; il est possible de faire passer une opération devant une boîte entière si l'opération commute avec l'action de la boîte entière, mais il n'est généralement pas possible de déplacer une opération à l'intérieur ou à l'extérieur d'une boîte.Les principales utilisations d'une boîte sont le regroupement d'une série d'instructions en vue d'un traitement ultérieur (comme le regroupement d'une couche partielle de portes à deux qubits) et l'ordonnancement d'un bloc composé à une portée tout en utilisant un ordonnancement relatif au sein du bloc (comme le découplage dynamique de plusieurs qubits au sein d'un groupe). Le compilateur de Qiskit ne dispose pas encore de passes intégrées permettant de grouper les instructions ou d'ordonnancer les instructions avec une fonction
BoxOp.Le transpileur prend en charge le routage et la mise en page en présence de boîtes, et optimisera à l'intérieur de la boîte (jusqu'au paramètre
optimization_level), mais n'effectue pas encore d'optimisations autour de la structure atomique des boîtes. La boîte de support des tiroirs de circuits basés sur le texte et Matplotlib. L'exportation vers QPY et vers OpenQASM 3 est prise en charge, bien que OpenQASM 3 n'ait actuellement aucun moyen de désigner les qubits inactifs à l'intérieur d'une boîte (il est prévu qu'un changement de spécification ajoute cela dans un avenir proche : voir la proposition de fonctionnalité correspondante ). -
Ajout d'un nouvel argument
approximation_degreeàCommutationChecker.commute()etCommutationChecker.commute_nodes(). Cet argument vous permet de définir le seuil d'approximation à partir duquel les portes sont évaluées comme faisant la navette. Voir la docstring deCommutationCheckerpour plus d'informations. -
Ajout d'une nouvelle méthode de circuit,
QuantumCircuit.noop()qui permet aux qubits d'être explicitement marqués comme étant utilisés dans le cadre d'un constructeur de flux de contrôle sans leur ajouter d'opération correspondante. -
Le module classique d'expressions en temps réel
qiskit.circuit.classicalpeut désormais représenter des expressions constantes. La classeExprpossède désormais un attribut booléenconstqui indique la constance de l'expression. Cela nous permet d'imposer que les expressions dans certains contextes doivent pouvoir être évaluées au moment de la compilation.Toutes les expressions
Varsont considérées comme non-const, tandis que toutes les expressionsValuesont constantes.Une expression composée uniquement d'autres expressions const est également const :
from qiskit.circuit.classical import expr assert expr.bit_and(5, 6).constUne expression qui contient une expression non-const est non-const :
from qiskit.circuit.classical import expr, types assert not expr.bit_and(5, expr.Var.new("a", types.Uint(5)).const -
Le module classique d'expressions en temps réel
qiskit.circuit.classicalpeut maintenant représenter des durées en utilisant le nouveau typeDuration.Le module
qiskit.circuitdispose également d'une nouvelle classeDurationqui peut être utilisée comme valeur littérale dans les expressions classiques.La fonction
lift()peut être utilisée pour créer une expression de valeur à partir d'uneDurationd'une instance :from qiskit.circuit import Duration from qiskit.circuit.classical import expr expr.lift(Duration.dt(1000)) # Value(Duration.dt(1000), Duration()) -
Le module classique d'expressions en temps réel
qiskit.circuit.classicalpeut maintenant représenter IEEE-754 des valeurs en virgule flottante à double précision en utilisant le nouveau typeFloat.La fonction
lift()peut être utilisée pour créer une expression de valeur à partir d'un flotteur Python :from qiskit.circuit.classical import expr expr.lift(5.0) # >>> Value(5.0, Float())Ce type est principalement destiné à être utilisé dans les expressions liées au temps (
durationetstretch). Elle n'est pas compatible avec les opérations logiques ou par bit, bien qu'elle puisse être utilisée avec ces dernières si elles sont d'abord explicitement transformées en quelque chose d'autre. -
Réduction du nombre de portes à deux qubits lors de la décomposition de portes unitaires à un qubit multicontrôlées. Par exemple :
- Pour le multi-contrôle
YGatesur 10 qubits, leCXGatea été réduit de 56%. - Pour le multi-contrôle
HGatesur 10 qubits, leCXGatea été réduit de 56%. - Pour les systèmes multicontrôlés
SXGateetSXdgGatesur 10 qubits, leCXGatea été réduit de 80%. - Pour le multi-contrôle
UGatesur 10 qubits, leCXGatea été réduit de 31%.
- Pour le multi-contrôle
-
Le module classique d'expressions en temps réel
qiskit.circuit.classicalpeut maintenant représenter des opérations arithmétiquesadd(),sub(),mul(), etdiv()sur des opérandes numériques et temporels.Par exemple :
from qiskit.circuit import QuantumCircuit, ClassicalRegister, Duration from qiskit.circuit.classical import expr # Subtract two integers cr = ClassicalRegister(4, "cr") qc = QuantumCircuit(cr) with qc.if_test(expr.equal(expr.sub(cr, 2), 3)): pass # Multiply a Duration by a Float with qc.if_test(expr.less(expr.mul(Duration.dt(200), 2.0), Duration.ns(500))): pass # Divide a Duration by a Duration to get a Float with qc.if_test(expr.greater(expr.div(Duration.dt(200), Duration.dt(400)), 0.5)): passPour d'autres exemples, voir la documentation au niveau du module dont le lien figure ci-dessus.
-
Le constructeur de
UCGatepossède désormais un nouvel argument facultatif,mux_simp, qui prend une valeur booléenne permettant la recherche des simplifications de Carvalho et al. Cette optimisation, activée par défaut, identifie et supprime les contrôles inutiles du multiplexeur, réduisant ainsi le nombre de portes CX et la profondeur du circuit, en particulier dans la préparation d'états séparables avec desInitialize. -
Les
PauliEvolutionGatesupporte désormais nativement lesSparseObservablecomme entrée. Cela permet de traiter efficacement l'évolution sous les projecteurs, qui sont mis en œuvre comme des contrôles d'une rotation de phase et nécessitent moins de portes que l'expansion explicite du projecteur en termes de Paulis. Par exemple :from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparseObservable obs = SparseObservable("001") evo_proj = PauliEvolutionGate(obs, time=1) print(evo_proj.definition.draw()) -
Un nouveau nœud d'expression
Stretcha été ajouté au système d'expression classique pour représenter les variablesstretch. Pour créer une nouvelle variablestretch, vous pouvez utiliserQuantumCircuit.add_stretch(). L'expression résultante est une expression constante de typeDurationqui peut être utilisée comme argumentdurationd'une expression de typedelay().Par exemple, pour garantir qu'une séquence de portes entre deux barrières sera alignée à gauche, quelle que soit leur durée réelle, vous pouvez procéder comme suit :
from qiskit import QuantumCircuit from numpy import pi qc = QuantumCircuit(5) qc.barrier() qc.cx(0, 1) qc.u(pi/4, 0, pi/2, 2) qc.cx(3, 4) a = qc.add_stretch("a") b = qc.add_stretch("b") c = qc.add_stretch("c") # Use the stretches as Delay duration. qc.delay(a, [0, 1]) qc.delay(b, 2) qc.delay(c, [3, 4]) qc.barrier()L'expression
Stretchest très similaire à l'expressionVarexistante utilisée pour représenter les variables classiques dans un circuit, sauf qu'elle est constante et qu'elle est toujours de typeDuration. Il peut être utilisé dans d'autres expressions (par exemple, vous pouvez le multiplier par une constante numérique)QuantumCircuitfournit une prise en charge complète de la portée (par exemple, elle peut être capturée par ou déclarée dans une portée de flux de contrôle).Pour plus de contexte et d'exemples, voir la spécification du langage OpenQASM 3.
-
Ajouté
Gatedes versions des portes arithmétiques à registre unique qui permettent au transpileur d'effectuer des optimisations de haut niveau par rapport à leurs variantesQuantumCircuitvariantes. Il s'agit de :ExactReciprocalGate(en remplaçantExactReciprocal)IntegerComparatorGate(en remplaçantIntegerComparator)LinearPauliRotationsGate(en remplaçantLinearPauliRotations)PiecewiseLinearPauliRotationsGate(en remplaçantPiecewiseLinearPauliRotations)PiecewiseChebyshevGate(en remplaçantPiecewiseChebyshev)PiecewisePolynomialPauliRotationsGate(en remplaçantPiecewisePolynomialPauliRotations)PolynomialPauliRotationsGate(en remplaçantPolynomialPauliRotations)LinearAmplitudeFunctionGate(en remplaçantLinearAmplitudeFunction)QuadraticFormGate(en remplaçantQuadraticForm)WeightedSumGate(en remplaçantWeightedAdder)
Fonctionnalités primitives
- Ajout d'une nouvelle méthode
to_bool_array()à la classeBitArrayqui renvoie le tableau de bits sous la forme d'un tableau booléen NumPy. L'argumentorderpeut être utilisé pour spécifier l'endianness du tableau de sortie.
Fonctionnalités des fournisseurs
-
Ajout de la possibilité de définir la propriété
dtdeGenericBackendV2dans l'initialisateur de la classe avec un nouvel argumentdt. Exemple d'utilisation :from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2( num_qubits = 5, basis_gates = ["cx", "id", "rz", "sx", "x"], dt = 2.22*e-10, seed = 42 )
Caractéristiques de l'information quantique
-
Ajout d'une nouvelle méthode
SparseObservable.to_sparse_list()pour obtenir une représentation sous forme de liste éparse d'un fichierSparseObservable. Par exemple :from qiskit.quantum_info import SparseObservable obs = SparseObservable.from_list([("+II", 1), ("-II", 1)]) print(obs.to_sparse_list()) # [("+", [2], 1), ("-", [2], 1)] -
Ajout d'une nouvelle
SparseObservable.as_paulis()pour exprimer une observable éparse en termes de Paulis uniquement, en développant tous les projecteurs. Par exemple :from qiskit.quantum_info import SparseObservable obs = SparseObservable("+-") obs_paulis = obs.as_paulis() # 1/4 ( II + XI - IX - XX ) -
Qiskit v2.0.0 permet de construire un
SparsePauliOpà partir d'unSparseObservableen utilisant la nouvelle méthodeSparsePauliOp.from_sparse_observable(). Il est important de se rappeler queSparseObservablepeuvent représenter efficacement les projecteurs, qui nécessitent un nombre exponentiel de termes dans l'équationSparsePauliOp. -
SparseObservableprend désormais en charge la composition d'opérateurs à l'aide de la méthodecompose()à l'instar des autres classesquantum_infoclasses. Il s'agit d'une méthode analogue à la multiplication matricielle, bien qu'elle soit entièrement exempte de matrice. -
SparseObservable.BitTermpossède un nouvel attribut,labelqui contient la chaîne à un seul caractère Python utilisée pour représenter le terme dans les étiquettes de chaîne. -
La méthode
StabilizerState.expectation_value()peut maintenant accepter un opérateur de typeSparsePauliOp.
Caractéristiques de la synthèse
-
Ajout d'une nouvelle classe
TwoQubitControlledUDecomposerqui décompose tout unitaire à deux qubits en termes de portes fractionnaires à deux qubits de base, telles queRZZGate(ou des portes à deux qubits qui sont localement équivalentes àRZZGatejusqu'aux portes à un qubit).Par exemple :
from qiskit.circuit.library import RZZGate from qiskit.synthesis import TwoQubitControlledUDecomposer from qiskit.quantum_info import random_unitary unitary = random_unitary(4, seed=1) decomposer = TwoQubitControlledUDecomposer(RZZGate, euler_basis="ZXZ") circ = decomposer(unitary) circ.draw(output='mpl') -
La passe
synth_cnot_depth_line_kms()a été porté en Rust, avec des benchmarks préliminaires indiquant un facteur d'accélération de 20x. -
La passe
synth_cx_cz_depth_line_my()a été porté en Rust, avec des benchmarks préliminaires indiquant un facteur d'accélération de 70x. -
Ajout de fonctions de synthèse
synth_integer_comparator_2s()etsynth_integer_comparator_greedy()pour compiler des portes qui implémentent une comparaison d'entiers, telles queIntegerComparatorGate. Les plugins de synthèse de haut niveau correspondants sontIntComparatorSynthesis2setIntComparatorSynthesisNoAux. Pour permettre au compilateur de sélectionner la décomposition optimale en fonction des qubits auxiliaires disponibles, utiliserIntComparatorSynthesisDefault. -
Ajouté
synth_weighted_sum_carry()pour synthétiser les objetsWeightedSumGateobjets. C'est actuellement la seule méthode de synthèse disponible pourWeightedSumGateavec le plugin de synthèse de haut niveau correspondantWeightedSumSynthesisDefault.
Fonctionnalités du transpilateur
-
Ajout d'un support pour travailler avec des objets
Targetqui contiennent des portes de base à deux qubits contenant des angles arbitraires, tels queRZZGateà la passe deConsolidateBlockstranspiler pass. La passe précédente n'estimait pas correctement le nombre de portes nécessaires pour une décomposition, ce qui faisait que les blocs n'étaient pas consolidés là où l'on pouvait potentiellement optimiser le blocUnitarySynthesispourrait potentiellement optimiser le bloc. En interne, l'estimation du nombre de portes est réalisée à l'aide de la classeTwoQubitControlledUDecomposerclasse.Par exemple :
from qiskit import QuantumCircuit from qiskit.transpiler import generate_preset_pass_manager from qiskit.transpiler.passes import ConsolidateBlocks qc = QuantumCircuit(2) qc.rzz(0.1, 0, 1) qc.rzz(0.2, 0, 1) # basis_gates contains fractional gate (rzz) consolidate_pass = ConsolidateBlocks(basis_gates=["rz", "rzz", "sx", "x", "rx"]) block = consolidate_pass(qc) # consolidate the circuit into a single unitary block block.draw(output='mpl') pm = generate_preset_pass_manager( optimization_level=2, basis_gates=["rz", "rzz", "sx", "x", "rx"] ) tqc = pm.run(qc) # synthesizing the circuit into basis gates tqc.draw(output='mpl') -
Ajout de la prise en charge des portes de base fractionnaires à deux qubits, telles que
RZZGateà la passe deUnitarySynthesistranspiler pass. La décomposition est effectuée à l'aide de la fonctionTwoQubitControlledUDecomposeret prend en charge les portes de base standard et personnalisées.Par exemple :
from qiskit import QuantumCircuit from qiskit.quantum_info import random_unitary from qiskit.transpiler.passes import UnitarySynthesis from qiskit.converters import circuit_to_dag, dag_to_circuit unitary = random_unitary(4, seed=1) qc = QuantumCircuit(2) qc.append(unitary, [0, 1]) dag = circuit_to_dag(qc) # basis_gates contains fractional gate (rzz) circ = UnitarySynthesis(basis_gates=['rzz', 'rx', 'rz']).run(dag) dag_to_circuit(circ).draw(output='mpl') -
Ajout d'une nouvelle passe de transposition,
LightConequi renvoie le cône de lumière d'un circuit lors de la mesure d'un sous-ensemble de qubits ou d'une chaîne de Pauli spécifique.Par exemple, pour le circuit suivant :
l'exécution du laissez-passer permettrait d'éliminer les portes qui n'ont pas d'incidence sur le résultat :
from qiskit.transpiler.passes.optimization.light_cone import LightCone from qiskit.transpiler.passmanager import PassManager from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(3,1) qc.h(range(3)) qc.cx(0,1) qc.cx(2,1) qc.h(range(3)) qc.measure(0,0) pm = PassManager([LightCone()]) new_circuit = pm.run(qc) new_circuit.draw("mpl")
-
Ajout d'un nouvel argument
max_block_widthà la classeBlockCollectoret à la classeCollectLinearFunctionsetCollectCliffordspour le transpileur. Cet argument permet de limiter le nombre maximal de qubits sur lequel un bloc de nœuds est défini.Par exemple :
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import CollectLinearFunctions qc = QuantumCircuit(5) qc.h(0) qc.cx(0, 1) qc.cx(1, 2) qc.cx(2, 3) qc.cx(3, 4) # Collects all CX-gates into a single block qc1 = CollectLinearFunctions()(qc) qc1.draw(output='mpl') # Collects CX-gates into two blocks of width 3 qc2 = CollectLinearFunctions(max_block_width=3)(qc) qc2.draw(output='mpl') -
Ajout d'une nouvelle option,
collect_from_back, à la passe deCollectMultiQBlockstranspiler. Lorsqu'il est réglé surTrue, les blocs sont collectés dans le sens inverse, des sorties vers les entrées du circuit. Les blocs sont toujours signalés selon l'ordre topologique normal. Il en résulte une flexibilité supplémentaire offerte par la passe et des possibilités d'optimisation supplémentaires lorsqu'elle est combinée à une méthode de resynthèse des circuits. -
Ajout d'un nouvel argument
approximation_degreeàCommutationAnalysis. Cet argument permet de définir le seuil d'approximation à partir duquel les portes sont évaluées en fonction de la commutation. Voir la docstring de la classe pour plus d'informations. -
Un nouveau laissez-passer pour transpondeurs,
ContractIdleWiresInControlFlowest disponible dansqiskit.transpiler.passes. Ce passage supprime les qubits des blocs de flux de contrôle si la sémantique le permet et si le qubit reste inactif tout au long de l'opération de flux de contrôle. Auparavant, l'étape de routage des gestionnaires de passes prédéfinies pouvait supprimer des qubits inactifs, ce qui était un effet secondaire involontaire du fonctionnement des passes. Désormais, ce comportement est correctement géré dans le cadre d'une passe d'optimisation. -
Un nouvel étage de plugin de routage
"default"a été ajouté. Dans Qiskit v2.0.0, il s'agit simplement d'un alias de l'ancienne valeur par défaut"sabre". L'algorithme par défaut sous-jacent peut changer au cours de la série de versions de Qiskit v2.x pour certaines ou toutes les cibles, mais vous pouvez toujours définir explicitementrouting_method="sabre"pour maintenir le comportement actuel. -
Ajout d'une nouvelle étape du plugin de traduction
"default". Dans Qiskit v2.0.0, il s'agit d'un alias de l'ancienne valeur par défaut"translator". L'algorithme par défaut sous-jacent peut changer au cours de la série Qiskit 2.x pour certaines ou toutes les cibles, mais vous pouvez toujours définirtranslation_method="translator"explicitement pour conserver le comportement actuel. -
La passe de
HighLevelSynthesissynthétise désormais des objets de typeAnnotatedOperationà travers l'interface du plugin. -
PassManager.run()accepte désormais un argumentproperty_set, qui peut être défini comme un objetMapping-pour fournir les valeurs initiales des objetsPropertySet. Cela peut être utilisé pour recommencer une compilation partiellement appliquée, ou pour réutiliser certaines analyses d'une compilation antérieure à un nouvel endroit. -
La programmation passe
PadDelayetPadDynamicalDecouplingont maintenant de nouveaux arguments sur leurs constructeurs :targetetdurations. Ceux-ci sont utilisés pour spécifier l'optionTargetouInstructionDurationsrespectivement. Pour accéder aux durées d'instruction lors de l'exécution de la passe, l'un des arguments est nécessaire. -
Ajout d'une nouvelle méthode
seconds_to_dt()à la classeTargetclasse. Il est utilisé pour traduire une durée en secondes en un nombre de pas de temps discrétisés de la résolution temporelle du système spécifiée dans l'attributTarget.dtattribut. Ceci est typiquement utile pour convertir la valeurInstructionProperties.durationen unités dedt. -
La passe de
Split2QUnitariesla passe de transpilation a été améliorée pour traiter le cas où l'unité considérée peut être écrite sous la forme d'uneSwapGateet deux portes à un qubit. Dans ce cas, il divise l'unité et applique également une permutation virtuelle, similaire à ce qui est fait dans la méthodeElidePermutations. Cette fonctionnalité peut être contrôlée à l'aide d'un nouvel argument,split_swap, dans le constructeur de :class`.Split2QUnitaries`, qui peut être utilisé pour désactiver le fractionnement des portes équivalentes de permutation.
Divers. Fonctions
-
qiskit.utilscontient désormais des utilitaires permettant un meilleur contrôle et une meilleure inspection des paramètres de parallélisation de Qiskitmultiprocessingde Qiskit. En particulier, on peut maintenant utilisershould_run_in_parallel()pour demander siparallel_map()(et les gestionnaires de passe) lancera des sous-processus pour des entrées appropriées, et utiliser le gestionnaire de contexteshould_run_in_parallel.override()pour remplacer temporairement la plupart des configurations du système et de l'utilisateur autour de cette décision.Une fonction supplémentaire,
default_num_processes()lit le nombre maximal par défaut de sous-processus que Qiskit utilisera pour le parallélisme basé sur les processus. -
Une nouvelle variable d'environnement,
QISKIT_IGNORE_USER_SETTINGS, permet désormais de déterminer s'il faut lire le fichier des paramètres de l'utilisateur surimport qiskit. S'il s'agit de la chaînetrue, le fichier de configuration ne sera pas lu. Ceci est utile pour isoler certaines instances de Qiskit de l'environnement du système, par exemple pour des tests.
Mise à niveau
-
Qiskit v2.0 a abandonné la prise en charge de Linux i686 et de Windows 32 bits. À partir de Qiskit v2.0.0, une plate-forme 64 bits est nécessaire pour faire fonctionner Qiskit. Cela correspond à la tendance de la communauté scientifique Python et permet à Qiskit de se concentrer sur l'amélioration des performances du matériel informatique quantique de plus en plus complexe.
Qiskit v1.4 continuera à supporter les plateformes 32-bit jusqu'à la fin de vie (septembre 2025), mais à partir de cette version 2.0.0, Qiskit ne publiera plus de binaires pré-compilés pour ces plateformes, et n'offre aucune garantie de succès des compilations de sources sur les plateformes 32-bit.
-
La version minimale de Rust supportée pour construire Qiskit à partir des sources est maintenant v1.79. Cette version a été augmentée par rapport à v1.70, la version Rust minimale supportée précédente dans la série de versions de Qiskit v1.x.
-
Qiskit Pulse a été complètement supprimé dans cette version, suite à sa dépréciation dans Qiskit v1.3. Cela comprend tous les fichiers du module d'impulsion, la fonctionnalité de visualisation des impulsions, la prise en charge de la sérialisation et de la désérialisation de
ScheduleBlocket de la porte d'impulsion dans QPY, la gestion des étalonnages dans le module d'impulsionQuantumCircuit,TargetetDAGCircuitet de faux backends basés sur les impulsions. Pour plus de détails sur les composants retirés liés à l'impulsion, voir les sections correspondantes ci-dessous.Notez que la migration de Pulse vers Qiskit Dynamics, telle qu'elle était initialement prévue suite à la dépréciation de Pulse, a été suspendue en raison des priorités de développement de Qiskit Dynamics. Les utilisateurs souhaitant utiliser Qiskit Pulse en tant qu'interface avec les backends ou dans d'autres cas d'utilisation peuvent toujours l'utiliser dans les versions de Qiskit antérieures à v2.0.0, qui incluent la fonctionnalité Pulse.
-
Les fonctions
sequenceetscheduledu modulecompileront été supprimées suite à leur dépréciation dans Qiskit v1.3. Ils s'appuyaient sur la possibilité de traduire les circuits en composants d'impulsion à l'aide de définitions de backend, une capacité qui n'existe plus aujourd'hui. C'est pourquoi elles ont été supprimées sans qu'aucune alternative ne soit proposée. Notez que ces suppressions concernent le paquet Pulse, qui est également supprimé dans Qiskit 2.0.
Notes sur la mise à niveau des circuits
-
BitetRegisterainsi que leurs sous-classes ne sont plus garanties comparables par les contrôles effectués suris, en raison des conversions vers et depuis Python qui peuvent réallouer chaque instance exposée à Python. -
BitetRegister(et leurs sous-classes) ne peuvent plus être sous-classés. Il n'a jamais été prévu que ce comportement soit pris en charge, et cela entraînerait un comportement non spécifié dans Qiskit. Il n'est plus possible de le faire en tant que détail d'implémentation des classes. -
Il n'est plus possible de créer des instances de la base
BitetRegisteret de la classe L'instanciation directe de ces classes a été clairement documentée comme n'étant pas prise en charge, et la possibilité de le faire n'était qu'un artefact d'implémentation de la hiérarchie des classes dans les versions précédentes. À partir de Qiskit v2.0.0, il n'est plus possible de le faire. -
Le module
qiskit.circuit.classicalfunctiona été supprimé suite à sa dépréciation dans Qiskit v1.4. Il s'agit de la classeClassicalFunction, de la fonction connexeclassical_functionet de la classeBooleanExpression. Ce changement a été effectué pour supprimer la dépendance de la bibliothèquetweedledum, qui n'est plus compatible avec toutes les plateformes supportées par Qiskit et les versions de Python.ClassicalFunctionétait exclusivement utilisé dansPhaseOraclequi a été mis à jour pour n'accepter que les expressions au formatstring(voir la note de mise à jour suivante).BooleanExpressiona été remplacée par la nouvelle classeBitFlipOracleGateclasse. -
La classe
PhaseOraclene dépend plus de la bibliothèquetweedledum, car cette dépendance n'est pas activement maintenue. L'interface a été simplifiée : elle n'accepte plus de paramètresynthesizeret le paramètreexpressionne peut être qu'une chaîne de caractères. Le typeClassicalFunctionprécédemment accepté, déprécié dans Qiskit v1.4, a été supprimé dans Qiskit v2.0.Malgré ces améliorations, l'utilisation standard de la classe
PhaseOraclereste inchangée :from qiskit.circuit.library.phase_oracle import PhaseOracle bool_expr = "(x0 & x1 | ~x2) & x4" oracle = PhaseOracle(bool_expr) oracle.draw('mpl')
Notez que ce changement peut affecter l'efficacité de la synthèse, mais qu'il était nécessaire pour assurer la compatibilité avec toutes les plateformes supportées par Qiskit et les versions de Python.
-
Mise à jour de la métrique utilisée pour vérifier les commutations dans
CommutationChecker. Deux portes sont supposées commuter si la fidélité moyenne de la commutation est supérieure à(1 - 1e-12). Cette valeur est choisie pour tenir compte des erreurs d'arrondi dans le calcul de la fidélité et pour des raisons de cohérence avecRemoveIdentityEquivalentetTwoQubitWeylDecomposition. Voir la docstring de la classe pour plus d'informations. -
La méthode
QuantumCircuit.measure_active()a changé le nom du registre classique qu'elle crée, car le nom précédent entrait en conflit avec un mot réservé deOpenQASM. Au lieu demeasure, il s'appelle désormaismeas, ce qui correspond au nom du registre utilisé par lemeasure_all(). -
La méthode
DAGCircuit.control_flow_op_nodes()a été mise à jour afin de toujours renvoyer une liste, même si elle est vide. Auparavant, il renvoyaitNones'il était vide, et ne renvoyait jamais une liste vide, ce qui nécessitait un traitement spécial. Si vous avez besoin de tester explicitement la vacuité à la fois dans Qiskit v1.x et v2.x, vous pouvez le faire :control_flow_nodes = dag.control_flow_op_nodes() if not control_flow_nodes: # There are no control-flow nodes. pass -
BlueprintCircuit.copy_empty_like()renvoie désormais unQuantumCircuitavec le même nombre de qubits et de clbits, et les mêmes métadonnées que le circuit original, au lieu d'unBlueprintCircuit. Cette modification permet de remédier à un comportement inattendu où le traitement d'une copie "vide" d'un circuit de schéma directeur entraînait la reconstruction des données du circuit. Notez queBlueprintCircuit.copy()renvoie toujours unBlueprintCircuit. Bien queBlueprintCircuitne soit pas une classe publique puisqu'il s'agit d'un type interne utilisé pour la construction d'entrées patrimoniales enqiskit.circuit.librarycela a un impact sur ses sous-classes telles queNLocaletZZFeatureMap. Se référer auqiskit.circuit.librarypour obtenir la liste complète des classes concernées par ce changement. Corrigé #13535 -
La fonction interne
qiskit.circuit.add_control.add_controla été supprimée. Cette fonction ne faisait pas partie de l'API publique, elle avait des conditions préalables fragiles à respecter et était une source fréquente de bogues. Les utilisations deadd_control(SomeGate(...), ...)doivent être remplacées parSomeGate(...).control(...)en utilisantGate.control()à la place, ce qui est bien plus sûr. -
La méthode
ParameterExpression.sympify()peut désormais lever une exceptionMissingOptionalLibrarysisympyn'est pas installé. Dans les versions de Qiskit v1.x, l'installation desympyétait toujours garantie, mais à partir de v2.0.0, ce n'est plus une condition sine qua non et vous n'en aurez besoin que si vous utilisez cette méthode. Comme cette fonctionnalité nécessite explicitementsympy, vous devez vous assurer quesympyest installé pour utiliser cette méthode. -
L'argument
DAGNodedaga été supprimé de la classeDAGNodeet de ses sous-classes :DAGOpNode,DAGOutNodeetDAGInNode.Le paramètre
dagétait un argument facultatif lors de la construction de ces objets, mais il est inutilisé et ignoré depuis la version v1.3, et déprécié depuis la version v1.4. -
Les méthodes suivantes
QuantumCircuitméthodes :castcbit_argument_conversioncls_instancescls_prefixqbit_argument_conversion
ont été supprimés, suite à leur dépréciation dans Qiskit 1.2. Ces méthodes étaient des fonctions d'aide internes et n'ont jamais été destinées à devenir des API publiques. Aucun remplacement n'est prévu.
-
Les attributs dépréciés pour
InstructionetGatedurationetunitont été supprimés, de sorte que vous ne pouvez plus définir les argumentsunitoudurationpour n'importe quelle classe ou sous-classe deqiskit.circuit.Instructionou de la sous-classe. Ces attributs ont été supprimés dans Qiskit v1.3.0 et ont été utilisés pour attacher une durée d'exécution personnalisée et une unité pour cette durée à une instruction individuelle. Cependant, la source de vérité de la durée d'une porte est leBackendV2Targetqui contient la durée de chaque instruction prise en charge par le backend. La durée d'une instruction n'est généralement pas réglable par l'utilisateur et est une propriété immuable du backend. Si vous avez déjà utilisé cette fonction pour expérimenter différentes durées de porte, vous pouvez modifier le champInstructionProperties.durationdans un champTargetpour définir une durée personnalisée pour une instruction sur un backend. (L'unité est toujours en secondes dans leTarget.) -
L'attribut déprécié pour
qiskit.circuit.InstructionetGate:conditiona été supprimé. Cette fonctionnalité a été remplacée par la classeIfElseOpqui peut être utilisée pour décrire une condition classique dans un circuit. Cet attribut a été supprimé dans la version v1.3.0. -
Les méthodes obsolètes pour
InstructionetGate:c_ifetcondition_bitsont été supprimées. Ces méthodes ont été supprimées dans la version v1.3.0. Cette fonctionnalité a été remplacée par la classeIfElseOpqui peut être utilisée pour décrire une condition classique dans un circuit. Par exemple, un circuit utilisant précédemmentInstruction.c_if()comme :from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.x(0).c_if(0, 1) qc.z(1.c_if(1, 0) qc.measure(0, 0) qc.measure(1, 1)peut être réécrit ainsi :
qc = QuantumCircuit(2, 2) qc.h(0) with expected.if_test((expected.clbits[0], True)): qc.x(0) with expected.if_test((expected.clbits[1], False)): qc.z(1) qc.measure(0, 0) qc.measure(1, 1) -
La méthode obsolète
InstructionSet.c_ifa été supprimée. Cette méthode a été supprimée dans la version 1.3.0. Cette fonctionnalité a été remplacée par la classeIfElseOpqui peut être utilisée pour décrire une condition classique dans un circuit. -
Dans le cadre de la suppression de Pulse à Qiskit v2.0.0, la propriété
calibrationsa été supprimée de la base de donnéesQuantumCircuit,DAGCircuitetDAGDependencyont été supprimées. En outre, la méthodehas_calibration_fora été supprimée de l'interface de l'applicationQuantumCircuitetDAGCircuitetadd_calibrationa été supprimée des classesQuantumCircuit. -
Le module
qiskit.circuit.classicalfunctiona été retiré. Ce module dépendait de la bibliothèquetweedledumqui n'est pas compatible avec les nouvelles versions de Python. En guise d'alternative, les boutonsPhaseOracleGateetBitFlipOracleGatepeuvent être utilisées pour générer des circuits à partir d'expressions booléennes. -
La représentation interne de
UnitaryGatelorsqu'il est ajouté à unQuantumCircuita changé. L'objet stocké dans le circuit ne partagera plus nécessairement une référence commune avec l'objet ajouté au circuit. Ce comportement n'était jamais garanti, et la mutation de l'objetUnitaryGatedirectement ou par référence était toujours bancale et susceptible de corrompre le circuit, en particulier lors de la modification de la matrice. Si vous avez besoin de muter un élément du circuit (ce qui n'est pas recommandé car c'est inefficace et source d'erreurs), faites quelque chose comme :from qiskit.circuit import QuantumCircuit from qiskit.quantum_info import random_unitary from qiskit.circuit.library import UnitaryGate import numpy as np qc = QuantumCircuit(2) qc.unitary(np.eye(2, dtype=complex)) new_op = UnitaryGate(random_unitary(2)) qc.data[0] = qc.data[0].replace(operation=new_op)Ceci s'applique également à
DAGCircuitmais vous pouvez utiliserDAGCircuit.substitute_node()à la place. -
L'attribut
CircuitInstruction.paramspour unCircuitInstructionqui contient unUnitaryGatepour sonoperationne contiendra plus la matrice unitaire sous-jacente de la porte. En effet, la représentation interne de la porte ne traite plus l'objet matrice comme un paramètre. Si vous devez accéder à la matrice du portail, vous pouvez le faire soit par l'intermédiaire de l'interface de gestion du portail, soit par l'intermédiaire de l'interface de gestion du portailCircuitInstruction.matrixsoit par le champUnitaryGate.paramsdu champCircuitInstruction.operation.
Notes de mise à niveau des primitives
-
À la suite de la suppression du modèle
BackendV1, lesBackendSamplerV2etBackendEstimatorV2n'acceptent plus les entrées de typeBackendV1dans leur argument d'entréebackend. -
Les implémentations primitives de V1 et les alias de type non-versionnés de V1-exclusive, dépréciés dans Qiskit v1.2, ont été supprimés. Ces interfaces ont été remplacées par leurs équivalents sur V2. La suppression comprend les classes suivantes qui mettent en œuvre les interfaces V1 :
Estimatoren faveur de l'équivalent V2,StatevectorEstimatorSampleren faveur de l'équivalent V2,StatevectorSamplerBackendEstimatoren faveur de l'équivalent V2,BackendEstimatorV2BackendSampleren faveur de l'équivalent V2,BackendSamplerV2
Ainsi que les alias de type non versionnés suivants :
BaseEstimator, alias deBaseEstimatorV1BaseSampler, alias deBaseSamplerV1
Cette suppression n'affecte PAS les définitions des interfaces abstraites
BaseEstimatorV1etBaseSamplerV1qui ont fait l'objet d'une version explicite, ni les classes de résultats et de tâches correspondantes, qui ont été conservées pour des raisons de compatibilité ascendante. Si vous utilisez un alias V1-type non versionné tel queBaseEstimator, vous pouvez le remplacer directement par le type versionné (BaseEstimatorV1).En outre, les fonctions d'utilité suivantes ont été supprimées. Ces fonctions n'ont été utilisées que dans les implémentations primitives de V1 :
init_circuitpour initialiser un circuit à partir d'unStatevectorutiliserQuantumCircuit.initialize()à la place.init_observable: utiliser le constructeur deSparsePauliOpà la place.final_measurement_mapping: utiliserQuantumCircuit.layout()etSparsePauliOp.apply_layout()pour ajuster un opérateur à une mise en page. Sinon, utilisezmthree.utils.final_measurement_mapping. Voir les fonctions utilitaires de Mthree pour plus de détails.
Notes de mise à niveau des fournisseurs
-
La méthode
configurationdeBasicSimulatora été supprimée suite à sa dépréciation dans Qiskit v1.3. Cette méthode renvoie une instance deBackendConfiguration, une classe qui faisait partie du flux de travailBackendV1abandonné et qui est également supprimée dans Qiskit v2.0.0. Les différents éléments de configuration peuvent désormais être récupérés directement à partir du backend ou de l'instance deTargetcontenue (backend.target). -
La méthode
run_experimentdeBasicSimulatora été supprimée. Cette méthode prend une instance de la classeQasmQobjExperimentcomme argument d'entrée, une classe qui a été dépréciée depuis Qiskit v1.2 et qui a été supprimée avec le flux de travailQobjdans Qiskit v2.0.0. -
Le modèle
BackendV1a été supprimé suite à sa dépréciation dans Qiskit 1.2.0. Cela inclut la classeBackendV1ainsi que les modules et utilitaires associés, car ils ont été remplacés par leBackendV2modèle. La liste des objets retirés comprend-
BackendV1classe : le cœur du modèle retiré -
Tous les éléments de
qiskit/providers/models, car ils ont été utilisés pour représenter les composants du modèleBackendV1:BackendConfigurationBackendPropertiesBackendStatusQasmBackendConfigurationPulseBackendConfigurationUchannelLOGateConfigPulseDefaultsPulseQobjDefCommandGatePropertiesNduvJobStatus: Cette classe a été remplacée par celle, plus répandue, deJobStatusPulseDefaults
-
BackendV2Converterclasse : utilisée pour convertirBackendV1enBackendV2 -
convert_to_targetfonction : utilisée pour construire une instanceTargetinstance à partir des anciens composants deBackendV1(tels queBackendConfigurationouBackendProperties) -
BackendPropertyErroretBackendConfigurationError: exceptions liées aux classes supprimées
-
-
Le
BasicSimulatorne peut plus simuler un flux de contrôle classique. Il ne permettait que l'utilisation de.c_if()/.conditionpour modéliser le flux de contrôle, mais cette construction a maintenant été supprimée du modèle de données Qiskit. -
Toutes les fausses classes de backend basées sur la version dépréciée de
BackendV1ont été supprimées du moduleproviders.fake_providermodule. Ces classes sont obsolètes depuis Qiskit 1.2 et faisaient partie du flux de travail obsolèteBackendV1. Leur utilisation dans les tests a été remplacée par la classeGenericBackendV2qui permet de créer des instances personnalisées deBackendV2qui mettent en œuvre unBackendV2.run(). Le retrait affecte :-
Classes de base :
FakeBackendFakePulseBackendFakeQasmBackend
-
Faux backends à des fins de tests spécifiques :
Fake1QFakeOpenPulse2QFakeOpenPulse3Q
-
Faux backends hérités :
Fake5QV1Fake20QV1Fake7QPulseV1Fake27QPulseV1Fake127QPulseV1
-
-
Dans le cadre de la suppression des impulsions dans Qiskit v2.0.0, les méthodes suivantes ont été supprimées :
qiskit.providers.BackendV2.instruction_schedule_mapqiskit.providers.BackendV2.drive_channelqiskit.providers.BackendV2.measure_channelqiskit.providers.BackendV2.acquire_channelqiskit.providers.BackendV2.control_channel
-
Dans le cadre de la suppression de l'impulsion dans Qiskit v2.0.0, la prise en charge de l'impulsion a été supprimée de
GenericBackendV2. Cela inclut la possibilité d'initialiser le backend avec des calibrations personnalisées (argumentcalibrate_instructions) et des attributs de canaux d'impulsion (drive_channel,measure_channel,acquire_channel,control_channel). -
Suppression des classes de base abstraites
ProvideretProviderV1, qui sont obsolètes depuis Qiskit v1.1.0. L'abstraction fournie par ces définitions d'interface n'offrait pas de valeur significative, ne comprenant que les attributsname,backends, et une méthodeget_backend().Un fournisseur, en tant que concept, continuera d'exister en tant que collection de backends. Si vous mettez actuellement en œuvre un fournisseur, vous pouvez adapter votre code en supprimant simplement
ProviderV1en tant que classe parente de votre mise en œuvre.Dans le cadre de ce changement, vous voudrez probablement ajouter une implémentation de
get_backendpour assurer la compatibilité ascendante. Par exemple :def get_backend(self, name=None, **kwargs): backend = self.backends(name, **kwargs) if len(backends) > 1: raise QiskitBackendNotFoundError("More than one backend matches the criteria") if not backends: raise QiskitBackendNotFoundError("No backend matches the criteria") return backends[0]
Notes de mise à niveau QPY
-
La fonction
qpy.load()peut maintenant lever une exceptionMissingOptionalLibrarysi une charge utile QPY v10, v11, ou v12 est transmise qui utilise des expressions symboliquessymengineet quesymenginen'est pas installé. L'exception est également levée sisympyn'est pas installé pour une autre charge utile QPY avant v13. Dans les versions de Qiskit v1.x, l'installation desymengineetsympyétait toujours garantie. Cependant, à partir de v2.x, ce n'est plus une exigence absolue et cela ne sera peut-être nécessaire que si vous désérialisez un fichier QPY qui a été généré à l'aide desymengine. L'analyse de ces données utiles QPY nécessitesymenginecar son utilisation fait partie de la spécification du format pour QPY v10, v11, et v12. Si la charge utile l'exige, l'installation d'une version compatible desymengine(0.11.0ou0.13.0) est la seule option possible. De même,sympya été utilisé pourParameterExpressionl'encodage de toutes les versions 1 à 12 de QPY. -
La version minimale de compatibilité QPY,
QPY_COMPATIBILITY_VERSIONa été portée de 10 (la version requise pour v1.x ) à 13. Cette version contrôle la version minimale de QPY qui peut être émise par la fonctionqpy.dump()par la fonction Cela signifie queqpy.dump()ne peut émettre que des QPY v13 et v14 dans cette version. QPY v13 est toujours compatible avec Qiskit v1.3.x et v1.4.x, ce qui signifie que les charges utiles générées dans Qiskit v2.x avec QPY v13 peuvent toujours être chargées avec la série de versions Qiskit v1.x.Ce changement était nécessaire parce que les versions 10 à 12 de QPY nécessitent les bibliothèques
sympyousymenginepour générer une sérialisation pour les objets, mais dans Qiskit, aucune bibliothèque n'est nécessaire pour les objetsParameterExpressionmais dans Qiskit 2.x aucune bibliothèque n'est requise pour l'objetParameterExpressionobjet. -
Avec la suppression de pulse dans Qiskit v2.0.0, le support pour la sérialisation des programmes
ScheduleBlockà travers la fonctionqiskit.qpy.dump()a été supprimée. Les utilisateurs peuvent toujours charger des charges utiles contenant des portes d'impulsion en utilisant la fonctionqiskit.qpy.load()mais elles seront traitées comme des instructions personnalisées opaques. Le chargement deScheduleBlockpayloads n'est plus supporté et provoquera uneQpyErrorexception.
Notes de mise à niveau de Synthesis
-
L'argument appelable
atomic_evolutiondeProductFormula(et ses sous-classesQDrift,LieTrotter, etSuzukiTrotter) a une nouvelle signature de fonction. L'ancienne signature prenait un opérateur de Pauli et un coefficient de temps et renvoyait le circuit d'évolution :def atomic_evolution(pauli_op: SparsePauliOp, time: float) -> QuantumCircuit: evol_circuit = QuantumCircuit(pauli_op.num_qubits) # append operators to circuit return evol_circuitLa nouvelle signature prend directement en compte un circuit existant et doit ajouter à ce circuit l'évolution du temps de Pauli fourni :
def atomic_evolution(evol_circuit: QuantumCircuit, pauli_op: SparsePauliOp, time: float): # append operators to circuit, in-place modificationCette nouvelle mise en œuvre est nettement plus performante.
Notes de mise à niveau du transpilateur
-
Augmentation du seuil minimum à partir duquel les portes sont supposées être l'identité en
RemoveIdentityEquivalentde epsilon machine à1e-12pour tenir compte des erreurs d'arrondi dans le calcul de la fidélité et par souci de cohérence avec les autres classes, telles queCommutationAnalysisetTwoQubitWeylDecomposition. -
Le nom de scène du plugin de routage
defaultest désormais réservé au plugin intégré Qiskit du même nom. -
L' étape du plugin de routage par défaut est désormais
"default". Dans Qiskit v2.0.0, il s'agit simplement d'un alias de l'ancienne valeur par défaut"sabre". L'algorithme par défaut sous-jacent peut changer au cours de la série de versions de Qiskit v2.x pour certaines ou toutes les cibles, mais vous pouvez toujours définir explicitementrouting_method="sabre"pour conserver le comportement actuel. -
Le nom de scène du plugin de traduction
defaultest désormais réservé au plugin intégré Qiskit du même nom. -
L' étape du plugin de traduction par défaut est désormais
"default". Dans Qiskit 2.0, il s'agit simplement d'un alias de l'ancienne valeur par défaut"translator". L'algorithme par défaut sous-jacent peut changer au cours de la série Qiskit 2.x pour certaines ou toutes les cibles, mais vous pouvez toujours définirtranslation_method="translator"explicitement pour conserver le comportement actuel. -
Les anciennes passes d'ordonnancement
ASAPSchedule,ALAPSchedule,DynamicalDecoupling, etAlignMeasuresont été supprimées en faveur des alternatives mises à jourALAPScheduleAnalysis,ASAPScheduleAnalysis,PadDynamicalDecoupling, etConstrainedReschedulerespectivement. Ils ont été supprimés dans Qiskit v1.1 après que le nouveau workflow de planification ait remplacé l'ancien. -
Dans le cas où ni
targetni un ensemble debasis_gatesne sont spécifiés, la passe deHighLevelSynthesissynthétise des circuits avec des opérations annotées avec moins de couches d'enveloppes qu'auparavant (c'est le cas, par exemple, pour le circuit produit parmultiplier_cumulative_h18()). -
L'argument mot-clé
property_setest désormais réservé dansBasePassManager.run()et ne peut pas être utilisé commekwargqui sera transmis à la conversion de la sous-classe de la représentation frontale à la représentation interne. -
Les utilisations dépréciées suivantes de l'objet
BackendPropertiesdans le pipeline de transpilation ont été supprimées dans Qiskit 2.0:backend_propertiesl'argument d'entrée danstranspile()backend_propertiesl'argument d'entrée dansPassManagerConfigbackend_propertiesl'argument d'entrée dansgenerate_preset_pass_manager()backend_propertiesl'argument d'entrée dansgenerate_routing_passmanager()backend_propertiesl'argument d'entrée dansgenerate_translation_passmanager()backend_propertiesargument d'entréeTarget.from_configuration()
Les passes suivantes ont également été mises à jour pour n'accepter que
targetau lieu de :backend_propl'argument d'entrée dansDenseLayoutpropertiesl'argument d'entrée dansVF2Layoutpropertiesetcoupling_maples arguments d'entrée dansVF2PostLayoutbackend_propsl'argument d'entrée dansUnitarySynthesis
La classe
BackendPropertiesest obsolète depuis Qiskit v1.2, car elle faisait partie du flux de travailBackendV1. Des propriétés d'instruction spécifiques, telles que les erreurs de porte ou les durées, peuvent être ajoutées à une instruction lors de sa constructionTargetlors de sa construction par le biais de la méthodeTarget.add_instruction()et communiquées aux passes de transposition concernées par l'intermédiaire de l'argument d'entréetarget. -
Suite à la suppression du modèle
BackendV1, les types d'entrée acceptés des objets transpileurs suivants ont été mis à jour :- Les
generate_preset_pass_manager()ettranspile()n'acceptent plus les entrées de typeBackendV1dans leur argument d'entréebackend. - La méthode
Target.from_configuration()n'accepte plus l'argumentbackend_properties - La méthode
Target.target_to_backend_properties()a été supprimée
- Les
-
La passe de
ResetAfterMeasureSimplificationutilise maintenant unIfElseOppour conditionner l'exécution duXGateau lieu de définir un attributconditionsur la porte. En effet, l'attributconditiona été supprimé du modèle de données Qiskit. -
La passe de transpilation
ConvertConditionsToIfOps, obsolète, a été supprimée. L'attributconditionsous-jacent deInstructiona été supprimé, de sorte que cette passe de transposition n'a plus rien à convertir. Au lieu de cela, vous devez utiliser directementIfElseOppour conditionner classiquement l'exécution d'une opération. -
Les
PadDelayetPadDynamicalDecouplingrequièrent désormais un nouvel argument lors de leur construction. Les adressestargetetdurationsdoivent être spécifiées à l'aide d'un astérisqueTargetouInstructionDurationsrespectivement. Sans cela, les passes ne peuvent pas déterminer la durée des instructions dans le circuit et commettent des erreurs. Auparavant, ces passes déterminaient ces valeurs à partir de l'attributdurationdes objets, qui a été suppriméInstructionobjets. -
La passe de transpilation
AlignMeasures, précédemment dépréciée, a été supprimée. Cette passe a été supprimée dans Qiskit v1.1.0. Au lieu de cela, il convient d'utiliser leConstrainedRescheduledoit être utilisé.ConstrainedRescheduleremplit la même fonction et permet également de s'aligner sur des contraintes de temps supplémentaires. -
Lors de la programmation à l'aide de
generate_preset_pass_manager()outranspile()si l'argumentinstruction_durationsest spécifié, les durées sont formatées sous forme delistet sont exprimées en unités dedt. Vous devez également définir l'argument d'entréedtde la fonction de transpilation. -
Suppression de l'attribut " DAGNode.sort_key ", qui était obsolète. Cet attribut a été supprimé dans la version de Qiskit v1.4.0. Le tri topologique lexicographique étant effectué en interne dans Rust et l'attribut sort key étant inutilisé, cet attribut a été supprimé afin d'éviter la surcharge liée à la création de nœuds DAG. Si vous vous êtes appuyé sur la clé de tri, vous pouvez la reproduire à partir d'un nœud donné en utilisant quelque chose comme :
def get_sort_key(node: DAGNode): if isinstance(node, (DAGInNode, DAGOutNode)): return str(node.wire) return ",".join( f"{dag.find_bit(q).index:04d}" for q in itertools.chain(node.qargs, node.cargs) ) -
Les éléments suivants
transpile()etgenerate_preset_pass_manager()qui sont obsolètes depuis Qiskit 1.3, ont été supprimés de l'API :instruction_durationstiming_constraints
En outre, la spécification de portes de base personnalisées par l'intermédiaire de l'argument de porte
basisdetranspile()etgenerate_preset_pass_manager()également déprécié dans Qiskit 1.3, n'est plus autorisée, et un messageValueErrorsera émis dans ce cas.Les informations précédemment fournies par ces derniers peuvent toujours être spécifiées via les arguments
backendoutarget. Vous pouvez construire une instance Target avec des durées d'instruction définies en faisant :Target.from_configuration(..., instruction_durations=...)Pour des contraintes de temps spécifiques :
Target.from_configuration(..., timing_constraints=...)Et pour les portes de base personnalisées, vous pouvez les ajouter manuellement à la cible ou utiliser
.from_configurationavec un mappage de nom personnalisé, par exemple :from qiskit.circuit.library import XGate from qiskit.transpiler.target import Target basis_gates = ["my_x", "cx"] custom_name_mapping = {"my_x": XGate()} target = Target.from_configuration( basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping ) -
Les
transpile()etgenerate_preset_pass_manager()soulèvent maintenant unUserWarninglorsqu'elles fournissent uncoupling_mapet/ou unbasis_gatesen même temps qu'unbackend. Dans ces cas, les sources de vérité sont multiples, les intentions de l'utilisateur ne sont pas toujours claires et il peut y avoir des conflits que l'on ne sait pas comment résoudregenerate_preset_pass_manager()peuvent ne pas savoir comment les résoudre. L'alternative proposée consiste à définir un objectif personnalisé qui combine les contraintes choisies.L'une de ces situations est la spécification d'une porte avec 3 qubits ou plus dans
backendoubasis_gatesavec uncoupling_mappersonnalisé. La carte de couplage ne fournit pas les détails de connectivité nécessaires pour déterminer l'action de la porte. Dans ces cas-là,transpile()etgenerate_preset_pass_manager()soulèvent maintenant unValueError. -
Dans le cadre de la suppression de Pulse dans Qiskit 2.0, toutes les fonctionnalités liées à l'impulsion et à la calibration dans le transpiler ont été supprimées.
Les passes et fonctions suivantes ont été supprimées :
qiskit.transpiler.passes.PulseGatesréussiteqiskit.transpiler.passes.ValidatePulseGatesréussiteqiskit.transpiler.passes.RXCalibrationBuilderréussiteqiskit.transpiler.passes.RZXCalibrationBuilderréussiteqiskit.transpiler.passes.RZXCalibrationBuilderNoEchoréussiteqiskit.transpiler.passes.EchoRZXWeylDecompositionréussiteqiskit.transpiler.passes.NoramlizeRXAngleréussiteqiskit.transpiler.passes.rzx_templates()fonction
L'argument
inst_mapa été supprimé des éléments suivants :- Les
generate_preset_pass_manager()ettranspile()fonctions - La
Target.from_configuration()méthode - Le constructeur de la
PassManagerConfigclasse
Le support d'étalonnage a été supprimé :
calibrationa été supprimée du constructeurInstructionPropertieset n'est plus une propriété de cette classe.- Les méthodes
has_calibration,get_calibration,instruction_schedule_mapetupdate_from_instruction_schedule_mapont été supprimées de la classeTargetclasse.
-
La passe de transpilation
StochasticSwap, obsolète, et son plugin d'étape de routage intégré "stochastic", ont été supprimés. Ils ont été marqués comme obsolètes dans la version de Qiskit v1.3.0. La passe a été remplacée par la classeSabreSwapqui devrait être utilisée à la place, car elle offre de meilleures performances et une meilleure qualité de sortie. Par exemple, si la passe a été invoquée précédemment par le biais de la fonction transpile, comme par exemple :from qiskit import transpile from qiskit.circuit import QuantumCircuit from qiskit.transpiler import CouplingMap from qiskit.providers.fake_provider import GenericBackendV2 qc = QuantumCircuit(4) qc.h(0) qc.cx(0, range(1, 4)) qc.measure_all() cmap = CouplingMap.from_heavy_hex(3) backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap) tqc = transpile( qc, routing_method="stochastic", layout_method="dense", seed_transpiler=12342, target=backend.target )à remplacer par :
tqc = transpile( qc, routing_method="sabre", layout_method="dense", seed_transpiler=12342, target=backend.target ) -
Le laissez-passer
qiskit.transpiler.passes.CXCancellationa été supprimé. Il a été abandonné au profit de class:.InverseCancellation, qui est plus générique.CXCancellation()est pleinement équivalent sémantiquement àInverseCancellation([CXGate()]). -
La passe de
SolovayKitaevne soulève plus d'exception sur les circuits qui contiennent des opérations sur un seul qubit sans méthodeto_matrix(comme les mesures, les barrières et les opérations sur le flux de contrôle) ou des opérations sur un seul qubit paramétrées, mais les laissera inchangées. -
Les plugins pour l' étape de traduction des gestionnaires de passages prédéfinis doivent désormais respecter la directionnalité des portes dans leur sortie
Targetdans leur sortie. Précédemment,transpile()etgenerate_preset_pass_manager()générerait unPassManagerqui contiendrait des laissez-passer de réparation si nécessaire. Vous devez maintenant les inclure dans votre propre scène personnalisée, si votre scène ne garantit pas qu'elle respecte la directionnalité.Vous pouvez utiliser le
GateDirectionpour effectuer les mêmes réparations que Qiskit. Par exemple :from qiskit.transpiler import PassManager from qiskit.transpiler.passes import GateDirection from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin class YourTranslationPlugin(PassManagerStagePlugin): def pass_manager(self, pass_manager_config, optimization_level): pm = PassManager([ # ... whatever your current setup is ... ]) # Add the two-qubit directionality-fixing pass. pm.append(GateDirection( pass_manager_config.coupling_map, pass_manager_config.target, )) return pm -
Les gestionnaires de passe prédéfinis ne remplissent plus l'étape implicite
pre_optimizationde leur sortieStagedPassManager. Vous pouvez maintenant attribuer en toute sécurité votre proprePassManagerà ce champ. Auparavant, vous ne pouviez qu'ajouter au fichierPassManager. -
La valeur par défaut de l'argument
generate_routing_passmanager()seed_transpilerest passée deNoneà-1. Cette modification a été apportée parce que cet indicateur n'était utilisé que pour configurer la passe de transpilationVF2PostLayoutet pour cette passe, la randomisation dégrade généralement les performances et n'est pas souhaitable. Si vous vous êtes fié à la valeur par défaut précédente, vous pouvez rétablir ce comportement en définissant explicitement l'argumentseed_transpiler=None. Si vous définissez explicitement une valeur d'amorçage pour ce paramètre, il n'y a pas de changement de comportement.
Notes de mise à niveau de la visualisation
-
Le paramètre
idle_wiresde tous les tiroirs de circuits a été complété par une nouvelle option,"auto", qui est désormais le comportement par défaut. Si vous souhaitez toujours afficher les fils sans instructions, définissez explicitementidle_wires=True.Lorsqu'il est réglé sur
"auto", le comportement est le suivant :- Si le circuit a un attribut
.layoutdéfini,idle_wiresest automatiquement mis àFalse(dissimulation des fils inactifs) - Sinon,
idle_wiresresteTrue(montrant tous les fils, comme c'était le cas par défaut auparavant)
L'exemple suivant montre un circuit sans schéma affiché à l'aide de
idle_wires="auto":qr_0: ──────── ┌───┐┌─┐ qr_1: ┤ H ├┤M├ └───┘└╥┘ cr_0: ══════╬═ ║ cr_1: ══════╩═Une fois la disposition appliquée,
idle_wires="auto"relieidle_wiresàFalse, cachant ainsi les fils inutilisés :┌───┐┌─┐ qr_1 -> 1 ┤ H ├┤M├ └───┘└╥┘ cr_1: ══════╩═Si vous souhaitez afficher tous les fils d'un circuit, définissez explicitement
idle_wires=True:qr_0 -> 0 ──────── ┌───┐┌─┐ qr_1 -> 1 ┤ H ├┤M├ └───┘└╥┘ ancilla_0 -> 2 ──────╫─ ║ cr_0: ══════╬═ ║ cr_1: ══════╩═Au fur et à mesure que les ordinateurs quantiques s'étendent à un plus grand nombre de qubits, même les petits circuits peuvent produire de grandes représentations de circuits après transpilation. Le paramètre
"auto"permet d'améliorer la lisibilité en masquant les fils inutiles dans la mesure du possible. - Si le circuit a un attribut
-
La fonction
array_to_latex()la fonction et la méthodeOperator.draw()peut désormais lever une exceptionMissingOptionalLibrarysi la bibliothèquesympyn'est pas installée. Dans les versions de Qiskit v1.x,symengineetsympyétaient toujours garantis d'être installés, mais à partir de v2.0.0, ce n'est plus une exigence absolue. La visualisation d'une matrice à l'aide de LaTeX repose sur la bibliothèquesympy. Si vous utilisez cette fonctionnalité, assurez-vous quesympyest installé. -
En raison de la suppression du modèle
BackendV1, le modèleplot_gate_map(),plot_error_map()etplot_circuit_layout()n'acceptent plus les entrées de typeBackendV1dans leur argument d'entréebackend. -
Le tiroir de la ligne du temps exige désormais que l'argument
targetsoit spécifié lors de l'appel. Comme les instructions ne contiennent plus d'attributs de durée, cet argument supplémentaire est nécessaire pour spécifier les durées pour toutes les instructions prises en charge. Sans l'argument, le tiroir chronologique n'a pas accès à ces informations. -
Dans le cadre de la suppression de Pulse dans Qiskit 2.0, la prise en charge du dessin des impulsions via
qiskit.visualization.pulse_drawera été supprimée.
Divers. Mise à niveau
-
Les décorateurs
deprecate_functionetdeprecate_arguments, dépréciés depuis Qiskit v0.24 (mai 2023), ont été supprimés dans Qiskit v2.0.0. L'actueldeprecate_func()remplace@deprecate_functionet le courantdeprecate_arg()remplace@deprecate_arguments. -
La fonction
assembleet les capacités associées (contenues dans le moduleassembler) ont été supprimées de la base de code suite à leur dépréciation dans Qiskit v1.2.assemblea été utilisé pour générer unQobjdans le contexte du flux de travailBackendV1, qui est obsolète. La conversion n'est plus nécessaire, car le pipeline de transpilation et de primitives traite directement les circuits quantiques, ce qui rend le siteQobjobsolète.La suppression comprend les composants API publics suivants :
qiskit.compiler.assemblefonctionqiskit.assembler.assemble_circuitsfonctionqiskit.assembler.assemble_schedulesfonctionqiskit.assembler.disassemblefonctionqiskit.assembler.RunConfigClasseqiskit.circuit.Instruction.assembleméthode
-
La structure
Qobjet les classes associées, obsolètes dans Qiskit v1.2.0, ont été supprimées. Ils ont été introduits dans le cadre du flux de travailBackendV1et ne sont plus nécessaires pour interagir avec lesBackendV2. Ils ne sont plus nécessaires pour interagir avec les backends. Cette suppression concerne les classes suivantes :QobjExperimentHeaderQobjHeaderQasmQobjQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmExperimentCalibrationsGateCalibrationPulseQobjPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItem
-
Les classes
MeasLeveletMeasReturnType, précédemment définies dansqobj/utils.py, ont été transférées dansresult/models.pysuite à la suppression du moduleqobj. Ces classes ne faisaient pas partie de l'API publique. Le chemin d'importation a été mis à jour de :from qiskit.qobj.utils import MeasLevel, MeasReturnTypeà :from qiskit.result import MeasLevel, MeasReturnType. -
L'utilisation d'arguments positionnels dans le constructeur de
Resulta été désactivée. Veuillez définir tous les arguments en utilisant la syntaxe kwarg, c'est-à-dire :Result(backend_name="name", ....). En outre, l'argumentqobj_idne sera plus utilisé dans la construction desResultinternes. Il est toujours possible de définirqobj_idcomme un kwarg générique, qui se retrouvera dans le champ des métadonnées avec les autres kwargs génériques. -
Dans le cadre de la suppression des impulsions dans Qiskit 2.0.0, les fonctions
sequenceetschedule_circuitdeqiskit.schedulerainsi que la classeScheduleConfigont été supprimées. -
Le module
qiskit.result.mitigationa été supprimé suite à sa dépréciation dans Qiskit v1.3. La suppression comprend les classesLocalReadoutMitigatoretCorrelatedReadoutMitigatorainsi que les utilitaires associés. Il n'y a pas de chemin alternatif dans Qiskit, car leur fonctionnalité a été remplacée par l'addon`mthree. <https://github.com/Qiskit/qiskit-addon-mthree> `__
Circuits obsolètes
-
L'attribut
QuantumCircuit.durationn'a pas été supprimé dans cette version comme prévu initialement. Il sera supprimé dans le cadre de la version de Qiskit v3.0.0. Cette fonctionnalité a été remplacée par la méthodeQuantumCircuit.estimate_duration()qui doit être utilisée à la place. -
L'interface de type tuple pour
CircuitInstructionn'a pas été supprimée dans cette version comme prévu initialement. Il sera supprimé dans Qiskit v3.0.0 à la place. Au lieu de cela, utilisez l'optionoperation,qubits, etclbitsles attributs nommés. -
La classe de circuit "Multiple-Control-Multiple-Target"
MCMTest désormais obsolète et a été remplacée parMCMTGatequi est une sous-classeGatesous-classe. L'utilisation d'une porte au lieu d'un circuit permet au compilateur de raisonner sur l'objet à un niveau d'abstraction plus élevé et permet d'appliquer plusieurs modules de synthèse.
Dépréciations du transcompilateur
-
L'attribut
DAGCircuit.durationn'a pas été supprimé dans cette version comme prévu initialement. Il sera supprimé dans le cadre de la version de Qiskit v3.0.0. Cette fonctionnalité a été remplacée par la méthodeQuantumCircuit.estimate_duration()qui doit être utilisée à la place. -
L'argument
propagate_conditiondeDAGCircuit.substitute_node()etDAGCircuit.substitute_node_with_dag()a été déprécié. Avec la suppression deInstruction.conditiondu modèle de données Qiskit, cette option n'a plus de raison d'être. S'il est activé, il n'a plus d'effet. Il n'est pas supprimé de la signature afin de maintenir la compatibilité lors de la migration de Qiskit 1.x -> 2.0. Cette option sera supprimée dans Qiskit 3.0. -
La fonction
generate_pre_op_passmanager()est obsolète. Il n'est plus utilisé dans les gestionnaires de presets de Qiskit, et sa fonction est obsolète; il générait à l'origine une étape de correction pour les plugins de traduction qui ne respectaient pas la directionnalité de l'ISA. Les étapes de traduction sont désormais tenues de respecter la directionnalité, de sorte que la fonctionnalité n'est pas nécessaire et que, très probablement, aucun remplacement n'est requis.
Problèmes de sécurité
- Correction d'une faille de sécurité dans
qpy.load()lors du chargement de charges utiles qui utilisentsympypour sérialiser des objets et autres expressions symboliquesParameterExpressiondes objets et d'autres expressions symboliques. Cela inclut potentiellement toute charge utile QPY utilisant la version QPY < 10, et éventuellement 10, 11 et 12 en fonction de l'encodage symbolique utilisé dans l'étape de sérialisation (qpy.dump()).
Corrections des erreurs
-
Correction d'une incohérence dans le processus de transpilation lors de la manipulation de portes proches de l'identité, où ces portes étaient évaluées pour commuer avec tout par
CommutationAnalysismais non supprimées parRemoveIdentityEquivalent. Le problème sous-jacent a été causé parRemoveIdentityEquivalentetCommutationAnalysis(et, par extension,CommutativeInverseCancellation) utilisant des métriques différentes. Tous deux utilisent désormais la fidélité moyenne des portes et le même seuil pour déterminer si une porte doit être traitée comme une identité (par exemple, une porte de rotation avec un angle très faible). Voir la documentation de ces classes pour plus d'informations. Correction #13547. -
Correction d'un bogue dans
QuantumCircuit.assign_parameters()qui survenait lors de l'affectation de paramètres à des portes standard dont la définition avait déjà été déclenchée. Dans ce cas, les nouvelles valeurs n'ont pas été correctement propagées dans les instances de la porte. Alors que le circuit lui-même était toujours compilé comme prévu, l'inspection des opérations individuelles montrait toujours l'ancien paramètre.Par exemple :
from qiskit.circuit.library import EfficientSU2 circuit = EfficientSU2(2, flatten=True) circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True) print(circuit.data[0].operation.params) # would print θ[0] instead of 1.25Correction #13478.
-
Correction d'un bug dans
DAGCircuitqui faisait que les nœuds de sortieVardevenaient des nœuds d'entrée pendantdeepcopyet le décapage. -
Correction d'un oubli dans la classe
Targetoù la définition d'une nouvelle valeur pour l'attributdtet l'appel ultérieur àtarget.durations()n'affichaient pas la valeur mise à jour dedtdans l'objet retournéInstructionDurationsretourné. Ce problème est désormais corrigé par l'invalidation du cache interne des durées d'instruction cible dans l'outil de configurationdt. -
Correction d'un problème dans la passe de
BasisTranslatoroù la phase globale du DAG n'était pas mise à jour correctement. Correction #14074. -
Correction d'un bug dans la passe
HighLevelSynthesisqui synthétisait toute instruction pour laquelle un greffon de synthèse est disponible, que l'instruction soit déjà supportée par la cible ou qu'elle fasse partie de l'instruction explicitement passéebasis_gates. Ce comportement est désormais corrigé, de sorte que ces instructions déjà prises en charge ne sont plus synthétisées. -
La passe de transpilation
InverseCancellations'exécute désormais à l'intérieur de blocs de flux de contrôle. Auparavant, il ignorait les paires de portes qui pouvaient être annulées lorsqu'elles étaient définies dans des blocs classiques. Voir #13437 pour plus de détails. -
Correction d'un bug avec les rotations multi-contrôlées où l'angle de rotation était un
ParameterExpression. Une tentative de synthèse dans ce cas entraînerait une erreur indiquant que la porte ne peut pas être synthétisée avec un paramètre non lié. Ce bogue affectait les méthodes de circuits de rotation multicontrôlésQuantumCircuit.mcrx(), :meth:.QuantumCircuit.mcry, etQuantumCircuit.mcrz()ainsi que lors de l'appel deRXGate.control(),RYGate.control()ouRZGate.control()lorsque l'angle de rotation était unParameterExpression. Désormais, ces circuits de rotation multicontrôlés peuvent être synthétisés sans soulever d'erreur. -
Correction d'un bogue dans QPY (
qiskit.qpy) où les circuits contenant des portes de classeMCMTGatene parvenaient pas à se sérialiser. Voir #13965. -
Correction d'un bogue qui faisait que
Statevector.expectation_value()de produire des résultats incorrects pour l'opérateur d'identité lorsque le vecteur d'état n'était pas normalisé. Corrigé #13029 -
La conversion d'un circuit quantique en une porte avec
converters.circuit_to_instruction()échoue désormais correctement lorsque le circuit donné contient des instructions de flux de contrôle. -
Appeler un
AnalysisPassou unTransformationPasscomme une fonction (comme danspass_ = MyPass(); pass_(qc)) respectera désormais toutes les exigences que la passe pourrait avoir. Par exemple, les passes de programmation telles queALAPScheduleAnalysisexige queTimeUnitConversions'exécute avant elles. L'exécution de la passe à l'aide d'unPassManagera toujours respecté cette exigence, mais jusqu'à présent, elle n'était pas respectée lors de l'appel direct de la passe. -
Lorsqu'une
TranspilerErrorest levée par une passe à l'intérieur d'un appel àPassManger.run(), l'exception sera désormais propagée sans perte, plutôt que de devenir une exception chaînée avec un type effacé. -
SabreSwapne contractera plus les fils de qubits inactifs hors des blocs de flux de contrôle pendant le routage. Il s'agit généralement d'une optimisation valable, mais qui n'est pas un effet secondaire attendu d'une passe de routage. Vous pouvez maintenant utiliser la passeContractIdleWiresInControlFlowpour effectuer cette contraction. -
Correction d'un non-déterminisme basé sur un processus dans
SparsePauliOp.to_matrix. L'ordre exact des opérations en virgule flottante dans la sommation variait auparavant en fonction du processus, mais il sera désormais identique entre les différentes invocations du même script. Voir #13413.