Qiskit SDK 2.0 Versionshinweise
2.0.3
Vorspiel
Qiskit v2.0.3 ist ein Bugfix-Release für die v2.0 minor Versionsreihe.
Fehlerkorrekturen
-
ApplyLayoutwird nun den Fall der Anwendung eines Null-Qubits korrekt behandelnLayout. Zuvor wurde behauptet, es sei kein Layout festgelegt worden, selbst wenn das Feld"layout"der DateiPropertySetgleichLayout()war. -
Es wurde ein Problem im
ElidePermutationstranspiler-Durchgang, bei dem die Ausgabe-Permutation nicht korrekt aktualisiert wurde, wenn esPermutationGateoperationen. Dies würde dazu führen, dass eine falsche Ausgangsschaltung und eine falschevirtual_permutation_layoutEigenschaft in derproperty_seteingestellt wird. Wenn es als Teil eines größerenPassManagerwürde dies auch dazu führen, dass eine falscheTranspileLayoutzurückgegeben wird, in derQuantumCircuit.layoutin der Ausgangsschaltung. -
Es wurde ein Fehler im
HighLevelSynthesispass beim Abrollen von verschachtelten/angepasstenInstructionobjekten. Wenn dieQuantumCircuitzurückgegeben vonInstruction.definitioneines benutzerdefinierten Objekts irgendwelcheClbitobjekte enthalten, würden diese klassischen Bits fälschlicherweise den internen Index innerhalb derInstruction.definitionQuantumCircuitverwenden, anstatt sie auf den entsprechenden Index in der äußerenQuantumCircuit. -
Ein Fehler im Programm
PauliEvolutionSynthesisDefaultundPauliEvolutionSynthesisRustiqplugins behoben, der das Attribut.synthesis der ursprünglichen Schaltung beim Setzen vonpreserve_order=Falseveränderte. Das Verhalten der Plugins wurde wiederhergestellt, und der ursprüngliche Schaltkreis bleibt nun in der gesamten Transpilationspipeline erhalten. -
Ein Kompatibilitätsproblem mit der minimal unterstützten Version von rustworkx, 0.15, wurde behoben. Bei bestimmten Eingaben werden die
VF2LayoutundVF2PostLayouteine rustworkx-Methode verwendet, die in rustworkx 0.16.0 hinzugefügt wurde, was zu einem Fehler führte, wenn eine ältere rustworkx-Version verwendet wurde, die als unterstützt aufgeführt ist. -
SabreLayoutundSabreSwapgerät nicht mehr in Panik, wenn es das Routing-Ergebnis auf eine Schaltung anwendet, dieexpr.VaroderStretchobjekte in einem verschachtelten Kontrollflussbereich verwendet. -
qiskit.circuit.library.quantum_volume()wurde aktualisiert, um einnumpy.random.Generatorals Eingabe für sein Argumentseedzu behandeln. Früher hätte ein solches Generator-Argument zu einerTypeErrorgeführt.
2.0.2
Vorspiel
Qiskit v2.0.2 ist ein Bugfix-Release für die v2.0 minor Versionsreihe.
Fehlerkorrekturen
-
Behoben wurde das
nameattribut derOrGateklasse korrigiert, so dass es jetzt auf"or"gesetzt ist, um dieses Tor eindeutig zu identifizieren. Zuvor war er fälschlicherweise auf"and"gesetzt, was es unmöglich machte, ihn vonAndGatezu unterscheiden oder Synthese-Plugins zur Synthese einesOrGate. -
Es wurde ein Problem im
ConsolidateBlockstranspiler-Durchgang behoben, bei dem die Konsolidierung einiger Blöcke fehlschlug, wenn das ausgewählte KAK-Gate (entweder direkt oder über das Ziel) supergesteuert ist und nichtCXGate. Behoben #14413 -
Ein Fehler in den Schaltkreisfunktionen wurde behoben
evolved_operator_ansatz(),qaoa_ansatz()undhamiltonian_variational_ansatz(), bei denen die Parameter eine komplexe Komponente von Null hatten. Dies war normalerweise kein Problem, es sei denn, der Parameter wurde mit der Methode SymPy inParameterExpression.sympify()methode übersetzt, was dann einen Fehler auslösen würde.
2.0.1
Vorspiel
Qiskit v2.0.1 ist ein kleineres Bugfix-Release für die v2.0.x Release-Serie.
Fehlerkorrekturen
-
Es wurde ein Visualisierungsfehler in der Textkreislauf-Schublade behoben, bei dem die abschließende "Klammer" von Post-Transpilations-Kontrollfluss-Operationen vertikal durcheinander dargestellt werden konnte. Siehe #14271 für weitere Einzelheiten.
-
Es wurde ein Fehler im
UnitarySynthesistranspiler-Durchgang, bei dem der Durchgang den Parametersynth_gatesignorierte und nur dieunitaryGatter synthetisierte. Der Durchlauf synthetisiert nun korrekt alle im Parametersynth_gatesangegebenen Gates. Behoben #14343. -
Hinzugefügt wurde die fehlende
reprUnterstützung fürDuration. -
Fehlende Unterstützung für Python Beizen von
Duration. Dadurch wurde die parallele Umsetzung von Schaltungen mitdelay()anweisungen, die Dauerausdrücke verwenden. -
Es wurde ein Problem im
HighLevelSynthesistranspiler-Durchlaufs behoben, der dazu führte, dass er bei bestimmten Schaltungen mit Kontrollflussoperationen fälschlicherweise vorzeitig abgebrochen wurde. Behoben #14338 -
Die Konstruktion von Instantaneous Quantum Polynomial time (IQP) Schaltungen in
IQPund durchiqp(). Die bisherige Implementierung verwendete fälschlicherweise Potenzen des Gatters anstelle von Potenzen des Gatters. -
SabreLayoutpropagiert nun korrekt dienameundmetadatafelder einer Schaltung korrekt weiter, wenn sie als gemeinsamer Layout- und Routing-Durchgang ausgeführt werden. -
Es wurde ein Problem im
SolovayKitaevSynthesisunitären Synthese-Plugin behoben, bei dem durch wiederholtes Ausführen des Plugins mit verschiedenen Basisgattern fälschlicherweise nur die Basisgatter des ersten Laufs wiederverwendet wurden. Dieses Problem war darauf zurückzuführen, dass beim Zwischenspeichern von Basisannäherungen die Basistore ignoriert wurden. -
Es wurde ein Problem im
SolovayKitaevtranspiler-Durchgang, bei dem es zu einem Absturz kommen konnte, wenn eine 180-Grad-Drehung in der internen Rekursion auftrat, die nicht korrekt behandelt wurde. -
Es wurde ein Problem im
SolovayKitaevtranspiler-Durchgang behoben, bei dem die generierte Annäherung eine Phase haben konnte, die um vom korrekten Wert abwich. Dies ist auf die interne Darstellung zurückzuführen, die eine zusätzliche Behandlung erfordert, um das richtige Vorzeichen der Qubit-Gate-Matrix zu erhalten. Behoben #9552 -
Schaltungen, die Verzögerungen mit Dehnungen enthalten (siehe
QuantumCircuit.add_stretch()), können nun erfolgreich mit den voreingestellten Pass-Managern kompiliert werden (transpile()undgenerate_preset_pass_manager()) erfolgreich kompiliert werden, wenn sie auf ein Backend mit Ausrichtungsbeschränkungen abzielen, z. B. IBM Quantum Eagle-Geräte wieibm_sherbrooke. -
Die Fallback-Fehlerheuristik in
VF2LayoutundVF2PostLayoutdie verwendet wurde, als es keine gemeldeten Fehlerquoten gab, konnte früher Fehler größer als eins zuweisen und unvorhersehbare Auswirkungen auf die resultierenden Layout-Scores haben.
2.0.0
Vorspiel
Wir freuen uns, Qiskit v2.0.0 mit neuen Funktionen zu veröffentlichen, die seine Leistung und Fähigkeiten verbessern. Zu den wichtigsten Funktionen von Qiskit v2.0.0 gehören:
- Die Einführung einer C-API zur Erstellung von und Interaktion mit
SparseObservableobjekten. Diese erste kompilierte Sprachschnittstelle stellt einen wichtigen Meilenstein in der Entwicklung von Qiskit dar und wird im Laufe der Versionsreihe v2.x an Umfang gewinnen. Die erste Iteration der C-API ist eine experimentelle Funktion, und es kann in kleineren Versionen, die unserer Versionsstrategie folgen, Änderungen an der API geben.- Die Hinzufügung einer neuen
BoxOpkontrollfluss-Operation, die dem OpenQASM 3-Konzept einer Box entspricht und die Gruppierung von Anweisungsreihen für die spätere Verarbeitung und benutzerdefinierte Planung ermöglicht. Dieser Operator ist u. a. für Anwendungen wie Zwirbeln, Rauschen lernen und streckungsbasierte Terminierung nützlich.- Die Möglichkeit,
stretchZeitdauern für Anweisungen zu erstellenDelayanweisungen zu erstellen, mit denen Beziehungen zwischen zeitabhängigen Anweisungen ausgedrückt werden können. Der neueStretchtyp erweitert das bestehende klassische Ausdruckssystem, so dass die Entwurfsabsicht zur Zeit der Schaltungskonstruktion erfasst und zur Kompilierzeit aufgelöst werden kann. Einzelheiten finden Sie in der Dokumentation OpenQASM.- Verbesserte Synthese, wenn a
Targetgebrochene Zwei-Qubit-Basistore mit Unterstützung für beliebige Winkel enthält, wieRZXGateoderRZZGatewas die Anzahl der Gatter in den synthetisierten Schaltungen erheblich reduziert.- Verbesserte Laufzeitleistung, insbesondere während des Schaltungsaufbaus, wo Benchpress-Benchmarking einen 2x Geschwindigkeitszuwachs gegenüber Qiskit v1.3 zeigt. Diese Verbesserung wird durch eine Kombination von Beiträgen erreicht, darunter die Nutzung zusätzlicher nativer Rust-Gate-Darstellungen, wie z. B
UnitaryGateund das Entfernen von veralteten Datenmodellelementen.
Im Einklang mit unserer Politik der semantischen Versionierung, die zum Zeitpunkt der Veröffentlichung von v1.0.0 dokumentiert wurde, enthält diese Hauptversion auch API-Änderungen, die nicht rückwärtskompatibel mit der Versionsreihe v1.x sind. Insbesondere wurden mehrere veraltete Komponenten des Qiskit-Datenmodells entfernt, wie z. B. die Methode .c_if() , das Modul qobj , BackendV1 und qiskit.pulse sowie die veralteten primitiven Referenzimplementierungen V1. Weitere Einzelheiten zu all diesen Entfernungen und API-Änderungen finden Sie in den Abschnitten zu den Upgrade-Versionshinweisen. Die entfernten APIs werden in der Version Qiskit v1.4.x weiterhin unterstützt, die für weitere sechs Monate Fehlerbehebungen und für ein Jahr Sicherheitsupdates erhält.
Neue Funktionen
-
Der Support für die Plattform Linux aarch64 wurde zum Tier-1-Support befördert, wie in der Dokumentation dokumentiert:
/guides/install-qiskit#Betriebssystem-Unterstützung
von der bisherigen Unterstützungsstufe 2 in der Veröffentlichungsreihe v1.x.
-
Einführung einer neuen C-API zur Erstellung und Interaktion mit spärlichen Observablen. Obwohl die API-Oberfläche in dieser Version recht klein ist - sie umfasst nur die
SparseObservableklasse abdeckt - stellt sie einen wichtigen Meilenstein in der Entwicklung von Qiskit dar, da das SDK zum ersten Mal eine öffentliche Schnittstelle in C offenlegt und die Grundlage für zukünftige Erweiterungen der Qiskit C-Schnittstelle legt. Da dies die erste öffentliche Schnittstelle in C ist, handelt es sich um eine experimentelle Funktion, und falls erforderlich, kann die API in einer kleineren Version geändert werden.Eine detaillierte Syntax und weitere Informationen finden Sie in der C-API-Dokumentation. Ein minimales Beispiel für die Konstruktion der 100-Qubit-Beobachtung ist
2 X0 Y1 Z2:#include <complex.h> #include <qiskit.h> #include <stdint.h> #include <stdio.h> int main(int argc, char *argv[]) { // build a 100-qubit empty observable uint32_t num_qubits = 100; QkObs *obs = qk_obs_zero(num_qubits); // add the term 2 * (X0 Y1 Z2) to the observable complex double coeff = 2; QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z}; uint32_t indices[3] = {0, 1, 2}; QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits}; qk_obs_add_term(obs, &term); // print some properties printf("num_qubits: %u\n", qk_obs_num_qubits(obs)); printf("num_terms: %lu\n", qk_obs_num_terms(obs)); // free the memory allocated for the observable qk_obs_free(obs); return 0; }
Schaltkreise Funktionen
-
Hinzufügen einer neuen
get_control_flow_name_mapping()funktion hinzugefügt, die eine Zuordnung von Qiskit-Kontrollfluss-Operationsnamen zu ihren entsprechenden Klassen zurückgibt.Beispielverwendung:
from qiskit.circuit import get_control_flow_name_mapping ctrl_flow_name_map = get_control_flow_name_mapping() if_else_object = ctrl_flow_name_map["if_else"] print(if_else_object)<class 'qiskit.circuit.controlflow.if_else.IfElseOp'> -
Es wurde eine neue Schaltkreis-Methode hinzugefügt,
QuantumCircuit.estimate_duration()hinzugefügt, um die Dauer einer geplanten Schaltung nach der Transpilierung zu schätzen. Die Dauer eines Stromkreises wird geschätzt, indem der längste Weg auf einem geplanten Stromkreis auf der Grundlage der Dauer eines bestimmtenTarget. Diese Methode funktioniert nur für einfache Schaltungen, die keinen Kontrollfluss oder andere klassische Vorwärtsoperationen enthalten.Verwenden Sie diese Methode anstelle des veralteten
QuantumCircuit.durationattribut, wenn Sie eine Schätzung der Gesamtdauer der Schaltung benötigen.Beispielverwendung:
from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2(num_qubits=3, seed=42) circ = QuantumCircuit(3) circ.cx(0, 1) circ.measure_all() circ.delay(1e15, 2) circuit_dt = transpile(circ, backend, scheduling_method="asap") duration = circuit_dt.estimate_duration(backend.target, unit="s") print("Estimated duration: ", duration) -
Zwei neue Klassen hinzugefügt:
BitFlipOracleGateundPhaseOracleGate.BitFlipOracleGatewurde als Alternative zur direkten Synthese vonBooleanExpressioneingeführt, die in Qiskit v2.0 entfernt worden ist.PhaseOracleGatewurde hinzugefügt als Alternative zuPhaseOraclehinzugefügt, da letzteres in den Versionen von v2.x veraltet sein wird. Beide Klassen teilen sich die Schnittstelle vonPhaseOraclemit Ausnahme der Methodeevaluate_bitstring, die nicht mehr vorhanden ist.BitFlipOracleGatesynthetisiert ein Bit-Flip-Orakel anstelle eines Phasensprung-Orakels, d. h. es wirkt auf ein zusätzliches Qubit und kann als Anwendung einer Controlled-X-Operation betrachtet werden, bei der die Kontrolle durch den Wert des vom Orakel kodierten Ausdrucks bestimmt wird.from qiskit import QuantumCircuit from qiskit.circuit.library.bit_flip_oracle import BitFlipOracleGate qc = QuantumCircuit(5) bool_expr = "(x0 & x1 | ~x2) & x4" oracle = BitFlipOracleGate(bool_expr) qc.compose(oracle, inplace=True) qc.draw('mpl') qc.decompose().draw('mpl')
from qiskit import QuantumCircuit from qiskit.circuit.library.phase_oracle import PhaseOracleGate qc = QuantumCircuit(5) bool_expr = "(x0 & x1 | ~x2) & x4" oracle = PhaseOracleGate(bool_expr) qc.compose(oracle, inplace=True) qc.draw('mpl') qc.decompose().draw('mpl')
-
Eine neue Kontrollfluss-OP,
BoxOpund die zugehörigeQuantumCircuit.box()methode und der Kontextmanager sind nun verfügbar unterqiskit.circuit.Der normale Weg, eine Box zu konstruieren, ist die Verwendung des
QuantumCircuit.box()kontext-Manager:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(5) with qc.box(): # This box "uses" qubits 0 and 1. qc.x(0) qc.z(1) # Boxes can be assigned a duration. with qc.box(duration=100, unit="ms"): # This box "uses" qubits 2, 3 and 4. # Qubit 4 undergoes no operations. qc.cx(2, 3) qc.noop(4)Die Qiskit "Box" entspricht fast direkt dem OpenQASM 3 Konzept einer Box.
Alle von der Box "verwendeten" Qubits sind am Anfang und am Ende der Box zeitlich synchronisiert. Mit anderen Worten: Die Box hat für jedes verwendete Qubit die gleiche "Dauer", und die Startpunkte sind synchronisiert. Andere Operationen, die denselben Geltungsbereich haben wie die
BoxOpselbst sehen die Box als atomar an; es ist gültig, eine Operation an einer ganzen Box vorbeizupendeln, wenn die Operation mit der Aktion der ganzen Box übereinstimmt, aber es ist nicht allgemein gültig, eine Operation in eine Box hinein oder aus einer Box heraus zu verschieben.Die wichtigsten Verwendungszwecke einer Box sind die Gruppierung einer Reihe von Befehlen für die spätere Verarbeitung (z. B. Gruppierung einer partiellen Schicht von Zwei-Qubit-Gattern) und die Planung eines zusammengesetzten Blocks in einem Bereich unter Verwendung einer relativen Planung innerhalb des Blocks (z. B. dynamische Entkopplung mehrerer Qubits in einer Gruppe). Qiskit's Compiler hat noch keine eingebauten Pässe, die Anweisungen gruppieren oder Anweisungen mit einer
BoxOp.Der Transpiler unterstützt Routing und Layout bei Vorhandensein von Boxen und optimiert innerhalb der Box (bis zur Einstellung
optimization_level), führt aber noch keine Optimierungen rund um die atomare Struktur von Boxen durch. Die text- und Matplotlib -basierten Schaltkreiszeichner unterstützen Box. Der Export nach QPY und nach OpenQASM 3 wird unterstützt, obwohl OpenQASM 3 derzeit keine Möglichkeit bietet, ruhende Qubits innerhalb einer Box zu kennzeichnen (es wird erwartet, dass eine Spezifikationsänderung dies in naher Zukunft hinzufügen wird: siehe den entsprechenden Feature-Vorschlag ). -
Ein neues Argument
approximation_degreewurde zuCommutationChecker.commute()undCommutationChecker.commute_nodes(). Mit diesem Argument können Sie den Schwellenwert für die Annäherung festlegen, ab dem Gates als pendelnd bewertet werden. Siehe den Docstring vonCommutationCheckerfür weitere Informationen. -
Es wurde eine neue Schaltkreismethode hinzugefügt,
QuantumCircuit.noop()hinzugefügt, die es ermöglicht, Qubits explizit als verwendet in einem Kontrollflusserstellungsbereich zu markieren, ohne ihnen eine entsprechende Operation hinzuzufügen. -
Das klassische Modul für Echtzeit-Ausdrücke
qiskit.circuit.classicalkann nun konstante Ausdrücke darstellen. Die KlasseExprklasse hat jetzt ein booleschesconstAttribut, das angibt, ob der Ausdruck konstant ist. Auf diese Weise können wir erzwingen, dass Ausdrücke in bestimmten Kontexten zur Kompilierzeit auswertbar sein müssen.Alle
Varausdrücke gelten als non-const, während alleValueausdrücke const sind.Ein Ausdruck, der nur aus anderen const-Ausdrücken besteht, ist ebenfalls const:
from qiskit.circuit.classical import expr assert expr.bit_and(5, 6).constEin Ausdruck, der einen nicht-konstanten Ausdruck enthält, ist nicht-konstant:
from qiskit.circuit.classical import expr, types assert not expr.bit_and(5, expr.Var.new("a", types.Uint(5)).const -
Das klassische Modul für Echtzeitausdrücke
qiskit.circuit.classicalkann nun Dauern darstellen, indem es den neuen TypDuration.Das Modul
qiskit.circuithat auch eine neueDurationklasse, die als literaler Wert in klassischen Ausdrücken verwendet werden kann.Die Funktion
lift()funktion kann verwendet werden, um einen Wertausdruck aus einerDurationinstanz:from qiskit.circuit import Duration from qiskit.circuit.classical import expr expr.lift(Duration.dt(1000)) # Value(Duration.dt(1000), Duration()) -
Das klassische Modul für Echtzeitausdrücke
qiskit.circuit.classicalkann nun IEEE-754 double-precision floating point values mit dem neuen TypFloat.Die Funktion
lift()funktion kann verwendet werden, um einen Wertausdruck aus einem Python float zu erstellen:from qiskit.circuit.classical import expr expr.lift(5.0) # >>> Value(5.0, Float())Dieser Typ ist in erster Linie für die Verwendung in zeitbezogenen Ausdrücken (
durationundstretch) vorgesehen. Es ist nicht kompatibel mit bitweisen oder logischen Operationen, obwohl es mit diesen verwendet werden kann, wenn sie zuerst explizit in etwas anderes gecastet werden. -
Verringerung der Anzahl von Zwei-Qubit-Gattern bei der Zerlegung von mehrfach kontrollierten Ein-Qubit-Einheitsgattern. Zum Beispiel:
- Für mehrfach kontrollierte
YGateauf 10 Qubits wurde dieCXGatedie Anzahl um 56 % reduziert. - Für mehrfach kontrollierte
HGateauf 10 Qubits wurde dieCXGatedie Anzahl um 56 % reduziert. - Für mehrfach gesteuerte
SXGateundSXdgGateauf 10 Qubits wurde dieCXGateanzahl um 80 % reduziert. - Für mehrfach kontrollierte
UGateauf 10 Qubits wurde dieCXGateum 31 % reduziert.
- Für mehrfach kontrollierte
-
Das klassische Modul für Echtzeitausdrücke
qiskit.circuit.classicalkann nun arithmetische Operationen darstellenadd(),sub(),mul(), unddiv()auf numerische und zeitliche Operanden darstellen.Zum Beispiel:
from qiskit.circuit import QuantumCircuit, ClassicalRegister, Duration from qiskit.circuit.classical import expr # Subtract two integers cr = ClassicalRegister(4, "cr") qc = QuantumCircuit(cr) with qc.if_test(expr.equal(expr.sub(cr, 2), 3)): pass # Multiply a Duration by a Float with qc.if_test(expr.less(expr.mul(Duration.dt(200), 2.0), Duration.ns(500))): pass # Divide a Duration by a Duration to get a Float with qc.if_test(expr.greater(expr.div(Duration.dt(200), Duration.dt(400)), 0.5)): passWeitere Beispiele finden Sie in der oben verlinkten Dokumentation auf Modulebene.
-
Der Konstruktor für
UCGatehat jetzt ein neues optionales Argument,mux_simp, das einen booleschen Wert annimmt, der die Suche nach Vereinfachungen von Carvalho et al. Diese Optimierung ist standardmäßig aktiviert, identifiziert und entfernt unnötige Steuerelemente aus dem Multiplexer, wodurch die Anzahl der CX-Gatter und die Schaltungstiefe reduziert werden, insbesondere bei der Vorbereitung von trennbaren Zuständen mitInitialize. -
Die Website
PauliEvolutionGateunterstützt jetzt von Haus ausSparseObservables als Eingabe. Dies ermöglicht eine effiziente Handhabung der Evolution unter Projektoren, die als Kontrollen einer Phasendrehung implementiert werden und weniger Gatter benötigen als die explizite Erweiterung des Projektors im Sinne von Paulis. Zum Beispiel:from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparseObservable obs = SparseObservable("001") evo_proj = PauliEvolutionGate(obs, time=1) print(evo_proj.definition.draw()) -
Ein neuer Ausdrucksknoten
Stretchwurde dem klassischen Ausdruckssystem hinzugefügt, umstretchVariablen darzustellen. Um eine neue Variablestretchzu erstellen, können Sie Folgendes verwendenQuantumCircuit.add_stretch(). Der resultierende Ausdruck ist ein konstanter Ausdruck vom TypDuration, der alsdurationArgument einerdelay().Um beispielsweise sicherzustellen, dass eine Folge von Gates zwischen zwei Barrieren unabhängig von ihrer tatsächlichen Dauer linksbündig ist, können Sie wie folgt vorgehen:
from qiskit import QuantumCircuit from numpy import pi qc = QuantumCircuit(5) qc.barrier() qc.cx(0, 1) qc.u(pi/4, 0, pi/2, 2) qc.cx(3, 4) a = qc.add_stretch("a") b = qc.add_stretch("b") c = qc.add_stretch("c") # Use the stretches as Delay duration. qc.delay(a, [0, 1]) qc.delay(b, 2) qc.delay(c, [3, 4]) qc.barrier()Der
Stretchausdruck ist dem bestehendenVarausdruck, der zur Darstellung klassischer Variablen in einer Schaltung verwendet wird, außer dass er konstant ist und immer vom TypDuration. Er kann in anderen Ausdrücken verwendet werden (z. B. können Sie ihn mit einer numerischen Konstante multiplizieren) undQuantumCircuitbietet volle Scoping-Unterstützung (z. B. kann er von einem Kontrollflussbereich erfasst oder in diesem deklariert werden).Weitere Zusammenhänge und Beispiele sind in der Sprachspezifikation OpenQASM 3 zu finden.
-
Hinzugefügt
Gateversionen der Einzelregister-Arithmetikgatter, die es dem Transpiler ermöglichen, Optimierungen auf hoher Ebene im Vergleich zu ihrenQuantumCircuitvarianten. Dies sind:ExactReciprocalGate(anstelle vonExactReciprocal)IntegerComparatorGate(anstelle vonIntegerComparator)LinearPauliRotationsGate(anstelle vonLinearPauliRotations)PiecewiseLinearPauliRotationsGate(anstelle vonPiecewiseLinearPauliRotations)PiecewiseChebyshevGate(anstelle vonPiecewiseChebyshev)PiecewisePolynomialPauliRotationsGate(anstelle vonPiecewisePolynomialPauliRotations)PolynomialPauliRotationsGate(anstelle vonPolynomialPauliRotations)LinearAmplitudeFunctionGate(anstelle vonLinearAmplitudeFunction)QuadraticFormGate(anstelle vonQuadraticForm)WeightedSumGate(anstelle vonWeightedAdder)
Primitive Funktionen
- Hinzufügen einer neuen
to_bool_array()methode zu derBitArrayklasse hinzugefügt, die das Bit-Array als boolesches Array NumPy zurückgibt. Das Argumentorderkann verwendet werden, um die Endianness des Ausgabe-Arrays anzugeben.
Anbieter Funktionen
-
Es wurde die Möglichkeit hinzugefügt, die Eigenschaft
dtvonGenericBackendV2im Klasseninitialisierer mit einem neuendtArgument zu setzen. Beispielverwendung:from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2( num_qubits = 5, basis_gates = ["cx", "id", "rz", "sx", "x"], dt = 2.22*e-10, seed = 42 )
Quanteninformationsmerkmale
-
Hinzufügen einer neuen
SparseObservable.to_sparse_list()methode hinzugefügt, um eine spärliche Listendarstellung einerSparseObservable. Zum Beispiel:from qiskit.quantum_info import SparseObservable obs = SparseObservable.from_list([("+II", 1), ("-II", 1)]) print(obs.to_sparse_list()) # [("+", [2], 1), ("-", [2], 1)] -
Hinzufügen einer neuen
SparseObservable.as_paulis()methode hinzugefügt, um eine spärliche Observable nur in Form von Paulis auszudrücken, indem alle Projektoren erweitert werden. Zum Beispiel:from qiskit.quantum_info import SparseObservable obs = SparseObservable("+-") obs_paulis = obs.as_paulis() # 1/4 ( II + XI - IX - XX ) -
Qiskit v2.0.0 unterstützt das Konstruieren einer
SparsePauliOpaus einerSparseObservablemit Hilfe der neuen MethodeSparsePauliOp.from_sparse_observable(). Es ist wichtig zu bedenken, dassSparseObservableobjekte effizient Projektoren darstellen können, die eine exponentielle Anzahl von Termen in derSparsePauliOp. -
SparseObservableunterstützt jetzt die Operator-Komposition mit dercompose()methode, ähnlich wie bei anderenquantum_infoklassen. Dies ist vergleichbar mit der Matrixmultiplikation, obwohl die Methode völlig matrixfrei ist. -
SparseObservable.BitTermhat ein neues Attribut,labeldas die einstellige Zeichenfolge Python enthält, die zur Darstellung des Begriffs in String-Labels verwendet wird. -
Die Methode
StabilizerState.expectation_value()methode kann nun einen Operator des TypsSparsePauliOp.
Synthesefunktionen
-
Hinzufügen einer neuen
TwoQubitControlledUDecomposerklasse hinzugefügt, die jede Zwei-Qubit-Unitary in Basis-Zwei-Qubit-Fractional-Gates zerlegt, wie z. BRZZGate(oder Zwei-Qubit-Gattern, die lokal äquivalent sind zuRZZGatebis hin zu Ein-Qubit-Gattern).Zum Beispiel:
from qiskit.circuit.library import RZZGate from qiskit.synthesis import TwoQubitControlledUDecomposer from qiskit.quantum_info import random_unitary unitary = random_unitary(4, seed=1) decomposer = TwoQubitControlledUDecomposer(RZZGate, euler_basis="ZXZ") circ = decomposer(unitary) circ.draw(output='mpl') -
Der
synth_cnot_depth_line_kms()pass wurde nach Rust portiert, wobei vorläufige Benchmarks auf eine Beschleunigung um den Faktor 20x hindeuten. -
Der
synth_cx_cz_depth_line_my()pass wurde nach Rust portiert, wobei vorläufige Benchmarks auf eine Beschleunigung um den Faktor 70x hindeuten. -
Zusätzliche Synthesefunktionen
synth_integer_comparator_2s()undsynth_integer_comparator_greedy()zur Kompilierung von Gattern, die einen Ganzzahlvergleich implementieren, wie z.BIntegerComparatorGate. Die entsprechenden High-Level-Synthese-Plugins sindIntComparatorSynthesis2sundIntComparatorSynthesisNoAux. Um den Compiler die optimale Zerlegung auf der Grundlage der verfügbaren Hilfsqubits auswählen zu lassen, verwenden SieIntComparatorSynthesisDefault. -
Hinzugefügt
synth_weighted_sum_carry()zur Synthese vonWeightedSumGateobjekte. Dies ist derzeit die einzige verfügbare Synthesemethode fürWeightedSumGatemit dem entsprechenden High-Level-Synthese-PluginWeightedSumSynthesisDefault.
Transpiler-Funktionen
-
Es wurde Unterstützung für die Arbeit mit
Targetobjekten, die Zwei-Qubit-Basistore enthalten, die beliebige Winkel enthalten, wie z. BRZZGatein denConsolidateBlockstranspiler-Durchgang. Der bisherige Durchlauf schätzte die Anzahl der für eine Zerlegung erforderlichen Gatter nicht korrekt ab, was dazu führte, dass Blöcke nicht konsolidiert wurden, woUnitarySynthesisden Block potenziell optimieren könnte. Intern erfolgt die Schätzung der Gatteranzahl mit Hilfe derTwoQubitControlledUDecomposerklasse.Zum Beispiel:
from qiskit import QuantumCircuit from qiskit.transpiler import generate_preset_pass_manager from qiskit.transpiler.passes import ConsolidateBlocks qc = QuantumCircuit(2) qc.rzz(0.1, 0, 1) qc.rzz(0.2, 0, 1) # basis_gates contains fractional gate (rzz) consolidate_pass = ConsolidateBlocks(basis_gates=["rz", "rzz", "sx", "x", "rx"]) block = consolidate_pass(qc) # consolidate the circuit into a single unitary block block.draw(output='mpl') pm = generate_preset_pass_manager( optimization_level=2, basis_gates=["rz", "rzz", "sx", "x", "rx"] ) tqc = pm.run(qc) # synthesizing the circuit into basis gates tqc.draw(output='mpl') -
Unterstützung für gebrochene Zwei-Qubit-Basistore, wie z. B
RZZGatein denUnitarySynthesistranspiler-Durchgang. Die Zerlegung erfolgt mit demTwoQubitControlledUDecomposerund unterstützt sowohl Standard- als auch benutzerdefinierte Basisgatter.Zum Beispiel:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_unitary from qiskit.transpiler.passes import UnitarySynthesis from qiskit.converters import circuit_to_dag, dag_to_circuit unitary = random_unitary(4, seed=1) qc = QuantumCircuit(2) qc.append(unitary, [0, 1]) dag = circuit_to_dag(qc) # basis_gates contains fractional gate (rzz) circ = UnitarySynthesis(basis_gates=['rzz', 'rx', 'rz']).run(dag) dag_to_circuit(circ).draw(output='mpl') -
Ein neuer Transpiler-Pass wurde hinzugefügt,
LightConeder den Lichtkegel einer Schaltung zurückgibt, wenn eine Teilmenge von Qubits oder eine bestimmte Pauli-Kette gemessen wird.Zum Beispiel für die folgende Schaltung:
durch die Durchführung des Passes würden die Tore, die keinen Einfluss auf das Ergebnis haben, eliminiert:
from qiskit.transpiler.passes.optimization.light_cone import LightCone from qiskit.transpiler.passmanager import PassManager from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(3,1) qc.h(range(3)) qc.cx(0,1) qc.cx(2,1) qc.h(range(3)) qc.measure(0,0) pm = PassManager([LightCone()]) new_circuit = pm.run(qc) new_circuit.draw("mpl")
-
Ein neues Argument
max_block_widthwurde zu derBlockCollectorklasse und zu denCollectLinearFunctionsundCollectCliffordstranspilerübergänge. Mit diesem Argument können Sie die maximale Anzahl von Qubits begrenzen, über die ein Knotenblock definiert wird.Zum Beispiel:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import CollectLinearFunctions qc = QuantumCircuit(5) qc.h(0) qc.cx(0, 1) qc.cx(1, 2) qc.cx(2, 3) qc.cx(3, 4) # Collects all CX-gates into a single block qc1 = CollectLinearFunctions()(qc) qc1.draw(output='mpl') # Collects CX-gates into two blocks of width 3 qc2 = CollectLinearFunctions(max_block_width=3)(qc) qc2.draw(output='mpl') -
Hinzufügen einer neuen Option,
collect_from_back, zumCollectMultiQBlockstranspiler-Pass. Bei der EinstellungTruewerden die Blöcke in umgekehrter Richtung gesammelt, von den Ausgängen zu den Eingängen der Schaltung. Die Blöcke werden weiterhin in der normalen topologischen Reihenfolge gemeldet. Dies führt zu einer zusätzlichen Flexibilität, die der Pass bietet, und zu zusätzlichen Optimierungsmöglichkeiten, wenn er mit einer Schaltungsresynthesemethode kombiniert wird. -
Ein neues
approximation_degreeArgument wurde zuCommutationAnalysis. Mit diesem Argument können Sie den Schwellenwert für die Annäherung festlegen, ab dem Gates als kommutierend bewertet werden. Weitere Informationen finden Sie im Docstring der Klasse. -
Ein neuer Transpiler-Pass,
ContractIdleWiresInControlFlow, ist verfügbar inqiskit.transpiler.passes. In diesem Durchgang werden Qubits aus Kontrollflussblöcken entfernt, wenn die Semantik dies zulässt und das Qubit während der gesamten Kontrollflussoperation inaktiv bleibt. Zuvor konnte die Routing-Stufe der voreingestellten Pass-Manager als unbeabsichtigte Nebenwirkung der Funktionsweise der Pässe ungenutzte Qubits entfernen. Jetzt wird dieses Verhalten im Rahmen eines Optimierungsdurchgangs ordnungsgemäß behandelt. -
Eine neue
"default"Routing-Plugin-Stufe wurde hinzugefügt. In Qiskit v2.0.0 ist dies einfach ein Alias für die bisherige Voreinstellung"sabre". Der zugrundeliegende Standardalgorithmus kann sich im Laufe der Qiskit v2.x Versionsreihe für einige oder alle Ziele ändern, aber Sie können jederzeit explizitrouting_method="sabre"einstellen, um das aktuelle Verhalten beizubehalten. -
Eine neue
"default"Übersetzungs-Plugin-Stufe wurde hinzugefügt. In Qiskit v2.0.0 ist dies ein Alias für die bisherige Standardeinstellung"translator". Der zugrundeliegende Standardalgorithmus kann sich im Laufe der Qiskit 2.x Serie für einige oder alle Ziele ändern, aber Sie können jederzeittranslation_method="translator"explizit einstellen, um das aktuelle Verhalten beizubehalten. -
Der
HighLevelSynthesistranspiler-Durchgang synthetisiert nun Objekte des TypsAnnotatedOperationüber die Plugin-Schnittstelle. -
PassManager.run()akzeptiert jetzt einproperty_setArgument, das auf einMapping-objekt gesetzt werden kann, um die Anfangswerte der PipelinePropertySet. Dies kann dazu verwendet werden, eine teilweise durchgeführte Kompilierung erneut zu beginnen oder bestimmte Analysen aus einer früheren Kompilierung an einer neuen Stelle wieder zu verwenden. -
Die Terminierung verläuft
PadDelayundPadDynamicalDecouplinghaben jetzt neue Argumente für ihre Konstrukteure:targetunddurations. Diese werden verwendet, um dieTargetoderInstructionDurationszu spezifizieren. Für den Zugriff auf die Befehlsdauern bei der Ausführung des Durchlaufs ist eines der Argumente erforderlich. -
Hinzufügen einer neuen
seconds_to_dt()methode zu derTargetklasse. Dies wird verwendet, um eine Dauer in Sekunden in eine Anzahl diskretisierter Zeitschritte der im AttributTarget.dtattribut angegeben ist. Dies ist typischerweise nützlich für die Konvertierung desInstructionProperties.durationwertes in Einheiten vondt. -
Der
Split2QUnitariestranspiler-Pass wurde erweitert, um den Fall zu behandeln, dass die betrachtete Unitary als einSwapGategatter und zwei Ein-Qubit-Gatter geschrieben werden kann. In diesem Fall wird die Unitary geteilt und auch eine virtuelle Vertauschung vorgenommen, ähnlich wie inElidePermutations. Diese Funktionalität kann mit einem neuen Argument,split_swap, im Konstruktor von :class`.Split2QUnitaries` gesteuert werden, mit dem die Aufteilung von Swap-äquivalenten Gates deaktiviert werden kann.
Versch. Funktionen
-
qiskit.utilsenthält nun Hilfsprogramme zur besseren Kontrolle und Überprüfung von Qiskitsmultiprocessingparallelisierungseinstellungen. Insbesondere kann man nun mitshould_run_in_parallel()abfragen, obparallel_map()(und Pass-Manager) bei geeigneten Eingaben Unterprozesse starten, und den Kontextmanagershould_run_in_parallel.override()verwenden, um die meisten System- und Benutzerkonfigurationen für diese Entscheidung vorübergehend außer Kraft zu setzen.Eine zusätzliche Funktion,
default_num_processes()liest die standardmäßige maximale Anzahl von Unterprozessen, die Qiskit für prozessbasierte Parallelität verwendet. -
Eine neue Umgebungsvariable,
QISKIT_IGNORE_USER_SETTINGS, steuert nun, ob die Benutzereinstellungsdatei aufimport qiskitgelesen werden soll. Ist der Wert auf die Zeichenkettetruegesetzt, wird die Einstellungsdatei nicht gelesen. Dies ist nützlich, um bestimmte Instanzen von Qiskit von der Systemumgebung zu isolieren, z. B. für Tests.
Anmerkungen zu Upgrades
-
Qiskit v2.0 hat die Unterstützung für Linux i686 und 32-Bit-Windows eingestellt. Ab Qiskit v2.0.0 ist eine 64-Bit-Plattform erforderlich, um Qiskit auszuführen. Dies entspricht dem Trend in der wissenschaftlichen Gemeinschaft Python und ermöglicht es Qiskit, sich auf Leistungsverbesserungen für immer komplexere Quantencomputerhardware zu konzentrieren.
Qiskit v1.4 wird weiterhin 32-Bit-Plattformen bis zum Ende der Lebensdauer (September 2025) unterstützen, aber ab dieser Version 2.0.0 wird Qiskit keine vorkompilierten Binärdateien mehr für diese Plattformen veröffentlichen und bietet keine Garantie für erfolgreiche Quellcode-Builds auf 32-Bit-Plattformen.
-
Die minimal unterstützte Rust-Version für die Erstellung von Qiskit aus dem Quellcode ist nun v1.79. Diese wurde von v1.70, der vorherigen minimal unterstützten Rust-Version in der Qiskit v1.x Release-Serie, angehoben.
-
Qiskit Pulse wurde in dieser Version vollständig entfernt, nachdem es in Qiskit v1.3 veraltet war. Dazu gehören alle Impulsmoduldateien, die Impulsvisualisierungsfunktionalität, die Unterstützung von
ScheduleBlockund die Serialisierung und Deserialisierung von Impulsgattern in QPY, die Verwaltung von Kalibrierungen inQuantumCircuit,TargetundDAGCircuitund puls-basierte Fake-Backends. Weitere Einzelheiten zu den entfernten Komponenten im Zusammenhang mit dem Impuls finden Sie in den entsprechenden Abschnitten unten.Beachten Sie, dass die Migration von Pulse zu Qiskit Dynamics, die ursprünglich nach der Abschaffung von Pulse geplant war, aufgrund der Entwicklungsprioritäten von Qiskit Dynamics auf Eis gelegt wurde. Benutzer, die Qiskit Pulse als Frontend für unterstützende Backends oder in anderen Anwendungsfällen verwenden möchten, können es weiterhin in Qiskit-Versionen vor v2.0.0 verwenden, die die Pulse-Funktionalität enthalten.
-
Die Funktionen
sequenceundscheduleaus dem Modulcompilermodul wurden entfernt, nachdem sie in Qiskit v1.3 veraltet sind. Sie verließen sich auf die Möglichkeit, Schaltungen mithilfe von Backend-Definitionen in Impulskomponenten zu übersetzen, eine Fähigkeit, die nicht mehr vorhanden ist. Aus diesem Grund wurden sie entfernt, ohne dass eine Alternative vorgeschlagen wurde. Beachten Sie, dass sich diese Entfernungen auf das Paket Pulse beziehen, das auch in Qiskit 2.0 entfernt wird.
Hinweise zur Aktualisierung von Schaltkreisen
-
BitundRegistersowie ihre Unterklassen sind nicht mehr garantiert vergleichbar, wenn manisprüft, da Konvertierungen von und nach Python jede Instanz, die Python ausgesetzt ist, neu zuordnen können. -
BitundRegister(und ihre Unterklassen) können nicht mehr unterklassifiziert werden. Dies war nie als unterstütztes Verhalten vorgesehen und würde ein nicht spezifiziertes Verhalten in Qiskit verursachen. Es ist nicht mehr möglich, dies als Implementierungsdetail der Klassen zu tun. -
Es ist nicht mehr möglich, Instanzen der Basis
BitundRegisterklassen zu erzeugen. Die direkte Instanziierung dieser Klassen wurde eindeutig als etwas dokumentiert, das nicht unterstützt wurde, und die Möglichkeit, dies zu tun, war lediglich ein Implementierungsartefakt der Klassenhierarchie in früheren Versionen. Ab Qiskit v2.0.0 ist dies nicht mehr möglich. -
Das Modul
qiskit.circuit.classicalfunctionwurde entfernt, nachdem es in Qiskit v1.4 nicht mehr empfohlen wird. Dazu gehören die KlasseClassicalFunction, die damit verbundene Funktionclassical_functionund die KlasseBooleanExpression. Diese Änderung wurde vorgenommen, um die Abhängigkeit von dertweedledumBibliothek zu entfernen, die nicht mehr mit allen von Qiskit unterstützten Plattformen und Python Versionen kompatibel ist.ClassicalFunctionwurde ausschließlich verwendet inPhaseOracleverwendet, das nun nur noch Ausdrücke im Formatstringakzeptiert (siehe folgende Release Note).BooleanExpressionwurde ersetzt durch die neueBitFlipOracleGateklasse. -
Die Klasse
PhaseOracleklasse hängt nicht mehr von der Bibliothektweedledumab, da die Abhängigkeit nicht aktiv gepflegt wird. Die Schnittstelle wurde vereinfacht: Sie akzeptiert keinen Parametersynthesizermehr, und der Parameterexpressionkann nur eine Zeichenkette sein. Der zuvor akzeptierte TypClassicalFunction, der in Qiskit v1.4 veraltet war, wurde in Qiskit v2.0 entfernt.Trotz dieser Erweiterungen bleibt die Standardverwendung der
PhaseOracleklasse unverändert bleiben:from qiskit.circuit.library.phase_oracle import PhaseOracle bool_expr = "(x0 & x1 | ~x2) & x4" oracle = PhaseOracle(bool_expr) oracle.draw('mpl')
Beachten Sie, dass diese Änderung die Effektivität der Synthese beeinträchtigen kann, aber für die Kompatibilität mit allen von Qiskit unterstützten Plattformen und Python Versionen erforderlich war.
-
Aktualisierung der Metrik zur Überprüfung von Kommutationen in
CommutationChecker. Es wird angenommen, dass zwei Gatter kommutieren, wenn die durchschnittliche Gattertreue der Kommutierung über(1 - 1e-12)liegt. Dieser Wert wurde gewählt, um Rundungsfehler bei der Berechnung der Wiedergabetreue zu berücksichtigen und um die Konsistenz mitRemoveIdentityEquivalentundTwoQubitWeylDecomposition. Weitere Informationen finden Sie im Docstring der Klasse. -
Die Methode
QuantumCircuit.measure_active()hat den Namen des klassischen Registers, das sie erstellt, geändert, da der vorherige Name mit einem reservierten WortOpenQASMin Konflikt stand. Anstelle vonmeasureheißt es nunmeas, was dem Registernamen entspricht, der vonmeasure_all(). -
Die Methode
DAGCircuit.control_flow_op_nodes()methode wurde aktualisiert und gibt nun immer eine Liste zurück, auch wenn diese leer ist. Zuvor wurdeNonezurückgegeben, wenn die Liste leer war, und es wurde nie eine leere Liste zurückgegeben, was eine besondere Behandlung erforderte. Wenn Sie sowohl in Qiskit v1.x als auch in v2.x explizit auf Leerheit testen müssen, können Sie das tun:control_flow_nodes = dag.control_flow_op_nodes() if not control_flow_nodes: # There are no control-flow nodes. pass -
BlueprintCircuit.copy_empty_like()gibt nun eine leereQuantumCircuitmit der gleichen Anzahl von Qubits und Clbits und den gleichen Metadaten wie die ursprüngliche Schaltung zurück, statt einerBlueprintCircuit. Diese Änderung behebt ein unerwartetes Verhalten, bei dem der Umgang mit einer "leeren" Kopie eines Blaupausenschaltkreises dazu führte, dass die Schaltkreisdaten neu erstellt wurden. Beachten Sie, dassBlueprintCircuit.copy()immer noch einBlueprintCircuitzurückgibt.BlueprintCircuitist zwar keine öffentliche Klasse, da es sich um einen internen Typ handelt, der für die Erstellung von Legacy-Einträgen inqiskit.circuit.libraryverwendet wird, hat dies Auswirkungen auf seine Unterklassen wieNLocalundZZFeatureMap. Eine vollständige Liste der von dieser Änderung betroffenen Klassen finden Sie in derqiskit.circuit.libraryfür eine vollständige Liste der Klassen, die von dieser Änderung betroffen sind. Behoben #13535 -
Die interne Funktion
qiskit.circuit.add_control.add_controlwurde entfernt. Diese Funktion war nicht Teil der öffentlichen API, hatte anfällige Vorbedingungen zu erfüllen und war eine häufige Quelle von Fehlern. Die Verwendung vonadd_control(SomeGate(...), ...)sollte aufSomeGate(...).control(...)umgestellt werdenGate.control()stattdessen verwenden, was weitaus sicherer ist. -
Die Methode
ParameterExpression.sympify()methode kann nun eineMissingOptionalLibraryAusnahme auslösen, wennsympynicht installiert ist. In den Versionen von Qiskit v1.x wurdesympyimmer garantiert installiert, aber ab v2.0.0 ist dies keine zwingende Voraussetzung mehr und wird möglicherweise nur noch benötigt, wenn Sie diese Methode verwenden. Da diese Funktion ausdrücklichsympyerfordert, müssen Sie sicherstellen, dass Siesympyinstalliert haben, um die Methode verwenden zu können. -
Das veraltete
DAGNodedagargument wurde aus der KlasseDAGNodeklasse und ihren Unterklassen entfernt:DAGOpNode,DAGOutNode, undDAGInNode.Der Parameter
dagwar ein optionales Argument bei der Erstellung dieser Objekte, aber er wird seit der Version v1.3 nicht mehr verwendet und ignoriert und ist seit der Version v1.4 veraltet. -
Die folgenden
QuantumCircuitmethoden:castcbit_argument_conversioncls_instancescls_prefixqbit_argument_conversion
wurden entfernt, nachdem sie in Qiskit 1.2 nicht mehr empfohlen werden. Bei diesen Methoden handelte es sich um interne Hilfsfunktionen, die nie als öffentliche API vorgesehen waren. Ein Ersatz ist nicht vorgesehen.
-
Die abgelehnten Attribute für
InstructionundGate:durationundunitwurden entfernt, so dass Sie die Argumenteunitoderdurationnicht mehr für jedeqiskit.circuit.Instructionoder Unterklasse setzen. Diese Attribute wurden in Qiskit v1.3.0 veraltet und wurden verwendet, um einer einzelnen Anweisung eine benutzerdefinierte Ausführungsdauer und eine Einheit für diese Dauer zuzuordnen. Die Quelle der Wahrheit über die Dauer eines Tores ist jedoch dieBackendV2Targetdie die Dauer für jede vom Backend unterstützte Anweisung enthält. Die Dauer einer Anweisung ist in der Regel nicht vom Benutzer einstellbar und ist eine unveränderliche Eigenschaft des Backends. Wenn Sie diese Möglichkeit zuvor genutzt haben, um mit verschiedenen Gate-Dauern zu experimentieren, können Sie dasInstructionProperties.durationfeld in einer gegebenenTargetändern, um eine benutzerdefinierte Dauer für eine Anweisung in einem Backend festzulegen. (Die Einheit ist immer in Sekunden in derTarget.) -
Das abgelehnte Attribut für
qiskit.circuit.InstructionundGate:conditionwurde entfernt. Diese Funktionalität wurde ersetzt durch dieIfElseOpersetzt, die zur Beschreibung einer klassischen Bedingung in einer Schaltung verwendet werden kann. Dieses Attribut wurde in der Version v1.3.0 veraltet. -
Die abgelehnten Methoden für
InstructionundGate:c_ifundcondition_bitswurden entfernt. Diese Methoden wurden in der Version v1.3.0 veraltet. Diese Funktionalität wurde ersetzt durch dieIfElseOpersetzt, die zur Beschreibung einer klassischen Bedingung in einer Schaltung verwendet werden kann. Zum Beispiel eine Schaltung, die zuvorInstruction.c_if()verwendet hat, wie:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.x(0).c_if(0, 1) qc.z(1.c_if(1, 0) qc.measure(0, 0) qc.measure(1, 1)Kann wie folgt erneut geschrieben werden:
qc = QuantumCircuit(2, 2) qc.h(0) with expected.if_test((expected.clbits[0], True)): qc.x(0) with expected.if_test((expected.clbits[1], False)): qc.z(1) qc.measure(0, 0) qc.measure(1, 1) -
Die veraltete Methode
InstructionSet.c_ifwurde entfernt. Diese Methode wurde in der Version 1.3.0 veraltet. Diese Funktionalität wurde ersetzt durch dieIfElseOpersetzt, die zur Beschreibung einer klassischen Bedingung in einem Schaltkreis verwendet werden kann. -
Im Rahmen der Entfernung von Pulse in Qiskit v2.0.0 wurde die Eigenschaft
calibrationsaus der DateiQuantumCircuit,DAGCircuitundDAGDependencyklassen entfernt. Darüber hinaus wurde die Methodehas_calibration_foraus den ModulenQuantumCircuitundDAGCircuitentfernt, undadd_calibrationwurde aus den KlassenQuantumCircuit. -
Das Modul
qiskit.circuit.classicalfunctionist entfernt worden. Dieses Modul war von der Bibliothektweedledumabhängig, die mit neueren Versionen von Python nicht kompatibel ist. Alternativ können diePhaseOracleGateundBitFlipOracleGateklassen verwendet werden, um Schaltkreise aus booleschen Ausdrücken zu erzeugen. -
Die interne Darstellung von
UnitaryGatebeim Hinzufügen zu einerQuantumCircuithat sich geändert. Das im Schaltkreis gespeicherte Objekt hat nicht mehr notwendigerweise einen gemeinsamen Bezug zu dem Objekt, das dem Schaltkreis hinzugefügt wurde. Dieses Verhalten war nie garantiert, und das direkte Ändern desUnitaryGateobjekts direkt oder per Verweis war immer unsicher und konnte die Schaltung beschädigen, insbesondere wenn die Matrix geändert wurde. Wenn Sie ein Element im Schaltkreis verändern müssen (was nicht empfohlen wird, da es ineffizient und fehleranfällig ist), tun Sie etwas wie:from qiskit.circuit import QuantumCircuit from qiskit.quantum_info import random_unitary from qiskit.circuit.library import UnitaryGate import numpy as np qc = QuantumCircuit(2) qc.unitary(np.eye(2, dtype=complex)) new_op = UnitaryGate(random_unitary(2)) qc.data[0] = qc.data[0].replace(operation=new_op)Dies gilt auch für
DAGCircuit, aber Sie können stattdessen auchDAGCircuit.substitute_node()stattdessen verwenden. -
Das
CircuitInstruction.paramsattribut für eineCircuitInstructiondas einUnitaryGatefür seinoperationenthält, enthält nicht mehr die zugrunde liegende unitäre Matrix für das Tor. Der Grund dafür ist, dass die interne Darstellung des Gatters das Matrixobjekt nicht mehr als Parameter behandelt. Wenn Sie auf die Matrix des Gates zugreifen müssen, können Sie dies entweder über dieCircuitInstruction.matrixoder dasUnitaryGate.paramsfeld desCircuitInstruction.operation.
Hinweise zum Upgrade von Primitives
-
Infolge der Abschaffung des Modells
BackendV1werden dieBackendSamplerV2undBackendEstimatorV2keine Eingaben des TypsBackendV1in ihrembackend-Eingangsargument mehr akzeptieren. -
Primitive V1 Implementierungen und V1-exclusive nicht versionierte Typ-Aliase, die in Qiskit v1.2 veraltet sind, wurden entfernt. Diese Schnittstellen sind durch ihre V2 Pendants ersetzt worden. Der Umzug umfasst die folgenden Klassen, die die Schnittstellen von V1 implementieren:
Estimatorzu Gunsten des V2 Äquivalents,StatevectorEstimatorSamplerzu Gunsten des V2 Äquivalents,StatevectorSamplerBackendEstimatorzu Gunsten des V2 Äquivalents,BackendEstimatorV2BackendSamplerzu Gunsten des V2 Äquivalents,BackendSamplerV2
Sowie die folgenden nicht versionierten Typ-Aliase:
BaseEstimator, Alias fürBaseEstimatorV1BaseSampler, Alias fürBaseSamplerV1
Diese Entfernung betrifft NICHT die explizit versionierten abstrakten Schnittstellendefinitionen
BaseEstimatorV1undBaseSamplerV1oder die zugehörigen Ergebnis- und Auftragsklassen, die aus Gründen der Abwärtskompatibilität beibehalten wurden. Wenn Sie einen nicht versionierten V1-type -Alias wieBaseEstimatorverwenden, können Sie ihn direkt durch den versionierten Typ ersetzen (BaseEstimatorV1).Außerdem wurden die folgenden Hilfsfunktionen entfernt. Diese Funktionen wurden nur in Primitive V1 Implementierungen verwendet:
init_circuit: Um eine Schaltung von a zu initialisierenStatevectorzu initialisieren, verwenden SieQuantumCircuit.initialize()stattdessen.init_observable: Verwenden Sie stattdessen den Konstruktor vonSparsePauliOpstattdessen.final_measurement_mapping: Verwenden SieQuantumCircuit.layout()undSparsePauliOp.apply_layout()um einen Operator für ein Layout anzupassen. Andernfalls verwenden Siemthree.utils.final_measurement_mapping. Siehe Mthree Utility Funktionen für weitere Details.
Hinweise zum Upgrade für Anbieter
-
Die Methode
configurationvonBasicSimulatorwurde entfernt, nachdem sie in Qiskit v1.3 veraltet ist. Diese Methode gibt eineBackendConfiguration-Instanz zurück, eine Klasse, die Teil des eingestelltenBackendV1-Workflows war und auch in Qiskit v2.0.0 entfernt wird. Die einzelnen Konfigurationselemente können nun direkt aus dem Backend oder aus der enthaltenenTargetinstanz (backend.target). -
Die Methode
run_experimentvonBasicSimulatorwurde entfernt. Diese Methode nahm eine Instanz der KlasseQasmQobjExperimentals Eingabeargument, eine Klasse, die seit Qiskit v1.2 veraltet ist und mit dem WorkflowQobjin Qiskit v2.0.0 entfernt wurde. -
Das Modell
BackendV1wurde entfernt, nachdem es in Qiskit 1.2.0 veraltet ist. Dazu gehören die KlasseBackendV1sowie die zugehörigen Module und Hilfsprogramme, da sie durch dasBackendV2modell ersetzt wurden. Die Liste der entfernten Gegenstände umfasst:-
BackendV1klasse: der Kern des entfernten Modells -
Alle Elemente in
qiskit/providers/models, da sie zur Darstellung von Komponenten des ModellsBackendV1verwendet wurden:BackendConfigurationBackendPropertiesBackendStatusQasmBackendConfigurationPulseBackendConfigurationUchannelLOGateConfigPulseDefaultsPulseQobjDefCommandGatePropertiesNduvJobStatus: Diese Klasse wurde durch die weiter verbreitete KlasseJobStatusPulseDefaults
-
BackendV2Converterklasse: für die Konvertierung vonBackendV1inBackendV2 -
convert_to_targetfunktion: zum Aufbau einerTargetinstanz aus altenBackendV1Komponenten (wieBackendConfigurationoderBackendProperties) -
BackendPropertyErrorundBackendConfigurationError: Ausnahmen in Verbindung mit entfernten Klassen
-
-
Das
BasicSimulatorbackend kann den klassischen Kontrollfluss nicht mehr simulieren. Es unterstützte nur die Verwendung von.c_if()/.conditionzur Modellierung des Kontrollflusses, aber diese Konstruktion wurde nun aus dem Qiskit-Datenmodell entfernt. -
Alle gefälschten Backend-Klassen, die auf dem veralteten
BackendV1basieren, wurden aus demproviders.fake_providermodul entfernt. Diese Klassen sind seit Qiskit 1.2 veraltet und waren Teil des veraltetenBackendV1Workflows. Ihre Verwendung in Tests wurde ersetzt durch dieGenericBackendV2klasse ersetzt, die es erlaubt, eigene Instanzen vonBackendV2zu erstellen, die eine simulierteBackendV2.run(). Die Entfernung betrifft:-
Basisklassen:
FakeBackendFakePulseBackendFakeQasmBackend
-
Fake-Backends für spezielle Testzwecke:
Fake1QFakeOpenPulse2QFakeOpenPulse3Q
-
Ältere gefälschte Backends:
Fake5QV1Fake20QV1Fake7QPulseV1Fake27QPulseV1Fake127QPulseV1
-
-
Als Teil der Impulsentfernung in Qiskit v2.0.0 wurden die folgenden Methoden entfernt:
qiskit.providers.BackendV2.instruction_schedule_mapqiskit.providers.BackendV2.drive_channelqiskit.providers.BackendV2.measure_channelqiskit.providers.BackendV2.acquire_channelqiskit.providers.BackendV2.control_channel
-
Im Rahmen der Entfernung von Impulsen in Qiskit v2.0.0 wurde die Unterstützung von Impulsen entfernt aus
GenericBackendV2. Dazu gehört die Möglichkeit, das Backend mit benutzerdefinierten Kalibrierungen (calibrate_instructionsArgument) und Impulskanalattributen (drive_channel,measure_channel,acquire_channel,control_channel) zu initialisieren. -
Die abstrakten Basisklassen
ProviderundProviderV1, die seit Qiskit v1.1.0 veraltet sind, wurden entfernt. Die von diesen Schnittstellendefinitionen gebotene Abstraktion bot keinen nennenswerten Wert, da sie lediglich die Attributename,backendsund eine Methodeget_backend()umfasste.Ein Provider als Konzept wird weiterhin als eine Sammlung von Backends existieren. Wenn Sie derzeit einen Anbieter implementieren, können Sie Ihren Code anpassen, indem Sie einfach
ProviderV1als übergeordnete Klasse Ihrer Implementierung entfernen.Als Teil dieser Änderung werden Sie wahrscheinlich eine Implementierung von
get_backendaus Gründen der Abwärtskompatibilität hinzufügen wollen. Zum Beispiel:def get_backend(self, name=None, **kwargs): backend = self.backends(name, **kwargs) if len(backends) > 1: raise QiskitBackendNotFoundError("More than one backend matches the criteria") if not backends: raise QiskitBackendNotFoundError("No backend matches the criteria") return backends[0]
QPY-Upgrade-Hinweise
-
Die Funktion
qpy.load()funktion kann nun eineMissingOptionalLibraryAusnahme auslösen, wenn eine QPY v10, v11 oder v12 Nutzlast übergeben wird, diesymenginesymbolische Ausdrücke verwendet undsymenginenicht installiert ist. Die Ausnahme wird auch dann ausgelöst, wennsympynicht für eine andere QPY-Nutzlast vor v13 installiert ist. In den Qiskit v1.x Versionen wurdensymengineundsympyimmer garantiert installiert. Ab v2.x ist dies jedoch nicht mehr zwingend erforderlich und wird nur noch benötigt, wenn Sie eine QPY-Datei deserialisieren, die mitsymengineerzeugt wurde. Das Parsen dieser QPY-Nutzdaten erfordertsymengine, da seine Verwendung Teil der Formatspezifikation für QPY v10, v11 und v12 ist. Wenn die Nutzlast dies erfordert, ist die Installation einer kompatiblen Version vonsymengine(0.11.0oder0.13.0) die einzige Möglichkeit. In ähnlicher Weise wurdesympyfür dieParameterExpressionkodierung für alle QPY-Versionen 1 - 12 verwendet. -
Die Mindestversion der QPY-Kompatibilität,
QPY_COMPATIBILITY_VERSIONwurde von 10 (die Anforderung von v1.x ) auf 13 angehoben. Diese Version bestimmt die Mindestversion von QPY, die von derqpy.dump()funktion ausgegeben wird. Das bedeutet, dassqpy.dump()in dieser Version nur QPY v13 und v14 ausgeben kann. QPY v13 ist weiterhin kompatibel zu Qiskit v1.3.x und v1.4.x, d.h. Nutzdaten, die in Qiskit v2.x mit QPY v13 erzeugt wurden, können auch mit der Qiskit v1.x Release-Serie geladen werden.Diese Änderung war notwendig, weil die QPY Versionen 10 -12 entweder die
sympyoder diesymengineBibliothek benötigen, um eine Serialisierung fürParameterExpressionobjekte zu erzeugen, aber in Qiskit 2.x ist keine der beiden Bibliotheken für dasParameterExpressionobjekt. -
Mit der Entfernung von pulse in Qiskit v2.0.0 wurde die Unterstützung für die Serialisierung von
ScheduleBlockProgrammen durch dieqiskit.qpy.dump()funktion entfernt worden. Benutzer können weiterhin Nutzdaten mit Impulsgattern laden, indem sie die Funktionqiskit.qpy.load()funktion laden, allerdings werden sie als undurchsichtige benutzerdefinierte Anweisungen behandelt. Das Laden vonScheduleBlockPayloads wird nicht mehr unterstützt und führt zu einerQpyErrorausnahme.
Hinweise zum Upgrade der Synthese
-
Das
atomic_evolutionaufrufbare Argument vonProductFormula(und seinen UnterklassenQDrift,LieTrotter, undSuzukiTrotter) hat eine neue Funktionssignatur. Die alte Signatur würde einen Pauli-Operator und einen Zeitkoeffizienten nehmen und den Evolutionskreis zurückgeben:def atomic_evolution(pauli_op: SparsePauliOp, time: float) -> QuantumCircuit: evol_circuit = QuantumCircuit(pauli_op.num_qubits) # append operators to circuit return evol_circuitDie neue Signatur nimmt direkt einen bestehenden Schaltkreis auf und sollte die Entwicklung des gegebenen Pauli und der gegebenen Zeit an diesen Schaltkreis anhängen:
def atomic_evolution(evol_circuit: QuantumCircuit, pauli_op: SparsePauliOp, time: float): # append operators to circuit, in-place modificationDiese neue Implementierung zeichnet sich durch eine deutlich bessere Leistung aus.
Hinweise zum Transpiler-Upgrade
-
Der Mindestschwellenwert, ab dem Gatter als identisch gelten, wurde erhöht
RemoveIdentityEquivalentvon Maschinen-Epsilon auf1e-12angehoben, um Rundungsfehler bei der Treueberechnung zu berücksichtigen und um die Konsistenz mit den anderen Klassen, wieCommutationAnalysisundTwoQubitWeylDecomposition. -
Der Routing-Plugin-Bühnenname
defaultist nun für das gleichnamige, in Qiskit integrierte Plugin reserviert. -
Die Standard-Routing-Plugin-Stufe ist jetzt
"default". In Qiskit v2.0.0 ist dies einfach ein Alias für die bisherige Voreinstellung"sabre". Der zugrundeliegende Standardalgorithmus kann sich im Laufe der Qiskit v2.x Versionsreihe für einige oder alle Ziele ändern, aber Sie können jederzeit explizitrouting_method="sabre"setzen, um das aktuelle Verhalten beizubehalten. -
Der Stage-Name des Übersetzungs-Plugins
defaultist jetzt für das gleichnamige integrierte Qiskit-Plugin reserviert. -
Die Standardstufe des Übersetzungs-Plugins ist jetzt
"default". In Qiskit 2.0 ist dies einfach ein Alias für die bisherige Voreinstellung"translator". Der zugrundeliegende Standardalgorithmus kann sich im Laufe der Qiskit 2.x Serie für einige oder alle Ziele ändern, aber Sie können jederzeittranslation_method="translator"explizit einstellen, um das aktuelle Verhalten beizubehalten. -
Die alten Zeitplanungsläufe
ASAPSchedule,ALAPSchedule,DynamicalDecouplingundAlignMeasureswurden zugunsten der aktualisierten AlternativenALAPScheduleAnalysis,ASAPScheduleAnalysis,PadDynamicalDecoupling, undConstrainedRescheduleentfernt. Diese wurden in Qiskit v1.1 veraltet, nachdem der neue Planungsworkflow den alten abgelöst hatte. -
Für den Fall, dass weder eine
targetnoch ein Satz vonbasis_gatesspezifiziert sind, synthetisiert derHighLevelSynthesistranspiler-Durchgang Schaltungen mit annotierten Operationen mit weniger Schichten von Wrappings als zuvor synthetisiert (dies geschieht zum Beispiel für die Schaltung, die vonmultiplier_cumulative_h18()). -
Das Schlüsselwortargument
property_setist jetzt reserviert inBasePassManager.run()reserviert und kann nicht alskwargverwendet werden, das an die Konvertierung der Unterklasse von der Front-End-Darstellung in die interne Darstellung weitergegeben wird. -
Die folgenden veralteten Verwendungen des
BackendProperties-Objekts in der Transpilierungspipeline wurden in Qiskit entfernt 2.0:backend_propertieseingabeargument intranspile()backend_propertieseingabeargument inPassManagerConfigbackend_propertieseingabeargument ingenerate_preset_pass_manager()backend_propertieseingabeargument ingenerate_routing_passmanager()backend_propertieseingabeargument ingenerate_translation_passmanager()backend_propertieseingabeargumentTarget.from_configuration()
Die folgenden Durchgänge wurden ebenfalls aktualisiert und akzeptieren nun nur noch eine
targetanstelle von:backend_propeingabeargument inDenseLayoutpropertieseingabeargument inVF2Layoutpropertiesundcoupling_mapEingabeargumente inVF2PostLayoutbackend_propseingabeargument inUnitarySynthesis
Die Klasse
BackendPropertiesist seit Qiskit v1.2 veraltet, da sie Teil desBackendV1Workflows war. Spezifische Anweisungseigenschaften, wie z.B. Gatterfehler oder Dauern, können einerTargetbei der Konstruktion durch dieTarget.add_instruction()methode hinzugefügt und über das Eingangsargumenttargetan die entsprechenden Transpilerdurchläufe weitergegeben werden. -
Als Folge der Abschaffung des Modells
BackendV1wurden die akzeptierten Eingabetypen der folgenden Transpiler-Objekte aktualisiert:- Die
generate_preset_pass_manager()undtranspile()funktionen akzeptieren keine Eingaben des TypsBackendV1mehr in ihrembackend-Eingangsargument. - Die Methode
Target.from_configuration()methode akzeptiert nicht mehr das Argumentbackend_properties - Die Methode
Target.target_to_backend_properties()wurde entfernt
- Die
-
Der
ResetAfterMeasureSimplificationtranspiler-Pass verwendet nun einIfElseOpzur Bedingung der Ausführung desXGateanstatt einconditionAttribut für das Gatter zu setzen. Der Grund dafür ist, dass das Attributconditionaus dem Qiskit-Datenmodell entfernt wurde. -
Der veraltete
ConvertConditionsToIfOpstranspiler pass wurde entfernt. Das zugrunde liegendeconditionAttribut vonInstructionklasse wurde entfernt, so dass dieser Transpiler-Durchgang nichts mehr zu konvertieren hatte. Stattdessen sollten Sie direktIfElseOpverwenden, um die Ausführung einer Operation klassisch zu konditionieren. -
Die
PadDelayundPadDynamicalDecouplingbenötigen nun ein neues Argument, wenn sie konstruiert werden. Entwedertargetoderdurationsmüssen mit einemTargetoderInstructionDurationsangegeben werden. Ohne diese können die Pässe die Dauer der Anweisungen in der Schaltung nicht bestimmen und machen Fehler. Zuvor wurden diese Werte aus dem nun entfernten AttributdurationvonInstructionobjekten. -
Der zuvor veraltete
AlignMeasuresTranspiler-Pass wurde entfernt. Dieser Pass wurde in Qiskit v1.1.0 veraltet. Stattdessen sollte derConstrainedReschedulepass verwendet werden.ConstrainedRescheduleerfüllt dieselbe Funktion und unterstützt darüber hinaus die Ausrichtung an zusätzlichen Zeitbeschränkungen. -
Bei der Terminierung mit
generate_preset_pass_manager()odertranspile()das Argumentinstruction_durationsangegeben wird, werden die Dauern alslistformatiert und in Einheiten vondtangegeben. Sie müssen auch das Eingangsargumentdtder Transpilationsfunktion setzen. -
Das veraltete Attribut " DAGNode.sort_key " wurde entfernt. Dieses Attribut wurde in der Qiskit v1.4.0 Version veraltet. Da die lexikographische topologische Sortierung intern in Rust durchgeführt wird und das Attribut sort key unbenutzt war, wurde dieses Attribut entfernt, um den Overhead bei der Erstellung von DAG-Knoten zu vermeiden. Wenn Sie sich auf den Sortierschlüssel verlassen haben, können Sie ihn von einem bestimmten Knoten aus reproduzieren, indem Sie etwas wie:
def get_sort_key(node: DAGNode): if isinstance(node, (DAGInNode, DAGOutNode)): return str(node.wire) return ",".join( f"{dag.find_bit(q).index:04d}" for q in itertools.chain(node.qargs, node.cargs) ) -
Die folgenden
transpile()undgenerate_preset_pass_manager()eingabeargumente, die seit Qiskit 1.3 veraltet sind, wurden aus der API entfernt:instruction_durationstiming_constraints
Darüber hinaus ist die Angabe von benutzerdefinierten Basisgattern über das Argument
basisgate vontranspile()undgenerate_preset_pass_manager(), das auch in Qiskit 1.3 veraltet ist, ist nicht mehr erlaubt, und einValueErrorwird in diesen Fällen ausgelöst.Die Informationen, die früher durch diese bereitgestellt wurden, können weiterhin über die Argumente
backendodertargetangegeben werden. Sie können eine Target-Instanz mit definierten Befehlsdauern erstellen:Target.from_configuration(..., instruction_durations=...)Für spezifische zeitliche Beschränkungen:
Target.from_configuration(..., timing_constraints=...)Und für benutzerdefinierte Basis-Gates können Sie diese manuell zum Ziel hinzufügen oder z. B.
.from_configurationmit einer benutzerdefinierten Namenszuordnung verwenden:from qiskit.circuit.library import XGate from qiskit.transpiler.target import Target basis_gates = ["my_x", "cx"] custom_name_mapping = {"my_x": XGate()} target = Target.from_configuration( basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping ) -
Die
transpile()undgenerate_preset_pass_manager()schnittstellen lösen nun eineUserWarningaus, wenn sie einecoupling_mapund/oderbasis_gateszusammen mit einerbackendbereitstellen. In diesen Fällen gibt es mehrere Wahrheitsquellen, die Absichten der Benutzer sind nicht immer klar, und es können Konflikte auftreten, diegenerate_preset_pass_manager()möglicherweise nicht wissen, wie sie zu lösen sind. Die vorgeschlagene Alternative besteht darin, ein benutzerdefiniertes Ziel zu definieren, das die gewählten Beschränkungen kombiniert.Eine dieser Situationen ist die Spezifikation eines Gatters mit 3 oder mehr Qubits in
backendoderbasis_gateszusammen mit einem kundenspezifischencoupling_map. Der Kopplungsplan liefert nicht die notwendigen Verbindungsdetails, um die Wirkung des Gatters bestimmen zu können. In diesen Fällen,transpile()undgenerate_preset_pass_manager()nun eineValueErrorauf. -
Im Rahmen der Entfernung von Impulsen in Qiskit 2.0 wurden alle impuls- und kalibrierungsbezogenen Funktionen im Transpiler entfernt.
Die folgenden Pässe und Funktionen wurden entfernt:
qiskit.transpiler.passes.PulseGatesbestandenqiskit.transpiler.passes.ValidatePulseGatesbestandenqiskit.transpiler.passes.RXCalibrationBuilderbestandenqiskit.transpiler.passes.RZXCalibrationBuilderbestandenqiskit.transpiler.passes.RZXCalibrationBuilderNoEchobestandenqiskit.transpiler.passes.EchoRZXWeylDecompositionbestandenqiskit.transpiler.passes.NoramlizeRXAnglebestandenqiskit.transpiler.passes.rzx_templates()Funktion
Das Argument
inst_mapwurde aus den folgenden Elementen entfernt:- Die
generate_preset_pass_manager()undtranspile()funktionen - Die
Target.from_configuration()methode - Der Konstruktor der
PassManagerConfigklasse
Die Kalibrierungsunterstützung wurde entfernt:
calibrationwurde aus demInstructionPropertieskonstruktor entfernt und ist nicht länger eine Eigenschaft dieser Klasse.- Die Methoden
has_calibration,get_calibration,instruction_schedule_mapundupdate_from_instruction_schedule_mapwurden aus der KlasseTargetklasse entfernt.
-
Der veraltete
StochasticSwapTranspiler-Pass und das damit verbundene integrierte Routing-Stage-Plugin "stochastic" wurden entfernt. Diese wurden in der Qiskit v1.3.0 Version als veraltet markiert. Der Pass wurde durch die KlasseSabreSwapklasse ersetzt, die stattdessen verwendet werden sollte, da sie eine bessere Leistung und Ausgabequalität bietet. Zum Beispiel, wenn der Pass zuvor über die Transpile-Funktion aufgerufen wurde, wie z.B.:from qiskit import transpile from qiskit.circuit import QuantumCircuit from qiskit.transpiler import CouplingMap from qiskit.providers.fake_provider import GenericBackendV2 qc = QuantumCircuit(4) qc.h(0) qc.cx(0, range(1, 4)) qc.measure_all() cmap = CouplingMap.from_heavy_hex(3) backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap) tqc = transpile( qc, routing_method="stochastic", layout_method="dense", seed_transpiler=12342, target=backend.target )sollte dies ersetzt werden durch:
tqc = transpile( qc, routing_method="sabre", layout_method="dense", seed_transpiler=12342, target=backend.target ) -
Der Pass
qiskit.transpiler.passes.CXCancellationwurde entfernt. Es wurde zugunsten von class:.InverseCancellation,, das allgemeiner ist, veraltet.CXCancellation()ist semantisch vollständig äquivalent zuInverseCancellation([CXGate()]). -
Der
SolovayKitaevtranspiler-Durchgang löst bei Schaltungen, die Ein-Qubit-Operationen ohne eineto_matrix-Methode (z. B. Measures, Barrieren und Kontrollflussoperationen) oder parametrisierte Ein-Qubit-Operationen enthalten, keine Ausnahme mehr aus, sondern lässt sie unverändert. -
Plugins für die Übersetzungsstufe der Preset Pass Manager müssen nun die
Targetgate-Direktionalität in ihrer Ausgabe beachten. Zuvor,transpile()undgenerate_preset_pass_manager()würde einePassManagerdie bei Bedarf Nachbesserungsarbeiten enthielt. Sie müssen diese nun in Ihre eigene benutzerdefinierte Stufe aufnehmen, wenn Ihre Stufe nicht garantiert, dass sie die Direktionalität beachtet.Sie können mit dem
GateDirectionpass verwenden, um dieselben Korrekturen vorzunehmen, die früher mit Qiskit durchgeführt wurden. Zum Beispiel:from qiskit.transpiler import PassManager from qiskit.transpiler.passes import GateDirection from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin class YourTranslationPlugin(PassManagerStagePlugin): def pass_manager(self, pass_manager_config, optimization_level): pm = PassManager([ # ... whatever your current setup is ... ]) # Add the two-qubit directionality-fixing pass. pm.append(GateDirection( pass_manager_config.coupling_map, pass_manager_config.target, )) return pm -
Die voreingestellten Pass-Manager füllen nicht mehr die implizite
pre_optimizationStufe ihrer AusgabeStagedPassManager. Sie können nun Ihr eigenesPassManagerdiesem Feld zuordnen. Bisher konnte man nur an die bestehendePassManager. -
Der Standardwert für das
generate_routing_passmanager()argumentseed_transpilerwurde vonNoneauf-1geändert. Diese Änderung wurde vorgenommen, weil dieses Flag nur zur Konfiguration desVF2PostLayouttranspiler-Durchgang verwendet wurde, und für diesen Durchgang verschlechtert die Randomisierung normalerweise die Leistung und ist nicht wünschenswert. Wenn Sie sich auf den vorherigen Standardwert verlassen haben, können Sie dieses Verhalten wiederherstellen, indem Sie das Argumentseed_transpiler=Noneexplizit setzen. Wenn Sie explizit einen Startwert für diesen Parameter festgelegt haben, ändert sich das Verhalten nicht.
Hinweise zum Upgrade der Visualisierung
-
Der Parameter
idle_wiresin allen Schaltkreisschubladen wurde um die neue Option"auto"erweitert, die nun das Standardverhalten darstellt. Wenn Sie dennoch Drähte ohne Anweisungen anzeigen möchten, setzen Sie explizitidle_wires=True.Bei der Einstellung
"auto"ist das Verhalten wie folgt:- Wenn der Stromkreis ein definiertes
.layout-Attribut hat, wirdidle_wiresautomatisch aufFalsegesetzt (Ausblenden von Leerlaufdrähten) - Andernfalls bleibt
idle_wiresTrue(zeigt alle Drähte an, wie es die vorherige Standardeinstellung war)
Das folgende Beispiel zeigt eine Schaltung ohne Layout, die mit
idle_wires="auto"angezeigt wird:qr_0: ──────── ┌───┐┌─┐ qr_1: ┤ H ├┤M├ └───┘└╥┘ cr_0: ══════╬═ ║ cr_1: ══════╩═Sobald ein Layout angewandt wird, setzt
idle_wires="auto"idle_wiresaufFalseund verbirgt die nicht genutzten Drähte:┌───┐┌─┐ qr_1 -> 1 ┤ H ├┤M├ └───┘└╥┘ cr_1: ══════╩═Wenn Sie alle Drähte eines Schaltkreises anzeigen möchten, stellen Sie
idle_wires=Trueexplizit ein:qr_0 -> 0 ──────── ┌───┐┌─┐ qr_1 -> 1 ┤ H ├┤M├ └───┘└╥┘ ancilla_0 -> 2 ──────╫─ ║ cr_0: ══════╬═ ║ cr_1: ══════╩═Da Quantencomputer auf mehr Qubits skalieren, können selbst kleine Schaltkreise nach der Transpilierung große Schaltkreisrepräsentationen erzeugen. Die Einstellung
"auto"hilft, die Lesbarkeit zu verbessern, indem unnötige Drähte nach Möglichkeit ausgeblendet werden. - Wenn der Stromkreis ein definiertes
-
Die
array_to_latex()funktion undOperator.draw()methode können nun eineMissingOptionalLibraryAusnahme auslösen, wenn diesympyBibliothek nicht installiert ist. In den Versionen von Qiskit v1.x wurdensymengineundsympyimmer garantiert installiert, aber ab v2.0.0 ist dies nicht mehr zwingend erforderlich. Die Visualisierung LaTeX für eine Matrix basiert auf der Bibliotheksympy. Wenn Sie diese Funktion verwenden, müssen Sie sicherstellen, dass Siesympyinstalliert haben. -
Infolge der Abschaffung des Modells
BackendV1wird dieplot_gate_map(),plot_error_map()undplot_circuit_layout()keine Eingaben des TypsBackendV1in ihrembackend-Eingangsargument mehr akzeptieren. -
Die Zeitleisten-Schublade erfordert nun, dass das Argument
targetbeim Aufruf angegeben wird. Da Anweisungen keine Dauerattribute mehr enthalten, ist dieses zusätzliche Argument erforderlich, um die Dauer für alle unterstützten Anweisungen anzugeben. Ohne dieses Argument hat die Zeitleistenschublade keinen Zugriff auf diese Informationen. -
Als Teil der Entfernung von Pulse in Qiskit 2.0 wurde die Unterstützung für das Zeichnen von Pulsen über
qiskit.visualization.pulse_drawerentfernt.
Versch. Anmerkungen zu Upgrades
-
Die
deprecate_functionunddeprecate_argumentsDekoratoren, die seit Qiskit v0.24 (Mai 2023) veraltet sind, wurden in Qiskit v2.0.0 entfernt. Die aktuelledeprecate_func()ersetzt@deprecate_functionund das aktuelledeprecate_arg()ersetzt@deprecate_arguments. -
Die Funktion
assembleund die zugehörigen Fähigkeiten (enthalten im Modulassembler) wurden aus der Codebasis entfernt, nachdem sie in Qiskit v1.2 veraltet sind.assemblewurde verwendet, um eineQobjim Rahmen des veraltetenBackendV1Workflows zu erstellen. Die Umwandlung ist nicht mehr notwendig, da die Transpilations- und Primitivpipeline Quantenschaltungen direkt verarbeitet, wodurch dieQobjüberflüssig wird.Der Umzug umfasst die folgenden öffentlichen API-Komponenten:
qiskit.compiler.assembleFunktionqiskit.assembler.assemble_circuitsFunktionqiskit.assembler.assemble_schedulesFunktionqiskit.assembler.disassembleFunktionqiskit.assembler.RunConfigclassqiskit.circuit.Instruction.assemble-Methode
-
Die Struktur
Qobjund die zugehörigen Klassen, die in Qiskit v1.2.0 veraltet sind, wurden entfernt. Sie wurden als Teil desBackendV1Workflows eingeführt und sind für die Interaktion mit Backends nicht mehr notwendigBackendV2backends. Diese Streichung betrifft die folgenden Klassen:QobjExperimentHeaderQobjHeaderQasmQobjQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmExperimentCalibrationsGateCalibrationPulseQobjPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItem
-
Die Klassen
MeasLevelundMeasReturnType, die zuvor inqobj/utils.pydefiniert waren, wurden nachresult/models.pymigriert, nachdem das Modulqobjentfernt wurde. Diese Klassen waren nicht Teil der öffentlichen API. Der Importpfad wurde aktualisiert von:from qiskit.qobj.utils import MeasLevel, MeasReturnTypezu:from qiskit.result import MeasLevel, MeasReturnType. -
Die Verwendung von Positionsargumenten im Konstruktor von
Resultwurde deaktiviert. Bitte setzen Sie alle Argumente in der kwarg-Syntax, d.h.:Result(backend_name="name", ....). Darüber hinaus wird das Argumentqobj_idnicht mehr bei der Konstruktion derResultinterna verwendet. Es ist immer noch möglich,qobj_idals generischen kwarg zu setzen, der dann im Metadatenfeld mit den anderen generischen kwargs landet. -
Als Teil der Impulsentfernung in Qiskit 2.0.0 wurden die Funktionen
sequenceundschedule_circuitausqiskit.schedulerzusammen mit der KlasseScheduleConfigentfernt. -
Das Modul
qiskit.result.mitigationwurde entfernt, nachdem es in Qiskit v1.3 nicht mehr empfohlen wird. Die Entfernung umfasst die KlassenLocalReadoutMitigatorundCorrelatedReadoutMitigatorsowie die zugehörigen Hilfsprogramme. Es gibt keinen alternativen Pfad in Qiskit, da dessen Funktionalität durch das Addon`mthreeersetzt wurde. <https://github.com/Qiskit/qiskit-addon-mthree> `__
Veraltete Schaltungen
-
Das abgelehnte
QuantumCircuit.durationattribut wurde nicht wie ursprünglich geplant in dieser Version entfernt. Sie wird stattdessen im Rahmen der Veröffentlichung von Qiskit v3.0.0 entfernt werden. Diese Funktionalität wurde durch die MethodeQuantumCircuit.estimate_duration()methode ersetzt, die stattdessen verwendet werden sollte. -
Die veraltete tupelartige Schnittstelle für
CircuitInstructionwurde in dieser Version nicht wie ursprünglich geplant entfernt. Sie wird stattdessen in Qiskit v3.0.0 entfernt. Verwenden Sie stattdessen dieoperation,qubits, undclbitsbenannte Attribute. -
Die Multiple-Control-Multiple-Target-Schaltkreisklasse
MCMTist nun veraltet und wurde ersetzt durchMCMTGateersetzt, die eine eigeneGateunterklasse ist. Die Verwendung eines Gatters anstelle einer Schaltung ermöglicht es dem Compiler, das Objekt auf einer höheren Abstraktionsebene zu betrachten, und erlaubt die Anwendung mehrerer Synthese-Plugins.
Transpiler-Veraltungen
-
Das abgelehnte
DAGCircuit.durationattribut wurde nicht wie ursprünglich geplant in dieser Version entfernt. Sie wird stattdessen im Rahmen der Veröffentlichung von Qiskit v3.0.0 entfernt werden. Diese Funktionalität wurde durch die MethodeQuantumCircuit.estimate_duration()methode ersetzt, die stattdessen verwendet werden sollte. -
Das Argument
propagate_conditionvonDAGCircuit.substitute_node()undDAGCircuit.substitute_node_with_dag()wurde veraltet. Mit der Entfernung vonInstruction.conditionaus dem Qiskit-Datenmodell hat diese Option keinen Sinn mehr. Wenn sie gesetzt ist, hat sie keine Wirkung mehr. Es wird nicht aus der Signatur entfernt, um die Kompatibilität während der Migration von Qiskit 1.x -> 2.0 zu erhalten. Diese Option wird in Qiskit 3.0 entfernt werden. -
Die Funktion
generate_pre_op_passmanager()ist veraltet. Sie wird in den Qiskit-Pass-Managern nicht mehr verwendet, und ihr Zweck ist nicht mehr gegeben. Ursprünglich diente sie als Korrekturstufe für Übersetzungs-Plugins, die die ISA-Direktionalität nicht berücksichtigten. Die Übersetzungsstufen müssen nun die Richtungsabhängigkeit beachten, so dass diese Funktion nicht benötigt wird und höchstwahrscheinlich auch nicht ersetzt werden muss.
Sicherheitsprobleme
- Es wurde eine Sicherheitslücke in
qpy.load()beim Laden von Payloads, diesympyzur Serialisierung vonParameterExpressionobjekte und andere symbolische Ausdrücke. Dazu gehören potenziell alle QPY-Nutzdaten, die die QPY-Version < 10 und optional 10, 11 und 12 verwenden, je nach der im Serialisierungsschritt verwendeten symbolischen Kodierung (qpy.dump()).
Fehlerkorrekturen
-
Es wurde eine Inkonsistenz im Transpilationsprozess bei der Behandlung von Gattern mit enger Identität behoben, bei der diese Gatter so ausgewertet wurden, dass sie mit allem durch
CommutationAnalysisausgewertet, aber nicht durchRemoveIdentityEquivalent. Das zugrunde liegende Problem wurde verursacht durchRemoveIdentityEquivalentundCommutationAnalysis(und im weiteren Sinne,CommutativeInverseCancellation) unterschiedliche Metriken verwendet. Beide verwenden nun die durchschnittliche Gattertreue und denselben Schwellenwert, um zu beurteilen, ob ein Gatter als identisch zu behandeln ist (z. B. ein Drehgatter mit sehr kleinem Winkel). Weitere Informationen finden Sie in den Docstrings dieser Klassen. Behoben #13547. -
Ein Fehler wurde behoben in
QuantumCircuit.assign_parameters()behoben, der bei der Zuweisung von Parametern an Standardgatter auftrat, deren Definition bereits ausgelöst worden war. In diesem Fall wurden die neuen Werte nicht ordnungsgemäß an die Gate-Instanzen weitergegeben. Während die Schaltung selbst noch wie erwartet kompiliert wurde, wurde bei der Überprüfung der einzelnen Operationen immer noch der alte Parameter angezeigt.Zum Beispiel:
from qiskit.circuit.library import EfficientSU2 circuit = EfficientSU2(2, flatten=True) circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True) print(circuit.data[0].operation.params) # would print θ[0] instead of 1.25Behoben #13478.
-
Es wurde ein Fehler in
DAGCircuitder dazu führte, dass AusgabeVarknoten währenddeepcopyund Pickling zu Eingabeknoten wurden. -
Es wurde ein Versehen in der Klasse
Targetklasse, bei dem das Setzen eines neuen Wertes für das Attributdtund der anschließende Aufruf vontarget.durations()nicht den aktualisierten Wertdtim zurückgegebenenInstructionDurationsobjekt angezeigt wurde. Dies wird nun durch eine Invalidierung des internen Zielinstruktionsdauern-Caches imdtSetter behoben. -
Es wurde ein Problem im
BasisTranslatortranspilerdurchgang, bei dem die globale Phase der DAG nicht korrekt aktualisiert wurde. Behoben #14074. -
Behebung eines Fehlers im
HighLevelSynthesistranspiler-Durchgang behoben, bei dem jede Anweisung synthetisiert wurde, für die ein Synthese-Plugin verfügbar ist, unabhängig davon, ob die Anweisung bereits vom Target unterstützt wird oder Teil des explizit übergebenenbasis_gatesist. Dieses Verhalten ist nun korrigiert, so dass solche bereits unterstützten Anweisungen nicht mehr synthetisiert werden. -
Der
InverseCancellationtranspilationsdurchlauf läuft jetzt innerhalb von Kontrollflussblöcken. Zuvor wurden Gatterpaare ignoriert, die aufgehoben werden konnten, wenn sie innerhalb klassischer Blöcke definiert waren. Siehe #13437 für weitere Einzelheiten. -
Fehler bei mehrfach gesteuerten Drehungen behoben, bei denen der Drehwinkel ein
ParameterExpression. Der Versuch der Synthese würde in diesem Fall zu einem Fehler führen, der besagt, dass das Gatter nicht mit einem ungebundenen Parameter synthetisiert werden kann. Dieser Fehler betraf Multi-kontrollierte RotationsschaltungsmethodenQuantumCircuit.mcrx(), :meth:.QuantumCircuit.mcry, undQuantumCircuit.mcrz()sowie beim Aufruf vonRXGate.control(),RYGate.control(), oderRZGate.control()wenn der Drehwinkel einParameterExpression. Jetzt können diese mehrfach gesteuerten Rotationskreise synthetisiert werden, ohne einen Fehler zu verursachen. -
Es wurde ein Fehler in QPY (
qiskit.qpy), bei dem Schaltungen mit Gattern der KlasseMCMTGateenthalten, nicht serialisiert werden konnten. Siehe #13965. -
Ein Fehler wurde behoben, der dazu führte, dass
Statevector.expectation_value()zu falschen Ergebnissen für den Identitätsoperator führte, wenn der Zustandsvektor nicht normalisiert war. Behoben #13029 -
Die Umwandlung einer Quantenschaltung in ein Gatter mit
converters.circuit_to_instruction()schlägt nun ordnungsgemäß fehl, wenn die gegebene Schaltung Kontrollflussanweisungen enthält. -
Aufrufen einer
AnalysisPassoder einerTransformationPasswie eine Funktion aufruft (wie inpass_ = MyPass(); pass_(qc)), werden nun alle Anforderungen berücksichtigt, die der Durchgang haben könnte. Zum Beispiel erfordern Zeitplanungsdurchläufe wieALAPScheduleAnalysiserfordern, dassTimeUnitConversionvor ihnen ausgeführt wird. Die Ausführung des Passes mit Hilfe einesPassManagerwurde diese Anforderung immer erfüllt, aber bisher wurde sie nicht erfüllt, wenn die Übergabe direkt aufgerufen wurde. -
Wenn eine
TranspilerErrorunterklasse durch eine Übergabe innerhalb eines Aufrufs vonPassManger.run()ausgelöst wird, wird die Ausnahme nun verlustfrei weitergegeben, anstatt eine verkettete Ausnahme mit einem gelöschten Typ zu werden. -
SabreSwapkeine ungenutzten Qubit-Drähte mehr während des Routings aus Kontrollflussblöcken herausziehen. Dies war im Allgemeinen eine sinnvolle Optimierung, aber keine erwartete Nebenwirkung eines Routing-Durchlaufs. Sie können nun mit demContractIdleWiresInControlFlowpass verwenden, um diese Kontraktion durchzuführen. -
Ein prozessbasierter Nicht-Determinismus in
SparsePauliOp.to_matrixwurde behoben. Die genaue Reihenfolge der Fließkomma-Operationen in der Summierung variierte bisher je nach Prozess, ist nun aber bei verschiedenen Aufrufen desselben Skripts identisch. Siehe #13413.