Notes de publication de Qiskit 0.13
0.13.0
Terra 0.10.0
Prélude
La version 0.10.0 comprend plusieurs nouvelles fonctionnalités et corrections de bogues. Le plus grand changement de cette version est l'ajout d'un support initial pour l'utilisation de Qiskit avec des pièges à ions.
Nouvelles fonctions
-
Introduction de nouvelles méthodes dans
QuantumCircuitqui permettent d'ajouter ou de supprimer des mesures à la fin d'un circuit.measure_all()Ajoute une opération
barriersuivie d'une opérationmeasureà tous les qubits du circuit. Crée un siteClassicalRegisterde taille égale au nombre de qubits dans le circuit, qui stocke les mesures.measure_active()Ajoute une opération
barriersuivie d'une opérationmeasureà tous les qubits actifs du circuit. Un qubit est actif si au moins une autre opération agit sur lui. Crée un siteClassicalRegisterde taille égale au nombre de qubits actifs dans le circuit, qui stocke les mesures.remove_final_measurements()Supprime toutes les mesures finales et les
barrierprécédents d'un circuit. Une mesure est considérée comme "finale" si elle n'est suivie d'aucune autre opération, à l'exclusion des barrières et des autres mesures. Une fois les mesures supprimées, si tous les bits classiques du siteClassicalRegistersont inactifs (aucune opération ne leur est associée), le siteClassicalRegisterest supprimé.Exemples :
# Using measure_all() circuit = QuantumCircuit(2) circuit.h(0) circuit.measure_all() circuit.draw() # A ClassicalRegister with prefix measure was created. # It has 2 clbits because there are 2 qubits to measure ┌───┐ ░ ┌─┐ q_0: |0>┤ H ├─░─┤M├─── └───┘ ░ └╥┘┌─┐ q_1: |0>──────░──╫─┤M├ ░ ║ └╥┘ measure_0: 0 ═════════╩══╬═ ║ measure_1: 0 ════════════╩═ # Using measure_active() circuit = QuantumCircuit(2) circuit.h(0) circuit.measure_active() circuit.draw() # This ClassicalRegister only has 1 clbit because only 1 qubit is active ┌───┐ ░ ┌─┐ q_0: |0>┤ H ├─░─┤M├ └───┘ ░ └╥┘ q_1: |0>──────░──╫─ ░ ║ measure_0: 0 ═════════╩═ # Using remove_final_measurements() # Assuming circuit_all and circuit_active are the circuits from the measure_all and # measure_active examples above respectively circuit_all.remove_final_measurements() circuit_all.draw() # The ClassicalRegister is removed because, after the measurements were removed, # all of its clbits were idle ┌───┐ q_0: |0>┤ H ├ └───┘ q_1: |0>───── circuit_active.remove_final_measurements() circuit_active.draw() # This will result in the same circuit ┌───┐ q_0: |0>┤ H ├ └───┘ q_1: |0>───── -
La prise en charge initiale de l'exécution d'expériences sur des pièges à ions a été ajoutée.
-
Une porte Rxx (rxx) et une porte globale Mølmer-Sørensen (ms) ont été ajoutées au jeu de portes standard.
-
Un décomposeur Cnot to Rxx/Rx/Ry
cnot_rxx_decomposeet un décomposeur d'angle d'Euler à qubit uniqueOneQubitEulerDecomposeront été ajoutés au modulequantum_info.synthesis. -
Un transpiler pass
MSBasisDecomposera été ajouté pour dérouler les circuits définis sur U3 et les portes Cnot en un circuit défini sur Rxx,Ry et Rx. Ce laissez-passer sera inclus dans les gestionnaires de laissez-passer prédéfinis pour les backends qui incluent la porte "rxx" dans leurs portes de base prises en charge. -
Les backends de
qiskit.test.mockcontiennent désormais un instantané des données d'étalonnage de l'appareil réel. Elle est accessible via la méthodeproperties()pour chaque backend. Il peut être utilisé pour tester tout code dépendant des propriétés du backend, comme les passes de transpilation adaptées au bruit ou les modèles de bruit de l'appareil pour la simulation. Cela permettra d'accélérer le cycle de test et de développement sans qu'il soit nécessaire de passer par des backends en direct. -
Permet à la classe Result de renvoyer des résultats partiels. Si un schéma de résultats valide est chargé et qu'il contient des expériences qui ont réussi et d'autres qui ont échoué, il est possible d'accéder aux données des expériences qui ont réussi, tout en levant une exception pour les expériences qui ont échoué et en affichant le message d'erreur approprié pour les résultats qui ont échoué.
-
Un kwarg
axa été ajouté aux fonctions de visualisation suivantes :qiskit.visualization.plot_histogramqiskit.visualization.plot_state_paulivecqiskit.visualization.plot_state_qsphereqiskit.visualization.circuit_drawer(mpluniquement)qiskit.QuantumCircuit.draw(mpluniquement)
Ce kwarg est utilisé pour transmettre un objet
matplotlib.axes.Axesaux fonctions de visualisation. Cela permet d'intégrer ces fonctions de visualisation dans un processus de visualisation plus large. De plus, si un kwarg ax est spécifié, les fonctions de visualisation ne renvoient rien. -
Un kwarg
ax_realetax_imaga été ajouté aux fonctions de visualisation suivantes :qiskit.visualization.plot_state_hintonqiskit.visualization.plot_state_city
Ces nouveaux kargs fonctionnent de la même manière que les kwargs
axnouvellement ajoutés pour d'autres fonctions de visualisation. Cependant, comme ces graphiques utilisent deux axes (l'un pour la composante réelle, l'autre pour la composante imaginaire). Le fait d'avoir deux kwargs offre également la possibilité de ne générer une visualisation que pour l'un des composants au lieu de toujours faire les deux. Par exemple :from matplotlib import pyplot as plt from qiskit.visualization import plot_state_hinton ax = plt.gca() plot_state_hinton(psi, ax_real=ax)ne génère qu'un tracé de la composante réelle.
-
Un gestionnaire de passe donné peut maintenant être modifié avec la nouvelle méthode replace. Cette méthode permet de remplacer une étape particulière dans un gestionnaire de passe, ce qui peut s'avérer pratique lorsqu'il s'agit de gestionnaires de passe prédéfinis. Par exemple, modifions le sélecteur de mise en page du gestionnaire de passage utilisé au niveau d'optimisation 0 :
from qiskit.transpiler.preset_passmanagers.level0 import level_0_pass_manager from qiskit.transpiler.transpile_config import TranspileConfig pass_manager = level_0_pass_manager(TranspileConfig(coupling_map=CouplingMap([[0,1]]))) pass_manager.draw()[0] FlowLinear: SetLayout [1] Conditional: TrivialLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: UnrollerLa sélection de la mise en page est définie à l'étape [1.] Remplaçons-le par DenseLayout:
from qiskit.transpiler.passes import DenseLayout pass_manager.replace(1, DenseLayout(coupling_map), condition=lambda property_set: not property_set['layout']) pass_manager.draw()[0] FlowLinear: SetLayout [1] Conditional: DenseLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: UnrollerSi vous souhaitez le remplacer sans condition, vous pouvez utiliser le raccourci set-item :
pass_manager[1] = DenseLayout(coupling_map) pass_manager.draw()[0] FlowLinear: SetLayout [1] FlowLinear: DenseLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: Unroller -
Introduction d'une nouvelle commande d'impulsion
Delayqui peut être insérée dans une impulsionSchedule. Cette commande accepte undurationet peut être ajoutée à n'importe quelChannel. D'autres commandes ne peuvent pas être programmées sur un canal pendant un délai.Le délai peut être ajouté comme n'importe quelle autre commande d'impulsion. Par exemple :
from qiskit import pulse from qiskit.pulse.utils import pad dc0 = pulse.DriveChannel(0) delay = pulse.Delay(1) test_pulse = pulse.SamplePulse([1.0]) sched = pulse.Schedule() sched += test_pulse(dc0).shift(1) # build padded schedule by hand ref_sched = delay(dc0) | sched # pad schedule padded_sched = pad(sched) assert padded_sched == ref_schedIl est également possible de passer des canaux supplémentaires pour le remplissage et un temps pour le remplissage jusqu'à, par exemple :
from qiskit import pulse from qiskit.pulse.utils import pad dc0 = pulse.DriveChannel(0) dc1 = pulse.DriveChannel(1) delay = pulse.Delay(1) test_pulse = pulse.SamplePulse([1.0]) sched = pulse.Schedule() sched += test_pulse(dc0).shift(1) # build padded schedule by hand ref_sched = delay(dc0) | delay(dc1) | sched # pad schedule across both channels until up until the first time step padded_sched = pad(sched, channels=[dc0, dc1], until=1) assert padded_sched == ref_sched
Mise à niveau
-
Les affectations et les modifications de l'attribut
datades objetsqiskit.QuantumCircuitsont désormais validées selon les mêmes règles que celles utilisées dans l'APIQuantumCircuit. Cela a été fait pour améliorer les performances de l'API des circuits puisque nous pouvons maintenant supposer que l'attributdataest dans un format connu. Si vous modifiez manuellement l'attributdatad'un objet circuit auparavant, cela peut ne plus fonctionner si vos modifications aboutissent à une structure de données autre que la liste des instructions avec contexte au format[(instruction, qargs, cargs)] -
Le gestionnaire de passage par défaut du transpileur pour le niveau d'optimisation 2 utilise désormais par défaut le mécanisme de sélection de l'agencement
DenseLayoutau lieu deNoiseAdaptiveLayout. La passeDenselayouta également été modifiée pour tenir compte du bruit. -
La classe
DeviceSpecification, obsolète, a été supprimée. Au lieu de cela, vous devez utiliser le sitePulseChannelSpec. Par exemple, vous pouvez exécuter quelque chose comme :device = pulse.PulseChannelSpec.from_backend(backend) device.drives[0] # for DeviceSpecification, this was device.q[0].drive device.memoryslots # this was device.mem -
Le module obsolète
qiskit.pulse.opsa été supprimé. Utiliser directement les méthodesScheduleetInstruction. Par exemple, au lieu de :ops.union(schedule_0, schedule_1) ops.union(instruction, schedule) # etcAu lieu de cela, veuillez utiliser :
schedule_0.union(schedule_1) instruction.union(schedule)Il en va de même pour les autres fonctions de
ops:insert,shift,append, etflatten.
Remarques concernant la dépréciation
- L'utilisation de la propriété
controldeqiskit.circuit.Instructionpour le contrôle classique est désormais obsolète. À l'avenir, cette propriété sera utilisée pour le contrôle quantique. Les opérations conditionnées de manière classique seront traitées par la propriétéconditiondeqiskit.circuit.Instruction. - La prise en charge de la définition des paramètres
qiskit.circuit.Instructionà l'aide d'un objet de typeqiskit.qasm.node.Nodeest obsolète.Nodeprécédemment utilisés comme paramètres doivent être convertis dans un type supporté avant d'initialiser un nouvel objetInstructionou d'appeler le setterInstruction.params. Les types pris en charge sontint,float,complex,str,qiskit.circuit.ParameterExpressionounumpy.ndarray. - Dans la version qiskit 0.9.0, la représentation des bits (qubits et bits classiques) est passée de tuples de la forme
(register, index)à des instances des classesqiskit.circuit.Qubitetqiskit.circuit.Clbit. Pour des raisons de rétrocompatibilité, la comparaison de l'égalité entre un ancien tuple et les classes de bits a été prise en charge lors de la transition des tuples vers les objets. Ce support est désormais obsolète et sera supprimé à l'avenir. À l'avenir, tout devrait utiliser les classes de bits au lieu des tuples. - Lorsque la sortie
mplest utilisée pourqiskit.QuantumCircuit.draw()ouqiskit.visualization.circuit_drawer()et que le kwargstyleest utilisé, le fait de transmettre des clés de dictionnaire non prises en charge dans le cadre du dictionnairestyle`est désormais déconseillé. Alors que ces arguments inconnus étaient auparavant ignorés silencieusement, à l'avenir, les clés non prises en charge soulèveront une exception. - Le kwarg
line lengthpour la méthodeqiskit.QuantumCircuit.draw()et la fonctionqiskit.visualization.circuit_drawer()avec le mode de sortie texte est obsolète. Il a été remplacé parfoldkwarg qui se comporte de manière identique pour le mode de sortie texte (mais qui prend également en charge le mode de sortie mpl).line_lengthsera supprimé dans une prochaine version. Les appels doivent donc être mis à jour pour utiliserfoldà la place. - Le champ
folddans le kwargstyledict pour la méthodeqiskit.QuantumCircuit.draw()et la fonctionqiskit.visualization.circuit_drawer()a été supprimé. Il a été remplacé par lefoldkwarg sur les deux fonctions. Ce kwarg se comporte de la même manière que le champ dans le dict de style.
Corrections des erreurs
- Les instructions qui sous-tendent tous les types de dessins de circuits ont été modifiées pour tenir compte de la justification droite/gauche. Il en résulte parfois un résultat qui est topologiquement équivalent au rendu des versions précédentes, mais visuellement différent du rendu antérieur. Corrige le problème #2802
- Ajouter
memory_slotsàQobjExperimentHeaderde l'impulsion Qobj. Ceci corrige un bogue dans le format de données demeas_level=2résultats d'expériences d'impulsion. Les états quantiques mesurés sont renvoyés sous la forme d'une chaîne de bits avec un remplissage à zéro basé sur le nombre défini pourmemory_slots. - Correction de la visualisation de la porte rzz dans le dessinateur de circuit en latex pour qu'elle corresponde à la porte cu1 afin de refléter la symétrie de la porte rzz. La correction est basée sur la commande cds du paquetage latex de qcircuit. Corrige le problème #1957
Autres remarques
matplotlib.figure.Figurerenvoyés par les fonctions de visualisation ne sont plus toujours fermés par défaut. Au lieu de cela, les objets figures renvoyés ne sont fermés que si le backend matplotlib configuré est un backend jupyter en ligne (défini avec%matplotlib inlineou%matplotlib notebook). Les objets output figure sont toujours fermés avec ces backends afin d'éviter les outputs dupliqués dans les notebooks jupyter (c'est pourquoi lesFigure.close()ont été ajoutés à l'origine).
Aer 0.3
Aucun changement
Ignis 0.2
Aucun changement
Aqua 0.6
Aucun changement
IBM 0.3 du fournisseur Q
Aucun changement