Qiskit SDK 1.2 Versionshinweise
1.2.4
Vorspiel
Qiskit 1.2.4 ist ein Patch-Release, das ein QPY-Problem behebt, das in dem zurückgezogenen Bugfix-Release 1.2.3 eingeführt wurde. In 1.2.3 wurde ein Fehler ausgelöst, wenn eine QPY-Datei geladen wurde, die mit einer anderen symengine-Version als der beim Laden installierten Version erzeugt wurde.
Fehlerkorrekturen
- Es wurde ein Problem behoben, das in der inzwischen zurückgezogenen 1.2.3 Bugfix-Version eingeführt wurde und eine Ausnahme mit der Fehlermeldung "Qiskit unterstützt nicht das Laden einer symengine-Nutzlast, die mit symengine >= 1.0 erzeugt wurde" auslöste, wenn eine QPY-Datei geladen wurde, die mit einer anderen symengine-Version als der beim Laden installierten Version erzeugt wurde. Dieses Problem konnte nur unter 1.2.3 auftreten.
1.2.3
Vorspiel
Qiskit 1.2.3 ist ein Patch-Release, das ein Problem in QPY behebt, das dazu führen konnte, dass Dateien, die in einer Python -Umgebung erzeugt wurden, in einer anderen Python -Umgebung nicht geladen werden konnten, obwohl das Format angeblich übertragbar war. Dies hängt mit Unterschieden in der Version der Bibliothek symengine zusammen, gegen die QPY eigentlich hätte schützen müssen.
Bekannte Probleme
-
Versionen von Qiskit vor 1.2.4 werden nicht in der Lage sein, QPY-Dateien zu laden, die mit
qpy.dump()zu laden, auch wennversionentsprechend eingestellt ist, wenn:- gibt es ungebundene
ParameterExpressionobjekte in der QPY-Datei, - das
use_symengine=TrueFlag gesetzt wurde (was der Standard in Qiskit >= 1.0.0 ist) inqpy.dump()gesetzt, und - die Version von
symengine, die in der erzeugenden und der ladenden Umgebung installiert ist, nicht dieselbe Nebenversion hat.
Dies gilt unabhängig von der bei der Erstellung verwendeten Version von Qiskit (zumindest bis einschließlich Qiskit 1.2.4 ).
Wenn Sie die Kompatibilität mit Versionen von Qiskit < 1.2.3, you should set
use_symengine=False. Versions of Qiskit > = 1.2.3 maximieren wollen, sollten Sie dies nicht benötigen. - gibt es ungebundene
-
QPY-Dateien aus der Qiskit 0.45 -Serie können unter sehr speziellen und unwahrscheinlichen Umständen nicht mit neueren Versionen von Qiskit geladen werden, einschließlich Qiskit 1.2.4. Die Kriterien sind:
- die
QuantumCircuitoderScheduleBlockzu dumpenden Objekte enthielten ungebundeneParameterExpressionobjekte, - die installierte Version von
symenginegehörte zur Serie 0.9 (die jüngste Version während des Support-Fensters von Qiskit 0.45 ), und - das Kennzeichen
use_symengine=Truegesetzt wurde (was nicht der Standard war).
Spätere Versionen von Qiskit, die bei der Erstellung verwendet wurden, sind nicht betroffen, da sie neuere Versionen als
symengine0.9 benötigten.In diesem Fall können Sie die QPY-Datei wiederherstellen, indem Sie sie in einer Umgebung mit installiertem Qiskit 0.45.3 und
symengine0.9.2 neu laden. Verwenden Sie dannqpy.dump()mituse_symengine=False, um die Datei erneut zu exportieren. Diese wird dann von jeder neueren Version von Qiskit gelesen werden können. - die
Anmerkungen zu Upgrades
- Die unterstützten Versionen von symengine wurden vorsorglich auf < 0.14.0 begrenzt (was voraussichtlich die nächste Minor-Version sein wird, wie in dieser Version von Qiskit). Dies geschah zum Schutz vor einer möglichen Inkompatibilität in
qpybei der Serialisierung vonParameterExpressionobjekten. Die in den QPY Format Versionen 10, 11 und 12 verwendete Serialisierung fürParameterExpressionobjekte ist an die symengine-Version gebunden, mit der sie erzeugt wurde, und es besteht die Möglichkeit, dass eine zukünftige symengine-Version nicht kompatibel ist. Diese obere Versionsgrenze soll verhindern, dass eine zukünftige Version von symengine Inkompatibilitäten verursacht, wenn man versucht, QPY-Dateien mitqpy.load().
Fehlerkorrekturen
-
Ein Problem wurde behoben mit
qpy.load()beim Laden einer QPY-Datei, die einParameterExpressionenthält, wenn die Versionen vonsymengine, die in der erzeugenden und der ladenden Umgebung installiert sind, nicht identisch waren. Wenn zum Beispiel eine QPY-Datei mitParameterExpressionobjekte enthält, die mit Qiskit 1.2.2 mit installiertemsymengine==0.11.0erzeugt wurde, kann Qiskit 1.2.2 mit installiertemsymengine==0.13.0sie nicht laden.Früher hätte
symenginebei dieser Versionsabweichung eine Fehlermeldung ausgegeben. Dies wurde fürsymengine0.11 und 0.13 (es gab kein 0.12 ) behoben. Wenn Sie jedoch versuchen, verschiedene Versionen vonsymenginezu verwenden und es eine Diskrepanz gibt, funktioniert diese Version von Qiskit möglicherweise trotzdem nicht.
1.2.2
Vorspiel
Qiskit 1.2.2 ist ein kleineres Bugfix-Release für die 1.2 Serie.
Fehlerkorrekturen
-
Fehler im Transpilerdurchlauf behoben
ElidePermutationsbei dem die Qubit-Zuordnung nicht korrekt aktualisiert wurde, wenn einPermutationGates. -
Behebung einer potenziellen Quelle von Nicht-Determinismus in
DenseLayout(und durch ErweiterungSabreLayout) beim Anvisieren einerCouplingMapoderTargetdie mehr als einen Untergraphen mit demselben Konnektivitätsgrad hat. In diesen Fällen konnte das genaue Ausgabelayout des Durchlaufs zuvor je nach der Anzahl der lokalen CPUs und der Ausführungsgeschwindigkeit der Threads schwanken. -
Der
HighLevelSynthesistranspiler-Pass löst keine Ausnahme mehr aus, wenn er auf ein benutzerdefiniertes Tor trifft, das "qft" heißt, aber keine Instanz vonQFTGate. Stattdessen ignorieren die Synthese-Plugins für QFT-Gatter ein solches Gatter, und es wird die Definition des Gatters verwendet (falls vorhanden). -
Ein Fehler in den Schaltkreisschubladen wurde behoben, der dazu führen konnte, dass Drähte ausfielen oder fehlten, wenn
idle_wires=False. #13128 und #13146 behoben. -
Es wurde ein Problem beim Aufruf von
transpile()oder der MethodeStagedPassManager.run()eines Passmanagers, der vongenerate_preset_pass_manager()erzeugten Pass-Managers, deroptimization_level2 oder 3 verwendet, wenn das Argumentrouting_methodauf"none"gesetzt ist, um das Routing explizit zu deaktivieren. Bisher hat der Transpiler unter diesen Bedingungen denElidePermutationspass als Teil der Init-Phase ausgeführt, da dies unter normalen Bedingungen eine nützliche Optimierung ist, um dieSwapGateundPermutationGateinstanzen aus der Schaltung zu entfernen. Beirouting_method="none"wurde diese Optimierung jedoch nicht erwartet, da sie die Schaltung ähnlich wie das Routing umstellt, was beirouting_method="none"nicht durchgeführt werden sollte. Dieses Problem wurde behoben, indem nicht mehrElidePermutationsausgeführt wird, wennrouting_method="none"gesetzt ist. Behoben #13144. -
Der OpenQASM 3 Exporter akzeptiert nun wieder Include-Dateien von Nicht-Standard-Bibliotheken im
includesArgument zuqasm3.dump(),dumps(), undExporter. Diese fügen wie bisher eine geeigneteincludeAnweisung in die Ausgabe ein, und der Exporteur weiß nichts von den beabsichtigten Gates in dieser Include-Datei; Sie sollten die Gates, die er definieren soll, im Argumentbasis_gatesan dieselben Funktionen übergeben.Wir gehen davon aus, dass wir den Exportmechanismus für nicht standardisierte Include-Dateien in einer zukünftigen Version von Qiskit verbessern werden.
1.2.1
Vorspiel
Qiskit 1.2.1 ist ein kleineres Bugfix-Release für die 1.2 Serie.
Fehlerkorrekturen
-
Es wurde ein Problem mit der Visualisierung einiger Backends/Kopplungskarten behoben, die allein als gefaltet angezeigt wurden. Die Standardeinstellung <https://graphviz.org/docs/layouts/neato/> funktioniert in den meisten Fällen gut. Die Seite
prismüberschneidet sich jedoch und ergibt ein regelmäßigeres Layout für andere Szenarien. -
Parametrisch kontrollierte Standard-Bibliotheksgatter (wie z.B
CRXGate) werden nun korrekt in ein Rust-Standard-Gate extrahiert, wenn manQuantumCircuit.append()und dem Gatterobjekt. Zuvor gab es eine Diskrepanz, bei der die Verwendung derQuantumCircuit.crx()methode zu einer korrekten Extraktion im Rust Space führte, die Formappend()jedoch nicht. Der Fehler sollte in der Regel keine Unstimmigkeiten auf Python verursacht haben. -
Behebung eines Fehlers in
TwoQubitBasisDecomposerbehoben, bei dem der Rust-basierte Code in Panik geriet, wenn das angegebene KAK-Gatter keine Standardversion der Standard-Gatter war (z.B. mitCXGate(ctrl_state=0)). Behoben #12998. -
Ein Fehler wurde behoben, bei dem
InstructionDurations.from_backend()nicht funktionierte fürBackendV2backends. Behoben #12760. -
Die Definition der
CUGatematrix im Rust-Raum. Während dies nicht auffiel, wenn man dieCUGateauf der Seite Python nicht auffiel, hatte dies Auswirkungen, wenn Transpiler-Passagen die Rust-Darstellung verwendeten, wie es inConsolidate2qBlocksder Fall sein könnte. Behoben #13118. -
Ein Fehler wurde behoben in
HoareOptimizerbei dem ein kontrolliertes Tor durch Entfernen der Kontrollen vereinfacht wurde, aber das neue Tor nicht korrekt behandelt wurde. Behoben #13079. -
generate_preset_pass_manager()löst nun korrekt eine Ausnahme aus, wennseed_transpilerauf einen ungültigen Wert gesetzt wird (d.h. es ist keine nicht-negative ganze Zahl). Behoben #12938. -
Behebung eines Randfalls in
SabreLayoutbehoben, bei dem in seltenen Fällen auf großen Geräten und schwierigen Schaltkreisen das Routing fehlschlug. Dies war darauf zurückzuführen, dass das Freigabeventil mehr als ein Zwei-Qubit-Gate routbar machte, wo nur eines erwartet wurde. Behoben #13081. -
Es wurde ein Fehler in
Split2QUnitariesbehoben, der dazu führte, dass es auf Schaltkreisen mit benutzerdefiniertenGateobjekten, die nicht__array__implementiert haben. Siehe #12970. -
Es wurde ein Fehler in
StatePreparationbehoben, bei dem das Argumentnormalizefür Eingabe-Arrays ignoriert wurde. Behoben #12984. -
Ein Fehler wurde behoben, bei dem verschiedene Synthesemethoden Schaltungen ohne Quanten- oder klassische Register erzeugten. Dies betraf auch Funktionen, die intern die Synthesemethoden verwendeten, wie z.B
Clifford.to_circuit(). Die Schaltkreise waren zwar gültig, aber beim Vergleich von Schaltkreisen mit Registern konnte dies zu Problemen führen. #13041 behoben. -
Ein Fehler wurde behoben, der dazu führte, dass die Methode
Initialize.gates_to_uncompute()fehlschlägt. Behoben #12969. -
Behebung eines Randfalls beim Transpilieren einer Schaltung mit
optimization_level2 oder 3 mit einem unvollständigen 1-Qubit-Basisgattersatz auf eine Schaltung mit 2-Qubit-Gattern, die als Produkt von Einzel-Qubit-Gattern implementiert werden kann. Dieser Fehler wird behoben, indem dieSplit2QUnitariesauf die Berücksichtigung von nurUnitaryGateobjekte. Behoben #12970.
1.2.0
Vorspiel
Das Release von Qiskit 1.2.0 konzentriert sich hauptsächlich auf die Verbesserung der Leistung und Qualität des Compilers. Außerdem ist es die letzte Version, die Python 3.8 unterstützt. In Qiskit 1.3.0 ist die minimal erforderliche Version Python 3.9. Neben einer Vielzahl neuer Funktionen, Verbesserungen und Korrekturen sind die Highlights der neuen Version folgende:
- Die Infrastruktur der Rennstrecke, einschließlich der Tore und des Betriebs, wird nach Rust verlegt. Dies ermöglicht eine Reihe von Beschleunigungen bei der Schaltungskonstruktion und -manipulation.
- Unter Ausnutzung des oben genannten Punktes konstruieren Teile der Synthesebibliothek jetzt Schaltungen in Rust. Dies führt zu einer erheblichen Beschleunigung bei der Synthese von Operationen wie Cliffords, Permutationen oder linearen Funktionen. Die Zerlegung von Cliffords mit mehr als 50 Qubits führt beispielsweise zu einer ungefähr 1000-fachen Beschleunigung der Laufzeit.
- Die Qualität der kompilierten Schaltungen wird durch die Optimierung mit einer unitären Peephole-Optimierung in der Anfangsphase des Transpilierungs-Workflows (auf Optimierungsebene
>1) und durch die Verwendung eines dichten Layouts als Sabre-Layoutversuch (auf Optimierungsebene>0) verbessert.
Neue Funktionen
-
Hinzufügen einer neuen Klasse
QFTGatezur nativen Darstellung von Quanten-Fourier-Transformationen (QFTs). Die ältere Methode der Darstellung von QFTs durch Quantenschaltungen, sieheQFTbleibt aus Gründen der Abwärtskompatibilität bestehen. Die neue Art, eine QFT durch ein Gatter darzustellen, vermeidet die Synthese der Definitionsschaltung, wenn das Gatter deklariert wird, wodurch die eigentliche Synthese auf den Transpiler verschoben wird. Es ermöglicht auch die einfache Auswahl zwischen verschiedenen Algorithmen zur Synthese von QFTs, die als High-Level-Synthese-Plugins verfügbar sind. -
Hinzufügen einer Synthesemethode
synth_qft_full()für die Konstruktion eines QFT-Schaltkreises unter der Annahme einer vollständig angeschlossenen Architektur. -
Zwei High-Level-Synthese-Plugins zum Synthetisieren einer
QFTGate. Die KlasseQFTSynthesisFullbasiert aufsynth_qft_full()und synthetisiert ein QFT-Gatter unter der Annahme einer All-zu-All-Verbindung. Die KlasseQFTSynthesisLinebasiert aufsynth_qft_line()und synthetisiert ein QFT-Gatter unter der Annahme einer linearen Nächste-Nachbarn-Konnektivität. -
Zwei Parameter wurden zu
GenericBackendV2hinzugefügt, um Fehler (noise_info) und Impulskanalinformationen (pulse_channels) von der Konstruktion des Backends auszuschließen. Diese Parameter sind standardmäßigTrue, was das anfängliche Standardverhalten des Konstruktors widerspiegelt. Ein speichersensibler Benutzer kann diese Optionen aufFalsesetzen, um den Speicher-Overhead durch 40x zu reduzieren, wenn er auf großen Skalen transpiliertGenericBackendV2. -
Die Klasse
StabilizerStateklasse hat jetzt eine neue MethodeStabilizerState.probabilities_dict_from_bitstring()die es dem Benutzer ermöglicht, einen einzelnen Bitstring zu übergeben, für den ein Ergebnis gemessen werden soll. Zuvor wurde dieStabilizerState.probabilities_dict()verwendet und berechnete im schlimmsten Fall ( ) eine Reihe von Wahrscheinlichkeitsberechnungen (je nach Zustand), selbst wenn ein Benutzer nur ein einziges Ergebnis wollte. Mit dieser neuen Methode kann der Benutzer nur den einzelnen Ergebnis-Bitstring-Wert berechnen, den der Benutzer zur Messung der Wahrscheinlichkeit übergibt. Je höher die Anzahl der Qubits, desto größer kann die Leistungssteigerung sein (je nach Zustand), da nur ein Bitstringergebnis gemessen wird. -
Implementierung der Klasse
UniformSuperpositionGate, die die Erzeugung eines einheitlichen Überlagerungszustands unter Verwendung des Shukla-Vedula-Algorithmus ermöglicht. Diese Funktion erleichtert die Erstellung von Quantenschaltungen, die einen einheitlichen Überlagerungszustand erzeugen, wobei eine positive ganze Zahl ist, die die Anzahl der Berechnungsbasiszustände mit einer Amplitude von darstellt. Diese Implementierung unterstützt die effiziente Erstellung einheitlicher Überlagerungszustände und erfordert nur Qubits und Gatter. Beispiel für die Verwendung:from qiskit import QuantumCircuit from qiskit.circuit.library.data_preparation import UniformSuperpositionGate M = 5 num_qubits = 3 usp_gate = UniformSuperpositionGate(M, num_qubits) qc = QuantumCircuit(num_qubits) qc.append(usp_gate, list(range(num_qubits))) qc.draw()
Schaltkreise Funktionen
-
Eine neue Funktion hinzugefügt
random_clifford_circuit()zuqiskit.circuithinzugefügt, die es erlaubt, eine pseudo-zufällige Clifford-Schaltung mit Gattern aus der Standardbibliothek zu erzeugen. Beispielverwendung:from qiskit.circuit.random import random_clifford_circuit circ = random_clifford_circuit(num_qubits=2, num_gates=6) circ.draw(output='mpl')
-
Zusätzliche Unterstützung für
AnnotatedOperation.paramsundAnnotatedOperation.validate_parameter()die die Handhabung von Parametern auf Schaltkreisebene (z. B. Bindungsparameter) für kommentierte Operationen ermöglichen. -
CircuitInstructionundDAGOpNodehaben jeweils neue Methoden zur Abfrage verschiedener Eigenschaften ihrer internenOperationabzufragen, ohne unbedingt darauf zugreifen zu müssen. Diese Methoden sind:CircuitInstruction.is_standard_gate()undDAGOpNode.is_standard_gate(),CircuitInstruction.is_controlled_gate()undDAGOpNode.is_controlled_gate(),CircuitInstruction.is_directive()undDAGOpNode.is_directive(),CircuitInstruction.is_control_flow()undDAGOpNode.is_control_flow(), undCircuitInstruction.is_parameterized()undDAGOpNode.is_parameterized().
Falls zutreffend, ist die Verwendung einer dieser Methoden wesentlich schneller als die Abfrage von
CircuitInstruction.operationoderDAGOpNode.opdirekt abzufragen, insbesondere wenn die Anweisung oder der Knoten ein Qiskit-Standardgatter darstellt. Das liegt daran, dass die Standard-Gates nativ in Rust gespeichert sind und ihre Python Repräsentation nur auf Anfrage erstellt wird. -
Eine native Rust-Darstellung der Standard-Gate-Bibliothek von Qiskit wurde hinzugefügt. Wenn ein Standardtor zu einem
QuantumCircuitoderDAGCircuithinzugefügt wird, wird es nun auf effizientere Weise direkt in Rust dargestellt. Der Zugriff auf dieses Gatterobjekt von einem Schaltkreis oder einer DAG aus gibt ein neues Python Objekt zurück, das das Standardgatter darstellt. Dies führt zu einer schnelleren und effizienteren Transpilierung und Manipulation von Schaltungen für in Rust geschriebene Funktionalität. -
Die Funktion
random_circuit()funktion verfügt über eine neue Funktion, bei der der Benutzer eine Verteilungnum_operand_distribution(ein Diktat) angeben kann, die das Verhältnis von 1-Qubit-, 2-Qubit-, 3-Qubit- und 4-Qubit-Gattern in der Zufallsschaltung spezifiziert. Wenn zum Beispielnum_operand_distribution = {1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25}an die Funktion übergeben wird, dann wird die erzeugte Schaltung ungefähr 25% 1-Qubit-, 2-Qubit-, 3-Qubit- und 4-Qubit-Gatter haben. Es sollte auch beachtet werden, dass, wennnum_operand_distributionnicht angegeben wird,max_operandsstandardmäßig auf 4 gesetzt wird und eine zufällige Schaltung mit einer zufälligen Gatterverteilung erzeugt wird. Wenn sowohlnum_operand_distributionals auchmax_operandsgleichzeitig angegeben werden, wirdnum_operand_distributionzur Erzeugung der Zufallsschaltung verwendet.Beispielverwendung:
from qiskit.circuit.random import random_circuit circ = random_circuit( num_qubits=6, depth=5, num_operand_distribution={1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25} ) circ.draw(output="mpl")
-
Verbesserte Leistung der Methode
DAGCircuit.quantum_causal_cone()indem derselbe nicht-direktive Knoten nicht mehrfach untersucht wird, wenn er über verschiedene Pfade erreicht wird. -
Das Schlüsselwortargument
insert_barrierswurde zu derQuantumCircuit.repeat()methode. Durch die EinstellungTruewerden Barrieren zwischen den Schaltkreiswiederholungen eingefügt. -
Das Ersetzen des internen Synthesealgorithmus von
StatePreparationundInitializevon Shende et al. durch den Algorithmus inIsometryvon Iten et al. Der neue Algorithmus reduziert die Anzahl der CX-Gatter und die Schaltungstiefe um den Faktor 2. -
ParameterExpressionunterstützt jetzt den unären Operator+.
Primitive Funktionen
-
Eine neue Methode wurde hinzugefügt
BitArray.postselect()die alle Schüsse zurückgibt, die bestimmte Bit-Werte enthalten. Beispielverwendung:from qiskit.primitives.containers import BitArray ba = BitArray.from_counts({'110': 2, '100': 4, '000': 3}) print(ba.postselect([0,2], [0,1]).get_counts()) # {'110': 2, '100': 4} -
Die Metadaten von Primitives V2 Implementierungen, d.h.,
StatevectorSampler,StatevectorEstimator,BackendSamplerV2undBackendEstimatorV2wurden aktualisiert, damit sie mit denen der IBM Quantengeräte übereinstimmen.versionundcircuit_metadatawerden für alle V2 -Implementierungen hinzugefügtshotswird hinzugefügt fürBackendSamplerV2undBackendEstimatorV2precisionwird umbenannt intarget_precisionfürStatevectorEstimator
Beachten Sie, dass die Metadaten von
StatevectorEstimatornicht übershotsverfügen, da die Klasse die Erwartungswerte mitStatevectorund Schüsse nicht verwendet werden.
OpenQASM Funktionen
-
Die interne Symboltabelle des OpenQASM 3 Exporters (
qiskit.qasm3) wurde umgeschrieben, was zu saubereren Ausgaben bei der Verwendung von Qiskit-Standardbibliotheksgattern, die nicht in den OpenQASM 3-Standardbibliotheksheadern enthalten sind, und zu deterministischeren Ausgaben führen sollte. Zum Beispiel führt die Verwendung mehrererRZXGates nur noch eine einzige parametrische Definition, und wenn Namenskollisionen auftreten, weist die Symboltabelle einen deterministischen Zähler zu, um die Namen eindeutig zu machen, anstatt einer nicht-deterministischen Ganzzahl (vorher wurde die Objektidentität verwendet). -
Die vendored Version der OpenQASM 3.0 Standardbibliothek wurde aktualisiert, um dem Stand von 4ca1d79383 zu entsprechen. Dies sollte im Allgemeinen keine Auswirkungen auf Ihre Nutzung von Qiskit haben, es sei denn, Sie rufen unsere verkaufte Datei für Ihre eigene Nutzung ab.
Synthesefunktionen
-
MCXRecursivemit Kontroll-Qubits und einem einzigen reinen Hilfs-Qubit erfordert nun höchstens CX-Gatter. -
MCXVChainhat zwei neue boolesche Parameter relative_phase und action_only. Wennaction_onlyTrueist, reinigt die Schaltung die schmutzigen Qubits nicht. Wennrelative_phaseTrueist, wird das Tor bis zu einer globalen Phase ausgeführt. Beide Parameter werden verwendet, um die Zerlegung vonMCXVChain. -
MCXVChainmit Kontrollen und schmutzigen Hilfsqubits erfordert nun CX-Gatter. -
Portierung
synth_permutation_acg()die zur Synthese von Qubit-Permutationen verwendet wird, nach Rust. Dies ergibt eine ungefähre 3x Leistungsverbesserung bei 1000-Qubit-Schaltungen. -
Portierung
synth_permutation_basic()die zur Synthese von Qubit-Permutationen verwendet wird, nach Rust. -
Anschluss
synth_cnot_count_full_pmh()die zur Synthese einer linearen Funktion in ein CX-Netz verwendet wird, nach Rust. Dies führt zu einer Beschleunigung von etwa 44x, gemessen an 100-Qubit-Schaltungen. -
Die Funktion
synth_cnot_count_full_pmh()ermöglicht es nun, die (heuristisch) optimalesection_sizezu wählen, indem sie aufNonegesetzt wird. Dann wird ein Wert gewählt, der versucht, die obere Schranke für die Anzahl der CX-Gatter zu minimieren, d. h. , wobei die Anzahl der Qubits und ist. -
Die Funktion
synth_clifford_bm()wurde nach Rust portiert. Es sei daran erinnert, dass diese Funktion optimal synthetisiertCliffordoperatoren auf 1, 2 oder 3 Qubits in Bezug auf die Anzahl der CX-Tore synthetisiert. Dies führt zu einer erheblichen Leistungssteigerung. Bei Cliffords über 3 Qubits liegt die Beschleunigung in der Größenordnung des 80-fachen. -
Die Funktion
synth_clifford_greedy()zur Synthese vonCliffordoperatoren synthetisiert, wurde nach Rust portiert, was zu einer signifikanten Leistungssteigerung für alle Anzahlen von Qubits führte. Bei Cliffords mit mehr als 50 Qubits liegt der Geschwindigkeitszuwachs in der Größenordnung des 1000-fachen. -
Das Schlüsselwortargument
wrapwurde zu denProductFormulaklassen hinzugefügt, das (wenn es aktiviert ist) einzelne Pauli-Evolutionsterme umschließt. Dies kann bei der Visualisierung von Schaltkreisen nützlich sein. -
Das Argument
atomic_evolutionfürProductFormula(und seine Unterklassen) hat eine neue Funktionssignatur. Anstatt einen Pauli-Operator und einen Zeitkoeffizienten zu nehmen und den Evolutionsschaltkreis zurückzugeben, nimmt die neue Funktion einen bestehenden Schaltkreis auf und sollte die Entwicklung des angegebenen Pauli-Operators und der gegebenen Zeit an diesen Schaltkreis anhängen. Diese neue Implementierung zeichnet sich durch eine deutlich bessere Leistung aus. -
Verbesserte die Leistung von
synth_permutation_depth_lnn_kms()die zur Synthese von Permutationen für lineare Konnektivität verwendet wird, indem sie nach Rust portiert wurde.
Transpiler-Funktionen
-
Eine neue Importpfadoption wurde für
generate_preset_pass_manager()hinzugefügt, so dass es nun als importiert werden kann:from qiskit import generate_preset_pass_manageranstatt den vollständigen Pfad eingeben zu müssen:
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_managerDie Funktion ist auch importierbar aus dem
qiskit.transpilermodul als:from qiskit.transpiler import generate_preset_pass_manager -
Es wurde eine neue Option für die Benutzerkonfigurationsdatei
sabre_all_threadsund eine entsprechende UmgebungsvariableQISKIT_SABRE_ALL_THREADShinzugefügt. Wenn dieses Flag gesetzt ist, führen die voreingestellten Passmanager dieSabreLayoutundSabreSwapunter Verwendung aller verfügbaren CPUs auf dem lokalen System aus. Die Verwendung dieser Option ist ein Kompromiss zwischen dem Determinismus der Ausgabe zwischen verschiedenen Computern und einer potenziell besseren Ausgabe mit wenigerSwapGates.Diese Transpiler-Durchläufe führen mehrere Zufallsversuche parallel durch und wählen die Ausgabe mit den wenigsten
SwapGates. Als Faustregel gilt: Wenn Sie mehr Versuche durchführen, hat der Algorithmus mehr Möglichkeiten, ein besseres Ergebnis zu finden. Standardmäßig verwenden die voreingestellten Passmanager eine feste Anzahl von Versuchen, in dieser Version 5 Versuche für die Stufen 0 und 1 und 20 Versuche für die Stufen 2 und 3, aber diese Zahlen können sich in zukünftigen Versionen ändern (und waren in früheren Versionen anders). Die Verwendung einer festen Anzahl von Versuchen führt zu deterministischen Ergebnissen, unabhängig vom lokalen System, denn selbst bei einer festen Anzahl von Versuchen würden sich die Ergebnisse bei der Ausführung auf verschiedenen Computern unterscheiden, wenn man die Anzahl der verfügbaren lokalen CPUs zugrunde legen würde.Wenn die standardmäßige Anzahl von Versuchen für eine bestimmte Optimierungsstufe höher ist als die Anzahl der lokalen CPUs, wird die standardmäßige Optimierungsstufe verwendet, die höher ist.
-
Ein neuer Durchgang wurde hinzugefügt
Split2QUnitariesder über alle Zwei-Qubit-Gatter oder -Unitären in einer Schaltung iteriert und sie durch zwei Ein-Qubit-Unitäre ersetzt, wenn dies ohne Fehler möglich ist, d.h. das Zwei-Qubit-Gatter/Unitary ist eigentlich ein Tensorprodukt von Ein-Qubit-Unitären. -
Die Pässe
Collect2qBlocks,ConsolidateBlocksundSplit2QUnitarieswurden in dieinitStufe der voreingestellten Passmanager mit Optimierungsstufe 2 und Optimierungsstufe 3 aufgenommen. Die Änderung derinitStufe sollte ein effizienteres Routing für Quantenschaltungen ermöglichen, die entweder:- zwei-Qubit-Einheiten/Gatter enthalten, die eigentlich ein Produkt von Ein-Qubit-Gattern sind, oder
- mehrere Zwei-Qubit-Gatter in einem zusammenhängenden Block von Zwei-Qubit-Gattern enthalten.
Im ersten Fall kann das Routing des Zwei-Qubit-Gatters einfach übersprungen werden, da keine echte Wechselwirkung zwischen einem Qubit-Paar stattfindet. Im letzteren Fall wird der Lookahead-Raum der Routing-Algorithmen nicht durch überflüssige Zwei-Qubit-Gatter "verschmutzt", d. h. für das Routing reicht es aus, nur ein einziges Zwei-Qubit-Gatter pro zusammenhängendem Block von Zwei-Qubit-Gattern zu berücksichtigen. Diese Durchläufe werden nicht ausgeführt, wenn die Durchlaufmanager ein Ziel
Targetdie eine diskrete Basisgattermenge hat, d. h. alle Basisgatter sind nicht parametrisiert. -
Die Leistung von
StarPreRoutingdie zum Auffinden eines Sterngraphen-Konnektivitäts-Teilkreises verwendet wird, wird verbessert, indem die schwere Arbeit im Rust-Raum durchgeführt wird. -
Der
SabreLayouttranspiler-Durchlauf wurde aktualisiert, um immer einen zusätzlichen Versuch mit demselben Algorithmus durchzuführen wieDenseLayoutum einen Startpunkt für den Sabre-Layout-Algorithmus zu wählen. Der vom Layout-Algorithmus verwendete Startpunkt kann einen großen Einfluss auf die Qualität der Ergebnisse haben. StandardmäßigSabreLayoutbeginnt immer noch mitlayout_trialszufälligen Versuchen, aber zusätzlich gibt es einen einzigen Versuch, der den dichtesten Untergraphen des Konnektivitätsgraphen als Startpunkt verwendet. Dies kann in einigen Fällen zu besseren Ergebnissen führen, insbesondere in Fällen mit kleineren Schaltkreisen für größere Kopplungskarten. -
Ein neues Argument
dtwurde hinzugefügt zugenerate_preset_pass_manager()hinzugefügt, um der Menge der Argumente vontranspile(). Dies ermöglicht die interne Umwandlung von Transpilationsbedingungen in eineTargetdarstellung.
Visualisierungsfunktionen
-
Die Benutzerkonfigurationsdatei hat eine neue Option
circuit_idle_wires, die einen booleschen Wert annimmt. Damit können die Benutzer ihr bevorzugtes Standardverhalten für die Optionidle_wiresder Schaltkreisschubladen einstellenQuantumCircuit.draw()undcircuit_drawer(). Zum Beispiel, indem Sie einen Abschnitt auf~/.qiskit/settings.confhinzufügen:[default] circuit_idle_wires = falseändert die Standardeinstellung so, dass keine ungenutzten Drähte angezeigt werden.
Versch. Funktionen
- Es wurde eine neue Umgebungsvariable
QISKIT_NO_CACHE_GATEShinzugefügt, die, wenn sie auf einen Wert von1(d.h.QISKIT_NO_CACHE_GATES=1) gesetzt wird verringert den Speicher-Overhead von aCircuitInstructionundDAGOpNodeobjekts um den Preis einer erhöhten Laufzeit bei Mehrfachzugriffen aufCircuitInstruction.operationundDAGOpNode.op. Wenn diese Umgebungsvariable bei der Erstellung des Pakets Qiskit Python aus dem Quellcode gesetzt ist, wird die Zwischenspeicherung der Rückgabe dieser Attribute deaktiviert.
Hinweise zur Aktualisierung von Schaltkreisen
-
Das
annotatedArgument derGate.control()methode ist nun standardmäßigNone, was Qiskit die Wahl lässt, ob eine kontrollierte Operation kommentiert werden soll. Wenn die konkrete Implementierung (annotated=False) verfügbar ist, wird sie standardmäßig zurückgegeben. Andernfalls wird die kommentierte Implementierung zurückgegeben (annotated=True). Dies ermöglicht es zum Beispiel, die Synthese von kontrollierten, parametrisierten Gattern aufzuschieben. -
Die
Operationinstanzen vonDAGOpNode.opdie zurückgegeben werden, haben nicht mehr unbedingt einen gemeinsamen Verweis auf das zugrunde liegende Objekt. Dies war nie garantiert der Fall, und die Mutation derDAGOpNode.opdirekt durch eine Referenz zu verändern, war unsolide und führte wahrscheinlich immer dazu, dass die interne Zustandsverfolgung des DAGs beschädigt wurdeQuantumCircuitundDAGCircuitum Standard-Gates in Rust zu speichern, wird das Ausgabeobjekt vonDAGOpNode.opnun wahrscheinlich eine Kopie statt einer gemeinsamen Instanz sein. Wenn Sie ein Element mutieren müssen, sollten Sie sicherstellen, dass Sie es tun:op = dag_node.op op.params[0] = 3.14159 dag.substitute_node(dag_node, op)anstatt etwas zu tun wie:
dag_node.op.params[0] = 3.14159was in dieser Version für kein Standardtor funktioniert. Es hätte wahrscheinlich zufällig in einer früheren Version funktioniert, war aber nie eine API-Garantie.
-
Die
Operationinstanzen vonCircuitInstruction.operationdie zurückgegeben werden, haben nicht mehr unbedingt einen gemeinsamen Verweis auf das zugrunde liegende Objekt. Dies war nie garantiert der Fall, und die Mutation derCircuitInstruction.operationdirekt per Verweis zu ändern, war unsolide und konnte die Schaltung immer beschädigen, insbesondere wenn Parameter verwendet wurden. Aufgrund der internen Umstrukturierung desQuantumCircuitum Standard-Gates in Rust zu speichern, wird das Ausgabeobjekt vonCircuitInstruction.operationnun wahrscheinlich eine Kopie statt einer gemeinsamen Instanz sein. Wenn Sie ein Element im Schaltkreis mutieren müssen (wovon dringend abgeraten wird, da es ineffizient und fehleranfällig ist), sollten Sie dafür sorgen, dass Sie dies tun:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) qc.p(0) op = qc.data[0].operation op.params[0] = 3.14 qc.data[0] = qc.data[0].replace(operation=op)anstatt etwas zu tun wie:
from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) qc.p(0) qc.data[0].operation.params[0] = 3.14was für keine Standard-Gates in dieser Version funktioniert. Es hätte wahrscheinlich zufällig in einer früheren Version funktioniert, war aber nie eine API-Garantie.
Hinweise zum Upgrade von Primitives
-
BitArray.slice_bits()undBitArray.slice_shots()gibt nunIndexErroraus, wenn die Indizes außerhalb der Grenzen liegen. Sie haben in dem FallValueErroraufgerufen. -
BitArray.__getitem__()gibt nunIndexErroraus, wenn die Indizes außerhalb der Grenzen liegen oder die Anzahl der Dimensionen der Indizes nicht mit der vonBitArray. Sie haben in dem FallValueErroraufgerufen.
Hinweise zum Upgrade der Synthese
LieTrotterundSuzukiTrotterdie individuell entwickelten Pauli-Terme nicht mehr in Gatterdefinitionen verpacken. Wenn Sie sich auf eine bestimmte Zerlegungsebene Ihrer Schaltung verlassen, müssen Sie eine Ebene vonQuantumCircuit.decompose()entfernen oder das Schlüsselwortargumentwrap=Truezu Ihrem Syntheseobjekt hinzufügen.
Hinweise zum Transpiler-Upgrade
-
In den Optimierungsstufen 2 und 3 wird nun zusätzlich die Peephole-Optimierung vor der Übersetzungs-/Synthesestufe eingesetzt (früher geschah dies nur in der Optimierungsstufe). Zu den Auswirkungen der Peephole-Optimierung gehört die Entfernung von Gates, die sehr nahe an der Identität liegen, z. B. phasengesteuerte Gates mit einem Drehwinkel kleiner als .
-
Der Standard-Routing-Pass, der von der Optimierungsstufe 0 für
generate_preset_pass_manager()undtranspile()wurde geändert vonStochasticSwapaufSabreSwap. DerSabreSwapführt genau dieselbe Funktion aus, ist aber sowohl in Bezug auf die Laufzeit als auch auf die Ausgabequalität (Anzahl der Swap-Gates und Tiefe) besser alsStochasticSwap. Füroptimization_level=0sollte dies keine Rolle spielen, da für den typischen Anwendungsfall der Stufe 0 kein Routing zu erwarten ist.Wenn Sie sich aus irgendeinem Grund auf den vorherigen Standard-Routing-Algorithmus verlassen haben, können Sie das Argument
routing_methodfürtranspile()undgenerate_preset_pass_manager()auf"stochastic"verwenden, um denStochasticSwapübergeben. -
Die Funktion
generate_preset_pass_manager()funktion wurde so erweitert, dass sie, wenn möglich, Transpiler-Beschränkungen intern in eineTargetinstanz umzuwandeln. Wenn eine Backend-Eingabe vom TypBackendV1bereitgestellt wird, wird sie inBackendV2konvertiert, um seineTarget. Diese Änderung erfordert keine Benutzeraktion.
Versch. Anmerkungen zu Upgrades
- Die Mindestversion von rustworkx, die benötigt wird, um diese Version auszuführen, wurde von 0.14.0 auf 0.15.0 erhöht. Dies ist erforderlich, weil Qiskit jetzt neue Funktionen verwendet, die in der Version von rustworkx 0.15.0 hinzugefügt wurden und die Leistung verbessern.
Veraltete Schaltungen
-
Die folgenden Schaltkreismethoden waren nicht für die Öffentlichkeit bestimmt, wurden aber während der Veröffentlichung von 1.0 versehentlich in der öffentlichen API dokumentiert gelassen. Sie sind jetzt von Qiskit 1.2 veraltet und werden in Qiskit entfernt 2.0:
-
Die Behandlung von
CircuitInstructionals Tupel-ähnliche Iterable zu behandeln, ist veraltet, und dieser alte Pfad wird in Qiskit 2.0 entfernt werden. Sie sollten die Attribut-ZugriffsfelderCircuitInstruction.operation,CircuitInstruction.qubits, undCircuitInstruction.clbitsverwenden. Zum Beispiel:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0, 1) qc.measure([0, 1], [0, 1]) # Deprecated. for op, qubits, clbits in qc.data: pass # New style. for instruction in qc.data: op = instruction.operation qubits = instruction.qubits clbits = instruction.clbits
Veraltete Primitive
-
Primitive V1 Implementierungen und V1-exclusive nicht versionierte Typ-Aliase sind nun zugunsten ihrer V2 Gegenstücke veraltet. Die Verwerfung wird auf die folgenden Klassen ausgedehnt, die die Schnittstellen V1 implementieren:
Estimatorzu Gunsten des V2 Äquivalents,StatevectorEstimatorSamplerzu Gunsten des V2 Äquivalents,StatevectorSamplerBackendEstimatorzu Gunsten des V2 Äquivalents,BackendEstimatorV2BackendSamplerzu Gunsten des V2 Äquivalents,BackendSamplerV2
Sowie die folgenden nicht versionierten Typ-Aliase:
BaseEstimator, Alias fürBaseEstimatorV1BaseSampler, Alias fürBaseSamplerV1
Diese Verwerfung betrifft nicht die explizit-versionierten
BaseEstimatorV1undBaseSamplerV1abstrakten Schnittstellendefinitionen oder die zugehörigen Ergebnis- und Auftragsklassen.
Anbieter-Deprecations
-
Die Klasse
BackendV1klasse ist veraltet und wird frühestens mit der nächsten Hauptversion 2.0.0 entfernt werden. Einzelheiten zur Aktualisierung auf die neue Version finden Sie in der MigrationsanleitungBackendV2. -
Die Qobj-Struktur und die zugehörigen Klassen (siehe
qiskit.qobj) sind jetzt veraltet. Sie wurden als Teil desBackendV1arbeitsablaufs eingeführt und sind nicht mehr für die Interaktion mitBackendV2backends.QuantumCircuitdie Serialisierung sollte über QPY (sieheqiskit.qpy) oder OpenQASM (sieheqiskit.qasm2undqiskit.qasm3) erfolgen.
Transpiler-Veraltungen
- Die Funktion
assemble()funktion ist jetzt veraltet und wird in der Version 2.0 entfernt werden. Die Funktion diente in erster Linie dazu, eineQobjzu erstellen, was inBackendV2-basierten Arbeitsabläufen. Es wurde auch für die Bindung von Parametern verwendet, eine Funktionalität, die vollständig vonQuantumCircuit.assign_parameters().
Veraltete Visualisierungen
-
Das Argument
justifyvoncircuit_drawer()oderQuantumCircuit.draw()wird ungültige Werte nicht mehr unterstützen (vorher wurden sie auf den Standardwert gesetzt), und in einer zukünftigen Version werden sie fehlerhaft sein. Gültige Rechtfertigungswerte sind"left","right"oder"none". -
Die Funktion
visualize_transition()funktion ist veraltet und wird in der Version 2.0.0 entfernt werden. Diese Funktion hatte eine Reihe von Einschränkungen, die ihren Nutzen auf sehr spezielle Anwendungsfälle beschränkten und nicht zum Rest des Qiskit-Visualisierungsmoduls passten.
Fehlerkorrekturen
-
Eine Reihe von Problemen bei der Steuerung von parametrisierten Standardgattern wurde behoben. Die kontrollierte Version einiger Gates (z. B.
RXXGateoderRYGatefür mehr als 1 Kontrolle) können nicht synthetisiert werden, wenn sie ungebundene Parameter enthalten. Zuvor schlug der Aufruf von.control()in einem solchen Fall fehl, aber jetzt erstellen wir einAnnotatedOperationals Platzhalter. Dies ermöglicht es, das gesteuerte Gatter in eine Schaltung einzufügen, die Parameter zu einem späteren Zeitpunkt zu binden und dann die Operation zu synthetisieren. Korrekturen #10311, #10697 und #12135. -
Die
SGateundSdgGategeben nun korrekt aCSGate, bzw.CSdgGate, wenn sie über ein einziges Kontroll-Qubit gesteuert werden. -
Legen Sie die Berechnung der Standardabweichung in
BackendEstimatorV2unter Berücksichtigung der Kovarianz der nichtkommutierenden Paulis. Festgelegt Qiskit/qiskit-ibm-runtime#1751. -
Ein Problem wurde behoben, bei dem
circuit_drawer()oder dieQuantumCircuit.draw()methode keine Warnung auslöste, wenn ein ungültiger Wert an dasjustifyArgument übergeben wurde, bevor es auf den Standardwert geändert wurde. Jetzt wird eine Warnung ausgegeben, wenn ein ungültiger Wert übergeben wird. Gültige Rechtfertigungswerte sind"left","right"oder"none". Siehe #12089 für weitere Einzelheiten. -
Festgelegt
SparsePauliOp.apply_layout()undPauli.apply_layout()zu erhöhenQiskitErrorwenn doppelte Indizes oder negative Indizes als Teil eines Layouts bereitgestellt werden. -
Es wurde ein Fehler im
ConsolidateBlockstranspiler-Durchgang, wenn die Eingabeschaltung ein benutzerdefiniertes undurchsichtiges Gatter enthält und weder die Optionenbasis_gatesnochtargetgesetzt sind, löst der Durchgang eineQiskitErrorund schlägt fehl. Dies wurde korrigiert, so dass der Transpiler-Durchlauf in diesen Situationen den identifizierten Block, der ein benutzerdefiniertes Gatter enthält, nicht konsolidiert, anstatt zu scheitern. -
Ein Fehler wurde behoben in
PadDynamicalDecouplingbehoben, der bisher die Fehlermeldung, dass eine Verzögerung nicht impulsorientiert ist, nicht korrekt anzeigte, wenn der vorherige oder nachfolgende Knoten ein Ein-/Ausgangsknoten war. Jetzt wird die Fehlermeldung korrekt angezeigt. -
Das Schlüsselwortargument
orderder FunktionBitArray.from_bool_array()sollte"little"oder"big"sein. Es wurden Prüfungen hinzugefügt, die einen Fehler auslösen, wenn ein ungültiger Wert eingegeben wird. -
Verbessern Sie die Zerlegung des Gatters, das durch
QuantumCircuit.mcx()erzeugten Gatters ohne Verwendung von Ancilla-Qubits, so dass die Anzahl derCXGates wie erwartet quadratisch mit der Anzahl der Qubits wächst und nicht exponentiell. -
Wurde korrigiert
SparsePauliOp.apply_layout()um korrekt mit Null-Qubit-Operatoren zu arbeiten. Wenn Sie zum Beispiel zuvor ein 0-Qubit erstellt haben und ein Layout wie dieses anwenden:op = SparsePauliOp("") op.apply_layout(None, 3)hätte dies zuvor zu einem Fehler geführt. Dies wird nun korrekt einen Operator der Form zurückgeben:
SparsePauliOp(['III'], coeffs=[1.+0.j]) -
Es wurde ein Fehler in
StatevectorSamplerder Gates mitc_ifignorierte. Es wird ein Fehler ausgegeben, weilStatevectornicht mitc_ifumgehen kann. -
Behebung eines Versehens im
Commuting2qGateRoutertranspiler-Durchgang, bei dem die Quantenregister-Permutationen nicht in den Eigenschaftssatz des Durchgangs aufgenommen wurden, so dass sie vom Benutzer manuell nachverfolgt werden mussten. Nun ist es möglich, die Permutation über die Eigenschaftlayoutdes Ausgangskreises abzurufen und den Durchgang ohne Informationsverlust in eine beliebige Transpilationspipeline einzufügen. -
Eine Fließkomma-Ungenauigkeit bei der Skalierung bestimmter Impulseinheiten zwischen Sekunden und Nanosekunden wurde behoben. Wenn der Impuls symbolisch definiert war, konnte ein unnötiger Fließkommafehler durch die Skalierung für bestimmte Builds von
symengineeingeführt werden, was zu unerwarteten Ergebnissen führen konnte, sobald die Symbole vollständig gebunden waren. Behoben #12392. -
Es wurde ein Fehler in
synth_cnot_count_full_pmh()wo die Angabe vonsection_size, die die Anzahl der Qubits nicht ohne Rest teilte, zu falschen Ergebnissen führen konnte. Nun synthetisiert jedesection_size(höchstens gleich der Anzahl der Qubits) die richtige Schaltung. Für einen (heuristisch) optimalen Wert setzen Siesection_size=None. -
PassManager.run()verschwendet bei mehreren Eingaben keine Zeit mehr mit der Serialisierung, wenn es nur seriell arbeiten soll. -
Es wurde ein Fehler in
plot_coupling_map()behoben, der dazu führte, dass die Kanten der Kopplungskarte falsch eingefärbt wurden. Behoben #12354. -
Der Parser OpenQASM 2.0 (
qasm2.load()undqasm2.loads()) kann nun Gate-Winkel-Ausdrücke auswerten, die Integer-Operanden enthalten, die den System-Size-Integer überlaufen lassen würden. Diese werden in einem doppelpräzisen Fließkomma-Kontext ausgewertet, so wie der Rest des Ausdrucks immer ausgewertet wurde. Achtung: Eine beliebig große ganze Zahl ist nicht unbedingt exakt in doppelter Genauigkeit darstellbar, so dass die Möglichkeit besteht, dass die Schaltung, wie auch immer sie erzeugt wurde, bereits alle numerische Genauigkeit modulo verloren hat. -
Der OpenQASM 3 Exporter (siehe
qiskit.qasm3) wird nun korrekt fehlschlagen, wenn er aufgefordert wird, ein Schlüsselwort oder einen anderen ungültigen Bezeichner als "Basis-Gate" zu verwenden, da er keine Möglichkeit hat, in diesen Fällen eine korrekte Ausgabe zu erzeugen. -
Der OpenQASM 3-Exporter (
qiskit.qasm3) exportiert nun korrekt mehrere Instanzen vonPauliEvolutionGateaus einer Schaltung. Zuvor wurde nur eine einzige Instanz exportiert, und alle anderen Instanzen verwendeten stillschweigend dieselbe (falsche) Version. -
Der OpenQASM 3 Exporter (
qiskit.qasm3) entschlüsselt die Gatternamen jetzt korrekt. Zuvor führte ein Tor, dessen Name ein ungültiger OpenQASM 3 Bezeichner war, dazu, dass ungültige OpenQASM 3 erzeugt wurden. -
Eine Reihe von Unstimmigkeiten bei der Eingabeverarbeitung zwischen
transpile()undgenerate_preset_pass_manager()wurden behoben. Diese Unstimmigkeiten würden dazu führen, dass für dieselben Eingaben unterschiedliche Umsetzungsergebnisse erzielt werden, odergenerate_preset_pass_manager()bei bestimmten Eingabekombinationen fehlschlagen, die vontranspile().