Skip to main content
IBM Quantum Platform

Qiskit SDK 2.3 Versionshinweise


2.3.1

Vorspiel

Qiskit v2.3.1 behebt mehrere Fehler, die seit der Veröffentlichung von Qiskit v2.3.0 festgestellt wurden.

Fehlerkorrekturen

  • Das integrierte permutation.kms Synthese-Plugin in qiskit.synthesis behandelt nun Permutationen der Länge Null korrekt. Problem Nr. 15550 behoben.

  • Festgelegt synth_clifford_depth_lnn() für Clifford-Operatoren auf einem einzelnen Qubit. Siehe Nr. 15780.

  • Es wurde ein Fehler im HighLevelSynthesis Transpiler-Durchlauf behoben, bei dem die Qubit-Zustände nach der rekursiven Synthese einer Operation nicht korrekt aktualisiert wurden. In bestimmten Fällen könnte dies dazu führen, dass der Durchlauf fehlerhafte Schaltkreise erzeugt.

  • Es wurde ein Problem in der qs_decomposition() Funktion behoben, bei dem mögliche Toleranzprobleme in den internen Routinen für lineare Algebra zu einer Panik führten, wodurch das Programm abstürzte. Dies wurde behoben, sodass in solchen Situationen stattdessen eine entsprechende Ausnahme QiskitError oder Unterklasse ausgelöst wird.

    Problem Nr. 15610 behoben.

  • Die Standardsynthese von UnitaryGate beim Zugriff UnitaryGate.definition und Aufruf UnitaryGate.control() für Gatter, an denen mehr als zwei Qubits beteiligt sind, stützt sich intern auf die qs_decomposition() Funktion. In manchen Fällen kann die Berechnung aufgrund der zugrunde liegenden Gleitkomma-Toleranz, die bei den linearen Algebra-Routinen der iterativen Quantum-Shannon-Zerlegung zum Tragen kommt, unter Umständen nicht immer erfolgreich sein. Um zu verhindern, dass diese Attribute oder Methoden fehlschlagen, wird in solchen Situationen stattdessen Isometry die Zerlegung aus verwendet. Dies führt zwar zu einer weniger effizienten Zerlegung, qs_decomposition() dient jedoch als Ausweichlösung, falls qs_decomposition() fehlschlägt.

  • Es wurde ein Fehler behoben, ParameterExpression.sympify() bei dem bei asymmetrischen arithmetischen Operationen (wie ** oder -) die Operanden bei bestimmten Kombinationen von Parameter, ParameterExpression und numerischen Werten vertauscht werden konnten. Siehe #15642.

  • Behebung eines Problems qk_obs_term() beim Zugriff auf einen identitätsbeobachtbaren Term. Siehe Nr. 15536.

  • Es wurde ein Darstellungsfehler behoben, plot_state_qsphere() bei dem symmetrische verschränkte Zustände (wie beispielsweise Bell-Zustände) aufgrund von Gleitkomma-Rauschen willkürlich gedreht wurden.

  • Gilt QuantumCircuit.repeat() für Schaltungen mit parametrisierten Gatterelementen.

    Siehe #15645.

  • Behebt einen Fehler, der dazu qpy.load() führte, dass bei Schaltkreisen, die mit erstellt QuantumCircuit.ensure_physical() wurden, abstürzte, wenn ein benutzerdefiniertes Register namens „ancilla“ vorhanden war.

  • Es BreakLoopOp wurde ein Fehler behoben, durch ContinueLoopOp den in bestimmten Transpiler-Durchläufen fälschlicherweise als Kontrollflussoperationen interpretiert wurden, was sich in der AttributeError Auslösung eines äußern konnte. Siehe Nr. 15579.

  • Behebt einen Fehler, der dazu qpy.load() führte, dass bei Schaltkreisen, die mit erstellt SabreLayout wurden, abstürzte, wenn ein benutzerdefiniertes Register namens „ancilla“ vorhanden war.

  • Die erforderliche Mindestversion von „ NumPy “ wird nun korrekt als „ 1.21 “ (anstelle von „ 1.17 “) angegeben. Diese Einschränkung besteht bereits seit mehreren Versionen aufgrund der Verwendung von numpy.typing.NDArray, das in NumPy 1.21 eingeführt wurde, sodass Qiskit bei älteren Versionen von NumPy nicht importiert werden kann.

  • Der Exporter „ OpenQASM “ 3 (qasm3.dumps() und dump()) setzt nun Unicode-Zeichen, die als „Zahlen“ gelten, aber keine ASCII-Ziffern sind, korrekt in Escape-Zeichen um, wenn sie in Bezeichnern verwendet werden. Bisher blieben Zeichen wie hochgestellte Zeichen in der Ausgabe erhalten, was in „ OpenQASM “ 3 nicht zulässig ist.

  • Der Exporter für „ OpenQASM “ 3 (qasm3.dumps() und dump()) führt nun die korrekte Escape-Verarbeitung für Bezeichner durch, deren Name mit einer ASCII-Ziffer beginnt.

  • Die Methoden SparsePauliOp.from_list() und leiten SparsePauliOp.from_sparse_list() nun automatisch den Datentyp des Koeffizienten ab, wenn das dtype Argument nicht angegeben wird.

    Zum Beispiel:

    from qiskit.quantum_info import SparsePauliOp
    from qiskit.circuit import Parameter
    
    theta = Parameter("theta")
    
    # Previously required manually setting dtype=object
    op_list = SparsePauliOp.from_list([("X", theta)])
    op_sparse = SparsePauliOp.from_sparse_list([("X", [0], theta)], num_qubits=1)

2.3.0

Vorspiel

Qiskit v2.3.0 ist eine neue Funktion der Qiskit SDK.

Diese neue Version erweitert die C-API für die Transpilation erheblich, sodass mehr Funktionen Target von (QkTarget) aus C heraus abgefragt werden können und die Erstellung sowie Bearbeitung von DAGCircuit (QkDag) ermöglicht wird. Dadurch ist es möglich, beim Kompilieren gegen das eigenständige libqiskit Objekt benutzerdefinierte Transpiler-Durchläufe zu schreiben. Die C-API enthält einzelne Funktionen für die Transpilierstufe (zum Beispiel ) qk_transpile_stage_layout(), um das Einfügen benutzerdefinierter Logik in die Transpilation zu vereinfachen, ohne die gesamte Pipeline manuell neu erstellen zu müssen.

Auch die Leistung und der Funktionsumfang der Transpilation auf frühzeitige fehlertolerante Ziele wurden verbessert. Mit der neuen PauliProductMeasurement Anweisung, die eine projektive Abbildung auf eine Pauli-Produktbasis darstellt, unterstützt Qiskit nun die Transpilation von Schaltkreisen in eine Pauli-basierte Rechenbasis mithilfe des bestehenden LitinskiTransformation Passes vollständig. Die neue einheitliche Synthesemethode, RossSelingerSynthesis die im Transpiler über eingestellt unitary_synthesis_method="gridsynth"werden kann, ermöglicht die Verwendung des asymptotisch optimalen Ross-Selinger-Algorithmus für die Clifford+T-Synthese einzelner Qubits. Zu den weiteren Verbesserungen gehört beispielsweise ein besserer OptimizeCliffordT Pass oder der CommutativeOptimization Pass, der kommutative Optimierungen von Pauli-basierten Schaltkreisen berücksichtigt.

Intern wurde die Darstellung von ControlFlowOp Objekten auf eine Rust-native Darstellung umgestellt. Diese Umstellung ist noch nicht abgeschlossen; es kann zu Leistungseinbußen bei der Qiskit- 2.3, insbesondere bei Operationen zur Steuerung des Programmablaufs, kommen. Spätere Versionen von Qiskit dürften dies noch weiter vorantreiben und langjährige Bedenken hinsichtlich der Leistung und der API im Zusammenhang mit Kontrollflussoperationen ausräumen.

Beachten Sie, dass ab dieser Version Python 3.9 aufgrund des Ablaufs der Lebensdauer im Oktober 2025 nicht mehr unterstützt wird und macOS auf Intel-Prozessoren aufgrund der Einstellung der Plattform durch Apple auf Tier-2-Plattformunterstützung herabgestuft wurde. Alle Versionen von CPython ab 3.10 werden unterstützt. Die aktuellen Supportstufen für verschiedene Plattformen finden Sie unter Betriebssystemunterstützung.

Es wird weitere Feature-Releases von Qiskit in der Reihe „ 2.x “ geben. Wir gehen davon aus, dass Qiskit 3.0 erst viel später im Jahr 2026 veröffentlicht wird, da derzeit keine grundlegenden Änderungen erforderlich sind.

C-API-Funktionen

Schaltkreise Funktionen

  • Es wurde eine neue Anweisungsklasse hinzugefügt, PauliProductMeasurement die eine gemeinsame projektive Messung an mehreren Qubits darstellt, wobei die gemessene Observable ein Tensorprodukt von Pauli-Operatoren ist. Das Ergebnis dieser Messung ist ein einzelner Eigenwert, entweder +1+1 oder −1-1, der den Eigenzustand des Pauli-Produkts angibt.

    Weitere Hintergrundinformationen finden Sie in „A Game of Surface Codes: Large-Scale Quantum Computing with Lattice Surgery“ von Daniel Litinski.

    Ein PauliProductMeasurement kann aus einem instanziiert Pauli werden, wobei der Pauli-Vektor eine Phase von −1-1 enthalten darf, jedoch nicht von ii oder −i-i. Die Anweisung hat dieselbe Anzahl an Qubits wie der Pauli-Vektor sowie ein einzelnes klassisches Bit.

    Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.quantum_info import Pauli
    from qiskit.circuit.library import PauliProductMeasurement
    
    ppm = PauliProductMeasurement(Pauli("XZ"))
    
    qc = QuantumCircuit(6, 2)
    qc.append(ppm, [4, 1], [1])
  • Eine neue QuantumCircuit.to_dag() Methode bietet nun eine praktische Hülle um circuit_to_dag().

  • ParameterExpression verfügt nun über ein num_parameters Attribut, dessen Wert der Länge seiner parameters Menge entspricht, das jedoch mit geringerem Rechenaufwand berechnet wird.

OpenQASM Funktionen

  • Der Exporter „ OpenQASMqasm2.dumps()2“ unterstützt nun die Ausgabe einfacher IfElseOp Ein-Befehls-Blöcke, sofern es sich bei der Bedingung um einen einfachen Gleichheitstest zwischen Register und Ganzzahl handelt. Dies entspricht dem, was die Sprache „ OpenQASM s 2“ darstellen kann.

QPY-Funktionen

  • Version 17 von QPY enthält nun Serialisierungsformate für SparseObservable Objekte, die als Parameter von Objekten verwendet werden. Dies ermöglicht insbesondere die Serialisierung PauliEvolutionGate von Objekten, die diesen Operator intern verwenden, und die Nutzdaten des Evolution-Gates werden aktualisiert.

Quanteninformationsmerkmale

  • Als Spiegel Statevector.from_circuit() von Operator.from_circuit()… hinzugefügt. Dadurch lässt sich ein Statevector direkt im Raum der virtuellen Qubits instanziieren, selbst bei Schaltkreisen, die in einen physikalischen Qubit-Raum transpiliert wurden.

  • Die Leistung von Clifford.dot() und von wurde verbessert Clifford.compose() , wenn sie mit front=True und einem aufgerufen werden, das ausschließlich QuantumCircuit Clifford-Gatter enthält. Bisher wurde der Schaltkreis zunächst vollständig in ein Clifford Objekt integriert, und erst danach wurden die beiden Objekte miteinander kombiniert. Nun wird die Clifford Basis iterativ aktualisiert, was bei kleinen Schaltungen deutlich schneller ist.

  • Die PauliLindbladMap.parity_sample() Methode wurde hinzugefügt. Diese Methode ähnelt stark der bisherigen PauliLindbladMap.signed_sample() Methode, verwendet jedoch eine Vorzeichenkonvention, die besser mit dem Rest von Qiskit übereinstimmt, und ist daher künftig die bevorzugte Methode. Es verfügt über zusätzliche optionale Argumente, um bei der Abtastung Skalierungen auf die Raten anzuwenden, ohne die Instanz zu verändern.

  • Einige der quantum_info „Prädikat“-Funktionen, wie beispielsweise is_identity_matrix(), wurden optimiert, um unnötige Matrixzuweisungen zu vermeiden.

Synthesefunktionen

  • Hinzugefügt wurde gridsynth_rz(), das eine Ein-Qubit-Quantenschaltung konstruiert, die eine RZ-Rotation mit einem bestimmten Winkel approximiert. Der Algorithmus wird in der Veröffentlichung „Optimal ancilla-free Clifford+T approximation of z-rotations“ von Neil J. Ross und Peter Selinger beschrieben und ist unter https://github.com/qiskit-community/rsgridsynth implementiert.

  • Es wurde eine Funktion hinzugefügt gridsynth_unitary(), die eine Ein-Qubit-Quantenschaltung konstruiert, welche eine gegebene Ein-Qubit-Unitar-Matrix approximiert. Der Algorithmus funktioniert, indem er die unitäre Matrix in eine RZ-Drehung, eine RX-Drehung und eine weitere RZ-Drehung zerlegt und den Ross-Selinger-Algorithmus auf jede dieser drei Drehungen anwendet.

  • Der allgemeine Algorithmus zur einheitlichen Synthese wurde in Rust neu geschrieben, qs_decomposition() wodurch sich die Laufzeitleistung der Funktion erheblich verbessert hat.

Transpiler-Funktionen

  • Es wurde ein neuer Transpiler-Durchlauf hinzugefügt, CommutativeOptimization der unter Ausnutzung von Kommutativitätsbeziehungen die Beseitigung und Zusammenführung von Gaten durchführt. Der Pass vereint und erweitert die Funktionen von CommutativeCancellation und CommutativeInverseCancellation.

    Insbesondere der Pass:

    • Hebt Paare von inversen Gattern auf, einschließlich Paare, die bis auf eine globale Phase invers sind (ggf. Anpassung der globalen Phase).
    • Versuche, aufeinanderfolgende Gatter nach Möglichkeit zusammenzufassen, beispielsweise Sequenzen von RZ-Gattern, RX-Gattern, Pauli-Rotationen usw.
  • Dem UnitarySynthesis Transpiler-Durchlauf wurde eine fallback_on_defaultneue Option hinzugefügt. Diese Option gilt, wenn der Durchlauf mit einem nicht standardmäßigen Synthese-Plugin aufgerufen wird, das über das Argument methodangegeben wird.

    Standardmäßig wird das angegebene Plugin verwendet, um jede Unitar-Operation im Schaltkreis zu synthetisieren (vorausgesetzt, das Plugin ist geeignet; es wird beispielsweise nicht ausgeführt, wenn es die Anzahl der Qubits, über die die Unitar-Operation definiert ist, nicht unterstützt). Wenn das Plugin die Unitarität nicht synthetisieren kann und zurückgibt None, bleibt die ursprüngliche Unitarität im Schaltkreis unverändert. Wenn auf Truegesetzt fallback_on_default ist, ruft der Pass stattdessen das Plugin DefaultUnitarySynthesis auf, wenn die angegebene Methode fehlschlägt.

    Diese Funktion ist besonders nützlich, wenn benutzerdefinierte Plugins nur einen Teil aller Unitarien verarbeiten sollen: Benutzer können sich auf ihre benutzerdefinierte Logik verlassen, wenn diese zutrifft, und die Standardsynthese verwenden, wenn dies nicht der Fall ist.

  • Es wurde ein neues Plugin für die unitäre Synthese hinzugefügt, RossSelingerSynthesis das Einzel-Qubit-Unitäre-Gatter mithilfe des Ross-Selinger-Algorithmus synthetisiert und einen Einzel-Qubit-Quantenschaltkreis erzeugt, der aus Clifford-, „ TT “- und „ T†T^\dagger “-Gattern besteht.

    Das Plugin wird vom UnitarySynthesis Transpiler-Durchlauf aufgerufen, wenn der Parameter auf "gridsynth"gesetzt method ist.

  • Beim Transpiling in die Clifford+T-Basis verwendet der UnitarySynthesis Transpiler-Pass nun standardmäßig einen Clifford+T-Synthesealgorithmus, um Einzelqubit-Unitarien zu approximieren.

    Ebenso verwendet das DefaultUnitarySynthesis Plugin nun denselben Clifford+T-Synthesealgorithmus, um Unitarien für einzelne Qubits zu approximieren.

  • Eine neue DAGCircuit.to_circuit() Methode bietet nun eine praktische Hülle um dag_to_circuit().

  • Es wurde ein neuer Transpiler-Durchlauf SubstitutePi4Rotationshinzugefügt, der Einzelqubit- RZGate, RXGate und RYGate Rotationsgatter, deren Winkel ganzzahlige Vielfache von π/4\pi/4 sind, in diskrete Sätze von Clifford-, TGate und TdgGate Gattern umwandelt. Beachte, dass ungerade Vielfache von π/4\pi/4 ein einzelnes TGate und sowie einige Clifford-Gatter erfordern, während gerade TdgGate Vielfache von π/4\pi/4 oder, äquivalent dazu, ganzzahlige Vielfache von π/2\pi/2 ausschließlich mit Clifford-Gattern geschrieben werden können.

  • Der Transpiler-Durchlauf LitinskiTransformation wurde erweitert, um Messungen zu verarbeiten. Somit wird die Transformation nun auf eine Schaltung angewendet, die Clifford-Gatter, RZ-Rotationsgatter für einzelne Qubits (einschließlich TT und T†T^\dagger ) sowie Standard-Z-Messungen enthält, und verschiebt die Clifford-Gatter an das Ende der Schaltung. Dabei wandelt er RZ-Rotationen in Produkt-Pauli-Rotationen um (implementiert als PauliEvolutionGate Gates) und Z-Messungen in Produkt-Pauli-Messungen (implementiert mithilfe von PauliProductMeasurement Befehlen).

  • Der Optimierungsdurchlauf des OptimizeCliffordT Transpilers wurde erheblich verbessert und in Rust neu implementiert.

    Dieser Durchlauf führt eine Peephole-Optimierung für Schaltungen durch, die mit dem Clifford+T-Gateset ausgedrückt werden. Genauer gesagt, reduziert es alle Ketten von Einzelqubit-Gates, die Clifford+T enthalten, auf eine minimale Verwendung von TT (oder T†T^\dagger ). Der Durchlauf erfolgt auf einer Kette in einer Zeit, die proportional zur Anzahl der Gates in der Kette ist.

  • Hinzugefügt, WrapAngles.DEFAULT_REGISTRY enthält die Standardregistrierung für WrapAngles. Dieses neue Attribut ersetzt das bisherige WRAP_ANGLE_REGISTRY, und wir empfehlen den nachgelagerten Anwendern, so bald wie möglich auf die neue Form umzustellen.

  • Die Methoden DAGCircuit.topological_op_nodes() DAGCircuit.topological_nodes() und unterstützen nun ein reverse boolesches Argument. Wenn diese Option aktiviert ist True, geben die Methoden Knoten in umgekehrter topologischer Reihenfolge zurück, d. h. von den Ausgängen der Schaltung zu den Eingängen. Dies bietet eine direkte und effiziente Möglichkeit, einen DAG rückwärts zu durchlaufen, ohne den Mehraufwand, die von den Funktionen zurückgegebene Liste der Knoten explizit umzukehren und einen neuen, strukturell umgekehrten DAG zu erstellen DAGCircuit.reverse_ops().

  • Die CommutationChecker unterstützt nun effiziente Kommutationsprüfungen zwischen den Pauli-basierten Gatterfunktionen PauliGate, PauliEvolutionGate und, PauliProductMeasurement indem sie überprüft, ob die erzeugenden Pauli-Operatoren kommutieren. Dies ermöglicht Optimierungen, insbesondere für Schaltkreise im Pauli-basierten Rechenformat, die in Form von Pauli-Entwicklungen und Pauli-Produktmessungen ausgedrückt werden. Beachten Sie, dass die Umwandlung zwischen diesen auf dem Pauli-Prinzip basierenden Gatter und anderen Standardgattern noch nicht auf dieselbe effiziente Weise unterstützt wird.

  • Es wurde ein neues Argument, matrix_max_num_qubits, zu CommutationChecker.commute()hinzugefügt. Dadurch lässt sich die Größe der Befehle begrenzen, für die der Kommutationsprüfer die exponentiell aufwendige Matrixdarstellung berechnen darf. Dieses neue Argument ermöglicht es, zwischen der Größenbeschränkung für zu verarbeitende Befehle (die None standardmäßig auf max_num_qubits gesetzt ist, was bedeutet, dass es keine Beschränkung gibt) und einer Beschränkung der Matrixgröße zu unterscheiden.

  • Die Funktionen generate_preset_pass_manager() und berücksichtigen transpile()unitary_synthesis_method nun das Argument bei der Kompilierung in den Clifford+T-Basissatz, wodurch der Aufruf benutzerdefinierter Plugins für die unitäre Synthese ermöglicht wird.

  • VF2Layout und erfasst VF2PostLayout nun Teilwerte für mögliche Layouts während des Abgleichs von Teilgraphen-Isomorphismen. Dies hat keine nennenswerten Auswirkungen, wenn kein optimales Layout gefunden werden kann, kann jedoch in Fällen mit hoher Symmetrie den Aufwand für die Bewertung von Layouts zur Auswahl des besten Kandidaten drastisch reduzieren.

  • Das call_limit Argument von VF2Layout und VF2PostLayout kann nun ein 2-Tupel sein, wobei das erste Element verwendet wird, bevor die erste Übereinstimmung gefunden wird, und danach wechselt die Begrenzung zum zweiten Element. Dies ist ein zuverlässigerer Laufzeitbegrenzer als das max_trials Argument, da Layouts nun während der Ausführung mit aggressiverem Pruning ausgewertet werden.

Verschiedene Funktionen

Anmerkungen zu Upgrades

  • ConsolidateBlocks liest nun bei der Eingabe ConsolidateBlocks_qubit_map einen PropertySet Schlüssel. Dieser Schlüssel und sein Wert sind nicht öffentlich und sollten von anderen Passwörtern weder gelesen noch geschrieben werden.

Hinweise zum Upgrade der C-API

  • qk_target_entry_new_fixed() verfügt über einen zusätzlichen name Parameter, um den Namen des Zieleintrags festzulegen. Bei Einträgen mit festem Winkel muss fast immer der Name des Standard-Gates überschrieben werden, damit sie korrekt funktionieren.

Hinweise zur Aktualisierung von Schaltkreisen

  • Die Namen der Schaltungen, die als Definitionen von Standard-Schaltungsbibliotheksgattern erzeugt werden, sind nun auf gesetzt None. Früher hatten diese Schaltungen denselben Namen wie das Gatter, wodurch es sehr einfach war, opake Gatter mit Namen zu konstruieren, die mit einem Standardgatter übereinstimmten. Dies verstößt gegen eine gängige Annahme in Qiskit, wonach Standard-Gatennamen eindeutig sein sollten.

  • Die interne Darstellung von ControlFlowOps hat sich geändert, als sie zu a QuantumCircuit oder b addiert DAGCircuit wurden. Das Objekt, das im Circuit gespeichert ist und bei einem späteren Zugriff zurückgegeben wird, ist nicht unbedingt dieselbe Instanz, die dem Circuit hinzugefügt wurde. Benutzer sollten nicht versuchen, Objekte direkt an Ort und Stelle zu verändern, sobald sie einem Schaltkreis hinzugefügt wurden. Dies führt wahrscheinlich zu einer Beschädigung des Schaltkreises, unabhängig davon, ob es sich um den Kontrollfluss oder ein anderes Objekt handelt.

    Wie bei allen In-Place-Änderungen an „ Python “-Objekten, die in DAGCircuiteinem QuantumCircuit oder gespeichert sind, musst du die Anweisung dem Schaltkreis neu zuweisen, damit Rust Space die Änderungen übernehmen kann. Wenn beispielsweise Anmerkungen zu einem hinzugefügt BoxOp werden, das sich bereits in einem Schaltkreis befindet, sollte ein Transpiler-Durchlauf sicherstellen, dass verwendet wird, um das DAGCircuit.substitute_node() Rust-Space-Objekt zu aktualisieren:

    from qiskit.circuit import QuantumCircuit, Annotation
    
    class MyAnnotation(Annotation):
        namespace = "my"
    
    qc = QuantumCircuit(2)
    with qc.box():
        qc.cx(0, 1)
    dag = qc.to_dag()
    
    # Modifications to the box's annotations in-place require
    # writing back the information to Rust space.
    box_node = next(dag.topological_op_nodes())
    box_node.op.annotations.append(MyAnnotation())
    
    # Write back the operation.
    dag.substitute_node(box_node, box_node.op)
  • Es ist zu erwarten, dass die Leistung des Transpilers bei ControlFlowOp Anweisungen wie BoxOp in Qiskit 2.3 vorübergehend schlechter ausfällt, da wir die interne Darstellung des Kontrollflusses von der bisherigen, auf Python ausgerichteten Version auf eine Rust-native Version umstellen. Wir gehen davon aus, dass sich die Leistung in einer späteren Version von Qiskit erneut verbessern wird und wir damit langjährige API-Mängel bei Transpiler-Durchläufen beheben können, die auf Kontrollflussoperationen wirken.

  • Die ControlFlowOp Instanzenblöcke verfolgen keine namemetadata Felder mehr. Diese konnten bereits über die Schnittstelle des Control-Flow-Builders nicht gesetzt werden, und ihre Existenz war eher ein unbeabsichtigtes Implementierungsdetail als eine beabsichtigte API.

  • Die Methode gibt Gate.control() kein Ergebnis mehr zurück AnnotatedOperation , wenn das Argument auf True gesetzt annotated ist und eine native Controlled-Gate-Klasse verfügbar ist. Diese Änderung steht im Einklang mit der Verwendung des Arguments annotated in der gesamten Standard-Schaltkreisbibliothek und ermöglicht eine effizientere Zerlegung von mit Steuerungsinformationen versehenen Gatterelementen. Die betroffenen Gates sind:

    • Einzelgesteuerte H, S, Sdg, U3 Y, Z, SX, RX, RY, RZ, Swap und CZ Gatter;
    • Doppelt gesteuertes ZGatter;
    • willkürlich gesteuerte Phase, CPhase, MCPhase, U1 CU1,, MCU1 und MCMT Gatter.
  • Der Standardwert des Arguments annotated in QuantumCircuit.control() ist nun None statt False. Dies hat keine Auswirkungen auf die eigentlichen Schaltungen, entspricht jedoch dem Standardwert, der in der gesamten annotated Schaltungsbibliothek verwendet wird.

QPY-Upgrade-Hinweise

  • Die in verwendete qpy.dump() Standardversion von QPY (QPY_VERSION) ist nun 17.

Hinweise zum Upgrade der Quanteninformation

  • Die Leistung von Statevector.expectation_value() für Pauli-Operatoren mit identischer Matrix wurde verbessert, indem auf die optimierte Implementierung für den allgemeinen Fall zurückgegriffen wurde, anstatt auf eine spezielle Abkürzung, die sich mit der Anzahl der Qubits nur schlecht skalierte.

Hinweise zum Transpiler-Upgrade

  • Die maximalen Anruf- und Versuchsgrenzen für den Exaktabgleich-Durchlauf von VF2PostLayout bei optimization_level=3 wurden reduziert, um übermäßige Laufzeiten zu vermeiden, wenn hochsymmetrische Versuchsschaltungen auf große Kopplungskarten abgebildet werden.

  • Der bevorzugte Speicherort für die Standard-Registrierungsdatei des WrapAngles Transpiler-Durchlaufs ist nun WrapAngles.DEFAULT_REGISTRY. Der bisherige, stark verschachtelte WRAP_ANGLE_REGISTRY Pfad wird aus Gründen der Abwärtskompatibilität weiterhin funktionieren, wir empfehlen jedoch, in nachgelagerten Paketen den neuen Speicherort zu verwenden. Der bisherige Pfad war ein Versehen in Qiskit 2.2 und durchläuft Module, die nie als Teil der öffentlichen API vorgesehen waren.

  • Während die Schnittstelle zu VF2Layout und logisch VF2PostLayout unverändert bleibt, hat das max_trials Argument nun weitaus weniger Einfluss als Laufzeitbegrenzer, es sei denn, es wird auf den Wert gesetzt 1. Das liegt daran, dass dank des neuen „On-the-fly“-Algorithmus zur Bewertung und Ausdünnung, der intern von der Klasse verwendet wird, „vollständige“ Layouts weitaus seltener vorkommen und die Anzahl der „Versuche“ nur dann erhöht wird, wenn ein neues Layout gefunden wird, das hinsichtlich der Fehlerquote besser ist als das vorherige. Sie sollten stattdessen als deterministischen call_limit Laufzeitbegrenzer verwenden; wobei die Anzahl der max_trials aufgetretenen vollständigen Layouts misst und call_limit die Anzahl der Erweiterungen durch Teil-Layouts.

Verschiedene Hinweise zum Upgrade

  • Die minimal unterstützte Version von Python ist nun 3.10, nachdem Python3.9 im Oktober 2025 ausläuft und seit Version 2.1 in Qiskit Verwendungswarnungen angezeigt werden.

  • Die Unterstützung für „ macOS “ ( x86-64, Intel) wurde von Stufe 1 auf Stufe 2 herabgestuft. Qiskit wird weiterhin getestete und vorkompilierte Wheels für diese Plattform bereitstellen, aber die Tests werden nur zum Zeitpunkt der Veröffentlichung durchgeführt und nicht bei jeder Änderung. Dies könnte zu Verzögerungen bei der Freigabe der Räder für diese Plattform führen.

    Diese Änderung wurde vorgenommen, weil Apple damit begonnen hat, die Plattform auslaufen zu lassen, und das Qiskit-Team nicht mehr über die Entwickler- oder CI-Ressourcen verfügt, um den Tier-1-Support fortzusetzen. Wir können nur macOS x86-64 unterstützen, solange GitHub weiterhin Runner dafür bereitstellt, und wir gehen davon aus, dass diese Unterstützung in der zweiten Hälfte des Jahres 2027 eingestellt wird.

Veraltete Funktionen der C-API

  • Die Funktion qk_transpiler_pass_standalone_vf2_layout() ist veraltet, da Aufrufer nun verwenden sollten qk_transpiler_pass_standalone_vf2_layout_average(). Der neue Funktionsname beschreibt die Bewertungsheuristik besser, und die API ermöglicht einen gekapselten Zugriff auf das gesamte neue Konfigurationsobjekt, einschließlich der Zwei-Grenzwert-Form von call_limit.

    Diese Abkündigung ist für Benutzer nicht unbedingt notwendig, aber da die C-API noch ausdrücklich instabil ist, nutzen wir dies als Testlauf für die Verwaltung von Abkündigungen und kompilerspezifischen Warnungen in der C-API, bevor wir Stabilitätsgarantien erreichen.

Veraltete Schaltungen

  • Seit Qiskit 1.0 akzeptieren die Methoden Gate.control()QuantumCircuit.control() und das Argument annotated , das entweder False, True oder Nonesein kann. Derzeit wird ein gesteuertes Gatter mithilfe einer speziellen Klasse für gesteuerte Gatter dargestellt, sofern eine solche existiert, unabhängig vom Wert von annotated; so ist beispielsweise eine XGate zweifach gesteuerte Version eines ein CCXGate. Wenn keine eigene Klasse für gesteuerte Gatter existiert, wird das gesteuerte Gatter als dargestellt ControlledGate , wenn annotated=False und als, AnnotatedOperation wenn annotated=True. Der Standardwert annotated=None wird genauso behandelt wie False.

    In Qiskit 3.0 wird die Einstellung nicht mehr annotated=None zulässig sein und stattdessen die Standardeinstellung auf geändert annotated=True werden. Dies wird empfohlen, da dadurch die Konstruktion des gesteuerten Schaltkreises vom Schaltkreisaufbau auf den Transpiler verlagert wird und zusätzliche Optimierungen des gesteuerten Gates ermöglicht werden, was in der Regel zu Schaltkreisen höherer Qualität führt (insbesondere bei hierarchischen Schaltkreisen).

    Sie können jedoch weiterhin explizit festlegen, annotated=False dass das bisherige Verhalten beibehalten wird.

Transpiler-Veraltungen

Änderungen am Build-System

  • Beim Erstellen oder Verpacken von Qiskit aus dem Quellcode ist nun mindestens die Version 77.0 (veröffentlicht im März 2025) von setuptools erforderlich. Dies dient zur Unterstützung der neuen Lizenz-Metadaten-Spezifikationen von PEP 639. Diese Abhängigkeit ist in den Build-Anforderungen angegeben, sodass keine manuellen Maßnahmen erforderlich sein sollten.

Fehlerkorrekturen

  • Behebt einen Fehler in der Implementierung von __deepcopy__() , QuantumCircuit bei dem Schaltungsparameter nicht vollständig kopiert wurden. Folglich hat eine Änderung von BoxOp in einer kopierten Schaltung keine Auswirkungen mehr auf die ursprüngliche Schaltung.

  • DAGCircuit.apply_operation_back(), apply_operation_back() und circuit_to_dag() fügt nun neue Kanten in einer deterministischen Reihenfolge hinzu. Das bisherige Verhalten könnte dazu führen, dass bestimmte Transpiler-Durchläufe (wie z. B. SabreSwap) den DAG in nicht deterministischer Reihenfolge durchlaufen.

  • DAGCircuit.apply_operation_front() Bei der Bearbeitung von Knoten, die klassische Bedingungen enthalten, dürfen keine ungültigen Selbstschleifen mehr eingefügt werden.

  • Es wurde ein Problem behoben, das auftrat, Optimize1qGatesDecomposition wenn der Durchlauf mit einem initialisiert Target wurde, der 1q -Gates mit festen Winkelparametern enthält. Bisher gab der Durchlauf möglicherweise Gatter außerhalb des Ziels aus, da nicht überprüft wurde, ob das Gatter im Ziel beliebige Parameterwerte unterstützte. Problem Nr. 14743 behoben.

  • Es wurde ein fehlerhaftes Verhalten in dem BasisTranslator Durchlauf behoben, bei dem ein Multi-Qubit-Gatter innerhalb eines ControlFlowOp Blocks die lokalen Qubit-Indizes verwendete, anstatt die absoluten Indizes aus dem Quellschaltkreis zu verwenden.

  • Die Wiederverwendung derselben ConsolidateBlocks Instanz auf mehreren Kanälen wurde behoben, einschließlich Aufrufen mit transpile() mehr als einem Kanal und ohne prozessbasierte Parallelisierung. Ein Fehler, der in Qiskit 2.2.2 auftrat, führte dazu, dass der Durchlauf abstürzte oder ungültige Ergebnisse lieferte, wenn dieselbe Instanz in unterschiedlichen Schaltkreisen wiederverwendet wurde.

  • Der ConsolidateBlocks Transpiler-Durchlauf prüft nun korrekt, ob ein bestimmtes Gatter hardwareunterstützt ist, während er die Kontrollflussoperationen rekursiv durchläuft.

  • qpy.dump() kann nun das Schreiben in .gz Dateien verarbeiten, die mit dem Modul der gzip Standardbibliothek unter Verwendung von QPY Version 16 oder höher geöffnet wurden. Weitere Informationen finden Sie unter #15157.

  • Die Methoden MCPhaseGate.inverse() und wurden angepasst MCU1Gate.inverse() , um die Steuerzustände von Gatter mit offener Steuerung bei der Berechnung ihrer Inversen beizubehalten.

  • ConsolidateBlocks gibt nun eine Ausnahme vom Typ „ Python -space“ zurück, anstatt einen Panikfehler auszulösen, wenn es ungültige oder veraltete Analysen in den Schlüsseln block_listPropertySet „legacy“ run_list oder „“ feststellt.

  • Optimize1qGatesDecomposition löst nun eine TranspilerError anstelle einer Rust-space-Panik aus, wenn versucht wird, das Programm auf einem Schaltkreis auszuführen, der Targetfür die zu groß ist.

  • Es wurde ein Problem bei pickle der Unterstützung für die behoben SabreSwap , bei dem eine SabreSwap -Instanz beim Pickling nach Ausführung der SabreSwap.run() -Methode einen Fehler verursachte. Problem Nr. 15071 behoben.

  • Die Planungsdurchläufe und behandeln ALAPScheduleAnalysisASAPScheduleAnalysis nun Schaltkreise, die keine Operationen enthalten, korrekt. Zuvor wurde ein Fehler angezeigt TranspilerError , der fälschlicherweise besagte: „Keine Laufzeiten angegeben“. Problem Nr. 15145 behoben.

  • Es wurde ein Problem behoben, bei dem die Eingabetoleranzwerte bei der Überprüfung, ob ein is_unitary() Operator unitär ist, nicht korrekt berücksichtigt wurden. Die Methode verwendet nun bei der Vereinfachung des Operators und der Überprüfung, ob dieser der Identität entspricht, korrekt die angegebenen Parameter atol``rtol und. Damit wird das Problem #14107 behoben.

  • Es wurde ein Fehler im UnitarySynthesis Transpiler-Durchlauf behoben, der auftrat, wenn dieser mit einem nicht standardmäßigen Synthese-Plugin (angeben über method) aufgerufen wurde, das zwar unterstützt, basis_gates aber nicht target. Der Pass übergibt nun die Basis-Gates korrekt vom target an das Plugin.

  • Es wurde ein Fehler im Schaltkreis-Textfeld behoben, der auftreten konnte, wenn Schaltkreisblöcke innerhalb von Kontrollflussoperationen auf anderen Registern definiert wurden als der äußere Schaltkreis. Diese Situation könnte beispielsweise auftreten, wenn Operationen direkt ControlFlowOp angehängt werden, oder bei Schaltkreisen nach der Transpilation.

  • Die Unterstützung für die Serialisierung PauliEvolutionGate mit Operatoren vom Typ SparseObservablebei Verwendung von QPY Version 17 wurde behoben.

  • Es wurde ein Inkonsistenzfehler behoben, QkTargetOp bei dem die Länge des in gespeicherten QkTargetOp.params Arrays nicht mit der von angezeigten Anzahl QkTargetOp.num_params übereinstimmte. Platzhalterparameter werden nun durch dargestellt NAN, und die Länge des Arrays beträgt immer QkTargetOp.num_params. Dieser Fehler trat ausschließlich in der Version 2.3.0rc1 auf.

  • Es wurde ein Regressionsfehler in der klassischen Ausdrucksdarstellung von Typ Uint mit einer Value Breite von mehr als 64 Bit behoben. Bisher wurde der Wert von Ausdrücken mit diesen Typen intern unbeabsichtigt in einen Double-Fließkommawert umgewandelt, was zu einem Genauigkeitsverlust führte.

  • Der HighLevelSynthesis Befehl wählt nun die Optimierungsmetrik korrekt entsprechend dem Basissatz aus: die Anzahl der Zwei-Qubit-Gatter für kontinuierliche Basissätze und die T-Zahl für Clifford+T-Basissätze. Bisher wurden diese Informationen nicht korrekt weitergegeben, was zu schlechteren T-Werten als erwartet führte.

  • Der Schaltkreis-Textzeichner wurde so angepasst, dass Schaltkreis-Anweisungen mit klassischen Drähten in separaten Ebenen gezeichnet werden.

  • Bei der Matrixmultiplikation (@) zwischen Operator und Statevector wird der Operator nun auf den Zustand angewendet und das Ergebnis zurückgegeben Statevector.

  • Es wurde ein Fehler im ElidePermutations Transpiler-Durchlauf behoben, der bei der Verarbeitung von Permutationen einzelner Qubits zu einem Absturz führte.

  • Es wurde ein potenzielles Deadlock-Problem behoben, das bei der Ausführung von Layout-Durchläufen wie SabreLayout mit einer unzusammenhängenden Konnektivität im Target und in einem Multiprocessing-Kontext bei der Ausführung von PassManager.run() oder transpile() mit mehr als einer Schaltung auftreten konnte. Unter Linux ist dies das Standardverhalten, wenn oder transpile() mit mehr als PassManager.run() einem Circuit ausgeführt wird; auf allen anderen Plattformen müssen Sie die Verwendung eines Multiprocessing-Kontexts ausdrücklich aktivieren.

    Dies lag an einem grundlegenden Problem in CPython, das python/cpython#84559 bei der Kombination von Multiprocessing und Multithreading auftrat. Normalerweise verhindert Qiskit die Vermischung der beiden Parallelitätsmethoden, aber im Fall der Verarbeitung disjunkter Konnektivitätsgraphen fehlte diese Schutzmaßnahme bei multithreaded Rust-Code.

  • Die Methode Statevector.to_dict() berücksichtigt nun ihr decimals Schlüsselwort-Argument, das sie zuvor ignoriert hat.

  • Es wurde ein Problem mit der timeline_drawer() Visualisierungsfunktion behoben, bei dem es zu einem Fehler kam, wenn ein geplanter Schaltkreis von einem Ziel visualisiert wurde, das parametrisierte Gatter mit festgelegter Dauer enthielt.

  • Generierung fester Bezeichnungen für PauliEvolutionGate mit SparseObservable Operatoren. Bezeichnungen zeigen nun Pauli-Operatoren mit Qubit-Indizes (z. B. "X0 X2") anstelle des Formats mit verketteten Zeichenfolgen (z. B. "XX") an, wodurch die Unterscheidung zwischen verschiedenen Operatoren übersichtlicher wird.

  • Pauli.evolve() behandelt nun Quantenkreise, die bestimmte parametrisierte Rotationsgatter enthalten, korrekt, wenn der Winkel ein Vielfaches von π/2\pi/2 ist, z. B. RZGate(math.pi/2) oder RZZGate(math.pi/2). Früher wurden sie nicht als Clifford-Gatter erkannt, was zu einem Fehler führte.

  • BasePassManager ersetzt nicht mehr die Ausgabewerte von Durchläufen, die zwar gültig, aber falsch sind, durch das ursprüngliche Eingabeprogramm. Ein zurückgegebenes Passwort 0 oder ein anderer falscher Wert False wird nun beibehalten, und nur ein Fehler None wird angezeigt.

  • QuantumCircuit.compose() wird nun alle Variablen und Streckungen, die in Delay Anweisungen verwendet werden, korrekt neu zuordnen, wenn das var_remap Argument angegeben wird.

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