Skip to main content
IBM Quantum Platform

Qiskit 0.18 Versionshinweise


0.18.3

Terra- 0.13.0

Keine Änderung

Aer- 0.5.1

Anmerkungen zu Upgrades

  • Ändert die Art und Weise, wie Transpilationsdurchläufe in den C++-Controllerklassen gehandhabt werden, so dass jeder Durchlauf explizit aufgerufen werden muss. Dies ermöglicht eine bessere Anpassung, wann jeder Durchgang aufgerufen werden soll und mit welchen Parametern. Dies ermöglicht es insbesondere, je nach QasmController Simulationsmethode unterschiedliche Parameter für den Gate-Fusion-Optimierungsdurchlauf einzustellen.
  • Fügen Sie gate_length_units kwarg zu qiskit.providers.aer.noise.NoiseModel.from_device() hinzu, um benutzerdefinierte gate_lengths in der Geräuschmodellfunktion zu spezifizieren, um Einheitenumwandlungen für internen Code zu handhaben.
  • Hinzufügen des Controlled-Y ("cy")-Gatters zu den vom Stabilizer-Simulator unterstützten Gateset-Methoden.
  • Für Aer's Backend ist die jsonschema-Validierung von qobj-Eingabeobjekten aus terra nun opt-in statt standardmäßig aktiviert. Wenn Sie die Jsonschema-Validierung von qobj aktivieren möchten, setzen Sie den validate kwarg in der qiskit.providers.aer.QasmSimualtor.run() Methode für das Backend-Objekt auf True.

Fehlerkorrekturen

  • Entfernen Sie "extended_stabilizer" aus den automatisch ausgewählten Simulationsmethoden. Dies ist erforderlich, da die erweiterte Stabilisierungsmethode nicht exakt ist und für bestimmte Schaltungen falsche Ergebnisse liefern kann, wenn der Benutzer nicht weiß, wie er die Konfigurationsparameter optimieren kann.

    Die automatische Methode wählt jetzt nur noch die Methoden "Stabilisator", "Dichte_matrix" und "Zustandsvektor" aus. Wenn eine Nicht-Clifford-Schaltung ausgeführt wird, die zu groß für die statevector-Methode ist, wird eine Ausnahme ausgelöst, die vorschlägt, dass Sie stattdessen explizit die Methoden "extended_stabilizer" oder "matrix_product_state" verwenden könnten.

  • Die Controller-Klassen werden so korrigiert, dass der ReduceBarrier Transpilierungsdurchgang zuerst angewendet wird. Dadurch wird verhindert, dass Barrierebefehle das Abschneiden unbenutzter Qubits verhindern, wenn der einzige für sie definierte Befehl eine Barriere war.

  • Deaktiviert die Gatterfusion für die Matrixprodukt-Zustandssimulationsmethode, da dies in einigen Fällen zu Problemen mit falschen Ergebnissen geführt hat.

  • Behebung eines Fehlers bei der Umrechnung der Gatterzeiteinheit für das Bauteilrauschmodell mit thermischen Relaxationsfehlern und Gatterfehlern. Die Fehlerwahrscheinlichkeit des Depolarisationsfehlers wurde mit der Gate-Zeit in Mikrosekunden berechnet, während sie für die thermische Relaxation in Nanosekunden berechnet wurde. Dies führte dazu, dass kein depolarisierender Fehler angewendet wurde, da die falschen Einheiten das Gerät als kohärenzbegrenzt erscheinen lassen würden.

  • Behebung eines Fehlers bei der falschen Zusammensetzung von QuantumErrors, wenn die Qubits der zusammengesetzten Anweisungen unterschiedlich sind.

  • Behebung eines Problems, bei dem das "diagonale" Tor mit einer zu hohen Toleranz auf Einheitlichkeit geprüft wird. Dies führte dazu, dass Diagonalen, die aus Numpy-Funktionen erzeugt wurden, den Test oft nicht bestanden.

  • Die Optimierung der Schaltung zum Entfernen von Barrieren wird nun vor der Qubit-Trukation durchgeführt. Dies behebt ein Problem, bei dem Barrieren, die vom Terra-Transpiler über ansonsten inaktive Qubits eingefügt werden, verhindern, dass diese abgeschnitten werden.

Ignis- 0.3.0

Keine Änderung

Aqua- 0.6.6

Keine Änderung

IBM Q Anbieter 0.6.1

Keine Änderung


0.18.0

Terra- 0.13.0

Vorspiel

Die Version 0.13.0 enthält viele große Änderungen. Einige Highlights dieser Veröffentlichung sind:

Für den Transpiler haben wir die Graphenbibliothek, die zur Erstellung der qiskit.dagcircuit.DAGCircuit klasse, die die zugrunde liegende Datenstruktur für alle Operationen ist, auf retworkx umgestellt, um die Leistung erheblich zu verbessern. Die Geschwindigkeit der Umsetzung von Schaltkreisen sollte in der Version 0.13.0 deutlich höher sein als in früheren Versionen.

Die Art und Weise, in der die Pulsanweisungen aufgebaut sind, wurde erheblich vereinfacht. Jetzt sind Command s veraltet und ein einheitlicher Satz von Instruction s werden unterstützt.

Das Modul qiskit.quantum_info modul enthält mehrere neue Funktionen zur Erzeugung von Zufallsoperatoren (z.B. Cliffords und Quantenkanäle) und zur Berechnung der Diamantnorm von Quantenkanälen; Erweiterungen der Statevector und DensityMatrix um die Berechnung von Messwahrscheinlichkeiten und Stichprobenmessungen zu unterstützen, und mehrere neue Klassen basieren auf der symplektischen Darstellung von Pauli-Matrizen. Zu diesen neuen Klassen gehören Clifford-Operatoren (Clifford), N-Qubit-Matrizen, die in der Pauli-Basis spärlich sind (SparsePauliOp), Listen von Pauli-Matrizen (PauliTable) und Listen von Stabilisatoren (StabilizerTable).

Diese Version bietet auch eine erheblich verbesserte Dokumentation für Qiskit, einschließlich einer verbesserten Dokumentation für die qiskit.circuit, qiskit.pulse und qiskit.quantum_info module.

Außerdem wurde die Benennung von Gate-Objekten und QuantumCircuit methoden aktualisiert, um konsistenter zu sein. Dies hat dazu geführt, dass mehrere Klassen und Methoden im Zuge der Umstellung auf ein konsistenteres Benennungsschema veraltet sind.

Ausführliche Informationen zu allen Änderungen in dieser Version finden Sie in den detaillierten Versionshinweisen unten.

Neue Funktionen

  • Ein neues Modul für die Schaltungsbibliothek hinzugefügt qiskit.circuit.library. Hier werden Konstrukteure häufig verwendeter Schaltungen zu finden sein, die als Bausteine für größere Schaltungen oder Anwendungen verwendet werden können.

  • Die Klasse qiskit.providers.BaseJob hat vier neue Methoden:

    • done()
    • running()
    • cancelled()
    • in_final_state()

    Diese Methoden werden verwendet, um zu prüfen, ob sich ein Auftrag in einem bestimmten Auftragsstatus befindet.

  • Hinzufügen der Möglichkeit, die Kontrolle davon abhängig zu machen, dass sich ein Qubit im Grundzustand befindet. Der Zustand der Kontroll-Qubits wird durch eine ganze Zahl dargestellt. Zum Beispiel:

    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])

    Erzeugt ein Vier-Qubit-Gatter, bei dem das vierte Qubit umgedreht wird, wenn sich das erste Qubit im Grundzustand und das zweite und dritte Qubit im angeregten Zustand befinden. Wenn ctrl_state None ist, wird die Kontrolle davon abhängig gemacht, dass alle Kontrollbits erregt sind.

  • Ein neues Jupyter-Widget, %circuit_library_info , wurde hinzugefügt zu qiskit.tools.jupyter. Dieses Widget dient zur Visualisierung von Details zu Schaltungen, die aus der Schaltkreisbibliothek erstellt wurden. Zum Beispiel

    from qiskit.circuit.library import XOR
    import qiskit.tools.jupyter
    circuit = XOR(5, seed=42)
    %circuit_library_info circuit
  • Eine neue kwarg-Option, formatted , wurde hinzugefügt zu qiskit.circuit.QuantumCircuit.qasm() . Wenn sie auf True gesetzt wird, gibt die Methode eine syntaxmarkierte Version (unter Verwendung von pygments) auf stdout aus und gibt None zurück (was sich vom normalen Verhalten der Rückgabe des QASM-Codes als String unterscheidet).

  • Eine neue kwarg-Option, filename , wurde hinzugefügt zu qiskit.circuit.QuantumCircuit.qasm(). Wird ein Pfad angegeben, schreibt die Methode den QASM-Code in diese Datei. Die Ausgabe wird dann wie gewohnt fortgesetzt.

  • Eine neue Anweisung SetFrequency , die es dem Benutzer ermöglicht, die Frequenz der PulseChannel zu ändern. Dies geschieht auf folgende Weise:

    from qiskit.pulse import Schedule
    from qiskit.pulse import SetFrequency
    
    sched = pulse.Schedule()
    sched += SetFrequency(5.5e9, DriveChannel(0))

    In diesem Beispiel ist die Frequenz aller Impulse vor dem Befehl SetFrequency die Standardfrequenz und alle Impulse, die nach dem Befehl SetFrequency an den Antriebskanal Null angelegt werden, liegen bei 5.5 GHz. Benutzer von SetFrequency sollten etwaige Hardware-Einschränkungen berücksichtigen.

  • Eine neue Methode, assign_parameters() wurde der qiskit.circuit.QuantumCircuit klasse. Diese Methode akzeptiert ein Parameterwörterbuch, das sowohl Floats als auch Parameter-Objekte in einem einzigen Wörterbuch enthält. Mit anderen Worten: Diese neue Methode ermöglicht es Ihnen, Floats, Parameter oder beides in einem einzigen Wörterbuch zu binden.

    Auch durch die Verwendung der inplace kwarg kann es angegeben werden, können Sie optional die ursprüngliche Schaltung an Ort und Stelle zu ändern. Standardmäßig ist dies auf False eingestellt, und die Methode gibt eine Kopie des ursprünglichen Schaltkreises zurück.

  • Eine neue Methode num_nonlocal_gates() wurde der qiskit.circuit.QuantumCircuit klasse hinzugefügt. Diese Methode gibt die Anzahl der Gatter in einer Schaltung zurück, die 2 oder mehr Qubits enthalten. Diese Gates sind zeit- und fehleraufwändiger in der Umsetzung.

  • Die qiskit.circuit.QuantumCircuit methode iso() zum Hinzufügen eines Isometry Gatters zur Schaltung hat einen neuen Alias. Sie können jetzt anrufen qiskit.circuit.QuantumCircuit.isometry() zusätzlich zu iso anrufen.

  • Ein description -Attribut wurde der Klasse CouplingMap klasse hinzugefügt, um eine kurze Beschreibung für verschiedene Kopplungskarten (z. B. Vollkarte, Gitterkarte, Linienkarte usw.) zu speichern.

  • Eine neue Methode compose() wurde der Klasse DAGCircuit klasse hinzugefügt, um zwei Schaltkreise über ihre DAGs zusammenzusetzen.

    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:   ════════════════════════╩═
  • Die Mock-Backends in qiskit.test.mock haben jetzt eine funktionierende run() Methode, die ähnliche Ergebnisse wie die echten Geräte liefert. Wenn qiskit-aer installiert ist, wird eine Simulation mit einem Rauschmodell durchgeführt, das aus dem Geräte-Snapshot im Fake-Backend erstellt wird. Andernfalls, qiskit.providers.basicaer.QasmSimulatorPy verwendet, um eine ideale Simulation durchzuführen. Wenn ein Impulsexperiment an run übergeben wird und qiskit-aer installiert ist, wird PulseSimulator zur Simulation der Impulszeitpläne verwendet.

  • Die qiskit.result.Result() methode get_counts() gibt nun eine Liste aller verfügbaren Zählungen zurück, wenn mehrere Stromkreise in einem Auftrag vorhanden sind. Dies funktioniert, wenn get_counts() ohne Argumente aufgerufen wird.

    Bei dieser Funktion ging es vor allem darum, alle Ergebnisse aus mehreren Schaltkreisen in ein und demselben Histogramm darzustellen. Zum Beispiel ist es jetzt möglich, etwas zu tun wie:

    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())
  • Ein neuer kwarg, initial_state , wurde der Funktion qiskit.visualization.circuit_drawer() funktion und der QuantumCircuit methode draw(). Wenn diese Option auf True gesetzt ist, wird der Ausgangszustand in die Schaltkreisvisualisierung für alle Backends einbezogen. Zum Beispiel:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='mpl', initial_state=True)
  • Es ist nun möglich, eine Callable in eine qiskit.pulse.InstructionScheduleMap einzufügen, die ein neues qiskit.pulse.Schedule zurückgibt, wenn es mit Parametern aufgerufen wird. Zum Beispiel:

    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
  • Zwei neue Gatterklassen, qiskit.extensions.iSwapGate und qiskit.extensions.DCXGate, mit ihren QuantumCircuit methoden iswap() und dcx() wurden zu den Standarderweiterungen hinzugefügt. Diese Tore, die lokal gleichwertig sind, können zur Durchführung bestimmter XY-Interaktionen verwendet werden. Eine kurze Begründung für diese Gates findet sich in: arxiv.org/abs/quant-ph/0209035

  • Die Klasse qiskit.providers.BaseJob verfügt jetzt über eine neue Methode wait_for_final_state() , die den Auftragsstatus abfragt, bis der Auftrag einen endgültigen Status erreicht (z. B. DONE oder ERROR). Diese Methode nimmt auch eine optionale callback kwarg, die eine Python callable nimmt, die während jeder Iteration der Poll-Schleife aufgerufen wird.

  • Die Attribute search_width und search_depth des qiskit.transpiler.passes.LookaheadSwap passes sind jetzt beim Initialisieren des Passes einstellbar. Ein größerer Suchraum kann oft zu optimierteren Schaltungen führen, allerdings auf Kosten einer längeren Laufzeit.

  • Die Anzahl der Qubits in BackendConfiguration kann nun über die Eigenschaft num_qubits. Bisher war sie nur über das Attribut n_qubits zugänglich.

  • Zwei neue Methoden, angles() und angles_and_phase()wurden der Klasse qiskit.quantum_info.OneQubitEulerDecomposer klasse hinzugefügt. Diese Methoden geben die relevanten Parameter ohne Validierung zurück, und der Aufruf des OneQubitEulerDecomposer Objekts führt die vollständige Synthese mit Validierung durch.

  • Eine RR Zersetzungsbasis wurde hinzugefügt, um qiskit.quantum_info.OneQubitEulerDecomposer zur Zerlegung einer beliebigen 2x2 unitary in zwei RGate Schaltungen hinzugefügt.

  • Fügt die Möglichkeit hinzu, qargs auf Objekte zu setzen, die Unterklassen der abstrakten Klasse BaseOperator sind. Dies geschieht durch den Aufruf des Objekts op(qargs) (wobei op eine Operatorklasse ist) und gibt eine flache Kopie des ursprünglichen Objekts mit einer gesetzten qargs-Eigenschaft zurück. Wenn ein solches Objekt mit der Option compose() oder dot() methoden verwendet wird, wird der interne Wert für qargs verwendet, wenn die qargs Methode kwarg nicht verwendet wird. Dies ermöglicht z. B. die Komposition von Teilsystemen mit Hilfe von binären Operatoren:

    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])
  • Fügt qiskit.quantum_info.Clifford operatorklasse zum Modul quantum_info hinzu. Dieser Operator ist eine effiziente symplektische Darstellung eines N-Qubit-Unitaroperators aus der Clifford-Gruppe. Diese Klasse enthält eine to_circuit() methode zur Kompilierung in eine QuantumCircuit von Clifford-Gattern mit einer minimalen Anzahl von CX-Gattern für bis zu 3-Qubits. Es bietet auch allgemeine Kompilierung für N > 3 Qubits, aber diese Methode ist nicht optimal für die Anzahl von Zwei-Qubit-Gattern.

  • Fügt hinzu qiskit.quantum_info.SparsePauliOp betreiberklasse. Dies ist eine effiziente Darstellung einer N-Qubit-Matrix, die in der Pauli-Basis spärlich ist und eine qiskit.quantum_info.PauliTable und einen Vektor komplexer Koeffizienten für ihre Datenstruktur verwendet.

    Diese Klasse unterstützt einen Großteil der gleichen Funktionalität wie die qiskit.quantum_info.Operator klasse, so dass SparsePauliOp objekte können gestreckt, zusammengesetzt, skalar multipliziert, addiert und subtrahiert werden.

    Numpy-Arrays oder Operator objekte können in ein SparsePauliOp umgewandelt werden, indem die Methode :class:`~qiskit.quantum_info.SparsePauliOp.from_operator verwendet wird. SparsePauliOp kann in eine dünnbesetzte csr_matrix oder ein dichtes Numpy-Array konvertiert werden, indem die to_matrix methode oder in ein Operator objekt unter Verwendung der to_operator methode.

    A SparsePauliOp kann im Hinblick auf seine PauliTable Komponenten und Koeffizienten, seine Koeffizienten und Pauli-String-Labels mit der label_iter() methode und die (dichten oder spärlichen) Matrixkomponenten mit der matrix_iter() methode.

  • Hinzufügen qiskit.quantum_info.diamond_norm() funktion zur Berechnung der Diamantnorm (vollständig begrenzte Spurennorm) eines Quantenkanals. Damit kann der Abstand zwischen zwei Quantenkanälen mit diamond_norm(chan1 - chan2) berechnet werden.

  • Es wurde eine neue Klasse qiskit.quantum_info.PauliTable hinzugefügt. Dies ist eine effiziente symplektische Darstellung einer Liste von N-Qubit-Pauli-Operatoren. Einige Merkmale dieser Klasse sind:

    • PauliTable objekte zusammengesetzt werden können, und tensored, die ein PauliTable Objekt mit der Kombination der Operation ( compose(), dot(), expand(), tensor()) zwischen jedem Element der ersten Tabelle, mit jedem Element der zweiten Tabelle zurückgeben wird.
    • Die Addition von zwei Tabellen wirkt wie eine Listenkonkatenation der Begriffe in jeder Tabelle (+).
    • Pauli-Tabellen können nach lexikographischer Reihenfolge (Tensorprodukt) oder nach Pauli-Gewichten sortiert werden (sort()).
    • Doppelte Elemente können gezählt und gelöscht werden (unique()).
    • Die PauliTable kann entweder in ihrer ursprünglichen symplektischen booleschen Array-Darstellung, als Pauli-String-Labels (label_iter()) oder als dichtes Numpy-Array oder dünnbesetzte CSR-Matrizen (matrix_iter()) durchlaufen werden.
    • Überprüfung der Kommutation zwischen Elementen der Pauli-Tabelle und einer anderen Pauli-Tabelle (commutes()) oder Pauli-Tabelle (commutes_with_all())

    Weitere Einzelheiten finden Sie in der API-Dokumentation der Klasse qiskit.quantum_info.PauliTable .

  • Fügt die Klasse qiskit.quantum_info.StabilizerTable hinzu. Dies ist eine Unterklasse der Klasse qiskit.quantum_info.PauliTable , die einen booleschen Phasenvektor zusammen mit dem Pauli-Tabellenfeld enthält. Dies ist eine Liste von Stabilisierungsoperatoren, die reelle Pauli-Operatoren mit einem Koeffizienten von +1 oder -1 sind. Da die Stabilisatormatrizen reell sind, ist die "Y" Etikettenmatrix als [[0, 1], [-1, 0]] definiert. Weitere Informationen finden Sie in der API-Dokumentation.

  • Fügt hinzu qiskit.quantum_info.pauli_basis() funktion, die eine N-Qubit-Pauli-Basis als qiskit.quantum_info.PauliTable Objekt zurückgibt. Die Ordnung dieser Basis kann entweder nach der lexikographischen Standardordnung (Tensorprodukt) oder nach der Anzahl der nicht identischen Pauli-Terme (Gewicht) erfolgen.

  • Fügt hinzu qiskit.quantum_info.ScalarOp operatorklasse, die ein skalares Vielfaches eines Identitätsoperators darstellt. Dies kann verwendet werden, um eine Identität auf Subsystemen beliebiger Dimension zu initialisieren, und sie wird implizit in andere BaseOperator Unterklassen umgewandelt (wie eine qiskit.quantum_info.Operator oder qiskit.quantum_info.SuperOp) umgewandelt, wenn sie mit diesen zusammengesetzt oder ihnen hinzugefügt wird.

    Beispiel: Identitätsoperator

    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
  • Eine neue Methode, reshape()wurde der Klasse qiskit.quantum_innfo.Operator hinzugefügt, die eine flache Kopie einer Operator-Unterklasse mit umgestalteten Eingangs- oder Ausgangsdimensionen des Subsystems zurückgibt. Die kombinierten Abmessungen aller Teilsysteme müssen mit denen des ursprünglichen Betreibers übereinstimmen, sonst wird eine Ausnahme ausgelöst.

  • Fügt hinzu qiskit.quantum_info.random_clifford() zur Erzeugung eines zufälligen qiskit.quantum_info.Clifford operator.

  • Hinzufügen qiskit.quantum_info.random_quantum_channel() funktion zur Erzeugung eines zufälligen Quantenkanals mit festem Choi-rang in der Stinespring darstellung.

  • Hinzufügen qiskit.quantum_info.random_hermitian() zur Erzeugung eines zufälligen hermiteschen Operator.

  • Hinzufügen qiskit.quantum_info.random_statevector() zur Erzeugung einer zufälligen Statevector.

  • Fügt qiskit.quantum_info.random_pauli_table() hinzu, um eine zufällige qiskit.quantum_info.PauliTable zu erzeugen.

  • Fügt qiskit.quantum_info.random_stabilizer_table() hinzu, um eine zufällige qiskit.quantum_info.StabilizerTable zu erzeugen.

  • Fügen Sie ein num_qubits -Attribut zu qiskit.quantum_info.StateVector und qiskit.quantum_info.DensityMatrix klassen. Dies liefert die Anzahl der Qubits für N-Qubit-Zustände und gibt None für Nicht-Qubit-Zustände zurück.

  • Fügt hinzu to_dict() und to_dict() methoden zur Konvertierung von qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix objekte in das Bra-Ket-Notationswörterbuch.

    Beispiel

    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())
  • Fügt hinzu probabilities() und probabilities() zu qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix klassen, die ein Array von Messergebniswahrscheinlichkeiten in der Berechnungsgrundlage für die angegebenen Subsysteme zurückgeben.

    Beispiel

    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())
  • Fügt hinzu probabilities_dict() und probabilities_dict() zu qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix klassen, die ein Wörterbuch-Array der Messergebniswahrscheinlichkeiten in der Berechnungsgrundlage für die angegebenen Subsysteme zurückgeben.

    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())
  • Hinzufügen sample_counts() und sample_memory() methoden zu den Statevector und DensityMatrix für die Stichprobenerfassung von Messergebnissen auf Subsystemen hinzu.

    Beispiel:

    Erzeugen eines Zählwörterbuchs durch Stichproben aus einem Zustandsvektor

    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)

    Rückgabe des Arrays von Messergebnissen für jede Probe

    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)
  • Fügt eine measure() methode zu den qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix quantenzustandsklassen hinzu. Dies ermöglicht es, ein einzelnes Messergebnis aus den angegebenen Teilsystemen zu entnehmen und den Zustandsvektor auf den Zustand nach der Messung der Berechnungsgrundlage zu reduzieren. Zum Beispiel

    from 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)
  • Fügt eine reset() methode zu den qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix quantenzustandsklassen hinzu. Dadurch können einige oder alle Teilsysteme auf den Zustand ∣0⟩|0\rangle zurückgesetzt werden. Zum Beispiel

    from 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)
  • Eine neue Visualisierungsfunktion qiskit.visualization.visualize_transition() zur Visualisierung von einzelnen Qubit-Gate-Übergängen wurde hinzugefügt. Es nimmt eine einzelne Qubit-Schaltung auf und liefert eine Animation der Qubit-Zustandsübergänge auf einer Bloch-Kugel. Um diese Funktion nutzen zu können, müssen Sie die Abhängigkeiten für einen Matplotlib-Animation-Writer installiert und global konfiguriert haben. Weitere Einzelheiten hierzu finden Sie in der Dokumentation von matplotlib. Im Standardfall reicht es jedoch aus, sicherzustellen, dass FFmpeg installiert ist, um diese Funktion zu nutzen.

    Es unterstützt Schaltungen mit den folgenden Gattern:

    • HGate
    • XGate
    • YGate
    • ZGate
    • RXGate
    • RYGate
    • RZGate
    • SGate
    • SdgGate
    • TGate
    • TdgGate
    • U1Gate

    Zum Beispiel:

    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() hat ein neues kwarg schedule_circuit. Die Einstellung schedule_circuit=True ermöglicht die Einplanung der Schaltung in eine Schedule. Dies ermöglicht Benutzern, die qiskit.circuit.QuantumCircuit objekten benutzerdefinierte Scheduler-Methoden wie die Methoden as_late_as_possible und as_soon_as_possible zu verwenden. Zum Beispiel:

    job = execute(qc, backend, schedule_circuit=True,
                  scheduling_method="as_late_as_possible")
  • Eine neue Umgebungsvariable QISKIT_SUPPRESS_PACKAGING_WARNINGS kann auf Y oder y gesetzt werden, was die Warnungen über nicht installierte qiskit-aer und qiskit-ibmq-provider zum Zeitpunkt des Imports unterdrücken wird. Dies ist nützlich für Benutzer, die nur qiskit-terra (oder nur qiskit-aer und/oder qiskit-ibmq-provider) einsetzen und die Warnungen nicht auf ein mögliches Paketierungsproblem hinweisen. Sie können die Umgebungsvariable auf N oder n setzen, um sicherzustellen, dass die Warnungen immer aktiviert sind, auch wenn die Benutzerkonfigurationsdatei so eingestellt ist, dass sie ausgeschaltet sind.

  • Eine neue Option für die Benutzerkonfigurationsdatei, suppress_packaging_warnings , wurde hinzugefügt. Wenn Sie in Ihrer Benutzerkonfigurationsdatei den Wert true angeben:

    [default]
    suppress_packaging_warnings = true

    werden die Warnungen, dass qiskit-aer und qiskit-ibmq-provider zum Zeitpunkt des Imports nicht installiert sind, unterdrückt. Dies ist nützlich für Benutzer, die nur qiskit-terra (oder nur qiskit-aer und/oder qiskit-ibmq-provider) einsetzen und die Warnungen nicht auf ein mögliches Paketierungsproblem hinweisen. Wenn die Benutzerkonfigurationsdatei so eingestellt ist, dass die Warnungen deaktiviert sind, kann dies überschrieben werden, indem die QISKIT_SUPPRESS_PACKAGING_WARNINGS auf N oder n

  • qiskit.compiler.transpile() hat zwei neue kwargs, layout_method und routing_method. Diese ermöglichen es Ihnen, eine bestimmte Methode für die Platzierung und das Routing von Schaltungen auf eingeschränkten Architekturen zu wählen. Zum Beispiel:

    transpile(circ, backend, layout_method='dense',
              routing_method='lookahead')

    wird ausgeführt DenseLayout layout-Durchlauf und LookaheadSwap routing-Durchlauf.

  • Die Art und Weise, in der die Pulsanweisungen aufgebaut sind, wurde erheblich vereinfacht.

    Beim bisherigen Stil wurde Command mit Kanälen aufgerufen, um eine Instruction. Die Verwendung sowohl von Befehlen als auch von Anweisungen sorgte für Verwirrung. Das war der frühere Stil:

    sched += Delay(5)(DriveChannel(0))
    sched += ShiftPhase(np.pi)(DriveChannel(0))
    sched += SamplePulse([1.0, ...])(DriveChannel(0))
    sched += Acquire(100)(AcquireChannel(0), MemorySlot(0))

    oder, gleichwertig (wenn auch weniger häufig):

    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))

    Anstatt einen Befehl und eine Anweisung zu erstellen, wurde nun jeder Befehl in eine Anweisung umgewandelt:

    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))
  • Es gibt jetzt eine Play anweisung, die eine Beschreibung einer Impulshüllkurve und einen Kanal annimmt. Es gibt eine neue Pulse Klasse in der pulse_lib , von der die Puls-Hüllkurven-Beschreibung subclass sein sollte.

    Zum Beispiel:

    Play(SamplePulse([0.1]*10), DriveChannel(0))
    Play(ConstantPulse(duration=10, amp=0.1), DriveChannel(0))

Anmerkungen zu Upgrades

  • Die qiskit.dagcircuit.DAGNode methode pop , die in der Version 0.9.0 veraltet war, wurde entfernt. Wenn Sie diese Methode verwenden, können Sie Python 's del Anweisung oder delattr() Funktion verwenden, um die gleiche Aufgabe zu erfüllen.

  • Es wurde eine neue optionale Visualisierungsanforderung, pygments, hinzugefügt. Sie wird für die Syntaxhervorhebung von OpenQASM 2.0 Code in Jupyter-Widgets und optional für die qiskit.circuit.QuantumCircuit.qasm() methode. Es muss installiert werden (entweder mit pip install pygments oder pip install qiskit-terra[visualization]), bevor man das Widget %circuit_library_info in qiskit.tools.jupyter oder den formatted kwarg in der qasm() methode.

  • Die Option pulse buffer , die in qiskit.pulse.Channel und qiskit.pulse.Schedule war in Terra 0.11.0 veraltet und wurde nun entfernt. Um eine Verzögerung auf einem Kanal oder in einem Zeitplan hinzuzufügen, geben Sie diese explizit in Ihrem Zeitplan mit einer Verzögerung an:

    sched = Schedule()
    sched += Delay(5)(DriveChannel(0))
  • PulseChannelSpec, die in Terra 0.11.0 veraltet war, wurde nun entfernt. Verwenden Sie stattdessen BackendConfiguration :

    config = backend.configuration()
    drive_chan_0 = config.drives(0)
    acq_chan_0 = config.acquires(0)

    oder verweisen Sie einfach direkt auf den Kanal, z. B. DriveChannel(index).

  • Ein Importpfad war in Terra 0.10.0 veraltet und wurde nun entfernt: für PulseChannel, DriveChannel, MeasureChannel und ControlChannel verwenden Sie from qiskit.pulse.channels import X anstelle von from qiskit.pulse.channels.pulse_channels import X.

  • Der Pass qiskit.transpiler.passes.CSPLayout (der in der Version 0.11.0 eingeführt wurde) wurde dem voreingestellten Passmanager für die Optimierungsstufen 2 und 3 hinzugefügt. Für die Stufe 2 gibt es ein Anruflimit von 1.000 und ein Timeout von 10 Sekunden. Für die Stufe 3 liegt das Anruflimit bei 10.000 und die Zeitüberschreitung bei 1 Minute.

    Da der Pass nun in den voreingestellten Pass-Managern enthalten ist, ist das Paket python-constraint keine optionale Abhängigkeit mehr und wurde der Anforderungsliste hinzugefügt.

  • Die Klasse TranspileConfig , die bisher verwendet wurde, um die Laufzeitkonfiguration für eine qiskit.transpiler.PassManager wurde entfernt und durch eine neue Klasse qiskit.transpile.PassManagerConfig ersetzt. Diese neue Klasse wurde so strukturiert, dass sie nur die Informationen enthält, die zur Erstellung einer PassManager. Die Attribute dieser Klasse sind:

    • initial_layout
    • basis_gates
    • coupling_map
    • backend_properties
    • seed_transpiler
  • Die Funktion transpile_circuit in qiskit.transpiler wurde entfernt. Um eine Schaltung mit einem benutzerdefinierten PassManager zu transponieren, sollten Sie nun die run() methode des :class:~qiskit.transpiler.PassManager` Objekts verwenden.

  • Die QuantumCircuit methode draw() und qiskit.visualization.circuit_drawer() funktion werden nicht mehr den Anfangszustand enthalten, der standardmäßig in Visualisierungen enthalten ist. Wenn Sie den Ausgangszustand in der Ausgabevisualisierung beibehalten möchten, müssen Sie den initial_state kwarg auf True setzen. Zum Beispiel beim Laufen:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='text')

    Der Ausgangszustand ist nicht mehr enthalten. Wenn Sie es behalten möchten, können Sie laufen:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='text', initial_state=True)
  • qiskit.compiler.transpile() (und qiskit.execute.execute(), das intern transpile verwendet) wird nun einen Fehler auslösen, wenn der pass_manager kwarg gesetzt wird und ein Wert für andere kwargs gesetzt wird, die bereits in einem instanzierten PassManager objekt gesetzt sind. Zuvor wurden diese widersprüchlichen kwargs einfach ignoriert und die Werte in der PassManager Instanz verwendet. Zum Beispiel:

    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)

    wird nun einen Fehler auslösen, während vor dieser Version der Wert in pm einfach stillschweigend verwendet wurde und der Wert für optimization_level kwarg ignoriert wurde. Die transpile kwargs, auf die dies zutrifft, sind:

    • optimization_level
    • basis_gates
    • coupling_map
    • seed_transpiler
    • backend_properties
    • initial_layout
    • layout_method
    • routing_method
    • backend
  • Die Operator, Clifford, SparsePauliOp, PauliTable, StabilizerTable, Operatorklassen haben eine zusätzliche Methode call , die es ihnen erlaubt, dem Operator ein qargs zuzuweisen, das mit dem compose(), dot(), evolve(),,, - , und verwendet werden kann.

  • Die Additionsmethode der Klasse qiskit.quantum_info.Operatorklasse akzeptiert nun einen qarg kwarg, um das Hinzufügen eines kleineren Operators zu einem größeren zu ermöglichen, wobei Identitäten auf den anderen Subsystemen vorausgesetzt werden (wie bei qargs auf compose() und dot() methoden). Dies ermöglicht das Hinzufügen von Subsystemen mit Hilfe der Aufrufmethode wie bei der Komposition. Diese Unterstützung wird zu allen BaseOperator Unterklassen (ScalarOp, Operator, QuantumChannel).

    Zum Beispiel:

    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])
  • Die Klasse BaseOperator wurde aktualisiert, so dass Addition, Subtraktion und skalare Multiplikation keine abstrakten Methoden mehr sind. Dies bedeutet, dass sie nicht mehr in Unterklassen implementiert werden müssen, wenn sie nicht unterstützt werden. Die Basisklasse wird eine NotImplementedError auslösen, wenn die Methoden nicht definiert sind.

  • Die Funktion qiskit.quantum_info.random_density_matrix() funktion gibt nun ein zufälliges DensityMatrix objekt zurück. In früheren Versionen wurde ein Numpy-Array zurückgegeben.

  • Die qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix kopieren das Eingabefeld nicht mehr, wenn es bereits den richtigen dtype hat.

  • fastjsonschema wird als Abhängigkeit hinzugefügt. Dies wird für eine viel schnellere Validierung von qobj-Wörterbüchern gegen das JSON-Schema verwendet, wenn die to_dict() -Methode auf qobj-Objekten mit dem validate -Schlüsselwortargument auf True aufgerufen wird.

  • Die qobj-Konstruktionsklassen in qiskit.qobj werden standardmäßig nicht mehr gegen das qobj-Jsonschema validiert. Dazu gehören die folgenden Klassen:

    Wenn Sie sich auf diese Validierung verlassen oder sie gegen das Qobj-Schema validieren möchten, können Sie dies tun, indem Sie den validate kwarg auf True on to_dict() methode von einer der Qobj-Klassen der obersten Ebene QasmQobj oder PulseQobj. Zum Beispiel:

    die das Ausgabewörterbuch anhand des Qobj-Jsonschemas validiert.

  • Das Ausgabewörterbuch von qiskit.qobj.QasmQobj.to_dict() und qiskit.qobj.PulseQobj.to_dict() hat nicht mehr das Format für eine direkte json-Serialisierung, wie es die API von IBMQ erwartet. Diese Qobj-Objekte sind das derzeitige Format, das wir für die Übergabe von Experimenten an Anbieter/Backends verwenden. Ein Wörterbuchformat, das einfach direkt an die IBMQ-API übergeben werden kann, war zwar für qiskit-ibmq-provider einigermaßen nützlich, erschwerte aber die Arbeit für andere Anbieter. Insbesondere für Anbieter, die lokale Simulatoren verpacken. Künftig werden die Definitionen dessen, was zwischen Anbietern und dem IBMQ-API-Anforderungsformat übergeben wird, weiter entkoppelt (in einer rückwärtskompatiblen Weise), was die Erstellung von Anbietern und Backends erleichtern dürfte.

    In der Praxis besteht der einzige funktionale Unterschied zwischen der Ausgabe dieser Methoden und früheren Versionen darin, dass komplexe Zahlen mit dem Typ complex dargestellt werden und Numpy-Arrays nicht mehr stillschweigend in Listen umgewandelt werden. Wenn Sie bisher json.dumps() direkt auf der Ausgabe von to_dict() aufgerufen haben, wird nach dieser Version ein benutzerdefinierter json-Encoder benötigt, um diese Fälle zu behandeln. Zum Beispiel:

    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)

    generiert eine json-Zeichenkette in genau der gleichen Weise wie json.dumps(my_qasm.to_dict()) in früheren Versionen.

  • CmdDef ist seit Terra 0.11.0 veraltet und wurde entfernt. Bitte verwenden Sie weiterhin InstructionScheduleMap stattdessen.

  • Die Methoden cmds und cmd_qubits in InstructionScheduleMap sind seit Terra 0.11.0 veraltet und wurden entfernt. Bitte verwenden Sie stattdessen instructions und qubits_with_instruction .

  • PulseDefaults haben qubit_freq_est und meas_freq_est seit der Terra-Veröffentlichung 0.11.0 in Hz statt in GHz angegeben. Eine Warnung, die auf diese Änderung hinwies, wurde entfernt.

  • Die zuvor veraltete (in der Version 0.11.0 ) Unterstützung für die Übergabe von qiskit.circuit.Instruction parameter der Typen sympy.Basic, sympy.Expr, qiskit.qasm.node.node.Node (QASM AST node) und sympy.Matrix wurde entfernt. Die unterstützten Typen für Instruktionsparameter sind:

  • Die folgenden Eigenschaften von BackendConfiguration:

    • dt
    • dtm
    • rep_time

    haben alle Einheiten von Sekunden. Vor der Veröffentlichung von 0.11.0, dt und dtm wurden die Einheiten in Nanosekunden angegeben. Vor der Veröffentlichung von 0.12.0 hatte rep_time Einheiten von Mikrosekunden. Die Warnungen, die die Benutzer auf diese Änderungen hinwiesen, wurden nun von BackendConfiguration entfernt.

  • Der Liste der Anforderungen wurde eine neue Anforderung hinzugefügt: retworkx. Es handelt sich um eine Apache 2.0 lizenzierte Graphenbibliothek, die eine ähnliche API wie networkx hat und zur erheblichen Beschleunigung der qiskit.dagcircuit.DAGCircuit operationen als Teil des Transpilers erheblich zu beschleunigen. Auf PyPI sind Binärdateien für alle von Qiskit Terra unterstützten Plattformen veröffentlicht, aber wenn Sie eine Plattform verwenden, für die keine vorkompilierten Binärdateien veröffentlicht sind, finden Sie in der retworkx-Dokumentation Anweisungen zur Pip-Installation aus sdist.

    Wenn Sie im Rahmen der Umstellung Probleme mit dem Transpiler oder der DAGCircuit-Klasse haben, können Sie zur vorherigen networkx-Implementierung zurückkehren, indem Sie die Umgebungsvariable USE_RETWORKX auf N setzen. Diese Option wird in der Version 0.14.0 entfernt werden.

Hinweise zu veralteten Versionen

  • Die Übergabe der Daten an den Konstruktor für qiskit.dagcircuit.DAGNode als Wörterbucharg data_dict ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollten Sie nun die Felder als kwargs an den Konstruktor übergeben. Zum Beispiel das bisherige Verhalten von:

    from qiskit.dagcircuit import DAGNode
    
    data_dict = {
        'type': 'in',
        'name': 'q_0',
    }
    node = DAGNode(data_dict)

    sollte jetzt sein:

    from qiskit.dagcircuit import DAGNode
    
    node = DAGNode(type='in', name='q_0')
  • Die Benennung von Gate-Objekten und -Methoden wurde aktualisiert, um konsistenter zu sein. Folgende Änderungen wurden vorgenommen:

    • Die Pauli-Tore haben alle nur einen Großbuchstaben (I, X, Y, Z)
    • Den parametrisierten Pauli-Toren (d. h. Rotationen) wird der Großbuchstabe R vorangestellt (RX, RY, RZ)
    • Bei einer kontrollierten Version wird der Großbuchstabe C vorangestellt (CX, CRX, CCX)
    • Gates werden nach ihrer Wirkung benannt, nicht nach ihren alternativen Namen (CCX, nicht Toffoli)

    Die alten Namen sind veraltet und werden in einer zukünftigen Version entfernt. Dies ist eine Liste der Änderungen, die die alte und neue Klasse, das Namensattribut und die Methoden zeigt. Wenn eine neue Spalte leer ist, gibt es für diese keine Änderung.

    Alte Klasse
    Neue Klasse
    Alter Name Attribut
    Neues Attribut Name
    ToffoliGateCCXGateccxccx() und toffoli()
    CrxGateCRXGatecrxcrx()
    CryGateCRYGatecrycry()
    CrzGateCRZGatecrzcrz()
    FredkinGateCSwapGatecswapcswap() und fredkin()
    Cu1GateCU1Gatecu1cu1()
    Cu3GateCU3Gatecu3cu3()
    CnotGateCXGatecxcx() und cnot()
    CyGateCYGatecycy()
    CzGateCZGateczcz()
    DiagGateDiagonalGatediagdiagonaldiag_gatediagonal()
    IdGateIGateidideni() und id()
    Isometryisoisometryiso()isometry() und iso()
    UCGUCGatemultiplexerigguc()
    UCRotUCPauliRotGate
    UCXUCRXGateucrotXucrxucxucrx()
    UCYUCRYGateucrotyucryucyucry()
    UCZUCRZGateucrotzucrzuczucrz()
  • Der kwarg period für die Funktionen square(), sawtooth(), und triangle() in qiskit.pulse.pulse_lib ist nun veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollten Sie nun die freq kwarg verwenden, um die Frequenz einzustellen.

  • Die Methoden DAGCircuit.compose_back() und DAGCircuit.extend_back() sind veraltet und werden in einer zukünftigen Version entfernt. Stattdessen sollten Sie die qiskit.dagcircuit.DAGCircuit.compose() verwenden, die eine allgemeinere und flexiblere Methode ist, die die gleiche Funktionalität bietet.

  • Der callback kwarg des qiskit.transpiler.PassManager konstruktors der Klasse ist veraltet und wird in einer zukünftigen Version entfernt werden. Anstatt ihn auf Objektebene während der Erstellung zu setzen, sollte er nun als kwarg-Parameter in der qiskit.transpiler.PassManager.run() methode gesetzt werden.

  • Die Schlüsselwörter n_qubits und numberofqubits sind in Terra veraltet und werden durch num_qubits ersetzt. Die alten Namen werden in einer zukünftigen Version entfernt werden. Die von dieser Änderung betroffenen Objekte sind im Folgenden aufgeführt:

    Klasse
    Alte Methode
    Neue Methode
    QuantumCircuitn_qubitsnum_qubits()
    Paulinumberofqubitsnum_qubits()
    Funktion
    Altes Argument
    Neues Argument
    random_circuit()n_qubitsnum_qubits
    MSGaten_qubitnum_qubits
  • Die Funktion qiskit.quantum_info.synthesis.euler_angles_1q ist jetzt veraltet. Sie wurde abgelöst durch die qiskit.quantum_info.OneQubitEulerDecomposer klasse ersetzt, die die gleiche Funktionalität bietet:

    OneQubitEulerDecomposer().angles(mat)
  • Der pass_manager kwarg für die qiskit.compiler.transpile() ist veraltet und wird in einer zukünftigen Version entfernt werden. Der bevorzugte Weg, um einen Schaltkreis mit einem benutzerdefinierten Objekt zu transpilieren PassManager objekts ist die Verwendung der run() methode des PassManager Objekts.

  • Die Funktion qiskit.quantum_info.random_state() ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollten Sie die qiskit.quantum_info.random_statevector() funktion verwenden.

  • Die Methoden add, subtract, und multiply der qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix klassen sind veraltet und werden in einer zukünftigen Version entfernt werden. Stattdessen sollten Sie die binären Operatoren +, -, * verwenden.

  • qiskit.quantum_info.Statevector.to_counts(), qiskit.quantum_info.DensityMatrix.to_counts() und qiskit.quantum_info.counts.state_to_counts() sind veraltet. Diese Funktionen werden durch die Klassenmethoden qiskit.quantum_info.Statevector.probabilities_dict() und ersetzt qiskit.quantum_info.DensityMatrix.probabilities_dict().

  • SamplePulse und ParametricPulse s (z.B. Gaussian) sind jetzt Unterklassen von Pulse und wurden in die qiskit.pulse.pulse_lib verschoben. Der frühere Pfad über " pulse.commands " ist veraltet und wird in einer zukünftigen Version entfernt werden.

  • DelayInstruction wurde veraltet und durch Delay ersetzt. Diese neue Anweisung wurde von der vorherigen Command Delay übernommen. Das Migrationsmuster ist:

    Delay(<duration>)(<channel>) -> Delay(<duration>, <channel>)
    DelayInstruction(Delay(<duration>), <channel>)
        -> Delay(<duration>, <channel>)

    Bis zum Ende des Verfallszeitraums wird auch die bisherige Delay Syntax für den Aufruf eines Befehls auf einem Kanal unterstützt:

    Delay(<phase>)(<channel>)

    Die neue Anweisung Delay unterstützt das Attribut command nicht.

  • FrameChange und FrameChangeInstruction sind veraltet und wurden ersetzt durch ShiftPhase. Die Änderungen sind:

    FrameChange(<phase>)(<channel>) -> ShiftPhase(<phase>, <channel>)
    FrameChangeInstruction(FrameChange(<phase>), <channel>)
        -> ShiftPhase(<phase>, <channel>)

    Bis zum Ende des Verfallszeitraums wird die bisherige FrameChange Syntax für den Aufruf eines Befehls auf einem Kanal unterstützt:

    ShiftPhase(<phase>)(<channel>)
  • Die Methode call von SamplePulse und ParametricPulse s ist veraltet. Die Migration verläuft wie folgt:

    Pulse(<*args>)(<channel>) -> Play(Pulse(*args), <channel>)
  • AcquireInstruction ist veraltet und wurde ersetzt durch Acquire. Die Änderungen sind:

    Acquire(<duration>)(<**channels>) -> Acquire(<duration>, <**channels>)
    AcquireInstruction(Acquire(<duration>), <**channels>)
        -> Acquire(<duration>, <**channels>)

    Bis zum Ende des Verfallszeitraums wird die bisherige Acquire-Syntax für den Aufruf des Befehls auf einem Kanal unterstützt:

    Acquire(<duration>)(<**channels>)

Fehlerkorrekturen

  • Der BarrierBeforeFinalMeasurements transpiler-Durchgang, der in den voreingestellten Transpiler-Stufen enthalten ist, wenn ein physisches Gerät anvisiert wird, fügte zuvor eine Barriere nur über gemessene Qubits ein. In einigen Fällen erlaubte dies dem Transpiler, nach einer Messoperation einen Swap einzufügen, wodurch die Schaltung für aktuelle Geräte ungültig wurde. Der Pass wurde aktualisiert, so dass die eingefügte Barriere alle Qubits auf dem Gerät umfasst. Behebt #3937

  • Bei der Erweiterung einer QuantumCircuit instanz (Extendee) mit einem anderen Stromkreis (Extension) wird der Stromkreis per Referenz genommen. Wenn ein Schaltkreis mit sich selbst erweitert wird, führt dies zu einer Endlosschleife, da Erweiterungsnehmer und Erweiterung identisch sind. Dieser Fehler wurde behoben, indem die Erweiterung kopiert wurde, wenn es sich um dasselbe Objekt wie der Erweiterungsempfänger handelt. Behebt #3811

  • Behebt einen Fall in qiskit.result.Result.get_counts()behoben, bei dem die Ergebnisse für einen Ablauf nicht referenziert werden konnten, wenn das Experiment als Schedule ohne Namen initialisiert wurde. Behebt #2753

  • Zuvor hatte das Ersetzen von Parameter objekte in einer Schaltung durch neue Parameter-Objekte vor der Zerlegung einer Schaltung dazu führen, dass die ersetzten Werte nicht korrekt in die zerlegten Gatter eingesetzt werden. Dies wurde so gelöst, dass Bindung und Abbau in beliebiger Reihenfolge erfolgen können.

  • Das Matplotlib-Ausgabe-Backend für die qiskit.visualization.circuit_drawer() funktion und qiskit.circuit.QuantumCircuit.draw() methodenschublade wurde korrigiert, um CU1Gate gates korrekt darzustellen. Behebt #3684

  • Ein Fehler in qiskit.circuit.QuantumCircuit.from_qasm_str() und qiskit.circuit.QuantumCircuit.from_qasm_file() beim Laden von QASM mit benutzerdefinierten Gates wurde behoben. Laden Sie nun dieses QASM:

    OPENQASM 2.0;
    include "qelib1.inc";
    gate rinv q {sdg q; h q; sdg q; h q; }
    qreg q[1];
    rinv q[0];

    entspricht der folgenden Schaltung:

    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]])

    Behebt #1566

  • Zulassen, dass Quantenschaltungen Anweisungen Listenparameterwerte haben. Dies wird in Aer für Erwartungswert-Snapshot-Parameter verwendet, zum Beispiel params = [[1.0, 'I'], [1.0, 'X']]] für ⟨I+X⟩\langle I + X\rangle.

  • Bisher wurden für Schaltungen mit zusammengesetzten Gattern (die mit qiskit.circuit.QuantumCircuit.to_gate() oder qiskit.circuit.QuantumCircuit.to_instruction() oder den entsprechenden Konvertern erstellt wurden), führte der Versuch, den Schaltkreis mehr als einmal zu binden, dazu, dass nur der erste Bindungswert auf alle Schaltkreise angewendet wurde, wenn sie transpiliert wurden. Dieses Problem wurde behoben, so dass die für nachfolgende Bindungen angegebenen Werte korrekt berücksichtigt werden.

Sonstige Anmerkungen

Aer- 0.5.0

Hinzugefügt

  • Unterstützung für Terra-Diagonaltor hinzufügen
  • Unterstützung für parametrisierte qobj hinzufügen

Fest

  • Postfix für Linux auf Raspberry Pi hinzugefügt
  • Verarbeitung von Numpy-Array-Eingaben von qobj

Ignis- 0.3.0

Hinzugefügt

  • API-Dokumentation
  • CNOT-Dihedral randomisiertes Benchmarking
  • Akkreditierungsmodul für die Ausgangsakkreditierung von lauten Geräten
  • Impulskalibrierungen für einzelne Qubits
  • Impuls-Diskriminator
  • Schaltungen zur Verifikation der Verschränkung
  • Gateset-Tomographie für Ein-Qubit-Gatesätze
  • Fügt randomisierte Benchmarking-Utility-Funktionen hinzu calculate_1q_epg, calculate_2q_epg Funktionen zur Berechnung von 1- und 2-Qubit-Fehlern pro Tor aus Fehlern pro Clifford
  • Fügt randomisierte Benchmarking-Utility-Funktionen calculate_1q_epc, calculate_2q_epc zur Berechnung von 1- und 2-Qubit-Fehlern pro Clifford aus Fehlern pro Tor hinzu

Geändert

  • Unterstützung ganzzahliger Bezeichnungen für Qubits in der Tomographie
  • Unterstützung von Integer-Etiketten zur Messfehlerbegrenzung

Veraltet

  • Die Funktion twoQ_clifford_error ist veraltet. Verwenden Sie stattdessen calculate_2q_epc .
  • Python 3.5 unterstützung in qiskit-ignis ist veraltet. Die Unterstützung wird am Ende des Lebensdatums der Python-Community für diese Version eingestellt, das ist der 13.09.2020.

Aqua- 0.6.5

Keine Änderung

IBM Q Anbieter 0.6.0

Keine Änderung

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.