Qiskit 0.39 Versionshinweise
0.39.5
Terra- 0.22.4
Vorspiel
Qiskit Terra 0.22.4 ist ein kleineres Bugfix-Release, das einige Fehler aus der 0.22 Serie behebt.
Fehlerkorrekturen
-
Ein Fehler wurde in
BackendSamplerder einen Fehler auslöste, wenn seinerun()methode zwei Mal hintereinander aufgerufen wurde. -
Es wurden zwei Fehler in der
ComposedOpwo dieComposedOp.to_matrix()methode nicht die richtigen Ergebnisse für Zusammensetzungen mitStateFnund für Zusammensetzungen mit einem globalen Koeffizienten. Behoben #9283. -
Es wurde das Problem behoben, bei dem Primitive,
SamplerundEstimatornicht funktionierten, wenn eine Schaltung mitnumpy.ndarrayals Parameter übergeben wurde. -
Es wurde ein Fehler in
SamplingVQEbehoben, bei dem das Argumentaggregationkeine Auswirkung hatte. Nun kann die Aggregationsfunktion und damit auch der CVaR Erwartungswert korrekt angegeben werden. -
Ein Leistungsfehler wurde behoben, bei dem
SamplingVQEdie Energien von Eigenzuständen nur langsam auswertete. -
Die automatische Bewertung der Beta-Parameter wurde in
VQDkorrigiert, Unterstützung fürSparsePauliOpeingaben, und die Energiebewertungsfunktion wurde korrigiert, um die asynchrone Ausführung von Primitiven zu nutzen, indem die Auftragsergebnisse erst abgerufen werden, nachdem beide Aufträge übermittelt wurden. -
Es wurde ein Problem mit den
Statevector.probabilities_dict()undDensityMatrix.probabilities_dict()methoden behoben, bei denen sie falsche Ergebnisse für Nicht-Qubit-Systeme lieferten, wenn das Argumentqargsangegeben wurde. Behoben #9210 -
Die Behandlung einiger
classmethods durchwrap_method()in Python 3.11. Zuvor wurde in Python 3.11,wrap_methoddie ungebundene Funktion, die mitclassmethodverbunden ist, umhüllt und schlug dann beim Aufruf fehl, weil das Klassenobjekt, das normalerweise anclassmethodgebunden ist, nicht an die Funktion übergeben wurde. Beginnend mit Python 3.11.1 betraf dieses ProblemQiskitTestCaseund verhinderte, dass es von anderem Testcode importiert werden konnte. Behoben #9291.
Aer- 0.11.2
Keine Änderung
IBM Q Anbieter 0.19.2
Keine Änderung
0.39.4
Terra- 0.22.3
Keine Änderung
Aer- 0.11.2
Neue Funktionen
- Unterstützung für die Ausführung von Qiskit Aer mit Python 3.11 hinzugefügt.
Bekannte Probleme
- Behebung von zwei Fehlern in AerStatevector. AerStatevector verwendet mc*-Anweisungen, die in der Methode matrix_product_state nicht aktiviert sind. Dieser Commit ändert AerStatevector so, dass MC* nicht mehr verwendet wird und H, X, Y, Z, U und CX verwendet werden. AerStatevector scheitert auch, wenn eine Anweisung in leere QuantumCircuit zerlegt wird. Diese Übergabe ermöglicht eine solche Anweisung.
Fehlerkorrekturen
-
In der Methode
AerSimulator.from_backend()wurde die Unterstützung für die Instanziierung einerAerSimulator-Instanz aus einem aBackendV2objekt. Zuvor hatte der Versuch,AerSimulator.from_backend()mit einemBackendV2objekt zu verwenden, wurde eineAerErrorausgegeben, die besagte, dass dies nicht unterstützt wurde. -
Behebt einen Fehler, bei dem
NoiseModel.from_backend()mit einemBackendV2Objekt ein Rauschmodell mit übermäßigemQuantumErrors auf Nicht-Gate-Befehlen erzeugen kann, während z.B. nurReadoutErrors für Maßnahmen ausreichend sein sollte. Diese Übergabe aktualisiertNoiseModel.from_backend()mit einemBackendV2Objekt, so dass es das gleiche Rauschmodell zurückgibt wie das, das mit dem entsprechendenBackendV1Objekt aufgerufen wird. Das heißt, das resultierende Rauschmodell enthält keineQuantumErrors auf Maßnahmen und es kann nur thermische Relaxationsfehler auf andere Nicht-Gate-Befehle wie z. B. Rücksetzungen enthalten. Beachten Sie, dass sie immer nochReadoutErrors auf Maßnahmen enthält. -
In
NoiseModel.from_backend()wurde ein Fehler behoben, bei dem die Verwendung vontemperaturekwarg mit einem anderen als dem Standardwert die Population der angeregten Zustände für die angegebene Temperatur falsch berechnet hat. Zuvor gab es einen zusätzlichen Faktor 2 bei der Berechnung der Boltzman-Verteilung, der zu einem falschen kleineren Wert für die Population im angeregten Zustand führte. -
Es wurde eine fehlerhafte Logik im Kontrollfluss-Compiler behoben, die dazu führen konnte, dass nicht verwandte Anweisungen während der Ausführung "innerhalb" von Kontrollflusskörpern erscheinen konnten, was zu falschen Ergebnissen führte. Zum Beispiel, früher:
from qiskit import QuantumCircuit from qiskit_aer import AerSimulator backend = AerSimulator(method="statevector") circuit = QuantumCircuit(3, 3) circuit.measure(0, 0) circuit.measure(1, 1) with circuit.if_test((0, True)): with circuit.if_test((1, False)): circuit.x(2) with circuit.if_test((0, False)): with circuit.if_test((1, True)): circuit.x(2) circuit.measure(range(3), range(3)) print(backend.run(circuit, method=method, shots=100).result())würde
{'010': 100}ausgeben, da die verschachtelten Kontrollflussoperationen versehentlich über das erste X-Gatter auf Qubit 2 springen würden, das eigentlich hätte ausgeführt werden müssen. -
Behebt einen Fehler, bei dem
NoiseModel.from_backend()ausführliche Warnungen ausgibt, wenn ein Backend bereitgestellt wird, das unphysikalische Geräteparameter wie T2 > 2 * T1 aufgrund von statistischen Fehlern bei ihrer Schätzung meldet. Dieser Commit entfernt solche Warnungen, da sie für die Benutzer nicht handhabbar sind, in dem Sinne, dass es keine andere Möglichkeit gibt, als sie auf die theoretischen Grenzen abzuschneiden, wie es imnoise.deviceModul gemacht wird. Siehe Ausgabe 1631 für Details zu dem behobenen Fehler. -
Dies ist eine Korrektur für den GPU-Zustandsvektor-Simulator. Die Chunk-Verteilung hat versucht, den gesamten freien Speicher auf der GPU zuzuweisen, was jedoch zu einem Fehler bei der Speicherzuweisung führt. Dieser Fix weist also 80 Prozent des freien Speichers zu. Dies legt auch die Größe des Matrixpuffers fest, wenn Rauschsampling angewendet wird.
-
Dies ist eine Korrektur von AerState, die mit Cache-Blockierung läuft. AerState falsch konfigurierter Transpiler von Aer für Cache-Blocking, und dann funktionierte sein Algorithmus zum Tauschen von Qubits falsch. Diese Korrektur korrigiert AerState, um diesen Transpiler zu verwenden. Genauer gesagt: Nach der Transpilierung wird eine vertauschte Qubit-Karte in die ursprüngliche Karte zurückverwandelt, wenn AerState verwendet wird. Dieser Fix ist notwendig für AerStatevector, um mehrere GPUs zu verwenden.
-
Dies ist die Lösung für AerStatevector. Es war nicht möglich, eine AerStatevector Instanz direkt aus dem Statevector von terra zu erstellen. Dieser Fix erlaubt einen Statevector als AerStatevector’s Eingabe.
-
SamplerResult.quasi_distsenthalten die Daten über die Anzahl der Qubits.QuasiDistribution.binary_probabilities()gibt Bitstrings mit der richtigen Länge zurück. -
Zuvor wird die Saat in AerStatevector nicht initialisiert und die Ergebnisse der Stichproben sind immer gleich. Mit diesem Commit wird für jede Stichprobe ein Seed initialisiert und die Ergebnisse der Stichprobe können variieren.
IBM Q Anbieter 0.19.2
Keine Änderung
0.39.3
Terra- 0.22.3
Vorspiel
Qiskit Terra 0.22.3 ist ein kleineres Bugfix-Release, das einige weitere Fehler in der 0.22 Serie behebt.
Fehlerkorrekturen
-
AdaptVQEzeigt nun korrekt an, dass es Hilfsoperatoren unterstützt. -
Die Schaltkreisschubladen (
QuantumCircuit.draw()undcircuit_drawer()) geben bei Verwendung der Standardargumente keine Warnung über den Parametercregbundlemehr aus, wenn der Inhalt des Schaltkreises erfordert, dass alle Bits einzeln gezeichnet werden. Dies trat vor allem dann auf, wenn man versuchte, Schaltungen mit neuartigen Kontrollflussoperationen zu zeichnen. -
Ein Fehler wurde behoben, der dazu führte, dass
QNSPSAfehlschlug, wennmax_evals_groupedauf einen Wert größer als 1 gesetzt wurde. -
Es wurde ein Problem mit dem
SabreSwapdurchgang, der dazu führte, dass die Ausgabe mehrerer Durchläufe des Durchgangs ohne Angabe des Argumentsseeddenselben Zufallszahlengenerator-Samen zwischen den Durchläufen wiederverwendete, anstatt verschiedene Samen zu verwenden. Dies führte bisher dazu, dass zwischen den Läufen identische Ergebnisse zurückgegeben wurden, auch wenn keineseedangegeben war. -
Ein Problem mit den primitiven Klassen wurde behoben,
BackendSamplerundBackendEstimator, bei denen Instanzen nicht mitpickleserialisiert werden konnten. Im Allgemeinen ist nicht garantiert, dass diese Klassen serialisierbar sind, daBackendV2undBackendV1instanzen nicht serialisierbar sein müssen (und es oft auch nicht sind), aber die Klassendefinitionen vonBackendSamplerundBackendEstimatorverhindern nicht mehr die Verwendung vonpickle. -
Die Methode
pulse.Instruction.draw()wird nun wie zuvor erfolgreich sein. Diese Methode ist veraltet und wird nicht ersetzt, sollte aber für die Zeit der Veraltung noch funktionieren.
Aer- 0.11.1
Keine Änderung
IBM Q Anbieter 0.19.2
Keine Änderung
0.39.2
Terra- 0.22.2
Vorspiel
Qiskit Terra 0.22.2 ist eine kleinere Bugfix-Version und markiert die erste offizielle Unterstützung für Python 3.11.
Fehlerkorrekturen
-
Ein Problem mit den primitiven Klassen im Backend wurde behoben
BackendSamplerundBackendEstimatordas die Ausführung mit einerBackendV1instanz, die keinmax_experimentsFeld in ihrerBackendConfiguration. -
Ein Fehler in der
VF2PostLayoutpass beim Transpilieren für Backends mit einem definiertenTarget, wo der Interaktionsgraph nicht korrekt erstellt wurde. Dies könnte zu übermäßigen Laufzeiten führen, da der Graph viel komplexer ist als nötig. -
Der Pulse-Ausdrucksparser sollte nicht mehr regelmäßig hängen bleiben, wenn er von Jupyter-Notebooks aus aufgerufen wird. Dies wird dadurch erreicht, dass ein internes
deepycopyeines rekursiven Objekts vermieden wird, dessen Auswertung für die Memoisierung besonders schwierig zu sein schien.
Aer- 0.11.1
Keine Änderung
IBM Q Anbieter 0.19.2
Keine Änderung
0.39.1
Terra- 0.22.1
Vorspiel
Qiskit Terra 0.22.1 ist eine Bugfix-Version, die einige kleinere Probleme behebt, die seit der Veröffentlichung von 0.22.0 festgestellt wurden.
Hinweise zu veralteten Versionen
- Der
pauli_listkwarg vonpauli_basis()wurde veraltet, dapauli_basis()jetzt immer einPauliList. Dieses Argument wurde vorzeitig aus Qiskit Terra 0.22.0 entfernt, wodurch die Kompatibilität für Benutzer, diepauli_list``argument. Now, the argument has been restored but will emit a ``DeprecationWarningverwenden, nicht mehr gegeben war. Wenn es verwendet wird, hat es keine Auswirkung, da Qiskit Terra 0.22.0 einePauliListimmer zurückgegeben wird.
Fehlerkorrekturen
-
Behebung des
BarrierBeforeFinalMeasurementstranspiler-Durchgang, wenn es Bedingungen auf losenClbits unmittelbar vor der endgültigen Messschicht. Bisher scheiterte dies mit der Begründung, dass das Bit nicht in einer internen temporären Schaltung vorhanden war. Behoben #8923 -
Die Gleichheitsprüfungen für
QuantumCircuitundDAGCircuit(mit Objekten desselben Typs) werden nun korrekt mit Bedingungen für einzelne Bits umgehen. Früher führten diese zu falsch negativen Ergebnissen bei Gleichheit, da die Bits "exakte" Gleichheitsprüfungen anstelle der "semantischen" Prüfungen verwendeten, die für die übrigen Eigenschaften von Schaltkreisanweisungen durchgeführt werden. -
Feste Handhabung von klassischen Bits in
StochasticSwapmit Kontrollfluss. Früher wurden Kontrollflussoperationen so erweitert, dass sie alle klassischen Bits in der äußeren Schaltung enthielten, und nicht wieder zusammengezogen, was zu einer Diskrepanz zwischen der Anzahl der vom Befehl als erforderlich gemeldeten Bits und der tatsächlichen Anzahl der ihm zugeführten Bits führte. Behoben #8903 -
Die Behandlung von global definierten Anweisungen für die
Targetklasse. Zuvor gab es zwei Methoden,operations_for_qargs()undoperation_names_for_qargs()ignorierten/fälschlicherweise alle global definierten idealen Operationen, die im Ziel vorhanden waren. Zum Beispiel:from qiskit.transpiler import Target from qiskit.circuit.library import CXGate target = Target(num_qubits=5) target.add_instruction(CXGate()) names = target.operation_names_for_qargs((1, 2)) ops = target.operations_for_qargs((1, 2))gibt nun
{"cx"}fürnamesund[CXGate()]füropszurück, anstattKeyErroroder einen leeren Rückgabewert zu erzeugen. -
Es wurde ein Problem in der
Target.add_instruction()methode behoben, bei der zuvor ein Argument mit einer ungültigen Anzahl von Qubits als Teil despropertiesArguments akzeptiert wurde. Zum Beispiel:from qiskit.transpiler import Target from qiskit.circuit.library import CXGate target = Target() target.add_instruction(CXGate(), {(0, 1, 2): None})Dies wird nun korrekt eine
TranspilerErrorauslösen, anstatt Laufzeitprobleme bei der Interaktion mit dem Ziel zu verursachen. Behoben #8914 -
Es wurde ein Problem mit der
plot_state_hinton()visualisierungsfunktion behoben, die zu einer falsch platzierten Achse führte, die gegenüber der eigentlichen Darstellung versetzt war. Behoben #8446 <https://github.com/Qiskit/qiskit/issues/8446> -
Die Ausgabe der Funktion
plot_state_hinton()funktion korrigiert, so dass die Zustandsbezeichnungen richtig geordnet sind und das Bild mit der natürlichen Matrixanordnung übereinstimmt. Behoben #8324 -
Ein Problem mit den primitiven Klassen wurde behoben,
BackendSamplerundBackendEstimatorbei der Ausführung auf Backends, die eine begrenzte Anzahl von Schaltkreisen in jedem Auftrag haben. Nicht alle Backends unterstützen eine unbegrenzte Stapelgröße (die meisten Hardware-Backends nicht), und früher hätten die primitiven Backend-Klassen möglicherweise fälschlicherweise mehr Schaltkreise gesendet, als das Backend unterstützte. Dies wurde dahingehend korrigiert, dassBackendSamplerundBackendEstimatordie Schaltkreise in mehrere Aufträge aufteilt, wenn das Backend eine begrenzte Anzahl von Schaltkreisen pro Auftrag hat. -
Es wurde ein Problem mit der
BackendEstimatorklasse, bei dem das Setzen einer Laufoption namensmonitorauf einen Wert, der alsTrueausgewertet wurde, fälschlicherweise einen Jobmonitor ausgelöst hat, der nur mit Backends aus dem Paketqiskit-ibmq-providerfunktioniert hat. Dies wurde entfernt, so dass Sie bei Bedarf die Optionmonitorverwenden können, ohne dass es zu Problemen kommt. -
Es wurde ein Problem mit der
Target.build_coupling_map()methode, die fälschlicherweiseNonefür einTargetobjekt mit einer Mischung aus idealen, global verfügbaren Anweisungen und Anweisungen mit Qubit-Beschränkungen. In solchen Fällen wird dieTarget.build_coupling_map()eine Kopplungskarte für die eingeschränkte Anweisung zurück (es sei denn, es handelt sich um eine 2-Qubit-Operation, dieNonezurückgibt, da es global gesehen keine Konnektivitätsbeschränkung gibt). Behoben #8971 -
Es wurde ein Problem mit dem
Target.qargsattribut, bei dem es fälschlicherweiseNonefür einTargetobjekt, das eine global verfügbare ideale Anweisung enthielt. -
Das vorzeitige Entfernen des
pauli_listSchlüsselwortarguments derpauli_basis()funktion, die bestehenden Code, der denpauli_list=Truefuture compatibility path beim Upgrade auf Qiskit Terra 0.22.0 verwendete, beschädigte. Dieses Schlüsselwortargument wurde wieder in die Funktion aufgenommen und ist nun veraltet und wird in einer zukünftigen Version entfernt werden. -
Ein Problem in der QPY-Serialisierung wurde behoben (
dump()), wenn eine benutzerdefinierteControlledGateunterklasse, die die Methode_define()überladen hat, um eine benutzerdefinierte Definition für die Operation bereitzustellen. Zuvor wurde dieser Vorgang nicht korrekt serialisiert, da die Verwendung der potenziellen Methode_define()zur Bereitstellung einer Definition nicht berücksichtigt wurde. Behebt #8794 -
Die QPY-Deserialisierung fügt nicht mehr zusätzliche
Clbitinstanzen zum Kreislauf hinzu, wenn sowohl loseClbits in der Schaltung und mehrQubits alsClbits. -
Die QPY-Deserialisierung fügt keine Register mit den Namen q und c mehr hinzu, wenn die Eingangsschaltung nur lose Bits enthält.
-
Die Methode
SparsePauliOp.dot()methode, wenn sie auf zwei Operatoren mit reellen Koeffizienten angewendet wird. Um dies zu beheben, wird der dtype, denSparsePauliOpannehmen kann, aufnp.complex128undobjectbeschränkt. Behoben #8992 -
Es wurde ein Problem in der
circuit_drawer()funktion und der MethodeQuantumCircuit.draw()behoben, bei dem der einzige eingebaute Stil für die Ausgabempl, der verwendbar war,defaultwar. Wenn ein anderer eingebauter Stil wieiqxverwendet würde, würde eine Warnung ausgegeben, dass der Stil nicht gefunden wurde, und die Schublade würde auf den Stildefaultzurückgreifen. Behoben #8991 -
Es wurde ein Problem mit dem
transpile()wo es zuvor mit einemTypeErrorfehlschlug, wenn ein benutzerdefiniertesTargetobjekt über das Argumenttargetübergeben wurde und für das Argumentcircuitseine Liste mit mehreren Schaltkreisen angegeben wurde. -
Ein Problem wurde behoben mit
transpile()beim Anvisieren einerTarget(entweder direkt über das Argumenttargetoder über eineBackendV2instanz aus dembackendArgument), die eine idealeMeasureanweisung enthielt (eine, für die keine Eigenschaften definiert waren). Zuvor wurde beim Versuch, das Ziel zu parsen, eine Ausnahme ausgelöst. Behoben #8969 -
Es wurde ein Problem mit dem
VF2Layoutpass, bei dem ein Fehler auftrat, wenn er mit einerTargetdie Anweisungen mit fehlenden Fehlerraten enthielt. Dies wurde korrigiert, so dass in solchen Fällen das Fehlen einer Fehlerquote als ideale Implementierung behandelt wird, und wenn keine Fehlerquoten vorhanden sind, wird einfach das erste passende Layout ausgewählt. Behoben #8970 -
Es wurde ein Problem mit dem
VF2PostLayoutpasses behoben, bei dem ein Fehler auftrat, wenn er mit einerTargetdie fehlende Anweisungen enthielt. In solchen Fällen wird das Fehlen einer Fehlerquote als ideale Durchführung des Vorgangs gewertet. -
Es wurde ein Problem mit der
VQDklasse, wenn mehr alsk=2Eigenwerte berechnet wurden. Zuvor schlug dies aufgrund einer internen Typinkongruenz fehl, aber jetzt läuft es wie erwartet. Behoben #8982 -
Ein Leistungsfehler wurde behoben, bei dem die neuen primitiv-basierten Variationsalgorithmen
minimum_eigensolvers.VQE,eigensolvers.VQDundSamplingVQEstandardmäßig keine Energieauswertungen in Stapeln durchführten, was zu einer erheblichen Verlangsamung führte, wenn ein Hardware-Backend verwendet wurde. -
Null-Operanden-Gatter und Anweisungen funktionieren jetzt mit
circuit_to_gate(),QuantumCircuit.to_gate(),Gate.control()und der Konstruktion einesOperatoraus einerQuantumCircuitmit Null-Operanden-Anweisungen. Dieser Grenzfall ist gelegentlich bei der Erstellung von Global-Phase-Gattern als Teil größerer zusammengesetzter Befehle nützlich, obwohl er für viele AnwendungenQuantumCircuit.global_phasegeeigneter sein kann. -
Behebt ein Problem, bei dem
Statevector.evolve()undDensityMatrix.evolve()bei der Entwicklung von verschachtelten Subsystemen für Nicht-Qubit-Subsysteme eine Exception auslöste. Behebt Problem #8897 -
Behebt einen Fehler in
Statevector.evolve()bei dem die Subsystem-Evolution in bestimmten Fällen den falschen Wert zurückgibt, wenn es 2 oder mehr als nicht-evolutionierte Subsysteme mit unterschiedlichen Subsystem-Dimensionen gibt. Behebt Problem #8899
Aer- 0.11.1
Fehlerkorrekturen
-
Ein möglicher Build-Fehler wurde behoben, wenn versucht wurde, CMake 3.18 oder neuer zu verwenden und qiskit-aer mit aktivierter GPU-Unterstützung zu bauen. Seit CMake 3.18 oder später muss beim Bauen mit CUDA die
CMAKE_CUDA_ARCHITECTURESmit dem Architekturwert für die Ziel-GPU gesetzt werden. Dies wurde korrigiert, so dass die EinstellungAER_CUDA_ARCHverwendet wird, wenn diese nicht gesetzt wurde. -
Behebt einen Fehler bei der Behandlung von Anweisungen mit Clbits in
LocalNoisePass. Zuvor wurden versehentlich Clbits von Anweisungen (z. B. Maßnahmen) gelöscht, auf die das Rauschen im Fall vonmethod="append"angewendet wird. -
Der Leistungs-Overhead der Sampler-Klasse bei der Ausführung mit identischen Schaltkreisen in mehreren Ausführungen wurde behoben. Dies wurde dadurch erreicht, dass die Umsetzung dieser identischen Schaltungen bei nachfolgenden Ausführungen übersprungen/gespeichert wurde.
-
Die Kompatibilität der
SamplerundEstimatorprimitiven Klassen mit qiskit-terra 0.22.0 Release. In qiskit-terra 0.22.0 wurden bahnbrechende API-Änderungen an der abstrakten Schnittstelle vorgenommen, wodurch die Kompatibilität mit diesen Klassen nicht mehr gegeben war; dies wurde behoben, so dassSamplerundEstimatorjetzt mit qiskit-terra >= 0.22.0 verwendet werden können.
IBM Q Anbieter 0.19.2
Keine Änderung
0.39.0
Mit dieser Version wird auch das Qiskit Aer-Projekt als Teil des Qiskit-Metapakets offiziell abgeschafft. Dies bedeutet, dass in einer zukünftigen Version pip install qiskit nicht mehr qiskit-aer enthalten sein wird. Wenn Sie derzeit qiskit als Abhängigkeit installieren oder auflisten, um Aer zu erhalten, sollten Sie dies aktualisieren, um qiskit-aer ebenfalls explizit aufzulisten.
Das Projekt qiskit-aer ist immer noch aktiv und wird weiter gepflegt, aber für das Qiskit-Metapaket (d.h. das, was über pip install qiskit installiert wird) bewegt sich das Projekt in Richtung eines Modells, bei dem das Qiskit-Paket nur die gemeinsame Kernfunktionalität für den Aufbau und die Kompilierung von Quantenschaltungen, Programmen und Anwendungen enthält und Pakete, die darauf aufbauen oder Qiskit mit Hardware oder Simulatoren verbinden, separate Pakete sind.
Terra- 0.22.0
Vorspiel
Die Version von Qiskit Terra 0.22.0 ist eine große Funktionsversion, die eine Vielzahl von neuen Funktionen und Fehlerbehebungen enthält. Die Highlights dieser Veröffentlichung sind:
- Hinzufügen einer anfänglichen Unterstützung des Transpilers für die Transpilierung von
QuantumCircuitvon Objekten, die Kontrollflussanweisungen enthalten, wieForLoopOpund enthaltenWhileLoopOp.- Deutlich verbesserte Skalierung und Leistung für die
transpile()funktion bei einer großen Anzahl von Qubits, insbesondere wennoptimization_level=3verwendet wird.- Externe Plugin-Schnittstelle für
transpile()die es externen Paketen ermöglicht, Stufen für die Standard-Passmanager zu implementieren. Weitere Einzelheiten hierzu finden Sie unterqiskit.transpiler.preset_passmanagers.plugin. Zusätzlich,BackendV2backends können nun optional benutzerdefinierte Standard-Plugins für die Planungs- und Übersetzungsphasen festlegen.- Aktualisierte Algorithmus-Implementierungen in
qiskit.algorithmsdie sich dieprimitivesklassen, die dieBaseSamplerundBaseEstimator.
Neue Funktionen
-
Hinzufügen von Unterstützung für die Darstellung einer Operation mit variabler Breite in der
Targetklasse. Zuvor musste einTargetobjekt eine Instanz vonOperationfür jede im Ziel unterstützte Operation definiert werden. Dies wurde sowohl für die Validierung der Argumente als auch der Parameter der Operation verwendet. Bei Operationen mit variabler Breite war dies jedoch nicht möglich, da jede Instanz einer KlasseOperationnur eine feste Anzahl von Qubits haben kann. In Fällen, in denen ein Backend Operationen mit variabler Breite unterstützt, kann die Anweisung mit der Klasse der Operation anstelle einer Instanz hinzugefügt werden. In solchen Fällen wird die Operation als global auf allen Qubits unterstützt behandelt. Zum Beispiel, wenn Sie ein Ziel wie:from qiskit.circuit import Parameter, Measure, IfElseOp, ForLoopOp, WhileLoopOp from qiskit.circuit.library import IGate, RZGate, SXGate, XGate, CXGate from qiskit.transpiler import Target, InstructionProperties theta = Parameter("theta") ibm_target = Target() i_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(IGate(), i_props) rz_props = { (0,): InstructionProperties(duration=0, error=0), (1,): InstructionProperties(duration=0, error=0), (2,): InstructionProperties(duration=0, error=0), (3,): InstructionProperties(duration=0, error=0), (4,): InstructionProperties(duration=0, error=0), } ibm_target.add_instruction(RZGate(theta), rz_props) sx_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(SXGate(), sx_props) x_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(XGate(), x_props) cx_props = { (3, 4): InstructionProperties(duration=270.22e-9, error=0.00713), (4, 3): InstructionProperties(duration=305.77e-9, error=0.00713), (3, 1): InstructionProperties(duration=462.22e-9, error=0.00929), (1, 3): InstructionProperties(duration=497.77e-9, error=0.00929), (1, 2): InstructionProperties(duration=227.55e-9, error=0.00659), (2, 1): InstructionProperties(duration=263.11e-9, error=0.00659), (0, 1): InstructionProperties(duration=519.11e-9, error=0.01201), (1, 0): InstructionProperties(duration=554.66e-9, error=0.01201), } ibm_target.add_instruction(CXGate(), cx_props) measure_props = { (0,): InstructionProperties(duration=5.813e-6, error=0.0751), (1,): InstructionProperties(duration=5.813e-6, error=0.0225), (2,): InstructionProperties(duration=5.813e-6, error=0.0146), (3,): InstructionProperties(duration=5.813e-6, error=0.0215), (4,): InstructionProperties(duration=5.813e-6, error=0.0333), } ibm_target.add_instruction(Measure(), measure_props) ibm_target.add_instruction(IfElseOp, name="if_else") ibm_target.add_instruction(ForLoopOp, name="for_loop") ibm_target.add_instruction(WhileLoopOp, name="while_loop")Die
IfElseOp,ForLoopOp, undWhileLoopOpwerden global für jede Anzahl von Qubits unterstützt. Dies wird dann durch andere Aufrufe in derTargetAPI wider, wie zum Beispielinstruction_supported():ibm_target.instruction_supported(operation_class=WhileLoopOp, qargs=(0, 2, 3, 4)) ibm_target.instruction_supported('if_else', qargs=(0, 1))beide geben
Truezurück. -
Neue primitive Implementierungen hinzugefügt,
BackendSamplerundBackendEstimatorzuqiskit.primitives. Diese neuen primitiven Klassenimplementierungen verpacken eineBackendV1oderBackendV2instanz alsBaseSampleroderBaseEstimatorum. Der beabsichtigte Anwendungsfall für diese primitiven Implementierungen ist die Überbrückung der Lücke zwischen Anbietern, die keine nativen primitiven Implementierungen haben, und der Verwendung des Backends dieses Anbieters mit APIs, die mit Primitiven arbeiten. Zum Beispiel, dieSamplingVQEklasse benötigt eineBaseSamplerinstanz zur Funktion. Wenn Sie diese Klasse mit einem Backend von einem Anbieter ohne native primitive Implementierung ausführen möchten, können Sie eineBackendSamplerum dies zu tun:from qiskit.algorithms.minimum_eigensolvers import SamplingVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import BackendSampler from qiskit.providers.fake_provider import FakeHanoi from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp backend = FakeHanoi() sampler = BackendSampler(backend=backend) operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12])) ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() sampling_vqe = SamplingVQE(sampler, ansatz, optimizer) result = sampling_vqe.compute_minimum_eigenvalue(operator) eigenvalue = result.eigenvalueWenn Sie einen Anbieter verwenden, der über native primitive Implementierungen verfügt (z. B.
qiskit-ibm-runtimeoderqiskit-aer), ist es immer eine bessere Wahl, diese native primitive Implementierung anstelle vonBackendEstimatoroderBackendSamplerzu verwenden, da die nativen Implementierungen viel effizienter sind und/oder zusätzliche Vor- und Nachverarbeitungen vornehmen.BackendEstimatorundBackendSamplersind so konzipiert, dass sie generisch sind und mit jedem Backend arbeiten können, dasCountsin ihremResults, was eine zusätzliche Optimierung ausschließt. -
Eine neue Algorithmusklasse wurde hinzugefügt,
AdaptVQEzu hinzugefügtqiskit.algorithmsDieser Algorithmus verwendet eineqiskit.algorithms.minimum_eigensolvers.VQEin Kombination mit einem Pool von Operatoren, aus dem er eineqiskit.circuit.library.EvolvedOperatorAnsatzadaptiv. Zum Beispiel:from qiskit.algorithms.minimum_eigensolvers import AdaptVQE, VQE from qiskit.algorithms.optimizers import SLSQP from qiskit.primitives import Estimator from qiskit.circuit.library import EvolvedOperatorAnsatz # get your Hamiltonian hamiltonian = ... # construct your ansatz ansatz = EvolvedOperatorAnsatz(...) vqe = VQE(Estimator(), ansatz, SLSQP()) adapt_vqe = AdaptVQE(vqe) result = adapt_vqe.compute_minimum_eigenvalue(hamiltonian) -
Die
BackendV2klasse unterstützt nun zwei neue optionale Hook-Points, die es Backends ermöglichen, benutzerdefinierte Kompilierungsschritte als Teil vontranspile()undgenerate_preset_pass_manager(). Wenn eineBackendV2implementierung die Methodenget_scheduling_stage_plugin()oderget_translation_stage_plugin()enthält, verwendet der Transpiler die zurückgegebene Zeichenkette als Standardwert für die Argumentescheduling_methodundtranslation_method. Dies ermöglicht es Backends, zusätzliche benutzerdefinierte Transpilerdurchläufe auszuführen, wenn sie auf dieses Backend abzielen, indem sie die Transpiler Stagepluginschnittstelle. Für weitere Details zur Verwendung siehe: Benutzerdefinierte Transpiler-Pässe. -
Ein neues Schlüsselwortargument,
ignore_backend_supplied_default_methods, wurde zu dertranspile()funktion hinzugefügt, das verwendet werden kann, um die benutzerdefinierte Auswahl einer Standardmethode durch ein Backend zu deaktivieren, wenn das Ziel-Backendget_scheduling_stage_plugin()oderget_translation_stage_plugin()definiert hat. -
Hinzufügen eines
labelParameters zumBarrierkonstruktor der Klasse und derbarrier()methode wurde ein Parameter hinzugefügt, der es dem Benutzer ermöglicht, einer Instanz derBarrierrichtlinie zuzuweisen. Für Visualisierungen, die mitcircuit_drawer()oderQuantumCircuit.draw()erzeugt wurden, wird diese Beschriftung am oberen Rand derbarriergedruckt.from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.h(1) circuit.barrier(label="After H") circuit.draw('mpl') -
Neue Tore hinzufügen
CCZGate,CSGate, undCSdgGatezu den Standardgattern in der Schaltkreisbibliothek (qiskit.circuit.library). -
Hinzugefügt
qiskit.algorithms.eigensolverspaket zur Aufnahme von Schnittstellen für primitiv-aktivierte Algorithmen. Dieses neue Modul wird schließlich das bisherigeqiskit.algorithms.eigen_solversersetzen. Dieses neue Modul enthält eine alternative Implementierung desVQDdie statt eines Backends oderQuantumInstancestattdessen eine Instanz vonBaseEstimator, einschließlichEstimator,BackendEstimator, oder beliebige Provider-Implementierungen wie die inqiskit-ibm-runtimeundqiskit-aer.Um zum Beispiel die neue Implementierung mit einer Instanz von
Estimatorklasse:from qiskit.algorithms.eigensolvers import VQD from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler, Estimator from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp h2_op = PauliSumOp(SparsePauliOp( ["II", "IZ", "ZI", "ZZ", "XX"], coeffs=[ -1.052373245772859, 0.39793742484318045, -0.39793742484318045, -0.01128010425623538, 0.18093119978423156, ], )) estimator = Estimator() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() fidelity = ComputeUncompute(Sampler()) vqd = VQD(estimator, fidelity, ansatz, optimizer, k=2) result = vqd.compute_eigenvalues(h2_op) eigenvalues = result.eigenvaluesMan beachte, dass die ausgewerteten Hilfsoperatoren jetzt über das
aux_operators_evaluated-Feld der Ergebnisse erhalten werden. Diese besteht aus einer Liste oder einem Diktat von Tupeln, die die Erwartungswerte für diese Operatoren sowie die Metadaten des primitiven Laufs enthalten.aux_operator_eigenvaluesist nicht länger ein gültiges Feld. -
Neue Algorithmen zur Berechnung von Zustandstreue/Überlappung für Paare von Quantenschaltungen (die parametrisiert werden können). Neben der Basisklasse (
BaseStateFidelity), die die Schnittstelle definiert, gibt es eine Implementierung der Methode compute-uncompute, die Instanzen derBaseSamplerprimitivs nutzt:qiskit.algorithms.state_fidelities.ComputeUncompute.Zum Beispiel:
import numpy as np from qiskit.primitives import Sampler from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.circuit.library import RealAmplitudes sampler = Sampler(...) fidelity = ComputeUncompute(sampler) circuit = RealAmplitudes(2) values = np.random.random(circuit.num_parameters) shift = np.ones_like(values) * 0.01 job = fidelity.run([circuit], [circuit], [values], [values+shift]) fidelities = job.result().fidelities -
Ein neues Modul hinzugefügt
qiskit.algorithms.gradientshinzugefügt, das Klassen enthält, die zur Berechnung von Gradienten unter Verwendung der primitiven Schnittstellen, die inqiskit.primitives. Es gibt 4 Arten von Gradientenklassen: Finite Difference, Parameter Shift, Linear Combination of Unitary, und SPSA mit Implementierungen, die entweder eine Instanz desBaseEstimatorschnittstelle verwenden:oder eine Instanz der
BaseSamplerschnittstelle:Die schätzerbasierten Gradienten berechnen den Gradienten der Erwartungswerte, während die samplerbasierten Gradienten die Gradienten der Messergebnisse (auch als "Wahrscheinlichkeitsgradienten" bezeichnet) liefern.
Zum Beispiel:
estimator = Estimator(...) gradient = ParamShiftEstimatorGradient(estimator) job = gradient.run(circuits, observables, parameters) gradients = job.result().gradients -
Die Klasse
Groverklasse hat ein neues Schlüsselwortargument,sampler, das verwendet wird, um den Algorithmus mit einer Instanz derBaseSamplerschnittstelle, um die Ergebnisse zu berechnen. Dieses neue Argument ersetzt das Argumentquantum_instanceund dementsprechend istquantum_instanceveraltet und wird in zukünftigen Versionen veraltet sein und entfernt werden.Beispiel:
from qiskit import QuantumCircuit from qiskit.primitives import Sampler from qiskit.algorithms import Grover, AmplificationProblem sampler = Sampler() oracle = QuantumCircuit(2) oracle.cz(0, 1) problem = AmplificationProblem(oracle, is_good_state=["11"]) grover = Grover(sampler=sampler) result = grover.amplify(problem) -
Eine neue Option,
"formatter.control.fill_waveform", wurde zu den Stilvorlagen für die Impulsschublade (pulse_v2.draw()undSchedule.draw()) Stilvorlagen hinzugefügt. Diese Option kann verwendet werden, um die Gesichtsfarbe von Impulsen in der Ausgabevisualisierung zu entfernen, was es ermöglicht, Impulse nur mit Linien zu zeichnen.Zum Beispiel:
from qiskit.visualization.pulse_v2 import IQXStandard my_style = IQXStandard( **{"formatter.control.fill_waveform": False, "formatter.line_width.fill_waveform": 2} ) my_sched.draw(style=my_style) -
Ein neuer Transpiler-Pass wurde hinzugefügt,
ResetAfterMeasureSimplification, der verwendet wird, um eineResetoperation nach einerMeasuredurch eine bedingteXGate. Dieser Pass kann in Backends verwendet werden, in denen eineResetoperation durchgeführt wird, indem man eine Messung und dann ein bedingtes X-Gate durchführt, so dass dies die doppelte impliziteMeasurevon derResetoperation entfernt. Zum Beispiel:from qiskit import QuantumCircuit from qiskit.transpiler.passes import ResetAfterMeasureSimplification qc = QuantumCircuit(1) qc.measure_all() qc.reset(0) qc.draw('mpl')result = ResetAfterMeasureSimplification()(qc) result.draw('mpl') -
Es wurde ein neuer unterstützter Wert
"reverse_linear"für dasentanglementSchlüsselwortargument zum Konstruktor für dieNLocalschaltkreis-Klasse. FürTwoLocalschaltungen (die eine Unterklasse vonNLocal), wennentanglement_blocks="cx", dann liefert die Verwendung vonentanglement="reverse_linear"eine äquivalente n-Qubit-Schaltung wieentanglement="full", aber mit nurCXGategattern anstelle von . -
ScheduleBlockwurde so aktualisiert, dass es nicht zugewiesene Unterprogramme verwalten kann, d.h., dass es den "faulen" Aufruf anderer Programme ermöglicht. Dies ermöglicht zum Beispiel den folgenden Arbeitsablauf:from qiskit import pulse with pulse.build() as prog: pulse.reference("x", "q0") with pulse.build() as xq0: pulse.play(Gaussian(160, 0.1, 40), pulse.DriveChannel(0)) prog.assign_references({("x", "q0"): xq0})Nun kann ein Benutzer
progerstellen, ohne die tatsächliche Implementierung der Referenz("x", "q0")zu kennen, und sie zu einem späteren Zeitpunkt zur Ausführung zuweisen. Dies verbessert die Modularität von Impulsprogrammen, und so kann man leicht ein Musterimpulsprogramm schreiben, das auf anderen Kalibrierungen beruht.Um diese Funktion zu realisieren, wurde die neue Impulsanweisung (Compilerdirektive)
Referencehinzugefügt worden. Diese Anweisung wird in den aktuellen Builder-Bereich injiziert, wenn derreference()befehl verwendet wird. Mit der Eigenschaftreferenceskönnen alle im aktuellen Pulsprogramm definierten Referenzen aufgelistet werden.Außerdem wird jede Referenz mit einem Bereich verwaltet, um die Parameterverwaltung zu erleichtern.
scoped_parameters()undsearch_parameters()sind hinzugefügt worden zuScheduleBlock. Weitere Einzelheiten finden Sie in der API-Dokumentation. -
Hinzufügen einer neuen Methode
SparsePauliOp.argsort()hinzugefügt, die die Zusammensetzung von Permutationen in der Reihenfolge der Sortierung nach Koeffizienten und der Sortierung nach Pauli zurückgibt. Mit dem Schlüsselwortargumentweightfür die Methode kann die Ausgabe zusätzlich nach der Anzahl der nicht-identischen Terme im Pauli sortiert werden, wobei die Menge aller Paulis eines bestimmten Gewichts weiterhin lexikografisch geordnet wird. -
Hinzufügen einer neuen Methode
SparsePauliOp.sort()hinzugefügt, die zuerst die Koeffizienten mit Hilfe von numpy'sargsort()und dann nach Pauli sortiert, wobei die Pauli-Sortierung Vorrang hat. Wenn die Pauli-Sortierung dieselbe ist, wird sie nach Koeffizienten sortiert. Mit dem Schlüsselwortargumentweightkann die Ausgabe zusätzlich nach der Anzahl der nicht-identischen Begriffe im Pauli sortiert werden, wobei die Menge aller Paulis eines bestimmten Gewichts weiterhin lexikographisch geordnet wird. -
Ein neues Schlüsselwortargument,
wire_order, wurde zu dercircuit_drawer()funktion undQuantumCircuit.draw()methode hinzugefügt, die es erlaubt, sowohl die Quanten- als auch die klassischen Bits in der Ausgabevisualisierung beliebig umzuordnen. Zum Beispiel:from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(4, "q") cr = ClassicalRegister(4, "c") cr2 = ClassicalRegister(2, "ca") circuit = QuantumCircuit(qr, cr, cr2) circuit.h(0) circuit.h(3) circuit.x(1) circuit.x(3).c_if(cr, 10) circuit.draw('mpl', cregbundle=False, wire_order=[2, 1, 3, 0, 6, 8, 9, 5, 4, 7]) -
Zusätzliche Unterstützung für die
CSGate,CSdgGateundCCZGateklassen zum Konstruktor für die OperatorklasseCNOTDihedral. Die Eingangsschaltungen beim Erstellen einesCNOTDihedraloperator werden nun Schaltungen unterstützt, die diese Gatter verwenden. Zum Beispiel:from qiskit import QuantumCircuit from qiskit.quantum_info import CNOTDihedral qc = QuantumCircuit(2) qc.t(0) qc.cs(0, 1) qc.tdg(0) operator = CNOTDihedral(qc) -
Die Algorithmusklassen für die Amplitudenschätzung:
Haben jetzt ein neues Schlüsselwortargument,
sampler, für ihren Konstruktor, der eine Instanz eines Objekts annimmt, das dieBaseSamplerschnittstelle einschließlichBackendSampler,Sampler, oder beliebige Provider-Implementierungen, wie die in qiskit-ibm-runtime und qiskit-aer vorhandenen. Dies bietet eine Alternative zur Verwendung des Argumentsquantum_instance, um das Ziel zu setzenBackendoderQuantumInstancefür die Ausführung des Algorithmus. Die Verwendung von aQuantumInstanceist noch nicht veraltet und wird in einer zukünftigen Version veraltet sein. -
Eine neue Klasse wurde hinzugefügt,
BackendV2Converterhinzugefügt, die verwendet wird, um eineBackendV1instanz in eineBackendV2schnittstelle. Sie ermöglicht es Ihnen, eineBackendV2instanz von jedemBackendV1. Dies ermöglicht die Standardisierung von Zugriffsmustern auf die neuereBackendV2schnittstelle zu standardisieren, auch wenn Sie nochBackendV1. -
Eine neue Funktion hinzugefügt
convert_to_target()die verwendet wird, um eineBackendConfigurationund optional aBackendPropertiesundPulseDefaultsnimmt und einTargetobjekt erzeugt, das dem Inhalt dieser Objekte entspricht. -
qiskit.quantum_info.BaseOperatorunterklassen (wie z.BScalarOp,SparsePauliOpundPauliList) können jetzt mit der eingebauten Funktion Pythonsum()verwendet werden. -
Ein neuer Transpiler-Pass,
ConvertConditionsToIfOpswurde hinzugefügt, der verwendet werden kann, um altmodischeInstruction.c_if()-konditionierte Anweisungen inIfElseOpobjekte umwandelt. Dies soll den Übergang vom alten Typ zum neuen Typ für Backends erleichtern. Für die meisten Benutzer besteht keine Notwendigkeit, diese Funktion zu ihren Pass-Managern hinzuzufügen, und sie ist auch nicht in den voreingestellten Pass-Managern enthalten. -
Umstrukturierung der Kommutativitätsanalyse von Gattern in eine Klasse
CommutationChecker. Mit dieser Klasse können Sie (auf der Grundlage der Matrixmultiplikation) prüfen, ob zwei Gatter kommutieren oder nicht kommutieren, und die Ergebnisse zwischenspeichern (so dass eine ähnliche Prüfung in Zukunft keine Matrixmultiplikation mehr erfordert).Zum Beispiel können wir jetzt tun:
from qiskit.circuit import QuantumRegister, CommutationChecker comm_checker = CommutationChecker() qr = QuantumRegister(4) res = comm_checker.commute(CXGate(), [qr[1], qr[0]], [], CXGate(), [qr[1], qr[2]], [])Da sich die beiden CX-Gatter umkehren (das erste CX-Gatter ist über die Qubits
qr[1]undqr[0], und das zweite CX-Gatter ist über die Qubitsqr[1]undqr[2]), haben wir, dassresTrueist.Diese Kommutativitätsprüfung ist bei bedingten und parametrisierten Gattern zu konservativ und kann
Falsezurückgeben, selbst wenn solche Gatter kommutieren. -
Hinzufügen eines neuen Transpiler-Passes
CommutativeInverseCancellationhinzugefügt, der Paare von inversen Gattern unter Ausnutzung von Kommutationsbeziehungen zwischen Gattern aufhebt. Dieser Durchgang ist eine Verallgemeinerung des Transpiler-DurchgangsInverseCancellationda er eine größere Menge von inversen Gattern erkennt und die Kommutativität berücksichtigt. Der Durchgang vermeidet auch einige Probleme im Zusammenhang mit dem Transpiler-DurchgangCommutativeCancellation.Zum Beispiel:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager from qiskit.transpiler.passes import CommutativeInverseCancellation circuit = QuantumCircuit(2) circuit.z(0) circuit.x(1) circuit.cx(0, 1) circuit.z(0) circuit.x(1) passmanager = PassManager(CommutativeInverseCancellation()) new_circuit = passmanager.run(circuit)hebt das Paar der selbstinversen Z-Tore und das Paar der selbstinversen X-Tore auf (da die betreffenden Tore mit dem CX-Tor pendeln), so dass eine Schaltung entsteht, die aus einem einzigen CX-Tor besteht.
Die umgekehrte Prüfung ist bei bedingten und parametrisierten Gattern zu konservativ und kann einige dieser Gatter nicht aufheben.
-
QuantumCircuit.compose()akzeptiert nun einen Operanden mit klassischen Bits, wenn die Basisschaltung selbst keine hat. Das Muster, einen Schaltkreis mit Messungen zu einem reinen Quantenschaltkreis zusammenzusetzen, ist nun gültig. Zum Beispiel:from qiskit import QuantumCircuit base = QuantumCircuit(3) terminus = QuantumCircuit(3, 3) terminus.measure_all() # This will now succeed, though it was previously a CircuitError. base.compose(terminus) -
Die
DAGCircuitmethodendepth()undsize()haben ein neues Schlüsselwortargumentrecursezur Verwendung mit Schaltkreisen, die Kontrollflussoperationen enthalten (wie z. BIfElseOp,WhileLoopOp, undForLoopOp). Standardmäßig ist diesFalseund löst einen Fehler aus, wenn Kontrollflussoperationen vorhanden sind, um schlecht definierte Ergebnisse zu vermeiden. Bei der EinstellungTruewird ein Proxy-Wert zurückgegeben, der versucht, jeden Kontrollflussblock im Verhältnis zu seinem Zustand gerecht zu gewichten, auch wenn die Tiefe oder Größe eines konkreten Laufs im Allgemeinen nicht bekannt ist. Wie sich die einzelnen Kontrollflussoperationen auf die Ausgabe auswirken, finden Sie in der Dokumentation der jeweiligen Methode. -
DAGCircuit.count_ops()einrecurse-Schlüsselwortargument für die Rekursion in Kontrollflussblöcke gewonnen. Standardmäßig ist diesTrue, und alle Operationen in allen Blöcken werden zurückgegeben, ebenso wie die Kontrollflussoperationen selbst. -
Hinzufügen eines Arguments
create_preds_and_succszu den Funktionencircuit_to_dagdependency()unddag_to_dagdependency()die vonQuantumCircuitundDAGCircuitjeweils inDAGDependency. Wenn der Wert voncreate_preds_and_succsFalse ist, werden die transitiven Vorgänger und Nachfolger für Knoten inDAGDependencynicht konstruiert, wodurch die Konvertierungen schneller und deutlich weniger speicherintensiv werden. Die direkten Vorgänger und Nachfolger der Knoten inDAGDependencywerden wie üblich konstruiert.Zum Beispiel:
from qiskit.converters import circuit_to_dagdependency from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit circuit_in = QuantumCircuit(2) circuit_in.h(qr[0]) circuit_in.h(qr[1]) dag_dependency = circuit_to_dagdependency(circuit_in, create_preds_and_succs=False) -
Neue Attribute hinzugefügt
Clifford.symplectic_matrix,Clifford.tableau,Clifford.z,Clifford.x,Clifford.phase,Clifford.stab,Clifford.stab_z,Clifford.stab_x,Clifford.stab_phase,Clifford.destab,Clifford.destab_z,Clifford.destab_x,Clifford.destab_phasezurCliffordklasse. Diese können anstelle vonClifford.tableverwendet werden, das in Zukunft veraltet sein wird.StabilizerTableundPauliTablesind veraltet und werden in der nächsten Version veraltet sein und danach entfernt werden. -
Der
Commuting2qGateRouterkonstruktor hat jetzt ein neues Schlüsselwortargument,edge_coloring. Dieses Argument wird verwendet, um eine Kantenfärbung der Kopplungskarte zu erstellen, um die Reihenfolge zu bestimmen, in der die commuting gates angewendet werden. -
Hinzufügen einer neuen Algorithmus-Schnittstelle zur Erstellung von Zeitentwicklungsalgorithmen unter Verwendung der Primitive
BaseSamplerundBaseEstimator. Diese neue Schnittstelle besteht aus:Diese neue Schnittstelle ist eine Alternative zu der bereits bestehenden Schnittstelle für Zeitentwicklungsalgorithmen, die mit
EvolutionProblem,EvolutionResult,RealEvolver, undImaginaryEvolverdie mit einemQuantumInstanceobjekt anstelle von Primitiven arbeitete. Diese neue Schnittstelle ersetzt die frühere Schnittstelle, die veraltet ist und in zukünftigen Versionen entfernt werden wird. -
Neue Backend-Klassen zugefügt
qiskit.providers.fake_provider:Diese neuen Klassen implementieren die
BackendV2schnittstelle und werden unter Verwendung gespeicherter Snapshots der Backend-Informationen aus den Systemen IBM Quantumibm_auckland,ibm_oslo,ibm_genevabzw.ibm_pertherstellt. -
Die Klasse
Z2Symmetriesklasse hat zwei neue Methoden,convert_clifford()undtaper_clifford(). Diese beiden Methoden sind die beiden Operationen, die notwendig sind, um einen Operator auf der Grundlage der Z2 Symmetrien im Objekt zu verjüngen und wurden zuvor intern über dietaper()methode durchgeführt. Diese Methoden sind nun jedoch öffentliche Methoden der Klasse, die bei Bedarf einzeln aufgerufen werden können. -
Die Laufzeitleistung für die Konjugation eines langen
PauliListobjekts durch eineCliffordunter Verwendung derPauliList.evolve()hat sich deutlich verbessert. Er läuft jetzt deutlich schneller als zuvor. -
Hinzufügen einer neuen abstrakten Klasse
ClassicalIOChannelzumqiskit.pulse.channelsmodul hinzugefügt. Diese Klasse wird verwendet, um klassische E/A-Kanäle darzustellen und diese Kanäle von anderen Unterklassen vonChannel. Diese neue Klasse ist die Basisklasse für dieMemorySlot,RegisterSlot, undSnapshotChannelklassen. Dementsprechend ist diepad()kanonisierungsimpulstransformation inqiskit.pulse.transformskeine Verzögerungen bei den Instanzen vonClassicalIOChannel -
Der
SabreSwaptranspilerpass hat ein neues Schlüsselwortargument in seinem Konstruktor,trials. Das Argumenttrialswird verwendet, um die Anzahl der zu versuchenden Zufallsversuche anzugeben. Die Ausgabe des SABRE-Algorithmus kann sich je nach dem für die Zufallszahl verwendeten Seed stark unterscheiden.SabreSwapführt nun den Algorithmus mittrialsAnzahl von Zufallsseeds aus und wählt den besten aus (mit den wenigsten eingefügten Swaps). Wenntrialsnicht angegeben wird, verwendet der Durchlauf standardmäßig die Anzahl der physischen CPUs auf dem lokalen System. -
Der
SabreLayouttranspilerpass hat ein neues Schlüsselwortargument in seinem Konstruktor,swap_trials. Das Argumentswap_trialswird verwendet, um anzugeben, wie viele Zufallsversuche für denSabreSwapintern durchlaufen werden sollen. Sie entspricht demtrialsarugment auf demSabreSwappass. Wenn diese Option gesetzt ist, wird jede Iteration vonSabreSwapinternswap_trialsmal durchlaufen werden. Wennswap_trialsnicht angegeben wird, wird standardmäßig die Anzahl der physischen CPUs auf dem lokalen System verwendet. -
Eine neue Funktion wurde hinzugefügt,
estimate_observables()die eine Implementierung derBaseEstimatorschnittstelle (z.B.Estimator,BackendEstimator, oder beliebige Provider-Implementierungen wie die inqiskit-ibm-runtimeundqiskit-aer) verwendet, um die Erwartungswerte, ihre Mittelwerte und Standardabweichungen aus einer Liste oder einem Wörterbuch von Beobachtungswerten zu berechnen. Dies dient einem ähnlichen Zweck wie die bereits vorhandene Funktioneval_observables()die die Berechnung mit einemQuantumInstanceobjekts durchführte und die durch diese neue Funktion ersetzt wurde (und in zukünftigen Versionen veraltet sein und entfernt werden wird). -
Hinzufügen einer neuen
Operationbasisklasse hinzugefügt, die eine leichtgewichtige abstrakte Schnittstelle für Objekte bietet, die aufQuantumCircuit. Dies ermöglicht es, "übergeordnete" Objekte direkt auf einer Schaltung zu speichern (z.B.,Cliffordobjekte), solche Objekte direkt zu kombinieren (z. B. mehrere aufeinanderfolgendeCliffordobjekte über dieselben Qubits zusammenzusetzen) und solche Objekte zur Laufzeit zu synthetisieren (z.B. umCliffordin einer Weise zu synthetisieren, die die Tiefe optimiert und/oder die Konnektivität der Geräte ausnutzt). Zuvor konnten nur Unterklassen vonqiskit.circuit.InstructionaufQuantumCircuitzugeordnet werden, aber diese Schnittstelle ist unhandlich geworden und enthält zu viele Methoden und Attribute für Allzweckobjekte.Die neue
Operationschnittstelle umfasstname,num_qubitsundnum_clbits(in Zukunft kann dies leicht angepasst werden), aber vor allem umfasst sie nichtdefinition(und bindet somit die Synthese nicht an das Objekt), sie umfasst nichtcondition(dies sollte Teil eines separaten klassischen Kontrollflusses sein) und sie umfasst nichtdurationundunit(da dies Eigenschaften der Ausgabe des Transpilers sind).Ab sofort,
OperationumfasstGate,Reset,Barrier,Measureund "höherwertige" Objekte wieClifford. Diese Liste der "übergeordneten" Objekte wird in Zukunft noch erweitert werden. -
A
Cliffordwird nun zu einer Quantenschaltung alsOperationhinzugefügt, ohne zuvor eine Teilschaltung zu synthetisieren, die diese Clifford-Schaltung implementiert. Die eigentliche Synthese wird auf einen späterenHighLevelSynthesistranspilierungsdurchgang verschoben.Zum Beispiel der folgende Code:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford qc = QuantumCircuit(3) cliff = random_clifford(2) qc.append(cliff, [0, 1])konvertiert
cliffnicht mehr inqiskit.circuit.Instructionum, was die Synthese des Clifford in eine Schaltung einschließt, wenn sie anqcangehängt wird. -
Ein neuer Transpiler-Pass wurde hinzugefügt
OptimizeCliffordsder Blöcke von aufeinanderfolgendenCliffordobjekten in einer Schaltung sammelt und jeden Block durch einen einzelnenClifford.Zum Beispiel der folgende Code:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford from qiskit.transpiler.passes import OptimizeCliffords from qiskit.transpiler import PassManager qc = QuantumCircuit(3) cliff1 = random_clifford(2) cliff2 = random_clifford(2) qc.append(cliff1, [2, 1]) qc.append(cliff2, [2, 1]) qc_optimized = PassManager(OptimizeCliffords()).run(qc)speichert zunächst die beiden Cliffords
cliff1undcliff2aufqcals "übergeordnete" Objekte, und dann optimiert der Transpiler-PassOptimizeCliffordsoptimiert die Schaltung, indem er diese beiden Cliffords zu einem einzigen Clifford zusammensetzt. Beachten Sie, dass die resultierende Clifford-Datei immer noch aufqcals übergeordnetes Objekt gespeichert wird. Dieser Pass ist noch nicht in einem der voreingestellten Passmanager enthalten. -
Hinzufügen eines neuen Transpiler-Passes
HighLevelSynthesisder Objekte auf höherer Ebene synthetisiert (zum Beispiel,Cliffordobjekte).Zum Beispiel der folgende Code:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford from qiskit.transpiler import PassManager from qiskit.transpiler.passes import HighLevelSynthesis qc = QuantumCircuit(3) qc.h(0) cliff = random_clifford(2) qc.append(cliff, [0, 1]) qc_synthesized = PassManager(HighLevelSynthesis()).run(qc)synthetisiert den in
qcgespeicherten Clifford-Satz höherer Ebene unter Verwendung der Standardfunktiondecompose_clifford().Dieser neue Transpiler-Pass
HighLevelSynthesisist in die voreingestellten Passmanager integriert und läuft direkt nachUnitarySynthesispass. Daher,transpile()alle in der Schaltung vorhandenen Cliffords höherer Ebene synthetisieren.Es ist wichtig zu beachten, dass die Arbeit, die für die Speicherung von
Cliffordobjekte als "higher-level" Objekte zu speichern und diese Objekte mitHighLevelSynthesispass völlig transparent sein sollte und keine Codeänderungen erforderlich sind. -
SparsePauliOps können nun mit Koeffizientenarrays konstruiert werden, die allgemeine Python Objekte sind. Dies ist für die Verwendung mitParameterExpressionobjekten gedacht; andere Objekte können funktionieren, haben aber keine erstklassige Unterstützung. EinigeSparsePauliOpmethoden (wie z.B. die Konvertierung in andere Klassendarstellungen) funktionieren bei der Verwendung vonobjectArrays möglicherweise nicht, wenn das gewünschte Ziel diese allgemeinen Arrays nicht darstellen kann.Zum Beispiel, ein
ParameterExpressionSparsePauliOpkönnte konstruiert werden durch:import numpy as np from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp print(SparsePauliOp(["II", "XZ"], np.array([Parameter("a"), Parameter("b")])))das ergibt
SparsePauliOp(['II', 'XZ'], coeffs=[ParameterExpression(1.0*a), ParameterExpression(1.0*b)]) -
Eine neue Funktion wurde hinzugefügt
plot_distribution()zum Plotten von Verteilungen über Quasi-Wahrscheinlichkeiten hinzugefügt. Diese ist geeignet fürCounts,QuasiDistributionundProbDistribution. Rohdiktat kann auch weitergegeben werden. Zum Beispiel:from qiskit.visualization import plot_distribution quasi_dist = {'0': .98, '1': -.01} plot_distribution(quasi_dist) -
Es wurde eine neue High-Level-Synthese-Plugin-Schnittstelle eingeführt, die es ermöglicht, alternative Synthesetechniken, die in externen Paketen enthalten sind, nahtlos mit dem
HighLevelSynthesistranspiler-Durchlauf. Diese alternativen Synthesetechniken können für beliebige "übergeordnete" Objekte vom TypOperationspezifiziert werden, wie zum Beispiel fürCliffordundLinearFunctionobjekte. Diese Plugin-Schnittstelle ähnelt derjenigen für die unitäre Synthese. Im letzteren Fall finden Sie die Einzelheiten zum Schreiben eines neuen Plugins in derqiskit.transpiler.passes.synthesis.pluginmodul-Dokumentation. -
Einführung einer neuen Klasse
HLSConfig, die verwendet werden kann, um alternative Synthesealgorithmen für "übergeordnete" Objekte vom TypOperation. Für jedes übergeordnete Objekt von Interesse gibt ein ObjektHLSConfigeine Liste von Synthesemethoden und deren Argumente an. Dieses Objekt kann anHighLevelSynthesistranspiler pass übergeben oder als Parameter angegeben werdenhls_configintranspile().Nehmen wir als Beispiel an, dass
op_aundop_bdie Namen von zwei übergeordneten Objekten sind, dassop_a-Objekte zwei Synthesemethodendefaulthaben, die keine zusätzlichen Parameter erfordern, undothermit zwei optionalen ganzzahligen Parameternoption_1undoption_2, dassop_b-Objekte eine einzige Synthesemethodedefaulthaben undqcein Quantenschaltkreis ist, derop_aundop_bObjekte enthält. Der folgende Codeschnipsel:hls_config = HLSConfig(op_b=[("other", {"option_1": 7, "option_2": 4})]) pm = PassManager([HighLevelSynthesis(hls_config=hls_config)]) transpiled_qc = pm.run(qc)zeigt, wie die alternative Synthesemethode
otherfürop_b-Objekte ausgeführt wird, während für alle anderen High-Level-Objekte, einschließlichop_a-Objekte, die Methodendefaultverwendet werden. -
Neue Methoden zur Ausführung von Primitiven hinzugefügt:
BaseSampler.run()undBaseEstimator.run(). Diese Methoden werden asynchron ausgeführt und gebenJobV1objekte zurück, die ein Handle für die Ausnahmen bereitstellen. Diese neuen Laufmethoden können übergeben werdenQuantumCircuitobjekte (und Observables fürBaseEstimator) übergeben werden, die nicht im Konstruktor registriert sind. Zum Beispiel:estimator = Estimator() result = estimator.run(circuits, observables, parameter_values).result()Dies bietet eine Alternative zum früheren Ausführungsmodell (das jetzt veraltet ist) für die
BaseSamplerundBaseEstimatorprimitive, die alle Eingaben über den Konstruktor entgegennehmen und das primitive Objekt mit der Kombination dieser Eingabeparameter aufrufen, die bei der Ausführung verwendet werden soll. -
Option
shotsfür Referenzimplementierungen von Primitiven hinzugefügt. Zufallszahlen können durch die Angabeseed_primitivefestgelegt werden. Zum Beispiel:from qiskit.primitives import Sampler from qiskit import QuantumCircuit bell = QuantumCircuit(2) bell.h(0) bell.cx(0, 1) bell.measure_all() with Sampler(circuits=[bell]) as sampler: result = sampler(circuits=[0], shots=1024, seed_primitive=15) print([q.binary_probabilities() for q in result.quasi_dists]) -
Die Konstruktoren für die
BaseSamplerundBaseEstimatorhaben ein neues optionales Schlüsselwortargument,options, das verwendet wird, um die Standardwerte für die Optionen festzulegen, die über dasoptionsattribut. -
Hinzufügen der
PVQDklasse zu dem Zeitentwicklungs-Framework inqiskit.algorithms. Diese Klasse implementiert den projizierten Variational Quantum Dynamics (p-VQD) Algorithmus von Barison et al.In jedem Zeitschritt berechnet dieser Algorithmus den nächsten Zustand mit einer Trotter-Formel und projiziert ihn auf eine Variationsform. Die Projektion wird durch die Maximierung der Genauigkeit des von Trotter entwickelten Zustands und des Ansatzes unter Verwendung einer klassischen Optimierungsroutine bestimmt.
import numpy as np from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.algorithms.evolvers import EvolutionProblem from qiskit.algorithms.time_evolvers.pvqd import PVQD from qiskit.primitives import Estimator, Sampler from qiskit import BasicAer from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import Pauli, SparsePauliOp from qiskit.algorithms.optimizers import L_BFGS_B sampler = Sampler() fidelity = ComputeUncompute(sampler) estimator = Estimator() hamiltonian = 0.1 * SparsePauliOp([Pauli("ZZ"), Pauli("IX"), Pauli("XI")]) observable = Pauli("ZZ") ansatz = EfficientSU2(2, reps=1) initial_parameters = np.zeros(ansatz.num_parameters) time = 1 optimizer = L_BFGS_B() # setup the algorithm pvqd = PVQD( fidelity, ansatz, initial_parameters, estimator, num_timesteps=100, optimizer=optimizer, ) # specify the evolution problem problem = EvolutionProblem( hamiltonian, time, aux_operators=[hamiltonian, observable] ) # and evolve! result = pvqd.evolve(problem) -
Die Methode
QNSPSA.get_fidelity()statische Methode unterstützt nun ein optionalessamplerArgument, das verwendet wird, um eine Implementierung derBaseSamplerschnittstelle (z.BSampler,BackendSampler, oder beliebige Provider-Implementierungen wie die inqiskit-ibm-runtimeundqiskit-aer) zur Berechnung der Treue einesQuantumCircuit. Zum Beispiel:from qiskit.primitives import Sampler from qiskit.algorithms.optimizers import QNSPSA fidelity = QNSPSA.get_fidelity(my_circuit, Sampler()) -
Ein neues Schlüsselwortargument
samplerwurde zu den Konstruktoren der Phasenschätzungsklassen hinzugefügt:Dieses Argument wird verwendet, um eine Implementierung der
BaseSamplerschnittstelle wieSampler,BackendSampleroder beliebige Provider-Implementierungen, wie sie inqiskit-ibm-runtimeundqiskit-aerzu finden sind.Zum Beispiel:
from qiskit.primitives import Sampler from qiskit.algorithms.phase_estimators import HamiltonianPhaseEstimation from qiskit.synthesis import MatrixExponential from qiskit.quantum_info import SparsePauliOp from qiskit.opflow import PauliSumOp sampler = Sampler() num_evaluation_qubits = 6 phase_est = HamiltonianPhaseEstimation( num_evaluation_qubits=num_evaluation_qubits, sampler=sampler ) hamiltonian = PauliSumOp(SparsePauliOp.from_list([("X", 0.5), ("Y", 0.6), ("I", 0.7)])) result = phase_est.estimate( hamiltonian=hamiltonian, state_preparation=None, evolution=MatrixExponential(), bound=1.05, ) -
Der
SabreSwaptranspiler-Pass hat die Laufzeitleistung durch eine Neuformulierung des Algorithmus in Rust erheblich verbessert. -
Symbolische Impuls-Unterklassen
Gaussian,GaussianSquare,DragundConstantwurden dahingehend aktualisiert, dass sieSymbolicPulseund nicht die Unterklasse selbst instanziieren. Alle parametrischen Impulsobjekte in Impulsprogrammen müssen symbolische Impulsinstanzen sein, da eine Unterklassifizierung nicht mehr erforderlich ist. Beachten Sie, dassSymbolicPulseeinen bestimmten Umschlag mit dem inSymbolicPulse.envelopedefinierten symbolischen Ausdrucksobjekt eindeutig identifizieren kann. -
Eine neue Funktion wurde hinzugefügt,
sampled_expectation_value(), die die Berechnung von Erwartungswerten für Diagonaloperatoren aus Verteilungen wieCountsundQuasiDistribution. Gültige Operatoren für die Verwendung mit dieser Funktion sind:str,Pauli,PauliOp,PauliSumOp, undSparsePauliOp. -
A
SamplingVQEklasse wird eingeführt, die für diagonale Hamiltonianer optimiert ist und einsamplerPrimitiv nutzt. AQAOAklasse hinzugefügt, die die UnterklasseSamplingVQEist.Um die neue
SamplingVQEmit einem Referenzprimitiv zu verwenden, kann man z.B. Folgendes tun:from qiskit.algorithms.minimum_eigensolvers import SamplingVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12])) sampler = Sampler() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() sampling_vqe = SamplingVQE(sampler, ansatz, optimizer) result = sampling_vqe.compute_minimum_eigenvalue(operator) eigenvalue = result.eigenvalueMan beachte, dass die ausgewerteten Hilfsoperatoren jetzt über das
aux_operators_evaluated-Feld der Ergebnisse erhalten werden. Diese besteht aus einer Liste oder einem Diktat von Tupeln, die die Erwartungswerte für diese Operatoren sowie die Metadaten des primitiven Laufs enthalten.aux_operator_eigenvaluesist nicht länger ein gültiges Feld. -
Ein neues
atolSchlüsselwortargument wurde derSparsePauliOp.equiv()methode hinzugefügt, um die Toleranz der Äquivalenzprüfung anzupassen, -
Es wurde eine neue Plugin-Schnittstelle für Transpiler-Stufen eingeführt, die dazu dient, alternative
PassManagerobjekte aus einem externen Paket in einer bestimmten Stufe als Teil vontranspile()oder derStagedPassManagerausgabe vongenerate_preset_pass_manager(),level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager(), undlevel_3_pass_manager(). Benutzer können ein Plugin für eine Transpiler-Stufe mit den Schlüsselwortargumenteninit_method,layout_method,routing_method,translation_method,optimization_method, undscheduling_methodauftranspile()undgenerate_preset_pass_manager(). Eine vollständige Liste der derzeit installierten Plugin-Namen finden Sie mit derlist_stage_plugins()funktion. Für die Erstellung von Plugins lesen Sie bitte dieqiskit.transpiler.preset_passmanagers.pluginmodul-Dokumentation, die einen Leitfaden für die Erstellung von Bühnen-Plugins enthält. -
Das Programm
transpile()hat zwei neue Schlüsselwortargumente,init_methodundoptimization_method, die zur Angabe alternativer Plugins für die Stufeninitbzw.optimizationverwendet werden. -
Die Klasse
PassManagerConfigklasse hat 2 neue Attribute,init_methodundoptimization_method, zusammen mit passenden Schlüsselwortargumenten für die Konstruktormethoden. Diese stellen die vom Benutzer angegebeneninitundoptimizationPlugins dar, die für die Kompilierung verwendet werden sollen. -
Die
SteppableOptimizerklasse wird hinzugefügt. Sie ermöglicht es, klassische Optimierungen Schritt für Schritt mit derstep()methode. Diese Optimierer implementieren die "ask and tell"-Schnittstelle, die es (optional) ermöglicht, die erforderlichen Funktions- oder Gradientenauswertungen manuell zu berechnen und in den Optimierer zurückzuspeisen. Weitere Informationen über diese Schnittstelle finden Sie unter: ask and tell interface. Ein sehr einfacher Anwendungsfall, bei dem der Benutzer die Optimierung Schritt für Schritt durchführen möchte, ist das Auslesen:import random import numpy as np from qiskit.algorithms.optimizers import GradientDescent def objective(x): return (np.linalg.norm(x) - 1) ** 2 def grad(x): return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) initial_point = np.random.normal(0, 1, size=(100,)) optimizer = GradientDescent(maxiter=20) optimizer.start(x0=initial_point, fun=objective, jac=grad) for _ in range(maxiter): state = optimizer.state # Here you can manually read out anything from the optimizer state. optimizer.step() result = optimizer.create_result()Ein komplexerer Fall wäre die Fehlerbehandlung. Stellen Sie sich vor, dass die Funktion, die Sie auswerten, eine zufällige Fehlerwahrscheinlichkeit hat. In diesem Fall können Sie den Fehler abfangen und die Funktion erneut ausführen, bis sie das gewünschte Ergebnis liefert, bevor Sie den Optimierungsprozess fortsetzen. In diesem Fall würde man die "ask and tell"-Schnittstelle verwenden.
import random import numpy as np from qiskit.algorithms.optimizers import GradientDescent def objective(x): if random.choice([True, False]): return None else: return (np.linalg.norm(x) - 1) ** 2 def grad(x): if random.choice([True, False]): return None else: return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) initial_point = np.random.normal(0, 1, size=(100,)) optimizer = GradientDescent(maxiter=20) optimizer.start(x0=initial_point, fun=objective, jac=grad) while optimizer.continue_condition(): ask_data = optimizer.ask() evaluated_gradient = None while evaluated_gradient is None: evaluated_gradient = grad(ask_data.x_center) optimizer.state.njev += 1 optmizer.state.nit += 1 cf = TellData(eval_jac=evaluated_gradient) optimizer.tell(ask_data=ask_data, tell_data=tell_data) result = optimizer.create_result()Übergang von
GradientDescentzu einer Unterklasse vonSteppableOptimizer. -
Die Methode
subset_fitterwird der KlasseTensoredMeasFitterklasse hinzugefügt. Die Implementierung ist auf Entschärfungsmuster beschränkt, bei denen jedes Qubit einzeln entschärft wird, z.B.[[0], [1], [2]]. Dies ist jedoch der am häufigsten verwendete Fall. Es ermöglicht dieTensoredMeasFitterin Fällen verwendet werden, in denen die numerische Reihenfolge der physikalischen Qubits nicht mit dem Index des klassischen Bits übereinstimmt. -
Kontrollflussoperationen werden nun durch den Transpiler auf den Optimierungsstufen 0 und 1 unterstützt (z.B. Aufruf von
transpile()odergenerate_preset_pass_manager()mit dem Schlüsselwortargumentoptimization_level=1). Man kann nun eine Schaltung wie folgt konstruierenfrom qiskit import QuantumCircuit qc = QuantumCircuit(2, 1) qc.h(0) qc.measure(0, 0) with qc.if_test((0, True)) as else_: qc.x(1) with else_: qc.y(1)und dies erfolgreich umsetzen, z. B. durch:
from qiskit import transpile from qiskit_aer import AerSimulator backend = AerSimulator(method="statevector") transpiled = transpile(qc, backend)Die verfügbaren Werte für das Schlüsselwortargument
layout_methodsind "trivial" und "dicht". Fürrouting_methodstehen die Optionen "stochastisch" und "keine" zur Verfügung. Die Übersetzung (translation_method) kann mit "translator" oder "unroller" vorgenommen werden. Die Optimierungsebenen 2 und 3 werden noch nicht mit Kontrollfluss unterstützt, ebenso wenig wie das Circuit Scheduling (d.h. die Bereitstellung eines Wertes fürscheduling_method), obwohl wir beabsichtigen, die Unterstützung für diese und die anderen Layout-, Routing- und Übersetzungsmethoden in späteren Versionen von Qiskit Terra zu erweitern.Damit die Transpilierung mit Kontrollflussoperationen mit einem Backend erfolgreich sein kann, muss das Backend die erforderlichen Kontrollflussoperationen in seiner angegebenen Basis haben. Qiskit Aer, zum Beispiel, tut dies. Wenn Sie solche Transpilierungen einfach nur ausprobieren wollen, sollten Sie das Argument
basis_gatesüberschreibentranspile(). -
Die folgenden Transpilerdurchläufe wurden alle unterrichtet, um Kontrollflusskonstrukte in Form von
ControlFlowOpanweisungen in einer Schaltung:Layoutbezogen
ApplyLayoutDenseLayoutEnlargeWithAncillaFullAncillaAllocationSetLayoutTrivialLayoutVF2LayoutVF2PostLayout
Routing-bezogen
Übersetzungsbezogen
BasisTranslatorContainsInstructionGatesInBasisUnitarySynthesisUnroll3qOrMoreUnrollCustomDefinitionsUnroller
Optimierungsbezogen
BarrierBeforeFinalMeasurementsDepthFixedPointSizeOptimize1qGatesDecompositionCXCancellationRemoveResetInZeroState
Diese Pässe werden am häufigsten über die voreingestellten Passmanager verwendet (die intern von
transpile()undgenerate_preset_pass_manager()), aber sie sind auch für andere Zwecke verfügbar. Diese Durchläufe werden nun gegebenenfalls in Kontrollflussoperationen zurückgeführt, wobei die internen Blöcke aktualisiert oder analysiert werden. -
Hinzufügen einer neuen
TrotterQRTEklasse hinzugefügt, die dieRealTimeEvolverschnittstelle implementiert, die eineqiskit.primitives.BaseEstimatorum die Berechnung durchzuführen. Diese neue Klasse ersetzt die bisher verfügbareqiskit.algorithms.TrotterQRTEklasse (die veraltet ist und in zukünftigen Versionen entfernt werden wird), die eineBackendoderQuantumInstancefür die Berechnung verwendete. -
DAGCircuit.substitute_node_with_dag()nimmt jetztpropagate_conditionals Schlüsselwortargument. Die Standardeinstellung istTrue, was das vorherige Verhalten war, und kopiert jede Bedingung des zu ersetzenden Knotens auf jeden Operationsknoten in der Ersetzung. BeiFalsewird die Bedingung nicht kopiert, so dass ein bedingter Knoten durch einen Unter-DAG ersetzt werden kann, der die Bedingung bereits korrekt implementiert. -
DAGCircuit.substitute_node_with_dag()kann jetzt sowohl eine Abbildung für den Parameterwiresals auch eine Sequenz annehmen. Das Mapping sollte Bits in der Ersatz-DAG auf die Bits in der DAG, in die sie eingefügt wird, abbilden. Dies ermöglicht eine einfachere Konstruktion für den Aufrufer, wenn der Eingabeknoten sowohl klassische Bits als auch eine Bedingung hat und die Ersatz-DAG diese in ungeordneter Reihenfolge verwenden kann. -
Hinzufügen des
qiskit.algorithms.minimum_eigensolverspaket, um Schnittstellen für primitiv-aktivierte Algorithmen aufzunehmen.VQEwurde in dieser Implementierung umgestaltet, um Primitive zu nutzen.Um die neue Implementierung mit einem Referenzprimitiv zu verwenden, kann man z. B. Folgendes tun
from qiskit.algorithms.minimum_eigensolvers import VQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp h2_op = SparsePauliOp( ["II", "IZ", "ZI", "ZZ", "XX"], coeffs=[ -1.052373245772859, 0.39793742484318045, -0.39793742484318045, -0.01128010425623538, 0.18093119978423156, ], ) estimator = Estimator() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() vqe = VQE(estimator, ansatz, optimizer) result = vqe.compute_minimum_eigenvalue(h2_op) eigenvalue = result.eigenvalueMan beachte, dass die ausgewerteten Hilfsoperatoren jetzt über das
aux_operators_evaluated-Feld der Ergebnisse erhalten werden. Diese besteht aus einer Liste oder einem Diktat von Tupeln, die die Erwartungswerte für diese Operatoren sowie die Metadaten des primitiven Laufs enthalten.aux_operator_eigenvaluesist nicht länger ein gültiges Feld.
Anmerkungen zu Upgrades
-
Für
Targetobjekten, die nur global definierte 2-Qubit-Operationen ohne jegliche Konnektivitätskonstanten enthalten, wird die Rückgabe derTarget.build_coupling_map()methode nunNonezurück, anstatt einCouplingMapobjekts, dasnum_qubitsKnoten und keine Kanten enthält. Diese Änderung wurde vorgenommen, um die tatsächlichen Konnektivitätseinschränkungen des Systems besser widerzuspiegelnTargetwiderzuspiegeln, denn in diesem Fall gibt es keine Konnektivitätseinschränkungen für das Backend, das durch dieTargetmodelliert wird, und nicht ein Mangel an Konnektivität. Wenn Sie aus irgendeinem Grund das frühere Verhalten wünschen, können Sie es reproduzieren, indem Sie z. B. nach einerNone-Rückgabe suchen und manuell eine Kopplungskarte erstellen:from qiskit.transpiler import Target, CouplingMap from qiskit.circuit.library import CXGate target = Target(num_qubits=3) target.add_instruction(CXGate()) cmap = target.build_coupling_map() if cmap is None: cmap = CouplingMap() for i in range(target.num_qubits): cmap.add_physical_qubit(i) -
Der Standardwert für das Schlüsselwortargument
entanglementim Konstruktor für dieRealAmplitudesundEfficientSU2klassen wurde von"full"auf"reverse_linear"geändert. Diese Änderung wurde vorgenommen, weil die Ausgangsschaltung äquivalent ist, aber nur anstelle von verwendetCXGategatter. Wenn Sie die frühere Standardeinstellung wünschen, können Sie beim Aufruf eines der beiden Konstruktoren explizitentanglement="full"angeben. -
Eine Validierungsprüfung wurde zu
BaseSampler.run(). Es wird ein Fehler ausgegeben, wenn es kein klassisches Bit gibt. -
Das Verhalten der
call()pulse builder Funktion wurde verbessert. Wenn eineScheduleBlockinstanz von dieser Methode aufgerufen wird, erzeugt sie intern eineReferenceim aktuellen Kontext und ordnet das aufgerufene Programm sofort der Referenz zu. Daher wird derCallanweisung nicht mehr erzeugt. Zusammen mit dieser Änderung ist es verboten, verschiedene Blöcke mit demselbennameArgument aufzurufen. Ein solcher Vorgang führt zu einem Fehler. -
Für die meisten Architekturen, beginnend mit der nächsten Version von Qiskit Terra, 0.23, wird das
tweedledumPaket zu einer optionalen Abhängigkeit, statt zu einer Voraussetzung. Dies wird derzeit von einigen klassischen Phasenorakelfunktionen verwendet. Wenn Ihre Anwendung oder Bibliothek diese Funktionalität benötigt, sollten Sie sich vorbereiten, indem Sietweedledumsofort zu den Abhängigkeiten Ihres Pakets hinzufügen.tweedledumist ab sofort in Qiskit Terra 0.22 keine Voraussetzung mehr auf macOS arm64 ( M1 ). Das liegt daran, dass die mitgelieferten Räder für diese Plattform kaputt sind und die Erstellung aus der sdist für die meisten Leute nicht zuverlässig ist. Wenn Sie eine funktionierende Version vontweedledummanuell installieren, werden alle abhängigen Funktionen weiterhin funktionieren. -
Das Attribut
._layoutdes ObjektsQuantumCircuitobjekts wurde von der Speicherung einesLayoutobjekt zu einer Datenklasse mit 2 Attributen,initial_layout, die einLayoutobjekt für das anfängliche Layout, das während der Kompilierung festgelegt wurde, undinput_qubit_mapping, das ein Wörterbuch enthält, das die Qubits den Positionsindizes in der ursprünglichen Schaltung zuordnet. Diese Änderung war notwendig, um alle Informationen bereitzustellen, damit ein nachgeschalteter Schaltkreis in der Lage ist, die durch die ursprüngliche Anordnung verursachte Permutation in allen Situationen vollständig umzukehren. Dieses Attribut ist zwar privat und sollte nicht extern verwendet werden, aber es ist die einzige Möglichkeit, das ursprüngliche Layout durchtranspile()zu verfolgen, daher wird die Änderung dokumentiert, falls Sie sich darauf verlassen. Wenn Sie einen Anwendungsfall für das Attribut_layouthaben, der von der Qiskit-API nicht abgedeckt wird, öffnen Sie bitte ein Problem, damit wir diese Funktionslücke schließen können. -
Die Konstruktoren für die
SetPhase,ShiftPhase,SetFrequency, undShiftFrequencyklassen lösen nun einePulseErrorwenn der über das Argumentchannelübergebene Wert keine Instanz vonPulseChannelist. Diese Änderung wurde vorgenommen, um sicherzustellen, dass die Eingaben in die Konstruktoren gültig sind, da die Anweisungen nur für Impulskanäle und nicht für andere Arten von Kanälen gültig sind. -
Die Funktion
plot_histogram()funktion wurde so geändert, dass sie ein tatsächliches Histogramm mit diskreten, gebündelten Werten zurückgibt. Das bisherige Verhalten der Funktion bestand darin, trotz des Namens tatsächlich eine Visualisierung der Verteilung der Eingaben zu erzeugen. Aufgrund dieser Diskrepanz zwischen dem Namen der Funktion und dem Verhalten wurde das Verhalten der Funktion geändert, so dass sie jetzt tatsächlich ein richtiges Histogramm diskreter Daten erzeugt. Wenn Sie das bisherige Verhalten der Darstellung einer Wahrscheinlichkeitsverteilung der Zähldaten beibehalten möchten, können Sie die Funktionplot_distribution()verwenden, um ein entsprechendes Diagramm zu erstellen. Zum Beispiel kann das frühere Verhalten vonplot_histogram({'00': 512, '11': 500})mit wiederhergestellt werden:from qiskit.visualization import plot_distribution import matplotlib.pyplot as plt ax = plt.subplot() plot_distribution({'00': 512, '11': 500}, ax=ax) ax.set_ylabel('Probabilities') -
Die Kontexte
qiskit.pulse.builderinlineundpadwurden entfernt. Diese wurden erstmals in Terra 0.18.0 (Juli 2021) veraltet. Es gibt keinen Ersatz fürinline; man kann die Impulse einfach in das enthaltende Scope schreiben. Der Kontextmanagerpadhat keine Auswirkungen mehr, da er veraltet ist. -
Die Ausgabe des
SabreSwap'sabre'transpiler-Durchlaufs (auch wennoptimization_level=3oderrouting_methododerlayout_methodbeim Aufruf vontranspile()) mit einem festen Seed-Wert kann sich gegenüber früheren Versionen ändern. Dies ist auf die Verwendung eines neuen Zufallszahlengenerators zurückzuführen, der im Rahmen der Neuschreibung desSabreSwappasses in Rust verwendet wird, der die Leistung erheblich verbessert hat. Wenn Sie auf eine konsistente Ausgabe angewiesen sind, können Sie den Durchlauf in einer früheren Version von Qiskit durchführen und die Funktionqiskit.qpyverwenden, um den Schaltkreis zu speichern und ihn dann mit der aktuellen Version zu laden. -
Das
Layout.add()verhalten, wenn keinephysical_bitangegeben wird, hat sich gegenüber früheren Versionen geändert. In früheren Versionen wurde je nach Länge des Objekts ein neues physisches Bit hinzugefügtLayoutobjekts. Wenn Sie zum Beispiel eineLayoutmit den physikalischen Bits 1 und 3 haben, würden aufeinanderfolgende Aufrufe vonadd()würden die physikalischen Bits 2, 4, 5, 6 usw. hinzugefügt. Wären die physischen Bits 2 und 3, würden die aufeinander folgenden Aufrufe 4, 5, 6, 7 usw. ergeben. Dies wurde so geändert, dass stattdessenLayout.add()zunächst alle fehlenden physikalischen Bits zwischen 0 und dem maximalen physikalischen Bit in derLayout. Für das Beispiel 1 und 3 werden also 0, 2, 4, 5 und für das Beispiel 2 und 3 werden 0, 1, 4, 5 zu denLayout. Diese Änderung wurde vorgenommen, um die Vorhersagbarkeit des Ergebnisses zu erhöhen und um eine Reihe von Fehlern zu beheben, die durch das unerwartete Verhalten verursacht wurden. Da physikalische Bits auf einem Backend immer zusammenhängende Sequenzen von 0 bis sind, könnte das Hinzufügen neuer Bits, wenn noch ungenutzte physikalische Bits vorhanden sind, dazu führen, dass das Layout mehr Bits verwendet als auf dem Backend verfügbar sind. Wenn Sie das vorherige Verhalten wünschen, können Sie das gewünschte physikalische Bit manuell beim Aufruf vonLayout.add(). -
Das veraltete Attribut Methode
SparsePauliOp.tablewurde entfernt. Ursprünglich war sie in Qiskit Terra 0.19 veraltet. Stattdessen sollte die Methodepaulis()verwendet werden. -
Die Unterstützung für die Rückgabe einer
PauliTableaus derpauli_basis()funktion wurde entfernt. In ähnlicher Weise wird das Argumentpauli_listder Funktionpauli_basis()funktion, das verwendet wurde, um zu einemPauliList(jetzt der einzige Rückgabetyp) wurde entfernt. Diese Funktion wurde in der Version Qiskit Terra 0.19 veraltet. -
Die gefälschten Backend-Objekte
FakeJohannesburg,FakeJohannesburgV2,FakeAlmaden,FakeAlmadenV2,FakeSingapore, undFakeSingaporeV2enthalten nicht mehr die Impuls-Standardnutzlasten. Dies bedeutet für dieBackendV1basierten Klassen die MethodeBackendV1.defaults()und die Impulssimulation überBackendV1.run()nicht mehr verfügbar ist. FürBackendV2basierten Klassen wird die Eigenschaftcalibrationfür Anweisungen in derTargetnicht mehr aufgefüllt. Diese Änderung wurde vorgenommen, weil diese Systeme aufgrund der Verwendung von abgetasteten Wellenformen anstelle von parametrischen Impulsdefinitionen übermäßig große Impulsvorgaben hatten (insgesamt ~50MB ). Diese drei Nutzdateien beanspruchten mehr als 50 % des für die Installation von qiskit-terra benötigten Speicherplatzes. Wenn man den potenziellen Wert der Kompilierung mit Impulsbewusstsein oder der Impulssimulation dieser ausgemusterten Geräte gegeneinander abwägt, ist die Dateigröße die Kosten nicht wert. Wenn Sie diese Eigenschaften nutzen möchten, können Sie eine ältere Version von Qiskit verwenden und mit Hilfe vonqpyverwenden, um Schaltkreise aus älteren Versionen von Qiskit in die aktuelle Version zu übertragen. -
isinstancemit Pulsklassen prüfenGaussian,GaussianSquare,DragundConstantwird für ungültig erklärt, da diese Puls-Unterklassen nicht mehr instanziiert werden. Sie funktionieren noch in Terra 0.22, aber Sie sollten sofort mit der Umstellung beginnen. Anstelle von Typinformationen sollteSymbolicPulse.pulse_typeverwendet werden. Es wird davon ausgegangen, dass dies ein eindeutiger String-Identifikator für Impulshüllkurven ist, und wir können String-Gleichheit verwenden, um die Impulstypen zu untersuchen. Beispiel:from qiskit.pulse.library import Gaussian pulse = Gaussian(160, 0.1, 40) if isinstance(pulse, Gaussian): print("This is Gaussian pulse.")Dieser Code sollte aktualisiert werden zu
from qiskit.pulse.library import Gaussian pulse = Gaussian(160, 0.1, 40) if pulse.pulse_type == "Gaussian": print("This is Gaussian pulse.")Aus demselben Grund sollte auf die Klassenattribute wie
pulse.__class__.__name__nicht zugegriffen werden, um Informationen über den Impulstyp zu erhalten. -
Die Ausnahme
qiskit.exceptions.QiskitIndexErrorwurde entfernt und existiert nicht mehr, wie in der Deprecation Notice von qiskit-terra 0.18.0 (veröffentlicht am 12. Juli 2021) beschrieben. -
Die veralteten Argumente
epsilonundfactrfür den Konstruktor derL_BFGS_Boptimizer-Klasse wurden entfernt. Diese Argumente wurden ursprünglich als Teil der 0.18.0 Version (veröffentlicht am 12. Juli 2021) veraltet. Stattdessen sollte das Argumentftolverwendet werden. Nähere Informationen über die Beziehung zwischen diesen Argumenten finden Sie in der Scipy-Dokumentation über den Optimierer. -
Die voreingestellten Passmanager für die Ebenen 1 und 2, die verwendet werden, wenn
optimization_level=1oderoptimization_level=2mittranspile()odergenerate_preset_pass_manager()und der Ausgabe vonlevel_1_pass_manager()undlevel_2_pass_manager()ausgegeben werden, verwenden nunSabreLayoutundSabreSwapstandardmäßig anstelle der bisherigen VoreinstellungenDenseLayoutundStochasticSwap. Diese Änderung wurde vorgenommen, um die Ausgabequalität des Transpilers zu verbessern; dieSabreLayoutundSabreSwapKombination führt in der Regel dazu, dass wenigerSwapGateobjekte in die Ausgabeschaltung eingefügt werden. Wenn Sie die vorherigen Standardpässe verwenden möchten, können Sielayout_method='dense'undrouting_method='stochastic'auftranspile()odergenerate_preset_pass_manager()zur Nutzung vonDenseLayoutundStochasticSwapsetzen. -
Die implizite Verwendung von
approximation_degree!=1.0als Standard in dertranspile()funktion, wennoptimization_level=3gesetzt ist, wurde deaktiviert. Der Transpiler sollte standardmäßig die Einheitlichkeit der Eingabe bis zu bekannten Transformationen wie einseitigen Permutationen und Ähnlichkeitstransformationen erhalten. Dies wurde durch die frühere Verwendung vonapproximation_degree=Noneunterbrochen, was in Fällen wie der trotterisierten Evolution mit vielen Zeitschritten zu falschen Ergebnissen führte, bei denen die Unitarien übermäßig angenähert wurden, was zu falschen Ergebnissen führte. Es wurde beschlossen, dass Transformationen, die die unitäre Äquivalenz aufheben, vom Benutzer explizit aktiviert werden sollten. Wenn Sie das frühere Standardverhalten wünschen, bei dem synthetisierteUnitaryGateAnweisungen bis zu den Fehlerraten der nativen Anweisungen des Ziel-Backends angenähert werden, können Sie explizitapproximation_degree=Nonesetzen, wenn Sietranspile()mitoptimization_level=3zum Beispiel:transpile(circuit, backend, approximation_degree=None, optimization_level=3) -
Ändern Sie den Standardwert für die maximale Anzahl zulässiger Funktionsbewertungen (
maxfun) inL_BFGS_Bvon 1000 auf 15000, um der Vorgabe von SciPy zu entsprechen. Diese Zahl entspricht auch der Standardzahl der Iterationen (maxiter). -
Aktualisiert
ProbDistributionundQuasiDistributionum die Information über die Anzahl der Bits zu speichern, wenn Bitstrings ohne Präfix “0b” angegeben werden.ProbDistribution.binary_probabilities()undQuasiDistribution.binary_probabilities()die gespeicherte Anzahl der Bits als Standardwert für die Anzahl der Bits verwenden. -
RZXCalibrationBuilderundRZXCalibrationBuilderNoEchowurden aufgerüstet, um die Streckung von CX-Gattern zu überspringen, die durch eine nicht-echoisierte Kreuzresonanzsequenz (ECR) implementiert wurden, um einen Abbruch des Durchgangs mit unerwarteten Fehlern zu vermeiden. Diese Übergänge nehmen ein neues Argumentverbose, das steuert, ob die Übergänge warnen, wenn dies geschieht. Wennverbose=Truegesetzt ist, gibt der Pass eine Benutzerwarnung aus, wenn er eine Nicht-ECR-Sequenz entdeckt. -
Das Visualisierungsmodul
qiskit.visualizationwurde intern etwas umstrukturiert. Dies sollte keine Auswirkungen auf die öffentliche Schnittstelle haben, aber wenn Sie auf interne Daten der Schaltkreisschubladen zugreifen, befinden sich diese nun möglicherweise an anderen Stellen. Die einzigen Teile des Visualisierungsmoduls, die als öffentlich gelten, sind die Komponenten, die in dieser Online-Dokumentation dokumentiert sind.
Hinweise zu veralteten Versionen
-
Der Import der Namen
Int1,Int2,classical_functionundBooleanExpressiondirekt ausqiskit.circuitist veraltet. Dies ist Teil der Entwicklung,tweedledumzu einer optionalen Abhängigkeit zu machen, anstatt eine vollständige Voraussetzung zu sein. Stattdessen sollten Sie diese Namen ausqiskit.circuit.classicalfunction. -
Die Module
qiskit.algorithms.factorizersundqiskit.algorithms.linear_solverssind veraltet und werden in einer zukünftigen Version entfernt. Sie werden durch Tutorials im Qiskit-Lehrbuch ersetzt: Schor HHL -
Die
random_stabilizer_table()ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollte dierandom_pauli_list()funktion verwendet werden. -
Die Pulsmodul-Funktion
qiskit.pulse.utils.deprecated_functionalityist veraltet und wird in einer zukünftigen Version entfernt werden. Dies war eine hauptsächlich interne Funktion. Die gleiche Funktionalität wird vonqiskit.utils.deprecate_functionbereitgestellt, das stattdessen verwendet werden sollte. -
Die Methode zur Ausführung von Primitiven wurde geändert. Die Methoden
BaseSampler.__call__()undBaseEstimator.__call__()wurden veraltet. Zum Beispiel:estimator = Estimator(...) result = estimator(circuits, observables, parameters) sampler = Sampler(...) result = sampler(circuits, observables, parameters)sollte umgeschrieben werden als
estimator = Estimator() result = estimator.run(circuits, observables, parameter_values).result() sampler = Sampler() result = sampler.run(circuits, parameter_values).result()Die Verwendung von Primitiven als Kontextmanager ist veraltet. Nicht alle Primitive verfügen über einen Kontextmanager. Wenn verfügbar (z. B. in
qiskit-ibm-runtime), bietet der Kontextmanager der Sitzung eine gleichwertige Funktionalität.circuits,observables, undparametersim Konstruktor wurde veraltet.circuitsundobservableskönnen vonrunMethoden übergeben werden.runmethoden unterstützen nichtparameters. Die Benutzer müssen die Parameterwerte selbst umstellen. -
Das unbenutzte Argument
qubit_channel_mappingin denRZXCalibrationBuilderundRZXCalibrationBuilderNoEchowurde veraltet und wird in einer zukünftigen Version entfernt werden. Dieses Argument wird nicht mehr verwendet und hat keine Auswirkungen auf die Funktionsweise der Pässe.
Fehlerkorrekturen
-
Ein Problem wurde behoben, bei dem
Pauli.evolve()undPauliList.evolve()einen dtype-Fehler auslöste, wenn es durch bestimmte Clifford-Gatter, die die Pauli-Phase modifizierten, entwickelt wurde. Behoben #8438 -
Ein Fehler wurde behoben in
QuantumCircuit.initialize()undQuantumCircuit.prepare_state()behoben, der dazu führte, dass sie bei der Initialisierung kein einzelnesQubitals Argument akzeptierten. -
Die Methode
QuantumCircuit.while_loop()löst nun klassische Bitreferenzen in ihrer Bedingung auf die gleiche Weise auf wieQuantumCircuit.if_test()undInstructionSet.c_if()tun. -
Die
DAGCircuitmethodendepth(),size()undDAGCircuit.count_ops()gaben bisher Ergebnisse zurück, die wenig bis gar keine Bedeutung hatten, wenn ein Kontrollfluss in der Schaltung vorhanden war. Diedepth()undsize()methoden werfen in diesen Fällen nun korrekt einen Fehler, haben aber ein neuesrecurseSchlüsselwortargument, um die Berechnung eines Proxy-Wertes zu ermöglichen, währendcount_ops()standardmäßig in den Blöcken rekursiert und die Operationen innerhalb dieser Blöcke zählt. -
Es wurde ein Problem im
DenseLayouttranspiler-Durchgang, bei dem alle losenQubitobjekte (d.h. nicht Teil einerQuantumRegister), die Teil einerQuantumCircuitwaren, nicht in die AusgabeLayoutdie von dem Durchgang erzeugt wurde. -
Die
Operator.from_circuit()konstruktor-Methode wurde aktualisiert, so dass sie mit der Layout-Ausgabe vontranspile()verarbeitet und die durch das Layout verursachte Qubit-Permutation in allen Fällen korrekt umkehrt. Wenn Ihre transpilierte Schaltung bisher lose Objekte verwendeteQubitobjekte, mehrereQuantumRegisterobjekte oder ein einzelnesQuantumRegistermit einem anderen Namen als"q"verwendet hat, konnte der Konstruktor keineOperatoraus der Schaltung zu erstellen. Behoben #8800. -
Ein Fehler wurde behoben, bei dem die Zerlegung einer Anweisung mit einem Qubit und einem klassischen Bit, die ein einzelnes Quantengatter enthält, fehlschlug. Nun zerlegt sich das Folgende wie erwartet:
block = QuantumCircuit(1, 1) block.h(0) circuit = QuantumCircuit(1, 1) circuit.append(block, [0], [0]) decomposed = circuit.decompose() -
Fixierte Initialisierung der leeren symplektischen Matrix in
from_symplectic()inPauliListklasse Zum Beispiel:from qiskit.quantum_info.operators import PauliList x = np.array([], dtype=bool).reshape((1,0)) z = np.array([], dtype=bool).reshape((1,0)) pauli_list = PauliList.from_symplectic(x, z) -
Behebung eines Problems in der
GateDirectiontranspilerpass für dieCZGate. Das CZ-Tor ist symmetrisch, so dass die Umkehrung der Qubit-Argumente erlaubt ist, um die gerichtete Kopplungskarte zu erfüllen. -
Probleme mit der Methode
DerivativeBase.gradient_wrapper()bei der Wiederverwendung eines Circuit Samplers zwischen den Aufrufen und der Bindung verschachtelter Parameter wurden behoben. -
Ein Problem in den Schaltkreisschubladen
mplundlatexwurde behoben, bei dem das Setzen der Optionidle_wiresauf False bei Vorhandensein einesbarrierim Schaltkreis zu einem Ausfall der Schubladen führte. Behoben #8313 -
Ein Problem wurde behoben in
circuit_drawer()undQuantumCircuit.draw()mit der Methodelatex, bei der auf Systemen, deren temporäre Verzeichnisse (z.B./tmp) in einem anderen Dateisystem liegen als das Arbeitsverzeichnis, einOSErrorausgelöst wurde. Behebt #8542 -
Verschachtelung einer
FlowControllerinnerhalb eines anderen in einerPassManagerkonnte früher dazu führen, dass einige Transpilerdurchläufe während der Transpilierung "vergessen" wurden, wenn die Durchläufe ein neuesDAGCircuitzurückgaben, anstatt ihre Eingabe zu verändern. VerschachtelteFlowControllers wirken sich nun korrekt auf die Transpilierung aus. -
Vergleich von
QuantumCircuitundDAGCircuits auf Gleichheit war bisher nicht deterministisch, wenn die Schaltkreise mehr als ein Register desselben Typs enthielten (z. B. zwei oder mehrQuantumRegisters) und ergab manchmalFalse, selbst wenn die Register identisch waren. Schaltungen mit mehreren Registern werden nun korrekt verglichen. -
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 gab zwei Fehler in der
textSchaltkreisschublade, die behoben wurden. Diese erschienen, wennvertical_compressionaufmediumeingestellt war, was die Standardeinstellung ist. Im ersten Fall konnte es vorkommen, dass Text andere Texte oder Gatter überschrieb, und im zweiten Fall konnte es vorkommen, dass die Verbindungen zwischen einem Gatter und seinen Steuerungen unterbrochen wurden. Siehe #8588. -
Es wurde ein Problem mit dem
UnitarySynthesispass, bei dem eine Schaltung mit 1-Qubit-Gattern und einemTargeteingang manchmal fehlschlug, anstatt die Schaltung wie erwartet zu verarbeiten. -
Der
GateDirectiontranspiler-Durchlauf beachtet nun die verfügbaren Werte für Gatterparameter, wenn er parametrisierte Gatter mit einerTarget. -
Es wurde ein Problem in der
SNOBFIToptimizer-Klasse, wo ein interner Fehler während der Ausführung derminimize()methode einen internen Fehler auslöste, wenn keine Eingabegrenzen angegeben wurden. Dies wird nun zum Zeitpunkt des Aufrufs überprüft, um schnell eineValueErrorzu erstellen, wenn die erforderlichen Grenzen für den Aufruf fehlenminimize()aufruf fehlen. Behebt #8580 -
Es wurde ein Problem in der aufrufbaren Ausgabe der
get_energy_evaluation()methode derVQDklasse ruft nun korrekt die angegebenecallbackauf, wenn sie ausgeführt wird. Zuvor wurde der Rückruf in diesem Fall fälschlicherweise nicht verwendet. Behoben #8575 -
Ein Problem wurde behoben, das bei der Verwendung von
circuit_drawer()mitreverse_bits=Truein einem Schaltkreis ohne klassische Bits zu einer möglicherweise verwirrenden Warnung übercregbundleführte. Behoben #8690 -
Der OpenQASM 3-Exporter (
qiskit.qasm3) wird nun korrekt mit OpenQASM built-ins (wieresetundmeasure) umgehen, die eine klassische Bedingung haben, die vonc_if(). Zuvor wäre die Bedingung ignoriert worden. -
Es wurde ein Problem mit der
SPSAklasse behoben, bei dem intern versucht wurde, Aufträge in gleichgroße Stapel aufzuteilen, was eine Ausnahme auslöste, wenn die Erstellung gleichgroßer Stapel nicht möglich war. Dieses Problem wurde behoben, so dass die Stapelverarbeitung immer erfolgreich ist, auch wenn die Größe der Aufträge nicht gleichmäßig ist. -
Das Verhalten von
Layout.add()das möglicherweise dazu führte, dass die Ausgabe vontranspile()ungültig war und mehr Qubits enthielt, als auf dem Ziel-Backend verfügbar waren. Behoben: #8667 -
Ein Problem mit der Funktion
state_to_latex()wurde behoben: Die Übergabe einer Latex-Zeichenkette an das optionale Argumentprefixder Funktion führte zu einem Fehler. Behoben #8460 -
Die Funktion
state_to_latex()erzeugte nicht gültige LaTeX bei Vorhandensein von Werten nahe Null, was zu Fehlern führte, wennstate_drawer()aufgerufen wurde. Behoben #8169. -
GradientDescentzählt nun korrekt die Anzahl der Iterationen, Funktions- und Gradientenauswertungen. Außerdem wird in der Dokumentation nun korrekt angegeben, dass der Gradient durch eine Vorwärts-Finite-Differenzen-Methode approximiert wird. -
Behebung von Verwerfungswarnungen in
NaturalGradientdie nunStandardScalerverwendet, um die Daten vor der Anpassung des Modells zu skalieren, wenn der ParameternormalizeaufTruegesetzt ist.
Aer- 0.11.0
Keine Änderung
IBM Q Anbieter 0.19.2
Keine Änderung