Notes de publication de Qiskit 0.7
0.7
Dans Qiskit 0.7, nous avons introduit Qiskit Aer et l'avons combiné avec Qiskit Terra.
Terra 0.7
Nouvelles fonctions
Cette version comprend plusieurs nouvelles fonctionnalités et de nombreuses corrections de bugs. Avec cette version, les interfaces pour les diagrammes de circuits, les histogrammes, les vecteurs de bloch et les visualisations d'état sont déclarées stables. De plus, cette version inclut un ordre de bits/endianness défini et standardisé dans tous les aspects de Qiskit. Ces interfaces sont toutes déclarées stables dans cette version et ne feront pas l'objet de modifications radicales à l'avenir, à moins que des périodes de dépréciation appropriées et longues ne prévoient des changements à venir.
Les nouvelles fonctionnalités suivantes ont également été introduites :
- Un nouveau mode de sortie pour les dessins de circuits ASCII
- Une nouvelle interface de dessin de circuits à partir des objets
QuantumCircuitqui permet aux appels decircuit.draw()ouprint(circuit)de rendre un dessin de circuits - Un visualisateur pour dessiner la représentation DAG d'un circuit
- Un nouveau type de diagramme d'état quantique pour les diagrammes de Hinton dans les diagrammes d'état locaux basés sur matplotlib
- 2 nouvelles méthodes de construction de la classe
QuantumCircuitfrom_qasm_str()etfrom_qasm_file()qui vous permettent de créer facilement un objet circuit à partir de OpenQASM - Une nouvelle fonction
plot_bloch_multivector()pour tracer des vecteurs de Bloch à partir d'un vecteur d'état ou d'une matrice de densité tensoriée - Les résultats des mesures par tir sont disponibles dans les simulateurs et certains appareils. Il est possible d'y accéder en attribuant la valeur
Trueau kwargmemorylors de l'appel àcompile()ouexecute(), puis en utilisant la méthodeget_memory()sur l'objetResult. - Un module
qiskit.quantum_infoavec des objets de Pauli réorganisés et des méthodes pour travailler avec des états quantiques - Nouvelles passes transpiles pour l'analyse et la transformation des circuits :
CommutationAnalysis,CommutationTransformation,CXCancellation,Decompose,Unroll,Optimize1QGates,CheckMap,CXDirection,BarrierBeforeFinalMeasurements - Un nouveau mappeur de swaps alternatifs passe dans le transpileur :
BasicSwap,LookaheadSwap,StochasticSwap - Infrastructure de transposition plus avancée avec prise en charge des passes d'analyse, des passes de transformation, d'un site global
property_setpour le gestionnaire de passes et d'un contrôle des passes par répétition jusqu'à la fin
Compatibility Considerations
Dans le cadre de la version 0.7, les éléments suivants ont été dépréciés et seront soit supprimés, soit modifiés de manière incompatible dans une prochaine version. Bien qu'ils ne soient pas strictement nécessaires, ce sont des éléments à prendre en compte avant la prochaine version afin d'éviter un changement radical.
plot_circuit(),latex_circuit_drawer(),generate_latex_source(), etmatplotlib_circuit_drawer()from qiskit.tools.visualization sont obsolètes. Au lieu de cela, il convient d'utiliser la fonctioncircuit_drawer()du même module. Des options kwarg permettent de refléter la fonctionnalité de toutes les fonctions dépréciées.- La sortie par défaut actuelle de
circuit_drawer()(utilisant latex et se rabattant sur python) est dépréciée et sera modifiée pour utiliser la sortietextpar défaut dans les prochaines versions. - Les fonctions
qiskit.wrapper.load_qasm_string()etqiskit.wrapper.load_qasm_file()sont obsolètes et les méthodes de constructionQuantumCircuit.from_qasm_str()etQuantumCircuit.from_qasm_file()doivent être utilisées à la place. - Les clés
plot_barriersetreverse_bitsdu dictionnaire de kwargstylesont obsolètes, les kwargsqiskit.tools.visualization.circuit_drawer()plot_barriersetreverse_bitsdoivent être utilisés à la place. - Les fonctions
plot_state()etiplot_state()ont été dépréciées. Au lieu de cela, les fonctionsplot_state_*()etiplot_state_*()doivent être appelées pour la méthode de visualisation requise. - L'argument
skip_transpilera été supprimé decompile()etexecute(). Au lieu de cela, vous pouvez utiliser directement le sitePassManager, en associant simplement le sitepass_managerà un objetPassManagervierge à l'aide de la commandePassManager() - La fonction
transpile_dag()formatkwarg permettant d'obtenir différents formats de sortie est obsolète. Il est préférable de convertir l'objet de sortie par défautDAGCircuitdans le format souhaité. - Les dérouleurs ont été dépréciés; à l'avenir, seul le déroulage de DAG à DAG sera pris en charge.
Veuillez noter que certaines modifications incompatibles avec le passé ont été apportées à cette version. Les notes suivantes contiennent des informations sur la manière de s'adapter à ces changements.
Modifications apportées aux objets Result
Dans le cadre de la réécriture de l'objet "Résultats" afin de le rendre plus cohérent et d'en faire une interface stable, quelques changements ont été apportés à la manière dont vous accédez aux données stockées dans l'objet "Résultats". Tout d'abord, la méthode get_data() a été renommée en data(). Ce changement s'accompagne d'une modification du format des données renvoyées par la fonction. Il renvoie désormais les données brutes des backends au lieu d'effectuer un post-traitement. Par exemple, dans les versions précédentes, vous pouviez appeler :
result = execute(circuit, backend).result()
unitary = result.get_data()['unitary']
print(unitary)et cela renverrait la matrice unitaire comme :
[[1+0j, 0+0.5j], [0-0.5j][-1+0j]]Mais maintenant, si vous appelez (avec la méthode renommée) :
result.data()['unitary']il renverra quelque chose comme :
[[[1, 0], [0, -0.5]], [[0, -0.5], [-1, 0]]]Pour obtenir les résultats post-traités dans le même format qu'avant la version 0.7, vous devez utiliser les méthodes get_counts(), get_statevector(), et get_unitary() sur l'objet résultat au lieu de get_data()['counts'], get_data()['statevector'], et get_data()['unitary'] respectivement.
En outre, la prise en charge de len() et de l'indexation sur un objet Result a été supprimée. Au lieu de cela, vous devez traiter les résultats des méthodes post-traitées sur les objets Result.
Les méthodes get_snapshot() et get_snapshots() de la classe Result ont également été supprimées. Au lieu de cela, vous pouvez accéder aux instantanés en utilisant Result.data()['snapshots'].
Modifications apportées à la visualisation
Le changement le plus important apporté à la visualisation dans la version 0.7 est la suppression de Matplotlib et d'autres dépendances de visualisation des exigences du projet. Cela a été fait pour simplifier les exigences et la configuration requises pour l'installation de Qiskit. Si vous prévoyez d'utiliser des visualisations (y compris toutes les magies jupyter) à l'exception des sorties text, latex, et latex_source pour le tiroir du circuit, vous devez vous assurer manuellement que les dépendances de la visualisation sont installées. Pour ce faire, vous pouvez vous appuyer sur les exigences optionnelles du paquetage Qiskit Terra :
pip install qiskit-terra[visualization]Par ailleurs, des modifications ont été apportées à plusieurs interfaces dans le cadre de la stabilisation, ce qui peut avoir un impact sur le code existant. La première est que le kwarg basis dans la fonction circuit_drawer() n'est plus accepté. Si vous comptiez sur circuit_drawer() pour ajuster les portes de base utilisées pour dessiner un schéma de circuit, vous devrez le faire avant d'appeler circuit_drawer(). Par exemple :
from qiskit.tools import visualization
visualization.circuit_drawer(circuit, basis_gates='x,U,CX')devra être adapté pour être :
from qiskit import BasicAer
from qiskit import transpiler
from qiskit.tools import visualization
backend = BasicAer.backend('qasm_simulator')
draw_circ = transpiler.transpile(circuit, backend, basis_gates='x,U,CX')
visualization.circuit_drawer(draw_circ)A l'avenir, la fonction circuit_drawer() sera la seule interface pour le dessin des circuits dans le module de visualisation. Avant la version 0.7, il existait plusieurs autres fonctions qui utilisaient différents backends de sortie ou modifiaient la sortie pour dessiner des circuits. Cependant, toutes ces autres fonctions ont été dépréciées et ces fonctionnalités ont été intégrées en tant qu'options sur circuit_drawer().
Pour les autres fonctions de visualisation, plot_histogram() et plot_state() , il y a également quelques changements à vérifier lors de la mise à jour. Tout d'abord, la sortie de ces fonctions a changé. Dans les versions précédentes, ces fonctions affichaient de manière interactive la visualisation de la sortie. Cependant, il a été modifié et renvoie désormais un objet matplotlib.Figure . Cela offre beaucoup plus de flexibilité et d'options pour interagir avec la visualisation avant de l'enregistrer ou de l'afficher. Cela nécessitera un ajustement de la manière dont ces fonctions sont utilisées. Par exemple, avant cette version, lors d'un appel :
plot_histogram(counts)
plot_state(rho)ouvrirait de nouvelles fenêtres (en fonction du backend de matplotlib) pour afficher la visualisation. Cependant, à partir de 0.7, vous devrez appeler show() sur la sortie pour refléter ce comportement. Par exemple :
plot_histogram(counts).show()
plot_state(rho).show()ou :
hist_fig = plot_histogram(counts)
state_fig = plot_state(rho)
hist_fig.show()
state_fig.show()Notez que cela ne s'applique qu'à l'exécution en dehors de Jupyter. Aucun ajustement n'est nécessaire dans un environnement Jupyter, car les carnets Jupyter comprennent nativement comment rendre les objets matplotlib.Figure .
Cependant, le fait de renvoyer l'objet Figure offre une plus grande souplesse dans le traitement de la sortie. Par exemple, au lieu de simplement montrer la figure, vous pouvez maintenant l'enregistrer directement dans un fichier en tirant parti de la méthode savefig() . Par exemple :
hist_fig = plot_histogram(counts)
state_fig = plot_state(rho)
hist_fig.savefig('histogram.png')
state_fig.savefig('state_plot.png')L'autre aspect clé qui a changé avec ces fonctions est l'exécution sous jupyter. Dans les versions 0.6, plot_state() et plot_histogram() , lors de l'exécution sous jupyter, le comportement par défaut était d'utiliser les tracés Javascript interactifs si la bibliothèque Javascript hébergée à l'extérieur pour le rendu de la visualisation était accessible sur le réseau. Si ce n'est pas le cas, il utilisera simplement la version de matplotlib. Cependant, dans la version 0.7, ce n'est plus le cas, et des fonctions distinctes pour les graphiques interactifs, iplot_state() et iplot_histogram() , doivent être utilisées à la place. plot_state() et plot_histogram() utilisent toujours les versions de matplotlib.
En outre, à partir de cette version, la fonction plot_state() est dépréciée au profit de l'appel à des méthodes individuelles pour chaque méthode de tracé d'un état quantique. La fonction plot_state() continuera à fonctionner jusqu'à la version 0.9, mais elle émettra un avertissement chaque fois qu'elle sera utilisée. :NONE.
Qiskit Terra 0.6 | Qiskit Terra 0.7 + |
|---|---|
| état_du_tracé(rho) | tracé de l'état de la ville (rho) |
| plot_state(rho, method='city') | tracé de l'état de la ville (rho) |
| plot_state(rho, method='paulivec') | tracé de l'état de Paulivec(rho) |
| plot_state(rho, method='qsphere') | plot_state_qsphere(rho) |
| plot_state(rho, method='bloch') | plot_bloch_multivector(rho) |
| plot_state(rho, method='hinton') | plot_state_hinton(rho) |
Il en va de même pour l'équivalent interactif JS, iplot_state(). Les noms des fonctions sont tous les mêmes, mais chaque fonction est précédée d'un i. Par exemple, iplot_state(rho, method='paulivec') est iplot_state_paulivec(rho).
Modifications apportées aux backends
Avec les améliorations apportées dans la version 0.7, il y a quelques éléments liés aux backends à garder à l'esprit lors de la mise à jour. Le changement le plus important est la restructuration des instances de fournisseurs dans l'espace de noms racine qiskit` . Le fournisseur Aer n'est pas installé par défaut et nécessite l'installation du paquet qiskit-aer . Ce paquet contient le nouveau simulateur haute performance et complet. Si vous l'avez installé via pip install qiskit , il est déjà installé. Les simulateurs python sont désormais disponibles sous qiskit.BasicAer et les anciens simulateurs C++ sont disponibles sous qiskit.LegacySimulators. Cela signifie également que le repli implicite vers des simulateurs basés sur python lorsque les simulateurs C++ ne sont pas trouvés n'existe plus. Si vous demandez un simulateur local basé sur C++ et qu'il ne peut pas être trouvé, une exception sera levée au lieu d'utiliser le simulateur python.
En outre, les fonctions de haut niveau register() et available_backends() , qui étaient auparavant dépréciées, ont été supprimées. En outre, les méthodes backend.parameters() et backend.calibration() ont été supprimées au profit de backend.properties(). Vous pouvez vous référer à la section " Working with backends " des notes de mise à jour de 0.6 pour plus de détails sur ces changements.
Les appels backend.jobs() et backend.retrieve_jobs() ne renvoient plus les résultats de ces travaux. Au lieu de cela, vous devez appeler la méthode result() sur les objets jobs renvoyés.
Modifications apportées au compilateur, au transpilateur et aux dérouleurs
Dans le cadre d'un effort de stabilisation des interfaces du compilateur, il y a eu plusieurs changements dont il faut tenir compte lorsque l'on utilise les fonctions du compilateur. Tout d'abord, il est important de noter que la fonction qiskit.transpiler.transpile() prend désormais un objet QuantumCircuit (ou une liste d'objets) et renvoie un objet QuantumCircuit (ou une liste d'objets). Le traitement des DAG est désormais effectué en interne.
Vous pouvez également passer facilement d'un circuit à l'autre, d'un DAG à l'autre et d'un Qobj à l'autre en utilisant les fonctions du site qiskit.converters.
Aer 0.1
Nouvelles fonctions
Aer propose trois backends de simulateurs :
QasmSimulatorsimuler des expériences et renvoyer les résultats des mesuresStatevectorSimulator: renvoie le vecteur d'état final pour un circuit quantique agissant sur l'état zéroUnitarySimulator: renvoie la matrice unitaire d'un circuit quantique
noise module : contient des fonctions avancées de modélisation du bruit pour le QasmSimulator
NoiseModelQuantumError, classes pour la simulation d'un circuit quantique Qiskit en présence d'erreursReadoutErrorerrorssous-module comprenant des fonctions permettant de générer des objetsQuantumErrorpour les types d'erreurs quantiques suivants : Kraus, unité mixte, unité cohérente, Pauli, dépolarisation, relaxation thermique, amortissement d'amplitude, amortissement de phase, amortissement combiné de phase et d'amplitudedevicesous-module pour la génération automatique d'un modèle de bruit basé sur le siteBackendPropertiesd'un appareil
utils Module :
qobj_utilsfournit des fonctions permettant de modifier directement un Qobj afin d'insérer des instructions spéciales du simulateur qui ne sont pas encore prises en charge par l'API Qiskit Terra.
Aqua 0.4
Nouvelles fonctions
-
API programmatiques pour les algorithmes et les composants - chaque composant peut désormais être instancié et initialisé via un seul appel de constructeur (non vide)
-
QuantumInstanceAPI pour le découplage algorithme/backend -QuantumInstanceencapsule un backend et ses paramètres -
Mise à jour de la documentation et des carnets Jupyter illustrant les nouvelles API programmatiques
-
Parallélisation transparente pour les optimiseurs basés sur le gradient
-
Fonctionnement en mode multiple-contrôlé-non contrôlé (cnx)
-
Composant algorithmique enfichable
RandomDistribution -
Les implémentations concrètes de
RandomDistribution:BernoulliDistribution,LogNormalDistribution,MultivariateDistribution,MultivariateNormalDistribution,MultivariateUniformDistribution,NormalDistribution,UniformDistribution, etUnivariateDistribution -
Les implémentations concrètes de
UncertaintyProblem:FixedIncomeExpectedValue,EuropeanCallExpectedValue, etEuropeanCallDelta -
Algorithme d'estimation de l'amplitude
-
Qiskit Optimisation : Nouveaux modèles Ising pour les problèmes d'optimisation : couverture exacte, emballage d'ensembles, couverture de sommets, clique et partition de graphes
-
Qiskit AI :
- Nouvelles cartes de fonctionnalités étendant l'interface enfichable
FeatureMap:PauliExpansionetPauliZExpansion - Mécanisme de sérialisation/désérialisation du modèle de formation
- Nouvelles cartes de fonctionnalités étendant l'interface enfichable
-
Qiskit Finance :
- Estimation de l'amplitude pour une variable aléatoire de Bernoulli : illustration de l'estimation de l'amplitude sur un problème de qubit unique
- Chargement de plusieurs distributions aléatoires univariées et multivariées
- Option d'achat européenne : valeur attendue et delta (à l'aide de distributions univariées)
- Évaluation des actifs à revenu fixe : valeur attendue (à l'aide de distributions multivariées)
-
La chaîne de Pauli de la classe
Operatorest alignée avec Terra 0.7. L'ordre d'une chaîne de pauli à n qubits est désormaisq_{n-1}...q{0}. Ainsi, les (dé)sérialiseurs (save_to_dictetload_from_dict) de la classeOperatorsont également modifiés pour adopter les changements de la classePauli.
Compatibility Considerations
HartreeFockcomposant de type enfichableInitialStatedéplacé vers Qiskit ChemistryUCCSDcomposant de type enfichableVariationalFormdéplacé vers Qiskit Chemistry