Skip to main content
IBM Quantum Platform

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 QuantumCircuit qui permettent d'ajouter ou de supprimer des mesures à la fin d'un circuit.


    measure_all()

    Ajoute une opération barrier suivie d'une opération measure à tous les qubits du circuit. Crée un site ClassicalRegister de taille égale au nombre de qubits dans le circuit, qui stocke les mesures.


    measure_active()

    Ajoute une opération barrier suivie d'une opération measure à tous les qubits actifs du circuit. Un qubit est actif si au moins une autre opération agit sur lui. Crée un site ClassicalRegister de taille égale au nombre de qubits actifs dans le circuit, qui stocke les mesures.


    remove_final_measurements()

    Supprime toutes les mesures finales et les barrier pré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 site ClassicalRegister sont inactifs (aucune opération ne leur est associée), le site ClassicalRegister est 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_decompose et un décomposeur d'angle d'Euler à qubit unique OneQubitEulerDecomposer ont été ajoutés au module quantum_info.synthesis .

  • Un transpiler pass MSBasisDecomposer a é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.mock contiennent désormais un instantané des données d'étalonnage de l'appareil réel. Elle est accessible via la méthode properties() 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 ax a été ajouté aux fonctions de visualisation suivantes :

    • qiskit.visualization.plot_histogram
    • qiskit.visualization.plot_state_paulivec
    • qiskit.visualization.plot_state_qsphere
    • qiskit.visualization.circuit_drawer (mpl uniquement)
    • qiskit.QuantumCircuit.draw (mpl uniquement)

    Ce kwarg est utilisé pour transmettre un objet matplotlib.axes.Axes aux 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_real et ax_imag a été ajouté aux fonctions de visualisation suivantes :

    • qiskit.visualization.plot_state_hinton
    • qiskit.visualization.plot_state_city

    Ces nouveaux kargs fonctionnent de la même manière que les kwargs ax nouvellement 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: Unroller

    La 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: Unroller

    Si 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 Delay qui peut être insérée dans une impulsion Schedule. Cette commande accepte un duration et peut être ajoutée à n'importe quel Channel. 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_sched

    Il 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 data des objets qiskit.QuantumCircuit sont désormais validées selon les mêmes règles que celles utilisées dans l'API QuantumCircuit . Cela a été fait pour améliorer les performances de l'API des circuits puisque nous pouvons maintenant supposer que l'attribut data est dans un format connu. Si vous modifiez manuellement l'attribut data d'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 DenseLayout au lieu de NoiseAdaptiveLayout. La passe Denselayout a é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 site PulseChannelSpec. 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.ops a été supprimé. Utiliser directement les méthodes Schedule et Instruction . Par exemple, au lieu de :

    ops.union(schedule_0, schedule_1)
    ops.union(instruction, schedule)  # etc

    Au 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, et flatten.

Remarques concernant la dépréciation

  • L'utilisation de la propriété control de qiskit.circuit.Instruction pour 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é condition de qiskit.circuit.Instruction.
  • La prise en charge de la définition des paramètres qiskit.circuit.Instruction à l'aide d'un objet de type qiskit.qasm.node.Node est obsolète. Node précédemment utilisés comme paramètres doivent être convertis dans un type supporté avant d'initialiser un nouvel objet Instruction ou d'appeler le setter Instruction.params . Les types pris en charge sont int, float, complex, str, qiskit.circuit.ParameterExpression ou numpy.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 classes qiskit.circuit.Qubit et qiskit.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 mpl est utilisée pour qiskit.QuantumCircuit.draw() ou qiskit.visualization.circuit_drawer() et que le kwarg style est utilisé, le fait de transmettre des clés de dictionnaire non prises en charge dans le cadre du dictionnaire style` 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 length pour la méthode qiskit.QuantumCircuit.draw() et la fonction qiskit.visualization.circuit_drawer() avec le mode de sortie texte est obsolète. Il a été remplacé par fold kwarg 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_length sera supprimé dans une prochaine version. Les appels doivent donc être mis à jour pour utiliser fold à la place.
  • Le champ fold dans le kwarg style dict pour la méthode qiskit.QuantumCircuit.draw() et la fonction qiskit.visualization.circuit_drawer() a été supprimé. Il a été remplacé par le fold kwarg 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 à QobjExperimentHeader de l'impulsion Qobj. Ceci corrige un bogue dans le format de données de meas_level=2 ré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 pour memory_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.Figure renvoyé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 inline ou %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 les Figure.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

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.