Skip to main content
IBM Quantum Platform

Notes de publication de Qiskit 0.20


0.20.1

Terra 0.15.2

Corrections des erreurs

  • Lors de l'accès à l'attribut definition d'une instance paramétrée Gate , le site QuantumCircuit avait été généré avec un site ParameterTable invalide, de sorte que la lecture du site QuantumCircuit.parameters ou l'appel du site QuantumCircuit.bind_parameters signalerait de manière incorrecte les paramètres non liés. Ce problème a été résolu.
  • SXGate().inverse() avait précédemment renvoyé une porte 'sx_dg' avec une definition correcte mais une to_matrix incorrecte. Il a été mis à jour de telle sorte que SXGate().inverse() renvoie un SXdgGate() et vice versa.
  • Instruction.inverse()lorsqu'elle n'est pas surchargée par une sous-classe, renvoie dans certains cas une instance Gate avec une méthode to_matrix incorrecte. Les exemples de méthodes to_matrix incorrectes ont été supprimés.
  • Pour C3XGate avec un angle non nul, l'inversion de la porte via C3XGate.inverse() avait précédemment généré une porte inverse incorrecte. Ceci a été corrigé.
  • Les modes de MCXGate ont été mis à jour pour renvoyer une porte du même mode lors de l'appel à .inverse(). Cela résout un problème où, dans certains cas, la transposition d'un circuit contenant l'inverse d'une porte MCXVChain entraînait une erreur.
  • Auparavant, lors de la création d'une porte de phase à contrôle multiple via PhaseGate.control, une porte MCU1Gate était renvoyée. Cette erreur a été corrigée de manière à ce qu'une adresse MCPhaseGate soit renvoyée.
  • Auparavant, toute tentative de décomposition d'un circuit contenant un MCPhaseGate entraînait une erreur due à une incohérence dans la définition du MCPhaseGate. Ceci a été corrigé.
  • QuantumCircuit.compose et DAGCircuit.compose avaient, dans certains cas, traduit de manière incorrecte des portes conditionnelles si le circuit d'entrée contenait plus d'une ClassicalRegister. Ce problème a été résolu.
  • 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 objet Counts vide. La méthode most_frequent() est également mise à jour afin de lever une exception plus descriptive lorsque l'objet est vide. Corrige #5017
  • L'extension des circuits avec des registres différents a mis à jour les propriétés qregs et cregs en conséquence, mais pas les listes qubits et clbits . Comme ceux-ci ne sont plus générés à partir des registres, mais qu'il s'agit de listes mises en cache, il en résulte une divergence entre les registres et les bits. Ce problème a été résolu et la méthode extend met explicitement à jour les listes de bits mises en cache.
  • Correction de bogues dans les implémentations concrètes de la méthode meth:~qiskit.circuit.ControlledGate.inverse qui ne préservent pas le paramètre ctrl_state .
  • Un bogue a été corrigé qui provoquait une erreur de récursion dans les programmes d'impulsion longs.

Aer 0.6.1

Pas de modification

Ignis 0.4.0

Pas de modification

Aqua 0.7.5

Pas de modification

IBM 0.8.0 du fournisseur Q

Pas de modification


0.20.0

Terra 0.15.1

Prélude

La version 0.15.0 comprend plusieurs nouvelles fonctionnalités et corrections de bogues. Les points forts de cette version sont les suivants :

Cette version comprend l'introduction de la traduction de bases arbitraires dans le transpileur. Il permet notamment de cibler directement un plus grand nombre d'ensembles de base de dispositifs, par exemple les backends mettant en œuvre des portes RZ, RY, RZ, CZ ou iSwap.

La classe QuantumCircuit suit désormais la phase globale. Cela signifie que le contrôle d'un circuit qui a une phase globale ajoute maintenant correctement une phase relative, et que les définitions des matrices de portes sont maintenant exactes plutôt qu'égales jusqu'à une phase globale.

Nouvelles fonctions

  • Une nouvelle classe DAG qiskit.dagcircuit.DAGDependency pour représenter la forme de dépendance d'un circuit. Dans ce DAG, les nœuds sont des opérations (portes, mesures, barrières, etc...) et les arêtes correspondent à la non-commutation entre deux opérations.

  • Quatre nouvelles fonctions sont ajoutées à qiskit.converters pour effectuer des conversions dans les deux sens vers DAGDependency. Ces fonctions sont les suivantes :

    Par exemple :

    from qiskit.converters.dagdependency_to_circuit import dagdependency_to_circuit
    from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
    
    circuit_in = QuantumCircuit(2)
    circuit_in.h(qr[0])
    circuit_in.h(qr[1])
    
    dag_dependency = circuit_to_dagdependency(circuit_in)
    circuit_out = dagdepency_to_circuit(dag_dependency)
  • Deux nouveaux laissez-passer pour transpondeurs ont été ajoutés à la base de données de la Commission européenne qiskit.transpiler.passes La première, UnrollCustomDefinitionsdéroule toutes les instructions du circuit en fonction de leur propriété definition s'arrêtant lorsqu'elles atteignent soit l'adresse basis_gates spécifiée, soit un ensemble de portes dans la propriété EquivalenceLibrary. Le second, BasisTranslatorutilise l'ensemble des traductions dans la base de données fournie par EquivalenceLibrary pour réécrire les instructions du circuit dans une base spécifiée.

  • Un nouvel argument translation_method a été ajouté au mot-clé transpile() pour permettre la sélection de la méthode à utiliser pour traduire les circuits dans les portes disponibles. Par exemple, transpile(circ, backend, translation_method='translator'). Les choix possibles sont :

    La valeur par défaut est 'translator'.

  • Une nouvelle classe pour la gestion des données de résultats de comptage, qiskit.result.Countsa été ajoutée. Cette classe est une sous-classe de dict et peut être utilisée comme n'importe quel autre dictionnaire. Cependant, il comprend des méthodes et des attributs d'aide pour traiter les résultats de comptage des expériences et gère également le post-traitement et le formatage des chaînes binaires lors de l'initialisation de l'objet. A Counts peut être créé en transmettant un dictionnaire de nombres dont les clés sont soit des entiers, soit des chaînes hexadécimales de la forme '0x4a', soit des chaînes binaires de la forme '0b1101', soit une chaîne de bits formatée à travers les registres et les emplacements de mémoire (c'est-à-dire '00 10'), soit une chaîne de caractères. Par exemple :

    from qiskit.result import Counts
    
    counts = Counts({"0x0': 1, '0x1', 3, '0x2': 1020})
  • Une nouvelle méthode de construction d'objets qiskit.dagcircuit.DAGCircuit a été ajoutée, from_networkx(). Cette méthode prend en charge un objet MultiDiGraph networkx (dans le format renvoyé par to_networkx()) et renvoie un nouvel objet DAGCircuit objet. L'objectif de cette fonction est de permettre aux auteurs de passes de transposition d'utiliser la bibliothèque d'algorithmes de graphes de networkx si une fonction est manquante dans l' API de retworkx. Cependant, il est à espérer que dans de tels cas, un problème sera ouvert dans l' outil de suivi des problèmes de retworkx (ou mieux encore, qu'une demande d'extension sera soumise).

  • Un nouveau kwarg pour init_qubits a été ajouté à assemble() et execute(). Pour les backends qui supportent cette fonctionnalité, init_qubits peut être utilisé pour contrôler si le backend qui exécute les circuits insère des séquences d'initialisation au début de chaque prise de vue. Par défaut, cette valeur est fixée à True , ce qui signifie que tous les qubits sont supposés être dans l'état fondamental au début de chaque tir. Cependant, lorsque init_qubits est réglé sur False , les qubits ne seront pas initialisés au début de chaque expérience et entre les tirs. Notez que le backend qui gère les circuits doit prendre en charge cette fonctionnalité pour que ce drapeau ait un effet.

  • Un nouveau kwarg rep_delay a été ajouté à qiskit.compiler.assemble(), qiskit.execute.execute(), et le constructeur de PulseQobjtConfig.qiskit Ce nouveau kwarg est utilisé pour indiquer le temps qui s'écoule entre les exécutions du programme. Il doit être choisi dans la liste des valeurs valides définie à l'adresse rep_delays à partir de l'objet PulseBackendConfiguration auquel on peut accéder par backend.configuration().rep_delays).

    Le kwarg rep_delay ne fonctionnera que sur les backends qui permettent une durée de répétition dynamique. Cela sera également indiqué dans l'objet PulseBackendConfiguration d'un backend sous la forme de l'attribut dynamic_reprate_enabled . Si dynamic_reprate_enabled est False , la valeur rep_time spécifiée pour qiskit.compiler.assemble(), qiskit.execute.execute(), ou le constructeur de PulseQobjtConfig sera utilisée au lieu de rep_delay. rep_time permet seulement aux utilisateurs de spécifier la durée d'un programme, plutôt que le délai entre les programmes.

  • Le fichier JSON Schema de qobj_schema.json dans qiskit.schemas a été mis à jour pour inclure rep_delay comme propriété de configuration optionnelle pour les qobjs d'impulsion.

  • Le fichier JSON Schema de backend_configuration_schema.json dans mod:qiskit.schemas a été mis à jour pour inclure rep_delay_range et default_rep_delay comme propriétés optionnelles pour la configuration d'un backend d'impulsion.

  • Un nouvel attribut, global_phasequi est utilisé pour suivre la phase globale, a été ajouté à la classe qiskit.circuit.QuantumCircuit classe. Par exemple :

    import math
    
    from qiskit import QuantumCircuit
    
    circ = QuantumCircuit(1, global_phase=math.pi)
    circ.u1(0)

    La phase globale peut également être modifiée ou interrogée à l'aide de circ.global_phase dans l'exemple ci-dessus. Dans les deux cas, le réglage se fait en radians. Si le circuit est converti en instruction ou en porte, la phase globale est représentée par deux rotations d'un seul qubit sur le premier qubit.

    Cela permet aux autres méthodes et fonctions qui consomment un objet QuantumCircuit de prendre en compte la phase globale. Par exemple, avec l'attribut global_phase l'attribut to_matrix() pour une porte peut maintenant correspondre exactement à ses décompositions au lieu de se limiter à une phase globale.

    Le même attribut a également été ajouté à la classe DAGCircuit afin que la phase globale puisse être suivie lors de la conversion entre les classes QuantumCircuit et DAGCircuit.

  • Deux nouvelles classes, AncillaRegister et AncillaQubit ont été ajoutées au module qiskit.circuit module. Ce sont des sous-classes de QuantumRegister et Qubit et permettent de marquer les qubits comme étant des ancillas. Ces qubits pourront ainsi être réutilisés dans des circuits et des algorithmes plus importants.

  • Une nouvelle méthode, control()a été ajoutée à la méthode QuantumCircuit. Cette méthode renvoie une version contrôlée de l'objet QuantumCircuit avec des contrôles ouverts et fermés. Cette fonctionnalité n'était auparavant accessible que par l'intermédiaire de la Gate classe.

  • Une nouvelle méthode repeat() a été ajoutée à la classe QuantumCircuit a vu l'ajout d'une nouvelle méthode. Il renvoie un nouvel objet circuit contenant un nombre spécifié de répétitions du circuit original. Par exemple :

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    repeated_qc = qc.repeat(3)
    repeated_qc.decompose().draw(output='mpl')

    Les paramètres sont copiés par référence, ce qui signifie que si vous mettez à jour les paramètres dans une instance du circuit, toutes les répétitions seront mises à jour.

  • Une nouvelle méthode reverse_bits() a été ajoutée à la classe QuantumCircuit a vu l'ajout d'une nouvelle méthode. Cette méthode permet d'inverser l'ordre des bits dans un circuit (bits quantiques et classiques). Elle peut être utilisée pour faire passer un circuit de little-endian à big-endian et vice-versa.

  • Une nouvelle méthode, combine_into_edge_map()a été ajoutée à la classe qiskit.transpiler.Layout classe. Cette méthode permet de convertir deux objets Layout objets en une carte de qubits pour composer deux circuits.

  • Une nouvelle classe, ConfigurableFakeBackend, a été ajoutée au module qiskit.test.mock.utils . Cette nouvelle classe permet de créer des backends fictifs configurables à des fins de test. Par exemple :

    from qiskit.test.mock.utils import ConfigurableFakeBackend
    
    backend = ConfigurableFakeBackend("Tashkent",
                                      n_qubits=100,
                                      version="0.0.1",
                                      basis_gates=['u1'],
                                      qubit_t1=99.,
                                      qubit_t2=146.,
                                      qubit_frequency=5.,
                                      qubit_readout_error=0.01,
                                      single_qubit_gates=['u1'])

    créera un objet backend avec 100 qubits et tous les autres paramètres spécifiés dans le constructeur.

  • Une nouvelle méthode draw() a été ajoutée à la classe qiskit.circuit.EquivalenceLibrary a vu l'ajout d'une nouvelle méthode. Cette méthode peut être utilisée pour dessiner le contenu d'une bibliothèque d'équivalence, ce qui peut être utile pour le débogage. Par exemple :

    from numpy import pi
    
    from qiskit.circuit import EquivalenceLibrary
    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit import QuantumRegister
    from qiskit.circuit import Parameter
    from qiskit.circuit.library import HGate
    from qiskit.circuit.library import U2Gate
    from qiskit.circuit.library import U3Gate
    
    my_equiv_library = EquivalenceLibrary()
    
    q = QuantumRegister(1, 'q')
    def_h = QuantumCircuit(q)
    def_h.append(U2Gate(0, pi), [q[0]], [])
    my_equiv_library.add_equivalence(HGate(), def_h)
    
    theta = Parameter('theta')
    phi = Parameter('phi')
    lam = Parameter('lam')
    def_u2 = QuantumCircuit(q)
    def_u2.append(U3Gate(pi / 2, phi, lam), [q[0]], [])
    my_equiv_library.add_equivalence(U2Gate(phi, lam), def_u2)
    
    my_equiv_library.draw()
  • Une nouvelle instruction de phase, SetPhase, a été ajoutée à la liste des instructions de phase qiskit.pulse. Cette instruction fixe la phase des impulsions suivantes à la phase spécifiée (en radians). Par exemple :

    import numpy as np
    
    from qiskit.pulse import DriveChannel
    from qiskit.pulse import Schedule
    from qiskit.pulse import SetPhase
    
    sched = Schedule()
    sched += SetPhase(np.pi, DriveChannel(0))

    Dans cet exemple, la phase des impulsions appliquées à DriveChannel(0) après l'instruction SetPhase sera réglée sur π\pi radians.

  • Une nouvelle instruction d'impulsion ShiftFrequency a été ajoutée à qiskit.pulse.instructions. Cette instruction permet de décaler la fréquence d'un canal par rapport à sa fréquence de consigne. Par exemple :

    from qiskit.pulse import DriveChannel
    from qiskit.pulse import Schedule
    from qiskit.pulse import ShiftFrequency
    
    sched = Schedule()
    sched += ShiftFrequency(-340e6, DriveChannel(0))

    Dans cet exemple, toutes les impulsions appliquées à DriveChannel(0) après la commande ShiftFrequency auront l'enveloppe une fréquence décrémentée par 340MHz.

  • Une nouvelle méthode conjugate() a été ajoutée à la classe ParameterExpression a vu l'ajout d'une nouvelle méthode. Cela permet d'appeler numpy.conj() sans provoquer d'erreur. Puisqu'un ParameterExpression est réel, il se renverra lui-même. Ce comportement est analogue à celui de Python floats/ints.

  • Une nouvelle classe PhaseEstimation a été ajoutée à qiskit.circuit.library. Cette classe de bibliothèque de circuits est le circuit utilisé dans la formulation originale de l'algorithme d'estimation de phase en arXiv:quant-ph/9511026. L'estimation de phase consiste à estimer la phase ϕ\phi d'une valeur propre e2πiϕe^{2\pi i\phi} d'un opérateur unitaire UU, à condition d'avoir l'état propre correspondant psi|psi\rangle. C'est-à-dire

Uψ=e2πiϕψU|\psi\rangle = e^{2\pi i\phi} |\psi\rangle

Cette estimation (et donc ce circuit) est au cœur de plusieurs algorithmes bien connus, tels que l'algorithme de Shor ou l'estimation quantique de l'amplitude.

  • La fonction qiskit.visualization a un nouveau kwarg plot_state_qsphere() possède un nouveau kwarg show_state_labels qui est utilisé pour contrôler si chaque blob dans la visualisation qsphere est étiqueté. Par défaut, ce kwarg est fixé à True et affiche les états de base à côté de chaque blob. Cette fonction peut être désactivée, pour revenir au comportement antérieur, en fixant le kwarg show_state_labels à False.

  • La fonction qiskit.visualization fonction plot_state_qsphere() a un nouveau kwarg show_state_phases qui est défini par défaut à False . Lorsqu'il est réglé sur True , il affiche la phase de chaque état de base.

  • La fonction qiskit.visualization fonction plot_state_qsphere() a un nouveau kwarg use_degrees qui est défini par défaut à False . Lorsqu'il est réglé sur True , il affiche la phase de chaque état de base en degrés, ainsi que le cercle de phase en bas à droite.

  • Une nouvelle classe, QuadraticForm au module qiskit.circuit.library pour implémenter une forme quadratique sur des variables binaires. L'élément de la bibliothèque de circuits met en œuvre l'opération

x0xQ(x)mod2m|x\rangle |0\rangle \mapsto |x\rangle |Q(x) \mod 2^m\rangle

pour la forme quadratique QQ et mm qubits de sortie. Le résultat est dans les qubits de sortie mm est codé en complément à deux. Si mm n'est pas spécifié, le circuit choisira le nombre minimal de qubits requis pour représenter le résultat sans appliquer une opération modulo. La forme quadratique est spécifiée à l'aide d'une matrice pour les termes quadratiques, d'un vecteur pour les termes linéaires et d'un décalage constant. Si tous les termes sont des entiers, le circuit implémente exactement la forme quadratique, sinon il ne s'agit que d'une approximation.

Par exemple :

import numpy as np

from qiskit.circuit.library import QuadraticForm

A = np.array([[1, 2], [-1, 0]])
b = np.array([3, -3])
c = -2
m = 4
quad_form_circuit = QuadraticForm(m, A, b, c)
  • Ajouter qiskit.quantum_info.Statevector.expectation_value() et qiskit.quantum_info.DensityMatrix.expectation_value() méthodes de calcul de la valeur espérée d'un qiskit.quantum_info.Operator.

  • Pour le seed kwarg dans le constructeur des objets Générateur aléatoire qiskit.circuit.library.QuantumVolume les objets numpy random Generator peuvent maintenant être utilisés. Auparavant, seuls les nombres entiers étaient valables. Ceci est utile lorsque l'on intègre QuantumVolume dans le cadre d'une fonction plus large avec sa propre génération de nombres aléatoires, par exemple pour générer une séquence de circuits QuantumVolume circuits.

  • La QuantumCircuit méthode compose() dispose d'un nouveau kwarg front qui peut être utilisé pour faire précéder l'autre circuit par le circuit d'origine au lieu de l'annexer. Par exemple :

    from qiskit.circuit import QuantumCircuit
    
    circ1 = QuantumCircuit(2)
    circ2 = QuantumCircuit(2)
    
    circ2.h(0)
    circ1.cx(0, 1)
    
    circ1.compose(circ2, front=True).draw(output='mpl')
  • Deux nouveaux laissez-passer, SabreLayout et SabreSwap pour la mise en page et le routage ont été ajoutées à qiskit.transpiler.passes. Ces nouvelles passes sont basées sur l'algorithme présenté dans Li et al, "Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices", ASPLOS 2019. Ils peuvent également être sélectionnés lors de l'utilisation de la fonction transpile() en réglant le kwarg layout_method sur 'sabre' et/ou le kwarg routing_method sur 'sabre' pour utiliser la fonction SabreLayout et SabreSwap respectivement.

  • Ajout de la méthode replace() à la classe qiskit.pulse.Schedule qui permet de remplacer une instruction d'impulsion par une autre. Par exemple :

    .. code-block:: python

    from qiskit import pulse

    d0 = pulse.DriveChannel(0)

    sched = pulse.Schedule ()

    old = pulse.Play ( pulse.Constant (100, 1.0 ), d0 ) new = pulse.Play ( pulse.Constant (100, 0.1 ), d0 )

    sched += old

    sched = sched.replace (ancien, nouveau)

    assert sched == pulse.Schedule (new)

  • Ajout de nouvelles classes de portes à qiskit.circuit.library pour les portes X\sqrt{X}, son adjoint X\sqrt{X}^\dagger, et les portes contrôlées X\sqrt{X} comme suit SXGate, SXdgGate, et CSXGate. Ils peuvent également être ajoutés à un objet QuantumCircuit à l'aide des boutons sx(), sxdg(), et csx() respectivement.

  • Ajouter la prise en charge des instructions Reset à qiskit.quantum_info.Statevector.from_instruction(). Notez que cela implique un échantillonnage RNG dans le choix de la projection vers l'état zéro dans le cas où le qubit est dans un état de superposition. La semence pour l'échantillonnage peut être définie à l'aide de la méthode seed() méthode.

  • Les méthodes qiskit.circuit.ParameterExpression.subs() et qiskit.circuit.QuantumCircuit.assign_parameters() acceptent désormais ParameterExpression comme valeur cible à substituer.

    Exemple :

    from qiskit.circuit import QuantumCircuit, Parameter
    
    p = Parameter('p')
    source = QuantumCircuit(1)
    source.rz(p, 0)
    
    x = Parameter('x')
    source.assign_parameters({p: x*x})
         ┌──────────┐
    q_0:Rz(x**2)
         └──────────┘
  • La QuantumCircuit() méthode to_gate() dispose d'un nouveau kwarg label qui peut être utilisé pour définir une étiquette pour l'objet de sortie Gate de l'objet. Par exemple :

    from qiskit.circuit import QuantumCircuit
    
    circuit_gate = QuantumCircuit(2)
    circuit_gate.h(0)
    circuit_gate.cx(0, 1)
    custom_gate = circuit_gate.to_gate(label='My Special Bell')
    new_circ = QuantumCircuit(2)
    new_circ.append(custom_gate, [0, 1], [])
    new_circ.draw(output='mpl')
  • Ajouté le UGate, CUGate, PhaseGate,, et CPhaseGate avec les méthodes QuantumCircuit méthodes u(), cu(), p(), et cp(). La porte UGate la porte est la porte de rotation générique à un qubit avec 3 angles d'Euler et la porte CUGate sa version contrôlée. CUGate a 4 paramètres pour tenir compte d'une éventuelle phase globale de la porte U. Les PhaseGate et CPhaseGate sont la porte de phase générale à un angle arbitraire et sa version contrôlée.

  • Un nouveau kwarg, cregbundle , a été ajouté à la fonction qiskit.visualization.circuit_drawer() et à la méthode QuantumCircuit méthode draw(). Lorsqu'il est défini sur True , les cregs seront regroupés en une seule ligne dans les visualisations de circuits pour les tiroirs text et mpl . La valeur par défaut est True. Corrige le problème #4290.

    Par exemple :

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='mpl', cregbundle=True)
  • Un nouveau kwarg, initial_state , a été ajouté à la fonction qiskit.visualization.circuit_drawer() et à la méthode QuantumCircuit méthode draw(). Lorsqu'il est défini sur True , l'état initial sera désormais inclus dans les visualisations de circuits pour tous les tiroirs. Corrige le problème #4293.

    Par exemple :

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='mpl', initial_state=True)
  • Les étiquettes seront désormais affichées lors de l'utilisation du tiroir "mpl". Il existe deux types d'étiquettes : les étiquettes de porte et les étiquettes de contrôle. Les étiquettes de porte remplaceront le nom de la porte dans l'affichage. Les étiquettes de contrôle s'affichent au-dessus ou au-dessous des contrôles d'une porte. Corrige les problèmes #3766, #4580 Corrige les problèmes #3766 et #4580.

    Par exemple :

    from qiskit import QuantumCircuit
    from qiskit.circuit.library.standard_gates import YGate
    circuit = QuantumCircuit(2)
    circuit.append(YGate(label='A Y Gate').control(label='Y Control'), [0, 1])
    circuit.draw(output='mpl')

Mise à niveau

  • Les implémentations de la porte X multicontrôlée ( MCXGrayCode, MCXRecursive, et MCXVChain) ont vu leurs propriétés name modifiées pour décrire plus précisément leur mise en œuvre : mcx_gray, mcx_recursive, et mcx_vchain respectivement. Auparavant, ces portes partageaient le nom mcx avec MCXGatece qui entraînait une erreur de transposition et de simulation de ces portes.

  • Par défaut, les gestionnaires de passe prédéfinis dans qiskit.transpiler.preset_passmanagers utilisent UnrollCustomDefinitions et BasisTranslator pour gérer le changement de base au lieu de l'ancienne valeur par défaut Unroller. En effet, les nouvelles passes sont plus flexibles et permettent de cibler n'importe quel ensemble de base, même si le résultat peut être différent. Pour utiliser l'ancienne valeur par défaut, vous pouvez définir le mot-clé translation_method sur transpile() à 'unroller'.

  • Les fonctions de conversion qiskit.converters.circuit_to_gate() et :func` qiskit.converters.circuit_to_instruction\ incluaient auparavant automatiquement la porte ou l'instruction générée dans le site actifSessionEquivalenceLibrary. Ces convertisseurs acceptent désormais un mot-clé optionnel equivalence_library` pour spécifier si et où les instances converties doivent être enregistrées. Le comportement par défaut a été modifié pour ne pas enregistrer l'instance convertie.

  • La valeur par défaut du kwarg cregbundle pour la méthode qiskit.circuit.QuantumCircuit.draw() et la fonction qiskit.visualization.circuit_drawer() a été remplacée par True. Cela signifie que les bits classiques du schéma de circuit seront désormais regroupés par défaut, par exemple :

    from qiskit.circuit import QuantumCircuit
    
    circ = QuantumCircuit(4)
    circ.x(0)
    circ.h(1)
    circ.measure_all()
    circ.draw(output='mpl')

    Si vous souhaitez que votre dessin de circuit conserve le comportement précédent et montre chaque bit classique dans le diagramme, vous pouvez régler le paramètre cregbundle sur False. Par exemple :

    from qiskit.circuit import QuantumCircuit
    
    circ = QuantumCircuit(4)
    circ.x(0)
    circ.h(1)
    circ.measure_all()
    circ.draw(output='mpl', cregbundle=False)
  • Schedule traçage avec qiskit.pulse.Schedule.draw() et qiskit.visualization.pulse_drawer() n'affichera plus le tableau des événements par défaut. Cette fonction peut être réactivée en réglant le kwarg de table sur True.

  • Le laissez-passer RemoveResetInZeroState était précédemment inclus dans le gestionnaire de passes prédéfinies level_0_pass_manager() qui était utilisé avec les fonctions optimization_level=0 for transpile() et execute() . Cependant, RemoveResetInZeroState est une passe d'optimisation et n'aurait pas dû être incluse dans le niveau d'optimisation 0 et a été supprimée. Si vous devez exécuter transpile() avec RemoveResetInZeroState utilisez un gestionnaire de passe personnalisé ou optimization_level 1, 2 ou 3.

  • Le kwarg déprécié line_length pour la fonction qiskit.visualization.circuit_drawer() pour la fonction et la méthode qiskit.circuit.QuantumCircuit.draw() a été supprimé. Il a été supprimé depuis la version 0.10.0. Au lieu de cela, vous pouvez utiliser fold kwarg pour ajuster la largeur du diagramme de circuit.

  • Le mode de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() et circuit_drawer() nécessite désormais l'installation de la bibliothèque pylatexenc. Il s'agissait déjà d'une dépendance optionnelle pour la visualisation, mais elle n'était auparavant nécessaire que pour le mode de sortie 'latex' . Il est maintenant également requis pour le tiroir matplotlib car il est nécessaire pour gérer correctement le dimensionnement des portes avec les étiquettes mathtext de matplotlib pour les portes.

  • Les méthodes dépréciées de get_tokens pour le qiskit.qasm.Qasm et qiskit.qasm.QasmParser ont été supprimées. Ces méthodes sont obsolètes depuis la version 0.9.0. Les méthodes qiskit.qasm.Qasm.generate_tokens() et qiskit.qasm.QasmParser.generate_tokens() doivent être utilisées à la place.

  • Le kwarg déprécié channels_to_plot pour qiskit.pulse.Schedule.draw(), qiskit.pulse.Instruction.draw(), qiskit.visualization.pulse.matplotlib.ScheduleDrawer.draw et pulse_drawer() a été supprimé. Le kwarg est obsolète depuis la version 0.11.0 et a été remplacé par le kwarg channels , qui fonctionne de manière identique et doit être utilisé à la place.

  • L'attribut circuit_instruction_map de la classe qiskit.providers.models.PulseDefaults a été supprimé. Cet attribut est obsolète depuis la version 0.12.0 et a été remplacé par l'attribut instruction_schedule_map qui peut être utilisé à la place.

  • La méthode union de Schedule et Instruction sont obsolètes depuis la version 0.12.0 et ont été supprimées. Utilisez les méthodes qiskit.pulse.Schedule.insert() et qiskit.pulse.Instruction.meth() au lieu de la méthode kwarg``time=0``.

  • L'argument déprécié scaling de la méthode draw de Schedule et Instruction a été remplacé par scale depuis la version 0.12.0 et a été supprimé. Utilisez plutôt le site scale kwarg.

  • L'argument déprécié period des fonctions qiskit.pulse.library ont été remplacées par freq depuis la version 0.13.0 et sont maintenant supprimées. Utilisez le kwarg freq au lieu de period.

  • Le module qiskit.pulse.commands contenant les classes Commands était obsolète dans la version 0.13.0 et a été supprimé. Vous devrez mettre à jour votre code Pulse si vous utilisiez encore des commandes. Par exemple :

    Ancien
    Nouveau
    Command(args)(channel)Instruction(args, channel)
    ```python
    Acquérir(durée)( AcquireChannel(0 ))
    ``````python
    Acquérir(duration, AcquireChannel(0 ))
    | ```python
    Delay(duration)(channel) 
    ```             | ```python
    Delay(duration, channel) 
    ```                                          |
    | ```python
    FrameChange(angle)(DriveChannel(0)) 
    ```  | ```python
    # FrameChange was also renamed ShiftPhase(angle, DriveChannel(0)) 
    ``` |
    | ```python
    Gaussian(...)(DriveChannel(0)) 
    ```       | ```python
    # Pulses need to be `Play`d Play(Gaussian(...), DriveChannel(0)) 
    ```  |
    
    
  • Toutes les classes et fonctions du module qiskit.tool.qi étaient obsolètes dans la version 0.12.0 et ont été supprimées. Utilisez plutôt le module qiskit.quantum_info et les nouvelles méthodes et classes qu'il propose pour travailler avec des états et des opérateurs quantiques.

  • Les fonctions qiskit.quantum_info.basis_state et qiskit.quantum_info.projector sont obsolètes depuis Qiskit Terra 0.12.0 est maintenant supprimée. Utilisez le site qiskit.quantum_info.QuantumState et ses dérivées qiskit.quantum_info.Statevector et qiskit.quantum_info.DensityMatrix pour travailler avec les états.

  • Les fonctions interactives de traçage de qiskit.visualization, iplot_bloch_multivector, iplot_state_city, iplot_state_qsphere, iplot_state_hinton, iplot_histogram, iplot_state_paulivec ne sont plus que des alias dépréciés pour les équivalents basés sur matplotlib et ne sont plus interactives. Le code JS statique hébergé sur lequel ces fonctions reposaient a été supprimé et elles ne peuvent plus fonctionner. Une dépréciation normale n'était pas possible car le site dont ils dépendaient n'existe plus.

  • Les composants de validation utilisant marshmallow à partir de qiskit.validation ont été retirés de terra. Puisqu'ils ne sont plus utilisés pour construire des objets en terra.

  • Les classes de schéma marshmallow dans qiskit.result ont été supprimées car elles ne sont plus utilisées par la classe qiskit.result.Result ne les utilise plus.

  • La sortie de la méthode to_dict() pour la classe qiskit.result.Result n'est plus dans un format permettant une sérialisation JSON directe. En fonction du contenu des instances de ces classes, il peut y avoir des types que l'encodeur JSON par défaut ne sait pas gérer, par exemple des nombres complexes ou des tableaux numpy. Si vous sérialisez directement la sortie de la méthode to_dict() , vous devez vous assurer que votre encodeur JSON peut gérer ces types.

  • L'option permettant d'acquérir plusieurs qubits à la fois était obsolète dans la version 0.12.0 et est maintenant supprimée. En particulier, les arguments init mem_slots et reg_slots ont été supprimés de qiskit.pulse.instructions.Acquireet channel, mem_slot et reg_slot lèveront une erreur si une liste est fournie en entrée.

  • La prise en charge de l'utilisation de la variable d'environnement USE_RETWORKX , qui a été introduite dans la version 0.13.0 pour fournir une solution de repli optionnelle à l'ancienne implémentation basée sur networkx, a été supprimée qiskit.dagcircuit.DAGCircuit a été supprimée. Ce drapeau était uniquement destiné à fournir une soupape de sécurité pour les utilisateurs qui ont rencontré un problème avec la nouvelle implémentation pour une version pendant la transition vers retworkx.

  • Le module de qiskit.pulse responsable des transformations horaire->horaire a été renommé de reschedule.py à transforms.py. Le chemin d'importation précédent a été supprimé. Pour mettre à jour votre code :

    from qiskit.pulse.rescheduler import <X>

    doit être remplacé par :

    from qiskit.pulse.transforms import <X>
  • Dans les versions précédentes, un PassManager ne permettait pas aux classes TransformationPass de modifier le site PropertySet. Cette restriction a été levée, de sorte qu'une classe TransformationPass peut désormais accéder en lecture et en écriture aux sites PropertySet et DAGCircuit pendant la durée de la formation run(). Ce changement a été effectué pour faciliter plus efficacement TransformationPass classes qui ont un état interne qui peut être nécessaire pour les passages ultérieurs dans le PassManager. Sans cette modification, il aurait fallu un deuxième site AnalysisPass redondant pour recréer l'état interne, ce qui aurait pu entraîner un surcoût important.

Remarques concernant la dépréciation

  • Le nom du premier paramètre positionnel de la fonction qiskit.visualization fonctions plot_state_hinton(), plot_bloch_multivector(), plot_state_city(), plot_state_paulivec(), et plot_state_qsphere() a été renommé de rho à state. La transmission de la valeur par nom à rho est obsolète et sera supprimée dans une prochaine version. Au lieu de cela, vous devez soit passer l'argument en position, soit utiliser le nouveau nom de paramètre state.

  • Le module qiskit.pulse.pulse_lib est obsolète et sera supprimé dans une prochaine version. Il a été renommé en qiskit.pulse.library qui devrait être utilisé à la place.

  • La méthode qiskit.circuit.QuantumCircuitmirror() est obsolète et sera supprimée dans une prochaine version. La méthode qiskit.circuit.QuantumCircuit.reverse_ops() devrait être utilisée à la place, car l'effet miroir pourrait être confondu avec l'échange des qubits de sortie du circuit. La méthode reverse_ops() ne fait qu'inverser l'ordre des portes appliquées au lieu de les inverser.

  • Les méthodes qubits() et clbits() de qiskit.dagcircuit.DAGCircuit sont obsolètes et seront supprimées dans une prochaine version. Elles ont été remplacées par des propriétés du même nom, qiskit.dagcircuit.DAGCircuit.qubits et qiskit.dagcircuit.DAGCircuit.clbits, et sont mises en cache, ce qui permet d'y accéder beaucoup plus rapidement.

  • La méthode get_sample_pulse pour les classes dérivées qiskit.pulse.library.ParametricPulse (par exemple GaussianSquare) a été dépréciée et sera supprimée dans une prochaine version. Elle a été remplacée par la méthode get_waveform (par exemple get_waveform()) qui devrait se comporter de manière identique.

  • L'utilisation de l'argument facultatif condition sur qiskit.dagcircuit.DAGNode, qiskit.dagcircuit.DAGCircuit.apply_operation_back(),, et qiskit.dagcircuit.DAGCircuit.apply_operation_front() a été dépréciée et sera supprimée dans une prochaine version. Au lieu de cela, le site control a mis en place des instances qui ont été ajoutées à la base de données qiskit.circuit.Instruction ajoutées à une instance DAGCircuit devrait être utilisé.

  • Les méthodes des classes set_atol et set_rtol des classes qiskit.quantum_info.BaseOperator et qiskit.quantum_info.QuantumState (et leurs sous-classes telles que Operator et qiskit.quantum_info.DensityMatrix) sont obsolètes et seront supprimées dans une prochaine version. La valeur des attributs .atol et .rtol doit être définie pour la classe. Par exemple :

    from qiskit.quantum_info import ScalarOp
    
    ScalarOp.atol = 3e-5
    op = ScalarOp(2)
  • Les fonctions de tracé interactif de qiskit.visualizationiplot_bloch_multivector, iplot_state_city, iplot_state_qsphere, iplot_state_hinton, iplot_histogram, iplot_state_paulivec sont obsolètes et seront supprimées dans une prochaine version. Les fonctions équivalentes basées sur matplotlib de qiskit.visualization, plot_bloch_multivector(), plot_state_city(), plot_state_qsphere(), plot_state_hinton(), plot_state_histogram(), et plot_state_paulivec() devraient être utilisés à la place.

  • Les propriétés acquires, mem_slots et reg_slots de l'instruction qiskit.pulse.instructions.Acquire sont obsolètes et seront supprimées dans une prochaine version. Il s'agit simplement de doublons de channel, mem_slot, et reg_slot respectivement, maintenant que le support précédemment déprécié pour l'utilisation de plusieurs qubits dans une seule instruction a été supprimé Acquire a été supprimée.

  • La classe SamplePulse de qiskit.pulse a été renommée en Waveform. SamplePulse est obsolète et sera supprimée dans une prochaine version.

  • La clé du dictionnaire de style cregbundle est obsolète et sera supprimée dans une prochaine version. Elle a été remplacée par le kwarg cregbundle ajouté à la fonction qiskit.visualization.circuit_drawer() et à la méthode QuantumCircuit méthode draw().

Corrections des erreurs

  • La qiskit.circuit.QuantumCircuit méthode num_nonlocal_gates incluait auparavant des objets multi-qubits qiskit.circuit.Instruction (par exemple, Barrier) dans le décompte des portes non locales. Cette erreur a été corrigée de manière à ce que seuls les objets non locaux soient comptés Gate soient comptés. Corrections #4500

  • ControlledGate avec un ensemble de ctrl_state n'étaient pas évaluées comme étant égales, même si les portes comparées étaient équivalentes. Ce problème a été résolu de manière à ce que les corrections #4573

  • Lorsqu'on accède à un bit à partir d'un qiskit.circuit.QuantumRegister ou qiskit.circuit.ClassicalRegister par index lors de l'utilisation des types d'entiers numpy <https://numpy.org/doc/stable/user/basics.types.html> \___ aurait auparavant soulevé une exception CircuitError . Ce problème a été résolu afin que les types numpy puissent être utilisés en plus du type int intégré à Python. Corrige #3929.

  • Un bug a été corrigé : seul le premier qiskit.pulse.configuration.Kernel ou qiskit.pulse.configuration.Discriminator pour un qiskit.pulse.Acquire était utilisé lorsqu'il y avait plusieurs acquisitions en même temps dans un qiskit.pulse.Schedule.

  • L'unité SI utilisée pour construire les objets qiskit.pulse.SetFrequency est le Hz, mais lorsqu'un objet est créé à partir d'une instance, il doit être converti en GHz PulseQobjInstruction est créé à partir d'une instance SetFrequency , il doit être converti en GHz. Cette conversion manquait dans les versions précédentes et a été corrigée.

  • Auparavant, il était possible de fixer le nombre de qubits de contrôle à zéro, auquel cas l'opération originale, potentiellement non contrôlée, était renvoyée. Cela pourrait provoquer l'ouverture de AttributeError si l'appelant tentait d'accéder à un attribut que seuls les objets ControlledGate possèdent. Ce problème a été corrigé par l'ajout d'un getter et d'un setter pour num_ctrl_qubits pour valider l'utilisation d'une valeur valide. Corrections #4576

  • Les contrôles ouverts ont été mis en œuvre en modifiant un objet Gate objets definition. Toutefois, lorsque la porte existe déjà dans l'ensemble de base, cette définition n'a pas été utilisée, ce qui a entraîné l'envoi de circuits incorrects à un backend après la transpilation. Ce problème a été résolu en modifiant la passe Unroller pour qu'elle utilise la définition si elle rencontre un portail contrôlé avec des commandes ouvertes. Corrige #4437

  • L'argument du mot-clé insert_barriers dans la classe ZZFeatureMap n'a pas réellement inséré de barrières entre les couches de Hadamard et les couches d'évolution. Ce problème a été corrigé de sorte que les barrières sont désormais correctement insérées.

  • Correction d'un problème où certaines portes avec trois qubits ou plus ne pouvaient pas être compilées dans certains cas. Voir #4577 <https://github.com/Qiskit/qiskit/issues/4577 pour plus de détails.

  • Le backend de sortie de matplotlib ('mpl') pour la méthode qiskit.circuit.QuantumCircuit méthode draw() et la fonction qiskit.visualization.circuit_drawer() n'était pas correctement mis à l'échelle lorsque le kwarg scale était défini. Les polices et la largeur des lignes ne sont pas adaptées au reste de l'image. Ce problème a été corrigé et tous les éléments du schéma de circuit sont désormais correctement mis à l'échelle. Par exemple :

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.draw(output='mpl', scale=0.5)

    Corrige #4179.

  • Correction d'un problème lors de l'initialisation ou de l'évolution de qiskit.quantum_info.Statevector et qiskit.quantum_info.DensityMatrix par circuit par circuit contenant des instructions Barrier soulevait une exception. Corrige #4461

  • Auparavant, lorsqu'un QuantumCircuit contenait un Gate avec une condition classique, le transpileur échouait parfois en utilisant optimization_level=3 sur transpile() ou execute() soulevant un UnboundLocalError. Ce problème a été résolu en mettant à jour la passe ConsolidateBlocks pour tenir compte de la condition classique. Corrige #4672.

  • Dans certaines situations, de longs noms de portes et de registres débordaient ou laissaient un espace vide excessif autour d'eux lors de l'utilisation du backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() pour la méthode et la fonction qiskit.visualization.circuit_drawer() pour la méthode et la fonction. Ce problème a été résolu en utilisant des largeurs de texte correctes pour une police proportionnelle. Corrections #4611, #4605, #4545, #4497, #4449, et #3641.

  • Lors de l'utilisation du backend de sortie style` kwarg on the :meth:`qiskit.circuit.QuantumCircuit.draw` or :func:`qiskit.visualization.circuit_drawer` with the ``'mpl' , la clé du dictionnaire 'showindex' étant définie sur True, les numéros d'index en haut de la colonne ne s'alignent pas correctement. Ce point a été corrigé.

  • Lorsque l'on utilise cregbunde=True avec le backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() et la fonction qiskit.visualization.circuit_drawer() et que l'on mesure sur un deuxième pli, la flèche de mesure écrase le nombre de plis. Le compteur a été déplacé vers la gauche pour éviter cela. Corrige #4148.

  • Lorsque l'on utilise le backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() et la qiskit.visualization.circuit_drawer() fonction CSwapGate et d'une fonction contrôlée RZZGate les portes s'affichent désormais avec leurs symboles appropriés au lieu d'être affichées dans une boîte.

  • Lorsque l'on utilise le backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() méthode et qiskit.visualization.circuit_drawer() les portes contrôlées créées à l'aide de la méthode to_gate() n'étaient pas correctement espacées et pouvaient se chevaucher avec d'autres portes dans le schéma de circuit. Ce problème a été résolu.

  • Lorsque l'on utilise le backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() les portes des méthodes et des fonctions qiskit.visualization.circuit_drawer() les portes de fonction avec des tableaux comme paramètres, telles que HamiltonianGate, ne s'affichent plus avec un espace excessif autour d'elles. Corrige #4352.

  • Lorsque l'on utilise le backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() méthode et qiskit.visualization.circuit_drawer() les portes génériques créées en instanciant directement la méthode qiskit.circuit.Gate affiche désormais la couleur d'arrière-plan appropriée pour le portail. Corrige #4496.

  • Lorsque l'on utilise le backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() et la fonction qiskit.visualization.circuit_drawer() une erreur de AttributeError survenant lors de l'utilisation de Isometry ou Initialize a été corrigée. Corrige #4439.

  • Lorsque l'on utilise le backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() méthode et qiskit.visualization.circuit_drawer() certains portails contrôlés en ouverture n'affichaient pas correctement les commandes d'ouverture. Cette erreur a été corrigée de manière à ce que les contrôles ouverts soient correctement affichés sous forme de cercles ouverts. Corrige #4248.

  • Lorsque l'on utilise le backend de sortie 'mpl' pour la méthode qiskit.circuit.QuantumCircuit.draw() et la fonction qiskit.visualization.circuit_drawer() en fixant le kwarg fold à -1, le circuit s'affichera désormais correctement sans pliage. Corrige #4506.

  • Les impulsions paramétriques provenant de qiskit.pulse.library.discrete ont désormais des extrémités d'impulsions paramétriques nulles par défaut. Les extrémités sont définies de telle sorte que pour une fonction f(x)f(x) alors f(1)=f(duration+1)=0f(-1) = f(duration + 1) = 0. Corrige #4317

Autres remarques

  • La classe qiskit.result.Result qui était auparavant construite en utilisant la bibliothèque marshmallow a été refaite pour ne plus dépendre de marshmallow. Cette nouvelle implémentation devrait être une transition transparente, mais certains comportements spécifiques hérités de marshmallow pourraient ne pas fonctionner. Si vous constatez des incompatibilités, veuillez en faire part à la Commission.

Aer 0.6.1

Prélude

Cette version 0.6.0 comprend de nombreuses améliorations de performance pour tous les simulateurs du fournisseur Aer et des changements significatifs dans le système de construction lors de la construction à partir des sources. Les principaux changements sont la prise en charge de la vectorisation SIMD, l'approximation dans la méthode d'état du produit matriciel via la troncature de la dimension des liaisons, un calcul plus efficace de la valeur d'espérance de Pauli et une efficacité grandement améliorée dans la conversion Python des objets de résultat C++. Le système de construction a été mis à jour afin d'utiliser Conan pour gérer les dépendances C++ courantes lors de la construction à partir des sources.

Nouvelles fonctions

  • Ajout de la prise en charge de l'instantané de la matrice de densité aux méthodes "statevector" et "statevector_gpu" de QasmSimulator.

  • Permettre des instantanés de la matrice de densité sur des qubits spécifiques, et pas seulement sur tous les qubits. Cela permet de calculer la trace partielle de l'état sur les qubits restants.

  • Ajoute le support de l'instantané de la valeur d'espérance de Pauli à la méthode de simulation "density_matrix" du site qiskit.providers.aer.QasmSimulator. Ajouter des instantanés aux circuits à l'aide de l'extension qiskit.providers.aer.extensions.SnapshotExpectationValue .

  • Amélioration considérable des performances de l'algorithme d'instantané de la valeur d'espérance de Pauli pour les méthodes de simulation "statevector", "statevector_gpu", "density_matrix" et "density_matrix_gpu" du site qiskit.providers.aer.QasmSimulator.

  • Activer l'optimisation du circuit de fusion de portes à partir de qiskit.providers.aer.QasmSimulator dans les backends qiskit.providers.aer.StatevectorSimulator et qiskit.providers.aer.UnitarySimulator .

  • Améliorer les performances des données instantanées moyennes dans les résultats du simulateur. Cela permet d'obtenir des instantanés de probabilité, de valeur d'espérance de Pauli et de matrice de densité à l'aide des extensions suivantes :

    • qiskit.providers.aer.extensions.SnapshotExpectationValue
    • qiskit.providers.aer.extensions.SnapshotProbabilities
    • qiskit.providers.aer.extensions.SnapshotDensityMatrix
  • Ajout d'un constructeur de déplacement et amélioration de l'utilisation de la mémoire de la classe de matrice C++ afin de minimiser les copies de matrices lors du déplacement de la sortie des simulateurs dans les résultats.

  • Améliorer les performances du simulateur unitaire.

  • Ajouter une approximation à la méthode de simulation "matrix_product_state" du site QasmSimulator pour limiter la dimension de la liaison du MPS.

    Il existe deux modes d'approximation. Tous deux éliminent les plus petits coefficients de Schmidt en suivant l'algorithme SVD. Deux paramètres contrôlent le degré d'approximation : "matrix_product_state_max_bond_dimension" (int) : Fixe une limite au nombre de coefficients de Schmidt conservés à la fin de l'algorithme svd. Les coefficients dépassant cette limite seront écartés. (Par défaut : aucune, c'est-à-dire aucune limite sur la dimension de la liaison). "matrix_product_state_truncation_threshold" (double) : Écarte les plus petits coefficients dont la somme des carrés est inférieure à ce seuil. (Valeur par défaut : 1e-16 ).

  • Améliorer la performance de l'échantillonnage des mesures lors de l'utilisation de la méthode de simulation "matrix_product_state" QasmSimulator .

  • Ajouter la prise en charge des instructions d'impulsion Delay, Phase et SetPhase à l'instruction qiskit.providers.aer.PulseSimulator.

  • Améliorer les performances de qiskit.providers.aer.PulseSimulator en mettant en cache les appels à la fonction RHS

  • Introduire d'autres méthodes de résolution des DE, spécifiables à l'adresse backend_options dans le site qiskit.providers.aer.PulseSimulator.

  • Améliorer les performances des classes de résultats du simulateur en utilisant la sémantique de déplacement et en supprimant les copies inutiles qui se produisaient lors de la combinaison des résultats d'expériences distinctes dans l'objet de résultat final.

  • Améliorer considérablement les performances de la conversion pybind11 des résultats du simulateur en utilisant la sémantique move lorsque c'est possible, et en déplaçant les résultats des vecteurs et des matrices vers des tableaux Numpy sans copies.

  • Changement du moteur RNG pour les simulateurs de Mersenne twister 32 bits à Mersenne twister 64 bits.

  • Améliore les performances de la méthode de simulation "statevector" des sites qiskit.providers.aer.QasmSimulator et qiskit.providers.aer.StatevectorSimulator en utilisant des éléments intrinsèques SIMD sur les systèmes qui prennent en charge le jeu d'instructions AVX2. AVX2 est automatiquement détectée et activée au moment de l'exécution.

Mise à niveau

  • Modifie le système de construction pour utiliser le gestionnaire de paquets Conan. Cet outil prendra en charge la plupart des dépendances nécessaires au code source C++. Une connexion Internet peut être nécessaire pour la première construction ou lorsque des dépendances sont ajoutées ou mises à jour, afin de télécharger les paquets nécessaires s'ils ne se trouvent pas dans votre dépôt local de Conan.

    Lorsque vous construisez la version autonome de qiskit-aer, vous devez d'abord installer conan avec :

    pip install conan
  • Modifie la façon dont les passes de transpilation sont gérées dans les classes de contrôleurs C++, de sorte que chaque passe doit être appelée explicitement. Cela permet de mieux personnaliser le moment où chaque passe doit être appelée, et avec quels paramètres. Cela permet notamment de définir des paramètres différents pour la passe d'optimisation de la fusion des portes en fonction de la méthode de simulation QasmController.

  • Ajouter gate_length_units kwarg à qiskit.providers.aer.noise.NoiseModel.from_device() pour spécifier gate_lengths dans la fonction de modèle de bruit du dispositif afin de gérer les conversions d'unités pour le code interne.

  • Ajout de la porte Controlled-Y ("cy") au jeu de portes supporté par les méthodes du simulateur de stabilisateur.

  • Pour le backend d'Aer, la validation jsonschema des objets qobj en entrée de terra est maintenant opt-in au lieu d'être activée par défaut. Si vous souhaitez activer la validation jsonschema du qobj, définissez le kwarg validate sur la méthode qiskit.providers.aer.QasmSimualtor.run() pour l'objet backend à True.

  • Ajoute un objet OpSet à la classe State du simulateur de base pour faciliter la validation des instructions, des portes et des instantanés pris en charge par les simulateurs.

  • Refonte de la classe OpSet. Déplacement de OpSet dans un fichier d'en-tête séparé et ajout des méthodes contains et difference basées sur std::set::contains et std::algorithm::set_difference. Elles remplacent les instructions "invalid" et "validate" de OpSet,, qui ont été supprimées, mais dans l'ordre inverse. Il renvoie une liste d'autres instructions qui ne sont pas dans l'opset actuel plutôt que des instructions de l'opset qui ne sont pas dans l'autre opset.

  • Amélioration de la vérification de l'optimisation de l'échantillonnage des mesures. La partie coûteuse de cette opération est maintenant effectuée une seule fois pendant la construction du circuit, au lieu de plusieurs fois pendant la simulation pour vérifier les besoins en mémoire, la méthode de simulation et l'exécution finale.

Corrections des erreurs

  • Supprimer "extended_stabilizer" des méthodes de simulation sélectionnées automatiquement. Ceci est nécessaire car la méthode du stabilisateur étendu n'est pas exacte et peut donner des résultats incorrects pour certains circuits, à moins que l'utilisateur ne sache comment optimiser ses paramètres de configuration.

    La méthode automatique ne sélectionne plus que les méthodes "stabilisateur", "matrice_densité" et "vecteur d'état". Si un circuit non-Clifford trop grand pour la méthode statevector est exécuté, une exception sera levée, suggérant d'essayer d'utiliser explicitement les méthodes "extended_stabilizer" ou "matrix_product_state" à la place.

  • Désactive la fusion des portes pour la méthode de simulation de l'état du produit matriciel, car cela entraînait des problèmes avec des résultats incorrects dans certains cas.

  • Correction d'un bogue entraînant une évaluation incorrecte des canaux dans le site qiskit.providers.aer.PulseSimulator.

  • Correction de plusieurs bogues mineurs concernant des cas limites d'analyse des hamiltoniens dans la classe qiskit.providers.aer.pulse.system_models.hamiltonian_model.HamiltonianModel .

Ignis 0.4.0

Prélude

La principale modification apportée à cette version est un remaniement du code de l'analyse comparative aléatoire afin d'intégrer la classe Clifford mise à jour qiskit.quantum_info.Clifford de Terra et pour améliorer la classe CNOT-Dihedral.

Nouvelles fonctions

  • La fonction qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() a été remaniée pour utiliser la classe Clifford mise à jour Cliffordafin de permettre une analyse comparative aléatoire (RB) efficace sur les séquences de Clifford avec plus de 2 qubits. En outre, le code de la classe CNOT-Dihedral qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral a été remanié pour le rendre plus efficace, en utilisant des tableaux numpy, ainsi qu'en n'utilisant pas de fichiers pickle pré-générés stockant tous les éléments de groupe à 2 qubits. La fonction qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() dispose d'un nouveau kwarg rand_seed qui peut être utilisé pour spécifier une graine pour le générateur de nombres aléatoires utilisé pour générer les circuits RB. Cela peut être utile pour avoir un circuit reproductible.
  • La fonction qiskit.ignis.verification.qv_circuits() dispose d'un nouveau kwarg seed qui peut être utilisé pour spécifier une graine pour le générateur de nombres aléatoires utilisé pour générer les circuits du volume quantique. Cela peut être utile pour avoir un circuit reproductible.

Mise à niveau

  • La fonction qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() utilise désormais la classe Clifford mise à jour Clifford et la classe CNOT-Dihedral mise à jour qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral pour construire son résultat au lieu d'utiliser des tables de groupe pré-générées pour les éléments de groupe Clifford et CNOT-Dihedral, qui étaient stockées dans des fichiers pickle. Il peut en résulter des différences subtiles par rapport aux résultats de la version précédente.
  • Une nouvelle exigence scikit-learn a été ajoutée à la liste des exigences. Cette dépendance a été ajoutée dans la version 0.3.0 mais n'était pas correctement exposée en tant que dépendance dans cette version. Cela conduirait à une ImportError si le module qiskit.ignis.measurement.discriminator.iq_discriminators était importé. Ceci est maintenant correctement listé comme une dépendance de sorte que scikit-learn sera installé avec qiskit-ignis.
  • La fonction qiskit.ignis.verification.qv_circuits() utilise maintenant la classe de la bibliothèque circuit QuantumVolume pour construire sa sortie au lieu de construire le circuit à partir de zéro. Il peut en résulter des différences subtiles par rapport aux résultats de la version précédente.
  • Les monteurs en tomographie peuvent désormais obtenir une liste d'objets Résultat au lieu d'un seul Résultat, comme demandé dans le problème n°320.

Remarques concernant la dépréciation

  • Le kwarg interleaved_gates pour la fonction qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() est obsolète et sera supprimé dans une prochaine version. Il est remplacé par interleaved_elem. Les fonctions d'aide qiskit.ignis.verification.randomized_benchmarking.BasicUtils, qiskit.ignis.verification.randomized_benchmarking.CliffordUtils et qiskit.ignis.verification.randomized_benchmarking.DihedralUtils sont obsolètes. Ces classes sont remplacées par qiskit.ignis.verification.randomized_benchmarking.RBgroup qui gère les opérations de groupe nécessaires à RB. La classe qiskit.ignis.verification.randomized_benchmarking.Clifford est remplacée par Clifford.

  • Les kwargs qr et cr pour la fonction qiskit.ignis.verification.qv_circuits() sont obsolètes et seront supprimés dans une prochaine version. Ces kwargs ont été documentés comme étant utilisés pour spécifier un qiskit.circuit.QuantumRegister et qiskit.circuit.ClassicalRegister à utiliser dans les circuits de volume quantique générés au lieu d'en créer de nouveaux. Toutefois, les paramètres ne sont jamais respectés et un nouveau registre est toujours créé, qu'ils aient été définis ou non. Ce comportement est inchangé et ces kwargs n'ont toujours pas d'effet, mais ils sont dépréciés avant d'être supprimés afin d'éviter un changement radical pour les utilisateurs qui auraient pu utiliser l'un ou l'autre de ces kwargs.

  • La prise en charge du passage de sous-ensembles de qubits sous forme de liste dans le paramètre qubit_lists de la fonction qiskit.ignis.verification.qv_circuits() est obsolète et sera supprimée dans une prochaine version. Dans le passé, cette fonction était utilisée pour spécifier une disposition permettant de faire fonctionner le circuit d'un appareil. En d'autres termes, si vous disposez d'un dispositif à 5 qubits et que vous souhaitez exécuter un circuit QV à 2 qubits sur les qubits 1, 3 et 4 de ce dispositif. Vous transmettriez [1, 3, 4] comme l'une des listes de qubit_lists, ce qui générerait un circuit virtuel de 5 qubits et appliquerait qv aux qubits 1, 3 et 4 de ce circuit virtuel. Toutefois, cette fonctionnalité n'est pas nécessaire et fait double emploi avec le concept de initial_layout dans le transpileur et avec la question de savoir si un circuit a été incorporé dans un jeu de configuration. Pour aller de l'avant, il suffit d'exécuter transpile() ou execute() avec la disposition initiale définie pour ce faire. Par exemple, l'exécution de l'exemple ci-dessus deviendrait :

    from qiskit import execute
    from qiskit.ignis.verification import qv_circuits
    
    initial_layout = [1, 3, 4]
    qv_circs, _ = qv_circuits([list(range3)])
    execute(qv_circuits, initial_layout=initial_layout)

Corrections des erreurs

  • Correction d'un bogue concernant la position des impulsions de mesure insérées par py:func:qiskit.ignis.characterization.calibrations.pulse_schedules.drag_schedules. Corrige #465

Aqua 0.7.5

Nouvelles fonctions

  • Suppression de la dépendance souple à CPLEX dans ADMMOptimizer. Les optimiseurs par défaut utilisés par ADMMOptimizer sont désormais MinimumEigenOptimizer pour les problèmes QUBO et SlsqpOptimizer comme optimiseur continu. Vous pouvez toujours utiliser CplexOptimizer comme optimiseur pour ADMMOptimizer, mais il doit être défini explicitement.
  • Le nouveau site Yahoo! de l'organisme de financement créé.
  • Introduction de QuadraticProgramConverter qui est une classe abstraite pour les convertisseurs. Ajout des méthodes convert/interpret pour les convertisseurs au lieu de encode/decode. Ajout de to_ising et from_ising à la classe QuadraticProgram . Tous les paramètres de convert ont été déplacés vers le constructeur, à l'exception de name. Création d'un setter/getter pour les paramètres du convertisseur. Ajout de auto_define_penalty et interpret for``LinearEqualityToPenalty``. Les messages d'erreur des convertisseurs sont désormais plus informatifs.
  • Ajout d'un optimiseur SLSQP qiskit.optimization.algorithms.SlsqpOptimizer en tant qu'enveloppe de la méthode d'optimisation SciPy correspondante. Il s'agit d'un optimiseur classique qui ne dépend pas des algorithmes quantiques et qui peut être utilisé en remplacement de CobylaOptimizer.
  • L'optimiseur Cobyla a été modifié pour s'adapter à la fonction de démarrage multiple introduite dans l'optimiseur SLSQP. Par défaut, l'optimiseur ne s'exécute pas en mode de démarrage multiple.
  • Le site SummedOp effectue un contrôle d'égalité mathématiquement plus correct, dans lequel des expressions telles que X + X == 2*X et X + Z == Z + X sont évaluées à True.

Remarques concernant la dépréciation

  • La classe d'optimiseur GSLS a supprimé le paramètre __init__ max_iter en faveur de maxiter. La classe d'optimiseur SPSA a supprimé le paramètre __init__ max_trials en faveur de maxiter. la fonction optimize_svm a supprimé le paramètre max_iters en faveur de maxiter. La classe ADMMParameters a déprécié le paramètre __init__ max_iter en faveur de maxiter.
  • Les classes de conversion ising qiskit.optimization.converters.QuadraticProgramToIsing et qiskit.optimization.converters.IsingToQuadraticProgram sont obsolètes et seront supprimées dans une prochaine version. Les méthodes qiskit.optimization.QuadraticProgram , to_ising() et from_ising() doivent être utilisées à la place.
  • La méthode pprint_as_string pour qiskit.optimization.QuadraticProgram est obsolète et sera supprimée dans une prochaine version. Au lieu de cela, vous devriez simplement lancer .pprint_as_string() sur la sortie de to_docplex()
  • La méthode prettyprint pour qiskit.optimization.QuadraticProgram est obsolète et sera supprimée dans une prochaine version. Au lieu de cela, vous devriez simplement lancer .prettyprint() sur la sortie de to_docplex()

Corrections des erreurs

  • Modifié dans la version de python 3.8: Sur macOS,, la méthode de démarrage du spawn est maintenant la méthode par défaut. La méthode de démarrage par fourche doit être considérée comme dangereuse car elle peut entraîner des pannes dans les sous-processus. Cependant, P_BFGS ne prend pas en charge le spawn, nous revenons donc à un processus unique. Pour plus de détails, voir le site #1109 <https://github.com/qiskit-community/qiskit-aqua/issues/1109>.
  • Les paramètres de liaison dans le site CircuitStateFn n'ont pas copié la valeur de is_measurement et ont toujours défini is_measurement=False. Ce point a été corrigé.
  • Auparavant, SummedOp.to_matrix_op construisait une liste MatrixOp’s (avec des matrices numpy) et les additionnait, renvoyant un seul MatrixOp. Certains algorithmes (par exemple vqe) nécessitent la sommation de milliers de matrices, ce qui épuise la mémoire lors de la construction de la liste des matrices. Avec cette modification, aucune liste n'est construite. Au contraire, chaque opérande de la somme est converti en matrice, ajouté à un accumulateur et rejeté.
  • Le passage dans VQE d'un statevector à un qasm_simulator ou à un dispositif réel provoquait une erreur due à une réutilisation incompatible avec CircuitSampler. VQE a été modifié pour toujours créer un nouveau CircuitSampler et créer une nouvelle attente dans le cas où l'utilisateur ne l'a pas saisie. Pour plus de détails, voir le site #1153 <https://github.com/qiskit-community/qiskit-aqua/issues/1153>.
  • Les fournisseurs d'échange et de financement Wikipedia ont été corrigés pour traiter correctement les données Quandl. Pour plus de détails, voir le site #775 <https://github.com/qiskit-community/qiskit-aqua/issues/775>. Correction d'une erreur de division par 0 lors du calcul du vecteur moyen et de la matrice de covariance des prestataires de services financiers. Pour plus de détails, voir le site #781 <https://github.com/qiskit-community/qiskit-aqua/issues/781>.
  • La propriété ListOp.combo_fn a été perdue dans plusieurs transformations, telles que la conversion en un autre type d'opérateur, la traversée, la réduction ou la multiplication. Cet attribut est maintenant propagé à l'opérateur résultant.
  • L'évaluation de certaines expressions d'opérateurs, telles que SummedOp``s and evaluations with the ``CircuitSampler , ne traitait pas les coefficients correctement ou les ignorait complètement. E.g. l'évaluation de ~StateFn(0 * (I + Z)) @ Plus n'a pas donné 0 ou la normalisation de ~StateFn(I) @ ((Plus + Minus) / sqrt(2)) a manqué un facteur de sqrt(2). Ce point a été corrigé.
  • OptimizationResult comprenait quelques paramètres publics et les variables de classe étaient Optional. Cette correction rend toutes les variables de classe en lecture seule afin que mypy et pylint puissent vérifier les types plus efficacement. MinimumEigenOptimizer.solve les chaînes de bits générées dans un résultat comme str. Cette correction a transformé le résultat en List[float] comme le font les autres algorithmes. Certaines classes publiques liées aux algorithmes d'optimisation manquaient dans la documentation de qiskit.optimization.algorithms. Cette correction a permis d'ajouter toutes ces classes à la docstring. #1131 <https://github.com/qiskit-community/qiskit-aqua/issues/1131> pour plus de détails.
  • OptimizationResult.__init__ n'a pas vérifié si les tailles de x et variables correspondent ou non (elles devraient correspondre). Ce correctif a ajouté la vérification de la levée d'une erreur en cas de non-concordance et corrige des bogues détectés par la vérification. Cette correction ajoute également les tests unitaires manquants relatifs à OptimizationResult.variable_names et OptimizationResult.variables_dict dans test_converters. #1167 <https://github.com/qiskit-community/qiskit-aqua/issues/1167> pour plus de détails.
  • Correction de la liaison des paramètres dans OperatorStateFn, qui ne liait pas les paramètres de la primitive sous-jacente mais seulement les coefficients.
  • op.eval(other)op est du type OperatorBase, renvoie parfois silencieusement une valeur absurde lorsque le nombre de qubits dans op et other n'est pas égal. Cette correction permet d'obtenir un comportement correct, qui consiste à lancer une erreur plutôt qu'à renvoyer une valeur, car l'entrée dans ce cas n'est pas valide.
  • La méthode construct_circuit de VQE a précédemment renvoyé la valeur de l'espérance à évaluer en tant que type OperatorBase. Cette fonctionnalité a été déplacée dans construct_expectation et construct_circuit renvoie une liste des circuits qui sont évalués pour calculer la valeur espérée.

IBM 0.8.0 du fournisseur Q

Nouvelles fonctions

  • IBMQBackend dispose désormais d'une nouvelle méthode reservations() qui renvoie les informations de réservation pour le backend, avec un filtrage optionnel. En outre, vous pouvez désormais utiliser provider.backends.my_reservations() pour effectuer vos propres réservations.
  • qiskit.providers.ibmq.job.IBMQJob.result() lève une exception IBMQJobFailureError si le travail a échoué. Le message d'exception contient désormais la raison pour laquelle le travail a échoué, si l'ensemble du travail a échoué pour une seule raison.
  • Un nouvel attribut client_version a été ajouté à IBMQJob et à l'objet récupéré via qiskit.result.Result récupéré par l'intermédiaire de qiskit.providers.ibmq.job.IBMQJob.result(). client_version est un dictionnaire dont la clé est le nom et la valeur la version du client utilisé pour soumettre le travail, comme Qiskit.
  • La fonction least_busy() prend désormais un nouveau paramètre facultatif : reservation_lookahead. S'il est spécifié ou défini par défaut, un backend est considéré comme indisponible s'il a des réservations dans les prochaines minutes n , où n est la valeur de reservation_lookahead. Par exemple, si la valeur par défaut de 60 est utilisée, tous les backends qui ont des réservations dans les 60 prochaines minutes sont considérés comme indisponibles.
  • ManagedResults dispose désormais d'une nouvelle méthode combine_results() qui combine les résultats de tous les travaux gérés et renvoie un objet unique Result objet. Cet objet Result peut être utilisé, par exemple, dans les méthodes d'ajustement qiskit-ignis .

Mise à niveau

  • Les horodatages dans les champs suivants sont désormais exprimés en heure locale et non plus en UTC :

    • Propriétés du backend renvoyées par qiskit.providers.ibmq.IBMQBackend.properties().
    • Propriétés du backend renvoyées par qiskit.providers.ibmq.job.IBMQJob.properties().
    • estimated_start_time et estimated_complete_time dans QueueInfo, renvoyé par qiskit.providers.ibmq.job.IBMQJob.queue_info().
    • date en Result, renvoyée par qiskit.providers.ibmq.job.IBMQJob.result().

    En outre, le paramètre datetime pour qiskit.providers.ibmq.IBMQBackend.properties() est également censé être en heure locale, à moins qu'il ne contienne des informations sur le fuseau horaire UTC.

  • websockets 8.0 ou supérieur est désormais requis si Python 3.7 ou supérieur est utilisé. websockets 7.0 continuera à être utilisé pour Python 3.6 ou moins.

  • Sous Windows, la stratégie de boucle d'événements est définie sur WindowsSelectorEventLoopPolicy au lieu d'utiliser la valeur par défaut WindowsProactorEventLoopPolicy. Ceci corrige le problème de la méthode qiskit.providers.ibmq.job.IBMQJob.result() qui pouvait se bloquer sous Windows. Corrige #691

Remarques concernant la dépréciation

  • L'utilisation de Qconfig.py pour enregistrer les informations d'identification de IBM Quantum Experience est obsolète et sera supprimée dans la prochaine version. Vous devriez plutôt utiliser qiskitrc (la valeur par défaut).

Corrections des erreurs

  • Corrige un problème dans lequel un appel à qiskit.providers.ibmq.IBMQBackend.jobs() peut se bloquer si le nombre de travaux renvoyés est important. Corrections #674
  • Corrige un problème qui soulevait ValueError lors de la construction de cartes d'erreurs dans Jupyter pour les backends qui sont hors ligne. Corrections #706
  • qiskit.providers.ibmq.IBMQBackend.jobs() renverra désormais la liste correcte des objets IBMQJob lorsque le kwarg status est défini sur 'RUNNING'.
  • Les métadonnées du paquet ont été mises à jour pour refléter correctement la dépendance de qiskit-terra >= 0.14.0. Cette dépendance a été implicitement ajoutée dans le cadre de la version 0.7.0 mais n'a pas été reflétée dans les exigences du paquet, de sorte qu'il était auparavant possible d'installer qiskit-ibmq-provider avec une version de qiskit-terra qui était trop ancienne. Corrige #677
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.