Skip to main content
IBM Quantum Platform

Notes de publication de Qiskit 0.23


0.23.6

Terra 0.16.4

Pas de modification

Aer 0.7.5

Prélude

Cette version est une version de correction de bogues qui corrige la compatibilité dans les paquets binaires précompilés de wheel avec les versions de numpy < 1.20.0. La version précédente 0.7.4 construisait les binaires d'une manière qui nécessitait numpy 1.20.0, ce qui a été résolu maintenant, de sorte que les paquets binaires précompilés de wheel fonctionneront avec n'importe quelle version compatible de numpy.

Ignis 0.5.2

Pas de modification

Aqua 0.8.2

Pas de modification

IBM 0.11.1 du fournisseur Q

Pas de modification


0.23.5

Terra 0.16.4

Prélude

Cette version est une version de correction de bogues qui corrige principalement la compatibilité avec numpy 1.20.0. Cette version de numpy a rendu obsolètes les alias locaux pour les types numériques de Python (np.int -> int, np.float -> float, etc.) et l'utilisation de ces alias dans Qiskit a entraîné l'émission d'un grand nombre d'avertissements de dépréciation. Cette version corrige cela afin que vous puissiez exécuter Qiskit avec numpy 1.20.0 sans ces avertissements de dépréciation.

Aer 0.7.4

Corrections des erreurs

Corrige la compatibilité avec numpy 1.20.0. Cette version de numpy a rendu obsolètes les alias locaux pour les types numériques de Python (np.int -> int, np.float -> float, etc.) et l'utilisation de ces alias dans Qiskit Aer a entraîné l'émission d'un grand nombre d'avertissements de dépréciation. Cette version corrige ce problème afin que vous puissiez exécuter Qiskit Aer avec numpy 1.20.0 sans ces avertissements de dépréciation.

Ignis 0.5.2

Prélude

Cette version est une version de correction de bogues qui corrige principalement la compatibilité avec numpy 1.20.0. Il s'agit également de la première version à prendre en charge Python 3.9. Les versions antérieures (y compris 0.5.0 et 0.5.1 ) fonctionnaient avec Python 3.9 mais ne l'indiquaient pas dans les métadonnées du paquet, et il n'y a pas eu de tests en amont pour ces versions. Cette version corrige ce problème et a été testée sur Python 3.9 (en plus de 3.6, 3.7, et 3.8 ).

Corrections des erreurs

  • networkx est maintenant explicitement listé comme une dépendance. Il s'agissait auparavant d'une dépendance implicite car il était nécessaire pour le module qiskit.ignis.verification.topological_codes mais n'était pas correctement listé comme une dépendance car qiskit-terra nécessite également networkx et est également une dépendance d'ignis donc il serait toujours installé dans la pratique. Cependant, il est nécessaire de le mentionner comme une exigence pour les futures versions de qiskit-terra qui ne nécessiteront pas networkx. Il est également important de lister correctement les dépendances d'ignis au cas où il y aurait une incompatibilité future entre les versions requises.

Aqua 0.8.2

IBM 0.11.1 du fournisseur Q

Pas de modification


0.23.4

Terra 0.16.3

Corrections des erreurs

  • Correction d'un problème introduit dans 0.16.2 qui provoquait des erreurs lors de l'exécution transpile() sur un circuit avec une série de portes de 1 qubit et une instruction sans porte qui n'opère que sur un qubit (par exemple Reset). Corrige #5736

Aer 0.7.3

Pas de modification

Ignis 0.5.1

Pas de modification

Aqua 0.8.1

Pas de modification

IBM 0.11.1 du fournisseur Q

Pas de modification


0.23.3

Terra 0.16.2

Nouvelles fonctions

  • Python 3.9 a été ajouté dans cette version. Vous pouvez maintenant lancer Qiskit Terra en utilisant Python 3.9.

Mise à niveau

  • La classe MCXGrayCode créera maintenant un C3XGate si num_ctrl_qubits est 3 et un C4XGate si num_ctrl_qubits est 4. Ceci s'ajoute à la fonctionnalité précédente où pour n'importe quel mode de la :class:' qiskit.library.standard_gates.x.MCXGate\ , si num_ctrl_bitsest 1, unCXGateest créé, et si 2, unCCXGate` est créé.

Corrections des erreurs

  • Les instructions Pulse Delay sont désormais explicitement assemblées en tant qu'objets PulseQobjInstruction inclus dans la sortie PulseQobj sortie de assemble().

    Auparavant, nous pouvions ignorer les Delay dans un Schedule comme faisant partie de assemble() car l'heure était explicite dans les PulseQobj objets. Mais maintenant, avec les portes à impulsion, il y a des situations où nous pouvons programmer UNIQUEMENT un retard, et ne pas inclure le retard lui-même supprimerait le retard.

  • Les circuits avec des calibrations de portes personnalisées peuvent maintenant être programmés avec le transpileur sans fournir explicitement les durées de chaque calibration de circuit.

  • Les BasisTranslator et Unroller ne préservaient pas, dans certains cas, la phase globale du circuit en cours de transpilation. Ce point a été corrigé.

  • Un bogue dans qiskit.pulse.builder.frequency_offset() où, lorsque compensate_phase était défini, un facteur de 2π2\pi manquait dans la phase annexée.

  • Fixe la phase globale de la sortie de la QuantumCircuit méthode repeat(). Si un circuit avec phase globale est annexé à un autre circuit, la phase globale n'est actuellement pas propagée. Les simulateurs s'appuient sur ce principe, car la phase est appliquée plusieurs fois. Cela permet de mettre la phase globale de repeat() à 0 avant d'ajouter le circuit répété au lieu de multiplier la phase existante par le nombre de répétitions.

  • Correction d'un bug dans SparsePauliOp où la multiplication par un certain type de scalaire Numpy non Python retournait des valeurs incorrectes. Corrige #5408

  • La définition de la fidélité de Hellinger de a été corrigée par rapport à la définition précédente de 1H(P,Q)1-H(P,Q) à [1H(P,Q)2]2[1-H(P,Q)^2]^2 afin qu'elle soit égale à la fidélité de l'état quantique de P, Q en tant que matrices de densité diagonales.

  • Réduire le nombre de portes CX dans la décomposition de la porte X à 3 commandes, C3XGate. Compilé et optimisé dans la base U CX, il n'utilise plus que 14 portes CX et 16 portes U au lieu de 20 et 22, respectivement.

  • Corrige le problème dans lequel l'utilisation de Jupyter backend widget ou qiskit.tools.backend_monitor() échouait si les portes de base du backend n'incluaient pas les traditionnels u1, u2, et u3.

  • Lors de l'exécution qiskit.compiler.transpile() sur une liste de circuits comportant un seul élément, la fonction renvoyait un circuit au lieu d'une liste. Désormais, lorsque qiskit.compiler.transpile() est appelé avec une liste, il renverra une liste même si cette liste n'a qu'un seul élément. Voir #5260.

    from qiskit import *
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    transpiled = transpile([qc])
    print(type(transpiled), len(transpiled))
    <class 'list'> 1

Aer 0.7.3

Nouvelles fonctions

  • Python 3.9 a été ajouté dans cette version. Vous pouvez maintenant exécuter Qiskit Aer en utilisant Python 3.9 sans construire à partir des sources.

Corrections des erreurs

  • Correction d'un problème lié à la définition des portes de base de QasmSimulator lors de l'utilisation conjointe des options "method" et "noise_model" , et lors de leur utilisation avec un simulateur construit à l'aide de from_backend(). Désormais, les portes de base énumérées seront l'intersection des portes prises en charge par la configuration du backend, la méthode de simulation et les portes de base du modèle de bruit. Si l'intersection des portes de base du modèle de bruit et des portes de base du simulateur est vide, un avertissement sera enregistré.
  • Correction d'un bogue qui faisait que c_if ne fonctionnait pas lorsque la largeur du registre conditionnel était supérieure à 64. Voir #1077.
  • Correction d'un bogue dans from_backend() et from_backend()basis_gates était défini de manière incorrecte pour les appareils IBMQ dont la porte de base était définie sur ['id', 'rz', 'sx', 'x', 'cx']. Désormais, le modèle de bruit aura toujours les mêmes portes de base que les portes de base du backend, que ces instructions comportent ou non des erreurs dans le modèle de bruit.
  • Correction d'un bogue lors de l'application de la troncature dans la méthode d'état du produit matriciel de QasmSimulator.

Ignis 0.5.1

Pas de modification

Aqua 0.8.1

Pas de modification

IBM 0.11.1 du fournisseur Q

Pas de modification


0.23.2

Terra 0.16.1

Pas de modification

Aer 0.7.2

Nouvelles fonctions

  • Ajoutez le drapeau CMake DISABLE_CONAN (default=`OFF\``)s. Lors de l'installation à partir des sources, la valeur ONpermet de contourner le gestionnaire de paquets Conan pour trouver les bibliothèques déjà installées sur votre système. Ceci est également disponible sous la forme d'une variable d'environnementDISABLE_CONAN`, qui a la priorité sur le drapeau CMake. Il ne s'agit pas de la procédure officielle pour construire l'ARE. Il incombe donc à l'utilisateur de fournir toutes les bibliothèques nécessaires et les fichiers correspondants pour que CMake puisse les trouver.

Corrections des erreurs

  • Correction d'un bogue avec les OpenMP imbriqués dont le drapeau était positionné à true alors qu'il ne devait pas l'être.

Ignis 0.5.1

Pas de modification

Aqua 0.8.1

Pas de modification

IBM 0.11.1 du fournisseur Q

Pas de modification


0.23.1

Terra 0.16.1

Corrections des erreurs

  • Correction d'un problème qui provoquait une erreur lors de l'exécution de circuits valides construits avec des retards.
  • La définition QASM de ‘c4x’ dans qelib1.inc a été corrigée pour correspondre à la définition de la bibliothèque standard pour C4XGate.
  • Correction d'un bogue dans la soustraction pour les canaux quantiques ABA - B lorsque BB était un objet Operator objet. La négation était appliquée à la matrice dans la représentation de l'opérateur, ce qui n'est pas équivalent à la négation dans la représentation du canal quantique.
  • Modifie la façon dont _evolve_instruction() accède aux qubits pour gérer le cas d'une instruction comportant plusieurs registres.

Aer 0.7.1

Mise à niveau

  • La version minimale de cmake pour construire qiskit-aer est passée de 3.6 à 3.8. Ce changement était nécessaire pour permettre la correction des versions de GPU qui supportent l'exécution sur les CPU x86_64 qui n'ont pas d'instructions AVX2.

Corrections des erreurs

  • qiskit-aer avec le support GPU fonctionnera maintenant sur les systèmes avec des CPU x86_64 qui n'ont pas d'instructions AVX2. Auparavant, le paquet GPU ne s'exécutait que si les instructions AVX2 étaient disponibles. Corrige #1023
  • Correction d'un bogue avec AerProvider où les options définies sur les backends retournés en utilisant set_options() étaient stockées dans le fournisseur et persistaient pour les appels ultérieurs à get_backend() pour le même backend nommé. Désormais, chaque appel à et backends() renvoie une nouvelle instance du backend du simulateur qui peut être configuré.
  • Correction d'un bogue dans le message d'erreur renvoyé lorsqu'un circuit contient des instructions de simulateur non prises en charge. Auparavant, certaines instructions prises en charge figuraient également dans le message d'erreur avec les instructions non prises en charge.
  • Correction d'un bug où la porte "sx"` n'était pas listée comme supportée dans le code C++, dans de SXGate n'était pas listée comme une porte supportée dans le code C++, dans StateOpSet de matrix_product_state.hp.
  • Correction d'un bug où "csx", "cu2", "cu3" étaient incorrectement listés comme portes de base supportées pour la méthode "density_matrix" de la méthode QasmSimulator.
  • Dans MPS, apply_kraus opérait directement sur les bits d'entrée des qubits de paramètres, au lieu des qubits internes. Dans l'algorithme MPS, les qubits sont constamment en mouvement et toutes les opérations doivent donc être appliquées aux qubits internes.
  • Lorsque nous invoquons MPS::sample_measure, nous devons d'abord trier les qubits selon l'ordre par défaut, car c'est l'hypothèse de qasm_controller.This, en invoquant la méthode move_all_qubits_to_sorted_ordering. Il était correct dans l'échantillon "mesure" utilisant "application" de la mesure, mais manquait dans l'échantillon "mesure" utilisant "probabilité".

Ignis 0.5.1

Corrections des erreurs

  • Corriger la méthode "auto" de TomographyFitter, StateTomographyFitter, et ProcessTomographyFitter pour n'utiliser "cvx" que si CVXPY est installé et qu' un solveur SDP tiers autre que SCS est disponible. En effet, le solveur SCS est moins précis que les autres méthodes de résolution et renvoie souvent une matrice de densité ou une matrice de Choi qui n'est pas complètement positive et qui échoue à la validation lorsqu'elle est utilisée avec la méthode qiskit.quantum_info.state_fidelity() ou qiskit.quantum_info.process_fidelity() et échoue à la validation.

Aqua 0.8.1

0.8.1

Nouvelles fonctions

  • Un nouvel algorithme a été ajouté : la surface d'énergie potentielle de Born Openheimer pour le calcul de la surface d'énergie potentielle le long des différents degrés de liberté de la molécule. L'algorithme est appelé BOPESSampler. Il permet en outre d'adapter la surface d'énergie potentielle à une fonction analytique de détails prédéfinis ( potentials.some ).

Problèmes critiques

  • Sachez que le paramètre initial_state dans QAOA a maintenant une implémentation différente à la suite d'une correction de bogue. L'implémentation précédente mélangeait de manière erronée le site initial_state fourni par l'utilisateur avec les portes de Hadamard. Le problème est maintenant résolu. Aucune attention n'est requise si votre code n'utilise pas le paramètre initial_state fourni par l'utilisateur.

Corrections des erreurs

  • optimize_svm de qp_solver échouait parfois, ce qui entraînait une erreur du type suivant ValueError: cannot reshape array of size 1 into shape (200,1) Ce problème est résolu par l'ajout d'un paramètre de norme L2, lambda2, dont la valeur par défaut est 0.001 mais qui peut être modifié par l'algorithme QSVM, le cas échéant, pour faciliter la convergence.
  • Une méthode one_letter_symbol a été supprimée de la méthode VarType dans la dernière version de DOCplex, ce qui rend Aqua incompatible avec cette version. Au lieu d'utiliser cette méthode, une vérification explicite des types de variables a été introduite dans le module d'optimisation Aqua.
  • :meth`~qiskit.aqua.operators.state_fns.DictStateFn.sample()`` ne pouvait traiter que les amplitudes réelles, mais il est corrigé pour traiter les amplitudes complexes. #1311 <https://github.com/qiskit-community/qiskit-aqua/issues/1311> pour plus de détails.
  • La classe Trotter n'a pas utilisé l'argument reps dans le constructeur. #1317 <https://github.com/qiskit-community/qiskit-aqua/issues/1317> pour plus de détails.
  • Lève un AquaError si :class`qiskit.aqua.operators.converters.CircuitSampler` échantillonne un opérateur vide. #1321 <https://github.com/qiskit-community/qiskit-aqua/issues/1321> pour plus de détails.
  • to_opflow() renvoie un opérateur correct lorsque les coefficients sont des nombres complexes. #1381 <https://github.com/qiskit-community/qiskit-aqua/issues/1381> pour plus de détails.
  • Laissez les simulateurs backend valider la prise en charge de NoiseModel au lieu de se limiter à Aer uniquement dans QuantumInstance.
  • Traiter correctement PassManager sur la méthode QuantumInstance transpile en appelant sa méthode run si elle existe.
  • Un bogue qui mélangeait les initial_state personnalisés dans QAOA avec les portes de Hadamard a été corrigé. Cela ne modifie pas la fonctionnalité du QAOA si aucun état initial n'est fourni par l'utilisateur. Il convient de faire attention si votre implémentation utilise QAOA avec le paramètre cusom initial_state , car les résultats de l'optimisation peuvent être différents.
  • Auparavant, la mise en place de seed_simulator=0 sur le site QuantumInstance n'entraînait pas la mise en place de semences. Cela n'affectait que la valeur 0. Ce point a été corrigé.

IBM 0.11.1 du fournisseur Q

Nouvelles fonctions

  • qiskit.providers.ibmq.experiment.Experiment possède désormais trois attributs supplémentaires, hub, group et project, qui identifient le fournisseur utilisé pour créer l'expérience.
  • Les méthodes qiskit.providers.ibmq.experiment.ExperimentService.experiments() et qiskit.providers.ibmq.experiment.ExperimentService.analysis_results() prennent désormais en charge un paramètre limit qui vous permet de limiter le nombre d'expériences et de résultats d'analyse renvoyés.

Mise à niveau

  • Un nouveau paramètre, limit , est désormais le premier paramètre des méthodes qiskit.providers.ibmq.experiment.ExperimentService.experiments() et qiskit.providers.ibmq.experiment.ExperimentService.analysis_results() . Cette adresse limit a une valeur par défaut de 10, ce qui signifie que, par défaut, seuls 10 expériences et résultats d'analyse seront renvoyés.

Corrections des erreurs

  • Corrige le problème dans lequel un travail pouvait rester dans l'état CREATING si la soumission du travail échouait à mi-parcours.
  • Corrige la boucle infinie soulevée lors du passage d'une instance de IBMQRandomService à un processus enfant.

0.23.0

Terra 0.16.0

Prélude

La version 0.16.0 comprend plusieurs nouvelles fonctionnalités et corrections de bogues. Les principales caractéristiques de cette version sont les suivantes :

  • Introduction des circuits programmés, où les retards peuvent être utilisés pour contrôler la synchronisation et l'alignement des opérations dans le circuit.
  • Compilation de circuits quantiques à partir de fonctions classiques, telles que les oracles.
  • Possibilité de compiler et d'optimiser les rotations d'un qubit unique sur différentes bases d'Euler ainsi que sur la base phase + racine carrée (X) (c.-à-d. ['p', 'sx']), qui remplacera l'ancienne base IBM Quantum de ['u1', 'u2', 'u3'].
  • Suivi de global_phase() sur la classe QuantumCircuit a été étendu par le biais de la classe transpiler, quantum_info, et assembler ainsi que par les simulateurs BasicAer et Aer. Les simulations de matrices unitaires et de vecteurs d'état renvoient désormais des matrices unitaires et des vecteurs d'état corrects en phase.

Il est également important de noter que Python 3.5 n'est plus pris en charge. Si vous utilisez Qiskit Terra avec Python 3.5, la version 0.15.2 est la dernière version qui fonctionnera.

Nouvelles fonctions

  • Des portes R globales ont été ajoutées à qiskit.circuit.library. Il s'agit de la porte R globale (GR), la porte globale Rx (GRX) et Ry (GRY) qui sont dérivées de la porte GR et la porte globale Rz ( GRZ), qui est définie de la même manière que les portes GR portes. Les portes R globales sont définies sur un certain nombre de qubits simultanément et agissent comme une somme directe de portes R sur chaque qubit.

    Par exemple :

    from qiskit import QuantumCircuit, QuantumRegister
    import numpy as np
    
    num_qubits = 3
    qr = QuantumRegister(num_qubits)
    qc = QuantumCircuit(qr)
    
    qc.compose(GR(num_qubits, theta=np.pi/3, phi=2*np.pi/3), inplace=True)

    créera un QuantumCircuit sur un QuantumRegister de 3 qubits et effectuer un RGate d'un angle θ=π3\theta = \frac{\pi}{3} autour d'un axe dans le plan xy des sphères de Bloch qui fait un angle de ϕ=2π3\phi = \frac{2\pi}{3} avec l'axe x sur chaque qubit.

  • Un nouveau schéma de couleurs, iqx, a été ajouté au backend mpl pour le tiroir du circuit qiskit.visualization.circuit_drawer() et qiskit.circuit.QuantumCircuit.draw(). Il utilise la même palette de couleurs que le compositeur de circuits sur le site web IBM Quantum Experience. Il y a maintenant 3 schémas de couleurs disponibles - default, iqx, et bw.

    Il y a deux façons de sélectionner une palette de couleurs. La première consiste à utiliser un fichier de configuration utilisateur, par défaut dans le répertoire ~/.qiskit , dans le fichier settings.conf sous le titre [Default] , un utilisateur peut entrer circuit_mpl_style = iqx pour sélectionner le schéma de couleurs iqx .

    La deuxième méthode consiste à ajouter {'name': 'iqx'} au kwarg style à la méthode QuantumCircuit.draw ou à la fonction circuit_drawer . La deuxième méthode permet de remplacer les paramètres du fichier settings.conf. Par exemple :

    from qiskit.circuit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    circuit.draw('mpl', style={'name': 'iqx'})
  • Dans le style kwarg pour le tiroir du circuit qiskit.visualization.circuit_drawer() et qiskit.circuit.QuantumCircuit.draw() le champ displaycolor avec le backend mpl permet maintenant de saisir la couleur de la porte et la couleur du texte pour chaque type de porte dans le formulaire (gate_color, text_color). Cela permet d'utiliser des couleurs de portail claires et foncées avec des couleurs de texte contrastées. Les utilisateurs peuvent toujours définir uniquement la couleur de la porte, auquel cas le champ gatetextcolor sera utilisé. Les couleurs des portes peuvent être définies dans le dict style pour un nombre quelconque de types de portes, allant d'une seule à l'ensemble du dict displaycolor . Par exemple :

    from qiskit.circuit import QuantumCircuit
    
    circuit = QuantumCircuit(1)
    circuit.h(0)
    
    style_dict = {'displaycolor': {'h': ('#FA74A6', '#000000')}}
    circuit.draw('mpl', style=style_dict)

    ou

    style_dict = {'displaycolor': {'h': '#FA74A6'}}
    circuit.draw('mpl', style=style_dict)
  • Deux contextes d'alignement sont ajoutés au générateur d'impulsions (qiskit.pulse.builder) pour faciliter l'écriture d'une séquence d'impulsions répétée avec des retards.

    • qiskit.pulse.builder.align_equispaced() insère des délais de longueur équivalente entre les horaires des impulsions dans le contexte.
    • qiskit.pulse.builder.align_func() offre un contrôle plus avancé de la position de l'impulsion. Ce contexte accepte un appel qui calcule une coordonnée fractionnaire de la i-ième impulsion et aligne les impulsions dans le contexte. Cela facilite le codage du découplage dynamique.
  • Un paramètre rep_delay a été ajouté à la classe QasmQobj dans la configuration d'exécution, QasmQobjConfig. Ce paramètre est utilisé pour indiquer le temps entre les exécutions du programme. Il doit être choisi dans la gamme de backend donnée par la méthode BackendConfiguration méthode rep_delay_range(). Si aucune valeur n'est fournie, la valeur par défaut du backend, qiskit.providers.models.BackendConfiguration.default_rep_delay, sera utilisée. rep_delay ne fonctionnera qu'avec les backends qui permettent une durée de répétition dynamique. Ceci peut être vérifié avec la propriété BackendConfiguration propriété dynamic_reprate_enabled.

  • Le fichier JSON Schema de qobj_schema.json dans qiskit.schemas a été mis à jour pour inclure rep_delay comme propriété de configuration optionnelle pour les Qobjs de QASM.

  • Le fichier JSON Schema de backend_configuration_schema.json dans qiskit.schemas a été mis à jour pour inclure dynamic_reprate_enabled, rep_delay_range et default_rep_delay comme propriétés optionnelles pour une charge utile de configuration du backend QASM.

  • Une nouvelle passe d'optimisation, qiskit.transpiler.passes.TemplateOptimization a été ajoutée au transpileur. Cette passe applique un algorithme de correspondance de modèles décrit dans arXiv:1909.05270 qui remplace toutes les correspondances maximales compatibles dans le circuit.

    Pour mettre en œuvre cette nouvelle passe de transpilation, un nouveau module, template_circuits, a été ajouté à la bibliothèque de circuits (qiskit.circuit.library). Ce nouveau module contient tous les modèles de circuits de Toffoli utilisés dans le programme TemplateOptimization.

    Ce nouveau pass n'est actuellement pas inclus dans les gestionnaires de pass prédéfinis (qiskit.transpiler.preset_passmanagers ), pour l'utiliser, vous devrez créer un compte personnalisé PassManager.

  • Une nouvelle version de l'interface des fournisseurs a été ajoutée. Cette nouvelle interface, qui se trouve dans qiskit.providersfournit un nouveau mécanisme de versionnement qui permettra de modifier l'interface de manière compatible au fil du temps. La nouvelle interface devrait être facile à migrer pour les fournisseurs existants, car elle est en grande partie identique, à l'exception du versionnement explicite.

    Outre le fait d'avoir des classes abstraites explicitement versionnées, les principaux changements apportés à la nouvelle interface sont que les BackendV1 méthode run() peut désormais prendre en entrée un objet QuantumCircuit ou Schedule au lieu d'objets Qobj . En outre, les options font désormais partie d'une classe d'arrière-plan qui permet aux utilisateurs de configurer les options d'exécution lorsqu'ils utilisent un circuit. Le dernier changement est que qiskit.providers.JobV1 peut désormais être synchrone ou asynchrone. La configuration exacte et la méthode de configuration dépendent du fournisseur, mais il existe des points d'accroche d'interface pour rendre explicite le modèle d'exécution d'un travail dans la classe abstraite JobV1 .

  • Un nouveau kwarg, inplace, a été ajouté à la fonction qiskit.result.marginal_counts(). Ce kwarg est utilisé pour contrôler si le contenu est marginalisé sur place ou si une nouvelle copie est renvoyée, dans le cas d'une Result l'entrée d'un objet. Ce paramètre n'a pas d'effet sur une entrée dict ou un objet Counts objet.

  • Une première version d'un compilateur de fonctions classique, qiskit.circuit.classicalfunctiona été ajoutée. Cela permet de compiler les fonctions typées de Python (qui ne fonctionnent que sur des bits de type Int1 pour l'instant) en QuantumCircuit objets. Par exemple :

    from qiskit.circuit import classical_function, Int1
    
    @classical_function
    def grover_oracle(a: Int1, b: Int1, c: Int1, d: Int1) -> Int1:
         x = not a and b
         y = d and not c
         z = not x or y
         return z
    
    quantum_circuit = grover_oracle.synth()
    quantum_circuit.draw()

    Le paramètre registerless=False dans la méthode qiskit.circuit.classicalfunction.ClassicalFunction méthode synth() crée un circuit avec des registres se référant aux noms des paramètres. Par exemple :

    quantum_circuit = grover_oracle.synth(registerless=False)
    quantum_circuit.draw()

    Une fonction classique décorée peut être utilisée de la même manière que n'importe quelle autre porte quantique lorsqu'elle est ajoutée à un circuit.

    circuit = QuantumCircuit(5)
    circuit.append(grover_oracle, range(5))
    circuit.draw()

    La porte GROVER_ORACLE est synthétisée lorsque sa décomposition est nécessaire.

    circuit.decompose().draw()

    Cette fonctionnalité nécessite tweedledum, une bibliothèque pour la synthèse de circuits quantiques, qui peut être installée via pip avec pip install tweedledum.

  • Une nouvelle classe qiskit.circuit.Delay pour représenter une instruction de retard dans un circuit a été ajoutée. Une nouvelle méthode delay() est désormais disponible pour ajouter facilement des retards aux circuits. Cela permet de décrire des expériences sensibles au temps (par exemple, l'expérience T1/T2 ) au niveau du circuit.

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(1, 1)
    qc.delay(500, 0, unit='ns')
    qc.measure(0, 0)
    
    qc.draw()
  • Un nouvel argument scheduling_method pour qiskit.compiler.transpile() a été ajouté. Elle est nécessaire lors de la transposition de circuits avec des retards. Si scheduling_method est spécifié, le transpileur renvoie un circuit programmé tel que tous les temps morts qu'il contient sont complétés par des retards (c'est-à-dire que l'heure de début de chaque instruction est déterminée de manière unique). Cela permet de voir comment les instructions programmées (portes) se présentent au niveau du circuit.

    from qiskit import QuantumCircuit, transpile
    from qiskit.test.mock.backends import FakeAthens
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    
    scheduled_circuit = transpile(qc, backend=FakeAthens(), scheduling_method="alap")
    print("Duration in dt:", scheduled_circuit.duration)
    scheduled_circuit.draw(idle_wires=False)

    Voir aussi timeline_drawer() pour une meilleure visualisation des circuits programmés.

  • Une nouvelle fonction qiskit.compiler.sequence() a également été ajoutée afin que nous puissions convertir un circuit programmé en une fonction Schedule pour le rendre exécutable sur un backend à impulsions.

    from qiskit.compiler import sequence
    
    sched = sequence(scheduled_circuit, pulse_enabled_backend)
  • L'application schedule() a été mis à jour afin de pouvoir programmer des circuits avec des retards. Il y a maintenant deux façons de programmer un circuit avec retard :

    qc = QuantumCircuit(1, 1)
    qc.h(0)
    qc.delay(500, 0, unit='ns')
    qc.h(0)
    qc.measure(0, 0)
    
    sched_path1 = schedule(qc.decompose(), backend)
    sched_path2 = sequence(transpile(qc, backend, scheduling_method='alap'), backend)
    assert pad(sched_path1) == sched_path2

    Reportez-vous aux notes de mise à jour et à la documentation pour transpile() et sequence() pour plus de détails sur l'autre chemin.

  • Ajout du GroverOperator à la bibliothèque de circuits (qiskit.circuit.library) pour construire l'opérateur de Grover utilisé dans l'algorithme de recherche de Grover et l'amplification/estimation de l'amplitude quantique. Muni d'un oracle sous la forme d'un circuit, GroverOperator crée l'opérateur de Grover du manuel. Pour généraliser cela à l'amplification d'amplitude et utiliser un opérateur générique au lieu des portes de Hadamard pour la préparation de l'état, l'argument state_in peut être utilisé.

  • Les InstructionScheduleMap méthodes get() et pop() prennent désormais en compte les instances ParameterExpression en plus des valeurs numériques des paramètres du générateur de calendrier. Si le générateur est une fonction, les expressions peuvent être liées avant ou dans l'appel de la fonction. Si le générateur est un ParametrizedSchedule, les expressions doivent être liées avant que la programmation elle-même ne soit liée/appelée.

  • Une nouvelle classe LinearAmplitudeFunction a été ajoutée à la bibliothèque de circuits (qiskit.circuit.library) pour le mappage de fonctions linéaires (par morceaux) sur les amplitudes des qubits,

Fx0=1f(x)x0+f(x)x1F|x\rangle |0\rangle = \sqrt{1 - f(x)}|x\rangle |0\rangle + \sqrt{f(x)}|x\rangle |1\rangle

La cartographie est basée sur un contrôle des rotations Y de Pauli et une approximation de Taylor, comme décrit dans le document https://arxiv.org/abs/1806.06893. Ce circuit peut être utilisé pour calculer les valeurs d'espérance des fonctions linéaires à l'aide de l'algorithme d'estimation quantique de l'amplitude.

  • La nouvelle magie jupyter monospaced_output a été ajoutée au module qiskit.tools.jupyter module. Cette magie définit la police de sortie du notebook Jupyter à "Courier New", dans la mesure du possible. Lorsqu'elle est utilisée, cette police permet d'obtenir des dessins de circuits de texte mieux alignés.

    import qiskit.tools.jupyter
    %monospaced_output
  • Un nouveau passeur de transpondeurs, Optimize1qGatesDecompositiona été ajoutée. Cette passe de transpilation est une alternative à la passe existante de Optimize1qGates existante, qui utilise la classe OneQubitEulerDecomposer pour décomposer et simplifier une chaîne de portes à qubit unique. Cette méthode est compatible avec n'importe quel ensemble de base, alors que Optimize1qGates ne fonctionne que pour u1, u2, et u3. Les gestionnaires de passe par défaut pour optimization_level 1, 2 et 3 ont été mis à jour pour utiliser cette nouvelle passe si l'ensemble de base ne comprend pas u1, u2 ou u3.

  • Le programme OneQubitEulerDecomposer supporte désormais deux nouvelles bases, 'PSX' et 'U'. Ceux-ci peuvent être spécifiés à l'aide du kwarg basis dans le constructeur. Cela permettra de décomposer la matrice en un circuit utilisant PGate et SXGate pour 'PSX', et UGate pour 'U'.

  • Une nouvelle méthode remove() a été ajoutée à la classe qiskit.transpiler.PassManager a vu l'ajout d'une nouvelle méthode. Cette méthode permet de retirer un laissez-passer d'une PassManager instance. Il fonctionne sur les index, de la même manière que replace(). Par exemple, pour supprimer la passe RemoveResetInZeroState du gestionnaire de passes utilisé au niveau d'optimisation 1 :

    from qiskit.transpiler.preset_passmanagers import level_1_pass_manager
    from qiskit.transpiler.passmanager_config import PassManagerConfig
    
    pm = level_1_pass_manager(PassManagerConfig())
    pm.draw()
    [0] FlowLinear: UnrollCustomDefinitions, BasisTranslator
    [1] FlowLinear: RemoveResetInZeroState
    [2] DoWhile: Depth, FixedPoint, Optimize1qGates, CXCancellation

    La scène [1] avec RemoveResetInZeroState peut être enlevée comme suit :

    pass_manager.remove(1)
    pass_manager.draw()
    [0] FlowLinear: UnrollCustomDefinitions, BasisTranslator
    [1] DoWhile: Depth, FixedPoint, Optimize1qGates, CXCancellation
  • Plusieurs classes permettant de charger des distributions de probabilités en amplitudes de qubit; UniformDistribution, NormalDistribution, et LogNormalDistribution ont été ajoutées à la bibliothèque de circuits (qiskit.circuit.library). Les distributions normale et log-normale prennent en charge les distributions univariées et multivariées. Ces circuits sont essentiels pour les applications financières qui utilisent l'estimation quantique de l'amplitude.

  • La prise en charge des portes à impulsion a été ajoutée à la classe QuantumCircuit classe. Cela permet à un QuantumCircuit de remplacer (pour les portes de base) ou de spécifier (pour les portes standard et personnalisées) une définition d'une opération en termes de signaux ordonnés dans le temps sur les canaux matériels Gate en termes de signaux ordonnés dans le temps sur les canaux matériels. En d'autres termes, il permet de fournir des étalonnages de porte personnalisés au niveau de l'impulsion.

    Les circuits sont construits exactement comme auparavant. Par exemple :

    from qiskit import pulse
    from qiskit.circuit import QuantumCircuit, Gate
    
    class RxGate(Gate):
        def __init__(self, theta):
            super().__init__('rxtheta', 1, [theta])
    
    circ = QuantumCircuit(1)
    circ.h(0)
    circ.append(RxGate(3.14), [0])

    Ensuite, le calibrage de la porte peut être enregistré à l'aide de la QuantumCircuit méthode add_calibration() qui prend une définition de Schedule ainsi que les qubits et les paramètres pour lesquels elle est définie :

    # Define the gate implementation as a schedule
    with pulse.build() as custom_h_schedule:
        pulse.play(pulse.library.Drag(...), pulse.DriveChannel(0))
    
    with pulse.build() as q1_x180:
        pulse.play(pulse.library.Gaussian(...), pulse.DriveChannel(1))
    
    # Register the schedule to the gate
    circ.add_calibration('h', [0], custom_h_schedule)  # or gate.name string to register
    circ.add_calibration(RxGate(3.14), [0], q1_x180)   # Can accept gate

    Auparavant, cette fonctionnalité ne pouvait être utilisée qu'à travers des calendriers d'impulsions complets. En outre, les circuits peuvent désormais être soumis à des backends avec vos définitions personnalisées (en fonction du support du backend).

    Les circuits avec des portes à impulsions peuvent encore être abaissés à un Schedule en utilisant la fonction schedule() fonction.

    La porte calibrée peut également être transposée à l'aide du processus de transposition habituel :

    transpiled_circuit = transpile(circ, backend)

    Le circuit transposé laissera les portes calibrées sur le même qubit que le circuit original et ne les déroulera pas jusqu'aux portes de base.

  • La prise en charge du désassemblage des objets PulseQobj a été ajoutée à la fonction qiskit.assembler.disassemble() fonction. Par exemple :

    from qiskit import pulse
    from qiskit.assembler.disassemble import disassemble
    from qiskit.compiler.assemble import assemble
    from qiskit.test.mock import FakeOpenPulse2Q
    
    backend = FakeOpenPulse2Q()
    
    d0 = pulse.DriveChannel(0)
    d1 = pulse.DriveChannel(1)
    with pulse.build(backend) as sched:
        with pulse.align_right():
            pulse.play(pulse.library.Constant(10, 1.0), d0)
            pulse.shift_phase(3.11, d0)
            pulse.measure_all()
    
    qobj = assemble(sched, backend=backend, shots=512)
    scheds, run_config, header = disassemble(qobj)
  • Un nouveau kwarg, coord_type a été ajouté à qiskit.visualization.plot_bloch_vector(). Ce kwarg permet de changer le système de coordonnées utilisé pour le paramètre d'entrée qui décrit le positionnement du vecteur sur la sphère de Bloch dans la visualisation générée. Deux valeurs sont prises en charge pour ce nouveau kwarg : 'cartesian' (la valeur par défaut) et 'spherical'. Si le kwarg coord_type est défini sur 'spherical' , la liste des paramètres pris en compte est de la forme [r, theta,  phi]r est le rayon, theta est l'inclinaison de la direction +z, et phi est l'azimut de la direction +x. Par exemple :

    from numpy import pi
    
    from qiskit.visualization import plot_bloch_vector
    
    x = 0
    y = 0
    z = 1
    r = 1
    theta = pi
    phi = 0
    
    
    # Cartesian coordinates, where (x,y,z) are cartesian coordinates
    # for bloch vector
    plot_bloch_vector([x,y,z])
    plot_bloch_vector([x,y,z], coord_type="cartesian")  # Same as line above
    # Spherical coordinates, where (r,theta,phi) are spherical coordinates
    # for bloch vector
    plot_bloch_vector([r, theta, phi], coord_type="spherical")
  • Les objets Pulse Schedule permettent désormais d'utiliser des objets ParameterExpression pour les paramètres.

    Par exemple :

    from qiskit.circuit import Parameter
    from qiskit import pulse
    
    alpha = Parameter('⍺')
    phi = Parameter('ϕ')
    qubit = Parameter('q')
    amp = Parameter('amp')
    
    schedule = pulse.Schedule()
    schedule += SetFrequency(alpha, DriveChannel(qubit))
    schedule += ShiftPhase(phi, DriveChannel(qubit))
    schedule += Play(Gaussian(duration=128, sigma=4, amp=amp),
                     DriveChannel(qubit))
    schedule += ShiftPhase(-phi, DriveChannel(qubit))

    L'affectation des paramètres se fait via la méthode assign_parameters() méthode :

    schedule.assign_parameters({alpha: 4.5e9, phi: 1.57,
                                qubit: 0, amp: 0.2})

    Les expressions et l'affectation partielle fonctionnent également, par exemple :

    beta = Parameter('b')
    schedule += SetFrequency(alpha + beta, DriveChannel(0))
    schedule.assign_parameters({alpha: 4.5e9})
    schedule.assign_parameters({beta: phi / 6.28})
  • Une nouvelle fonction de visualisation timeline_drawer() a été ajoutée au module qiskit.visualization module.

    Par exemple :

    from qiskit.visualization import timeline_drawer
    from qiskit import QuantumCircuit, transpile
    from qiskit.test.mock import FakeAthens
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0,1)
    timeline_drawer(transpile(qc, FakeAthens(), scheduling_method='alap'))

Mise à niveau

  • La vérification du type du kwarg params du constructeur de la classe et de ses sous-classes a été modifiée Gate et de ses sous-classes a été modifiée. Auparavant, tous les Gate devaient faire partie d'un ensemble de types autorisés définis dans la Instruction classe. Il existe désormais une nouvelle méthode, validate_parameter() est utilisée pour déterminer si un type de paramètre est valide ou non. La définition de cette méthode dans une sous-classe aura la priorité sur celle de son parent. Par exemple, UnitaryGate accepte un paramètre du type numpy.ndarray et définit une méthode validate_parameter() personnalisée qui renvoie le paramètre s'il s'agit d'un numpy.ndarray. Cette fonction est prioritaire par rapport à la fonction définie dans sa classe d'origine Gate. Si UnitaryGate devait être utilisé comme parent d'une nouvelle classe, cette méthode validate_parameter serait utilisée à moins que la nouvelle classe enfant ne définisse sa propre méthode.

  • Les méthodes, arguments et propriétés précédemment obsolètes nommés n_qubits et numberofqubits ont été supprimés. Ils ont été supprimés dans la version 0.13.0. L'ensemble des changements sont les suivants :

    Classe
    Ancien
    Nouveau
    QuantumCircuitn_qubitsnum_qubits
    Paulinumberofqubitsnum_qubits
    Fonction
    Vieil argument
    Nouvel argument
    qiskit.circuit.random.random_circuit()n_qubitsnum_qubits
    qiskit.circuit.library.MSGaten_qubitsnum_qubits
  • Insérer une instance paramétrée Gate dans un QuantumCircuit crée maintenant une copie de cette porte qui est utilisée dans le circuit. Si des modifications sont apportées à l'instance insérée dans le circuit, elles ne seront plus reflétées dans la porte du circuit. Cette modification a été apportée pour résoudre un problème lors de l'insertion d'un seul objet paramétré dans plusieurs circuits Gate dans plusieurs circuits.

  • La fonction qiskit.result.marginal_counts() ne modifie plus, par défaut, le paramètre qiskit.result.Result paramètre d'instance. Auparavant, l'objet Result était toujours modifié sur place. Un nouveau kwarg inplace a été ajouté marginal_counts() qui permet d'utiliser le comportement précédent lorsque inplace=True est défini.

  • La définition U3Gate a été modifiée pour s'appliquer à la classe UGate classe. La classe UGate n'a pas de définition. Il n'est donc plus possible de dérouler chaque circuit en termes de U3 et CX. Au lieu de cela, U et CX peuvent être utilisés pour chaque circuit.

  • La prise en charge obsolète de l'exécution de Qiskit Terra avec Python 3.5 a été supprimée. Pour utiliser Qiskit Terra à partir de cette version, vous devrez utiliser au moins Python 3.6. Si vous utilisez Python 3.5, la dernière version qui fonctionnera est Qiskit Terra 0.15.2.

  • Dans les attributs PulseBackendConfiguration dans les attributs hamiltonian , le champ vars est maintenant retourné dans l'unité Hz au lieu de l'unité GHz précédemment utilisée. Ce changement a été effectué pour être cohérent avec les unités utilisées pour les autres attributs de la classe.

  • Le support précédemment déprécié pour passer un dictionnaire comme premier argument positionnel au constructeur de DAGNode a été supprimée. L'utilisation d'un dicton pour le premier argument positionnel a été supprimée dans la version 0.13.0. Pour créer un objet DAGNode il faut maintenant passer directement les attributs comme kwargs au constructeur.

  • Les arguments de mot-clé pour les méthodes de porte de circuit (par exemple : qiskit.circuit.QuantumCircuit.cx) q, ctl*, et tgt*, qui étaient obsolètes dans la version 0.12.0, ont été supprimés. Au lieu de cela, seuls qubit, control_qubit* et target_qubit* peuvent être utilisés comme arguments nommés pour ces méthodes.

  • Le module qiskit.extensions.standard , précédemment obsolète, a été supprimé. Ce module est obsolète depuis la version 0.14.0. Les qiskit.circuit.library peut être utilisé à la place. En outre, toutes les classes de portes qui se trouvaient auparavant dans qiskit.extensions.standard sont toujours importables à partir du fichier qiskit.extensions.

  • Les portes précédemment dépréciées dans le module qiskit.extensions.quantum_initializer: DiagGate, UCG`, UCPauliRotGate, UCRot, UCRXGate, UCX, UCRYGate, UCY, UCRZGate, UCZ ont été supprimées. Elles ont toutes été supprimées dans la version 0.14.0 et des alternatives sont disponibles dans la bibliothèque de circuits (qiskit.circuit.library).

  • La méthode qiskit.circuit.QuantumCircuitiden() a été supprimée. Cette fonction a été supprimée dans la version 0.13.0 et i() ou id() peut être utilisé à la place.

Remarques concernant la dépréciation

  • L'utilisation d'un numpy.ndarray pour un paramètre dans le kwarg params pour le constructeur de la classe et des sous-classes Gate et de ses sous-classes a été dépréciée et sera supprimée dans les prochaines versions. Cela a été fait dans le cadre du remaniement de la manière dont parms gère la vérification des types pour la classe Gate classe. Si vous avez une classe de portail personnalisée qui est une sous-classe de Gate directement (ou via un parent différent dans la hiérarchie) qui accepte un paramètre ndarray , vous devez définir une méthode personnalisée validate_parameter() pour votre classe qui renverra le type de paramètre autorisé. Par exemple :

    def validate_parameter(self, parameter):
        """Custom gate parameter has to be an ndarray."""
        if isinstance(parameter, numpy.ndarray):
            return parameter
        else:
            raise CircuitError("invalid param type {0} in gate "
                               "{1}".format(type(parameter), self.name))
  • La propriété num_ancilla_qubits de la propriété PiecewiseLinearPauliRotations et PolynomialPauliRotations est obsolète et sera supprimée dans une prochaine version. La propriété num_ancillas doit être utilisée à la place. Cette mesure a été prise pour assurer la cohérence avec la QuantumCircuit méthode num_ancillas().

  • La classe qiskit.circuit.library.MSGate est obsolète, mais restera en place pour permettre le chargement d'anciens travaux. Elle a été remplacée par la classe qiskit.circuit.library.GMS qu'il convient d'utiliser à la place.

  • La passe de transpilation MSBasisDecomposer est obsolète et sera supprimée dans une prochaine version. Le laissez-passer qiskit.transpiler.passes.BasisTranslator peut être utilisé à la place.

  • Les méthodes QuantumCircuitu1 , u2 et u3 sont désormais obsolètes. Les remplacements suivants peuvent être utilisés.

    u1(theta) = p(theta) = u(0, 0, theta)
    u2(phi, lam) = u(pi/2, phi, lam) = p(pi/2 + phi) sx p(pi/2 lam)
    u3(theta, phi, lam) = u(theta, phi, lam) = p(phi + pi) sx p(theta + pi) sx p(lam)

    Les classes de portes elles-mêmes, U1Gate, U2Gate et U3Gate sont conservées pour permettre le chargement d'anciens travaux.

Corrections des erreurs

  • Les méthodes de la Result les méthodes de la classe data(), get_memory(), get_counts(), get_unitary()et get_statevector ` will now emit a warning when the ``experiment`() Le kwarg est spécifié pour les tentatives de recherche de résultats à l'aide d'un mot-clé QuantumCircuit ou Schedule lorsque plusieurs entrées correspondant au nom de l'instance sont présentes dans l'objet Result . Notez que seule la première entrée correspondant à ce nom sera renvoyée. Corrige #3207
  • La qiskit.circuit.QuantumCircuit méthode append() peut désormais être utilisée pour insérer une instance de porte paramétrée dans plusieurs circuits. Ceci corrige un problème précédent où l'insertion d'un seul objet paramétré dans plusieurs circuits provoquait des échecs lorsqu'un circuit avait un paramètre assigné Gate dans plusieurs circuits entraînait des échecs lorsque l'un des circuits était affecté d'un paramètre. Corrige #4697
  • Auparavant, la fonction qiskit.execute.execute() interdisait à tort la spécification simultanée des kwargs backend et pass_manager . Cette erreur a été corrigée de manière à ce que backend et pass_manager puissent être utilisés ensemble lors d'appels à execute(). Corrige #5037
  • La QuantumCircuit méthode unitary() a été corrigée afin d'accepter un seul entier pour l'argument qarg (lors de l'ajout d'une unité de 1 qubit). Les types autorisés pour l'argument qargs sont désormais int, Qubitou une liste d'entiers. Corrige #4944
  • Auparavant, l'appel à inverse() sur un objet BlueprintCircuit pouvait échouer si sa propriété de données internes n'était pas encore remplie. Ce problème a été corrigé de sorte que l'appel à inverse() remplit les données internes avant de générer l'inverse du circuit. Corrige #5140
  • Correction d'un problème lors de la création d'un objet qiskit.result.Counts à partir d'un dictionnaire de données vide. Cela créera un objet Counts vide. La méthode most_frequent() est également mise à jour afin de lever une exception plus descriptive lorsque l'objet est vide. Corrige #5017
  • Correction d'un bogue où le réglage de ctrl_state d'un UnitaryGate était appliqué deux fois; une fois lors de la création de la matrice pour l'unité contrôlée et une autre fois lors de l'appel de la méthode definition() de la classe qiskit.circuit.ControlledGate classe. Cela donnerait l'impression que le réglage de ctrl_state n'a aucun effet.
  • Auparavant, la ControlledGate méthode inverse() ne préservait pas le paramètre ctrl_state dans certains cas. Ce problème a été corrigé de sorte que l'appel à inverse() conserve la valeur ctrl_state dans sa sortie.
  • Correction d'un bug dans le backend de la sortie mpl du tiroir de circuit qiskit.circuit.QuantumCircuit.draw() et qiskit.visualization.circuit_drawer() qui provoquait l'échec du tiroir si le kwarg de style était une chaîne de caractères. Le comportement correct serait de traiter cette chaîne comme un chemin vers un fichier JSON contenant la feuille de style pour la visualisation. Ce problème a été corrigé et des avertissements sont émis si le fichier JSON de la feuille de style ne peut pas être chargé.
  • Correction d'une erreur lors du chargement d'un fichier QASM via from_qasm_file() ou from_qasm_str() échouait si une porte u, phase(p), sx, ou sxdg était présente dans le fichier QASM. Corrige #5156
  • Correction d'un bogue qui pouvait entraîner une mauvaise représentation des registres lors du déroulement/décomposition d'une porte définie avec une seule opération à 2 qubits.

Aer 0.7.0

Prélude

Cette version 0.7.0 comprend de nombreuses améliorations des performances et des améliorations significatives de l'interface du simulateur, et abandonne la prise en charge de Python 3.5. Les principales modifications de l'interface concernent les backends de simulateurs configurables et la construction de simulateurs préconfigurés à partir des backends IBMQ. La prise en charge des modèles de bruit et des portes de base a également été étendue à la plupart des portes standard de la bibliothèque de circuits Qiskit, y compris une nouvelle prise en charge des portes de rotation à 1 et 2 qubits. Les améliorations de performance comprennent l'ajout de la prise en charge SIMD aux méthodes de simulation de matrice de densité et de simulation unitaire, la réduction de la mémoire utilisée et l'amélioration des performances des circuits utilisant des instantanés de matrice de densité et de vecteur d'état, et l'ajout de la prise en charge des instructions Kraus à l'optimisation des circuits de fusion de portes pour améliorer considérablement les performances des simulations de vecteur d'état bruyantes.

Nouvelles fonctions

  • Ajoute la prise en charge de la porte de base pour l'instruction qiskit.circuit.Delay aux sites StatevectorSimulator, UnitarySimulator, et QasmSimulator. Notez que cette porte est traitée comme une porte d'identité pendant la simulation et que le paramètre de longueur de retard est ignoré.

  • Ajout de la prise en charge de la porte de base pour la porte à qubit unique qiskit.circuit.library.UGate aux méthodes StatevectorSimulator, UnitarySimulator, et "statevector", "density_matrix", "matrix_product_state", et "extended_stabilizer" du site QasmSimulator.

  • Ajoute la prise en charge de la porte de base pour la porte de phase qiskit.circuit.library.PhaseGate aux méthodes StatevectorSimulator, StatevectorSimulator, UnitarySimulator, et "statevector", "density_matrix", "matrix_product_state", et "extended_stabilizer" de QasmSimulator.

  • Ajoute la prise en charge de la porte de base pour la porte à phase contrôlée qiskit.circuit.library.CPhaseGate aux méthodes StatevectorSimulator, StatevectorSimulator, UnitarySimulator, et "statevector", "density_matrix", et "matrix_product_state" de QasmSimulator.

  • Ajout de la prise en charge de la porte de phase multicontrôlée qiskit.circuit.library.MCPhaseGate aux sites StatevectorSimulator, UnitarySimulator et à la méthode "statevector" du site QasmSimulator.

  • Ajoute la prise en charge de la porte (X)\sqrt(X) qiskit.circuit.library.SXGate aux sites StatevectorSimulator, UnitarySimulator, et QasmSimulator.

  • Prise en charge des portes de rotation de la bibliothèque de circuits Qiskit à 1 et 2 qubits RXGate, RYGate, RZGate, RGate, RXXGate, RYYGate, RZZGate, RZXGate aux méthodes StatevectorSimulator, UnitarySimulator, et aux méthodes "statevector" et "density_matrix" du site QasmSimulator.

  • Ajout de la prise en charge des portes de rotation multicontrôlées "mcr", "mcrx", "mcry", "mcrz" aux méthodes StatevectorSimulator, UnitarySimulator, et "statevector" de QasmSimulator.

  • Rendre les backends du simulateur configurables. Cela permet de définir des options persistantes telles que la méthode de simulation et le modèle de bruit pour chaque objet backend du simulateur.

    Les QasmSimulator et PulseSimulator peuvent également être configurés à partir d'un objet backend IBMQBackend à l'aide de la méthode :meth:`~qiskit.providers.aer.QasmSimulator.from_backend. Pour le site QasmSimulator , il s'agit de configurer la carte de couplage, les portes de base et le modèle de bruit de base de l'appareil en fonction de la configuration et des propriétés du backend. Pour le site PulseSimulator , le modèle de système et les valeurs par défaut seront configurés automatiquement à partir de la configuration, des propriétés et des valeurs par défaut du backend.

    Par exemple, un simulateur de matrice de densité bruyante peut être construit comme QasmSimulator(method='density_matrix', noise_model=noise_model), ou un simulateur d'état de produit de matrice idéale comme QasmSimulator(method='matrix_product_state').

    L'avantage est qu'une instance PulseSimulator configurée à partir d'un backend sert mieux à remplacer le backend d'origine, ce qui facilite l'échange entre un simulateur et un backend réel, par exemple pour tester le code sur un simulateur avant d'utiliser un backend réel. Par exemple, dans le bloc de code suivant, le PulseSimulator est instancié à partir du backend FakeArmonk() . Toutes les données de configuration et les données par défaut sont copiées dans l'instance du simulateur et, par conséquent, lorsqu'elles sont transmises en tant qu'argument à assemble, elles se comportent comme si le backend d'origine avait été fourni (par exemple, les valeurs par défaut de FakeArmonk seront présentes et utilisées par assemble).

    armonk_sim = qiskit.providers.aer.PulseSimulator.from_backend(FakeArmonk())
    pulse_qobj = assemble(schedules, backend=armonk_sim)
    armonk_sim.run(pulse_qobj)

    Bien que l'exemple ci-dessus soit petit, le comportement démontré de "remplacement direct" devrait grandement améliorer la facilité d'utilisation dans des flux de travail plus compliqués, par exemple lorsque des expériences d'étalonnage sont construites à l'aide d'attributs de backend.

  • Prise en charge de la phase globale qobj dans les méthodes StatevectorSimulator, UnitarySimulator et statevector de QasmSimulator.

  • Améliore les performances générales des simulations de vecteurs d'état bruyants en ajoutant une méthode Kraus à l'optimisation du circuit de fusion de portes qui permet d'appliquer la fusion de portes à des simulations de vecteurs d'état bruyants avec un bruit Kraus général.

  • Utiliser la sémantique de déplacement pour les instantanés du vecteur d'état et de la matrice de densité pour les méthodes "statevector" et "density_matrix" du site QasmSimulator s'il s'agit de l'instruction finale d'un circuit. Cela permet de réduire l'utilisation de la mémoire du simulateur et d'améliorer les performances en évitant de copier un grand tableau dans les résultats.

  • Ajout d'un support pour les erreurs générales de porte Kraus QauntumError dans la méthode NoiseModel to the "matrix_product_state" de QasmSimulator.

  • Ajout de la prise en charge de l'instruction d'instantané de la matrice de densité qiskit.providers.aer.extensions.SnapshotDensityMatrix à la méthode "matrix_product_state" de QasmSimulator.

  • Étend la vectorisation SIMD de la méthode de simulation du vecteur d'état aux méthodes de simulation de la matrice unitaire, de la matrice du superopérateur et de la matrice de densité. Cela donne à peine une augmentation de performance de 2x simulation générale utilisant le UnitarySimulator, la méthode "density_matrix" du QasmSimulator, la fusion de portes, et la simulation de bruit.

  • Ajoute une classe vectorielle personnalisée au code C++ qui s'intègre mieux à Pybind11. Cela permet de réduire les besoins en mémoire de StatevectorSimulator en évitant une copie de la mémoire lors de la liaison Python de l'état final du simulateur.

Mise à niveau

  • L'ARE utilise maintenant Lapack pour effectuer certains calculs relatifs aux matrices. Il utilise la bibliothèque Lapack fournie avec OpenBlas (déjà disponible dans les distributions Linux et OpenBlas typique de Macos; la version Windows est distribuée avec l'ARE) ou avec le cadre accéléré de MacOS.

  • La prise en charge obsolète de l'exécution de qiskit-aer avec Python 3.5 a été supprimée. Pour utiliser qiskit-aer >= 0.7.0, il vous faut au moins Python 3.6. Si vous utilisez Python 3.5, la dernière version qui fonctionnera est qiskit-aer 0.6.x.

  • Mise à jour des seuils par défaut de la fusion de portes afin que la fusion de portes soit appliquée aux circuits de plus de 14 qubits pour les simulations de vecteurs d'état sur les sites StatevectorSimulator et QasmSimulator.

    Pour le "density_matrix" , la méthode du QasmSimulator et pour le UnitarySimulator , la fusion de portes sera appliquée aux circuits comportant plus de 7 qubits.

    Des valeurs de seuil de qubit personnalisées peuvent être définies à l'aide de l'option de backend fusion_threshold ie backend.set_options(fusion_threshold=10)

  • Modifie l'option du backend fusion_threshold pour appliquer la fusion lorsque le nombre de qubits est supérieur au seuil, et non égal ou supérieur au seuil, afin de correspondre au comportement du paramètre de seuil de qubits de OpenMP.

Remarques concernant la dépréciation

  • qiskit.providers.aer.noise.NoiseModel.set_x90_single_qubit_gates() a été déprécié car le transpileur qiskit a ajouté l'inversion des portes de base personnalisées. La manière correcte d'utiliser un modèle de bruit basé sur X90 est de définir le bruit sur la porte Sqrt(X) "sx" ou "rx" et l'une des portes de phase à qubit unique "u1", "rx" ou "p" dans le modèle de bruit.
  • Le kwarg variance des instructions Snapshot a été supprimé. Cette fonction calcule la variance de l'échantillon dans l'instantané due à l'échantillonnage du modèle de bruit, et non la variance due aux statistiques de mesure, et était donc souvent utilisée de manière incorrecte. Si la variance de la modélisation du bruit est nécessaire, il convient d'utiliser des clichés uniques afin que la variance puisse être calculée manuellement lors du post-traitement.

Corrections des erreurs

  • Correction d'un bogue dans StatevectorSimulator qui faisait qu'il s'exécutait toujours en tant que CPU avec double précision sans support SIMD/AVX2 même sur les systèmes avec AVX2, ou lorsque la méthode simple précision ou GPU était spécifiée dans les options du backend.
  • Correction de certaines boucles for dans le code C++ qui itéraient sur des copies plutôt que sur des références d'éléments de conteneurs.
  • Correction d'un bogue où les données d'instantanés étaient toujours copiées de C++ vers Python plutôt que déplacées lorsque c'était possible. Cela réduira de moitié l'utilisation de la mémoire et améliorera le temps de simulation lors de l'utilisation de grands instantanés de vecteurs d'état ou de matrices de densité.
  • Corrige State::snapshot_pauli_expval pour qu'il renvoie une valeur d'espérance Y correcte dans le simulateur de stabilisateur. Pour plus de détails, voir le site #895 <https://github.com/Qiskit/qiskit-aer/issues/895>.
  • Les wrappers controller_execute ont été ajustés pour être des functeurs (objets) plutôt que des fonctions libres. Cela leur permet notamment d'être utilisés dans les appels multiprocessing.pool.map.
  • Ajout de vérifications de la mémoire disponible manquante pour StatevectorSimulator et UnitarySimulator. Une exception est levée si la mémoire nécessaire pour simuler le nombre de qubits dans un circuit dépasse la mémoire disponible du système.

Ignis 0.5.0

Prélude

Cette version comprend un nouveau module pour l'atténuation des erreurs de mesure de la valeur d'espérance, une fonctionnalité de traçage améliorée pour les expériences de volume quantique, plusieurs corrections de bogues et la prise en charge des gouttes pour Python 3.5.

Nouvelles fonctions

  • La fonction qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() permet l'entrée facultative d'objets de porte sous forme d'éléments intercalaires (interleaved_elem). En outre, la classe CNOT-Dihedral qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral a une nouvelle méthode to_instruction, et la méthode from_circuit existante a une entrée optionnelle d'une instruction (en plus de QuantumCircuit ).

  • Le site qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral contient désormais les nouvelles fonctionnalités suivantes. Initialisation à partir de différents types d'objets : CNOTDihedral, ScalarOp, QuantumCircuit, Instruction et Pauli. Conversion en matrice à l'aide de to_matrix et en opérateur à l'aide de to_operator. Méthodes de produit tensoriel tensor et expand. Calcul de l'adjoint, du conjugué et de la transposition à l'aide des méthodes du conjugué, de l'adjoint et de la transposition. Vérifier qu'un élément est CNOTDihedral en utilisant la méthode is_cnotdihedral. La méthode de décomposition d'un élément CNOTDihedral en circuit a été étendue pour permettre un nombre quelconque de qubits, sur la base de la fonction decompose_cnotdihedral_general.

  • Ajoute l'atténuation de l'erreur de mesure de la valeur d'attente au module d'atténuation. Cela permet d'utiliser une matrice d'affectation complète de N-qubits, une matrice d'affectation tensoriée d' un seul qubit ou un processus de Markov à temps continu (CTMP [) 1] pour l'atténuation des erreurs de mesure lors du calcul des valeurs d'espérance des opérateurs diagonaux à partir des dictionnaires de comptage. Les valeurs attendues sont calculées à l'aide de la fonction qiskit.ignis.mitigation.expectation_value() .

    Les circuits d'étalonnage d'un atténuateur d'erreur de mesure sont générés à l'aide de la fonction qiskit.ignis.mitigation.expval_meas_mitigator_circuits() et le résultat est ajusté à l'aide de la classe qiskit.ignis.mitigation.ExpvalMeasMitigatorFitter . L'adaptateur renvoie un objet mitigateur qui peut être fourni comme argument à la fonction expectation_value() pour appliquer la mitigation.


    [1] S Bravyi, S Sheldon, A Kandala, DC Mckay, JM Gambetta,

    Mitigating measurement errors in multi-qubit experiments, arXiv:2006.14044 [quant-ph].

    Exemple :

    L'exemple suivant montre l'étalonnage d'un atténuateur d'erreur de mesure de la valeur d'espérance de 5 qubits à l'aide de la méthode 'tensored' .

    from qiskit import execute
    from qiskit.test.mock import FakeVigo
    import qiskit.ignis.mitigation as mit
    
    backend = FakeVigo()
    num_qubits = backend.configuration().num_qubits
    
    # Generate calibration circuits
    circuits, metadata = mit.expval_meas_mitigator_circuits(
        num_qubits, method='tensored')
    result = execute(circuits, backend, shots=8192).result()
    
    # Fit mitigator
    mitigator = mit.ExpvalMeasMitigatorFitter(result, metadata).fit()
    
    # Plot fitted N-qubit assignment matrix
    mitigator.plot_assignment_matrix()

    La figure suivante montre comment utiliser l'atténuateur ci-dessus pour appliquer l'atténuation de l'erreur de mesure aux calculs de la valeur d'espérance

    from qiskit import QuantumCircuit
    
    # Test Circuit with expectation value -1.
    qc = QuantumCircuit(num_qubits)
    qc.x(range(num_qubits))
    qc.measure_all()
    
    # Execute
    shots = 8192
    seed_simulator = 1999
    result = execute(qc, backend, shots=8192, seed_simulator=1999).result()
    counts = result.get_counts(0)
    
    # Expectation value of Z^N without mitigation
    expval_nomit, error_nomit = mit.expectation_value(counts)
    print('Expval (no mitigation): {:.2f} \u00B1 {:.2f}'.format(
        expval_nomit, error_nomit))
    
    # Expectation value of Z^N with mitigation
    expval_mit, error_mit = mit.expectation_value(counts,
        meas_mitigator=mitigator)
    print('Expval (with mitigation): {:.2f} \u00B1 {:.2f}'.format(
        expval_mit, error_mit))
  • Ajoute Numba comme dépendance optionnelle. Numba est utilisé pour augmenter de manière significative les performances de la classe qiskit.ignis.mitigation.CTMPExpvalMeasMitigator utilisée pour l'atténuation de l'erreur de mesure de la valeur d'espérance avec la méthode CTMP.

  • Ajouter deux méthodes à qiskit.ignis.verification.quantum_volume.QVFitter.

    • qiskit.ignis.verification.quantum_volume.QVFitter.calc_z_value() calculer la valeur z dans une distribution normale standard en utilisant la moyenne et l'écart type sigma. Si sigma = 0, il émet un avertissement et attribue une petite valeur ( 1e-10 ) à sigma pour que le code continue à fonctionner.
    • qiskit.ignis.verification.quantum_volume.QVFitter.calc_confidence_level() calculer le niveau de confiance à l'aide de la valeur z.
  • Conserver le niveau de confiance même lorsque hmean < 2/3 dans qiskit.ignis.verification.quantum_volume.QVFitter.qv_success().

  • Ajoutez des explications sur la façon de calculer les statistiques basées sur la distribution binomiale dans qiskit.ignis.verification.quantum_volume.QVFitter.calc_statistics().

  • La méthode qiskit.ignis.verification.QVFitter plot_qv_data() a été mise à jour pour renvoyer un objet matplotlib.Figure . Auparavant, il ne renvoyait rien. En renvoyant une figure, il est plus facile d'intégrer les visualisations dans un flux de travail plus large à l'adresse matplotlib .

  • Les barres d'erreur de la figure produite par la méthode qiskit.ignis.verification.QVFitter qiskit.ignis.verification.QVFitter.plot_qv_data() ont été mises à jour pour représenter des intervalles de confiance à deux sigmas. Auparavant, les barres d'erreur représentent des intervalles de confiance d'un sigma. Le critère de réussite de l'analyse comparative de Quantum Volume exige une probabilité de résultat élevé > 2/3 avec une confiance unilatérale de deux sigmas ( ~97.7 %). Le fait de remplacer les barres d'erreur par des intervalles de confiance à deux sigmas permet d'identifier facilement les succès dans la figure.

  • Un nouveau kwarg, figsize , a été ajouté à la méthode qiskit.ignis.verification.QVFitter qiskit.ignis.verification.QVFitter.plot_qv_data(). Ce kwarg contient un tuple de la forme (x, y)x et y sont les dimensions en pouces du graphique généré.

  • La méthode qiskit.ignis.verification.quantum_volume.QVFitter.plot_hop_accumulative() a été ajoutée pour tracer la probabilité de sortie lourde (HOP) en fonction du nombre d'essais, comme dans la figure 2a de l'article Quantum Volume 64 ( arXiv:2008.08571 ). Les HOP des essais individuels sont représentés sous forme de gouttelettes et les HOP cumulés sont représentés par une ligne rouge. Les intervalles de confiance à deux sigmas sont représentés par la zone ombrée et le seuil de réussite de 2/3 est représenté par la ligne en pointillé.

  • La méthode qiskit.ignis.verification.quantum_volume.QVFitter.plot_qv_trial() a été ajoutée pour tracer les essais individuels, en s'appuyant sur la méthode de Qiskit Terra qiskit.visualization.plot_histogram() de Qiskit Terra. Les nombres de bitstring sont représentés sous forme d'histogrammes superposés pour les valeurs idéales (creux) et expérimentales (pleins). La probabilité de sortie expérimentale lourde est indiquée dans la légende. La probabilité médiane est représentée par une ligne rouge en pointillés.

Mise à niveau

  • La prise en charge obsolète de l'exécution de qiskit-ignis avec Python 3.5 a été supprimée. Pour utiliser qiskit-ignis >= 0.5.0, il vous faut au moins Python 3.6. Si vous utilisez Python 3.5, la dernière version qui fonctionnera est qiskit-ignis 0.4.x.

Corrections des erreurs

  • Correction d'un bug dans la classe qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral pour les éléments ayant plus de 5 abandons.
  • Fixer le seuil de confiance pour qiskit.ignis.verification.quantum_volume.QVFitter.qv_success() à 0.977 correspondant à z = 2 tel que défini par l'algorithme 1 du document QV.
  • Correction d'un bogue sur qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() qui faisait que tous les sous-systèmes de même taille dans le modèle rb_pattern donné avaient les mêmes portes lorsqu'un paramètre 'rand_seed' était donné à la fonction.

Aqua 0.8.0

Prélude

Cette version introduit une interface permettant d'exécuter les méthodes disponibles pour les problèmes bosoniques. Nous avons notamment introduit une interface complète pour effectuer des calculs de structure vibronique.

Cette version introduit une interface pour le calcul des états excités. Il est désormais plus facile pour l'utilisateur de créer un calcul général des états excités. Ce calcul est basé sur un Driver qui fournit les informations pertinentes sur la molécule, une Transformation qui fournit les informations sur le mappage du problème dans un Hamiltonien de qubit, et enfin un Solver. Le solveur est la manière spécifique dont le calcul des états excités est effectué (l'algorithme). Cette structure suit celle des calculs de l'état fondamental. Les résultats sont modifiés pour prendre des listes de valeurs d'espérance au lieu d'une seule. Le QEOM et NumpyEigensolver sont adaptés à la nouvelle structure. Une fabrique est introduite pour exécuter un numpy eigensolver avec un filtre spécifique (pour cibler les états de symétries spécifiques).

Le calcul de l'espérance de la VQE avec le simulateur Aer qasm\ est maintenant par défaut un calcul qui a le comportement attendu du bruit de grenaille.

Nouvelles fonctions

  • Introduction d'une option warm_start qui doit être utilisée lorsque les autres options ne sont d'aucune utilité. Lorsque cette option est activée, un problème relâché (toutes les variables sont continues) est résolu en premier et la solution est utilisée pour initialiser l'état de l'optimiseur avant qu'il ne commence le processus itératif dans la méthode de résolution.

  • Les algorithmes d'estimation de l'amplitude utilisent désormais les objets QuantumCircuit comme entrées pour spécifier les opérateurs A et Q. Ce changement va de pair avec l'introduction de GroverOperator dans la bibliothèque de circuits, qui permet une construction intuitive et rapide de différents opérateurs Q. Par exemple, une expérience de Bernoulli peut maintenant être construite comme suit

    import numpy as np
    from qiskit import QuantumCircuit
    from qiskit.aqua.algorithms import AmplitudeEstimation
    
    probability = 0.5
    angle = 2 * np.sqrt(np.arcsin(probability))
    a_operator = QuantumCircuit(1)
    a_operator.ry(angle, 0)
    
    # construct directly
    q_operator = QuantumCircuit(1)
    q_operator.ry(2 * angle, 0)
    
    # construct via Grover operator
    from qiskit.circuit.library import GroverOperator
    oracle = QuantumCircuit(1)
    oracle.z(0)  # good state = the qubit is in state |1>
    q_operator = GroverOperator(oracle, state_preparation=a_operator)
    
    # use default construction in QAE
    q_operator = None
    
    ae = AmplitudeEstimation(a_operator, q_operator)
  • Ajout de la possibilité de calculer les valeurs attendues de la valeur conditionnelle du risque ( CVaR ).

    Étant donné une observable diagonale H, correspondant souvent à la fonction objective d'un problème d'optimisation, nous ne sommes souvent pas intéressés par la minimisation de l'énergie moyenne de nos mesures observées. Dans ce contexte, nous sommes satisfaits si au moins certaines de nos mesures atteignent une faible énergie. (Notez que ce n'est absolument pas le cas pour les problèmes de chimie).

    À cette fin, on peut envisager d'utiliser le meilleur échantillon observé comme fonction de coût au cours de l'optimisation variationnelle. Le problème est que cela peut entraîner une surface d'optimisation non lisse. Pour résoudre ce problème, nous pouvons lisser la surface d'optimisation en utilisant non seulement le meilleur échantillon observé, mais aussi une moyenne sur une fraction des meilleurs échantillons observés. C'est exactement ce que fait l'estimateur CVaR [1.]

    Soit α\alpha un nombre réel dans [0,1][0,1] qui spécifie la fraction des meilleurs échantillons observés qui sont utilisés pour calculer la fonction objective. Observez que si α=1\alpha = 1, CVaR est équivalent à une valeur d'espérance standard. De même, si α=0\alpha = 0, alors CVaR correspond à l'utilisation du meilleur échantillon observé. Les valeurs intermédiaires de α\alpha interpolent ces deux fonctions objectives.

    La fonctionnalité permettant d'utiliser CVaR est incluse dans le flux d'opérateurs par le biais d'une nouvelle sous-classe de OperatorStateFn appelée CVaRMeasurement. Ce nouvel objet StateFn est instancié de la même manière que OperatorMeasurement, à l'exception du fait qu'il accepte également un paramètre alpha et qu'il impose automatiquement la valeur True à l'attribut is_measurement. Observez qu'il n'est pas évident de savoir ce que représenterait un CVaRStateFn s'il ne s'agissait pas d'une mesure.

    Exemples :

    qc = QuantumCircuit(1)
    qc.h(0)
    op = CVaRMeasurement(Z, alpha=0.5) @ CircuitStateFn(primitive=qc, coeff=1.0)
    result = op.eval()

    De même, un opérateur correspondant à une valeur d'espérance standard peut être converti en une espérance CVaR à l'aide du convertisseur CVaRExpectation.

    Exemples :

    qc = QuantumCircuit(1)
    qc.h(0)
    op = ~StateFn(Z) @ CircuitStateFn(primitive=qc, coeff=1.0)
    cvar_expecation = CVaRExpectation(alpha=0.1).convert(op)
    result = cvar_expecation.eval()

    Voir le [point 1] pour plus de détails sur cette technique et ses performances empiriques.

    Références :


    [1] : Barkoutsos, P. K., Nannicini, G., Robert, A., Tavernelli, I., et Woerner, S.,

    "Amélioration de l'optimisation quantique variationnelle à l'aide de CVaR” arXiv:1907.04769

  • Nouvelle interface Eigensolver pour les algorithmes Eigensolver.

  • Une interface pour le calcul des états excités a été ajoutée au module de chimie. Il est désormais plus facile pour l'utilisateur de créer un calcul général des états excités. Ce calcul est basé sur un site Driver qui fournit les informations pertinentes sur la molécule, un site Transformation qui fournit les informations sur le mappage du problème dans un hamiltonien de qubit, et enfin un solveur. Le solveur est la manière spécifique dont le calcul des états excités est effectué (l'algorithme). Cette structure suit celle des calculs de l'état fondamental. Les résultats sont modifiés pour prendre des listes de valeurs d'espérance au lieu d'une seule. Les sites QEOM et NumpyEigensolver sont adaptés à la nouvelle structure. Une fabrique est introduite pour exécuter un numpy eigensolver avec un filtre spécifique (pour cibler les états de symétries spécifiques).

  • En plus des flux de travail pour la résolution des problèmes fermioniques, des interfaces pour le calcul des états bosoniques fondamentaux et excités ont été ajoutées. Nous avons notamment introduit une interface complète pour effectuer des calculs de structure vibronique.

  • Le site OrbitalOptimizationVQE a été ajouté comme nouveau solveur d'état fondamental dans le module de chimie. Ce solveur permet l'optimisation simulée des paramètres variationnels et des orbitales de la molécule. L'algorithme est présenté dans Sokolov et al, The Journal of Chemical Physics 152 (12).

  • Un nouvel algorithme a été ajouté : la surface d'énergie potentielle de Born Openheimer pour le calcul de la surface d'énergie potentielle le long des différents degrés de liberté de la molécule. L'algorithme est appelé BOPESSampler. Il permet en outre d'adapter la surface d'énergie potentielle à une fonction analytique de potentiels prédéfinis.

  • Une vérification de la faisabilité de la solution obtenue a été ajoutée à tous les optimiseurs de la pile d'optimisation. Ceci a été mis en œuvre en ajoutant deux nouvelles méthodes à QuadraticProgram: * get_feasibility_info(self, x: Union[List[float], np.ndarray]) accepte un tableau et renvoie si cette solution est faisable et une liste de variables violées (limites violées) et une liste de contraintes violées. * is_feasible(self, x: Union[List[float], np.ndarray]) accepte un tableau et retourne si cette solution est faisable ou non.

  • Ajoutez les versions basées sur les circuits de FixedIncomeExpectedValue, EuropeanCallDelta, GaussianConditionalIndependenceModel et EuropeanCallExpectedValue à qiskit.finance.applications.

  • Cadre du gradient. qiskit.operators.gradients Étant donné un opérateur qui représente un état quantique resp. une valeur d'espérance, le cadre du gradient permet d'évaluer les gradients, les gradients naturels, les hessiens, ainsi que l'information de Fisher quantique.

    Supposons un état quantique paramétré |ψ(θ)〉 = V(θ)|ψ〉 avec un état d'entrée |ψ〉 et un Ansatz paramétré V(θ), et un Opérateur O(ω).

    Gradients : Nous voulons calculer dψ(θ)O(ω)ψ(θ)/dωd⟨ψ(θ)|O(ω)|ψ(θ)〉/ dω resp. dψ(θ)O(ω)ψ(θ)/dθd⟨ψ(θ)|O(ω)|ψ(θ)〉/ dθ resp. dψ(θ)iiψ(θ)/dθd⟨ψ(θ)|i〉⟨i|ψ(θ)〉/ dθ.

    Le dernier cas correspond au gradient w.r.t. les probabilités d'échantillonnage de |ψ(θ). Ces gradients peuvent être calculés à l'aide de différentes méthodes, à savoir un changement de paramètre, une combinaison linéaire d'unités et une méthode de différence finie.

    Exemples :

    x = Parameter('x')
    ham = x * X
    a = Parameter('a')
    
    q = QuantumRegister(1)
    qc = QuantumCircuit(q)
    qc.h(q)
    qc.p(params[0], q[0])
    op = ~StateFn(ham) @ CircuitStateFn(primitive=qc, coeff=1.)
    
    value_dict = {x: 0.1, a: np.pi / 4}
    
    ham_grad = Gradient(grad_method='param_shift').convert(operator=op, params=[x])
    ham_grad.assign_parameters(value_dict).eval()
    
    state_grad = Gradient(grad_method='lin_comb').convert(operator=op, params=[a])
    state_grad.assign_parameters(value_dict).eval()
    
    prob_grad = Gradient(grad_method='fin_diff').convert(operator=CircuitStateFn(primitive=qc, coeff=1.),
                                                         params=[a])
    prob_grad.assign_parameters(value_dict).eval()

    Hessiens : Nous voulons calculer d2ψ(θ)O(ω)ψ(θ)/dω2d^2⟨ψ(θ)|O(ω)|ψ(θ)〉/ dω^2 resp. d2ψ(θ)O(ω)ψ(θ)/dθ2d^2⟨ψ(θ)|O(ω)|ψ(θ)〉/ dθ^2 resp. d2ψ(θ)O(ω)ψ(θ)/dθdωd^2⟨ψ(θ)|O(ω)|ψ(θ)〉/ dθdω resp. d2ψ(θ)iiψ(θ)/dθ2d^2⟨ψ(θ)|i〉⟨i|ψ(θ)〉/ dθ^2.

    Le dernier cas correspond au hessien w.r.t. les probabilités d'échantillonnage de |ψ(θ). Tout comme les gradients du premier ordre, les Hessiens peuvent être évalués à l'aide de différentes méthodes, à savoir un décalage de paramètre, une combinaison linéaire d'unités et une méthode de différence finie. Étant donné un ensemble de paramètres, Hessian().convert(op, param_tuple) renvoie la valeur de la dérivée de second ordre. Si une liste de paramètres est donnée, Hessian().convert(op, param_list) renvoie le Hessien complet pour tous les paramètres donnés selon l'ordre des paramètres donné.

    QFI : L'information quantique de Fisher QFI est un tenseur métrique représentatif de la capacité de représentation d'un état quantique paramétré |ψ(θ)〉 = V(θ)|ψ〉 généré par un état d'entrée |ψ〉 et un Ansatz paramétré V(θ). Les entrées de l'IFQ pour un état pur se lisent [QFI]kl=Re[kψlψkψψ〉〈ψlψ]4[QFI]kl= Re[〈∂kψ|∂lψ〉−〈∂kψ|ψ〉〈ψ|∂lψ〉] * 4.

    Tout comme pour les types de dérivés précédents, l'IFQ peut être calculé à l'aide de différentes méthodes : une représentation complète basée sur une combinaison linéaire d'implémentations unitaires, une représentation bloc-diagonale et une représentation diagonale basée sur une méthode de chevauchement.

    Exemples :

    q = QuantumRegister(1)
    qc = QuantumCircuit(q)
    qc.h(q)
    qc.p(params[0], q[0])
    op = ~StateFn(ham) @ CircuitStateFn(primitive=qc, coeff=1.)
    
    value_dict = {x: 0.1, a: np.pi / 4}
    qfi = QFI('lin_comb_full').convert(operator=CircuitStateFn(primitive=qc, coeff=1.), params=[a])
    qfi.assign_parameters(value_dict).eval()

    La combinaison de l'IFQ et du gradient conduit à une forme particulière de gradient, à savoir

    NaturalGradients: Le gradient naturel est une méthode de gradient spéciale qui redimensionne un gradient w.r.t. un paramètre d'état avec l'inverse de l'information de Fisher quantique (QFI) correspondante QFI1dψ(θ)O(ω)ψ(θ)/dθQFI^-1 d⟨ψ(θ)|O(ω)|ψ(θ)〉/ dθ. Nous pouvons ainsi choisir un gradient ainsi qu'une méthode QFI et une méthode de régularisation qui est utilisée avec un solveur des moindres carrés au lieu de l'inversion exacte de la QFI :

    Exemples :

    op = ~StateFn(ham) @ CircuitStateFn(primitive=qc, coeff=1.)
    nat_grad = NaturalGradient(grad_method='lin_comb, qfi_method='lin_comb_full', \
                               regularization='ridge').convert(operator=op, params=params)

    Le cadre du gradient est également compatible avec les optimiseurs de qiskit.aqua.components.optimizers. Les classes dérivées sont accompagnées d'une fonction gradient_wrapper() qui renvoie l'appelable correspondant.

  • Introduit transformations pour la transformation fermionique et bosonique d'un exemple de problème. Transforme l'opérateur fermionique en opérateur qubit. La classe respective pour la transformation est fermionic_transformation Introduit dans les algorithmes ground_state_solvers pour le calcul des propriétés de l'état fondamental. Le calcul peut être effectué à l'aide de MinimumEigensolver ou de AdaptVQE Introduit chemistry/results où le résultat de l'état propre et le résultat de la structure propre sont également utilisés pour les algorithmes. Introduit les usines de calcul d'équations minimales minimum_eigensolver_factories où les calculateurs d'équations minimales spécifiques à la chimie peuvent être initialisés Introduit l'optimisation orbitale vqe oovqe en tant que solveur d'état fondamental pour les applications de chimie

  • Nouvelles classes de résultats d'algorithmes :

    Grover la méthode _run() renvoie la classe GroverResult. AmplitudeEstimation la méthode _run() renvoie la classe AmplitudeEstimationResult. IterativeAmplitudeEstimation la méthode _run() renvoie la classe IterativeAmplitudeEstimationResult. MaximumLikelihoodAmplitudeEstimation la méthode _run() renvoie la classe MaximumLikelihoodAmplitudeEstimationResult.

    Toutes les nouvelles classes de résultats sont rétrocompatibles avec le dictionnaire de résultats précédent.

  • Nouvelles classes de résultats pour le solveur linéaire :

    HHL la méthode _run() renvoie la classe HHLResult. NumPyLSsolver la méthode _run() renvoie la classe NumPyLSsolverResult.

    Toutes les nouvelles classes de résultats sont rétrocompatibles avec le dictionnaire de résultats précédent.

  • MinimumEigenOptimizationResult expose maintenant les propriétés : samples et eigensolver_result. Cette dernière est obtenue à partir de l'algorithme sous-jacent utilisé par l'optimiseur et est spécifique à l'algorithme. RecursiveMinimumEigenOptimizer renvoie maintenant une instance de la classe de résultats RecursiveMinimumEigenOptimizationResult qui, à son tour, peut contenir des résultats intermédiaires obtenus à partir des algorithmes sous-jacents. La classe de résultats dédiée expose les propriétés replacements et history qui sont spécifiques à cet optimiseur. La profondeur de l'historique est gérée par le paramètre history de l'optimiseur.

  • GroverOptimizer renvoie maintenant une instance de GroverOptimizationResult et cette classe de résultats expose directement les propriétés operation_counts, n_input_qubits et n_output_qubits . Ces propriétés ne sont plus disponibles dans le dictionnaire raw_results .

  • SlsqpOptimizer renvoie désormais une instance de SlsqpOptimizationResult et cette classe de résultats expose des propriétés supplémentaires spécifiques à l'implémentation de SLSQP.

  • Prise en charge du passage des objets QuantumCircuit en tant que circuits de générateur dans le site QuantumGenerator.

  • Supprime la restriction aux vecteurs d'entrée réels dans CircuitStateFn.from_vector. La méthode fait appel à extensions.Initialize. Ce dernier prend explicitement en charge (dans l'API et la documentation) les vecteurs d'entrée complexes. Cette restriction semble donc inutile.

  • Simplifié AbelianGrouper en utilisant un algorithme de coloration de graphe de retworkx. Il est plus rapide que l'algorithme de coloration basé sur numpy.

  • Permet d'appeler eval sur des objets de fonction d'état sans argument, ce qui renvoie la représentation VectorStateFn de la fonction d'état. Ce comportement est cohérent avec celui de OperatorBase.eval, qui renvoie la représentation de MatrixOp si aucun argument n'est transmis.

  • Ajoute max_iterations à la classe VQEAdapt afin de permettre de limiter le nombre maximum d'itérations effectuées par l'algorithme.

  • Le calcul de l'espérance de la VQE avec le simulateur Aer qasm\ est maintenant par défaut un calcul qui a le comportement attendu du bruit de grenaille. Le calcul spécial Aer snapshot, qui est beaucoup plus rapide, avec une sortie idéale similaire au simulateur de vecteur d'état, peut toujours être choisi mais, comme avant Aqua 0.7, il n'est plus proposé par défaut mais peut être choisi.

Mise à niveau

  • Extension de l'optimiseur classique Analytic Quantum Gradient Descent (AQGD) avec l'AQGD with Epochs. Désormais, AQGD effectue l'optimisation par descente de gradient avec un terme de momentum, des gradients analytiques et un calendrier de longueur de pas personnalisé pour les portes quantiques paramétrées. Les gradients sont calculés "analytiquement" à l'aide du circuit quantique lors de l'évaluation de la fonction objective.
  • La prise en charge obsolète de l'exécution de qiskit-aqua avec Python 3.5 a été supprimée. Pour utiliser qiskit-aqua >= 0.8.0 vous aurez besoin au minimum de Python 3.6. Si vous utilisez Python 3.5, la dernière version qui fonctionnera est qiskit-aqua 0.7.x.
  • Ajout de retworkx comme nouvelle dépendance.

Remarques concernant la dépréciation

  • L'argument i_objective des algorithmes d'estimation de l'amplitude a été renommé objective_qubits.

  • TransformationType

  • QubitMappingType

  • Déclasser les types CircuitFactory et dérivés. La classe CircuitFactory a été introduite comme classe temporaire lorsque la classe QuantumCircuit n'avait pas certaines caractéristiques nécessaires pour les applications dans Aqua. Maintenant que le circuit possède toutes les fonctionnalités requises, la fabrique de circuits peut être supprimée. Les remplacements sont indiqués dans le tableau suivant.

    Circuit factory class               | Replacement
    ------------------------------------+-----------------------------------------------
    CircuitFactory                      | use QuantumCircuit
                                        |
    UncertaintyModel                    | -
    UnivariateDistribution              | -
    MultivariateDistribution            | -
    NormalDistribution                  | qiskit.circuit.library.NormalDistribution
    MultivariateNormalDistribution      | qiskit.circuit.library.NormalDistribution
    LogNormalDistribution               | qiskit.circuit.library.LogNormalDistribution
    MultivariateLogNormalDistribution   | qiskit.circuit.library.LogNormalDistribution
    UniformDistribution                 | qiskit.circuit.library.UniformDistribution
    MultivariateUniformDistribution     | qiskit.circuit.library.UniformDistribution
    UnivariateVariationalDistribution   | use parameterized QuantumCircuit
    MultivariateVariationalDistribution | use parameterized QuantumCircuit
                                        |
    UncertaintyProblem                  | -
    UnivariateProblem                   | -
    MultivariateProblem                 | -
    UnivariatePiecewiseLinearObjective  | qiskit.circuit.library.LinearAmplitudeFunction
  • Les classes de conversion ising qiskit.optimization.converters.QuadraticProgramToIsing et qiskit.optimization.converters.IsingToQuadraticProgram sont obsolètes et seront supprimées dans une prochaine version. Les méthodes qiskit.optimization.QuadraticProgram , to_ising() et from_ising() doivent être utilisées à la place.

  • Déclasser WeightedSumOperator qui a été porté dans la bibliothèque de circuits sous le nom de WeightedAdder dans qiskit.circuit.library.

  • Core Hamiltonian est dépréciée au profit de la classe FermionicTransformation Chemistry Operator est dépréciée au profit de la classe tranformations minimum_eigen_solvers/vqe_adapt est également dépréciée et déplacée en tant qu'implémentation de l'interface ground_state\solver applications/molecular_ground_state_energy est dépréciée au profit de la classe ground_state_solver

  • Optimizer.SupportLevel l'énumération imbriquée est remplacée par OptimizerSupportLevel et Optimizer.SupportLevel a été supprimé. Utilisez, par exemple, OptimizerSupportLevel.required au lieu de Optimizer.SupportLevel.required.

  • Déclasser les UnivariateVariationalDistribution et MultivariateVariationalDistribution en tant qu'éléments d'entrée du QuantumGenerator. Au lieu de cela, des objets simples QuantumCircuit peuvent être utilisés.

  • Les options "fast" et "use_nx" ignorées de AbelianGrouper.group_subops seront supprimées dans une prochaine version.

  • La classe d'optimiseur GSLS a supprimé le paramètre __init__ max_iter en faveur de maxiter. La classe d'optimiseur SPSA a supprimé le paramètre __init__ max_trials en faveur de maxiter. la fonction optimize_svm a supprimé le paramètre max_iters en faveur de maxiter. La classe ADMMParameters a déprécié le paramètre __init__ max_iter en faveur de maxiter.

Corrections des erreurs

  • La liste des excitations de l'UCCSD, comprenant les excitations simples et doubles, n'était pas générée correctement lorsqu'un espace actif était explicitement fourni à l'UCSSD via les paramètres active_(un)occupied.
  • Pour les algorithmes d'estimation de l'amplitude, nous définissons le nombre de requêtes à l'oracle comme le nombre de fois où l'opérateur Q/Grover est appliqué. Cela inclut le nombre de tirs. Ce facteur a été inclus dans le MLAE et l'IQAE, mais n'a pas été inclus dans le QAE "standard".
  • Corrigez CircuitSampler.convert, afin que la propriété is_measurement soit propagée à StateFns.
  • Correction du double calcul des coefficients dans :meth`~qiskit.aqua.operators.VectorStateFn.to\circuit_op`.
  • L'appel à PauliTrotterEvolution.convert sur un opérateur comprenant un terme qui est un multiple scalaire de l'identité a donné un circuit incorrect, qui ignorait le coefficient scalaire. Cette correction inclut l'effet du coefficient dans la propriété globale de phase du circuit.
  • Faire en sorte que ListOp.num_qubits vérifie que tous les opérateurs de la liste ont le même num_qubits Auparavant, le nombre de qubits du premier opérateur de la liste ListOp était renvoyé. Avec ce changement, une vérification supplémentaire est effectuée pour s'assurer que tous les autres opérateurs ont également le même nombre de qubits.
  • Faites en sorte que PauliOp.exp_i() génère la matrice correcte avec les changements suivants. 1) Il y avait auparavant une erreur dans la phase d'un facteur 2. 2) La phase globale a été ignorée lors de la conversion du circuit en matrice. Nous utilisons maintenant qiskit.quantum_info.Operator, qui est généralement utile pour convertir un circuit en une matrice unitaire, lorsque cela est possible.
  • Corrige la détection de la cyclicité, signalée comme un bogue dans https://github.com/qiskit-community/qiskit-aqua/issues/1184.

IBM 0.11.0 du fournisseur Q

Mise à niveau

  • La prise en charge obsolète de l'exécution de qiskit-ibmq-provider avec Python 3.5 a été supprimée. Pour utiliser qiskit-ibmq-provider >= 0.11.0 vous aurez besoin au minimum de Python 3.6. Si vous utilisez Python 3.5, la dernière version qui fonctionnera est qiskit-ibmq-provider 0.10.x.
  • Avant cette version, websockets 7.0 était utilisé pour Python 3.6. Avec cette version, websockets 8.0 ou une version plus récente est nécessaire pour toutes les versions de Python. Les exigences du paquet ont été mises à jour pour refléter cela.
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.