Qiskit 0.45 Versionshinweise
Diese Seite enthält die Versionshinweise für Qiskit 0.45, die erste Version, nachdem die alte "Elemente"-Struktur vollständig entfernt wurde. Für alle Versionshinweise, einschließlich derjenigen, die bis zur alten "Meta-Paket"-Struktur von Qiskit zurückreichen, siehe Versionshinweise. Eine Tabelle der Meta-Paket-Versionen finden Sie in den Qiskit 0.44 Release Notes.
0.45.3
Vorspiel
Qiskit 0.45.3 ist ein Punkt-Release ohne Code-Änderungen, außer dass es eine ImportError wenn es feststellt, dass es in einer ungültigen Umgebung mit Qiskit >= 1.0 installiert wurde.
Bitte lesen Sie unseren Migrationsleitfaden zum neuen Paket, um Hilfe zu Fehlern, zur Vorbereitung auf Qiskit 1.0 und weitere detaillierte Hintergrundinformationen zu erhalten.
Qiskit 1.0 soll etwa zwei Wochen nach Qiskit 0.45.3 erscheinen, am 15. Februar 2024, und ist möglicherweise noch nicht verfügbar, wenn Sie diese Nachricht lesen. Diese Änderung wird proaktiv vorgenommen.
Die Paketstruktur von Qiskit ändert sich in Qiskit 1.0, und leider können die geänderten Anforderungen nicht vollständig an pip weitergegeben werden, insbesondere wenn pip install --upgrade Befehle ausgeführt werden, nachdem die Umgebung ursprünglich konfiguriert wurde. Alle Versionen von Qiskit vor 1.0 (einschließlich dieser) haben einen Installationskonflikt mit Qiskit 1.0, den pip nicht beheben kann.
Wenn import qiskit eine ImportError auslöst, befindet sich Ihre Umgebung in einem ungültigen Zustand, und die Versionen von Qiskit 0.45/0.46 und 1.0 sind beide erreichbar, was zu leicht fehlerhaftem Code führen wird. Sie müssen eine neue virtuelle Umgebung erstellen und sicherstellen, dass nur eine der beiden Versionen installiert ist. Insbesondere wenn Sie Qiskit 1.0 installieren möchten, dürfen Sie keine Pakete installieren, die von qiskit-terra abhängen; diese Pakete sind mit Qiskit 1.0 nicht kompatibel und müssen aktualisiert werden. Wenn Sie beabsichtigen, Qiskit 0.45 oder 0.46 zu installieren, müssen Sie sicherstellen, dass Sie nicht versuchen, qiskit>=1.0 zu installieren.
Wenn Sie eine Bibliothek entwickeln, die auf Qiskit basiert und Sie immer noch eine Abhängigkeit von qiskit-terra haben, sollten Sie dringend ein neues Paket veröffentlichen, das nur von qiskit abhängt. Seit der Version 0.44 enthält das qiskit -Paket nur noch den qiskit-terra -Compilerkern (die Komponente, die jetzt einfach "Qiskit" genannt wird). Wenn also Ihre Mindestversion 0.44 ist, können Sie eine qiskit-terra>=0.44 -Abhängigkeit sicher auf qiskit>=0.44 umstellen, ohne dass sich etwas an der Installation ändert. Weitere Einzelheiten und Empfehlungen für Tests und Vorbereitungen finden Sie im Abschnitt für Entwickler im Migrationsleitfaden.
0.45.2
Vorspiel
Qiskit 0.45.2 ist ein kleines Patch-Release, das einige Fehler aus der 0.45 Release-Serie behebt.
Fehlerkorrekturen
-
Aufruf von
copy()odercopy_empty_like()auf einerBlueprintCircuitwird nun korrekt dieglobal_phaseauf die Kopie übertragen. Zuvor war die globale Phase nach dem Kopieren immer gleich Null. -
QPY (mit
qpy.dump()undqpy.load()) serialisiert und deserialisiert nun korrekt Quantenschaltungen mit Clifford-Operatoren (Clifford). -
Ein Problem in der
mplSchaltkreisschublade wurde behoben, bei dem der Text über das Ende des Feldes für eineSwitchCaseOpüber das Ende des Feldes hinaus gedruckt wurde, wenn der Standardfall leer war. -
Die Übertragung von Qubit-Argumenten von
QuantumCircuit.delay()erzeugt nun korrekt einzelneDelayanweisungen für jedes Qubit, wie beabsichtigt. Zuvor wurde bei bestimmten Iterabilien (z. Bsets) eine ungültige Schaltung erzeugt, die an ungewöhnlichen Stellen fehlschlagen konnte. -
Ein Fehler wurde behoben, der zu einer Fehlermeldung führte, wenn ein Benutzer versuchte, die Kalibrierungsdaten eines Gatters in
Targetin einer bestimmten Situation zu laden. Dies tritt auf, wenn das Backend nur teilweise Kalibrierungsdaten meldet, z. B. wenn in einer Befehlsdefinition auf einen Wellenformimpuls verwiesen wird, dieser Wellenformimpuls aber nicht in der Impulsbibliothek enthalten ist. In diesem Fall kann das Qiskit-Impulsobjekt nicht erstellt werden, was dazu führt, dass der Impulsplan für die Kalibrierung nicht erstellt werden kann. Wenn nun die Kalibrierungsdaten unvollständig sind, wirdTargetbehandelt dies so, als ob überhaupt keine Kalibrierung gemeldet würde, und löst keine Ausnahme aus. -
Es wurde ein Problem mit dem
Optimize1qGatesDecompositiontranspiler-Durchgang behoben, bei dem möglicherweise ein einzelnes ideales (d. h. die Fehlerrate ist0.0) Gatter resynthetisiert wurde, das in derTarget. Dies wurde nun korrigiert, so dass der PassOptimize1qGatesDecompositionauf das Gatter des Schaltkreises verschoben wird, wenn die Fehlerrate (einschließlich der Anzahl der Gatter) gleich ist. Behoben #10568 -
Es wurde ein Problem mit dem
OptimizeSwapBeforeMeasurePass behoben, bei dem Schaltungen mit Swap- und Measure-Anweisungen falsch optimiert wurden. Dieser Commit behebt den Fehler durch Änderung vonDAGCircuit.successors()zuDAGCircuit.descendants(). Außerdem habe ich ein paar zusätzliche Tests hinzugefügt, um sicherzustellen, dass der Fehler behoben ist. Zum Beispiel:from qiskit import QuantumCircuit from qiskit.transpiler.passes import OptimizeSwapBeforeMeasure pass_ = OptimizeSwapBeforeMeasure() qc = QuantumCircuit(2, 1) qc.swap(0, 1) qc.measure(0, 0) qc.measure(0, 0) print(qc.draw()) print(pass_(qc).draw())vorher drucken würde:
┌─┐┌─┐ q_0: ─X─┤M├┤M├ │ └╥┘└╥┘ q_1: ─X──╫──╫─ ║ ║ c: 1/════╩══╩═ 0 0 ┌─┐ q_0: ┤M├─── └╥┘┌─┐ q_1: ─╫─┤M├ ║ └╥┘ c: 1/═╩══╩═ 0 0und nun ist der zweite Kreislauf korrekt optimiert auf:
q_0: ────── ┌─┐┌─┐ q_1: ┤M├┤M├ └╥┘└╥┘ c: 1/═╩══╩═ 0 0 -
Behebung eines Fehlers in der
StabilizerStatestring-Darstellung.
0.45.1
Vorspiel
Qiskit Terra 0.45.1 ist ein kleines Patch-Release, das einige Fehler aus der 0.45 Release-Serie behebt. Es ist auch die erste Version mit offizieller Unterstützung für Python 3.12. Die Version 0.45.1 unterstützt Python 3.8, 3.9, 3.10, 3.11, und 3.12.
Neue Funktionen
- Unterstützung für die Verwendung von Qiskit mit Python 3.12 wurde hinzugefügt. Ab dieser Version unterstützt Qiskit den Betrieb mit den Python Versionen 3.8, 3.9, 3.10, 3.11 und 3.12.
Fehlerkorrekturen
-
QuantumCircuit.barrier()erzeugt nun eine korrekte Ausgabe, wenn es einesetals eine seiner Eingaben. Zuvor wurde eine ungültige Operation an den Schaltkreis angehängt, obwohl dies in der Praxis in der Regel keine erkennbaren Probleme verursacht. Behoben #11208 -
Die Eigenschaft
Instruction.condition_bitswird nun korrekt mit klassischen Ausdrücken zur Laufzeit (qiskit.circuit.classical). -
Behebung der
hash()von Qiskit PulseChannelObjekten (wie z.BDriveChannel) in Fällen, in denen der Kanal von einem Python Prozess zu einem anderen übertragen wurde, der einen anderen Hash-Seed verwendete. -
Konditionierte benutzerdefinierte Tore, die von OpenQASM 2 importiert wurden, behalten nun ihre Bedingungen korrekt bei, wenn sie eingelegt und tief kopiert werden. Bisher verlor jedes bedingte benutzerdefinierte Tor (definiert durch eine
gateAnweisung in einer OpenQASM 2 Datei) seine Bedingung, wenn es kopiert oder eingefügt wurde. -
Korrigierte QPY-Deserialisierung der
StatePreparationundInitializeschaltkreisanweisungen mit String- und Integer-Parametern (im Gegensatz zu einem expliziten Zustandsvektor, der bereits funktionierte). Behoben #11158. -
Es wurde ein Fehler in
SabreLayoutbehoben, bei dem es nicht möglich war, die Registerinformationen in dasLayoutobjekt, das fürTranspileLayout.initial_layout. Dies betraf die Visualisierung von Schaltkreisen mitQuantumCircuit.draw()undcircuit_drawer()nach der Transpilierung, die eine virtuelle Qubit-Beschriftung der FormQubit[QuantumRegister(6, 'q', 0)]anstelle der erwarteten virtuellen Qubit-Beschriftung unter Verwendung des Registernamens (z.B.q0) anzeigt. Behoben #11038 -
Es wurde ein Problem mit
qpy.dump()behoben, das dazu führte, dass die Funktion möglicherweise den Wert vonuse_symenginebeim Serialisieren einesScheduleBlockobjekts. Dies würde dazu führen, dass ein ungültiger QPY-Payload generiert wird, da er angibt, dass er symengine für symbolische Ausdrücke verwendet, aber tatsächlich sympy serialisierte Daten enthält. -
Ein Fehler wurde behoben, der dazu führte, dass
UnitaryOverlapbei der Initialisierung einen Fehler verursachte, wenn ein Eingangsschaltkreis eine Barriere enthielt.
0.45.0
Vorspiel
Qiskit 0.45.0 ist die letzte Funktionsversion vor 1.0. Sie bereitet den Boden für die API-Änderungen vor, die wir für unsere erste große Version planen, einschließlich der Entfernung zahlreicher veralteter Funktionen sowie einer Reihe neuer Verwerfungen.
Wenn Ihr Projekt von Qiskit abhängt, kann es auf Funktionen angewiesen sein, die in Qiskit 1.0 nicht mehr unterstützt werden. Aus diesem Grund empfehlen wir Ihnen, Ihre unterstützte Version proaktiv auf <1.0 zu begrenzen.
Einige der wichtigsten Funktionen von Qiskit 0.45.0 sind:
- Ab dieser Version sind alle unparametrisierten Gatter in der Qiskit-Standardschaltungsbibliothek nun Singletons. Standardmäßig teilen sich diese Gatter eine einzige Instanz im Speicher, so dass, sobald ein Gatter eines bestimmten Typs, sagen wir
XGateinstanziiert ist, werden alle nachfolgenden Instanzen vonXGateeine Referenz auf die erste Instanz sein. Dies führt zu einer geringeren Speichernutzung und einem geringeren Konstruktionsaufwand bei der Verwendung mehrerer Gatter desselben Typs in einer Schaltung. Um diese Funktion zu realisieren, wurden neue Basisklassen eingeführt:SingletonInstructionundSingletonGate. Weitere Einzelheiten finden Sie in den Funktionshinweisen. - Wir haben eine neue generische Passmanager-Schnittstelle hinzugefügt, die sich im neuen
qiskit.passmanagermodul zu finden ist. Dabei handelt es sich um eine Verallgemeinerung des Pass-Managers, der für die Erstellung des Qiskit-Transpilers verwendet wurde, und es wird ein generischer Rahmen eingeführt, der es den Benutzern ermöglicht, neue Pass-Manager zu erstellen, die verschiedene Zwischenrepräsentationen (IRs) verwenden. Das Modul umfasst eine generische Passmanager-Basisklasse, Ablaufsteuerungen und die notwendige Infrastruktur zur Verwaltung der Ausführung von Passmanager-Aufgaben. Die neue Schnittstelle wurde verwendet, um den bestehenden Passmanager imqiskit.transpilermodul umgestaltet, wobei technische Mängel im Code beseitigt und die Benutzerfreundlichkeit und Leistung verbessert wurden. Weitere Einzelheiten finden Sie in den Funktions- und Aktualisierungshinweisen. - 0.45.0 ermöglicht es den Benutzern, besser mit den vom Transpiler durchgeführten Layout-Permutationen zu interagieren. Die Daten, die in der Klasse
TranspileLayoutklasse enthaltenen Daten sind nun durch eine Reihe neuer Methoden und Attribute leichter zugänglich. Und eine neueSparsePauliOp.apply_layout()methode ermöglicht die Anwendung einer bestimmten Layout-Permutation auf eineSparsePauliOpobservable anzuwenden, die für eine Eingangsschaltung des Transpilers erstellt wurde. Weitere Einzelheiten finden Sie in den Funktionshinweisen. - Schließlich haben wir annotierte Operationen mit der neuen
AnnotatedOperationklasse eingeführt, die es ermöglicht, komplexe Schaltkreisanweisungen als Basisanweisung mit einer Reihe von Modifikatoren zu formulieren. Anstelle eines bestimmten Operationstyps, der die kontrollierte Umkehrung von aRXGateimplementiert, können wir nun eine annotierteRXGatemit inversen und kontrollierten Attributen verwenden. Weitere Einzelheiten finden Sie in den Funktionshinweisen.
Schaltkreise Funktionen
-
Hinzufügen einer neuen Klasse
AnnotatedOperationhinzugefügt, die eine Unterklasse vonOperationist und eine "Basisoperation" darstellt, die durch eine Liste von "Modifikatoren" verändert wird. Die Basisoperation ist vom TypOperationund die derzeit unterstützten Modifikatoren sind vom TypInverseModifier,ControlModifierundPowerModifier. Die Modifikatoren werden in der Reihenfolge angewendet, in der sie in der Liste erscheinen.Beispiel:
gate = AnnotatedOperation( base_op=SGate(), modifiers=[ InverseModifier(), ControlModifier(1), InverseModifier(), PowerModifier(2), ], )ist logisch äquivalent zu
gate = SGate().inverse().control(1).inverse().power(2), oder zu:gate = AnnotatedOperation( AnnotatedOperation(SGate(), [InverseModifier(), ControlModifier(1)]), [InverseModifier(), PowerModifier(2)], )Diese Äquivalenz ist jedoch nur logisch, die internen Darstellungen sind sehr unterschiedlich.
Der Einfachheit halber kann ein einzelner Modifikator auch direkt übergeben werden, so ist
AnnotatedGate(SGate(), [ControlModifier(1)])äquivalent zuAnnotatedGate(SGate(), ControlModifier(1)).Eine kommentierte Operation zeichnet sich dadurch aus, dass die Schaltkreisdefinition nicht bei der Deklaration der Operation erstellt wird, sondern erst während der Transpilierung, insbesondere während des
HighLevelSynthesistranspiler-Durchlaufs.Eine kommentierte Operation kann auch als ein "übergeordnetes" oder "abstrakteres" Objekt betrachtet werden, das zu einem Quantenschaltkreis hinzugefügt werden kann. Dies ermöglicht das Schreiben von Transpiler-Optimierungspässen, die diese übergeordnete Darstellung nutzen, z. B. das Entfernen eines Gatters, auf das unmittelbar sein Inverses folgt (beachten Sie, dass diese Reduzierung möglicherweise nicht möglich ist, wenn sowohl das Gatter als auch sein Inverses zunächst in einfachere Gatter synthetisiert werden).
In gewissem Sinne kann eine kommentierte Operation als eine Erweiterung von
ControlledGateangesehen werden, die es auch ermöglicht, die Kontrolle über die Basisoperation zu erweitern. Für die Zukunft planen wir den Austausch vonControlledGatedurchAnnotatedOperation. Ähnlich wie bei kontrollierten Gattern synthetisiert der Transpiler kommentierte Operationen, bevor das Layout/Routing stattfindet.Ab sofort können die kommentierten Operationen nur auf der obersten Ebene eines Quantenschaltkreises erscheinen, d.h. sie können nicht innerhalb des rekursiv definierten
definitionSchaltkreises erscheinen. Wir planen, diese Einschränkung später aufzuheben. -
Eine neue Option
max_num_qubitswurde zuqiskit.circuit.CommutationChecker.commute()hinzugefügt, die die maximale Anzahl von Qubits angibt, die für die teurere, auf Matrixmultiplikation basierende Kommutativitätsprüfung berücksichtigt werden sollen. Dadurch wird vermieden, dass intern Arrays der Größe zugewiesen werden müssen. Einfachere Versionen der Kommutativitätsprüfung (z. B. zwei Quantenoperationen sind kommutativ, wenn sie über disjunkte Mengen von Qubits laufen) funktionieren auch ohne diese Begrenzung. -
Ein neues Argument,
check_input, wurde dem Konstruktor für dieUnitaryGateklasse. Dieses Flag wird verwendet, um die Standardinitialisierungsprüfung zu deaktivieren, dass das Eingabeobjekt eine unitäre Matrix darstellt. Dies kann verwendet werden, um die Erstellung vonUnitaryGateobjekten zu beschleunigen, wenn Sie wissen, dass die Eingabe bereits eine unitäre Matrix ist. Diese neue Option sollte nur in diesen Fällen verwendet werden, denn wenn sie aufFalsegesetzt wird und die Eingabe nicht einheitlich ist, führt dies zu einem ungültigenUnitaryGateObjekt. -
Eine neue Methode
Parameter.assign()wurde hinzugefügt. Diese Methode dient in erster Linie als schneller Weg zur Verbesserung der Leistung vonQuantumCircuit.assign_parameters()für den häufigen Fall von Schaltungen, die überwiegend "Ausdrücke" enthalten, die eigentlich nur einzelne, später zuzuweisende Parameter sind. -
Die Leistung von
QuantumCircuit.assign_parameters()bei der Zuweisung eines einzelnen Parameters einer Schaltung, die viele Parameter umfasst, wurde verbessert. -
Einführung von zwei neuen Klassen,
SingletonInstructionundSingletonGate, die Unterklassen vonInstructionundGatesind, die eine einzige Instanz für alle Objekte dieses Typs verwenden. Die Absicht hinter dieser Klasse ist es, den Speicher- und Konstruktionsaufwand bei der Verwendung mehrerer Gatter in einer Schaltung zu minimieren, wobei der Kompromiss darin besteht, einen globalen gemeinsamen Zustand zu haben. Aus diesem Grund ist diese Klasse nur auf Gatter anwendbar, die keinen eindeutigen und/oder veränderbaren Zustand in einer Instanz gespeichert haben. Das beste Beispiel dafür istXGateenthält keinen Zustand und könnteSingletonGateverwenden (und tut dies ab dieser Version), währendRXGateeinen Winkelparameter in einer Instanz speichert und daher nichtSingletonGatenicht verwenden kann, weil eine einzige gemeinsam genutzte globale Instanz die Parameterwerte nicht darstellen kann.Ein weiteres potenzielles Problem, das bei der Verwendung von Singleton-Klassen beachtet werden muss, ist, dass das
Instructiondatenmodell einige veränderbare Zustände unterstützt. Genauer gesagt, dielabel,duration,unit, undconditionattribute sind alle zugänglich und veränderbar in derInstructionund ihren direkten Unterklassen. Dies ist jedoch unvereinbar mit der Verwendung eines gemeinsamen Objekts überSingletonInstruction. Für Instanzen vonSingletonInstructionist es nicht erlaubt, diese Attribute direkt zu setzen, und es wird eine Ausnahme ausgelöst. Wenn sie für eine bestimmte Instanz benötigt werden, müssen Sie sicherstellen, dass Sie eine veränderbare Instanz haben, indem SieInstruction.to_mutable()(oder verwenden SieInstruction.c_if()fürcondition).label,durationundunitkönnen auch als Schlüsselwortargumente bei der Klassenkonstruktion angegeben werden. -
Die folgenden Standardbibliotheks-Gates sind nun Instanzen von
SingletonGate:Das bedeutet, dass, wenn diese Klassen instanziiert werden als (z.B.)
XGate()alle Konstruktorvorgaben verwenden, teilen sie sich alle eine einzige globale Instanz. Dies führt zu einer starken Verringerung des Speicher-Overheads für > 1 Objekt dieser Typen und zu einer erheblich schnelleren Objektkonstruktionszeit. -
Einführung einer neuen Klasse
SingletonControlledGateeingeführt, die eine Unterklasse vonControlledGateist, die eine einzige Instanz für alle Objekte dieses Typs verwendet. Die Absicht hinter dieser Klasse ist es, den Speicher- und Konstruktionsaufwand bei der Verwendung mehrerer Gatter in einer Schaltung zu minimieren, und zwar mit dem Kompromiss, einen globalen gemeinsamen Zustand zu haben. Aus diesem Grund ist diese Klasse nur auf Gatter anwendbar, die keinen eindeutigen und/oder veränderbaren Zustand in einer Instanz gespeichert haben. Zum Beispiel enthält einCXGateenthält keinen Zustand und kann daherSingletonControlledGateverwenden (und tut dies ab dieser Version). Im Gegensatz dazu,CRXGateeinen Winkelparameter als Teil seiner Instanzdaten und kann daher nicht mitSingletonControlledGate.Ein weiteres potenzielles Problem, das bei der Verwendung von
SingletonControlledGateist, dass das ursprüngliche Datenmodell vonControlledGatedie Mutation unterstützt. Genauer gesagt, dielabel,duration,unit,condition, undctrl_stateattribute sind alle zugänglich und veränderbar in derControlledGatezugreifen, aber die Mutation dieser Attribute inSingletonControlledGateunterklassen ist nicht erlaubt und löst eine Ausnahme aus. Diese Attribute können angepasst werden, aber nur zum Zeitpunkt der Erstellung (d.h. über den Konstruktor). In diesem Fall ist das neu konstruierte Tor eine separate Instanz mit dem benutzerdefinierten Zustand anstelle der global freigegebenen Instanz. Sie können auch die MethodeSingletonControlledGate.to_mutable()verwenden, um eine veränderbare Kopie eines Gate-Objekts zu erhalten und dann die Attribute wie bei jedem anderen Objekt zu verändernInstructionobjekt. -
Die folgenden Standardbibliotheks-Gates sind nun Instanzen von
SingletonControlledGate:Das bedeutet, dass, wenn nicht
label,condition,duration,unitoderctrl_statebei der Erstellung der Instanz gesetzt werden, sie alle eine einzige globale Instanz teilen, wenn ein neues Gate-Objekt erstellt wird. Dies führt zu einer erheblichen Verringerung des Speicheraufwands für > 1 Objekt dieser Typen. -
Hinzufügen einer neuen Methode
Instruction.to_mutable()und AttributInstruction.mutabledie verwendet werden, um eine veränderbare Kopie zu erhalten und zu prüfen, ob einInstructionobjekt veränderbar ist. Mit der Einführung vonSingletonGatekönnen diese Methoden verwendet werden, um eine einheitliche Schnittstelle für den Umgang mit der Veränderlichkeit von Instruktionsobjekten zu schaffen. -
Ein Attribut hinzugefügt
Instruction.base_classhinzugefügt, das den "Basistyp" einer Anweisung ermittelt. Viele Instruktionen werdentype(obj) == obj.base_classerfüllen, aber die Singleton-Instanzen vonSingletonInstructionundSingletonGatesind Unterklassen ihres Basistyps. Sie können das Attribut newbase_classattribut verwenden, um die Basisklasse zu finden. In der Attributdokumentation finden Sie Überlegungen dazu, wann andere Unterklassen ihrebase_classändern dürfen und was dies für die Ausführung bedeutet. -
Hinzufügen der
UnitaryOverlapschaltung zur Qiskit-Schaltungsbibliothek hinzugefügt. Sie kann verwendet werden, um die Treue von Zuständen zu berechnen, die von Unitaries erzeugt werden, indem man die Wahrscheinlichkeit der Ausgangsverteilung im All-Zero-Zustand betrachtet oder, äquivalent, indem man den Erwartungswert des Projektors auf den All-Zero-Zustand berechnet. Dies ist nützlich für Anwendungen wie das maschinelle Lernen und die Berechnung angeregter Zustände in der Quantenchemie, um nur einige zu nennen.
Puls-Funktionen
-
Aktivierte Schaltkreis-zu-Impuls-Planung mit
BackendV2.# import a fake backend which is a sub-class of BackendV2 from qiskit.providers.fake_provider import FakePerth from qiskit.compiler.scheduler import schedule from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1, 1) qc.x(0) qc.measure(0,0) sched = schedule(circuits=qc, backend=FakePerth())Da
BackendV2nicht von der Funktionschedule()funktion nicht unterstützt wurde, führte dies dazu, dass die Methodeschedule()fehlschlug, wenn das Argumentbackendmit einer Instanz vonBackendV2. Siehe #10837 für weitere Informationen.
OpenQASM Funktionen
-
Das Modul OpenQASM 2
qiskit.qasm2hat die Exportfunktionendump()unddumps(). Diese werden in ähnlicher Weise verwendet wie die vorherigenQuantumCircuit.qasm():from qiskit import qasm2, QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0, 1) qc.measure([0, 1], [0, 1]) print(qasm2.dumps(qc))Die neuen Funktionen stammen aus demselben Code wie
QuantumCircuit.qasm()die nach und nach abgeschafft und durch die neuen Pfade ersetzt werden, um eine kohärentere Schnittstelle im Vergleich zu OpenQASM 3 (qiskit.qasm3) und QPY (qiskit.qpy) Modulen zu bieten. Dies ist besonders wichtig, da der Name der Methodeqasm()keinen Hinweis auf die Version von OpenQASM gibt und Qiskit seit seiner ursprünglichen Hinzufügung mehrere Serialisierungsmodule erhalten hat, die leicht verwechselt werden könnten.
QPY-Funktionen
-
QPY unterstützt nun die Verwendung der symengine-nativen Serialisierung und Deserialisierung für Objekte vom Typ
ParameterExpressionsowie symbolische Ausdrücke in Pulse Schedule Blöcken. Dies ist eine schnellere Alternative zur Serialisierung, wird aber nicht von allen Plattformen unterstützt. Bitte überprüfen Sie, ob Ihre Zielplattform von der symengine-Bibliothek unterstützt wird, bevor Sie diese Option setzen, da sie von qpy zur Deserialisierung der Nutzdaten benötigt wird.Die Funktion kann über den Parameter
use_symengineinqpy.dump()aktiviert werden:from qiskit.circuit import QuantumCircuit, Parameter from qiskit import qpy theta = Parameter("theta") phi = Parameter("phi") sum_param = theta + phi qc = QuantumCircuit(1) qc.rz(sum_param, 0) qc.measure_all() with open('bell.qpy', 'wb') as fd: qpy.dump(qc, fd, use_symengine=True) with open('bell.qpy', 'rb') as fd: new_qc = qpy.load(fd)[0]
Quanteninformationsmerkmale
-
Hinzugefügt
Clifford.from_linear_function()undClifford.from_permutation()methoden, die einCliffordobjekt ausLinearFunctionund vonPermutationGateerstellen. Infolgedessen kann aCliffordkann nun direkt aus a konstruiert werdenLinearFunction, aPermutationGateoder einer Quantenschaltung mit solchen Gattern konstruiert werden. -
Die
Operatorklasse hat jetzt einedraw()methode, mit der sie als Textmatrix, IPython LaTeX Objekt oder LaTeX Quelle angezeigt werden kann. Die Standard-Zeichenart ist immer noch der ASCII__repr__des Operators. -
Eine neue Methode wurde hinzugefügt,
apply_layout()zu derSparsePauliOpklasse. Diese Methode wird verwendet, um einTranspileLayoutlayout aus dem Transpiler auf eineSparsePauliOpobservable anzuwenden, das für eine Eingangsschaltung des Transpilers erstellt wurde. Dies ermöglicht die Arbeit mitBaseEstimatorimplementierungen und lokalen Umsetzungen einfacher. Zum Beispiel:from qiskit.circuit.library import RealAmplitudes from qiskit.quantum_info import SparsePauliOp from qiskit.primitives import BackendEstimator from qiskit.compiler import transpile from qiskit.providers.fake_provider import FakeNairobiV2 psi = RealAmplitudes(num_qubits=2, reps=2) H1 = SparsePauliOp.from_list([("II", 1), ("IZ", 2), ("XI", 3)]) backend = FakeNairobiV2() estimator = BackendEstimator(backend=backend, skip_transpilation=True) thetas = [0, 1, 1, 2, 3, 5] transpiled_psi = transpile(psi, backend, optimization_level=3) permuted_op = H1.apply_layout(transpiled_psi.layout) res = estimator.run(transpiled_psi, permuted_op, thetas)wo eine Eingangsschaltung lokal umgesetzt wird, bevor sie an
runweitergegeben wird. Durch die Transpilierung wird die ursprüngliche Schaltung von 2 auf 7 Qubits (die Größe vonbackend) erweitert und ihr Layout permutiert, das dann aufH1angewendet wird, indemapply_layout()angewendet wird, um die Transformationen widerzuspiegeln, die vontranspile().
Transpiler-Funktionen
-
Die Klasse
HighLevelSynthesisklasse wird erweitert, um Schaltungen mit Objekten des TypsAnnotatedOperation. -
Ein neues
qiskit.passmanagermodul wurde der Qiskit-Bibliothek hinzugefügt. Dieses Modul implementiert einen generischen Passmanager und Ablaufsteuerungen und bietet eine Infrastruktur zur Verwaltung der Ausführung von Passmanageraufgaben. Das Modul bietet Basisklassen für Übergänge (GenericPass) und Ablaufsteuerungen (BaseController) sowie eine neue Schnittstellenklasse,passmanager.Task, zur Verwaltung der Ausführung des Passmanagers (siehe die MethodeTask.execute()). Diese neuen Klassen folgen dem zusammengesetzten Muster, da Ablaufsteuerungen Sammlungen von Durchläufen sind und eine Steuerung rekursiv in die Task-Pipeline verschachtelt werden kann. Es ist auch zu beachten, dass die Basisklassen die Typen der Eingabe- und Ausgabeobjekte nicht kennen und dass sie für einen bestimmten Programmtyp untergeordnet werden müssen, um ihn zu optimieren. Dieses vereinheitlichte Design reduziert die Komplexität des herkömmlichen Pass-Managers und erfordert nicht mehr die Verwendung von Klassen wieRunningPassManager, um die Ausführungslogik und die Renormalisierung der Aufgabenstruktur zu handhaben. Dasqiskit.transpilermodul wurde reorganisiert, um die vorhandenen Passmanager auf der Grundlage des generischen Passmanagers neu zu erstellen. Weitere Einzelheiten finden Sie in den Upgrade-Hinweisen. -
Hinzufügen einer neuen Analyse
SabrePreLayoutdurchgang hinzugefügt, der ein Startlayout fürSabreLayouterstellt und das Layout in den Eigenschaftssatzwertsabre_starting_layoutsschreibt.Der Durchlauf funktioniert, indem die Kopplungskarte mit immer mehr "zusätzlichen" Kanten erweitert wird, bis
VF2Layouteine perfekte Graphenisomorphie gefunden wird. Genauer gesagt enthält die erweiterte Kopplungskarte Kanten zwischen Knoten, die in der ursprünglichen Kopplungskarte innerhalb eines bestimmten Abstandsdliegen, und der Wert vondwird erhöht, bis eine Isomorphie gefunden wird. Der Durchlauf minimiert optional auch die Anzahl der zusätzlichen Kanten, die am Layout beteiligt sind, bis ein lokales Minimum gefunden ist. Dies beinhaltet das Entfernen zusätzlicher Kanten und den Aufruf vonVF2Layoutum zu prüfen, ob noch eine Isomorphie besteht.Hier ist ein Beispiel für den Aufruf der
SabrePreLayoutvorSabreLayout:import math from qiskit.transpiler import CouplingMap, PassManager from qiskit.circuit.library import EfficientSU2 from qiskit.transpiler.passes import SabrePreLayout, SabreLayout qc = EfficientSU2(16, entanglement='circular', reps=6, flatten=True) qc.assign_parameters([math.pi / 2] * len(qc.parameters), inplace=True) qc.measure_all() coupling_map = CouplingMap.from_heavy_hex(7) pm = PassManager( [ SabrePreLayout(coupling_map=coupling_map), SabreLayout(coupling_map), ] ) pm.run(qc) -
Hinzufügen der Argumente
coupling_map,targetunduse_qubit_indiceszumHighLevelSynthesistranspiler-Pass. Das Argumenttargetspezifiziert das Ziel-Backend, so dass die Synthese-Plugins, die innerhalb des Passes aufgerufen werden, auf alle zielspezifischen Informationen zugreifen können, wie z. B. die Kopplungskarte und den unterstützten Gattersatz. Das Argumentcoupling_mapgibt nur die Kopplungskarte an und wird nur verwendet, wenntargetnicht angegeben ist. Das Argumentuse_qubit_indicesgibt an, ob der High-Level-Synthese-Durchlauf vor oder nach dem Setzen des Layouts erfolgt, d. h. ob die Qubit-Indizes der Higher-Level-Objekte den Qubit-Indizes auf dem Ziel-Backend entsprechen. -
Die Argumente
coupling_map,targetundqubitswurden zuHighLevelSynthesisPlugin. Das Positionsargumenttargetgibt das Ziel-Backend an, so dass das Plugin auf alle zielspezifischen Informationen zugreifen kann, wie z. B. die Kopplungskarte, den unterstützten Gattersatz und so weiter. Das Positionsargumentcoupling_mapgibt nur die Kopplungskarte an und wird nur verwendet, wenntargetnicht angegeben ist. Das Positionsargumentqubitsgibt die Liste der Qubits an, über die das Higher-Level-Objekt definiert wird, falls die Synthese auf der physikalischen Schaltung erfolgt. Der Wert vonNonezeigt an, dass das Layout noch nicht ausgewählt wurde.Dies ermöglicht eine saubere Trennung der Optionen für Synthese-Plugins in allgemeine Schnittstellenoptionen für Plugins (d. h.
coupling_map,targetundqubits) und in Plugin-spezifische Optionen (ein freies Konfigurationswörterbuch, das überoptionsspezifiziert wird). Es sei darauf hingewiesen, dass diese Änderung rückwärtskompatibel ist. Wenn die Optionencoupling_mapusw. nicht ausdrücklich zur Methoderun()des Plugins hinzugefügt werden, erscheinen sie als Teil vonoptions. -
Die
DAGCircuitmethodenapply_operation_back()undapply_operation_front()haben das Schlüsselwortargumentcheckerhalten, das aufFalsegesetzt werden kann, um die Überprüfung zu überspringen, ob die Eingaben dieDAGCircuitdatenstruktur-Invarianten erfüllen. Dies ist nützlich, um die Leistung zu optimieren, wenn die DAG aus bekannten guten Daten aufgebaut wird, z. B. bei Transpiler-Durchläufen. -
Die Methode
CouplingMap.reduce()akzeptiert jetzt ein zusätzliches Argumentcheck_if_connected, das standardmäßigTruelautet. Dies entspricht dem bisherigen Verhalten, bei dem geprüft wird, ob die reduzierte Kopplungskarte verbunden bleibt, und wenn nicht, eineCouplingErrorerstellt wird. Bei der EinstellungFalsewird die Prüfung übersprungen, so dass unverbundene reduzierte Kupplungskennfelder möglich sind. -
Der Konstruktor für
HighLevelSynthesistranspiler pass akzeptiert jetzt zusätzliche Argumenteequivalence_library,basis_gatesundmin_qubits. Der Durchgang kann nun benutzerdefinierte Definitionen ähnlich abrollen wieUnrollCustomDefinitionsabrollen und fasst damit die Funktionalität des letzteren Passes vollständig zusammen. Insbesondere,HighLevelSynthesisist jetzt rekursiv, wodurch ein Versehen in der ursprünglichen Implementierung behoben wurde. Wenn also entwedertargetoderbasis_gatesspezifiziert wird, werdenHighLevelSynthesisrekursiv alle High-Level-Objekte, kommentierten Operationen und benutzerdefinierten Gatter in der Schaltung synthetisiert, wobei nur Gatter übrig bleiben, die vom Ziel unterstützt werden oder zur Äquivalenzbibliothek gehören. Dies ermöglicht die VerwendungHighLevelSynthesisals Drop-in-Ersatz fürUnrollCustomDefinitions. Wenn hingegen wedertargetnochbasis_gatesangegeben sind, synthetisiert der Durchlauf nur die "Top-Level" High-Level-Objekte und kommentierten Operationen, d.h. er steigt nicht rekursiv in das Feld für benutzerdefinierte Gatterdefinitionab. Dies ist rückwärtskompatibel sowohl mitUnrollCustomDefinitions(die nichts tun würde) als auch mit dem älteren Verhalten des High-Level-Synthese-Passes, der es erlaubt, ihn als Zwischentransformation zu verwenden und nur High-Level-Objekte zu synthetisieren, wie sie vonHLSConfigspezifiziert werden. -
Erhebliche Verbesserung der Leistung des
MergeAdjacentBarrierstranspiler-Durchlaufs, bei dem die gesamte DAG neu aufgebaut wurde, um die Barrieren zusammenzuführen. -
Ein neues Schlüsselwortargument,
min_qubits, wurde dem Konstruktor desBasisTranslatortranspiler-Passes. Bei einem Wert ungleich Null wird damit eine Mindestanzahl von Qubits für die Filterung von Operationen festgelegt, die in der Schaltung zu übersetzen sind. Wenn zum Beispielmin_qubits=3gesetzt ist, wird dieBasisTranslatorinstanz nur Gatter in der Schaltung übersetzen, die mit 3 oder mehr Qubits arbeiten. -
Ein neues Schlüsselwortargument,
min_qubits, wurde dem Konstruktor desUnrollCustomDefinitionstranspiler-Passes. Bei einem Wert ungleich Null wird damit eine Mindestanzahl von Qubits für die Filterung von Operationen festgelegt, die in der Schaltung zu übersetzen sind. Wenn zum Beispielmin_qubits=3gesetzt ist, wird dieUnrollCustomDefinitionsinstanz nur Gatter in der Schaltung übersetzen, die mit 3 oder mehr Qubits arbeiten. -
Unterstützung für den
SabreLayoutpass, um Prüfungen mit bestimmten Startlayouts hinzuzufügen. DerSabreLayouttranspiler-Durchlauf führt in der Regel mehrere Layout-Versuche durch, die alle mit völlig zufälligen Layouts beginnen, die dann einen Routing-Durchlauf verwenden, um dieses Layout zu permutieren, anstatt Swaps einzufügen, um ein Layout zu finden, das zu weniger Swap-Gates führt. Diese neue Funktion ermöglicht die Ausführung einesAnalysisPassvorSabreLayoutdie das Feld"sabre_starting_layout"im Eigenschaftssatz setzt, um demSabreLayoutzusätzliche Startlayouts zur Verfügung zu stellen, die es in seinen internen Versuchen verwenden kann. Wenn Sie zum BeispielDenseLayoutals Startpunkt für einen Versuch inSabreLayoutwürden Sie etwas wie folgt tun:from qiskit.providers.fake_provider import FakeSherbrooke from qiskit.transpiler import AnalysisPass, PassManager from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.transpiler.passes import DenseLayout class SabreDenseLayoutTrial(AnalysisPass): def __init__(self, target): self.dense_pass = DenseLayout(target=target) super().__init__() def run(self, dag): self.dense_pass.run(dag) self.property_set["sabre_starting_layouts"] = [self.dense_pass.property_set["layout"]] backend = FakeSherbrooke() opt_level_1 = generate_preset_pass_manager(1, backend) pre_layout = PassManager([SabreDenseLayoutTrial(backend.target)]) opt_level_1.pre_layout = pre_layoutWenn dann die
opt_level_1StagedPassManagermit einer Schaltung betrieben wird, wird der Ausgang desDenseLayoutdurchgang für einen derSabreLayoutversuche verwendet, zusätzlich zu den 5 völlig zufälligen Versuchen, die standardmäßig in Optimierungsstufe 1 durchgeführt werden. -
Zwei neue Transpiler-Durchläufe wurden hinzugefügt, um Einzelimpuls-RX-Gate-Kalibrierungen im laufenden Betrieb zu erzeugen. Diese Einzelimpuls-RX-Kalibrierungen reduzieren die Gatterzeit um die Hälfte, wie in P.Gokhale et al, Optimized Quantum Compilation for Near-Term Algorithms mit OpenPulse (2020) beschrieben, arXiv:2004.11205.
Um die Menge der zu erzeugenden RX-Kalibrierungsdaten zu reduzieren,
NormalizeRXAngledrei Optimierungen vor: Umschlag derRXGatedrehwinkel auf[0, pi], Ersetzen vonRX(pi/2)undRX(pi)durchSXGateundXGateund die Quantisierung der Rotationswinkel. Dieser Durchlauf muss vor dem DurchlaufRXCalibrationBuilderausgeführt werden, der RX-Kalibrierungen im laufenden Betrieb erzeugt.Die Optimierungen, die von
NormalizeRXAngledurchgeführten Optimierungen reduzieren die Menge der Kalibrierungsdaten und ermöglichen es uns, die genaueren, hardwarekalibrierten Impulse zu nutzen. Die Kalibrierungen, die durchRXCalibrationBuildererzeugten Kalibrierungen werden aus derSXGatekalibrierung abgeleitet, die bereits im Ziel vorhanden sein sollte. Die Amplitude wird linear skaliert, um den gewünschten willkürlichen Drehwinkel zu erreichen.Solche Einzelimpuls-Kalibrierungen reduzieren die
RXGatezeit auf die Hälfte, verglichen mit der herkömmlichen Sequenz, die aus zweiSXGateimpulsen besteht. Diese Verkürzung der Gate-Zeit könnte zu einer Verbesserung der Originaltreue führen. -
Neue Methoden hinzugefügt für
TranspileLayout,initial_index_layout()undrouting_permutation()hinzugefügt, die dazu dienen, eine Listenansicht derTranspileLayout.initial_layoutundTranspileLayout.final_layoutattribute zu erzeugen. Zum Beispiel, wenn dasfinal_layoutattribut wäre:Layout({ qr[0]: 2, qr[1]: 3, qr[2]: 0, qr[3]: 1, })dann
routing_permutation()zurück:[2, 3, 0, 1] -
Eine neue Methode wurde zu
TranspileLayout,initial_virtual_layout(), die dem AttributTranspileLayout.initial_layoutattribut entspricht, aber die Möglichkeit bietet, Ancilla-Qubits zu filtern, die dem Schaltkreis hinzugefügt wurden. Standardmäßig enthält dieTranspileLayout.initial_layoutin der Regel alle vom Transpiler hinzugefügten Ancillas ein. -
Eine neue Methode wurde hinzugefügt,
final_index_layout()undfinal_virtual_layout()zu derTranspileLayoutklasse. Diese Methoden werden verwendet, um ein endgültiges Layout zurückzugeben (die Zuordnung der Qubits der Eingangsschaltung zur endgültigen Position in der Ausgabe). Dies unterscheidet sich von demfinal_layoutattribut, das die Permutation ist, die durch das Routing alsLayoutobjekt. Die Methodefinal_index_layout()methode gibt eine Liste zurück, die die Ausgangsposition für jedes Qubit in der Eingangsschaltung des Transpilters anzeigt. Zum Beispiel mit einer Originalschaltung:qc = QuantumCircuit(3) qc.h(0) qc.cx(0, 1) qc.cx(0, 2)und die Ausgabe des Transpilers war:
tqc = QuantumCircuit(3) tqc.h(2) tqc.cx(2, 1) tqc.swap(0, 1) tqc.cx(2, 1)dann würde die Ausgabe von
final_index_layout()eine Liste von zurückgeben:[2, 0, 1]Die Website
final_virtual_layout()gibt dies als einLayoutobjekt zurück, so dass die Rückgabe des obigen Beispiels lauten würde:Layout({ qc.qubits[0]: 2, qc.qubits[1]: 0, qc.qubits[2]: 1, })
Visualisierungsfunktionen
-
Es wurde die Möglichkeit hinzugefügt, Bedingungen als Ausdrücke von
Exprin derQuantumCircuit.draw()methode und dercircuit_drawer()funktion bei der Visualisierung von Schaltkreisen mitControlFlowOpanweisungen. -
Es wurden die Farbstile
"iqp"und"iqp-dark"für die Schaltkreisschubladematplotlibhinzugefügt, die auf dem Farbschema IBM Quantum Platform basieren. -
In
TextDrawerwerden Operationen, die ausControlFlowOp, einschließlichif,else,while,forundswitch/case, ob direkt instanziiert oder mit Methoden inQuantumCircuiterstellt wurden, werden nun die in ControlFlowOps definierten Schaltkreise vollständig angezeigt, wobei die Schaltkreise durch Klammern abgegrenzt werden. -
Bei der Definition eines benutzerdefinierten Stylesheets für die Impulszeitleiste
qiskit.visualization.timeline_drawer()werden "Generator"-Funktionen, bei denen das Objektattributaccepts_programaufTruegesetzt ist, ein zusätzliches Schlüsselwortargumentprogramerhalten, das den vollständigen ZeitplanQuantumCircuitgezeichnet wird. -
Die Visualisierungen aus dem
plot_gate_map(),plot_coupling_map().plot_error_map(), undplot_circuit_layout()funktionen wurden erheblich verbessert, um Layouts von Backends mit einer großen Anzahl von Qubits zu rendern. Dies wurde erreicht, indem Graphviz durch die Funktiongraphviz_draw()von rustworkx genutzt wurde, um ein anspruchsvolleres algorithmisches Graphenlayout zu erstellen, das für eine große Anzahl von Qubits skaliert.
Versch. Funktionen
-
Unterstützung für den Ausdruck des Vorzeichens einer
ParameterExpression. Anstatt einen konkreten Wert zuzuweisen und mitnumpy.signoder andere Bibliotheksfunktionen zu verwenden, kann der Benutzer die Instanz derParameterExpressionklasse verwenden, um das Vorzeichen zu berechnen, und kann mit dem Vorzeichen arbeiten, bevor der Ausdruck vollständig zugewiesen wird.Sie kann wie folgt verwendet werden:
from qiskit.circuit import Parameter b = Parameter("phi") sign_value = b.sign() print("sign of an unassigned Parameter is: ", sign_value) print("Sign of a Parameter assigned to -3 is: ", sign_value.assign(b,-3))Siehe #10360 für weitere Einzelheiten.
-
Parameterhat jetzt ein Argument für das Schlüsselwortuuidin seinem Konstruktor, das verwendet werden kann, um denParametermit einer anderen gleichnamigen Variable zu vergleichen. Diese Funktion sollte in der Regel nicht von den Benutzern verwendet werden, sondern ist vor allem für die benutzerdefinierte Serialisierung und Deserialisierung nützlich.
Hinweise zur Aktualisierung von Schaltkreisen
-
Die Website
ControlledGate.definitionder Ausgabe derGate.control()methode kann im Vergleich zu früheren Versionen unterschiedlich sein. Die interne Generierung derGate.control()methode verwendet nicht mehr den inzwischen veraltetenUnrollertranspiler-Pass, um die Definition zu generieren. Dies kann dazu führen, dass eine andere Definition generiert wird. Die AusgabeControlledGateobjekts wird die gleiche Definition haben wie die, die zuvor erzeugt wurde. Wenn Sie jedoch die genaue Definition aus dem Aufruf vonGate.control()benötigen, können Sie eine frühere Version verwenden und die Schaltung mitqpy.dump()speichern und dann mit einer neueren Version laden. -
Die Eigenschaft
num_ancilla_qubitsaus der KlassePolynomialPauliRotationswurde entfernt, da sie in Qiskit 0.23.0 veraltet ist. Verwenden Sie stattdessen die EigenschaftPolynomialPauliRotations.num_ancillas. -
Die folgenden Standard-Bibliotheks-Gates:
nicht mehr einstellen können
label,condition,duration, oderunit(undctrl_statefürControlledGateunterklassen) nach der Instanziierung eines Objekts nicht mehr. Sie können nochconditiondurch die Verwendung vonc_if(). Sie können mitto_mutable()eine veränderbare Kopie der Anweisung erhalten und dann den Setter auf diese Kopie statt auf das Originalobjekt anwenden.label,durationundunitkönnen als Schlüsselwortargumente für diese Gatter zur Konstruktionszeit angegeben werden, und es wird automatisch eine veränderbare Instanz zurückgegeben. Diese Änderung war im Rahmen der Umstellung dieser Klassen aufSingletonGateundSingletonControlledGatetypen zu konvertieren, was den Speicherbedarf von wiederholten Instanzen dieser Gates erheblich reduziert. -
Für alles, was in Wechselwirkung mit
Gate,Operation, oderInstructionobjekten interagiert oder mit diesen als Teil einerQuantumCircuitoderDAGCircuitklassen arbeiten, ist es wichtig zu beachten, dass die Verwendung von gemeinsamen Referenzen für Instanzen jetzt viel üblicher ist. Früher war es möglich, eine Instanz einer Schaltkreisoperation wiederzuverwenden und gemeinsam zu nutzen, aber dies wurde nicht sehr häufig verwendet, und eine Kopie würde eine eindeutige Instanz erzeugen. Dies hat sich ab dieser Version durchSingletonInstructionundSingletonGatezur Verfügung stehen (und eine große Anzahl von Standardbibliotheksgattern nun auf ihnen aufbaut). Wenn Sie bei der Verwendung dieser Objekte von eindeutigen Instanzen für jeden Schaltkreisvorgang ausgehen, wird dies zu einem potenziellen Problem, da nun ein gemeinsamer Zustand zwischen Vorgängen desselben Typs wiederverwendet wird (der durch Kopieren und tiefe Kopien erhalten bleibt). Sie können sich auf dasInstruction.mutableattribut können Sie die Veränderlichkeit eines Objekts überprüfen oder mitInstruction.to_mutable()um eine veränderbare Kopie einer beliebigen Anweisung zu erhalten. -
Mehr
Instructioninstanzen (solche, die Singletons zurückgeben) nicht mehr streng erfüllen (zum Beispiel):type(XGate()) is XGateDas zurückgegebene Objekt ist jedoch immer noch eine Standard-Unterklasse, so dass
isinstance()(die korrekte Art der Typprüfung) wird weiterhin korrekt funktionieren. Mehrere Anweisungen hatten diese Eigenschaft bereits (z. B.MCXGate), aber es ist jetzt häufiger der Fall, da viele Standardtore dies tun.Wenn Sie aus irgendeinem Grund den "Basistyp" eines Gatters benötigen, lassen Sie die synthetischen Singleton-Unterklassen weg, die nicht instanziiert werden können, siehe
Instruction.base_class. -
Die Definition von
UnitaryGatefür Ein-Qubit-Einheiten ist jetzt in Form vonUGateanstelle der altenU3Gateklasse.
Hinweise zum Upgrade für Anbieter
-
Der
QasmSimulatorPypython-basierte Simulator, der inqiskit.providers.basicaerenthält jetzt'h'(HGate),'p'(PhaseGate), und'u'(UGate) in seinem Basis-Gate-Set. -
Das Argument
channelin der MethodePulseBackendConfiguration.control()wird entfernt. Es wurde in Qiskit 0.33 (mit Terra 0.19 ), veröffentlicht im Dezember 2021, veraltet. Verwenden Sie stattdessen das Argumentqubits. -
Ersetzte das Argument
qobj[Qobj]inQasmSimulatorPy.run()durchrun_input[QuantumCircuit or list]Hier ist ein Beispiel für die Migration Ihres Codes:
# Importing necessary Qiskit libraries from qiskit import transpile, QuantumCircuit from qiskit.aer import QasmSimulator # Defining the Quantum Circuit qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() # Transpile the circuit to optimize for the target simulator simulator = QasmSimulator() transpiled_circuit = transpile(qc, simulator) # Run the simulation job = simulator.run(transpiled_circuit, shots=1024) # Get the simulation result result = job.result()All diese Funktionen sind seit 0.22 (veröffentlicht am 13. Oktober 2022) veraltet und werden nun entfernt.
Hinweise zum Pulse-Upgrade
-
Die Funktionen
qiskit.scheduler.utils.format_meas_map(),qiskit.scheduler.utils.measure()undqiskit.scheduler.utils.measure_all()wurden nachqiskit.pulse.utils.format_meas_map(),qiskit.pulse.macros.measure()bzw.qiskit.pulse.macros.measure_all()verschoben. Der vorherige Speicherort wurde in Qiskit 0.20.0 (Terra 0.15.0, veröffentlicht am 2020-08-10) veraltet und wird nicht mehr unterstützt. -
Die Methoden
to_dictin den Klassenpulse.transforms.AlignmentKind,pulse.transforms.AlignEquispaced, undpulse.transforms.AlignFuncwerden entfernt. Sie wurden in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet.
QPY-Upgrade-Hinweise
- Die Verwendung des Schlüsselworts
circuitsfür das erste Positionsargument in der Funktionqiskit.qpy.dump()wurde entfernt, da seine Verwendung in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet ist. Stattdessen kann das Schlüsselwortprogramsverwendet werden (oder übergeben Sie das Argument einfach an der richtigen Stelle), das sich identisch verhält.
Hinweise zum Upgrade der Quanteninformation
-
Die Methode
qiskit.quantum_info.pauli_basis()akzeptiert das Argumentpauli_listnicht mehr. Es wurde in Qiskit 0.39 (mit Terra 0.22 ), das im Oktober 2022 veröffentlicht wurde, veraltet. -
Die Funktion
random_stabilizer_tableim Modulqiskit.quantum_info.randomwird entfernt. Es wurde in Qiskit 0.39 (mit Terra 0.22 ), das im Oktober 2022 veröffentlicht wurde, veraltet. Verwenden Sie stattdessenqiskit.quantum_info.random.random_pauli_list(). -
Die Klassen
qiskit.quantum_info.PauliTableundqiskit.quantum_info.StabilizerTablewerden entfernt. Die Funktionrandom_pauli_table()wird ebenfalls entfernt. Sie wurden in Qiskit 0.43 (mit Terra 0.24 ), das im Mai 2023 veröffentlicht wurde, veraltet. Stattdessen sollten SiePauliListundrandom_pauli_list(). -
Die Argumente
zundxfür den Initialisierer von toPauliwurden entfernt, da sie in Qiskit Terra 0.17 (veröffentlicht im April 2021) veraltet sind. Ein Paar ausxundzsollte stattdessen positionell als ein einziges Tupel übergeben werden (Pauli((z, x))). -
Das Argument
labelfür den Initialisierer vonPauliwurde entfernt, da es in Qiskit Terra 0.17 (veröffentlicht im April 2021) veraltet ist. Übergeben Sie stattdessen das Etikett an der richtigen Stelle, z. B.Pauli("XYZ"). -
Der Import von
qiskit.quantum_info.operators.pauliist nicht mehr erlaubt, da er in Qiskit Terra 0.21 (veröffentlicht im Juni 2022) veraltet ist. Importieren Sie stattdessen direkt vonqiskit.quantum_info.
Hinweise zum Upgrade der Synthese
- Der Parameter
orderimsynthesis.SuzukiTrotterkonstruktor löst eine Ausnahme statt einer Verwerfungswarnung aus, wenn er auf eine ungerade Zahl gesetzt wird. Suzuki-Produktformeln sind symmetrisch und daher nur für gerade Ordnungen definiert.
Hinweise zum Transpiler-Upgrade
-
Infolge der Überarbeitung des Pass-Managers wurden die bestehenden Ablaufsteuerungen überarbeitet:
FlowControllerLinear,ConditionalController, undDoWhileControllersind nun Unterklassen derBaseController. Beachten Sie, dass diese Controller die Implementierung der__iter__()methode verzichtet haben. Sie sind jetzt nur noch im Kontext einer Flow-Controller-Ausführung iterierbar, bei der der Kompilierungsstatus nach Ausführung jeder inneren Aufgabe durchlaufen wird. -
Die Funktionalität der Klasse
RunningPassManagerwurde durch das neue Passmanager-Framework ersetzt (BasePassManagerundBaseController). Der laufende Passmanager ist nun ein zustandsloser Ablaufregler (im Wesentlichen ein Alias vonFlowControllerLinear), da der Passmanager für den Aufbau der Task-Pipeline zuständig ist, während der Controller für die Ausführung der zugehörigen Tasks verantwortlich ist. Die Unterklassifizierung vonRunningPassManagerwird nicht mehr empfohlen, und diese Klasse wird in zukünftigen Versionen vollständig durch den Flow Controller ersetzt werden. -
Eine neue Klasse,
WorkflowStatuswurde eingeführt, um den Status des Passmanager-Workflows zu verfolgen. Dieses portable Objekt wird bei der Ausführung des Passmanagers erstellt und an die zugrunde liegenden Aufgaben übergeben. Dieser Status wurde bisher vonRunningPassManagermit Instanzvariablen verwaltet. -
Die transpilerspezifische
transpiler.PassManager(verwendet intranspile()) ist jetzt eine Unterklasse vonpassmanager.BasePassManager. Diese Änderung der Klassenhierarchie führt jedoch nicht zu einer grundlegenden Änderung der öffentlich zugänglichen API. -
Ausnahmen, die während der Ausführung des Pass-Managers ausgelöst werden, erben nun von der neu eingeführten
PassManagerError. Ein allgemeines Versagen der Pass-Manager-Maschinerie wirdPassManagerErrorfür allgemeine Pass-Manager aus, aber der transpiler-spezifischetranspile.PassManagerverpackt dies derzeit aus Gründen der Abwärtskompatibilität in seine spezifischeTranspilerErroraus Gründen der Abwärtskompatibilität. Diese Umhüllung wird in Zukunft entfernt werden. -
Die Verwendung von
FencedObjectim Rahmen des Passmanagers wurde entfernt. Diese Wrapper-Klasse kann veränderbare Objektattribute nicht vor Änderungen schützen, was bei ordnungsgemäß implementiertem Code kein Problem darstellen sollte. Analysedurchläufe sollten eine IR-Eingabe nicht verändern, Controller sollten den Eigenschaftssatz nicht aktualisieren und so weiter. Es liegt in der Verantwortung des Entwicklers des Pass-Managers, sicherzustellen, dass der Pass keine Objektattribute verändert, -
Der Plugin-Name
defaultist für die Plugin-Stufeninit,layout,optimization, undschedulingreserviert. Für diese Stufen war dieser Plugin-Name bisher nicht reserviert, aber der Namedefaultwird jetzt verwendet, um die in Qiskit eingebaute Standardmethode für diese Stufen darzustellen. Wenn Sie diese Namen für Plugins auf diesen Stufen verwendet haben, stehen diese in Konflikt mit der Verwendung von Qiskit und Sie sollten Ihr Plugin umbenennen. -
Deaktiviert die Verwendung der
RemoveResetInZeroStateklasse in den voreingestellten Passmanagern. Zuvor, wenntranspile()odergenerate_preset_pass_manager()mitoptimization_levelauf Stufe 1, 2 oder 3 ausgeführt wurde, lief es so abRemoveResetInZeroState. Dieser Durchgang verbietet jedoch die Vorstellung von willkürlichen Anfangszuständen, es sei denn, sie werden explizit auf Nullen gesetzt und zurückgesetzt. Wenn Sie den Pass als Teil Ihrer Kompilierungspipeline ausführen müssen, können Sie etwas wie folgt ausführen:pm = generate_preset_pass_manager(1, backend) pm.init.append(RemoveResetInZeroState()) pm.run(circuit)um diese Funktionalität für Ihre Schaltkreiskompilierung beizubehalten.
-
Der veraltete Transpiler-Routing-Pass,
BIPMapping, wurde entfernt. Es wurde in der Qiskit 0.43.0 Version als veraltet markiert. Es wurde durch ein externes Plugin-Paket ersetzt:qiskit-bip-mapper. Details zu diesem neuen Paket finden Sie im Github-Repository des Pakets:Der Pass wurde aus zwei Gründen in ein separates Plugin-Paket umgewandelt: Erstens macht die Abhängigkeit von CPLEX die Verwendung schwieriger, und zweitens lässt sich das Plugin-Paket sauberer in
transpile(). Das optionale Extrabip-mapperzur Installation voncplexunddocplexzur Unterstützung dieses Passes wurde entfernt, da nichts in Qiskit dies mehr optional erfordert. -
Das Argument
qubitsin der MethodeInstructionDurations.get()akzeptiert nicht mehrQubit(oder eine Liste von ihnen) nicht mehr. Diese Funktion wurde in Qiskit 0.33 (mit Terra 0.19 ), das im Dezember 2021 veröffentlicht wurde, veraltet. Verwenden Sie stattdessen eine ganze Zahl für die Qubit-Indizes. -
Entfernt das Argument
qubit_channel_mappinginRZXCalibrationBuilderdas in Qiskit 0.39 (veröffentlicht im Oktober 2022, mit qiskit-terra 0.22 ) veraltet war -
In
transpiler.CouplingMapwird die Methodesubgraphals veraltet in 0.20 entfernt.reduce()kann anstelle der Methodesubgraphverwendet werden.
Hinweise zum Upgrade der Visualisierung
-
Die Unterstützung für die Verwendung des Schlüsselworts
rhofür das erste Positionsargument inplot_state_hinton(),plot_bloch_multivector(),plot_state_city(),plot_state_paulivec(), undplot_state_qsphere(). Die Verwendung vonrhowurde durchstateersetzt, das stattdessen verwendet werden kann.qiskit.scheduler.utilswurde entfernt, da alle enthaltenen Funktionen nachqiskit.pulse.macrosundqiskit.pulse.utilsverschoben wurden. Alle diese Funktionen sind seit 0.15 (veröffentlicht am 06. August 2020) veraltet und werden nun entfernt. -
Die Klassenkonstruktor-Argumente
qregs,cregs,layoutundglobal_phasefürvisualization.QCircuitImagewurden entfernt, da sie in 0.20 veraltet sind. -
Die Visualisierungsfunktionen:
plot_gate_map(),plot_coupling_map().plot_error_map(), undplot_circuit_layout()sind nun davon abhängig, dass graphviz installiert ist. Diese Änderung war notwendig, um die Visualisierung von Backends mit einer größeren Anzahl von Qubits zu ermöglichen. Diese zusätzliche externe Anforderung kommt zu den bestehenden optionalen Abhängigkeiten hinzu, die diese Funktionen bisher benötigten. Details zur Installation von Graphviz finden Sie hier: https://graphviz.org/download/
Versch. Anmerkungen zu Upgrades
-
Die
QuasiDistributionwerte können Fließkommafehler enthalten.QuasiDistribution.__repr__runden mitnumpy.round()und der Parameterndigitskönnen mit dem Klassenattribut__ndigits__manipuliert werden. Die Standardeinstellung ist15. -
Die Klasse
qiskit.qobj.Qobjwird entfernt. Es wurde in Qiskit 0.33 (mit Terra 0.19 ), veröffentlicht im Dezember 2021, veraltet. Verwenden Sie stattdessenqiskit.qobj.QasmQobjoderqiskit.qobj.PulseQobj. -
Der Dekorator
qiskit.utils.deprecation.deprecate_function()ist seit Qiskit 0.39.0 (veröffentlicht im Oktober 2022, mit qiskit-terra 0.22.0 ) veraltet und wird nun entfernt. Verwenden Sieqiskit.utils.deprecate_func()stattdessen. -
Die Funktion
execute()akzeptiert nicht mehr die Argumenteqobj_idundqobj_header. Ihre Verwendung wurde in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet. -
Der Transpilationspass
qiskit.transpiler.passes.CXDirectionwird entfernt. Seine Verwendung wurde in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet. Verwenden Sie stattdessen die allgemeinereGateDirectionpass. -
Der Transpilationspass
qiskit.transpiler.passes.CheckCXDirectionwird entfernt. Seine Verwendung wurde in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet. Verwenden Sie stattdessen die allgemeinereCheckGateDirectionpass. -
Die Erstellung von Qiskit aus dem Quellcode erfordert nun einen Rust-Compiler, der mit der Sprachversion 1.64 kompatibel ist. Diese wurde von der vorherigen minimal unterstützten Rust-Version von 1.61 für die Erstellung früherer Versionen von Qiskit erhöht.
Algorithmen-Veraltungen
- Die Algorithmus-Utilities in
qiskit.utils.validationundqiskit.utils.algorithm_globalssind jetzt veraltet und werden in nicht weniger als 3 Monaten ab dem Veröffentlichungsdatum entfernt werden. Diese Werkzeuge wurden mit dem Modulqiskit.algorithmseingeführt, um ältere und primitiv-basierte Algorithmus-Workflows zu unterstützen. Nun, daqiskit.algorithmsveraltet ist und die Codebasis der primitiven Algorithmen in eine eigenständige Bibliothek migriert wurde, werden diese Hilfsprogramme im Kontext von Qiskit nicht mehr verwendet. Wenn Ihre Anwendung es zulässt, empfehlen wir, dass Sie Ihren Code auf qiskit_algorithms umstellen, wo Sie die entsprechenden Dienstprogramme inalgorithm_globalsundvalidationvonqiskit_algorithms.utilsimportieren können. Bitte beachten Sie, dass die alten Funktionen nicht in das neue Paket migriert wurden.
Veraltete Schaltungen
-
Die Übergabe von
Noneals ArgumenteqargsodercargsanDAGCircuit.apply_operation_back()oderapply_operation_front()ist veraltet und wird in Qiskit 1.0 entfernt werden. Dies verstößt seit einiger Zeit explizit gegen die Typisierungsdokumentation, wird aber von Qiskit stillschweigend akzeptiert. Geben Sie stattdessen einfach()stattNonean. -
Die Methode
QuantumCircuit.bind_parameters()ist jetzt veraltet und wird in spätestens 3 Monaten ab dem Veröffentlichungsdatum aus der Codebasis entfernt. Seine Funktionalität überschneidet sich stark mitQuantumCircuit.assign_parameters()und kann vollständig durch sie ersetzt werden. Bitte verwenden SieQuantumCircuit.assign_parameters()stattdessen. -
Verwerfen Sie doppelte Gate-Methoden auf
QuantumCircuit. Es gilt die Regel, dass die Methodennamen die Gatternamen widerspiegeln, z. B. wird dieCXGatewird überQuantumCircuit.cx()und nichtQuantumCircuit.cnot(). Die Verwerfungen sind:QuantumCircuit.cnot()zugunsten vonQuantumCircuit.cx()QuantumCircuit.toffoli()zugunsten vonQuantumCircuit.ccx()QuantumCircuit.fredkin()zugunsten vonQuantumCircuit.cswap()QuantumCircuit.mct()zugunsten vonQuantumCircuit.mcx()QuantumCircuit.i()zugunsten vonQuantumCircuit.id()
Beachten Sie, dass
QuantumCircuit.i()die einzige Ausnahme von der obigen Regel ist, aber daQuantumCircuit.id()die Identität intuitiver darstellt und häufiger verwendet wird, haben wir es seinem Gegenstück vorgezogen. -
Um die Struktur der Gates und Operationen von Qiskit zu rationalisieren, wird das
qiskit.extensionsmodul zur Verwerfung an und wird in einer zukünftigen Version veraltet sein. Die folgenden Objekte wurden verschoben nachqiskit.circuit.libraryDiagonalGate,HamiltonianGate,Initialize,Isometry,MCGupDiag,UCGate,UCPauliRotGate,UCRXGate,UCRYGate,UCRZGate,UnitaryGate.
Diese Anweisungen sind in dieser Version bereits veraltet,
SingleQubitUnitaryverwenden, sondernlibrary.UnitaryGate,Snapshotdie durch die Speicheranweisungen von Qiskit Aer ersetzt wurde,
zusammen mit ihren Schaltungsmethoden
Darüber hinaus sind die folgenden Schaltkreismethoden zur Ausmusterung vorgesehen
QuantumCircuit.diagonal(),QuantumCircuit.hamiltonian(),QuantumCircuit.isometry()undQuantumCircuit.iso(),QuantumCircuit.uc(),QuantumCircuit.ucrx(),QuantumCircuit.ucry(),QuantumCircuit.ucrz().
Da das gesamte Modul zur Ausmusterung ansteht, ist auch
ExtensionError. -
Die wenig genutzten
QuantumCircuitklassendaten-Attributeheaderundextension_libsind veraltet und sollen entfernt werden. Diese enthielten jeweils Zeichenketten der OpenQASM 2.0 version header-Anweisung undqelib1.incinclude-Anweisung. Es werden keine Alternativen angeboten; diese waren hauptsächlich als interne Details gedacht.
Transpiler-Veraltungen
-
Die Flusssteuerungs-Fabrikmethode
FlowController.controller_factory()ist veraltet zusammen mitFlowController.add_flow_controller()undFlowController.remove_flow_controller(). In Zukunft wird die Aufgabenkonstruktion mit Schlüsselwortargumenten in derBasePassManager.append()methode wird ebenfalls veraltet sein. Controller müssen explizit instanziiert und an den Passmanager angehängt werden. Zum Beispiel die bisher verwendete konventionelle Syntaxpm.append([task1, task2], condition=lambda x: x["value1"] > 10)muss ersetzt werden durch
controller = ConditionalController([task1, task2], condition=lambda x: x["value1"] > 10) pm.append(controller)Letzteres ermöglicht eine genauere Kontrolle über die Reihenfolge der Controller, insbesondere wenn mehrere Schlüsselwortargumente zusammen angegeben werden, und erlaubt die Konstruktion allgemeiner Flusscontroller, die mehr als eine Pipeline haben können oder nicht nur eine einzige einfache bedingte Funktion in ihren Konstruktoren verwenden.
-
Die
FlowControllerLinear.append(),DoWhileController.append(), undConditionalController.append()sind alle sofort veraltet. Der Aufbau der Passmanager-Task-Pipeline ist nun Aufgabe vonBasePassManagerund die einzelnen Ablaufsteuerungen müssen diese Methode nicht anwenden. Bei einem Flusscontroller sollten alle Übergänge in einem Zug direkt im Konstruktor festgelegt werden. -
Der allgemeine Attribut- und Variablenname
passeswird im gesamten Modul durchtasksersetztqiskit.passmanagermodul ersetzt. Beachten Sie, dass eine Aufgabe eine Vereinigung von pass und controller angeben muss, und die Singularform pass steht im Widerspruch zum Schlüsselwort Python. In diesem Sinne ist die Verwendung von Aufgaben viel besser. -
Der
Unrollertranspiler-Pass wurde veraltet und wird in einer zukünftigen Version entfernt werden. DieUnrollerwurde abgelöst durchBasisTranslatorabgelöst, das eine ähnliche Funktionalität bietet, aber in einer allgemeineren Form, so dass man eine Schaltung in jede universelle Basismenge übersetzen kann. DieUnrollerklasse funktioniert nur in Situationen, in denen die Gatterdefinitionen der Schaltung rekursiv in Bezug auf die Zielbasis definiert sind; für die Gatter der Standardbibliothek von Qiskit bedeutet diesUGateundCXGate. Wenn Sie denUnrollerverwenden, kann es durch einen benutzerdefinierten Passmanager des Formulars ersetzt werden:from qiskit.transpiler import PassManager from qiskit.transpiler.passes import UnrollCustomDefinitions, BasisTranslator from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel pm = PassManager( [ UnrollCustomDefinitions(sel, basis_gates=basis_gates), BasisTranslator(sel, target_basis=basis_gates), ] ) pm.run(circuit) -
Die Verwendung des Wertes
"unroller"für das Schlüsselwortargumenttranslation_methodin dentranspile()undgenerate_preset_pass_manager()wurde veraltet. Dieses Plugin für die Übersetzungsphase wird in einer zukünftigen Version aus Qiskit entfernt werden, da es durch die Standardmethode"translator"ersetzt wird, die ähnlich wie das Plugin"unroller"funktioniert, aber eine größere Anzahl von Ziel-Backends unterstützt.
Veraltete Visualisierungen
-
Die Standardeinstellung für die Schublade
matplotlibgibt jetztFutureWarningaus, da die Standardvorlage in die Vorlage"iqp"geändert wird (früher bekannt als"iqx"). Der alte Standard ist als"clifford"verfügbar. Um die Warnung auszuschalten, können Sie den gewünschten Stil explizit einstellen, z. B. g.:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.x(0) circuit.h(0) circuit.cp(0.5, 0, 1) circuit.draw("mpl", style="clifford") # or style="iqp" -
Die Übergabe einer Schaltung an
qiskit.visualization.timeline_drawer()die keine Informationen über die geplante Startzeit des Knotens enthält, ist veraltet. Nur Schaltkreise, die einen der Planungsanalysedurchläufe durchlaufen haben (z. BALAPScheduleAnalysisoderASAPScheduleAnalysis) durchlaufen haben, können visualisiert werden. Wenn Sie einen der alten Zeitplanungspässe verwendet haben (z. BALAPScheduleoderASAPSchedule), können Sie die Zeitplanungsinformationen durch Ausführen von:from qiskit import transpile from qiskit.transpiler import InstructionDurations scheduled = transpile( my_old_style_circuit, optimization_level=0, scheduling_method="alap", instruction_durations=InstructionDurations(), )Dieses Verhalten sollte bereits in Qiskit 0.37 veraltet sein, aber aufgrund eines Fehlers in der Warnung wurde es den Benutzern bis jetzt nicht angezeigt. Dieses Verhalten wird in Qiskit 1.0 entfernt.
Fehlerkorrekturen
-
Die maximale Anzahl von Qubits, die für die auf Matrixmultiplikation basierende Kommutativitätsprüfung in
CommutationCheckerist nun standardmäßig auf 3 begrenzt. Behoben #10488 -
Der
GateDirectiontranspiler-Durchgang verwendet nun Übersetzungen auf diskreter Basis, anstatt sich auf eine kontinuierlicheRYGatezu verwenden, was dazu beitragen sollte, dass einige Ziele auf diskreter Basis etwas zuverlässiger werden. Generell gilt,transpile()nur eine teilweise Unterstützung für Basissätze, die keine kontinuierlich parametrisierte Operation enthalten, so dass sie in diesen Situationen nicht immer erfolgreich ist und mit ziemlicher Sicherheit keine optimalen Ergebnisse liefert. -
Festgelegt
CommutationAnalysisum Gatter auf einem Draht in Gruppen zu gruppieren, wobei jede Gruppe nur Gatter enthält, die paarweise kommutieren. Dadurch wird verhindert, dassCommutationCancellationunzulässige Optimierungen vornimmt. Siehe #8020 -
CUGateverhält sich nun korrekt bei Aufrufen vonQuantumCircuit.assign_parameters(). Zuvor kam es zu verschiedenen seltsamen Fehlern, die oft erst einige Zeit nach der ersten Schaltungszuweisung auftraten. Siehe #7326, #7410, #9627, #10002, und #10131. -
Die Schnittstelle zur Erstellung von Kontrollflüssen (die Kontext-Manager-Formen von
QuantumCircuit.if_test(),while_loop(),for_loop()undswitch()) verfolgt nun korrekt einen separaten Globalphasenfortschritt innerhalb dieses Blocks. Sie können einen globalen Phasenaufstieg zu einem inneren Block hinzufügen, indem SieQuantumCircuit.global_phaseinnerhalb eines Builder-Bereichs zuweisen:from math import pi from qiskit import QuantumCircuit qc = QuantumCircuit(3, 3) qc.global_phase = pi / 2 # Set the outer circuit's global phase. with qc.if_test((qc.clbits[0], False)) as else_: # The global phase advancement in a control-flow block begins at 0, # because it represents how much the phase will be advanced by an # execution of the block. The defined phase of the outer scope is not # affected by this set. qc.global_phase = pi with else_: # Similarly, the `else` block may induce a different global-phase # advancement to the `if`, so it can also be set separately. qc.global_phase = 1.5 * pi # The phase advancement caused directly by the outer scope is independent # of the phase advancement conditionally caused by each control-flow path. assert qc.global_phase == pi / 2Die Bedeutung von
QuantumCircuit.global_phaseist der globale Phasenfortschritt, der mit einer einzigen Ausführung des Blocks verbunden ist. Es handelt sich immer noch um eine globale Phasenverschiebung, d.h. wenn der Block eingegeben wird, wird die Phase aller Qubits im gesamten Programm verschoben. -
Korrigiert die Einfärbung der Matplotlib-Farbschemata
"iqx"und"iqx-dark", die zuvor dieRZGate,RZZGate, (multi-)kontrolliertePhaseGates undiSwapGatein der falschen Farbe zeichneten. -
Der Hash von a
Parameterist jetzt gleich den Hashes von allenParameterExpressionmit denen er gleich verglichen wird. Zuvor waren die Hashes unterschiedlich, was zu ungewollten zusätzlichen Einträgen in Hashmaps führte, wennParameterundParameterExpressionwerte in derselben Map gemischt wurden, da dies gegen das Datenmodell von Python verstieß. -
Es wurde ein Fehler in der QPY-Serialisierung (
qiskit.qpy), bei dem kontrollierte unitäre Gatter in einer Schaltung dazu führen konnten, dass die Deserialisierung fehlschlug. Behoben #10802. -
Korrigiert die Implementierung von
random_statevector()so dass die Stichproben aus der Gleichverteilung gezogen werden. -
Der Pass
NoiseAdaptiveLayoutnimmt jetztCouplingMapals optionales Argument. Dies wird von dem Plugin verwendet, um die Inkonsistenz zwischenconfiguration()undproperties()zu kontrollieren, wie im Fall vonFakeMelbourne. Behoben #7677. -
Die Methoden
QuantumCircuit.copy()undcopy_empty_like()lösen nun einen Fehler aus, wenn das Argumentnamefalsch eingegeben wurde, anstatt eine ungültige Schaltung zu erzeugen. -
Die
"decay"Heuristik vonSabreSwapundSabreLayoutverfolgt nun die Tiefe auf physischen Qubits korrekt, anstatt fälschlicherweise die "Tiefe" von Swaps auf virtuellen Qubits zu verfolgen. -
Es wurde ein Versehen in der
ECRGatedas das Setzen einesECRGate.labelattributs zur Zeit der Objekterstellung verhindert hat. Alle anderenGateklassen und Unterklassen ermöglichen das Setzen eineslabelSchlüsselwortarguments im Konstruktor. -
Es wurde ein Versehen im
Gate(und Standard-Bibliotheksunterklassen) behoben, bei dem die Konstruktorendurationundunitattribute während der Konstruktion nicht als Schlüsselwortargumente gesetzt werden konnten. Die übergeordnete KlasseInstructionunterstützte diese Einstellung, aberGatestellte diese Schnittstelle bisher nicht korrekt dar. -
Unterstützung hinzugefügt, um
SparsePauliOpStandardinitialisierung durch Übergabe einer leeren Iterable an die statischen Methoden zu ermöglichenfrom_list()undfrom_sparse_list(). Behoben #10159. -
Die Verwendung der (veralteten) Klasse
OptimizeraufAQChatte keinen nicht veralteten Alternativpfad, der in Qiskit 0.44 hätte eingeführt werden sollen. Es akzeptiert nun eine Callable, die dasMinimizerprotokoll implementiert, wie in der Verwerfungswarnung ausdrücklich angegeben. Der Callable kann wie das folgende Beispiel aussehen:from scipy.optimize import minimize from qiskit.transpiler.synthesis.aqc.aqc import AQC optimizer = partial(minimize, args=(), method="L-BFGS-B", options={"maxiter": 200}) aqc = AQC(optimizer=optimizer) -
Es wurde ein Problem mit der
Barrierklasse. Beim Hinzufügen einerBarrierinstanz zu einerQuantumCircuitmit derQuantumCircuit.append()methode wurde bisher nicht überprüft, ob die Größe der Barriere mit den angegebenen qargs übereinstimmt. -
Der
BlockCollapserTranspiler-Durchlauf behandelt nun Schaltungen korrekt, die mehr als eine Bedingung auf demselben klassischen Register enthalten. -
BlueprintCircuitunterklassen verhalten sich nun korrekt, wenn die halb-öffentliche MethodeQuantumCircuit._append()verwendet wird, während sich die Blaupause in einem ungebauten Zustand befindet, d.h. der Schaltkreis wird aufgebaut, bevor die Anfügung versucht wird. -
Anpassen von Zoom, Schriftgröße und Rändern in
plot_state_city()um das Diagramm besser an mehrere Figurengrößen anzupassen. Das Verhalten der Z-Reihenfolge von Balken und der Null-Amplituden-Ebene wurde korrigiert und die Anzeige von Balken mit negativem Realwert wurde korrigiert.
Sonstige Anmerkungen
-
Diese Version von Qiskit ist explizit an die Numpy 1.x Serie gebunden, da sie kompilierte Erweiterungen enthält, die noch nicht gegen die noch nicht freigegebene Numpy 2.x Serie kompiliert wurden. Wir werden eine neue Version von Qiskit mit Unterstützung für Numpy 2.x veröffentlichen, sobald dies möglich ist.
Wir können nicht verhindern, dass Ihr Paketmanager auf ältere Versionen von Qiskit zurückgreift (die zwar nicht den gleichen Pin haben, aber wahrscheinlich trotzdem inkompatibel sind), wenn Sie versuchen, Qiskit zwangsweise zusammen mit Numpy 2 zu installieren, bevor wir eine kompatible Version veröffentlicht haben.
-
Geändert wurde das Verhalten der
VF2LayoutundVF2PostLayouttranspiler-Durchläufe, die zuvor ihre interne Auswertung mit Multithreading durchführten, wenn die Eingabeschaltungen ausreichend groß waren. Die Multithreading-Nutzung wurde nun aus den Pässen entfernt, da sich gezeigt hat, dass sie zu einem Leistungsrückgang führt, statt wie ursprünglich beabsichtigt zu einer Verbesserung.