Notes de publication de Qiskit 0.43
0.43.3
Terra 0.24.2
Prélude
Qiskit Terra 0.24.2 est une version de correction de bugs, adressant quelques problèmes mineurs identifiés depuis la version 0.24.1.
Mise à niveau
- La version du format QPY émise par
dumpest passée à 8. Cette nouvelle version du format ajoute la prise en charge de la sérialisation de l'attributQuantumCircuit.layoutattribut.
Corrections des erreurs
-
Correction de la désérialisation des instances
DiagonalGatepar l'intermédiaire de QPY. Corrigé #10364 -
Correction d'un problème avec la fonction
qs_decomposition(), qui effectue la décomposition quantique de Shannon, lorsqu'elle était appelée sur des unitaires numériques triviaux qui ne bénéficient pas de cette décomposition, une erreur inattendue était soulevée. Cette erreur a été corrigée de manière à ce que de telles unités soient détectées et que le circuit équivalent soit renvoyé. Corrigé #10036 -
Correction d'un problème dans la classe
BasicSwapqui empêchait la méthodeBasicSwap.run()de fonctionner si l'argument du mot-cléfake_runétait défini surTruelors de l'instanciation de la classe. Corrigé #10147 -
Correction d'un problème de copie de circuits avec les nouveaux styles
ClbitetQubit(bits sans registres) où les références à ces bits depuis le circuit contenant pouvaient être cassées, causant des problèmes avec la sérialisation et la visualisation du circuit. Corrigé #10409 -
La passe de
CheckMapne génère plus d'erreurs intempestives lorsqu'il traite des structures conditionnelles imbriquées créées par l'interface du constructeur de flux de contrôle. Voir #10394. -
Correction d'une défaillance du Pulse Builder lorsque le contexte est initialisé avec
BackendV2. -
Fixe la sortie de l'impulsion
measure()etmeasure_all()lorsque des fonctions sont appelées avec le backendBackendV2. -
Fixe les dimensions de la matrice de densité de sortie de
DensityMatrix.partial_transpose()afin qu'elles correspondent aux dimensions de la matrice de densité d'entrée correspondante. -
L'importation
qiskit.primitivesne provoquera plus d'avertissements de dépréciation provenant du module dépréciéqiskit.opflow. Ces avertissements auraient été cachés aux utilisateurs par les filtres par défaut de Python, mais ils ont déclenché l'importation anticipée deopflowce qui signifie qu'une importation ultérieure par un utilisateur ne déclencherait pas les avertissements. Corrigé #10245 -
Correction de la sortie de OpenQASM 2 de
QuantumCircuit.qasm()lorsqu'un objet de porte personnalisé contenait une porte portant le même nom. Idéalement, cela ne devrait pas se produire pour la plupart des portes, mais des opérations algorithmiques complexes telles que la classeGroverOperatorpourraient produire de telles structures accidentellement. Voir #10162. -
Correction d'une régression dans le tiroir LaTeX de
QuantumCircuit.draw()lorsque les fichiers temporaires sont placés sur un système de fichiers différent du répertoire de travail. Voir #10211. -
Correction d'un problème avec
UnitarySynthesislors de l'utilisation du paramètretarget, où les circuits avec flux de contrôle n'étaient pas correctement mappés à la cible. -
Correction d'un bug dans
VQDoùresult.optimal_valuesétait une copie deresult.optimal_points. Il renvoie maintenant les valeurs correspondantes. Corrigé #10263 -
Amélioration des messages d'erreur renvoyés lorsqu'une tentative de conversion d'une expression entièrement liée
ParameterExpressionenfloatouintéchouait, par exemple parce que l'expression était naturellement un nombre complexe. Corrigé #9187 -
Fixed
floatconversions pour les valeursParameterExpressionqui avaient, à un moment donné de leur construction, une composante imaginaire qui avait été annulée par la suite. Lorsque Sympy est utilisé comme backend, ces conversions ont généralement déjà fonctionné. Lorsque l'on utilise Symengine comme backend, ces conversions échouent souvent avec des erreurs de type, bien que le résultat ait été évalué symboliquement comme étant réel, et queParameterExpression.is_real()soit vrai. Corrigé #10191 -
Correction de la
qpysérialisation deQuantumCircuit.layoutattribue. Auparavant, l'attributlayoutétait supprimé lors de la sérialisation d'un circuit en QPY. Corrigé #10112
Aer 0.12.2
Prélude
Qiskit Aer 0.12.2 est la deuxième version du correctif de 0.12.0. Ceci corrige quelques bogues qui ont été découverts depuis la publication de 0.12.1.
Mise à niveau
-
Qiskit Aer requiert désormais la version CUDA du simulateur GPU à 11.2 ou plus. Auparavant, CUDA 10.1 était la version minimale prise en charge. Cette modification était nécessaire en raison des changements intervenus dans l'écosystème CUDA en amont, notamment en ce qui concerne la prise en charge de cuQuantum. Pour aider les utilisateurs qui utilisent différentes versions de CUDA, un paquet séparé est désormais disponible pour CUDA 11 :
qiskit-aer-gpu-cu11. L'utilisation du paquetqiskit-aer-gpunécessite désormais CUDA 12. Si vous êtes un utilisateur existant du paquetageqiskit-aer-gpuet que vous souhaitez utiliser CUDA 11, vous devez exécuter :pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11pour passer des versions du package
qiskit-aer-gpuprécédemment compatibles avec CUDA 10.x à la mise à niveau vers le nouveau package compatible avec CUDA 11. Si vous utilisez déjà CUDA 12 en local, vous pouvez mettre à jour le paquetageqiskit-aer-gpucomme d'habitude.
Corrections des erreurs
-
Si un circuit a des paramètres conditionnels et des paramètres, le circuit n'a pas été correctement simulé parce que les liaisons de paramètres d'Aer ont utilisé des positions erronées pour appliquer les paramètres. Ceci est dû à un manque de prise en compte des opérations bfunc injectées par le conditionnel. Avec cette validation, les paramètres sont réglés sur des positions correctes en tenant compte des opérations bfun injectées.
-
Les paramètres des phases globales n'étaient pas correctement définis dans le #1814. https://github.com/Qiskit/qiskit-aer/pull/1814 Les valeurs des paramètres pour les phases globales étaient copiées dans un circuit modèle et non dans les circuits réels à simuler. Ce commit copie correctement les valeurs des paramètres dans les circuits à simuler.
-
Les résultats de
backend.run()n'étaient pas sérialisables parce qu'ils incluent lesAerCircuit. Ce commit rend les résultats sérialisables en supprimantAerCircuits des métadonnées. -
:meth :
QuantumCircuit.save_statevector()ne fonctionne pas si le circuit est généré à partir du texte OpenQASM3 parce que ses registres quantiques ont des instances de qubits dupliquées. Avec ce commit, :meth :QuantumCircuit.save_statevector()utilise :data :QuantumCircuit.qubitspour obtenir les qubits à sauvegarder.
IBM 0.20.2 du fournisseur Q
Aucune modification.
0.43.2
Pour rappel, l'inclusion de Qiskit Aer dans le paquet qiskit est obsolète. La prochaine version mineure de Qiskit Aer ( 0.13 ) ne sera incluse dans aucune version du paquetage qiskit , et vous devez immédiatement commencer à installer Aer séparément :
pip install qiskit-aeret l'importer en tant que :
import qiskit_aerÀ partir de Qiskit 0.44, la commande pip install qiskit n'installera plus Qiskit Aer, ni l'obsolète IBM Q Provider qui a déjà été remplacé par le nouveau IBM Provider.
Terra 0.24.1
Pas de modification
Aer 0.12.1
Prélude
Qiskit Aer 0.12.1 est la première version du correctif de 0.12.0. Ceci corrige quelques bogues qui ont été découverts depuis la publication de 0.12.0.
Problèmes connus
- Correction d'un bogue renvoyant des valeurs d'espérance erronées dans
Estimatorlorsqueabelian_grouping=True.
Mise à niveau
- Amélioration des performances lorsque les mêmes circuits et plusieurs paramètres sont transmis à
Estimatoravecapproximation=True.
Remarques concernant la dépréciation
- Les options de meth:~.AerSimulator.run doivent utiliser des types corrects.
Corrections des erreurs
-
La régression des performances due à l'introduction de
AER::Configest corrigée. Cette classe a de nombreux champs d'application, mais elle est fréquemment copiée sur le siteAER::Transpile::CircuitOptimization. À l'origine,json_t(ancienne classe de configuration) était également fréquemment copié, mais il comporte des entrées dans la plupart des cas et cette surcharge de copie n'est donc pas un problème. Avec cette correction,AER::Transpile::CircuitOptimizationne copie pasAER::Config. -
Lorsque les appels BLAS échouent, parce que les threads omp ne gèrent pas les exceptions, Aer se plante sans aucun message d'erreur. Ce correctif permet aux threads omp d'attraper correctement les exceptions et de les relancer en dehors des boucles omp.
-
Auparavant, les paramètres des portes ne sont pas validés en C++. Si les paramètres sont plus courts que prévu (en raison d'une porte personnalisée), des erreurs de segmentation sont générées. Ce commit ajoute des vérifications pour savoir si la longueur du paramètre est exprimée. Ce commit corrigera les problèmes rapportés dans #1612. https://github.com/Qiskit/qiskit-aer/issues/1612
-
Depuis 0.12.0, les valeurs des paramètres dans les circuits sont temporairement remplacées par des valeurs constantes et les valeurs des paramètres sont assignées dans la bibliothèque C++. Par conséquent, si l'option parameter_binds est spécifiée, le simulateur renvoie les résultats avec les valeurs constnat comme valeurs des paramètres. Avec ce commit, Aer lève une erreur si parameter_binds n'est pas spécifié alors que les circuits ont des paramètres.
-
Les appareils et méthodes disponibles ne sont plus demandés lors de l'importation d'Aer.
-
Auparavant,
AerSimulatormodifiait les métadonnées du circuit pour maintenir la cohérence entre l'entrée et la sortie de la simulation, ce qui avait pour effet secondaire d'entraîner une visualisation inattendue des métadonnées de l'application dans la simulation. Cette solution évite d'utiliser les métadonnées du circuit pour maintenir la cohérence en interne et fournit toujours une vue cohérente des métadonnées à l'application. -
Correction d'un bug où la variance des métadonnées dans EstimatorResult était complexe et renvoie maintenant des valeurs flottantes.
-
Correction d'une erreur de compilation de Qiskit Aer avec le support de cuQuautum (AER_ENABLE_CUQUANTUM=true). Ce changement n'affecte pas la construction des binaires pour le CPU et le GPU normal.
-
Correction d'un bogue dans
from_backend()qui provoquait une erreur lorsque le backend n'avait pas de valeurs T1 et T2 (c'est-à-dire None) pour un qubit dans ses propriétés de qubit. Ce commit met à jourNoiseModel.from_backend()etbasic_device_gate_errors()afin qu'ils ajoutent une identitéQuantumError(c'est-à-dire effectivement aucune erreur de relaxation thermique) à un qubit sans valeurs T1 et T2 pour toutes les portes agissant sur les qubits, y compris le qubit. Correction de #1779 et #1815. -
Correction d'un problème : même si le nombre de qubits est défini par une carte de couplage ou par la configuration d'un appareil, lorsque la méthode de simulation est configurée, le nombre de qubits est écrasé conformément à la méthode. Corrigé #1769
-
Il s'agit d'un correctif pour le chemin d'accès à la bibliothèque dans CMakeLists.txt pour cuQuantum SDK. Comme la dernière version de cuQuantum inclut les bibliothèques CUDA 11.x et 12.x, ce correctif utilise la version CUDA renvoyée par FindCUDA pour le chemin d'accès aux bibliothèques de cuQuantum et cuTENSOR.
-
Il s'agit d'un correctif pour les bibliothèques de liens statiques de cuQuantum lors de la construction avec CUQUANTUM_STATIC=true.
-
La parallélisation MPI n'a pas été activée car nous n'avons pas utilisé qobj. Ce correctif définit correctement le nombre de processus et le rang MPI.
-
AerCircuitest créé à partir d'un circuit en itérant ses opérations tout en sautant les instructions de barrière. Cependant, le fait de sauter des instructions de barrière entraîne des erreurs dans le positionnement des paramètres. Ce correctif ajoutebarrier()et maintient les liaisons de paramètres correctes. -
Aer supporte toujours Qobj comme argument de
run()bien qu'il ait été déprécié. Cependant, depuis 0.12.0, il échoue toujours si aucunrun_optionsn'est spécifié. Cette correction permet de simuler Qobj sansrun_options. -
Depuis 0.12.0,
AerConfigest utilisé pour la configuration de la simulation tout en effectuant une vérification stricte du type des arguments de meth:~.AerSimulator.run. Ce commit ajoute le casting si les types d'arguments ne sont pas attendus. -
:meth :
QuantumCircuit.initialize()avec une valeur int n'était pas traité correctement comme indiqué dans #1821 <https://github.com/Qiskit/qiskit-aer/issues/1821>. Ce commit permet une telle initialisation en décomposant les instructions initialize. -
QuantumCircuitprend en charge le paramétrage de sa phase globale. Cependant, Aer n'a pas autorisé ce type de paramétrage et a échoué lorsque le transpiler génère des phases globales paramétrées. Ce commit prend en charge la paramétrisation de global_phase et résout les problèmes liés à https://github.com/Qiskit/qiskit-aer/issues/1795, https://github.com/Qiskit/qiskit-aer/issues/1781, et https://github.com/Qiskit/qiskit-aer/issues/1798. -
Aer utilisera désormais
omp_set_max_active_levels()au lieu de l'ancienomp_set_nested()lorsqu'il sera compilé avec des versions récentes de OpenMP.
IBM 0.20.2 du fournisseur Q
Aucune modification.
0.43.1
Terra 0.24.1
Prélude
Qiskit Terra 0.24.1 est la première version du correctif de 0.24.0. Ceci corrige quelques bogues qui ont été découverts depuis la publication de 0.24.0.
Mise à niveau
- Modifié
QuantumCircuit.assign_parameters()pour lier les valeurs entières et flottantes assignées directement dans les paramètres des instances deInstructiondans le circuit plutôt que de lier les valeurs enveloppées dans une instanceParameterExpression. Ce changement devrait avoir peu d'impact sur l'utilisateur, carfloat(QuantumCircuit.data[i].operation.params[j])produit toujours unfloat(et est le seul moyen d'accéder à la valeur d'une variableParameterExpression). De plus,Instruction()peuvent déjà êtrefloatainsi que aParameterExpressionde sorte que le code traitant des paramètres d'instruction devrait déjà gérer les deux cas. L'impact le plus probable sur l'utilisateur se trouve dans le code qui utiliseisinstancepour vérifier la présence deParameterExpressionet qui se comporte différemment en fonction du résultat. De plus, qpy sérialise la valeur numérique dans un boundParameterExpressionavec une précision différente de celle d'unfloat(voir aussi la note de correction de bogue concernantQuantumCircuit.assign_parameters()).
Corrections des erreurs
-
Mise à jour
plot_gate_map(),plot_error_map()etplot_circuit_layout()pour prendre en charge les cartes de couplage lourd-hex de 433 qubits. Cela permet de coupler des visualisations de cartes pour le backendibm_seattlede IBM Quantum. -
Modification de la liaison des valeurs numériques avec
QuantumCircuit.assign_parameters()afin d'éviter un décalage entre les valeurs des paramètres d'instruction du circuit et les clés de paramètres correspondantes dans le dictionnaire d'étalonnage du circuit. Correction de #9764 et #10166. Voir également la note de mise à jour concernantQuantumCircuit.assign_parameters(). -
Correction d'un bogue dans
BlockCollapseroù les bits classiques étaient ignorés lors de l'effondrement d'un bloc de nœuds. -
Correction d'un bug dans
replace_block_with_op()etreplace_block_with_op()qui conduisait à ignorer les bits classiques. -
Correction d'un bogue dans
QuantumCircuit.compose()où l'attributSwitchCaseOp.targetdans le sous-circuit n'était pas correctement mappé à un registre dans le circuit de base. -
Correction d'un bug dans
RZXCalibrationBuilderoù l'appel à l'étalonnage avec des paramètres erronés provoquait un crash au lieu de soulever une exception. -
Correction d'un problème avec la méthode
BooleanExpression.from_dimacs_file()où le type d'exception levé lorsque tweedledum n'était pas installé n'était pas le type attenduMissingOptionalLibrary. Corrigé #10079 -
L'utilisation de
initial_layoutdans les appels àtranspile()n'entraînera plus d'erreur si le circuit contient des qubits qui ne se trouvent dans aucun registre, ou des qubits qui existent dans plus d'un registre. Voir #10125. -
Correction de la décomposition des portes de rotation Z multi-contrôlées ajoutées via
QuantumCircuit.mcrz(). Auparavant, cette méthode mettait en œuvre une porte de phase multicommandée, qui présente une différence de phase relative par rapport à la rotation Z. Pour obtenir le comportement précédentQuantumCircuit.mcrz()le comportement précédent, utilisezQuantumCircuit.mcp(). -
Correction d'un problème avec le constructeur
PassManagerConfig.from_backend()lors de la construction d'un objetPassManagerConfigà partir d'une instanceBackendV1qui n'avait pas d'attribut de carte de couplage défini. Auparavant, le constructeur créait incorrectement un objetCouplingMapavec 0 qubit au lieu d'utiliserNone. Corrigé #10171 -
Corrige un bogue introduit dans Qiskit 0.24.0 où les angles de rotation numériques n'étaient plus remplacés par des angles symboliques avant la préparation de la synthèse à deux qubits. Une exception a été levée car les routines de synthèse nécessitent des matrices numériques.
-
Correction d'un bogue dans lequel l'exécution de
Optimize1qGatesDecompositionen parallèle provoquait une erreur due au fait que OneQubitGateErrorMap n'était pas sélectionnable. -
Correction d'un bogue dans les
VF2LayoutetVF2PostLayoutoù les passes ne tenaient pas compte de la composante d'erreur de 1 qubit lors de l'évaluation d'une disposition potentielle.
Aer 0.12.0
Pas de modification
IBM 0.20.2 du fournisseur Q
Pas de modification
0.43.0
Terra 0.24.0
Prélude
Il s'agit d'une version majeure qui comprend de nombreuses nouvelles fonctionnalités et corrections de bogues.
Cette version est la dernière à prendre en charge l'exécution de Qiskit avec Python 3.7. À partir de la prochaine version mineure, Python >= 3.8 sera nécessaire pour faire fonctionner Qiskit.
Les points forts de cette version :
QuantumInstance, OpFlow, et abandon de l'utilisation des algorithmes
Cette version met officiellement au rancart la classe QuantumInstance (et ses méthodes et classes d'aide associées), le module qiskit.opflow et toute utilisation de ceux-ci dans qiskit.algorithms. Cette dépréciation est le fruit d'un long travail qui a débuté à Qiskit Terra 0.21.0 pour refondre le module qiskit.algorithms pour qu'il soit basé sur le module de calcul primitives. Il existe des guides de migration associés pour tous les utilisateurs existants qui doivent migrer vers le nouveau flux de travail :
QuantumInstanceguide de la migration : https://qisk.it/qi \MigrationOpflowguide de la migration : https://qisk.it/opflow \Migration- Guide de migration des algorithmes : https://qisk.it/algo _migration
OpenQASM2 améliorations
Cette version inclut une refonte majeure du support de OpenQASM 2.0 dans Qiskit. Le premier changement est l'introduction d'un nouvel analyseur pour OpenQASM 2.0 dans le module qiskit.qasm2 dans le module Ce nouveau module remplace le module qiskit.qasm existant. Le nouvel analyseur est plus explicite et plus correct en ce qui concerne la spécification du langage. Il est également implémenté en Rust et est significativement plus rapide que l'analyseur précédent. Associé au nouvel analyseur syntaxique, l'exportateur OpenQASM 2.0 a fait l'objet d'un important remaniement qui a permis d'améliorer l'exactitude de la sortie lors de l'utilisation de la méthode QuantumCircuit.qasm() pour générer une sortie QASM à partir d'un objet QuantumCircuit d'un objet.
Prise en charge du transpilateur pour les appareils avec connectivité disjointe
Le transpileur prend désormais en charge le ciblage des backends avec une connectivité disjointe. Auparavant, le transpileur ne prenait en charge que les backends entièrement connectés (où il existe un chemin pour exécuter des opérations entre toutes les paires de qubits dans le backend). Maintenant, si un backend a une connectivité déconnectée, le transpileur est capable de raisonner sur la façon d'appliquer la mise en page (étape de mise en page ) et le routage (étape de routage) pour le backend. Si le circuit d'entrée ne peut pas être exécuté sur le matériel en raison du manque de connectivité entre les composants connectés, une erreur descriptive sera renvoyée.
Par exemple, le dispositif Heron décrit dans la feuille de route matérielle de IBM Quantum décrit un futur backend qui disposera d'un matériel de contrôle partagé et d'une communication classique en temps réel entre des processeurs quantiques distincts. Ce soutien permet à l Target de modéliser avec précision ces types d'appareils futurs ou d'autres matériels présentant des contraintes similaires.
Fonctionnement de l'interrupteur
Cette version ajoute une nouvelle opération de flux de contrôle, l'instruction switch. Ceci est mis en œuvre en utilisant une nouvelle classe d'opération SwitchCaseOp et la méthode QuantumCircuit.switch() méthode. Cela permet d'activer une entrée numérique (telle qu'un registre classique ou un bit) et d'exécuter le circuit correspondant à la valeur correspondante.
Nouvelles fonctions
-
Ajout des fonctions
add_deprecation_to_docstring(),deprecate_arg(), etdeprecate_func()au moduleqiskit.utilsmodule.add_deprecation_to_docstring()réécrira la docstring de la fonction pour inclure une directive Sphinx.. deprecated::afin que la dépréciation apparaisse dans les docs et avechelp(). Les décorateurs de dépréciation deqiskit.utilsappellentadd_deprecation_to_docstring()mais vous pouvez l'appeler directement si vous utilisez des mécanismes différents pour les dépréciations.@deprecate_funcremplace@deprecate_functionet est utilisé pour déprécier une fonction entière. Il générera automatiquement la plupart des messages de dépréciation pour vous.@deprecate_argremplace@deprecate_argumentset est utilisé pour déprécier un argument d'une fonction. Elle génère un message plus utile que la fonction précédente. Il est également plus flexible, par exemple il permet de définir unpredicateafin de ne déprécier que certaines situations, telles que l'utilisation d'une valeur ou d'un type de données dépréciés.
Fonctionnalités du transpilateur
-
Ajout d'une alternative pour spécifier dans
HLSConfigla liste des méthodes de synthèse utilisées pour un objet de haut niveau donné. Comme précédemment, une méthode de synthèse peut être spécifiée sous la forme d'un tuple composé du nom de la méthode et d'arguments supplémentaires. En outre, une méthode de synthèse peut être spécifiée sous la forme d'un tuple composé d'une instance deHighLevelSynthesisPluginet d'arguments supplémentaires. De plus, en l'absence d'arguments supplémentaires, une méthode de synthèse peut être spécifiée simplement par son nom ou par une instance deHighLevelSynthesisPlugin. L'exemple suivant illustre la nouvelle fonctionnalité :from qiskit import QuantumCircuit from qiskit.circuit.library.generalized_gates import PermutationGate from qiskit.transpiler import PassManager from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis from qiskit.transpiler.passes.synthesis.high_level_synthesis import ACGSynthesisPermutation qc = QuantumCircuit(6) qc.append(PermutationGate([1, 2, 3, 0]), [1, 2, 3, 4]) # All of the ways to specify hls_config are equivalent hls_config = HLSConfig(permutation=[("acg", {})]) hls_config = HLSConfig(permutation=["acg"]) hls_config = HLSConfig(permutation=[(ACGSynthesisPermutation(), {})]) hls_config = HLSConfig(permutation=[ACGSynthesisPermutation()]) # The hls_config can then be passed as an argument to HighLevelSynthesis pm = PassManager(HighLevelSynthesis(hls_config=hls_config)) qc_synthesized = pm.run(qc) -
Ajout d'un support à l'objet
CouplingMapd'avoir une connectivité disjointe. Auparavant, unCouplingMapne pouvait être construit que si le graphe était connecté. Cela permettra d'utiliserCouplingMappour représenter du matériel avec des qubits disjoints, comme du matériel avec des qubits sur plusieurs puces séparées. -
Ajout d'une nouvelle méthode
CouplingMap.connected_components()qui est utilisée pour obtenir une liste deCouplingMapsous-graphes composants pour un sous-graphe disjointCouplingMap. Si l'objetCouplingMapl'objet est connecté, il ne renverra qu'un seulCouplingMapéquivalent à l'original. -
Ajout de nouvelles règles au système intégré
EquivalenceLibraryintégrée :qiskit.circuit.equivalence_library.SessionEquivalenceLibrary. Les nouvelles règles ajoutées sont les suivantes -
Ajout de plugins de synthèse à haut niveau pour
LinearFunctionet pourqiskit.quantum_info.Cliffordétendant l'ensemble des méthodes de synthèse qui peuvent être appelées à partir de la passe deHighLevelSynthesistranspiler pass.Pour
LinearFunctionles plugins disponibles sont listés ci-dessous :Nom du plug-inPlugin de synthèse de haut niveaudefaultDefaultSynthesisLinearFunctionkmsKMSSynthesisLinearFunctionpmhPMHSynthesisLinearFunctionPour
qiskit.quantum_info.Cliffordles plugins disponibles sont listés ci-dessous :Nom du plug-inPlugin de synthèse de haut niveaudefaultDefaultSynthesisCliffordagAGSynthesisCliffordbmBMSynthesisCliffordgreedyGreedySynthesisCliffordlayersLayerSynthesisCliffordlnnLayerLnnSynthesisCliffordPour plus d'informations sur chaque méthode, veuillez vous référer à la documentation
qiskit.synthesispour plus d'informations sur chaque méthode.L'exemple suivant illustre quelques-uns des nouveaux plugins :
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import LinearFunction from qiskit.quantum_info import Clifford from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis # Create a quantum circuit with one linear function and one clifford qc1 = QuantumCircuit(3) qc1.cx(0, 1) qc1.swap(0, 2) lin_fun = LinearFunction(qc1) qc2 = QuantumCircuit(3) qc2.h(0) qc2.cx(0, 2) cliff = Clifford(qc2) qc = QuantumCircuit(4) qc.append(lin_fun, [0, 1, 2]) qc.append(cliff, [1, 2, 3]) # Choose synthesis methods that adhere to linear-nearest-neighbour connectivity hls_config = HLSConfig(linear_function=["kms"], clifford=["lnn"]) # Synthesize qct = HighLevelSynthesis(hls_config)(qc) print(qct.decompose()) -
Ajout d'une nouvelle passe de transpilateur,
MinimumPointqui est principalement utilisée comme passe pour vérifier une condition de boucle dans un fichierPassManager. Cette passe suivra l'état des champs de l'ensemble de propriétés au cours de ses exécutions passées et définira un champ booléen lorsqu'un point fixe est atteint sur la profondeur de retour en arrière ou en sélectionnant la valeur minimale trouvée si la profondeur de retour en arrière est atteinte. Il s'agit d'une alternative à la méthodeFixedPointqui vérifie simplement la présence d'une valeur fixe dans un champ d'un ensemble de propriétés entre les exécutions suivantes. -
Ajout d'une nouvelle méthode,
swap_nodes(), à la méthodeDAGCircuitpour permettre l'échange de nœuds partiellement connectés. L'expression "partiellement connecté" signifie que les deux nœuds partagent au moins une arête (qui représente un qubit ou un clbit). Si les nœuds ne partagent aucune arête, unDAGCircuitErrorest levé. -
Ajouter un nouvel algorithme de synthèse
synth_cz_depth_line_mr()d'un circuit CZ pour la connectivité linéaire du plus proche voisin (LNN) dans une profondeur de 2 qubits de 2n+2 en utilisant des portes CX et des portes de phase (S, Sdg ou Z). Le circuit synthétisé inverse l'ordre des qubits. L'algorithme de synthèse est basé sur l'article de Maslov et Roetteler ( https://arxiv.org/abs/1705.09176 ). -
Ajouter un nouvel algorithme de synthèse
synth_clifford_depth_lnn()d'un circuit de Clifford pour la connectivité LNN dans une profondeur de 2 qubits de 9n+4 (ce qui n'est pas encore optimal), en utilisant la synthèse de Clifford en couches (synth_clifford_layers()),synth_cnot_depth_line_kms()pour synthétiser la couche CX en profondeur 5n, etsynth_cz_depth_line_mr()pour synthétiser chacune des couches CZ à la profondeur 2n+2. Ce PR sera suivi d'un autre PR basé sur l'article récent de Maslov et Yang ( https://arxiv.org/abs/2210.16195 ), qui synthétise les couches CX-CZ à la profondeur 5n pour la connectivité LNN et effectue une optimisation supplémentaire, réduisant ainsi la profondeur d'un circuit de Clifford à 7n-4 pour la connectivité LNN. -
Les équivalences entre les rotations de Pauli contrôlées et les translations vers les rotations de deux Pauli sont désormais disponibles dans la bibliothèque d'équivalences pour les portes standard Qiskit. Cela permet, par exemple, de traduire un
CRZGateen unRZZGateplusRZGateou unCRYGateà un qubit simpleRZXGateplus des portes à qubit unique :from qiskit.circuit import QuantumCircuit from qiskit.compiler import transpile angle = 0.123 circuit = QuantumCircuit(2) circuit.cry(angle, 0, 1) basis = ["id", "sx", "x", "rz", "rzx"] transpiled = transpile(circuit, basis_gates=basis) print(transpiled.draw()) -
Ajout d'une nouvelle option,
copy_operations, àcircuit_to_dag()pour permettre de désactiver éventuellement la copie profonde des opérations de l'entréeQuantumCircuitvers la sortieQuantumCircuit. Dans les cas où l'entrée :class`~.QuantumCircuit` n'est plus utilisée après la conversion, cette copie profonde est une surcharge inutile, car les références partagées n'auraient pas d'effets secondaires indésirables potentiels si l'entréeQuantumCircuitest rejetée. -
Ajout d'une nouvelle option,
copy_operations, àdag_to_circuit()pour permettre de désactiver éventuellement la copie profonde des opérations de l'entréeDAGCircuitvers la sortieQuantumCircuit. Dans les cas où l'entréeDAGCircuitn'est plus utilisée après la conversion, cette copie profonde est une surcharge inutile, car les références partagées n'auraient pas d'effets secondaires indésirables potentiels si l'entréeDAGCircuitest rejetée. -
Ajout d'une nouvelle fonction
passmanager_stage_plugins()au moduleqiskit.transpiler.preset_passmanagers.pluginmodule. Cette fonction est utilisée pour obtenir une correspondance entre les noms des plugins et leur type de classe. Cela permet d'identifier et d'interroger n'importe quel gestionnaire de passage défini dans la documentation du plugin d'étape. Par exemple :>>> from qiskit.transpiler.preset_passmanagers.plugin import passmanager_stage_plugins >>> passmanager_stage_plugins('routing')['lookahead'].__class__ qiskit.transpiler.preset_passmanagers.builtin_plugins.LookaheadSwapPassManager >>> help(passmanager_stage_plugins('routing')['lookahead']) Help on BasicSwapPassManager in module qiskit.transpiler.preset_passmanagers.builtin_plugins object: class BasicSwapPassManager(qiskit.transpiler.preset_passmanagers.plugin.PassManagerStagePlugin) | Plugin class for routing stage with :class:`~.BasicSwap` ... -
La passe de transposition
Erroraccepte désormais également les entrées appelables pour son paramètremsg. Si elles sont utilisées, ces variables d'entrée se verront passer l'attributproperty_setde la passe et devraient renvoyer une chaîne qui sera utilisée pour le message d'erreur lors de l'exécution de la passe. Par exemple :from qiskit.transpiler.passes import Error def error_message(property_set): size = property_set["size'] return f"The circuit size is: {size}" error_pass = Error(error_message)Lorsque
error_passest inclus dans un gestionnaire de passe, l'erreur est signalée par le message"The circuit size is: n", oùnest la taille du circuit définie dans l'ensemble de propriétés (généralement lors de l'exécution précédente de la passe)Sizepasse). -
La méthode
build_coupling_map()comporte un nouveau mot-clé,filter_idle_qubits, qui, lorsqu'il est défini surTrue, supprime tous les qubits de la sortie qui ne supportent aucune opérationCouplingMapqui ne supportent aucune opération. -
La passe de
GateDirectionle transpileur peut désormais gérer correctement lesSwapGatequi peuvent être présentes dans le circuit lors de l'exécution sur un circuit. Dans ce cas, si les arguments des qubits de la porte de permutation se trouvent dans la direction non native d'un bord, la passe inversera l'ordre des arguments. -
Les
RZXCalibrationBuilderetRZXCalibrationBuilderNoEchoutilisent désormais correctement une porte d'enchevêtrementECRGatepour la porte d'enchevêtrement si la porte d'enchevêtrement native du backend estECRGate. Auparavant, les passes ne fonctionnaient correctement que si la porte d'enchevêtrement étaitCXGate. -
Ajout d'un nouveau constructeur pour la classe
Targetqui permet de construire unTarget.from_configuration()qui vous permet de construire un objetTargetà partir des différents types d'objets décrivant les contraintes d'un backend (par exemple, les portes de base),CouplingMap,BackendProperties, etc). Par exemple :target = Target.from_configuration( basis_gates=["u", "cx", "measure"], coupling_map=CouplingMap.from_line(25), )Cela permet de construire un objet
Targetqui aUGate,CXGate, etMeasuredisponibles globalement sur 25 qubits connectés en ligne. -
Ajout d'une nouvelle fonction
synth_cnot_phase_aam()qui est utilisée pour synthétiser des circuits en phase cnot pour des architectures all-to-all en utilisant la méthode Amy, Azimzadeh et Mosca. Cette fonction est identique à la fonctionqiskit.transpiler.synthesis.graysynth()disponible, mais elle porte un nom plus descriptif et est placée plus logiquement dans l'arborescence du paquet. Cette nouvelle fonction remplace l'ancienne fonction qui sera probablement supprimée dans une prochaine version. -
Les modifications internes apportées à l'algorithme de routage de
SabreSwaputilisées dans la transpilation de circuits non dynamiques à tous les niveaux d'optimisation non nuls, ont permis d'accélérer le routage pour les circuits de très grande taille. Par exemple, le temps nécessaire pour acheminer un circuit depth-5QuantumVolumepour une carte de couplage heavy-hex de 1081 qubits est approximativement divisé par deux. -
Les performances d'exécution de la passe de
Optimize1qGatesDecompositiona été considérablement améliorée. Pour ce faire, nous avons réécrit tous les calculs de la passe en rouille et réduit le nombre d'objets intermédiaires créés dans le cadre de l'exécution de la passe. Cela devrait également correspondre à une amélioration similaire des performances d'exécution detranspile()avec le mot-cléoptimization_levelfixé à1,2, ou3. -
Ajouter une nouvelle méthode de synthèse
synth_stabilizer_layers()d'un état stabilisateur en couches. Elle fournit une décomposition similaire à la synthèse décrite dans le lemme 8 de Bravyi et Maslov, ( arxiv:2003.09412 ) sans le sous-circuit initial sans Hadamard qui n'affecte pas l'état du stabilisateur. -
Ajouter une nouvelle méthode de synthèse
synth_stabilizer_lnn()d'un état stabilisateur pour la connectivité linéaire du plus proche voisin dans une profondeur de 2 qubits de 2n+2 et deux couches CX distinctes, en utilisant CX et des portes de phase (S, Sdg ou Z). L'algorithme de synthèse est basé sur l'article de Maslov et Roetteler ( https://arxiv.org/abs/1705.09176 ). -
La passe
SabreLayoutpermet maintenant d'utiliser une cible avec une ligne de commande disjointeCouplingMap. Lorsque l'on vise un couplage disjoint, l'entréeDAGCircuitest divisée en ses composantes connectées de qubits virtuels, chaque composante est mappée aux composantes connectées de l'entréeCouplingMapla mise en page est exécutée sur chaque composant connecté de manière isolée, puis toutes les mises en page sont combinées et renvoyées. Notez que lorsque l'argumentrouting_passest défini, la passe ne prend pas en charge l'exécution avec une connectivité disjointe. -
Les passes du transpondeur de mise en page et de routage suivantes, issues des modules
qiskit.transpiler.passesacceptent désormais un objetTargetutilisé pour modéliser les contraintes d'un backend cible via le premier argument de position (actuellement nommécoupling_mapoubackend_properties).La liste des passes avec la nouvelle prise en charge de
Targetsont les suivantes :CSPLayoutFullAncillaAllocationLayout2qDistanceNoiseAdaptiveLayoutSabreLayoutTrivialLayoutBasicSwapBIPMappingLayoutTransformationLookaheadSwapSabreSwapStochasticSwapCheckMap
-
La fonction d'aide à la construction du gestionnaire de passe
generate_embed_passmanager()acceptera désormais également unTargetcomme seul argument positionnel (actuellement nommécoupling_map). Ceci peut être utilisé pour construire une mise en page intégréePassManagerà partir d'unTargetau lieu d'un objetCouplingMap. -
Les passes suivantes du transpileur de mise en page et de routage des modules
qiskit.transpiler.passesont un nouveau mot-clé argument,targetqui prend en compte un objetTargetqui est utilisé pour modéliser les contraintes d'un backend cible. Si le mot-clétargetest spécifié, il sera utilisé comme source de vérité pour toutes les contraintes matérielles utilisées dans le fonctionnement de la passe de transposition. Il remplacera tout autre argument permettant de spécifier les contraintes matérielles, typiquement les arguments qui prennent une valeur deCouplingMap,InstructionScheduleMapou une liste de portes de base. La liste de ces passes avec le nouvel argumenttargetest la suivante : -
La fonction d'aide à la construction du gestionnaire de passe
generate_scheduling()possède un nouveau mot-clétargetqui est utilisé pour spécifier un objetTargetpour modéliser les contraintes du backend cible pour lequel il est compilé lors de la génération d'un nouveauPassManager. S'il est spécifié, ce nouvel argument remplacera l'autre argumentinst_map. -
Le plugin
defaultutilisé par la passeUnitarySynthesischoisit maintenant la synthèse unitaire à un ou deux qubits en se basant sur les taux d'erreur rapportés dans le fichierTarget. En particulier, il exécute toutes les méthodes de synthèse possibles prises en charge par le plugin et choisit l'option qui entraînera l'erreur la plus faible. Pour une décomposition d'un qubit, il peut s'agir d'une base de Pauli (par exemple RZ-RX-RZ ou RZ-RY-RZ), d'une base unitaire générique (par exemple U) et de quelques autres. Pour une décomposition de deux qubits, il peut s'agir de n'importe quelle base supercontrôlée (par exemple CNOT, iSWAP, B) ou de bases contrôlées multiples (par exemple CZ, CH, ZZ^.5, ZX^.2, etc.). -
L'interface pour
UnitarySynthesisPlugincomporte deux nouvelles propriétés optionnellessupports_gate_lengths_by_qubitetsupports_gate_errors_by_qubitqui, lorsqu'elles sont définies, ajoutent les champsgate_lengths_by_qubitetgate_errors_by_qubitrespectivement aux options d'entrée de la méthoderun()du plugin. Ces nouveaux champs constituent une autre vue des données fournies pargate_lengthsetgate_errors, mais ont la forme suivante :{(qubits,): [Gate, length]}(oùGateest l'instance deGatepour cette définition). Cela permet aux plugins de raisonner sur le travail avec des portes du même type, mais dont les paramètres sont différents. -
Ajout d'une nouvelle passe de transpilation,
UnrollForLoopsqui est utilisée pour dérouler toutes les opérationsForLoopOpdans un circuit. Cette passe déroule les boucles for lorsque c'est possible, s'il n'y a pas deContinueLoopOpouBreakLoopOpdans le bloc du corps de la boucle. Par exemple :from qiskit.transpiler.passes import UnrollForLoops from qiskit import QuantumCircuit unroll_pass = UnrollForLoops() qc = QuantumCircuit(1) # For loop over range 5 with qc.for_loop(range(5)) as i: qc.rx(i, 0) # Unroll loop into 5 rx gates unroll_pass(qc).draw("mpl")
-
Ajout d'un nouveau paramètre
max_trialsà transmettreVF2PostLayoutqui, lorsqu'il est spécifié, limite le nombre de modèles découverts et comparés lors de la recherche du meilleur modèle. Ce paramètre diffère des paramètres existantscall_limitettime_limit(qui sont utilisés pour limiter le nombre de visites d'état effectuées par l'algorithme VF2 et le temps total passé par passVF2PostLayout) en ce sens qu'il est utilisé pour fixer une limite supérieure au temps passé à évaluer les dispositions potentielles, ce qui peut s'avérer utile pour les appareils de grande taille. -
La passe
CheckMapdispose d'un nouveau mot-clé dans son constructeur,property_set_field. Cet argument peut être utilisé pour spécifier un champ de l'ensemble de propriétés dans lequel seront stockés les résultats de l'analyse. Auparavant, il n'était possible de stocker le résultat que dans le champ"is_swap_mapped"(par défaut). Cela vous permet de stocker le résultat de plusieurs instances de la passe dans un fichierPassManagerdans des champs différents.
Caractéristiques des circuits
-
Ajout d'une nouvelle classe de porte,
GlobalPhaseGatequi peut être utilisée pour ajouter une phase globale à l'instanceQuantumCircuitl'instance. -
Ajout d'un nouvel attribut,
layoutà la classeQuantumCircuitclasse. Cet attribut est généralement renseigné partranspile()ouPassManager.run()(lorsque l' étape de mise en page et l'étape de routage sont exécutées dans lePassManager) et contient unTranspileLayoutqui contient les informations sur la permutation du circuit d'entrée pendanttranspile(). -
Ajout d'un nouvel argument,
var_order, au constructeur de la classePhaseOraclepour permettre de définir l'ordre dans lequel les variables de l'expression logique sont prises en compte. Par exemple :from qiskit.tools.visualization import plot_histogram from qiskit.primitives import Sampler from qiskit.circuit.library import PhaseOracle from qiskit.algorithms import Grover, AmplificationProblem oracle = PhaseOracle('((A & C) | (B & D)) & ~(C & D)', var_order=['A', 'B', 'C', 'D']) problem = AmplificationProblem(oracle=oracle, is_good_state=oracle.evaluate_bitstring) grover = Grover(sampler=Sampler()) result = grover.amplify(problem) print(result.circuit_results[0]) -
Un nouvel analyseur OpenQASM 2 est disponible dans
qiskit.qasm2. Il y a deux points d'entrée :qasm2.load()etqasm2.loads()pour lire le code source à partir d'un fichier et d'une chaîne de caractères, respectivement :import qiskit.qasm2 program = """ OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; h q[0]; cx q[0], q[1]; """ bell = qiskit.qasm2.loads(program)Ce nouvel analyseur est environ 10x plus rapide que les analyseurs existants à
QuantumCircuit.from_qasm_file()etQuantumCircuit.from_qasm_str()pour les gros fichiers, et a également moins de frais généraux à chaque appel. Le nouvel analyseur est plus extensible, personnalisable et généralement plus sûr; il n'essaiera pas de produire des objets Qiskit personnalisés lorsque la définition dans le fichier OpenQASM 2 est en conflit avec l'objet Qiskit, contrairement à l'exportateur actuel. Voir la documentation duqiskit.qasm2pour plus de détails et d'exemples. -
Améliorer la décomposition des rotations Pauli-X et Pauli-Y multi-contrôlées avec
QuantumCircuit.mcrx()etQuantumCircuit.mcry on :math:`n()vers CX gates, pour . Cette amélioration est basée sur arXiv:2302.06377. -
Qiskit prend désormais en charge la représentation des déclarations
switch, en utilisant la nouvelle instructionSwitchCaseOpet la méthodeQuantumCircuit.switch()méthode. Cela permet d'activer une entrée numérique (telle qu'un registre classique ou un bit) et d'exécuter le circuit correspondant à la valeur correspondante. Plusieurs valeurs peuvent pointer vers le même circuit, etCASE_DEFAULTpeut être utilisé comme une étiquette qui correspond toujours.Vous pouvez également utiliser une interface de construction, similaire aux autres constructions de flux de contrôle, pour construire ces instructions de commutation :
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister qreg = QuantumRegister(2) creg = ClassicalRegister(2) qc = QuantumCircuit(qreg, creg) qc.h([0, 1]) qc.measure([0, 1], [0, 1]) with qc.switch(creg) as case: with case(0): # if the register is '00' qc.z(0) with case(1, 2): # if the register is '01' or '10' qc.cx(0, 1) with case(case.DEFAULT): # the default case qc.h(0)L'instruction
switchest supportée par l'ensemble de la pile du compilateur Qiskittranspile()qui la contiennent (si le backend annonce qu'il supporte cette construction), et elle sera sérialisée en QPY.La déclaration
switchn'est pas encore une fonctionnalité de OpenQASM 3, mais elle est en cours de conception et d'étude et devrait être adoptée dans un avenir proche. Qiskit Terra dispose d'un support expérimental pour exporter cette déclaration vers la syntaxe OpenQASM 3 proposée dans la pull request liée, en utilisant un drapeau de fonctionnalité expérimentale. Pour exporter un circuit d'étatswitch(tel que celui créé ci-dessus) vers OpenQASM 3 en utilisant ce support spéculatif, procédez comme suit :from qiskit import qasm3 qasm3.dumps(qc, experimental=qasm3.ExperimentalFeatures.SWITCH_CASE_V1)
Caractéristiques des algorithmes
-
Ajout d'un nouvel attribut
eigenvalue_thresholdà la classeAdaptVQEpour configurer un nouveau type de seuil qui met fin à l'algorithme lorsque la valeur propre change en deçà d'une valeur définie. -
Ajout d'un nouvel attribut
gradient_thresholdà la classeAdaptVQEqui remplacera à l'avenir l'attributthresholdà l'avenir. Ce nouvel attribut se comporte de la même manière que l'attributthresholdexistant, mais porte un nom plus précis, étant donné l'introduction d'options de seuil supplémentaires dans la classe. -
Ajout de l'attribut
EstimationProblem.has_good_statequi permet de vérifier si unEstimationProblempossède unEstimationProblem.is_good_stateou s'il s'agit de la valeur par défaut. Ceci est utile pour les vérifications dans les estimateurs d'amplitude, tels queAmplitudeEstimationqui ne prennent en charge que l'implémentation par défaut. -
Ajoute un drapeau
localà la classe de fidélité de l'étatComputeUncomputequi permet de calculer la fidélité locale, définie par la moyenne des projecteurs d'un seul qubit. -
Les classes de gradient réorganisent le résultat du gradient en fonction de l'ordre des paramètres d'entrée.
Exemple :
from qiskit.algorithms.gradients import ParamShiftEstimatorGradient from qiskit.circuit import QuantumCircuit, Parameter from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp # Create a circuit with a parameter p = {i: Parameter(f'p{i}') for i in range(3)} qc = QuantumCircuit(1) qc.rx(p[0], 0) qc.ry(p[1], 0) qc.rz(p[2], 0) op = SparsePauliOp.from_list([("Z", 1)]) param_values = [0.1, 0.2, 0.3] # Create a gradient object estimator = Estimator() grad = ParamShiftEstimatorGradient(estimator) result = grad.run(qc, op, [param_values]).result() # would produce a gradient of the form [df/dp0, df/dp1, df/dp2] result = grad.run(qc, op, [param_values], parameters=[[p[2], p[0]]]).result() # would produce a gradient of the form [df/dp2, df/dp0] -
Ajout de la prise en charge des hamiltoniens dépendant du temps (c'est-à-dire des opérateurs à paramétrage unique) dans la classe
TrotterQRTEclasse. Pour faciliter le travail, nous avons ajouté l'attributnum_timestepset un argument de mot-clé correspondant au constructeurTrotterQRTEpour contrôler le nombre de pas de temps pour diviser l'évolution complète. -
Ajout de la prise en charge des évaluations observables à chaque pas de temps pendant l'exécution de la
TrotterQRTEclasse. La fonctionTimeEvolutionProblem.aux_operatorsest évaluée à chaque pas de temps si l'attributProductFormula.repsde l'argument d'entréeproduct_formuladans le constructeur est fixé à 1. -
Ajout d'extensions à l'algorithme
VQDqui permettent de passer une liste d'optimiseurs et de points initiaux pour les différents cycles de minimisation. Par exemple, lek-th initial point et lek-th optimizer seront utilisés pour l'optimisation duk-1-th exicted state.
Caractéristiques de l'information quantique
-
Ajout de deux nouvelles méthodes de construction,
Clifford.from_matrix()etClifford.from_operator()qui créent un objetCliffordà partir de sa matrice unitaire et de sa représentation de l'opérateur, respectivement. -
Le constructeur de
Cliffordpeut maintenant prendre n'importe quel objet de porte de Clifford jusqu'à 3 qubits à condition qu'il implémente une méthodeto_matrix, y compris les portes paramétrées telles queRz(pi/2), qui n'étaient pas convertibles auparavant. -
Ajout de nouvelles fonctions utilitaires :
commutator(),anti_commutator(), etdouble_commutator()qui sont utilisées pour calculer les commutateurs de tout objet implémentant la classe de base abstraiteLinearOptelle queQuantumChannel,SparsePauliOp, ouScalarOp. -
Ajout de la méthode
StabilizerState.equiv, qui vérifie si les ensembles générateurs de deux états stabilisateurs génèrent le même groupe stabilisateur. Par exemple, le groupe stabilisateur de l'état de Bell à deux qubits contient les quatre éléments et peut donc être généré par , ou . -
Ajout d'une nouvelle méthode,
partial_transpose()à la méthodeqiskit.quantum_infoà la classeDensityMatrixdu module. Cette méthode est utilisée pour calculer la transposition partielle d'une matrice de densité, ce qui est nécessaire pour détecter l'intrication entre des systèmes quantiques bipartites. -
Ajout d'une méthode
qiskit.quantum_info.Operator.apply_permutation()qui pré-compose ou post-compose un opérateur avec une permutation. Cette méthode fonctionne pour les qubits généraux.Voici un exemple de calcul de qui réorganise les bits de l'opérateur :
import numpy as np from qiskit.quantum_info.operators import Operator op = Operator(np.array(range(576)).reshape((24, 24)), input_dims=(2, 3, 4), output_dims=(2, 3, 4)) perm = [1, 2, 0] inv_perm = [2, 0, 1] conjugate_op = op.apply_permutation(inv_perm, front=True).apply_permutation(perm, front=False)L'opérateur conjugué a les dimensions (4, 2, 3) x (4, 2, 3), ce qui est cohérent avec la permutation qui déplace le qutrit en position 0, le qubit en position 1, et le 4-qudit en position 2.
-
Soutenir de manière native la construction d'objets
SparsePauliOpobjets avecParameterExpressionsans nécessiter la construction explicite d'un tableau d'objets. Les éléments suivants sont désormais pris en charge :from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp x = Parameter("x") op = SparsePauliOp(["Z", "X"], coeffs=[1, x]) -
Ajout de la méthode
SparsePauliOp.assign_parameters()et l'attributSparsePauliOp.parameterspour assigner et interroger des paramètres non liés à l'intérieur d'un fichierSparsePauliOp. Cette fonction peut, par exemple, être utilisée comme suitfrom qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp x = Parameter("x") op = SparsePauliOp(["Z", "X"], coeffs=[1, x]) # free_params will be: ParameterView([x]) free_params = op.parameters # assign the value 2 to the parameter x bound = op.assign_parameters([2])
Fonctionnalités Pulse
-
Ajout de nouvelles classes
SymbolicPulseà la bibliothèque d'impulsions (qiskit.pulse.library) Les nouvelles impulsions dans la bibliothèque sont :Ces nouvelles classes sont des instances de
ScalableSymbolicPulse. À l'exception de la phaseSawtooth, le comportement est identique à celui de la fonction correspondante du générateur de forme d'onde (par ex.sin()). La phase de la classeSawtoothest définie de telle sorte qu'une phase de se décale d'un cycle complet. -
Ajout d'un support à QPY (
qiskit.qpy) pour travailler avec des instances de pulseScheduleBlockavec des références non assignées et la préservation de la structure de données pour la référence aux sous-programmes. Cette fonction permet aux utilisateurs de sérialiser et de désérialiser un modèle de programme d'impulsions pour des tâches telles que l'étalonnage des impulsions. Par exemple :from qiskit import pulse from qiskit import qpy with pulse.build() as schedule: pulse.reference("cr45p", "q0", "q1") pulse.reference("x", "q0") pulse.reference("cr45p", "q0", "q1") with open('template_ecr.qpy', 'wb') as fd: qpy.dump(schedule, fd) -
Une nouvelle méthode
CalibrationEntry.user_provided()a été ajoutée aux entrées d'étalonnage. Cette méthode peut être appelée pour vérifier si l'entrée est définie par un utilisateur final ou un backend. -
Ajout d'une nouvelle méthode
Target.get_calibration()qui permet d'accéder facilement à l'étalonnage d'une instruction dans un objetTargetcette méthode peut être appelée avec des paramètres args et kwargs, et elle renvoie un programme d'impulsions construit avec des paramètres lorsque l'étalonnage est modélisé avec des paramètres.
Fonctionnalités des fournisseurs
-
La classe
BackendV2Converterdispose d'un nouveau mot-clé,filter_faulty, dans son constructeur. Lorsque cet argument est défini àTrue, la classe de conversion filtrera tous les qubits ou opérations répertoriés comme non opérationnels dans la charge utile de l'entréeBackendPropertiespour l'entréeBackendV1. Bien qu'il ne soit pas très utilisé, un objetBackendPropertiespermet d'annoter les qubits et les portes comme étant non opérationnels. Auparavant, si un backend avait activé ce drapeau sur des qubits ou des portes, l'instance de sortieBackendV2et sesTargetincluaient toutes les opérations, qu'elles soient considérées comme opérationnelles ou non. En utilisant le nouveau drapeau, vous pouvez filtrer les qubits et les portes non opérationnels de la base de donnéesTarget. Lorsque le drapeau est activé, le backend de sortie sera toujours listé comme étant de pleine largeur (par exemple, un backend de 24 qubits avec 4 qubits listés comme non opérationnels indiquera toujours qu'il a 24 qubits), mais les qubits défectueux n'auront pas d'opérations listées comme étant supportées dans le fichierTarget. -
La classe
Optionsmet désormais en œuvre le protocoleMappinget la méthode__setitem__. Cela signifie que les instancesOptionsoffrent désormais la même interface que les dictionnaires standard, à l'exception des méthodes de suppression (\N_delitem\N, pop, clear). Les affectations de clés sont validées par les validateurs, s'ils sont enregistrés.
Fonctionnalités de visualisation
-
Ajout d'une nouvelle fonction,
staged_pass_manager_drawer(), qui est utilisée pour visualiser uneStagedPassManagerexemple. Il dessine le gestionnaire de passage complet, chaque étape étant représentée par une boîte extérieure.Par exemple :
from qiskit.visualization import staged_pass_manager_drawer from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeSherbrooke backend = FakeSherbrooke() pm = generate_preset_pass_manager(3, backend) staged_pass_manager_drawer(pm) -
La méthode
StagedPassManager.draw()a été mise à jour pour inclure la visualisation des étapes en plus du gestionnaire de la passe globale. Les étapes sont représentées par des cases extérieures dans la visualisation. Dans les versions précédentes, les étapes n'étaient pas incluses dans la visualisation. Par exemple :from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeSherbrooke backend = FakeSherbrooke() pm = generate_preset_pass_manager(3, backend) pm.draw(pm) -
Ajout d'un nouveau mot-clé,
figsize, à la fonctionplot_bloch_multivector()fonction. Cet argument peut être utilisé pour définir une taille pour les sous-plots individuels de la sphère de Bloch. Par exemple, s'il y a qubits et quefigsizeest fixé à(w, h), la largeur globale de la figure est fixée à , tandis que la hauteur globale est fixée à . -
Ajout d'un nouveau mot-clé,
font_size, à la fonctionplot_bloch_multivector()fonction. Cet argument peut être utilisé pour contrôler la taille de la police dans la visualisation de sortie. -
Ajout de deux nouveaux mots-clés,
title_font_sizeettitle_pad, à la fonctionplot_bloch_multivector()fonction. Ces arguments peuvent être utilisés pour contrôler la taille de la police du titre général et de son remplissage respectivement.
Mise à niveau
-
La version minimale de Rust (MSRV) a été augmentée de 1.56.1 à 1.61.0. Si vous construisez Qiskit à partir des sources, vous devez maintenant vous assurer que vous avez au moins Rust 1.61.0 installé pour pouvoir construire Qiskit. Ce changement a été effectué parce que plusieurs dépendances en amont ont augmenté leurs MSRV.
-
Suppression de l'utilisation des primitives avec le gestionnaire de contexte et l'initialisation avec les circuits, (observables seulement pour Estimator), et les paramètres qui a été déprécié dans la version de Qiskit Terra 0.22.0 en Octobre 2022.
-
PrimitiveJob.submit()ne se bloque plus à la fin de l'exécution. En conséquence,Sampler.run(),BackendSampler.run(),Estimator.run()etBaseEstimator.run()ne se bloquent pas tant que la méthodePrimitiveJob.result()n'est pas appelée.
Notes de mise à niveau du transpilateur
-
Le nombre maximum d'essais évalués lors de la recherche de la meilleure disposition à l'aide de
VF2LayoutetVF2PostLayoutest maintenant limité àlevel_1_pass_manager(),level_2_pass_manager(), etlevel_3_pass_manager()à2 500,25 000, et250 000, respectivement. Auparavant, tous les schémas possibles ont été évalués. Cette modification a été apportée pour éviter que la transpilation ne s'interrompe pendant l'évaluation de la disposition des circuits comportant de nombreux composants connectés sur des appareils de grande taille, ce qui entraîne une échelle combinatoire puisque chaque composant connecté est évalué dans toutes les positions possibles sur l'appareil. Pour effectuer une recherche complète comme précédemment, exécutez manuellementVF2PostLayoutsur le circuit transpilé en mode strict, en spécifiant0pourmax_trials. -
L'attribut
conditionde la classeDAGDepNodea été supprimé. Il a été marqué comme obsolète dans la version 0.18 (07-2021). Vous devez plutôt utiliser l'attributconditionde l'attributoppour accéder à la condition d'un nœud d'opération. Pour les autres types de nœuds, il n'y a pas de condition d'accès. -
La valeur par défaut de
metadatadans les deuxDAGCircuitetDAGDependencya été remplacée par{}au lieu deNone, pour des raisons de compatibilité avec l'attribut correspondantmetadatade la directiveQuantumCircuit. -
La méthode
CouplingMap.__eq__`()a été mise à jour pour vérifier que les listes d'arêtes des graphes sous-jacents contiennent les mêmes éléments. Sous l'hypothèse que les graphes sous-jacents sont connectés, cette vérification garantit en outre que les graphes ont le même nombre de nœuds avec les mêmes étiquettes. Tout code utilisantCouplingMap() == CouplingMap()pour vérifier l'égalité des objets doit être mis à jour àCouplingMap() is CouplingMap(). -
Lors de l'exécution de la fonction
transpile()avec un backend basé surBackendV1ou une fonctionBackendPropertiesvia le mot-clébackend_propertiesqui a des qubits ou des portes marqués comme défectueux, la fonction n'essaiera plus de remapper automatiquement les qubits sur la base de cette information. La méthode par laquelletranspile()a tenté d'effectuer ce remappage était fondamentalement défectueuse et, dans la plupart des cas d'un tel backend, elle aurait entraîné une erreur interne. En pratique, très peu de backends définissent les champs dansBackendPropertiespour signaler qu'un qubit ou une porte est défectueux. Si vous comptiez surtranspile()pour effectuer ce recalage à votre place, vous devrez maintenant le faire manuellement et passer une entrée recalée aux argumentscoupling_mapetbackend_propertiesqui ont filtré les qubits et les portes défectueux, puis recalculer manuellement la sortie. -
Le résultat des transpositions pour les semences fixes peut avoir changé par rapport aux versions précédentes de Qiskit Terra. Cela est dû à des modifications internes de l'algorithme de routage utilisé par
SabreSwapetSabreLayoutqui sont respectivement les passes de routage et de mise en page par défaut, afin de les rendre nettement plus rapides pour les circuits de grande taille.
Notes sur la mise à niveau des circuits
- Les
QuantumCircuitmetadatarenvoie toujours un dictionnaire et ne peut être défini que comme un dictionnaire. Auparavant, sa valeur par défaut étaitNone, et pouvait être réglée manuellement surNoneou un dictionnaire.
Notes de mise à jour des algorithmes
- Les modules obsolètes
factorizersetlinear_solvers, contenantHHLetShoront été supprimés de la base de donnéesqiskit.algorithms. Ces fonctionnalités ont été supprimées dans le cadre de la version 0.22.0 (publiée le 13 octobre 2022). Vous pouvez accéder au code via le manuel Qiskit à la place : Résolveurs linéaires (HHL), Factorisateurs (Shor)
Notes de mise à jour Pulse
Target.update_from_instruction_schedule_map()n'affiche plusKeyErrorniValueErrorlorsque des qubits sont manquants dans l'instruction cible ou queinst_name_mapn'est pas fourni pour l'instruction non définie. Dans le premier cas, il ignore simplement la définition de l'entréeInstructionScheduleMappour les qubits non définis. Dans ce dernier cas, une correspondance de porte est tirée des portes standard de Qiskit et enfin, un objet opaque personnalisé est défini à partir du nom de l'horaire si aucune correspondance n'a été trouvéeGatepersonnalisé est défini à partir du nom de l'horaire si aucune correspondance n'est trouvée.
Notes de mise à niveau des fournisseurs
-
L'argument déprécié
max_creditsdeexecute(),assemble()et toutes les configurations deQobj(par ex.QasmQobjConfigetPulseQobjConfig) ont été supprimés. Cet argument remonte aux premières versions de Qiskit, qui était plus étroitement lié à l'offre de services IBM Quantum. À l'époque, le champmax_creditsfaisait partie du "système de crédit" utilisé par l'offre de services de IBM Quantum. Cependant, ce système de crédit n'est plus utilisé sur IBM Quantum depuis près de trois ans et Qiskit n'est plus lié à l'offre de services de IBM Quantum (et ne l'est plus depuis longtemps). Si vous comptez sur cette option d'une manière ou d'une autre pour un backend, vous devrez vous assurer que votre implémentation deBackendV2expose un champmax_creditsdans son objetOptionsdans son objet. -
L'attribut
namesur les fausses classes de backend basées surBackendV2les fausses classes de backend basées surqiskit.providers.fake_provideront changé par rapport aux versions précédentes. Auparavant, les noms comportaient un suffixe"_v2"pour différencier la classe de laBackendV1version. Ce suffixe a été supprimé car il pouvait entraîner des incohérences avec d'autres données instantanées utilisées pour construire l'objet backend.
Remarques concernant la dépréciation
- Les modules
qiskit.opflow,qiskit.utils.backend_utils,qiskit.utils.mitigation,qiskit.utils.measurement_error_mitigation, classeqiskit.utils.QuantumInstanceet les méthodesfind_regs_by_name(),run_circuits()sont obsolètes et seront supprimés dans une prochaine version. L'utilisationQuantumInstanceest remplacée parBaseSampler. Voir Opflow Migration. Voir QuantumInstance Migration.
Dépréciations du transcompilateur
-
La passe de routage du transpilateur,
BIPMapping, est obsolète et sera supprimée dans une prochaine version. Il a été remplacé par un plugin externe :qiskit-bip-mapper. Les détails de ce nouveau paquet sont disponibles sur le dépôt github du paquet :https://github.com/qiskit-community/qiskit-bip-mapper
La passe a été transformée en un paquet de plugins séparé pour deux raisons, d'abord la dépendance à CPLEX le rend plus difficile à utiliser et ensuite le paquet de plugins s'intègre plus proprement à
transpile(). -
L'orthographe incorrecte de
aquire_alignmentdans la classeTargeta été remplacée par l'orthographe correcteacquire_alignment. Les anciens arguments du constructeur aquire_alignment etTarget.aquire_alignmentsont obsolètes et seront supprimés dans une prochaine version. Utilisez plutôtTarget.acquire_alignmentpour obtenir et définir la valeur de la contrainte d'alignement.
Circuits obsolètes
- Réglage de la
QuantumCircuitmetadataàNoneest obsolète et ne sera plus pris en charge dans les versions ultérieures. Les utilisateurs doivent plutôt lui attribuer un dictionnaire vide s'ils veulent qu'il ne contienne aucune donnée.
Algorithmes obsolètes
-
Toutes les fonctionnalités suivantes sont désormais obsolètes, après avoir été mises en attente d'obsolescence depuis 0.22.0. De plus amples informations sont disponibles à l' adresse suivante : https://qisk.it/algo _migration.
-
Le module
qiskit.algorithms.minimum_eigen_solversest obsolète et remplacé parqiskit.algorithms.minimum_eigensolvers. -
Le module
qiskit.algorithms.eigen_solversest obsolète et remplacé parqiskit.algorithms.eigensolvers. -
Le module
qiskit.algorithms.evolversest obsolète et remplacé parqiskit.algorithms.time_evolvers. -
Classe
qiskit.algorithms.TrotterQRTEest obsolète et remplacée parqiskit.algorithms.time_evolvers.trotterization.TrotterQRTE. -
L'utilisation de
QuantumInstanceouBackendest dépréciée et remplacée parBaseSamplerdans les classes suivantes : -
L'utilisation de
QuantumInstanceouBackendouExpectationBaseest obsolète et remplacée parBaseSamplerdans la méthode statique suivante :get_fidelity() -
La fonction
eval_observables()est obsolète et remplacée par la fonctionestimate_observables().
-
Dépréciations des informations quantiques
- Les adresses
PauliTableetStabilizerTablesont obsolètes et seront supprimées dans une prochaine version. Au lieu de cela, il convient d'utiliser lePauliListdoit être utilisé. Avec ce changement,table()a été déprécié de sorte que vous devez opérer directement à partir detableau()sans lui.
Dépréciations des impulsions
- L'assignation de valeurs complexes à
ParameterExpressiondans n'importe quel objet Qiskit Pulse soulève maintenantPendingDeprecationWarning. Cela permettra d'aligner le module Pulse sur d'autres modules pour lesquels une telle affectation n'était pas possible au départ. Le cas typique d'utilisation de paramètres complexes dans le module était la bibliothèque SymbolicPulse. Depuis Qiskit-Terra 0.23.0, toutes les impulsions de la bibliothèque ont été converties de la représentation complexe de l'amplitude à la représentation réelle en utilisant deux flottants (amp,angle), comme dans la classeScalableSymbolicPulse. Il n'est donc plus nécessaire d'utiliser des paramètres complexes. Toute utilisation de paramètres complexes (et en particulier d'impulsions personnalisées) doit être convertie de la même manière afin d'éviter l'utilisation de paramètres complexes.
Corrections des erreurs
-
La classe
AmplitudeEstimationavertit désormais correctement si unEstimationProblemavec une propriétéis_good_statedéfinie est transmise en entrée, car elle n'est pas prise en charge et est ignorée. Auparavant, l'algorithme ignorait silencieusement cette option, ce qui entraînait des résultats inattendus. -
QuantumCircuit.append()lèvera désormais correctement une erreur si le nombre de bits classiques à appliquer à une opération n'est pas correct. Correction #9385. -
Les
BarrierBeforeFinalMeasurementsetMergeAdjacentBarriersavaient auparavant un ordre non déterministe pour les instructions qu'ils émettaientBarrierémises. Cela n'a pas modifié la sémantique des circuits mais pourrait, dans des cas limités où il y avait des barrières qui n'étaient pas de pleine largeur, faire en sorte que les passages ultérieurs du transpondeur stochastique voient un ordre topologique différent du circuit et, par conséquent, aient des sorties différentes pour des semences fixes. Les passes ont été rendues déterministes pour éviter cela. -
Le type de retour de
run()sera toujours le même que celui de son premier argument. Le passage d'un seul circuit renvoie un seul circuit, le passage d'une liste de circuits, même de longueur 1, renvoie une liste de circuits. Voir #9798. -
Correction d'un bug où
PauliOp.adjoint()ne renvoyait pas une valeur correcte pour les Paulis à coefficients complexes, commePauliOp(Pauli("iX")). Correction #9433. -
Correction d'un problème avec la fonction de tiroir de circuit
circuit_drawer()etQuantumCircuit.draw()lors de l'affichage des paramètres d'instruction de typeQuantumCircuitce qui entraînait un dessin illisible. Corrigé #9908 -
Correction d'un problème avec la fonction de tiroir de circuit
circuit_drawer()etQuantumCircuit.draw()lors de l'utilisation de la méthodetextet de l'argumentvertical_compression="low", qui utilisait un caractère incorrect pour le coin supérieur droit des cases utilisées pour représenter les portes du circuit. -
Correction d'un problème avec la méthode
Gate.control()qui traitait incorrectement les types d'entréestrouNonepour l'argumentctrl_state. -
Correction d'un cas limite dans la construction des instances
Pauliune chaîne avec une phase optionnelle et aucun qubit est maintenant un label valide, ce qui rend un opérateur sans qubit (tel quePauli("-i")). Cela était déjà possible lors de l'utilisation des formulaires de tableau ou des tranches vides. Correction #9720. -
Correction d'un problème lors de l'utilisation de la macro
pulsemeasure()lors de l'utilisation d'un backend basé surBackendV2pour travailler avec un backend basé sur la norme Auparavant, l'utilisation deqiskit.pulse.macros.measure()avec un backend basé surBackendV2aurait entraîné une erreur. Corrigé #9488 -
Correction d'un problème avec la fonction
marginal_distribution()qui soulevait une erreur lorsqu'un dictionnaire de comptes en entrée utilisait un type numpy integer au lieu du type Python int. La fonction sous-jacente gère toujours correctement les différents types, mais la vérification du type d'entrée soulevait auparavant de manière incorrecte unTypeErrordans ce cas. -
Correction d'un bug où
Parameter.is_real()ne renvoyait pasNonelorsque le paramètre n'était pas lié. Correction #8619. -
Les circuits contenant
C3SXGatepeuvent maintenant être sortis et relus en toute sécurité à partir de OpenQASM 2.0 exporter (QuantumCircuit.qasm()) et l'analyseur (QuantumCircuit.from_qasm_str()). -
Correction d'un bogue dans QPY (
qiskit.qpy) où les circuits contenant des portes de classeMCXGate,MCXGrayCodeetMCXRecursive, etMCXVChainne parvenaient pas à être sérialisés. Voir #9390. -
Correction des passes de routage du transpilateur
StochasticSwap,SabreSwap,LookaheadSwap, etBasicSwapafin qu'elles lèvent systématiquement unTranspilerErrorlorsque leur méthode.run()respective est appelée si les passes ont été initialisées aveccoupling_map=None. Auparavant, ces passes soulevaient des erreurs dans ce cas, mais elles étaient toutes causées par des effets de bord et l'exception spécifique n'était pas prévisible. Corrigé #7127 -
La définition manuelle d'un élément dans
QuantumCircuit.datapermettra désormais à l'opération d'être n'importe quel objet qui implémenteOperationet non plus seulement un objetcircuit.Instruction. Notez que toute mutation manuelle deQuantumCircuit.dataest déconseillée; elle n'est généralement pas plus efficace que la construction d'un nouvel objet circuit, car la vérification des invariants entourant les objets paramétrés peut être étonnamment coûteuse. -
Correction d'un bogue lors de la construction de
DAGDependencyà l'intérieur de la passe de transpositionTemplateOptimizationqui pouvait conduire à des optimisations incorrectes. -
Correction d'un bogue dans
TensoredOp.to_matrix()où le coefficient global de l'opérateur était multiplié à la matrice finale plus d'une fois. Désormais, le coefficient global est correctement appliqué, indépendamment du nombre d'opérateurs ou d'états tensoriés. Correction #9398. -
Correction de la gestion de la phase globale dans la passe de
UnrollCustomDefinitionssi l'instruction en question avait une phase globale, mais pas d'instructions dans son champ de définition. -
Correction des annotations de type pour la fonction
transpile()fonction. Le type de retour est maintenant réduit correctement selon qu'un seul circuit ou une liste de circuits a été transmis. -
Correction d'un bug où
IterativePhaseEstimationgénérait le mauvais circuit, ce qui faisait échouer l'algorithme dans les cas simples. Correction #9280. -
Un bogue a été corrigé qui permettait la diffusion lorsqu'un fichier
PauliListest initialisé à partir dePauliou des étiquettes. Par exemple, le codePauliList(["XXX", "Z"])lève maintenant unValueErrorau lieu de construire l'équivalent dePauliList(["XXX", "ZZZ"]). -
L'exportateur OpenQASM 2 (
QuantumCircuit.qasm()) n'émettra plus de définitions en double pour les portes qui apparaissent dans les définitions d'autres portes. Voir les numéros 7771, 8086, 8402, 8558 et 9805. -
L'exportateur OpenQASM 2 (
QuantumCircuit.qasm()) gère désormais les définitions multiples et imbriquées deUnitaryGate. Voir les numéros 4623, 6712, 7772 et 8222. -
L'exportateur OpenQASM 2 (
QuantumCircuit.qasm()) produira désormais les définitions des portes utilisées uniquement dans les définitions d'autres portes, dans un ordre correct. Voir #7769 et #7773. -
Les portes standard définies par Qiskit, telles que
RZXGateauront désormais des définitions correctement paramétrées lorsqu'elles seront exportées à l'aide de l'exportateur OpenQASM 2 (QuantumCircuit.qasm()). Voir #7172. -
Les circuits volumiques quantiques (
QuantumVolume) sont désormais pris en charge par l'exportateur OpenQASM 2 (QuantumCircuit.qasm()). Voir #6466 et #7051. -
L'exportateur de OpenQASM 2 produit désormais les portes sans définition connue avec les déclarations
opaque, au lieu d'échouer. Voir #5036. -
Un problème qui empêchait
transpile()de fonctionner lorsqu'une liste d'objets lui était transmise a été corrigéCouplingMapa été corrigé. Notez que passer une telle liste de cartes de couplage est déprécié et ne sera plus possible à partir de Qiskit Terra 0.25. Corrige #9885. -
Avant cette version, l'argument
figsizedeplot_bloch_multivector()n'était pas utilisé par la visualisation, ce qui rendait impossible la modification de sa taille (par exemple, pour la réduire pour les états à un seul qubit). Cette version corrige ce problème en introduisant une utilisation de l'argumentfigsize. -
Correction d'un problème dans
transpile()avecoptimization_level=1(ainsi que dans les gestionnaires de passes prédéfinies renvoyées pargenerate_preset_pass_manager()etlevel_1_pass_manager()) où auparavant, si les argumentsrouting_methodetlayout_methodn'étaient pas définis et qu'aucune opération de flux de contrôle n'était présente dans le circuit, dans les cas où le routage était nécessaire, la passe de transpilageVF2PostLayoutn'était pas exécutée. C'est le contraire du comportement attendu carVF2PostLayoutest destiné à trouver une disposition potentiellement plus performante après l'exécution d'une passe heuristique de disposition et de routage. Corrigé #9936 -
Construction d'un
Statevectorà partir d'unQuantumCircuitcontenant des opérations à zéro qubit ne soulèvera plus d'erreur. Ces opérations confèrent une phase globale au vecteur d'état résultant. -
Correction d'un problème dans les passes du transpiler pour les délais de remplissage, qui ne respectaient pas les contraintes de la cible et inséraient des délais même pour les qubits ne supportant pas l'instruction
Delayinstruction.PadDelayetPadDynamicalDecouplingsont fixés de telle sorte qu'ils ne remplacent aucun temps d'inactivité des qubits et que la cible ne prenne pas en charge les instructionsDelaypour les qubits. Les passages d'ordonnancement héritésASAPScheduleetALAPSchedule, qui remplissent les délais en interne, sont également corrigés de la même manière. En outre,transpile()est corrigé pour appelerPadDelayavec un objettargetafin qu'il fonctionne correctement lorsqu'il est appelé avec l'optionscheduling_method. Corrigé #9993 -
Correction des annotations de type sur la méthode
QuantumCircuit.assign_parameters()afin de refléter correctement le changement de type de retour en fonction de la valeur de l'argumentinplace. -
Correction d'un problème de mise à l'échelle des performances avec les
VF2LayoutetVF2PostLayoutdans les gestionnaires de passes prédéfinis ettranspile()qui se produisait lors de la transposition de circuits avec de nombreux composants connectés sur de grands appareils. Maintenant, le transpileur passe des limites supérieures sur le nombre de présentations potentielles qui seront évaluées. -
Correction d'un problème dans la fonction
state_to_latex()qui produisait potentiellement des LaTeX invalides en raison de l'arrondissement involontaire des coefficients. Cela pourrait également entraîner des erreurs lors de l'appel àstate_drawer(). Correction #9297.
Aer 0.12.0
Pas de modification
IBM 0.20.2 du fournisseur Q
Pas de modification