Qiskit SDK 2.4 Versionshinweise
2.4.2
Vorspiel
Qiskit v2.4.2 ist eine Patch-Version, die Fehler behebt, die in der Serie „ v2.4 “ festgestellt wurden.
Dies ist ebenfalls ein Sicherheitsupdate, das eine Stack-Overflow-Sicherheitslücke im Parser von „ OpenQASM 2“ behebt.
Sicherheitsprobleme
-
Die beiden Parser „ OpenQASM “ (
qasm2.load()undqasm2.loads()) beenden nun den Vorgang mit einemRecursionError, wenn versucht wird, einen zu tief verschachtelten Ausdruck auszuwerten. Die maximal zulässige Tiefe wird aus dem „ Python “sys.getrecursionlimit()am Einstiegspunkt in die Parser entnommen.Bisher konnten die Parser im Rust-Speicher beliebig rekursiv arbeiten, was schließlich dazu führte, dass der maximale Stapelspeicherplatz überschritten wurde und der Prozess mit einem Segfault abstürzte.
Fehlerkorrekturen
-
BarrierEs wurde ein ProblemTranspilerErrorbehobenConstrainedReschedule, bei dem beim Neuzuweisen eines Schaltkreises, der ein enthält, ein ausgelöst wurde. Problem Nr. 16135 behoben. -
synth_cz_depth_line_mr()Löst nun bei fehlerhaften Eingaben einen „ Python “-FehlerValueErroraus, anstatt einen „Rust“-Panic. Problem Nr. 16152 behoben. -
Ein Fehler bei der Zusammensetzung virtueller Permutationslayouts (implizite Permutationen, die am Ende des Schaltkreises angewendet werden) in
ElidePermutationsundStarPreRoutingwurde behoben. -
ConstrainedReschedulewird nicht mehr ausgelöstAttributeError, wenn das optionaletargetArgument nicht angegeben wird. Siehe Nr. 16245. -
CRXGateEs wurde ein Fehler behoben,CommutationCheckerder bei der Auswertung von Kommutativitätsbeziehungen zwischen Gatter mit kontrollierter Rotation,CRYGateoderCRZGateund anderen Standardgattern auftrat. Davon betroffen warenCommutationAnalysis,CommutativeCancellation,CommutativeOptimizationundqk_transpiler_pass_standalone_commutative_cancellation(). Siehe Nr. 16164. -
Es wurde ein Fehler behoben,
CSdgGateInverseCancellationbei demCSGatePaare mit vertauschten Qubit-Argumenten nicht einheitlich storniert wurden. Zuvor wurde eine Sequenz von „ “ (mit invertierten Qubits) rückgängig gemacht, „ “ jedoch nicht. Nun werden beide regelmäßig abgesagt.Problem Nr. 15855 behoben.
-
Es wurde
MultiplierGateso angepasst, dass bei der Standardzerlegung die gewünschte Anzahl an Ergebnis-Qubits erhalten bleibt. Bisher wurde dieses Argument ignoriert, und die Zerlegung erfolgte stets unter Verwendung der doppelten Anzahl an Zustandsqubits für die Ergebnisqubits. Problem Nr. 16168 behoben. -
Verschiedene Visualisierungsfunktionen geben nun korrekt „ “ anstelle von „ “ oder entsprechende Formen für das gewählte Ausgabeformat aus. Siehe #16170.
-
Es wurde ein Fehler behoben
Statevector.evolve(), bei dem der Eingabe-Zustandsvektor direkt geändert wurde, wenn der Befehl eine globale Phase aufwies. Siehe Nr. 15750. -
Ein durch einen Unterlauf verursachter Fehler bei der Subtraktion in
ConstrainedReschedule. wurde behoben. Siehe #16231 <https://github.com/Qiskit/qiskit/issues/16231> __. -
Es wurde ein Fehler behoben,
UnrollForLoopsbei dem beim Entrollen einer statischenForLoopOpFunktion, deren Körper einen Wert ungleich NullQuantumCircuit.global_phaseenthielt, eine zusätzliche Kopie der Körperphase hinzugefügt wurde.Problem Nr. 16185 behoben.
-
VF2LayoutundVF2PostLayoutwird nicht mehr in Panik geraten und sagen: „Float-Werte dürfen nicht ‚nan‘ zurückgeben“, wenn Anweisungen auftauchen, bei denen Fehler gemeldet werden, die als1.0.
2.4.1
Vorspiel
Qiskit v2.4.1 behebt eine kleine Anzahl von Fehlern, die seit der Veröffentlichung von Qiskit v2.4.0 festgestellt wurden.
Fehlerkorrekturen
-
Ein Programmabsturz wurde behoben, der auftrat
RemoveIdentityEquivalent, wenn die globale Phase des Schaltkreises Objekte enthieltParameterVectorElement. Die Nachricht lautete:Der Zeiger kann nicht in den Heap von „ Python “ geklont werden, ohne dass der Thread angehängt ist.
Siehe Nr. 16053.
-
Es wurde ein Fehler behoben
qpy.load(), der bei QPY-Versionen >= 13 auftrat, bei denenDelayAnweisungen mit ganzzahligen Laufzeiten bei der Deserialisierung zu falschen Typen führen konnten. Dies könnte dazu führen, dass späterer Code Fehler auslöst, beispielsweiseqasm3.dumps_experimental()die Fehlermeldung „Parameterwert konnte nicht analysiert werden“. Weitere Einzelheiten finden Sie unter Nr. 16076.
2.4.0
Vorspiel
Qiskit 2.4.0 ist eine neue Funktionsversion des „ Qiskit SDK “. Die Highlights dieser Version sind:
- Unterstützung für die Entwicklung von Erweiterungsmodulen für „ Python “, die die Qiskit-C-API nutzen und sicher in „ Python “-Wheels verteilt werden können: Mit dieser Version ist es nun praktikabel, leistungskritische oder Low-Level-Komponenten, die Qiskit nutzen, in kompilierte Erweiterungen zu verlagern, die die Qiskit-C-API nutzen. Diese Erweiterungen können nun mithilfe der Standard-Tools von Python als gewöhnliche „ Python “-Radsets gepackt und verteilt werden.
- Erste Portierung der internen Mechanismen für die Serialisierung und Deserialisierung von QPY nach Rust: Dies beschleunigt sowohl die Erstellung als auch das Laden von QPY-Nutzdaten erheblich und bildet zudem den Ausgangspunkt für die Erweiterung der C-API um QPY-Unterstützung.
- Erweiterung der Funktionalität der C-API: Die C-API stellt nun DAG-basierte Darstellungen über einen undurchsichtigen
QkDagTyp bereit, zusammen mit Transpiler-Pass-Funktionen auf DAG-Ebene, die direkt auf dieser Darstellung operieren. Zu den weiteren Funktionen gehören die Unterstützung parametrisierter Schaltungen, Befehle für Pauli-basierte Berechnungen sowie ein Schaltungstext-Editor.- Verbesserungen an der Clifford+T-Transpilation-Pipeline: Wir haben die Clifford+T-Transpilation-Pipeline für die Zielausrichtung auf diskrete Clifford+T-Basis-Gate-Sätze erheblich verbessert, wodurch eine höhere Kompilierungsqualität und deutlich schnellere Laufzeiten erzielt werden. Insbesondere verwendet Qiskit nun den
gridsynthAlgorithmus als Standardmethode zur Synthese von RZ-Rotationen in einer diskreten Basis und ersetzt damit die in früheren Versionen verwendete Solovay-Kitaev-Zerlegung.
Funktionen der C-API
-
Wurde hinzugefügt
QkTranspilerStageState, um einen gemeinsamen Zustand zwischen den Transpilierungsphasen aufrechtzuerhalten. -
Es wurde eine neue Funktion hinzugefügt,
qk_circuit_draw()mit der sich ein Quantenschaltkreis über die C-API als Text darstellen lässt. Die Funktion verwendetQkCircuitDrawerConfigzur Konfiguration der Visualisierungsoptionen. Weitere Informationen finden Sie in der Funktionsdokumentation. -
qk_dag_replace_block_with_unitary()Die C-API-Funktion wurde hinzugefügt, die einen Knotenblock in einer DAG-Schaltung durch einen neuen Knoten ersetzt, der ein Unitar-Gatter darstellt. Die Funktion gibt den Index des neu erstellten Knotens zurück. -
qk_dag_substitute_node_with_unitary()Die C-API-Funktion wurde hinzugefügt, die eine Operation in einem Knoten eines DAG-Schaltkreises durch ein unitäres Gatter ersetzt. -
Es wurde eine C-API-Funktion
qk_circuit_instruction_kind()hinzugefügt, mit der sich die Art eines bestimmten Befehls in einem Quantenschaltkreis abfragen lässt. Diese Funktion gibt einenQkOperationKindEnum-Wert zurück, der die Art der Operation an einem bestimmten Index innerhalb der Schaltung angibt. -
Es wurde eine C-API-Funktion
qk_circuit_inst_unitary()hinzugefügt, mit der die zu einer bestimmten unitären Anweisung in einem Quantenschaltkreis gehörende unitäre Matrix extrahiert werden kann. Diese Funktion füllt ein angegebenes Ausgabe-Array mit der unitären Matrix und ermöglicht es C-Aufrufern, auf die innerhalb der Schaltung definierten unitären Transformationen zuzugreifen. -
qk_api_version()Die C-API stellt nun eine Funktion zur Verfügung, die die Version der Bibliothek zurückgibt, die zur Laufzeit geladen wurde. Das Ausgabeformat entspricht dem vonQISKIT_VERSION_HEX. -
DAGCircuitDie Funktionenqk_dag_borrow_from_python()undqk_dag_convert_from_python()ermöglichen die Extraktion von C-nativen Typen aus einem „ Python “-Raum.qk_dag_to_python()C-Module können mithilfe von einen „ Python “-RaumDAGCircuiterstellen. -
TargetDie Funktionenqk_target_borrow_from_python()undqk_target_convert_from_python()ermöglichen die Extraktion von C-nativen Typen aus einem „ Python “-Raum. -
Qiskit unterstützt nun die Erstellung von Erweiterungsmodulen für „ Python “, die die Qiskit-C-API einer von „ Python “ geladenen Qiskit-Version nutzen. Diese Erweiterungsmodule können dann sicher auf die Räder verteilt werden.
Um ein Erweiterungsmodul zu kompilieren, müssen Sie:
#include <qiskit.h>Definieren Sie dasQISKIT_PYTHON_EXTENSIONMakro vorher.- Rufen
qk_import()Sie diese Funktion auf, bevor Sie versuchen, Funktionen der Qiskit-C-API zu verwenden – einmal pro Kompilierungseinheit (in der Regel eine einzelne.cDatei). In der Regel befindet sich dies in der Funktion Ihres ErweiterungsmodulsPyInit_*.
Wir beabsichtigen, in einer späteren Version von Qiskit die Verwendung mehrerer Kompilierungseinheiten über die Qiskit-C-API in einem Erweiterungsmodul zu ermöglichen.
Bitte beachten Sie, dass die C-API von Qiskit noch instabil ist; es kann nicht garantiert werden, dass Erweiterungsmodule, die für Qiskit 2.4 kompiliert wurden, unter Qiskit 2.5 oder höher laufen. Qiskit wird diese Stabilität zu einem späteren Zeitpunkt übernehmen.
-
Die Felder
QkObsTerm.bit_termsundindiceskönnen nun Nullzeiger sein, wenn ihr entsprechendeslengleich Null ist. -
Die Argumente
coeffs,bit_termsundindicesbisqk_obs_new()können nun Nullzeiger sein, wenn ihre entsprechenden Längen Null sind. -
Die C-API unterstützt nun die Konvertierung
QkCircuitzwischen Objekten im „ Python “-Namensraum mithilfe der folgenden Methoden:qk_circuit_borrow_from_python()qk_circuit_convert_from_python()qk_circuit_to_python_full()qk_circuit_to_python()
Beachten Sie, dass
qk_circuit_to_python()nicht neu ist, sich sein Verhalten jedoch in Qiskit 2.4 geändert hat: Es gibt nun das Objekt „ Python “ zurück, das direkt mitQkCircuitkorrespondiert (sieheQuantumCircuit._data), anstattQuantumCircuitselbst.qk_circuit_to_python_full()ersetzt die alte Methode. -
SparseObservableQkObsunterstützt nun zwei Methoden, um eine Ansicht des Observables aus einem „ Python “-Raum zu entnehmen. Dies sind: -
QkQuantumRegisterund verfügenQkClassicalRegisternun über Konvertierungen in den und aus dem „ Python “-Namensraum. Diese verwenden die folgenden Funktionen: -
Es wurden DAG-basierte Varianten der eigenständigen Transpiler-Pass-Funktionen in die C-API aufgenommen. Diese neuen Funktionen wirken direkt auf
QkDagObjekte einQkCircuit, wodurch der Mehraufwand für die Umwandlung von Schaltkreisen in DAGs und von DAGs in Schaltkreise vermieden wird, wenn mehrere Durchläufe miteinander verkettet werden. Die neuen Funktionen folgen der Namenskonventionqk_transpiler_pass_*und umfassen:qk_transpiler_pass_elide_permutations()qk_transpiler_pass_check_gate_direction()qk_transpiler_pass_gate_direction()qk_transpiler_pass_optimize_1q_sequences()qk_transpiler_pass_remove_diagonal_gates_before_measure()qk_transpiler_pass_remove_identity_equivalent()qk_transpiler_pass_split_2q_unitaries()
Diese sind nützlich, wenn man in C benutzerdefinierte Transpilations-Pipelines erstellt, bei denen man mehrere Durchläufe nacheinander ausführen möchte, ohne dass dabei wiederholt zwischen Schaltkreis- und DAG-Darstellungen konvertiert werden muss.
-
Der
QkObsSchnittstelle wurde eine skalierte Operatoraddition hinzugefügt, sowieqk_obs_scaled_add()undqk_obs_scaled_add_inplace(). -
QkObsEs wurden zwei neue Funktionen für arithmetische In-Place-Operationen auf hinzugefügt, nämlichqk_obs_add_inplace()undqk_obs_multiply_inplace(). -
Ein neues Modul im „ Python “-Namensraum,
qiskit.capi, bietet grundlegenden Zugriff auf Installationsdetails zur Qiskit-C-API, die im Paket „ Python “ enthalten ist. -
Die C-API-Header-Dateien (
qiskit.hund die dazugehörigen Hilfsdateien) sind nun im Paket „ Python -space“qiskitenthalten. Den Pfad zum Include-Verzeichnis, das Sie dem Suchpfad Ihres Compilers hinzufügen möchten, finden Sie unterqiskit.capi.get_include(). -
Es wurden C-API-Bindungen für den Schaltkreisgenerator „Instantaneous Quantum Polynomial-time“ (IQP) in die Schaltkreisbibliothek aufgenommen. Die neuen Funktionen
qk_circuit_library_iqp()undqk_circuit_library_random_iqp()ermöglichen es C-Aufrufern, IQP-Schaltkreise entweder anhand einer expliziten ganzzahligen Interaktionsmatrix (mit optionaler Symmetrieprüfung) oder anhand einer reproduzierbaren Zufallsinstanz zu konstruieren. -
Die C-API wurde um die Unterstützung für einen auf Pauli basierenden Berechnungsgat-Satz erweitert.
QkPauliProductRotationstellt eine generische Pauli-Produkt-Rotation dar, undQkPauliProductMeasurementeine generische Pauli-Produkt-Messung.qk_circuit_pauli_product_measurement()Diese Anweisungen können mithilfe der neuen Funktionenqk_circuit_pauli_product_rotation()bzw. zu einemQkCircuithinzugefügt werden.QkOperationKind_PauliProductRotationqk_circuit_inst_pauli_product_rotation()Um die Rotationsdaten des Pauli-Produkts aus einer Schaltung abzurufen, können Sie verwenden, vorausgesetzt, dass die vonqk_circuit_instruction_kind()zurückgegebene Befehlsart ist.QkOperationKind_PauliProductMeasurementAnalog dazu können Messungen des Pauli-Produkts überqk_circuit_inst_pauli_product_measurement()abgerufen werden, wenn der Typ ist. -
Es wurde eine Funktion hinzugefügt
qk_transpiler_pass_standalone_litinski_transformation(), um eine Litinski-Transformation auf aQkCircuitin der C-API anzuwenden. Das entspricht dem Pass von „LitinskiTransformationPython “. -
Hinzugefügt
qk_transpiler_pass_standalone_convert_to_pauli_rotations(), um einQkCircuitaus Standardgattern und Messungen bestehendes System mithilfeQkPauliProductRotationder Befehle undQkPauliProductMeasurementin ein auf dem Pauli-Prinzip basierendes Berechnungsformat zu konvertieren. Das entspricht dem Pass von „ConvertToPauliRotationsPython “. -
Es wurde die Möglichkeit hinzugefügt, parametrisierte Gatter mithilfe der neuen
qk_circuit_parameterized_gate()Funktion zu Schaltungen hinzuzufügen, wobei die Gatterparameter alsQkParam *Objekte angegeben werden. Zum Beispiel:QkCircuit *qc = qk_circuit_new(100, 0); QkParam *theta = qk_param_new_symbol("theta"); uint32_t qubit[1] = {0}; const QkParam* params[1] = {theta}; qk_circuit_parameterized_gate(qc, QkGate_RX, qubit, params); // add RX(theta) to the circuit -
Wurde hinzugefügt
qk_circuit_num_param_symbols(), um die Anzahl der ungebundenen Symbole in der Schaltung abzufragen. -
Die
qk_transpiler_pass_standalone_remove_identity_equivalent()eigenständige Transpiler-Pass-Funktion läuft nun standardmäßig im Multithread-Modus. Dadurch wird die Laufzeitleistung des Durchlaufs verbessert, wenn dieser auf großen Schaltkreisen ausgeführt wird. Sie können das Threading-Verhalten mithilfe derRAYON_NUM_THREADSUmgebungsvariable steuern. Informationen zur Verwendung dieser Umgebungsvariablen finden Sie in der Dokumentation der Funktion. -
Die Suzuki-Trotter-Evolution wurde in die C-API integriert, indem der Schaltkreiserzeuger in die Schaltkreisbibliothek aufgenommen wurde. Die neue Funktion
qk_circuit_library_suzuki_trotter()kann wie folgt verwendet werden:#include <qiskit.h> // Create the observable QkObs *obs = qk_obs_zero(1); // Add the pauli terms QkBitTerm op1_bits[1] = {QkBitTerm_X}; QkObsTerm term1 = {(QkComplex64){1.0, 0.0}, 1, op1_bits, (uint32_t[1]){0}, 1}; qk_obs_add_term(obs, &term1); QkBitTerm op2_bits[1] = {QkBitTerm_Y}; QkObsTerm term2 = {(QkComplex64){1.0, 0.0}, 1, op2_bits, (uint32_t[1]){0}, 1}; qk_obs_add_term(obs, &term2); // Call the evolution QkCircuit *qc = qk_circuit_library_suzuki_trotter(obs, 2, 1, 0.1, true, false); // Free the objects qk_obs_free(obs); qk_circuit_free(qc); -
Die
qk_transpile()Funktion führt nun denVF2PostLayoutTranspiler-Durchlauf im Rahmen der Optimierungsstufen 1, 2 und 3 aus.generate_preset_pass_manager()Der Durchlauf ist so konfiguriert, dass er genauso abläuft wie die voreingestellten Durchlaufmanager von „ Python “. Weitere Informationen zur Konfiguration finden Sie in der Dokumentation unter Pythontranspiler.
Funktionen der Schaltungen
-
Es wurde eine
PauliProductMeasurement.pauli()Methode hinzugefügt, die den durch den Befehl gemessenen WertPaulizurückgibt, einschließlich seiner globalen Phase von+1oder-1. -
Das bisher private Attribut
QuantumCircuit._dataist nun Teil der öffentlichen API, jedoch nur als Handle zur Übergabe an C-API-Funktionen, die dies erwartenQkCircuit. Der Typ des Objekts ist in der öffentlichen API nicht angegeben, ebenso wenig wie die darauf definierten Methoden. -
QuantumCircuit.compose()kann bis zu etwa doppelt so schnell sein, wenn sehr lange Schaltkreise auf einen anderen aufgesetzt werden. -
evolved_operator_ansatz()Unterstützung fürSparseObservablebis wurde hinzugefügt. -
Es wurde ein neues
PauliProductRotationGateGate hinzugefügt, das generische Pauli-Produkt-Rotationen der Form für ein Pauli-Produkt und einen Rotationswinkel darstellt. Zusammen mit demPauliProductMeasurementbilden diese Gates eine Grundlage für Pauli-basierte Berechnungen. -
Die
RCCXGateist selbstinvers. DieRCCXGate.inverse()Funktion gibt nun eine neueRCCXGateInstanz zurück, anstatt eine Instanz vonGatemit einer benutzerdefinierten Definition. -
negate()Es wurde eine neue unäre Negationsoperation eingeführt, mit der Benutzer Float- und Dauerausdrücke negieren können. Wird ein Skalar übergeben, wird dieser automatisch auf den richtigen Typ angehoben.Beispielverwendung:
from qiskit.circuit import ClassicalRegister from qiskit.circuit.classical import expr, types qc = QuantumCircuit(2, 2) in_var1 = qc.add_input("in1", types.Float()) with qc.if_test(expr.greater(in_var1, 0.2)) as else_: qc.rz(0.3, 0) with else_: with qc.if_test(expr.greater(expr.negate(in_var1), 0.2)): qc.rz(-0.3, 0)
Anbieter-Funktionen
-
Das
BasicSimulatorerkennt nun automatisch Clifford-Schaltungen und optimiert deren Simulation mithilfe des Stabilisator-Formalismus überStabilizerState. Dies führt zu erheblichen Leistungssteigerungen bei Schaltungen, die ausschließlich Clifford-Gatter (H, S, CX, CZ, X, Y, Z usw.) enthalten, mit polynominaler Skalierung anstelle einer exponentiellen Skalierung der Anzahl der Qubits. Bei Nicht-Clifford-Schaltungen wird weiterhin die bestehende Simulationsmethode mit Zustandsvektoren verwendet. Diese Optimierung ist für die Benutzer nicht erkennbar und erfordert keine Änderungen am Code.Zum Beispiel:
from qiskit import QuantumCircuit from qiskit.providers.basic_provider import BasicSimulator # Clifford circuit (Bell state) qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0, 1) qc.measure([0, 1], [0, 1]) # Automatically uses optimized StabilizerState simulation backend = BasicSimulator() result = backend.run(qc, shots=1000).result() counts = result.get_counts()
Funktionen der Quanteninformation
-
Es wurde die
PauliLindbladMap.generators()Methode hinzugefügt, die einen bequemeren Zugriff auf die Generatorterme der Map bietet. Dies ist ein Alias für die bereits vorhandenePauliLindbladMap.get_qubit_sparse_pauli_list_copy()Methode und entspricht den in Aer und Runtime für ähnliche Klassen verwendeten Namenskonventionen. -
PauliEs wurde dieSparseObservable.evolve()Methode hinzugefügt, die einSparseObservablemit einem konjugiert. Intern wird hierfür eine statische Nachschlagetabelle verwendet, um Matrixberechnungen zu vermeiden.Beispiel:
from qiskit.quantum_info import SparseObservable, Pauli obs = SparseObservable("Y") pauli = Pauli("X") evolved = obs.evolve(pauli)
Funktionen des Transpilers
-
Collect2qBlocksDen Analyse-DurchläufenCollect1qRunsund wurde ein neuesfilter_fnArgument hinzugefügt. Mit dieser optionalen Funktion lassen sich die erfassten Schaltkreise nach benutzerdefinierten Kriterien filtern, um beispielsweise nur Einzel-Qubit-Läufe mit mindestens einem Hadamard-Gatter oder nur 2-Qubit-Blöcke mit mindestens 3 CX-Gattern zurückzugeben. -
SynthesizeRZRotationsEs wurde ein neuer Transpiler-Durchlauf hinzugefügt, der alle Rotationsgatter für einzelne QubitsRZGatemit Gleitkomma-Winkeln durch äquivalente Clifford+T-Sequenzen ersetzt.Die Genauigkeit der Synthese lässt sich entweder durch die Angabe eines
approximation_degreeoder alternativ durch die explizite Festlegung sowohlsynthesis_errorvon als auchcache_errorvon steuern.Beispielverwendung:
from qiskit import QuantumCircuit from qiskit.transpiler.passes import SynthesizeRZRotations qc = QuantumCircuit(1) qc.rz(1.23, 0) rz_synthesis_pass = SynthesizeRZRotations(approximation_degree=0.9999) synthesized_qc = rz_synthesis_pass(qc) synthesized_qc.draw("mpl")
-
XXPlusYYGateDasStandardEquivalenceLibraryenthält nun eineRXXGateauf / basierendeRYYGateÄquivalenz fürXXMinusYYGate, die der bereits für vorhandenen entspricht. -
SubstitutePi4RotationsDer Transpiler-Durchlauf wurde erweitert, um weitere Standardgatter zu verarbeiten: -
Es wurde eine Funktion
clifford_t_pass_manager()hinzugefügt, die einen Pass-Manager für die Transpilierung in Clifford+T-Basissätze erstellt. Diese Funktion wird automatisch aufgerufen,generate_preset_pass_manager()wenn die Zielbasis aus Clifford+T-Gattern besteht.Die generierte Transpilations-Pipeline besteht aus den folgenden Schritten:
- Initialisierung : Zerlegt größere Gatter in 1-Qubit- und 2-Qubit-Gatter und führt logische Optimierungen durch.
- Layout : Wendet die Standard-Layoutstrategie für kontinuierliche Basissätze an.
- Routing : Wendet die für kontinuierliche Basissätze verwendete Standard-Routing-Strategie an.
- RZ-Transformation : Transformiert die Schaltung in die Clifford-RZ-Basis.
- RZ-Optimierung : Optimiert die Schaltung innerhalb der Clifford+RZ-Basis.
- T-Transformation : Transformiert die Schaltung in die Clifford+T-Basis.
- T-Optimierung : Optimiert die Schaltung innerhalb der Clifford+T-Basis.
- Planung : Wendet die Standard-Planungsstrategie an, die für kontinuierliche Basissätze verwendet wird.
Diese Phasen befinden sich noch im Versuchsstadium und können sich ändern. Insbesondere sind sie noch nicht als Plugins für die Transpiler-Stufe verfügbar (im Gegensatz zu den Stufen für kontinuierliche Basissätze).
Um optimale Ergebnisse zu erzielen, sollten Sie erwägen, sowohl als auch in die angegebene Clifford+T-Basis aufzunehmen und so viele Clifford-Gatter wie möglich einzubeziehen. Zum Beispiel:
basis_gates = get_clifford_gate_names() + ["t", "tdg"] -
Die Standard-Äquivalenzbibliothek wurde erweitert und verfeinert:
-
Der Optimierungsdurchlauf des
OptimizeCliffordTTranspilers akzeptiert nun einbasis_gatesArgument und bevorzugt Zerlegungen, die Clifford-Gatter aus der Zielbasis verwenden. -
Dem
LitinskiTransformationPass wurde ein neues Argument namensinsert_barrierhinzugefügt. Wennfix_clifford=Trueundinsert_barrier=True, wird zwischen dem auf dem Pauli-Prinzip basierenden Rechenteil der Schaltung und den abschließenden Clifford-Operatoren eine Barriere eingefügt. -
Dem
LitinskiTransformationPass wurde ein Argumentuse_pprhinzugefügt, das – sofernTrue– das Rust-nativePauliProductRotationGateverwendet, um Pauli-Produkt-Rotationen darzustellen. Dies verbessert die Leistung und die Ergonomie, da dasPauliProductRotationGatedirekt einzelne Pauli-Produkte darstellt, anstatt allgemeine Summen von Paulis. Wennuse_ppr=False(Standardeinstellung), verwendetPauliEvolutionGateder Durchlauf weiterhin Objekte zur Darstellung der Drehungen. -
ConvertToPauliRotationsEs wurde ein neuer Transpiler-Durchlauf hinzugefügt, der einen Quantenkreis, der Standardgatter für ein, zwei und drei Qubits sowie Barrieren und Messungen enthält, in einen äquivalenten Schaltkreis umwandelt, derPauliProductRotationGateGatter undPauliProductMeasurementAnweisungen enthält. -
Der
RemoveIdentityEquivalentTranspiler-Durchlauf läuft nun standardmäßig im Multithread-Modus. Dadurch wird die Laufzeitleistung des Durchlaufs verbessert, wenn dieser auf großen Schaltkreisen ausgeführt wird. Sie können das Threading-Verhalten mithilfe derRAYON_NUM_THREADSUmgebungsvariable steuern. Informationen zur Verwendung dieser Umgebungsvariablen finden Sie in der Dokumentation der Funktion. -
Dem
SabrePreLayoutPass wurde ein neues Argumentmin_distancehinzugefügt, das die Entfernung für den ersten Durchlauf von „ VF2 “ mit der erweiterten Kopplungskarte festlegt. Bei dieser Einstellungmin_distance > 1werden alle Prüfungen auf kleinere Entfernungen übersprungen, insbesondere die Prüfung „ distance-1 “, die der Ausführung desVF2Layout„Pass“ entspricht. -
Das
call_limit_vf2Argument des PassesSabrePreLayoutkann nun ein 2-Tupel sein, ähnlich wie dascall_limitArgument vonVF2Layout. Handelt es sich um ein 2-Tupel, wird zunächst das erste Element verwendet, bis die erste Übereinstimmung gefunden wird; danach wechselt die Begrenzung zum zweiten Element. -
Der Optimierungsdurchlauf des
OptimizeCliffordTTranspilers ersetzt nun auch Ketten aufeinanderfolgender Clifford+T-Gatter, wenn die Anzahl der T-Gatter gleich bleibt, die Anzahl der Clifford-Gatter jedoch reduziert wird. -
Die Fast-Path-Hauptschleife von
UnitarySynthesisspeichert nun ihre Hilfsobjekte für den Zwei-Qubit-Dekompositor intern aggressiv im Cache, wodurch der gesamte Durchlauf an seiner standardmäßigen Aufrufposition in den voreingestellten Durchlaufmanagern um etwa 2x schneller wird.
Visualisierungsfunktionen
-
Die
CouplingMap.draw()Funktion unterstützt nun die Übergabe von Layout-Methoden, die inrustworkx.visualization.graphviz_draw()dem intern aufgerufenen Verfahren verwendet werden sollen. Auf diese Weise können Sie den Graphviz-Layout-Algorithmus anpassen, der zur Visualisierung desCouplingMapObjekts verwendet wird. -
circuit_drawer()Es wurde ein neuerbarrier_label_lenParameter (Standardwert 16) zuQuantumCircuit.draw()und hinzugefügt. Wenn eineBarrierBezeichnung diese Länge überschreitet, wird sie gekürzt und"..."angehängt. Dadurch wird verhindert, dass sehr lange Barriere-Beschriftungen die Schaltpläne unlesbar machen. Der Parameter wird von allen drei Drawer-Backends (text, mpl, latex) unterstützt.
Hinweise zur Aktualisierung der C-API
-
QuantumCircuitqk_circuit_to_python()gibt nicht mehr einen vollständigen zurück, sondern nur noch den Typ vonQuantumCircuit._data. Die neue Methodeqk_circuit_to_python_full()bietet die bisherige Funktionalität. -
qk_obs_to_python()erfordert nun die Verantwortung für die angegebene Beobachtungsgröße und übernimmt diese auch. Sie dürfen die Beobachtungsgröße nach dem Aufruf dieser Funktion nicht mehr freigeben. Dies steht im Einklang mit allen anderen*_to_pythonFunktionen der C-API und vermeidet den Mehraufwand, der durch das Klonen der Daten entsteht. -
QkInstruction.paramswurde von einem Zeiger aufdoublein einen Zeiger aufconst QkParam *Objekte geändert. Diese Änderung erfolgte, weil Gate-Parameter in der C-API nicht mehr auf feste numerische Werte beschränkt sind, sondern auch parametrisierte Ausdrücke mit ungebundenen Symbolen sein können, die durch einQkParam *„.“ dargestellt werden. -
Das
QISKIT_VERSION_NUMERICSymbol wurde aus der Header-Datei entfernt, nachdem es in Qiskit 2.2 als veraltet gekennzeichnet worden war. Verwenden SieQISKIT_VERSION_HEXstattdessen, das korrekterweise Informationen zum Vorabveröffentlichungsstatus enthält. -
Angepasst
QkTargetOp, um als Typ für seinQkTargetOp.paramsAttribut zu verwendenQkParam. Den Benutzern den Zugriff auf beliebige freie oder feste Parameter in einem Vorgang ermöglichen. -
Die
qk_transpile_stage_optimization()Funktion verfügt über ein neues obligatorisches Argument,layoutdas einen veränderblichen Zeiger auf einQkTranspileLayoutObjekt entgegennimmt, welches den Aufbau der Transpile-Pipeline bis zu diesem Zeitpunkt darstellt.qk_transpile_stage_routing()In der Regel handelt es sich dabei um das Objekt, das vonqk_transpile_stage_layout()und zurückgegeben wird. Dies ist notwendig, da auf Optimierungsstufe 3 in der Optimierungsphase derVF2PostLayoutDurchlauf ausgeführt wird, der das Layout verändern kann, und dies muss bei der Ausführung der Phase nachverfolgt werden.
OpenQASM Hinweise zum Upgrade
- Der zuvor von
qiskit.qasm3OpenQASM 3 generierte Code enthielt keinen Typ für die Iteratorvariable. Der Exporter enthält nun einen expliziten Typ gemäß der Spezifikation „ OpenQASM “ ( 3.0 ).
Hinweise zum Synthesis-Upgrade
- Das von
SolovayKitaevDecomposition.save_basic_approximations()undSolovayKitaevDecomposition.load_basic_approximations()verwendete Serialisierungsformat wurde aktualisiert. Dateien, die mit Qiskit 2.3 oder einer früheren Version gespeichert wurden, sind nicht kompatibel mit Qiskit 2.4 oder einer späteren Version.
Hinweise zum Transpiler-Update
- Die Verwendung des internen Zufallszahlengenerators für den
CSPLayoutDurchlauf wurde geändert. Das bedeutet, dass der Durchlauf bei einem festen Startwert möglicherweise andere Ergebnisse liefert als in früheren Versionen. Es kann nicht garantiert werden, dass die Ergebnisse der Startwertgenerierung zwischen dentranspilerverschiedenen Versionen stabil bleiben. Sollten Sie sich jedoch auf die genauen Ergebnisse dieses Durchlaufs verlassen haben, können Sie den Durchlauf in einer früheren Version ausführen, die Ausgabe speichernqpyund sie dann in der neuesten Version laden.
Verschiedene Hinweise zum Upgrade
-
Qiskit basiert nun auf dem Image „ manylinux_2_28 “, wodurch die erforderliche Version auf
glibcHosts mit „ Linux “ von „ 2.17 “ auf „ 2.28 “ angehoben wird. Dies sollte unter Debian 10+ (Buster), Ubuntu 18.10 + (Cosmic), Fedora 29+ und RHEL 8+ unterstützt werden.NumPy Unter Python 3.14 wird bereits glibc 2.28 benötigt, sodass Qiskit in der Praxis auf Plattformen, die auf die Abhängigkeiten von manylinux2014 beschränkt sind, mit späteren Versionen von Python ohnehin nicht einsetzbar war. Die glibc-Version wurde für alle Versionen von „ Python “ aktualisiert, um die Konsistenz beim Build zu gewährleisten.
Es ist möglicherweise weiterhin möglich, Qiskit aus dem Quellcode
glibcmit älteren Versionen von zu kompilieren, allerdings wird dies nicht mehr im Rahmen der CI getestet.
Veraltete Funktionen der C-API
- Verwenden Sie
qk_transpiler_standalone_optimize_1q_sequences()nicht mehr, sondern stattdessen,qk_transpiler_pass_standalone_optimize_1q_sequences()da dies der Namenskonvention der eigenständigen C-Transpiler-Pässe besser entspricht.
Änderungen am Build-System
-
Die C-API-Header werden nun nicht mehr im Build-Skript von erstellt
qiskit-cext, sondern durch eine im Repository enthaltene Binärdatei in denqiskit-bindgen-cDistributionsordner eingebunden. DasmakeRezeptmake cheader(und das vollständigemake c) erzeugt nach wie vor das vollständige Distributions-Artefakt indist/c. -
Das Build-System liest nun die Umgebungsvariable, um
QISKIT_BUILD_PROFILEzu entscheiden, ob imreleaseModus oder imdebugModus gebaut werden soll. Wenn dies nicht festgelegt ist,pip install .wird standardmäßig (weiterhin) der Release-Modus undpip install -e .der Debug-Modus verwendet. -
Die Mindestversion von CMake, die zum Erstellen und Ausführen der C-API-Testsuite erforderlich ist, wurde von 3.27 auf 3.20 gesenkt. Qiskit legt sich nicht auf eine bestimmte Richtlinie hinsichtlich der erforderlichen CMake-Version fest, bemüht sich jedoch nach Kräften, die Repositorys gängiger und weiterhin unterstützter Linux -Distributionen abzustimmen.
-
Qiskit verwaltet seine zusätzlichen Entwicklungsabhängigkeiten nun mithilfe separater Einträge in Abhängigkeitsgruppen gemäß PEP 735 für verschiedene Aufgaben und ersetzt damit die alten, monolithischen Dateien „ requirements-dev.txt “ und „ requirements-optional.txt “.
-
Pakete, deren Erstellung von der Qiskit-C-API abhängt, können nun Qiskit als Build-Abhängigkeit im „ Python “-Bereich angeben und anschließend die Header-Dateien über
qiskit.capi.get_include()suchen.
Bekannte Probleme
-
Qiskit v2.2 und v2.3 können unlesbare QPY-Dateien für Schaltkreise erzeugen, die ein
ParameterExpressionenthalten, bei denen alle darin enthaltenenParameterInstanzen aus dem Endausdruck herausgerechnet wurden. Wenn beispielsweise der Ausdruck0*x + 1.5in einem Schaltkreis vorkommt, erzeugen sowohl Qiskit v2.2 als auch v2.3 eine QPY-Datei, die aufgrund von Fehlern bei der QPY-Generierung von keiner Qiskit-Version gelesen werden kann, auch nicht von diesen selbst und v2.4.Dieser Fehler tritt (zumindest in Qiskit v2.4 ) in der Regel als
QpyErrormit einer Meldung wie „malformed expression: stack was empty before expression completed“ auf.
Fehlerkorrekturen
-
qargsQuantumCircuit.append()lehnt nun doppelte klassische Bits imcargsArgument korrekt ab, was dem Verhalten von entspricht. Zwar lassen sich klassische Bits theoretisch kopieren – im Gegensatz zu Quantenbits –, doch kann das interne Datenmodell von Qiskit die mehrfache Verwendung desselben Bits nicht abbilden, und Schaltungen, die dies nutzen, würden aufgrund der Verletzung der Annahmen des Datenmodells in der Regel zu internen Bibliotheksfehlern oder zu unsinnigem Verhalten des nachgelagerten Simulators führen. -
QkTargetOp.num_paramsEs wurde eine Diskrepanz behoben,QkTargetOpbei der die Länge des inQkTargetOp.paramsgespeicherten Arrays nicht mit der von angezeigten Anzahl übereinstimmte.QkTargetOp.num_paramsNANPlatzhalterparameter werden nun durch dargestellt, und die Länge des Arrays beträgt immer. Dieser Fehler trat ausschließlich in der Version „ 2.3.0rc1 “ auf. -
QuantumCircuit.compose()Der Zeitaufwand, der linear zur Anzahl der Bits der Basisschaltung ist, wurde behoben. Dies könnte zu Leistungsproblemen führen, wenn wiederholt kleine Schaltungen ohne clbits auf einer Basis mit einer sehr großen Anzahl von clbits zusammengesetzt werden. -
CountsObjekte geben nun beim Erstellen korrekt einen Fehler aus, wenn die Schlüssel nicht alle das gleiche Format haben. -
Es wurde ein Fehler behoben,
CommutationCheckerdurch den bestimmte Rust-basierte Gatter, wie beispielsweiseUnitaryGate, die Größenbeschränkungen für Matrizen umgehen konnten, was zur Erstellung übermäßig großer Matrizen führte. -
evolved_operator_ansatz()Es wurde ein Fehler behoben, bei dem die Einstellung desparameter_prefixArguments auf eine einzelne Zeichenkette je nach Reihenfolge der Operatoren zu einem Fehler führen konnte, wenn Identitätsterme entfernt wurden. -
RuntimeErrorEs wurde ein Fehler behoben, bei dem die Schleifenvariable von aForLoopOpin der Parametertabelle des äußeren Schaltkreises falsch nachverfolgt wurde, was dazu führte, dass sie inQuantumCircuit.parametersa erschien und a einen internen Fehlerassign_parameters()auslöste. Einzelheiten finden Sie unter Nr. 15657. -
Initialize.inverse()Eine unklare Fehlermeldung in wurde behoben; nun wird sofort ein eindeutiger Fehler ausgegeben, der darauf hinweist, dass die Anweisung nicht invertierbar ist. Siehe #15595. -
Die MCX-Syntheseverfahren wurden korrigiert, um den Randfall, bei dem
num_ctrl_qubitsist, korrekt zu behandeln. #15665 behoben. -
QkTranspileOptionsEin Problem bei denqk_transpile()C-API-Funktionen undqk_transpile_stage_optimization()bei der Verwendung vonoptimization_level=3in wurde behoben. Bisher versäumte es die interne Logik zur Verfolgung des Mindestpunktwerts, den DAG zu aktualisieren, nachdem eine bessere Schaltung gefunden worden war, was zu Schaltungen mit suboptimaler Tiefe und Größe führen konnte. -
ParameterExpressionInstanzen mit ausgelöschten Variablen (wiex - x) behalten nun auch nach einem Hin- und Rücklauf durch QPY und Pickle den Verweis aufxbei. -
ParameterExpressionInstanzen, deren Auswertungsergebnis ein reiner Wert ist (wie z. B.0*x + 2), werden nun erfolgreich durch QPY und Pickle hin- und zurückübertragen. -
PauliEvolutionGateEs wurde ein Fehler behoben, bei dem die durchschnittliche Gate-Genauigkeit etwas höher war als die tatsächliche Genauigkeit. Dies hatte Folgewirkungen bei Durchgängen wie beispielsweiseRemoveIdentityEquivalent, bei denen die Tore in etwas größeren Winkeln entfernt wurden, als es eigentlich hätte sein sollen. Dies wurde nun behoben, und esPauliEvolutionGateist gewährleistet, dass das Abschneidungen genauso behandelt wie andere Standard-Rotationsgatter. -
Es wurde eine Kommutativitätsprüfung zwischen zwei
PauliProductMeasurementBefehlen eingeführt, falls beide Befehle auf dasselbe klassische Bit zugreifen. In diesem Fall überschreibt die spätere Messung das Ergebnis der früheren Messung, weshalb ein Vertauschen der beiden Messanweisungen innerhalb des Quantenschaltkreises im Allgemeinen ungültig ist. -
Es wurde ein Fehler behoben
synth_qft_line(), sodass Schaltungen mit 32 oder mehr Qubits nun korrekt synthetisiert werden. -
Ein Fehler im Transpiler-Durchlauf
ElidePermutationswurde behoben, der bei der Verarbeitung von Permutationen einzelner Qubits zu einem Absturz führte. -
Es wurde ein Problem behoben, das auftrat,
QuantumCircuit.compose()wenn die Funktion mitfront=Trueund einer explizitenqubitsZuordnung aufgerufen wurde; in diesem Fall wurde fälschlicherweise einValueErrorausgelöst, anstatt den korrekten Schaltkreis zurückzugeben. Siehe Nr. 15834. -
Die
Gate.control()Methode wurde korrigiert, um den Randfall, beinum_ctrl_qubitsdem gilt, korrekt zu behandeln. Zuvor konnte dies zu einem Fehler oder einem Core-Dump führen. Nun gibt es eine Kopie des ursprünglichen Gates zurück. Problem Nr. 15666 behoben. -
QuantumCircuit.mcrx()Die Methoden,QuantumCircuit.mcry(),QuantumCircuit.mcrz(),QuantumCircuit.mcp(), undQuantumCircuit.mcx()wurden korrigiert, wenn mehrfach gesteuerte Gates ohne Steuerqubits angehängt werden. Bisher konnte dies zu Speicherüberläufen führen. Dieser Fall wird nun korrekt bearbeitet. Problem Nr. 15664 behoben. -
Die Definition von
MCPhaseGatewurde für den Fall von -Steuerqubits korrigiert. -
Es wurde ein Problem behoben,
BasisTranslatorbei dem bei Schaltkreisen mit verschachtelten Kontrollflussoperationen die Transformation nicht auf deren Kontrollflussblöcke angewendet wurde. Siehe #13162, #14025 und #15734. -
Der Exporter „ OpenQASM 3“ (
qiskit.qasm3) enthält nun den Typ des Iterators in „for“-Schleifen. Behebt #13725. -
QuantumCircuit.remove_final_measurements()gibt keine irreführende Warnung mehr aus, dass versucht wird, Register hinzuzufügen, wenn die Funktion in einer Schaltung mit festem Layout aufgerufen wird.
Sonstige Hinweise
- Der
SabrePreLayoutPass wurde vereinfacht, um dieVF2LayoutVerbesserungen im Pass zu nutzen.VF2LayoutDer aufwendige Nachbearbeitungsschritt zur Minimierung „überflüssiger“ Kanten im Layout entfällt nun, da diese Optimierung nun effizienter durch den internen Bewertungsmechanismus von … übernommen wird. Folglich ist dasimprove_layoutArgument nun hinfällig und hat keine Wirkung mehr.