Skip to main content
IBM Quantum Platform

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 dump est passée à 8. Cette nouvelle version du format ajoute la prise en charge de la sérialisation de l'attribut QuantumCircuit.layout attribut.

Corrections des erreurs

  • Correction de la désérialisation des instances DiagonalGate par 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 BasicSwap qui empêchait la méthode BasicSwap.run() de fonctionner si l'argument du mot-clé fake_run était défini sur True lors de l'instanciation de la classe. Corrigé #10147

  • Correction d'un problème de copie de circuits avec les nouveaux styles Clbitet Qubit(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 CheckMap ne 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() et measure_all() lorsque des fonctions sont appelées avec le backend BackendV2 .

  • 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.primitives ne 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 de opflowce 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 classe GroverOperator pourraient 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 UnitarySynthesis lors de l'utilisation du paramètre target , où les circuits avec flux de contrôle n'étaient pas correctement mappés à la cible.

  • Correction d'un bug dans VQDresult.optimal_values était une copie de result.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 ParameterExpression en float ou int échouait, par exemple parce que l'expression était naturellement un nombre complexe. Corrigé #9187

  • Fixed float conversions pour les valeurs ParameterExpression qui 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 que ParameterExpression.is_real() soit vrai. Corrigé #10191

  • Correction de la qpy sérialisation de QuantumCircuit.layout attribue. Auparavant, l'attribut layout é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 paquet qiskit-aer-gpu nécessite désormais CUDA 12. Si vous êtes un utilisateur existant du paquetage qiskit-aer-gpu et que vous souhaitez utiliser CUDA 11, vous devez exécuter :

    pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11

    pour passer des versions du package qiskit-aer-gpu pré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 paquetage qiskit-aer-gpu comme 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 les AerCircuit. Ce commit rend les résultats sérialisables en supprimant AerCircuits 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.qubits pour 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-aer

et 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 Estimator lorsque abelian_grouping=True.

Mise à niveau

  • Amélioration des performances lorsque les mêmes circuits et plusieurs paramètres sont transmis à Estimator avec approximation=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::Config est corrigée. Cette classe a de nombreux champs d'application, mais elle est fréquemment copiée sur le site AER::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::CircuitOptimization ne copie pas AER::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, AerSimulator modifiait 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 à jour NoiseModel.from_backend() et basic_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.

  • AerCircuit est 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 ajoute barrier() 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 aucun run_options n'est spécifié. Cette correction permet de simuler Qobj sans run_options.

  • Depuis 0.12.0, AerConfig est 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.

  • QuantumCircuit prend 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'ancien omp_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 de Instruction dans le circuit plutôt que de lier les valeurs enveloppées dans une instance ParameterExpression. Ce changement devrait avoir peu d'impact sur l'utilisateur, car float(QuantumCircuit.data[i].operation.params[j]) produit toujours un float (et est le seul moyen d'accéder à la valeur d'une variable ParameterExpression). De plus, Instruction() peuvent déjà être float ainsi que a ParameterExpressionde 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 utilise isinstance pour vérifier la présence de ParameterExpression et qui se comporte différemment en fonction du résultat. De plus, qpy sérialise la valeur numérique dans un bound ParameterExpression avec une précision différente de celle d'un float (voir aussi la note de correction de bogue concernant QuantumCircuit.assign_parameters()).

Corrections des erreurs

  • Mise à jour plot_gate_map(), plot_error_map()et plot_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 backend ibm_seattle de 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 concernant QuantumCircuit.assign_parameters().

  • Correction d'un bogue dans BlockCollapser où 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() et replace_block_with_op() qui conduisait à ignorer les bits classiques.

  • Correction d'un bogue dans QuantumCircuit.compose() où l'attribut SwitchCaseOp.target dans le sous-circuit n'était pas correctement mappé à un registre dans le circuit de base.

  • Correction d'un bug dans RZXCalibrationBuilder où 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 attendu MissingOptionalLibrary. Corrigé #10079

  • L'utilisation de initial_layout dans 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édent QuantumCircuit.mcrz() le comportement précédent, utilisez QuantumCircuit.mcp().

  • Correction d'un problème avec le constructeur PassManagerConfig.from_backend() lors de la construction d'un objet PassManagerConfig à partir d'une instance BackendV1 qui n'avait pas d'attribut de carte de couplage défini. Auparavant, le constructeur créait incorrectement un objet CouplingMap avec 0 qubit au lieu d'utiliser None. 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 Optimize1qGatesDecomposition en parallèle provoquait une erreur due au fait que OneQubitGateErrorMap n'était pas sélectionnable.

  • Correction d'un bogue dans les VF2Layout et VF2PostLayout où 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 :

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(), et deprecate_func() au module qiskit.utils module.

    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 avec help(). Les décorateurs de dépréciation de qiskit.utils appellent add_deprecation_to_docstring() mais vous pouvez l'appeler directement si vous utilisez des mécanismes différents pour les dépréciations.

    @deprecate_func remplace @deprecate_function et 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_arg remplace @deprecate_arguments et 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 un predicate afin 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 HLSConfig la 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 de HighLevelSynthesisPlugin et 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 de HighLevelSynthesisPlugin. 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 CouplingMap d'avoir une connectivité disjointe. Auparavant, un CouplingMap ne pouvait être construit que si le graphe était connecté. Cela permettra d'utiliser CouplingMap pour 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 de CouplingMap sous-graphes composants pour un sous-graphe disjoint CouplingMap. Si l'objet CouplingMap l'objet est connecté, il ne renverra qu'un seul CouplingMap équivalent à l'original.

  • Ajout de nouvelles règles au système intégré EquivalenceLibrary inté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 LinearFunction et pour qiskit.quantum_info.Cliffordétendant l'ensemble des méthodes de synthèse qui peuvent être appelées à partir de la passe de HighLevelSynthesis transpiler pass.

    Pour LinearFunction les plugins disponibles sont listés ci-dessous :

    Nom du plug-in
    Plugin de synthèse de haut niveau
    defaultDefaultSynthesisLinearFunction
    kmsKMSSynthesisLinearFunction
    pmhPMHSynthesisLinearFunction

    Pour qiskit.quantum_info.Clifford les plugins disponibles sont listés ci-dessous :

    Nom du plug-in
    Plugin de synthèse de haut niveau
    defaultDefaultSynthesisClifford
    agAGSynthesisClifford
    bmBMSynthesisClifford
    greedyGreedySynthesisClifford
    layersLayerSynthesisClifford
    lnnLayerLnnSynthesisClifford

    Pour plus d'informations sur chaque méthode, veuillez vous référer à la documentation qiskit.synthesis pour 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, MinimumPoint qui est principalement utilisée comme passe pour vérifier une condition de boucle dans un fichier PassManager. 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éthode FixedPoint qui 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éthode DAGCircuit pour 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, un DAGCircuitError est 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, et synth_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 CRZGate en un RZZGate plus RZGate ou un CRYGate à un qubit simple RZXGate plus 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ée QuantumCircuit vers la sortie QuantumCircuit. 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ée QuantumCircuit est 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ée DAGCircuit vers la sortie QuantumCircuit. Dans les cas où l'entrée DAGCircuit 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ée DAGCircuit est rejetée.

  • Ajout d'une nouvelle fonction passmanager_stage_plugins() au module qiskit.transpiler.preset_passmanagers.plugin module. 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 Error accepte désormais également les entrées appelables pour son paramètre msg . Si elles sont utilisées, ces variables d'entrée se verront passer l'attribut property_set de 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_pass est inclus dans un gestionnaire de passe, l'erreur est signalée par le message "The circuit size is: n" , où n est 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) Size passe).

  • La méthode build_coupling_map() comporte un nouveau mot-clé, filter_idle_qubits , qui, lorsqu'il est défini sur True , supprime tous les qubits de la sortie qui ne supportent aucune opération CouplingMap qui ne supportent aucune opération.

  • La passe de GateDirection le transpileur peut désormais gérer correctement les SwapGate qui 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 RZXCalibrationBuilder et RZXCalibrationBuilderNoEcho utilisent désormais correctement une porte d'enchevêtrement ECRGate pour la porte d'enchevêtrement si la porte d'enchevêtrement native du backend est ECRGate. Auparavant, les passes ne fonctionnaient correctement que si la porte d'enchevêtrement était CXGate.

  • Ajout d'un nouveau constructeur pour la classe Target qui permet de construire un Target.from_configuration()qui vous permet de construire un objet Target à 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 Target qui a UGate, CXGate, et Measure disponibles 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 fonction qiskit.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-5 QuantumVolume pour une carte de couplage heavy-hex de 1081 qubits est approximativement divisé par deux.

  • Les performances d'exécution de la passe de Optimize1qGatesDecomposition a é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 de transpile() avec le mot-clé optimization_level fixé à 1, 2, ou 3.

  • 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 SabreLayout permet maintenant d'utiliser une cible avec une ligne de commande disjointe CouplingMap. Lorsque l'on vise un couplage disjoint, l'entrée DAGCircuit est divisée en ses composantes connectées de qubits virtuels, chaque composante est mappée aux composantes connectées de l'entrée CouplingMapla 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'argument routing_pass est 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.passes acceptent désormais un objet Target utilisé pour modéliser les contraintes d'un backend cible via le premier argument de position (actuellement nommé coupling_map ou backend_properties).

    La liste des passes avec la nouvelle prise en charge de Target sont les suivantes :

  • La fonction d'aide à la construction du gestionnaire de passe generate_embed_passmanager() acceptera désormais également un Target comme seul argument positionnel (actuellement nommé coupling_map). Ceci peut être utilisé pour construire une mise en page intégrée PassManager à partir d'un Target au lieu d'un objet CouplingMap.

  • Les passes suivantes du transpileur de mise en page et de routage des modules qiskit.transpiler.passes ont un nouveau mot-clé argument, target qui prend en compte un objet Target qui est utilisé pour modéliser les contraintes d'un backend cible. Si le mot-clé target est 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 de CouplingMap, InstructionScheduleMap ou une liste de portes de base. La liste de ces passes avec le nouvel argument target est la suivante :

  • La fonction d'aide à la construction du gestionnaire de passe generate_scheduling() possède un nouveau mot-clé target qui est utilisé pour spécifier un objet Target pour modéliser les contraintes du backend cible pour lequel il est compilé lors de la génération d'un nouveau PassManager. S'il est spécifié, ce nouvel argument remplacera l'autre argument inst_map.

  • Le plugin default utilisé par la passe UnitarySynthesis choisit maintenant la synthèse unitaire à un ou deux qubits en se basant sur les taux d'erreur rapportés dans le fichier Target. 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 UnitarySynthesisPlugin comporte deux nouvelles propriétés optionnelles supports_gate_lengths_by_qubit et supports_gate_errors_by_qubit qui, lorsqu'elles sont définies, ajoutent les champs gate_lengths_by_qubit et gate_errors_by_qubit respectivement aux options d'entrée de la méthode run() du plugin. Ces nouveaux champs constituent une autre vue des données fournies par gate_lengths et gate_errors , mais ont la forme suivante : {(qubits,): [Gate, length]} (où Gate est l'instance de Gate pour 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érations ForLoopOp dans un circuit. Cette passe déroule les boucles for lorsque c'est possible, s'il n'y a pas de ContinueLoopOp ou BreakLoopOp dans 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")
    _images/legacy_release_notes-1.png
  • Ajout d'un nouveau paramètre max_trials à transmettre VF2PostLayout qui, 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 existants call_limit et time_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 pass VF2PostLayout) 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 CheckMap dispose 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 fichier PassManager dans 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'instance QuantumCircuit l'instance.

  • Ajout d'un nouvel attribut, layoutà la classe QuantumCircuit classe. Cet attribut est généralement renseigné par transpile() ou PassManager.run() (lorsque l' étape de mise en page et l'étape de routage sont exécutées dans le PassManager ) et contient un TranspileLayout qui contient les informations sur la permutation du circuit d'entrée pendant transpile().

  • Ajout d'un nouvel argument, var_order, au constructeur de la classe PhaseOracle pour 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() et qasm2.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() et QuantumCircuit.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 du qiskit.qasm2 pour 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() et QuantumCircuit.mcry on :math:`n() vers 16n4016n - 40 CX gates, pour n4n \geq 4. 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 instruction 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. Plusieurs valeurs peuvent pointer vers le même circuit, et CASE_DEFAULT peut ê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 switch est supportée par l'ensemble de la pile du compilateur Qiskit transpile() qui la contiennent (si le backend annonce qu'il supporte cette construction), et elle sera sérialisée en QPY.

    La déclaration switch n'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'état switch (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 classe AdaptVQE pour 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 classe AdaptVQE qui remplacera à l'avenir l'attribut threshold à l'avenir. Ce nouvel attribut se comporte de la même manière que l'attribut threshold existant, 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_state qui permet de vérifier si un EstimationProblem possède un EstimationProblem.is_good_state ou s'il s'agit de la valeur par défaut. Ceci est utile pour les vérifications dans les estimateurs d'amplitude, tels que AmplitudeEstimationqui ne prennent en charge que l'implémentation par défaut.

  • Ajoute un drapeau local à la classe de fidélité de l'état ComputeUncompute qui 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 TrotterQRTE classe. Pour faciliter le travail, nous avons ajouté l'attribut num_timesteps et un argument de mot-clé correspondant au constructeur TrotterQRTE pour 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 TrotterQRTE classe. La fonction TimeEvolutionProblem.aux_operators est évaluée à chaque pas de temps si l'attribut ProductFormula.reps de l'argument d'entrée product_formula dans le constructeur est fixé à 1.

  • Ajout d'extensions à l'algorithme VQD qui permettent de passer une liste d'optimiseurs et de points initiaux pour les différents cycles de minimisation. Par exemple, le k-th initial point et le k-th optimizer seront utilisés pour l'optimisation du k-1-th exicted state.

Caractéristiques de l'information quantique
  • Ajout de deux nouvelles méthodes de construction, Clifford.from_matrix() et Clifford.from_operator()qui créent un objet Clifford à partir de sa matrice unitaire et de sa représentation de l'opérateur, respectivement.

  • Le constructeur de Clifford peut maintenant prendre n'importe quel objet de porte de Clifford jusqu'à 3 qubits à condition qu'il implémente une méthode to_matrix , y compris les portes paramétrées telles que Rz(pi/2), qui n'étaient pas convertibles auparavant.

  • Ajout de nouvelles fonctions utilitaires : commutator(), anti_commutator(), et double_commutator() qui sont utilisées pour calculer les commutateurs de tout objet implémentant la classe de base abstraite LinearOp telle que QuantumChannel, SparsePauliOp, ou ScalarOp.

  • 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 {II,XX,YY,ZZ}\{II, XX, -YY, ZZ\} et peut donc être généré par [XX,ZZ][XX, ZZ], [XX,YY][XX, -YY] ou [YY,ZZ][-YY, ZZ].

  • Ajout d'une nouvelle méthode, partial_transpose()à la méthode qiskit.quantum_info à la classe DensityMatrix du 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 P.O.PP^\dagger.O.P 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 SparsePauliOp objets avec ParameterExpression sans 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'attribut SparsePauliOp.parameters pour assigner et interroger des paramètres non liés à l'intérieur d'un fichier SparsePauliOp. Cette fonction peut, par exemple, être utilisée comme suit

    from 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 phase Sawtooth , le comportement est identique à celui de la fonction correspondante du générateur de forme d'onde (par ex. sin()). La phase de la classe Sawtooth est définie de telle sorte qu'une phase de 2π2\pi se décale d'un cycle complet.

  • Ajout d'un support à QPY (qiskit.qpy) pour travailler avec des instances de pulse ScheduleBlock avec 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 objet Target cette 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 BackendV2Converter dispose 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ée BackendProperties pour l'entrée BackendV1. Bien qu'il ne soit pas très utilisé, un objet BackendProperties permet 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 sortie BackendV2 et ses Target incluaient 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ées Target. 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 fichier Target.

  • La classe Options met désormais en œuvre le protocole Mapping et la méthode __setitem__ . Cela signifie que les instances Options offrent 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 une StagedPassManager exemple. 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 fonction plot_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 nn qubits et que figsize est fixé à (w, h), la largeur globale de la figure est fixée à nwn \cdot w, tandis que la hauteur globale est fixée à hh.

  • Ajout d'un nouveau mot-clé, font_size, à la fonction plot_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_size et title_pad, à la fonction plot_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() et BaseEstimator.run() ne se bloquent pas tant que la méthode PrimitiveJob.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 VF2Layout et VF2PostLayout est maintenant limité à level_1_pass_manager(), level_2_pass_manager(), et level_3_pass_manager() à 2 500, 25 000, et 250 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 manuellement VF2PostLayout sur le circuit transpilé en mode strict, en spécifiant 0 pour max_trials.

  • L'attribut condition de la classe DAGDepNode a été supprimé. Il a été marqué comme obsolète dans la version 0.18 (07-2021). Vous devez plutôt utiliser l'attribut condition de l'attribut op pour 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 metadata dans les deux DAGCircuit et DAGDependency a été remplacée par {} au lieu de None , pour des raisons de compatibilité avec l'attribut correspondant metadata de la directive QuantumCircuit.

  • 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 utilisant CouplingMap() == 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é sur BackendV1 ou une fonction BackendProperties via le mot-clé backend_properties qui 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 laquelle transpile() 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 dans BackendProperties pour signaler qu'un qubit ou une porte est défectueux. Si vous comptiez sur transpile() pour effectuer ce recalage à votre place, vous devrez maintenant le faire manuellement et passer une entrée recalée aux arguments coupling_map et backend_properties qui 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 SabreSwap et SabreLayoutqui 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 QuantumCircuit metadata renvoie toujours un dictionnaire et ne peut être défini que comme un dictionnaire. Auparavant, sa valeur par défaut était None, et pouvait être réglée manuellement sur None ou un dictionnaire.
Notes de mise à jour des algorithmes
  • Les modules obsolètes factorizers et linear_solvers, contenant HHL et Shor ont été supprimés de la base de données qiskit.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 plus KeyError ni ValueError lorsque des qubits sont manquants dans l'instruction cible ou que inst_name_map n'est pas fourni pour l'instruction non définie. Dans le premier cas, il ignore simplement la définition de l'entrée InstructionScheduleMappour 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ée Gate personnalisé 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_credits de execute(), assemble() et toutes les configurations de Qobj (par ex. QasmQobjConfig et PulseQobjConfig) 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 champ max_credits faisait 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 de BackendV2 expose un champ max_credits dans son objet Options dans son objet.

  • L'attribut name sur les fausses classes de backend basées sur BackendV2 les fausses classes de backend basées sur qiskit.providers.fake_provider ont changé par rapport aux versions précédentes. Auparavant, les noms comportaient un suffixe "_v2" pour différencier la classe de la BackendV1 version. 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

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_alignment dans la classe Target a été remplacée par l'orthographe correcte acquire_alignment. Les anciens arguments du constructeur aquire_alignment et Target.aquire_alignment sont obsolètes et seront supprimés dans une prochaine version. Utilisez plutôt Target.acquire_alignment pour obtenir et définir la valeur de la contrainte d'alignement.

Circuits obsolètes
  • Réglage de la QuantumCircuit metadata à None est 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
Dépréciations des informations quantiques
  • Les adresses PauliTable et StabilizerTable sont obsolètes et seront supprimées dans une prochaine version. Au lieu de cela, il convient d'utiliser le PauliList doit être utilisé. Avec ce changement, table() a été déprécié de sorte que vous devez opérer directement à partir de tableau() sans lui.
Dépréciations des impulsions
  • L'assignation de valeurs complexes à ParameterExpression dans n'importe quel objet Qiskit Pulse soulève maintenant PendingDeprecationWarning. 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 classe ScalableSymbolicPulse . 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 AmplitudeEstimation avertit désormais correctement si un EstimationProblem avec une propriété is_good_state dé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 BarrierBeforeFinalMeasurements et MergeAdjacentBarriers avaient auparavant un ordre non déterministe pour les instructions qu'ils émettaient Barrier é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, comme PauliOp(Pauli("iX")). Correction #9433.

  • Correction d'un problème avec la fonction de tiroir de circuit circuit_drawer() et QuantumCircuit.draw() lors de l'affichage des paramètres d'instruction de type QuantumCircuit ce qui entraînait un dessin illisible. Corrigé #9908

  • Correction d'un problème avec la fonction de tiroir de circuit circuit_drawer() et QuantumCircuit.draw() lors de l'utilisation de la méthode text et de l'argument vertical_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ée str ou None pour l'argument ctrl_state .

  • Correction d'un cas limite dans la construction des instances Pauli une chaîne avec une phase optionnelle et aucun qubit est maintenant un label valide, ce qui rend un opérateur sans qubit (tel que Pauli("-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é sur BackendV2 pour travailler avec un backend basé sur la norme Auparavant, l'utilisation de qiskit.pulse.macros.measure() avec un backend basé sur BackendV2 aurait 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 un TypeError dans ce cas.

  • Correction d'un bug où Parameter.is_real() ne renvoyait pas None lorsque le paramètre n'était pas lié. Correction #8619.

  • Les circuits contenant C3SXGate peuvent 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 classe MCXGate, MCXGrayCodeet MCXRecursive, et MCXVChain ne parvenaient pas à être sérialisés. Voir #9390.

  • Correction des passes de routage du transpilateur StochasticSwap, SabreSwap, LookaheadSwap, et BasicSwap afin qu'elles lèvent systématiquement un TranspilerError lorsque leur méthode .run() respective est appelée si les passes ont été initialisées avec coupling_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.data permettra désormais à l'opération d'être n'importe quel objet qui implémente Operationet non plus seulement un objet circuit.Instruction. Notez que toute mutation manuelle de QuantumCircuit.data est 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 transposition TemplateOptimization qui 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 UnrollCustomDefinitions si 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ù IterativePhaseEstimation gé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 PauliList est initialisé à partir de Pauliou des étiquettes. Par exemple, le code PauliList(["XXX", "Z"]) lève maintenant un ValueError au lieu de construire l'équivalent de PauliList(["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 de UnitaryGate. 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é CouplingMap a é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 figsize de plot_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'argument figsize .

  • Correction d'un problème dans transpile() avec optimization_level=1 (ainsi que dans les gestionnaires de passes prédéfinies renvoyées par generate_preset_pass_manager() et level_1_pass_manager()) où auparavant, si les arguments routing_method et layout_method n'é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 transpilage VF2PostLayout n'était pas exécutée. C'est le contraire du comportement attendu car VF2PostLayout est 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'un QuantumCircuit contenant 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 Delay instruction. PadDelay et PadDynamicalDecoupling sont 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 instructions Delay pour les qubits. Les passages d'ordonnancement hérités ASAPSchedule et ALAPSchedule, qui remplissent les délais en interne, sont également corrigés de la même manière. En outre, transpile() est corrigé pour appeler PadDelay avec un objet target afin qu'il fonctionne correctement lorsqu'il est appelé avec l'option scheduling_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'argument inplace .

  • Correction d'un problème de mise à l'échelle des performances avec les VF2Layout et VF2PostLayout dans les gestionnaires de passes prédéfinis et transpile()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

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.