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.kmsSynthese-Plugin inqiskit.synthesisbehandelt 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
HighLevelSynthesisTranspiler-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 AusnahmeQiskitErroroder Unterklasse ausgelöst wird.Problem Nr. 15610 behoben.
-
Die Standardsynthese von
UnitaryGatebeim ZugriffUnitaryGate.definitionund AufrufUnitaryGate.control()für Gatter, an denen mehr als zwei Qubits beteiligt sind, stützt sich intern auf dieqs_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 stattdessenIsometrydie Zerlegung aus verwendet. Dies führt zwar zu einer weniger effizienten Zerlegung,qs_decomposition()dient jedoch als Ausweichlösung, fallsqs_decomposition()fehlschlägt. -
Es wurde ein Fehler behoben,
ParameterExpression.sympify()bei dem bei asymmetrischen arithmetischen Operationen (wie ** oder -) die Operanden bei bestimmten Kombinationen vonParameter,ParameterExpressionund 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 erstelltQuantumCircuit.ensure_physical()wurden, abstürzte, wenn ein benutzerdefiniertes Register namens „ancilla“ vorhanden war. -
Es
BreakLoopOpwurde ein Fehler behoben, durchContinueLoopOpden in bestimmten Transpiler-Durchläufen fälschlicherweise als Kontrollflussoperationen interpretiert wurden, was sich in derAttributeErrorAuslösung eines äußern konnte. Siehe Nr. 15579. -
Behebt einen Fehler, der dazu
qpy.load()führte, dass bei Schaltkreisen, die mit erstelltSabreLayoutwurden, 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()unddump()) 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()unddump()) führt nun die korrekte Escape-Verarbeitung für Bezeichner durch, deren Name mit einer ASCII-Ziffer beginnt. -
Die Methoden
SparsePauliOp.from_list()und leitenSparsePauliOp.from_sparse_list()nun automatisch den Datentyp des Koeffizienten ab, wenn dasdtypeArgument 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
-
Es wurde eine Funktion hinzugefügt, mit der die Kompatibilität eines beliebigen
qk_target_instruction_supported()Gatters oder Befehls mit der Instanz von überprüft werdenQkTargetkann. Diese Überprüfung erfolgt auf der Grundlage des Namens, der qargs und der Parameter der angegebenen Anweisung. -
Es wurde eine Funktion hinzugefügt
qk_target_entry_set_name(), mit der der Name eines vorhandenen Zieleintrags festgelegt werden kann. -
Es wurde eine neue Funktion
qk_circuit_library_quantum_volume()hinzugefügt, um eine Schaltung für ein Quantenvolumenmodell zu generieren. -
Es wurden Möglichkeiten zum Durchlaufen und Überprüfen der Gate-Map eines
QkTarget. hinzugefügt. Die folgenden Methoden wurden hinzugefügt:qk_target_op_num_properties()qk_target_op_index()qk_target_op_name()qk_target_op_qargs_index()qk_target_op_qargs()qk_target_op_props()
Und die folgende Darstellung wurde hinzugefügt:
QkInstructionProperties: um das darzustellenInstructionProperties.
Beispiel:
// Create Target with a mix of global and non-global gates. QkTarget *target = qk_target_new(2); // Create a CX entry QkTargetEntry *cx_entry = qk_target_entry_new(QkGate_CX); uint32_t qarg_samples[2][2] = { {0, 1}, {1, 0}, }; double props[2][2] = { {2.7022e-11, 0.00713}, {3.0577e-11, 0.00713} }; for (int i = 0; i < 2; i++) { qk_target_entry_add_property(cx_entry, qarg_samples[i], 2, props[i][0], props[i][1]); } qk_target_add_instruction(target, cx_entry); // Create an SX entry QkTargetEntry *sx_entry = qk_target_entry_new(QkGate_SX); for (int i = 0; i < 2; i++) { uint32_t qargs[1] = {i}; qk_target_entry_add_property(sx_entry, qargs, 1, 35.5e-9, 0.); } qk_target_add_instruction(target, sx_entry); // Create an H entry qk_target_add_instruction(target, qk_target_entry_new(QkGate_H)); // Get the size of the size_t target_length = qk_target_num_instructions(target); for (size_t op_idx = 0; op_idx < target_length; op_idx++) { // Allocate space for qargs and props uint32_t *qargs; uint32_t qargs_len; QkInstructionProperties props; // Retrieve the operation's name char *name = qk_target_op_name(target, op_idx); size_t num_props = qk_target_op_num_properties(target, op_idx); for (size_t props_idx = 0; props_idx < num_props; props_idx++) { // Populate qargs qk_target_op_qargs(target, op_idx, props_idx, &qargs, &qargs_len); // Populate properties qk_target_op_props(target, op_idx, props_idx, &props); } // Free the name string qk_str_free(name); } -
QkTargetbietet seinen Benutzern nun die Möglichkeit, Vorgänge direkt daraus abzurufen. Die folgenden Methoden wurden hinzugefügt:Und die folgende Darstellung wurde hinzugefügt:
QkTargetOp: Um eine Operation in derQkTarget. darzustellen
-
Die C-API stellt
QkParamnun zur Darstellung von Gate-Parametern bereit, darunter Symbole und parametrisierte Ausdrücke. DieQkParamSchnittstelle selbst unterstützt symbolische Berechnungen, einschließlich Standard-Arithmetikoperationen und trigonometrischer Funktionen. Zum Beispiel:QkParam *x = qk_symbol_new("x"); // a symbol called "x" QkParam *y = qk_symbol_new("y"); // a symbol called "y" QkParam *val = qk_symbol_from_double(2.0); // the value 2.0 QkParam *out = qk_symbol_zero(); // to store the final expression // build 2 sin(x + y) qk_param_add(out, x, y); // out = x + y qk_param_sin(out, out); // out = sin(out) qk_param_mul(out, out, val); // out = out * 2 qk_param_free(x); qk_param_free(y); qk_param_free(val); qk_param_free(out); -
Die C-API kann nun als undurchsichtiges
DAGCircuitdarstellen undQkDagbearbeiten. Im Zusammenhang mit dem DAG wurden folgende Funktionen hinzugefügt:qk_dag_new()qk_dag_add_quantum_register()qk_dag_add_classical_register()qk_dag_free()qk_dag_copy_empty_like()qk_dag_num_qubits()qk_dag_num_clbits()qk_dag_num_op_nodes()qk_dag_node_type()qk_dag_qubit_in_node()qk_dag_qubit_out_node()qk_dag_clbit_in_node()qk_dag_clbit_out_node()qk_dag_wire_node_value()qk_dag_op_node_clbits()qk_dag_op_node_gate_op()qk_dag_op_node_kind()qk_dag_op_node_num_clbits()qk_dag_op_node_num_params()qk_dag_op_node_num_qubits()qk_dag_op_node_qubits()qk_dag_op_node_unitary()qk_dag_apply_barrier()qk_dag_apply_gate()qk_dag_apply_measure()qk_dag_apply_reset()qk_dag_apply_unitary()qk_dag_get_instruction()qk_dag_compose()qk_dag_topological_op_nodes()qk_dag_substitute_node_with_dag()qk_dag_predecessors()qk_dag_successors()
-
Die
QkDagNodeTypeAufzählung wurde hinzugefügt, um den Typ eines DAG-Knotens zu unterscheiden. Dies ist der Rückgabetyp vonqk_dag_node_type(). -
Die
QkOperationKindAufzählung wurde hinzugefügt, um verschiedene native Operationstypen zu unterscheiden. Dies ist der Rückgabetyp vonqk_dag_op_node_kind(). -
Wurde hinzugefügt,
qk_circuit_copy_empty_like()um eine Kopie der angegebenen Schaltung zu erstellen, als Spiegelbild vonQuantumCircuit.copy_empty_like(). -
Neue Aufzählungen für die Verwendung mit einigen Schaltkreis- und DAG-API-Funktionen hinzugefügt, um Kopiermodi festzulegen:
-
Die
QkDagNeighborsStruktur wurde hinzugefügt, die den Rückgabetyp vonqk_dag_successors()undqk_dag_predecessors()bildet, sowie die zugehörige Freigabefunktionqk_dag_neighbors_clear(). -
Es wird eine neue Struktur hinzugefügt,
QkNeighborsdie eine Darstellung des durch ein impliziertenTargetZwei-Qubit-Kopplungsgraphen darstellt. Es wird durch die Funktionnewqk_neighbors_from_target()initialisiert, mitqk_neighbors_clear()cleargelöscht und verfügt über eine Hilfsfunktionqk_neighbors_is_all_to_all(). -
Es wurden die Funktionen
qk_dag_to_circuit()qk_circuit_to_dag()und hinzugefügt, um die Umwandlung von DAG in Schaltkreise bzw. von Schaltkreisen in DAG zu unterstützen. -
Die Funktionen
qk_transpiler_pass_standalone_unitary_synthesis()qk_transpile()und unterstützen nun die Synthese von Objekten mit 3 oderUnitaryGatemehr Qubits in einer Schaltung. In Qiskit 2.2 wurde dies zunächst nicht unterstützt, da der zugrunde liegende Synthesealgorithmusqs_decomposition()für die unitarische Synthese von 3 oder mehr Qubits ursprünglich in Python geschrieben war; nachdem er nun jedoch nach Rust portiert wurde, ist diese Funktionalität auch von C aus verfügbar. -
Der C-API wurden neue Funktionen zum Ausführen von Transpiler-Stufen hinzugefügt. Dabei handelt es sich um folgende Funktionen:
Diese Funktionen werden verwendet, um diese Phasen aus dem voreingestellten Pass-Manager auf einem
QkDagObjekt auszuführen. Das Ziel dieser Funktionen besteht darin, in Kombination mit benutzerdefinierten Transpiler-Durchläufen zusammensetzbare Transpiler-Workflows aus C zu ermöglichen. -
Es wurde eine neue Funktion
qk_transpile_layout_generate_from_mapping()hinzugefügt, mit der ein benutzerdefiniertes Layout generiertQkTranspileLayoutwerden kann, dessen Ausgangslayout aus einem Zuordnungsarray festgelegt wird. Diese Funktion dient dazu, die Erstellung eines Layout-Objekts für benutzerdefinierte Layout-Transpiler-Durchläufe zu ermöglichen. -
Die beiden Formen der „perfekten“ Layout-Auswahl über den Subgraph-Isomorphismus-Algorithmus „ VF2 “ sind nun als eigenständige Transpiler-Durchläufe in der C-API verfügbar. Diese Funktionen sind
Diese unterscheiden sich darin, wie die Richtungsabhängigkeit und die Gatesets von Interaktionen behandelt werden.
exacterfordert, dass Matches alle Gates nativ direkt unterstützen, währendaveragedavon ausgeht, dass weitere Transpiler-Durchläufe die Gates in den unterstützten Satz eines bestimmten Qubits oder einer bestimmten Verbindung zerlegen.Diese Funktionen verwenden eine gekapselte Version der Konfiguration „ VF2 “ (
QkVF2LayoutConfiguration), die Setter-Methoden für jede der Optionen enthält. Dazu gehört auch, den Zugriff auf die neue Form descall_limitArguments mit zwei Grenzwerten zu ermöglichen.
Schaltkreise Funktionen
-
Es wurde eine neue Anweisungsklasse hinzugefügt,
PauliProductMeasurementdie 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 oder , 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
PauliProductMeasurementkann aus einem instanziiertPauliwerden, wobei der Pauli-Vektor eine Phase von enthalten darf, jedoch nicht von oder . 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 umcircuit_to_dag(). -
ParameterExpressionverfügt nun über einnum_parametersAttribut, dessen Wert der Länge seinerparametersMenge entspricht, das jedoch mit geringerem Rechenaufwand berechnet wird.
OpenQASM Funktionen
- Der Exporter „ OpenQASM
qasm2.dumps()2“ unterstützt nun die Ausgabe einfacherIfElseOpEin-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
SparseObservableObjekte, die als Parameter von Objekten verwendet werden. Dies ermöglicht insbesondere die SerialisierungPauliEvolutionGatevon Objekten, die diesen Operator intern verwenden, und die Nutzdaten des Evolution-Gates werden aktualisiert.
Quanteninformationsmerkmale
-
Als Spiegel
Statevector.from_circuit()vonOperator.from_circuit()… hinzugefügt. Dadurch lässt sich einStatevectordirekt 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 verbessertClifford.compose(), wenn sie mitfront=Trueund einem aufgerufen werden, das ausschließlichQuantumCircuitClifford-Gatter enthält. Bisher wurde der Schaltkreis zunächst vollständig in einCliffordObjekt integriert, und erst danach wurden die beiden Objekte miteinander kombiniert. Nun wird dieCliffordBasis iterativ aktualisiert, was bei kleinen Schaltungen deutlich schneller ist. -
Die
PauliLindbladMap.parity_sample()Methode wurde hinzugefügt. Diese Methode ähnelt stark der bisherigenPauliLindbladMap.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 beispielsweiseis_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,
CommutativeOptimizationder unter Ausnutzung von Kommutativitätsbeziehungen die Beseitigung und Zusammenführung von Gaten durchführt. Der Pass vereint und erweitert die Funktionen vonCommutativeCancellationundCommutativeInverseCancellation.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
UnitarySynthesisTranspiler-Durchlauf wurde einefallback_on_defaultneue Option hinzugefügt. Diese Option gilt, wenn der Durchlauf mit einem nicht standardmäßigen Synthese-Plugin aufgerufen wird, das über das Argumentmethodangegeben 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 aufTruegesetztfallback_on_defaultist, ruft der Pass stattdessen das PluginDefaultUnitarySynthesisauf, 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,
RossSelingerSynthesisdas Einzel-Qubit-Unitäre-Gatter mithilfe des Ross-Selinger-Algorithmus synthetisiert und einen Einzel-Qubit-Quantenschaltkreis erzeugt, der aus Clifford-, „ “- und „ “-Gattern besteht.Das Plugin wird vom
UnitarySynthesisTranspiler-Durchlauf aufgerufen, wenn der Parameter auf"gridsynth"gesetztmethodist. -
Beim Transpiling in die Clifford+T-Basis verwendet der
UnitarySynthesisTranspiler-Pass nun standardmäßig einen Clifford+T-Synthesealgorithmus, um Einzelqubit-Unitarien zu approximieren.Ebenso verwendet das
DefaultUnitarySynthesisPlugin 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 umdag_to_circuit(). -
Es wurde ein neuer Transpiler-Durchlauf
SubstitutePi4Rotationshinzugefügt, der Einzelqubit-RZGate,RXGateundRYGateRotationsgatter, deren Winkel ganzzahlige Vielfache von sind, in diskrete Sätze von Clifford-,TGateundTdgGateGattern umwandelt. Beachte, dass ungerade Vielfache von ein einzelnesTGateund sowie einige Clifford-Gatter erfordern, während geradeTdgGateVielfache von oder, äquivalent dazu, ganzzahlige Vielfache von ausschließlich mit Clifford-Gattern geschrieben werden können. -
Der Transpiler-Durchlauf
LitinskiTransformationwurde 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 und ) 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 alsPauliEvolutionGateGates) und Z-Messungen in Produkt-Pauli-Messungen (implementiert mithilfe vonPauliProductMeasurementBefehlen). -
Der Optimierungsdurchlauf des
OptimizeCliffordTTranspilers 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 (oder ). Der Durchlauf erfolgt auf einer Kette in einer Zeit, die proportional zur Anzahl der Gates in der Kette ist.
-
Hinzugefügt,
WrapAngles.DEFAULT_REGISTRYenthält die Standardregistrierung fürWrapAngles. Dieses neue Attribut ersetzt das bisherigeWRAP_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 einreverseboolesches Argument. Wenn diese Option aktiviert istTrue, 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 erstellenDAGCircuit.reverse_ops(). -
Die
CommutationCheckerunterstützt nun effiziente Kommutationsprüfungen zwischen den Pauli-basierten GatterfunktionenPauliGate,PauliEvolutionGateund,PauliProductMeasurementindem 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, zuCommutationChecker.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 (dieNonestandardmäßig aufmax_num_qubitsgesetzt 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ücksichtigentranspile()unitary_synthesis_methodnun das Argument bei der Kompilierung in den Clifford+T-Basissatz, wodurch der Aufruf benutzerdefinierter Plugins für die unitäre Synthese ermöglicht wird. -
VF2Layoutund erfasstVF2PostLayoutnun 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_limitArgument vonVF2LayoutundVF2PostLayoutkann 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 dasmax_trialsArgument, da Layouts nun während der Ausführung mit aggressiverem Pruning ausgewertet werden.
Verschiedene Funktionen
- Es wurde die Möglichkeit hinzugefügt, den Erwartungswert von a
SparseObservableaus abgetasteten Bitstrings in der Z-Basis mithilfe dersampled_expectation_value()Funktion zu berechnen.
Anmerkungen zu Upgrades
ConsolidateBlocksliest nun bei der EingabeConsolidateBlocks_qubit_mapeinenPropertySetSchlü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ätzlichennameParameter, 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 aQuantumCircuitoder b addiertDAGCircuitwurden. 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
DAGCircuiteinemQuantumCircuitoder gespeichert sind, musst du die Anweisung dem Schaltkreis neu zuweisen, damit Rust Space die Änderungen übernehmen kann. Wenn beispielsweise Anmerkungen zu einem hinzugefügtBoxOpwerden, das sich bereits in einem Schaltkreis befindet, sollte ein Transpiler-Durchlauf sicherstellen, dass verwendet wird, um dasDAGCircuit.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
ControlFlowOpAnweisungen wieBoxOpin 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
ControlFlowOpInstanzenblöcke verfolgen keinenamemetadataFelder 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ückAnnotatedOperation, wenn das Argument aufTruegesetztannotatedist und eine native Controlled-Gate-Klasse verfügbar ist. Diese Änderung steht im Einklang mit der Verwendung des Argumentsannotatedin der gesamten Standard-Schaltkreisbibliothek und ermöglicht eine effizientere Zerlegung von mit Steuerungsinformationen versehenen Gatterelementen. Die betroffenen Gates sind:- Einzelgesteuerte
H,S,Sdg,U3Y,Z,SX,RX,RY,RZ,SwapundCZGatter; - Doppelt gesteuertes
ZGatter; - willkürlich gesteuerte
Phase,CPhase,MCPhase,U1CU1,,MCU1undMCMTGatter.
- Einzelgesteuerte
-
Der Standardwert des Arguments
annotatedinQuantumCircuit.control()ist nunNonestattFalse. Dies hat keine Auswirkungen auf die eigentlichen Schaltungen, entspricht jedoch dem Standardwert, der in der gesamtenannotatedSchaltungsbibliothek 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
VF2PostLayoutbeioptimization_level=3wurden 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
WrapAnglesTranspiler-Durchlaufs ist nunWrapAngles.DEFAULT_REGISTRY. Der bisherige, stark verschachtelteWRAP_ANGLE_REGISTRYPfad 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
VF2Layoutund logischVF2PostLayoutunverändert bleibt, hat dasmax_trialsArgument nun weitaus weniger Einfluss als Laufzeitbegrenzer, es sei denn, es wird auf den Wert gesetzt1. 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 deterministischencall_limitLaufzeitbegrenzer verwenden; wobei die Anzahl dermax_trialsaufgetretenen vollständigen Layouts misst undcall_limitdie 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 solltenqk_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 voncall_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 Argumentannotated, das entwederFalse,TrueoderNonesein kann. Derzeit wird ein gesteuertes Gatter mithilfe einer speziellen Klasse für gesteuerte Gatter dargestellt, sofern eine solche existiert, unabhängig vom Wert vonannotated; so ist beispielsweise eineXGatezweifach gesteuerte Version eines einCCXGate. Wenn keine eigene Klasse für gesteuerte Gatter existiert, wird das gesteuerte Gatter als dargestelltControlledGate, wennannotated=Falseund als,AnnotatedOperationwennannotated=True. Der Standardwertannotated=Nonewird genauso behandelt wieFalse.In Qiskit 3.0 wird die Einstellung nicht mehr
annotated=Nonezulässig sein und stattdessen die Standardeinstellung auf geändertannotated=Truewerden. 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=Falsedass das bisherige Verhalten beibehalten wird.
Transpiler-Veraltungen
- Das veraltete Serialisierungsformat, das in verwendet wurde und auf dem Pickling der grundlegenden Näherungswerte in Form
SolovayKitaevDecompositioneines Pythondictbasierte, wurde als veraltet markiert. Der Ladevorgang stellt eine potenzielle Sicherheitslücke dar und sollte nur bei vertrauenswürdigen Dateien verwendet werden. Das neue Serialisierungsformat umgeht diese Sicherheitslücke. Die Funktionen zum Erzeugen des alten Formats sowie zum Ladengenerate_basic_approximations()desselben undSolovayKitaevDecomposition.load_basic_approximations()im Initialisierer von sindSolovayKitaevDecompositionveraltet. Verwenden Sie stattdessenSolovayKitaevDecomposition.save_basic_approximations(), um ein Format zu generieren, das sicher im Klasseninitialisierer geladen werden kann.
Ä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__(),QuantumCircuitbei dem Schaltungsparameter nicht vollständig kopiert wurden. Folglich hat eine Änderung vonBoxOpin einer kopierten Schaltung keine Auswirkungen mehr auf die ursprüngliche Schaltung. -
DAGCircuit.apply_operation_back(),apply_operation_back()undcircuit_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,
Optimize1qGatesDecompositionwenn der Durchlauf mit einem initialisiertTargetwurde, 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
BasisTranslatorDurchlauf behoben, bei dem ein Multi-Qubit-Gatter innerhalb einesControlFlowOpBlocks die lokalen Qubit-Indizes verwendete, anstatt die absoluten Indizes aus dem Quellschaltkreis zu verwenden. -
Die Wiederverwendung derselben
ConsolidateBlocksInstanz auf mehreren Kanälen wurde behoben, einschließlich Aufrufen mittranspile()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
ConsolidateBlocksTranspiler-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.gzDateien verarbeiten, die mit dem Modul dergzipStandardbibliothek unter Verwendung von QPY Version 16 oder höher geöffnet wurden. Weitere Informationen finden Sie unter #15157. -
Die Methoden
MCPhaseGate.inverse()und wurden angepasstMCU1Gate.inverse(), um die Steuerzustände von Gatter mit offener Steuerung bei der Berechnung ihrer Inversen beizubehalten. -
ConsolidateBlocksgibt nun eine Ausnahme vom Typ „ Python -space“ zurück, anstatt einen Panikfehler auszulösen, wenn es ungültige oder veraltete Analysen in den Schlüsselnblock_listPropertySet„legacy“run_listoder „“ feststellt. -
Optimize1qGatesDecompositionlöst nun eineTranspilerErroranstelle einer Rust-space-Panik aus, wenn versucht wird, das Programm auf einem Schaltkreis auszuführen, derTargetfür die zu groß ist. -
Es wurde ein Problem bei
pickleder Unterstützung für die behobenSabreSwap, bei dem eineSabreSwap-Instanz beim Pickling nach Ausführung derSabreSwap.run()-Methode einen Fehler verursachte. Problem Nr. 15071 behoben. -
Die Planungsdurchläufe und behandeln
ALAPScheduleAnalysisASAPScheduleAnalysisnun Schaltkreise, die keine Operationen enthalten, korrekt. Zuvor wurde ein Fehler angezeigtTranspilerError, 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 Parameteratol``rtolund. Damit wird das Problem #14107 behoben. -
Es wurde ein Fehler im
UnitarySynthesisTranspiler-Durchlauf behoben, der auftrat, wenn dieser mit einem nicht standardmäßigen Synthese-Plugin (angeben übermethod) aufgerufen wurde, das zwar unterstützt,basis_gatesaber nichttarget. Der Pass übergibt nun die Basis-Gates korrekt vomtargetan 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
ControlFlowOpangehängt werden, oder bei Schaltkreisen nach der Transpilation. -
Die Unterstützung für die Serialisierung
PauliEvolutionGatemit Operatoren vom TypSparseObservablebei Verwendung von QPY Version 17 wurde behoben. -
Es wurde ein Inkonsistenzfehler behoben,
QkTargetOpbei dem die Länge des in gespeichertenQkTargetOp.paramsArrays nicht mit der von angezeigten AnzahlQkTargetOp.num_paramsübereinstimmte. Platzhalterparameter werden nun durch dargestelltNAN, und die Länge des Arrays beträgt immerQkTargetOp.num_params. Dieser Fehler trat ausschließlich in der Version 2.3.0rc1 auf. -
Es wurde ein Regressionsfehler in der klassischen Ausdrucksdarstellung von Typ
Uintmit einerValueBreite 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
HighLevelSynthesisBefehl 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 (
@) zwischenOperatorundStatevectorwird der Operator nun auf den Zustand angewendet und das Ergebnis zurückgegebenStatevector. -
Es wurde ein Fehler im
ElidePermutationsTranspiler-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
SabreLayoutmit einer unzusammenhängenden Konnektivität imTargetund in einem Multiprocessing-Kontext bei der Ausführung vonPassManager.run()odertranspile()mit mehr als einer Schaltung auftreten konnte. Unter Linux ist dies das Standardverhalten, wenn odertranspile()mit mehr alsPassManager.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 ihrdecimalsSchlü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
PauliEvolutionGatemitSparseObservableOperatoren. 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 ist, z. B.RZGate(math.pi/2)oderRZZGate(math.pi/2). Früher wurden sie nicht als Clifford-Gatter erkannt, was zu einem Fehler führte. -
BasePassManagerersetzt nicht mehr die Ausgabewerte von Durchläufen, die zwar gültig, aber falsch sind, durch das ursprüngliche Eingabeprogramm. Ein zurückgegebenes Passwort0oder ein anderer falscher WertFalsewird nun beibehalten, und nur ein FehlerNonewird angezeigt. -
QuantumCircuit.compose()wird nun alle Variablen und Streckungen, die inDelayAnweisungen verwendet werden, korrekt neu zuordnen, wenn dasvar_remapArgument angegeben wird.