Skip to main content
IBM Quantum Platform

Qiskit SDK 2.2 versionshinweise


2.2.3

Vorspiel

Qiskit 2.2.3 behebt einen Fehler, der durch Qiskit 2.2.2 verursacht wurde, wenn die run() Methode auf einem PassManager für mehr als einen Schaltkreis angewendet wurde.

Anmerkungen zu Upgrades

  • ConsolidateBlocks liest nun einen PropertySet Schlüssel ConsolidateBlocks_qubit_map beim Eintritt. Dieser Schlüssel und sein Wert sind nicht öffentlich und sollten nicht von anderen Passwörtern gelesen oder geschrieben werden.

Fehlerkorrekturen

  • Feste Wiederverwendung derselben ConsolidateBlocks Instanz auf mehreren Schaltkreisen, einschließlich Aufrufen mit mehr als transpile() einem Schaltkreis und ohne prozessbasierte Parallelisierung. Ein in Qiskit 2.2.2 eingeführter Fehler führte dazu, dass der Durchlauf abstürzte oder ungültige Ergebnisse lieferte, wenn dieselbe Instanz in unterschiedlichen Schaltkreisen wiederverwendet wurde.

2.2.2

Vorspiel

Qiskit 2.2.2 ist ein Bugfix-Release für die v2.2 minor Versionsreihe.

Fehlerkorrekturen

  • Die Implementierung von __deepcopy__() in wurde QuantumCircuit korrigiert, da die Schaltungsparameter nicht vollständig kopiert wurden. Infolgedessen hat die Mutation eines BoxOp in einem kopierten Schaltkreis keine Auswirkungen mehr auf den ursprünglichen Schaltkreis.

  • Ein Problem beim Optimize1qGatesDecomposition Pass wurde behoben, das auftrat, wenn der Pass mit einem Pass initialisiert Target wurde, der 1-Qubit-Gatter mit festen Winkelparametern enthielt. Bisher gab der Pass möglicherweise Gates aus, die nicht im Ziel enthalten waren, da er nicht überprüfte, ob die Gates im Ziel beliebige Parameterwerte unterstützten. Fehler Nr. 14743 behoben.

  • Fehlerhaftes Verhalten im BasisTranslator Pass behoben, bei dem ein Multi-Qubit-Gatter innerhalb eines ControlFlowOp Blocks anhand seiner lokalen Qubit-Indizes statt anhand der absoluten Indizes aus der Quellschaltung verfolgt wurde.

  • Der ConsolidateBlocks Transpiler-Durchlauf bewertet nun korrekt, ob ein bestimmtes Gate hardwaremäßig unterstützt wird, während er in Kontrollflussoperationen rekursiv vorgeht.

  • qpy.dump() kann nun das Schreiben in .gz Dateien verarbeiten, die mit dem gzip Standardbibliotheksmodul mit QPY-Versionen 16 oder höher geöffnet wurden. Siehe #15157 für Details.

  • Die Methode wurde MCPhaseGate.inverse() korrigiert, um die Steuerungszustände von offen gesteuerten Toren bei der Berechnung ihrer Inversen beizubehalten.

  • ConsolidateBlocks gibt nun eine Ausnahme „ Python -space“ zurück, anstatt eine Panik auszulösen, wenn es eine ungültige oder veraltete Analyse in den block_listPropertySet Legacy-Schlüsseln run_list oder feststellt. Fehler Nr. 14646 behoben.

  • Optimize1qGatesDecomposition löst nun einen TranspilerError anstelle einer Rust-Space-Panik aus, wenn versucht wird, auf einem Schaltkreis zu laufen, der für den zu groß Target ist. Fehler #15116 behoben.

  • Die Planungsläufe und ALAPScheduleAnalysis behandeln nun Schaltungen ASAPScheduleAnalysis ohne Operationen korrekt. Zuvor hatten sie fälschlicherweise TranspilerError behauptet, dass „keine Laufzeiten angegeben“ seien. Fehler Nr. 15145 behoben.

  • Ein Fehler im Schaltkreistext-Zeichner wurde behoben, der auftreten konnte, wenn Schaltkreisblöcke innerhalb von Kontrollflussoperationen auf anderen Registern als der äußere Schaltkreis definiert wurden. Diese Situation könnte beispielsweise beim direkten Anhängen ControlFlowOp von Operationen oder bei Schaltkreisen nach der Transpilation auftreten.


2.2.1

Vorspiel

Qiskit 2.2.1 ist ein kleines Patch-Release, das mehrere in der Version 2.2.0 identifizierte Fehler behebt.

Hinweise zum Transpiler-Upgrade

  • Die maximalen Aufruf- und Testgrenzen für den exakten Abgleich von VF2PostLayout bei optimization_level=3 wurden reduziert, um übermäßige Laufzeiten für hochsymmetrische Testschaltungen zu vermeiden, die auf große Kopplungskarten abgebildet werden.

Fehlerkorrekturen

  • DAGCircuit.apply_operation_back()und circuit_to_dag()apply_operation_back() fügt nun neue Kanten in einer deterministischen Reihenfolge hinzu. Das bisherige Verhalten konnte dazu führen, dass bestimmte Transpiler-Durchläufe (wie z. B. SabreSwap) die DAG in nicht deterministischer Reihenfolge durchlaufen haben.

  • DAGCircuit.apply_operation_front() kann beim Umgang mit Knoten, die klassische Bedingungen enthalten, keine ungültigen Selbstschleifen mehr einfügen.

  • Ein Problem mit pickle der Unterstützung für wurde behoben, bei SabreSwap dem eine SabreSwap Instanz einen Fehler verursachte, wenn sie nach Ausführung der SabreSwap.run() Methode gepickelt wurde. Fehler Nr. 15071 behoben.

  • Es wurde ein Problem behoben, bei dem die Eingabetoleranzwerte bei der Überprüfung, ob is_unitary() ein Operator unitär ist, nicht korrekt berücksichtigt wurden. Die Methode verwendet nun korrekt die bereitgestellten Parameter atol``rtol und bei der Vereinfachung des Operators und der Überprüfung, ob er mit der Identität übereinstimmt. Dies behebt #14107.


2.2.0

Vorspiel

Das Qiskit v2.2 enthält mehrere Erweiterungen für die C-API und den Transpiler sowie viele weitere Verbesserungen und Fehlerbehebungen. Die wichtigsten Merkmale dieser neuen Version sind:

  • C-API-Transpile-Funktion: Die C-API enthält nun eine Funktion zum Transpilieren einer Quantenschaltung: qk_transpile(). Diese Funktion entspricht der Funktion „ transpile()Python “ für einen eigenständigen C-Kontext.
  • Litinski-Transformationsdurchlauf: Ein neuer Transformationsdurchlauf, LitinskiTransformation der die beschriebene arXiv:1808.02892 Transformation implementiert. Dieser Pass wird typischerweise bei der Kompilierung für fehlertolerante Architekturen verwendet.
  • Winkelgebundene Unterstützung für Ziele: Die Target Klasse unterstützt nun die Angabe von Grenzen für die zulässigen Werte für parametrisierte Operationen, die zum Ziel hinzugefügt wurden. Wenn eine Anweisung zum hinzugefügt Target wird, können Sie das optionale Argument angle_bounds hinzufügen, um die oberen und unteren Grenzen für parametrisierte Rotationsgatter anzugeben. Ein neuer Transpiler-Durchlauf WrapAngles wurde hinzugefügt, um die Winkelbeschränkungen als Teil einer Transpiler-Pipeline durchzusetzen.

Die Versionsreihe v2.2 ist die letzte kleinere Versionsreihe mit Unterstützung Python 3.9. Die minimale unterstützte Rust-Version, die verwendet wird, um Qiskit aus dem Quellcode zu bauen, ist nun Rust v1.85, erhöht von 1.79 in 2.1.0. Weitere Informationen zu den oben genannten und anderen Änderungen finden Sie in den unten stehenden Versionshinweisen und in der aktualisierten Dokumentation.

C-API-Funktionen

Schaltkreise Funktionen

  • Es wird eine neue Methode bereitgestellt, um sicherzustellen, dass eine Schaltung QuantumCircuit.ensure_physical()über physikalische Qubits definiert ist, wobei sich die Qubit-Indizes auf physikalische Qubits beziehen. Weitere Informationen zu den Metadatenkonzepten finden Sie in der Dokumentation in der neuen Diskussion über abstrakte und physikalische Schaltungsdarstellungen. Die Konzepte „abstrakter“ und „physikalischer“ Schaltkreise sind für Qiskit keineswegs neu, lediglich die explizite Dokumentation.

  • Die Klasse Duration hat eine neue Variante ps erhalten, die zur Darstellung einer Dauer in Pikosekunden verwendet werden kann.

  • Verbessert PauliEvolutionGate.control(), PauliEvolutionGate.power() und PauliEvolutionGate.inverse() um effizientere Darstellungen in Bezug auf a PauliEvolutionGatezurückzugeben. Für die Berechnung der kontrollierten und exponentiellen Versionen des Evolutionsgatters führt diese Änderung zu deutlich flacheren Schaltkreisen und geringeren Gatterzahlen im Vergleich zu den zuvor verwendeten generischen Mechanismen. Die inverse Zerlegung ändert sich nicht, wird nun jedoch effizienter generiert und ermöglicht bessere Compiler-Optimierungen.

  • Eine neue Fast-Path-Methode ParameterExpression.bind_all() wurde hinzugefügt, um den Anwendungsfall zu unterstützen, bei dem viele verschiedene ParameterExpression Instanzen unter Verwendung desselben Zuordnungswörterbuchs an numerische Werte gebunden werden. Die vorhandene bind() Methode hat einen hohen Overhead und unnötige Zuweisungen, da sie immer einen Typ ParameterExpression für die Typkonsistenz zurückgibt.

OpenQASM Funktionen

  • Teilweise Unterstützung für defcal Symbole im OpenQASM3 -Exporter hinzugefügt. Dadurch können nachgelagerte Pakete benutzerdefinierte Anweisungen exportieren, die sowohl auf Quantenbits als auch auf klassischen Bits mit qiskit.qasm3.dumps(). Benutzer können nun benutzerdefinierte Anweisungen definieren (z. B. eine CustomMeasure , die auf ein Qubit wirkt und ein klassisches Bit zurückgibt) und deren Verhalten mithilfe DefcalInstructionvon festlegen. Diese Deficals werden über das implicit_defcals Argument in an den Exporter qiskit.qasm3.dumps() übergeben.

    Zum Beispiel:

    from qiskit.circuit import Instruction, QuantumCircuit
    from qiskit.qasm3 import dumps
    from qiskit.qasm3.exporter import DefcalInstruction, types
    
    custom_measure = Instruction("measure_2", 1, 1, [])
    qc = QuantumCircuit(1, 1)
    qc.h(0)
    qc.append(custom_measure, [0], [0])
    qc.measure(0, 0)
    
    defcals = {
        "measure_2": DefcalInstruction("measure_2", 0, 1, types.Bool()),
    }
    
    out_qasm = dumps(qc, implicit_defcals=defcals)
    print(out_qasm)

    Würde die folgende gültige Zeichenfolge ausgeben: OpenQASM3 :

    OPENQASM 3.0;
    bit[1] c;
    qubit[1] q;
    h q[0];
    c[0] = measure_2 q[0];
    c[0] = measure q[0];

    Bei diesem Ansatz wird davon ausgegangen, dass die Grammatikdefinition für den defcal extern bereitgestellt wird (z. B. in einer Header-Datei), obwohl eine solche Datei nicht unbedingt erforderlich ist, damit der Exporter funktioniert.

  • Die Funktionen qasm3.loads() und haben qasm3.load() nun ein zusätzliches Argument namens num_qubits. Wenn angegeben, geben die Funktionen Schaltungen zurück, deren Qubits gleich sind num_qubits. Wenn nicht angegeben, hat der zurückgegebene Schaltkreis Qubits, die dem maximalen Index im serialisierten Schaltkreis entsprechen. Weitere Informationen finden Sie unter #14435

QPY-Funktionen

  • Eine Einstellung namens min_qpy_version wurde in der Benutzerkonfigurationsdatei hinzugefügt. Wenn diese Option gesetzt ist, definiert sie die minimal zulässige QPY-Version für qpy.load(). Wenn die Formatversion einer QPY-Datei niedriger ist als die minimum_qpy_version Einstellung minimum_qpy_version , wird eine Ausnahme ausgelöst.

  • Einführung des QPY-Formats Version 16. Diese neue Version führt eine neue Schaltkreis-Starttabelle in den Dateikopf ein, die die Byte-Offsets für den Beginn jedes Schaltkreises in einer QPY-Datei enthält. Dies ermöglicht ein potenziell effizienteres Laden von Schaltkreisen aus QPY-Dateien und eine potenzielle Multithreading-Implementierung von Rust in der Zukunft. Außerdem unterstützt die neue Formatversion die neue DURATION Variante von Pikosekunden.

Quanteninformationsmerkmale

Synthesefunktionen

  • Neuer Synthesealgorithmus hinzugefügt, ModularAdderGate der keine zusätzlichen Qubits erfordert und im Vergleich zu eine bessere adder_qft_d00()CX-Zahl aufweist:

  • Es wurde ein neuer Synthesealgorithmus hinzugefügt, der MCXGate keine synth_mcx_noaux_hp24()zusätzlichen Qubits benötigt. Im Vergleich zum bestehenden synth_mcx_noaux_v24() Algorithmus erzeugt diese Methode eine lineare statt einer quadratischen Anzahl von CX-Gattern. Insbesondere ist die neue Methode besser, wenn die Anzahl der Steuerqubits größer als fünf ist. Der Algorithmus basiert auf dem Artikel „Compiling Conditional Quantum Gates without Using Helper Qubits” von Huang und Palsberg ( https://dl.acm.org/doi/10.1145/3656436 ).

  • Die qs_decomposition() Funktion, die ursprünglich auf Shende et. basierte, wurde verbessert. al. (https://arxiv.org/abs/quant-ph/0406176). Die neue Synthesemethode basiert auf Krol und Al-Ars ( https://arxiv.org/abs/2403.13692 ) und reduziert die Gesamtzahl der CXGates eines allgemeinen n-Qubit-Unitaren um 4n−2−13\frac{4^{n − 2} − 1}{3}CXGates. Mit der verbesserten Zerlegung kann eine allgemeine 3-Qubit-Unitäre mit 19 CXGates (anstatt 20) zerlegt werden.

  • Hinzugefügt, um das synth_mcmt_xgate() Multi-Control-Multi-Target-Gate zu synthetisieren, wenn das Basis-Gate ist XGate. Es verfügt über eine Zerlegung in eine lineare Anzahl von CX-Gattern und 0 Ancilla-Qubits zusammen mit dem High-Level-Synthesis-Plugin MCMTSynthesisXGate.

Transpiler-Funktionen

  • Neues Plugin für die High-Level-Synthese zum Synthetisieren eines ModularAdderGate: hinzugefügt

    Das ModularAdderSynthesisDefault wurde ebenfalls aktualisiert, um der folgenden Reihenfolge modularer Addierer-Synthesizer zu folgen: "ModularAdder.qft_d00" wenn die Anzahl der Qubits ≤4\leq 4 ist, "ModularAdder.modular_v17" in allen anderen Fällen.

  • Es wurde ein neuer Transpiler-Durchlauf LitinskiTransformation hinzugefügt, der die in beschriebene Transformation arXiv:1808.02892 implementiert.

    Der Eingang zum Pass ist eine Schaltung mit Clifford- und Einzelqubit-RZ-Rotationsgattern, und der Ausgang ist eine Schaltung mit Multiqubit-Pauli-Rotationen (implementiert als PauliEvolutionGate Gatter), gefolgt von Clifford-Gattern. Der Durchlauf löst eine TranspilerError Ausnahme aus, wenn die Schaltung nicht unterstützte Gatter enthält.

    Der Pass unterstützt alle Clifford-Gatter in der von get_clifford_gate_names()zurückgegebenen Liste, nämlich ["id", "x", "y", "z", "h", "s", "sdg", "sx", "sxdg", "cx", "cz", "cy", "swap", "iswap", "ecr", "dcx"]. Die Liste der unterstützten RZ-Rotationen lautet ["t", "tdg", "rz"] (wir konvertieren T- und Tdg-Gatter automatisch in RZ-Rotationen).

    Darüber hinaus akzeptiert der LitinskiTransformation Konstruktor ein Argument fix_clifford. Wenn False (nicht standardmäßig), enthält die zurückgegebene Schaltung nur PauliEvolutionGate Gatter, wobei die letzten Clifford-Gatter weggelassen werden. Beachten Sie, dass in diesem Fall die Operatoren der ursprünglichen und der synthetisierten Schaltungen im Allgemeinen nicht gleichwertig sind.

    Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import LitinskiTransformation
    from qiskit.quantum_info import Operator
    
    # The following quantum circuit consists of 5 Clifford gates
    # and two single-qubits RZ-rotation gates (note that Tdg is
    # an RZ-rotation).
    qc = QuantumCircuit(2)
    qc.cx(0, 1)
    qc.rz(0.1, 0)
    qc.cz(0, 1)
    qc.tdg(1)
    qc.h(1)
    qc.s(1)
    qc.cz(1, 0)
    
    # The transformed circuit consists of two PauliEvolution gates
    # and the same Clifford gates as in the original circuit.
    qct = LitinskiTransformation()(qc)
    
    # The circuits before and after the transformation are equivalent
    assert Operator(qc) == Operator(qct)
  • Ein neues Plugin MCXSynthesisNoAuxHP24 für die MCXGate High-Level-Synthese von Objekten wurde hinzugefügt. Darüber hinaus wurde das Standard-Synthese-Plugin MCXSynthesisDefault für MCXGate Objekte aktualisiert, sodass nun immer die beste Synthesemethode in Abhängigkeit von der verfügbaren Anzahl an Hilfsqubits ausgewählt wird.

  • Unterstützung für die Target Angabe von Winkelgrenzen in Anweisungen hinzugefügt. Vor dieser Version konnte festgelegt werden Target , dass eine Operation, die einen Parameter akzeptierte, entweder jeden gültigen Wert oder einen bestimmten Wert zulassen sollte. Wenn beispielsweise RZGate(Parameter("theta")) zum Ziel hinzugefügt würde, würde dies bedeuten, dass ein RZGate mit einem beliebigen Wert für Theta zulässig wäre. Wenn hingegen zum Ziel RZGate(math.pi) hinzugefügt würde, würde dies bedeuten, RZGate dass nur π\pi der einzig zulässige Wert für das Ziel ist. Diese neue Funktion ermöglicht es, die zulässigen Winkel auf einen beliebigen float Wert zwischen einer inklusiven Grenze zu beschränken. Beispielsweise können Sie zu einem RZGate(math.pi)Target hinzufügen und den Winkelwert auf Werte zwischen 0 und 2π2\pi beschränken.

    Es gibt mehrere Methoden, um mit den Winkelgrenzen auf dem Ziel zu arbeiten. Der erste ist Target.add_instruction() mit einem neuen angle_bounds Schlüsselwortargument, das verwendet wird, um einer Anweisung im eine TargetWinkelbegrenzung hinzuzufügen. Um mit Winkelgrenzen zu arbeiten, sollten Sie auch eine Callback-Funktion in der globalen WRAP_ANGLE_REGISTRY Registry registrieren, die dem Transpiler mitteilt und WrapAngles weitergibt, wie die Gates für Winkelgrenzen angepasst werden sollen. Die Callback-Funktion nimmt eine Liste beliebiger float Werte entgegen, die die Gate-Winkel aus der Schaltung darstellen, sowie die Qubit-Indizes in der Schaltung, auf die das Gate angewendet wurde, und gibt einen DAGCircuit Wert zurück, der eine äquivalente Schaltung für das Gate mit diesem Winkel darstellt, wobei jedoch die Winkelgrenzen und andere Target Einschränkungen berücksichtigt werden. Zum Beispiel:

    import math
    
    from qiskit.dagcircuit import DAGCircuit
    from qiskit.transpiler import Target
    from qiskit.transpiler.passes.utils.wrap_angles import WRAP_ANGLE_REGISTRY
    
    target = Target(num_qubits=1)
    target.add_instruction(RZGate(Parameter("theta")), angle_bounds=[(-math.pi, math.pi)])
    
    def callback(angles: List[float], qubits: List[int]) -> DAGCircuit:
        """Callback function to wrap RZ gate angles
    
        Args:
            angles: The list of floating point parameter values for the instance of RZGate in
                the circuit
            qubits: The physical qubit indices that this gate is operating on
    
        Returns:
            The DAGCircuit of the equivalent circuit"""
    
        angle = angles[0]
        dag = DAGCircuit()
        dag.add_qubits([Qubit()])
        if angle > 0:
            divisor = math.pi
        else:
            divisor = -math.pi
        gate_counts = int(angles[0] // divisor)
        rem = angles[0] % divisor
        for _ in range(gate_counts):
            dag.apply_operation_back(RZGate(math.pi), [dag.qubits[0]], check=True)
        dag.apply_operation_back(rem, [dag.qubits[0]], check=True)
    
    WRAP_ANGLE_REGISTRY.add_wrapper("rz", callback)

    Target.has_angle_bounds() kann verwendet werden, um zu überprüfen, ob im Ziel Winkelgrenzen festgelegt sind, und Target.gate_has_angle_bounds().

    Wenn Sie die Winkelgrenzen eines Ziels auf beliebige Gatter in einer Schaltung anwenden möchten, sollten Sie dazu den WrapAngles Transpiler-Durchlauf verwenden.

  • Ein neues kwarg wurde check_angle_bounds zur Target.instruction_supported() Methode hinzugefügt. Wenn auf True (Standard) gesetzt, überprüft die Methode, ob das angegebene parameters auch den Winkelgrenzen entspricht, die möglicherweise für die abgefragte Anweisung gelten.

  • Es wurde ein neuer Transpiler-Durchlauf WrapAngles hinzugefügt, der dazu dient, Winkelbeschränkungen auf Gates im Target. Wenn ein Winkelgrenzen Target definiert hat, analysiert dieser Durchlauf alle Parameter für die Gatter im Schaltkreis und vergleicht sie mit den im Ziel angegebenen Grenzen. Wenn ein Ziel beispielsweise ein benutzerdefiniertes Gate mit Winkelgrenzen enthält, zerlegt der Durchlauf dieses Gate in ein Gate, das den Grenzen entspricht:

    from qiskit.circuit import Gate, Parameter, QuantumCircuit, Qubit
    from qiskit.dagcircuit import DAGCircuit
    from qiskit.transpiler import Target, WrapAngleRegistry
    from qiskit.transpiler.passes import WrapAngles
    
    class MyCustomGate(Gate):
    
        def __init__(self, angle):
            super().__init__("my_custom", 1, [angle])
    
    param = Parameter("a")
    circuit = QuantumCircuit(1)
    circuit.append(MyCustomGate(6.0), [0])
    target = Target(num_qubits=1)
    target.add_instruction(MyCustomGate(param), angle_bounds=[(0, 0.5)])
    
    def callback(angles, _qubits):
        angle = angles[0]
        if angle > 0:
            number_of_gates = angle / 0.5
        else:
            number_of_gates = (6.28 - angle) / 0.5
        dag = DAGCircuit()
        dag.add_qubits([Qubit()])
        for _ in range(int(number_of_gates)):
            dag.apply_operation_back(MyCustomGate(0.5), [dag.qubits[0]])
        return dag
    
    registry = WrapAngleRegistry()
    registry.add_wrapper("my_custom", callback)
    wrap_pass = WrapAngles(target, registry)
    res = wrap_pass(circuit)
    res.draw('mpl')
    _images/release_notes-1.png
  • DAGCircuit verfügt nun über eine manuelle Implementierung von __deepcopy__(). Dies ist um ein Vielfaches schneller als die bisherige implizite Implementierung aus dem Pickle-Protokoll, insbesondere bei großen Schaltkreisen. Dies wirkt sich auch direkt positiv auf die Kompilierungsleistung aus, wenn oder die von zurückgegebenen voreingestellten generate_preset_pass_manager() transpile() Pass-Manager mit optimization_level=3 als Optimierungsstufe 3 ausgeführt werden, da intern für jede Iteration der DAGCircuit Optimierungsschleife in der optimization Phase eine tiefe Kopie der erstellt wird.

  • Es wird eine neue Methode bereitgestellt, DAGCircuit.make_physical() die die Qubits im DAGCircuit effizient durch das kanonische physikalische Qubit-Register ersetzt, möglicherweise einschließlich Erweiterung. Eine ähnliche Methode ist ebenfalls QuantumCircuit.ensure_physical() verfügbar.

  • Eine neue Methode, DAGCircuit.structurally_equal(), kann verwendet werden, wenn zwei DAGCircuit Instanzen in genau derselben Reihenfolge erstellt und geändert wurden. Dies ist ein wesentlich strengerer Test als die standardmäßige semantische Äquivalenzprüfung der == Überladung und kann von Transpiler-Pass-Autoren verwendet werden, um zu überprüfen, ob ihre Änderungsreihenfolgen deterministisch sind.

  • Benutzerdefinierte Unterklassen von BasePassManager können nun ihr property_set Attribut während ihrer _passmanager_frontend() Methode ändern, um Anfangseigenschaften zu initialisieren. Dies sorgt für Symmetrie, da es zuvor nur möglich war, die endgültigen Eigenschaften während des Vorgangs _passmanager_backend() zu lesen.

  • Eine neue Klasse OptimizationMetric hinzugefügt, die das Optimierungskriterium im HighLevelSynthesis Durchgang festlegt. Derzeit werden die folgenden beiden Metriken unterstützt:

    • COUNT_2Q: optimiert die Anzahl der Zwei-Qubit-Gatter.
    • COUNT_T: optimiert die Anzahl der T-Gates bei der Transposition in eine Clifford+T-Basismenge.

    Der Transpiler wählt automatisch die Zielmetrik basierend auf dem Basisgatesatz aus, d. h. er verwendet, COUNT_T wenn ein Clifford+T-Basisgatesatz erkannt wird. Diese Klasse kann jedoch derzeit nicht manuell festgelegt werden, wenn oder ein von generierter transpile() voreingestellter generate_preset_pass_manager()Pass-Manager ausgeführt wird.

  • Dem Konstruktor für HighLevelSynthesis den Transpiler-Durchlauf wurde ein neues optimization_metric Argument hinzugefügt, das ein OptimizationMetric Objekt akzeptiert. Wenn auf gesetzt COUNT_T, wählt der Durchgang Zerlegungen, die für den Clifford+T-Gatesatz besser geeignet sind.

  • Die standardmäßigen High-Level-Synthese-Plugins für ModularAdderGate und MultiplierGate erzeugen bessere T-Zählungen, wenn sie in den Clifford+T-Basissatz transpiliert werden.

  • Das standardmäßige High-Level-Synthese-Plugin für MCXGate erzeugt bessere T-Zählungen beim Transpilen in den Clifford+T-Basissatz, vorausgesetzt, mindestens 1 Ancilla-Qubit ist verfügbar.

  • Ein Standardsatz inverser Gatter für den InverseCancellation Transpiler-Durchlauf wurde hinzugefügt. Bisher war eine explizite Liste der zu löschenden Gates oder Gate-Paare ein erforderliches Argument für den Konstruktor des Pass-Objekts. Diese Liste ist optional. Wenn keine Liste angegeben wird, sind die selbstinversen Gatter:

    und die umgekehrten Paare:

    wird durch den Pass aufgehoben.

  • Dem InverseCancellation Konstruktor wurde ein neues Argument hinzugefügt, run_default das, wenn es auf True gesetzt ist, zusätzlich zu den bereitgestellten benutzerdefinierten Gattern die neue standardmäßige inverse Cancellation-Gate-Liste ausführt. Dies ist für Anwendungsfälle vorgesehen, in denen Sie zusätzlich zu den Standard-Gates einen benutzerdefinierten Satz inverser Löschungen ausführen möchten.

  • TranspileLayout hat zwei neue Methoden: from_property_set() und write_into_property_set(), die die aktuelle Ad-hoc-Struktur der Transpilierungseigenschaften formalisieren und festlegen, wie diese in eine konvertiert TranspileLayout werden. Dadurch können Passes während einer Transpiler-Pipeline auf das zugreifen, TranspileLayout was sein wird, es in vollständig strukturierter Form ändern und dann in kanonischer Form zurückschreiben.

    Es wird erwartet, dass in der zukünftigen Version 3.0 von Qiskit das TranspileLayout (oder etwas Ähnliches) ein direktes Attribut der DAGCircuit Transpiler-Zwischendarstellung sein wird und von Durchläufen verlangt wird, um mit dem Rest des synchronisiert DAGCircuit zu bleiben.

  • Wieder aktivierter Lauf VF2PostLayout des Transpilers in der optimization Phase für optimization_level=3 mit der transpile() Funktion und den generierten Pass-Manager-Objekten, die von der generate_preset_pass_manager() Funktion zurückgegeben werden. Der Durchlauf erfolgt strict_direction=True nach allen physikalischen Optimierungen, die in dieser Phase durchgeführt wurden, um das Layout ein letztes Mal mit dem exakten Ausgangsschaltkreis zu verbessern. Dies war zuvor in Qiskit v2.1.0 aktiviert, wurde jedoch aufgrund von Problemen mit der ursprünglichen Implementierung in 2.1.2 wieder rückgängig gemacht. Diese Probleme wurden behoben, und das Layout wird korrekt angewendet, wenn ein besseres gefunden wird.

Visualisierungsfunktionen

  • Eine neue Option, measure_arrows, wurde zu den Backends mpl``text und für den Schaltkreisteckner qiskit.visualization.circuit_drawer() und qiskit.circuit.QuantumCircuit.draw()hinzugefügt. Wenn diese Option auf Truegesetzt ist, zeichnet die Schublade einen Pfeil vom Feld measure zu den klassischen Bits darunter. Dies war das bisherige Verhalten in den Schubladen. Wenn es auf Falsegesetzt ist, werden keine Pfeile gezeichnet, sondern stattdessen werden das klassische Register measure und das vom verwendete Bit innerhalb des measure Feldes angezeigt. Dadurch können measure Boxen innerhalb einer vertikalen Ebene gestapelt werden.

    Wenn keine Option gesetzt ist, ist der Standardwert True. Der Benutzer kann die Voreinstellung in der Benutzerkonfigurationsdatei, standardmäßig im Verzeichnis ~/.qiskit , in der Datei settings.conf ändern. Unter der Überschrift [Default] kann ein Benutzer circuit_measure_arrows = False eingeben, um den Standard zu ändern.

Anmerkungen zu Upgrades

  • Die minimal unterstützte Rust-Version für die Erstellung von Qiskit aus dem Quellcode (einschließlich der Erstellung der C-API im Standalone-Modus) wurde von Rust 1.79 auf Rust 1.85 erhöht. Diese Änderung war notwendig, um die Verwendung einer neueren Version der Rust-Bibliothek für lineare Algebra faer zu ermöglichen, die in Qiskit verwendet wird. Beim Betrieb von Qiskit unter Windows mit der vorherigen Version von faer wurden Probleme festgestellt. Diese wurden in der neueren Version behoben, allerdings ist eine neuere Version des Rust-Compilers erforderlich, um die neuere Version von faer zu erstellen.

Hinweise zur Aktualisierung von Schaltkreisen

Hinweise zum Upgrade der C-API

QPY-Upgrade-Hinweise

  • Die Standardversion von QPY, die von ausgegeben qpy.dump() wird, ist jetzt QPY-Format Version 16. Wenn Sie eine andere Formatversion benötigen, können Sie mit dem version Argument eine frühere Formatversion angeben.

Hinweise zum Upgrade der Quanteninformation

Hinweise zum Upgrade der Synthese

  • Die Standardwerte der Argumente opt_a1 und opt_a2 von qs_decomposition() sind nun opt_a1 = None und opt_a2 = None. Die neuen Standardwerte wählen den optimalen Wert basierend darauf, ob die Eingabeeinheit für das mat Argument gesteuert wird oder nicht, um standardmäßig die minimale CXGate Anzahl zu erzielen. Wenn Sie das bisherige Verhalten benötigen, können Sie explizit und opt_a1 = True aufrufen opt_a2 = True , um das gleiche Verhalten wie in früheren Versionen beizubehalten.

Hinweise zum Transpiler-Upgrade

  • Der Schaltkreis legt PassManager nun immer die Eigenschaften original_circuit_indices und fest num_input_qubits , bevor die Ausführung einzelner Durchläufe beginnt. Dies sind Eigenschaften der Eingangsschaltung, die zuvor von einzelnen Durchläufen festgelegt werden mussten, oft als Nebeneffekt ihres Hauptzwecks.

Veraltete Schaltungen

Fehlerkorrekturen

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

  • Probleme mit Speicherlecks bei der Erstellung einer QkOpCounts Instanz und bei Aufrufen von wurden qk_opcounts_clear() behoben, wenn eine leere Instanz übergeben wurde.

  • Bisher konnte man einen ungültigen Operator PauliEvolutionGate aus einer Liste von Operatoren definieren, wobei die Operatoren nicht alle für die gleiche Anzahl von Qubits definiert waren. Dies wurde nun behoben, und wir geben nun eine Fehlermeldung aus, wenn das Gate definiert wird:

    from qiskit.quantum_info import Pauli, SparsePauliOp
    from qiskit.circuit.library import PauliEvolutionGate
    
    pauli = Pauli("XYZ")  # 3 qubits
    op = SparsePauliOp(["XYIZ"], [1])  # 4 qubits
    evo = PauliEvolutionGate([pauli, op], time=1)
  • Ein Problem im VF2Layout Transpiler-Durchlauf wurde behoben, bei dem die Ausgabe des Durchlaufs selbst bei einem festen Startwert möglicherweise nicht deterministisch war, insbesondere wenn die Eingabeschaltung aktive Qubits enthielt, die nur Einzelqubit-Operationen enthielten. Behoben #14729

  • Ein Fehler wurde behoben, PassManager.run() bei dem die callback Funktion nicht aufgerufen wurde, wenn mehrere Schaltkreise ausgeführt wurden. Der Rückruf wird nun korrekt für jeden Durchlauf auf jedem Schaltkreis ausgelöst, auch bei paralleler Ausführung.

  • Mehrere Probleme im CommutativeInverseCancellation Transpiler-Durchlauf wurden behoben. Der Pass funktioniert nun korrekt auf Schaltkreisen, die Clifford Operationen, Kontrollflussoperationen und nicht invertierbare Operationen wie enthalten Initialize.

    Darüber hinaus führt der Durchlauf jetzt immer zuerst eine syntaktische (nicht-matrixbasierte) Prüfung durch, wenn er inverse Gatterpaare identifiziert. Wenn die Gates syntaktisch nicht gleich sind, das Argument matrix_based auf True gesetzt ist und die Operation nicht auf mehr als max_qubits Qubits wirkt, wird ebenfalls eine matrixbasierte Prüfung durchgeführt. Dadurch wird das Reduktionspotenzial des Passes leicht verbessert.

    #14407, #14635 und #14645 behoben.

  • Mehrere Probleme im CommutativeCancellation Transpiler-Durchlauf (und damit in transpile()) behoben, bei denen die globale Phase der Schaltung nicht korrekt aktualisiert wurde. Insbesondere führte die Zusammenführung eines X-Gatters und eines RX-Gatters zu einer Phasenfehlanpassung, während die Entfernung eines Pauli-Rotationsgatters mit dem Winkel der Form (2+4k)π(2 + 4k)\pi, k∈Zk \in \mathbb Z fälschlicherweise zu einer Phasenverschiebung von −1-1 führte.

  • Ein Problem wurde behoben, CommutationCheckerbei dem standardmäßig gesteuerte Gates nicht korrekt verarbeitet wurden, wenn sie auf etwas anderem als dem All-Eins-Zustand gesteuert wurden. Behoben #14974

  • Nichtdeterminismus in behoben CommutativeCancellation. Dies hatte keinen Einfluss auf die von DAGCircuit.topological_nodes() oder zurückgegebene topological_op_nodes() Reihenfolge, die aufgrund ihrer integrierten kanonischen Sortierfunktion in der Regel verwendet werden sollte, wenn die Deterministik der Knotenreihenfolge wichtig ist. Bei der Überprüfung der Knoten in beliebiger Reihenfolge (DAGCircuit.op_nodes()) oder der Kantenstruktur (DAGCircuit.edges()) wäre die Iterationsreihenfolge nach einem Aufruf von jedoch nicht CommutativeCancellationdeterministisch.

  • Ein Fehler wurde behoben, MCXGate.control()bei dem beim Hinzufügen weiterer Steuerelemente zu einem offen gesteuerten die ctrl_state des gesteuerten MCX-Gatters MCXGate nicht berücksichtigt wurde, was zu einer falschen ctrl_state des erweiterten MCX-Gatters führte. Beachten Sie, dass die expliziten MCX-Klassen CXGate, CCXGate, C3XGate und bereits C4XGate korrekt verarbeitet 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.

  • Ein Fehler in PhaseOracle, PhaseOracleGate und wurde BitFlipOracleGate behoben, bei dem beim Versuch, aus einer Dimacs-Datei zu laden, ein Fehler auftrat TypeError.

  • Ein Fehler im ElidePermutations Transpiler-Durchlauf wurde behoben, bei dem die Qubit-Zuordnung bei Vorhandensein von PermutationGates nicht korrekt aktualisiert wurde, was zu falschen Schaltkreisen und Aktualisierungen des Eigenschaftensatzes des Durchlaufmanagers führte.

  • Der integrierte Transpiler, der diese final_layout Eigenschaft festlegt, aktualisiert dieses Feld nun korrekt, wenn es bereits festgelegt war. Dies lässt sich daran erkennen, dass die Methode nach mehr als einem TranspileLayout.routing_permutation Durchlauf, der setzt final_layout, nun eine korrekte Permutation zurückgibt.

    Dies hatte keine Auswirkungen auf normale Aufrufe von transpile() oder generate_preset_pass_manager() unter Verwendung der in Qiskit integrierten Plugins; keine in dieser Form erstellte Pipeline würde versuchen, mehr als einmal final_layout zu setzen.

  • Ein Fehler im HighLevelSynthesis Pass wurde behoben, durch den Objekte mit klassischen Registern in der Schaltung dem relativen Index im Objekt zugeordnet wurden, anstatt dem entsprechenden Index in der äußeren Schaltung. Die klassischen Register sind nun korrekt dem äußeren Schaltungsindex zugeordnet.

  • Ein Fehler wurde behoben, Target.instruction_supported() bei dem die Überprüfung der Qubit-Reihenfolge der Anweisung übersprungen wurde, wenn die Methode mit Argumenten aufgerufen operation_name``parameters wurde, die mit einer vorhandenen Anweisung übereinstimmten.

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

  • Ein Problem in Plugins für die MCXSynthesis1DirtyKG24MCXSynthesis2DirtyKG24 High-Level-Synthese MCXGate und wurde behoben, bei dem die Plugins verfügbare saubere Hilfsqubits nicht als verfügbare schmutzige Hilfsqubits berücksichtigten. Insbesondere wurde das MCXSynthesis2DirtyKG24 Plugin nicht angewendet, wenn ein sauberes und ein verschmutztes Hilfsqubit verfügbar waren.

  • Die PauliEvolutionGate.to_matrix() Methode gibt nun den exakten Matrixexponential exp⁡(−itH)\exp(-it H) zurück, wobei HH die operator und tt die an time das Gate übergebene ist. Dies behebt ein unerwartetes Verhalten, da die Matrix PauliEvolutionGate laut Dokumentation die genaue Zeitentwicklung darstellt, zuvor jedoch davon abhängig war, wie der Compiler die Zeitentwicklung approximiert. Die to_matrix Methode stimmt nun mit der Dokumentation überein.

  • Eine Leistungsverschlechterung beim inkrementellen Erstellen ParameterExpression durch die Kombination einer großen Anzahl von Unterausdrücken wurde behoben. Behoben #14653

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

  • Ein Randfall bei der Anzeige der QFT Schaltung wurde behoben. Zuvor wurde, QFT.inverse() wenn aufgerufen und anschließend die Attribute des QFT-Schaltkreises geändert wurden, das QFT als "IQFT_dg"angezeigt. Dies war falsch, und jetzt wird es korrekt angezeigt "IQFT". Fehler Nr. 14758 behoben.

  • Ein Fehler im PauliEvolutionSynthesisRustiq Plugin wurde behoben, der zu falschen Schaltkreisen führte, wenn der Operator eines Objekte PauliEvolutionGate vom Typ SparseObservableenthielt.

    Zum Beispiel:

    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparseObservable, Operator
    from qiskit.transpiler.passes.synthesis.hls_plugins import PauliEvolutionSynthesisRustiq
    
    obs = SparseObservable.from_sparse_list([("1+XY", (0, 1, 2, 3), 1.5)], num_qubits=4)
    evo = PauliEvolutionGate(obs, 1)
    qct = PauliEvolutionSynthesisRustiq().run(evo)
    assert Operator(qct) == Operator(evo)
  • Ein Problem mit der generate_preset_pass_manager() Funktion wurde behoben, bei dem die in einem Target Objekt enthaltenen Zeitbeschränkungsdaten fälschlicherweise ignoriert wurden, wenn das backend Argument nicht festgelegt war. Behoben #14329

  • Es wurde ein Fehler in ObservablesArray.coerce_observable() behoben, bei dem eine Ausnahme, dass ein Observable nicht hermitisch war, übermäßig ausgelöst wurde. Observables, die gleich zero sind, sind nicht erlaubt und führen nun zu einem eleganten Fehler.

  • qiskit.circuit.library.quantum_volume() wurde aktualisiert, um ein numpy.random.Generator als Eingabe für sein seed Argument zu verarbeiten. Bisher hätte ein solches Generatorargument zu einem TypeError. geführt.

  • QuantumCircuit.compose() wird nun alle Variablen und Strecken, die in Delay Anweisungen verwendet werden, korrekt neu zuordnen, wenn das var_remap Argument angegeben ist.

  • SabreLayout verwendet als einen seiner Versuche ein „dichtes Teilmengen“-Layout, das dem gleichen Algorithmus wie folgt DenseLayout. Zuvor ordnete die von Sabre verwendete Version jedoch alle virtuellen Qubits, einschließlich Dummy-Ancillas, einem physikalischen Qubit zu, was die Effektivität des Algorithmus beeinträchtigte, jedoch nicht dessen Korrektheit. Sabre wird nun nur noch die vom Benutzer für diesen ersten Versuch definierten virtuellen Qubits verwenden, was bei einer Mittelung über große Schaltungsklassen zu geringfügigen Verbesserungen bei der Layout-Auswahl führen kann.

  • Ein Fehler wurde behoben, SparsePauliOp.simplify() bei dem die Methode Pauli-Terme basierend auf der Größe ihrer Koeffizienten entfernte, bevor Duplikate kombiniert wurden. 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.

  • TranspileLayout.initial_index_layout() behandelt nun das filter_ancillas=True Argument korrekt, wenn die virtuellen Qubits im Index nicht vom Konstruktor in initial_layout Indexreihenfolge angegeben wurden.

  • VF2Layout und VF2PostLayout wird nun korrekt (beliebige) Layout-Zuweisungen für vollständig untätige Qubits enthalten. Bisher konnte dies möglicherweise durch fehlgeschlagene TranspileLayout.initial_index_layout() Aufrufe nach einer Kompilierung beobachtet werden.

  • Ein Problem im VF2PostLayout Transpiler-Durchlauf wurde behoben. In bestimmten Situationen, in denen der Durchlauf mit dem Argument strict_direction=True ausgeführt wurde, gab es ein potenzielles Problem mit der Laufzeitskalierung, wenn der Interaktionsgraph des Schaltkreises Qubits enthielt, die nur 1-Qubit-Operationen hatten. Diese Zuordnungsprobleme führen zu einer kombinatorischen Komplexität bei der Bewertung, die dazu führen würde, dass der Pass fast immer die Bewertungszeit überschreitet und in der Regel keine Verbesserung des Layouts bewirkt. Im strict_direction=False Modus gibt es eine optimierte Suchimplementierung für diese Probleme, aber die zusätzlichen Einschränkungen für machen diesen strict_direction=True Ansatz nicht praktikabel. Stattdessen wird in diesen VF2PostLayout Fällen die Suche nun übersprungen, da das Layoutproblem für den Durchgang nicht realisierbar ist.

Sonstige Anmerkungen

  • Die Implementierung des von SabreLayout und verwendeten SabreSwap Sabre-Routings komprimiert nun Knotenfolgen, die innerhalb seiner internen virtuellen Interaktionsdarstellung automatisch gleichzeitig für das Routing in Frage kommen. Dies verbessert die Effizienz des Routings, reduziert den Zwischenspeicherbedarf und verhindert, dass eine Reihe von „ 2q “-Gattern die lookahead heuristischen Komponenten verzerrt.

2.1.0rc1

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 2.3.0 Version entfernt. Die 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/

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