Notes de publication de Qiskit 0.20
0.20.1
Terra 0.15.2
Corrections des erreurs
- Lors de l'accès à l'attribut
definitiond'une instance paramétréeGate, le siteQuantumCircuitavait été généré avec un siteParameterTableinvalide, de sorte que la lecture du siteQuantumCircuit.parametersou l'appel du siteQuantumCircuit.bind_parameterssignalerait 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 unedefinitioncorrecte mais uneto_matrixincorrecte. Il a été mis à jour de telle sorte queSXGate().inverse()renvoie unSXdgGate()et vice versa.Instruction.inverse()lorsqu'elle n'est pas surchargée par une sous-classe, renvoie dans certains cas une instanceGateavec une méthodeto_matrixincorrecte. Les exemples de méthodesto_matrixincorrectes ont été supprimés.- Pour
C3XGateavec unanglenon nul, l'inversion de la porte viaC3XGate.inverse()avait précédemment généré une porte inverse incorrecte. Ceci a été corrigé. - Les modes de
MCXGateont é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 porteMCXVChainentraînait une erreur. - Auparavant, lors de la création d'une porte de phase à contrôle multiple via
PhaseGate.control, une porteMCU1Gateétait renvoyée. Cette erreur a été corrigée de manière à ce qu'une adresseMCPhaseGatesoit renvoyée. - Auparavant, toute tentative de décomposition d'un circuit contenant un
MCPhaseGateentraînait une erreur due à une incohérence dans la définition duMCPhaseGate. Ceci a été corrigé. QuantumCircuit.composeetDAGCircuit.composeavaient, dans certains cas, traduit de manière incorrecte des portes conditionnelles si le circuit d'entrée contenait plus d'uneClassicalRegister. 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 objetCountsvide. La méthodemost_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
qregsetcregsen conséquence, mais pas les listesqubitsetclbits. 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éthodeextendmet 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.DAGDependencypour 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.converterspour effectuer des conversions dans les deux sens versDAGDependency. Ces fonctions sont les suivantes :circuit_to_dagdependency()pour convertir unQuantumCircuiten un objetDAGDependencyobjet.dagdependency_to_circuit()pour convertir unDAGDependencyen un objetQuantumCircuitobjet.dag_to_dagdependency()pour convertir unDAGCircuiten un objetDAGDependencyobjet.dagdependency_to_dag()pour convertir unDAGDependencyen un objetDAGCircuitobjet.
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.passesLa première,UnrollCustomDefinitionsdéroule toutes les instructions du circuit en fonction de leur propriétédefinitions'arrêtant lorsqu'elles atteignent soit l'adressebasis_gatesspé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 parEquivalenceLibrarypour réécrire les instructions du circuit dans une base spécifiée. -
Un nouvel argument
translation_methoda é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 :'unroller': pour utiliser l'optionUnrollerpasser'translator': pour utiliser leBasisTranslatorpasser.'synthesis': pour utiliser leUnitarySynthesispasser.
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 dedictet 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. ACountspeut ê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.DAGCircuita été ajoutée,from_networkx(). Cette méthode prend en charge un objetMultiDiGraphnetworkx (dans le format renvoyé parto_networkx()) et renvoie un nouvel objetDAGCircuitobjet. 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_qubitsa été ajouté àassemble()etexecute(). Pour les backends qui supportent cette fonctionnalité,init_qubitspeut ê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, lorsqueinit_qubitsest réglé surFalse, 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_delaya été ajouté àqiskit.compiler.assemble(),qiskit.execute.execute(), et le constructeur dePulseQobjtConfig.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'adresserep_delaysà partir de l'objetPulseBackendConfigurationauquel on peut accéder parbackend.configuration().rep_delays).Le kwarg
rep_delayne fonctionnera que sur les backends qui permettent une durée de répétition dynamique. Cela sera également indiqué dans l'objetPulseBackendConfigurationd'un backend sous la forme de l'attributdynamic_reprate_enabled. Sidynamic_reprate_enabledestFalse, la valeurrep_timespécifiée pourqiskit.compiler.assemble(),qiskit.execute.execute(), ou le constructeur dePulseQobjtConfigsera utilisée au lieu derep_delay.rep_timepermet 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.jsondansqiskit.schemasa été mis à jour pour inclurerep_delaycomme propriété de configuration optionnelle pour les qobjs d'impulsion. -
Le fichier JSON Schema de
backend_configuration_schema.jsondans mod:qiskit.schemas a été mis à jour pour inclurerep_delay_rangeetdefault_rep_delaycomme 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 classeqiskit.circuit.QuantumCircuitclasse. 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_phasedans 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
QuantumCircuitde prendre en compte la phase globale. Par exemple, avec l'attributglobal_phasel'attributto_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
DAGCircuitafin que la phase globale puisse être suivie lors de la conversion entre les classesQuantumCircuitetDAGCircuit. -
Deux nouvelles classes,
AncillaRegisteretAncillaQubitont été ajoutées au moduleqiskit.circuitmodule. Ce sont des sous-classes deQuantumRegisteretQubitet 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éthodeQuantumCircuit. Cette méthode renvoie une version contrôlée de l'objetQuantumCircuitavec des contrôles ouverts et fermés. Cette fonctionnalité n'était auparavant accessible que par l'intermédiaire de laGateclasse. -
Une nouvelle méthode
repeat()a été ajoutée à la classeQuantumCircuita 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 classeQuantumCircuita 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 classeqiskit.transpiler.Layoutclasse. Cette méthode permet de convertir deux objetsLayoutobjets en une carte de qubits pour composer deux circuits. -
Une nouvelle classe,
ConfigurableFakeBackend, a été ajoutée au moduleqiskit.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 classeqiskit.circuit.EquivalenceLibrarya 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 phaseqiskit.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'instructionSetPhasesera réglée sur radians. -
Une nouvelle instruction d'impulsion
ShiftFrequencya é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 commandeShiftFrequencyauront l'enveloppe une fréquence décrémentée par 340MHz. -
Une nouvelle méthode
conjugate()a été ajoutée à la classeParameterExpressiona vu l'ajout d'une nouvelle méthode. Cela permet d'appelernumpy.conj()sans provoquer d'erreur. Puisqu'unParameterExpressionest réel, il se renverra lui-même. Ce comportement est analogue à celui de Python floats/ints. -
Une nouvelle classe
PhaseEstimationa é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 d'une valeur propre d'un opérateur unitaire , à condition d'avoir l'état propre correspondant . C'est-à-dire
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.visualizationa un nouveau kwargplot_state_qsphere()possède un nouveau kwargshow_state_labelsqui est utilisé pour contrôler si chaque blob dans la visualisation qsphere est étiqueté. Par défaut, ce kwarg est fixé àTrueet 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 kwargshow_state_labelsàFalse. -
La fonction
qiskit.visualizationfonctionplot_state_qsphere()a un nouveau kwargshow_state_phasesqui est défini par défaut àFalse. Lorsqu'il est réglé surTrue, il affiche la phase de chaque état de base. -
La fonction
qiskit.visualizationfonctionplot_state_qsphere()a un nouveau kwarguse_degreesqui est défini par défaut àFalse. Lorsqu'il est réglé surTrue, il affiche la phase de chaque état de base en degrés, ainsi que le cercle de phase en bas à droite. -
Une nouvelle classe,
QuadraticFormau moduleqiskit.circuit.librarypour implémenter une forme quadratique sur des variables binaires. L'élément de la bibliothèque de circuits met en œuvre l'opération
pour la forme quadratique et qubits de sortie. Le résultat est dans les qubits de sortie est codé en complément à deux. Si 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()etqiskit.quantum_info.DensityMatrix.expectation_value()méthodes de calcul de la valeur espérée d'unqiskit.quantum_info.Operator. -
Pour le
seedkwarg dans le constructeur des objets Générateur aléatoireqiskit.circuit.library.QuantumVolumeles objets numpy random Generator peuvent maintenant être utilisés. Auparavant, seuls les nombres entiers étaient valables. Ceci est utile lorsque l'on intègreQuantumVolumedans 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 circuitsQuantumVolumecircuits. -
La
QuantumCircuitméthodecompose()dispose d'un nouveau kwargfrontqui 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,
SabreLayoutetSabreSwappour 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 fonctiontranspile()en réglant le kwarglayout_methodsur'sabre'et/ou le kwargrouting_methodsur'sabre'pour utiliser la fonctionSabreLayoutetSabreSwaprespectivement. -
Ajout de la méthode
replace()à la classeqiskit.pulse.Schedulequi permet de remplacer une instruction d'impulsion par une autre. Par exemple :.. code-block:: pythonfrom 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.librarypour les portes , son adjoint , et les portes contrôlées comme suitSXGate,SXdgGate, etCSXGate. Ils peuvent également être ajoutés à un objetQuantumCircuità l'aide des boutonssx(),sxdg(), etcsx()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éthodeseed()méthode. -
Les méthodes
qiskit.circuit.ParameterExpression.subs()etqiskit.circuit.QuantumCircuit.assign_parameters()acceptent désormaisParameterExpressioncomme 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éthodeto_gate()dispose d'un nouveau kwarglabelqui peut être utilisé pour définir une étiquette pour l'objet de sortieGatede 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,, etCPhaseGateavec les méthodesQuantumCircuitméthodesu(),cu(),p(), etcp(). La porteUGatela porte est la porte de rotation générique à un qubit avec 3 angles d'Euler et la porteCUGatesa version contrôlée.CUGatea 4 paramètres pour tenir compte d'une éventuelle phase globale de la porte U. LesPhaseGateetCPhaseGatesont la porte de phase générale à un angle arbitraire et sa version contrôlée. -
Un nouveau kwarg,
cregbundle, a été ajouté à la fonctionqiskit.visualization.circuit_drawer()et à la méthodeQuantumCircuitméthodedraw(). Lorsqu'il est défini surTrue, les cregs seront regroupés en une seule ligne dans les visualisations de circuits pour les tiroirstextetmpl. La valeur par défaut estTrue. 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 fonctionqiskit.visualization.circuit_drawer()et à la méthodeQuantumCircuitméthodedraw(). Lorsqu'il est défini surTrue, 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, etMCXVChain) ont vu leurs propriétésnamemodifiées pour décrire plus précisément leur mise en œuvre :mcx_gray,mcx_recursive, etmcx_vchainrespectivement. Auparavant, ces portes partageaient le nommcxavecMCXGatece 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_passmanagersutilisentUnrollCustomDefinitionsetBasisTranslatorpour gérer le changement de base au lieu de l'ancienne valeur par défautUnroller. 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_methodsurtranspile()à'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é optionnelequivalence_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
cregbundlepour la méthodeqiskit.circuit.QuantumCircuit.draw()et la fonctionqiskit.visualization.circuit_drawer()a été remplacée parTrue. 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
cregbundlesurFalse. 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) -
Scheduletraçage avecqiskit.pulse.Schedule.draw()etqiskit.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 detablesurTrue. -
Le laissez-passer
RemoveResetInZeroStateétait précédemment inclus dans le gestionnaire de passes prédéfinieslevel_0_pass_manager()qui était utilisé avec les fonctionsoptimization_level=0fortranspile()etexecute(). Cependant,RemoveResetInZeroStateest 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écutertranspile()avecRemoveResetInZeroStateutilisez un gestionnaire de passe personnalisé ouoptimization_level1, 2 ou 3. -
Le kwarg déprécié
line_lengthpour la fonctionqiskit.visualization.circuit_drawer()pour la fonction et la méthodeqiskit.circuit.QuantumCircuit.draw()a été supprimé. Il a été supprimé depuis la version 0.10.0. Au lieu de cela, vous pouvez utiliserfoldkwarg pour ajuster la largeur du diagramme de circuit. -
Le mode de sortie
'mpl'pour la méthodeqiskit.circuit.QuantumCircuit.draw()etcircuit_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_tokenspour leqiskit.qasm.Qasmetqiskit.qasm.QasmParseront été supprimées. Ces méthodes sont obsolètes depuis la version 0.9.0. Les méthodesqiskit.qasm.Qasm.generate_tokens()etqiskit.qasm.QasmParser.generate_tokens()doivent être utilisées à la place. -
Le kwarg déprécié
channels_to_plotpourqiskit.pulse.Schedule.draw(),qiskit.pulse.Instruction.draw(),qiskit.visualization.pulse.matplotlib.ScheduleDrawer.drawetpulse_drawer()a été supprimé. Le kwarg est obsolète depuis la version 0.11.0 et a été remplacé par le kwargchannels, qui fonctionne de manière identique et doit être utilisé à la place. -
L'attribut
circuit_instruction_mapde la classeqiskit.providers.models.PulseDefaultsa été supprimé. Cet attribut est obsolète depuis la version 0.12.0 et a été remplacé par l'attributinstruction_schedule_mapqui peut être utilisé à la place. -
La méthode
uniondeScheduleetInstructionsont obsolètes depuis la version 0.12.0 et ont été supprimées. Utilisez les méthodesqiskit.pulse.Schedule.insert()etqiskit.pulse.Instruction.meth()au lieu de la méthode kwarg``time=0``. -
L'argument déprécié
scalingde la méthodedrawdeScheduleetInstructiona été remplacé parscaledepuis la version 0.12.0 et a été supprimé. Utilisez plutôt le sitescalekwarg. -
L'argument déprécié
perioddes fonctionsqiskit.pulse.libraryont été remplacées parfreqdepuis la version 0.13.0 et sont maintenant supprimées. Utilisez le kwargfreqau lieu deperiod. -
Le module
qiskit.pulse.commandscontenant les classesCommandsé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 :AncienNouveauCommand(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 moduleqiskit.quantum_infoet 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_stateetqiskit.quantum_info.projectorsont obsolètes depuis Qiskit Terra 0.12.0 est maintenant supprimée. Utilisez le siteqiskit.quantum_info.QuantumStateet ses dérivéesqiskit.quantum_info.Statevectoretqiskit.quantum_info.DensityMatrixpour 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_paulivecne 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.validationont é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.resultont été supprimées car elles ne sont plus utilisées par la classeqiskit.result.Resultne les utilise plus. -
La sortie de la méthode
to_dict()pour la classeqiskit.result.Resultn'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éthodeto_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_slotsetreg_slotsont été supprimés deqiskit.pulse.instructions.Acquireetchannel,mem_slotetreg_slotlè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éeqiskit.dagcircuit.DAGCircuita é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.pulseresponsable des transformations horaire->horaire a été renommé dereschedule.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
PassManagerne permettait pas aux classesTransformationPassde modifier le sitePropertySet. Cette restriction a été levée, de sorte qu'une classeTransformationPasspeut désormais accéder en lecture et en écriture aux sitesPropertySetetDAGCircuitpendant la durée de la formationrun(). Ce changement a été effectué pour faciliter plus efficacementTransformationPassclasses qui ont un état interne qui peut être nécessaire pour les passages ultérieurs dans lePassManager. Sans cette modification, il aurait fallu un deuxième siteAnalysisPassredondant 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.visualizationfonctionsplot_state_hinton(),plot_bloch_multivector(),plot_state_city(),plot_state_paulivec(), etplot_state_qsphere()a été renommé derhoàstate. La transmission de la valeur par nom àrhoest 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ètrestate. -
Le module
qiskit.pulse.pulse_libest obsolète et sera supprimé dans une prochaine version. Il a été renommé enqiskit.pulse.libraryqui devrait être utilisé à la place. -
La méthode
qiskit.circuit.QuantumCircuitmirror()est obsolète et sera supprimée dans une prochaine version. La méthodeqiskit.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éthodereverse_ops()ne fait qu'inverser l'ordre des portes appliquées au lieu de les inverser. -
Les méthodes
qubits()etclbits()deqiskit.dagcircuit.DAGCircuitsont 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.qubitsetqiskit.dagcircuit.DAGCircuit.clbits, et sont mises en cache, ce qui permet d'y accéder beaucoup plus rapidement. -
La méthode
get_sample_pulsepour les classes dérivéesqiskit.pulse.library.ParametricPulse(par exempleGaussianSquare) a été dépréciée et sera supprimée dans une prochaine version. Elle a été remplacée par la méthodeget_waveform(par exempleget_waveform()) qui devrait se comporter de manière identique. -
L'utilisation de l'argument facultatif
conditionsurqiskit.dagcircuit.DAGNode,qiskit.dagcircuit.DAGCircuit.apply_operation_back(),, etqiskit.dagcircuit.DAGCircuit.apply_operation_front()a été dépréciée et sera supprimée dans une prochaine version. Au lieu de cela, le sitecontrola mis en place des instances qui ont été ajoutées à la base de donnéesqiskit.circuit.Instructionajoutées à une instanceDAGCircuitdevrait être utilisé. -
Les méthodes des classes
set_atoletset_rtoldes classesqiskit.quantum_info.BaseOperatoretqiskit.quantum_info.QuantumState(et leurs sous-classes telles queOperatoretqiskit.quantum_info.DensityMatrix) sont obsolètes et seront supprimées dans une prochaine version. La valeur des attributs.atolet.rtoldoit ê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_paulivecsont obsolètes et seront supprimées dans une prochaine version. Les fonctions équivalentes basées sur matplotlib deqiskit.visualization,plot_bloch_multivector(),plot_state_city(),plot_state_qsphere(),plot_state_hinton(),plot_state_histogram(), etplot_state_paulivec()devraient être utilisés à la place. -
Les propriétés
acquires,mem_slotsetreg_slotsde l'instructionqiskit.pulse.instructions.Acquiresont obsolètes et seront supprimées dans une prochaine version. Il s'agit simplement de doublons dechannel,mem_slot, etreg_slotrespectivement, maintenant que le support précédemment déprécié pour l'utilisation de plusieurs qubits dans une seule instruction a été suppriméAcquirea été supprimée. -
La classe
SamplePulsedeqiskit.pulsea été renommée enWaveform.SamplePulseest obsolète et sera supprimée dans une prochaine version. -
La clé du dictionnaire de style
cregbundleest obsolète et sera supprimée dans une prochaine version. Elle a été remplacée par le kwargcregbundleajouté à la fonctionqiskit.visualization.circuit_drawer()et à la méthodeQuantumCircuitméthodedraw().
Corrections des erreurs
-
La
qiskit.circuit.QuantumCircuitméthodenum_nonlocal_gatesincluait auparavant des objets multi-qubitsqiskit.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ésGatesoient comptés. Corrections #4500 -
ControlledGateavec un ensemble dectrl_staten'é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.QuantumRegisterouqiskit.circuit.ClassicalRegisterpar index lors de l'utilisation des types d'entiers numpy <https://numpy.org/doc/stable/user/basics.types.html> \___ aurait auparavant soulevé une exceptionCircuitError. Ce problème a été résolu afin que les types numpy puissent être utilisés en plus du typeintintégré à Python. Corrige #3929. -
Un bug a été corrigé : seul le premier
qiskit.pulse.configuration.Kernelouqiskit.pulse.configuration.Discriminatorpour unqiskit.pulse.Acquireétait utilisé lorsqu'il y avait plusieurs acquisitions en même temps dans unqiskit.pulse.Schedule. -
L'unité SI utilisée pour construire les objets
qiskit.pulse.SetFrequencyest le Hz, mais lorsqu'un objet est créé à partir d'une instance, il doit être converti en GHzPulseQobjInstructionest créé à partir d'une instanceSetFrequency, 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
AttributeErrorsi l'appelant tentait d'accéder à un attribut que seuls les objetsControlledGatepossèdent. Ce problème a été corrigé par l'ajout d'un getter et d'un setter pournum_ctrl_qubitspour valider l'utilisation d'une valeur valide. Corrections #4576 -
Les contrôles ouverts ont été mis en œuvre en modifiant un objet
Gateobjetsdefinition. 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 passeUnrollerpour 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_barriersdans la classeZZFeatureMapn'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éthodeqiskit.circuit.QuantumCircuitméthodedraw()et la fonctionqiskit.visualization.circuit_drawer()n'était pas correctement mis à l'échelle lorsque le kwargscaleé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.Statevectoretqiskit.quantum_info.DensityMatrixpar circuit par circuit contenant des instructionsBarriersoulevait une exception. Corrige #4461 -
Auparavant, lorsqu'un
QuantumCircuitcontenait unGateavec une condition classique, le transpileur échouait parfois en utilisantoptimization_level=3surtranspile()ouexecute()soulevant unUnboundLocalError. Ce problème a été résolu en mettant à jour la passeConsolidateBlockspour 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éthodeqiskit.circuit.QuantumCircuit.draw()pour la méthode et la fonctionqiskit.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 surTrue, 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=Trueavec le backend de sortie'mpl'pour la méthodeqiskit.circuit.QuantumCircuit.draw()et la fonctionqiskit.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éthodeqiskit.circuit.QuantumCircuit.draw()et laqiskit.visualization.circuit_drawer()fonctionCSwapGateet d'une fonction contrôléeRZZGateles 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éthodeqiskit.circuit.QuantumCircuit.draw()méthode etqiskit.visualization.circuit_drawer()les portes contrôlées créées à l'aide de la méthodeto_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éthodeqiskit.circuit.QuantumCircuit.draw()les portes des méthodes et des fonctionsqiskit.visualization.circuit_drawer()les portes de fonction avec des tableaux comme paramètres, telles queHamiltonianGate, 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éthodeqiskit.circuit.QuantumCircuit.draw()méthode etqiskit.visualization.circuit_drawer()les portes génériques créées en instanciant directement la méthodeqiskit.circuit.Gateaffiche 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éthodeqiskit.circuit.QuantumCircuit.draw()et la fonctionqiskit.visualization.circuit_drawer()une erreur deAttributeErrorsurvenant lors de l'utilisation deIsometryouInitializea été corrigée. Corrige #4439. -
Lorsque l'on utilise le backend de sortie
'mpl'pour la méthodeqiskit.circuit.QuantumCircuit.draw()méthode etqiskit.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éthodeqiskit.circuit.QuantumCircuit.draw()et la fonctionqiskit.visualization.circuit_drawer()en fixant le kwargfoldà -1, le circuit s'affichera désormais correctement sans pliage. Corrige #4506. -
Les impulsions paramétriques provenant de
qiskit.pulse.library.discreteont 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 alors . Corrige #4317
Autres remarques
- La classe
qiskit.result.Resultqui é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'extensionqiskit.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.QasmSimulatordans les backendsqiskit.providers.aer.StatevectorSimulatoretqiskit.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.SnapshotExpectationValueqiskit.providers.aer.extensions.SnapshotProbabilitiesqiskit.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
QasmSimulatorpour 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,PhaseetSetPhaseà l'instructionqiskit.providers.aer.PulseSimulator. -
Améliorer les performances de
qiskit.providers.aer.PulseSimulatoren mettant en cache les appels à la fonction RHS -
Introduire d'autres méthodes de résolution des DE, spécifiables à l'adresse
backend_optionsdans le siteqiskit.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.QasmSimulatoretqiskit.providers.aer.StatevectorSimulatoren 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_unitskwarg àqiskit.providers.aer.noise.NoiseModel.from_device()pour spécifiergate_lengthsdans 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
validatesur la méthodeqiskit.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
containsetdifferencebasées surstd::set::containsetstd::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 à jourCliffordafin 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-Dihedralqiskit.ignis.verification.randomized_benchmarking.CNOTDihedrala é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 fonctionqiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()dispose d'un nouveau kwargrand_seedqui 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 kwargseedqui 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 à jourCliffordet la classe CNOT-Dihedral mise à jourqiskit.ignis.verification.randomized_benchmarking.CNOTDihedralpour 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
ImportErrorsi le moduleqiskit.ignis.measurement.discriminator.iq_discriminatorsétait importé. Ceci est maintenant correctement listé comme une dépendance de sorte quescikit-learnsera installé avec qiskit-ignis. - La fonction
qiskit.ignis.verification.qv_circuits()utilise maintenant la classe de la bibliothèque circuitQuantumVolumepour 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_gatespour la fonctionqiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()est obsolète et sera supprimé dans une prochaine version. Il est remplacé parinterleaved_elem. Les fonctions d'aideqiskit.ignis.verification.randomized_benchmarking.BasicUtils,qiskit.ignis.verification.randomized_benchmarking.CliffordUtilsetqiskit.ignis.verification.randomized_benchmarking.DihedralUtilssont obsolètes. Ces classes sont remplacées parqiskit.ignis.verification.randomized_benchmarking.RBgroupqui gère les opérations de groupe nécessaires à RB. La classeqiskit.ignis.verification.randomized_benchmarking.Cliffordest remplacée parClifford. -
Les kwargs
qretcrpour la fonctionqiskit.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 unqiskit.circuit.QuantumRegisteretqiskit.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_listsde la fonctionqiskit.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 dequbit_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 deinitial_layoutdans 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écutertranspile()ouexecute()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
QuadraticProgramConverterqui est une classe abstraite pour les convertisseurs. Ajout des méthodesconvert/interpretpour les convertisseurs au lieu deencode/decode. Ajout deto_isingetfrom_isingà la classeQuadraticProgram. Tous les paramètres deconvertont été déplacés vers le constructeur, à l'exception dename. Création d'un setter/getter pour les paramètres du convertisseur. Ajout deauto_define_penaltyetinterpretfor``LinearEqualityToPenalty``. Les messages d'erreur des convertisseurs sont désormais plus informatifs. - Ajout d'un optimiseur SLSQP
qiskit.optimization.algorithms.SlsqpOptimizeren 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 deCobylaOptimizer. - 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
SummedOpeffectue un contrôle d'égalité mathématiquement plus correct, dans lequel des expressions telles queX + X == 2*XetX + Z == Z + Xsont évaluées àTrue.
Remarques concernant la dépréciation
- La classe d'optimiseur GSLS a supprimé le paramètre
__init__max_iteren faveur demaxiter. La classe d'optimiseur SPSA a supprimé le paramètre__init__max_trialsen faveur demaxiter. la fonction optimize_svm a supprimé le paramètremax_itersen faveur demaxiter. La classe ADMMParameters a déprécié le paramètre__init__max_iteren faveur demaxiter. - Les classes de conversion ising
qiskit.optimization.converters.QuadraticProgramToIsingetqiskit.optimization.converters.IsingToQuadraticProgramsont obsolètes et seront supprimées dans une prochaine version. Les méthodesqiskit.optimization.QuadraticProgram,to_ising()etfrom_ising()doivent être utilisées à la place. - La méthode
pprint_as_stringpourqiskit.optimization.QuadraticProgramest obsolète et sera supprimée dans une prochaine version. Au lieu de cela, vous devriez simplement lancer.pprint_as_string()sur la sortie deto_docplex() - La méthode
prettyprintpourqiskit.optimization.QuadraticProgramest obsolète et sera supprimée dans une prochaine version. Au lieu de cela, vous devriez simplement lancer.prettyprint()sur la sortie deto_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
CircuitStateFnn'ont pas copié la valeur deis_measurementet ont toujours définiis_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_fna é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)) @ Plusn'a pas donné 0 ou la normalisation de~StateFn(I) @ ((Plus + Minus) / sqrt(2))a manqué un facteur desqrt(2). Ce point a été corrigé. OptimizationResultcomprenait quelques paramètres publics et les variables de classe étaientOptional. Cette correction rend toutes les variables de classe en lecture seule afin que mypy et pylint puissent vérifier les types plus efficacement.MinimumEigenOptimizer.solveles chaînes de bits générées dans un résultat commestr. Cette correction a transformé le résultat enList[float]comme le font les autres algorithmes. Certaines classes publiques liées aux algorithmes d'optimisation manquaient dans la documentation deqiskit.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 dexetvariablescorrespondent 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_namesetOptimizationResult.variables_dictdanstest_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)oùopest du typeOperatorBase, renvoie parfois silencieusement une valeur absurde lorsque le nombre de qubits dansopetothern'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_circuitdeVQEa précédemment renvoyé la valeur de l'espérance à évaluer en tant que typeOperatorBase. Cette fonctionnalité a été déplacée dansconstruct_expectationetconstruct_circuitrenvoie une liste des circuits qui sont évalués pour calculer la valeur espérée.
IBM 0.8.0 du fournisseur Q
Nouvelles fonctions
IBMQBackenddispose désormais d'une nouvelle méthodereservations()qui renvoie les informations de réservation pour le backend, avec un filtrage optionnel. En outre, vous pouvez désormais utiliserprovider.backends.my_reservations()pour effectuer vos propres réservations.qiskit.providers.ibmq.job.IBMQJob.result()lève une exceptionIBMQJobFailureErrorsi 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_versiona été ajouté àIBMQJobet à l'objet récupéré viaqiskit.result.Resultrécupéré par l'intermédiaire deqiskit.providers.ibmq.job.IBMQJob.result().client_versionest 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 minutesn, oùnest la valeur dereservation_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. ManagedResultsdispose désormais d'une nouvelle méthodecombine_results()qui combine les résultats de tous les travaux gérés et renvoie un objet uniqueResultobjet. Cet objetResultpeut être utilisé, par exemple, dans les méthodes d'ajustementqiskit-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_timeetestimated_complete_timedansQueueInfo, renvoyé parqiskit.providers.ibmq.job.IBMQJob.queue_info().dateenResult, renvoyée parqiskit.providers.ibmq.job.IBMQJob.result().
En outre, le paramètre
datetimepourqiskit.providers.ibmq.IBMQBackend.properties()est également censé être en heure locale, à moins qu'il ne contienne des informations sur le fuseau horaire UTC. - Propriétés du backend renvoyées par
-
websockets8.0 ou supérieur est désormais requis si Python 3.7 ou supérieur est utilisé.websockets7.0 continuera à être utilisé pour Python 3.6 ou moins. -
Sous Windows, la stratégie de boucle d'événements est définie sur
WindowsSelectorEventLoopPolicyau lieu d'utiliser la valeur par défautWindowsProactorEventLoopPolicy. Ceci corrige le problème de la méthodeqiskit.providers.ibmq.job.IBMQJob.result()qui pouvait se bloquer sous Windows. Corrige #691
Remarques concernant la dépréciation
- L'utilisation de
Qconfig.pypour enregistrer les informations d'identification de IBM Quantum Experience est obsolète et sera supprimée dans la prochaine version. Vous devriez plutôt utiliserqiskitrc(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
ValueErrorlors 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 objetsIBMQJoblorsque le kwargstatusest 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'installerqiskit-ibmq-provideravec une version deqiskit-terraqui était trop ancienne. Corrige #677