Skip to main content
IBM Quantum Platform

Qiskit SDK 2.0 Versionshinweise


2.0.3

Vorspiel

Qiskit v2.0.3 ist ein Bugfix-Release für die v2.0 minor Versionsreihe.

Fehlerkorrekturen

  • ApplyLayout wird nun den Fall der Anwendung eines Null-Qubits korrekt behandeln Layout. Zuvor wurde behauptet, es sei kein Layout festgelegt worden, selbst wenn das Feld "layout" der Datei PropertySet gleich Layout() war.

  • Es wurde ein Problem im ElidePermutations transpiler-Durchgang, bei dem die Ausgabe-Permutation nicht korrekt aktualisiert wurde, wenn es PermutationGate operationen. Dies würde dazu führen, dass eine falsche Ausgangsschaltung und eine falsche virtual_permutation_layout Eigenschaft in der property_set eingestellt wird. Wenn es als Teil eines größeren PassManager würde dies auch dazu führen, dass eine falsche TranspileLayout zurückgegeben wird, in der QuantumCircuit.layout in der Ausgangsschaltung.

  • Es wurde ein Fehler im HighLevelSynthesis pass beim Abrollen von verschachtelten/angepassten Instruction objekten. Wenn die QuantumCircuit zurückgegeben von Instruction.definition eines benutzerdefinierten Objekts irgendwelche Clbit objekte enthalten, würden diese klassischen Bits fälschlicherweise den internen Index innerhalb der Instruction.definition QuantumCircuit verwenden, anstatt sie auf den entsprechenden Index in der äußeren QuantumCircuit.

  • Ein Fehler im Programm PauliEvolutionSynthesisDefault und PauliEvolutionSynthesisRustiq plugins behoben, der das Attribut.synthesis der ursprünglichen Schaltung beim Setzen von preserve_order=False veränderte. Das Verhalten der Plugins wurde wiederhergestellt, und der ursprüngliche Schaltkreis bleibt nun in der gesamten Transpilationspipeline erhalten.

  • Ein Kompatibilitätsproblem mit der minimal unterstützten Version von rustworkx, 0.15, wurde behoben. Bei bestimmten Eingaben werden die VF2Layout und VF2PostLayout eine rustworkx-Methode verwendet, die in rustworkx 0.16.0 hinzugefügt wurde, was zu einem Fehler führte, wenn eine ältere rustworkx-Version verwendet wurde, die als unterstützt aufgeführt ist.

  • SabreLayout und SabreSwap gerät nicht mehr in Panik, wenn es das Routing-Ergebnis auf eine Schaltung anwendet, die expr.Var oder Stretch objekte in einem verschachtelten Kontrollflussbereich verwendet.

  • qiskit.circuit.library.quantum_volume() wurde aktualisiert, um ein numpy.random.Generator als Eingabe für sein Argument seed zu behandeln. Früher hätte ein solches Generator-Argument zu einer TypeError geführt.


2.0.2

Vorspiel

Qiskit v2.0.2 ist ein Bugfix-Release für die v2.0 minor Versionsreihe.

Fehlerkorrekturen

  • Behoben wurde das name attribut der OrGate klasse korrigiert, so dass es jetzt auf "or" gesetzt ist, um dieses Tor eindeutig zu identifizieren. Zuvor war er fälschlicherweise auf "and" gesetzt, was es unmöglich machte, ihn von AndGate zu unterscheiden oder Synthese-Plugins zur Synthese eines OrGate.

  • Es wurde ein Problem im ConsolidateBlocks transpiler-Durchgang behoben, bei dem die Konsolidierung einiger Blöcke fehlschlug, wenn das ausgewählte KAK-Gate (entweder direkt oder über das Ziel) supergesteuert ist und nicht CXGate. Behoben #14413

  • Ein Fehler in den Schaltkreisfunktionen wurde behoben evolved_operator_ansatz(), qaoa_ansatz() und hamiltonian_variational_ansatz(), bei denen die Parameter eine komplexe Komponente von Null hatten. Dies war normalerweise kein Problem, es sei denn, der Parameter wurde mit der Methode SymPy in ParameterExpression.sympify() methode übersetzt, was dann einen Fehler auslösen würde.


2.0.1

Vorspiel

Qiskit v2.0.1 ist ein kleineres Bugfix-Release für die v2.0.x Release-Serie.

Fehlerkorrekturen

  • Es wurde ein Visualisierungsfehler in der Textkreislauf-Schublade behoben, bei dem die abschließende "Klammer" von Post-Transpilations-Kontrollfluss-Operationen vertikal durcheinander dargestellt werden konnte. Siehe #14271 für weitere Einzelheiten.

  • Es wurde ein Fehler im UnitarySynthesis transpiler-Durchgang, bei dem der Durchgang den Parameter synth_gates ignorierte und nur die unitary Gatter synthetisierte. Der Durchlauf synthetisiert nun korrekt alle im Parameter synth_gates angegebenen Gates. Behoben #14343.

  • Hinzugefügt wurde die fehlende repr Unterstützung für Duration.

  • Fehlende Unterstützung für Python Beizen von Duration. Dadurch wurde die parallele Umsetzung von Schaltungen mit delay() anweisungen, die Dauerausdrücke verwenden.

  • Es wurde ein Problem im HighLevelSynthesis transpiler-Durchlaufs behoben, der dazu führte, dass er bei bestimmten Schaltungen mit Kontrollflussoperationen fälschlicherweise vorzeitig abgebrochen wurde. Behoben #14338

  • Die Konstruktion von Instantaneous Quantum Polynomial time (IQP) Schaltungen in IQP und durch iqp(). Die bisherige Implementierung verwendete fälschlicherweise Potenzen des T\sqrt{T} Gatters anstelle von Potenzen des TT Gatters.

  • SabreLayout propagiert nun korrekt die name und metadata felder einer Schaltung korrekt weiter, wenn sie als gemeinsamer Layout- und Routing-Durchgang ausgeführt werden.

  • Es wurde ein Problem im SolovayKitaevSynthesis unitären Synthese-Plugin behoben, bei dem durch wiederholtes Ausführen des Plugins mit verschiedenen Basisgattern fälschlicherweise nur die Basisgatter des ersten Laufs wiederverwendet wurden. Dieses Problem war darauf zurückzuführen, dass beim Zwischenspeichern von Basisannäherungen die Basistore ignoriert wurden.

  • Es wurde ein Problem im SolovayKitaev transpiler-Durchgang, bei dem es zu einem Absturz kommen konnte, wenn eine 180-Grad-Drehung in der internen Rekursion auftrat, die nicht korrekt behandelt wurde.

  • Es wurde ein Problem im SolovayKitaev transpiler-Durchgang behoben, bei dem die generierte Annäherung eine Phase haben konnte, die um π\pi vom korrekten Wert abwich. Dies ist auf die interne SO(3)SO(3) Darstellung zurückzuführen, die eine zusätzliche Behandlung erfordert, um das richtige Vorzeichen der Qubit-Gate-Matrix zu erhalten. Behoben #9552

  • Schaltungen, die Verzögerungen mit Dehnungen enthalten (siehe QuantumCircuit.add_stretch()), können nun erfolgreich mit den voreingestellten Pass-Managern kompiliert werden (transpile() und generate_preset_pass_manager()) erfolgreich kompiliert werden, wenn sie auf ein Backend mit Ausrichtungsbeschränkungen abzielen, z. B. IBM Quantum Eagle-Geräte wie ibm_sherbrooke.

  • Die Fallback-Fehlerheuristik in VF2Layout und VF2PostLayoutdie verwendet wurde, als es keine gemeldeten Fehlerquoten gab, konnte früher Fehler größer als eins zuweisen und unvorhersehbare Auswirkungen auf die resultierenden Layout-Scores haben.


2.0.0

Vorspiel

Wir freuen uns, Qiskit v2.0.0 mit neuen Funktionen zu veröffentlichen, die seine Leistung und Fähigkeiten verbessern. Zu den wichtigsten Funktionen von Qiskit v2.0.0 gehören:

  • Die Einführung einer C-API zur Erstellung von und Interaktion mit SparseObservable objekten. Diese erste kompilierte Sprachschnittstelle stellt einen wichtigen Meilenstein in der Entwicklung von Qiskit dar und wird im Laufe der Versionsreihe v2.x an Umfang gewinnen. Die erste Iteration der C-API ist eine experimentelle Funktion, und es kann in kleineren Versionen, die unserer Versionsstrategie folgen, Änderungen an der API geben.
  • Die Hinzufügung einer neuen BoxOp kontrollfluss-Operation, die dem OpenQASM 3-Konzept einer Box entspricht und die Gruppierung von Anweisungsreihen für die spätere Verarbeitung und benutzerdefinierte Planung ermöglicht. Dieser Operator ist u. a. für Anwendungen wie Zwirbeln, Rauschen lernen und streckungsbasierte Terminierung nützlich.
  • Die Möglichkeit, stretch Zeitdauern für Anweisungen zu erstellen Delay anweisungen zu erstellen, mit denen Beziehungen zwischen zeitabhängigen Anweisungen ausgedrückt werden können. Der neue Stretch typ erweitert das bestehende klassische Ausdruckssystem, so dass die Entwurfsabsicht zur Zeit der Schaltungskonstruktion erfasst und zur Kompilierzeit aufgelöst werden kann. Einzelheiten finden Sie in der Dokumentation OpenQASM.
  • Verbesserte Synthese, wenn a Target gebrochene Zwei-Qubit-Basistore mit Unterstützung für beliebige Winkel enthält, wie RZXGate oder RZZGatewas die Anzahl der Gatter in den synthetisierten Schaltungen erheblich reduziert.
  • Verbesserte Laufzeitleistung, insbesondere während des Schaltungsaufbaus, wo Benchpress-Benchmarking einen 2x Geschwindigkeitszuwachs gegenüber Qiskit v1.3 zeigt. Diese Verbesserung wird durch eine Kombination von Beiträgen erreicht, darunter die Nutzung zusätzlicher nativer Rust-Gate-Darstellungen, wie z. B UnitaryGateund das Entfernen von veralteten Datenmodellelementen.

Im Einklang mit unserer Politik der semantischen Versionierung, die zum Zeitpunkt der Veröffentlichung von v1.0.0 dokumentiert wurde, enthält diese Hauptversion auch API-Änderungen, die nicht rückwärtskompatibel mit der Versionsreihe v1.x sind. Insbesondere wurden mehrere veraltete Komponenten des Qiskit-Datenmodells entfernt, wie z. B. die Methode .c_if() , das Modul qobj , BackendV1 und qiskit.pulse sowie die veralteten primitiven Referenzimplementierungen V1. Weitere Einzelheiten zu all diesen Entfernungen und API-Änderungen finden Sie in den Abschnitten zu den Upgrade-Versionshinweisen. Die entfernten APIs werden in der Version Qiskit v1.4.x weiterhin unterstützt, die für weitere sechs Monate Fehlerbehebungen und für ein Jahr Sicherheitsupdates erhält.

Neue Funktionen

  • Der Support für die Plattform Linux aarch64 wurde zum Tier-1-Support befördert, wie in der Dokumentation dokumentiert:

    /guides/install-qiskit#Betriebssystem-Unterstützung

    von der bisherigen Unterstützungsstufe 2 in der Veröffentlichungsreihe v1.x.

  • Einführung einer neuen C-API zur Erstellung und Interaktion mit spärlichen Observablen. Obwohl die API-Oberfläche in dieser Version recht klein ist - sie umfasst nur die SparseObservable klasse abdeckt - stellt sie einen wichtigen Meilenstein in der Entwicklung von Qiskit dar, da das SDK zum ersten Mal eine öffentliche Schnittstelle in C offenlegt und die Grundlage für zukünftige Erweiterungen der Qiskit C-Schnittstelle legt. Da dies die erste öffentliche Schnittstelle in C ist, handelt es sich um eine experimentelle Funktion, und falls erforderlich, kann die API in einer kleineren Version geändert werden.

    Eine detaillierte Syntax und weitere Informationen finden Sie in der C-API-Dokumentation. Ein minimales Beispiel für die Konstruktion der 100-Qubit-Beobachtung ist 2 X0 Y1 Z2 :

    #include <complex.h>
    #include <qiskit.h>
    #include <stdint.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
        // build a 100-qubit empty observable
        uint32_t num_qubits = 100;
        QkObs *obs = qk_obs_zero(num_qubits);
    
        // add the term 2 * (X0 Y1 Z2) to the observable
        complex double coeff = 2;
        QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z};
        uint32_t indices[3] = {0, 1, 2};
        QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits};
        qk_obs_add_term(obs, &term);
    
        // print some properties
        printf("num_qubits: %u\n", qk_obs_num_qubits(obs));
        printf("num_terms: %lu\n", qk_obs_num_terms(obs));
    
        // free the memory allocated for the observable
        qk_obs_free(obs);
    
        return 0;
    }

Schaltkreise Funktionen

  • Hinzufügen einer neuen get_control_flow_name_mapping() funktion hinzugefügt, die eine Zuordnung von Qiskit-Kontrollfluss-Operationsnamen zu ihren entsprechenden Klassen zurückgibt.

    Beispielverwendung:

    from qiskit.circuit import get_control_flow_name_mapping
    
    ctrl_flow_name_map = get_control_flow_name_mapping()
    if_else_object = ctrl_flow_name_map["if_else"]
    
    print(if_else_object)
    <class 'qiskit.circuit.controlflow.if_else.IfElseOp'>
  • Es wurde eine neue Schaltkreis-Methode hinzugefügt, QuantumCircuit.estimate_duration()hinzugefügt, um die Dauer einer geplanten Schaltung nach der Transpilierung zu schätzen. Die Dauer eines Stromkreises wird geschätzt, indem der längste Weg auf einem geplanten Stromkreis auf der Grundlage der Dauer eines bestimmten Target. Diese Methode funktioniert nur für einfache Schaltungen, die keinen Kontrollfluss oder andere klassische Vorwärtsoperationen enthalten.

    Verwenden Sie diese Methode anstelle des veralteten QuantumCircuit.duration attribut, wenn Sie eine Schätzung der Gesamtdauer der Schaltung benötigen.

    Beispielverwendung:

    from qiskit import QuantumCircuit, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    backend = GenericBackendV2(num_qubits=3, seed=42)
    
    circ = QuantumCircuit(3)
    circ.cx(0, 1)
    circ.measure_all()
    circ.delay(1e15, 2)
    
    circuit_dt = transpile(circ, backend, scheduling_method="asap")
    duration = circuit_dt.estimate_duration(backend.target, unit="s")
    print("Estimated duration: ", duration)
  • Zwei neue Klassen hinzugefügt: BitFlipOracleGate und PhaseOracleGate. BitFlipOracleGate wurde als Alternative zur direkten Synthese von BooleanExpression eingeführt, die in Qiskit v2.0 entfernt worden ist. PhaseOracleGate wurde hinzugefügt als Alternative zu PhaseOraclehinzugefügt, da letzteres in den Versionen von v2.x veraltet sein wird. Beide Klassen teilen sich die Schnittstelle von PhaseOraclemit Ausnahme der Methode evaluate_bitstring , die nicht mehr vorhanden ist.

    BitFlipOracleGate synthetisiert ein Bit-Flip-Orakel anstelle eines Phasensprung-Orakels, d. h. es wirkt auf ein zusätzliches Qubit und kann als Anwendung einer Controlled-X-Operation betrachtet werden, bei der die Kontrolle durch den Wert des vom Orakel kodierten Ausdrucks bestimmt wird.

    from qiskit import QuantumCircuit
    from qiskit.circuit.library.bit_flip_oracle import BitFlipOracleGate
    qc = QuantumCircuit(5)
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = BitFlipOracleGate(bool_expr)
    qc.compose(oracle, inplace=True)
    qc.draw('mpl')
    qc.decompose().draw('mpl')
    _images/release_notes-1_00.png _images/release_notes-1_01.png
    from qiskit import QuantumCircuit
    from qiskit.circuit.library.phase_oracle import PhaseOracleGate
    qc = QuantumCircuit(5)
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = PhaseOracleGate(bool_expr)
    qc.compose(oracle, inplace=True)
    qc.draw('mpl')
    qc.decompose().draw('mpl')
    _images/release_notes-2_00.png _images/release_notes-2_01.png
  • Eine neue Kontrollfluss-OP, BoxOpund die zugehörige QuantumCircuit.box() methode und der Kontextmanager sind nun verfügbar unter qiskit.circuit.

    Der normale Weg, eine Box zu konstruieren, ist die Verwendung des QuantumCircuit.box() kontext-Manager:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(5)
    
    with qc.box():
      # This box "uses" qubits 0 and 1.
      qc.x(0)
      qc.z(1)
    
    # Boxes can be assigned a duration.
    with qc.box(duration=100, unit="ms"):
      # This box "uses" qubits 2, 3 and 4.
      # Qubit 4 undergoes no operations.
      qc.cx(2, 3)
      qc.noop(4)

    Die Qiskit "Box" entspricht fast direkt dem OpenQASM 3 Konzept einer Box.

    Alle von der Box "verwendeten" Qubits sind am Anfang und am Ende der Box zeitlich synchronisiert. Mit anderen Worten: Die Box hat für jedes verwendete Qubit die gleiche "Dauer", und die Startpunkte sind synchronisiert. Andere Operationen, die denselben Geltungsbereich haben wie die BoxOp selbst sehen die Box als atomar an; es ist gültig, eine Operation an einer ganzen Box vorbeizupendeln, wenn die Operation mit der Aktion der ganzen Box übereinstimmt, aber es ist nicht allgemein gültig, eine Operation in eine Box hinein oder aus einer Box heraus zu verschieben.

    Die wichtigsten Verwendungszwecke einer Box sind die Gruppierung einer Reihe von Befehlen für die spätere Verarbeitung (z. B. Gruppierung einer partiellen Schicht von Zwei-Qubit-Gattern) und die Planung eines zusammengesetzten Blocks in einem Bereich unter Verwendung einer relativen Planung innerhalb des Blocks (z. B. dynamische Entkopplung mehrerer Qubits in einer Gruppe). Qiskit's Compiler hat noch keine eingebauten Pässe, die Anweisungen gruppieren oder Anweisungen mit einer BoxOp.

    Der Transpiler unterstützt Routing und Layout bei Vorhandensein von Boxen und optimiert innerhalb der Box (bis zur Einstellung optimization_level ), führt aber noch keine Optimierungen rund um die atomare Struktur von Boxen durch. Die text- und Matplotlib -basierten Schaltkreiszeichner unterstützen Box. Der Export nach QPY und nach OpenQASM 3 wird unterstützt, obwohl OpenQASM 3 derzeit keine Möglichkeit bietet, ruhende Qubits innerhalb einer Box zu kennzeichnen (es wird erwartet, dass eine Spezifikationsänderung dies in naher Zukunft hinzufügen wird: siehe den entsprechenden Feature-Vorschlag ).

  • Ein neues Argument approximation_degree wurde zu CommutationChecker.commute() und CommutationChecker.commute_nodes(). Mit diesem Argument können Sie den Schwellenwert für die Annäherung festlegen, ab dem Gates als pendelnd bewertet werden. Siehe den Docstring von CommutationChecker für weitere Informationen.

  • Es wurde eine neue Schaltkreismethode hinzugefügt, QuantumCircuit.noop()hinzugefügt, die es ermöglicht, Qubits explizit als verwendet in einem Kontrollflusserstellungsbereich zu markieren, ohne ihnen eine entsprechende Operation hinzuzufügen.

  • Das klassische Modul für Echtzeit-Ausdrücke qiskit.circuit.classical kann nun konstante Ausdrücke darstellen. Die Klasse Expr klasse hat jetzt ein boolesches const Attribut, das angibt, ob der Ausdruck konstant ist. Auf diese Weise können wir erzwingen, dass Ausdrücke in bestimmten Kontexten zur Kompilierzeit auswertbar sein müssen.

    Alle Var ausdrücke gelten als non-const, während alle Value ausdrücke const sind.

    Ein Ausdruck, der nur aus anderen const-Ausdrücken besteht, ist ebenfalls const:

    from qiskit.circuit.classical import expr
    
    assert expr.bit_and(5, 6).const

    Ein Ausdruck, der einen nicht-konstanten Ausdruck enthält, ist nicht-konstant:

    from qiskit.circuit.classical import expr, types
    
    assert not expr.bit_and(5, expr.Var.new("a", types.Uint(5)).const
  • Das klassische Modul für Echtzeitausdrücke qiskit.circuit.classical kann nun Dauern darstellen, indem es den neuen Typ Duration.

    Das Modul qiskit.circuit hat auch eine neue Duration klasse, die als literaler Wert in klassischen Ausdrücken verwendet werden kann.

    Die Funktion lift() funktion kann verwendet werden, um einen Wertausdruck aus einer Duration instanz:

    from qiskit.circuit import Duration
    from qiskit.circuit.classical import expr
    
    expr.lift(Duration.dt(1000))
    # Value(Duration.dt(1000), Duration())
  • Das klassische Modul für Echtzeitausdrücke qiskit.circuit.classical kann nun IEEE-754 double-precision floating point values mit dem neuen Typ Float.

    Die Funktion lift() funktion kann verwendet werden, um einen Wertausdruck aus einem Python float zu erstellen:

    from qiskit.circuit.classical import expr
    
    expr.lift(5.0)
    # >>> Value(5.0, Float())

    Dieser Typ ist in erster Linie für die Verwendung in zeitbezogenen Ausdrücken (duration und stretch) vorgesehen. Es ist nicht kompatibel mit bitweisen oder logischen Operationen, obwohl es mit diesen verwendet werden kann, wenn sie zuerst explizit in etwas anderes gecastet werden.

  • Verringerung der Anzahl von Zwei-Qubit-Gattern bei der Zerlegung von mehrfach kontrollierten Ein-Qubit-Einheitsgattern. Zum Beispiel:

    • Für mehrfach kontrollierte YGate auf 10 Qubits wurde die CXGate die Anzahl um 56 % reduziert.
    • Für mehrfach kontrollierte HGate auf 10 Qubits wurde die CXGate die Anzahl um 56 % reduziert.
    • Für mehrfach gesteuerte SXGate und SXdgGate auf 10 Qubits wurde die CXGate anzahl um 80 % reduziert.
    • Für mehrfach kontrollierte UGate auf 10 Qubits wurde die CXGate um 31 % reduziert.
  • Das klassische Modul für Echtzeitausdrücke qiskit.circuit.classical kann nun arithmetische Operationen darstellen add(), sub(), mul(), und div() auf numerische und zeitliche Operanden darstellen.

    Zum Beispiel:

    from qiskit.circuit import QuantumCircuit, ClassicalRegister, Duration
    from qiskit.circuit.classical import expr
    
    # Subtract two integers
    cr = ClassicalRegister(4, "cr")
    qc = QuantumCircuit(cr)
    with qc.if_test(expr.equal(expr.sub(cr, 2), 3)):
        pass
    
    # Multiply a Duration by a Float
    with qc.if_test(expr.less(expr.mul(Duration.dt(200), 2.0), Duration.ns(500))):
        pass
    
    # Divide a Duration by a Duration to get a Float
    with qc.if_test(expr.greater(expr.div(Duration.dt(200), Duration.dt(400)), 0.5)):
        pass

    Weitere Beispiele finden Sie in der oben verlinkten Dokumentation auf Modulebene.

  • Der Konstruktor für UCGate hat jetzt ein neues optionales Argument, mux_simp, das einen booleschen Wert annimmt, der die Suche nach Vereinfachungen von Carvalho et al. Diese Optimierung ist standardmäßig aktiviert, identifiziert und entfernt unnötige Steuerelemente aus dem Multiplexer, wodurch die Anzahl der CX-Gatter und die Schaltungstiefe reduziert werden, insbesondere bei der Vorbereitung von trennbaren Zuständen mit Initialize.

  • Die Website PauliEvolutionGate unterstützt jetzt von Haus aus SparseObservables als Eingabe. Dies ermöglicht eine effiziente Handhabung der Evolution unter Projektoren, die als Kontrollen einer Phasendrehung implementiert werden und weniger Gatter benötigen als die explizite Erweiterung des Projektors im Sinne von Paulis. Zum Beispiel:

    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable("001")
    evo_proj = PauliEvolutionGate(obs, time=1)
    print(evo_proj.definition.draw())
  • Ein neuer Ausdrucksknoten Stretch wurde dem klassischen Ausdruckssystem hinzugefügt, um stretch Variablen darzustellen. Um eine neue Variable stretch zu erstellen, können Sie Folgendes verwenden QuantumCircuit.add_stretch(). Der resultierende Ausdruck ist ein konstanter Ausdruck vom Typ Duration, der als duration Argument einer delay().

    Um beispielsweise sicherzustellen, dass eine Folge von Gates zwischen zwei Barrieren unabhängig von ihrer tatsächlichen Dauer linksbündig ist, können Sie wie folgt vorgehen:

    from qiskit import QuantumCircuit
    from numpy import pi
    
    qc = QuantumCircuit(5)
    qc.barrier()
    qc.cx(0, 1)
    qc.u(pi/4, 0, pi/2, 2)
    qc.cx(3, 4)
    
    a = qc.add_stretch("a")
    b = qc.add_stretch("b")
    c = qc.add_stretch("c")
    
    # Use the stretches as Delay duration.
    qc.delay(a, [0, 1])
    qc.delay(b, 2)
    qc.delay(c, [3, 4])
    qc.barrier()

    Der Stretch ausdruck ist dem bestehenden Var ausdruck, der zur Darstellung klassischer Variablen in einer Schaltung verwendet wird, außer dass er konstant ist und immer vom Typ Duration. Er kann in anderen Ausdrücken verwendet werden (z. B. können Sie ihn mit einer numerischen Konstante multiplizieren) und QuantumCircuit bietet volle Scoping-Unterstützung (z. B. kann er von einem Kontrollflussbereich erfasst oder in diesem deklariert werden).

    Weitere Zusammenhänge und Beispiele sind in der Sprachspezifikation OpenQASM 3 zu finden.

  • Hinzugefügt Gate versionen der Einzelregister-Arithmetikgatter, die es dem Transpiler ermöglichen, Optimierungen auf hoher Ebene im Vergleich zu ihren QuantumCircuit varianten. Dies sind:

Primitive Funktionen

  • Hinzufügen einer neuen to_bool_array() methode zu der BitArray klasse hinzugefügt, die das Bit-Array als boolesches Array NumPy zurückgibt. Das Argument order kann verwendet werden, um die Endianness des Ausgabe-Arrays anzugeben.

Anbieter Funktionen

  • Es wurde die Möglichkeit hinzugefügt, die Eigenschaft dt von GenericBackendV2 im Klasseninitialisierer mit einem neuen dt Argument zu setzen. Beispielverwendung:

    from qiskit.providers.fake_provider import GenericBackendV2
    
    backend = GenericBackendV2(
      num_qubits = 5,
      basis_gates = ["cx", "id", "rz", "sx", "x"],
      dt = 2.22*e-10,
      seed = 42
    )

Quanteninformationsmerkmale

  • Hinzufügen einer neuen SparseObservable.to_sparse_list() methode hinzugefügt, um eine spärliche Listendarstellung einer SparseObservable. Zum Beispiel:

    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable.from_list([("+II", 1), ("-II", 1)])
    print(obs.to_sparse_list())  # [("+", [2], 1), ("-", [2], 1)]
  • Hinzufügen einer neuen SparseObservable.as_paulis() methode hinzugefügt, um eine spärliche Observable nur in Form von Paulis auszudrücken, indem alle Projektoren erweitert werden. Zum Beispiel:

    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable("+-")
    obs_paulis = obs.as_paulis()  # 1/4 ( II + XI - IX - XX )
  • Qiskit v2.0.0 unterstützt das Konstruieren einer SparsePauliOp aus einer SparseObservable mit Hilfe der neuen Methode SparsePauliOp.from_sparse_observable(). Es ist wichtig zu bedenken, dass SparseObservable objekte effizient Projektoren darstellen können, die eine exponentielle Anzahl von Termen in der SparsePauliOp.

  • SparseObservable unterstützt jetzt die Operator-Komposition mit der compose() methode, ähnlich wie bei anderen quantum_info klassen. Dies ist vergleichbar mit der Matrixmultiplikation, obwohl die Methode völlig matrixfrei ist.

  • SparseObservable.BitTerm hat ein neues Attribut, labeldas die einstellige Zeichenfolge Python enthält, die zur Darstellung des Begriffs in String-Labels verwendet wird.

  • Die Methode StabilizerState.expectation_value() methode kann nun einen Operator des Typs SparsePauliOp.

Synthesefunktionen

Transpiler-Funktionen

  • Es wurde Unterstützung für die Arbeit mit Target objekten, die Zwei-Qubit-Basistore enthalten, die beliebige Winkel enthalten, wie z. B RZZGatein den ConsolidateBlocks transpiler-Durchgang. Der bisherige Durchlauf schätzte die Anzahl der für eine Zerlegung erforderlichen Gatter nicht korrekt ab, was dazu führte, dass Blöcke nicht konsolidiert wurden, wo UnitarySynthesis den Block potenziell optimieren könnte. Intern erfolgt die Schätzung der Gatteranzahl mit Hilfe der TwoQubitControlledUDecomposer klasse.

    Zum Beispiel:

    from qiskit import QuantumCircuit
    from qiskit.transpiler import generate_preset_pass_manager
    from qiskit.transpiler.passes import ConsolidateBlocks
    
    qc = QuantumCircuit(2)
    qc.rzz(0.1, 0, 1)
    qc.rzz(0.2, 0, 1)
    # basis_gates contains fractional gate (rzz)
    consolidate_pass = ConsolidateBlocks(basis_gates=["rz", "rzz", "sx", "x", "rx"])
    block = consolidate_pass(qc)  # consolidate the circuit into a single unitary block
    block.draw(output='mpl')
    
    pm = generate_preset_pass_manager(
        optimization_level=2, basis_gates=["rz", "rzz", "sx", "x", "rx"]
    )
    tqc = pm.run(qc)  # synthesizing the circuit into basis gates
    tqc.draw(output='mpl')
  • Unterstützung für gebrochene Zwei-Qubit-Basistore, wie z. B RZZGatein den UnitarySynthesis transpiler-Durchgang. Die Zerlegung erfolgt mit dem TwoQubitControlledUDecomposerund unterstützt sowohl Standard- als auch benutzerdefinierte Basisgatter.

    Zum Beispiel:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import random_unitary
    from qiskit.transpiler.passes import UnitarySynthesis
    from qiskit.converters import circuit_to_dag, dag_to_circuit
    
    unitary = random_unitary(4, seed=1)
    qc = QuantumCircuit(2)
    qc.append(unitary, [0, 1])
    dag = circuit_to_dag(qc)
    
    # basis_gates contains fractional gate (rzz)
    circ = UnitarySynthesis(basis_gates=['rzz', 'rx', 'rz']).run(dag)
    dag_to_circuit(circ).draw(output='mpl')
  • Ein neuer Transpiler-Pass wurde hinzugefügt, LightConeder den Lichtkegel einer Schaltung zurückgibt, wenn eine Teilmenge von Qubits oder eine bestimmte Pauli-Kette gemessen wird.

    Zum Beispiel für die folgende Schaltung:

    _images/release_notes-3.png

    durch die Durchführung des Passes würden die Tore, die keinen Einfluss auf das Ergebnis haben, eliminiert:

    from qiskit.transpiler.passes.optimization.light_cone import LightCone
    from qiskit.transpiler.passmanager import PassManager
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(3,1)
    qc.h(range(3))
    qc.cx(0,1)
    qc.cx(2,1)
    qc.h(range(3))
    qc.measure(0,0)
    
    pm = PassManager([LightCone()])
    new_circuit = pm.run(qc)
    new_circuit.draw("mpl")
    _images/release_notes-4.png
  • Ein neues Argument max_block_width wurde zu der BlockCollector klasse und zu den CollectLinearFunctions und CollectCliffords transpilerübergänge. Mit diesem Argument können Sie die maximale Anzahl von Qubits begrenzen, über die ein Knotenblock definiert wird.

    Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import CollectLinearFunctions
    
    qc = QuantumCircuit(5)
    qc.h(0)
    qc.cx(0, 1)
    qc.cx(1, 2)
    qc.cx(2, 3)
    qc.cx(3, 4)
    
    # Collects all CX-gates into a single block 
    qc1 = CollectLinearFunctions()(qc)
    qc1.draw(output='mpl')
    
    # Collects CX-gates into two blocks of width 3 
    qc2 = CollectLinearFunctions(max_block_width=3)(qc)
    qc2.draw(output='mpl')
  • Hinzufügen einer neuen Option, collect_from_back, zum CollectMultiQBlocks transpiler-Pass. Bei der Einstellung True werden die Blöcke in umgekehrter Richtung gesammelt, von den Ausgängen zu den Eingängen der Schaltung. Die Blöcke werden weiterhin in der normalen topologischen Reihenfolge gemeldet. Dies führt zu einer zusätzlichen Flexibilität, die der Pass bietet, und zu zusätzlichen Optimierungsmöglichkeiten, wenn er mit einer Schaltungsresynthesemethode kombiniert wird.

  • Ein neues approximation_degree Argument wurde zu CommutationAnalysis. Mit diesem Argument können Sie den Schwellenwert für die Annäherung festlegen, ab dem Gates als kommutierend bewertet werden. Weitere Informationen finden Sie im Docstring der Klasse.

  • Ein neuer Transpiler-Pass, ContractIdleWiresInControlFlow, ist verfügbar in qiskit.transpiler.passes. In diesem Durchgang werden Qubits aus Kontrollflussblöcken entfernt, wenn die Semantik dies zulässt und das Qubit während der gesamten Kontrollflussoperation inaktiv bleibt. Zuvor konnte die Routing-Stufe der voreingestellten Pass-Manager als unbeabsichtigte Nebenwirkung der Funktionsweise der Pässe ungenutzte Qubits entfernen. Jetzt wird dieses Verhalten im Rahmen eines Optimierungsdurchgangs ordnungsgemäß behandelt.

  • Eine neue "default" Routing-Plugin-Stufe wurde hinzugefügt. In Qiskit v2.0.0 ist dies einfach ein Alias für die bisherige Voreinstellung "sabre". Der zugrundeliegende Standardalgorithmus kann sich im Laufe der Qiskit v2.x Versionsreihe für einige oder alle Ziele ändern, aber Sie können jederzeit explizit routing_method="sabre" einstellen, um das aktuelle Verhalten beizubehalten.

  • Eine neue "default" Übersetzungs-Plugin-Stufe wurde hinzugefügt. In Qiskit v2.0.0 ist dies ein Alias für die bisherige Standardeinstellung "translator". Der zugrundeliegende Standardalgorithmus kann sich im Laufe der Qiskit 2.x Serie für einige oder alle Ziele ändern, aber Sie können jederzeit translation_method="translator" explizit einstellen, um das aktuelle Verhalten beizubehalten.

  • Der HighLevelSynthesis transpiler-Durchgang synthetisiert nun Objekte des Typs AnnotatedOperation über die Plugin-Schnittstelle.

  • PassManager.run() akzeptiert jetzt ein property_set Argument, das auf ein Mapping-objekt gesetzt werden kann, um die Anfangswerte der Pipeline PropertySet. Dies kann dazu verwendet werden, eine teilweise durchgeführte Kompilierung erneut zu beginnen oder bestimmte Analysen aus einer früheren Kompilierung an einer neuen Stelle wieder zu verwenden.

  • Die Terminierung verläuft PadDelay und PadDynamicalDecoupling haben jetzt neue Argumente für ihre Konstrukteure: target und durations. Diese werden verwendet, um die Target oder InstructionDurations zu spezifizieren. Für den Zugriff auf die Befehlsdauern bei der Ausführung des Durchlaufs ist eines der Argumente erforderlich.

  • Hinzufügen einer neuen seconds_to_dt() methode zu der Target klasse. Dies wird verwendet, um eine Dauer in Sekunden in eine Anzahl diskretisierter Zeitschritte der im Attribut Target.dt attribut angegeben ist. Dies ist typischerweise nützlich für die Konvertierung des InstructionProperties.duration wertes in Einheiten von dt.

  • Der Split2QUnitaries transpiler-Pass wurde erweitert, um den Fall zu behandeln, dass die betrachtete Unitary als ein SwapGate gatter und zwei Ein-Qubit-Gatter geschrieben werden kann. In diesem Fall wird die Unitary geteilt und auch eine virtuelle Vertauschung vorgenommen, ähnlich wie in ElidePermutations. Diese Funktionalität kann mit einem neuen Argument, split_swap, im Konstruktor von :class`.Split2QUnitaries` gesteuert werden, mit dem die Aufteilung von Swap-äquivalenten Gates deaktiviert werden kann.

Versch. Funktionen

  • qiskit.utils enthält nun Hilfsprogramme zur besseren Kontrolle und Überprüfung von Qiskits multiprocessing parallelisierungseinstellungen. Insbesondere kann man nun mit should_run_in_parallel() abfragen, ob parallel_map() (und Pass-Manager) bei geeigneten Eingaben Unterprozesse starten, und den Kontextmanager should_run_in_parallel.override() verwenden, um die meisten System- und Benutzerkonfigurationen für diese Entscheidung vorübergehend außer Kraft zu setzen.

    Eine zusätzliche Funktion, default_num_processes()liest die standardmäßige maximale Anzahl von Unterprozessen, die Qiskit für prozessbasierte Parallelität verwendet.

  • Eine neue Umgebungsvariable, QISKIT_IGNORE_USER_SETTINGS, steuert nun, ob die Benutzereinstellungsdatei auf import qiskit gelesen werden soll. Ist der Wert auf die Zeichenkette true gesetzt, wird die Einstellungsdatei nicht gelesen. Dies ist nützlich, um bestimmte Instanzen von Qiskit von der Systemumgebung zu isolieren, z. B. für Tests.

Anmerkungen zu Upgrades

  • Qiskit v2.0 hat die Unterstützung für Linux i686 und 32-Bit-Windows eingestellt. Ab Qiskit v2.0.0 ist eine 64-Bit-Plattform erforderlich, um Qiskit auszuführen. Dies entspricht dem Trend in der wissenschaftlichen Gemeinschaft Python und ermöglicht es Qiskit, sich auf Leistungsverbesserungen für immer komplexere Quantencomputerhardware zu konzentrieren.

    Qiskit v1.4 wird weiterhin 32-Bit-Plattformen bis zum Ende der Lebensdauer (September 2025) unterstützen, aber ab dieser Version 2.0.0 wird Qiskit keine vorkompilierten Binärdateien mehr für diese Plattformen veröffentlichen und bietet keine Garantie für erfolgreiche Quellcode-Builds auf 32-Bit-Plattformen.

  • Die minimal unterstützte Rust-Version für die Erstellung von Qiskit aus dem Quellcode ist nun v1.79. Diese wurde von v1.70, der vorherigen minimal unterstützten Rust-Version in der Qiskit v1.x Release-Serie, angehoben.

  • Qiskit Pulse wurde in dieser Version vollständig entfernt, nachdem es in Qiskit v1.3 veraltet war. Dazu gehören alle Impulsmoduldateien, die Impulsvisualisierungsfunktionalität, die Unterstützung von ScheduleBlock und die Serialisierung und Deserialisierung von Impulsgattern in QPY, die Verwaltung von Kalibrierungen in QuantumCircuit, Target und DAGCircuitund puls-basierte Fake-Backends. Weitere Einzelheiten zu den entfernten Komponenten im Zusammenhang mit dem Impuls finden Sie in den entsprechenden Abschnitten unten.

    Beachten Sie, dass die Migration von Pulse zu Qiskit Dynamics, die ursprünglich nach der Abschaffung von Pulse geplant war, aufgrund der Entwicklungsprioritäten von Qiskit Dynamics auf Eis gelegt wurde. Benutzer, die Qiskit Pulse als Frontend für unterstützende Backends oder in anderen Anwendungsfällen verwenden möchten, können es weiterhin in Qiskit-Versionen vor v2.0.0 verwenden, die die Pulse-Funktionalität enthalten.

  • Die Funktionen sequence und schedule aus dem Modul compiler modul wurden entfernt, nachdem sie in Qiskit v1.3 veraltet sind. Sie verließen sich auf die Möglichkeit, Schaltungen mithilfe von Backend-Definitionen in Impulskomponenten zu übersetzen, eine Fähigkeit, die nicht mehr vorhanden ist. Aus diesem Grund wurden sie entfernt, ohne dass eine Alternative vorgeschlagen wurde. Beachten Sie, dass sich diese Entfernungen auf das Paket Pulse beziehen, das auch in Qiskit 2.0 entfernt wird.

Hinweise zur Aktualisierung von Schaltkreisen

  • Bit und Register sowie ihre Unterklassen sind nicht mehr garantiert vergleichbar, wenn man is prüft, da Konvertierungen von und nach Python jede Instanz, die Python ausgesetzt ist, neu zuordnen können.

  • Bit und Register (und ihre Unterklassen) können nicht mehr unterklassifiziert werden. Dies war nie als unterstütztes Verhalten vorgesehen und würde ein nicht spezifiziertes Verhalten in Qiskit verursachen. Es ist nicht mehr möglich, dies als Implementierungsdetail der Klassen zu tun.

  • Es ist nicht mehr möglich, Instanzen der Basis Bit und Register klassen zu erzeugen. Die direkte Instanziierung dieser Klassen wurde eindeutig als etwas dokumentiert, das nicht unterstützt wurde, und die Möglichkeit, dies zu tun, war lediglich ein Implementierungsartefakt der Klassenhierarchie in früheren Versionen. Ab Qiskit v2.0.0 ist dies nicht mehr möglich.

  • Das Modul qiskit.circuit.classicalfunction wurde entfernt, nachdem es in Qiskit v1.4 nicht mehr empfohlen wird. Dazu gehören die Klasse ClassicalFunction , die damit verbundene Funktion classical_function und die Klasse BooleanExpression . Diese Änderung wurde vorgenommen, um die Abhängigkeit von der tweedledum Bibliothek zu entfernen, die nicht mehr mit allen von Qiskit unterstützten Plattformen und Python Versionen kompatibel ist. ClassicalFunction wurde ausschließlich verwendet in PhaseOracleverwendet, das nun nur noch Ausdrücke im Format string akzeptiert (siehe folgende Release Note). BooleanExpression wurde ersetzt durch die neue BitFlipOracleGate klasse.

  • Die Klasse PhaseOracle klasse hängt nicht mehr von der Bibliothek tweedledum ab, da die Abhängigkeit nicht aktiv gepflegt wird. Die Schnittstelle wurde vereinfacht: Sie akzeptiert keinen Parameter synthesizer mehr, und der Parameter expression kann nur eine Zeichenkette sein. Der zuvor akzeptierte Typ ClassicalFunction , der in Qiskit v1.4 veraltet war, wurde in Qiskit v2.0 entfernt.

    Trotz dieser Erweiterungen bleibt die Standardverwendung der PhaseOracle klasse unverändert bleiben:

    from qiskit.circuit.library.phase_oracle import PhaseOracle
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = PhaseOracle(bool_expr)
    oracle.draw('mpl')
    _images/release_notes-5.png

    Beachten Sie, dass diese Änderung die Effektivität der Synthese beeinträchtigen kann, aber für die Kompatibilität mit allen von Qiskit unterstützten Plattformen und Python Versionen erforderlich war.

  • Aktualisierung der Metrik zur Überprüfung von Kommutationen in CommutationChecker. Es wird angenommen, dass zwei Gatter kommutieren, wenn die durchschnittliche Gattertreue der Kommutierung über (1 - 1e-12) liegt. Dieser Wert wurde gewählt, um Rundungsfehler bei der Berechnung der Wiedergabetreue zu berücksichtigen und um die Konsistenz mit RemoveIdentityEquivalent und TwoQubitWeylDecomposition. Weitere Informationen finden Sie im Docstring der Klasse.

  • Die Methode QuantumCircuit.measure_active() hat den Namen des klassischen Registers, das sie erstellt, geändert, da der vorherige Name mit einem reservierten Wort OpenQASM in Konflikt stand. Anstelle von measure heißt es nun meas, was dem Registernamen entspricht, der von measure_all().

  • Die Methode DAGCircuit.control_flow_op_nodes() methode wurde aktualisiert und gibt nun immer eine Liste zurück, auch wenn diese leer ist. Zuvor wurde None zurückgegeben, wenn die Liste leer war, und es wurde nie eine leere Liste zurückgegeben, was eine besondere Behandlung erforderte. Wenn Sie sowohl in Qiskit v1.x als auch in v2.x explizit auf Leerheit testen müssen, können Sie das tun:

    control_flow_nodes = dag.control_flow_op_nodes()
    if not control_flow_nodes:
        # There are no control-flow nodes.
        pass
  • BlueprintCircuit.copy_empty_like() gibt nun eine leere QuantumCircuit mit der gleichen Anzahl von Qubits und Clbits und den gleichen Metadaten wie die ursprüngliche Schaltung zurück, statt einer BlueprintCircuit. Diese Änderung behebt ein unerwartetes Verhalten, bei dem der Umgang mit einer "leeren" Kopie eines Blaupausenschaltkreises dazu führte, dass die Schaltkreisdaten neu erstellt wurden. Beachten Sie, dass BlueprintCircuit.copy() immer noch ein BlueprintCircuit zurückgibt. BlueprintCircuit ist zwar keine öffentliche Klasse, da es sich um einen internen Typ handelt, der für die Erstellung von Legacy-Einträgen in qiskit.circuit.library verwendet wird, hat dies Auswirkungen auf seine Unterklassen wie NLocal und ZZFeatureMap. Eine vollständige Liste der von dieser Änderung betroffenen Klassen finden Sie in der qiskit.circuit.library für eine vollständige Liste der Klassen, die von dieser Änderung betroffen sind. Behoben #13535

  • Die interne Funktion qiskit.circuit.add_control.add_control wurde entfernt. Diese Funktion war nicht Teil der öffentlichen API, hatte anfällige Vorbedingungen zu erfüllen und war eine häufige Quelle von Fehlern. Die Verwendung von add_control(SomeGate(...), ...) sollte auf SomeGate(...).control(...) umgestellt werden Gate.control() stattdessen verwenden, was weitaus sicherer ist.

  • Die Methode ParameterExpression.sympify() methode kann nun eine MissingOptionalLibrary Ausnahme auslösen, wenn sympy nicht installiert ist. In den Versionen von Qiskit v1.x wurde sympy immer garantiert installiert, aber ab v2.0.0 ist dies keine zwingende Voraussetzung mehr und wird möglicherweise nur noch benötigt, wenn Sie diese Methode verwenden. Da diese Funktion ausdrücklich sympy erfordert, müssen Sie sicherstellen, dass Sie sympy installiert haben, um die Methode verwenden zu können.

  • Das veraltete DAGNode dag argument wurde aus der Klasse DAGNode klasse und ihren Unterklassen entfernt: DAGOpNode, DAGOutNode, und DAGInNode.

    Der Parameter dag war ein optionales Argument bei der Erstellung dieser Objekte, aber er wird seit der Version v1.3 nicht mehr verwendet und ignoriert und ist seit der Version v1.4 veraltet.

  • Die folgenden QuantumCircuit methoden:

    • cast
    • cbit_argument_conversion
    • cls_instances
    • cls_prefix
    • qbit_argument_conversion

    wurden entfernt, nachdem sie in Qiskit 1.2 nicht mehr empfohlen werden. Bei diesen Methoden handelte es sich um interne Hilfsfunktionen, die nie als öffentliche API vorgesehen waren. Ein Ersatz ist nicht vorgesehen.

  • Die abgelehnten Attribute für Instruction und Gate: duration und unit wurden entfernt, so dass Sie die Argumente unit oder duration nicht mehr für jede qiskit.circuit.Instruction oder Unterklasse setzen. Diese Attribute wurden in Qiskit v1.3.0 veraltet und wurden verwendet, um einer einzelnen Anweisung eine benutzerdefinierte Ausführungsdauer und eine Einheit für diese Dauer zuzuordnen. Die Quelle der Wahrheit über die Dauer eines Tores ist jedoch die BackendV2 Targetdie die Dauer für jede vom Backend unterstützte Anweisung enthält. Die Dauer einer Anweisung ist in der Regel nicht vom Benutzer einstellbar und ist eine unveränderliche Eigenschaft des Backends. Wenn Sie diese Möglichkeit zuvor genutzt haben, um mit verschiedenen Gate-Dauern zu experimentieren, können Sie das InstructionProperties.duration feld in einer gegebenen Target ändern, um eine benutzerdefinierte Dauer für eine Anweisung in einem Backend festzulegen. (Die Einheit ist immer in Sekunden in der Target.)

  • Das abgelehnte Attribut für qiskit.circuit.Instruction und Gate: condition wurde entfernt. Diese Funktionalität wurde ersetzt durch die IfElseOp ersetzt, die zur Beschreibung einer klassischen Bedingung in einer Schaltung verwendet werden kann. Dieses Attribut wurde in der Version v1.3.0 veraltet.

  • Die abgelehnten Methoden für Instruction und Gate: c_if und condition_bits wurden entfernt. Diese Methoden wurden in der Version v1.3.0 veraltet. Diese Funktionalität wurde ersetzt durch die IfElseOp ersetzt, die zur Beschreibung einer klassischen Bedingung in einer Schaltung verwendet werden kann. Zum Beispiel eine Schaltung, die zuvor Instruction.c_if() verwendet hat, wie:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.x(0).c_if(0, 1)
    qc.z(1.c_if(1, 0)
    qc.measure(0, 0)
    qc.measure(1, 1)

    Kann wie folgt erneut geschrieben werden:

    qc = QuantumCircuit(2, 2)
    qc.h(0)
    with expected.if_test((expected.clbits[0], True)):
        qc.x(0)
    with expected.if_test((expected.clbits[1], False)):
        qc.z(1)
    qc.measure(0, 0)
    qc.measure(1, 1)
  • Die veraltete Methode InstructionSet.c_if wurde entfernt. Diese Methode wurde in der Version 1.3.0 veraltet. Diese Funktionalität wurde ersetzt durch die IfElseOp ersetzt, die zur Beschreibung einer klassischen Bedingung in einem Schaltkreis verwendet werden kann.

  • Im Rahmen der Entfernung von Pulse in Qiskit v2.0.0 wurde die Eigenschaft calibrations aus der Datei QuantumCircuit, DAGCircuit und DAGDependency klassen entfernt. Darüber hinaus wurde die Methode has_calibration_for aus den Modulen QuantumCircuit und DAGCircuit entfernt, und add_calibration wurde aus den Klassen QuantumCircuit.

  • Das Modul qiskit.circuit.classicalfunction ist entfernt worden. Dieses Modul war von der Bibliothek tweedledum abhängig, die mit neueren Versionen von Python nicht kompatibel ist. Alternativ können die PhaseOracleGate und BitFlipOracleGate klassen verwendet werden, um Schaltkreise aus booleschen Ausdrücken zu erzeugen.

  • Die interne Darstellung von UnitaryGate beim Hinzufügen zu einer QuantumCircuit hat sich geändert. Das im Schaltkreis gespeicherte Objekt hat nicht mehr notwendigerweise einen gemeinsamen Bezug zu dem Objekt, das dem Schaltkreis hinzugefügt wurde. Dieses Verhalten war nie garantiert, und das direkte Ändern des UnitaryGate objekts direkt oder per Verweis war immer unsicher und konnte die Schaltung beschädigen, insbesondere wenn die Matrix geändert wurde. Wenn Sie ein Element im Schaltkreis verändern müssen (was nicht empfohlen wird, da es ineffizient und fehleranfällig ist), tun Sie etwas wie:

    from qiskit.circuit import QuantumCircuit
    from qiskit.quantum_info import random_unitary
    from qiskit.circuit.library import UnitaryGate
    import numpy as np
    
    qc = QuantumCircuit(2)
    qc.unitary(np.eye(2, dtype=complex))
    
    new_op = UnitaryGate(random_unitary(2))
    qc.data[0] = qc.data[0].replace(operation=new_op)

    Dies gilt auch für DAGCircuit, aber Sie können stattdessen auch DAGCircuit.substitute_node() stattdessen verwenden.

  • Das CircuitInstruction.params attribut für eine CircuitInstruction das ein UnitaryGate für sein operation enthält, enthält nicht mehr die zugrunde liegende unitäre Matrix für das Tor. Der Grund dafür ist, dass die interne Darstellung des Gatters das Matrixobjekt nicht mehr als Parameter behandelt. Wenn Sie auf die Matrix des Gates zugreifen müssen, können Sie dies entweder über die CircuitInstruction.matrix oder das UnitaryGate.params feld des CircuitInstruction.operation.

Hinweise zum Upgrade von Primitives

  • Infolge der Abschaffung des Modells BackendV1 werden die BackendSamplerV2 und BackendEstimatorV2 keine Eingaben des Typs BackendV1 in ihrem backend -Eingangsargument mehr akzeptieren.

  • Primitive V1 Implementierungen und V1-exclusive nicht versionierte Typ-Aliase, die in Qiskit v1.2 veraltet sind, wurden entfernt. Diese Schnittstellen sind durch ihre V2 Pendants ersetzt worden. Der Umzug umfasst die folgenden Klassen, die die Schnittstellen von V1 implementieren:

    Sowie die folgenden nicht versionierten Typ-Aliase:

    Diese Entfernung betrifft NICHT die explizit versionierten abstrakten Schnittstellendefinitionen BaseEstimatorV1 und BaseSamplerV1 oder die zugehörigen Ergebnis- und Auftragsklassen, die aus Gründen der Abwärtskompatibilität beibehalten wurden. Wenn Sie einen nicht versionierten V1-type -Alias wie BaseEstimator verwenden, können Sie ihn direkt durch den versionierten Typ ersetzen (BaseEstimatorV1).

    Außerdem wurden die folgenden Hilfsfunktionen entfernt. Diese Funktionen wurden nur in Primitive V1 Implementierungen verwendet:

Hinweise zum Upgrade für Anbieter

  • Die Methode configuration von BasicSimulator wurde entfernt, nachdem sie in Qiskit v1.3 veraltet ist. Diese Methode gibt eine BackendConfiguration -Instanz zurück, eine Klasse, die Teil des eingestellten BackendV1 -Workflows war und auch in Qiskit v2.0.0 entfernt wird. Die einzelnen Konfigurationselemente können nun direkt aus dem Backend oder aus der enthaltenen Target instanz (backend.target).

  • Die Methode run_experiment von BasicSimulator wurde entfernt. Diese Methode nahm eine Instanz der Klasse QasmQobjExperiment als Eingabeargument, eine Klasse, die seit Qiskit v1.2 veraltet ist und mit dem Workflow Qobj in Qiskit v2.0.0 entfernt wurde.

  • Das Modell BackendV1 wurde entfernt, nachdem es in Qiskit 1.2.0 veraltet ist. Dazu gehören die Klasse BackendV1 sowie die zugehörigen Module und Hilfsprogramme, da sie durch das BackendV2 modell ersetzt wurden. Die Liste der entfernten Gegenstände umfasst:

    • BackendV1 klasse: der Kern des entfernten Modells

    • Alle Elemente in qiskit/providers/models, da sie zur Darstellung von Komponenten des Modells BackendV1 verwendet wurden:

      • BackendConfiguration
      • BackendProperties
      • BackendStatus
      • QasmBackendConfiguration
      • PulseBackendConfiguration
      • UchannelLO
      • GateConfig
      • PulseDefaults
      • PulseQobjDef
      • Command
      • GateProperties
      • Nduv
      • JobStatus: Diese Klasse wurde durch die weiter verbreitete Klasse JobStatus
      • PulseDefaults
    • BackendV2Converter klasse: für die Konvertierung von BackendV1 in BackendV2

    • convert_to_target funktion: zum Aufbau einer Target instanz aus alten BackendV1 Komponenten (wie BackendConfiguration oder BackendProperties)

    • BackendPropertyError und BackendConfigurationError: Ausnahmen in Verbindung mit entfernten Klassen

  • Das BasicSimulator backend kann den klassischen Kontrollfluss nicht mehr simulieren. Es unterstützte nur die Verwendung von .c_if()/.condition zur Modellierung des Kontrollflusses, aber diese Konstruktion wurde nun aus dem Qiskit-Datenmodell entfernt.

  • Alle gefälschten Backend-Klassen, die auf dem veralteten BackendV1 basieren, wurden aus dem providers.fake_provider modul entfernt. Diese Klassen sind seit Qiskit 1.2 veraltet und waren Teil des veralteten BackendV1 Workflows. Ihre Verwendung in Tests wurde ersetzt durch die GenericBackendV2 klasse ersetzt, die es erlaubt, eigene Instanzen von BackendV2 zu erstellen, die eine simulierte BackendV2.run(). Die Entfernung betrifft:

    • Basisklassen:

      • FakeBackend
      • FakePulseBackend
      • FakeQasmBackend
    • Fake-Backends für spezielle Testzwecke:

      • Fake1Q
      • FakeOpenPulse2Q
      • FakeOpenPulse3Q
    • Ältere gefälschte Backends:

      • Fake5QV1
      • Fake20QV1
      • Fake7QPulseV1
      • Fake27QPulseV1
      • Fake127QPulseV1
  • Als Teil der Impulsentfernung in Qiskit v2.0.0 wurden die folgenden Methoden entfernt:

    • qiskit.providers.BackendV2.instruction_schedule_map
    • qiskit.providers.BackendV2.drive_channel
    • qiskit.providers.BackendV2.measure_channel
    • qiskit.providers.BackendV2.acquire_channel
    • qiskit.providers.BackendV2.control_channel
  • Im Rahmen der Entfernung von Impulsen in Qiskit v2.0.0 wurde die Unterstützung von Impulsen entfernt aus GenericBackendV2. Dazu gehört die Möglichkeit, das Backend mit benutzerdefinierten Kalibrierungen (calibrate_instructions Argument) und Impulskanalattributen (drive_channel, measure_channel, acquire_channel, control_channel) zu initialisieren.

  • Die abstrakten Basisklassen Provider und ProviderV1, die seit Qiskit v1.1.0 veraltet sind, wurden entfernt. Die von diesen Schnittstellendefinitionen gebotene Abstraktion bot keinen nennenswerten Wert, da sie lediglich die Attribute name, backends und eine Methode get_backend() umfasste.

    Ein Provider als Konzept wird weiterhin als eine Sammlung von Backends existieren. Wenn Sie derzeit einen Anbieter implementieren, können Sie Ihren Code anpassen, indem Sie einfach ProviderV1 als übergeordnete Klasse Ihrer Implementierung entfernen.

    Als Teil dieser Änderung werden Sie wahrscheinlich eine Implementierung von get_backend aus Gründen der Abwärtskompatibilität hinzufügen wollen. Zum Beispiel:

    def get_backend(self, name=None, **kwargs):
      backend = self.backends(name, **kwargs)
      if len(backends) > 1:
        raise QiskitBackendNotFoundError("More than one backend matches the criteria")
      if not backends:
        raise QiskitBackendNotFoundError("No backend matches the criteria")
      return backends[0]

QPY-Upgrade-Hinweise

  • Die Funktion qpy.load() funktion kann nun eine MissingOptionalLibrary Ausnahme auslösen, wenn eine QPY v10, v11 oder v12 Nutzlast übergeben wird, die symengine symbolische Ausdrücke verwendet und symengine nicht installiert ist. Die Ausnahme wird auch dann ausgelöst, wenn sympy nicht für eine andere QPY-Nutzlast vor v13 installiert ist. In den Qiskit v1.x Versionen wurden symengine und sympy immer garantiert installiert. Ab v2.x ist dies jedoch nicht mehr zwingend erforderlich und wird nur noch benötigt, wenn Sie eine QPY-Datei deserialisieren, die mit symengine erzeugt wurde. Das Parsen dieser QPY-Nutzdaten erfordert symengine , da seine Verwendung Teil der Formatspezifikation für QPY v10, v11 und v12 ist. Wenn die Nutzlast dies erfordert, ist die Installation einer kompatiblen Version von symengine (0.11.0 oder 0.13.0) die einzige Möglichkeit. In ähnlicher Weise wurde sympy für die ParameterExpression kodierung für alle QPY-Versionen 1 - 12 verwendet.

  • Die Mindestversion der QPY-Kompatibilität, QPY_COMPATIBILITY_VERSIONwurde von 10 (die Anforderung von v1.x ) auf 13 angehoben. Diese Version bestimmt die Mindestversion von QPY, die von der qpy.dump() funktion ausgegeben wird. Das bedeutet, dass qpy.dump() in dieser Version nur QPY v13 und v14 ausgeben kann. QPY v13 ist weiterhin kompatibel zu Qiskit v1.3.x und v1.4.x, d.h. Nutzdaten, die in Qiskit v2.x mit QPY v13 erzeugt wurden, können auch mit der Qiskit v1.x Release-Serie geladen werden.

    Diese Änderung war notwendig, weil die QPY Versionen 10 -12 entweder die sympy oder die symengine Bibliothek benötigen, um eine Serialisierung für ParameterExpression objekte zu erzeugen, aber in Qiskit 2.x ist keine der beiden Bibliotheken für das ParameterExpression objekt.

  • Mit der Entfernung von pulse in Qiskit v2.0.0 wurde die Unterstützung für die Serialisierung von ScheduleBlock Programmen durch die qiskit.qpy.dump() funktion entfernt worden. Benutzer können weiterhin Nutzdaten mit Impulsgattern laden, indem sie die Funktion qiskit.qpy.load() funktion laden, allerdings werden sie als undurchsichtige benutzerdefinierte Anweisungen behandelt. Das Laden von ScheduleBlock Payloads wird nicht mehr unterstützt und führt zu einer QpyError ausnahme.

Hinweise zum Upgrade der Synthese

  • Das atomic_evolution aufrufbare Argument von ProductFormula (und seinen Unterklassen QDrift, LieTrotter, und SuzukiTrotter ) hat eine neue Funktionssignatur. Die alte Signatur würde einen Pauli-Operator und einen Zeitkoeffizienten nehmen und den Evolutionskreis zurückgeben:

    def atomic_evolution(pauli_op: SparsePauliOp, time: float) -> QuantumCircuit:
      evol_circuit = QuantumCircuit(pauli_op.num_qubits)
      # append operators to circuit
      return evol_circuit

    Die neue Signatur nimmt direkt einen bestehenden Schaltkreis auf und sollte die Entwicklung des gegebenen Pauli und der gegebenen Zeit an diesen Schaltkreis anhängen:

    def atomic_evolution(evol_circuit: QuantumCircuit, pauli_op: SparsePauliOp, time: float):
      # append operators to circuit, in-place modification

    Diese neue Implementierung zeichnet sich durch eine deutlich bessere Leistung aus.

Hinweise zum Transpiler-Upgrade

  • Der Mindestschwellenwert, ab dem Gatter als identisch gelten, wurde erhöht RemoveIdentityEquivalent von Maschinen-Epsilon auf 1e-12 angehoben, um Rundungsfehler bei der Treueberechnung zu berücksichtigen und um die Konsistenz mit den anderen Klassen, wie CommutationAnalysis und TwoQubitWeylDecomposition.

  • Der Routing-Plugin-Bühnenname default ist nun für das gleichnamige, in Qiskit integrierte Plugin reserviert.

  • Die Standard-Routing-Plugin-Stufe ist jetzt "default". In Qiskit v2.0.0 ist dies einfach ein Alias für die bisherige Voreinstellung "sabre". Der zugrundeliegende Standardalgorithmus kann sich im Laufe der Qiskit v2.x Versionsreihe für einige oder alle Ziele ändern, aber Sie können jederzeit explizit routing_method="sabre" setzen, um das aktuelle Verhalten beizubehalten.

  • Der Stage-Name des Übersetzungs-Plugins default ist jetzt für das gleichnamige integrierte Qiskit-Plugin reserviert.

  • Die Standardstufe des Übersetzungs-Plugins ist jetzt "default". In Qiskit 2.0 ist dies einfach ein Alias für die bisherige Voreinstellung "translator". Der zugrundeliegende Standardalgorithmus kann sich im Laufe der Qiskit 2.x Serie für einige oder alle Ziele ändern, aber Sie können jederzeit translation_method="translator" explizit einstellen, um das aktuelle Verhalten beizubehalten.

  • Die alten Zeitplanungsläufe ASAPSchedule, ALAPSchedule, DynamicalDecoupling und AlignMeasures wurden zugunsten der aktualisierten Alternativen ALAPScheduleAnalysis, ASAPScheduleAnalysis, PadDynamicalDecoupling, und ConstrainedReschedule entfernt. Diese wurden in Qiskit v1.1 veraltet, nachdem der neue Planungsworkflow den alten abgelöst hatte.

  • Für den Fall, dass weder eine target noch ein Satz von basis_gates spezifiziert sind, synthetisiert der HighLevelSynthesis transpiler-Durchgang Schaltungen mit annotierten Operationen mit weniger Schichten von Wrappings als zuvor synthetisiert (dies geschieht zum Beispiel für die Schaltung, die von multiplier_cumulative_h18()).

  • Das Schlüsselwortargument property_set ist jetzt reserviert in BasePassManager.run()reserviert und kann nicht als kwarg verwendet werden, das an die Konvertierung der Unterklasse von der Front-End-Darstellung in die interne Darstellung weitergegeben wird.

  • Die folgenden veralteten Verwendungen des BackendProperties -Objekts in der Transpilierungspipeline wurden in Qiskit entfernt 2.0:

    Die folgenden Durchgänge wurden ebenfalls aktualisiert und akzeptieren nun nur noch eine target anstelle von:

    Die Klasse BackendProperties ist seit Qiskit v1.2 veraltet, da sie Teil des BackendV1 Workflows war. Spezifische Anweisungseigenschaften, wie z.B. Gatterfehler oder Dauern, können einer Target bei der Konstruktion durch die Target.add_instruction() methode hinzugefügt und über das Eingangsargument target an die entsprechenden Transpilerdurchläufe weitergegeben werden.

  • Als Folge der Abschaffung des Modells BackendV1 wurden die akzeptierten Eingabetypen der folgenden Transpiler-Objekte aktualisiert:

  • Der ResetAfterMeasureSimplification transpiler-Pass verwendet nun ein IfElseOp zur Bedingung der Ausführung des XGate anstatt ein condition Attribut für das Gatter zu setzen. Der Grund dafür ist, dass das Attribut condition aus dem Qiskit-Datenmodell entfernt wurde.

  • Der veraltete ConvertConditionsToIfOps transpiler pass wurde entfernt. Das zugrunde liegende condition Attribut von Instruction klasse wurde entfernt, so dass dieser Transpiler-Durchgang nichts mehr zu konvertieren hatte. Stattdessen sollten Sie direkt IfElseOp verwenden, um die Ausführung einer Operation klassisch zu konditionieren.

  • Die PadDelay und PadDynamicalDecoupling benötigen nun ein neues Argument, wenn sie konstruiert werden. Entweder target oder durations müssen mit einem Target oder InstructionDurations angegeben werden. Ohne diese können die Pässe die Dauer der Anweisungen in der Schaltung nicht bestimmen und machen Fehler. Zuvor wurden diese Werte aus dem nun entfernten Attribut duration von Instruction objekten.

  • Der zuvor veraltete AlignMeasures Transpiler-Pass wurde entfernt. Dieser Pass wurde in Qiskit v1.1.0 veraltet. Stattdessen sollte der ConstrainedReschedule pass verwendet werden. ConstrainedReschedule erfüllt dieselbe Funktion und unterstützt darüber hinaus die Ausrichtung an zusätzlichen Zeitbeschränkungen.

  • Bei der Terminierung mit generate_preset_pass_manager() oder transpile()das Argument instruction_durations angegeben wird, werden die Dauern als list formatiert und in Einheiten von dt angegeben. Sie müssen auch das Eingangsargument dt der Transpilationsfunktion setzen.

  • Das veraltete Attribut " DAGNode.sort_key " wurde entfernt. Dieses Attribut wurde in der Qiskit v1.4.0 Version veraltet. Da die lexikographische topologische Sortierung intern in Rust durchgeführt wird und das Attribut sort key unbenutzt war, wurde dieses Attribut entfernt, um den Overhead bei der Erstellung von DAG-Knoten zu vermeiden. Wenn Sie sich auf den Sortierschlüssel verlassen haben, können Sie ihn von einem bestimmten Knoten aus reproduzieren, indem Sie etwas wie:

    def get_sort_key(node: DAGNode):
        if isinstance(node, (DAGInNode, DAGOutNode)):
            return str(node.wire)
        return ",".join(
            f"{dag.find_bit(q).index:04d}" for q in itertools.chain(node.qargs, node.cargs)
        )
  • Die folgenden transpile() und generate_preset_pass_manager() eingabeargumente, die seit Qiskit 1.3 veraltet sind, wurden aus der API entfernt:

    • instruction_durations
    • timing_constraints

    Darüber hinaus ist die Angabe von benutzerdefinierten Basisgattern über das Argument basis gate von transpile() und generate_preset_pass_manager(), das auch in Qiskit 1.3 veraltet ist, ist nicht mehr erlaubt, und ein ValueError wird in diesen Fällen ausgelöst.

    Die Informationen, die früher durch diese bereitgestellt wurden, können weiterhin über die Argumente backend oder target angegeben werden. Sie können eine Target-Instanz mit definierten Befehlsdauern erstellen:

    Target.from_configuration(..., instruction_durations=...)

    Für spezifische zeitliche Beschränkungen:

    Target.from_configuration(..., timing_constraints=...)

    Und für benutzerdefinierte Basis-Gates können Sie diese manuell zum Ziel hinzufügen oder z. B. .from_configuration mit einer benutzerdefinierten Namenszuordnung verwenden:

    from qiskit.circuit.library import XGate
    from qiskit.transpiler.target import Target
    
    basis_gates = ["my_x", "cx"]
    custom_name_mapping = {"my_x": XGate()}
    target = Target.from_configuration(
        basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping
    )
  • Die transpile() und generate_preset_pass_manager() schnittstellen lösen nun eine UserWarning aus, wenn sie eine coupling_map und/oder basis_gates zusammen mit einer backend bereitstellen. In diesen Fällen gibt es mehrere Wahrheitsquellen, die Absichten der Benutzer sind nicht immer klar, und es können Konflikte auftreten, die generate_preset_pass_manager() möglicherweise nicht wissen, wie sie zu lösen sind. Die vorgeschlagene Alternative besteht darin, ein benutzerdefiniertes Ziel zu definieren, das die gewählten Beschränkungen kombiniert.

    Eine dieser Situationen ist die Spezifikation eines Gatters mit 3 oder mehr Qubits in backend oder basis_gates zusammen mit einem kundenspezifischen coupling_map. Der Kopplungsplan liefert nicht die notwendigen Verbindungsdetails, um die Wirkung des Gatters bestimmen zu können. In diesen Fällen, transpile() und generate_preset_pass_manager() nun eine ValueError auf.

  • Im Rahmen der Entfernung von Impulsen in Qiskit 2.0 wurden alle impuls- und kalibrierungsbezogenen Funktionen im Transpiler entfernt.

    Die folgenden Pässe und Funktionen wurden entfernt:

    • qiskit.transpiler.passes.PulseGates bestanden
    • qiskit.transpiler.passes.ValidatePulseGates bestanden
    • qiskit.transpiler.passes.RXCalibrationBuilder bestanden
    • qiskit.transpiler.passes.RZXCalibrationBuilder bestanden
    • qiskit.transpiler.passes.RZXCalibrationBuilderNoEcho bestanden
    • qiskit.transpiler.passes.EchoRZXWeylDecomposition bestanden
    • qiskit.transpiler.passes.NoramlizeRXAngle bestanden
    • qiskit.transpiler.passes.rzx_templates() Funktion

    Das Argument inst_map wurde aus den folgenden Elementen entfernt:

    Die Kalibrierungsunterstützung wurde entfernt:

    • calibration wurde aus dem InstructionProperties konstruktor entfernt und ist nicht länger eine Eigenschaft dieser Klasse.
    • Die Methoden has_calibration, get_calibration, instruction_schedule_map und update_from_instruction_schedule_map wurden aus der Klasse Target klasse entfernt.
  • Der veraltete StochasticSwap Transpiler-Pass und das damit verbundene integrierte Routing-Stage-Plugin "stochastic" wurden entfernt. Diese wurden in der Qiskit v1.3.0 Version als veraltet markiert. Der Pass wurde durch die Klasse SabreSwap klasse ersetzt, die stattdessen verwendet werden sollte, da sie eine bessere Leistung und Ausgabequalität bietet. Zum Beispiel, wenn der Pass zuvor über die Transpile-Funktion aufgerufen wurde, wie z.B.:

    from qiskit import transpile
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import CouplingMap
    from qiskit.providers.fake_provider import GenericBackendV2
    
    
    qc = QuantumCircuit(4)
    qc.h(0)
    qc.cx(0, range(1, 4))
    qc.measure_all()
    
    cmap = CouplingMap.from_heavy_hex(3)
    backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap)
    
    tqc = transpile(
        qc,
        routing_method="stochastic",
        layout_method="dense",
        seed_transpiler=12342,
        target=backend.target
    )

    sollte dies ersetzt werden durch:

    tqc = transpile(
        qc,
        routing_method="sabre",
        layout_method="dense",
        seed_transpiler=12342,
        target=backend.target
    )
  • Der Pass qiskit.transpiler.passes.CXCancellation wurde entfernt. Es wurde zugunsten von class:.InverseCancellation,, das allgemeiner ist, veraltet. CXCancellation() ist semantisch vollständig äquivalent zu InverseCancellation([CXGate()]).

  • Der SolovayKitaev transpiler-Durchgang löst bei Schaltungen, die Ein-Qubit-Operationen ohne eine to_matrix -Methode (z. B. Measures, Barrieren und Kontrollflussoperationen) oder parametrisierte Ein-Qubit-Operationen enthalten, keine Ausnahme mehr aus, sondern lässt sie unverändert.

  • Plugins für die Übersetzungsstufe der Preset Pass Manager müssen nun die Target gate-Direktionalität in ihrer Ausgabe beachten. Zuvor, transpile() und generate_preset_pass_manager() würde eine PassManager die bei Bedarf Nachbesserungsarbeiten enthielt. Sie müssen diese nun in Ihre eigene benutzerdefinierte Stufe aufnehmen, wenn Ihre Stufe nicht garantiert, dass sie die Direktionalität beachtet.

    Sie können mit dem GateDirection pass verwenden, um dieselben Korrekturen vorzunehmen, die früher mit Qiskit durchgeführt wurden. Zum Beispiel:

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import GateDirection
    from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin
    
    class YourTranslationPlugin(PassManagerStagePlugin):
        def pass_manager(self, pass_manager_config, optimization_level):
            pm = PassManager([
                # ... whatever your current setup is ...
            ])
            # Add the two-qubit directionality-fixing pass.
            pm.append(GateDirection(
                pass_manager_config.coupling_map,
                pass_manager_config.target,
            ))
            return pm
  • Die voreingestellten Pass-Manager füllen nicht mehr die implizite pre_optimization Stufe ihrer Ausgabe StagedPassManager. Sie können nun Ihr eigenes PassManager diesem Feld zuordnen. Bisher konnte man nur an die bestehende PassManager.

  • Der Standardwert für das generate_routing_passmanager() argument seed_transpiler wurde von None auf -1 geändert. Diese Änderung wurde vorgenommen, weil dieses Flag nur zur Konfiguration des VF2PostLayout transpiler-Durchgang verwendet wurde, und für diesen Durchgang verschlechtert die Randomisierung normalerweise die Leistung und ist nicht wünschenswert. Wenn Sie sich auf den vorherigen Standardwert verlassen haben, können Sie dieses Verhalten wiederherstellen, indem Sie das Argument seed_transpiler=None explizit setzen. Wenn Sie explizit einen Startwert für diesen Parameter festgelegt haben, ändert sich das Verhalten nicht.

Hinweise zum Upgrade der Visualisierung

  • Der Parameter idle_wires in allen Schaltkreisschubladen wurde um die neue Option "auto" erweitert, die nun das Standardverhalten darstellt. Wenn Sie dennoch Drähte ohne Anweisungen anzeigen möchten, setzen Sie explizit idle_wires=True.

    Bei der Einstellung "auto" ist das Verhalten wie folgt:

    • Wenn der Stromkreis ein definiertes .layout -Attribut hat, wird idle_wires automatisch auf False gesetzt (Ausblenden von Leerlaufdrähten)
    • Andernfalls bleibt idle_wires True (zeigt alle Drähte an, wie es die vorherige Standardeinstellung war)

    Das folgende Beispiel zeigt eine Schaltung ohne Layout, die mit idle_wires="auto" angezeigt wird:

    qr_0: ────────
          ┌───┐┌─┐
    qr_1: ┤ H ├┤M├
          └───┘└╥┘
    cr_0: ══════╬═
                ║
    cr_1: ══════╩═

    Sobald ein Layout angewandt wird, setzt idle_wires="auto" idle_wires auf False und verbirgt die nicht genutzten Drähte:

              ┌───┐┌─┐
    qr_1 -> 1 ┤ H ├┤M├
              └───┘└╥┘
        cr_1: ══════╩═

    Wenn Sie alle Drähte eines Schaltkreises anzeigen möchten, stellen Sie idle_wires=True explizit ein:

         qr_0 -> 0 ────────
                   ┌───┐┌─┐
         qr_1 -> 1 ┤ H ├┤M├
                   └───┘└╥┘
    ancilla_0 -> 2 ──────╫─
                         ║
             cr_0: ══════╬═
                         ║
             cr_1: ══════╩═

    Da Quantencomputer auf mehr Qubits skalieren, können selbst kleine Schaltkreise nach der Transpilierung große Schaltkreisrepräsentationen erzeugen. Die Einstellung "auto" hilft, die Lesbarkeit zu verbessern, indem unnötige Drähte nach Möglichkeit ausgeblendet werden.

  • Die array_to_latex() funktion und Operator.draw() methode können nun eine MissingOptionalLibrary Ausnahme auslösen, wenn die sympy Bibliothek nicht installiert ist. In den Versionen von Qiskit v1.x wurden symengine und sympy immer garantiert installiert, aber ab v2.0.0 ist dies nicht mehr zwingend erforderlich. Die Visualisierung LaTeX für eine Matrix basiert auf der Bibliothek sympy . Wenn Sie diese Funktion verwenden, müssen Sie sicherstellen, dass Sie sympy installiert haben.

  • Infolge der Abschaffung des Modells BackendV1 wird die plot_gate_map(), plot_error_map() und plot_circuit_layout() keine Eingaben des Typs BackendV1 in ihrem backend -Eingangsargument mehr akzeptieren.

  • Die Zeitleisten-Schublade erfordert nun, dass das Argument target beim Aufruf angegeben wird. Da Anweisungen keine Dauerattribute mehr enthalten, ist dieses zusätzliche Argument erforderlich, um die Dauer für alle unterstützten Anweisungen anzugeben. Ohne dieses Argument hat die Zeitleistenschublade keinen Zugriff auf diese Informationen.

  • Als Teil der Entfernung von Pulse in Qiskit 2.0 wurde die Unterstützung für das Zeichnen von Pulsen über qiskit.visualization.pulse_drawer entfernt.

Versch. Anmerkungen zu Upgrades

  • Die deprecate_function und deprecate_arguments Dekoratoren, die seit Qiskit v0.24 (Mai 2023) veraltet sind, wurden in Qiskit v2.0.0 entfernt. Die aktuelle deprecate_func() ersetzt @deprecate_function und das aktuelle deprecate_arg() ersetzt @deprecate_arguments.

  • Die Funktion assemble und die zugehörigen Fähigkeiten (enthalten im Modul assembler ) wurden aus der Codebasis entfernt, nachdem sie in Qiskit v1.2 veraltet sind. assemble wurde verwendet, um eine Qobj im Rahmen des veralteten BackendV1 Workflows zu erstellen. Die Umwandlung ist nicht mehr notwendig, da die Transpilations- und Primitivpipeline Quantenschaltungen direkt verarbeitet, wodurch die Qobj überflüssig wird.

    Der Umzug umfasst die folgenden öffentlichen API-Komponenten:

    • qiskit.compiler.assemble Funktion
    • qiskit.assembler.assemble_circuits Funktion
    • qiskit.assembler.assemble_schedules Funktion
    • qiskit.assembler.disassemble Funktion
    • qiskit.assembler.RunConfig class
    • qiskit.circuit.Instruction.assemble-Methode
  • Die Struktur Qobj und die zugehörigen Klassen, die in Qiskit v1.2.0 veraltet sind, wurden entfernt. Sie wurden als Teil des BackendV1 Workflows eingeführt und sind für die Interaktion mit Backends nicht mehr notwendig BackendV2 backends. Diese Streichung betrifft die folgenden Klassen:

    • QobjExperimentHeader
    • QobjHeader
    • QasmQobj
    • QasmQobjInstruction
    • QasmQobjExperimentConfig
    • QasmQobjExperiment
    • QasmQobjConfig
    • QasmExperimentCalibrations
    • GateCalibration
    • PulseQobj
    • PulseQobjInstruction
    • PulseQobjExperimentConfig
    • PulseQobjExperiment
    • PulseQobjConfig
    • QobjMeasurementOption
    • PulseLibraryItem
  • Die Klassen MeasLevel und MeasReturnType , die zuvor in qobj/utils.py definiert waren, wurden nach result/models.py migriert, nachdem das Modul qobj entfernt wurde. Diese Klassen waren nicht Teil der öffentlichen API. Der Importpfad wurde aktualisiert von: from qiskit.qobj.utils import MeasLevel, MeasReturnType zu: from qiskit.result import MeasLevel, MeasReturnType.

  • Die Verwendung von Positionsargumenten im Konstruktor von Result wurde deaktiviert. Bitte setzen Sie alle Argumente in der kwarg-Syntax, d.h.: Result(backend_name="name", ....). Darüber hinaus wird das Argument qobj_id nicht mehr bei der Konstruktion der Result interna verwendet. Es ist immer noch möglich, qobj_id als generischen kwarg zu setzen, der dann im Metadatenfeld mit den anderen generischen kwargs landet.

  • Als Teil der Impulsentfernung in Qiskit 2.0.0 wurden die Funktionen sequence und schedule_circuit aus qiskit.scheduler zusammen mit der Klasse ScheduleConfig entfernt.

  • Das Modul qiskit.result.mitigation wurde entfernt, nachdem es in Qiskit v1.3 nicht mehr empfohlen wird. Die Entfernung umfasst die Klassen LocalReadoutMitigator und CorrelatedReadoutMitigator sowie die zugehörigen Hilfsprogramme. Es gibt keinen alternativen Pfad in Qiskit, da dessen Funktionalität durch das Addon `mthree ersetzt wurde. <https://github.com/Qiskit/qiskit-addon-mthree> `__

Veraltete Schaltungen

  • Das abgelehnte QuantumCircuit.duration attribut wurde nicht wie ursprünglich geplant in dieser Version entfernt. Sie wird stattdessen im Rahmen der Veröffentlichung von Qiskit v3.0.0 entfernt werden. Diese Funktionalität wurde durch die Methode QuantumCircuit.estimate_duration() methode ersetzt, die stattdessen verwendet werden sollte.

  • Die veraltete tupelartige Schnittstelle für CircuitInstruction wurde in dieser Version nicht wie ursprünglich geplant entfernt. Sie wird stattdessen in Qiskit v3.0.0 entfernt. Verwenden Sie stattdessen die operation, qubits, und clbits benannte Attribute.

  • Die Multiple-Control-Multiple-Target-Schaltkreisklasse MCMT ist nun veraltet und wurde ersetzt durch MCMTGateersetzt, die eine eigene Gate unterklasse ist. Die Verwendung eines Gatters anstelle einer Schaltung ermöglicht es dem Compiler, das Objekt auf einer höheren Abstraktionsebene zu betrachten, und erlaubt die Anwendung mehrerer Synthese-Plugins.

Transpiler-Veraltungen

  • Das abgelehnte DAGCircuit.duration attribut wurde nicht wie ursprünglich geplant in dieser Version entfernt. Sie wird stattdessen im Rahmen der Veröffentlichung von Qiskit v3.0.0 entfernt werden. Diese Funktionalität wurde durch die Methode QuantumCircuit.estimate_duration() methode ersetzt, die stattdessen verwendet werden sollte.

  • Das Argument propagate_condition von DAGCircuit.substitute_node() und DAGCircuit.substitute_node_with_dag() wurde veraltet. Mit der Entfernung von Instruction.condition aus dem Qiskit-Datenmodell hat diese Option keinen Sinn mehr. Wenn sie gesetzt ist, hat sie keine Wirkung mehr. Es wird nicht aus der Signatur entfernt, um die Kompatibilität während der Migration von Qiskit 1.x -> 2.0 zu erhalten. Diese Option wird in Qiskit 3.0 entfernt werden.

  • Die Funktion generate_pre_op_passmanager() ist veraltet. Sie wird in den Qiskit-Pass-Managern nicht mehr verwendet, und ihr Zweck ist nicht mehr gegeben. Ursprünglich diente sie als Korrekturstufe für Übersetzungs-Plugins, die die ISA-Direktionalität nicht berücksichtigten. Die Übersetzungsstufen müssen nun die Richtungsabhängigkeit beachten, so dass diese Funktion nicht benötigt wird und höchstwahrscheinlich auch nicht ersetzt werden muss.

Sicherheitsprobleme

  • Es wurde eine Sicherheitslücke in qpy.load() beim Laden von Payloads, die sympy zur Serialisierung von ParameterExpression objekte und andere symbolische Ausdrücke. Dazu gehören potenziell alle QPY-Nutzdaten, die die QPY-Version < 10 und optional 10, 11 und 12 verwenden, je nach der im Serialisierungsschritt verwendeten symbolischen Kodierung (qpy.dump()).

Fehlerkorrekturen

  • Es wurde eine Inkonsistenz im Transpilationsprozess bei der Behandlung von Gattern mit enger Identität behoben, bei der diese Gatter so ausgewertet wurden, dass sie mit allem durch CommutationAnalysisausgewertet, aber nicht durch RemoveIdentityEquivalent. Das zugrunde liegende Problem wurde verursacht durch RemoveIdentityEquivalent und CommutationAnalysis (und im weiteren Sinne, CommutativeInverseCancellation) unterschiedliche Metriken verwendet. Beide verwenden nun die durchschnittliche Gattertreue und denselben Schwellenwert, um zu beurteilen, ob ein Gatter als identisch zu behandeln ist (z. B. ein Drehgatter mit sehr kleinem Winkel). Weitere Informationen finden Sie in den Docstrings dieser Klassen. Behoben #13547.

  • Ein Fehler wurde behoben in QuantumCircuit.assign_parameters()behoben, der bei der Zuweisung von Parametern an Standardgatter auftrat, deren Definition bereits ausgelöst worden war. In diesem Fall wurden die neuen Werte nicht ordnungsgemäß an die Gate-Instanzen weitergegeben. Während die Schaltung selbst noch wie erwartet kompiliert wurde, wurde bei der Überprüfung der einzelnen Operationen immer noch der alte Parameter angezeigt.

    Zum Beispiel:

    from qiskit.circuit.library import EfficientSU2
    
    circuit = EfficientSU2(2, flatten=True)
    circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True)
    print(circuit.data[0].operation.params)  # would print θ[0] instead of 1.25

    Behoben #13478.

  • Es wurde ein Fehler in DAGCircuit der dazu führte, dass Ausgabe Var knoten während deepcopy und Pickling zu Eingabeknoten wurden.

  • Es wurde ein Versehen in der Klasse Target klasse, bei dem das Setzen eines neuen Wertes für das Attribut dt und der anschließende Aufruf von target.durations() nicht den aktualisierten Wert dt im zurückgegebenen InstructionDurations objekt angezeigt wurde. Dies wird nun durch eine Invalidierung des internen Zielinstruktionsdauern-Caches im dt Setter behoben.

  • Es wurde ein Problem im BasisTranslator transpilerdurchgang, bei dem die globale Phase der DAG nicht korrekt aktualisiert wurde. Behoben #14074.

  • Behebung eines Fehlers im HighLevelSynthesis transpiler-Durchgang behoben, bei dem jede Anweisung synthetisiert wurde, für die ein Synthese-Plugin verfügbar ist, unabhängig davon, ob die Anweisung bereits vom Target unterstützt wird oder Teil des explizit übergebenen basis_gates ist. Dieses Verhalten ist nun korrigiert, so dass solche bereits unterstützten Anweisungen nicht mehr synthetisiert werden.

  • Der InverseCancellation transpilationsdurchlauf läuft jetzt innerhalb von Kontrollflussblöcken. Zuvor wurden Gatterpaare ignoriert, die aufgehoben werden konnten, wenn sie innerhalb klassischer Blöcke definiert waren. Siehe #13437 für weitere Einzelheiten.

  • Fehler bei mehrfach gesteuerten Drehungen behoben, bei denen der Drehwinkel ein ParameterExpression. Der Versuch der Synthese würde in diesem Fall zu einem Fehler führen, der besagt, dass das Gatter nicht mit einem ungebundenen Parameter synthetisiert werden kann. Dieser Fehler betraf Multi-kontrollierte Rotationsschaltungsmethoden QuantumCircuit.mcrx(), :meth:.QuantumCircuit.mcry, und QuantumCircuit.mcrz()sowie beim Aufruf von RXGate.control(), RYGate.control(), oder RZGate.control() wenn der Drehwinkel ein ParameterExpression. Jetzt können diese mehrfach gesteuerten Rotationskreise synthetisiert werden, ohne einen Fehler zu verursachen.

  • Es wurde ein Fehler in QPY (qiskit.qpy), bei dem Schaltungen mit Gattern der Klasse MCMTGate enthalten, nicht serialisiert werden konnten. Siehe #13965.

  • Ein Fehler wurde behoben, der dazu führte, dass Statevector.expectation_value() zu falschen Ergebnissen für den Identitätsoperator führte, wenn der Zustandsvektor nicht normalisiert war. Behoben #13029

  • Die Umwandlung einer Quantenschaltung in ein Gatter mit converters.circuit_to_instruction() schlägt nun ordnungsgemäß fehl, wenn die gegebene Schaltung Kontrollflussanweisungen enthält.

  • Aufrufen einer AnalysisPass oder einer TransformationPass wie eine Funktion aufruft (wie in pass_ = MyPass(); pass_(qc)), werden nun alle Anforderungen berücksichtigt, die der Durchgang haben könnte. Zum Beispiel erfordern Zeitplanungsdurchläufe wie ALAPScheduleAnalysis erfordern, dass TimeUnitConversion vor ihnen ausgeführt wird. Die Ausführung des Passes mit Hilfe eines PassManager wurde diese Anforderung immer erfüllt, aber bisher wurde sie nicht erfüllt, wenn die Übergabe direkt aufgerufen wurde.

  • Wenn eine TranspilerError unterklasse durch eine Übergabe innerhalb eines Aufrufs von PassManger.run() ausgelöst wird, wird die Ausnahme nun verlustfrei weitergegeben, anstatt eine verkettete Ausnahme mit einem gelöschten Typ zu werden.

  • SabreSwap keine ungenutzten Qubit-Drähte mehr während des Routings aus Kontrollflussblöcken herausziehen. Dies war im Allgemeinen eine sinnvolle Optimierung, aber keine erwartete Nebenwirkung eines Routing-Durchlaufs. Sie können nun mit dem ContractIdleWiresInControlFlow pass verwenden, um diese Kontraktion durchzuführen.

  • Ein prozessbasierter Nicht-Determinismus in SparsePauliOp.to_matrix wurde behoben. Die genaue Reihenfolge der Fließkomma-Operationen in der Summierung variierte bisher je nach Prozess, ist nun aber bei verschiedenen Aufrufen desselben Skripts identisch. Siehe #13413.

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