Skip to main content
IBM Quantum Platform

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 QuantumCircuit qui permet aux appels de circuit.draw() ou print(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 QuantumCircuit from_qasm_str() et from_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 True au kwarg memory lors de l'appel à compile() ou execute() , puis en utilisant la méthode get_memory() sur l'objet Result .
  • Un module qiskit.quantum_info avec 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_set pour 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(), et matplotlib_circuit_drawer() from qiskit.tools.visualization sont obsolètes. Au lieu de cela, il convient d'utiliser la fonction circuit_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 sortie text par défaut dans les prochaines versions.
  • Les fonctions qiskit.wrapper.load_qasm_string() et qiskit.wrapper.load_qasm_file() sont obsolètes et les méthodes de construction QuantumCircuit.from_qasm_str() et QuantumCircuit.from_qasm_file() doivent être utilisées à la place.
  • Les clés plot_barriers et reverse_bits du dictionnaire de kwarg style sont obsolètes, les kwargs qiskit.tools.visualization.circuit_drawer() plot_barriers et reverse_bits doivent être utilisés à la place.
  • Les fonctions plot_state() et iplot_state() ont été dépréciées. Au lieu de cela, les fonctions plot_state_*() et iplot_state_*() doivent être appelées pour la méthode de visualisation requise.
  • L'argument skip_transpiler a été supprimé de compile() et execute(). Au lieu de cela, vous pouvez utiliser directement le site PassManager , en associant simplement le site pass_manager à un objet PassManager vierge à l'aide de la commande PassManager()
  • La fonction transpile_dag() format kwarg permettant d'obtenir différents formats de sortie est obsolète. Il est préférable de convertir l'objet de sortie par défaut DAGCircuit dans 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 mesures
  • StatevectorSimulator: renvoie le vecteur d'état final pour un circuit quantique agissant sur l'état zéro
  • UnitarySimulator: renvoie la matrice unitaire d'un circuit quantique

noise module : contient des fonctions avancées de modélisation du bruit pour le QasmSimulator

  • NoiseModel QuantumError, classes pour la simulation d'un circuit quantique Qiskit en présence d'erreurs ReadoutError
  • errors sous-module comprenant des fonctions permettant de générer des objets QuantumError pour 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'amplitude
  • device sous-module pour la génération automatique d'un modèle de bruit basé sur le site BackendProperties d'un appareil

utils Module :

  • qobj_utils fournit 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)

  • QuantumInstance API pour le découplage algorithme/backend - QuantumInstance encapsule 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, et UnivariateDistribution

  • Les implémentations concrètes de UncertaintyProblem: FixedIncomeExpectedValue, EuropeanCallExpectedValue, et EuropeanCallDelta

  • 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 : PauliExpansion et PauliZExpansion
    • Mécanisme de sérialisation/désérialisation du modèle de formation
  • 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 Operator est alignée avec Terra 0.7. L'ordre d'une chaîne de pauli à n qubits est désormais q_{n-1}...q{0} . Ainsi, les (dé)sérialiseurs (save_to_dict et load_from_dict) de la classe Operator sont également modifiés pour adopter les changements de la classe Pauli .

Compatibility Considerations

  • HartreeFock composant de type enfichable InitialState déplacé vers Qiskit Chemistry
  • UCCSD composant de type enfichable VariationalForm déplacé vers Qiskit Chemistry
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.