Skip to main content
IBM Quantum Platform

Qiskit 0.37 Versionshinweise


0.37.2

Terra- 0.21.2

Vorspiel

Qiskit Terra 0.21.2 ist in erster Linie eine Fehlerbehebungsversion, die auch einige verbesserte Dokumentationsseiten enthält.

Fehlerkorrekturen

  • aer_simulator_statevector_gpu wird nun korrekt als Statevector-Methode in einigen Funktionen erkannt, wenn die GPU-Simulatoren von Qiskit Aer in QuantumInstance und anderen Algorithmus-Runnern.

  • Behebung der UCGate.inverse() methode, die bisher die globale Phase nicht invertierte.

  • QuantumCircuit.compose() funktioniert jetzt korrekt, wenn es mit dem Argument inplace=True in Kontrollfluss-Erstellungskontexten verwendet wird. Zuvor wurden die Anweisungen außerhalb des Kontrollflussbereichs hinzugefügt. Behoben #8433.

  • Ein Fehler wurde behoben, bei dem ein gebundener ParameterExpression nicht als real identifiziert wurde, wenn symengine installiert war und der bound-Ausdruck nicht ein einfacher 1j war. Zum Beispiel:

    from qiskit.circuit import Parameter
    
    x = Parameter("x")
    expr = 1j * x
    bound = expr.bind({x: 2})
    print(bound.is_real())  # used to be True, but is now False
  • Korrigierte QPY-Serialisierung und Deserialisierung von ControlledGate mit offenen Steuerelementen (d.h. solchen, deren ctrl_state nicht alle Einsen sind). Behoben #8549.

  • Alle Fake-Backends in qiskit.providers.fake_provider.backends wurden aktualisiert, um die entsprechenden Pulskanalobjekte mit dem Methodenaufruf von drive_channel(), measure_channel(), acquire_channel(), control_channel() zurückzugeben.

  • Die Unterstützung für die Ausführung von Z2Symmetries.taper() bei größeren Problemen wurde verbessert. Zuvor benötigte die Methode eine große Menge an Speicherplatz, was bei größeren Problemen zu Fehlern führen konnte. Als Nebeneffekt dieser Korrektur hat sich die Leistung deutlich verbessert.

Aer- 0.10.4

Keine Änderung

IBM Q Anbieter 0.19.2

Keine Änderung


0.37.1

Terra- 0.21.1

Fehlerkorrekturen

  • Es wurde ein Problem in der QuantumCircuit.decompose() methode, wenn eine Liste von Gate Klassen für das gates_to_decompose Argument übergeben wurde. Wenn irgendein Gatter in der Schaltung ein Label gesetzt hatte, wurde dieses Argument nicht korrekt behandelt und führte dazu, dass die Ausgangszerlegung Gatter, die explizit in der Liste gates_to_decompose aufgeführt waren, fälschlicherweise übersprang.

  • Behebung to_instruction() die zuvor versucht hat, einen UnitaryGate ohne Potenzierung des Operators zu entwickeln. Da dieser Operator im Allgemeinen nicht unitär ist, führte dies zu einem Fehler (und wenn der Operator zufällig unitär gewesen wäre, wäre dies nicht das erwartete Ergebnis gewesen).

    Der Aufruf von to_instruction() erzeugt nun korrekt ein Gatter, das die zeitliche Entwicklung des darin enthaltenen Operators implementiert:

    >>> from qiskit.opflow import EvolvedOp, X
    >>> op = EvolvedOp(0.5 * X)
    >>> op.to_instruction()
    Instruction(
        name='unitary', num_qubits=1, num_clbits=0,
        params=[array([[0.87758256+0.j, 0.-0.47942554j], [0.-0.47942554j, 0.87758256+0.j]])]
    )
  • Es wurde ein Problem mit der Funktion marginal_distribution() funktion: Wenn ein Numpy-Array als indices Argument übergeben wurde, löste die Funktion einen Fehler aus. Behoben #8283

  • Bisher war es nicht möglich, eine CircuitStateFn zu adjungieren, das aus a konstruiert wurde VectorStateFn. Das liegt daran, dass der Zustandsvektor mit der Anweisung Initialize in eine Schaltung umgewandelt wurde, die nicht unitär ist. Dieses Problem wird nun behoben, indem stattdessen die StatePreparation anweisung, die verwendet werden kann, da davon ausgegangen wird, dass sich der Zustand zu Beginn im Zustand 0 befindet.

    Zum Beispiel können wir jetzt tun:

    from qiskit import QuantumCircuit
    from qiskit.opflow import StateFn
    
    left = StateFn([0, 1])
    left_circuit = left.to_circuit_op().primitive
    
    right_circuit = QuantumCircuit(1)
    right_circuit.x(0)
    
    overlap = left_circuit.inverse().compose(right_circuit)  # this line raised an error before!
  • Behebung eines Fehlers in den Optimizer klassen, bei dem das Rekonstruieren einer neuen Optimierer-Instanz aus einer vorher existierenden settings sowohl die neuen als auch die vorherigen Optimierer-Einstellungen auf die Standardwerte zurücksetzte. Dies führte insbesondere zu einem Fehler, wenn Optimizer objekte als Eingabe an Qiskit Runtime Programme gesendet wurden.

    Optimierungsobjekte werden jetzt korrekt rekonstruiert:

    >>> from qiskit.algorithms.optimizers import COBYLA
    >>> original = COBYLA(maxiter=1)
    >>> reconstructed = COBYLA(**original.settings)
    >>> reconstructed._options["maxiter"]
    1  # used to be 1000!
  • Es wurde ein Problem behoben, bei dem das Argument limit_amplitude bei einem einzelnen SymbolicPulse oder Waveform instanz von der Parametervalidierung nicht korrekt wiedergegeben wurde. Darüber hinaus wurde QPY schedule dump() nun korrekt den an die Instanz gebundenen Wert limit_amplitude speichern, anstatt die globale Klassenvariable zu speichern.

  • Festlegung der paarweisen Verschränkungsstruktur für NLocal schaltungen. Dies führte zu einem Fehler in der ZZFeatureMapführte, bei dem die Verwendung von entanglement="pairwise" einen Fehler auslöste. Jetzt wird die gewünschte Feature-Map korrekt erzeugt:

    from qiskit.circuit.library import ZZFeatureMap
    encoding = ZZFeatureMap(4, entanglement="pairwise", reps=1)
    print(encoding.decompose().draw())

    Die obigen Drucke:

         ┌───┐┌─────────────┐
    q_0: ┤ H ├┤ P(2.0*x[0]) ├──■────────────────────────────────────■────────────────────────────────────────────
         ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐
    q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(π - x[0])*(π - x[1])) ├┤ X ├──■────────────────────────────────────■──
         ├───┤├─────────────┤└───┘└──────────────────────────────┘└───┘┌─┴─┐┌──────────────────────────────┐┌─┴─┐
    q_2: ┤ H ├┤ P(2.0*x[2]) ├──■────────────────────────────────────■──┤ X ├┤ P(2.0*(π - x[1])*(π - x[2])) ├┤ X ├
         ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐└───┘└──────────────────────────────┘└───┘
    q_3: ┤ H ├┤ P(2.0*x[3]) ├┤ X ├┤ P(2.0*(π - x[2])*(π - x[3])) ├┤ X ├──────────────────────────────────────────
         └───┘└─────────────┘└───┘└──────────────────────────────┘└───┘
  • Es wurde ein Problem bei der Handhabung der globalen Phase der UCGate klasse.

Aer- 0.10.4

Keine Änderung

IBM Q Anbieter 0.19.2

Keine Änderung


0.37.0

Diese Version markiert offiziell das Ende der Unterstützung für das Qiskit Ignis Projekt von Qiskit. Ursprünglich war es in der Version 0.33.0 veraltet, und wie in dieser Version dokumentiert wurde, wurde das Paket qiskit-ignis aus dem Qiskit-Metapaket entfernt, was bedeutet, dass in dieser zukünftigen Version pip install qiskit nicht mehr qiskit-ignis enthalten sein wird. Beachten Sie jedoch, dass wir aufgrund von Einschränkungen bei der Paketierung von Python eine bereits vorhandene Installation von qiskit-ignis nicht automatisch entfernen können. Wenn Sie ein Upgrade von einer früheren Version durchführen, wird empfohlen, Qiskit Ignis mit pip uninstall qiskit-ignis manuell zu deinstallieren oder das Metapaket in einer neuen Python-Umgebung zu installieren.

Qiskit Ignis wurde durch das Projekt Qiskit Experiments abgelöst. Einzelheiten zum Wechsel von Qiskit Ignis zu Qiskit Experiments finden Sie in der Migrationsanleitung.

Terra- 0.21.0

Vorspiel

Die Highlights der Qiskit 0.21.0 Version sind:

  • Unterstützung für die Serialisierung eines Impulses ScheduleBlock über qiskit.qpy. Das QPY-Format wurde auf die Version 5 aktualisiert, die eine Definition für die Einbeziehung der Impulszeitpläne enthält. Um dies zu unterstützen, wurde eine neue SymbolicPulse klasse eingeführt, die die Definition parametrischer Impulswellenformen über symbolische Ausdrücke ermöglicht.
  • Verbesserungen bei der Arbeit mit voreingestellten Pass-Managern. Eine neue Funktion generate_preset_pass_manager() ermöglicht die einfache Erzeugung eines Pass-Managers, der dem entspricht, was transpile() intern verwenden wird. Außerdem sind die voreingestellten Passmanager jetzt Instanzen von StagedPassManager was es einfacher macht, Abschnitte zu ändern.
  • Eine Umstrukturierung der internen Datenstruktur des QuantumCircuit.data attributs. Früher war es eine Liste von Tupeln in der Form (instruction, qubits, clbits) und jetzt ist es eine Liste von CircuitInstruction objekten. Die CircuitInstruction objekte ist abwärtskompatibel mit dem früheren tupelbasierten Zugriff, allerdings mit Laufzeit-Overhead-Kosten.

Außerdem wurde der Transpiler verbessert, um eine bessere Qualität der Ausgaben zu ermöglichen. Dazu gehört die Einführung neuer Pässe wie VF2PostLayout und ToqmSwap.

Neue Funktionen

  • Eine neue Klasse wurde hinzugefügt, qiskit.transpiler.StagedPassManagerhinzugefügt, die eine PassManager unterklasse, die eine Pipeline mit definierten Phasen für die Kompilierung von Schaltkreisen besitzt. Jede Phase ist ein PassManager objekt, das in einer bestimmten Reihenfolge ausgeführt wird. Zum Beispiel:

    from qiskit.transpiler.passes import *
    from qiskit.transpiler import PassManager, StagedPassManager
    
    basis_gates = ['rx', 'ry', 'rxx']
    init = PassManager([UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()])
    translate = PassManager([Collect2qBlocks(),
                             ConsolidateBlocks(basis_gates=basis_gates),
                             UnitarySynthesis(basis_gates)])
    
    staged_pm = StagedPassManager(stages=['init', 'translation'], init=init, translation=translate)
  • Hinzufügen der Methoden PauliList.group_commuting() und SparsePauliOp.group_commuting()hinzugefügt, die diese Operatoren in Unterlisten aufteilen, in denen jedes Element mit allen anderen kommutiert. Zum Beispiel:

    from qiskit.quantum_info import PauliList, SparsePauliOp
    
    groups = PauliList(["XX", "YY", "IZ", "ZZ"]).group_commuting()
    # 'groups' is [PauliList(['IZ', 'ZZ']), PauliList(['XX', 'YY'])]
    
    op = SparsePauliOp.from_list([("XX", 2), ("YY", 1), ("IZ", 2j), ("ZZ", 1j)])
    groups = op.group_commuting()
    # 'groups' is [
    #     SparsePauliOp(['IZ', 'ZZ'], coeffs=[0.+2.j, 0.+1.j]),
    #     SparsePauliOp(['XX', 'YY'], coeffs=[2.+0.j, 1.+0.j]),
    # ]
  • Eine neue Funktion wurde hinzugefügt, marginal_distribution()hinzugefügt, die verwendet wird, um ein Eingabewörterbuch von Bitstrings in eine ganze Zahl zu marginalisieren (z. B Counts). Diese Funktion ähnelt in ihrer Funktionalität der bestehenden marginal_counts() funktion mit drei wesentlichen Unterschieden. Die erste ist, dass marginal_counts() entweder mit einem Zählwörterbuch oder einem Results Objekt arbeitet, während marginal_distribution() nur mit einem Wörterbuch funktioniert. Die zweite ist, dass marginal_counts() die Reihenfolge der Indizes in seinem indices Argument nicht beachtet, während marginal_distribution() dies tut und die Ausgabebits auf der Grundlage der indices Reihenfolge vertauscht. Der dritte Unterschied ist, dass marginal_distribution() schneller sein sollte, da seine Implementierung in Rust geschrieben ist und für die Marginalisierung einer Wörterbuch-Eingabe optimiert wurde.

  • Der Binäroperator @ (__matmul__) wurde zu BaseOperator Unterklassen im qiskit.quantum_info modul. Dies ist eine Abkürzung für den Aufruf der Methode dot der Klasse (A @ B == A.dot(B)).

  • Ein neues optionales Argument, reps, wurde zu QuantumCircuit.decompose()hinzugefügt, das eine wiederholte Zerlegung der Schaltung ermöglicht. Zum Beispiel:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(1)
    circuit.ry(0.5, 0)
    
    # Equivalent to circuit.decompose().decompose()
    circuit.decompose(reps=2)
    
    # decompose 2 times, but only RY gate 2 times and R gate 1 times
    circuit.decompose(gates_to_decompose=['ry','r'], reps=2)
  • Eine neue Pulse-Basisklasse hinzugefügt SymbolicPulse. Dies ist ein Ersatz für das herkömmliche ParametricPulse, die veraltet sein wird. In der neuen Basisklasse werden die Funktionen der Impulshüllkurve und der Parameterüberprüfung durch Objekte mit symbolischen Ausdrücken dargestellt. Die neue Klasse bietet in sich geschlossene und portable Impulsdaten, da diese symbolischen Gleichungen leicht durch symbolische Berechnungsbibliotheken serialisiert werden können.

  • Unterstützung für nicht-hermitsche Operatoren in AerPauliExpectation. Dies ermöglicht die Verwendung von Aer's schnellen Snapshot-Erwartungsberechnungen in Algorithmen wie QEOM.

  • Es wurde ein neuer Zeichenstil für Schaltkreise hinzugefügt, textbook, der das Farbschema des Qiskit-Lehrbuchs verwendet.

  • Ein neues Attribut QuantumCircuit.op_start_times wird ausgefüllt, wenn einer der Scheduling-Analysedurchläufe für den Schaltkreis durchgeführt wird. Sie kann z. B. verwendet werden, um eine Schaltanweisung mit Anweisungszeit zu erhalten:

    from qiskit import QuantumCircuit, transpile
    from qiskit.providers.fake_provider import FakeMontreal
    
    backend = FakeMontreal()
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    
    qct = transpile(
        qc, backend, initial_layout=[0, 1], coupling_map=[[0, 1]], scheduling_method="alap"
    )
    scheduled_insts = list(zip(qct.op_start_times, qct.data))
  • Hinzufügen einer neuen Methode QuantumCircuit.clear() hinzugefügt, die verwendet wird, um alle Anweisungen aus einer QuantumCircuit.

  • Eine neue Methode hinzugefügt QuantumCircuit.copy_empty_like() die verwendet wird, um eine gelöschte Kopie einer QuantumCircuit instanz zu erhalten. Dies ist logisch gleichwertig mit qc.copy().clear(), aber wesentlich schneller und speichereffizienter. Dies ist nützlich, wenn man einen neuen leeren Schaltkreis benötigt, dem bereits alle Ressourcen (Qubits, klassische Bits, Metadaten usw.) hinzugefügt wurden.

  • Die Methode Target.instruction_supported() methode unterstützt jetzt zwei neue Schlüsselwortargumente: operation_class und parameters. Mit diesen Argumenten kann die instruction_supported() methode nun verwendet werden, um zu prüfen, ob eine bestimmte Operation mit Parameterwerten von einem Target objekt unterstützt wird. Wenn Sie zum Beispiel prüfen wollen, ob ein Target namens target die Ausführung eines RXGate mit θ=π2\theta = \frac{\pi}{2} unterstützt, würden Sie etwas wie folgt tun:

    from math import pi
    from qiskit.circuit.library import RXGate
    
    target.instruction_supported(operation_class=RXGate, parameters=[pi/2])

    die True zurückgibt, wenn target die Ausführung von RXGate mit θ=π2\theta = \frac{\pi}{2} unterstützt und False , wenn dies nicht der Fall ist.

  • Hinzufügen eines auf Trotterisierung basierenden Quanten-Echtzeit-Evolutionsalgorithmus qiskit.algorithms.TrotterQRTE. Es ist mit dem neuen Rahmen für die Quantenzeitentwicklung vereinbar und macht Gebrauch von den ProductFormula und PauliEvolutionGate implementierungen.

    from qiskit.algorithms import EvolutionProblem
    from qiskit.algorithms.evolvers.trotterization import TrotterQRTE
    from qiskit.opflow import X, Z, StateFn, SummedOp
    
    operator = SummedOp([X, Z])
    initial_state = StateFn([1, 0])
    time = 1
    evolution_problem = EvolutionProblem(operator, time, initial_state)
    
    trotter_qrte = TrotterQRTE()
    evolution_result = trotter_qrte.evolve(evolution_problem)
    evolved_state_circuit = evolution_result.evolved_state
  • Eine neue Funktion wurde hinzugefügt generate_preset_pass_manager() die verwendet werden kann, um schnell ein voreingestelltes PassManager objekt zu erzeugen, das die PassManager spiegelt, das intern von der transpile() funktion. Zum Beispiel:

    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.providers.fake_provider import FakeWashingtonV2
    
    # Generate an optimization level 3 pass manager targeting FakeWashingtonV2
    pass_manager = generate_preset_pass_manager(3, FakeWashingtonV2())
  • Eine neue Funktion wurde hinzugefügt marginal_memory() hinzugefügt, die zur Marginalisierung von Shot-Memory-Arrays verwendet wird. Mit dem Schuss-Speicher-Array und den Indizes, die von Interesse sind, gibt die Funktion ein maginisiertes Schuss-Speicher-Array zurück. Diese Funktion unterscheidet sich von der Speicherunterstützung in der marginal_counts() methode, die nur mit dem Feld memory in einem Results Objekt arbeitet.

  • Die Primitivschnittstelle wurde erweitert, um neben Indizes auch Objekte als Argumente für die Methode __call__ zu akzeptieren. Das Argument parameter_values kann nun optional sein.

  • Der OpenQASM 3-Exporter (qiskit.qasm3) unterstützt nun den Export von Schaltungen mit expliziten Verzögerungen, wie z.B. von QuantumCircuit.delay().

  • Hinzufügen einer neuen Layout- und Routing-Methode zu transpile() basierend auf dem Papier "Time-optimal qubit mapping". Um es zu verwenden, muss das optionale Paket Qiskit TOQM installiert werden. Der routing_method kwarg von transpile() unterstützt einen zusätzlichen Wert, 'toqm' , der verwendet wird, um Layout und Routing über TOQM zu ermöglichen.

    Um qiskit-toqm zusammen mit Terra zu installieren, führen Sie aus:

    pip install qiskit-terra[toqm]
  • Ein neues Modul qiskit.quantum_info.synthesis.qsd wurde hinzugefügt, um die Quanten-Shannon-Zerlegung auf beliebige Unitarien anzuwenden. Diese Funktionalität ersetzt den bisherigen isometriebasierten Ansatz im Standardtranspiler für die Unitary-Synthese sowie beim Hinzufügen von Unitaries zu einer Schaltung mit Hilfe einer UnitaryGate.

    Die Quanten-Shannon-Zerlegung benötigt bei der Zerlegung von unitären Matrizen mit mehr als zwei Qubits etwa halb so viele cnot-Gatter wie die isometrische Implementierung.

  • Klassen im Modul quantum_info modul, die die Skalarmultiplikation unterstützen, können nun mit einem Skalar von links oder rechts multipliziert werden. Zuvor akzeptierten sie nur skalare Multiplikatoren von links.

  • Der Transpiler-Pass LookaheadSwap (verwendet von transpile()routing_method="lookahead" ) hat einige Leistungsverbesserungen erfahren und ist nun etwa dreimal so schnell. Dies ist lediglich eine effizientere Berechnung und ändert nichts an der Komplexität des Algorithmus. In den meisten Fällen ist ein modernerer Routing-Algorithmus wie SabreSwap (routing_method="sabre") weitaus leistungsfähiger sein.

  • Es wurden neue Transpilerpässe hinzugefügt. Der Transpiler-Pass Commuting2qGateRouter verwendet Swap-Strategien, um einen Block von Pendelgattern an die Kopplungskarte zu leiten. Das Routing ist in der Tat ein schwieriges Problem, aber es ist wesentlich einfacher, wenn die Gates wie in CZ-Netzen pendeln. Auch in QAOA sind typischerweise Blöcke von Pendlerpforten zu finden. Solche Fälle können mit Hilfe von Swap-Strategien behandelt werden, die einen vordefinierten Satz von SWAP-Gates anwenden. Außerdem identifiziert der neue Transpiler-Pass FindCommutingPauliEvolutions Blöcke von Pauli-Evolutionen, die aus kommutierenden Zwei-Qubit-Termen bestehen. Hier wird eine Tauschstrategie durch die Klasse SwapStrategy festgelegt. Um die besten Ergebnisse zu erzielen, müssen die Tauschstrategien auf das Kopplungsschema und idealerweise auf die Schaltung zugeschnitten sein.

  • Einführung eines neuen Optimierers in die Qiskit-Bibliothek, der die Optimierung von Parametern von variablen Quantenalgorithmen unterstützt. Es handelt sich um den Univariaten Marginalen Verteilungsalgorithmus (UMDA), der eine besondere Form der Verteilungsschätzungsalgorithmen darstellt. Zum Beispiel:

    from qiskit.opflow import X, Z, I
    from qiskit import Aer
    from qiskit.algorithms.optimizers import UMDA
    from qiskit.algorithms import QAOA
    from qiskit.utils import QuantumInstance
    
    H2_op = (-1.052373245772859 * I ^ I) + \
            (0.39793742484318045 * I ^ Z) + \
            (-0.39793742484318045 * Z ^ I) + \
            (-0.01128010425623538 * Z ^ Z) + \
            (0.18093119978423156 * X ^ X)
    
    p = 2  # Toy example: 2 layers with 2 parameters in each layer: 4 variables
    
    opt = UMDA(maxiter=100, size_gen=20)
    backend = Aer.get_backend('statevector_simulator')
    vqe = QAOA(opt,
               quantum_instance=QuantumInstance(backend=backend),
               reps=p)
    
    result = vqe.compute_minimum_eigenvalue(operator=H2_op)
  • Der Konstruktor für den Unroll3qOrMore transpilerpass hat zwei neue optionale Schlüsselwortargumente: target und basis_gates. Mit diesen Optionen können Sie die Target bzw. die unterstützten Basis-Gates anzugeben, um das Ziel-Backend zu beschreiben. Wenn eine der Operationen in der Schaltung in target oder basis_gates enthalten ist, werden diese nicht durch den Durchlauf abgewickelt, da das Zielgerät die Operation von Haus aus unterstützt.

  • Die QPY-Serialisierung wurde aktualisiert und unterstützt nun ScheduleBlock. Jetzt können Sie das Impulsprogramm im Binärformat speichern und zu einem späteren Zeitpunkt laden:

    from qiskit import pulse, qpy
    
    with pulse.build() as schedule:
        pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0))
    
    with open('schedule.qpy', 'wb') as fd:
        qpy.dump(schedule, fd)
    
    with open('schedule.qpy', 'rb') as fd:
        new_schedule = qpy.load(fd)[0]

    Dabei wird die QPY-Schnittstelle verwendet, die für QuantumCircuit. Siehe SCHEDULE_BLOCK für Einzelheiten zur Datenstruktur.

  • Ein neuer Transpiler-Pass wurde hinzugefügt, VF2PostLayout. Dieser Durchlauf ist ein neuer Typ, der eine neue Phase/Funktion in der Kompilierungspipeline durchführt, und zwar nach dem Layout oder nach der Optimierung der Qubit-Auswahl. Die Idee hinter diesem Durchgang ist, dass wir nach Abschluss der Optimierungsschleife im Transpiler wissen, wie hoch die endgültige Gatterzahl für jedes Qubit in der Schaltung sein wird, so dass wir möglicherweise eine leistungsfähigere Untergruppe von Qubits auf einem Backend finden können, um die Schaltung auszuführen. Der Durchlauf sucht nach einem isomorphen Untergraphen im Konnektivitätsgraphen des Ziel-Backends und betrachtet die vollständige Fehlerrate der vollständigen Schaltung auf jedem gefundenen Untergraphen und gibt das gefundene Layout mit der niedrigsten Fehlerrate für die Schaltung zurück.

    Dieser Pass ist ähnlich wie der VF2Layout durchgang und beide verwenden intern die gleiche VF2 Implementierung von retworkx. Allerdings, VF2PostLayout ist jedoch so konzipiert, dass es nach dem ersten Layout, dem Routing, der Basisübersetzung und allen Optimierungsdurchläufen ausgeführt wird und nur funktioniert, wenn bereits ein Layout angewendet wurde, die Schaltung geroutet wurde und alle Gatter in der Zielbasis liegen. Dies ist erforderlich, damit die Schaltung bei einem neuen Layout weiterhin auf dem Zielgerät ausgeführt werden kann. VF2Layout hingegen ist darauf ausgelegt, ein perfektes Ausgangslayout zu finden und kann mit jeder Schaltung arbeiten.

  • Der ApplyLayout transpiler-Pass unterstützt nun die Aktualisierung eines Layouts auf einer Schaltung, nachdem ein Layout bereits einmal angewendet wurde. Wenn das Feld post_layout vorhanden ist (zusätzlich zum erforderlichen Feld layout ), wird das Feld property_set bei Ausführung des ApplyLayout pass ausgeführt wird, aktualisiert der Pass das Layout, um das neue Layout anzuwenden. Dies gibt ein DAGCircuit mit den Qubits in der neuen physikalischen Reihenfolge zurück, und der Eigenschaftssatz layout wird so aktualisiert, dass er die virtuellen Qubits aus dem ursprünglichen Layout den physikalischen Qubits im neuen Feld post_layout zuordnet.

  • Die voreingestellten Passmanager werden durch level_1_pass_manager(), level_2_pass_manager(), und level_3_pass_manager() erzeugten voreingestellten Passmanager, die optimization_level 1, 2 bzw. 3 der transpile() funktion führen nun den VF2PostLayout nach der Ausführung des Routing-Passes aus. Dadurch kann der Transpiler möglicherweise einen anderen Satz physikalischer Qubits auf dem Ziel-Backend finden, auf denen der Schaltkreis mit niedrigeren Fehlerraten läuft. Der VF2PostLayout pass wird nicht ausgeführt, wenn Sie manuell ein layout_method, routing_method oder initial_layout Argument für transpile(). Wenn der Pass eine leistungsfähigere Untergruppe von Qubits im Backend findet, um den physikalischen Schaltkreis zu betreiben, wird er das Layout des Schaltkreises anpassen, um stattdessen die alternativen Qubits zu verwenden.

  • Der Algorithmus berechnet iterativ jeden Eigenzustand, indem er mit dem Grundzustand beginnt (der wie bei VQE berechnet wird) und dann eine modifizierte Kostenfunktion optimiert, die versucht, Eigenzustände zu berechnen, die orthogonal zu den in den vorherigen Iterationen berechneten Zuständen sind und die niedrigste Energie haben, wenn sie über den Ansatz berechnet werden. Die implementierte Schnittstelle ist derjenigen von VQE sehr ähnlich und hat die Form:

    from qiskit.algorithms import VQD
    from qiskit.utils import QuantumInstance
    from qiskit.circuit.library import TwoLocal
    from qiskit.algorithms.optimizers import COBYLA
    from qiskit import BasicAer
    from qiskit.opflow import I,Z,X
    
    h2_op = (
        -1.052373245772859 * (I ^ I)
        + 0.39793742484318045 * (I ^ Z)
        - 0.39793742484318045 * (Z ^ I)
        - 0.01128010425623538 * (Z ^ Z)
        + 0.18093119978423156 * (X ^ X)
    )
    
    vqd = VQD(k =2, ansatz = TwoLocal(rotation_blocks="ry", entanglement_blocks="cz"),optimizer = COBYLA(maxiter = 0), quantum_instance = QuantumInstance(
                BasicAer.get_backend("qasm_simulator"), shots = 2048)
            )
    vqd_res = vqd.compute_eigenvalues(op)

    Dieses spezielle Codeschnipsel erzeugt 2 Eigenwerte (Grundzustand und 1. angeregter Zustand) Tests wurden ebenfalls implementiert.

Anmerkungen zu Upgrades

  • Die Pulsklassen in qiskit.pulse.library sind jetzt Unterklassen von SymbolicPulse und nicht mehr ParametricPulse. Die verfügbaren Klassen bleiben unverändert als Gaussian, GaussianSquare, Drag, und Constant. SymbolicPulse ist vollständig abwärtskompatibel, und es sollte keine Funktionseinbußen geben.

  • Der Datentyp der einzelnen Elemente in QuantumCircuit.data hat sich geändert. Früher war es ein einfaches 3-Tupel aus einem Instruction, einer Liste von Qubits, und einer Liste von Clbits, während es jetzt eine Instanz von CircuitInstruction.

    Die Attribute dieser neuen Klasse sind operation, qubits und clbits, die den Elementen des vorherigen Tupels entsprechen. Aber, qubits und clbits sind jetzt tuple Instanzen, nicht lists.

    Diese neue Klasse verhält sich genau wie das alte 3-Tupel, wenn man versucht, auf seinen Index und seine Elemente zuzugreifen oder ihn zu durchlaufen. Dazu gehört auch der Einsatz der qubits und clbits elemente in Listen. Dies dient der Abwärtskompatibilität. Ab Qiskit Terra 0.21 ist dies nicht mehr der bevorzugte Weg, um auf diese Elemente zuzugreifen. Stattdessen sollten Sie die oben beschriebene Form des Attributzugriffs verwenden.

    Dies wurde getan, um weitere Entwicklungen der QuantumCircuit datenstruktur in Terra zu ermöglichen, ohne ständig die Rückwärtskompatibilität zu verletzen. Zu den geplanten Entwicklungen gehören dynamisch parametrisierte Schaltungen und eine allgemeine Verringerung des Speicherbedarfs von tiefen Schaltungen.

  • Die Abhängigkeit python-constraint , die nur von dem CSPLayout transpiler-Pass verwendet wird, ist nicht mehr in der Anforderungsliste für das Qiskit Terra-Paket enthalten. Dies liegt daran, dass der CSPLayout pass nicht mehr standardmäßig in einem der voreingestellten Passmanager für transpile(). Der Pass ist zwar immer noch verfügbar, aber wenn Sie ihn verwenden, müssen Sie python-contraint manuell installieren, oder Sie können bei der Installation von qiskit-terra z. B. das Extra csp-layout verwenden:

    pip install "qiskit-terra[csp-layout]"
  • Die Version des QPY-Versionsformats, die von qpy.dump() ausgegeben wird, wurde auf Version 5 erhöht. Diese neue Formatversion ist inkompatibel mit den Vorgängerversionen und führt zu einem Fehler, wenn versucht wird, sie mit einem Deserialisierer zu laden, der nicht in der Lage ist, QPY Version 5 zu verarbeiten. Diese Änderung war notwendig, um die Unterstützung für die korrekte Darstellung von kontrollierten Gates und die Darstellung von nicht standardmäßigen Kontrollzuständen zu verbessern.

  • Die kompilierten Rust-Erweiterungen von Qiskit Terra haben jetzt eine minimal unterstützte Rust-Version (MSRV) von 1.56.1. Das bedeutet, dass beim Erstellen von Qiskit Terra aus dem Quellcode die älteste unterstützte Version des Rust-Compilers 1.56.1 ist. Wenn Sie eine ältere Version des Rust-Compilers verwenden, müssen Sie auf eine neuere Version aktualisieren, um Qiskit weiterhin aus dem Quellcode erstellen zu können. Diese Änderung war notwendig, da eine Reihe von Upstream-Abhängigkeiten ihre minimal unterstützten Versionen ebenfalls aktualisiert haben.

  • Die Schaltkreisplanung wird nun parallel ausgeführt, wenn mehr als ein Schaltkreis zur Verfügung gestellt wird schedule(). Siehe #2695 für weitere Einzelheiten.

  • Die zuvor veralteten Klassen BaseBackend, BaseJob und BaseProvider wurden alle entfernt. Sie wurden ursprünglich in der Version 0.18.0 veraltet. Anstelle dieser Klassen sollten Sie die Schnittstellenklassen der versionierten Anbieter verwenden, die neuesten sind BackendV2, JobV1, und ProviderV1.

  • Das zuvor veraltete backend Argument für den Konstruktor des RZXCalibrationBuilder transpilerpasses wurde entfernt. Ursprünglich war sie in der Version 0.19.0 veraltet. Stattdessen sollten Sie das Backend objekt nach instruction_schedule_map und qubit_channel_mapping abfragen und diese direkt an den Konstruktor übergeben. Zum Beispiel, mit einem BackendV1 backend:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.providers.fake_provider import FakeMumbai
    
    backend = FakeMumbai()
    inst_map = backend.defaults().instruction_schedule_map
    channel_map = backend.configuration().qubit_channel_mapping
    cal_pass = RZXCalibrationBuilder(
        instruction_schedule_map=inst_map,
        qubit_channel_mapping=channel_map,
    )

    oder mit einem BackendV2 backend:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.providers.fake_provider import FakeMumbaiV2
    
    backend = FakeMumbaiV2()
    inst_map = backend.instruction_schedule_map
    channel_map = {bit: backend.drive_channel(bit) for bit in range(backend.num_qubits)}
    cal_pass = RZXCalibrationBuilder(
        instruction_schedule_map=inst_map,
        qubit_channel_mapping=channel_map,
    )
  • Das Limit für Messschüsse für das BasicAer Backend wurde entfernt.

  • Für DAGNode wurden die zuvor veralteten type, op, qargs, cargs und wire kwargs und Attribute entfernt. Diese waren ursprünglich in der Version 0.19.0 veraltet. Auf die Kwargs und Attribute op, qargs und cargs kann nur auf Instanzen von DAGOpNode zugegriffen werden, und der Kwarg und das Attribut wire sind nur auf Instanzen von DAGInNode oder DAGOutNode.

  • Die veraltete Funktion pauli_group() wurde entfernt. Ursprünglich war sie in Qiskit Terra 0.17 veraltet.

  • Mehrere veraltete Methoden auf Pauli wurden entfernt, die ursprünglich in Qiskit Terra 0.17 veraltet waren. Diese waren:


    sgn_prod

    Verwenden Sie Pauli.compose() oder Pauli.dot() stattdessen.


    to_spmatrix

    Verwenden Sie Pauli.to_matrix() mit dem Argument sparse=True stattdessen.


    kron

    Verwenden Sie Pauli.expand()verwenden, aber beachten Sie, dass dies ein neues Objekt zurückgibt, anstatt das vorhandene zu verändern.


    update_z und update_x

    Stellen Sie die Attribute z und x des Objekts direkt ein.


    insert_paulis

    Verwenden Sie Pauli.insert().


    append_paulis

    Verwenden Sie Pauli.expand().


    delete_qubits

    Verwenden Sie Pauli.delete().


    pauli_single

    Konstruieren Sie das Etikett manuell und übergeben Sie es direkt an den Initialisierer, wie z. B.:

    Pauli("I" * index + pauli_label + "I" * (num_qubits - index - len(pauli_label)))

    random

    Verwenden Sie quantum_info.random_pauli() stattdessen.

  • Die Methode optimize wurde aus den Optimizer klassen, die durch die Methode minimize() methode als direkter Ersatz. Die einzige Ausnahme ist SPSA, wo die Verwerfungswarnung nicht ausgelöst wurde, so dass die Methode dort weiterhin beibehalten wird.

  • Result wurde so geändert, dass sie immer die Attribute date, status und header enthält (und auf None gesetzt wird, falls nicht angegeben).

  • Für Python 3.7 shared-memory38 ist jetzt eine Abhängigkeit. Dies wurde als Abhängigkeit für Python 3.7 hinzugefügt, um die Nutzung der Shared-Memory-Konstrukte in der Standardbibliothek von neueren Versionen von Python zu ermöglichen. Wenn Sie mit Python >= 3.8 arbeiten, ist keine zusätzliche Abhängigkeit erforderlich.

  • Instruction beschriftungen werden jetzt bei der Erstellung von Anweisungen auf ihre Typisierung geprüft.

  • Die QPY-Serialisierung wurde verbessert und serialisiert nun QuantumCircuit mit QuantumCircuit.calibrations. Ab QPY Version 5 können nur noch Kalibrierungseinträge vom ScheduleBlock typs serialisiert werden.

  • Die Definition von XXPlusYYGate wurde geändert. Siehe #7969 für weitere Informationen.

  • Die voreingestellten Passmanager werden durch level_1_pass_manager(), level_2_pass_manager(), und level_3_pass_manager() erzeugten und von der Funktion transpile() funktion optimization_level verwendeten Argumente 1, 2 bzw. 3 setzen kein hartes Zeitlimit mehr für den VF2Layout transpiler-Durchlauf. Das bedeutet, dass der Durchlauf nicht mehr aufhört, bis zu einem bestimmten Zeitlimit ( 100ms für Stufe 1, 10 Sekunden für Stufe 2 und 60 Sekunden für Stufe 3) nach einem besseren alternativen perfekten Layout zu suchen, da dies die Reproduzierbarkeit der Kompilierung einschränkte, wenn ein perfektes Layout verfügbar war. Das bedeutet, dass das Ergebnis bei Verwendung des Passes anders ausfallen kann als zuvor, obwohl es sich in allen Fällen nur dann ändert, wenn ein rauschärmerer Satz von Qubits als das vorherige Ergebnis gefunden werden kann. Wenn Sie das bisherige Verhalten beibehalten möchten, können Sie eine benutzerdefinierte PassManager erstellen, der das Argument time_limit im Konstruktor für den Durchgang VF2Layout setzt.

Hinweise zu veralteten Versionen

  • Der Aufruf von timeline_drawer() mit einer außerplanmäßigen Schaltung ist veraltet. Alle Schaltungen, auch solche, die nur aus Verzögerungsanweisungen bestehen, müssen mit dem Schlüsselwortargument scheduling_method von transpile() gesetzt werden, um Zeitplaninformationen zu erzeugen, die in QuantumCircuit.op_start_times.

  • Die NetworkX konverterfunktionen für DAGCircuit.to_networkx() und from_networkx() sowie die Methode DAGDependency.to_networkx() sind veraltet und werden in einer zukünftigen Version entfernt. Qiskit verwendet seit der Veröffentlichung von qiskit-terra 0.12.0 retworkx als Graphenbibliothek, und seither sind die networkx-Konverterfunktionen verlustbehaftet. Sie wurden ursprünglich hinzugefügt, damit die Benutzer Funktionen der NetworkX’s Algorithmen-Bibliothek nutzen können, die in retworkx nicht vorhanden sind. Seitdem ist retworkx gereift und bietet mehr Funktionen, und das DAGCircuit ist für seinen Betrieb eng an retworkx gekoppelt. Diese Konvertierungsmethoden bieten nur einen begrenzten Nutzen und werden daher in einer zukünftigen Version entfernt.

  • Der Zugriff auf mehrere alte Toggles (HAS_MATPLOTLIB, HAS_PDFTOCAIRO, HAS_PYLATEX und HAS_PIL) aus dem qiskit.visualization modul ist nun veraltet, und diese Importpfade werden in einer zukünftigen Version von Qiskit Terra entfernt werden. Auf die gleichen Objekte sollte stattdessen über qiskit.utils.optionalszugreifen, das Tester für fast alle optionalen Abhängigkeiten von Terra enthält.

  • Das Modul qiskit.test.mock ist jetzt veraltet. Die Fake-Backend- und Fake-Provider-Klassen, die zuvor in qiskit.test.mock verfügbar waren, sind seit Terra auch in qiskit.providers.fake_provider seit Terra 0.20.0 zugänglich. Diese Änderung stellt eine echte Verpflichtung dar, die gefälschten Backend-Klassen als Teil von Qiskit zu unterstützen, während sie zuvor nur Teil der internen Testsuite waren und den Benutzern als Nebeneffekt zugänglich gemacht wurden.

  • Die Namen der Argumente beim Aufruf einer Estimator oder Sampler objekts als Funktion werden von circuit_indices und observable_indices in circuits und observables umbenannt.

  • Die Schlüsselwortargumente qobj_id und qobj_header für die Funktion execute() funktion sind veraltet und werden in einer zukünftigen Version entfernt. Seit der Entfernung der Klasse BaseBackend haben diese Argumente keine Wirkung mehr, da kein Backend die direkte Ausführung mit einem Qobj Objekt unterstützt und stattdessen nur noch mit QuantumCircuit objekten direkt arbeiten.

  • Die Argumente x, z und label für den Initialisierer von Pauli wurden in Qiskit Terra 0.17 als veraltet dokumentiert, aber ein Fehler verhinderte, dass die erwartete Warnung zur Laufzeit angezeigt wurde. Die Warnung wird nun korrekt angezeigt, und die Argumente werden in Qiskit Terra 0.23 oder später entfernt. Ein Paar aus x und z sollte an der richtigen Stelle als ein einziges Tupel übergeben werden (Pauli((z, x))). Eine Zeichenkette label sollte an der Position des ersten Arguments übergeben werden (Pauli("XYZ")).

  • Die Methode SPSA.optimize() methode ist veraltet und wird ersetzt durch SPSA.minimize()veraltet, die als direkter Ersatz verwendet werden kann. Beachten Sie, dass diese Methode ein vollständiges Ergebnisobjekt zurückgibt, das mehr Informationen als zuvor enthält.

  • Das Argument circuits von qpy.dump() ist veraltet und wurde durch programs ersetzt, da QPY nun mehrere andere Datentypen als Schaltkreise unterstützt.

  • AlignmentKind.to_dict() methode ist veraltet und wird entfernt.

Fehlerkorrekturen

  • Eine zusätzliche Validierung wurde zu DiagonalGate hinzugefügt, um zu prüfen, ob das Argument den Modulus eins hat.

  • Doppelte Qubit-Indizes, die an SparsePauliOp.from_sparse_list() angegebene doppelte Qubit-Indizes führen nun zu einer Fehlermeldung, anstatt die vorherigen Werte stillschweigend zu überschreiben. Auf das alte Verhalten kann durch Übergabe des neuen Schlüsselwortarguments do_checks=False zugegriffen werden.

  • Die timeline_drawer() visualisierung wird die klassischen Registerplätze nicht mehr falsch ausrichten.

  • Die Parametervalidierung für GaussianSquare ist jetzt vor und nach der Konstruktion konsistent. Siehe #7882 für weitere Einzelheiten.

  • Die BackendV2-basierten Fake-Backends im qiskit.providers.fake_provider modul, wie z.B FakeMontrealV2unterstützen nun die Delay operation in ihren target attributen. Zuvor, QuantumCircuit objekte, die Verzögerungen enthielten, konnten nicht in diese Backends kompiliert werden.

  • Ein Fehler in TridiagonalToeplitz.eigs_bounds() wurde behoben, der dazu führte, dass in einigen Fällen mit negativen Eigenwerten falsche Eigenwertgrenzen zurückgegeben wurden. Siehe #7939 für weitere Einzelheiten.

  • Ein Fehler wurde behoben, bei dem die Schublade LaTeX statevector den Parameter max_size ignorierte.

  • Feste Unterstützung in der PassManagerConfig.from_backend() konstruktor-Methode für den Aufbau eines PassManagerConfig objekts aus einer BackendV2 instanz. Zuvor wurde dies nicht korrekt gehandhabt und schlug fehl, wenn es mit einem BackendV2 objekt.

  • Reparierte Unterstützung für QPY-Serialisierung (qpy.dump()) und Deserialisierung (qpy.load()) eines QuantumCircuit objekts, das benutzerdefinierte ControlledGate objekte enthält. Zuvor wurde eine Ausnahme ausgelöst durch qpy.load() ausgelöst, wenn versucht wurde, die benutzerdefinierte ControlledGate. Behoben #7999.

  • Reparierte Unterstützung für QPY-Serialisierung (qpy.dump()) und Deserialisierung (qpy.load()) eines QuantumCircuit objekts, das benutzerdefinierte MCPhaseGate objekte enthält. Zuvor wurde eine Ausnahme ausgelöst durch qpy.load() ausgelöst, wenn versucht wurde, die MCPhaseGate.

  • Reparierte Unterstützung für QPY-Serialisierung (qpy.dump()) und Deserialisierung (qpy.load()) eines QuantumCircuit objekts, das kontrollierte Gatter mit einem offenen Kontrollzustand enthält. Zuvor ging der offene Steuerzustand durch den Serialisierungsprozess und die rekonstruierte Schaltung verloren.

  • Feststehend QuantumCircuit.reverse_bits() mit Schaltungen, die registerlose Qubit und Clbit. Zum Beispiel funktioniert jetzt Folgendes:

    from qiskit.circuit import QuantumCircuit, Qubit, Clbit
    
    qc = QuantumCircuit([Qubit(), Clbit()])
    qc.h(0).c_if(qc.clbits[0], 0)
    qc.reverse_bits()
  • Das Attribut ConfigurableFakeBackend.t2 wurde korrigiert, das zuvor fälschlicherweise auf der Grundlage des angegebenen t1 Wertes gesetzt wurde.

  • Ein Problem mit BackendV2-basierend auf gefälschten Backend-Klassen aus dem qiskit.providers.fake_provider modul wie z.B FakeMontrealV2 wo der Wert für das dt attribut (und das Target.dt attribut) nicht korrekt in Sekunden umgewandelt wurden. Dies würde zu Problemen bei der Verwendung dieser gefälschten Backends mit der Zeitplanung führen.

  • Es wurde ein Fehler in plot_histogram() wenn das Argument number_to_keep kleiner war als die Anzahl der Schlüssel. Der folgende Code löst keine Fehler mehr aus und ist korrekt ausgerichtet:

    from qiskit.visualization import plot_histogram
    data = {'00': 3, '01': 5, '11': 8, '10': 11}
    plot_histogram(data, number_to_keep=2)
  • Verbesserte Leistung beim Erstellen und Arbeiten mit parametrisierten QuantumCircuit instanzen mit vielen Gates, die eine relativ geringe Anzahl von Parametern gemeinsam haben.

  • Der OpenQASM 3 Exporter (qiskit.qasm3) versucht nicht mehr, Definitionen für nicht standardisierte Gatter in der Option basis_gates zu erstellen.

  • Der Getter von OptimizerResult.nitkorrigiert, der bisher die Anzahl der Jacobi-Auswertungen statt der Anzahl der Iterationen zurückgab.

  • Es wurde ein Fehler in der String-Darstellung von Result objekten behoben, der dazu führte, dass die Attribute nicht korrekt angegeben wurden.

  • Ein Problem wurde behoben mit transpile() wo in einigen Fällen die Übergabe einer Liste von Basisgatterzeichenketten mit dem Schlüsselwortargument basis_gates oder implizit über eine Target eingabe über das Schlüsselwortargument target nicht korrekt interpretiert wurde und dazu führte, dass eine Teilmenge der aufgelisteten Gatter für jede Schaltung verwendet wurde.

  • Es wurde ein Problem im UnitarySynthesis transpilerdurchgang, der zu einem Fehler führte, wenn ein Target das keine Qubit-Einschränkungen für die Operationen hatte (z.B. im Falle eines idealen Simulator-Targets), mit dem target Schlüsselwort-Argument für den Konstruktor angegeben wurde.

  • Die Methode qiskit.result.marginal_counts()würde bei der Übergabe eines Result von einem Puls-Backend übergeben wird, würde fehlschlagen, weil sie ein Array von ExperimentResult Objekten enthält, von denen jedes ein QobjExperimentHeader hat, und diesen ExperimentHeaders fehlen creg_sizes Instanzvariablen. Wenn die Result von einem Simulator-Backend (z.B. Aer) käme, wäre diese Instanz-Variable dort zu finden. Wir korrigieren marginal_counts so, dass die Logik, die creg_sizes benötigt, übersprungen wird, wenn das Feld nicht vorhanden oder nicht Null ist.

  • Der OpenQASM 2-Exporter (QuantumCircuit.qasm()) definiert nun korrekt die Qubit-Parameter für UnitaryGate operationen, die nicht alle Qubits betreffen, für die sie definiert sind. Behoben #8224.

  • Es wurde ein Problem mit der Reproduzierbarkeit der transpile() funktion bei der Ausführung mit optimization_level 1, 2 und 3. Wenn mehrere perfekte Layouts (ein Layout, das keine SWAP-Gatter benötigt) zur Verfügung standen, konnte es vorkommen, dass das gewählte Layout und die Ausgangsschaltung variierten, unabhängig davon, ob das Argument seed_transpiler gesetzt war.

Aer- 0.10.4

Keine Änderung

IBM Q Anbieter 0.19.2

Fehlerkorrekturen

  • In der kommenden terra-Version wird es einen Release Candidate geben, der vor der endgültigen Version markiert wird. Das Ändern des Versionsstrings für das Paket wird jedoch im Moment vom qiskit-ibmq-provider blockiert, da er versucht, die Version zu analysieren und annimmt, dass es kein Prelease-Suffix im Versionsstring gibt (siehe #8200 für die Details). PR #1135 korrigiert diese Versionsanalyse, um die Regex aus dem pypa/packaging Projekt zu verwenden, die alle PEP440 Paketversionen mit Suffixen aus der Vorveröffentlichung behandelt. Dies ermöglicht es terra, ein 0.21.0rc1 Tag zu veröffentlichen, ohne den qiskit-ibmq-provider zu zerstören.
  • threading.currentThread und notifyAll wurden in Python 3.10 (Oktober 2021) veraltet und werden in Python 3.12 (Oktober 2023) entfernt. PR #1133 ersetzt sie durch threading.current_thread, notify_all hinzugefügt in Python 2.6 (Oktober 2008).
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.