Skip to main content
IBM Quantum Platform

Qiskit 0.45 Versionshinweise

Diese Seite enthält die Versionshinweise für Qiskit 0.45, die erste Version, nachdem die alte "Elemente"-Struktur vollständig entfernt wurde. Für alle Versionshinweise, einschließlich derjenigen, die bis zur alten "Meta-Paket"-Struktur von Qiskit zurückreichen, siehe Versionshinweise. Eine Tabelle der Meta-Paket-Versionen finden Sie in den Qiskit 0.44 Release Notes.


0.45.3

Vorspiel

Qiskit 0.45.3 ist ein Punkt-Release ohne Code-Änderungen, außer dass es eine ImportError wenn es feststellt, dass es in einer ungültigen Umgebung mit Qiskit >= 1.0 installiert wurde.

Bitte lesen Sie unseren Migrationsleitfaden zum neuen Paket, um Hilfe zu Fehlern, zur Vorbereitung auf Qiskit 1.0 und weitere detaillierte Hintergrundinformationen zu erhalten.

Anmerkung

Qiskit 1.0 soll etwa zwei Wochen nach Qiskit 0.45.3 erscheinen, am 15. Februar 2024, und ist möglicherweise noch nicht verfügbar, wenn Sie diese Nachricht lesen. Diese Änderung wird proaktiv vorgenommen.

Die Paketstruktur von Qiskit ändert sich in Qiskit 1.0, und leider können die geänderten Anforderungen nicht vollständig an pip weitergegeben werden, insbesondere wenn pip install --upgrade Befehle ausgeführt werden, nachdem die Umgebung ursprünglich konfiguriert wurde. Alle Versionen von Qiskit vor 1.0 (einschließlich dieser) haben einen Installationskonflikt mit Qiskit 1.0, den pip nicht beheben kann.

Wenn import qiskit eine ImportError auslöst, befindet sich Ihre Umgebung in einem ungültigen Zustand, und die Versionen von Qiskit 0.45/0.46 und 1.0 sind beide erreichbar, was zu leicht fehlerhaftem Code führen wird. Sie müssen eine neue virtuelle Umgebung erstellen und sicherstellen, dass nur eine der beiden Versionen installiert ist. Insbesondere wenn Sie Qiskit 1.0 installieren möchten, dürfen Sie keine Pakete installieren, die von qiskit-terra abhängen; diese Pakete sind mit Qiskit 1.0 nicht kompatibel und müssen aktualisiert werden. Wenn Sie beabsichtigen, Qiskit 0.45 oder 0.46 zu installieren, müssen Sie sicherstellen, dass Sie nicht versuchen, qiskit>=1.0 zu installieren.

Wenn Sie eine Bibliothek entwickeln, die auf Qiskit basiert und Sie immer noch eine Abhängigkeit von qiskit-terra haben, sollten Sie dringend ein neues Paket veröffentlichen, das nur von qiskit abhängt. Seit der Version 0.44 enthält das qiskit -Paket nur noch den qiskit-terra -Compilerkern (die Komponente, die jetzt einfach "Qiskit" genannt wird). Wenn also Ihre Mindestversion 0.44 ist, können Sie eine qiskit-terra>=0.44 -Abhängigkeit sicher auf qiskit>=0.44 umstellen, ohne dass sich etwas an der Installation ändert. Weitere Einzelheiten und Empfehlungen für Tests und Vorbereitungen finden Sie im Abschnitt für Entwickler im Migrationsleitfaden.


0.45.2

Vorspiel

Qiskit 0.45.2 ist ein kleines Patch-Release, das einige Fehler aus der 0.45 Release-Serie behebt.

Fehlerkorrekturen

  • Aufruf von copy() oder copy_empty_like() auf einer BlueprintCircuit wird nun korrekt die global_phase auf die Kopie übertragen. Zuvor war die globale Phase nach dem Kopieren immer gleich Null.

  • QPY (mit qpy.dump() und qpy.load()) serialisiert und deserialisiert nun korrekt Quantenschaltungen mit Clifford-Operatoren (Clifford).

  • Ein Problem in der mpl Schaltkreisschublade wurde behoben, bei dem der Text über das Ende des Feldes für eine SwitchCaseOp über das Ende des Feldes hinaus gedruckt wurde, wenn der Standardfall leer war.

  • Die Übertragung von Qubit-Argumenten von QuantumCircuit.delay() erzeugt nun korrekt einzelne Delay anweisungen für jedes Qubit, wie beabsichtigt. Zuvor wurde bei bestimmten Iterabilien (z. B sets) eine ungültige Schaltung erzeugt, die an ungewöhnlichen Stellen fehlschlagen konnte.

  • Ein Fehler wurde behoben, der zu einer Fehlermeldung führte, wenn ein Benutzer versuchte, die Kalibrierungsdaten eines Gatters in Target in einer bestimmten Situation zu laden. Dies tritt auf, wenn das Backend nur teilweise Kalibrierungsdaten meldet, z. B. wenn in einer Befehlsdefinition auf einen Wellenformimpuls verwiesen wird, dieser Wellenformimpuls aber nicht in der Impulsbibliothek enthalten ist. In diesem Fall kann das Qiskit-Impulsobjekt nicht erstellt werden, was dazu führt, dass der Impulsplan für die Kalibrierung nicht erstellt werden kann. Wenn nun die Kalibrierungsdaten unvollständig sind, wird Target behandelt dies so, als ob überhaupt keine Kalibrierung gemeldet würde, und löst keine Ausnahme aus.

  • Es wurde ein Problem mit dem Optimize1qGatesDecomposition transpiler-Durchgang behoben, bei dem möglicherweise ein einzelnes ideales (d. h. die Fehlerrate ist 0.0) Gatter resynthetisiert wurde, das in der Target. Dies wurde nun korrigiert, so dass der Pass Optimize1qGatesDecomposition auf das Gatter des Schaltkreises verschoben wird, wenn die Fehlerrate (einschließlich der Anzahl der Gatter) gleich ist. Behoben #10568

  • Es wurde ein Problem mit dem OptimizeSwapBeforeMeasure Pass behoben, bei dem Schaltungen mit Swap- und Measure-Anweisungen falsch optimiert wurden. Dieser Commit behebt den Fehler durch Änderung von DAGCircuit.successors() zu DAGCircuit.descendants(). Außerdem habe ich ein paar zusätzliche Tests hinzugefügt, um sicherzustellen, dass der Fehler behoben ist. Zum Beispiel:

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import OptimizeSwapBeforeMeasure
    pass_ = OptimizeSwapBeforeMeasure()
    qc = QuantumCircuit(2, 1)
    qc.swap(0, 1)
    qc.measure(0, 0)
    qc.measure(0, 0)
    print(qc.draw())
    print(pass_(qc).draw())

    vorher drucken würde:

            ┌─┐┌─┐
    q_0: ─X─┤M├┤M├
          │ └╥┘└╥┘
    q_1: ─X──╫──╫─
             ║  ║
    c: 1/════╩══╩═
             0  0
         ┌─┐
    q_0: ┤M├───
         └╥┘┌─┐
    q_1: ─╫─┤M├
          ║ └╥┘
    c: 1/═╩══╩═
          0  0

    und nun ist der zweite Kreislauf korrekt optimiert auf:

    q_0: ──────
         ┌─┐┌─┐
    q_1: ┤M├┤M├
         └╥┘└╥┘
    c: 1/═╩══╩═
          0  0
  • Behebung eines Fehlers in der StabilizerState string-Darstellung.


0.45.1

Vorspiel

Qiskit Terra 0.45.1 ist ein kleines Patch-Release, das einige Fehler aus der 0.45 Release-Serie behebt. Es ist auch die erste Version mit offizieller Unterstützung für Python 3.12. Die Version 0.45.1 unterstützt Python 3.8, 3.9, 3.10, 3.11, und 3.12.

Neue Funktionen

  • Unterstützung für die Verwendung von Qiskit mit Python 3.12 wurde hinzugefügt. Ab dieser Version unterstützt Qiskit den Betrieb mit den Python Versionen 3.8, 3.9, 3.10, 3.11 und 3.12.

Fehlerkorrekturen

  • QuantumCircuit.barrier() erzeugt nun eine korrekte Ausgabe, wenn es eine set als eine seiner Eingaben. Zuvor wurde eine ungültige Operation an den Schaltkreis angehängt, obwohl dies in der Praxis in der Regel keine erkennbaren Probleme verursacht. Behoben #11208

  • Die Eigenschaft Instruction.condition_bits wird nun korrekt mit klassischen Ausdrücken zur Laufzeit (qiskit.circuit.classical).

  • Behebung der hash() von Qiskit Pulse Channel Objekten (wie z.B DriveChannel) in Fällen, in denen der Kanal von einem Python Prozess zu einem anderen übertragen wurde, der einen anderen Hash-Seed verwendete.

  • Konditionierte benutzerdefinierte Tore, die von OpenQASM 2 importiert wurden, behalten nun ihre Bedingungen korrekt bei, wenn sie eingelegt und tief kopiert werden. Bisher verlor jedes bedingte benutzerdefinierte Tor (definiert durch eine gate Anweisung in einer OpenQASM 2 Datei) seine Bedingung, wenn es kopiert oder eingefügt wurde.

  • Korrigierte QPY-Deserialisierung der StatePreparation und Initialize schaltkreisanweisungen mit String- und Integer-Parametern (im Gegensatz zu einem expliziten Zustandsvektor, der bereits funktionierte). Behoben #11158.

  • Es wurde ein Fehler in SabreLayout behoben, bei dem es nicht möglich war, die Registerinformationen in das Layout objekt, das für TranspileLayout.initial_layout. Dies betraf die Visualisierung von Schaltkreisen mit QuantumCircuit.draw() und circuit_drawer() nach der Transpilierung, die eine virtuelle Qubit-Beschriftung der Form Qubit[QuantumRegister(6, 'q', 0)] anstelle der erwarteten virtuellen Qubit-Beschriftung unter Verwendung des Registernamens (z.B. q0) anzeigt. Behoben #11038

  • Es wurde ein Problem mit qpy.dump() behoben, das dazu führte, dass die Funktion möglicherweise den Wert von use_symengine beim Serialisieren eines ScheduleBlock objekts. Dies würde dazu führen, dass ein ungültiger QPY-Payload generiert wird, da er angibt, dass er symengine für symbolische Ausdrücke verwendet, aber tatsächlich sympy serialisierte Daten enthält.

  • Ein Fehler wurde behoben, der dazu führte, dass UnitaryOverlap bei der Initialisierung einen Fehler verursachte, wenn ein Eingangsschaltkreis eine Barriere enthielt.


0.45.0

Vorspiel

Qiskit 0.45.0 ist die letzte Funktionsversion vor 1.0. Sie bereitet den Boden für die API-Änderungen vor, die wir für unsere erste große Version planen, einschließlich der Entfernung zahlreicher veralteter Funktionen sowie einer Reihe neuer Verwerfungen.

Anmerkung

Wenn Ihr Projekt von Qiskit abhängt, kann es auf Funktionen angewiesen sein, die in Qiskit 1.0 nicht mehr unterstützt werden. Aus diesem Grund empfehlen wir Ihnen, Ihre unterstützte Version proaktiv auf <1.0 zu begrenzen.

Einige der wichtigsten Funktionen von Qiskit 0.45.0 sind:

  • Ab dieser Version sind alle unparametrisierten Gatter in der Qiskit-Standardschaltungsbibliothek nun Singletons. Standardmäßig teilen sich diese Gatter eine einzige Instanz im Speicher, so dass, sobald ein Gatter eines bestimmten Typs, sagen wir XGateinstanziiert ist, werden alle nachfolgenden Instanzen von XGate eine Referenz auf die erste Instanz sein. Dies führt zu einer geringeren Speichernutzung und einem geringeren Konstruktionsaufwand bei der Verwendung mehrerer Gatter desselben Typs in einer Schaltung. Um diese Funktion zu realisieren, wurden neue Basisklassen eingeführt: SingletonInstruction und SingletonGate. Weitere Einzelheiten finden Sie in den Funktionshinweisen.
  • Wir haben eine neue generische Passmanager-Schnittstelle hinzugefügt, die sich im neuen qiskit.passmanager modul zu finden ist. Dabei handelt es sich um eine Verallgemeinerung des Pass-Managers, der für die Erstellung des Qiskit-Transpilers verwendet wurde, und es wird ein generischer Rahmen eingeführt, der es den Benutzern ermöglicht, neue Pass-Manager zu erstellen, die verschiedene Zwischenrepräsentationen (IRs) verwenden. Das Modul umfasst eine generische Passmanager-Basisklasse, Ablaufsteuerungen und die notwendige Infrastruktur zur Verwaltung der Ausführung von Passmanager-Aufgaben. Die neue Schnittstelle wurde verwendet, um den bestehenden Passmanager im qiskit.transpiler modul umgestaltet, wobei technische Mängel im Code beseitigt und die Benutzerfreundlichkeit und Leistung verbessert wurden. Weitere Einzelheiten finden Sie in den Funktions- und Aktualisierungshinweisen.
  • 0.45.0 ermöglicht es den Benutzern, besser mit den vom Transpiler durchgeführten Layout-Permutationen zu interagieren. Die Daten, die in der Klasse TranspileLayout klasse enthaltenen Daten sind nun durch eine Reihe neuer Methoden und Attribute leichter zugänglich. Und eine neue SparsePauliOp.apply_layout() methode ermöglicht die Anwendung einer bestimmten Layout-Permutation auf eine SparsePauliOp observable anzuwenden, die für eine Eingangsschaltung des Transpilers erstellt wurde. Weitere Einzelheiten finden Sie in den Funktionshinweisen.
  • Schließlich haben wir annotierte Operationen mit der neuen AnnotatedOperation klasse eingeführt, die es ermöglicht, komplexe Schaltkreisanweisungen als Basisanweisung mit einer Reihe von Modifikatoren zu formulieren. Anstelle eines bestimmten Operationstyps, der die kontrollierte Umkehrung von a RXGateimplementiert, können wir nun eine annotierte RXGate mit inversen und kontrollierten Attributen verwenden. Weitere Einzelheiten finden Sie in den Funktionshinweisen.

Schaltkreise Funktionen

  • Hinzufügen einer neuen Klasse AnnotatedOperation hinzugefügt, die eine Unterklasse von Operation ist und eine "Basisoperation" darstellt, die durch eine Liste von "Modifikatoren" verändert wird. Die Basisoperation ist vom Typ Operation und die derzeit unterstützten Modifikatoren sind vom Typ InverseModifier, ControlModifier und PowerModifier. Die Modifikatoren werden in der Reihenfolge angewendet, in der sie in der Liste erscheinen.

    Beispiel:

    gate = AnnotatedOperation(
      base_op=SGate(),
      modifiers=[
          InverseModifier(),
          ControlModifier(1),
          InverseModifier(),
          PowerModifier(2),
      ],
    )

    ist logisch äquivalent zu gate = SGate().inverse().control(1).inverse().power(2), oder zu:

    gate = AnnotatedOperation(
      AnnotatedOperation(SGate(), [InverseModifier(), ControlModifier(1)]),
      [InverseModifier(), PowerModifier(2)],
    )

    Diese Äquivalenz ist jedoch nur logisch, die internen Darstellungen sind sehr unterschiedlich.

    Der Einfachheit halber kann ein einzelner Modifikator auch direkt übergeben werden, so ist AnnotatedGate(SGate(), [ControlModifier(1)]) äquivalent zu AnnotatedGate(SGate(), ControlModifier(1)).

    Eine kommentierte Operation zeichnet sich dadurch aus, dass die Schaltkreisdefinition nicht bei der Deklaration der Operation erstellt wird, sondern erst während der Transpilierung, insbesondere während des HighLevelSynthesis transpiler-Durchlaufs.

    Eine kommentierte Operation kann auch als ein "übergeordnetes" oder "abstrakteres" Objekt betrachtet werden, das zu einem Quantenschaltkreis hinzugefügt werden kann. Dies ermöglicht das Schreiben von Transpiler-Optimierungspässen, die diese übergeordnete Darstellung nutzen, z. B. das Entfernen eines Gatters, auf das unmittelbar sein Inverses folgt (beachten Sie, dass diese Reduzierung möglicherweise nicht möglich ist, wenn sowohl das Gatter als auch sein Inverses zunächst in einfachere Gatter synthetisiert werden).

    In gewissem Sinne kann eine kommentierte Operation als eine Erweiterung von ControlledGateangesehen werden, die es auch ermöglicht, die Kontrolle über die Basisoperation zu erweitern. Für die Zukunft planen wir den Austausch von ControlledGate durch AnnotatedOperation. Ähnlich wie bei kontrollierten Gattern synthetisiert der Transpiler kommentierte Operationen, bevor das Layout/Routing stattfindet.

    Ab sofort können die kommentierten Operationen nur auf der obersten Ebene eines Quantenschaltkreises erscheinen, d.h. sie können nicht innerhalb des rekursiv definierten definition Schaltkreises erscheinen. Wir planen, diese Einschränkung später aufzuheben.

  • Eine neue Option max_num_qubits wurde zu qiskit.circuit.CommutationChecker.commute() hinzugefügt, die die maximale Anzahl von Qubits angibt, die für die teurere, auf Matrixmultiplikation basierende Kommutativitätsprüfung berücksichtigt werden sollen. Dadurch wird vermieden, dass intern Arrays der Größe 2N×2N2^N \times 2^N zugewiesen werden müssen. Einfachere Versionen der Kommutativitätsprüfung (z. B. zwei Quantenoperationen sind kommutativ, wenn sie über disjunkte Mengen von Qubits laufen) funktionieren auch ohne diese Begrenzung.

  • Ein neues Argument, check_input, wurde dem Konstruktor für die UnitaryGate klasse. Dieses Flag wird verwendet, um die Standardinitialisierungsprüfung zu deaktivieren, dass das Eingabeobjekt eine unitäre Matrix darstellt. Dies kann verwendet werden, um die Erstellung von UnitaryGate objekten zu beschleunigen, wenn Sie wissen, dass die Eingabe bereits eine unitäre Matrix ist. Diese neue Option sollte nur in diesen Fällen verwendet werden, denn wenn sie auf False gesetzt wird und die Eingabe nicht einheitlich ist, führt dies zu einem ungültigen UnitaryGate Objekt.

  • Eine neue Methode Parameter.assign() wurde hinzugefügt. Diese Methode dient in erster Linie als schneller Weg zur Verbesserung der Leistung von QuantumCircuit.assign_parameters() für den häufigen Fall von Schaltungen, die überwiegend "Ausdrücke" enthalten, die eigentlich nur einzelne, später zuzuweisende Parameter sind.

  • Die Leistung von QuantumCircuit.assign_parameters() bei der Zuweisung eines einzelnen Parameters einer Schaltung, die viele Parameter umfasst, wurde verbessert.

  • Einführung von zwei neuen Klassen, SingletonInstruction und SingletonGate, die Unterklassen von Instruction und Gate sind, die eine einzige Instanz für alle Objekte dieses Typs verwenden. Die Absicht hinter dieser Klasse ist es, den Speicher- und Konstruktionsaufwand bei der Verwendung mehrerer Gatter in einer Schaltung zu minimieren, wobei der Kompromiss darin besteht, einen globalen gemeinsamen Zustand zu haben. Aus diesem Grund ist diese Klasse nur auf Gatter anwendbar, die keinen eindeutigen und/oder veränderbaren Zustand in einer Instanz gespeichert haben. Das beste Beispiel dafür ist XGate enthält keinen Zustand und könnte SingletonGate verwenden (und tut dies ab dieser Version), während RXGate einen Winkelparameter in einer Instanz speichert und daher nicht SingletonGate nicht verwenden kann, weil eine einzige gemeinsam genutzte globale Instanz die Parameterwerte nicht darstellen kann.

    Ein weiteres potenzielles Problem, das bei der Verwendung von Singleton-Klassen beachtet werden muss, ist, dass das Instruction datenmodell einige veränderbare Zustände unterstützt. Genauer gesagt, die label, duration, unit, und condition attribute sind alle zugänglich und veränderbar in der Instruction und ihren direkten Unterklassen. Dies ist jedoch unvereinbar mit der Verwendung eines gemeinsamen Objekts über SingletonInstruction. Für Instanzen von SingletonInstructionist es nicht erlaubt, diese Attribute direkt zu setzen, und es wird eine Ausnahme ausgelöst. Wenn sie für eine bestimmte Instanz benötigt werden, müssen Sie sicherstellen, dass Sie eine veränderbare Instanz haben, indem Sie Instruction.to_mutable() (oder verwenden Sie Instruction.c_if() für condition). label, duration und unit können auch als Schlüsselwortargumente bei der Klassenkonstruktion angegeben werden.

  • Die folgenden Standardbibliotheks-Gates sind nun Instanzen von SingletonGate:

    Das bedeutet, dass, wenn diese Klassen instanziiert werden als (z.B.) XGate() alle Konstruktorvorgaben verwenden, teilen sie sich alle eine einzige globale Instanz. Dies führt zu einer starken Verringerung des Speicher-Overheads für > 1 Objekt dieser Typen und zu einer erheblich schnelleren Objektkonstruktionszeit.

  • Einführung einer neuen Klasse SingletonControlledGate eingeführt, die eine Unterklasse von ControlledGate ist, die eine einzige Instanz für alle Objekte dieses Typs verwendet. Die Absicht hinter dieser Klasse ist es, den Speicher- und Konstruktionsaufwand bei der Verwendung mehrerer Gatter in einer Schaltung zu minimieren, und zwar mit dem Kompromiss, einen globalen gemeinsamen Zustand zu haben. Aus diesem Grund ist diese Klasse nur auf Gatter anwendbar, die keinen eindeutigen und/oder veränderbaren Zustand in einer Instanz gespeichert haben. Zum Beispiel enthält ein CXGate enthält keinen Zustand und kann daher SingletonControlledGate verwenden (und tut dies ab dieser Version). Im Gegensatz dazu, CRXGate einen Winkelparameter als Teil seiner Instanzdaten und kann daher nicht mit SingletonControlledGate.

    Ein weiteres potenzielles Problem, das bei der Verwendung von SingletonControlledGate ist, dass das ursprüngliche Datenmodell von ControlledGate die Mutation unterstützt. Genauer gesagt, die label, duration, unit, condition, und ctrl_state attribute sind alle zugänglich und veränderbar in der ControlledGatezugreifen, aber die Mutation dieser Attribute in SingletonControlledGate unterklassen ist nicht erlaubt und löst eine Ausnahme aus. Diese Attribute können angepasst werden, aber nur zum Zeitpunkt der Erstellung (d.h. über den Konstruktor). In diesem Fall ist das neu konstruierte Tor eine separate Instanz mit dem benutzerdefinierten Zustand anstelle der global freigegebenen Instanz. Sie können auch die Methode SingletonControlledGate.to_mutable() verwenden, um eine veränderbare Kopie eines Gate-Objekts zu erhalten und dann die Attribute wie bei jedem anderen Objekt zu verändern Instruction objekt.

  • Die folgenden Standardbibliotheks-Gates sind nun Instanzen von SingletonControlledGate:

    Das bedeutet, dass, wenn nicht label, condition, duration, unit oder ctrl_state bei der Erstellung der Instanz gesetzt werden, sie alle eine einzige globale Instanz teilen, wenn ein neues Gate-Objekt erstellt wird. Dies führt zu einer erheblichen Verringerung des Speicheraufwands für > 1 Objekt dieser Typen.

  • Hinzufügen einer neuen Methode Instruction.to_mutable() und Attribut Instruction.mutable die verwendet werden, um eine veränderbare Kopie zu erhalten und zu prüfen, ob ein Instruction objekt veränderbar ist. Mit der Einführung von SingletonGate können diese Methoden verwendet werden, um eine einheitliche Schnittstelle für den Umgang mit der Veränderlichkeit von Instruktionsobjekten zu schaffen.

  • Ein Attribut hinzugefügt Instruction.base_classhinzugefügt, das den "Basistyp" einer Anweisung ermittelt. Viele Instruktionen werden type(obj) == obj.base_class erfüllen, aber die Singleton-Instanzen von SingletonInstruction und SingletonGate sind Unterklassen ihres Basistyps. Sie können das Attribut new base_class attribut verwenden, um die Basisklasse zu finden. In der Attributdokumentation finden Sie Überlegungen dazu, wann andere Unterklassen ihre base_classändern dürfen und was dies für die Ausführung bedeutet.

  • Hinzufügen der UnitaryOverlap schaltung zur Qiskit-Schaltungsbibliothek hinzugefügt. Sie kann verwendet werden, um die Treue von Zuständen zu berechnen, die von Unitaries erzeugt werden, indem man die Wahrscheinlichkeit der Ausgangsverteilung im All-Zero-Zustand betrachtet oder, äquivalent, indem man den Erwartungswert des Projektors auf den All-Zero-Zustand berechnet. Dies ist nützlich für Anwendungen wie das maschinelle Lernen und die Berechnung angeregter Zustände in der Quantenchemie, um nur einige zu nennen.

Puls-Funktionen

  • Aktivierte Schaltkreis-zu-Impuls-Planung mit BackendV2.

    # import a fake backend which is a sub-class of BackendV2
    from qiskit.providers.fake_provider import FakePerth
    from qiskit.compiler.scheduler import schedule
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(1, 1)
    qc.x(0)
    qc.measure(0,0)
    sched = schedule(circuits=qc, backend=FakePerth())

    Da BackendV2 nicht von der Funktion schedule() funktion nicht unterstützt wurde, führte dies dazu, dass die Methode schedule() fehlschlug, wenn das Argument backend mit einer Instanz von BackendV2. Siehe #10837 für weitere Informationen.

OpenQASM Funktionen

  • Das Modul OpenQASM 2 qiskit.qasm2 hat die Exportfunktionen dump() und dumps(). Diese werden in ähnlicher Weise verwendet wie die vorherigen QuantumCircuit.qasm():

    from qiskit import qasm2, QuantumCircuit
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure([0, 1], [0, 1])
    print(qasm2.dumps(qc))

    Die neuen Funktionen stammen aus demselben Code wie QuantumCircuit.qasm()die nach und nach abgeschafft und durch die neuen Pfade ersetzt werden, um eine kohärentere Schnittstelle im Vergleich zu OpenQASM 3 (qiskit.qasm3) und QPY (qiskit.qpy) Modulen zu bieten. Dies ist besonders wichtig, da der Name der Methode qasm() keinen Hinweis auf die Version von OpenQASM gibt und Qiskit seit seiner ursprünglichen Hinzufügung mehrere Serialisierungsmodule erhalten hat, die leicht verwechselt werden könnten.

QPY-Funktionen

  • QPY unterstützt nun die Verwendung der symengine-nativen Serialisierung und Deserialisierung für Objekte vom Typ ParameterExpression sowie symbolische Ausdrücke in Pulse Schedule Blöcken. Dies ist eine schnellere Alternative zur Serialisierung, wird aber nicht von allen Plattformen unterstützt. Bitte überprüfen Sie, ob Ihre Zielplattform von der symengine-Bibliothek unterstützt wird, bevor Sie diese Option setzen, da sie von qpy zur Deserialisierung der Nutzdaten benötigt wird.

    Die Funktion kann über den Parameter use_symengine in qpy.dump() aktiviert werden:

    from qiskit.circuit import QuantumCircuit, Parameter
    from qiskit import qpy
    
    theta = Parameter("theta")
    phi = Parameter("phi")
    sum_param = theta + phi
    
    qc = QuantumCircuit(1)
    qc.rz(sum_param, 0)
    qc.measure_all()
    
    with open('bell.qpy', 'wb') as fd:
        qpy.dump(qc, fd, use_symengine=True)
    
    with open('bell.qpy', 'rb') as fd:
        new_qc = qpy.load(fd)[0]

Quanteninformationsmerkmale

  • Hinzugefügt Clifford.from_linear_function() und Clifford.from_permutation() methoden, die ein Clifford objekt aus LinearFunction und von PermutationGate erstellen. Infolgedessen kann a Clifford kann nun direkt aus a konstruiert werden LinearFunction, a PermutationGateoder einer Quantenschaltung mit solchen Gattern konstruiert werden.

  • Die Operator klasse hat jetzt eine draw() methode, mit der sie als Textmatrix, IPython LaTeX Objekt oder LaTeX Quelle angezeigt werden kann. Die Standard-Zeichenart ist immer noch der ASCII __repr__ des Operators.

  • Eine neue Methode wurde hinzugefügt, apply_layout()zu der SparsePauliOp klasse. Diese Methode wird verwendet, um ein TranspileLayout layout aus dem Transpiler auf eine SparsePauliOp observable anzuwenden, das für eine Eingangsschaltung des Transpilers erstellt wurde. Dies ermöglicht die Arbeit mit BaseEstimator implementierungen und lokalen Umsetzungen einfacher. Zum Beispiel:

    from qiskit.circuit.library import RealAmplitudes
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.primitives import BackendEstimator
    from qiskit.compiler import transpile
    from qiskit.providers.fake_provider import FakeNairobiV2
    
    psi = RealAmplitudes(num_qubits=2, reps=2)
    H1 = SparsePauliOp.from_list([("II", 1), ("IZ", 2), ("XI", 3)])
    backend = FakeNairobiV2()
    estimator = BackendEstimator(backend=backend, skip_transpilation=True)
    
    thetas = [0, 1, 1, 2, 3, 5]
    transpiled_psi = transpile(psi, backend, optimization_level=3)
    permuted_op = H1.apply_layout(transpiled_psi.layout)
    res = estimator.run(transpiled_psi, permuted_op, thetas)

    wo eine Eingangsschaltung lokal umgesetzt wird, bevor sie an run weitergegeben wird. Durch die Transpilierung wird die ursprüngliche Schaltung von 2 auf 7 Qubits (die Größe von backend) erweitert und ihr Layout permutiert, das dann auf H1 angewendet wird, indem apply_layout() angewendet wird, um die Transformationen widerzuspiegeln, die von transpile().

Transpiler-Funktionen

  • Die Klasse HighLevelSynthesis klasse wird erweitert, um Schaltungen mit Objekten des Typs AnnotatedOperation.

  • Ein neues qiskit.passmanager modul wurde der Qiskit-Bibliothek hinzugefügt. Dieses Modul implementiert einen generischen Passmanager und Ablaufsteuerungen und bietet eine Infrastruktur zur Verwaltung der Ausführung von Passmanageraufgaben. Das Modul bietet Basisklassen für Übergänge (GenericPass) und Ablaufsteuerungen (BaseController) sowie eine neue Schnittstellenklasse, passmanager.Task, zur Verwaltung der Ausführung des Passmanagers (siehe die Methode Task.execute() ). Diese neuen Klassen folgen dem zusammengesetzten Muster, da Ablaufsteuerungen Sammlungen von Durchläufen sind und eine Steuerung rekursiv in die Task-Pipeline verschachtelt werden kann. Es ist auch zu beachten, dass die Basisklassen die Typen der Eingabe- und Ausgabeobjekte nicht kennen und dass sie für einen bestimmten Programmtyp untergeordnet werden müssen, um ihn zu optimieren. Dieses vereinheitlichte Design reduziert die Komplexität des herkömmlichen Pass-Managers und erfordert nicht mehr die Verwendung von Klassen wie RunningPassManager , um die Ausführungslogik und die Renormalisierung der Aufgabenstruktur zu handhaben. Das qiskit.transpiler modul wurde reorganisiert, um die vorhandenen Passmanager auf der Grundlage des generischen Passmanagers neu zu erstellen. Weitere Einzelheiten finden Sie in den Upgrade-Hinweisen.

  • Hinzufügen einer neuen Analyse SabrePreLayout durchgang hinzugefügt, der ein Startlayout für SabreLayouterstellt und das Layout in den Eigenschaftssatzwert sabre_starting_layouts schreibt.

    Der Durchlauf funktioniert, indem die Kopplungskarte mit immer mehr "zusätzlichen" Kanten erweitert wird, bis VF2Layout eine perfekte Graphenisomorphie gefunden wird. Genauer gesagt enthält die erweiterte Kopplungskarte Kanten zwischen Knoten, die in der ursprünglichen Kopplungskarte innerhalb eines bestimmten Abstands d liegen, und der Wert von d wird erhöht, bis eine Isomorphie gefunden wird. Der Durchlauf minimiert optional auch die Anzahl der zusätzlichen Kanten, die am Layout beteiligt sind, bis ein lokales Minimum gefunden ist. Dies beinhaltet das Entfernen zusätzlicher Kanten und den Aufruf von VF2Layout um zu prüfen, ob noch eine Isomorphie besteht.

    Hier ist ein Beispiel für den Aufruf der SabrePreLayout vor SabreLayout:

    import math
    from qiskit.transpiler import CouplingMap, PassManager
    from qiskit.circuit.library import EfficientSU2
    from qiskit.transpiler.passes import SabrePreLayout, SabreLayout
    
    qc = EfficientSU2(16, entanglement='circular', reps=6, flatten=True)
    qc.assign_parameters([math.pi / 2] * len(qc.parameters), inplace=True)
    qc.measure_all()
    
    coupling_map = CouplingMap.from_heavy_hex(7)
    
    pm = PassManager(
        [
            SabrePreLayout(coupling_map=coupling_map),
            SabreLayout(coupling_map),
        ]
    )
    
    pm.run(qc)
  • Hinzufügen der Argumente coupling_map, target und use_qubit_indices zum HighLevelSynthesis transpiler-Pass. Das Argument target spezifiziert das Ziel-Backend, so dass die Synthese-Plugins, die innerhalb des Passes aufgerufen werden, auf alle zielspezifischen Informationen zugreifen können, wie z. B. die Kopplungskarte und den unterstützten Gattersatz. Das Argument coupling_map gibt nur die Kopplungskarte an und wird nur verwendet, wenn target nicht angegeben ist. Das Argument use_qubit_indices gibt an, ob der High-Level-Synthese-Durchlauf vor oder nach dem Setzen des Layouts erfolgt, d. h. ob die Qubit-Indizes der Higher-Level-Objekte den Qubit-Indizes auf dem Ziel-Backend entsprechen.

  • Die Argumente coupling_map, target und qubits wurden zu HighLevelSynthesisPlugin. Das Positionsargument target gibt das Ziel-Backend an, so dass das Plugin auf alle zielspezifischen Informationen zugreifen kann, wie z. B. die Kopplungskarte, den unterstützten Gattersatz und so weiter. Das Positionsargument coupling_map gibt nur die Kopplungskarte an und wird nur verwendet, wenn target nicht angegeben ist. Das Positionsargument qubits gibt die Liste der Qubits an, über die das Higher-Level-Objekt definiert wird, falls die Synthese auf der physikalischen Schaltung erfolgt. Der Wert von None zeigt an, dass das Layout noch nicht ausgewählt wurde.

    Dies ermöglicht eine saubere Trennung der Optionen für Synthese-Plugins in allgemeine Schnittstellenoptionen für Plugins (d. h. coupling_map, target und qubits) und in Plugin-spezifische Optionen (ein freies Konfigurationswörterbuch, das über options spezifiziert wird). Es sei darauf hingewiesen, dass diese Änderung rückwärtskompatibel ist. Wenn die Optionen coupling_map usw. nicht ausdrücklich zur Methode run() des Plugins hinzugefügt werden, erscheinen sie als Teil von options.

  • Die DAGCircuit methoden apply_operation_back() und apply_operation_front() haben das Schlüsselwortargument check erhalten, das auf False gesetzt werden kann, um die Überprüfung zu überspringen, ob die Eingaben die DAGCircuit datenstruktur-Invarianten erfüllen. Dies ist nützlich, um die Leistung zu optimieren, wenn die DAG aus bekannten guten Daten aufgebaut wird, z. B. bei Transpiler-Durchläufen.

  • Die Methode CouplingMap.reduce() akzeptiert jetzt ein zusätzliches Argument check_if_connected, das standardmäßig True lautet. Dies entspricht dem bisherigen Verhalten, bei dem geprüft wird, ob die reduzierte Kopplungskarte verbunden bleibt, und wenn nicht, eine CouplingError erstellt wird. Bei der Einstellung False wird die Prüfung übersprungen, so dass unverbundene reduzierte Kupplungskennfelder möglich sind.

  • Der Konstruktor für HighLevelSynthesis transpiler pass akzeptiert jetzt zusätzliche Argumente equivalence_library, basis_gates und min_qubits. Der Durchgang kann nun benutzerdefinierte Definitionen ähnlich abrollen wie UnrollCustomDefinitionsabrollen und fasst damit die Funktionalität des letzteren Passes vollständig zusammen. Insbesondere, HighLevelSynthesis ist jetzt rekursiv, wodurch ein Versehen in der ursprünglichen Implementierung behoben wurde. Wenn also entweder target oder basis_gates spezifiziert wird, werden HighLevelSynthesis rekursiv alle High-Level-Objekte, kommentierten Operationen und benutzerdefinierten Gatter in der Schaltung synthetisiert, wobei nur Gatter übrig bleiben, die vom Ziel unterstützt werden oder zur Äquivalenzbibliothek gehören. Dies ermöglicht die Verwendung HighLevelSynthesis als Drop-in-Ersatz für UnrollCustomDefinitions. Wenn hingegen weder target noch basis_gates angegeben sind, synthetisiert der Durchlauf nur die "Top-Level" High-Level-Objekte und kommentierten Operationen, d.h. er steigt nicht rekursiv in das Feld für benutzerdefinierte Gatter definition ab. Dies ist rückwärtskompatibel sowohl mit UnrollCustomDefinitions (die nichts tun würde) als auch mit dem älteren Verhalten des High-Level-Synthese-Passes, der es erlaubt, ihn als Zwischentransformation zu verwenden und nur High-Level-Objekte zu synthetisieren, wie sie von HLSConfig spezifiziert werden.

  • Erhebliche Verbesserung der Leistung des MergeAdjacentBarriers transpiler-Durchlaufs, bei dem die gesamte DAG neu aufgebaut wurde, um die Barrieren zusammenzuführen.

  • Ein neues Schlüsselwortargument, min_qubits, wurde dem Konstruktor des BasisTranslator transpiler-Passes. Bei einem Wert ungleich Null wird damit eine Mindestanzahl von Qubits für die Filterung von Operationen festgelegt, die in der Schaltung zu übersetzen sind. Wenn zum Beispiel min_qubits=3 gesetzt ist, wird die BasisTranslator instanz nur Gatter in der Schaltung übersetzen, die mit 3 oder mehr Qubits arbeiten.

  • Ein neues Schlüsselwortargument, min_qubits, wurde dem Konstruktor des UnrollCustomDefinitions transpiler-Passes. Bei einem Wert ungleich Null wird damit eine Mindestanzahl von Qubits für die Filterung von Operationen festgelegt, die in der Schaltung zu übersetzen sind. Wenn zum Beispiel min_qubits=3 gesetzt ist, wird die UnrollCustomDefinitions instanz nur Gatter in der Schaltung übersetzen, die mit 3 oder mehr Qubits arbeiten.

  • Unterstützung für den SabreLayout pass, um Prüfungen mit bestimmten Startlayouts hinzuzufügen. Der SabreLayout transpiler-Durchlauf führt in der Regel mehrere Layout-Versuche durch, die alle mit völlig zufälligen Layouts beginnen, die dann einen Routing-Durchlauf verwenden, um dieses Layout zu permutieren, anstatt Swaps einzufügen, um ein Layout zu finden, das zu weniger Swap-Gates führt. Diese neue Funktion ermöglicht die Ausführung eines AnalysisPass vor SabreLayout die das Feld "sabre_starting_layout" im Eigenschaftssatz setzt, um dem SabreLayout zusätzliche Startlayouts zur Verfügung zu stellen, die es in seinen internen Versuchen verwenden kann. Wenn Sie zum Beispiel DenseLayout als Startpunkt für einen Versuch in SabreLayout würden Sie etwas wie folgt tun:

    from qiskit.providers.fake_provider import FakeSherbrooke
    from qiskit.transpiler import AnalysisPass, PassManager
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.transpiler.passes import DenseLayout
    
    class SabreDenseLayoutTrial(AnalysisPass):
    
      def __init__(self, target):
          self.dense_pass = DenseLayout(target=target)
          super().__init__()
    
      def run(self, dag):
          self.dense_pass.run(dag)
          self.property_set["sabre_starting_layouts"] = [self.dense_pass.property_set["layout"]]
    
    backend = FakeSherbrooke()
    opt_level_1 = generate_preset_pass_manager(1, backend)
    pre_layout = PassManager([SabreDenseLayoutTrial(backend.target)])
    opt_level_1.pre_layout = pre_layout

    Wenn dann die opt_level_1 StagedPassManager mit einer Schaltung betrieben wird, wird der Ausgang des DenseLayout durchgang für einen der SabreLayout versuche verwendet, zusätzlich zu den 5 völlig zufälligen Versuchen, die standardmäßig in Optimierungsstufe 1 durchgeführt werden.

  • Zwei neue Transpiler-Durchläufe wurden hinzugefügt, um Einzelimpuls-RX-Gate-Kalibrierungen im laufenden Betrieb zu erzeugen. Diese Einzelimpuls-RX-Kalibrierungen reduzieren die Gatterzeit um die Hälfte, wie in P.Gokhale et al, Optimized Quantum Compilation for Near-Term Algorithms mit OpenPulse (2020) beschrieben, arXiv:2004.11205.

    Um die Menge der zu erzeugenden RX-Kalibrierungsdaten zu reduzieren, NormalizeRXAngle drei Optimierungen vor: Umschlag der RXGate drehwinkel auf [0, pi], Ersetzen von RX(pi/2) und RX(pi) durch SXGate und XGateund die Quantisierung der Rotationswinkel. Dieser Durchlauf muss vor dem Durchlauf RXCalibrationBuilderausgeführt werden, der RX-Kalibrierungen im laufenden Betrieb erzeugt.

    Die Optimierungen, die von NormalizeRXAngle durchgeführten Optimierungen reduzieren die Menge der Kalibrierungsdaten und ermöglichen es uns, die genaueren, hardwarekalibrierten Impulse zu nutzen. Die Kalibrierungen, die durch RXCalibrationBuilder erzeugten Kalibrierungen werden aus der SXGate kalibrierung abgeleitet, die bereits im Ziel vorhanden sein sollte. Die Amplitude wird linear skaliert, um den gewünschten willkürlichen Drehwinkel zu erreichen.

    Solche Einzelimpuls-Kalibrierungen reduzieren die RXGate zeit auf die Hälfte, verglichen mit der herkömmlichen Sequenz, die aus zwei SXGate impulsen besteht. Diese Verkürzung der Gate-Zeit könnte zu einer Verbesserung der Originaltreue führen.

  • Neue Methoden hinzugefügt für TranspileLayout, initial_index_layout() und routing_permutation()hinzugefügt, die dazu dienen, eine Listenansicht der TranspileLayout.initial_layout und TranspileLayout.final_layout attribute zu erzeugen. Zum Beispiel, wenn das final_layout attribut wäre:

    Layout({
      qr[0]: 2,
      qr[1]: 3,
      qr[2]: 0,
      qr[3]: 1,
    })

    dann routing_permutation() zurück:

    [2, 3, 0, 1]
  • Eine neue Methode wurde zu TranspileLayout, initial_virtual_layout(), die dem Attribut TranspileLayout.initial_layout attribut entspricht, aber die Möglichkeit bietet, Ancilla-Qubits zu filtern, die dem Schaltkreis hinzugefügt wurden. Standardmäßig enthält die TranspileLayout.initial_layout in der Regel alle vom Transpiler hinzugefügten Ancillas ein.

  • Eine neue Methode wurde hinzugefügt, final_index_layout() und final_virtual_layout() zu der TranspileLayout klasse. Diese Methoden werden verwendet, um ein endgültiges Layout zurückzugeben (die Zuordnung der Qubits der Eingangsschaltung zur endgültigen Position in der Ausgabe). Dies unterscheidet sich von dem final_layout attribut, das die Permutation ist, die durch das Routing als Layout objekt. Die Methode final_index_layout() methode gibt eine Liste zurück, die die Ausgangsposition für jedes Qubit in der Eingangsschaltung des Transpilters anzeigt. Zum Beispiel mit einer Originalschaltung:

    qc = QuantumCircuit(3)
    qc.h(0)
    qc.cx(0, 1)
    qc.cx(0, 2)

    und die Ausgabe des Transpilers war:

    tqc = QuantumCircuit(3)
    tqc.h(2)
    tqc.cx(2, 1)
    tqc.swap(0, 1)
    tqc.cx(2, 1)

    dann würde die Ausgabe von final_index_layout() eine Liste von zurückgeben:

    [2, 0, 1]

    Die Website final_virtual_layout() gibt dies als ein Layout objekt zurück, so dass die Rückgabe des obigen Beispiels lauten würde:

    Layout({
      qc.qubits[0]: 2,
      qc.qubits[1]: 0,
      qc.qubits[2]: 1,
    })

Visualisierungsfunktionen

  • Es wurde die Möglichkeit hinzugefügt, Bedingungen als Ausdrücke von Expr in der QuantumCircuit.draw() methode und der circuit_drawer() funktion bei der Visualisierung von Schaltkreisen mit ControlFlowOp anweisungen.

  • Es wurden die Farbstile "iqp" und "iqp-dark" für die Schaltkreisschublade matplotlib hinzugefügt, die auf dem Farbschema IBM Quantum Platform basieren.

  • In TextDrawer werden Operationen, die aus ControlFlowOp, einschließlich if, else, while, for und switch/case, ob direkt instanziiert oder mit Methoden in QuantumCircuiterstellt wurden, werden nun die in ControlFlowOps definierten Schaltkreise vollständig angezeigt, wobei die Schaltkreise durch Klammern abgegrenzt werden.

  • Bei der Definition eines benutzerdefinierten Stylesheets für die Impulszeitleiste qiskit.visualization.timeline_drawer()werden "Generator"-Funktionen, bei denen das Objektattribut accepts_program auf True gesetzt ist, ein zusätzliches Schlüsselwortargument program erhalten, das den vollständigen Zeitplan QuantumCircuit gezeichnet wird.

  • Die Visualisierungen aus dem plot_gate_map(), plot_coupling_map(). plot_error_map(), und plot_circuit_layout() funktionen wurden erheblich verbessert, um Layouts von Backends mit einer großen Anzahl von Qubits zu rendern. Dies wurde erreicht, indem Graphviz durch die Funktion graphviz_draw() von rustworkx genutzt wurde, um ein anspruchsvolleres algorithmisches Graphenlayout zu erstellen, das für eine große Anzahl von Qubits skaliert.

    _images/release_notes-1.png

Versch. Funktionen

  • Unterstützung für den Ausdruck des Vorzeichens einer ParameterExpression. Anstatt einen konkreten Wert zuzuweisen und mit numpy.sign oder andere Bibliotheksfunktionen zu verwenden, kann der Benutzer die Instanz der ParameterExpression klasse verwenden, um das Vorzeichen zu berechnen, und kann mit dem Vorzeichen arbeiten, bevor der Ausdruck vollständig zugewiesen wird.

    Sie kann wie folgt verwendet werden:

    from qiskit.circuit import Parameter
    
    b = Parameter("phi")
    sign_value = b.sign()
    print("sign of an unassigned Parameter is: ", sign_value)
    print("Sign of a Parameter assigned to -3 is: ", sign_value.assign(b,-3))

    Siehe #10360 für weitere Einzelheiten.

  • Parameter hat jetzt ein Argument für das Schlüsselwort uuid in seinem Konstruktor, das verwendet werden kann, um den Parameter mit einer anderen gleichnamigen Variable zu vergleichen. Diese Funktion sollte in der Regel nicht von den Benutzern verwendet werden, sondern ist vor allem für die benutzerdefinierte Serialisierung und Deserialisierung nützlich.

Hinweise zur Aktualisierung von Schaltkreisen

  • Die Website ControlledGate.definition der Ausgabe der Gate.control() methode kann im Vergleich zu früheren Versionen unterschiedlich sein. Die interne Generierung der Gate.control() methode verwendet nicht mehr den inzwischen veralteten Unroller transpiler-Pass, um die Definition zu generieren. Dies kann dazu führen, dass eine andere Definition generiert wird. Die Ausgabe ControlledGate objekts wird die gleiche Definition haben wie die, die zuvor erzeugt wurde. Wenn Sie jedoch die genaue Definition aus dem Aufruf von Gate.control() benötigen, können Sie eine frühere Version verwenden und die Schaltung mit qpy.dump() speichern und dann mit einer neueren Version laden.

  • Die Eigenschaft num_ancilla_qubits aus der Klasse PolynomialPauliRotations wurde entfernt, da sie in Qiskit 0.23.0 veraltet ist. Verwenden Sie stattdessen die Eigenschaft PolynomialPauliRotations.num_ancillas.

  • Die folgenden Standard-Bibliotheks-Gates:

    nicht mehr einstellen können label, condition, duration, oder unit (und ctrl_state für ControlledGate unterklassen) nach der Instanziierung eines Objekts nicht mehr. Sie können noch condition durch die Verwendung von c_if(). Sie können mit to_mutable() eine veränderbare Kopie der Anweisung erhalten und dann den Setter auf diese Kopie statt auf das Originalobjekt anwenden. label, duration und unit können als Schlüsselwortargumente für diese Gatter zur Konstruktionszeit angegeben werden, und es wird automatisch eine veränderbare Instanz zurückgegeben. Diese Änderung war im Rahmen der Umstellung dieser Klassen auf SingletonGate und SingletonControlledGate typen zu konvertieren, was den Speicherbedarf von wiederholten Instanzen dieser Gates erheblich reduziert.

  • Für alles, was in Wechselwirkung mit Gate, Operation, oder Instruction objekten interagiert oder mit diesen als Teil einer QuantumCircuit oder DAGCircuit klassen arbeiten, ist es wichtig zu beachten, dass die Verwendung von gemeinsamen Referenzen für Instanzen jetzt viel üblicher ist. Früher war es möglich, eine Instanz einer Schaltkreisoperation wiederzuverwenden und gemeinsam zu nutzen, aber dies wurde nicht sehr häufig verwendet, und eine Kopie würde eine eindeutige Instanz erzeugen. Dies hat sich ab dieser Version durch SingletonInstruction und SingletonGate zur Verfügung stehen (und eine große Anzahl von Standardbibliotheksgattern nun auf ihnen aufbaut). Wenn Sie bei der Verwendung dieser Objekte von eindeutigen Instanzen für jeden Schaltkreisvorgang ausgehen, wird dies zu einem potenziellen Problem, da nun ein gemeinsamer Zustand zwischen Vorgängen desselben Typs wiederverwendet wird (der durch Kopieren und tiefe Kopien erhalten bleibt). Sie können sich auf das Instruction.mutable attribut können Sie die Veränderlichkeit eines Objekts überprüfen oder mit Instruction.to_mutable() um eine veränderbare Kopie einer beliebigen Anweisung zu erhalten.

  • Mehr Instruction instanzen (solche, die Singletons zurückgeben) nicht mehr streng erfüllen (zum Beispiel):

    type(XGate()) is XGate

    Das zurückgegebene Objekt ist jedoch immer noch eine Standard-Unterklasse, so dass isinstance() (die korrekte Art der Typprüfung) wird weiterhin korrekt funktionieren. Mehrere Anweisungen hatten diese Eigenschaft bereits (z. B. MCXGate), aber es ist jetzt häufiger der Fall, da viele Standardtore dies tun.

    Wenn Sie aus irgendeinem Grund den "Basistyp" eines Gatters benötigen, lassen Sie die synthetischen Singleton-Unterklassen weg, die nicht instanziiert werden können, siehe Instruction.base_class.

  • Die Definition von UnitaryGate für Ein-Qubit-Einheiten ist jetzt in Form von UGate anstelle der alten U3Gate klasse.

Hinweise zum Upgrade für Anbieter

  • Der QasmSimulatorPy python-basierte Simulator, der in qiskit.providers.basicaer enthält jetzt 'h' (HGate), 'p' (PhaseGate), und 'u' (UGate) in seinem Basis-Gate-Set.

  • Das Argument channel in der Methode PulseBackendConfiguration.control() wird entfernt. Es wurde in Qiskit 0.33 (mit Terra 0.19 ), veröffentlicht im Dezember 2021, veraltet. Verwenden Sie stattdessen das Argument qubits .

  • Ersetzte das Argument qobj[Qobj] in QasmSimulatorPy.run() durch run_input[QuantumCircuit or list]

    Hier ist ein Beispiel für die Migration Ihres Codes:

    # Importing necessary Qiskit libraries
    from qiskit import transpile, QuantumCircuit
    from qiskit.aer import QasmSimulator
    
    # Defining the Quantum Circuit
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    # Transpile the circuit to optimize for the target simulator
    simulator = QasmSimulator()
    transpiled_circuit = transpile(qc, simulator)
    # Run the simulation
    job = simulator.run(transpiled_circuit, shots=1024)
    # Get the simulation result
    result = job.result()

    All diese Funktionen sind seit 0.22 (veröffentlicht am 13. Oktober 2022) veraltet und werden nun entfernt.

Hinweise zum Pulse-Upgrade

  • Die Funktionen qiskit.scheduler.utils.format_meas_map(), qiskit.scheduler.utils.measure() und qiskit.scheduler.utils.measure_all() wurden nach qiskit.pulse.utils.format_meas_map(), qiskit.pulse.macros.measure() bzw. qiskit.pulse.macros.measure_all() verschoben. Der vorherige Speicherort wurde in Qiskit 0.20.0 (Terra 0.15.0, veröffentlicht am 2020-08-10) veraltet und wird nicht mehr unterstützt.

  • Die Methoden to_dict in den Klassen pulse.transforms.AlignmentKind, pulse.transforms.AlignEquispaced, und pulse.transforms.AlignFunc werden entfernt. Sie wurden in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet.

QPY-Upgrade-Hinweise

  • Die Verwendung des Schlüsselworts circuits für das erste Positionsargument in der Funktion qiskit.qpy.dump() wurde entfernt, da seine Verwendung in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet ist. Stattdessen kann das Schlüsselwort programs verwendet werden (oder übergeben Sie das Argument einfach an der richtigen Stelle), das sich identisch verhält.

Hinweise zum Upgrade der Quanteninformation

  • Die Methode qiskit.quantum_info.pauli_basis() akzeptiert das Argument pauli_list nicht mehr. Es wurde in Qiskit 0.39 (mit Terra 0.22 ), das im Oktober 2022 veröffentlicht wurde, veraltet.

  • Die Funktion random_stabilizer_table im Modul qiskit.quantum_info.random wird entfernt. Es wurde in Qiskit 0.39 (mit Terra 0.22 ), das im Oktober 2022 veröffentlicht wurde, veraltet. Verwenden Sie stattdessen qiskit.quantum_info.random.random_pauli_list().

  • Die Klassen qiskit.quantum_info.PauliTable und qiskit.quantum_info.StabilizerTable werden entfernt. Die Funktion random_pauli_table() wird ebenfalls entfernt. Sie wurden in Qiskit 0.43 (mit Terra 0.24 ), das im Mai 2023 veröffentlicht wurde, veraltet. Stattdessen sollten Sie PauliList und random_pauli_list().

  • Die Argumente z und x für den Initialisierer von to Pauli wurden entfernt, da sie in Qiskit Terra 0.17 (veröffentlicht im April 2021) veraltet sind. Ein Paar aus x und z sollte stattdessen positionell als ein einziges Tupel übergeben werden (Pauli((z, x))).

  • Das Argument label für den Initialisierer von Pauli wurde entfernt, da es in Qiskit Terra 0.17 (veröffentlicht im April 2021) veraltet ist. Übergeben Sie stattdessen das Etikett an der richtigen Stelle, z. B. Pauli("XYZ").

  • Der Import von qiskit.quantum_info.operators.pauli ist nicht mehr erlaubt, da er in Qiskit Terra 0.21 (veröffentlicht im Juni 2022) veraltet ist. Importieren Sie stattdessen direkt von qiskit.quantum_info .

Hinweise zum Upgrade der Synthese

  • Der Parameter order im synthesis.SuzukiTrotter konstruktor löst eine Ausnahme statt einer Verwerfungswarnung aus, wenn er auf eine ungerade Zahl gesetzt wird. Suzuki-Produktformeln sind symmetrisch und daher nur für gerade Ordnungen definiert.

Hinweise zum Transpiler-Upgrade

  • Infolge der Überarbeitung des Pass-Managers wurden die bestehenden Ablaufsteuerungen überarbeitet: FlowControllerLinear, ConditionalController, und DoWhileController sind nun Unterklassen der BaseController. Beachten Sie, dass diese Controller die Implementierung der __iter__() methode verzichtet haben. Sie sind jetzt nur noch im Kontext einer Flow-Controller-Ausführung iterierbar, bei der der Kompilierungsstatus nach Ausführung jeder inneren Aufgabe durchlaufen wird.

  • Die Funktionalität der Klasse RunningPassManager wurde durch das neue Passmanager-Framework ersetzt (BasePassManager und BaseController). Der laufende Passmanager ist nun ein zustandsloser Ablaufregler (im Wesentlichen ein Alias von FlowControllerLinear), da der Passmanager für den Aufbau der Task-Pipeline zuständig ist, während der Controller für die Ausführung der zugehörigen Tasks verantwortlich ist. Die Unterklassifizierung von RunningPassManager wird nicht mehr empfohlen, und diese Klasse wird in zukünftigen Versionen vollständig durch den Flow Controller ersetzt werden.

  • Eine neue Klasse, WorkflowStatuswurde eingeführt, um den Status des Passmanager-Workflows zu verfolgen. Dieses portable Objekt wird bei der Ausführung des Passmanagers erstellt und an die zugrunde liegenden Aufgaben übergeben. Dieser Status wurde bisher von RunningPassManager mit Instanzvariablen verwaltet.

  • Die transpilerspezifische transpiler.PassManager (verwendet in transpile()) ist jetzt eine Unterklasse von passmanager.BasePassManager. Diese Änderung der Klassenhierarchie führt jedoch nicht zu einer grundlegenden Änderung der öffentlich zugänglichen API.

  • Ausnahmen, die während der Ausführung des Pass-Managers ausgelöst werden, erben nun von der neu eingeführten PassManagerError. Ein allgemeines Versagen der Pass-Manager-Maschinerie wird PassManagerError für allgemeine Pass-Manager aus, aber der transpiler-spezifische transpile.PassManager verpackt dies derzeit aus Gründen der Abwärtskompatibilität in seine spezifische TranspilerError aus Gründen der Abwärtskompatibilität. Diese Umhüllung wird in Zukunft entfernt werden.

  • Die Verwendung von FencedObject im Rahmen des Passmanagers wurde entfernt. Diese Wrapper-Klasse kann veränderbare Objektattribute nicht vor Änderungen schützen, was bei ordnungsgemäß implementiertem Code kein Problem darstellen sollte. Analysedurchläufe sollten eine IR-Eingabe nicht verändern, Controller sollten den Eigenschaftssatz nicht aktualisieren und so weiter. Es liegt in der Verantwortung des Entwicklers des Pass-Managers, sicherzustellen, dass der Pass keine Objektattribute verändert,

  • Der Plugin-Name default ist für die Plugin-Stufen init, layout, optimization, und scheduling reserviert. Für diese Stufen war dieser Plugin-Name bisher nicht reserviert, aber der Name default wird jetzt verwendet, um die in Qiskit eingebaute Standardmethode für diese Stufen darzustellen. Wenn Sie diese Namen für Plugins auf diesen Stufen verwendet haben, stehen diese in Konflikt mit der Verwendung von Qiskit und Sie sollten Ihr Plugin umbenennen.

  • Deaktiviert die Verwendung der RemoveResetInZeroState klasse in den voreingestellten Passmanagern. Zuvor, wenn transpile() oder generate_preset_pass_manager() mit optimization_level auf Stufe 1, 2 oder 3 ausgeführt wurde, lief es so ab RemoveResetInZeroState. Dieser Durchgang verbietet jedoch die Vorstellung von willkürlichen Anfangszuständen, es sei denn, sie werden explizit auf Nullen gesetzt und zurückgesetzt. Wenn Sie den Pass als Teil Ihrer Kompilierungspipeline ausführen müssen, können Sie etwas wie folgt ausführen:

    pm = generate_preset_pass_manager(1, backend)
    pm.init.append(RemoveResetInZeroState())
    pm.run(circuit)

    um diese Funktionalität für Ihre Schaltkreiskompilierung beizubehalten.

  • Der veraltete Transpiler-Routing-Pass, BIPMapping , wurde entfernt. Es wurde in der Qiskit 0.43.0 Version als veraltet markiert. Es wurde durch ein externes Plugin-Paket ersetzt: qiskit-bip-mapper. Details zu diesem neuen Paket finden Sie im Github-Repository des Pakets:

    https://github.com/qiskit-community/qiskit-bip-mapper

    Der Pass wurde aus zwei Gründen in ein separates Plugin-Paket umgewandelt: Erstens macht die Abhängigkeit von CPLEX die Verwendung schwieriger, und zweitens lässt sich das Plugin-Paket sauberer in transpile(). Das optionale Extra bip-mapper zur Installation von cplex und docplex zur Unterstützung dieses Passes wurde entfernt, da nichts in Qiskit dies mehr optional erfordert.

  • Das Argument qubits in der Methode InstructionDurations.get()akzeptiert nicht mehr Qubit (oder eine Liste von ihnen) nicht mehr. Diese Funktion wurde in Qiskit 0.33 (mit Terra 0.19 ), das im Dezember 2021 veröffentlicht wurde, veraltet. Verwenden Sie stattdessen eine ganze Zahl für die Qubit-Indizes.

  • Entfernt das Argument qubit_channel_mapping in RZXCalibrationBuilderdas in Qiskit 0.39 (veröffentlicht im Oktober 2022, mit qiskit-terra 0.22 ) veraltet war

  • In transpiler.CouplingMap wird die Methode subgraph als veraltet in 0.20 entfernt. reduce() kann anstelle der Methode subgraph verwendet werden.

Hinweise zum Upgrade der Visualisierung

  • Die Unterstützung für die Verwendung des Schlüsselworts rho für das erste Positionsargument in plot_state_hinton(), plot_bloch_multivector(), plot_state_city(), plot_state_paulivec(), und plot_state_qsphere(). Die Verwendung von rho wurde durch state ersetzt, das stattdessen verwendet werden kann. qiskit.scheduler.utils wurde entfernt, da alle enthaltenen Funktionen nach qiskit.pulse.macros und qiskit.pulse.utils verschoben wurden. Alle diese Funktionen sind seit 0.15 (veröffentlicht am 06. August 2020) veraltet und werden nun entfernt.

  • Die Klassenkonstruktor-Argumente qregs, cregs, layout und global_phase für visualization.QCircuitImage wurden entfernt, da sie in 0.20 veraltet sind.

  • Die Visualisierungsfunktionen: plot_gate_map(), plot_coupling_map(). plot_error_map(), und plot_circuit_layout() sind nun davon abhängig, dass graphviz installiert ist. Diese Änderung war notwendig, um die Visualisierung von Backends mit einer größeren Anzahl von Qubits zu ermöglichen. Diese zusätzliche externe Anforderung kommt zu den bestehenden optionalen Abhängigkeiten hinzu, die diese Funktionen bisher benötigten. Details zur Installation von Graphviz finden Sie hier: https://graphviz.org/download/

Versch. Anmerkungen zu Upgrades

  • Die QuasiDistribution werte können Fließkommafehler enthalten. QuasiDistribution.__repr__ runden mit numpy.round() und der Parameter ndigits können mit dem Klassenattribut __ndigits__ manipuliert werden. Die Standardeinstellung ist 15.

  • Die Klasse qiskit.qobj.Qobj wird entfernt. Es wurde in Qiskit 0.33 (mit Terra 0.19 ), veröffentlicht im Dezember 2021, veraltet. Verwenden Sie stattdessen qiskit.qobj.QasmQobj oder qiskit.qobj.PulseQobj.

  • Der Dekorator qiskit.utils.deprecation.deprecate_function() ist seit Qiskit 0.39.0 (veröffentlicht im Oktober 2022, mit qiskit-terra 0.22.0 ) veraltet und wird nun entfernt. Verwenden Sie qiskit.utils.deprecate_func() stattdessen.

  • Die Funktion execute() akzeptiert nicht mehr die Argumente qobj_id und qobj_header . Ihre Verwendung wurde in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet.

  • Der Transpilationspass qiskit.transpiler.passes.CXDirection wird entfernt. Seine Verwendung wurde in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet. Verwenden Sie stattdessen die allgemeinere GateDirection pass.

  • Der Transpilationspass qiskit.transpiler.passes.CheckCXDirection wird entfernt. Seine Verwendung wurde in Qiskit 0.37 (mit Terra 0.21 ), das im Juni 2022 veröffentlicht wurde, veraltet. Verwenden Sie stattdessen die allgemeinere CheckGateDirection pass.

  • Die Erstellung von Qiskit aus dem Quellcode erfordert nun einen Rust-Compiler, der mit der Sprachversion 1.64 kompatibel ist. Diese wurde von der vorherigen minimal unterstützten Rust-Version von 1.61 für die Erstellung früherer Versionen von Qiskit erhöht.

Algorithmen-Veraltungen

  • Die Algorithmus-Utilities in qiskit.utils.validation und qiskit.utils.algorithm_globals sind jetzt veraltet und werden in nicht weniger als 3 Monaten ab dem Veröffentlichungsdatum entfernt werden. Diese Werkzeuge wurden mit dem Modul qiskit.algorithms eingeführt, um ältere und primitiv-basierte Algorithmus-Workflows zu unterstützen. Nun, da qiskit.algorithms veraltet ist und die Codebasis der primitiven Algorithmen in eine eigenständige Bibliothek migriert wurde, werden diese Hilfsprogramme im Kontext von Qiskit nicht mehr verwendet. Wenn Ihre Anwendung es zulässt, empfehlen wir, dass Sie Ihren Code auf qiskit_algorithms umstellen, wo Sie die entsprechenden Dienstprogramme in algorithm_globals und validation von qiskit_algorithms.utils importieren können. Bitte beachten Sie, dass die alten Funktionen nicht in das neue Paket migriert wurden.

Veraltete Schaltungen

Transpiler-Veraltungen

  • Die Flusssteuerungs-Fabrikmethode FlowController.controller_factory() ist veraltet zusammen mit FlowController.add_flow_controller() und FlowController.remove_flow_controller(). In Zukunft wird die Aufgabenkonstruktion mit Schlüsselwortargumenten in der BasePassManager.append() methode wird ebenfalls veraltet sein. Controller müssen explizit instanziiert und an den Passmanager angehängt werden. Zum Beispiel die bisher verwendete konventionelle Syntax

    pm.append([task1, task2], condition=lambda x: x["value1"] > 10)

    muss ersetzt werden durch

    controller = ConditionalController([task1, task2], condition=lambda x: x["value1"] > 10)
    pm.append(controller)

    Letzteres ermöglicht eine genauere Kontrolle über die Reihenfolge der Controller, insbesondere wenn mehrere Schlüsselwortargumente zusammen angegeben werden, und erlaubt die Konstruktion allgemeiner Flusscontroller, die mehr als eine Pipeline haben können oder nicht nur eine einzige einfache bedingte Funktion in ihren Konstruktoren verwenden.

  • Die FlowControllerLinear.append(), DoWhileController.append(), und ConditionalController.append() sind alle sofort veraltet. Der Aufbau der Passmanager-Task-Pipeline ist nun Aufgabe von BasePassManagerund die einzelnen Ablaufsteuerungen müssen diese Methode nicht anwenden. Bei einem Flusscontroller sollten alle Übergänge in einem Zug direkt im Konstruktor festgelegt werden.

  • Der allgemeine Attribut- und Variablenname passes wird im gesamten Modul durch tasks ersetzt qiskit.passmanager modul ersetzt. Beachten Sie, dass eine Aufgabe eine Vereinigung von pass und controller angeben muss, und die Singularform pass steht im Widerspruch zum Schlüsselwort Python. In diesem Sinne ist die Verwendung von Aufgaben viel besser.

  • Der Unroller transpiler-Pass wurde veraltet und wird in einer zukünftigen Version entfernt werden. Die Unroller wurde abgelöst durch BasisTranslator abgelöst, das eine ähnliche Funktionalität bietet, aber in einer allgemeineren Form, so dass man eine Schaltung in jede universelle Basismenge übersetzen kann. Die Unroller klasse funktioniert nur in Situationen, in denen die Gatterdefinitionen der Schaltung rekursiv in Bezug auf die Zielbasis definiert sind; für die Gatter der Standardbibliothek von Qiskit bedeutet dies UGate und CXGate. Wenn Sie den Unroller verwenden, kann es durch einen benutzerdefinierten Passmanager des Formulars ersetzt werden:

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import UnrollCustomDefinitions, BasisTranslator
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    
    pm = PassManager(
        [
            UnrollCustomDefinitions(sel, basis_gates=basis_gates),
            BasisTranslator(sel, target_basis=basis_gates),
        ]
    )
    pm.run(circuit)
  • Die Verwendung des Wertes "unroller" für das Schlüsselwortargument translation_method in den transpile() und generate_preset_pass_manager() wurde veraltet. Dieses Plugin für die Übersetzungsphase wird in einer zukünftigen Version aus Qiskit entfernt werden, da es durch die Standardmethode "translator" ersetzt wird, die ähnlich wie das Plugin "unroller" funktioniert, aber eine größere Anzahl von Ziel-Backends unterstützt.

Veraltete Visualisierungen

  • Die Standardeinstellung für die Schublade matplotlib gibt jetzt FutureWarning aus, da die Standardvorlage in die Vorlage "iqp" geändert wird (früher bekannt als "iqx"). Der alte Standard ist als "clifford" verfügbar. Um die Warnung auszuschalten, können Sie den gewünschten Stil explizit einstellen, z. B. g.:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.x(0)
    circuit.h(0)
    circuit.cp(0.5, 0, 1)
    
    circuit.draw("mpl", style="clifford")  # or style="iqp"
  • Die Übergabe einer Schaltung an qiskit.visualization.timeline_drawer() die keine Informationen über die geplante Startzeit des Knotens enthält, ist veraltet. Nur Schaltkreise, die einen der Planungsanalysedurchläufe durchlaufen haben (z. B ALAPScheduleAnalysis oder ASAPScheduleAnalysis) durchlaufen haben, können visualisiert werden. Wenn Sie einen der alten Zeitplanungspässe verwendet haben (z. B ALAPSchedule oder ASAPSchedule), können Sie die Zeitplanungsinformationen durch Ausführen von:

    from qiskit import transpile
    from qiskit.transpiler import InstructionDurations
    
    scheduled = transpile(
      my_old_style_circuit,
      optimization_level=0,
      scheduling_method="alap",
      instruction_durations=InstructionDurations(),
    )

    Dieses Verhalten sollte bereits in Qiskit 0.37 veraltet sein, aber aufgrund eines Fehlers in der Warnung wurde es den Benutzern bis jetzt nicht angezeigt. Dieses Verhalten wird in Qiskit 1.0 entfernt.

Fehlerkorrekturen

  • Die maximale Anzahl von Qubits, die für die auf Matrixmultiplikation basierende Kommutativitätsprüfung in CommutationChecker ist nun standardmäßig auf 3 begrenzt. Behoben #10488

  • Der GateDirection transpiler-Durchgang verwendet nun Übersetzungen auf diskreter Basis, anstatt sich auf eine kontinuierliche RYGatezu verwenden, was dazu beitragen sollte, dass einige Ziele auf diskreter Basis etwas zuverlässiger werden. Generell gilt, transpile() nur eine teilweise Unterstützung für Basissätze, die keine kontinuierlich parametrisierte Operation enthalten, so dass sie in diesen Situationen nicht immer erfolgreich ist und mit ziemlicher Sicherheit keine optimalen Ergebnisse liefert.

  • Festgelegt CommutationAnalysis um Gatter auf einem Draht in Gruppen zu gruppieren, wobei jede Gruppe nur Gatter enthält, die paarweise kommutieren. Dadurch wird verhindert, dass CommutationCancellation unzulässige Optimierungen vornimmt. Siehe #8020

  • CUGate verhält sich nun korrekt bei Aufrufen von QuantumCircuit.assign_parameters(). Zuvor kam es zu verschiedenen seltsamen Fehlern, die oft erst einige Zeit nach der ersten Schaltungszuweisung auftraten. Siehe #7326, #7410, #9627, #10002, und #10131.

  • Die Schnittstelle zur Erstellung von Kontrollflüssen (die Kontext-Manager-Formen von QuantumCircuit.if_test(), while_loop(), for_loop() und switch()) verfolgt nun korrekt einen separaten Globalphasenfortschritt innerhalb dieses Blocks. Sie können einen globalen Phasenaufstieg zu einem inneren Block hinzufügen, indem Sie QuantumCircuit.global_phase innerhalb eines Builder-Bereichs zuweisen:

    from math import pi
    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(3, 3)
    qc.global_phase = pi / 2  # Set the outer circuit's global phase.
    
    with qc.if_test((qc.clbits[0], False)) as else_:
      # The global phase advancement in a control-flow block begins at 0,
      # because it represents how much the phase will be advanced by an
      # execution of the block.  The defined phase of the outer scope is not
      # affected by this set.
      qc.global_phase = pi
    with else_:
      # Similarly, the `else` block may induce a different global-phase
      # advancement to the `if`, so it can also be set separately.
      qc.global_phase = 1.5 * pi
    
    # The phase advancement caused directly by the outer scope is independent
    # of the phase advancement conditionally caused by each control-flow path.
    assert qc.global_phase == pi / 2

    Die Bedeutung von QuantumCircuit.global_phase ist der globale Phasenfortschritt, der mit einer einzigen Ausführung des Blocks verbunden ist. Es handelt sich immer noch um eine globale Phasenverschiebung, d.h. wenn der Block eingegeben wird, wird die Phase aller Qubits im gesamten Programm verschoben.

  • Korrigiert die Einfärbung der Matplotlib-Farbschemata "iqx" und "iqx-dark" , die zuvor die RZGate, RZZGate, (multi-)kontrollierte PhaseGates und iSwapGate in der falschen Farbe zeichneten.

  • Der Hash von a Parameter ist jetzt gleich den Hashes von allen ParameterExpression mit denen er gleich verglichen wird. Zuvor waren die Hashes unterschiedlich, was zu ungewollten zusätzlichen Einträgen in Hashmaps führte, wenn Parameter und ParameterExpression werte in derselben Map gemischt wurden, da dies gegen das Datenmodell von Python verstieß.

  • Es wurde ein Fehler in der QPY-Serialisierung (qiskit.qpy), bei dem kontrollierte unitäre Gatter in einer Schaltung dazu führen konnten, dass die Deserialisierung fehlschlug. Behoben #10802.

  • Korrigiert die Implementierung von random_statevector() so dass die Stichproben aus der Gleichverteilung gezogen werden.

  • Der Pass NoiseAdaptiveLayout nimmt jetzt CouplingMap als optionales Argument. Dies wird von dem Plugin verwendet, um die Inkonsistenz zwischen configuration() und properties()zu kontrollieren, wie im Fall von FakeMelbourne. Behoben #7677.

  • Die Methoden QuantumCircuit.copy() und copy_empty_like() lösen nun einen Fehler aus, wenn das Argument name falsch eingegeben wurde, anstatt eine ungültige Schaltung zu erzeugen.

  • Die "decay" Heuristik von SabreSwap und SabreLayout verfolgt nun die Tiefe auf physischen Qubits korrekt, anstatt fälschlicherweise die "Tiefe" von Swaps auf virtuellen Qubits zu verfolgen.

  • Es wurde ein Versehen in der ECRGate das das Setzen eines ECRGate.label attributs zur Zeit der Objekterstellung verhindert hat. Alle anderen Gate klassen und Unterklassen ermöglichen das Setzen eines label Schlüsselwortarguments im Konstruktor.

  • Es wurde ein Versehen im Gate (und Standard-Bibliotheksunterklassen) behoben, bei dem die Konstruktoren duration und unit attribute während der Konstruktion nicht als Schlüsselwortargumente gesetzt werden konnten. Die übergeordnete Klasse Instruction unterstützte diese Einstellung, aber Gate stellte diese Schnittstelle bisher nicht korrekt dar.

  • Unterstützung hinzugefügt, um SparsePauliOp Standardinitialisierung durch Übergabe einer leeren Iterable an die statischen Methoden zu ermöglichen from_list() und from_sparse_list(). Behoben #10159.

  • Die Verwendung der (veralteten) Klasse Optimizer auf AQC hatte keinen nicht veralteten Alternativpfad, der in Qiskit 0.44 hätte eingeführt werden sollen. Es akzeptiert nun eine Callable, die das Minimizer protokoll implementiert, wie in der Verwerfungswarnung ausdrücklich angegeben. Der Callable kann wie das folgende Beispiel aussehen:

    from scipy.optimize import minimize
    from qiskit.transpiler.synthesis.aqc.aqc import AQC
    
    optimizer = partial(minimize, args=(), method="L-BFGS-B", options={"maxiter": 200})
    aqc = AQC(optimizer=optimizer)
  • Es wurde ein Problem mit der Barrier klasse. Beim Hinzufügen einer Barrier instanz zu einer QuantumCircuit mit der QuantumCircuit.append() methode wurde bisher nicht überprüft, ob die Größe der Barriere mit den angegebenen qargs übereinstimmt.

  • Der BlockCollapser Transpiler-Durchlauf behandelt nun Schaltungen korrekt, die mehr als eine Bedingung auf demselben klassischen Register enthalten.

  • BlueprintCircuit unterklassen verhalten sich nun korrekt, wenn die halb-öffentliche Methode QuantumCircuit._append() verwendet wird, während sich die Blaupause in einem ungebauten Zustand befindet, d.h. der Schaltkreis wird aufgebaut, bevor die Anfügung versucht wird.

  • Anpassen von Zoom, Schriftgröße und Rändern in plot_state_city() um das Diagramm besser an mehrere Figurengrößen anzupassen. Das Verhalten der Z-Reihenfolge von Balken und der Null-Amplituden-Ebene wurde korrigiert und die Anzeige von Balken mit negativem Realwert wurde korrigiert.

Sonstige Anmerkungen

  • Diese Version von Qiskit ist explizit an die Numpy 1.x Serie gebunden, da sie kompilierte Erweiterungen enthält, die noch nicht gegen die noch nicht freigegebene Numpy 2.x Serie kompiliert wurden. Wir werden eine neue Version von Qiskit mit Unterstützung für Numpy 2.x veröffentlichen, sobald dies möglich ist.

    Wir können nicht verhindern, dass Ihr Paketmanager auf ältere Versionen von Qiskit zurückgreift (die zwar nicht den gleichen Pin haben, aber wahrscheinlich trotzdem inkompatibel sind), wenn Sie versuchen, Qiskit zwangsweise zusammen mit Numpy 2 zu installieren, bevor wir eine kompatible Version veröffentlicht haben.

  • Geändert wurde das Verhalten der VF2Layout und VF2PostLayout transpiler-Durchläufe, die zuvor ihre interne Auswertung mit Multithreading durchführten, wenn die Eingabeschaltungen ausreichend groß waren. Die Multithreading-Nutzung wurde nun aus den Pässen entfernt, da sich gezeigt hat, dass sie zu einem Leistungsrückgang führt, statt wie ursprünglich beabsichtigt zu einer Verbesserung.

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