Skip to main content
IBM Quantum Platform

Qiskit 0.13 Versionshinweise


0.13.0

Terra- 0.10.0

Vorspiel

Die Version 0.10.0 enthält mehrere neue Funktionen und Fehlerkorrekturen. Die größte Änderung in dieser Version ist die Hinzufügung der anfänglichen Unterstützung für die Verwendung von Qiskit mit gefangenen Ionenfallen-Backends.

Neue Funktionen

  • Einführung neuer Methoden in QuantumCircuit , die das nahtlose Hinzufügen oder Entfernen von Messungen am Ende eines Schaltkreises ermöglichen.


    measure_all()

    Fügt eine barrier gefolgt von einer measure Operation zu allen Qubits in der Schaltung hinzu. Erstellt eine ClassicalRegister , deren Größe der Anzahl der Qubits in der Schaltung entspricht, in der die Messungen gespeichert werden.


    measure_active()

    Fügt allen aktiven Qubits in der Schaltung eine barrier gefolgt von einer measure Operation hinzu. Ein Qubit ist aktiv, wenn mindestens eine andere Operation auf es einwirkt. Erstellt eine ClassicalRegister , deren Größe der Anzahl der aktiven Qubits in der Schaltung entspricht, in der die Messungen gespeichert werden.


    remove_final_measurements()

    Entfernt alle abschließenden Messungen und die vorangegangenen barrier aus einem Schaltkreis. Eine Messung gilt als "endgültig", wenn auf sie kein weiterer Vorgang folgt, ausgenommen Schranken und andere Messungen. Wenn nach dem Entfernen der Messungen alle klassischen Bits auf ClassicalRegister inaktiv sind (keine Operationen mit ihnen verbunden sind), wird ClassicalRegister entfernt.

    Beispiele:

    # Using measure_all()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_all()
    circuit.draw()
    
    # A ClassicalRegister with prefix measure was created.
    # It has 2 clbits because there are 2 qubits to measure
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├───
                 └───┘ ░ └╥┘┌─┐
         q_1: |0>──────░──╫─┤M├
                       ░  ║ └╥┘
    measure_0: 0 ═════════╩══╬═
                             ║
    measure_1: 0 ════════════╩═
    
    
    # Using measure_active()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_active()
    circuit.draw()
    
    # This ClassicalRegister only has 1 clbit because only 1 qubit is active
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├
                 └───┘ ░ └╥┘
         q_1: |0>──────░──╫─
                       ░  ║
    measure_0: 0 ═════════╩═
    
    
    # Using remove_final_measurements()
    # Assuming circuit_all and circuit_active are the circuits from the measure_all and
    # measure_active examples above respectively
    
    circuit_all.remove_final_measurements()
    circuit_all.draw()
    # The ClassicalRegister is removed because, after the measurements were removed,
    # all of its clbits were idle
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
    
    
    circuit_active.remove_final_measurements()
    circuit_active.draw()
    # This will result in the same circuit
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
  • Erste Unterstützung für die Ausführung von Experimenten auf Ionenfallen-Backends wurde hinzugefügt.

  • Ein Rxx-Tor (rxx) und ein globales Mølmer-Sørensen-Tor (ms) wurden dem Standard-Torsatz hinzugefügt.

  • Ein Cnot to Rxx/Rx/Ry decomposer cnot_rxx_decompose und ein single qubit Euler angle decomposer OneQubitEulerDecomposer wurden dem quantum_info.synthesis Modul hinzugefügt.

  • Ein Transpiler-Pass MSBasisDecomposer wurde hinzugefügt, um Schaltungen, die über U3 und Cnot-Gatter definiert sind, in eine über Rxx,Ry und Rx definierte Schaltung umzuwandeln. Dieser Pass wird in voreingestellte Pass-Manager für Backends aufgenommen, die das 'rxx'-Tor in ihren unterstützten Basis-Toren enthalten.

  • Die Backends in qiskit.test.mock enthalten jetzt einen Schnappschuss von echten Gerätekalibrierungsdaten. Dies ist über die Methode properties() für jedes Backend zugänglich. Damit kann jeder Code getestet werden, der von Backend-Eigenschaften abhängt, z. B. geräuschadaptive Transpiler-Passagen oder Geräuschmodelle für die Simulation. Dies führt zu einem schnelleren Test- und Entwicklungszyklus, ohne dass auf Live-Backends zurückgegriffen werden muss.

  • Ermöglicht es der Klasse Result, Teilergebnisse zurückzugeben. Wenn ein gültiges Ergebnisschema geladen wird, das einige erfolgreiche und einige fehlgeschlagene Experimente enthält, ermöglicht dies den Zugriff auf die Daten der erfolgreichen Experimente, während für die fehlgeschlagenen Experimente eine Ausnahme ausgelöst und die entsprechende Fehlermeldung für die fehlgeschlagenen Ergebnisse angezeigt wird.

  • Ein ax kwarg wurde zu den folgenden Visualisierungsfunktionen hinzugefügt:

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

    Dieser kwarg wird verwendet, um ein matplotlib.axes.Axes Objekt an die Visualisierungsfunktionen zu übergeben. Dadurch können diese Visualisierungsfunktionen in einen größeren Visualisierungsworkflow integriert werden. Wenn ein ax kwarg angegeben wird, gibt es auch keine Rückmeldung von den Visualisierungsfunktionen.

  • Ein ax_real und ax_imag kwarg wurde zu den folgenden Visualisierungsfunktionen hinzugefügt:

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

    Diese neuen kwargs funktionieren genauso wie die neu hinzugefügten ax kwargs für andere Visualisierungsfunktionen. Da diese Diagramme jedoch zwei Achsen verwenden (eine für die reale Komponente, die andere für die imaginäre Komponente). Zwei kwargs zu haben, bietet auch die Flexibilität, nur eine Visualisierung für eine der Komponenten zu erzeugen, anstatt immer beide zu machen. Zum Beispiel:

    from matplotlib import pyplot as plt
    from qiskit.visualization import plot_state_hinton
    
    ax = plt.gca()
    
    plot_state_hinton(psi, ax_real=ax)

    wird nur eine Darstellung der realen Komponente erzeugt.

  • Ein bestimmter Passmanager kann nun mit der neuen Methode replace bearbeitet werden. Diese Methode ermöglicht es, eine bestimmte Stufe in einem Passmanager zu ersetzen, was bei der Arbeit mit voreingestellten Passmanagern sehr nützlich sein kann. Bearbeiten wir zum Beispiel den Layout-Selektor des Pass-Managers, der auf Optimierungsebene 0 verwendet wird:

    from qiskit.transpiler.preset_passmanagers.level0 import level_0_pass_manager
    from qiskit.transpiler.transpile_config import TranspileConfig
    
    pass_manager = level_0_pass_manager(TranspileConfig(coupling_map=CouplingMap([[0,1]])))
    
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: TrivialLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    Die Auswahl des Layouts wird in der Stufe [1] festgelegt. Ersetzen wir sie durch DenseLayout:

    from qiskit.transpiler.passes import DenseLayout
    
    pass_manager.replace(1, DenseLayout(coupling_map), condition=lambda property_set: not property_set['layout'])
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    Wenn Sie es ohne jede Bedingung ersetzen wollen, können Sie die Tastenkombination set-item verwenden:

    pass_manager[1] = DenseLayout(coupling_map)
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] FlowLinear: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller
  • Es wurde ein neuer Impulsbefehl Delay eingeführt, der in einen Impuls Schedule eingefügt werden kann. Dieser Befehl akzeptiert ein duration und kann zu jedem Channel hinzugefügt werden. Andere Befehle dürfen während einer Verzögerung nicht auf einem Kanal geplant werden.

    Die Verzögerung kann wie bei jedem anderen Impulsbefehl hinzugefügt werden. Zum Beispiel:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | sched
    
    # pad schedule
    padded_sched = pad(sched)
    
    assert padded_sched == ref_sched

    Man kann auch zusätzliche Kanäle, die aufgefüllt werden sollen, und eine Zeit, bis zu der aufgefüllt werden soll, angeben, zum Beispiel:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    dc1 = pulse.DriveChannel(1)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | delay(dc1) |  sched
    
    # pad schedule across both channels until up until the first time step
    padded_sched = pad(sched, channels=[dc0, dc1], until=1)
    
    assert padded_sched == ref_sched

Anmerkungen zu Upgrades

  • Zuweisungen und Änderungen am Attribut data von qiskit.QuantumCircuit Objekten werden nun nach denselben Regeln validiert, die auch in der API QuantumCircuit verwendet werden. Dies wurde getan, um die Leistung der Schaltkreis-API zu verbessern, da wir nun davon ausgehen können, dass das Attribut data in einem bekannten Format vorliegt. Wenn Sie zuvor das Attribut data eines Schaltkreisobjekts manuell geändert haben, funktioniert dies möglicherweise nicht mehr, wenn Ihre Änderungen zu einer anderen Datenstruktur als der Liste von Anweisungen mit Kontext im Format [(instruction, qargs, cargs)]

  • Der Standard-Passmanager des Transpilers für die Optimierungsstufe 2 verwendet nun standardmäßig den Layout-Auswahlmechanismus DenseLayout anstelle von NoiseAdaptiveLayout. Der Pass Denselayout wurde ebenfalls geändert, um die Rauschunterdrückung zu verbessern.

  • Die veraltete Klasse DeviceSpecification wurde entfernt. Verwenden Sie stattdessen die Seite PulseChannelSpec. Sie können zum Beispiel etwas wie folgt ausführen:

    device = pulse.PulseChannelSpec.from_backend(backend)
    device.drives[0]    # for DeviceSpecification, this was device.q[0].drive
    device.memoryslots  # this was device.mem
  • Das veraltete Modul qiskit.pulse.ops wurde entfernt. Verwenden Sie die Methoden Schedule und Instruction direkt. Zum Beispiel, anstatt:

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

    Bitte verwenden Sie stattdessen:

    schedule_0.union(schedule_1)
    instruction.union(schedule)

    Das gleiche Muster gilt für andere Funktionen von ops : insert, shift, append, und flatten.

Hinweise zu veralteten Versionen

  • Die Verwendung der Eigenschaft control von qiskit.circuit.Instruction für die klassische Steuerung ist jetzt veraltet. In Zukunft wird diese Eigenschaft für die Quantenkontrolle genutzt werden. Klassisch bedingte Operationen werden stattdessen über die Eigenschaft condition von qiskit.circuit.Instruction abgewickelt.
  • Die Unterstützung für das Setzen von qiskit.circuit.Instruction Parametern mit einem Objekt des Typs qiskit.qasm.node.Node wurde veraltet. Node objekte, die zuvor als Parameter verwendet wurden, sollten in einen unterstützten Typ konvertiert werden, bevor ein neues Instruction Objekt initialisiert oder der Instruction.params Setter aufgerufen wird. Unterstützt werden die Typen int, float, complex, str, qiskit.circuit.ParameterExpression, oder numpy.ndarray.
  • In der qiskit 0.9.0 Version wurde die Darstellung von Bits (sowohl Qubits als auch klassische Bits) von Tupeln der Form (register, index) auf Instanzen der Klassen qiskit.circuit.Qubit und qiskit.circuit.Clbit geändert. Aus Gründen der Abwärtskompatibilität wurde der Vergleich der Gleichheit zwischen einem alten Tupel und den Bitklassen unterstützt, als alles von Tupeln zu Objekten überging. Diese Unterstützung ist jetzt veraltet und wird in Zukunft entfernt werden. Alles sollte in Zukunft die Bit-Klassen anstelle von Tupeln verwenden.
  • Wenn die mpl -Ausgabe entweder für qiskit.QuantumCircuit.draw() oder qiskit.visualization.circuit_drawer() verwendet wird und der style -Kwarg verwendet wird, ist die Übergabe von nicht unterstützten Wörterbuchschlüsseln als Teil des style` -Wörterbuchs jetzt veraltet. Wurden diese unbekannten Argumente bisher stillschweigend ignoriert, werden nicht unterstützte Schlüssel in Zukunft eine Ausnahme auslösen.
  • Der line length kwarg für die Methode qiskit.QuantumCircuit.draw() und die Funktion qiskit.visualization.circuit_drawer() mit dem Textausgabemodus ist veraltet. Er wurde durch den fold kwarg ersetzt, der sich für den Textausgabemodus identisch verhält (aber jetzt auch den mpl-Ausgabemodus unterstützt). line_length wird in einer zukünftigen Version entfernt werden, daher sollten die Aufrufe aktualisiert werden, um stattdessen fold zu verwenden.
  • Das Feld fold im style dict kwarg für die Methode qiskit.QuantumCircuit.draw() und die Funktion qiskit.visualization.circuit_drawer() ist veraltet. Sie wurde in beiden Funktionen durch die fold kwarg ersetzt. Dieser kwarg verhält sich identisch zu dem Feld im style dict.

Fehlerkorrekturen

  • Die Anweisungsschichtung, die allen Arten von Schaltkreiszeichnungen zugrunde liegt, wurde geändert, um die Rechts-/Linksausrichtung zu berücksichtigen. Dies führt manchmal zu einer Ausgabe, die topologisch dem Rendering der Vorgängerversionen entspricht, sich aber visuell von den früheren Renderings unterscheidet. Behebt Problem #2802
  • Fügen Sie memory_slots zu QobjExperimentHeader von pulse Qobj hinzu. Dies behebt einen Fehler im Datenformat der meas_level=2 Ergebnisse von Pulsexperimenten. Gemessene Quantenzustände werden als Bit-String mit Null-Padding zurückgegeben, basierend auf der für memory_slots eingestellten Zahl.
  • Die Visualisierung des rzz-Gatters in der Latex-Schaltkreisschublade wurde an das cu1 -Gatter angepasst, um die Symmetrie des rzz-Gatters widerzuspiegeln. Die Korrektur basiert auf dem cds-Befehl des qcircuit-Latex-Pakets. Behebt Problem #1957

Sonstige Anmerkungen

  • matplotlib.figure.Figure objekte, die von Visualisierungsfunktionen zurückgegeben werden, sind nicht mehr standardmäßig immer geschlossen. Stattdessen werden die zurückgegebenen Figurenobjekte nur geschlossen, wenn das konfigurierte Matplotlib-Backend ein Inline-Jupyter-Backend ist (entweder mit %matplotlib inline oder %matplotlib notebook eingestellt). Output-Figure-Objekte werden mit diesen Backends immer noch geschlossen, um doppelte Ausgaben in Jupyter-Notebooks zu vermeiden (weshalb die Figure.close() ursprünglich hinzugefügt wurden).

Aer- 0.3

Keine Änderung

Ignis- 0.2

Keine Änderung

Aqua- 0.6

Keine Änderung

IBM Q Anbieter 0.3

Keine Änderung

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