Skip to main content
IBM Quantum Platform

Qiskit SDK 2.1 Versionshinweise


2.1.2

Vorspiel

Qiskit 2.1.2 ist ein kleines Patch-Release, das einige Fehler in der 2.1 Serie behebt.

Fehlerkorrekturen

  • In Qiskit 2.1.0 wurde der VF2PostLayout transpiler-Pass zur optimization Stufe des Preset-Pass-Managers hinzugefügt, wenn optimization_level=3. Der Ausgang des Passes wurde jedoch nie in die Schaltung eingespeist. In dieser Version wird der Pass aus der Phase optimization des voreingestellten Pass-Managers entfernt, um Laufzeitkosten zu sparen. In Qiskit 2.2.0 wird der Pass Teil der optimization Stufe sein und der Output wird angewendet, wenn der Pass ein besseres Layout findet.

  • Es wurde ein Problem im VF2Layout transpiler-Durchgang behoben, bei dem selbst bei einem festen Seed-Set die Ausgabe des Durchgangs potenziell nicht-deterministisch war; insbesondere wenn der Eingangsschaltkreis aktive Qubits hatte, die nur einzelne Qubit-Operationen enthielten. Behoben #14729

  • Es wurde ein Fehler in PassManager.run() behoben, bei dem die Funktion callback nicht aufgerufen wurde, wenn sie mit mehreren Schaltkreisen ausgeführt wurde. Der Rückruf wird nun bei jedem Durchlauf in jedem Schaltkreis korrekt ausgelöst, auch bei paralleler Ausführung.

  • Eingebaute Transpiler-Durchläufe, die die Eigenschaft final_layout setzen, behandeln die Aktualisierung dieses Feldes nun korrekt, wenn es bereits gesetzt war. Dies lässt sich daran erkennen, dass die Methode TranspileLayout.routing_permutation nun eine korrekte Permutation zurückgibt, nachdem sie mehr als einen Durchlauf durchgeführt hat, der final_layout setzt.

    Dies hatte keine Auswirkungen auf normale Anrufe bei transpile() oder generate_preset_pass_manager() die die eingebauten Plugins von Qiskit verwenden; keine in dieser Form konstruierte Pipeline würde versuchen, final_layout mehr als einmal zu setzen.

  • Es wurde ein Fehler in Target.instruction_supported() behoben, bei dem die Überprüfung der Qubit-Reihenfolge der Anweisung übersprungen wurde, wenn die Methode mit den Argumenten operation_name und parameters aufgerufen wurde, die mit einer bestehenden Anweisung übereinstimmten.

  • Es wurde ein Fehler behoben, der beim Export von Schaltungen mit Verzögerungsanweisungen unter Verwendung von ps Einheiten nach QASM3 auftrat.

  • Es wurde ein Fehler in der Anzeige des QFT schaltung. Zuvor, wenn QFT.inverse() aufgerufen wurde und dann die Attribute des QFT-Kreises geändert wurden, wurde der Name des QFT als "IQFT_dg" angezeigt. Dies war nicht korrekt, und jetzt wird "IQFT" korrekt angezeigt. Behoben #14758.

  • Ein Speicherleck in der Koordination der Verwendung von qk_circuit_get_instruction und qk_circuit_instruction_clear wurde behoben.

  • Die Fehlermeldung für ungültig angegebene Versionen in qpy.dump() um die Reaktion darauf zu erleichtern.

  • Es wurde ein Problem mit der Funktion generate_preset_pass_manager() funktion, die fälschlicherweise die Timing-Einschränkungsdaten ignorierte, die in einem Target objekt enthaltenen Timing Constraints ignorierte, wenn das Argument backend nicht gesetzt war. Behoben #14329

  • Es wurde ein Fehler in SparsePauliOp.simplify() bei dem die Methode Pauli-Terme auf der Grundlage der Größe ihrer Koeffizienten entfernte, bevor sie Duplikate kombinierte. Dies führte zu fehlerhaftem Verhalten in zwei wichtigen Randfällen:

    1. Wenn mehrere identische Pauli-Terme kleine Koeffizienten hatten, die einzeln unter der Vereinfachungsschwelle lagen, deren Summe aber die Schwelle überstieg, wurden diese Terme fälschlicherweise entfernt.
    2. Wenn mehrere identische Pauli-Terme Koeffizienten oberhalb des Schwellenwerts hatten, aber in der Summe nahe Null waren, wurden sie fälschlicherweise beibehalten.

    Siehe #14194 für weitere Einzelheiten.


2.1.1

Vorspiel

Qiskit 2.1.1 ist ein kleines Patch-Release, das einige Fehler in der 2.1 Serie behebt.

Fehlerkorrekturen

  • Es wurde ein Fehler in der DAGOpNode gleichheitsprüfung, bei der der Vergleich zweier DAGOpNode objekten, die eine BoxOp anweisung enthalten. Bisher wurde das Attribut BoxOp.unit bei der Gleichheitsprüfung nicht berücksichtigt, was dazu führen konnte, dass zwei ungleiche Knoten als gleich bewertet wurden.

  • Die Verwerfungswarnung für Python 3.9 wurde korrigiert, so dass beim Importieren von Qiskit korrekt erkannt wird, dass sie durch Anwendercode verursacht wurde. Zuvor konnte nicht erkannt werden, dass es sich um einen vom Benutzer verursachten Code handelte, und dies bedeutete, dass die Standard-Warnfilter von Python dem Benutzer die Warnung nicht anzeigten.

  • Das Verhalten des Arguments max_trials für VF2Layout wenn es auf None oder eine negative Zahl gesetzt wird. Der Durchlauf wurde so dokumentiert, dass er die Suche auf die Größe des Schaltkreises oder des Ziels beschränkt, wenn die Option auf None gesetzt wurde, und dass er negative Werte akzeptiert, um eine unbegrenzte Suche anzugeben. In 2.1.0 wurde dieses Verhalten jedoch fälschlicherweise geändert, so dass None eine unbegrenzte Suche durchführte und die Verwendung einer negativen Zahl einen Fehler verursachte. Diese Versäumnisse wurden korrigiert, so dass sich der Pass nun wie dokumentiert verhält und mit früheren Versionen übereinstimmt.

  • Ein Problem in High-Level-Synthese-Plugins wurde behoben MCXSynthesis1DirtyKG24 und MCXSynthesis2DirtyKG24 für MCXGate, wo die Plugins verfügbare saubere Hilfsqubits nicht als verfügbare schmutzige Hilfsqubits betrachteten. Insbesondere wurde das Plugin MCXSynthesis2DirtyKG24 kam nicht zur Anwendung, wenn ein sauberes und ein schmutziges Hilfsqubits zur Verfügung standen.

  • Es wurde ein Leistungsabfall bei der inkrementellen Erstellung von ParameterExpression durch Kombination einer großen Anzahl von Unterausdrücken. Behoben #14653


2.1.0

Vorspiel

Die neue Version von Qiskit v2.1 führt mehrere wichtige Verbesserungen in Schlüsselbereichen ein, darunter die C-API, Transpiler-Funktionen und die Benutzerfreundlichkeit von Quantenschaltungen. Darüber hinaus enthält sie viele allgemeine Verbesserungen und Fehlerbehebungen. Zu den wichtigsten Highlights gehören:

  • C-API-Erweiterungen: Aufbauend auf der Arbeit, die in der vorherigen Version begonnen wurde, bietet Qiskit v2.1 Unterstützung für die Erstellung und Interaktion mit Quantenschaltungen über C-API-Funktionen, die das Hinzufügen von Standardgattern, Standardbefehlen und unitären Gattern unterstützen. Außerdem wurde in dieser Version eine Reihe von C-Funktionen zur Erstellung und Bearbeitung eines Target objekts, als Vorbereitung für die Unterstützung eines vollständigen C-API-basierten Transpilierungs-Workflows in der nächsten Version. Darüber hinaus ist QkComplex64 jetzt als Struktur definiert und dient als Compiler-agnostische Darstellung für komplexe Zahlen bei der Arbeit mit der C-API von Qiskit. Die Header-Datei der C-API wurde ebenfalls aktualisiert, so dass sie allgemein kompatibel ist und nativ in C++ verwendet werden kann.
  • Unterstützung der Clifford+T-Basismenge: Das Transpilieren von Schaltungen für ein Ziel mit Clifford+T-Gattern wird jetzt sofort unterstützt. Wenn die Basismenge nur aus Clifford+T-Gattern besteht, sorgt Qiskit dafür, dass den voreingestellten Pass-Managern die entsprechenden Pässe für die Verarbeitung dieser Gatter hinzugefügt werden. Dies ist ein erster Schritt zur Unterstützung der Transpilation für fehlertolerante Backends.
  • Erweiterungen in BoxOp: Diese Version bietet die Möglichkeit, benutzerdefinierte Annotationen an BoxOp anweisungen anzuhängen, was das Konzept der Box-Anweisungen von OpenQASM 3 in Qiskit weiter unterstützt. Dazu gehört auch die Serialisierung von Kommentaren in den Formaten QASM und QPY. Außerdem wurde die Unterstützung für die Verwendung von Dehnungsdauern in Boxen hinzugefügt.
  • Python 3.9 deprecation: Python 3.9 ist ab Qiskit v2.1 veraltet und wird in Qiskit v2.3 nicht mehr unterstützt.

Weitere Einzelheiten zu den oben genannten Punkten und vieles mehr finden Sie in den nachstehenden Versionshinweisen und in der aktualisierten Dokumentation.

C-API-Funktionen

  • Die Qiskit C API ( qiskit.h ) unterstützt nun die Erstellung und Interaktion mit Quantenschaltungen. Im Mittelpunkt der C-API für Schaltungen steht der undurchsichtige Typ QkCircuit , der die Schaltung darstellt. Der Typ QkCircuit ermöglicht den Aufbau eines Schaltkreises mit jedem Schaltkreiselement, das nativ im internen Rust-Datenmodell von Qiskit für QuantumCircuit. Dazu gehören derzeit Standardtore, Measure, Delay, Reset, Barrier, und UnitaryGate. Die Möglichkeiten der C-API für Schaltkreise werden sich in zukünftigen Versionen erweitern, wenn weitere Teile des Qiskit-Datenmodells nativ in das interne Rust-Datenmodell aufgenommen werden, so dass sie in der C-API verwendet werden können.

    Sie können beispielsweise die C-API verwenden, um einen 1000-Qubit-GHZ-Zustand zu erzeugen:

    #include <qiskit.h>
    
    int main() {
        // Create an empty circuit with 1000 qubits and 1000 clbits
        QkCircuit *qc = qk_circuit_new(1000, 1000);
    
        // Add a Hadamard Gate on Qubit 0
        uint32_t one_qubit[1] = {0,};
        qk_circuit_gate(qc, QkGate_H, one_qubit, NULL); // The NULL pointer is for the parameter array.
                                                        // Since Hadamard doesn't have parameters it
                                                        // is never accessed.
    
        // Add the CX Gates:
        uint32_t qubits[2] = {0, 0};
        uint32_t num_qubits = qk_circuit_num_qubits(qc);
        for (int i = 1; i<num_qubits; i++) {
            qubits[1] = i;
            qk_circuit_gate(qc, QkGate_CX, qubits, NULL);
        }
    
        // Add the measurements:
        uint32_t num_clbits = qk_circuit_num_clbits(qc);
    
        for (uint32_t i = 0; i<num_clbits; i++) {
            qk_circuit_measure(qc, i, i);
        }
        qk_circuit_free(qc);
        return 0;
    }
  • Die Qiskit C API ( qiskit.h ) unterstützt nun die Erstellung eines Target um ein Transpilationsziel zu repräsentieren. Zum Beispiel:

    #include <qiskit.h>
    #include <math.h>
    
    int main() {
        // Create a Target with 3 qubits
        QkTarget *target = qk_target_new(3);
    
        // Create a Target Entry for a CX Gate
        QkTargetEntry *cx_entry = qk_target_entry_new(QkGate_CX);
        // Define properties for CX between qubits (0, 1) with a duration of 1.93e-9 sec and error rate 3.17e-10.
        uint32_t qargs[2] = {0, 1};
        qk_target_entry_add_property(cx_entry, qargs, 2, 1.93e-9, 3.17e-10);
        // Define properties for cx between qubits (1, 0) with a duration of 1.27e-9 sec and no error.
        uint32_t rev_qargs[2] = {1, 2};
        qk_target_entry_add_property(cx_entry, rev_qargs, 2, 1.27e-9, NAN);
        // Add the cx entry to the target.
        QkExitCode result_cx = qk_target_add_instruction(target, cx_entry);
        // Add global ideal Y gate entry to the target
        QkExitCode result_y = qk_target_add_instruction(target, qk_target_entry_new(QkGate_Y));
        // Create a Target entry for a Measurement with increasing duration and error as the qubit indices increase
        QkTargetEntry *measure = qk_target_entry_new_measure();
        for (uint32_t i = 0; i< qk_target_num_qubits(target); i++) {
            uint32_t q[1] = {i};
            qk_target_entry_add_property(measure, q, 1, 1e-6 * (i + 1), 1e-3 * (i + 1));
        }
        QkExitCode result_measure = qk_target_add_instruction(target, measure);
        return 0;
    }
    
  • Es wurde Unterstützung für die Abfrage der Qiskit-Versionsinformationen von der C-API mit Hilfe der folgenden Makros hinzugefügt:

    • QISKIT_VERSION_MAJOR : Enthält die Hauptversionsnummer.
    • QISKIT_VERSION_MINOR : Enthält die Nebenversionsnummer.
    • QISKIT_VERSION_PATCH : Enthält die Versionsnummer des Patches.
    • QISKIT_VERSION version: Enthält eine numerische Darstellung der Versionsinformationen, die für Vergleiche verwendet werden kann.
    • QISKIT_VERSION_NUMERIC(M,m,p) ein funktionsähnliches Makro, das die Version " M.m.p " als numerischen Wert zurückgibt, der für Vergleiche verwendet werden kann.

    Um zum Beispiel zu prüfen, ob die aktuelle Version mindestens 2.1.0 ist, können Sie verwenden:

    if (QISKIT_VERSION >= QISKIT_VERSION_NUMERIC(2, 1, 0)) {
        // Code for version 2.1.0 or later
    }
  • Aktiviert die C++-Kompatibilität für die C-API. Der generierte Header erlaubt nun den direkten Aufruf von Objekten und Funktionen aus C++. Eine 100-Qubit-Beobachtungsgröße mit dem Term XYZ auf den ersten 3 Qubits kann zum Beispiel wie folgt konstruiert werden

    #include <iostream>
    #include <complex>
    #include <vector>
    #include <qiskit.h>
    
    int main() {
        uint32_t num_qubits = 100;
    
        // Use smart pointer with custom deleter to manage QkObs memory
        QkObs *obs = qk_obs_zero(num_qubits);
    
        // Construct the observable term
        std::complex<double> coeff_complex = 2.0;
        QkComplex64 coeff = qk_complex64_from_native(coeff_complex);
        std::vector<QkBitTerm> bit_terms = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z};
        std::vector<uint32_t> indices = {0, 1, 2};
    
        QkObsTerm term {
            .coeff      = coeff,
            .len        = bit_terms.size(),
            .bit_terms  = bit_terms.data(),
            .indices    = indices.data(),
            .num_qubits = num_qubits
        };
    
        qk_obs_add_term(obs.get(), &term);
    
        // Print observable properties
        std::cout << "num_qubits: " << qk_obs_num_qubits(obs) << "\n";
        std::cout << "num_terms: "  << qk_obs_num_terms(obs)  << "\n";
    
        qk_obs_free(obs);
        return 0;
    }

Schaltkreise Funktionen

  • Hinzufügen einer Funktion random_circuit_from_graph() hinzugefügt, die einen zufälligen Schaltkreis erzeugt, der denselben Interaktionsgraphen wie der durch interaction_graph angegebene hervorruft.

    Die Wahrscheinlichkeit, dass eine Kante aus dem Interaktionsgraphen zufällig als Zwei-Qubit-Tor gezogen wird, kann vom Benutzer im Attribut "Gewicht" einer Kante im eingegebenen Interaktionsgraphen festgelegt werden. Wenn der Benutzer die Wahrscheinlichkeit nicht festlegt, wird jede Kante gleichmäßig gezogen. Das heißt, jedes Zwei-Qubit-Gatter, das durch eine Kante im Interaktionsgraphen repräsentiert wird, hat die gleiche Wahrscheinlichkeit, dem Zufallsschaltkreis hinzugefügt zu werden. Wenn nur eine Teilmenge der Kantenwahrscheinlichkeiten eingestellt ist, wird ValueError angezeigt.

    In diesem Beispiel ist cp_map eine Liste von Kanten mit beliebiger Gewichtung.

    from qiskit.circuit.random.utils import random_circuit_from_graph
    import rustworkx as rx
    pydi_graph = rx.PyDiGraph()
    n_q = 5
    cp_map = [(0, 1, 0.18), (1, 2, 0.15), (2, 3, 0.15), (3, 4, 0.22)]
    pydi_graph.extend_from_weighted_edge_list(cp_map)
    # cp_map can be passed in directly as interaction_graph
    qc = random_circuit_from_graph(interaction_graph = pydi_graph,
      min_2q_gate_per_edge = 1,
      max_operands = 2,
      measure = True,
      conditional = True,
      reset = True,
      seed = 0,
      insert_1q_oper = True,
      prob_conditional = 0.21,
      prob_reset = 0.1)
    qc.draw(output='mpl')
    _images/release_notes-1.png
  • Hinzufügen einer neuen QuantumCircuit methode: QuantumCircuit.has_control_flow_op() um zu prüfen, ob ein QuantumCircuit objekt irgendwelche Kontrollflussoperationen enthält.

  • Ein neues Modul qiskit.circuit.annotation und ein Hauptobjekt Annotation sind hinzugefügt worden.

    Anmerkungen sind eine Möglichkeit, Anweisungen (derzeit nur BoxOp) mit lokalen, benutzerdefinierten Daten zu versehen. Diese Daten sollen von benutzerdefinierten Transpilerdurchläufen verwendet werden. Mit Hilfe von Anmerkungen können Daten an bestimmte Anweisungen angehängt werden, anstatt das Objekt global-context PropertySet während der Kompilierung zu verwenden.

    Alle Annotation objekte haben ein Feld namespace . Dieser String-Schlüssel wird für Nachschlagewerke verwendet, so dass die Verbraucher feststellen können, ob sie eine bestimmte Anmerkung bearbeiten oder nicht. Derzeit gibt es keine Methoden zur Abfrage der abstrakten Semantik einer Annotation unterklasse abzufragen, aber es ist zu erwarten, dass diese in Zukunft erweitert werden.

    Siehe qiskit.circuit.annotation finden Sie eine ausführliche Beschreibung der Funktionen und Anwendungsfälle.

  • BoxOp instanzen (erstellt von QuantumCircuit.box()) können nun mit benutzerdefinierten Annotation instanzen versehen werden. Die Gleichheit zweier Kästchen hängt davon ab, dass die Anmerkungen gleich sind.

    Normalerweise wird dies erreicht, indem eine Liste von Anmerkungen als einziges Positionsargument übergeben wird, wenn man QuantumCircuit.box() in Form eines Kontext-Managers verwendet wird:

    from qiskit.circuit import annotation, QuantumCircuit
    
    class MyAnnotation(annotation.Annotation):
        namespace = "my.annotation"
    
        def __eq__(self, other):
            return isinstance(other, MyAnnotation)
    
    qc = QuantumCircuit()
    with qc.box([MyAnnotation()]):
        pass
  • Die Methode UnitaryGate.control() methode verwendet nun intern qs_decomposition() anstelle von Isometry für die Zerlegung, die zur Definition der kontrollierten UnitaryGate. Durch diese Änderung wird die Anzahl der CXGate die in der definition für die zurückgegebenen ControlledGate um etwa 2x.

  • Verbesserung der Synthese einer mehrfach gesteuerten U1Gateverbessert, so dass sie nicht exponentiell mit der Anzahl der Kontrollen wächst.

  • Das Attribut BoxOp.duration kann nun ein expr.Expr knoten mit dem Typ Durationsein, genau wie Delay.duration. Dazu gehört auch die Unterstützung Stretch für die Dauer einer BoxOp.

Primitive Funktionen

OpenQASM Funktionen

  • qasm3.dump() und qasm3.dumps() haben ein neues Argument annotation_handlers , das verwendet wird, um Instanzen von annotation.OpenQASM3Serializer dem OpenQASM 3 Exportprozess zur Verfügung zu stellen, der benutzerdefinierte Annotation objekte nach OpenQASM 3 serialisieren kann.

  • Wenn qiskit_qasm3_import>=0.6.0 installiert ist, qasm3.load() und qasm3.loads() haben ein neues Argument annotation_handlers , das verwendet wird, um Instanzen von annotation.OpenQASM3Serializer dem OpenQASM 3-Importprozess zur Verfügung zu stellen, der die benutzerdefinierten Annotation objekte von OpenQASM 3 deserialisieren kann. Diese Unterstützung ist derzeit auf box Anweisungen beschränkt, da dies die einzige Stelle ist, an der Qiskit Anmerkungen in seinem Datenmodell darstellen kann.

QPY-Funktionen

  • Hinzufügen einer neuen Version 15 des QPY-Formats mit Unterstützung für die neuen Annotation objekte, mit Unterstützung von externen Serialisierern und Deserialisierern. Das Format erlaubt es solchen Serialisierern, zustandsbehaftet zu sein, und es werden sichere Plätze im Binärformat für die benutzerdefinierten Zustandsobjekte und benutzerdefinierten Anmerkungsrepräsentationen zugewiesen.

  • qpy.dump() und qpy.load() haben jetzt ein optionales annotation_factories Argument, das verwendet wird, um Konstruktorfunktionen von annotation.QPYSerializer objekten zur Behandlung von Annotation unterklassen. Diese müssen, ähnlich wie bei metadata_serializer, vom Benutzer bereitgestellt werden, da Qiskit im Allgemeinen nicht alle möglichen extern definierten Annotation objekte kennen kann.

  • Hinzufügen einer neuen Funktion get_qpy_version() in das qpy modul hinzugefügt. Diese Funktion untersucht eine QPY-Datei und ermittelt die in der Nutzlast verwendete Version des QPY-Formats. Die Version wird als Ganzzahl zurückgegeben, die für Protokollierungs- oder Debugging-Zwecke verwendet werden kann. siehe #14201.

Quanteninformationsmerkmale

  • Eine neue Klasse, PauliLindbladMapwird hinzugefügt, die eine Pauli-basierte Parametrisierung einer Teilmenge von linearen Karten von Multi-Qubit-Operatoren ist, die in Rauschlernanwendungen verwendet werden. Es wird erwartet, dass diese Klasse das Rückgrat von verbesserten Algorithmen zum Erlernen von Rauschen bildet und eine bessere und effizientere Kontrolle über Rauschmodelle in zukünftigen Versionen von Qiskit ermöglicht.

  • Eingeführt wurde die QubitSparsePauli und QubitSparsePauliList klassen eingeführt, die dieselben Konzepte repräsentieren wie Pauli und PauliList repräsentieren, aber nur Nicht-Identitätsbegriffe speichern, analog zu SparseObservable. Diese Klassen sind in erster Linie für die Verwendung mit dem neuen PauliLindbladMap.

Synthesefunktionen

  • Hinzufügen eines neuen Synthesealgorithmus für HalfAdderGate der keine zusätzlichen Qubits benötigt und eine bessere CX-Zahl aufweist als adder_qft_d00():

  • Neue Zerlegungen hinzugefügt für MCXGate verwendung sauberer Ancillae, Verbesserung der Schaltkreistiefe und Effizienz:

    Beispielverwendung:

    from qiskit.synthesis.multi_controlled import synth_mcx_1_clean_kg24
    
    n_ctrls = 10
    qc = synth_mcx_1_clean_kg24(n_ctrls)
    qc.draw()
  • Die Synthese von mehrfach gesteuerten CZGate gatter wurde verbessert, um die Anzahl der synthetisierten Gatter zu reduzieren, in einigen Fällen ist eine Reduzierung um bis zu 99 % möglich. Dies wurde erreicht, indem die verbesserte Synthese um den MCXGate mit kontrollierter CZGate synthese zu erreichen.

  • Verbesserung des Standard-Plugins für die Synthese von AnnotatedOperation objekte. Diese Verbesserung ist besonders nützlich bei der Erstellung und Umsetzung von gesteuerten Schaltungen mit gesteuerten Gattern. Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import CXGate
    from qiskit.compiler import transpile
    
    inner = QuantumCircuit(5)
    inner.append(CXGate().control(3, annotated=True), [0, 1, 2, 3, 4])
    controlled_inner_gate = inner.to_gate().control(2, annotated=True)
    qc = QuantumCircuit(15)
    qc.append(controlled_inner_gate, [0, 1, 2, 3, 4, 5, 6])
    qct = transpile(qc, basis_gates=["cx", "u"])

    Dieser Code erstellt einen Quantenschaltkreis qc , der einen 2-gesteuerten Quantenschaltkreis mit einem 3-gesteuerten CX-Gate enthält. Durch die Verbesserung wird die Anzahl der CX-Tore in der transponierten Schaltung von 378 auf 30 reduziert. Beachten Sie, dass durch die Angabe von annotated=True bei der Definition der Steuerlogik die kontrollierten Gatter als kommentierte Operationen erstellt werden. Dadurch wird eine eifrige Synthese vermieden und der Transpiler kann erkennen, dass controlled_inner_gate einem 6-fach gesteuerten X-Gate entspricht, und die beste verfügbare Synthesemethode für mehrfach gesteuerte X-Gates wählen, insbesondere unter Verwendung verfügbarer Ancilla-Qubits.

  • Die Funktion adder_qft_d00(), die zur Synthese von ModularAdderGate und HalfAdderGate gatter verwendet wird, akzeptiert jetzt einen zusätzlichen Parameter annotated. Unter True wird das inverse QFT-Gate in den Addierern als annotierte Operation implementiert, so dass der Transpiler zusätzliche Optimierungen vornehmen kann.

  • Die Quantum-Shannon-Zerlegung (qs_decomposition()) enthält jetzt eine Optimierung, die die CXGate anzahl in dem Fall reduziert, dass die Eingabe-Unitarie eine kontrollierte Unitarie ist.

  • Die Synthesefunktion synth_mcx_1_clean_b95() erzeugt nun eine Schaltung mit weniger CX-Gattern.

  • Die Klasse SolovayKitaevDecomposition klasse hat nun zusätzliche Argumente im Initialisierer, die es erlauben, sie direkt aus einer Menge von basis_gates und einer depth für die grundlegenden Näherungen zu konstruieren.

  • Hinzugefügt SolovayKitaevDecomposition.save_basic_approximations() um die Menge der von der Klasse verwendeten Grundannäherungen in einem binären Format zu speichern. Diese Änderung in Kombination mit den neuen Initialisierungsargumenten ermöglicht es den Benutzern, die explizite Verwendung von generate_basic_approximations() zu überspringen und sich nur auf SolovayKitaevDecomposition.

Transpiler-Funktionen

  • Die Funktion generate_preset_pass_manager() erzeugt nun einen speziellen Passmanager, wenn die Basismenge nur aus Clifford+T-Gattern besteht. Formal muss eine Clifford+T-Basismenge nur Clifford-Gatter enthalten, zusammen mit entweder TGate, TdgGate, oder beides. Die vollständige Liste der unterstützten Clifford-Gatter erhalten Sie, indem Sie get_clifford_gate_names().

    Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.quantum_info import get_clifford_gate_names
    
    basis_gates = get_clifford_gate_names() + ["t", "tdg"]
    pm = generate_preset_pass_manager(basis_gates=basis_gates)
    
    qc = QuantumCircuit(1)
    qc.rx(0.8, 0)
    qct = pm.run(qc)
    print(qct.count_ops())

    Würde mit resultieren:

    OrderedDict([('h', 10210), ('t', 4508), ('tdg', 4503), ('sdg', 943), ('s', 941)])

    Zuvor konnte der generierte Passmanager das obige Beispiel nicht verarbeiten, da er Ein-Qubit-Rotationsgatter nicht in Clifford+T-Gatter zerlegen konnte UGate rotationsgatter in Clifford+T-Gatter zerlegen konnte. Der neue Pass-Manager verwendet jedoch die Solovay-Kitaev-Zerlegung zur Annäherung von Ein-Qubit-Rotationsgattern mit den Gattern H, T und Tdg und ruft den BasisTranslator transpiler-Pass auf, um die Gatter weiter in die Zielbasismenge zu übersetzen. Der neue Passmanager hat auch andere Änderungen, um eine effizientere Übersetzung in Clifford+T-Gatter zu ermöglichen.

    Es ist wichtig zu beachten, dass die angegebene Clifford+T-Basisgattermenge universell sein sollte, da sonst die Transpilation möglicherweise nicht gelingt. Während die Gattermenge ["h", "t", "tdg"] oder sogar ["h", "t"] für die Universalität ausreicht, wird empfohlen, die Menge nach Möglichkeit um weitere Clifford-Gatter zu erweitern, da die Übersetzung sonst weniger effizient sein könnte. Wenn z. B. das S-Gatter nicht enthalten ist, könnten S-Gatter in Paare von T-Gattern zerlegt werden (d. h. Clifford-Gatter könnten in Nicht-Clifford-Gatter zerlegt werden, was nicht unbedingt das gewünschte Verhalten ist).

    Es folgt ein etwas größeres Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import QFTGate
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    
    qc = QuantumCircuit(4)
    qc.append(QFTGate(4), [0, 1, 2, 3])
    
    basis_gates = ["cx", "s", "sdg", "h", "t", "tdg"]
    pm = generate_preset_pass_manager(basis_gates=basis_gates, optimization_level=2)
    
    qc = QuantumCircuit(4)
    qc.append(QFTGate(4), [0, 1, 2, 3])
    
    qct = pm.run(qc)
    print(qct.count_ops())

    Würde mit resultieren:

    OrderedDict([('h', 96510), ('tdg', 42396), ('t', 42389), ('s', 8240), ('sdg', 8235), ('cx', 12)])
  • Ein neues High-Level-Synthese-Plugin wurde hinzugefügt HalfAdderSynthesisR25 zum Synthetisieren eines HalfAdderGate. Das neue Plugin basiert auf adder_ripple_r25().

    Die HalfAdderSynthesisDefault wurde ebenfalls aktualisiert, um der folgenden Sequenz von Halbaddierer-Synthesizern zu folgen: "HalfAdder.ripple_r25" , wenn es ≤3\leq 3 Qubits gibt, "HalfAdder.ripple_c04" , wenn ein zusätzliches Qubit verfügbar ist, und "HalfAdder.ripple_r25" in allen anderen Fällen.

  • Mehrere High-Level-Synthese-Plugins für die Synthese eines MCXGate:

    Die MCXSynthesisDefault klasse wurde auch aktualisiert, um die folgende Sequenz von MCX-Synthesemethoden auszuführen, bis die erste erfolgreich ist: : "mcx.2_clean_kg24", "mcx.1_clean_kg24", "mcx.n_clean_m15", "mcx.n_dirty_i15"`, ``"mcx.2_dirty_kg24", "mcx.1_dirty_kg24", "mcx.1_clean_b95", "mcx.noaux_v24". Die Methoden sind so geordnet, dass die qualitativ besseren Methoden zuerst angewendet werden.

  • VF2PostLayout wurde am Ende der Standardoptimierungsphase bei Verwendung der Optimierungsstufe 3 hinzugefügt.

  • Hinzufügen eines neuen OptimizeCliffordT transpiler-Optimierungsdurchgang hinzugefügt, der Paare von aufeinanderfolgenden T-Toren in S-Tore und Paare von aufeinanderfolgenden Tdg-Toren in Sdg-Tore zusammenführt. Diese Optimierung ist besonders wirksam bei der Verringerung der T-Zahl nach der Solovay-Kitaev-Zerlegung, bei der mehrere aufeinanderfolgende T- oder Tdg-Gatter entstehen. Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import SolovayKitaev, OptimizeCliffordT
    
    qc = QuantumCircuit(1)
    qc.rx(0.8, 0)
    
    # Run Solovay-Kitaev pass on qc
    transpiled = SolovayKitaev()(qc)
    print(transpiled.count_ops().get("t", 0) + transpiled.count_ops().get("tdg", 0))
    # Should print 12779
    
    # Run Clifford+T optimization
    optimized = OptimizeCliffordT()(transpiled)
    print(optimized.count_ops().get("t", 0) + optimized.count_ops().get("tdg", 0))
    # Should print 9011
  • Hinzugefügt wurde der ContextAwareDynamicalDecoupling pass, der eine kontextabhängige dynamische Entkopplung auf der Grundlage von Walsh-Hadamard-Sequenzen implementiert. Die eingefügten Verzögerungssequenzen sind gegenseitig orthogonal zu den Sequenzen auf benachbarten Qubits und berücksichtigen die Kontroll-/Zielzuschauer von CX- und ECR-Gattern. Siehe arXiv:2403.06852 für weitere Informationen.

    Beispiel:

    from qiskit.circuit.library import QFT
    from qiskit.transpiler import PassManager, CouplingMap
    from qiskit.transpiler.passes import ALAPScheduleAnalysis, ContextAwareDynamicalDecoupling
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.providers.fake_provider import GenericBackendV2
    
    num_qubits = 10
    circuit = QFT(num_qubits)
    circuit.measure_all()
    
    target = GenericBackendV2(
        100,
        basis_gates=["id", "rz", "sx", "x", "ecr"],
        coupling_map=CouplingMap.from_grid(10, 10)
    ).target
    
    pm = generate_preset_pass_manager(optimization_level=2, target=target)
    dd = PassManager([
        ALAPScheduleAnalysis(target=target),
        ContextAwareDynamicalDecoupling(target=target),
    ])
    
    transpiled = pm.run(circuit)
    with_dd = dd.run(transpiled)
    
    with_dd.draw("mpl", idle_wires=False)
    _images/release_notes-2.png
  • Die folgenden Attribute wurden der Klasse DAGCircuit klasse hinzugefügt, um die Abfrage der Anzahl der Stretch-Variablen zu ermöglichen: num_stretches, num_captured_stretches und num_declared_stretches.

  • Ein neues unitäres Synthese-Plugin wurde hinzugefügt CliffordUnitarySynthesis das versucht, ein gegebenes unitäres Gatter zu synthetisieren, indem es prüft, ob es durch ein Clifford-Gatter dargestellt werden kann. In diesem Fall gibt es eine Schaltung zurück, die dieses unitäre Gatter implementiert und nur aus Clifford-Gattern besteht.

    Das Plugin wird durch den UnitarySynthesis transpiler pass aufgerufen, wenn der Parameter method auf "clifford" gesetzt ist.

    Darüber hinaus kann der Parameter plugin_config von UnitarySynthesis zur Übergabe der folgenden Plugin-spezifischen Parameter verwendet werden:

    • min_qubits: die Mindestanzahl der zu berücksichtigenden Qubits (der Standardwert ist 1).
    • max_qubits: die maximale Anzahl der zu berücksichtigenden Qubits (der Standardwert ist 3).

    Zum Beispiel:

    import math
    
    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import UnitaryGate
    from qiskit.quantum_info import Operator
    from qiskit.transpiler.passes import UnitarySynthesis
    
    # clifford unitary over 2 qubits
    c2 = QuantumCircuit(2)
    c2.h(0)
    c2.rz(math.pi / 4, 1)
    c2.rz(math.pi / 4, 1)
    c2.sdg(1)
    uc2 = UnitaryGate(Operator(c2).data)
    
    # non-clifford unitary over 2 qubits
    n2 = QuantumCircuit(2)
    n2.h(0)
    n2.rz(math.pi / 4, 1)
    n2.sdg(1)
    un2 = UnitaryGate(Operator(n2).data)
    
    # quantum circuit with two unitary gates
    qc = QuantumCircuit(3)
    qc.append(uc2, [2, 1])
    qc.append(un2, [0, 2])
    
    transpiled = UnitarySynthesis(method="clifford")(qc)
    transpiled.draw("mpl")
    _images/release_notes-3.png

    Durch die Ausführung des obigen Codes wird das erste unitäre Gatter in Clifford-Gatter umstrukturiert, während das zweite Gatter unverändert bleibt.

    Wenn wir das obige Beispiel wie folgt abändern:

    config = {"min_qubits": 3}
    transpiled = UnitarySynthesis(method="clifford", plugin_config=config)(qc)

    dann bleiben beide Unitary Gates unverändert.

Visualisierungsfunktionen

  • Einführung von benutzerdefinierten Stilen für die dag_drawer() funktion. Damit können Sie dem Parameter style ein Wörterbuch mit benutzerdefinierten Attributen übergeben, die den Stil des DAG, den die Funktion zurückgibt, ändern. Zum Beispiel:

    from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
    from qiskit.converters import circuit_to_dag
    from qiskit.visualization import dag_drawer
    
    q = QuantumRegister(3, 'q')
    c = ClassicalRegister(3, 'c')
    circ = QuantumCircuit(q, c)
    circ.h(q[0])
    circ.cx(q[0], q[1])
    circ.measure(q[0], c[0])
    circ.rz(0.5, q[1]).c_if(c, 2)
    
    dag = circuit_to_dag(circ)
    
    style = {
        "inputnodecolor": "pink",
        "outputnodecolor": "lightblue",
        "opnodecolor": "red",
    }
    
    dag_drawer(dag, style=style)

Anmerkungen zu Upgrades

  • Die Bibliothek python-dateutil ist nicht länger eine Abhängigkeit von Qiskit. Seit Qiskit v2.0 verwendet nichts mehr in der Bibliothek die python-dateutil und Qiskit ist eigentlich nicht mehr von der Bibliothek abhängig. In dieser Version wird es aus der Liste der Abhängigkeiten entfernt, so dass es nicht automatisch als Voraussetzung für die Verwendung von Qiskit installiert wird. Wenn Sie sich darauf verlassen haben, dass Qiskit dateutil als Abhängigkeit für Sie installiert, müssen Sie nun sicherstellen, dass Sie es manuell installieren (was bei direkten Abhängigkeiten die beste Vorgehensweise ist).

  • sympy ist keine Voraussetzung mehr für die Installation von Qiskit. Nach der Umstellung auf eine Rust-basierte symbolische Engine für die ParameterExpression klasse sind die Verwendungen von SymPy auf einige Visualisierungsprogramme, den TemplateOptimization transpiler-Pass, ParameterExpression.sympify() (der ausdrücklich für die Interoperabilität von SymPy gedacht ist) und SparsePauliOp.simplify() wenn parametrisierte Koeffizienten verwendet werden. Diese Funktionalität wird nicht so häufig verwendet, so dass SymPy jetzt als optionale Abhängigkeit behandelt wird und diese Funktionen eine MissingOptionalLibraryError ausnahme, wenn sie verwendet werden und SymPy nicht installiert ist.

  • Die Abhängigkeit von symengine , die für die Erstellung von ParameterExpression objekte verwendet wurde, wurde entfernt. Sie wurde durch eine interne symbolische Engine ersetzt und wird für die Kernfunktionen von Qiskit nicht mehr benötigt. Die einzige Ausnahme ist, dass symengine in die QPY-Formate 10, 11 und 12 eingebettet wurde, so dass es weiterhin erforderlich ist, wenn Sie diese Formate deserialisieren. Die Abhängigkeit von symengine für qpy.load() wurde in 2.0.0 explizit optional gemacht, aber wenn Sie sich vorher darauf verlassen haben, dass symengine standardmäßig für diese Funktionalität installiert wird, müssen Sie es jetzt manuell installieren, um die Nutzlast zu laden. Wenn Sie mit ParameterExpression.sympify() verwendet haben, um ein symengine-Ausdruck-Objekt aus einem ParameterExpression zu erhalten, wird jetzt ein sympy Ausdruck zurückgegeben. Wenn Sie dies mit symengine verwenden müssen, können Sie symengine.sympify nutzen, um den sympy -Ausdruck in einen symengine-Ausdruck zu konvertieren.

Hinweise zur Aktualisierung von Schaltkreisen

  • Das definition attribut der HalfAdderGate wurde geändert, um intern adder_ripple_r25() zu verwenden, um die Definition des Gatters für eine effizientere Schaltung ohne zusätzliche Qubits zu erzeugen. Wenn die alte Definition aus irgendeinem Grund gewünscht ist, können Sie stattdessen direkt die adder_qft_d00() funktion verwenden, die eine Schaltung erzeugt, die dem entspricht, was definition in früheren Versionen zurückgeben würde.

  • Der Schaltkreis, der von der excitation_preserving() funktion und ExcitationPreserving zurückgegebene Schaltung wird nun mit einer einzigen XXPlusYYGate. Dies ist eine Änderung gegenüber früheren Versionen, in denen ein RXXGate gefolgt von einem RYYGate. Diese neue Schaltungskonstruktion ist äquivalent, verwendet aber weniger Gatter, die alle erregungserhaltend sind, was per Definition einfacher ist.

  • Die definition atribute mehrerer Standardtore wurden nach den folgenden Grundsätzen aktualisiert:

    • Wenn verfügbar, wird eine Definition, die Clifford-Gatter verwendet, gegenüber Definitionen bevorzugt, die Nicht-Clifford-Gatter enthalten.
    • Wenn verfügbar, ist eine Definition mit Clifford+T-Gattern einer Definition vorzuziehen, bei der ein UGate.
    • Die Verwendung von PhaseGate ist vorzuziehen gegenüber U1Gate.
    • Die Verwendung von UGate wird gegenüber `U2Gate und `U3Gate bevorzugt.

    Entscheidend ist, dass die folgende Invariante immer noch gilt: Durch rekursive Erweiterung der Gatterdefinitionen kann jedes Gatter letztlich nur durch die Basis ["cx", "u"] ausgedrückt werden. Die Definitionen aller Standardgatter sind alle gleichwertig, so dass sich die Semantik der Gatter nicht ändert, nur die genaue Schaltungskonstruktion, die für einige Gatter zurückgegeben wird, ist nicht mehr genau dieselbe. Diese Änderung war notwendig, um die Clifford+T-Transpilierung zu unterstützen.

  • Qiskit verwendet nun seine eigene, auf Rust basierende Bibliothek für symbolische Ausdrücke, um die Interna von ParameterExpression und Parameter. Da es sich um eine neue Implementierung des Kerns der symbolischen Mathematik handelt, die für ParameterExpression verwendet wird, kann es geringfügige Unterschiede im genauen Verhalten einiger Funktionen geben. Sie sollte immer gleichwertige Ergebnisse für die dokumentierte API liefern. Bitte melden Sie sich, wenn Sie Probleme mit der Korrektheit feststellen.

Hinweise zum Upgrade der C-API

  • Die Art und Weise, wie komplexe Zahlen in der C-API von Qiskit dargestellt werden, hat sich geändert. Zuvor war QkComplex64 ein compilerabhängiger Typendef, der es ermöglichte, native komplexe Typen per Zeiger an die API von Qiskit zu übergeben (z. B. als double complex*). Das war zwar praktisch, aber dieser Ansatz beruhte auf Annahmen zur Speicheraufteilung, die nicht unbedingt garantiert sind.

    Qiskit v2.1 stellt nun QkComplex64 { double re; double im; } als Struktur dar, um sicherzustellen, dass das Speicherlayout immer kompatibel ist und um eine breitere Compilerunterstützung zu gewährleisten. Der Einfachheit halber werden die compilerabhängigen Konverter qk_complex64_from_native und qk_complex64_to_native bereitgestellt, die eine Umwandlung von struct in eine native komplexe Zahl ermöglichen. Beachten Sie, dass diese nur auf Plattformen funktionieren, die double complex unterstützen oder für MSVC-Compiler, die _Dcomplex verwenden.

    Zum Beispiel:

    #include <qiskit.h>
    #include <math.h>
    #include <stdio.h>
    #include <complex.h>
    
    int main(int argc, char *argv[]) {
        // platform-independent constructions:
        QkComplex64 coeff = {5.0, 3.0};
    
        // ... or using converter
        // double complex native = 5.0 + I * 3; // uses C11 standard, does not work on MSVC
        // QkComplex64 coeff = qk_complex64_from_native(&native);  // convert from native
    
        uint32_t num_qubits = 100;
        QkObs *obs = qk_obs_zero(num_qubits);
        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);
        printf("num_qubits: %u\n", qk_obs_num_qubits(obs));
        printf("num_terms: %lu\n", qk_obs_num_terms(obs));
    
        qk_obs_free(obs);
        return 0;
    }

QPY-Upgrade-Hinweise

  • Die Standard-QPY-Version, die von qpy.dump() ausgegebene Standard-QPY-Version wurde auf die neueste QPY-Version 15 geändert. Wenn Sie aus irgendeinem Grund eine ältere Version des Formats erzeugen müssen, können Sie mit dem Schlüsselwortargument version auf qpy.dump() verwenden, um eine ältere Version zu erzeugen.

Hinweise zum Upgrade der Synthese

  • Das Serialisierungsformat für grundlegende Approximationen in den Solovay-Kitaev-Algorithmen wurde von .npy auf ein anderes binäres Format geändert, das auf Rusts serde und bincode basiert. Alle Routinen, die grundlegende Näherungswerte laden (wie generate_basic_approximations(), SolovayKitaevDecomposition.load_basic_approximations() oder der Initialisierer von SolovayKitaev) unterstützen nach wie vor das Laden des Legacy-Formats. Jede neue Datei wird jedoch in dem neuen Format gespeichert. Wenn Sie das alte Format verwendet haben, sollten Sie ein Downgrade von Qiskit auf < 2.2 durchführen und die erforderlichen Dateien speichern.

  • Die Standardwerte für SolovayKitaev (und verwandte Klassen) wurden auf depth=12 und reps=5 erhöht. Das liegt daran, dass die zugrundeliegende Implementierung jetzt in Rust ist, was uns erlaubt, die Standardpräzision zu erhöhen, während sie immer noch deutlich schneller ist als die vorherige Python Version.

Hinweise zum Transpiler-Upgrade

  • Die eingebauten Layout-Plugins für die derzeitigen Passmanager enthalten nicht mehr ihre Hauptkomponente (z. B. eine SabreLayout instanz für die "Säbel"-Bühne ), wenn keine Kopplungsbeschränkungen angegeben sind. Bisher konstruierten die Plugins ungültige Instanzen ihrer Layout-Passes, in der Annahme, dass eine separate Logik die Ausführung der Passes und das Auslösen von Exceptions verhindern würde.

    Dies sollte keine sinnvolle Auswirkung auf die Verwendung der voreingestellten Pass-Manager oder der Plugins haben, da es schon bisher nie gültig war, die Pässe in einem ungültigen Zustand aufzurufen.

Hinweise zu veralteten Versionen

  • Die Unterstützung für die Ausführung von Qiskit mit Python 3.9 ist veraltet und wird in der Qiskit v2.3 Version entfernt. Die Version 2.3.0 ist die erste Version, nachdem Python 3.9 das Ende seiner Lebensdauer erreicht hat und nicht mehr unterstützt wird [1]. Das bedeutet, dass Sie ab der Version 2.3.0 die von Ihnen verwendete Version Python auf Python 3.9 oder höher aktualisieren müssen.

    [1] https://devguide.python.org/versions/

Veraltete Schaltungen

Fehlerkorrekturen

  • Es wurde ein Fehler in der dag_drawer() funktion und der DAGCircuit.draw() methode, bei denen das Setzen des Schlüsselwortarguments style=plain keine Schaltkreisbeschriftungen für die Knoten der DAG in der Visualisierung anzeigte.

  • Es wurde ein Fehler in der QuantumCircuit.assign_parameters() methode behoben, bei dem Parameter, die nicht in der Schaltung verwendet und als Strings übergeben wurden, nicht ignoriert wurden, wenn das Argument strict=False gesetzt wurde. Weitere Einzelheiten finden Sie in Ausgabe #13933.

  • Randfälle in der Makefile Konfiguration für Windows behoben, bei denen die vordefinierte Umgebungsvariable OS nicht mit der Ausgabe des uname -s Befehls übereinstimmte.

  • Behoben wurde das name attribut der OrGatebehoben, das zuvor fälschlicherweise auf die Zeichenkette "and" statt auf den erwarteten Wert "or" gesetzt war, der nun zurückgegeben wird. Dieser falsche Wert "and" stand im Konflikt mit dem AndGate.name und hätte möglicherweise zu verschiedenen Problemen bei der Verwendung von Orgate und der Unterscheidung von einer AndGate.

  • Es wurde ein Fehler in der Funktion qpy.load() funktion, bei der die Deserialisierung von Schaltkreisen fehlschlagen konnte, deren Parameter an Parameter mit denselben Namen neu zugewiesen wurden. #13720, #13720 und #13720 behoben.

  • Es wurde die GenericBackendV2 um jetzt auch BoxOp als unterstützter Anweisungstyp in der generierten GenericBackendV2.target wenn das Schlüsselwortargument control_flow=True im Konstruktor gesetzt ist.

  • Bei der Synthese eines MCXGate gatters mit 3 Steuerelementen, benötigte die Synthesefunktion synth_mcx_n_dirty_i15() ein zusätzliches Qubit, was zu einer Schaltung mit 5 Qubits führte (3 Kontroll-, 1 Ziel- und 1 Hilfsqubit). Der eigentliche Synthesealgorithmus macht jedoch keinen Gebrauch von diesem Hilfsqubit. Dieses Verhalten ist nun behoben: Die synthetisierte Schaltung besteht aus 4 Qubits (3 Kontroll- und 1 Zielbits), wodurch die Synthesefunktion in einer etwas größeren Anzahl von Fällen angewendet werden kann.

  • Die QuantumCircuit.draw() und circuit_drawer() funktion wird nun die BoxOp anweisungen in einer QuantumCircuit in der gleichen vertikalen Scheibe, wenn sich die vertikalen Spannen nicht überschneiden, werden jetzt in der gleichen vertikalen Scheibe gerendert, wenn möglich.

  • Festgelegt wurde die QuantumCircuit.draw() methode und circuit_drawer() funktion im Modus "mpl" korrigiert, um beim Zeichnen von Instanzen in einem Feld weniger Leerraum innerhalb des linken Randes einzufügen BoxOp instanzen in einem QuantumCircuit.

Sonstige Anmerkungen

  • Es wurde ein neues optionales zusätzliches Abhängigkeitsziel qpy-compat hinzugefügt. Dieses Ziel sollte verwendet werden, wenn Sie vorhaben qpy dateien mit älteren QPY-Formaten zu laden. Das Ziel installiert zusätzliche Anforderungen, die zum Laden von QPY-Dateien mit Formatversionen < 13. If you are only using newer QPY format versions you do no need to install this. The qpy.dump() only generates QPY > =13 verwendet werden. Dies ist nur für das Laden von Dateien erforderlich, die mit älteren (älter als 2.0.0 ) Qiskit-Versionen erzeugt wurden. Sie können diese neue optionale Variante mit pip install qiskit[qpy-compat] installieren.

  • Die relativen Gewichte der "Basis"- und "Vorausschau"-Komponenten der SabreSwap und SabreLayout heuristiken wurden geändert, wenn die erweiterte Mengenverfolgung aktiv ist (wie es immer in SabreLayoutund ist standardmäßig in SabreSwap). Die heuristische Komponente, die sich auf den Abstand zwischen den Qubits in einem einzelnen Gatter in der vorderen Schicht bezieht, schwächt sich nun nicht mehr proportional zur Anzahl der Gatter in der vorderen Schicht ab; dieses Verhalten war eine historische Entscheidung, hat aber bei großen Schaltkreisen den unbeabsichtigten Effekt, dass die vordere Schicht fast ignoriert wird, was für die Effizienz katastrophal ist.

    Die daraus resultierenden Verbesserungen beim Routing dürften sich vor allem bei Schaltungen bemerkbar machen, die häufig in Schichten von mehr als 20 parallelen Zwei-Qubit-Gattern geschichtet werden können.

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