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_codesmais 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 exempleReset). 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
MCXGrayCodecréera maintenant unC3XGatesinum_ctrl_qubitsest 3 et unC4XGatesinum_ctrl_qubitsest 4. Ceci s'ajoute à la fonctionnalité précédente où pour n'importe quel mode de la :class:' qiskit.library.standard_gates.x.MCXGate\, sinum_ctrl_bitsest 1, unCXGateest créé, et si 2, unCCXGate` est créé.
Corrections des erreurs
-
Les instructions Pulse
Delaysont désormais explicitement assemblées en tant qu'objetsPulseQobjInstructioninclus dans la sortiePulseQobjsortie deassemble().Auparavant, nous pouvions ignorer les
Delaydans unSchedulecomme faisant partie deassemble()car l'heure était explicite dans lesPulseQobjobjets. 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
BasisTranslatoretUnrollerne 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ù, lorsquecompensate_phaseétait défini, un facteur de manquait dans la phase annexée. -
Fixe la phase globale de la sortie de la
QuantumCircuitméthoderepeat(). 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 derepeat()à 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
SparsePauliOpoù 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 à 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, lorsqueqiskit.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
QasmSimulatorlors de l'utilisation conjointe des options"method"et"noise_model", et lors de leur utilisation avec un simulateur construit à l'aide defrom_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()etfrom_backend()où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 valeurONpermet 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 lorsque était un objet
Operatorobjet. 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
AerProvideroù les options définies sur les backends retournés en utilisantset_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 à etbackends()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
SXGaten'é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éthodeQasmSimulator. - 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"deTomographyFitter,StateTomographyFitter, etProcessTomographyFitterpour 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éthodeqiskit.quantum_info.state_fidelity()ouqiskit.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_statedansQAOAa 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 siteinitial_statefourni 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ètreinitial_statefourni 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_symbola été supprimée de la méthodeVarTypedans 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
transpileen appelant sa méthoderunsi elle existe. - Un bogue qui mélangeait les
initial_statepersonnalisés dansQAOAavec 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 cusominitial_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.Experimentpossè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()etqiskit.providers.ibmq.experiment.ExperimentService.analysis_results()prennent désormais en charge un paramètrelimitqui 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éthodesqiskit.providers.ibmq.experiment.ExperimentService.experiments()etqiskit.providers.ibmq.experiment.ExperimentService.analysis_results(). Cette adresselimita 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
CREATINGsi 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 classeQuantumCircuita été étendu par le biais de la classetranspiler,quantum_info, etassemblerainsi 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 porteGRet la porte globale Rz (GRZ), qui est définie de la même manière que les portesGRportes. 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
QuantumCircuitsur unQuantumRegisterde 3 qubits et effectuer unRGated'un angle autour d'un axe dans le plan xy des sphères de Bloch qui fait un angle de avec l'axe x sur chaque qubit. -
Un nouveau schéma de couleurs,
iqx, a été ajouté au backendmplpour le tiroir du circuitqiskit.visualization.circuit_drawer()etqiskit.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, etbw.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 fichiersettings.confsous le titre[Default], un utilisateur peut entrercircuit_mpl_style = iqxpour sélectionner le schéma de couleursiqx.La deuxième méthode consiste à ajouter
{'name': 'iqx'}au kwargstyleà la méthodeQuantumCircuit.drawou à la fonctioncircuit_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
stylekwarg pour le tiroir du circuitqiskit.visualization.circuit_drawer()etqiskit.circuit.QuantumCircuit.draw()le champdisplaycoloravec le backendmplpermet 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 champgatetextcolorsera utilisé. Les couleurs des portes peuvent être définies dans le dictstylepour un nombre quelconque de types de portes, allant d'une seule à l'ensemble du dictdisplaycolor. 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_delaya été ajouté à la classeQasmQobjdans 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éthodeBackendConfigurationméthoderep_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_delayne fonctionnera qu'avec les backends qui permettent une durée de répétition dynamique. Ceci peut être vérifié avec la propriétéBackendConfigurationpropriétédynamic_reprate_enabled. -
Le fichier JSON Schema de
qobj_schema.jsondansqiskit.schemasa été mis à jour pour inclurerep_delaycomme propriété de configuration optionnelle pour les Qobjs de QASM. -
Le fichier JSON Schema de
backend_configuration_schema.jsondansqiskit.schemasa été mis à jour pour incluredynamic_reprate_enabled,rep_delay_rangeetdefault_rep_delaycomme propriétés optionnelles pour une charge utile de configuration du backend QASM. -
Une nouvelle passe d'optimisation,
qiskit.transpiler.passes.TemplateOptimizationa é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 programmeTemplateOptimization.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
BackendV1méthoderun()peut désormais prendre en entrée un objetQuantumCircuitouScheduleau lieu d'objetsQobj. 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 queqiskit.providers.JobV1peut 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 abstraiteJobV1. -
Un nouveau kwarg,
inplace, a été ajouté à la fonctionqiskit.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'uneResultl'entrée d'un objet. Ce paramètre n'a pas d'effet sur une entréedictou un objetCountsobjet. -
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 typeInt1pour l'instant) enQuantumCircuitobjets. 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=Falsedans la méthodeqiskit.circuit.classicalfunction.ClassicalFunctionméthodesynth()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_ORACLEest 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 avecpip install tweedledum. -
Une nouvelle classe
qiskit.circuit.Delaypour représenter une instruction de retard dans un circuit a été ajoutée. Une nouvelle méthodedelay()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_methodpourqiskit.compiler.transpile()a été ajouté. Elle est nécessaire lors de la transposition de circuits avec des retards. Sischeduling_methodest 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 fonctionSchedulepour 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_path2Reportez-vous aux notes de mise à jour et à la documentation pour
transpile()etsequence()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,GroverOperatorcré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'argumentstate_inpeut être utilisé. -
Les
InstructionScheduleMapméthodesget()etpop()prennent désormais en compte les instancesParameterExpressionen 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 unParametrizedSchedule, les expressions doivent être liées avant que la programmation elle-même ne soit liée/appelée. -
Une nouvelle classe
LinearAmplitudeFunctiona é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,
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_outputa été ajoutée au moduleqiskit.tools.jupytermodule. 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 deOptimize1qGatesexistante, qui utilise la classeOneQubitEulerDecomposerpour décomposer et simplifier une chaîne de portes à qubit unique. Cette méthode est compatible avec n'importe quel ensemble de base, alors queOptimize1qGatesne fonctionne que pour u1, u2, et u3. Les gestionnaires de passe par défaut pouroptimization_level1, 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
OneQubitEulerDecomposersupporte désormais deux nouvelles bases,'PSX'et'U'. Ceux-ci peuvent être spécifiés à l'aide du kwargbasisdans le constructeur. Cela permettra de décomposer la matrice en un circuit utilisantPGateetSXGatepour'PSX', etUGatepour'U'. -
Une nouvelle méthode
remove()a été ajoutée à la classeqiskit.transpiler.PassManagera vu l'ajout d'une nouvelle méthode. Cette méthode permet de retirer un laissez-passer d'unePassManagerinstance. Il fonctionne sur les index, de la même manière quereplace(). Par exemple, pour supprimer la passeRemoveResetInZeroStatedu 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, CXCancellationLa scène
[1]avecRemoveResetInZeroStatepeut ê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, etLogNormalDistributionont é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
QuantumCircuitclasse. Cela permet à unQuantumCircuitde 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érielsGateen 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
QuantumCircuitméthodeadd_calibration()qui prend une définition deScheduleainsi 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 gateAuparavant, 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
Scheduleen utilisant la fonctionschedule()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
PulseQobja été ajoutée à la fonctionqiskit.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_typea é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 kwargcoord_typeest défini sur'spherical', la liste des paramètres pris en compte est de la forme[r, theta, phi]oùrest le rayon,thetaest l'inclinaison de la direction +z, etphiest 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
Schedulepermettent désormais d'utiliser des objetsParameterExpressionpour 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 moduleqiskit.visualizationmodule.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
paramsdu constructeur de la classe et de ses sous-classes a été modifiéeGateet de ses sous-classes a été modifiée. Auparavant, tous lesGatedevaient faire partie d'un ensemble de types autorisés définis dans laInstructionclasse. 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,UnitaryGateaccepte un paramètre du typenumpy.ndarrayet définit une méthodevalidate_parameter()personnalisée qui renvoie le paramètre s'il s'agit d'unnumpy.ndarray. Cette fonction est prioritaire par rapport à la fonction définie dans sa classe d'origineGate. SiUnitaryGatedevait être utilisé comme parent d'une nouvelle classe, cette méthodevalidate_parameterserait 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_qubitsetnumberofqubitsont été supprimés. Ils ont été supprimés dans la version 0.13.0. L'ensemble des changements sont les suivants :ClasseAncienNouveauQuantumCircuitn_qubitsnum_qubitsPaulinumberofqubitsnum_qubitsFonctionVieil argumentNouvel argumentqiskit.circuit.random.random_circuit()n_qubitsnum_qubitsqiskit.circuit.library.MSGaten_qubitsnum_qubits -
Insérer une instance paramétrée
Gatedans unQuantumCircuitcré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 circuitsGatedans plusieurs circuits. -
La fonction
qiskit.result.marginal_counts()ne modifie plus, par défaut, le paramètreqiskit.result.Resultparamètre d'instance. Auparavant, l'objetResultétait toujours modifié sur place. Un nouveau kwarginplacea été ajoutémarginal_counts()qui permet d'utiliser le comportement précédent lorsqueinplace=Trueest défini. -
La définition
U3Gatea été modifiée pour s'appliquer à la classeUGateclasse. La classeUGaten'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
PulseBackendConfigurationdans les attributshamiltonian, le champvarsest 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
DAGNodea é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 objetDAGNodeil 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*, ettgt*, qui étaient obsolètes dans la version 0.12.0, ont été supprimés. Au lieu de cela, seulsqubit,control_qubit*ettarget_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. Lesqiskit.circuit.librarypeut être utilisé à la place. En outre, toutes les classes de portes qui se trouvaient auparavant dansqiskit.extensions.standardsont toujours importables à partir du fichierqiskit.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,UCZont é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 eti()ouid()peut être utilisé à la place.
Remarques concernant la dépréciation
-
L'utilisation d'un
numpy.ndarraypour un paramètre dans le kwargparamspour le constructeur de la classe et des sous-classesGateet 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 dontparmsgère la vérification des types pour la classeGateclasse. Si vous avez une classe de portail personnalisée qui est une sous-classe deGatedirectement (ou via un parent différent dans la hiérarchie) qui accepte un paramètrendarray, vous devez définir une méthode personnaliséevalidate_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_qubitsde la propriétéPiecewiseLinearPauliRotationsetPolynomialPauliRotationsest obsolète et sera supprimée dans une prochaine version. La propriéténum_ancillasdoit être utilisée à la place. Cette mesure a été prise pour assurer la cohérence avec laQuantumCircuitméthodenum_ancillas(). -
La classe
qiskit.circuit.library.MSGateest obsolète, mais restera en place pour permettre le chargement d'anciens travaux. Elle a été remplacée par la classeqiskit.circuit.library.GMSqu'il convient d'utiliser à la place. -
La passe de transpilation
MSBasisDecomposerest obsolète et sera supprimée dans une prochaine version. Le laissez-passerqiskit.transpiler.passes.BasisTranslatorpeut être utilisé à la place. -
Les méthodes
QuantumCircuitu1,u2etu3sont 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,U2GateetU3Gatesont conservées pour permettre le chargement d'anciens travaux.
Corrections des erreurs
- Les méthodes de la
Resultles méthodes de la classedata(),get_memory(),get_counts(),get_unitary()etget_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éQuantumCircuitouSchedulelorsque plusieurs entrées correspondant au nom de l'instance sont présentes dans l'objetResult. Notez que seule la première entrée correspondant à ce nom sera renvoyée. Corrige #3207 - La
qiskit.circuit.QuantumCircuitméthodeappend()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éGatedans 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 kwargsbackendetpass_manager. Cette erreur a été corrigée de manière à ce quebackendetpass_managerpuissent être utilisés ensemble lors d'appels àexecute(). Corrige #5037 - La
QuantumCircuitméthodeunitary()a été corrigée afin d'accepter un seul entier pour l'argumentqarg(lors de l'ajout d'une unité de 1 qubit). Les types autorisés pour l'argumentqargssont désormaisint,Qubitou une liste d'entiers. Corrige #4944 - Auparavant, l'appel à
inverse()sur un objetBlueprintCircuitpouvait é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 objetCountsvide. La méthodemost_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_stated'unUnitaryGateé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éthodedefinition()de la classeqiskit.circuit.ControlledGateclasse. Cela donnerait l'impression que le réglage dectrl_staten'a aucun effet. - Auparavant, la
ControlledGateméthodeinverse()ne préservait pas le paramètrectrl_statedans certains cas. Ce problème a été corrigé de sorte que l'appel àinverse()conserve la valeurctrl_statedans sa sortie. - Correction d'un bug dans le backend de la sortie
mpldu tiroir de circuitqiskit.circuit.QuantumCircuit.draw()etqiskit.visualization.circuit_drawer()qui provoquait l'échec du tiroir si le kwarg destyleé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()oufrom_qasm_str()échouait si une porteu,phase(p),sx, ousxdgé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.Delayaux sitesStatevectorSimulator,UnitarySimulator, etQasmSimulator. 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.UGateaux méthodesStatevectorSimulator,UnitarySimulator, et"statevector","density_matrix","matrix_product_state", et"extended_stabilizer"du siteQasmSimulator. -
Ajoute la prise en charge de la porte de base pour la porte de phase
qiskit.circuit.library.PhaseGateaux méthodesStatevectorSimulator,StatevectorSimulator,UnitarySimulator, et"statevector","density_matrix","matrix_product_state", et"extended_stabilizer"deQasmSimulator. -
Ajoute la prise en charge de la porte de base pour la porte à phase contrôlée
qiskit.circuit.library.CPhaseGateaux méthodesStatevectorSimulator,StatevectorSimulator,UnitarySimulator, et"statevector","density_matrix", et"matrix_product_state"deQasmSimulator. -
Ajout de la prise en charge de la porte de phase multicontrôlée
qiskit.circuit.library.MCPhaseGateaux sitesStatevectorSimulator,UnitarySimulatoret à la méthode"statevector"du siteQasmSimulator. -
Ajoute la prise en charge de la porte
qiskit.circuit.library.SXGateaux sitesStatevectorSimulator,UnitarySimulator, etQasmSimulator. -
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,RZXGateaux méthodesStatevectorSimulator,UnitarySimulator, et aux méthodes"statevector"et"density_matrix"du siteQasmSimulator. -
Ajout de la prise en charge des portes de rotation multicontrôlées
"mcr","mcrx","mcry","mcrz"aux méthodesStatevectorSimulator,UnitarySimulator, et"statevector"deQasmSimulator. -
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
QasmSimulatoretPulseSimulatorpeuvent également être configurés à partir d'un objet backendIBMQBackendà l'aide de la méthode :meth:`~qiskit.providers.aer.QasmSimulator.from_backend. Pour le siteQasmSimulator, 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 sitePulseSimulator, 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 commeQasmSimulator(method='matrix_product_state').L'avantage est qu'une instance
PulseSimulatorconfiguré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, lePulseSimulatorest instancié à partir du backendFakeArmonk(). 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 deFakeArmonkseront présentes et utilisées parassemble).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,UnitarySimulatoret statevector deQasmSimulator. -
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
QasmSimulators'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
QauntumErrordans la méthodeNoiseModelto the"matrix_product_state"deQasmSimulator. -
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"deQasmSimulator. -
É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"duQasmSimulator, 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
StatevectorSimulatoren é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
StatevectorSimulatoretQasmSimulator.Pour le
"density_matrix", la méthode duQasmSimulatoret pour leUnitarySimulator, 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_thresholdiebackend.set_options(fusion_threshold=10) -
Modifie l'option du backend
fusion_thresholdpour 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
variancedes 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
StatevectorSimulatorqui 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
StatevectorSimulatoretUnitarySimulator. 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-Dihedralqiskit.ignis.verification.randomized_benchmarking.CNOTDihedrala 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.CNOTDihedralcontient 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 classeqiskit.ignis.mitigation.ExpvalMeasMitigatorFitter. L'adaptateur renvoie un objet mitigateur qui peut être fourni comme argument à la fonctionexpectation_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.CTMPExpvalMeasMitigatorutilisé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.QVFitterplot_qv_data()a été mise à jour pour renvoyer un objetmatplotlib.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'adressematplotlib. -
Les barres d'erreur de la figure produite par la méthode
qiskit.ignis.verification.QVFitterqiskit.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éthodeqiskit.ignis.verification.QVFitterqiskit.ignis.verification.QVFitter.plot_qv_data(). Ce kwarg contient un tuple de la forme(x, y)oùxetysont 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 Terraqiskit.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.CNOTDihedralpour 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
QuantumCircuitcomme entrées pour spécifier les opérateurs A et Q. Ce changement va de pair avec l'introduction deGroverOperatordans 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 suitimport 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 un nombre réel dans qui spécifie la fraction des meilleurs échantillons observés qui sont utilisés pour calculer la fonction objective. Observez que si , CVaR est équivalent à une valeur d'espérance standard. De même, si , alors CVaR correspond à l'utilisation du meilleur échantillon observé. Les valeurs intermédiaires de 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
Eigensolverpour 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
Driverqui fournit les informations pertinentes sur la molécule, un siteTransformationqui 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 sitesQEOMetNumpyEigensolversont 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
OrbitalOptimizationVQEa é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,GaussianConditionalIndependenceModeletEuropeanCallExpectedValueà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 resp. resp. .
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 resp. resp. resp. .
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 .
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 . 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
transformationspour 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 estfermionic_transformationIntroduit dans les algorithmesground_state_solverspour le calcul des propriétés de l'état fondamental. Le calcul peut être effectué à l'aide deMinimumEigensolverou deAdaptVQEIntroduitchemistry/resultsoù 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 minimalesminimum_eigensolver_factoriesoù les calculateurs d'équations minimales spécifiques à la chimie peuvent être initialisés Introduit l'optimisation orbitale vqeoovqeen tant que solveur d'état fondamental pour les applications de chimie -
Nouvelles classes de résultats d'algorithmes :
Groverla méthode_run()renvoie la classeGroverResult.AmplitudeEstimationla méthode_run()renvoie la classeAmplitudeEstimationResult.IterativeAmplitudeEstimationla méthode_run()renvoie la classeIterativeAmplitudeEstimationResult.MaximumLikelihoodAmplitudeEstimationla méthode_run()renvoie la classeMaximumLikelihoodAmplitudeEstimationResult.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 :
HHLla méthode_run()renvoie la classeHHLResult.NumPyLSsolverla méthode_run()renvoie la classeNumPyLSsolverResult.Toutes les nouvelles classes de résultats sont rétrocompatibles avec le dictionnaire de résultats précédent.
-
MinimumEigenOptimizationResultexpose maintenant les propriétés :sampleseteigensolver_result. Cette dernière est obtenue à partir de l'algorithme sous-jacent utilisé par l'optimiseur et est spécifique à l'algorithme.RecursiveMinimumEigenOptimizerrenvoie maintenant une instance de la classe de résultatsRecursiveMinimumEigenOptimizationResultqui, à 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ésreplacementsethistoryqui sont spécifiques à cet optimiseur. La profondeur de l'historique est gérée par le paramètrehistoryde l'optimiseur. -
GroverOptimizerrenvoie maintenant une instance deGroverOptimizationResultet cette classe de résultats expose directement les propriétésoperation_counts,n_input_qubitsetn_output_qubits. Ces propriétés ne sont plus disponibles dans le dictionnaireraw_results. -
SlsqpOptimizerrenvoie désormais une instance deSlsqpOptimizationResultet 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
QuantumCircuiten tant que circuits de générateur dans le siteQuantumGenerator. -
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
evalsur des objets de fonction d'état sans argument, ce qui renvoie la représentationVectorStateFnde la fonction d'état. Ce comportement est cohérent avec celui deOperatorBase.eval, qui renvoie la représentation deMatrixOpsi aucun argument n'est transmis. -
Ajoute
max_iterationsà la classeVQEAdaptafin 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_objectivedes algorithmes d'estimation de l'amplitude a été renomméobjective_qubits. -
TransformationType
-
QubitMappingType
-
Déclasser les types
CircuitFactoryet dérivés. La classeCircuitFactorya été introduite comme classe temporaire lorsque la classeQuantumCircuitn'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.QuadraticProgramToIsingetqiskit.optimization.converters.IsingToQuadraticProgramsont obsolètes et seront supprimées dans une prochaine version. Les méthodesqiskit.optimization.QuadraticProgram,to_ising()etfrom_ising()doivent être utilisées à la place. -
Déclasser
WeightedSumOperatorqui a été porté dans la bibliothèque de circuits sous le nom deWeightedAdderdansqiskit.circuit.library. -
Core Hamiltonianest dépréciée au profit de la classeFermionicTransformationChemistry Operatorest dépréciée au profit de la classetranformationsminimum_eigen_solvers/vqe_adaptest également dépréciée et déplacée en tant qu'implémentation de l'interface ground_state\solverapplications/molecular_ground_state_energyest dépréciée au profit de la classeground_state_solver -
Optimizer.SupportLevell'énumération imbriquée est remplacée parOptimizerSupportLeveletOptimizer.SupportLevela été supprimé. Utilisez, par exemple,OptimizerSupportLevel.requiredau lieu deOptimizer.SupportLevel.required. -
Déclasser les
UnivariateVariationalDistributionetMultivariateVariationalDistributionen tant qu'éléments d'entrée duQuantumGenerator. Au lieu de cela, des objets simplesQuantumCircuitpeuvent ê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_iteren faveur demaxiter. La classe d'optimiseur SPSA a supprimé le paramètre__init__max_trialsen faveur demaxiter. la fonction optimize_svm a supprimé le paramètremax_itersen faveur demaxiter. La classe ADMMParameters a déprécié le paramètre__init__max_iteren faveur demaxiter.
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_measurementsoit 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,
websockets7.0 était utilisé pour Python 3.6. Avec cette version,websockets8.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.