Qiskit 0.37 Versionshinweise
0.37.2
Terra- 0.21.2
Vorspiel
Qiskit Terra 0.21.2 ist in erster Linie eine Fehlerbehebungsversion, die auch einige verbesserte Dokumentationsseiten enthält.
Fehlerkorrekturen
-
aer_simulator_statevector_gpuwird nun korrekt als Statevector-Methode in einigen Funktionen erkannt, wenn die GPU-Simulatoren von Qiskit Aer inQuantumInstanceund anderen Algorithmus-Runnern. -
Behebung der
UCGate.inverse()methode, die bisher die globale Phase nicht invertierte. -
QuantumCircuit.compose()funktioniert jetzt korrekt, wenn es mit dem Argumentinplace=Truein Kontrollfluss-Erstellungskontexten verwendet wird. Zuvor wurden die Anweisungen außerhalb des Kontrollflussbereichs hinzugefügt. Behoben #8433. -
Ein Fehler wurde behoben, bei dem ein gebundener
ParameterExpressionnicht als real identifiziert wurde, wennsymengineinstalliert war und der bound-Ausdruck nicht ein einfacher1jwar. Zum Beispiel:from qiskit.circuit import Parameter x = Parameter("x") expr = 1j * x bound = expr.bind({x: 2}) print(bound.is_real()) # used to be True, but is now False -
Korrigierte QPY-Serialisierung und Deserialisierung von
ControlledGatemit offenen Steuerelementen (d.h. solchen, derenctrl_statenicht alle Einsen sind). Behoben #8549. -
Alle Fake-Backends in
qiskit.providers.fake_provider.backendswurden aktualisiert, um die entsprechenden Pulskanalobjekte mit dem Methodenaufruf vondrive_channel(),measure_channel(),acquire_channel(),control_channel()zurückzugeben. -
Die Unterstützung für die Ausführung von
Z2Symmetries.taper()bei größeren Problemen wurde verbessert. Zuvor benötigte die Methode eine große Menge an Speicherplatz, was bei größeren Problemen zu Fehlern führen konnte. Als Nebeneffekt dieser Korrektur hat sich die Leistung deutlich verbessert.
Aer- 0.10.4
Keine Änderung
IBM Q Anbieter 0.19.2
Keine Änderung
0.37.1
Terra- 0.21.1
Fehlerkorrekturen
-
Es wurde ein Problem in der
QuantumCircuit.decompose()methode, wenn eine Liste vonGateKlassen für dasgates_to_decomposeArgument übergeben wurde. Wenn irgendein Gatter in der Schaltung ein Label gesetzt hatte, wurde dieses Argument nicht korrekt behandelt und führte dazu, dass die Ausgangszerlegung Gatter, die explizit in der Listegates_to_decomposeaufgeführt waren, fälschlicherweise übersprang. -
Behebung
to_instruction()die zuvor versucht hat, einenUnitaryGateohne Potenzierung des Operators zu entwickeln. Da dieser Operator im Allgemeinen nicht unitär ist, führte dies zu einem Fehler (und wenn der Operator zufällig unitär gewesen wäre, wäre dies nicht das erwartete Ergebnis gewesen).Der Aufruf von
to_instruction()erzeugt nun korrekt ein Gatter, das die zeitliche Entwicklung des darin enthaltenen Operators implementiert:>>> from qiskit.opflow import EvolvedOp, X >>> op = EvolvedOp(0.5 * X) >>> op.to_instruction() Instruction( name='unitary', num_qubits=1, num_clbits=0, params=[array([[0.87758256+0.j, 0.-0.47942554j], [0.-0.47942554j, 0.87758256+0.j]])] ) -
Es wurde ein Problem mit der Funktion
marginal_distribution()funktion: Wenn ein Numpy-Array alsindicesArgument übergeben wurde, löste die Funktion einen Fehler aus. Behoben #8283 -
Bisher war es nicht möglich, eine
CircuitStateFnzu adjungieren, das aus a konstruiert wurdeVectorStateFn. Das liegt daran, dass der Zustandsvektor mit der AnweisungInitializein eine Schaltung umgewandelt wurde, die nicht unitär ist. Dieses Problem wird nun behoben, indem stattdessen dieStatePreparationanweisung, die verwendet werden kann, da davon ausgegangen wird, dass sich der Zustand zu Beginn im Zustand 0 befindet.Zum Beispiel können wir jetzt tun:
from qiskit import QuantumCircuit from qiskit.opflow import StateFn left = StateFn([0, 1]) left_circuit = left.to_circuit_op().primitive right_circuit = QuantumCircuit(1) right_circuit.x(0) overlap = left_circuit.inverse().compose(right_circuit) # this line raised an error before! -
Behebung eines Fehlers in den
Optimizerklassen, bei dem das Rekonstruieren einer neuen Optimierer-Instanz aus einer vorher existierendensettingssowohl die neuen als auch die vorherigen Optimierer-Einstellungen auf die Standardwerte zurücksetzte. Dies führte insbesondere zu einem Fehler, wennOptimizerobjekte als Eingabe an Qiskit Runtime Programme gesendet wurden.Optimierungsobjekte werden jetzt korrekt rekonstruiert:
>>> from qiskit.algorithms.optimizers import COBYLA >>> original = COBYLA(maxiter=1) >>> reconstructed = COBYLA(**original.settings) >>> reconstructed._options["maxiter"] 1 # used to be 1000! -
Es wurde ein Problem behoben, bei dem das Argument
limit_amplitudebei einem einzelnenSymbolicPulseoderWaveforminstanz von der Parametervalidierung nicht korrekt wiedergegeben wurde. Darüber hinaus wurde QPY scheduledump()nun korrekt den an die Instanz gebundenen Wertlimit_amplitudespeichern, anstatt die globale Klassenvariable zu speichern. -
Festlegung der paarweisen Verschränkungsstruktur für
NLocalschaltungen. Dies führte zu einem Fehler in derZZFeatureMapführte, bei dem die Verwendung vonentanglement="pairwise"einen Fehler auslöste. Jetzt wird die gewünschte Feature-Map korrekt erzeugt:from qiskit.circuit.library import ZZFeatureMap encoding = ZZFeatureMap(4, entanglement="pairwise", reps=1) print(encoding.decompose().draw())Die obigen Drucke:
┌───┐┌─────────────┐ q_0: ┤ H ├┤ P(2.0*x[0]) ├──■────────────────────────────────────■──────────────────────────────────────────── ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(π - x[0])*(π - x[1])) ├┤ X ├──■────────────────────────────────────■── ├───┤├─────────────┤└───┘└──────────────────────────────┘└───┘┌─┴─┐┌──────────────────────────────┐┌─┴─┐ q_2: ┤ H ├┤ P(2.0*x[2]) ├──■────────────────────────────────────■──┤ X ├┤ P(2.0*(π - x[1])*(π - x[2])) ├┤ X ├ ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐└───┘└──────────────────────────────┘└───┘ q_3: ┤ H ├┤ P(2.0*x[3]) ├┤ X ├┤ P(2.0*(π - x[2])*(π - x[3])) ├┤ X ├────────────────────────────────────────── └───┘└─────────────┘└───┘└──────────────────────────────┘└───┘ -
Es wurde ein Problem bei der Handhabung der globalen Phase der
UCGateklasse.
Aer- 0.10.4
Keine Änderung
IBM Q Anbieter 0.19.2
Keine Änderung
0.37.0
Diese Version markiert offiziell das Ende der Unterstützung für das Qiskit Ignis Projekt von Qiskit. Ursprünglich war es in der Version 0.33.0 veraltet, und wie in dieser Version dokumentiert wurde, wurde das Paket qiskit-ignis aus dem Qiskit-Metapaket entfernt, was bedeutet, dass in dieser zukünftigen Version pip install qiskit nicht mehr qiskit-ignis enthalten sein wird. Beachten Sie jedoch, dass wir aufgrund von Einschränkungen bei der Paketierung von Python eine bereits vorhandene Installation von qiskit-ignis nicht automatisch entfernen können. Wenn Sie ein Upgrade von einer früheren Version durchführen, wird empfohlen, Qiskit Ignis mit pip uninstall qiskit-ignis manuell zu deinstallieren oder das Metapaket in einer neuen Python-Umgebung zu installieren.
Qiskit Ignis wurde durch das Projekt Qiskit Experiments abgelöst. Einzelheiten zum Wechsel von Qiskit Ignis zu Qiskit Experiments finden Sie in der Migrationsanleitung.
Terra- 0.21.0
Vorspiel
Die Highlights der Qiskit 0.21.0 Version sind:
- Unterstützung für die Serialisierung eines Impulses
ScheduleBlocküberqiskit.qpy. Das QPY-Format wurde auf die Version 5 aktualisiert, die eine Definition für die Einbeziehung der Impulszeitpläne enthält. Um dies zu unterstützen, wurde eine neueSymbolicPulseklasse eingeführt, die die Definition parametrischer Impulswellenformen über symbolische Ausdrücke ermöglicht.- Verbesserungen bei der Arbeit mit voreingestellten Pass-Managern. Eine neue Funktion
generate_preset_pass_manager()ermöglicht die einfache Erzeugung eines Pass-Managers, der dem entspricht, wastranspile()intern verwenden wird. Außerdem sind die voreingestellten Passmanager jetzt Instanzen vonStagedPassManagerwas es einfacher macht, Abschnitte zu ändern.- Eine Umstrukturierung der internen Datenstruktur des
QuantumCircuit.dataattributs. Früher war es eine Liste von Tupeln in der Form(instruction, qubits, clbits)und jetzt ist es eine Liste vonCircuitInstructionobjekten. DieCircuitInstructionobjekte ist abwärtskompatibel mit dem früheren tupelbasierten Zugriff, allerdings mit Laufzeit-Overhead-Kosten.
Außerdem wurde der Transpiler verbessert, um eine bessere Qualität der Ausgaben zu ermöglichen. Dazu gehört die Einführung neuer Pässe wie VF2PostLayout und ToqmSwap.
Neue Funktionen
-
Eine neue Klasse wurde hinzugefügt,
qiskit.transpiler.StagedPassManagerhinzugefügt, die einePassManagerunterklasse, die eine Pipeline mit definierten Phasen für die Kompilierung von Schaltkreisen besitzt. Jede Phase ist einPassManagerobjekt, das in einer bestimmten Reihenfolge ausgeführt wird. Zum Beispiel:from qiskit.transpiler.passes import * from qiskit.transpiler import PassManager, StagedPassManager basis_gates = ['rx', 'ry', 'rxx'] init = PassManager([UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]) translate = PassManager([Collect2qBlocks(), ConsolidateBlocks(basis_gates=basis_gates), UnitarySynthesis(basis_gates)]) staged_pm = StagedPassManager(stages=['init', 'translation'], init=init, translation=translate) -
Hinzufügen der Methoden
PauliList.group_commuting()undSparsePauliOp.group_commuting()hinzugefügt, die diese Operatoren in Unterlisten aufteilen, in denen jedes Element mit allen anderen kommutiert. Zum Beispiel:from qiskit.quantum_info import PauliList, SparsePauliOp groups = PauliList(["XX", "YY", "IZ", "ZZ"]).group_commuting() # 'groups' is [PauliList(['IZ', 'ZZ']), PauliList(['XX', 'YY'])] op = SparsePauliOp.from_list([("XX", 2), ("YY", 1), ("IZ", 2j), ("ZZ", 1j)]) groups = op.group_commuting() # 'groups' is [ # SparsePauliOp(['IZ', 'ZZ'], coeffs=[0.+2.j, 0.+1.j]), # SparsePauliOp(['XX', 'YY'], coeffs=[2.+0.j, 1.+0.j]), # ] -
Eine neue Funktion wurde hinzugefügt,
marginal_distribution()hinzugefügt, die verwendet wird, um ein Eingabewörterbuch von Bitstrings in eine ganze Zahl zu marginalisieren (z. BCounts). Diese Funktion ähnelt in ihrer Funktionalität der bestehendenmarginal_counts()funktion mit drei wesentlichen Unterschieden. Die erste ist, dassmarginal_counts()entweder mit einem Zählwörterbuch oder einemResultsObjekt arbeitet, währendmarginal_distribution()nur mit einem Wörterbuch funktioniert. Die zweite ist, dassmarginal_counts()die Reihenfolge der Indizes in seinemindicesArgument nicht beachtet, währendmarginal_distribution()dies tut und die Ausgabebits auf der Grundlage derindicesReihenfolge vertauscht. Der dritte Unterschied ist, dassmarginal_distribution()schneller sein sollte, da seine Implementierung in Rust geschrieben ist und für die Marginalisierung einer Wörterbuch-Eingabe optimiert wurde. -
Der Binäroperator
@(__matmul__) wurde zuBaseOperatorUnterklassen imqiskit.quantum_infomodul. Dies ist eine Abkürzung für den Aufruf der Methodedotder Klasse (A @ B == A.dot(B)). -
Ein neues optionales Argument,
reps, wurde zuQuantumCircuit.decompose()hinzugefügt, das eine wiederholte Zerlegung der Schaltung ermöglicht. Zum Beispiel:from qiskit import QuantumCircuit circuit = QuantumCircuit(1) circuit.ry(0.5, 0) # Equivalent to circuit.decompose().decompose() circuit.decompose(reps=2) # decompose 2 times, but only RY gate 2 times and R gate 1 times circuit.decompose(gates_to_decompose=['ry','r'], reps=2) -
Eine neue Pulse-Basisklasse hinzugefügt
SymbolicPulse. Dies ist ein Ersatz für das herkömmlicheParametricPulse, die veraltet sein wird. In der neuen Basisklasse werden die Funktionen der Impulshüllkurve und der Parameterüberprüfung durch Objekte mit symbolischen Ausdrücken dargestellt. Die neue Klasse bietet in sich geschlossene und portable Impulsdaten, da diese symbolischen Gleichungen leicht durch symbolische Berechnungsbibliotheken serialisiert werden können. -
Unterstützung für nicht-hermitsche Operatoren in
AerPauliExpectation. Dies ermöglicht die Verwendung von Aer's schnellen Snapshot-Erwartungsberechnungen in Algorithmen wieQEOM. -
Es wurde ein neuer Zeichenstil für Schaltkreise hinzugefügt,
textbook, der das Farbschema des Qiskit-Lehrbuchs verwendet. -
Ein neues Attribut
QuantumCircuit.op_start_timeswird ausgefüllt, wenn einer der Scheduling-Analysedurchläufe für den Schaltkreis durchgeführt wird. Sie kann z. B. verwendet werden, um eine Schaltanweisung mit Anweisungszeit zu erhalten:from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import FakeMontreal backend = FakeMontreal() qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qct = transpile( qc, backend, initial_layout=[0, 1], coupling_map=[[0, 1]], scheduling_method="alap" ) scheduled_insts = list(zip(qct.op_start_times, qct.data)) -
Hinzufügen einer neuen Methode
QuantumCircuit.clear()hinzugefügt, die verwendet wird, um alle Anweisungen aus einerQuantumCircuit. -
Eine neue Methode hinzugefügt
QuantumCircuit.copy_empty_like()die verwendet wird, um eine gelöschte Kopie einerQuantumCircuitinstanz zu erhalten. Dies ist logisch gleichwertig mitqc.copy().clear(), aber wesentlich schneller und speichereffizienter. Dies ist nützlich, wenn man einen neuen leeren Schaltkreis benötigt, dem bereits alle Ressourcen (Qubits, klassische Bits, Metadaten usw.) hinzugefügt wurden. -
Die Methode
Target.instruction_supported()methode unterstützt jetzt zwei neue Schlüsselwortargumente:operation_classundparameters. Mit diesen Argumenten kann dieinstruction_supported()methode nun verwendet werden, um zu prüfen, ob eine bestimmte Operation mit Parameterwerten von einemTargetobjekt unterstützt wird. Wenn Sie zum Beispiel prüfen wollen, ob einTargetnamenstargetdie Ausführung einesRXGatemit unterstützt, würden Sie etwas wie folgt tun:from math import pi from qiskit.circuit.library import RXGate target.instruction_supported(operation_class=RXGate, parameters=[pi/2])die
Truezurückgibt, wenntargetdie Ausführung vonRXGatemit unterstützt undFalse, wenn dies nicht der Fall ist. -
Hinzufügen eines auf Trotterisierung basierenden Quanten-Echtzeit-Evolutionsalgorithmus
qiskit.algorithms.TrotterQRTE. Es ist mit dem neuen Rahmen für die Quantenzeitentwicklung vereinbar und macht Gebrauch von denProductFormulaundPauliEvolutionGateimplementierungen.from qiskit.algorithms import EvolutionProblem from qiskit.algorithms.evolvers.trotterization import TrotterQRTE from qiskit.opflow import X, Z, StateFn, SummedOp operator = SummedOp([X, Z]) initial_state = StateFn([1, 0]) time = 1 evolution_problem = EvolutionProblem(operator, time, initial_state) trotter_qrte = TrotterQRTE() evolution_result = trotter_qrte.evolve(evolution_problem) evolved_state_circuit = evolution_result.evolved_state -
Eine neue Funktion wurde hinzugefügt
generate_preset_pass_manager()die verwendet werden kann, um schnell ein voreingestelltesPassManagerobjekt zu erzeugen, das diePassManagerspiegelt, das intern von dertranspile()funktion. Zum Beispiel:from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeWashingtonV2 # Generate an optimization level 3 pass manager targeting FakeWashingtonV2 pass_manager = generate_preset_pass_manager(3, FakeWashingtonV2()) -
Eine neue Funktion wurde hinzugefügt
marginal_memory()hinzugefügt, die zur Marginalisierung von Shot-Memory-Arrays verwendet wird. Mit dem Schuss-Speicher-Array und den Indizes, die von Interesse sind, gibt die Funktion ein maginisiertes Schuss-Speicher-Array zurück. Diese Funktion unterscheidet sich von der Speicherunterstützung in dermarginal_counts()methode, die nur mit dem Feldmemoryin einemResultsObjekt arbeitet. -
Die Primitivschnittstelle wurde erweitert, um neben Indizes auch Objekte als Argumente für die Methode
__call__zu akzeptieren. Das Argumentparameter_valueskann nun optional sein. -
Der OpenQASM 3-Exporter (
qiskit.qasm3) unterstützt nun den Export von Schaltungen mit expliziten Verzögerungen, wie z.B. vonQuantumCircuit.delay(). -
Hinzufügen einer neuen Layout- und Routing-Methode zu
transpile()basierend auf dem Papier "Time-optimal qubit mapping". Um es zu verwenden, muss das optionale Paket Qiskit TOQM installiert werden. Derrouting_methodkwarg vontranspile()unterstützt einen zusätzlichen Wert,'toqm', der verwendet wird, um Layout und Routing über TOQM zu ermöglichen.Um
qiskit-toqmzusammen mit Terra zu installieren, führen Sie aus:pip install qiskit-terra[toqm] -
Ein neues Modul
qiskit.quantum_info.synthesis.qsdwurde hinzugefügt, um die Quanten-Shannon-Zerlegung auf beliebige Unitarien anzuwenden. Diese Funktionalität ersetzt den bisherigen isometriebasierten Ansatz im Standardtranspiler für die Unitary-Synthese sowie beim Hinzufügen von Unitaries zu einer Schaltung mit Hilfe einerUnitaryGate.Die Quanten-Shannon-Zerlegung benötigt bei der Zerlegung von unitären Matrizen mit mehr als zwei Qubits etwa halb so viele cnot-Gatter wie die isometrische Implementierung.
-
Klassen im Modul
quantum_infomodul, die die Skalarmultiplikation unterstützen, können nun mit einem Skalar von links oder rechts multipliziert werden. Zuvor akzeptierten sie nur skalare Multiplikatoren von links. -
Der Transpiler-Pass
LookaheadSwap(verwendet vontranspile()routing_method="lookahead") hat einige Leistungsverbesserungen erfahren und ist nun etwa dreimal so schnell. Dies ist lediglich eine effizientere Berechnung und ändert nichts an der Komplexität des Algorithmus. In den meisten Fällen ist ein modernerer Routing-Algorithmus wieSabreSwap(routing_method="sabre") weitaus leistungsfähiger sein. -
Es wurden neue Transpilerpässe hinzugefügt. Der Transpiler-Pass
Commuting2qGateRouterverwendet Swap-Strategien, um einen Block von Pendelgattern an die Kopplungskarte zu leiten. Das Routing ist in der Tat ein schwieriges Problem, aber es ist wesentlich einfacher, wenn die Gates wie in CZ-Netzen pendeln. Auch in QAOA sind typischerweise Blöcke von Pendlerpforten zu finden. Solche Fälle können mit Hilfe von Swap-Strategien behandelt werden, die einen vordefinierten Satz von SWAP-Gates anwenden. Außerdem identifiziert der neue Transpiler-PassFindCommutingPauliEvolutionsBlöcke von Pauli-Evolutionen, die aus kommutierenden Zwei-Qubit-Termen bestehen. Hier wird eine Tauschstrategie durch die KlasseSwapStrategyfestgelegt. Um die besten Ergebnisse zu erzielen, müssen die Tauschstrategien auf das Kopplungsschema und idealerweise auf die Schaltung zugeschnitten sein. -
Einführung eines neuen Optimierers in die Qiskit-Bibliothek, der die Optimierung von Parametern von variablen Quantenalgorithmen unterstützt. Es handelt sich um den Univariaten Marginalen Verteilungsalgorithmus (UMDA), der eine besondere Form der Verteilungsschätzungsalgorithmen darstellt. Zum Beispiel:
from qiskit.opflow import X, Z, I from qiskit import Aer from qiskit.algorithms.optimizers import UMDA from qiskit.algorithms import QAOA from qiskit.utils import QuantumInstance H2_op = (-1.052373245772859 * I ^ I) + \ (0.39793742484318045 * I ^ Z) + \ (-0.39793742484318045 * Z ^ I) + \ (-0.01128010425623538 * Z ^ Z) + \ (0.18093119978423156 * X ^ X) p = 2 # Toy example: 2 layers with 2 parameters in each layer: 4 variables opt = UMDA(maxiter=100, size_gen=20) backend = Aer.get_backend('statevector_simulator') vqe = QAOA(opt, quantum_instance=QuantumInstance(backend=backend), reps=p) result = vqe.compute_minimum_eigenvalue(operator=H2_op) -
Der Konstruktor für den
Unroll3qOrMoretranspilerpass hat zwei neue optionale Schlüsselwortargumente:targetundbasis_gates. Mit diesen Optionen können Sie dieTargetbzw. die unterstützten Basis-Gates anzugeben, um das Ziel-Backend zu beschreiben. Wenn eine der Operationen in der Schaltung intargetoderbasis_gatesenthalten ist, werden diese nicht durch den Durchlauf abgewickelt, da das Zielgerät die Operation von Haus aus unterstützt. -
Die QPY-Serialisierung wurde aktualisiert und unterstützt nun
ScheduleBlock. Jetzt können Sie das Impulsprogramm im Binärformat speichern und zu einem späteren Zeitpunkt laden:from qiskit import pulse, qpy with pulse.build() as schedule: pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0)) with open('schedule.qpy', 'wb') as fd: qpy.dump(schedule, fd) with open('schedule.qpy', 'rb') as fd: new_schedule = qpy.load(fd)[0]Dabei wird die QPY-Schnittstelle verwendet, die für
QuantumCircuit. Siehe SCHEDULE_BLOCK für Einzelheiten zur Datenstruktur. -
Ein neuer Transpiler-Pass wurde hinzugefügt,
VF2PostLayout. Dieser Durchlauf ist ein neuer Typ, der eine neue Phase/Funktion in der Kompilierungspipeline durchführt, und zwar nach dem Layout oder nach der Optimierung der Qubit-Auswahl. Die Idee hinter diesem Durchgang ist, dass wir nach Abschluss der Optimierungsschleife im Transpiler wissen, wie hoch die endgültige Gatterzahl für jedes Qubit in der Schaltung sein wird, so dass wir möglicherweise eine leistungsfähigere Untergruppe von Qubits auf einem Backend finden können, um die Schaltung auszuführen. Der Durchlauf sucht nach einem isomorphen Untergraphen im Konnektivitätsgraphen des Ziel-Backends und betrachtet die vollständige Fehlerrate der vollständigen Schaltung auf jedem gefundenen Untergraphen und gibt das gefundene Layout mit der niedrigsten Fehlerrate für die Schaltung zurück.Dieser Pass ist ähnlich wie der
VF2Layoutdurchgang und beide verwenden intern die gleiche VF2 Implementierung von retworkx. Allerdings,VF2PostLayoutist jedoch so konzipiert, dass es nach dem ersten Layout, dem Routing, der Basisübersetzung und allen Optimierungsdurchläufen ausgeführt wird und nur funktioniert, wenn bereits ein Layout angewendet wurde, die Schaltung geroutet wurde und alle Gatter in der Zielbasis liegen. Dies ist erforderlich, damit die Schaltung bei einem neuen Layout weiterhin auf dem Zielgerät ausgeführt werden kann.VF2Layouthingegen ist darauf ausgelegt, ein perfektes Ausgangslayout zu finden und kann mit jeder Schaltung arbeiten. -
Der
ApplyLayouttranspiler-Pass unterstützt nun die Aktualisierung eines Layouts auf einer Schaltung, nachdem ein Layout bereits einmal angewendet wurde. Wenn das Feldpost_layoutvorhanden ist (zusätzlich zum erforderlichen Feldlayout), wird das Feldproperty_setbei Ausführung desApplyLayoutpass ausgeführt wird, aktualisiert der Pass das Layout, um das neue Layout anzuwenden. Dies gibt einDAGCircuitmit den Qubits in der neuen physikalischen Reihenfolge zurück, und der Eigenschaftssatzlayoutwird so aktualisiert, dass er die virtuellen Qubits aus dem ursprünglichen Layout den physikalischen Qubits im neuen Feldpost_layoutzuordnet. -
Die voreingestellten Passmanager werden durch
level_1_pass_manager(),level_2_pass_manager(), undlevel_3_pass_manager()erzeugten voreingestellten Passmanager, dieoptimization_level1, 2 bzw. 3 dertranspile()funktion führen nun denVF2PostLayoutnach der Ausführung des Routing-Passes aus. Dadurch kann der Transpiler möglicherweise einen anderen Satz physikalischer Qubits auf dem Ziel-Backend finden, auf denen der Schaltkreis mit niedrigeren Fehlerraten läuft. DerVF2PostLayoutpass wird nicht ausgeführt, wenn Sie manuell einlayout_method,routing_methododerinitial_layoutArgument fürtranspile(). Wenn der Pass eine leistungsfähigere Untergruppe von Qubits im Backend findet, um den physikalischen Schaltkreis zu betreiben, wird er das Layout des Schaltkreises anpassen, um stattdessen die alternativen Qubits zu verwenden. -
Der Algorithmus berechnet iterativ jeden Eigenzustand, indem er mit dem Grundzustand beginnt (der wie bei VQE berechnet wird) und dann eine modifizierte Kostenfunktion optimiert, die versucht, Eigenzustände zu berechnen, die orthogonal zu den in den vorherigen Iterationen berechneten Zuständen sind und die niedrigste Energie haben, wenn sie über den Ansatz berechnet werden. Die implementierte Schnittstelle ist derjenigen von VQE sehr ähnlich und hat die Form:
from qiskit.algorithms import VQD from qiskit.utils import QuantumInstance from qiskit.circuit.library import TwoLocal from qiskit.algorithms.optimizers import COBYLA from qiskit import BasicAer from qiskit.opflow import I,Z,X h2_op = ( -1.052373245772859 * (I ^ I) + 0.39793742484318045 * (I ^ Z) - 0.39793742484318045 * (Z ^ I) - 0.01128010425623538 * (Z ^ Z) + 0.18093119978423156 * (X ^ X) ) vqd = VQD(k =2, ansatz = TwoLocal(rotation_blocks="ry", entanglement_blocks="cz"),optimizer = COBYLA(maxiter = 0), quantum_instance = QuantumInstance( BasicAer.get_backend("qasm_simulator"), shots = 2048) ) vqd_res = vqd.compute_eigenvalues(op)Dieses spezielle Codeschnipsel erzeugt 2 Eigenwerte (Grundzustand und 1. angeregter Zustand) Tests wurden ebenfalls implementiert.
Anmerkungen zu Upgrades
-
Die Pulsklassen in
qiskit.pulse.librarysind jetzt Unterklassen vonSymbolicPulseund nicht mehrParametricPulse. Die verfügbaren Klassen bleiben unverändert alsGaussian,GaussianSquare,Drag, undConstant.SymbolicPulseist vollständig abwärtskompatibel, und es sollte keine Funktionseinbußen geben. -
Der Datentyp der einzelnen Elemente in
QuantumCircuit.datahat sich geändert. Früher war es ein einfaches 3-Tupel aus einemInstruction, einer Liste vonQubits, und einer Liste vonClbits, während es jetzt eine Instanz vonCircuitInstruction.Die Attribute dieser neuen Klasse sind
operation,qubitsundclbits, die den Elementen des vorherigen Tupels entsprechen. Aber,qubitsundclbitssind jetzttupleInstanzen, nichtlists.Diese neue Klasse verhält sich genau wie das alte 3-Tupel, wenn man versucht, auf seinen Index und seine Elemente zuzugreifen oder ihn zu durchlaufen. Dazu gehört auch der Einsatz der
qubitsundclbitselemente in Listen. Dies dient der Abwärtskompatibilität. Ab Qiskit Terra 0.21 ist dies nicht mehr der bevorzugte Weg, um auf diese Elemente zuzugreifen. Stattdessen sollten Sie die oben beschriebene Form des Attributzugriffs verwenden.Dies wurde getan, um weitere Entwicklungen der
QuantumCircuitdatenstruktur in Terra zu ermöglichen, ohne ständig die Rückwärtskompatibilität zu verletzen. Zu den geplanten Entwicklungen gehören dynamisch parametrisierte Schaltungen und eine allgemeine Verringerung des Speicherbedarfs von tiefen Schaltungen. -
Die Abhängigkeit
python-constraint, die nur von demCSPLayouttranspiler-Pass verwendet wird, ist nicht mehr in der Anforderungsliste für das Qiskit Terra-Paket enthalten. Dies liegt daran, dass derCSPLayoutpass nicht mehr standardmäßig in einem der voreingestellten Passmanager fürtranspile(). Der Pass ist zwar immer noch verfügbar, aber wenn Sie ihn verwenden, müssen Siepython-contraintmanuell installieren, oder Sie können bei der Installation vonqiskit-terraz. B. das Extracsp-layoutverwenden:pip install "qiskit-terra[csp-layout]" -
Die Version des QPY-Versionsformats, die von
qpy.dump()ausgegeben wird, wurde auf Version 5 erhöht. Diese neue Formatversion ist inkompatibel mit den Vorgängerversionen und führt zu einem Fehler, wenn versucht wird, sie mit einem Deserialisierer zu laden, der nicht in der Lage ist, QPY Version 5 zu verarbeiten. Diese Änderung war notwendig, um die Unterstützung für die korrekte Darstellung von kontrollierten Gates und die Darstellung von nicht standardmäßigen Kontrollzuständen zu verbessern. -
Die kompilierten Rust-Erweiterungen von Qiskit Terra haben jetzt eine minimal unterstützte Rust-Version (MSRV) von 1.56.1. Das bedeutet, dass beim Erstellen von Qiskit Terra aus dem Quellcode die älteste unterstützte Version des Rust-Compilers 1.56.1 ist. Wenn Sie eine ältere Version des Rust-Compilers verwenden, müssen Sie auf eine neuere Version aktualisieren, um Qiskit weiterhin aus dem Quellcode erstellen zu können. Diese Änderung war notwendig, da eine Reihe von Upstream-Abhängigkeiten ihre minimal unterstützten Versionen ebenfalls aktualisiert haben.
-
Die Schaltkreisplanung wird nun parallel ausgeführt, wenn mehr als ein Schaltkreis zur Verfügung gestellt wird
schedule(). Siehe #2695 für weitere Einzelheiten. -
Die zuvor veralteten Klassen
BaseBackend,BaseJobundBaseProviderwurden alle entfernt. Sie wurden ursprünglich in der Version 0.18.0 veraltet. Anstelle dieser Klassen sollten Sie die Schnittstellenklassen der versionierten Anbieter verwenden, die neuesten sindBackendV2,JobV1, undProviderV1. -
Das zuvor veraltete
backendArgument für den Konstruktor desRZXCalibrationBuildertranspilerpasses wurde entfernt. Ursprünglich war sie in der Version 0.19.0 veraltet. Stattdessen sollten Sie dasBackendobjekt nachinstruction_schedule_mapundqubit_channel_mappingabfragen und diese direkt an den Konstruktor übergeben. Zum Beispiel, mit einemBackendV1backend:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.providers.fake_provider import FakeMumbai backend = FakeMumbai() inst_map = backend.defaults().instruction_schedule_map channel_map = backend.configuration().qubit_channel_mapping cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, )oder mit einem
BackendV2backend:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.providers.fake_provider import FakeMumbaiV2 backend = FakeMumbaiV2() inst_map = backend.instruction_schedule_map channel_map = {bit: backend.drive_channel(bit) for bit in range(backend.num_qubits)} cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, ) -
Das Limit für Messschüsse für das
BasicAerBackend wurde entfernt. -
Für
DAGNodewurden die zuvor veraltetentype,op,qargs,cargsundwirekwargs und Attribute entfernt. Diese waren ursprünglich in der Version 0.19.0 veraltet. Auf die Kwargs und Attributeop,qargsundcargskann nur auf Instanzen vonDAGOpNodezugegriffen werden, und der Kwarg und das Attributwiresind nur auf Instanzen vonDAGInNodeoderDAGOutNode. -
Die veraltete Funktion
pauli_group()wurde entfernt. Ursprünglich war sie in Qiskit Terra 0.17 veraltet. -
Mehrere veraltete Methoden auf
Pauliwurden entfernt, die ursprünglich in Qiskit Terra 0.17 veraltet waren. Diese waren:sgn_prodVerwenden Sie
Pauli.compose()oderPauli.dot()stattdessen.to_spmatrixVerwenden Sie
Pauli.to_matrix()mit dem Argumentsparse=Truestattdessen.kronVerwenden Sie
Pauli.expand()verwenden, aber beachten Sie, dass dies ein neues Objekt zurückgibt, anstatt das vorhandene zu verändern.update_zundupdate_xStellen Sie die Attribute
zundxdes Objekts direkt ein.insert_paulisVerwenden Sie
Pauli.insert().append_paulisVerwenden Sie
Pauli.expand().delete_qubitsVerwenden Sie
Pauli.delete().pauli_singleKonstruieren Sie das Etikett manuell und übergeben Sie es direkt an den Initialisierer, wie z. B.:
Pauli("I" * index + pauli_label + "I" * (num_qubits - index - len(pauli_label)))randomVerwenden Sie
quantum_info.random_pauli()stattdessen. -
Die Methode
optimizewurde aus denOptimizerklassen, die durch die Methodeminimize()methode als direkter Ersatz. Die einzige Ausnahme istSPSA, wo die Verwerfungswarnung nicht ausgelöst wurde, so dass die Methode dort weiterhin beibehalten wird. -
Resultwurde so geändert, dass sie immer die Attributedate,statusundheaderenthält (und aufNonegesetzt wird, falls nicht angegeben). -
Für Python 3.7 shared-memory38 ist jetzt eine Abhängigkeit. Dies wurde als Abhängigkeit für Python 3.7 hinzugefügt, um die Nutzung der Shared-Memory-Konstrukte in der Standardbibliothek von neueren Versionen von Python zu ermöglichen. Wenn Sie mit Python >= 3.8 arbeiten, ist keine zusätzliche Abhängigkeit erforderlich.
-
Instructionbeschriftungen werden jetzt bei der Erstellung von Anweisungen auf ihre Typisierung geprüft. -
Die QPY-Serialisierung wurde verbessert und serialisiert nun
QuantumCircuitmitQuantumCircuit.calibrations. Ab QPY Version 5 können nur noch Kalibrierungseinträge vomScheduleBlocktyps serialisiert werden. -
Die Definition von
XXPlusYYGatewurde geändert. Siehe #7969 für weitere Informationen. -
Die voreingestellten Passmanager werden durch
level_1_pass_manager(),level_2_pass_manager(), undlevel_3_pass_manager()erzeugten und von der Funktiontranspile()funktionoptimization_levelverwendeten Argumente 1, 2 bzw. 3 setzen kein hartes Zeitlimit mehr für denVF2Layouttranspiler-Durchlauf. Das bedeutet, dass der Durchlauf nicht mehr aufhört, bis zu einem bestimmten Zeitlimit ( 100ms für Stufe 1, 10 Sekunden für Stufe 2 und 60 Sekunden für Stufe 3) nach einem besseren alternativen perfekten Layout zu suchen, da dies die Reproduzierbarkeit der Kompilierung einschränkte, wenn ein perfektes Layout verfügbar war. Das bedeutet, dass das Ergebnis bei Verwendung des Passes anders ausfallen kann als zuvor, obwohl es sich in allen Fällen nur dann ändert, wenn ein rauschärmerer Satz von Qubits als das vorherige Ergebnis gefunden werden kann. Wenn Sie das bisherige Verhalten beibehalten möchten, können Sie eine benutzerdefiniertePassManagererstellen, der das Argumenttime_limitim Konstruktor für den DurchgangVF2Layoutsetzt.
Hinweise zu veralteten Versionen
-
Der Aufruf von
timeline_drawer()mit einer außerplanmäßigen Schaltung ist veraltet. Alle Schaltungen, auch solche, die nur aus Verzögerungsanweisungen bestehen, müssen mit dem Schlüsselwortargumentscheduling_methodvontranspile()gesetzt werden, um Zeitplaninformationen zu erzeugen, die inQuantumCircuit.op_start_times. -
Die NetworkX konverterfunktionen für
DAGCircuit.to_networkx()undfrom_networkx()sowie die MethodeDAGDependency.to_networkx()sind veraltet und werden in einer zukünftigen Version entfernt. Qiskit verwendet seit der Veröffentlichung von qiskit-terra 0.12.0 retworkx als Graphenbibliothek, und seither sind die networkx-Konverterfunktionen verlustbehaftet. Sie wurden ursprünglich hinzugefügt, damit die Benutzer Funktionen der NetworkX’s Algorithmen-Bibliothek nutzen können, die in retworkx nicht vorhanden sind. Seitdem ist retworkx gereift und bietet mehr Funktionen, und dasDAGCircuitist für seinen Betrieb eng an retworkx gekoppelt. Diese Konvertierungsmethoden bieten nur einen begrenzten Nutzen und werden daher in einer zukünftigen Version entfernt. -
Der Zugriff auf mehrere alte Toggles (
HAS_MATPLOTLIB,HAS_PDFTOCAIRO,HAS_PYLATEXundHAS_PIL) aus demqiskit.visualizationmodul ist nun veraltet, und diese Importpfade werden in einer zukünftigen Version von Qiskit Terra entfernt werden. Auf die gleichen Objekte sollte stattdessen überqiskit.utils.optionalszugreifen, das Tester für fast alle optionalen Abhängigkeiten von Terra enthält. -
Das Modul
qiskit.test.mockist jetzt veraltet. Die Fake-Backend- und Fake-Provider-Klassen, die zuvor inqiskit.test.mockverfügbar waren, sind seit Terra auch inqiskit.providers.fake_providerseit Terra 0.20.0 zugänglich. Diese Änderung stellt eine echte Verpflichtung dar, die gefälschten Backend-Klassen als Teil von Qiskit zu unterstützen, während sie zuvor nur Teil der internen Testsuite waren und den Benutzern als Nebeneffekt zugänglich gemacht wurden. -
Die Namen der Argumente beim Aufruf einer
EstimatoroderSamplerobjekts als Funktion werden voncircuit_indicesundobservable_indicesincircuitsundobservablesumbenannt. -
Die Schlüsselwortargumente
qobj_idundqobj_headerfür die Funktionexecute()funktion sind veraltet und werden in einer zukünftigen Version entfernt. Seit der Entfernung der KlasseBaseBackendhaben diese Argumente keine Wirkung mehr, da kein Backend die direkte Ausführung mit einemQobjObjekt unterstützt und stattdessen nur noch mitQuantumCircuitobjekten direkt arbeiten. -
Die Argumente
x,zundlabelfür den Initialisierer vonPauliwurden in Qiskit Terra 0.17 als veraltet dokumentiert, aber ein Fehler verhinderte, dass die erwartete Warnung zur Laufzeit angezeigt wurde. Die Warnung wird nun korrekt angezeigt, und die Argumente werden in Qiskit Terra 0.23 oder später entfernt. Ein Paar ausxundzsollte an der richtigen Stelle als ein einziges Tupel übergeben werden (Pauli((z, x))). Eine Zeichenkettelabelsollte an der Position des ersten Arguments übergeben werden (Pauli("XYZ")). -
Die Methode
SPSA.optimize()methode ist veraltet und wird ersetzt durchSPSA.minimize()veraltet, die als direkter Ersatz verwendet werden kann. Beachten Sie, dass diese Methode ein vollständiges Ergebnisobjekt zurückgibt, das mehr Informationen als zuvor enthält. -
Das Argument
circuitsvonqpy.dump()ist veraltet und wurde durchprogramsersetzt, da QPY nun mehrere andere Datentypen als Schaltkreise unterstützt. -
AlignmentKind.to_dict()methode ist veraltet und wird entfernt.
Fehlerkorrekturen
-
Eine zusätzliche Validierung wurde zu
DiagonalGatehinzugefügt, um zu prüfen, ob das Argument den Modulus eins hat. -
Doppelte Qubit-Indizes, die an
SparsePauliOp.from_sparse_list()angegebene doppelte Qubit-Indizes führen nun zu einer Fehlermeldung, anstatt die vorherigen Werte stillschweigend zu überschreiben. Auf das alte Verhalten kann durch Übergabe des neuen Schlüsselwortargumentsdo_checks=Falsezugegriffen werden. -
Die
timeline_drawer()visualisierung wird die klassischen Registerplätze nicht mehr falsch ausrichten. -
Die Parametervalidierung für
GaussianSquareist jetzt vor und nach der Konstruktion konsistent. Siehe #7882 für weitere Einzelheiten. -
Die
BackendV2-basierten Fake-Backends imqiskit.providers.fake_providermodul, wie z.BFakeMontrealV2unterstützen nun dieDelayoperation in ihrentargetattributen. Zuvor,QuantumCircuitobjekte, die Verzögerungen enthielten, konnten nicht in diese Backends kompiliert werden. -
Ein Fehler in
TridiagonalToeplitz.eigs_bounds()wurde behoben, der dazu führte, dass in einigen Fällen mit negativen Eigenwerten falsche Eigenwertgrenzen zurückgegeben wurden. Siehe #7939 für weitere Einzelheiten. -
Ein Fehler wurde behoben, bei dem die Schublade LaTeX statevector den Parameter
max_sizeignorierte. -
Feste Unterstützung in der
PassManagerConfig.from_backend()konstruktor-Methode für den Aufbau einesPassManagerConfigobjekts aus einerBackendV2instanz. Zuvor wurde dies nicht korrekt gehandhabt und schlug fehl, wenn es mit einemBackendV2objekt. -
Reparierte Unterstützung für QPY-Serialisierung (
qpy.dump()) und Deserialisierung (qpy.load()) einesQuantumCircuitobjekts, das benutzerdefinierteControlledGateobjekte enthält. Zuvor wurde eine Ausnahme ausgelöst durchqpy.load()ausgelöst, wenn versucht wurde, die benutzerdefinierteControlledGate. Behoben #7999. -
Reparierte Unterstützung für QPY-Serialisierung (
qpy.dump()) und Deserialisierung (qpy.load()) einesQuantumCircuitobjekts, das benutzerdefinierteMCPhaseGateobjekte enthält. Zuvor wurde eine Ausnahme ausgelöst durchqpy.load()ausgelöst, wenn versucht wurde, dieMCPhaseGate. -
Reparierte Unterstützung für QPY-Serialisierung (
qpy.dump()) und Deserialisierung (qpy.load()) einesQuantumCircuitobjekts, das kontrollierte Gatter mit einem offenen Kontrollzustand enthält. Zuvor ging der offene Steuerzustand durch den Serialisierungsprozess und die rekonstruierte Schaltung verloren. -
Feststehend
QuantumCircuit.reverse_bits()mit Schaltungen, die registerloseQubitundClbit. Zum Beispiel funktioniert jetzt Folgendes:from qiskit.circuit import QuantumCircuit, Qubit, Clbit qc = QuantumCircuit([Qubit(), Clbit()]) qc.h(0).c_if(qc.clbits[0], 0) qc.reverse_bits() -
Das Attribut
ConfigurableFakeBackend.t2wurde korrigiert, das zuvor fälschlicherweise auf der Grundlage des angegebenent1Wertes gesetzt wurde. -
Ein Problem mit
BackendV2-basierend auf gefälschten Backend-Klassen aus demqiskit.providers.fake_providermodul wie z.BFakeMontrealV2wo der Wert für dasdtattribut (und dasTarget.dtattribut) nicht korrekt in Sekunden umgewandelt wurden. Dies würde zu Problemen bei der Verwendung dieser gefälschten Backends mit der Zeitplanung führen. -
Es wurde ein Fehler in
plot_histogram()wenn das Argumentnumber_to_keepkleiner war als die Anzahl der Schlüssel. Der folgende Code löst keine Fehler mehr aus und ist korrekt ausgerichtet:from qiskit.visualization import plot_histogram data = {'00': 3, '01': 5, '11': 8, '10': 11} plot_histogram(data, number_to_keep=2) -
Verbesserte Leistung beim Erstellen und Arbeiten mit parametrisierten
QuantumCircuitinstanzen mit vielen Gates, die eine relativ geringe Anzahl von Parametern gemeinsam haben. -
Der OpenQASM 3 Exporter (
qiskit.qasm3) versucht nicht mehr, Definitionen für nicht standardisierte Gatter in der Optionbasis_gateszu erstellen. -
Der Getter von
OptimizerResult.nitkorrigiert, der bisher die Anzahl der Jacobi-Auswertungen statt der Anzahl der Iterationen zurückgab. -
Es wurde ein Fehler in der String-Darstellung von
Resultobjekten behoben, der dazu führte, dass die Attribute nicht korrekt angegeben wurden. -
Ein Problem wurde behoben mit
transpile()wo in einigen Fällen die Übergabe einer Liste von Basisgatterzeichenketten mit dem Schlüsselwortargumentbasis_gatesoder implizit über eineTargeteingabe über das Schlüsselwortargumenttargetnicht korrekt interpretiert wurde und dazu führte, dass eine Teilmenge der aufgelisteten Gatter für jede Schaltung verwendet wurde. -
Es wurde ein Problem im
UnitarySynthesistranspilerdurchgang, der zu einem Fehler führte, wenn einTargetdas keine Qubit-Einschränkungen für die Operationen hatte (z.B. im Falle eines idealen Simulator-Targets), mit demtargetSchlüsselwort-Argument für den Konstruktor angegeben wurde. -
Die Methode
qiskit.result.marginal_counts()würde bei der Übergabe einesResultvon einem Puls-Backend übergeben wird, würde fehlschlagen, weil sie ein Array vonExperimentResultObjekten enthält, von denen jedes einQobjExperimentHeaderhat, und diesenExperimentHeadersfehlen creg_sizes Instanzvariablen. Wenn dieResultvon einem Simulator-Backend (z.B. Aer) käme, wäre diese Instanz-Variable dort zu finden. Wir korrigierenmarginal_countsso, dass die Logik, die creg_sizes benötigt, übersprungen wird, wenn das Feld nicht vorhanden oder nicht Null ist. -
Der OpenQASM 2-Exporter (
QuantumCircuit.qasm()) definiert nun korrekt die Qubit-Parameter fürUnitaryGateoperationen, die nicht alle Qubits betreffen, für die sie definiert sind. Behoben #8224. -
Es wurde ein Problem mit der Reproduzierbarkeit der
transpile()funktion bei der Ausführung mitoptimization_level1, 2 und 3. Wenn mehrere perfekte Layouts (ein Layout, das keine SWAP-Gatter benötigt) zur Verfügung standen, konnte es vorkommen, dass das gewählte Layout und die Ausgangsschaltung variierten, unabhängig davon, ob das Argumentseed_transpilergesetzt war.
Aer- 0.10.4
Keine Änderung
IBM Q Anbieter 0.19.2
Fehlerkorrekturen
- In der kommenden terra-Version wird es einen Release Candidate geben, der vor der endgültigen Version markiert wird. Das Ändern des Versionsstrings für das Paket wird jedoch im Moment vom qiskit-ibmq-provider blockiert, da er versucht, die Version zu analysieren und annimmt, dass es kein Prelease-Suffix im Versionsstring gibt (siehe #8200 für die Details). PR #1135 korrigiert diese Versionsanalyse, um die Regex aus dem pypa/packaging Projekt zu verwenden, die alle PEP440 Paketversionen mit Suffixen aus der Vorveröffentlichung behandelt. Dies ermöglicht es terra, ein 0.21.0rc1 Tag zu veröffentlichen, ohne den qiskit-ibmq-provider zu zerstören.
threading.currentThreadundnotifyAllwurden in Python 3.10 (Oktober 2021) veraltet und werden in Python 3.12 (Oktober 2023) entfernt. PR #1133 ersetzt sie durchthreading.current_thread,notify_allhinzugefügt in Python 2.6 (Oktober 2008).