Qiskit SDK 2.2 versionshinweise
2.2.3
Vorspiel
Qiskit 2.2.3 behebt einen Fehler, der durch Qiskit 2.2.2 verursacht wurde, wenn die run() Methode auf einem PassManager für mehr als einen Schaltkreis angewendet wurde.
Anmerkungen zu Upgrades
ConsolidateBlocksliest nun einenPropertySetSchlüsselConsolidateBlocks_qubit_mapbeim Eintritt. Dieser Schlüssel und sein Wert sind nicht öffentlich und sollten nicht von anderen Passwörtern gelesen oder geschrieben werden.
Fehlerkorrekturen
- Feste Wiederverwendung derselben
ConsolidateBlocksInstanz auf mehreren Schaltkreisen, einschließlich Aufrufen mit mehr alstranspile()einem Schaltkreis und ohne prozessbasierte Parallelisierung. Ein in Qiskit 2.2.2 eingeführter Fehler führte dazu, dass der Durchlauf abstürzte oder ungültige Ergebnisse lieferte, wenn dieselbe Instanz in unterschiedlichen Schaltkreisen wiederverwendet wurde.
2.2.2
Vorspiel
Qiskit 2.2.2 ist ein Bugfix-Release für die v2.2 minor Versionsreihe.
Fehlerkorrekturen
-
Die Implementierung von
__deepcopy__()in wurdeQuantumCircuitkorrigiert, da die Schaltungsparameter nicht vollständig kopiert wurden. Infolgedessen hat die Mutation einesBoxOpin einem kopierten Schaltkreis keine Auswirkungen mehr auf den ursprünglichen Schaltkreis. -
Ein Problem beim
Optimize1qGatesDecompositionPass wurde behoben, das auftrat, wenn der Pass mit einem Pass initialisiertTargetwurde, der 1-Qubit-Gatter mit festen Winkelparametern enthielt. Bisher gab der Pass möglicherweise Gates aus, die nicht im Ziel enthalten waren, da er nicht überprüfte, ob die Gates im Ziel beliebige Parameterwerte unterstützten. Fehler Nr. 14743 behoben. -
Fehlerhaftes Verhalten im
BasisTranslatorPass behoben, bei dem ein Multi-Qubit-Gatter innerhalb einesControlFlowOpBlocks anhand seiner lokalen Qubit-Indizes statt anhand der absoluten Indizes aus der Quellschaltung verfolgt wurde. -
Der
ConsolidateBlocksTranspiler-Durchlauf bewertet nun korrekt, ob ein bestimmtes Gate hardwaremäßig unterstützt wird, während er in Kontrollflussoperationen rekursiv vorgeht. -
qpy.dump()kann nun das Schreiben in.gzDateien verarbeiten, die mit demgzipStandardbibliotheksmodul mit QPY-Versionen 16 oder höher geöffnet wurden. Siehe #15157 für Details. -
Die Methode wurde
MCPhaseGate.inverse()korrigiert, um die Steuerungszustände von offen gesteuerten Toren bei der Berechnung ihrer Inversen beizubehalten. -
ConsolidateBlocksgibt nun eine Ausnahme „ Python -space“ zurück, anstatt eine Panik auszulösen, wenn es eine ungültige oder veraltete Analyse in denblock_listPropertySetLegacy-Schlüsselnrun_listoder feststellt. Fehler Nr. 14646 behoben. -
Optimize1qGatesDecompositionlöst nun einenTranspilerErroranstelle einer Rust-Space-Panik aus, wenn versucht wird, auf einem Schaltkreis zu laufen, der für den zu großTargetist. Fehler #15116 behoben. -
Die Planungsläufe und
ALAPScheduleAnalysisbehandeln nun SchaltungenASAPScheduleAnalysisohne Operationen korrekt. Zuvor hatten sie fälschlicherweiseTranspilerErrorbehauptet, dass „keine Laufzeiten angegeben“ seien. Fehler Nr. 15145 behoben. -
Ein Fehler im Schaltkreistext-Zeichner wurde behoben, der auftreten konnte, wenn Schaltkreisblöcke innerhalb von Kontrollflussoperationen auf anderen Registern als der äußere Schaltkreis definiert wurden. Diese Situation könnte beispielsweise beim direkten Anhängen
ControlFlowOpvon Operationen oder bei Schaltkreisen nach der Transpilation auftreten.
2.2.1
Vorspiel
Qiskit 2.2.1 ist ein kleines Patch-Release, das mehrere in der Version 2.2.0 identifizierte Fehler behebt.
Hinweise zum Transpiler-Upgrade
- Die maximalen Aufruf- und Testgrenzen für den exakten Abgleich von
VF2PostLayoutbeioptimization_level=3wurden reduziert, um übermäßige Laufzeiten für hochsymmetrische Testschaltungen zu vermeiden, die auf große Kopplungskarten abgebildet werden.
Fehlerkorrekturen
-
DAGCircuit.apply_operation_back()undcircuit_to_dag()apply_operation_back()fügt nun neue Kanten in einer deterministischen Reihenfolge hinzu. Das bisherige Verhalten konnte dazu führen, dass bestimmte Transpiler-Durchläufe (wie z. B.SabreSwap) die DAG in nicht deterministischer Reihenfolge durchlaufen haben. -
DAGCircuit.apply_operation_front()kann beim Umgang mit Knoten, die klassische Bedingungen enthalten, keine ungültigen Selbstschleifen mehr einfügen. -
Ein Problem mit
pickleder Unterstützung für wurde behoben, beiSabreSwapdem eineSabreSwapInstanz einen Fehler verursachte, wenn sie nach Ausführung derSabreSwap.run()Methode gepickelt wurde. Fehler Nr. 15071 behoben. -
Es wurde ein Problem behoben, bei dem die Eingabetoleranzwerte bei der Überprüfung, ob
is_unitary()ein Operator unitär ist, nicht korrekt berücksichtigt wurden. Die Methode verwendet nun korrekt die bereitgestellten Parameteratol``rtolund bei der Vereinfachung des Operators und der Überprüfung, ob er mit der Identität übereinstimmt. Dies behebt #14107.
2.2.0
Vorspiel
Das Qiskit v2.2 enthält mehrere Erweiterungen für die C-API und den Transpiler sowie viele weitere Verbesserungen und Fehlerbehebungen. Die wichtigsten Merkmale dieser neuen Version sind:
- C-API-Transpile-Funktion: Die C-API enthält nun eine Funktion zum Transpilieren einer Quantenschaltung:
qk_transpile(). Diese Funktion entspricht der Funktion „transpile()Python “ für einen eigenständigen C-Kontext.- Litinski-Transformationsdurchlauf: Ein neuer Transformationsdurchlauf,
LitinskiTransformationder die beschriebene arXiv:1808.02892 Transformation implementiert. Dieser Pass wird typischerweise bei der Kompilierung für fehlertolerante Architekturen verwendet.- Winkelgebundene Unterstützung für Ziele: Die
TargetKlasse unterstützt nun die Angabe von Grenzen für die zulässigen Werte für parametrisierte Operationen, die zum Ziel hinzugefügt wurden. Wenn eine Anweisung zum hinzugefügtTargetwird, können Sie das optionale Argument angle_bounds hinzufügen, um die oberen und unteren Grenzen für parametrisierte Rotationsgatter anzugeben. Ein neuer Transpiler-DurchlaufWrapAngleswurde hinzugefügt, um die Winkelbeschränkungen als Teil einer Transpiler-Pipeline durchzusetzen.
Die Versionsreihe v2.2 ist die letzte kleinere Versionsreihe mit Unterstützung Python 3.9. Die minimale unterstützte Rust-Version, die verwendet wird, um Qiskit aus dem Quellcode zu bauen, ist nun Rust v1.85, erhöht von 1.79 in 2.1.0. Weitere Informationen zu den oben genannten und anderen Änderungen finden Sie in den unten stehenden Versionshinweisen und in der aktualisierten Dokumentation.
C-API-Funktionen
-
Neue eigenständige Transpiler-Pass-Funktionen zur C-API hinzugefügt. Diese Funktionen nehmen ein
QkCircuitauf, um den Pass auszuführen, und sind gleichbedeutend mit dem Aufruf eines instanziierten Passes. -
Der
QkTargetTyp kann nun Ziele darstellen, die parametrisierteQkGateTypen unterstützen, die beliebige Parameterwerte akzeptieren. Bisher konnten diese Tore nur mit einem festen Winkelwert zum Ziel hinzugefügt werden, der durch die Verwendung vonqk_target_entry_new_fixed()zur Erstellung desQkTargetEntryunterstützt wurde. Nun kann dieqk_target_entry_new()Funktion mit parametrisierten Gattern verwendet werden. Bei Verwendung mit parametrisierten Gattern gibt diese Funktion an, dass das Gate im Ziel jeden Wert für alle Parameter des Gates unterstützt. Zum Beispiel:#include <qiskit.h> QkTarget *target = qk_target_new(5); QkTargetEntry *rz_entry = qk_target_entry_new(QkGate_RZ); for (uint32_t i = 0; i < 5; i++) { uint32_t qargs[1] = {i}; qk_target_entry_add_property(rz_entry, qargs, 1, 1.2e-6, 1.3e-9); } qk_target_add_instruction(target, rz_entry); // Clean up after using target qk_target_free(target);Dadurch entsteht ein 5-Qubit-Target, das ein RZ-Gate auf jedem Qubit mit einem beliebigen Parameterwert akzeptiert, der von diesem Gate unterstützt wird.
-
Hinzugefügt,
qk_obs_apply_layout()um neue Qubit-Layouts auf eineQkObsBeobachtungsgröße anzuwenden. Diese Funktion nimmt die Beobachtung, die neuen Qubit-Indizes und eine Ausgabenzahl von Qubits entgegen. Wichtig ist, dass diese Funktion die Anwendung von Transpile-Layouts, die normalerweise durch einenQkTranspileLayoutTranspiler-Durchlauf als angegeben werden, auf ein Observable ermöglicht. Zum Beispiel:// get the number of output qubits -- transpile_layout is a QkTranspileLayout* uint32_t num_output_qubits = qk_transpile_layout_num_output_qubits(transpile_layout); // get the layout including the ancillas (hence the ``false`` in the function call) uint32_t *layout = malloc(sizeof(uint32_t) * num_output_qubits); qk_transpile_layout_final_layout(transpile_layout, false, layout); // apply the layout -- obs is a QkObs* int exit = qk_obs_apply_layout(obs, layout, num_output_qubits); // free the layout array free(layout); -
Eine neue Funktion wurde
qk_transpile()zur Qiskit C API hinzugefügt. Diese Funktion wird zum Transpilieren von Quantenschaltungen in einem eigenständigen C-Kontext ohne Verwendung von „ Python “ verwendet. Dies ist die letzte wichtige Komponente, die in der C-API für typische Hardware-Ausführungs-Workflows mit Qiskit benötigt wird.Diese Funktion spiegelt die voreingestellten Pass-Manager wider, die für den Python Transpiler verwendet werden, mit der Ausnahme, dass einige Passes und Funktionen übersprungen werden, wenn sie für Schaltungen, die mit der C-API konstruiert wurden, nicht relevant sind. Damit ist die Funktion nur für eigenständige C-Kontexte geeignet.
-
Der C-API wurde ein neuer Typ
QkTranspileLayouthinzugefügt. Dieser Typ wird verwendet, um über die durch den Transpiler verursachten Permutationen nachzudenken.
Schaltkreise Funktionen
-
Es wird eine neue Methode bereitgestellt, um sicherzustellen, dass eine Schaltung
QuantumCircuit.ensure_physical()über physikalische Qubits definiert ist, wobei sich die Qubit-Indizes auf physikalische Qubits beziehen. Weitere Informationen zu den Metadatenkonzepten finden Sie in der Dokumentation in der neuen Diskussion über abstrakte und physikalische Schaltungsdarstellungen. Die Konzepte „abstrakter“ und „physikalischer“ Schaltkreise sind für Qiskit keineswegs neu, lediglich die explizite Dokumentation. -
Die Klasse
Durationhat eine neue Variantepserhalten, die zur Darstellung einer Dauer in Pikosekunden verwendet werden kann. -
Verbessert
PauliEvolutionGate.control(),PauliEvolutionGate.power()undPauliEvolutionGate.inverse()um effizientere Darstellungen in Bezug auf aPauliEvolutionGatezurückzugeben. Für die Berechnung der kontrollierten und exponentiellen Versionen des Evolutionsgatters führt diese Änderung zu deutlich flacheren Schaltkreisen und geringeren Gatterzahlen im Vergleich zu den zuvor verwendeten generischen Mechanismen. Die inverse Zerlegung ändert sich nicht, wird nun jedoch effizienter generiert und ermöglicht bessere Compiler-Optimierungen. -
Eine neue Fast-Path-Methode
ParameterExpression.bind_all()wurde hinzugefügt, um den Anwendungsfall zu unterstützen, bei dem viele verschiedeneParameterExpressionInstanzen unter Verwendung desselben Zuordnungswörterbuchs an numerische Werte gebunden werden. Die vorhandenebind()Methode hat einen hohen Overhead und unnötige Zuweisungen, da sie immer einen TypParameterExpressionfür die Typkonsistenz zurückgibt.
OpenQASM Funktionen
-
Teilweise Unterstützung für
defcalSymbole im OpenQASM3 -Exporter hinzugefügt. Dadurch können nachgelagerte Pakete benutzerdefinierte Anweisungen exportieren, die sowohl auf Quantenbits als auch auf klassischen Bits mitqiskit.qasm3.dumps(). Benutzer können nun benutzerdefinierte Anweisungen definieren (z. B. eineCustomMeasure, die auf ein Qubit wirkt und ein klassisches Bit zurückgibt) und deren Verhalten mithilfeDefcalInstructionvon festlegen. Diese Deficals werden über dasimplicit_defcalsArgument in an den Exporterqiskit.qasm3.dumps()übergeben.Zum Beispiel:
from qiskit.circuit import Instruction, QuantumCircuit from qiskit.qasm3 import dumps from qiskit.qasm3.exporter import DefcalInstruction, types custom_measure = Instruction("measure_2", 1, 1, []) qc = QuantumCircuit(1, 1) qc.h(0) qc.append(custom_measure, [0], [0]) qc.measure(0, 0) defcals = { "measure_2": DefcalInstruction("measure_2", 0, 1, types.Bool()), } out_qasm = dumps(qc, implicit_defcals=defcals) print(out_qasm)Würde die folgende gültige Zeichenfolge ausgeben: OpenQASM3 :
OPENQASM 3.0; bit[1] c; qubit[1] q; h q[0]; c[0] = measure_2 q[0]; c[0] = measure q[0];Bei diesem Ansatz wird davon ausgegangen, dass die Grammatikdefinition für den defcal extern bereitgestellt wird (z. B. in einer Header-Datei), obwohl eine solche Datei nicht unbedingt erforderlich ist, damit der Exporter funktioniert.
-
Die Funktionen
qasm3.loads()und habenqasm3.load()nun ein zusätzliches Argument namensnum_qubits. Wenn angegeben, geben die Funktionen Schaltungen zurück, deren Qubits gleich sindnum_qubits. Wenn nicht angegeben, hat der zurückgegebene Schaltkreis Qubits, die dem maximalen Index im serialisierten Schaltkreis entsprechen. Weitere Informationen finden Sie unter #14435
QPY-Funktionen
-
Eine Einstellung namens
min_qpy_versionwurde in der Benutzerkonfigurationsdatei hinzugefügt. Wenn diese Option gesetzt ist, definiert sie die minimal zulässige QPY-Version fürqpy.load(). Wenn die Formatversion einer QPY-Datei niedriger ist als dieminimum_qpy_versionEinstellungminimum_qpy_version, wird eine Ausnahme ausgelöst. -
Einführung des QPY-Formats Version 16. Diese neue Version führt eine neue Schaltkreis-Starttabelle in den Dateikopf ein, die die Byte-Offsets für den Beginn jedes Schaltkreises in einer QPY-Datei enthält. Dies ermöglicht ein potenziell effizienteres Laden von Schaltkreisen aus QPY-Dateien und eine potenzielle Multithreading-Implementierung von Rust in der Zukunft. Außerdem unterstützt die neue Formatversion die neue
DURATIONVariante von Pikosekunden.
Quanteninformationsmerkmale
-
Die Methoden
PauliLindbladMap.drop_qubits()PauliLindbladMap.keep_qubits()und wurden hinzugefügt, um Subsysteme aus Pauli-Lindblad-Abbildungen zu verfolgen. -
Es wurden die Methoden
QubitSparsePauli.to_pauli()undQubitSparsePauliList.to_pauli_list()hinzugefügt, die die spärlichen Objekte in die entsprechenden dichten Versionen bzwPauliList.Pauliumwandeln. -
Die
PhasedQubitSparsePauliKlassenPhasedQubitSparsePauliListund wurden hinzugefügt. Diese Klassen repräsentieren einen einzelnen Pauli-Operator bzw. eine Liste von Pauli-Operatoren, die jeweils im Qubit-Sparse-Format gespeichert sind. Diese Klassen sind undQubitSparsePaulisehr ähnlichQubitSparsePauliList, enthalten jedoch zusätzlich Phaseninformationen. -
Die Methode wurde
QubitSparsePauliList.to_dense_array()hinzugefügt. Dies gibt die Liste als Array von Ganzzahlen mit den Werten von zurückPauli.
Synthesefunktionen
-
Neuer Synthesealgorithmus hinzugefügt,
ModularAdderGateder keine zusätzlichen Qubits erfordert und im Vergleich zu eine bessereadder_qft_d00()CX-Zahl aufweist: -
Es wurde ein neuer Synthesealgorithmus hinzugefügt, der
MCXGatekeinesynth_mcx_noaux_hp24()zusätzlichen Qubits benötigt. Im Vergleich zum bestehendensynth_mcx_noaux_v24()Algorithmus erzeugt diese Methode eine lineare statt einer quadratischen Anzahl von CX-Gattern. Insbesondere ist die neue Methode besser, wenn die Anzahl der Steuerqubits größer als fünf ist. Der Algorithmus basiert auf dem Artikel „Compiling Conditional Quantum Gates without Using Helper Qubits” von Huang und Palsberg ( https://dl.acm.org/doi/10.1145/3656436 ). -
Die
qs_decomposition()Funktion, die ursprünglich auf Shende et. basierte, wurde verbessert. al. (https://arxiv.org/abs/quant-ph/0406176). Die neue Synthesemethode basiert auf Krol und Al-Ars ( https://arxiv.org/abs/2403.13692 ) und reduziert die Gesamtzahl derCXGates eines allgemeinen n-Qubit-Unitaren umCXGates. Mit der verbesserten Zerlegung kann eine allgemeine 3-Qubit-Unitäre mit 19CXGates (anstatt 20) zerlegt werden. -
Hinzugefügt, um das
synth_mcmt_xgate()Multi-Control-Multi-Target-Gate zu synthetisieren, wenn das Basis-Gate istXGate. Es verfügt über eine Zerlegung in eine lineare Anzahl von CX-Gattern und 0 Ancilla-Qubits zusammen mit dem High-Level-Synthesis-PluginMCMTSynthesisXGate.
Transpiler-Funktionen
-
Neues Plugin für die High-Level-Synthese zum Synthetisieren eines
ModularAdderGate: hinzugefügtModularAdderSynthesisV17, basierend aufadder_modular_v17().
Das
ModularAdderSynthesisDefaultwurde ebenfalls aktualisiert, um der folgenden Reihenfolge modularer Addierer-Synthesizer zu folgen:"ModularAdder.qft_d00"wenn die Anzahl der Qubits ist,"ModularAdder.modular_v17"in allen anderen Fällen. -
Es wurde ein neuer Transpiler-Durchlauf
LitinskiTransformationhinzugefügt, der die in beschriebene Transformation arXiv:1808.02892 implementiert.Der Eingang zum Pass ist eine Schaltung mit Clifford- und Einzelqubit-RZ-Rotationsgattern, und der Ausgang ist eine Schaltung mit Multiqubit-Pauli-Rotationen (implementiert als
PauliEvolutionGateGatter), gefolgt von Clifford-Gattern. Der Durchlauf löst eineTranspilerErrorAusnahme aus, wenn die Schaltung nicht unterstützte Gatter enthält.Der Pass unterstützt alle Clifford-Gatter in der von
get_clifford_gate_names()zurückgegebenen Liste, nämlich["id", "x", "y", "z", "h", "s", "sdg", "sx", "sxdg", "cx", "cz", "cy", "swap", "iswap", "ecr", "dcx"]. Die Liste der unterstützten RZ-Rotationen lautet["t", "tdg", "rz"](wir konvertieren T- und Tdg-Gatter automatisch in RZ-Rotationen).Darüber hinaus akzeptiert der
LitinskiTransformationKonstruktor ein Argumentfix_clifford. WennFalse(nicht standardmäßig), enthält die zurückgegebene Schaltung nurPauliEvolutionGateGatter, wobei die letzten Clifford-Gatter weggelassen werden. Beachten Sie, dass in diesem Fall die Operatoren der ursprünglichen und der synthetisierten Schaltungen im Allgemeinen nicht gleichwertig sind.Zum Beispiel:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import LitinskiTransformation from qiskit.quantum_info import Operator # The following quantum circuit consists of 5 Clifford gates # and two single-qubits RZ-rotation gates (note that Tdg is # an RZ-rotation). qc = QuantumCircuit(2) qc.cx(0, 1) qc.rz(0.1, 0) qc.cz(0, 1) qc.tdg(1) qc.h(1) qc.s(1) qc.cz(1, 0) # The transformed circuit consists of two PauliEvolution gates # and the same Clifford gates as in the original circuit. qct = LitinskiTransformation()(qc) # The circuits before and after the transformation are equivalent assert Operator(qc) == Operator(qct) -
Ein neues Plugin
MCXSynthesisNoAuxHP24für dieMCXGateHigh-Level-Synthese von Objekten wurde hinzugefügt. Darüber hinaus wurde das Standard-Synthese-PluginMCXSynthesisDefaultfürMCXGateObjekte aktualisiert, sodass nun immer die beste Synthesemethode in Abhängigkeit von der verfügbaren Anzahl an Hilfsqubits ausgewählt wird. -
Unterstützung für die
TargetAngabe von Winkelgrenzen in Anweisungen hinzugefügt. Vor dieser Version konnte festgelegt werdenTarget, dass eine Operation, die einen Parameter akzeptierte, entweder jeden gültigen Wert oder einen bestimmten Wert zulassen sollte. Wenn beispielsweiseRZGate(Parameter("theta"))zum Ziel hinzugefügt würde, würde dies bedeuten, dass einRZGatemit einem beliebigen Wert für Theta zulässig wäre. Wenn hingegen zum ZielRZGate(math.pi)hinzugefügt würde, würde dies bedeuten,RZGatedass nur der einzig zulässige Wert für das Ziel ist. Diese neue Funktion ermöglicht es, die zulässigen Winkel auf einen beliebigenfloatWert zwischen einer inklusiven Grenze zu beschränken. Beispielsweise können Sie zu einemRZGate(math.pi)Targethinzufügen und den Winkelwert auf Werte zwischen 0 und beschränken.Es gibt mehrere Methoden, um mit den Winkelgrenzen auf dem Ziel zu arbeiten. Der erste ist
Target.add_instruction()mit einem neuenangle_boundsSchlüsselwortargument, das verwendet wird, um einer Anweisung im eineTargetWinkelbegrenzung hinzuzufügen. Um mit Winkelgrenzen zu arbeiten, sollten Sie auch eine Callback-Funktion in der globalenWRAP_ANGLE_REGISTRYRegistry registrieren, die dem Transpiler mitteilt undWrapAnglesweitergibt, wie die Gates für Winkelgrenzen angepasst werden sollen. Die Callback-Funktion nimmt eine Liste beliebigerfloatWerte entgegen, die die Gate-Winkel aus der Schaltung darstellen, sowie die Qubit-Indizes in der Schaltung, auf die das Gate angewendet wurde, und gibt einenDAGCircuitWert zurück, der eine äquivalente Schaltung für das Gate mit diesem Winkel darstellt, wobei jedoch die Winkelgrenzen und andereTargetEinschränkungen berücksichtigt werden. Zum Beispiel:import math from qiskit.dagcircuit import DAGCircuit from qiskit.transpiler import Target from qiskit.transpiler.passes.utils.wrap_angles import WRAP_ANGLE_REGISTRY target = Target(num_qubits=1) target.add_instruction(RZGate(Parameter("theta")), angle_bounds=[(-math.pi, math.pi)]) def callback(angles: List[float], qubits: List[int]) -> DAGCircuit: """Callback function to wrap RZ gate angles Args: angles: The list of floating point parameter values for the instance of RZGate in the circuit qubits: The physical qubit indices that this gate is operating on Returns: The DAGCircuit of the equivalent circuit""" angle = angles[0] dag = DAGCircuit() dag.add_qubits([Qubit()]) if angle > 0: divisor = math.pi else: divisor = -math.pi gate_counts = int(angles[0] // divisor) rem = angles[0] % divisor for _ in range(gate_counts): dag.apply_operation_back(RZGate(math.pi), [dag.qubits[0]], check=True) dag.apply_operation_back(rem, [dag.qubits[0]], check=True) WRAP_ANGLE_REGISTRY.add_wrapper("rz", callback)Target.has_angle_bounds()kann verwendet werden, um zu überprüfen, ob im Ziel Winkelgrenzen festgelegt sind, undTarget.gate_has_angle_bounds().Wenn Sie die Winkelgrenzen eines Ziels auf beliebige Gatter in einer Schaltung anwenden möchten, sollten Sie dazu den
WrapAnglesTranspiler-Durchlauf verwenden. -
Ein neues kwarg wurde
check_angle_boundszurTarget.instruction_supported()Methode hinzugefügt. Wenn aufTrue(Standard) gesetzt, überprüft die Methode, ob das angegebeneparametersauch den Winkelgrenzen entspricht, die möglicherweise für die abgefragte Anweisung gelten. -
Es wurde ein neuer Transpiler-Durchlauf
WrapAngleshinzugefügt, der dazu dient, Winkelbeschränkungen auf Gates imTarget. Wenn ein WinkelgrenzenTargetdefiniert hat, analysiert dieser Durchlauf alle Parameter für die Gatter im Schaltkreis und vergleicht sie mit den im Ziel angegebenen Grenzen. Wenn ein Ziel beispielsweise ein benutzerdefiniertes Gate mit Winkelgrenzen enthält, zerlegt der Durchlauf dieses Gate in ein Gate, das den Grenzen entspricht:from qiskit.circuit import Gate, Parameter, QuantumCircuit, Qubit from qiskit.dagcircuit import DAGCircuit from qiskit.transpiler import Target, WrapAngleRegistry from qiskit.transpiler.passes import WrapAngles class MyCustomGate(Gate): def __init__(self, angle): super().__init__("my_custom", 1, [angle]) param = Parameter("a") circuit = QuantumCircuit(1) circuit.append(MyCustomGate(6.0), [0]) target = Target(num_qubits=1) target.add_instruction(MyCustomGate(param), angle_bounds=[(0, 0.5)]) def callback(angles, _qubits): angle = angles[0] if angle > 0: number_of_gates = angle / 0.5 else: number_of_gates = (6.28 - angle) / 0.5 dag = DAGCircuit() dag.add_qubits([Qubit()]) for _ in range(int(number_of_gates)): dag.apply_operation_back(MyCustomGate(0.5), [dag.qubits[0]]) return dag registry = WrapAngleRegistry() registry.add_wrapper("my_custom", callback) wrap_pass = WrapAngles(target, registry) res = wrap_pass(circuit) res.draw('mpl')
-
DAGCircuitverfügt nun über eine manuelle Implementierung von__deepcopy__(). Dies ist um ein Vielfaches schneller als die bisherige implizite Implementierung aus dem Pickle-Protokoll, insbesondere bei großen Schaltkreisen. Dies wirkt sich auch direkt positiv auf die Kompilierungsleistung aus, wenn oder die von zurückgegebenen voreingestelltengenerate_preset_pass_manager()transpile()Pass-Manager mitoptimization_level=3als Optimierungsstufe 3 ausgeführt werden, da intern für jede Iteration derDAGCircuitOptimierungsschleife in deroptimizationPhase eine tiefe Kopie der erstellt wird. -
Es wird eine neue Methode bereitgestellt,
DAGCircuit.make_physical()die die Qubits imDAGCircuiteffizient durch das kanonische physikalische Qubit-Register ersetzt, möglicherweise einschließlich Erweiterung. Eine ähnliche Methode ist ebenfallsQuantumCircuit.ensure_physical()verfügbar. -
Eine neue Methode,
DAGCircuit.structurally_equal(), kann verwendet werden, wenn zweiDAGCircuitInstanzen in genau derselben Reihenfolge erstellt und geändert wurden. Dies ist ein wesentlich strengerer Test als die standardmäßige semantische Äquivalenzprüfung der==Überladung und kann von Transpiler-Pass-Autoren verwendet werden, um zu überprüfen, ob ihre Änderungsreihenfolgen deterministisch sind. -
Benutzerdefinierte Unterklassen von
BasePassManagerkönnen nun ihrproperty_setAttribut während ihrer_passmanager_frontend()Methode ändern, um Anfangseigenschaften zu initialisieren. Dies sorgt für Symmetrie, da es zuvor nur möglich war, die endgültigen Eigenschaften während des Vorgangs_passmanager_backend()zu lesen. -
Eine neue Klasse
OptimizationMetrichinzugefügt, die das Optimierungskriterium imHighLevelSynthesisDurchgang festlegt. Derzeit werden die folgenden beiden Metriken unterstützt:COUNT_2Q: optimiert die Anzahl der Zwei-Qubit-Gatter.COUNT_T: optimiert die Anzahl der T-Gates bei der Transposition in eine Clifford+T-Basismenge.
Der Transpiler wählt automatisch die Zielmetrik basierend auf dem Basisgatesatz aus, d. h. er verwendet,
COUNT_Twenn ein Clifford+T-Basisgatesatz erkannt wird. Diese Klasse kann jedoch derzeit nicht manuell festgelegt werden, wenn oder ein von generiertertranspile()voreingestelltergenerate_preset_pass_manager()Pass-Manager ausgeführt wird. -
Dem Konstruktor für
HighLevelSynthesisden Transpiler-Durchlauf wurde ein neuesoptimization_metricArgument hinzugefügt, das einOptimizationMetricObjekt akzeptiert. Wenn auf gesetztCOUNT_T, wählt der Durchgang Zerlegungen, die für den Clifford+T-Gatesatz besser geeignet sind. -
Die standardmäßigen High-Level-Synthese-Plugins für
ModularAdderGateundMultiplierGateerzeugen bessere T-Zählungen, wenn sie in den Clifford+T-Basissatz transpiliert werden. -
Das standardmäßige High-Level-Synthese-Plugin für
MCXGateerzeugt bessere T-Zählungen beim Transpilen in den Clifford+T-Basissatz, vorausgesetzt, mindestens 1 Ancilla-Qubit ist verfügbar. -
Ein Standardsatz inverser Gatter für den
InverseCancellationTranspiler-Durchlauf wurde hinzugefügt. Bisher war eine explizite Liste der zu löschenden Gates oder Gate-Paare ein erforderliches Argument für den Konstruktor des Pass-Objekts. Diese Liste ist optional. Wenn keine Liste angegeben wird, sind die selbstinversen Gatter:und die umgekehrten Paare:
wird durch den Pass aufgehoben.
-
Dem
InverseCancellationKonstruktor wurde ein neues Argument hinzugefügt,run_defaultdas, wenn es aufTruegesetzt ist, zusätzlich zu den bereitgestellten benutzerdefinierten Gattern die neue standardmäßige inverse Cancellation-Gate-Liste ausführt. Dies ist für Anwendungsfälle vorgesehen, in denen Sie zusätzlich zu den Standard-Gates einen benutzerdefinierten Satz inverser Löschungen ausführen möchten. -
TranspileLayouthat zwei neue Methoden:from_property_set()undwrite_into_property_set(), die die aktuelle Ad-hoc-Struktur der Transpilierungseigenschaften formalisieren und festlegen, wie diese in eine konvertiertTranspileLayoutwerden. Dadurch können Passes während einer Transpiler-Pipeline auf das zugreifen,TranspileLayoutwas sein wird, es in vollständig strukturierter Form ändern und dann in kanonischer Form zurückschreiben.Es wird erwartet, dass in der zukünftigen Version 3.0 von Qiskit das
TranspileLayout(oder etwas Ähnliches) ein direktes Attribut derDAGCircuitTranspiler-Zwischendarstellung sein wird und von Durchläufen verlangt wird, um mit dem Rest des synchronisiertDAGCircuitzu bleiben. -
Wieder aktivierter Lauf
VF2PostLayoutdes Transpilers in deroptimizationPhase füroptimization_level=3mit dertranspile()Funktion und den generierten Pass-Manager-Objekten, die von dergenerate_preset_pass_manager()Funktion zurückgegeben werden. Der Durchlauf erfolgtstrict_direction=Truenach allen physikalischen Optimierungen, die in dieser Phase durchgeführt wurden, um das Layout ein letztes Mal mit dem exakten Ausgangsschaltkreis zu verbessern. Dies war zuvor in Qiskit v2.1.0 aktiviert, wurde jedoch aufgrund von Problemen mit der ursprünglichen Implementierung in 2.1.2 wieder rückgängig gemacht. Diese Probleme wurden behoben, und das Layout wird korrekt angewendet, wenn ein besseres gefunden wird.
Visualisierungsfunktionen
-
Eine neue Option,
measure_arrows, wurde zu den Backendsmpl``textund für den Schaltkreistecknerqiskit.visualization.circuit_drawer()undqiskit.circuit.QuantumCircuit.draw()hinzugefügt. Wenn diese Option aufTruegesetzt ist, zeichnet die Schublade einen Pfeil vom Feldmeasurezu den klassischen Bits darunter. Dies war das bisherige Verhalten in den Schubladen. Wenn es aufFalsegesetzt ist, werden keine Pfeile gezeichnet, sondern stattdessen werden das klassische Registermeasureund das vom verwendete Bit innerhalb desmeasureFeldes angezeigt. Dadurch könnenmeasureBoxen innerhalb einer vertikalen Ebene gestapelt werden.Wenn keine Option gesetzt ist, ist der Standardwert
True. Der Benutzer kann die Voreinstellung in der Benutzerkonfigurationsdatei, standardmäßig im Verzeichnis~/.qiskit, in der Dateisettings.confändern. Unter der Überschrift[Default]kann ein Benutzercircuit_measure_arrows = Falseeingeben, um den Standard zu ändern.
Anmerkungen zu Upgrades
- Die minimal unterstützte Rust-Version für die Erstellung von Qiskit aus dem Quellcode (einschließlich der Erstellung der C-API im Standalone-Modus) wurde von Rust 1.79 auf Rust 1.85 erhöht. Diese Änderung war notwendig, um die Verwendung einer neueren Version der Rust-Bibliothek für lineare Algebra faer zu ermöglichen, die in Qiskit verwendet wird. Beim Betrieb von Qiskit unter Windows mit der vorherigen Version von faer wurden Probleme festgestellt. Diese wurden in der neueren Version behoben, allerdings ist eine neuere Version des Rust-Compilers erforderlich, um die neuere Version von faer zu erstellen.
Hinweise zur Aktualisierung von Schaltkreisen
-
Die Schaltungsdefinition von
ModularAdderGatewurde aktualisiert, um zu verwendenadder_modular_v17(). Um das alte Verhalten zu erhalten, verwenden Sie stattdessen die Definitionadder_qft_d00()von. -
Die Methoden
XGate.control(),CXGate.control(),CCXGate.control(),C3XGate.control()C4XGate.control(), und gebenMCXGate.control()nicht mehr einen zurückAnnotatedOperation, wenn das Argument auf gesetztannotatedist, sondern geben stattdessenTruedenselben expliziten zurückMCXGate, den man erhalten würde, wennannotatedistFalse. Dies steht im Einklang mit der Verwendung des Argumentsannotatedin der Standard-Schaltungsbibliothek, wo wir generell darauf verzichten, ein einzuführenAnnotatedOperation, wenn bereits eine native Gate-Klasse verfügbar ist. In der Praxis führt dies zu einer effizienteren Zerlegung von mit Steuerungsannotationen versehenen Gattern in der MCX-Familie.
Hinweise zum Upgrade der C-API
-
Die meisten Verwendungen von
uintptr_twurden insize_tgeändert. Insbesondere die folgenden Verwendungen wurden geändert:QkOpCount.countQkOpCounts.lenQkObsTerm.len- Der Rückgabetyp von
qk_circuit_num_instructions(). - Das
indexArgument inqk_circuit_get_instruction(). - Das
boundariesArgument inqk_obs_new(). - Die Rückgabetypen von
qk_obs_num_terms(),qk_obs_len(), undqk_obs_boundaries(). - Der Rückgabetyp von
qk_target_entry_num_properties(), undqk_target_num_instructions().
Diese Änderung war notwendig, da das Tool cbindgen, mit dem die C-Header-Dateien aus dem Rust-Code von Qiskit generiert wurden, standardmäßig
uintptr_tan Stellen verwendete, an denensize_tbesser mit der Typverwendung in Rust übereinstimmte. Diese Änderung wurde vorgenommen, um deutlicher zu machen, wie die Werte in der C-API verwendet werden sollen.
QPY-Upgrade-Hinweise
- Die Standardversion von QPY, die von ausgegeben
qpy.dump()wird, ist jetzt QPY-Format Version 16. Wenn Sie eine andere Formatversion benötigen, können Sie mit demversionArgument eine frühere Formatversion angeben.
Hinweise zum Upgrade der Quanteninformation
SparsePauliOp.assign_parameters()legt nun den Datentyp descoeffsAusgabearrays auf festcomplex, wenn alle Parameter vollständig an numerische Werte gebunden sind.
Hinweise zum Upgrade der Synthese
- Die Standardwerte der Argumente
opt_a1undopt_a2vonqs_decomposition()sind nunopt_a1 = Noneundopt_a2 = None. Die neuen Standardwerte wählen den optimalen Wert basierend darauf, ob die Eingabeeinheit für dasmatArgument gesteuert wird oder nicht, um standardmäßig die minimaleCXGateAnzahl zu erzielen. Wenn Sie das bisherige Verhalten benötigen, können Sie explizit undopt_a1 = Trueaufrufenopt_a2 = True, um das gleiche Verhalten wie in früheren Versionen beizubehalten.
Hinweise zum Transpiler-Upgrade
- Der Schaltkreis legt
PassManagernun immer die Eigenschaftenoriginal_circuit_indicesund festnum_input_qubits, bevor die Ausführung einzelner Durchläufe beginnt. Dies sind Eigenschaften der Eingangsschaltung, die zuvor von einzelnen Durchläufen festgelegt werden mussten, oft als Nebeneffekt ihres Hauptzwecks.
Veraltete Schaltungen
-
Die folgenden Klassen in der Schaltkreisbibliothek sind ab Qiskit 2.2 veraltet und werden in Qiskit 3.0 entfernt. Sie wurden durch moderne Toräquivalente ersetzt.
Fehlerkorrekturen
-
ApplyLayoutbehandelt nun korrekt den Fall der Anwendung eines Null-QubitsLayout. Zuvor wurde behauptet, dass kein Layout festgelegt worden sei, selbst wenn das"layout"Feld des gleichPropertySetwarLayout(). -
Probleme mit Speicherlecks bei der Erstellung einer
QkOpCountsInstanz und bei Aufrufen von wurdenqk_opcounts_clear()behoben, wenn eine leere Instanz übergeben wurde. -
Bisher konnte man einen ungültigen Operator
PauliEvolutionGateaus einer Liste von Operatoren definieren, wobei die Operatoren nicht alle für die gleiche Anzahl von Qubits definiert waren. Dies wurde nun behoben, und wir geben nun eine Fehlermeldung aus, wenn das Gate definiert wird:from qiskit.quantum_info import Pauli, SparsePauliOp from qiskit.circuit.library import PauliEvolutionGate pauli = Pauli("XYZ") # 3 qubits op = SparsePauliOp(["XYIZ"], [1]) # 4 qubits evo = PauliEvolutionGate([pauli, op], time=1) -
Ein Problem im
VF2LayoutTranspiler-Durchlauf wurde behoben, bei dem die Ausgabe des Durchlaufs selbst bei einem festen Startwert möglicherweise nicht deterministisch war, insbesondere wenn die Eingabeschaltung aktive Qubits enthielt, die nur Einzelqubit-Operationen enthielten. Behoben #14729 -
Ein Fehler wurde behoben,
PassManager.run()bei dem diecallbackFunktion nicht aufgerufen wurde, wenn mehrere Schaltkreise ausgeführt wurden. Der Rückruf wird nun korrekt für jeden Durchlauf auf jedem Schaltkreis ausgelöst, auch bei paralleler Ausführung. -
Mehrere Probleme im
CommutativeInverseCancellationTranspiler-Durchlauf wurden behoben. Der Pass funktioniert nun korrekt auf Schaltkreisen, dieCliffordOperationen, Kontrollflussoperationen und nicht invertierbare Operationen wie enthaltenInitialize.Darüber hinaus führt der Durchlauf jetzt immer zuerst eine syntaktische (nicht-matrixbasierte) Prüfung durch, wenn er inverse Gatterpaare identifiziert. Wenn die Gates syntaktisch nicht gleich sind, das Argument
matrix_basedaufTruegesetzt ist und die Operation nicht auf mehr alsmax_qubitsQubits wirkt, wird ebenfalls eine matrixbasierte Prüfung durchgeführt. Dadurch wird das Reduktionspotenzial des Passes leicht verbessert. -
Mehrere Probleme im
CommutativeCancellationTranspiler-Durchlauf (und damit intranspile()) behoben, bei denen die globale Phase der Schaltung nicht korrekt aktualisiert wurde. Insbesondere führte die Zusammenführung eines X-Gatters und eines RX-Gatters zu einer Phasenfehlanpassung, während die Entfernung eines Pauli-Rotationsgatters mit dem Winkel der Form , fälschlicherweise zu einer Phasenverschiebung von führte. -
Ein Problem wurde behoben,
CommutationCheckerbei dem standardmäßig gesteuerte Gates nicht korrekt verarbeitet wurden, wenn sie auf etwas anderem als dem All-Eins-Zustand gesteuert wurden. Behoben #14974 -
Nichtdeterminismus in behoben
CommutativeCancellation. Dies hatte keinen Einfluss auf die vonDAGCircuit.topological_nodes()oder zurückgegebenetopological_op_nodes()Reihenfolge, die aufgrund ihrer integrierten kanonischen Sortierfunktion in der Regel verwendet werden sollte, wenn die Deterministik der Knotenreihenfolge wichtig ist. Bei der Überprüfung der Knoten in beliebiger Reihenfolge (DAGCircuit.op_nodes()) oder der Kantenstruktur (DAGCircuit.edges()) wäre die Iterationsreihenfolge nach einem Aufruf von jedoch nichtCommutativeCancellationdeterministisch. -
Ein Fehler wurde behoben,
MCXGate.control()bei dem beim Hinzufügen weiterer Steuerelemente zu einem offen gesteuerten diectrl_statedes gesteuerten MCX-GattersMCXGatenicht berücksichtigt wurde, was zu einer falschenctrl_statedes erweiterten MCX-Gatters führte. Beachten Sie, dass die expliziten MCX-KlassenCXGate,CCXGate,C3XGateund bereitsC4XGatekorrekt verarbeitet wurden. -
Die Verwerfungswarnung für Python 3.9 wurde korrigiert, so dass beim Importieren von Qiskit korrekt erkannt wird, dass sie durch Anwendercode verursacht wurde. Zuvor konnte nicht erkannt werden, dass es sich um einen vom Benutzer verursachten Code handelte, und dies bedeutete, dass die Standard-Warnfilter von Python dem Benutzer die Warnung nicht anzeigten.
-
Ein Fehler in
PhaseOracle,PhaseOracleGateund wurdeBitFlipOracleGatebehoben, bei dem beim Versuch, aus einer Dimacs-Datei zu laden, ein Fehler auftratTypeError. -
Ein Fehler im
ElidePermutationsTranspiler-Durchlauf wurde behoben, bei dem die Qubit-Zuordnung bei Vorhandensein vonPermutationGates nicht korrekt aktualisiert wurde, was zu falschen Schaltkreisen und Aktualisierungen des Eigenschaftensatzes des Durchlaufmanagers führte. -
Der integrierte Transpiler, der diese
final_layoutEigenschaft festlegt, aktualisiert dieses Feld nun korrekt, wenn es bereits festgelegt war. Dies lässt sich daran erkennen, dass die Methode nach mehr als einemTranspileLayout.routing_permutationDurchlauf, der setztfinal_layout, nun eine korrekte Permutation zurückgibt.Dies hatte keine Auswirkungen auf normale Aufrufe von
transpile()odergenerate_preset_pass_manager()unter Verwendung der in Qiskit integrierten Plugins; keine in dieser Form erstellte Pipeline würde versuchen, mehr als einmalfinal_layoutzu setzen. -
Ein Fehler im
HighLevelSynthesisPass wurde behoben, durch den Objekte mit klassischen Registern in der Schaltung dem relativen Index im Objekt zugeordnet wurden, anstatt dem entsprechenden Index in der äußeren Schaltung. Die klassischen Register sind nun korrekt dem äußeren Schaltungsindex zugeordnet. -
Ein Fehler wurde behoben,
Target.instruction_supported()bei dem die Überprüfung der Qubit-Reihenfolge der Anweisung übersprungen wurde, wenn die Methode mit Argumenten aufgerufenoperation_name``parameterswurde, die mit einer vorhandenen Anweisung übereinstimmten. -
Das Verhalten des
max_trialsArguments für wurdeVF2Layoutkorrigiert, wenn es aufNoneoder eine negative Zahl gesetzt ist. Der Pass wurde so dokumentiert, dass die Suche auf die Größe des Schaltkreises oder Ziels beschränkt wurde, wenn die Option aufNonegesetzt war, und dass negative Werte akzeptiert wurden, um eine unbegrenzte Suche anzugeben. In „ 2.1.0 ” wurde dieses Verhalten jedoch fälschlicherweise so geändert, dass eineNoneunbegrenzte Suche durchführte und die Verwendung einer negativen Zahl einen Fehler auslöste. Diese Fehler wurden korrigiert, sodass der Pass nun wie dokumentiert funktioniert und mit früheren Versionen übereinstimmt. -
Ein Problem in Plugins für die
MCXSynthesis1DirtyKG24MCXSynthesis2DirtyKG24High-Level-SyntheseMCXGateund wurde behoben, bei dem die Plugins verfügbare saubere Hilfsqubits nicht als verfügbare schmutzige Hilfsqubits berücksichtigten. Insbesondere wurde dasMCXSynthesis2DirtyKG24Plugin nicht angewendet, wenn ein sauberes und ein verschmutztes Hilfsqubit verfügbar waren. -
Die
PauliEvolutionGate.to_matrix()Methode gibt nun den exakten Matrixexponential zurück, wobei dieoperatorund die antimedas Gate übergebene ist. Dies behebt ein unerwartetes Verhalten, da die MatrixPauliEvolutionGatelaut Dokumentation die genaue Zeitentwicklung darstellt, zuvor jedoch davon abhängig war, wie der Compiler die Zeitentwicklung approximiert. Dieto_matrixMethode stimmt nun mit der Dokumentation überein. -
Eine Leistungsverschlechterung beim inkrementellen Erstellen
ParameterExpressiondurch die Kombination einer großen Anzahl von Unterausdrücken wurde behoben. Behoben #14653 -
Es wurde ein Fehler behoben, der beim Export von Schaltungen mit Verzögerungsanweisungen in 'ps'-Einheiten nach QASM3 auftrat.
-
Ein Randfall bei der Anzeige der
QFTSchaltung wurde behoben. Zuvor wurde,QFT.inverse()wenn aufgerufen und anschließend die Attribute des QFT-Schaltkreises geändert wurden, das QFT als"IQFT_dg"angezeigt. Dies war falsch, und jetzt wird es korrekt angezeigt"IQFT". Fehler Nr. 14758 behoben. -
Ein Fehler im
PauliEvolutionSynthesisRustiqPlugin wurde behoben, der zu falschen Schaltkreisen führte, wenn der Operator eines ObjektePauliEvolutionGatevom TypSparseObservableenthielt.Zum Beispiel:
from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparseObservable, Operator from qiskit.transpiler.passes.synthesis.hls_plugins import PauliEvolutionSynthesisRustiq obs = SparseObservable.from_sparse_list([("1+XY", (0, 1, 2, 3), 1.5)], num_qubits=4) evo = PauliEvolutionGate(obs, 1) qct = PauliEvolutionSynthesisRustiq().run(evo) assert Operator(qct) == Operator(evo) -
Ein Problem mit der
generate_preset_pass_manager()Funktion wurde behoben, bei dem die in einemTargetObjekt enthaltenen Zeitbeschränkungsdaten fälschlicherweise ignoriert wurden, wenn dasbackendArgument nicht festgelegt war. Behoben #14329 -
Es wurde ein Fehler in
ObservablesArray.coerce_observable()behoben, bei dem eine Ausnahme, dass ein Observable nicht hermitisch war, übermäßig ausgelöst wurde. Observables, die gleichzerosind, sind nicht erlaubt und führen nun zu einem eleganten Fehler. -
qiskit.circuit.library.quantum_volume()wurde aktualisiert, um einnumpy.random.Generatorals Eingabe für seinseedArgument zu verarbeiten. Bisher hätte ein solches Generatorargument zu einemTypeError. geführt. -
QuantumCircuit.compose()wird nun alle Variablen und Strecken, die inDelayAnweisungen verwendet werden, korrekt neu zuordnen, wenn dasvar_remapArgument angegeben ist. -
SabreLayoutverwendet als einen seiner Versuche ein „dichtes Teilmengen“-Layout, das dem gleichen Algorithmus wie folgtDenseLayout. Zuvor ordnete die von Sabre verwendete Version jedoch alle virtuellen Qubits, einschließlich Dummy-Ancillas, einem physikalischen Qubit zu, was die Effektivität des Algorithmus beeinträchtigte, jedoch nicht dessen Korrektheit. Sabre wird nun nur noch die vom Benutzer für diesen ersten Versuch definierten virtuellen Qubits verwenden, was bei einer Mittelung über große Schaltungsklassen zu geringfügigen Verbesserungen bei der Layout-Auswahl führen kann. -
Ein Fehler wurde behoben,
SparsePauliOp.simplify()bei dem die Methode Pauli-Terme basierend auf der Größe ihrer Koeffizienten entfernte, bevor Duplikate kombiniert wurden. Dies führte zu fehlerhaftem Verhalten in zwei wichtigen Randfällen:- Wenn mehrere identische Pauli-Terme kleine Koeffizienten hatten, die einzeln unter der Vereinfachungsschwelle lagen, deren Summe aber die Schwelle überstieg, wurden diese Terme fälschlicherweise entfernt.
- Wenn mehrere identische Pauli-Terme Koeffizienten oberhalb des Schwellenwerts hatten, aber in der Summe nahe Null waren, wurden sie fälschlicherweise beibehalten.
Siehe #14194 für weitere Einzelheiten.
-
TranspileLayout.initial_index_layout()behandelt nun dasfilter_ancillas=TrueArgument korrekt, wenn die virtuellen Qubits im Index nicht vom Konstruktor ininitial_layoutIndexreihenfolge angegeben wurden. -
VF2LayoutundVF2PostLayoutwird nun korrekt (beliebige) Layout-Zuweisungen für vollständig untätige Qubits enthalten. Bisher konnte dies möglicherweise durch fehlgeschlageneTranspileLayout.initial_index_layout()Aufrufe nach einer Kompilierung beobachtet werden. -
Ein Problem im
VF2PostLayoutTranspiler-Durchlauf wurde behoben. In bestimmten Situationen, in denen der Durchlauf mit dem Argumentstrict_direction=Trueausgeführt wurde, gab es ein potenzielles Problem mit der Laufzeitskalierung, wenn der Interaktionsgraph des Schaltkreises Qubits enthielt, die nur 1-Qubit-Operationen hatten. Diese Zuordnungsprobleme führen zu einer kombinatorischen Komplexität bei der Bewertung, die dazu führen würde, dass der Pass fast immer die Bewertungszeit überschreitet und in der Regel keine Verbesserung des Layouts bewirkt. Imstrict_direction=FalseModus gibt es eine optimierte Suchimplementierung für diese Probleme, aber die zusätzlichen Einschränkungen für machen diesenstrict_direction=TrueAnsatz nicht praktikabel. Stattdessen wird in diesenVF2PostLayoutFällen die Suche nun übersprungen, da das Layoutproblem für den Durchgang nicht realisierbar ist.
Sonstige Anmerkungen
- Die Implementierung des von
SabreLayoutund verwendetenSabreSwapSabre-Routings komprimiert nun Knotenfolgen, die innerhalb seiner internen virtuellen Interaktionsdarstellung automatisch gleichzeitig für das Routing in Frage kommen. Dies verbessert die Effizienz des Routings, reduziert den Zwischenspeicherbedarf und verhindert, dass eine Reihe von „ 2q “-Gattern dielookaheadheuristischen Komponenten verzerrt.
2.1.0rc1
Hinweise zu veralteten Versionen
-
Die Unterstützung für die Ausführung von Qiskit mit Python 3.9 ist veraltet und wird in der Qiskit 2.3.0 Version entfernt. Die 2.3.0 ist die erste Version, nachdem Python 3.9 das Ende seiner Lebensdauer erreicht hat und nicht mehr unterstützt wird. [1] Das bedeutet, dass Sie ab der Version 2.3.0 die von Ihnen verwendete Version Python auf Python 3.9 oder höher aktualisieren müssen.