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
barriergefolgt von einermeasureOperation zu allen Qubits in der Schaltung hinzu. Erstellt eineClassicalRegister, 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
barriergefolgt von einermeasureOperation hinzu. Ein Qubit ist aktiv, wenn mindestens eine andere Operation auf es einwirkt. Erstellt eineClassicalRegister, 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
barrieraus 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 aufClassicalRegisterinaktiv sind (keine Operationen mit ihnen verbunden sind), wirdClassicalRegisterentfernt.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_decomposeund ein single qubit Euler angle decomposerOneQubitEulerDecomposerwurden demquantum_info.synthesisModul hinzugefügt. -
Ein Transpiler-Pass
MSBasisDecomposerwurde 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.mockenthalten jetzt einen Schnappschuss von echten Gerätekalibrierungsdaten. Dies ist über die Methodeproperties()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
axkwarg wurde zu den folgenden Visualisierungsfunktionen hinzugefügt:qiskit.visualization.plot_histogramqiskit.visualization.plot_state_paulivecqiskit.visualization.plot_state_qsphereqiskit.visualization.circuit_drawer(mplnur Backend)qiskit.QuantumCircuit.draw(mplnur Backend)
Dieser kwarg wird verwendet, um ein
matplotlib.axes.AxesObjekt 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_realundax_imagkwarg wurde zu den folgenden Visualisierungsfunktionen hinzugefügt:qiskit.visualization.plot_state_hintonqiskit.visualization.plot_state_city
Diese neuen kwargs funktionieren genauso wie die neu hinzugefügten
axkwargs 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: UnrollerDie 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: UnrollerWenn 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
Delayeingeführt, der in einen ImpulsScheduleeingefügt werden kann. Dieser Befehl akzeptiert eindurationund kann zu jedemChannelhinzugefü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_schedMan 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
datavonqiskit.QuantumCircuitObjekten werden nun nach denselben Regeln validiert, die auch in der APIQuantumCircuitverwendet werden. Dies wurde getan, um die Leistung der Schaltkreis-API zu verbessern, da wir nun davon ausgehen können, dass das Attributdatain einem bekannten Format vorliegt. Wenn Sie zuvor das Attributdataeines 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
DenseLayoutanstelle vonNoiseAdaptiveLayout. Der PassDenselayoutwurde ebenfalls geändert, um die Rauschunterdrückung zu verbessern. -
Die veraltete Klasse
DeviceSpecificationwurde entfernt. Verwenden Sie stattdessen die SeitePulseChannelSpec. 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.opswurde entfernt. Verwenden Sie die MethodenScheduleundInstructiondirekt. Zum Beispiel, anstatt:ops.union(schedule_0, schedule_1) ops.union(instruction, schedule) # etcBitte verwenden Sie stattdessen:
schedule_0.union(schedule_1) instruction.union(schedule)Das gleiche Muster gilt für andere Funktionen von
ops:insert,shift,append, undflatten.
Hinweise zu veralteten Versionen
- Die Verwendung der Eigenschaft
controlvonqiskit.circuit.Instructionfü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 Eigenschaftconditionvonqiskit.circuit.Instructionabgewickelt. - Die Unterstützung für das Setzen von
qiskit.circuit.InstructionParametern mit einem Objekt des Typsqiskit.qasm.node.Nodewurde veraltet.Nodeobjekte, die zuvor als Parameter verwendet wurden, sollten in einen unterstützten Typ konvertiert werden, bevor ein neuesInstructionObjekt initialisiert oder derInstruction.paramsSetter aufgerufen wird. Unterstützt werden die Typenint,float,complex,str,qiskit.circuit.ParameterExpression, odernumpy.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 Klassenqiskit.circuit.Qubitundqiskit.circuit.Clbitgeä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ürqiskit.QuantumCircuit.draw()oderqiskit.visualization.circuit_drawer()verwendet wird und derstyle-Kwarg verwendet wird, ist die Übergabe von nicht unterstützten Wörterbuchschlüsseln als Teil desstyle`-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 lengthkwarg für die Methodeqiskit.QuantumCircuit.draw()und die Funktionqiskit.visualization.circuit_drawer()mit dem Textausgabemodus ist veraltet. Er wurde durch denfoldkwarg ersetzt, der sich für den Textausgabemodus identisch verhält (aber jetzt auch den mpl-Ausgabemodus unterstützt).line_lengthwird in einer zukünftigen Version entfernt werden, daher sollten die Aufrufe aktualisiert werden, um stattdessenfoldzu verwenden. - Das Feld
foldimstyledict kwarg für die Methodeqiskit.QuantumCircuit.draw()und die Funktionqiskit.visualization.circuit_drawer()ist veraltet. Sie wurde in beiden Funktionen durch diefoldkwarg 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_slotszuQobjExperimentHeadervon pulse Qobj hinzu. Dies behebt einen Fehler im Datenformat dermeas_level=2Ergebnisse von Pulsexperimenten. Gemessene Quantenzustände werden als Bit-String mit Null-Padding zurückgegeben, basierend auf der fürmemory_slotseingestellten 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.Figureobjekte, 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 inlineoder%matplotlib notebookeingestellt). Output-Figure-Objekte werden mit diesen Backends immer noch geschlossen, um doppelte Ausgaben in Jupyter-Notebooks zu vermeiden (weshalb dieFigure.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