Qiskit SDK 1.3 Versionshinweise
1.3.3
Vorspiel
Qiskit 1.3.3 ist ein kleineres Bugfix-Release für die 1.3 Serie.
Fehlerkorrekturen
-
Es wurde ein Fehler behoben, bei dem die Schrankenbeschriftungen falsch positioniert waren, wenn der Parameter
reverse_bits = Truein derQuantumCircuit.draw()methode. Der Fehler führte dazu, dass die Beschriftungen von Barriereoperationen falsch ausgerichtet waren, was zu Verwirrung bei der Darstellung von Schaltkreisen führen konnte. Behoben #13609. -
Anwendung eines kleinen Regularisierungsfaktors gegen schlecht konditionierte hermitsche Matrizen in Super-Operator-Darstellungen.
-
Vergleiche von
Delayanweisungen, auch innerhalb von Schaltkreisen, erfordern nun, dass sowohl die Einheiten als auch der Dauerwert gleich sind. Behebt #13812. -
Es wurde ein Fehler in der
CommutationCheckerder fehlschlagen konnte, wenn man die Kommutationsbeziehung einer Zwei-Qubit-Pauli-Drehung mit einem Gatter prüfte, das sich nicht im Kommutations-Cache befindet. Zum Beispiel:import numpy as np from qiskit.circuit.library import RXXGate, RGate from qiskit.circuit.commutation_library import SessionCommutationChecker as scc res = scc.commute(RGate(2, 2), [1], [], RXXGate(np.pi / 2), [0, 1], [])Dieses Verhalten ist nun behoben und die Kommutationsbeziehung wird korrekt berechnet. Behoben #13742.
-
Ein Fehler wurde behoben, bei dem
QuantumCircuit.qubit_stop_time()undQuantumCircuit.qubit_duration()eine falsche Zeit (Dauer) zurückgab. Das Problem wurde ausgelöst, wenn einige Qubits Anweisungen haben, andere Qubits aber im Leerlauf sind. Behebt #8729. -
Es wurde ein Fehler im
RemoveIdentityEquivalenttranspiler-Durchgang behoben, bei dem Gatter in der Nähe der Identität bis zu einer globalen Phase aus der Schaltung entfernt wurden, die globale Phase der Schaltung aber nicht aktualisiert wurde. Insbesondere,RemoveIdentityEquivalententfernt jetzt nicht parametrisierteGlobalPhaseGategatter. Behebt #13778. -
Es wurde ein Fehler in
random_clifford()behoben, der verhinderte, dass die gesamte Clifford-Gruppe abgetastet wurde. Behebt #13606. -
Wenn
SabreLayoutverwendet wird, um sowohl Layout als auch Routing gleichzeitig durchzuführen (wie es bei den Standardoptionen fürtranspile()undgenerate_preset_pass_manager()) auf einerTargetoderCouplingMapmit disjunkten Verbindungen verwendet wird und die Eingabeschaltung in eine einzige Komponente der Kopplungskarte passt, wird die Routing-Permutation nun korrekt verfolgt.Zuvor wurden alle Qubits in der Kopplungskarte, die nicht, auch nicht indirekt, mit einem Qubit verbunden waren, das von der gerouteten Schaltung verwendet wurde, nicht in die endgültige Routing-Permutation einbezogen. Dies könnte zu einem überraschenden Verhalten führen, das weit vom Fehlerpunkt entfernt ist, selbst wenn die Kompilierung erfolgreich zu sein scheint, wie z. B. die Aufrufe von
TranspileLayout.final_index_layout()aufrufen vonKeyError.Dieser Fehler wirkte sich nicht auf Backends aus, die vollständig verbunden waren, was bei den meisten der Fall ist. Behebt #13732.
1.3.2
Vorspiel
Qiskit 1.3.2 ist ein kleineres Bugfix-Release für die 1.3 Serie.
Hinweise zum Upgrade der Synthese
- Die High-Level-Synthese-Plugins für
LinearFunctionlösen nicht mehr einen Fehler aus, wenn ein anderes Objekt alsLinearFunctionan die Methoderunübergeben wird. Stattdessen geben sie nunNonezurück, was mit anderen Plugins übereinstimmt. Wenn Sie sich darauf verlassen haben, dass dieser Fehler ausgelöst wird, können Sie manuell eine Instanzprüfung durchführen.
Fehlerkorrekturen
-
Zuvor hatte der
CommutationCheckereifrig die Kommutationsbeziehungen vonInstructions mit float-onlyparamsals Schlüssel zur Abfrage der Beziehung. Dies könnte zu falschen Ergebnissen führen, wenn die Definition der Anweisung von zusätzlichen Informationen abhängt, die nicht nur dasparamsattribut abhängt, wie z. B. im Fall vonPauliEvolutionGate. Dieses Verhalten ist nun behoben, und der Kommutationsprüfer speichert Kommutationen nur noch für Qiskit-native Standardgatter. Bei benutzerdefinierten Gattern kann diese Änderung zu Leistungseinbußen führen, garantiert jedoch korrekte Ergebnisse, da eine unsichere Zwischenspeicherung vermieden wird. -
Es wurde ein Fehler in der
CommutationCheckerbehoben, bei dem die Überprüfung der Kommutierungsbeziehungen einer Anweisung mit nicht-numerischen Werten imparamsattribut (wie im Fall vonPauliGate) einen Fehler auslösen konnte. Behoben #13570. -
Die
CommutationCheckerbehandelte die Kommutationen derCRXGate,CRYGateundCRZGatefür Drehwinkel der Form , mit . In diesen Fällen wurde fälschlicherweise angenommen, dass diese Gatter mit jedem Gatter kommutieren. Dieses Verhalten ist nun behoben, und diese Gatter pendeln nur dann korrekt mit jedem Gatter, wenn der Drehwinkel ein Vielfaches von ist. -
Es wurde ein Fehler behoben, der dazu führte, dass die folgenden Funktionen der Schaltungsbibliothek Fehler produzierten, wenn sie mit
num_qubits=1aufgerufen wurden:efficient_su2(),real_amplitudes(),excitation_preserving()undpauli_two_design()(für ein einzelnes Qubit enthalten diese Schaltungen keine 2-Qubit-Gatter). Behoben #13480. -
Es wurde ein Fehler behoben, bei dem eine Anweisung mit dem Namen
"mcmt"fälschlicherweise an die High-Level-Syntheseroutine für eineMCMTGateübergeben wurde, was zu einem Fehler oder einem ungültigen Ergebnis führte. Dieses Problem könnte zum Beispiel auftreten, wenn dieMCMTschaltkreis mit der Bezeichnung"mcmt"behandelt und implizit in eine Anweisung umgewandelt wird (z. B. beim Anhängen an einen anderen Schaltkreis). Behoben #13563. -
Es wurde ein Fehler behoben, bei dem die Standard-Produktformelsynthese für
PauliEvolutionGatenicht korrekt mit allen identischen Termen im Operator umgehen konnte. Der All-Identity-Term sollte eine globale Phase gleich-evolution_timeeinführen, lag aber um den Faktor 2 daneben und könnte bei parametrisierten Zeiten brechen. Behoben #13625. Behoben #13675. Behoben #13644. -
Es wurde eine Inkonsistenz in der Schaltung behoben, die durch die Pauli-Evolution-Synthese mit
SuzukiTrotteroderLieTrotter(die Standardmethode) erzeugt wurde. Bei parametrisierten Evolutionszeiten enthielten die resultierenden Schaltungen Parameter mit einem ungewollten komplexen Nullteil, der die Ausgabe vonParameterExpression.sympify(). Die Ausgabe enthält nun korrekt nur reelle Werte. Behoben #13642. -
Ein Fehler wurde behoben, der dazu führte, dass
PauliList.insert()mitqubit=Trueein Phasenattribut mit der falschen Form erzeugte, wenn das ursprüngliche Objekt die Länge 1 hatte. Behoben #13623. -
Es wurde ein Fehler in
qasm3.Exporterbehoben, der zum Absturz des Exporters führte, wenn er ein unitäres Tor aufgrund einer falschen Verarbeitung seinesparamsFeldes behandelte. Behoben #13362. -
Es wurde ein Fehler in der
Target.instruction_supported()methode behoben, bei der Ziele mitself.num_qubits==Noneunabhängig von der unterstützten Basismenge immerFalsezurückgaben. -
Es wurde ein Fehler im
UnitarySynthesistranspiler-Durchgang, bei dem Blöcke vonUnitaryGates auf 3 Qubits oder mehr nicht korrekt synthetisiert wurden. Dies führte z. B. dazu, dass die Schaltung mit dem zuletzt bearbeiteten Block überschrieben wurde oder dass es zu internen Paniken kam, wenn nach einem solchen Block Messungen durchgeführt wurden. Behoben #13586. -
Es wurde ein Fehler im
UnitarySynthesistranspiler-Durchgang behoben, bei dem non-2-qubit Gatter in die verfügbare 2-Qubit-Basis eingeschlossen wurden, wodurchTwoQubitWeylDecompositionaufgrund der Dimensionsinkongruenz in Panik geriet. -
Ein Fehler wurde behoben, bei dem die Initialisierung
SparsePauliOpmit einer großen Anzahl von Pauli-Y-Termen (typischerweise ) und ohne explizitescoeffszu einem Koeffizienten nahe bei 1, aber mit einem Fließkommafehler führte. Der Koeffizient ist jetzt standardmäßig korrekt 1. Behoben #13522.
1.3.1
Vorspiel
Qiskit 1.3.1 ist ein kleineres Bugfix-Release für die 1.3 Serie.
Hinweise zur Aktualisierung von Schaltkreisen
- Die generische Kontrollmethode für Gatter vermeidet jetzt den Versuch, Gatter in eine unterstützte Basis zu übersetzen, wenn das Gatter bereits unterstützt wird. Dies kann die Synthese des gesteuerten Gatters geringfügig verändern, sollte aber die Anzahl der Zwei-Qubit-Gatter nicht erhöhen.
Fehlerkorrekturen
-
Ein Fehler wurde behoben, bei dem der Aufruf von
QuantumCircuit.decompose()auf eine Anweisung, die keine Definition innerhalb einesc_if-Blocks hatte, einen Fehler auslöste. Behoben #13493. -
Operationen innerhalb einer Kontrollflussoperation (z. B.
QuantumCircuit.for_loop()) nicht korrekt zerlegt wurden, wenn manQuantumCircuit.decompose(). Behoben #13544. -
Standarddefinitionen hinzugefügt für
FullAdderGate,HalfAdderGate,ModularAdderGateundMultiplierGategatter, wodurchOperators aus Quantenschaltungen, die diese Gatter enthalten, konstruiert werden können. -
Korrektur der Anzahl der sauberen Ancilla-Qubits, die für
FullAdderSynthesisV95,HalfAdderSynthesisV95, undModularAdderSynthesisV95plugins. -
Fehlendes
FullAdderSynthesisDefaultplugin hinzugefügt, das die beste Dekomposition fürFullAdderGateauf der Grundlage der Anzahl der verfügbaren sauberen Ancilla-Qubits auswählt. -
Festgelegt
HalfAdderSynthesisDefaultundModularAdderSynthesisDefaultplugins, fürHalfAdderGateundModularAdderGateum die beste Zerlegung auf der Grundlage der Anzahl der verfügbaren sauberen Ancilla-Qubits zu wählen. -
Ein falsches Caching-Verhalten bei der Parameterzuweisung wurde behoben, das dazu führen konnte, dass Definitionen innerhalb der
EquivalenceLibrarykorrumpiert werden konnten. Dadurch werden unerwartete Probleme bei der parallelen Ausführung der Basisübersetzung behoben. Behoben #13504. -
Bei der Bearbeitung von Schaltkreisen mit parametrisierten globalen Phasen wurde eine Reihe von Fehlern behoben, bei denen die globale Phase während der Parameterzuweisung nicht korrekt zugewiesen wurde. Zu den bekannten Fällen, die davon betroffen sind, gehören:
- zuweisung von Parametern nach dem Aufruf
QuantumCircuit.decompose()auf eine Schaltung, bei der die Zerlegung eine globale Phase einführt - zuweisung von Parametern zu einem aus einem DAG konstruierten Schaltkreis über
dag_to_circuit() - zuweisung von Parametern an Schaltungen, die mit
pauli_twirl_2q_gates()erstellten Schaltungen zugewiesen, wobei die zu verdrehende Schaltung eine parametrisierte globale Phase hatte
Behoben #13534.
- zuweisung von Parametern nach dem Aufruf
-
Es wurde ein Fehler in
RZGate.control()für mehr als 1 Kontroll-Qubit, der eine unnötig teure Dekomposition verwendete. Behoben #13473.
1.3.0
Vorspiel
Qiskit Version 1.3.0 bringt wesentliche Leistungs- und Qualitätsverbesserungen für den Transpiler. In dieser neuen Version von Qiskit wurden viele neue Funktionen, Fehlerbehebungen und Verbesserungen eingeführt, die wichtigsten davon sind:
Die Kerndatenstrukturen für die Transpilation in Qiskit wurden intern nach Rust portiert. Dazu gehören Komponenten wie die
DAGCircuit,Target,EquivalenceLibraryund andere. Die öffentlichen APIs für alle diese Datenstrukturen bleiben unverändert, aber die Leistung hat sich nach den Umschreibungen verbessert.Die meisten der vom Preset Pass Manager verwendeten Transpiler-Passes wurden nach Rust portiert, was bei den Benchpress-Benchmarks zu einer durchschnittlichen Verbesserung der Gesamtlaufzeit von 6x im Vergleich zu Qiskit 1.2.4 führte. Zu den besonders wirkungsvollen Pässen, die von den Überarbeitungen stark profitierten, gehörten die
BasisTranslator,CommutationAnalysis,ConsolidateBlocks, undUnitarySynthesis. Eine vollständige Liste der portierten Pässe finden Sie in den Hinweisen zur Funktionsfreigabe.Verbesserungen an der Schaltungsbibliothek, die die Qualität der Kompilierung und die Geschwindigkeit der Schaltungserstellung erhöhen. Die Operationen werden nun unterschieden in:
- Strukturelle Operationen, die eine eindeutige Zerlegung haben und als Funktionen dargestellt werden, die eine
QuantumCircuit(zum Beispiel:real_amplitudes()). Die meisten dieser Funktionen sind in Rust erstellt, was zu einer deutlich schnelleren Laufzeit beim Aufbau von Schaltungen führt.- Abstrakte Operationen, die mit Hilfe verschiedener Zerlegungen implementiert werden können, werden dargestellt als
GateoderInstructiondargestellt (zum Beispiel:PauliEvolutionGate). Dies ermöglicht den Aufbau eines abstrakten Quantenschaltkreises und lässt den Compiler die optimale Zerlegung wählen.Die Verwendung einer abstrakten Schaltungsbeschreibung ist besonders leistungsfähig in Kombination mit Verbesserungen des
HighLevelSynthesistranspiler-Pass, der nun ungenutzte Hilfsqubits berücksichtigen kann, um die beste verfügbare Zerlegung für ein bestimmtes Gatter zu finden.Die minimal unterstützte Version von Python ist jetzt 3.9, da Python 3.8 im Jahr 2024-10 ausläuft. Offizielle Unterstützung für Python 3.13 wurde ebenfalls in dieser Version hinzugefügt.
Schaltkreise Funktionen
-
Verbessert die Funktionalität von
CommutationCheckerum die Unterstützung für die folgenden parametrisierten Gatter mit freien Parametern:RXXGate,RYYGate,RZZGate,RZXGate,RXGate,RYGate,RZGate,PhaseGate,U1Gate,CRXGate,CRYGate,CRZGate,CPhaseGate. Vorher wurden diese nur mit gebundenen Parametern unterstützt. -
Eine neue Funktion hinzugefügt
quantum_volume()zur Erzeugung eines QuantenvolumenQuantumCircuitobjekts wie in A definiert. Kreuz et al. Validierung von Quantencomputern mit Hilfe von randomisierten Modellschaltungen, Phys. Rev. A 100, 032328 (2019). Diese neue Funktion unterscheidet sich von der bestehendenQuantumVolumeklasse dadurch, dass sie einQuantumCircuitobjekt zurückgibt, anstatt ein Unterklassenobjekt zu erzeugen. Zweitens ist diese neue Funktion multithreaded und in Rust implementiert, so dass sie die Ausgabeschaltung ~10x schneller erzeugt als dieQuantumVolumeklasse. -
Verbesserung der Laufzeitleistung bei der Konstruktion der
QuantumVolumeklasse, wenn das Argumentclassical_permutationaufTruegesetzt ist. Intern ruft es nun diequantum_volume()funktion auf, die in Rust geschrieben ist und ~10x schneller ist, wenn sie eine Quantenvolumenschaltung erzeugt. -
Eine neue Funktion zur Schaltkreismanipulation wurde hinzugefügt
pauli_twirl_2q_gates()die verwendet werden kann, um Pauli-Twirling auf einen gegebenen Schaltkreis anzuwenden. Dies funktioniert nur, wenn ein fester Satz von Zwei-Qubit-Toren gedreht wird, derzeitCXGate,ECRGate,CZGate,iSwapGate. Zum Beispiel:from qiskit.circuit import QuantumCircuit, pauli_twirl_2q_gates qc = QuantumCircuit(2) qc.cx(0, 1) twirled_circuit = pauli_twirl_2q_gates(qc, seed=123456) twirled_circuit.draw("mpl")
-
Hinzugefügt wurden binäre arithmetische Gatter für die Inplace-Addition von zwei -qubit-Registern, also . Das
ModularAdderGateimplementiert die Addition modulo , dasHalfAdderGateenthält ein Carry-Out-Qubit, und dasFullAdderGateenthält sowohl ein Carry-In- als auch ein Carry-Out-Qubit. Einzelheiten und Beispiele finden Sie in der entsprechenden Dokumentation.Im Gegensatz zu den bestehenden Bibliotheksschaltungen, wie z. B
CDKMRippleCarryAddererlaubt die Handhabung des abstrakten Gatters dem Compiler (oder dem Benutzer), die optimale Gattersynthese je nach Kontext der Schaltung zu wählen. -
Hinzugefügt wurde die
MultiplierGatefür die Multiplikation von zwei -qubit Registern, also . Siehe die Klassendokumentation für Details und Beispiele. -
Die booleschen logischen Quantenschaltungen in
qiskit.circuit.libraryhaben jetzt äquivalente Darstellungen alsGateobjekte, was ihre Verwendung mitHighLevelSynthesistranspiler-Pass und Plugin-Infrastruktur.AndGate, VertretungAND,OrGate, VertretungOR,BitwiseXorGate, VertretungXOR,InnerProductGate, stellvertretend fürInnerProduct.
-
Spezialisierte Implementierungen von
__eq__()wurden für alle Gatter der Standardbibliothek hinzugefügt. Die meisten Standard-Gates waren bereits auf diese Methode spezialisiert, einige wenige jedoch nicht, was zu erheblichen Verlangsamungen an unerwarteten Stellen führen konnte. -
Hinzugefügt
evolved_operator_ansatz(),hamiltonian_variational_ansatz(), undqaoa_ansatz()in die Schaltkreisbibliothek aufgenommen, um Variationsschaltungen auf der Grundlage von Operatorentwicklungen zu implementieren.evolved_operator_ansatz()undqaoa_ansatz()sind funktional äquivalent zuEvolvedOperatorAnsatzundQAOAAnsatzäquivalent, aber im Allgemeinen leistungsfähiger.Das Programm
hamiltonian_variational_ansatz()ist darauf ausgelegt, einen einzelnen Hamiltonianer zu nehmen und ihn automatisch in kommutierende Terme aufzuspalten, um einen Hamiltonianer-Variationsansatz zu implementieren. Dies konnte bereits manuell mit der TasteEvolvedOperatorAnsatzerreicht werden, ist aber jetzt bequemer zu handhaben. -
Hinzugefügt
grover_operator()um eine Grover-Operator-Schaltung zu konstruieren, die z. B. für den Grover-Algorithmus und die Amplitudenschätzung/-verstärkung verwendet wird. Diese Funktion ist vergleichbar mitGroverOperator, verlangt aber nicht, dass Sie die Implementierung des mehrfach gesteuerten X-Gatters wählen, sondern lässt den Compiler die optimale Zerlegung bestimmen. Außerdem wird die Schaltung nicht in ein undurchsichtiges Gatter verpackt und ist schneller, da weniger Zerlegungen für die Transpilierung erforderlich sind.from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import grover_operator oracle = QuantumCircuit(2) oracle.z(0) # good state = first qubit is |1> grover_op = grover_operator(oracle, insert_barriers=True) grover_op.draw('mpl')
-
Ein neues Datenattribut,
qiskit.circuit.CONTROL_FLOW_OP_NAMESsteht zur Verfügung, mit dem man leicht feststellen und überprüfen kann, ob eine bestimmteInstructioneine namentliche Kontrollflussoperation ist. -
Die Standard-Äquivalenzbibliothek (
SessionEquivalenceLibrary) verfügt nun über Regeln, die direkt zwischen den kontinuierlichen Ising-Interaktionen der Standardbibliothek 2q von Qiskit konvertieren können (z. B.CPhaseGate,RZZGate,RZXGateund so weiter) unter Verwendung lokaler Äquivalenzbeziehungen konvertieren können. Früher liefen mehrere dieser Umwandlungen über eine 2-CX-Form, was zu einer weniger effizienten Schaltungserstellung führte.AnmerkungIm Allgemeinen ist die
BasisTranslatornicht garantiert, dass es die "beste" Äquivalenzrelation für eine gegebeneTargetzu finden, aber es wird immer eine Äquivalenz finden, wenn eine existiert. Wir verlassen uns auf teurere Resynthese- und Gatter-Optimierungsläufe im Transpiler, um das Ergebnis zu verbessern. Diese Durchgänge sind derzeit für Basissätze mit einer kontinuierlich parametrisierten Zwei-Qubit-Wechselwirkung nicht so effektiv wie für diskrete supergesteuerte Zwei-Qubit-Wechselwirkungen. -
Ein neues Argument
"apply_synthesis"wurde zuDecomposehinzugefügt, das es dem Transpiler-Pass erlaubt, High-Level-Synthese anzuwenden, um Objekte zu zerlegen, die nur durch eine Syntheseroutine definiert sind. Zum Beispiel:from qiskit import QuantumCircuit from qiskit.quantum_info import Clifford from qiskit.transpiler.passes import Decompose cliff = Clifford(HGate()) circuit = QuantumCircuit(1) circuit.append(cliff, [0]) # Clifford has no .definition, it is only defined by synthesis nothing_happened = Decompose()(circuit) # this internally runs the HighLevelSynthesis pass to decompose the Clifford decomposed = Decompose(apply_synthesis=True)(circuit) -
Hinzufügen der
iqp()funktion zur Konstruktion von Schaltungen in Instantaneous Quantum Polynomial Time (IQP). Zusätzlich zu der bestehendenIQPklasse ermöglicht die Funktion auch die Konstruktion von zufälligen IQP-Schaltungen:from qiskit.circuit.library import random_iqp random_iqp = random_iqp(num_qubits=4) random_iqp.draw('mpl')
-
Hinzufügen der
MCMTGatehinzugefügt, um eine Multi-Control-Multi-Target-Operation als Gate darzustellen. Diese Gatterdarstellung der bestehendenMCMTschaltung ermöglicht es dem Compiler, die beste verfügbare Implementierung entsprechend der Anzahl und dem Zustand der in der Schaltung vorhandenen Hilfsqubits auszuwählen.Die gewünschte Implementierung kann durch Angabe des High-Level-Synthese-Plugins gewählt werden:
from qiskit import QuantumCircuit, transpile from qiskit.circuit.library import MCMTGate, HGate from qiskit.transpiler.passes import HLSConfig # used for the synthesis config mcmt = MCMTGate(HGate(), num_ctrl_qubits=5, num_target_qubits=3) circuit = QuantumCircuit(20) circuit.append(mcmt, range(mcmt.num_qubits)) config = HLSConfig(mcmt=["vchain"]) # alternatively use the "noaux" method synthesized = transpile(circuit, hls_config=config)Zusätzlich unterstützt die
MCMTGateauch benutzerdefinierte (d.h. offene) Kontrollzustände der Kontroll-Qubits. -
Im Rahmen der Modernisierung der Schaltungsbibliothek wird jede der folgenden Quantenschaltungen entweder auch als
Gateobjekt dargestellt oder kann mit einer Synthesemethode konstruiert werden:GraphStatewird dargestellt durchGraphStateGate,FourierCheckingkann konstruiert werden mitfourier_checking(),UnitaryOverlapkann konstruiert werden mitunitary_overlap(),HiddenLinearFunctionkann konstruiert werden mithidden_linear_function(),PhaseEstimationkann konstruiert werden mitphase_estimation().
-
Die Klasse
CommutationCheckerklasse wurde in Rust umgeschrieben. Diese Klasse hat dieselbe Funktionalität und öffentliche API wie zuvor, ist aber in den meisten Fällen jetzt deutlich schneller. -
PauliFeatureMapundZZFeatureMapunterstützen nun die Angabe der Verschränkung als Wörterbuch, wobei die Schlüssel die Anzahl der Qubits darstellen und die Werte Listen von ganzzahligen Tupeln sind, die definieren, welche Qubits miteinander verschränkt sind. Dies ermöglicht eine größere Flexibilität bei der Erstellung von Merkmalskarten, die auf bestimmte Quantenalgorithmen zugeschnitten sind. Beispielverwendung:from qiskit.circuit.library import PauliFeatureMap entanglement = { 1: [(0,), (2,)], 2: [(0, 1), (1, 2)], 3: [(0, 1, 2)], } qc = PauliFeatureMap(3, reps=2, paulis=['Z', 'ZZ', 'ZZZ'], entanglement=entanglement, insert_barriers=True) qc.decompose().draw('mpl') -
Die
count_ops()methode inQuantumCircuitwurde in Rust neu geschrieben. Er läuft jetzt zwischen 3 und 9 Mal schneller. -
Funktionen der Schaltungsbibliothek hinzugefügt
pauli_feature_map(),z_feature_map(),zz_feature_map()zum Aufbau von Pauli-Feature-Map-Schaltungen. Diese Funktionen sind etwa 8x schneller als die aktuellen Objekte der Schaltkreisbibliothek,PauliFeatureMap,ZFeatureMap, undZZFeatureMapund werden sie in Zukunft ersetzen.Die Funktionen können als Drop-in-Ersatz verwendet werden:
from qiskit.circuit.library import pauli_feature_map, PauliFeatureMap fm = pauli_feature_map(20, paulis=["z", "xx", "yyy"]) also_fm = PauliFeatureMap(20, paulis=["z", "xx", "yyy"]).decompose()
Primitive Funktionen
-
Unterstützung für Daten der Ebene 1 wurde hinzugefügt in
BackendSamplerV2hinzugefügt, ebenso wie die Unterstützung für die Übergabe von Optionen an die Methoderun()der verpacktenBackendV2. Die Laufoptionen können durch einen"run_options"Eintrag imoptionsWörterbuch angegeben werden, das anBackendSamplerV2. Der Eintrag"run_options"sollte ein Wörterbuch sein, das die Namen der Argumente auf Werte abbildet, die an die Methoderun()des Backends übergeben werden. Wenn in den Ausführungsoptionen"meas_level = 1 "eingestellt ist, werden die Ergebnisse aus dem Backend als Level-1-Ergebnisse anstelle von Bit-Arrays (dem Level-2-Format) behandelt. -
EstimatorundStatevectorEstimatorerwartungswerte auf stochastische Weise zurückgeben, wenn die Eingangsschaltung für einige Teilsysteme einen Reset beinhaltet. Das Ergebnis war bisher nicht reproduzierbar, kann aber jetzt reproduziert werden, wenn ein Zufallswert gesetzt wird. Zum Beispiel:from qiskit.primitives import StatevectorEstimator estimator = StatevectorEstimator(seed=123)oder:
from qiskit.primitives import Estimator estimator = Estimator(options={"seed":123})
OpenQASM Funktionen
- Die Klasse
qasm3.CustomGateist jetzt programmatisch inspizierbar. Seineconstructor,name,num_paramsundnum_qubitskönnen nun von Python aus eingesehen werden, nachdem das Objekt konstruiert worden ist. Dies ermöglicht Ihnen, den Inhalt der bereitgestellten Datenattribute wieSTDGATES_INC_GATES.
QPY-Funktionen
- Hinzufügen eines neuen QPY-Formats Version 13, das eine Qiskit-eigene Darstellung von
ParameterExpressionobjekten.
Quanteninformationsmerkmale
-
Die Leistung von
SparsePauliOp.from_operator()wurde auf der Grundlage der in Qiskit 1.0 eingeführten Methoden zur Verbesserung des Algorithmus optimiert. Die Zerlegung eines 10q -Operators mit allen Pauli-Termen ist jetzt etwa fünfmal schneller als zuvor für vollständig dichte Matrizen und dauert etwa 40ms. -
Ein neues Argument
assume_unitarywurde zuqiskit.quantum_info.Operator.power(). BeiTrueverwenden wir eine schnellere Methode auf der Grundlage der Schur-Zerlegung, umOperatorauf eine gebrochene Potenz zu erhöhen. -
Hinzugefügt
SparsePauliOp.to_sparse_list()um einen Operator in ein Sparse-List-Format zu konvertieren. Dies funktioniert in umgekehrter Weise wieSparsePauliOp.from_sparse_list(). Zum Beispiel:from qiskit.quantum_info import SparsePauliOp op = SparsePauliOp(["XIII", "IZZI"], coeffs=[1, 2]) sparse = op.to_sparse_list() # [("X", [3], 1), ("ZZ", [1, 2], 2)] other = SparsePauliOp.from_sparse_list(sparse, op.num_qubits) print(other == op) # True -
Die Leistung von
Pauli.to_label()hat sich für große Paulis deutlich verbessert. -
Die Methode
Operator.power()hat einen neuen Parameterbranch_cut_rotation. Damit kann der Verzweigungspunkt der Wurzel verschoben werden, was sich darauf auswirken kann, welche Matrix als Hauptwurzel gewählt wird. Standardmäßig ist sie auf eine kleine positive Drehung eingestellt, um Wurzeln von Operatoren mit einem reell-negativen Eigenwert (wie Pauli-Operatoren) stabiler gegenüber numerischen Präzisionsunterschieden zu machen. -
Es wurde eine neue Observable-Klasse hinzugefügt.
SparseObservablestellt Beobachtungswerte als Summe von Termen dar, ähnlich wieSparsePauliOp, jedoch mit zwei wesentlichen Unterschieden:- Jeder vollständige Begriff wird (effektiv) als eine Reihe von
(qubit, bit_term)Paaren gespeichert, ohne dass Qubits gespeichert werden, die die Identität für diesen Begriff erfahren. Dadurch wird die Speichernutzung von Observablen wie der gewichteten Summe von Paulis erheblich verbessert. - Das Alphabet der Ein-Qubit-Terme ist für den Operatorraum überkomplett; es kann Pauli-Operatoren darstellen (wie
SparsePauliOp), aber auch Projektoren auf die Eigenzustände der Pauli-Operatoren, wie . Solche Projektoren können auf der Hardware ebenso effizient gemessen werden wie der entsprechende Pauli-Operator, aberSparsePauliOpwürde eine exponentielle Anzahl von Termen erfordern, um über Qubits darzustellen, währendSparseObservablenur einen einzigen Term benötigt.
Sie können konstruieren und manipulieren
SparseObservableüber eine Schnittstelle, die den Benutzern vonSparsePauliOp:from qiskit.quantum_info import SparseObservable obs = SparseObservable.from_sparse_list([ ("XZY", (2, 1, 0), 1.5j), ("+-", (100, 99), 0.5j), ("01", (50, 49), 0.5), ])SparseObservablewird derzeit nicht als Eingabeformat für die Primitive (qiskit.primitives), aber wir gehen davon aus, dass diese Schnittstellen in Zukunft um diese Formate erweitert werden. - Jeder vollständige Begriff wird (effektiv) als eine Reihe von
Synthesefunktionen
-
Zusätzliche Synthesefunktionen
synth_mcx_gray_code()undsynth_mcx_noaux_v24()die mehrfach kontrollierte X-Gatter synthetisieren. Für diese Funktionen sind keine zusätzlichen Ancilla-Qubits erforderlich. -
Zusätzliche Synthesefunktionen
synth_c3x()undsynth_c4x()die 3 gesteuerte bzw. 4 gesteuerte X-Gates synthetisieren. -
Hinzufügen einer Synthesefunktion
synth_mcx_n_dirty_i15()die ein mehrfach kontrolliertes X-Gatter mit Kontrollen unter Verwendung von dirty ancillary qubits synthetisiert und eine Schaltung mit höchstens CX-Gattern erzeugt, von Iten et. al. (arXiv:1501.06911). -
Hinzufügen einer Synthesefunktion
synth_mcx_n_clean_m15()die ein mehrfach kontrolliertes X-Gatter mit Kontrollen unter Verwendung von sauberen zusätzlichen Qubits synthetisiert und eine Schaltung mit höchstens CX-Gattern erzeugt, von Maslov ( arXiv:1508.03273 ). -
Hinzufügen einer Synthesefunktion
synth_mcx_1_clean_b95()zur Synthese eines mehrfach gesteuerten X-Gatters mit Steuerungen unter Verwendung eines einzigen sauberen zusätzlichen Qubits, das eine Schaltung mit höchstens CX-Gattern erzeugt, von Barenco et al. ( arXiv:quant-ph/9503016 ). -
Hinzugefügt
adder_qft_d00(),adder_ripple_c04(), undadder_ripple_v95()um die Addiergatter zu synthetisieren,ModularAdderGate,HalfAdderGate, undFullAdderGate. -
Hinzugefügt
multiplier_cumulative_h18()undmultiplier_qft_r17()zur Synthese derMultiplierGate. -
Hinzugefügt
synth_mcmt_vchain()zur Synthese des Multi-Kontroll-Multi-Target-Gatters mit einer linearen Anzahl von Toffoli-Gattern und k-1 Hilfsqubits für k Kontrollqubits, zusammen mit dem High-Level-Synthese-PluginMCMTSynthesisVChain. -
Hinzufügen einer High-Level-Synthese-Plugin-Struktur für den
MCMTGate, einschließlich derMCMTSynthesisNoAux(für keine Hilfsqubits), die bereits erwähnteMCMTSynthesisVChain(mitnum_control - 1Hilfsqubits), und dieMCMTSynthesisDefaultum den Compiler die optimale Dekomposition wählen zu lassen. -
Die Funktion
random_clifford()wurde nach Rust portiert, wodurch die Laufzeit um den Faktor 3 verbessert wurde. -
Hinzugefügt
ProductFormula.expand()die es ermöglicht, die Entwicklung einer Produktformel in einem spärlichen Pauli-Format zu betrachten. Wir können zum Beispiel das Format einer Trotter-Entwicklung zweiter Ordnung eines Hamiltonianers wie folgt abfragen:from qiskit.quantum_info import SparsePauliOp from qiskit.circuit.library import PauliEvolutionGate from qiskit.synthesis.evolution import SuzukiTrotter hamiltonian = SparsePauliOp(["IX", "XI", "ZZ"], coeffs=[-1, -1, 1]) evo = PauliEvolutionGate(hamiltonian, time=3.14) trotter = SuzukiTrotter(order=2) print(trotter.expand(evo))die Folgendes ausdrucken wird
[('X', [0], -3.14), ('X', [1], -3.14), ('ZZ', [0, 1], 6.28), ('X', [1], -3.14), ('X', [0], -3.14)] -
Hinzufügen der Plugin-Struktur für die
PauliEvolutionGate. Das Standard-Plugin,PauliEvolutionSynthesisDefaultkonstruiert Schaltkreise wie zuvor, aber schneller, da es intern Rust verwendet. Je größer der Stromkreis ist (z. B.. durch die Hamiltongröße, die Anzahl der Zeitschritte oder die Suzuki-Trotter-Ordnung), desto größer ist der Geschwindigkeitszuwachs. Zum Beispiel wird ein 100-Qubit-Heisenberg-Hamiltonian mit 10 Zeitschritten und einer Trotter-Formel 4. Ordnung jetzt ~9.4x schneller konstruiert. Das neue Plugin,PauliEvolutionSynthesisRustiqverwendet den Synthesealgorithmus, der in der Arbeit " Faster and shorter synthesis of Hamiltonian simulation circuits" von (de) Brugière und Martiel " beschrieben und in Rustiq implementiert ist. Zum Beispiel:from qiskit.circuit import QuantumCircuit from qiskit.quantum_info import SparsePauliOp from qiskit.circuit.library import PauliEvolutionGate from qiskit.compiler import transpile from qiskit.transpiler.passes import HLSConfig op = SparsePauliOp(["XXX", "YYY", "IZZ"]) qc = QuantumCircuit(4) qc.append(PauliEvolutionGate(op), [0, 1, 3]) config = HLSConfig(PauliEvolution=[("rustiq", {"upto_phase": False})]) tqc = transpile(qc, basis_gates=["cx", "u"], hls_config=config) tqc.draw(output='mpl')
Dieser Codeschnipsel verwendet das Rustiq-Plugin zur Synthese von
PauliEvolutionGateobjekte in der Quantenschaltung qc. Das Plugin wird mit der zusätzlichen Optionupto_phase = Falseaufgerufen, die es ermöglicht, kleinere Schaltkreise zu erhalten, allerdings auf Kosten der möglicherweise nicht erhaltenen globalen Phase. Die vollständige Liste der unterstützten Optionen finden Sie in der Dokumentation zuPauliEvolutionSynthesisRustiq. -
Hafen
synth_cz_depth_line_mr()nach Rust. Diese Funktion synthetisiert eine CZ-Schaltung für lineare Nächste-Nachbarn-Verbindungen (LNN), die auf der Methode von Maslov und Rötteler basiert. Bei einer binären Matrix 350x350 führt die Rust-Implementierung zu einer Beschleunigung von etwa 30x. -
Portierung
synth_permutation_reverse_lnn_kms()nach Rust, das eine umgekehrte Permutation für die LNN-Architektur unter Verwendung der Methode von Kutin, Moulton und Smithline synthetisiert. -
Ein neues Argument
preserve_orderwurde zuProductFormulahinzugefügt, das es erlaubt, die Pauli-Terme im Hamiltonian vor der Expansion der Produktformel neu zu ordnen, um die endgültige Schaltungstiefe zu komprimieren. Indem man dies aufFalsesetzt, entsteht ein Term der Form
werden neu geordnet nach
was dazu führt, dass die Drehungen RZZ und RYY parallel durchgeführt werden, anstatt wie im ersten Teil drei aufeinanderfolgende Drehungen.
Diese Option kann über die Plugin-Schnittstelle eingestellt werden:
from qiskit import QuantumCircuit, transpile
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
from qiskit.synthesis.evolution import SuzukiTrotter
from qiskit.transpiler.passes import HLSConfig
op = SparsePauliOp(["XXII", "IYYI", "IIZZ"])
time, reps = 0.1, 1
synthesis = SuzukiTrotter(order=2, reps=reps)
hls_config = HLSConfig(PauliEvolution=[("default", {"preserve_order": False})])
circuit = QuantumCircuit(op.num_qubits)
circuit.append(PauliEvolutionGate(op, time), circuit.qubits)
tqc = transpile(circuit, basis_gates=["u", "cx"], hls_config=hls_config)
tqc.draw('mpl')
Transpiler-Funktionen
-
Fügen Sie das Argument
matrix_basedzumCollectCliffordstranspiler-Pass. Wenn der neue Parametermatrix_based=Trueist, kann derCollectCliffordstranspiler-Durchgang unitäre Gatter sammeln, die für bestimmte Parameter Clifford-Gatter sind, zum BeispielRZGategatter mit Winkeln, die Vielfache von sind. -
Der
RemoveIdentityEquivalentder Transpilerdurchlauf wird nun als Teil der voreingestellten Durchlaufmanager auf den Optimierungsstufen 2 und 3 ausgeführt. Der Pass wird während der Phaseninitundoptimizationausgeführt, da die Optimierungen, die er anwendet, in beiden Phasen gültig sind und der Pass schnell ausgeführt werden kann. -
Mehrere High-Level-Synthese-Plugins für die Synthese eines
MCXGate:MCXSynthesisNCleanM15. auf der Grundlage vonsynth_mcx_n_clean_m15().MCXSynthesisNDirtyI15. auf der Grundlage vonsynth_mcx_n_dirty_i15().MCXSynthesis1CleanB95. auf der Grundlage vonsynth_mcx_1_clean_b95().MCXSynthesisNoAuxV24. auf der Grundlage vonsynth_mcx_noaux_v24().MCXSynthesisGrayCode. auf der Grundlage vonsynth_mcx_gray_code().
Sowie:
MCXSynthesisDefaultfür die Wahl der effizientesten Synthesemethode auf der Grundlage der Anzahl der verfügbaren sauberen und schmutzigen Ancilla-Qubits.
Betrachten wir als Beispiel die Umsetzung der folgenden Schaltung:
from qiskit.circuit import QuantumCircuit from qiskit.compiler import transpile qc = QuantumCircuit(7) qc.x(0) qc.mcx([0, 1, 2, 3], [4]) qc.mcx([0, 1, 2, 3, 4], [5]) qc.mcx([0, 1, 2, 3, 4, 5], [6]) transpile(qc).draw('mpl', fold=-1)
Für das erste MCX-Gatter können die Qubits
5und6als saubere Ancillas verwendet werden, und es wird die beste verfügbare Synthesemethodesynth_mcx_n_clean_m15gewählt. Für das zweite MCX-Gatter kann das Qubit6als saubere Ancilla verwendet werden, die Methodesynth_mcx_n_clean_m15gilt nicht mehr, also wird die Methodesynth_mcx_1_clean_b95gewählt. Für das dritte MCX-Gatter gibt es keine Ancilla-Qubits, und es wird die Methodesynth_mcx_noaux_v24gewählt. -
Der
SabreLayouttranspiler-Durchlauf wurde aktualisiert, um standardmäßig zwei oder drei zusätzliche Layoutversuche durchzuführen, unabhängig vom Wert des Schlüsselwortargumentslayout_trials. Ein triviales Layout und seine Umkehrung sind für alle Backends enthalten, genau wie derDenseLayoutstudie, die in 1.2.0 hinzugefügt wurde. Zusätzlich werden die größten Ringe auf einem IBM backend heavy hex connectivity graph hinzugefügt, wenn die Backends 127, 133 oder 156 Qubits haben. Dies kann ein guter Ausgangspunkt für einige Schaltungen auf diesen häufig verwendeten Backends sein, während es für alle anderen nur ein zusätzlicher "Zufallsversuch" ist. -
Die
DAGCircuitwurde in Rust neu implementiert. Diese Neufassung der Klasse Python sollte vollständig API-kompatibel mit der früheren Implementierung von Python sein. Während die Klasse zuvor mit rustworkx implementiert wurde, für das die zugrunde liegende Datengraphenstruktur in Rust existiert, wurde die Implementierung der Klasse und aller Daten in Python gelebt. Diese neue Version vonDAGCircuitspeichert alle Daten in der nativen Rust-Darstellung und ist aufgrund der komprimierten Qubit- und Clbit-Darstellung, die für ruhende Anweisungen entwickelt wurde, speichereffizienter. Es ermöglicht auch Transpilerübergänge, um eineDAGCircuitvon Rust aus zu manipulieren, was Verbesserungen der Leistung ermöglicht. -
Ein neues Argument
qubits_initially_zerowurde hinzugefügt zuqiskit.compiler.transpile(),generate_preset_pass_manager(), und zuPassManagerConfig. Bei der VoreinstellungTruewird davon ausgegangen, dass sich die Qubits anfangs im Zustand befinden, was zusätzliche Optimierungsmöglichkeiten für einzelne Transpiler-Durchläufe bieten kann. Insbesondere wird derHighLevelSynthesistranspiler-Durchgang eine bessere Zerlegung für jedesMCXGategatter in einer Schaltung eine bessere Zerlegung, wenn ein ungenutztes Hilfsqubit im Zustand verfügbar ist.Es gibt jedoch Fälle, in denen
qubits_initially_zeroaufFalsegesetzt werden sollte, z. B. beim Transpilieren für Backends, die Qubits nicht ordnungsgemäß initialisieren, oder beim manuellen Aufrufen von Transpilerdurchläufen auf Unterschaltungen einer größeren Quantenschaltung. -
Der Konstruktor für den
HighLevelSynthesistranspiler pass akzeptiert jetzt ein zusätzliches Argument:qubits_initially_zero. Wenn er aufTruegesetzt ist, nimmt der Pass an, dass sich die Qubits anfangs im Zustand befinden. Außerdem verfolgt der Durchlauf die sauberen und schmutzigen Hilfs-Qubits während des gesamten Durchlaufs und gibt diese Informationen über die kwargsnum_clean_ancillasundnum_dirty_ancillasan die Plugins weiter. -
Verbesserte Behandlung von Ancilla-Qubits im
HighLevelSynthesistranspiler-Durchgang. Eine Schaltung kann zum Beispiel benutzerdefinierte Gatter haben, deren Definitionen Folgendes enthaltenMCXGates. Nun können die Synthesealgorithmen für die innerenMCXGates die Ancilla-Qubits verwenden, die in der globalen Schaltung verfügbar sind, aber außerhalb der Definitionen der benutzerdefinierten Gatter liegen. -
Eine neue Methode wurde hinzugefügt
DAGCircuit.control_flow_op_nodes()hinzugefügt, die einen schnellen Weg bietet, um alleDAGOpNodein einerDAGCircuitdie a enthaltenControlFlowOp. Dies war möglich, bevor man dieDAGCircuit.op_nodes()methode und die Übergabe derControlFlowOpklasse als Filter zu übergeben, aber diese neue Funktion wird den Vorgang schneller durchführen. -
Die meisten der in den voreingestellten Pass-Managern verwendeten Transpiler-Pässe werden von
generate_preset_pass_manager()zurückgegebenen und intern vontranspile()verwendet werden, wurden nach Rust portiert. Dadurch konnte die Laufzeitleistung jedes Durchgangs erheblich verbessert werden, was zu einer signifikanten Verbesserung der Gesamteffizienz des Transpilers geführt hat. Die Liste der in dieser Version nach Rust portierten Pässe sind:ConsolidateBlocksBasisTranslatorCommutationAnalysisCommutativeCancellationElidePermutationsOptimize1qGatesDecompositionUnitarySynthesisGateDirectionCheckGateDirectionRemoveDiagonalGatesBeforeMeasureCheckMapSplit2QUnitariesFilterOpNodesDepthSizeGatesInBasisInverseCancellationBarrierBeforeFinalMeasurements
-
Es wurde ein neuer Transpiler-Pass hinzugefügt,
RemoveIdentityEquivalentder verwendet wird, um Gatter zu entfernen, die bis zu einer gewissen Toleranz mit einer Identität äquivalent sind. Wenn Sie zum Beispiel eine Schaltung wie diese hätten:
die Ausführung des Passes würde die
CPhaseGate:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import RemoveIdentityEquivalent qc = QuantumCircuit(2) qc.cp(1e-20, 0, 1) removal_pass = RemoveIdentityEquivalent() result = removal_pass(qc) result.draw("mpl")
-
Der
ConsolidateBlockspass wird nun das Äquivalent desCollect2qBlockspasses intern ausgeführt, wenn er nicht zuvor in einem Passmanager ausgeführt wurde. Zuvor,Collect2qBlocksoderCollect1qRunsmusste vorher ausgeführt werdenConsolidateBlocksfürConsolidateBlocksetwas tun kann. Indem die Erfassung intern erfolgt, wird der Overhead des Durchlaufs reduziert. WennCollect2qBlocksoderCollect1qRunsvor der Ausführung vonConsolidateBlocksausgeführt werden, werden die gesammelten Durchläufe dieser Durchläufe aus dem Eigenschaftssatz verwendet, und das Verhalten des Durchlaufs ändert sich nicht. -
Der
RemoveDiagonalGatesBeforeMeasuretranspiler-Durchgang wurde um weitere diagonale Gates erweitert:PhaseGate,CPhaseGate,CSGate,CSdgGateundCCZGate. Darüber hinaus wurde der Code derRemoveDiagonalGatesBeforeMeasurenach Rust portiert und ist nun x20 schneller für eine 20-Qubit-Schaltung.
Visualisierungsfunktionen
- Die Funktion
timeline_drawer()visualisierungsfunktion hat ein neues Argumenttarget, das zur Angabe einesTargetobjekt für die Visualisierung anzugeben. Standardmäßig verwendet die Funktion dieInstruction.durationum die Dauer einer bestimmten Anweisung zu ermitteln, aber durch die Angabe des Ziels werden stattdessen die Timing-Details innerhalb des Ziels genutzt.
Bekannte Probleme
- Bei der Verwendung der QPY-Formate 10, 11 oder 12 mit Schaltungen, die
ParameterExpressions enthalten, wenn die Version des Paketssymengine, die in der Umgebung installiert ist, die die Nutzlast erzeugt hat (qpy.dump()) nicht mit der Version vonsymengineübereinstimmt, die in der Umgebung installiert ist, in der die Nutzlast geladen wird (qpy.load()), erhalten Sie eine Fehlermeldung. Wenn dieser Fehler auftritt, installieren Sie die Versionsymengineaus der Fehlermeldung, bevor Sieqpy.load(). Bei den QPY-Formatversionen 13 oder später (oder vor 10) tritt dieses Problem nicht auf. Wenn Sie also Objekte als Teil IhrerParameterExpressionobjekte als Teil Ihrer Schaltung oder beliebigeScheduleBlockobjekte serialisieren, wird empfohlen, die Version 13 zu verwenden, um dieses Problem in Zukunft zu vermeiden.
Anmerkungen zu Upgrades
-
Die folgenden Klassen verwenden nun die Operation , um den Pauli-Y-Operator zu diagonalisieren:
PauliEvolutionGate,EvolvedOperatorAnsatz, undPauliFeatureMap. Zuvor verwendeten diese Klassen entweder oder als Basistransformation. Die Verwendung der Operation , dargestellt durch das SymbolSXGatedargestellt wird, ist effizienter, da sie nur ein einziges Gatter verwendet, das als Singleton implementiert ist.Wenn Sie sich auf die vorherige Verwendung von Gattern verlassen haben, empfehlen wir, die Schaltungen mit Qiskit 1.2 zu erstellen und sie mit
qpy.dump()zu exportieren, oder ein eigenesTransformationPasszu schreiben, der die Übersetzung in das von Ihnen gewünschte Basiswechsel-Gatter vornimmt. -
Die minimal unterstützte Version von Python ist jetzt 3.9, diese wurde von der vorherigen minimal unterstützten Version von 3.8 angehoben. Diese Änderung war notwendig, weil das Upstream-Projekt cPython Python 3.8 nicht mehr unterstützt.
Hinweise zur Aktualisierung von Schaltkreisen
- Die
QuantumVolumeklasse erzeugt Schaltkreise mit verschiedenen unitären Matrizen und Permutationen für einen gegebenen Startwert aus der vorherigen Qiskit-Version. Dies ist darauf zurückzuführen, dass ein neuer interner Zufallszahlengenerator für die Schaltungsgenerierung verwendet wird, der die Schaltung schneller erzeugt. Wenn Sie eine exakte Schaltung mit demselben Seed benötigen, können Sie die frühere Version von Qiskit verwenden und die Schaltung mit dem Argumentflatten=Truegenerieren und die Schaltung mitqpy.dump()exportieren und dann mit dieser Version laden.
Hinweise zum Upgrade von Primitives
- Bei Verwendung von
BackendSamplerV2werden die Schaltkreis-Metadaten nicht mehr gelöscht, bevor die Schaltkreise an die Methoderun()der verpacktenBackendV2instanz übergeben werden. Wenn Sie sich bisher auf dieses Verhalten verlassen haben, können Sie die Metadaten manuell löschen, bevor SieBackendSamplerV2.run()durch den Aufruf voncircuit.metadata.clear()
QPY-Upgrade-Hinweise
- Die Funktion
qpy.dump()funktion gibt nun standardmäßig die Formatversion 13 aus. Das bedeutet, dass die mit dieser Funktion erzeugten Nutzdaten standardmäßig nur mit Qiskit 1.3.0 oder höher kompatibel sind. Wenn die Nutzlast von einer früheren Version von Qiskit geladen werden muss, verwenden Sie dasversionFlag aufqpy.dump()um die entsprechende Version auszugeben. Weitere Einzelheiten finden Sie unter QPY-Kompatibilität.
Hinweise zum Transpiler-Upgrade
-
DAGNodeobjekte (und ihre UnterklassenDAGInNode,DAGOutNode, undDAGOpNode) geben nicht länger Verweise auf dasselbe zugrunde liegende Objekt vonDAGCircuitmethoden zurück. Dies war noch nie eine Garantie dafür, dass alle zurückgegebenen Knoten ein gemeinsamer Verweis auf dasselbe Objekt sein würden. Mit der Migration derDAGCircuitnach Rust wird eine neueDAGNodeinstanz erzeugt, wenn ein Knoten an Python zurückgegeben wird. Diese Objekte werden mit==oder ähnlichen Prüfungen, die sich auf__eq__stützen, als gleich bewertet, aber nicht mehr als dasselbe Objekt identifiziert. -
Die
DAGOpNodeinstanzen, die von derDAGCircuitzurückgegebenen Instanzen sind keine gemeinsamen Verweise auf die in der DAG gespeicherten zugrunde liegenden Daten mehr. In früheren Versionen war es möglich, etwas zu tun wie:for node in dag.op_nodes(): node.op = new_opdiese Art der Mutation war jedoch immer unsicher, da sie die interne Zwischenspeicherung der DAG zerstören und die Datenstruktur beschädigen konnte. Stattdessen sollten Sie die API verwenden, die von
DAGCircuitfür Mutationen wieDAGCircuit.substitute_node()oderDAGCircuit.substitute_node_with_dag(). Zum Beispiel würde der obige Codeblock zu:for node in dag.op_nodes(): dag.substitute_node(node, new_op)Dies ähnelt einer Upgrade-Notiz von 1.2.0, in der dies für die Mutation des
DAGOpNode.opattributs, nicht desDAGOpNodeselbst. In 1.3 gilt dies jedoch für das gesamte Objekt, nicht nur für das innere Attributop. Im Allgemeinen war diese Art von Mutation immer unsolide und wurde nicht unterstützt, konnte aber früher in einigen Fällen funktionieren. -
Die
transpile()geht nun davon aus, dass sich die Qubits zunächst im Zustand befinden. Um diese Annahme zu vermeiden, kann man das Argumentqubits_initially_zeroaufFalsesetzen.
Hinweise zu veralteten Versionen
-
Das Modul
qiskit.pulsemodul und alle damit verbundenen Funktionen sind nun veraltet und werden in Qiskit 2.0.0 entfernt. Dies liegt daran, dass der primäre Backend-Anbieter mit Puls-Unterstützung IBM ist und der Zugriff auf Puls-Ebene derzeit nur auf einer Teilmenge der Backends von IBM unterstützt wird. Ebenso haben sie angekündigt, dass der Zugriff auf die Pulsebene im Jahr 2025 abgeschafft wird. Ohne den größten Anbieter, der die Funktion nutzt und den Pulse-Zugriff unterstützt, wird die Bedeutung der Funktion für Qiskit erheblich geschmälert und gegen den fortlaufenden Wartungsaufwand des Pakets abgewogen, das abgeschafft wird.Die Verwerfung umfasst den gesamten Puls-Code in
qiskit.pulsesowie Funktionen, die von Puls abhängen oder damit verbunden sind, wie Pulsvisualisierung, Serialisierung und Unterstützung für benutzerdefinierte Kalibrierung. Weitere Einzelheiten finden Sie in den Abschnitten über die Veralterung weiter unten.Das Pulse-Paket als Ganzes wird zusammen mit den direkt verwandten Komponenten in Qiskit in das Qiskit Dynamics-Repository verschoben, um die Simulation von Pulsen und Low-Level-Steuerung weiter zu ermöglichen. Qiskit 1.x wird weiterhin den Support für das
qiskit.pulsebis zum Ende seiner Nutzungsdauer unterstützen.
Veraltete Schaltungen
-
Veraltet das
Instruction.conditionattribut und dieInstruction.c_if()methode. Sie werden in Qiskit 2.0 entfernt, zusammen mit allen Verwendungen im Qiskit-Datenmodell. Diese Funktionalität wurde ersetzt durch dieIfElseOpersetzt, die zur Beschreibung einer klassischen Bedingung in einem Schaltkreis verwendet werden kann. Zum Beispiel kann eine Schaltung mitInstruction.c_if()wie:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.x(0).c_if(0, 1) qc.z(1.c_if(1, 0) qc.measure(0, 0) qc.measure(1, 1)Kann wie folgt erneut geschrieben werden:
qc = QuantumCircuit(2, 2) qc.h(0) with qc.if_test((qc.clbits[0], True)): qc.x(0) with qc.if_test((qc.clbits[1], False)): qc.z(1) qc.measure(0, 0) qc.measure(1, 1)Der inzwischen veraltete
ConvertConditionsToIfOpstranspiler-Pass kann verwendet werden, um diese Umwandlung für bestehende Schaltungen zu automatisieren. -
Im Rahmen der Abkündigung des Qiskit Pulse-Pakets werden auch die folgenden Abhängigkeiten abgekündigt:
qiskit.circuit.QuantumCircuit.calibrationsqiskit.circuit.QuantumCircuit.has_calibration_for()qiskit.circuit.QuantumCircuit.add_calibration()qiskit.dagcircuit.DAGCircuit.calibrationsqiskit.dagcircuit.DAGCircuit.has_calibration_for()qiskit.dagcircuit.DAGCircuit.add_calibration()qiskit.dagcircuit.DAGDependency.calibrations
-
Die
QuantumCircuit.unitundQuantumCircuit.durationattribute sind veraltet und werden in Qiskit 2.0.0 entfernt. Diese Attribute wurden verwendet, um die geschätzte Dauer und die Einheit dieser Dauer für die Ausführung in der Schaltung zu ermitteln. Die Werte dieser Attribute waren jedoch immer begrenzt, da sie nur dann korrekt ausgefüllt werden konnten, wenn der Transpiler mit den richtigen Einstellungen ausgeführt wurde. Die Dauer war auch nur eine Schätzung auf der Grundlage des längsten Pfades über die Summe der Dauer vonDAGCircuitund würde niemals den Kontrollfluss oder die Bedingungen in der Schaltung korrekt berücksichtigen. -
Die
DAGCircuit.unitundDAGCircuit.durationattribute sind veraltet und werden in Qiskit 2.0.0 entfernt. Diese Attribute wurden verwendet, um die geschätzte Dauer und die Einheit dieser Dauer für die Ausführung in der Schaltung zu ermitteln. Die Werte dieser Attribute waren jedoch immer begrenzt, da sie nur dann korrekt ausgefüllt werden konnten, wenn der Transpiler mit den richtigen Einstellungen ausgeführt wurde. Die Dauer war auch nur eine Schätzung auf der Grundlage des längsten Pfades über die Summe der Dauer vonDAGCircuitund würde niemals den Kontrollfluss oder die Bedingungen in der Schaltung korrekt berücksichtigen. -
Die
Instruction.durationundInstruction.unitattribute sind veraltet und werden in Qiskit 2.0.0 entfernt. Dies beinhaltet das Setzen derunitoderdurationArgumente für jedeqiskit.circuit.Instructionoder Unterklasse. Diese Attribute wurden verwendet, um einer einzelnen Anweisung eine individuelle Ausführungsdauer und eine Einheit für diese Dauer zuzuordnen. Die Quelle der Wahrheit über die Dauer eines Tores ist jedoch dieBackendV2Targetdie die Dauer für jede vom Backend unterstützte Anweisung enthält. Die Dauer einer Anweisung ist nicht etwas, das normalerweise vom Benutzer eingestellt werden kann, sondern eine unveränderliche Eigenschaft des Backends. Wenn Sie diese Fähigkeit zuvor genutzt haben, um mit verschiedenen Laufzeiten für Gates zu experimentieren, können Sie dasInstructionProperties.durationfeld in einem gegebenenTargetändern, um eine benutzerdefinierte Dauer für eine Anweisung in einem Backend festzulegen (die Einheit ist immer in Sekunden in derTarget).
Anbieter-Deprecations
-
Die Methode
BasicSimulator.configuration()methode ist veraltet und wird in 2.0.0 entfernt werden. Diese Methode gibt eine alteproviders.models.BackendConfigurationInstanz zurück, die Teil des veraltetenBackendV1Modells ist. Dieses Modell wurde ersetzt durchBackendV2ersetzt, bei dem die Constraints direkt in der Backend-Instanz oder in der zugrunde liegendenTarget(backend.target).Im Folgenden finden Sie eine Kurzanleitung für den Zugriff auf die gängigsten
BackendConfigurationAttribute imBackendV2modell:BackendV1 model (deprecated) ------------> BackendV2 model ---------------------------- --------------- backend.configuration().backend_name backend.name backend.configuration().backend_version backend.backend_version backend.configuration().n_qubits backend.num_qubits backend.configuration().num_qubits backend.num_qubits backend.configuration().basis_gates backend.target.operation_names (*) backend.configuration().coupling_map backend.target.build_coupling_map() backend.configuration().local No representation backend.configuration().simulator No representation backend.configuration().conditional No representation backend.configuration().open_pulse No representation backend.configuration().memory No representation backend.configuration().max_shots No representation(*) Es ist zu beachten, dass
Backend.target.operation_namesbasis_gatesund zusätzliche Nicht-Gate-Befehle enthält, so dass es in einigen Implementierungen erforderlich sein könnte, die Ausgabe zu filtern.In diesem Leitfaden finden Sie weitere Informationen zur Migration auf das
BackendV2modell. -
Im Rahmen der Abkündigung des Qiskit Pulse-Pakets werden alle pulse-bezogenen Funktionen in
qiskit.providers.BackendV2der Klasse als veraltet markiert. Dies umfasst die folgenden Methoden:Folglich werden die entsprechenden Kanalmethoden in den
qiskit.providers.BackendV2Converterundqiskit.providers.fake_provider.GenericBackendV2klassen ebenfalls veraltet sein.Darüber hinaus werden die Argumente
pulse_channelsundcalibrate_instructionsin derBackendV2initialisierungsmethode veraltet sein. -
Das Argument
defaultswird aus der Funktionqiskit.providers.convert_to_target()funktion.
QPY-Veraltungen
- Als Teil der Verwerfung des Qiskit Pulse Pakets wird die Serialisierung
qiskit.pulse.ScheduleBlock-basierten Nutzdaten ebenfalls veraltet. Insbesondere die Übergabe vonqiskit.pulse.ScheduleBlockobjekten an das Programmargument in der Anweisungqiskit.qpy.dump().
Transpiler-Veraltungen
-
Abgelehnt
StochasticSwapdie ersetzt wurde durchSabreSwap. Wenn die Klasse von der Transpile-Funktion aufgerufen wird, würde die Änderung beispielsweise lauten:from qiskit import transpile from qiskit.circuit import QuantumCircuit from qiskit.transpiler import CouplingMap from qiskit.providers.fake_provider import GenericBackendV2 qc = QuantumCircuit(4) qc.h(0) qc.cx(0, range(1, 4)) qc.measure_all() cmap = CouplingMap.from_heavy_hex(3) backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap) tqc = transpile( qc, routing_method="stochastic", layout_method="dense", seed_transpiler=12342, target=backend.target )zu:
tqc = transpile( qc, routing_method="sabre", layout_method="sabre", seed_transpiler=12342, target=backend.target )Für einen Passmanager würde die Änderung lauten:
passmanager = PassManager(StochasticSwap(coupling, 20, 13)) new_qc = passmanager.run(qc)zu:
passmanager = PassManager(SabreSwap(backend.target, "basic")) new_qc = passmanager.run(qc) -
Der Transpiler-Pass
ConvertConditionsToIfOpsist veraltet und wird in Qiskit 2.0.0 entfernt werden. Diese Klasse ist jetzt veraltet, weil das zugrunde liegende Datenmodell fürInstruction.conditionvon dem dieser Pass konvertiert, veraltet ist und in 2.0.0 entfernt werden wird. -
Die Angabe von benutzerdefinierten Gates über das Argument
basis_gateswird sowohl fürtranspile()undgenerate_preset_pass_manager(). Diese Funktion wird in Qiskit 2.0 entfernt werden. Benutzerdefinierte Gates werden weiterhin imTargetmodell unterstützt und können über das Argumenttargetangegeben werden. Man kann eineTargetinstanz von Grund auf neu erstellen oder dieTarget.from_configuration()methode mit dem Argumentcustom_name_mappingverwenden. Zum Beispiel:from qiskit.circuit.library import XGate from qiskit.transpiler.target import Target basis_gates = ["my_x", "cx"] custom_name_mapping = {"my_x": XGate()} target = Target.from_configuration( basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping ) -
Im Rahmen der Abkündigung des Qiskit Pulse-Pakets werden pulse-bezogene Aspekte in der
qiskit.transpiler.TargetKlasse abgekündigt. Diese umfassen:update_from_instruction_schedule_map()has_calibration()get_calibration()instruction_schedule_map()
Darüber hinaus werden auch die folgenden Transpiler-Durchläufe als veraltet markiert:
-
Das Argument
inst_mapingenerate_preset_pass_manager(),from_configuration(),PassManagerConfiginitializer undgenerate_scheduling()ist veraltet. -
Das Argument
calibrationinInstructionProperties()initialisierungsmethoden wird veraltet sein. -
Die folgenden
transpile()undgenerate_preset_pass_manager()argumente sind veraltet zugunsten der Definition eines eigenenTarget:instruction_durations,timing_constraints, undbackend_properties. Diese Argumente können verwendet werden, um ein Ziel zu erstellen mitTarget.from_configuration():Target.from_configuration( ... backend_properties = backend_properties, instruction_durations = instruction_durations, timing_constraints = timing_constraints ) -
Die Methode
PassManagerConfig.from_backend()wird die Unterstützung von Eingaben des TypsBackendV1im Backend-Parameter in einer zukünftigen Version nicht mehr unterstützen, frühestens ab 2.0.BackendV1ist veraltet und Implementierungen sollten aufBackendV2.
Versch. Einstellung von Unterstützung
-
Das Modul
qiskit.result.mitigationist veraltet und wird in Qiskit 2.0 entfernt. Die Verwerfung umfasst dieLocalReadoutMitigatorundCorrelatedReadoutMitigatorklassen sowie die zugehörigen Dienstprogramme. Ihre Funktionalität wurde durch das mthree-Paket abgelöst, das sich in https://github.com/Qiskit/qiskit-addon-mthree. -
Im Rahmen der Abkündigung des Qiskit Pulse-Pakets werden auch die folgenden Funktionen und Klassen abgekündigt:
Fehlerkorrekturen
-
Behebung eines Leistungsrückgangs in
QuantumCircuit.assign_parameters()die in Qiskit 1.2.0 eingeführt wurde, wenn die Methode in einer engen Schleife aufgerufen wurde, was dazu führte, dass nur eine kleine Anzahl von Parametern einer stark parametrischen Schaltung bei jeder Iteration gebunden wurde. Wenn möglich, ist es noch performanter, nur einmalassign_parameters()nur einmal aufzurufen, und zwar mit allen Zuweisungen gleichzeitig, da dies den Zeitanteil für die Eingabe-Normalisierung und den Overhead für die Fehlerüberprüfung reduziert. -
Für
BasicSimulatorist der Eintragbasis_gatesin der Konfigurationsinstanz, die von der Methodeconfiguration()zurückgegeben wird, nun eine Liste anstelle einer Instanzdict_keys, was dem erwarteten Typ entspricht und es ermöglicht, die Konfigurationsinstanz tief zu kopieren. -
Es wurde ein Problem mit
DAGCircuit.apply_operation_back()undDAGCircuit.apply_operation_front()wo früher, wenn man einClbitobjekt in die Eingabe für das Argumentqargsgesetzt wurde, dieses stillschweigend akzeptiert wurde. Dies wurde behoben, so dass die Typinkongruenz korrekt erkannt und eine Ausnahme ausgelöst wird. -
Ein fehlender Dekorator wurde in
C3SXGateder dazu führte, dass es fehlschlug, wennGate.to_matrix()aufgerufen wurde. Die Gate-Matrix wird nun wie erwartet zurückgegeben. -
Ein Fehler in
QuantumCircuit.assign_parameters()behoben, der bei der Zuweisung von Parametern zu Standardgattern auftrat, deren Definition bereits ausgelöst wurde. In diesem Fall wurden die neuen Werte nicht ordnungsgemäß an die Gate-Instanzen weitergegeben. Während die Schaltung selbst noch wie erwartet kompiliert wurde, wurde bei der Überprüfung der einzelnen Operationen immer noch der alte Parameter angezeigt.Zum Beispiel:
from qiskit.circuit.library import EfficientSU2 circuit = EfficientSU2(2, flatten=True) circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True) print(circuit.data[0].operation.params) # would print θ[0] instead of 1.25Behoben #13478.
-
Behebung eines Fehlers mit der
"circular"und"sca"Verschränkung fürNLocalschaltungen und deren Ableitungen. Bei Verschränkungsblöcken von mehr als 2 Qubits fehlten der zirkulären Verschränkung bisher einige Verbindungen. Zum Beispiel für 4 Qubits und eine Blockgröße von 3 wurde der bisherige Code verwendet:[(2, 3, 0), (0, 1, 2), (1, 2, 3)]aber jetzt werden die
(3, 0, 1)Verbindungen korrekt hinzugefügt, das heißt:[(2, 3, 0), (3, 0, 1), (0, 1, 2), (1, 2, 3)]So verwenden die Verflechtungen
"circular"und"sca"num_qubitsVerflechtungsblöcke pro Schicht. -
Hinzufügen weiterer Clifford-Gatter zum
CollectCliffordstranspiler-Pass. Insbesondere haben wir die Gates hinzugefügtECRGate,DCXGate,iSwapGate,SXGateundSXdgGatezu diesem Transpiler-Durchgang hinzugefügt. -
Ein Fehler wurde behoben in
QuantumCircuit.decompose()wo Objekte, die mitHighLevelSynthesissynthetisiert und dann sofort zerlegt wurden (d.h. sie wurden zweimal statt einmal zerlegt). Dies betraf Tore wieMCXGateoderCliffordund andere. -
Ein Fehler in
QuantumCircuit.decompose()behoben, bei dem High-Level-Objekte ohne Definition nicht zerlegt wurden, wenn sie explizit über das Argument"gates_to_decompose"gesetzt wurden. Zum Beispiel führte das folgende Beispiel zuvor keine Zerlegung durch, aber jetzt funktioniert es wie erwartet:from qiskit import QuantumCircuit from qiskit.quantum_info import Clifford from qiskit.transpiler.passes import Decompose cliff = Clifford(HGate()) circuit = QuantumCircuit(1) circuit.append(cliff, [0]) decomposed = Decompose(gates_to_decompose=["clifford"])(circuit) -
Bisher hat der
HighLevelSynthesistranspiler pass eine Anweisung synthetisiert, für die ein Synthese-Plugin verfügbar ist, unabhängig davon, ob die Anweisung bereits vom Target unterstützt wird oder ein Teil der explizit übergebenenbasis_gatesist. Dieses Verhalten ist nun korrigiert, so dass solche bereits unterstützten Anweisungen nicht mehr synthetisiert werden. -
Der Transpilationsdurchgang
InverseCancellationrekursiert nun inControlFlowOpoperationen, die in einerQuantumCircuit. Bisher wurden inverse Gatterpaare innerhalb von Kontrollflussblöcken, die hätten gelöscht werden können, bei der Prüfung ignoriert. Siehe #13437 für weitere Einzelheiten. -
Behebung eines Fehlers in
Isometryaufgrund einer unnötigen Behauptung, die zu einem Fehler inUnitaryGate.control()führte, wennUnitaryGatemehr als zwei Qubits hatte. -
Das
QuantumCircuit.parametersattribut ist jetzt korrekt leer, wenn esQuantumCircuit.copy_empty_like()für einen parametrischen Schaltkreis verwendet wird. Zuvor wurde ein interner Cache ohne Invalidierung kopiert. Fix #12617. -
QuantumCircuit.depth()verarbeitet nun korrekt Operationen, die keine Operanden haben, wie z.BGlobalPhaseGate. -
QuantumCircuit.depth()zählt nun die in Echtzeitausdrücken verwendeten Variablen und Clbits als Teil der Tiefenberechnung. -
Korrektur des
SolovayKitaevtranspiler-Durchgang beim Laden von Grundannäherungen aus einer bestehenden.npyDatei. Bisher konnte das Laden einer gespeicherten Approximation, die weitere Reduktionen (z.B. durch Gatterstornierungen) zuließ, zu einem Laufzeitfehler führen. Außerdem ging die globale Phasendifferenz zwischen dem U(2)-Gatterprodukt und der SO(3)-Darstellung während eines Speicher- und Ladevorgangs verloren. Fixes Qiskit/qiskit#12576. -
Ein Fehler wurde behoben, wenn
SparsePauliOp.paulisals einPauliListmit einer Phase ungleich Null gesetzt wurde, bei dem nachfolgende Aufrufe von mehrerenSparsePauliOpmethoden zu falschen Ergebnissen führten. Wenn nunSparsePauliOp.paulisauf einen WertPauliListmit einer Phase ungleich Null gesetzt wird, wird die Phase inSparsePauliOp.coeffsabsorbiert, und die Phase des EingangsPauliListwird auf Null gesetzt. -
Es wurde ein Fehler in
qiskit.visualization.pulse_v2.interface.drawbehoben, der keine Impulszeitpläne zeichnete, wenn die Zeichenfunktion mit einemBackendV2argument aufgerufen wurde. Da das V2 Backend keine Hardware-Kanalfrequenzen meldet, wird in der generierten Zeichnung "no freq" angezeigt unter jeder Kanalbezeichnung. -
Es wurde ein Problem mit
dag_drawer()undDAGCircuit.draw()beim Versuch der Visualisierung einerDAGCircuitinstanz zu visualisieren, dieVardrähte enthielt, wofür der Visualisierer eine Ausnahme auslöste. Dieses Verhalten wurde behoben, und es wird die erwartete Visualisierung erzeugt. -
Der
VF2Layoutpass würde eine Ausnahme auslösen, wenn er mit einerTargetinstanz ohne Konnektivitätseinschränkungen. Dies wäre bei Zielen von Aer 0.13 der Fall. Das Problem ist nun behoben. -
Behebt einen Fehler beim Aufruf der Methode
Gate.repeat(). Siehe #11990 für weitere Einzelheiten. -
Ein Fehler wurde behoben, der dazu führte, dass
Statevector.expectation_value()zu falschen Ergebnissen für den Identitätsoperator führte, wenn der Zustandsvektor nicht normalisiert war. -
Der Konstruktor
GenericBackendV2ermöglichte die Erstellung fehlerhafter Backends, da er Basis-Gates akzeptierte, die nicht in der angegebenen Backend-Größe zugewiesen werden konnten. Das heißt, ein Backend mit einem einzigen Qubit sollte keine Basis mit Zwei-Qubit-Gattern akzeptieren. -
ParameterExpressionwurde aktualisiert, so dass vollständig gebundene Instanzen, die mit Instanzen der eingebauten numerischen Typen von Python gleich sind (wiefloatundint), auch Hash-Werte haben, die mit denen der anderen Instanzen übereinstimmen. Diese Änderung stellt sicher, dass diese Typen austauschbar als Wörterbuchschlüssel verwendet werden können. Siehe #12488. -
Der OpenQASM 2 Parser (
qiskit.qasm2) kann nun auch Conditionals mit Ganzzahlen behandeln, die nicht in eine 64-Bit-Ganzzahl passen. Behoben #12773. -
Benutzerdefinierte Gatter (die aus einer
gateAnweisung stammen) in importierten OpenQASM 2 Programmen haben jetzt eineGate.to_matrix()implementierung. Zuvor hatten sie keine Matrixdefinition, was bedeutete, dass bei Rundreisen durch OpenQASM 2 die Fähigkeit zur Ableitung der Gattermatrix unnötigerweise verloren gehen konnte. Beachten Sie jedoch, dass die Matrix durch rekursives Finden der Matrizen der inneren Gatterdefinitionen berechnet wird, wieOperatortut, was weniger performant sein könnte als vor dem Round-Trip. -
Zuvor,
DAGCircuit.replace_block_with_op()einen-Qubit-Operation auf einen Block vonm-Qubits gelegt, wodurch die DAG in einen ungültigen Zustand versetzt wurde. Dieses Verhalten wurde behoben, und der Versuch wird eineDAGCircuitError. -
Feste
Operator.power()beim Aufruf mit nicht-ganzzahligen Potenzen bei einer Matrix, deren Schur-Form nicht diagonal ist (z.B. die meisten nicht-unitären Matrizen). -
Operator.power()liefert nun zuverlässiger den erwarteten Hauptwert einer gebrochenen Matrizenpotenz einer Einheitsmatrix mit einem Eigenwert . Dies ist im Allgemeinen schwierig, da Rundungseffekte bei Fließkommazahlen dazu führen können, dass eine Matrix einen Eigenwert auf der negativen Seite der Verzweigungsgrenze hat (auch wenn ihre exakte mathematische Beziehung dies nicht tun würde), und Ungenauigkeiten in verschiedenen BLAS-Aufrufen können fälschlicherweise die falsche Seite der Verzweigungsgrenze finden.Operator.power()verschiebt nun die Verzweigungsschnittstelle für Matrixpotenzen um eine kleine komplexe Drehung von weg. Dies löst das Problem nicht, sondern verlagert es nur an eine Stelle, an der es für die Arten von Operatoren, die normalerweise auftreten, weit weniger wahrscheinlich ist, dass es auffällt. Verwenden Sie den neuen Parameterbranch_cut_rotation, um dies besser kontrollieren zu können.Siehe #13305.
-
Behebung eines prozessbasierten Nicht-Determinismus in
SparsePauliOp.to_matrix(). Die genaue Reihenfolge der Fließkomma-Operationen in der Summierung variierte bisher je nach Prozess, ist jetzt aber bei verschiedenen Aufrufen desselben Skripts identisch. Siehe #13413. -
Target.has_calibration()wurde aktualisiert, so dass sie keine Ausnahme für eine Anweisung auslöst, die dem Ziel mitNonefür ihre Anweisungseigenschaften hinzugefügt wurde. Behebt #12525.