Skip to main content
IBM Quantum Platform

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 wenn version entsprechend eingestellt ist, wenn:

    • gibt es ungebundene ParameterExpression objekte in der QPY-Datei,
    • das use_symengine=True Flag gesetzt wurde (was der Standard in Qiskit >= 1.0.0 ist) in qpy.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.

  • 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 QuantumCircuit oder ScheduleBlock zu dumpenden Objekte enthielten ungebundene ParameterExpression objekte,
    • die installierte Version von symengine gehörte zur Serie 0.9 (die jüngste Version während des Support-Fensters von Qiskit 0.45 ), und
    • das Kennzeichen use_symengine=True gesetzt 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 symengine 0.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 symengine 0.9.2 neu laden. Verwenden Sie dann qpy.dump() mit use_symengine=False , um die Datei erneut zu exportieren. Diese wird dann von jeder neueren Version von Qiskit gelesen werden können.

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 qpy bei der Serialisierung von ParameterExpression objekten. Die in den QPY Format Versionen 10, 11 und 12 verwendete Serialisierung für ParameterExpression objekte 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 mit qpy.load().

Fehlerkorrekturen

  • Ein Problem wurde behoben mit qpy.load() beim Laden einer QPY-Datei, die ein ParameterExpressionenthält, wenn die Versionen von symengine , die in der erzeugenden und der ladenden Umgebung installiert sind, nicht identisch waren. Wenn zum Beispiel eine QPY-Datei mit ParameterExpression objekte enthält, die mit Qiskit 1.2.2 mit installiertem symengine==0.11.0 erzeugt wurde, kann Qiskit 1.2.2 mit installiertem symengine==0.13.0 sie nicht laden.

    Früher hätte symengine bei dieser Versionsabweichung eine Fehlermeldung ausgegeben. Dies wurde für symengine 0.11 und 0.13 (es gab kein 0.12 ) behoben. Wenn Sie jedoch versuchen, verschiedene Versionen von symengine zu 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 ElidePermutations bei dem die Qubit-Zuordnung nicht korrekt aktualisiert wurde, wenn ein PermutationGates.

  • Behebung einer potenziellen Quelle von Nicht-Determinismus in DenseLayout (und durch Erweiterung SabreLayout) beim Anvisieren einer CouplingMap oder Target die 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 HighLevelSynthesis transpiler-Pass löst keine Ausnahme mehr aus, wenn er auf ein benutzerdefiniertes Tor trifft, das "qft" heißt, aber keine Instanz von QFTGate. 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 Methode StagedPassManager.run() eines Passmanagers, der von generate_preset_pass_manager()erzeugten Pass-Managers, der optimization_level 2 oder 3 verwendet, wenn das Argument routing_method auf "none" gesetzt ist, um das Routing explizit zu deaktivieren. Bisher hat der Transpiler unter diesen Bedingungen den ElidePermutations pass als Teil der Init-Phase ausgeführt, da dies unter normalen Bedingungen eine nützliche Optimierung ist, um die SwapGate und PermutationGate instanzen aus der Schaltung zu entfernen. Bei routing_method="none" wurde diese Optimierung jedoch nicht erwartet, da sie die Schaltung ähnlich wie das Routing umstellt, was bei routing_method="none" nicht durchgeführt werden sollte. Dieses Problem wurde behoben, indem nicht mehr ElidePermutations ausgeführt wird, wenn routing_method="none" gesetzt ist. Behoben #13144.

  • Der OpenQASM 3 Exporter akzeptiert nun wieder Include-Dateien von Nicht-Standard-Bibliotheken im includes Argument zu qasm3.dump(), dumps(), und Exporter. Diese fügen wie bisher eine geeignete include Anweisung 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 Argument basis_gates an 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 man QuantumCircuit.append() und dem Gatterobjekt. Zuvor gab es eine Diskrepanz, bei der die Verwendung der QuantumCircuit.crx() methode zu einer korrekten Extraktion im Rust Space führte, die Form append() jedoch nicht. Der Fehler sollte in der Regel keine Unstimmigkeiten auf Python verursacht haben.

  • Behebung eines Fehlers in TwoQubitBasisDecomposer behoben, bei dem der Rust-basierte Code in Panik geriet, wenn das angegebene KAK-Gatter keine Standardversion der Standard-Gatter war (z.B. mit CXGate(ctrl_state=0)). Behoben #12998.

  • Ein Fehler wurde behoben, bei dem InstructionDurations.from_backend() nicht funktionierte für BackendV2 backends. Behoben #12760.

  • Die Definition der CUGate matrix im Rust-Raum. Während dies nicht auffiel, wenn man die CUGate auf der Seite Python nicht auffiel, hatte dies Auswirkungen, wenn Transpiler-Passagen die Rust-Darstellung verwendeten, wie es in Consolidate2qBlocks der Fall sein könnte. Behoben #13118.

  • Ein Fehler wurde behoben in HoareOptimizer bei 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, wenn seed_transpiler auf 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 Split2QUnitaries behoben, der dazu führte, dass es auf Schaltkreisen mit benutzerdefinierten Gate objekten, die nicht __array__ implementiert haben. Siehe #12970.

  • Es wurde ein Fehler in StatePreparation behoben, bei dem das Argument normalize fü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_level 2 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 die Split2QUnitaries auf die Berücksichtigung von nur UnitaryGate objekte. 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 QFTGate zur nativen Darstellung von Quanten-Fourier-Transformationen (QFTs). Die ältere Methode der Darstellung von QFTs durch Quantenschaltungen, siehe QFTbleibt 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 Klasse QFTSynthesisFull basiert auf synth_qft_full() und synthetisiert ein QFT-Gatter unter der Annahme einer All-zu-All-Verbindung. Die Klasse QFTSynthesisLine basiert auf synth_qft_line() und synthetisiert ein QFT-Gatter unter der Annahme einer linearen Nächste-Nachbarn-Konnektivität.

  • Zwei Parameter wurden zu GenericBackendV2 hinzugefügt, um Fehler (noise_info) und Impulskanalinformationen (pulse_channels) von der Konstruktion des Backends auszuschließen. Diese Parameter sind standardmäßig True , was das anfängliche Standardverhalten des Konstruktors widerspiegelt. Ein speichersensibler Benutzer kann diese Optionen auf False setzen, um den Speicher-Overhead durch 40x zu reduzieren, wenn er auf großen Skalen transpiliert GenericBackendV2.

  • Die Klasse StabilizerState klasse hat jetzt eine neue Methode StabilizerState.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 die StabilizerState.probabilities_dict() verwendet und berechnete im schlimmsten Fall ( 2n2^n ) 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 1M∑j=0M−1∣j⟩\frac{1}{\sqrt{M}} \sum_{j=0}^{M-1} |j\rangle erzeugen, wobei MM eine positive ganze Zahl ist, die die Anzahl der Berechnungsbasiszustände mit einer Amplitude von 1M\frac{1}{\sqrt{M}} darstellt. Diese Implementierung unterstützt die effiziente Erstellung einheitlicher Überlagerungszustände und erfordert nur O(log⁡2(M))O(\log_2 (M)) Qubits und O(log⁡2(M))O(\log_2 (M)) 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() zu qiskit.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')
    _images/release_notes-1.png
  • Zusätzliche Unterstützung für AnnotatedOperation.params und AnnotatedOperation.validate_parameter()die die Handhabung von Parametern auf Schaltkreisebene (z. B. Bindungsparameter) für kommentierte Operationen ermöglichen.

  • CircuitInstruction und DAGOpNode haben jeweils neue Methoden zur Abfrage verschiedener Eigenschaften ihrer internen Operationabzufragen, ohne unbedingt darauf zugreifen zu müssen. Diese Methoden sind:

    Falls zutreffend, ist die Verwendung einer dieser Methoden wesentlich schneller als die Abfrage von CircuitInstruction.operation oder DAGOpNode.op direkt 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 QuantumCircuit oder DAGCircuit hinzugefü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 Verteilung num_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 Beispiel num_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, wenn num_operand_distribution nicht angegeben wird, max_operands standardmäßig auf 4 gesetzt wird und eine zufällige Schaltung mit einer zufälligen Gatterverteilung erzeugt wird. Wenn sowohl num_operand_distribution als auch max_operands gleichzeitig angegeben werden, wird num_operand_distribution zur 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")
    _images/release_notes-2.png
  • 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_barriers wurde zu der QuantumCircuit.repeat() methode. Durch die Einstellung True werden Barrieren zwischen den Schaltkreiswiederholungen eingefügt.

  • Das Ersetzen des internen Synthesealgorithmus von StatePreparation und Initialize von Shende et al. durch den Algorithmus in Isometry von Iten et al. Der neue Algorithmus reduziert die Anzahl der CX-Gatter und die Schaltungstiefe um den Faktor 2.

  • ParameterExpression unterstü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, BackendSamplerV2 und BackendEstimatorV2wurden aktualisiert, damit sie mit denen der IBM Quantengeräte übereinstimmen.

    Beachten Sie, dass die Metadaten von StatevectorEstimator nicht über shots verfügen, da die Klasse die Erwartungswerte mit Statevector und 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 mehrerer RZXGates 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

  • MCXRecursive mit kk Kontroll-Qubits und einem einzigen reinen Hilfs-Qubit erfordert nun höchstens 16k−816k-8 CX-Gatter.

  • MCXVChain hat zwei neue boolesche Parameter relative_phase und action_only. Wenn action_only True ist, reinigt die Schaltung die schmutzigen Qubits nicht. Wenn relative_phase True ist, wird das Tor bis zu einer globalen Phase ausgeführt. Beide Parameter werden verwendet, um die Zerlegung von MCXVChain.

  • MCXVChain mit kk Kontrollen und k−2k-2 schmutzigen Hilfsqubits erfordert nun 8k−68k-6 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) optimale section_size zu wählen, indem sie auf None gesetzt wird. Dann wird ein Wert gewählt, der versucht, die obere Schranke für die Anzahl der CX-Gatter zu minimieren, d. h. αlog⁡2(n)\alpha \log_2(n), wobei nn die Anzahl der Qubits und α≈0.56\alpha \approx 0.56 ist.

  • Die Funktion synth_clifford_bm() wurde nach Rust portiert. Es sei daran erinnert, dass diese Funktion optimal synthetisiert Clifford operatoren 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 von Clifford operatoren 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 wrap wurde zu den ProductFormula klassen 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_evolution für ProductFormula (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_manager

    anstatt den vollständigen Pfad eingeben zu müssen:

    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

    Die Funktion ist auch importierbar aus dem qiskit.transpiler modul als:

    from qiskit.transpiler import generate_preset_pass_manager
  • Es wurde eine neue Option für die Benutzerkonfigurationsdatei sabre_all_threads und eine entsprechende Umgebungsvariable QISKIT_SABRE_ALL_THREADS hinzugefügt. Wenn dieses Flag gesetzt ist, führen die voreingestellten Passmanager die SabreLayout und SabreSwap unter 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 weniger SwapGates.

    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 Split2QUnitaries der ü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, ConsolidateBlocks und Split2QUnitaries wurden in die init Stufe der voreingestellten Passmanager mit Optimierungsstufe 2 und Optimierungsstufe 3 aufgenommen. Die Änderung der init Stufe 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 Target die 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 SabreLayout transpiler-Durchlauf wurde aktualisiert, um immer einen zusätzlichen Versuch mit demselben Algorithmus durchzuführen wie DenseLayout um 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äßig SabreLayout beginnt immer noch mit layout_trials zufä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 dt wurde hinzugefügt zu generate_preset_pass_manager() hinzugefügt, um der Menge der Argumente von transpile(). Dies ermöglicht die interne Umwandlung von Transpilationsbedingungen in eine Target darstellung.

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 Option idle_wires der Schaltkreisschubladen einstellen QuantumCircuit.draw() und circuit_drawer(). Zum Beispiel, indem Sie einen Abschnitt auf ~/.qiskit/settings.conf hinzufü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_GATES hinzugefügt, die, wenn sie auf einen Wert von 1 (d.h. QISKIT_NO_CACHE_GATES=1) gesetzt wird verringert den Speicher-Overhead von a CircuitInstruction und DAGOpNode objekts um den Preis einer erhöhten Laufzeit bei Mehrfachzugriffen auf CircuitInstruction.operation und DAGOpNode.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 annotated Argument der Gate.control() methode ist nun standardmäßig None , 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 Operation instanzen von DAGOpNode.op die zurückgegeben werden, haben nicht mehr unbedingt einen gemeinsamen Verweis auf das zugrunde liegende Objekt. Dies war nie garantiert der Fall, und die Mutation der DAGOpNode.op direkt durch eine Referenz zu verändern, war unsolide und führte wahrscheinlich immer dazu, dass die interne Zustandsverfolgung des DAGs beschädigt wurde QuantumCircuit und DAGCircuit um Standard-Gates in Rust zu speichern, wird das Ausgabeobjekt von DAGOpNode.op nun 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.14159

    was 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 Operation instanzen von CircuitInstruction.operation die zurückgegeben werden, haben nicht mehr unbedingt einen gemeinsamen Verweis auf das zugrunde liegende Objekt. Dies war nie garantiert der Fall, und die Mutation der CircuitInstruction.operation direkt per Verweis zu ändern, war unsolide und konnte die Schaltung immer beschädigen, insbesondere wenn Parameter verwendet wurden. Aufgrund der internen Umstrukturierung des QuantumCircuit um Standard-Gates in Rust zu speichern, wird das Ausgabeobjekt von CircuitInstruction.operation nun 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.14

    was 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() und BitArray.slice_shots() gibt nun IndexError aus, wenn die Indizes außerhalb der Grenzen liegen. Sie haben in dem Fall ValueError aufgerufen.

  • BitArray.__getitem__() gibt nun IndexError aus, wenn die Indizes außerhalb der Grenzen liegen oder die Anzahl der Dimensionen der Indizes nicht mit der von BitArray. Sie haben in dem Fall ValueError aufgerufen.

Hinweise zum Upgrade der Synthese

  • LieTrotter und SuzukiTrotter die individuell entwickelten Pauli-Terme nicht mehr in Gatterdefinitionen verpacken. Wenn Sie sich auf eine bestimmte Zerlegungsebene Ihrer Schaltung verlassen, müssen Sie eine Ebene von QuantumCircuit.decompose() entfernen oder das Schlüsselwortargument wrap=True zu 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 2π⊗2−252\pi \otimes 2^{-25}.

  • Der Standard-Routing-Pass, der von der Optimierungsstufe 0 für generate_preset_pass_manager() und transpile() wurde geändert von StochasticSwap auf SabreSwap. Der SabreSwap fü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 als StochasticSwap. Für optimization_level=0 sollte 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_method für transpile() und generate_preset_pass_manager() auf "stochastic" verwenden, um den StochasticSwap übergeben.

  • Die Funktion generate_preset_pass_manager() funktion wurde so erweitert, dass sie, wenn möglich, Transpiler-Beschränkungen intern in eine Target instanz umzuwandeln. Wenn eine Backend-Eingabe vom Typ BackendV1 bereitgestellt wird, wird sie in BackendV2 konvertiert, um seine Target. 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

Veraltete Primitive

Anbieter-Deprecations

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, eine Qobj zu erstellen, was in BackendV2-basierten Arbeitsabläufen. Es wurde auch für die Bindung von Parametern verwendet, eine Funktionalität, die vollständig von QuantumCircuit.assign_parameters().

Veraltete Visualisierungen

  • Das Argument justify von circuit_drawer() oder QuantumCircuit.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. RXXGate oder RYGate fü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 ein AnnotatedOperation als 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 SGate und SdgGate geben nun korrekt a CSGate, 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 die QuantumCircuit.draw() methode keine Warnung auslöste, wenn ein ungültiger Wert an das justify Argument ü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() und Pauli.apply_layout() zu erhöhen QiskitError wenn doppelte Indizes oder negative Indizes als Teil eines Layouts bereitgestellt werden.

  • Es wurde ein Fehler im ConsolidateBlocks transpiler-Durchgang, wenn die Eingabeschaltung ein benutzerdefiniertes undurchsichtiges Gatter enthält und weder die Optionen basis_gates noch target gesetzt sind, löst der Durchgang eine QiskitError und 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 order der Funktion BitArray.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 der CXGates 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 StatevectorSampler der Gates mit c_if ignorierte. Es wird ein Fehler ausgegeben, weil Statevector nicht mit c_if umgehen kann.

  • Behebung eines Versehens im Commuting2qGateRouter transpiler-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 Eigenschaft layout des 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 symengine eingefü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 von section_size , die die Anzahl der Qubits nicht ohne Rest teilte, zu falschen Ergebnissen führen konnte. Nun synthetisiert jede section_size (höchstens gleich der Anzahl der Qubits) die richtige Schaltung. Für einen (heuristisch) optimalen Wert setzen Sie section_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() und qasm2.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 2π2\pi 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 von PauliEvolutionGate aus 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() und generate_preset_pass_manager() wurden behoben. Diese Unstimmigkeiten würden dazu führen, dass für dieselben Eingaben unterschiedliche Umsetzungsergebnisse erzielt werden, oder generate_preset_pass_manager() bei bestimmten Eingabekombinationen fehlschlagen, die von transpile().

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.