Notes de publication de Qiskit 0.18
0.18.3
Terra 0.13.0
Aucun changement
Aer 0.5.1
Mise à niveau
- 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.
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.
-
Corrige les classes de contrôleurs de manière à ce que la passe de transpilation ReduceBarrier soit appliquée en premier. Cela empêche les instructions de barrière d'empêcher la troncature des qubits inutilisés si la seule instruction définie sur ces qubits est une barrière.
-
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'une erreur dans la conversion de l'unité de temps de la porte pour le modèle de bruit du dispositif avec des erreurs de relaxation thermique et des erreurs de porte. La probabilité d'erreur de dépolarisation était calculée avec un temps de porte en microsecondes, tandis que pour la relaxation thermique, elle était calculée en nanosecondes. De ce fait, aucune erreur de dépolarisation n'a été appliquée car les unités incorrectes auraient donné l'impression que l'appareil était limité par la cohérence.
-
Correction d'un bug dans la composition incorrecte de QuantumErrors lorsque les qubits des instructions composées sont différents.
-
Correction d'un problème où la porte "diagonale" est vérifiée comme étant unitaire avec une tolérance trop élevée. Les diagonales générées à partir de fonctions Numpy échouaient souvent au test.
-
Correction de la passe d'optimisation du circuit de suppression des barrières à appliquer avant la trucation des qubits. Ceci corrige un problème où les barrières insérées par le transpondeur Terra à travers des qubits autrement inactifs les empêchaient d'être tronqués.
Ignis 0.3.0
Aucun changement
Aqua 0.6.6
Aucun changement
IBM 0.6.1 du fournisseur Q
Aucun changement
0.18.0
Terra 0.13.0
Prélude
La version 0.13.0 comprend de nombreux changements importants. Les points forts de cette version sont les suivants
Pour le transpileur, nous avons changé la bibliothèque de graphes utilisée pour construire la classe qiskit.dagcircuit.DAGCircuit qui est la structure de données sous-jacente à toutes les opérations, pour qu'elle soit basée sur retworkx afin d'améliorer considérablement les performances. La vitesse de transpilation des circuits dans la version 0.13.0 devrait être significativement plus rapide que dans les versions précédentes.
Le style de construction des instructions Pulse a été considérablement simplifié. Désormais, Command s est obsolète et un ensemble unifié de Instruction est pris en charge.
Le module qiskit.quantum_info comprend plusieurs nouvelles fonctions pour générer des opérateurs aléatoires (tels que les Cliffords et les canaux quantiques) et pour calculer la norme de diamant des canaux quantiques; des mises à jour des modules Statevector et DensityMatrix afin de prendre en charge le calcul des probabilités de mesure et l'échantillonnage des mesures; et plusieurs nouvelles classes sont basées sur la représentation symplectique des matrices de Pauli. Ces nouvelles classes comprennent les opérateurs de Clifford (Clifford), les matrices de N-qubits qui sont éparses dans la base de Pauli (SparsePauliOp), les listes de Pauli (PauliTable) et les listes de stabilisateurs (StabilizerTable).
Cette version propose également une documentation largement améliorée pour l'ensemble de Qiskit, y compris une documentation améliorée pour les éléments suivants qiskit.circuit, qiskit.pulse et qiskit.quantum_info et les modules
En outre, la dénomination des objets et des méthodes des portails a été mise à jour afin d'être plus cohérente QuantumCircuit ont été mis à jour pour être plus cohérents. De ce fait, plusieurs classes et méthodes ont été dépréciées au fur et à mesure de l'adoption d'un système de dénomination plus cohérent.
Pour plus de détails sur tous les changements apportés dans cette version, voir les notes de version détaillées ci-dessous.
Nouvelles fonctions
-
Ajout d'un nouveau module de bibliothèque de circuits
qiskit.circuit.library. Il s'agira d'un lieu pour les constructeurs de circuits courants qui peuvent être utilisés comme éléments de base pour des circuits ou des applications plus importants. -
La classe
qiskit.providers.BaseJobcomporte quatre nouvelles méthodes :done()running()cancelled()in_final_state()
Ces méthodes sont utilisées pour vérifier si un travail se trouve dans un état donné.
-
Ajouter la possibilité de spécifier un contrôle conditionné à la présence d'un qubit dans l'état fondamental. L'état des qubits de contrôle est représenté par un nombre entier. Par exemple :
from qiskit import QuantumCircuit from qiskit.extensions.standard import XGate qc = QuantumCircuit(4) cgate = XGate().control(3, ctrl_state=6) qc.append(cgate, [0, 1, 2, 3])Crée une porte à quatre qubits où le quatrième qubit est inversé si le premier qubit est dans l'état fondamental et que les deuxième et troisième qubits sont dans l'état excité. Si
ctrl_stateestNone, le contrôle est conditionné à l'excitation de tous les qubits de contrôle. -
Un nouveau widget jupyter,
%circuit_library_infoa été ajouté àqiskit.tools.jupyter. Ce widget est utilisé pour visualiser les détails des circuits construits à partir de la bibliothèque de circuits. Par exemplefrom qiskit.circuit.library import XOR import qiskit.tools.jupyter circuit = XOR(5, seed=42) %circuit_library_info circuit -
Une nouvelle option kwarg,
formatted, a été ajoutée àqiskit.circuit.QuantumCircuit.qasm(). Lorsqu'elle vautTrue, la méthode imprime une version syntaxiquement mise en évidence (à l'aide de pygments) sur stdout et renvoieNone(ce qui diffère du comportement normal consistant à renvoyer le code QASM sous forme de chaîne de caractères). -
Une nouvelle option kwarg,
filename, a été ajoutée àqiskit.circuit.QuantumCircuit.qasm(). Lorsqu'elle est définie sur un chemin, la méthode écrit le code QASM dans ce fichier. Il continuera ensuite à produire normalement. -
Une nouvelle instruction
SetFrequencyqui permet aux utilisateurs de modifier la fréquence dePulseChannel. Cela se fait de la manière suivante :from qiskit.pulse import Schedule from qiskit.pulse import SetFrequency sched = pulse.Schedule() sched += SetFrequency(5.5e9, DriveChannel(0))Dans cet exemple, la fréquence de toutes les impulsions avant la commande
SetFrequencysera la fréquence par défaut et toutes les impulsions appliquées au canal d'entraînement zéro après la commandeSetFrequencyseront à 5.5 GHz. Les utilisateurs deSetFrequencydoivent tenir compte des éventuelles limitations matérielles. -
Une nouvelle méthode,
assign_parameters()a été ajoutée à la classeqiskit.circuit.QuantumCircuitclasse. Cette méthode accepte un dictionnaire de paramètres contenant à la fois des flottants et des objets Parameters dans un seul dictionnaire. En d'autres termes, cette nouvelle méthode vous permet de lier des flottants, des paramètres ou les deux dans un seul dictionnaire.De plus, en utilisant le kwarg
inplace, il peut être spécifié que vous pouvez éventuellement modifier le circuit original en place. Par défaut, cette valeur est fixée àFalseet une copie du circuit original sera renvoyée par la méthode. -
Une nouvelle méthode
num_nonlocal_gates()a été ajoutée à la classeqiskit.circuit.QuantumCircuita vu l'ajout d'une nouvelle méthode. Cette méthode renvoie le nombre de portes d'un circuit impliquant 2 qubits ou plus. Ces portes sont plus coûteuses en termes de temps et d'erreurs à mettre en œuvre. -
La
qiskit.circuit.QuantumCircuitméthodeiso()pour ajouter une porteIsometryau circuit a un nouvel alias. Vous pouvez désormais appelerqiskit.circuit.QuantumCircuit.isometry()en plus d'appeleriso. -
Un attribut
descriptiona été ajouté à la classeCouplingMappour stocker une brève description des différentes cartes de couplage (par exemple, carte complète, grille, ligne, etc.). -
Une nouvelle méthode
compose()a été ajoutée à la classeDAGCircuitpour composer deux circuits par l'intermédiaire de leurs DAG.dag_left.compose(dag_right, edge_map={right_qubit0: self.left_qubit1, right_qubit1: self.left_qubit4, right_clbit0: self.left_clbit1, right_clbit1: self.left_clbit0})┌───┐ ┌─────┐┌─┐ lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├┤M├ ├───┤ ┌─┴─┐└─┬─┬─┘└╥┘ lqr_1_1: ───┤ X ├─── rqr_1: ┤ X ├──┤M├───╫─ ┌──┴───┴──┐ └───┘ └╥┘ ║ lqr_1_2: ┤ U1(0.1) ├ + rcr_0: ════════╬════╩═ = └─────────┘ ║ lqr_2_0: ─────■───── rcr_1: ════════╩══════ ┌─┴─┐ lqr_2_1: ───┤ X ├─── └───┘ lcr_0: ═══════════ lcr_1: ═══════════ ┌───┐ lqr_1_0: ───┤ H ├────────────────── ├───┤ ┌─────┐┌─┐ lqr_1_1: ───┤ X ├─────■──┤ Tdg ├┤M├ ┌──┴───┴──┐ │ └─────┘└╥┘ lqr_1_2: ┤ U1(0.1) ├──┼──────────╫─ └─────────┘ │ ║ lqr_2_0: ─────■───────┼──────────╫─ ┌─┴─┐ ┌─┴─┐ ┌─┐ ║ lqr_2_1: ───┤ X ├───┤ X ├──┤M├───╫─ └───┘ └───┘ └╥┘ ║ lcr_0: ═══════════════════╩════╬═ ║ lcr_1: ════════════════════════╩═ -
Les backends fictifs de
qiskit.test.mockdisposent désormais d'une méthoderun()fonctionnelle qui renvoie des résultats similaires à ceux des appareils réels. Siqiskit-aerest installé, une simulation sera exécutée avec un modèle de bruit construit à partir de l'instantané de l'appareil dans le faux backend. Dans le cas contraire,qiskit.providers.basicaer.QasmSimulatorPysera utilisé pour effectuer une simulation idéale. En outre, si une expérience sur les impulsions est transmise àrunet que qiskit-aer est installé,PulseSimulatorsera utilisé pour simuler les calendriers des impulsions. -
La
qiskit.result.Result()méthodeget_counts()renvoie désormais une liste de tous les comptages disponibles lorsqu'il y a plusieurs circuits dans un travail. Cela fonctionne lorsqueget_counts()est appelé sans arguments.La principale raison d'être de cette fonction était de présenter tous les résultats de plusieurs circuits dans le même histogramme. Par exemple, il est désormais possible de faire quelque chose comme :
from qiskit import execute from qiskit import QuantumCircuit from qiskit.providers.basicaer import BasicAer from qiskit.visualization import plot_histogram sim = BasicAer.get_backend('qasm_simulator') qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() result = execute([qc, qc, qc], sim).result() plot_histogram(result.get_counts()) -
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 inclus dans les visualisations de circuits pour tous les backends. Par exemple :from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', initial_state=True) -
Il est désormais possible d'insérer un appelable dans un
qiskit.pulse.InstructionScheduleMapqui renvoie un nouveauqiskit.pulse.Schedulelorsqu'il est appelé avec des paramètres. Par exemple :def test_func(x): sched = Schedule() sched += pulse_lib.constant(int(x), amp_test)(DriveChannel(0)) return sched inst_map = InstructionScheduleMap() inst_map.add('f', (0,), test_func) output_sched = inst_map.get('f', (0,), 10) assert output_sched.duration == 10 -
Deux nouvelles classes de portails,
qiskit.extensions.iSwapGateetqiskit.extensions.DCXGate, ainsi que leursQuantumCircuitméthodesiswap()etdcx()ont été ajoutées aux extensions standard. Ces portes, qui sont localement équivalentes les unes aux autres, peuvent être utilisées pour mettre en œuvre des interactions XY particulières. Une brève motivation pour ces portes peut être trouvée dans : arxiv.org/abs/quant-ph/0209035 -
La classe
qiskit.providers.BaseJobdispose désormais d'une nouvelle méthodewait_for_final_state()qui demande l'état de la tâche jusqu'à ce qu'elle atteigne un état final (tel queDONEouERROR). Cette méthode prend également une optioncallbackkwarg qui prend un Python callable qui sera appelé à chaque itération de la boucle d'interrogation. -
Les attributs
search_widthetsearch_depthde la passeqiskit.transpiler.passes.LookaheadSwappeuvent désormais être définis lors de l'initialisation de la passe. Un espace de recherche plus large peut souvent conduire à des circuits plus optimisés, au prix d'un temps d'exécution plus long. -
Le nombre de qubits dans
BackendConfigurationest maintenant accessible par la propriéténum_qubits. Auparavant, il n'était accessible que par l'intermédiaire de l'attributn_qubits. -
Deux nouvelles méthodes,
angles()etangles_and_phase()ont été ajoutées à la classeqiskit.quantum_info.OneQubitEulerDecomposeront été ajoutées à la classe Ces méthodes renverront les paramètres pertinents sans validation, et l'appel à l'objetOneQubitEulerDecomposereffectuera la synthèse complète avec validation. -
Une base de décomposition
RRa été ajoutée à la base de décomposition pour décomposer une unité arbitraire en deux circuitsqiskit.quantum_info.OneQubitEulerDecomposerpour décomposer une unité arbitraire 2x2 en un circuit à deuxRGate. -
Ajoute la possibilité de définir
qargspour les objets qui sont des sous-classes de la classe abstraiteBaseOperator. Cela se fait en appelant l'objetop(qargs)(oùopest une classe d'opérateur) et renvoie une copie superficielle de l'objet original avec une propriété qargs définie. Lorsqu'un tel objet est utilisé avec la fonctioncompose()oudot()la valeur interne de qargs est utilisée lorsque la méthodeqargskwarg n'est pas utilisée. Cela permet de composer des sous-systèmes à l'aide d'opérateurs binaires, par exemple :from qiskit.quantum_info import Operator init = Operator.from_label('III') x = Operator.from_label('X') h = Operator.from_label('H') init @ x([0]) @ h([1]) -
Ajoute la classe
qiskit.quantum_info.Cliffordau module quantum_info. Cet opérateur est une représentation symplectique efficace d'un opérateur unitaire à N qubits du groupe de Clifford. Cette classe comprend uneto_circuit()pour la compilation en uneQuantumCircuitde portes de Clifford avec un nombre minimal de portes CX pour un maximum de 3 qubits. Elle fournit également une compilation générale pour N > 3 qubits, mais cette méthode n'est pas optimale pour le nombre de portes à deux qubits. -
Ajoute
qiskit.quantum_info.SparsePauliOpune classe d'opérateurs. Il s'agit d'une représentation efficace d'une matrice à N qubits qui est peu dense dans la base de Pauli et qui utilise une adresseqiskit.quantum_info.PauliTableet un vecteur de coefficients complexes pour sa structure de données.Cette classe prend en charge la plupart des fonctionnalités de la classe
qiskit.quantum_info.Operatorde sorte queSparsePauliOples objets peuvent être tensoriés, composés, multipliés scalairement, ajoutés et soustraits.Les tableaux Numpy ou les objets
Operatorpeuvent être convertis enSparsePauliOpà l'aide de la méthode :class:`~qiskit.quantum_info.SparsePauliOp.from_operator.SparsePauliOppeut être converti en une matrice csr_sparse ou en un tableau Numpy dense à l'aide de la méthodeto_matrixou vers un objetOperatoren utilisant la méthodeto_operatorméthode.A
SparsePauliOppeut être itéré sur ses composantes et coefficientsPauliTable, ses coefficients et ses étiquettes de chaînes de Pauli à l'aide de la méthodelabel_iter()et les composantes (denses ou éparses) de la matrice à l'aide de la méthodematrix_iter()méthode. -
Ajouter
qiskit.quantum_info.diamond_norm()fonction permettant de calculer la norme de diamant (norme de trace complètement bornée) d'un canal quantique. Ceci peut être utilisé pour calculer la distance entre deux canaux quantiques en utilisantdiamond_norm(chan1 - chan2). -
Une nouvelle classe
qiskit.quantum_info.PauliTablea été ajoutée. Il s'agit d'une représentation symplectique efficace d'une liste d'opérateurs de Pauli à N-qubits. Voici quelques caractéristiques de cette classe :PauliTablepeuvent être composés, et tensored qui renverra un objetPauliTableavec la combinaison de l'opération (compose(),dot(),expand(),tensor()) entre chaque élément du premier tableau, avec chaque élément du second tableau.- L'addition de deux tableaux agit comme une concaténation de liste des termes de chaque tableau (
+). - Les tableaux de Pauli peuvent être triés par ordre lexicographique (produit tensoriel) ou par poids de Pauli (
sort()). - Les éléments en double peuvent être comptés et supprimés (
unique()). - Le site PauliTable peut être parcouru soit dans sa représentation native de tableau booléen symplectique, soit sous forme d'étiquettes de chaînes de Pauli (
label_iter()), soit sous forme de tableau Numpy dense ou de matrices CSR clairsemées (matrix_iter()). - Vérification de la commutation entre des éléments de la table de Pauli et une autre table de Pauli (
commutes()) ou de Pauli (commutes_with_all())
Voir la documentation de l'API de la classe
qiskit.quantum_info.PauliTablepour plus de détails. -
Ajoute la classe
qiskit.quantum_info.StabilizerTable. Il s'agit d'une sous-classe de la classeqiskit.quantum_info.PauliTablequi comprend un vecteur de phase booléen ainsi que le tableau de la table de Pauli. Il s'agit d'une liste d'opérateurs stabilisateurs qui sont des opérateurs de Pauli réels avec un coefficient de +1 ou -1. Les matrices des stabilisateurs étant réelles, la matrice des étiquettes de"Y"est définie comme suit :[[0, 1], [-1, 0]]. Voir la documentation de l'API pour plus d'informations. -
Ajoute
qiskit.quantum_info.pauli_basis()qui renvoie une base de Pauli à N qubits sous la forme d'un objetqiskit.quantum_info.PauliTable. L'ordre de cette base peut être soit lexicographique standard (produit tensoriel), soit le nombre de termes de Pauli non identiques (poids). -
Ajoute
qiskit.quantum_info.ScalarOpclasse d'opérateur qui représente un multiple scalaire d'un opérateur d'identité. Elle peut être utilisée pour initialiser une identité sur des sous-systèmes de dimension arbitraire et sera implicitement convertie en d'autres sous-classes deBaseOperator(telles qu'une identité de typeqiskit.quantum_info.Operatorouqiskit.quantum_info.SuperOp) lorsqu'elle est composée ou ajoutée à ces sous-classes.Exemple : Opérateur d'identité
from qiskit.quantum_info import ScalarOp, Operator X = Operator.from_label('X') Z = Operator.from_label('Z') init = ScalarOp(2 ** 3) # 3-qubit identity op = init @ X([0]) @ Z([1]) @ X([2]) # Op XZX -
Une nouvelle méthode,
reshape()a été ajoutée à la classeqiskit.quantum_innfo.Operator. Elle renvoie une copie peu profonde d'une sous-classe d'opérateur dont les dimensions d'entrée ou de sortie du sous-système ont été remodelées. Les dimensions combinées de tous les sous-systèmes doivent être identiques à celles de l'opérateur d'origine, faute de quoi une exception sera levée. -
Ajoute
qiskit.quantum_info.random_clifford()pour générer un opérateur aléatoireqiskit.quantum_info.Cliffordopérateur. -
Ajouter
qiskit.quantum_info.random_quantum_channel()pour générer un canal quantique aléatoire de rang fixe dans l'espaceChoi-rang fixe dans la représentationStinespringreprésentation. -
Ajouter
qiskit.quantum_info.random_hermitian()pour générer un Hermitien aléatoireOperator. -
Ajouter
qiskit.quantum_info.random_statevector()pour générer un fichier aléatoireStatevector. -
Ajoute
qiskit.quantum_info.random_pauli_table()pour générer unqiskit.quantum_info.PauliTablealéatoire. -
Ajoute
qiskit.quantum_info.random_stabilizer_table()pour générer unqiskit.quantum_info.StabilizerTablealéatoire. -
Ajouter un attribut
num_qubitsaux classesqiskit.quantum_info.StateVectoretqiskit.quantum_info.DensityMatrixclasses. Elle renvoie le nombre de qubits pour les états à N qubits et renvoieNonepour les états non qubits. -
Ajoute
to_dict()etto_dict()pour convertirqiskit.quantum_info.Statevectoretqiskit.quantum_info.DensityMatrixen dictionnaire de notation Bra-Ket.Exemple
from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.to_dict())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.to_dict()) -
Ajoute
probabilities()etprobabilities()àqiskit.quantum_info.Statevectoretqiskit.quantum_info.DensityMatrixqui renvoient un tableau de probabilités de résultats de mesures dans la base de calcul pour les sous-systèmes spécifiés.Exemple
from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.probabilities())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.probabilities()) -
Ajoute
probabilities_dict()etprobabilities_dict()àqiskit.quantum_info.Statevectoretqiskit.quantum_info.DensityMatrixqui renvoient un tableau de type dictionnaire de comptage des probabilités des résultats de mesure dans la base de calcul pour les sous-systèmes spécifiés.from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.probabilities_dict())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.probabilities_dict()) -
Ajouter
sample_counts()etsample_memory()aux méthodesStatevectoretDensityMatrixpour l'échantillonnage des résultats des mesures sur les sous-systèmes.Exemple :
Générer un dictionnaire de comptages par échantillonnage à partir d'un vecteur d'état
from qiskit.quantum_info import Statevector psi = Statevector.from_label('+0') shots = 1024 # Sample counts dictionary counts = psi.sample_counts(shots) print('Measure both:', counts) # Qubit-0 counts0 = psi.sample_counts(shots, [0]) print('Measure Qubit-0:', counts0) # Qubit-1 counts1 = psi.sample_counts(shots, [1]) print('Measure Qubit-1:', counts1)Retourne le tableau des résultats des mesures pour chaque échantillon
from qiskit.quantum_info import Statevector psi = Statevector.from_label('-1') shots = 10 # Sample memory mem = psi.sample_memory(shots) print('Measure both:', mem) # Qubit-0 mem0 = psi.sample_memory(shots, [0]) print('Measure Qubit-0:', mem0) # Qubit-1 mem1 = psi.sample_memory(shots, [1]) print('Measure Qubit-1:', mem1) -
Ajoute une méthode
measure()à la méthodeqiskit.quantum_info.Statevectoretqiskit.quantum_info.DensityMatrixaux classes d'états quantiques. Cela permet d'échantillonner un seul résultat de mesure à partir des sous-systèmes spécifiés et de réduire le vecteur d'état à l'état de la base de calcul après la mesure. Par exemplefrom qiskit.quantum_info import Statevector psi = Statevector.from_label('+1') # Measure both qubits outcome, psi_meas = psi.measure() print("measure([0, 1]) outcome:", outcome, "Post-measurement state:") print(psi_meas) # Measure qubit-1 only outcome, psi_meas = psi.measure([1]) print("measure([1]) outcome:", outcome, "Post-measurement state:") print(psi_meas) -
Ajoute une méthode
reset()à la méthodeqiskit.quantum_info.Statevectoretqiskit.quantum_info.DensityMatrixaux classes d'états quantiques. Cela permet de réinitialiser certains ou tous les sous-systèmes à l'état . Par exemplefrom qiskit.quantum_info import Statevector psi = Statevector.from_label('+1') # Reset both qubits psi_reset = psi.reset() print("Post reset state: ") print(psi_reset) # Reset qubit-1 only psi_reset = psi.reset([1]) print("Post reset([1]) state: ") print(psi_reset) -
Une nouvelle fonction de visualisation
qiskit.visualization.visualize_transition()pour visualiser les transitions de porte d'un seul qubit a été ajoutée. Il prend en compte un circuit à qubit unique et renvoie une animation des transitions d'état des qubits sur une sphère de Bloch. Pour utiliser cette fonction, vous devez avoir installé les dépendances et configuré globalement un animateur matplotlib. Vous pouvez vous référer à la documentation de matplotlib pour plus de détails à ce sujet. Cependant, dans le cas par défaut, il suffit de s'assurer que FFmpeg est installé pour utiliser cette fonction.Il prend en charge les circuits comportant les portes suivantes :
HGateXGateYGateZGateRXGateRYGateRZGateSGateSdgGateTGateTdgGateU1Gate
Par exemple :
from qiskit.visualization import visualize_transition from qiskit import * qc = QuantumCircuit(1) qc.h(0) qc.ry(70,0) qc.rx(90,0) qc.rz(120,0) visualize_transition(qc, fpg=20, spg=1, trace=True) -
execute()a un nouveau kwargschedule_circuit. Le réglage deschedule_circuit=Truepermet de programmer le circuit en une seule foisSchedule. Cela permet aux utilisateurs qui construisent des objetsqiskit.circuit.QuantumCircuitd'utiliser des méthodes d'ordonnancement personnalisées, telles que les méthodesas_late_as_possibleetas_soon_as_possible. Par exemple :job = execute(qc, backend, schedule_circuit=True, scheduling_method="as_late_as_possible") -
Une nouvelle variable d'environnement
QISKIT_SUPPRESS_PACKAGING_WARNINGSpeut être mise àYouyqui supprimera les avertissements à propos deqiskit-aeretqiskit-ibmq-providerqui ne sont pas installés au moment de l'importation. Ceci est utile pour les utilisateurs qui n'utilisent que qiskit-terra (ou pas qiskit-aer et/ou qiskit-ibmq-provider) et les avertissements ne sont pas une indication d'un problème potentiel d'empaquetage. Vous pouvez définir la variable d'environnement àNounpour vous assurer que les avertissements sont toujours activés même si le fichier de configuration de l'utilisateur est configuré pour les désactiver. -
Une nouvelle option de fichier de configuration utilisateur,
suppress_packaging_warnings, a été ajoutée. Lorsqu'il est défini surtruedans le fichier de configuration de l'utilisateur, comme par exemple :[default] suppress_packaging_warnings = truecela supprimera les avertissements concernant
qiskit-aeretqiskit-ibmq-providerqui ne sont pas installés au moment de l'importation. Ceci est utile pour les utilisateurs qui n'utilisent que qiskit-terra (ou pas qiskit-aer et/ou qiskit-ibmq-provider) et les avertissements ne sont pas une indication d'un problème potentiel d'empaquetage. Si le fichier de configuration de l'utilisateur est configuré pour désactiver les avertissements, il est possible d'y déroger en définissantQISKIT_SUPPRESS_PACKAGING_WARNINGScommeNoun -
qiskit.compiler.transpile()a deux nouveaux kwargs,layout_methodetrouting_method. Ils vous permettent de sélectionner une méthode particulière pour le placement et le routage de circuits sur des architectures contraignantes. Par exemple :transpile(circ, backend, layout_method='dense', routing_method='lookahead')va s'exécuter
DenseLayoutla passe de mise en page etLookaheadSwapla passe de routage. -
Le style de construction des instructions Pulse a été considérablement simplifié.
Avec le style précédent,
Commands était appelé avec des canaux pour faire unInstruction. L'utilisation des commandes et des instructions a été un point de confusion. C'était le style précédent :sched += Delay(5)(DriveChannel(0)) sched += ShiftPhase(np.pi)(DriveChannel(0)) sched += SamplePulse([1.0, ...])(DriveChannel(0)) sched += Acquire(100)(AcquireChannel(0), MemorySlot(0))ou, de manière équivalente (bien que moins utilisée) :
sched += DelayInstruction(Delay(5), DriveChannel(0)) sched += ShiftPhaseInstruction(ShiftPhase(np.pi), DriveChannel(0)) sched += PulseInstruction(SamplePulse([1.0, ...]), DriveChannel(0)) sched += AcquireInstruction(Acquire(100), AcquireChannel(0), MemorySlot(0))Désormais, plutôt que de construire une commande et une instruction, chaque commande a été transférée dans une instruction :
sched += Delay(5, DriveChannel(0)) sched += ShiftPhase(np.pi, DriveChannel(0)) sched += Play(SamplePulse([1.0, ...]), DriveChannel(0)) sched += SetFrequency(5.5, DriveChannel(0)) # New instruction! sched += Acquire(100, AcquireChannel(0), MemorySlot(0)) -
Il existe maintenant une instruction
Playqui prend en compte la description d'une enveloppe d'impulsion et d'un canal. Il existe une nouvelle classePulsedans le sitepulse_lib, à partir de laquelle la description de l'enveloppe d'impulsion devrait être sous-classée.Par exemple :
Play(SamplePulse([0.1]*10), DriveChannel(0)) Play(ConstantPulse(duration=10, amp=0.1), DriveChannel(0))
Mise à niveau
-
La méthode
qiskit.dagcircuit.DAGNodepopqui était obsolète dans la version 0.9.0 a été supprimée. Si vous utilisez cette méthode, vous pouvez utiliser la déclarationdelou la fonctiondelattr()de Python pour effectuer la même tâche. -
Une nouvelle exigence facultative de visualisation, pygments, a été ajoutée. Il est utilisé pour mettre en évidence la syntaxe du code OpenQASM 2.0 dans les widgets Jupyter et, éventuellement, pour la méthode
qiskit.circuit.QuantumCircuit.qasm()méthode. Il doit être installé (avecpip install pygmentsoupip install qiskit-terra[visualization]) avant d'utiliser le widget%circuit_library_infodansqiskit.tools.jupyterou le kwargformatteddans la méthodeqasm()méthode. -
L'option pulse
bufferque l'on trouve dansqiskit.pulse.Channeletqiskit.pulse.Scheduleétait obsolète dans Terra 0.11.0 et a été supprimée. Pour ajouter un délai sur un canal ou dans une programmation, spécifiez-le explicitement dans votre programmation avec un délai :sched = Schedule() sched += Delay(5)(DriveChannel(0)) -
PulseChannelSpecqui était obsolète dans Terra 0.11.0, a été supprimée. Utilisez plutôt BackendConfiguration :config = backend.configuration() drive_chan_0 = config.drives(0) acq_chan_0 = config.acquires(0)ou faire référence au canal directement, par exemple
DriveChannel(index). -
Le chemin d'importation était obsolète dans Terra 0.10.0 et a été supprimé : pour
PulseChannel,DriveChannel,MeasureChannel, etControlChannel, utilisezfrom qiskit.pulse.channels import Xà la place defrom qiskit.pulse.channels.pulse_channels import X. -
La passe
qiskit.transpiler.passes.CSPLayout(introduite dans la version 0.11.0 ) a été ajoutée au gestionnaire de passes prédéfinies pour les niveaux d'optimisation 2 et 3. Pour le niveau 2, la limite d'appel est fixée à 1 000 et le délai d'attente à 10 secondes. Pour le niveau 3, la limite d'appels est de 10 000 et le délai d'attente est de 1 minute.Maintenant que la passe est incluse dans les gestionnaires de passes prédéfinis, le paquet python-constraint n'est plus une dépendance optionnelle et a été ajouté à la liste des exigences.
-
La classe
TranspileConfigqui était précédemment utilisée pour définir la configuration de l'exécution d'unqiskit.transpiler.PassManagera été supprimée et remplacée par une nouvelle classeqiskit.transpile.PassManagerConfig. Ce nouveau cours a été structuré de manière à ne contenir que les informations nécessaires à la construction d'unPassManager. Les attributs de cette classe sont les suivantsinitial_layoutbasis_gatescoupling_mapbackend_propertiesseed_transpiler
-
La fonction
transpile_circuitdansqiskit.transpilera été supprimée. Pour transposer un circuit avec unPassManagerpersonnalisé, vous devez maintenant utiliser la méthoderun()de l'objet :class:~qiskit.transpiler.PassManager`. -
La
QuantumCircuitméthodedraw()etqiskit.visualization.circuit_drawer()n'incluront plus l'état initial inclus par défaut dans les visualisations. Si vous souhaitez conserver l'état initial dans la visualisation de sortie, vous devez définir le kwarginitial_statesurTrue. Par exemple, en cours d'exécution :from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='text')L'état initial n'est plus pris en compte. Si vous souhaitez le conserver, vous pouvez vous présenter :
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='text', initial_state=True) -
qiskit.compiler.transpile()(etqiskit.execute.execute(), qui utilisetranspileen interne) lèvera désormais une erreur lorsque le kwargpass_managerest défini et qu'une valeur est définie pour d'autres kwargs déjà définis dans un objet instanciéPassManagerinstancié. Auparavant, ces kwargs conflictuels étaient ignorés et les valeurs de l'instancePassManagerétaient utilisées. Par exemple :from qiskit.circuit import QuantumCircuit from qiskit.transpiler.pass_manager_config import PassManagerConfig from qiskit.transpiler import preset_passmanagers from qiskit.compiler import transpile qc = QuantumCircuit(5) config = PassManagerConfig(basis_gates=['u3', 'cx']) pm = preset_passmanagers.level_0_pass_manager(config) transpile(qc, optimization_level=3, pass_manager=pm)soulèvera désormais une erreur, alors qu'avant cette version, la valeur de
pmétait utilisée silencieusement et la valeur du kwargoptimization_levelétait ignorée. Les kwargstranspileconcernés sont les suivants :optimization_levelbasis_gatescoupling_mapseed_transpilerbackend_propertiesinitial_layoutlayout_methodrouting_methodbackend
-
Les
Operator,Clifford,SparsePauliOp,,PauliTable,StabilizerTable, les classes d'opérateurs ont une méthodecallajoutée qui leur permet d'assigner un qargs à l'opérateur pour l'utiliser avec la méthodecompose(),dot(),evolve(),\+\, et-. -
La méthode d'addition de la classe
qiskit.quantum_info.Operatoraccepte désormais un kwargqargpour permettre d'ajouter un opérateur plus petit à un plus grand en supposant des identités dans les autres sous-systèmes (comme pourqargsdans les sous-systèmescompose()etdot()). Cela permet d'ajouter des sous-systèmes en utilisant la méthode d'appel comme pour la composition. Ce support est ajouté à toutes les sous-classes de BaseOperator (ScalarOp,Operator,QuantumChannel).Par exemple :
from qiskit.quantum_info import Operator, ScalarOp ZZ = Operator.from_label('ZZ') # Initialize empty Hamiltonian n_qubits = 10 ham = ScalarOp(2 ** n_qubits, coeff=0) # Add 2-body nearest neighbour terms for j in range(n_qubits - 1): ham = ham + ZZ([j, j+1]) -
La classe
BaseOperatora été mise à jour afin que l'addition, la soustraction et la multiplication scalaire ne soient plus des méthodes abstraites. Cela signifie qu'il n'est plus nécessaire de les mettre en œuvre dans les sous-classes si elles ne sont pas prises en charge. La classe de base émettra un messageNotImplementedErrorsi les méthodes ne sont pas définies. -
La fonction
qiskit.quantum_info.random_density_matrix()renvoie maintenant un objet aléatoireDensityMatrixaléatoire. Dans les versions précédentes, il renvoyait un tableau numpy. -
Les
qiskit.quantum_info.Statevectoretqiskit.quantum_info.DensityMatrixne copient plus le tableau d'entrée s'il est déjà du bon type. -
fastjsonschema est ajouté comme dépendance. Cette méthode est utilisée pour accélérer la validation des dictionnaires qobj par rapport au schéma JSON lorsque la méthode
to_dict()est appelée sur les objets qobj avec le mot-clévalidatefixé àTrue. -
Les classes de construction qobj dans
qiskit.qobjne seront plus validées par rapport au jsonschema qobj par défaut. Il s'agit notamment des classes suivantes :qiskit.qobj.QasmQobjInstructionqiskit.qobj.QobjExperimentHeaderqiskit.qobj.QasmQobjExperimentConfigqiskit.qobj.QasmQobjExperimentqiskit.qobj.QasmQobjConfigqiskit.qobj.QobjHeaderqiskit.qobj.PulseQobjInstructionqiskit.qobj.PulseQobjExperimentConfigqiskit.qobj.PulseQobjExperimentqiskit.qobj.PulseQobjConfigqiskit.qobj.QobjMeasurementOptionqiskit.qobj.PulseLibraryItemqiskit.qobj.QasmQobjInstructionqiskit.qobj.QasmQobjExperimentConfigqiskit.qobj.QasmQobjExperimentqiskit.qobj.QasmQobjConfigqiskit.qobj.QasmQobjqiskit.qobj.PulseQobj
Si vous comptez sur cette validation ou si vous souhaitez les valider par rapport au schéma qobj, vous pouvez le faire en définissant le kwarg
validatesurTrueonto_dict()de l'une ou l'autre des classes Qobj de haut niveauQasmQobjouPulseQobj. Par exemple :qui validera le dictionnaire de sortie par rapport au jsonschema Qobj.
-
Le dictionnaire de sortie de
qiskit.qobj.QasmQobj.to_dict()etqiskit.qobj.PulseQobj.to_dict()n'est plus dans un format permettant une sérialisation directe en json, comme le prévoit l'API d'IBMQ. Ces objets Qobj sont le format actuel que nous utilisons pour transmettre les expériences aux fournisseurs/backends et, bien que le fait de disposer d'un format de dictionnaire pouvant être transmis directement à l'API IBMQ ait été modérément utile pourqiskit-ibmq-provider, il a rendu les choses plus difficiles pour les autres fournisseurs. Surtout pour les fournisseurs qui enveloppent les simulateurs locaux. À l'avenir, les définitions de ce qui est transmis entre les fournisseurs et le format de requête de l'API IBMQ seront davantage découplées (d'une manière rétrocompatible), ce qui devrait alléger le fardeau de l'écriture des fournisseurs et des backends.En pratique, la seule différence fonctionnelle entre la sortie de ces méthodes et les versions précédentes est que les nombres complexes sont représentés avec le type
complexet que les tableaux numpy ne sont plus convertis silencieusement en liste. Si vous appeliez auparavantjson.dumps()directement sur la sortie deto_dict()après cette version, un encodeur json personnalisé sera nécessaire pour gérer ces cas. Par exemple :import json from qiskit.circuit import ParameterExpression from qiskit import qobj my_qasm = qobj.QasmQobj( qobj_id='12345', header=qobj.QobjHeader(), config=qobj.QasmQobjConfig(shots=1024, memory_slots=2, max_credits=10), experiments=[ qobj.QasmQobjExperiment(instructions=[ qobj.QasmQobjInstruction(name='u1', qubits=[1], params=[0.4]), qobj.QasmQobjInstruction(name='u2', qubits=[1], params=[0.4, 0.2]) ]) ] ) qasm_dict = my_qasm.to_dict() class QobjEncoder(json.JSONEncoder): """A json encoder for pulse qobj""" def default(self, obj): # Convert numpy arrays: if hasattr(obj, 'tolist'): return obj.tolist() # Use Qobj complex json format: if isinstance(obj, complex): return (obj.real, obj.imag) if isinstance(obj, ParameterExpression): return float(obj) return json.JSONEncoder.default(self, obj) json_str = json.dumps(qasm_dict, cls=QobjEncoder)générera une chaîne json de la même manière que
json.dumps(my_qasm.to_dict())l'a fait dans les versions précédentes. -
CmdDefest obsolète depuis Terra 0.11.0 et a été supprimée. Veuillez continuer à utiliserInstructionScheduleMapau lieu de -
Les méthodes
cmdsetcmd_qubitsdansInstructionScheduleMapsont obsolètes depuis Terra 0.11.0 et ont été supprimées. Veuillez utiliserinstructionsetqubits_with_instructionà la place. -
PulseDefaults ont rapporté
qubit_freq_estetmeas_freq_esten Hz plutôt qu'en GHz depuis le lancement de Terra 0.11.0. L'avertissement qui notifiait ce changement a été supprimé. -
Le support précédemment déprécié (dans la version 0.11.0 ) pour le passage dans les paramètres de types,, (nœud AST QASM) et a été supprimé
qiskit.circuit.Instructionde typessympy.Basic,sympy.Expr,qiskit.qasm.node.node.Node(nœud AST QASM) etsympy.Matrixa été supprimée. Les types de paramètres d'instruction pris en charge sont les suivants :intfloatcomplexstrlistnp.ndarrayqiskit.circuit.ParameterExpression
-
Les propriétés suivantes de
BackendConfiguration:dtdtmrep_time
ont toutes des unités de secondes. Avant la publication de 0.11.0,
dtetdtm, les unités étaient des nanosecondes. Avant la publication de 0.12.0,rep_timeavait des unités de microsecondes. Les avertissements prévenant les utilisateurs de ces changements ont été retirés du siteBackendConfiguration. -
Une nouvelle exigence a été ajoutée à la liste des exigences, retworkx. Il s'agit d'une bibliothèque de graphes sous licence Apache 2.0 dont l'API est similaire à celle de networkx et qui est utilisée pour accélérer considérablement les opérations dans le cadre du transpileur
qiskit.dagcircuit.DAGCircuitdans le cadre du transpileur. Il existe des binaires publiés sur PyPI pour toutes les plateformes supportées par Qiskit Terra mais si vous utilisez une plateforme où il n'y a pas de binaires précompilés publiés, référez-vous à la documentation de retworkx pour des instructions sur l'installation par pip à partir de sdist.Si vous rencontrez des problèmes avec le transpiler ou la classe DAGCircuit dans le cadre de la transition, vous pouvez revenir à l'ancienne implémentation de networkx en définissant la variable d'environnement
USE_RETWORKXsurN. Cette option sera supprimée dans la version 0.14.0.
Remarques concernant la dépréciation
-
Le fait de passer les données au constructeur de
qiskit.dagcircuit.DAGNodesous la forme d'un dictionnaire argdata_dictest obsolète et sera supprimé dans une prochaine version. Au lieu de cela, vous devez maintenant passer les champs en tant que kwargs au constructeur. Par exemple, le comportement précédent de :from qiskit.dagcircuit import DAGNode data_dict = { 'type': 'in', 'name': 'q_0', } node = DAGNode(data_dict)devrait maintenant être :
from qiskit.dagcircuit import DAGNode node = DAGNode(type='in', name='q_0') -
La dénomination des objets et des méthodes du portail a été mise à jour pour être plus cohérente. Les modifications suivantes ont été apportées :
- Les portes de Pauli ont toutes une seule lettre majuscule (
I,X,Y,Z) - Les portes de Pauli paramétrées (c'est-à-dire les rotations) sont précédées de la lettre majuscule
R(RX,RY,RZ) - Une version contrôlée précède la lettre majuscule
C(CX,CRX,CCX) - Les portes sont nommées en fonction de leur action, et non de leurs noms alternatifs (
CCX, et nonToffoli)
Les anciens noms sont obsolètes et seront supprimés dans une prochaine version. Voici une liste des modifications indiquant l'ancienne et la nouvelle classe, l'attribut du nom et les méthodes. Si une nouvelle colonne est vide, il n'y a pas de changement.
Ancienne classeNouvelle classeAttribut de l'ancien nomNouvel attribut de nomAncienneqiskit.circuit.QuantumCircuitméthodeNouvelleqiskit.circuit.QuantumCircuitméthodeToffoliGateCCXGateccxccx()ettoffoli()CrxGateCRXGatecrxcrx()CryGateCRYGatecrycry()CrzGateCRZGatecrzcrz()FredkinGateCSwapGatecswapcswap()etfredkin()Cu1GateCU1Gatecu1cu1()Cu3GateCU3Gatecu3cu3()CnotGateCXGatecxcx()etcnot()CyGateCYGatecycy()CzGateCZGateczcz()DiagGateDiagonalGatediagdiagonaldiag_gatediagonal()IdGateIGateidideni()etid()Isometryisoisometryiso()isometry()etiso()UCGUCGatemultiplexerucguc()UCRotUCPauliRotGateUCXUCRXGateucrotXucrxucxucrx()UCYUCRYGateucrotyucryucyucry()UCZUCRZGateucrotzucrzuczucrz() - Les portes de Pauli ont toutes une seule lettre majuscule (
-
Le kwarg
periodpour la fonctionsquare(),sawtooth(), ettriangle()dansqiskit.pulse.pulse_libest maintenant déprécié et sera supprimé dans une prochaine version. Au lieu de cela, vous devez maintenant utiliserfreqkwarg pour régler la fréquence. -
Les méthodes
DAGCircuit.compose_back()etDAGCircuit.extend_back()sont obsolètes et seront supprimées dans une prochaine version. Vous devez plutôt utiliser la méthodeqiskit.dagcircuit.DAGCircuit.compose()qui est une méthode plus générale et plus souple offrant les mêmes fonctionnalités. -
Le kwarg
callbackdu constructeur de la classeqiskit.transpiler.PassManagera été déprécié et sera supprimé dans une prochaine version. Au lieu de le définir au niveau de l'objet lors de la création, il doit maintenant être défini en tant que paramètre kwarg dans la méthodeqiskit.transpiler.PassManager.run()méthode. -
Les mots-clés
n_qubitsetnumberofqubitssont obsolètes dans Terra et remplacés parnum_qubits. Les anciens noms seront supprimés dans une prochaine version. Les objets concernés par cette modification sont énumérés ci-dessous :ClasseAncienne méthodeNouvelle méthodeQuantumCircuitn_qubitsnum_qubits()Paulinumberofqubitsnum_qubits()FonctionVieil argumentNouvel argumentrandom_circuit()n_qubitsnum_qubitsMSGaten_qubitnum_qubits -
La fonction
qiskit.quantum_info.synthesis.euler_angles_1qest désormais obsolète. Elle a été remplacée par la classeqiskit.quantum_info.OneQubitEulerDecomposerqui offre la même fonctionnalité :OneQubitEulerDecomposer().angles(mat) -
Le kwarg
pass_managerpour leqiskit.compiler.transpile()a été déprécié et sera supprimé dans une prochaine version. Par la suite, la meilleure façon de transpiler un circuit avec un objet personnalisé est d'utiliser l'objet personnaliséPassManagerest d'utiliser la méthoderun()de l'objetPassManager. -
La fonction
qiskit.quantum_info.random_state()est obsolète et sera supprimée dans une prochaine version. Au lieu de cela, vous devez utiliser la fonctionqiskit.quantum_info.random_statevector()fonction. -
Les méthodes
add,subtract, etmultiplyde l'applicationqiskit.quantum_info.Statevectoretqiskit.quantum_info.DensityMatrixsont obsolètes et seront supprimées dans une prochaine version. Vous devriez plutôt utiliser les opérateurs binaires+,-,*. -
Supprime
qiskit.quantum_info.Statevector.to_counts(),qiskit.quantum_info.DensityMatrix.to_counts(), etqiskit.quantum_info.counts.state_to_counts(). Ces fonctions sont remplacées par les méthodes de la classeqiskit.quantum_info.Statevector.probabilities_dict()etqiskit.quantum_info.DensityMatrix.probabilities_dict(). -
SamplePulseetParametricPulses (par exempleGaussian) sont maintenant des sous-classes dePulseet ont été déplacées versqiskit.pulse.pulse_lib. Le chemin précédent viapulse.commandsest déprécié et sera supprimé dans une prochaine version. -
DelayInstructiona été déprécié et remplacé parDelay. Cette nouvelle instruction a été reprise de la précédenteCommandDelay. Le modèle de migration est le suivant :Delay(<duration>)(<channel>) -> Delay(<duration>, <channel>) DelayInstruction(Delay(<duration>), <channel>) -> Delay(<duration>, <channel>)Jusqu'à la fin de la période de dépréciation, l'ancienne syntaxe
Delayd'appel d'une commande sur un canal sera également prise en charge :Delay(<phase>)(<channel>)La nouvelle instruction
Delayne prend pas en charge l'attributcommand. -
FrameChangeetFrameChangeInstructionont été dépréciés et remplacés parShiftPhase. Les changements sont les suivants :FrameChange(<phase>)(<channel>) -> ShiftPhase(<phase>, <channel>) FrameChangeInstruction(FrameChange(<phase>), <channel>) -> ShiftPhase(<phase>, <channel>)Jusqu'à la fin de la période de dépréciation, l'ancienne syntaxe FrameChange pour l'appel d'une commande sur un canal sera prise en charge :
ShiftPhase(<phase>)(<channel>) -
La méthode
calldeSamplePulseetParametricPulsea été supprimée. La migration se déroule comme suit :Pulse(<*args>)(<channel>) -> Play(Pulse(*args), <channel>) -
AcquireInstructiona été supprimée et remplacée parAcquire. Les changements sont les suivants :Acquire(<duration>)(<**channels>) -> Acquire(<duration>, <**channels>) AcquireInstruction(Acquire(<duration>), <**channels>) -> Acquire(<duration>, <**channels>)Jusqu'à la fin de la période de dépréciation, l'ancienne syntaxe Acquire, qui consiste à appeler la commande sur un canal, sera prise en charge :
Acquire(<duration>)(<**channels>)
Corrections des erreurs
-
La passe de transpiler
BarrierBeforeFinalMeasurementsinclus dans les niveaux de transpilation prédéfinis lors du ciblage d'un dispositif physique, insérait auparavant une barrière sur les seuls qubits mesurés. Dans certains cas, cela a permis au transpondeur d'insérer un échange après une opération de mesure, ce qui a rendu le circuit invalide pour les appareils actuels. La passe a été mise à jour pour que la barrière insérée couvre tous les qubits de l'appareil. Corrige #3937 -
Lors de l'extension d'une instance
QuantumCircuit(extension) avec un autre circuit (extension), le circuit est pris en référence. Si un circuit est prolongé par lui-même, cela conduit à une boucle infinie, car le destinataire et l'extension sont identiques. Ce problème a été résolu en copiant l'extension s'il s'agit du même objet que le bénéficiaire de l'extension. Corrige #3811 -
Correction d'un cas dans
qiskit.result.Result.get_counts()où les résultats d'une expérience ne pouvaient pas être référencés si l'expérience était initialisée en tant que Schedule sans nom. Corrige #2753 -
Auparavant, le remplacement des objets
Parameterdans un circuit par de nouveaux objets Parameter avant de décomposer un circuit, les valeurs substituées n'étaient pas correctement substituées dans les portes décomposées. Ce problème a été résolu de manière à ce que la liaison et la décomposition puissent se produire dans n'importe quel ordre. -
Le backend de sortie matplotlib pour la fonction
qiskit.visualization.circuit_drawer()fonction etqiskit.circuit.QuantumCircuit.draw()a été corrigé pour rendre correctementCU1Gategates. Corrige #3684 -
Un bogue dans
qiskit.circuit.QuantumCircuit.from_qasm_str()etqiskit.circuit.QuantumCircuit.from_qasm_file()lors du chargement de QASM avec des portes personnalisées a été corrigé. Chargement de ce QASM :OPENQASM 2.0; include "qelib1.inc"; gate rinv q {sdg q; h q; sdg q; h q; } qreg q[1]; rinv q[0];est équivalent au circuit suivant :
rinv_q = QuantumRegister(1, name='q') rinv_gate = QuantumCircuit(rinv_q, name='rinv') rinv_gate.sdg(rinv_q) rinv_gate.h(rinv_q) rinv_gate.sdg(rinv_q) rinv_gate.h(rinv_q) rinv = rinv_gate.to_instruction() qr = QuantumRegister(1, name='q') expected = QuantumCircuit(qr, name='circuit') expected.append(rinv, [qr[0]])Corrige #1566
-
Permettre aux instructions de circuits quantiques d'avoir des valeurs de paramètres de liste. Ce paramètre est utilisé dans Aer for expectation value snapshot parameters (paramètres d'instantané de la valeur d'attente), par exemple
params = [[1.0, 'I'], [1.0, 'X']]]pour . -
Auparavant, pour les circuits contenant des portes composites (celles créées par l'intermédiaire de
qiskit.circuit.QuantumCircuit.to_gate()ouqiskit.circuit.QuantumCircuit.to_instruction()ou leurs convertisseurs correspondants), la tentative de lier le circuit plus d'une fois avait pour conséquence que seule la première valeur de liaison était appliquée à tous les circuits lors de la transposition. Ce problème a été résolu de manière à ce que les valeurs fournies pour les liaisons suivantes soient correctement respectées.
Autres remarques
-
Les classes qasm et pulse qobj :
QasmQobjInstructionQobjExperimentHeaderQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQobjHeaderPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItemQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmQobjPulseQobj
de
qiskit.qobjont tous été réimplémentés sans utiliser la bibliothèque marsmallow. Ces nouvelles implémentations sont conçues pour être des remplacements immédiats (à l'exception de ce qui est indiqué dans les notes de mise à jour), mais les spécificités héritées de marshmallow peuvent ne pas fonctionner. Si vous constatez des incompatibilités, veuillez les signaler.
Aer 0.5.0
Ajouté
- Ajout d'un support pour la porte diagonale terra
- Ajout de la prise en charge des qobj paramétrés
Fixe
- Ajout de postfix pour linux sur Raspberry Pi
- Gérer les entrées de tableaux numpy à partir de qobj
Ignis 0.3.0
Ajouté
- documentation d'API
- CNOT-Dihedral randomized benchmarking (analyse comparative aléatoire)
- Module d'accréditation pour l'accréditation de sortie des appareils bruyants
- Calibrations d'impulsions pour les qubits uniques
- Discriminateur d'impulsions
- Circuits de vérification de l'intrication
- Tomographie des portes pour les ensembles de portes à un seul qubit
- Ajout de fonctions utilitaires d'évaluation aléatoire
calculate_1q_epg,calculate_2q_epgpour calculer l'erreur de 1 et 2 qubits par porte à partir de l'erreur par Clifford - Ajout de fonctions utilitaires d'évaluation aléatoire
calculate_1q_epc,calculate_2q_epcpour calculer l'erreur de 1 et 2 qubits par Clifford à partir de l'erreur par porte
Changé
- Prise en charge des étiquettes entières pour les qubits en tomographie
- Prise en charge des étiquettes entières pour l'atténuation des erreurs de mesure
Obsolète
- La fonction
twoQ_clifford_errorest obsolète. Utilisez plutôtcalculate_2q_epc. - Python 3.5 dans qiskit-ignis est obsolète. Le support sera supprimé à la date de fin de vie de la version de la communauté python en amont, qui est le 13/09/2020.
Aqua 0.6.5
Aucun changement
IBM 0.6.0 du fournisseur Q
Aucun changement