Skip to main content
IBM Quantum Platform

Qiskit 0.33 Versionshinweise


0.33.1

Terra- 0.19.1

Vorspiel

Qiskit Terra 0.19.1 ist ein Bugfix-Release, das einige Probleme in 0.19.0 behebt, die mit dem Control-Flow-Builder-Interface konstruierte Schaltkreise, bedingte Gatter und die QPY-Serialisierung von neueren Terra-Objekten betreffen.

Hinweise zu veralteten Versionen

  • Die losen Funktionen qiskit.circuit.measure.measure() und qiskit.circuit.reset.reset() sind veraltet und werden in einer zukünftigen Version entfernt. Stattdessen sollten Sie auf diese als Methoden auf QuantumCircuit:

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(1, 1)
    
    # Replace this deprecated form ...
    from qiskit.circuit.measure import measure
    measure(circuit, 0, 0)
    
    # ... with either of the next two lines:
    circuit.measure(0, 0)
    QuantumCircuit.measure(circuit, 0, 0)

Fehlerkorrekturen

  • Ein Fehler in den Schaltkreisumwandlungsfunktionen wurde behoben circuit_to_gate() und circuit_to_instruction() (und den zugehörigen Schaltungsmethoden QuantumCircuit.to_gate() und QuantumCircuit.to_instruction()), wenn sie auf eine Schaltung mit registerlosen Bits oder Bits in mehr als einem Register wirken. Früher wurde die Anzahl der Bits, die für das erstellte Gatter oder die Anweisung erforderlich waren, falsch berechnet, was häufig zu einer Ausnahme während der Konvertierung führte.

  • Ein Problem wurde behoben, bei dem der Aufruf von QuantumCircuit.copy() in den "body"-Schaltungen einer Kontrollflussoperation, die mit der Builder-Schnittstelle erstellt wurde, einen Fehler auslöste. Zum Beispiel war dies früher ein Fehler, aber jetzt wird es erfolgreich zurückgegeben:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(4)
    creg = ClassicalRegister(1)
    circ = QuantumCircuit(qreg, creg)
    
    with circ.if_test((creg, 0)):
        circ.h(0)
    
    if_else_instruction, _, _ = circ.data[0]
    true_body = if_else_instruction.params[0]
    true_body.copy()
  • Die Schnittstelle des Control-Flow-Builders unterstützt jetzt die Verwendung von ClassicalRegisters als Bedingungen in verschachtelten Kontrollablaufbereichen. Früher führte dies zwar nicht sofort zu einem Fehler, aber die internen Schaltkreisblöcke hatten nicht die richtigen Register definiert, so dass spätere Logik, die mit den inneren Blöcken arbeitete, fehlschlug.

    Früher schlugen die Schubladen beispielsweise fehl, wenn sie versuchten, einen inneren Block zu zeichnen, der durch ein klassisches Register bedingt war, während dies jetzt gelingt, wie in diesem Beispiel:

    from qiskit import QuantumCircuit
    from qiskit.circuit import QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(4)
    creg = ClassicalRegister(1)
    circ = QuantumCircuit(qreg, creg)
    
    with circ.for_loop(range(10)) as a:
        circ.ry(a, 0)
        with circ.if_test((creg, 1)):
            circ.break_loop()
    
    print(circ.draw(cregbundle=False))
    print(circ.data[0][0].blocks[0].draw(cregbundle=False))
  • Behoben qpy_serialization Unterstützung für die Serialisierung QuantumCircuit objekten, die ParameterVector oder ParameterVectorElement als Parameter verwenden. Zuvor wurde ein ParameterVectorElement Parameter einfach als Parameter für die QPY-Serialisierung behandelt, was bedeutete, dass der ParameterVector kontext in QPY verloren ging und die Reihenfolge der Ausgabe von parameters falsch sein konnte.

    Um dieses Problem zu beheben, war eine neue Version des QPY-Formats, Version 3, erforderlich. Diese neue Formatversion enthält eine Darstellung der Klasse ParameterVectorElement , die in der Dokumentation qpy_serialization unter PARAMETER_VECTOR_ELEMENT beschrieben ist.

  • Die qpy_serialization Unterstützung für die Serialisierung eines PauliEvolutionGate objekts. Zuvor wurde das PauliEvolutionGate als benutzerdefiniertes Gatter für die Serialisierung behandelt und würde als ein Gate objekt deserialisiert, das die gleiche Definition und den gleichen Namen wie das Original hatte PauliEvolutionGate. Dadurch würde jedoch der ursprüngliche Zustand der PauliEvolutionGate. Dies wurde behoben, so dass ab dieser Version ein PauliEvolutionGate in der Schaltung nun 1:1 über die QPY-Serialisierung hinweg beibehalten wird. Die einzige Einschränkung dabei ist, dass keine benutzerdefinierten EvolutionSynthesis klassen unterstützt. Nur die verfügbaren Klassen von qiskit.synthesis können mit einer PauliEvolutionGate für die qpy-Serialisierung verwendet werden.

    Um dieses Problem zu beheben, war eine neue Version des QPY-Formats, Version 3, erforderlich. Diese neue Formatversion enthält eine Darstellung der PauliEvolutionGate klasse, die in der Dokumentation qpy_serialization unter PAULI_EVOLUTION beschrieben ist.

  • Zwei lose Funktionen qiskit.circuit.measure.measure() und qiskit.circuit.reset.reset() wurden versehentlich entfernt, ohne dass eine Verfallsfrist angegeben wurde. Sie wurden wieder eingeführt, sind aber als veraltet gekennzeichnet und werden durch die Methoden QuantumCircuit.measure() und QuantumCircuit.reset()gekennzeichnet und werden in einer zukünftigen Version entfernt.

Sonstige Anmerkungen

  • Die neue Control-Flow-Builder-Schnittstelle verwendet verschiedene Kontextmanager und Hilfsobjekte, um ihre Arbeit zu erledigen. Diese sollten nicht als Teil der öffentlichen API betrachtet werden und können ohne Vorwarnung geändert und entfernt werden. Die Verwendung der Builder-Schnittstelle bietet Stabilitätsgarantien in dem Sinne, dass das Verhalten, das durch QuantumCircuit.for_loop(), while_loop() und if_test() für die Builder-Schnittstelle beschriebene Verhalten den Standardverfallspolicen unterliegt, die eigentlichen Objekte, die dazu verwendet werden, jedoch nicht. Sie sollten sich nicht darauf verlassen, dass die Objekte (z. B. IfContext oder ControlFlowBuilderBlock) an ihren aktuellen Positionen vorhanden sind oder dass ihnen Methoden oder Attribute zugeordnet sind.

    Dies war zuvor in der Pressemitteilung 0.19.0 nicht klar. Alle derartigen Objekte haben jetzt eine Warnung in ihren Dokumentationsstrings, die dies deutlich macht. Es ist wahrscheinlich, dass sich ihre Standorte und Unterstützungsmaßnahmen in Zukunft stark unterscheiden werden.

Aer- 0.9.1

Keine Änderung

Ignis- 0.7.0

Keine Änderung

IBM Q Anbieter 0.18.2

Fehlerkorrekturen

  • In #1065 wurde ein Problem behoben, bei dem der Job abstürzte, wenn Parameter in den Metadaten des Stromkreises übergeben wurde.
  • Fix geliefert in #1094 für das Problem, dass qiskit.providers.ibmq.runtime.RuntimeEncoder ein zusätzliches decompose() ausführt, wenn die zu serialisierende Schaltung eine BlueprintCircuit ist.

0.33.0

Diese Version markiert offiziell das Ende der Unterstützung für das Qiskit Aqua Projekt in Qiskit. Ursprünglich war es in der Version 0.25.0 veraltet, und wie in dieser Version dokumentiert wurde, wurde das Paket qiskit-aqua aus dem Qiskit-Metapaket entfernt, was bedeutet, dass pip install qiskit nicht mehr qiskit-aqua enthalten wird. Aufgrund von Einschränkungen bei der Paketierung von Python können wir jedoch eine bereits vorhandene Installation von qiskit-aqua nicht automatisch entfernen, wenn wir eine frühere Version von Qiskit mit pip install -U qiskit auf diese Version (oder eine zukünftige Version) aktualisieren. Wenn Sie von einer früheren Version aufrüsten, wird empfohlen, Qiskit Aqua mit pip uninstall qiskit-aqua manuell zu deinstallieren oder in einer neuen Python-Umgebung zu installieren.

Die Anwendungsmodule, die von qiskit-aqua bereitgestellt wurden, wurden in mehrere neue Pakete aufgeteilt: qiskit-optimization, qiskit-nature, qiskit-machine-learning, und qiskit-finance. Diese Pakete können selbst installiert werden (über den Standardbefehl pip install, z. B. pip install qiskit-nature) oder mit dem Rest des Qiskit-Metapakets als optionale Extras (z. B. pip install 'qiskit[finance,optimization]' oder pip install 'qiskit[all]'). Die Kernalgorithmen und der Operator Flow sind jetzt als Teil von Qiskit Terra unter qiskit.algorithms und qiskit.opflow verfügbar. Abhängig von Ihrer bisherigen Nutzung von Aqua sollten Sie entweder die Anwendungspakete oder die neuen Module in Qiskit Terra verwenden. Weitere Einzelheiten zur Migration von Qiskit Aqua finden Sie in der Aqua-Migrationsanleitung.

Mit dieser Version wird auch das Qiskit Ignis-Projekt offiziell abgeschafft. Dementsprechend wird in einer zukünftigen Version das Paket qiskit-ignis aus dem Qiskit-Metapaket entfernt werden, was bedeutet, dass in dieser zukünftigen Version pip install qiskit nicht mehr qiskit-ignis enthalten sein wird. Qiskit Ignis wurde von dem Projekt Qiskit Experiments abgelöst und die aktive Entwicklung wurde eingestellt. Kritische Fehler- und Kompatibilitätskorrekturen werden weiterhin durchgeführt, um den Nutzern die Möglichkeit zu geben, von Ignis zu migrieren, auch wenn es veraltet ist. Nach Ablauf der Abschreibungsfrist (die nicht kürzer als 3 Monate nach dieser Veröffentlichung sein wird) wird das Projekt eingestellt und archiviert. Einzelheiten zum Wechsel von Qiskit Ignis zu Qiskit Experiments finden Sie in der Migrationsanleitung.

Terra- 0.19.0

Vorspiel

Die Highlights der Qiskit Terra 0.19 Version sind:

  • Eine neue Version der abstrakten Qiskit/Hardware-Schnittstelle in Form von BackendV2, die mit einer neuen Datenstruktur Target ausgestattet ist, die es Backends ermöglicht, ihre Constraints für den Transpiler besser zu modellieren.
  • Eine erweiterbare Plugin-Schnittstelle zum UnitarySynthesis transpilerpass, die es Benutzern oder anderen Paketen ermöglicht, die Syntheseroutinen von Qiskit Terra um neue Methoden zu erweitern.
  • Kontrollflussanweisungen, zur Darstellung von for und while Schleifen und if/else Anweisungen in QuantumCircuit. Die Simulatoren in Qiskit Aer werden bald in der Lage sein, mit diesen neuen Befehlen zu arbeiten, so dass Sie dynamischere Quantenprogramme schreiben können.
  • Vorläufige Unterstützung für die sich entwickelnde Spezifikation OpenQASM 3. Sie können das neue qiskit.qasm3 modul verwenden, um Ihre QuantumCircuits in OpenQASM 3 zu serialisieren, einschließlich der neuen Kontrollflusskonstrukte.

Mit dieser Version endet die Unterstützung für Python 3.6 in Qiskit. Diese Version von Qiskit Terra und alle nachfolgenden Bugfix-Versionen der 0.19.x Serie werden die letzte sein, die mit Python 3.6 funktioniert. Ab dem nächsten Minor-Release ( 0.20.0 ) von Qiskit Terra wird die minimal erforderliche Version Python 3.7 sein.

Wie immer gibt es auch in dieser Version viele weitere Funktionen und Fehlerbehebungen, die Sie weiter unten nachlesen können.

Neue Funktionen

  • QuantumCircuit.decompose() und der entsprechende Transpiler-Pass Decompose akzeptieren nun optional einen Parameter, der eine Sammlung von Gatternamen enthält. Wenn dieser Parameter angegeben wird, werden nur Gatter mit übereinstimmenden Namen zerlegt. Dies unterstützt Unix-Shell-ähnliche Wildcard-Matches. Zum Beispiel:

    qc.decompose(["h", "r[xz]"])

    zerlegt alle h, rx oder rz Gatter, lässt aber (z. B.) x Gatter unangetastet.

  • Das Argument termination_checker wurde dem SPSA optimierer hinzugefügt. Dies ermöglicht dem Benutzer, ein benutzerdefiniertes Abbruchkriterium zu implementieren.

    import numpy as np
    from qiskit.algorithms.optimizers import SPSA
    
    def objective(x):
        return np.linalg.norm(x) + .04*np.random.rand(1)
    
    class TerminationChecker:
    
        def __init__(self, N : int):
            """
            Callback to terminate optimization when the average decrease over
            the last N data points is smaller than the specified tolerance.
            """
            self.N = N
            self.values = []
    
        def __call__(self, nfev, parameters, value, stepsize, accepted) -> bool:
            """
            Returns:
                True if the optimization loop should be terminated.
            """
            self.values.append(value)
    
            if len(self.values) > self.N:
                last_values = self.values[-self.N:]
                pp = np.polyfit(range(self.N), last_values, 1)
                slope = pp[0] / self.N
    
                if slope > 0:
                    return True
            return False
    
    maxiter = 400
    spsa = SPSA(maxiter=maxiter, termination_checker=TerminationChecker(10))
    parameters, value, niter = spsa.optimize(2, objective, initial_point=np.array([0.5, 0.5]))
  • Hinzufügen einer neuen Version der Backend schnittstelle, BackendV2. Diese neue Version ist eine große Veränderung gegenüber der Vorgängerversion, BackendV1 und ändert sowohl das Benutzerzugriffsmuster für die Eigenschaften des Backends (wie die Anzahl der Qubits usw.) als auch die Art und Weise, wie das Backend seine Beschränkungen dem Transpiler mitteilt. Die Ausführung von Schaltungen (über die run() methode) bleibt unverändert. Mit einem BackendV2 backend anstelle eines separaten configuration(), properties(), und defaults() Methoden, die die BackendConfiguration, BackendProperties, und PulseDefaults objekte konstruieren, wie in der BackendV1 schnittstelle, sind die in diesen Ausgabeobjekten enthaltenen Attribute direkt als Attribute des BackendV2 objekts. Um zum Beispiel die Anzahl der Qubits für ein Backend mit BackendV1 zu erhalten, würden Sie dies tun:

    num_qubits = backend.configuration().n_qubits

    während bei BackendV2 es ist:

    num_qubits = backend.num_qubits

    Die andere Änderung ist, dass die Anzahl der Attribute, die in der abstrakten BackendV2 klasse eine hardware- und herstellerunabhängige Menge an erforderlichen oder optionalen Feldern enthält, die der Rest von Qiskit heute mit jedem Backend verwenden kann. Unterklassen der abstrakten BackendV2 klasse können Unterstützung für zusätzliche Attribute und Methoden hinzufügen, die über die in BackendV2definiert sind, hinzufügen, aber diese werden nicht durchgängig in Qiskit unterstützt.

    Die andere kritische Änderung, die vor allem für Autoren von Anbietern wichtig ist, ist die Art und Weise, wie ein BackendV2 die Eigenschaften eines bestimmten Backends an den Transpiler weitergibt. Mit BackendV2 erfolgt dies über ein Target objekt. Die Target, das über das Attribut target attribut angezeigt wird, wird verwendet, um den Satz von Einschränkungen für die Ausführung von Schaltkreisen auf einem bestimmten Backend darzustellen. Sie enthält die Teilmenge der Informationen, die zuvor von der BackendConfiguration, BackendProperties, und PulseDefaults veröffentlichten Informationen, die der Transpiler aktiv nutzen kann. Bei der Migration eines Anbieters zur Verwendung von BackendV2 (oder bei der Erstellung eines neuen Anbieterpakets) geht es bei der Konstruktion von Backend-Objekten hauptsächlich um die Erstellung eines Target objekts für das Backend.

  • Hinzufügen einer neuen Target klasse zu dem transpiler modul hinzugefügt. Die Target klasse soll dem Compiler die Beschränkungen des Backends darstellen. Die Target klasse ist für die Verwendung mit einem BackendV2 backend verwendet werden und ist die Art und Weise, wie Backends in Zukunft ihre Einschränkungen für den Transpiler modellieren werden. Sie fasst die bisher getrennten Felder, die zur Steuerung des transpile() zielgeräts (z. B. basis_gates, coupling_map, instruction_durations, usw.) in einer einzigen Datenstruktur. Außerdem werden zusätzliche Funktionen zu den bisher verfügbaren hinzugefügt, z. B. die Darstellung heterogener Gattersätze, Multi-Qubit-Gatterkonnektivität und abgestimmte Varianten derselben Gatter. Zurzeit berücksichtigt der Transpiler noch nicht alle diese Einschränkungen, aber mit der Zeit wird er die zusätzlichen Funktionen nutzen.

  • Die Options klasse hat jetzt optionale Unterstützung für die Angabe von Validatoren. Dies ermöglicht Backend autoren die Möglichkeit, optional eine grundlegende Validierung der vom Benutzer eingegebenen Werte für Felder im Options objekt. Wenn Sie zum Beispiel ein Options objekt mit definiert:

    from qiskit.providers.Options
    options = Options(shots=1024)

    können Sie einen Validator für Schüsse einstellen, der zwischen 1 und 4096 liegt:

    options.set_validator('shots', (1, 4096))

    Wenn der Validator gesetzt ist, wird bei jedem Aufruf der update_options() methode, wenn shots aktualisiert wird, dass der vorgeschlagene neue Wert innerhalb des gültigen Bereichs liegt.

  • Ein neuer Transpiler-Analysedurchgang wurde hinzugefügt, ContainsInstructionzu dem qiskit.transpiler.passes modul. Dieser Durchlauf wird verwendet, um festzustellen, ob eine Schaltung eine bestimmte Anweisung enthält. Sie nimmt bei der Initialisierung einen einzigen Parameter auf, den Namen der Anweisung, auf die geprüft werden soll, und setzt einen Booleschen Wert im Eigenschaftssatz, ob die Schaltung diese Anweisung enthält oder nicht. Zum Beispiel:

    from qiskit.transpiler.passes import ContainsInstruction
    from qiskit.circuit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    
    property_set = {}
    # Contains Hadamard
    contains_h = ContainsInstruction("h")
    contains_h(circuit, property_set)
    assert property_set["contains_h"] == True
    # Not contains SX
    contains_sx = ContainsInstruction("sx")
    contains_sx(circuit, property_set)
    assert property_set["contains_sx"] == False
  • Hinzufügen einer Hilfsfunktion qiskit.utils.detach_prefix() hinzugefügt, die ein Gegenstück zu apply_prefix(). Die neue Funktion gibt ein Tupel aus skaliertem Wert und Präfix aus einem gegebenen Float-Wert zurück. Zum Beispiel wird ein Wert 1.3e8 in (130, "M") umgewandelt, der verwendet werden kann, um einen Wert im benutzerfreundlichen Format, wie 130 MHz, anzuzeigen.

  • Die Werte "gate_error" und "balanced" sind jetzt für die Option objective bei der Konstruktion des Objekts BIPMapping verfügbar, und "balanced" ist jetzt der Standardwert.

    Das Ziel "gate_error" erfordert die Übergabe einer BackendProperties instanz im backend_prop kwarg, die die 2q-gate Gatterfehler enthält, die bei der Berechnung der Ziele verwendet werden. Das Ziel "balanced" verwendet die BackendProperties instanz, wenn sie gegeben ist, aber ansonsten wird eine CX-Fehlerquote angenommen, wie sie im neuen Parameter default_cx_error_rate angegeben ist. Die relative Gewichtung der Gate-Fehler- und Tiefenkomponenten des ausgewogenen Ziels kann mit dem neuen Parameter depth_obj_weight gesteuert werden.

  • Jedes Attribut der Klasse VQE klasse, das bei der Initialisierung gesetzt wird, ist nun über Getter und Setter zugänglich. Außerdem können die Standardwerte der VQE-Attribute ansatz und optimizer zurückgesetzt werden, indem ihnen None zugewiesen wird:

    vqe = VQE(my_ansatz, my_optimizer)
    vqe.ansatz = None   # reset to default: RealAmplitudes ansatz
    vqe.optimizer = None  # reset to default: SLSQP optimizer
  • Hinzufügen einer neuen Methode PauliList.group_qubit_wise_commuting() die a partitioniert PauliList in Mengen von gegenseitig qubit-weise kommutierenden Pauli operatoren unterteilt. Zum Beispiel:

    from qiskit.quantum_info import PauliList, Pauli
    pauli_list = PauliList([Pauli("IY"), Pauli("XX"), Pauli("YY"), Pauli("YX")])
    pauli_list.group_qubit_wise_commuting()
  • Hinzufügen einer neuen Kopplungskarten-Konstruktormethode CouplingMap.from_hexagonal_lattice() für die Konstruktion einer hexagonalen Gitterkopplungskarte. Zum Beispiel, um eine 2x2 hexagonale Gitterkopplungskarte zu konstruieren:

    from qiskit.transpiler import CouplingMap
    cmap = CouplingMap.from_hexagonal_lattice(2, 2)
    cmap.draw()
  • Neue Fake-Backend-Klassen sind unter qiskit.test.mock verfügbar. Dazu gehören nachgebildete Versionen von ibmq_brooklyn, ibmq_manila, ibmq_jakarta und ibmq_lagos. Wie bei den anderen Fake-Backends enthalten diese Schnappschüsse von Kalibrierungsdaten (d. h. backend.defaults()) und Fehlerdaten (d.h. backend.properties()) die dem realen System entnommen sind und für lokale Tests, Kompilierung und Simulation verwendet werden können.

  • Hinzufügen der OperatorBase.is_hermitian() methode hinzugefügt, um zu prüfen, ob der Operator hermitisch ist oder nicht. NumPyEigensolver und NumPyMinimumEigensolvereigh oder eigsh verwenden, um das Eigenwertproblem zu lösen, wenn der Operator hermitisch ist.

  • Eine neue Konstruktormethode hinzugefügt PassManagerConfig.from_backend(). Es konstruiert ein PassManagerConfig objekt mit Benutzeroptionen und der Konfiguration eines Backends. Mit dieser Funktion kann ein voreingestellter Passmanager einfacher erstellt werden. Zum Beispiel:

    from qiskit.transpiler.passmanager_config import PassManagerConfig
    from qiskit.transpiler.preset_passmanagers import level_1_pass_manager
    from qiskit.test.mock import FakeMelbourne
    
    pass_manager = level_1_pass_manager(
      PassManagerConfig.from_backend(FakeMelbourne(), seed_transpiler=42)
    )
  • Ein neuer Transpiler-Pass, PulseGateswurde hinzugefügt, der automatisch benutzerdefinierte Kalibrierungen aus der Anweisungsübersicht extrahiert und den Gatterplan an die gegebene (transpilierte) Quantenschaltung als Impulsgatter anfügt.

    Der PulseGates transpiler-Pass wird auf alle Optimierungsstufen von 0 bis 3 angewendet. Es wird keine Gate-Implementierung aktualisiert, es sei denn, der Endnutzer setzt die backend.defaults().instruction_schedule_map ausdrücklich außer Kraft. Dieser Durchgang erspart dem Benutzer den individuellen Aufruf QuantumCircuit.add_calibration() für jeden Schaltkreis, der auf der Hardware läuft.

    Um diesen neuen Pass zu ergänzen, wurde ein Zeitplan zu InstructionScheduleMap und wird implizit mit einem Metadatenfeld "publisher" aktualisiert. Backend-kalibrierte Gatterpläne haben eine spezielle Verlegerart, um zu vermeiden, dass Schaltkreise mit Kalibrierungen von bereits bekannten Plänen überlagert werden. Normalerweise brauchen sich die Endnutzer nicht um diese Metadaten zu kümmern, da sie automatisch angewendet werden. Sie können InstructionScheduleMap.has_custom_gate() aufrufen, um zu prüfen, ob die Karte über eine benutzerdefinierte Gate-Kalibrierung verfügt.

    Im folgenden Code-Beispiel erfahren Sie, wie Sie die benutzerdefinierte Gatter-Implementierung für alle ausgeführten Schaltungen anwenden können.

    from qiskit.test.mock import FakeGuadalupe
    from qiskit import pulse, circuit, transpile
    
    backend = FakeGuadalupe()
    
    with pulse.build(backend, name="x") as x_q0:
        pulse.play(pulse.Constant(160, 0.1), pulse.drive_channel(0))
    
    backend.defaults().instruction_schedule_map.add("x", (0,), x_q0)
    
    circs = []
    for _ in range(100):
        circ = circuit.QuantumCircuit(1)
        circ.sx(0)
        circ.rz(1.57, 0)
        circ.x(0)
        circ.measure_active()
        circs.append(circ)
    
    circs = transpile(circs, backend)
    circs[0].calibrations  # This returns calibration only for x gate

    Beachten Sie, dass die Befehlsplan-Map ein veränderbares Objekt ist. Wenn Sie einen der Einträge überschreiben und dieses Backend für andere Experimente verwenden, kann es sein, dass Sie versehentlich die Gate-Definition aktualisieren.

    backend = FakeGuadalupe()
    
    instmap = backend.defaults().instruction_schedule_map
    instmap.add("x", (0, ), my_x_gate_schedule)
    
    qc = QuantumCircuit(1, 1)
    qc.x(0)
    qc.measure(0, 0)
    
    qc = transpile(qc, backend)  # This backend uses custom X gate

    Wenn Sie die Gatterdefinitionen eines bestimmten Experiments aktualisieren möchten, müssen Sie zunächst die Befehlsplan-Map tiefkopieren und sie direkt an den Transpiler übergeben.

  • Es wurde eine neue Option qubit_subset in den Konstruktor von BIPMapping aufgenommen. Die Option ermöglicht es uns, die zu verwendenden physikalischen Qubits (in coupling_map des Geräts) während des Mappings in einer Zeile anzugeben:

    mapped_circ = BIPMapping(
        coupling_map=CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]),
        qubit_subset=[1, 3, 4]
    )(circ)

    Um dasselbe zu tun, mussten wir bisher eine reduzierte coupling_map bereitstellen, die nur die zu verwendenden Qubits enthält, die resultierende Schaltung in die ursprüngliche coupling_map einbetten und die QuantumCircuit._layout entsprechend aktualisieren:

    reduced_coupling = coupling_map.reduce(qubit_to_use)
    mapped = BIPMapping(reduced_coupling)(circ)
    # skip the definition of fill_with_ancilla()
    # recover circuit on original coupling map
    layout = Layout({q: qubit_to_use[i] for i, q in enumerate(mapped.qubits)})
    for reg in mapped.qregs:
        layout.add_register(reg)
    property_set = {"layout": fill_with_ancilla(layout)}
    recovered = ApplyLayout()(mapped, property_set)
    # recover layout
    overall_layout = Layout({v: qubit_to_use[q] for v, q in mapped._layout.get_virtual_bits().items()})
    for reg in mapped.qregs:
        overall_layout.add_register(reg)
    recovered._layout = fill_with_ancilla(overall_layout)
  • Die Argumente ignore_pauli_phase und copy wurden dem Konstruktor von SparsePauliOp. ignore_pauli_phase verhindert, dass das Attribut phase einer Eingabe PauliList vom Lesen abgehalten wird, was performanter ist, wenn die PauliList bereits bekannt ist, dass alle Phasen in der internen ZX-Konvention den Wert Null haben. copy ermöglicht es den Nutzern, das Kopieren der Eingabedaten zu vermeiden, wenn sie ausdrücklich copy=False einstellen.

  • Verbesserte Leistung der folgenden SparsePauliOp operationen:

  • Hinzufügen der SparsePauliOp.sum() methode zum Zusammenzählen vieler SparsePauliOps. Diese Methode ist wesentlich leistungsfähiger als das Zusammenzählen der Instanzen in einer Schleife. Der bisherige Weg, um zum Beispiel mehrere SparsePauliOps zu addieren, wäre zum Beispiel so:

    from qiskit.quantum_info import SparsePauliOp, random_pauli_list
    sparse_ops = [SparsePauliOp(random_pauli_list(10, 10)) for _ in [None]*1000]
    
    total = sparse_ops[0]
    for op in sparse_ops[1:]:
        total += op

    Dies kann nun wesentlich effizienter erfolgen (sowohl was die Geschwindigkeit als auch die Tipparbeit betrifft) als:

    SparsePauliOp.sum(sparse_ops)
  • Ein Argument limit_amplitude wurde zum Konstruktor von ParametricPulse hinzugefügt, der die Basisklasse von Gaussian, GaussianSquare, Drag und Constant, um die Deaktivierung der Amplitudengrenze von 1 für jeden einzelnen Impuls zu ermöglichen. Bei limit_amplitude=False können einzelne Impulse eine Amplitude von mehr als 1 haben, ohne eine PulseError. Siehe #6544 für weitere Einzelheiten.

  • Mit QuantumCircuit.draw() oder circuit_drawer() mit der Schublade latex wird nun eine Datei in einem Bildformat erzeugt, das z. B. aus der Dateinamenerweiterung abgeleitet wird:

    import qiskit
    
    circuit = qiskit.QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.draw('latex', filename='./file.jpg')

    Dadurch wird die Schaltkreiszeichnung im JPEG-Format gespeichert. Zuvor war das Bild immer im PNG-Format. Siehe #6448 für weitere Einzelheiten.

    Wenn es nun auf eine nicht unterstützte Dateinamenerweiterung stößt, zum Beispiel:

    circuit.draw('latex', filename='./file.spooky')

    wird eine ValueError erstellt, um die Dateinamenerweiterung in ein unterstütztes Bildformat zu ändern.

  • Der Parameter filename wurde zu plot_gate_map() und plot_coupling_map()hinzugefügt, der das Speichern der resultierenden Bilder in einer Datei ermöglicht.

  • Einführung eines approximativen Quantencompilers und einer entsprechenden Implementierung eines unitären Synthese-Plugins. Die wichtigste AQC-Klasse ist AQC für eine eigenständige Version, die eine unitäre Matrix in eine approximative Schaltung umwandelt. Das Plugin kann aufgerufen werden durch transpile() aufgerufen werden, wenn das Argument unitary_synthesis_method auf 'aqc' gesetzt ist. Siehe qiskit.transpiler.synthesis.aqc für alle Einzelheiten.

  • Ein filter_function Argument wurde hinzugefügt zu QuantumCircuit.depth() und QuantumCircuit.size() hinzugefügt, um Schaltkreisoperationen nach bestimmten Kriterien zu analysieren.

    Um die Anzahl der Zwei-Qubit-Tore zu ermitteln, kann man zum Beispiel Folgendes tun:

    circuit.size(lambda x: x[0].num_qubits == 2)

    Oder um die Tiefe von T Gates zu erhalten, die auf das nullte Qubit wirken:

    circuit.depth(lambda x: x[0].name == 't' and circuit.qubits[0] in x[1])
  • Ein neuer Transpiler-Pass wurde hinzugefügt, CollectMultiQBlockszu dem qiskit.transpiler.passes modul hinzugefügt. Dieser Durchgang dient dazu, Sequenzen von ununterbrochenen Gates zu sammeln, die auf Gruppen von Qubits wirken. Er bietet eine ähnliche Funktion wie der bestehende Collect2qBlocks pass, aber während dieser Pass für die Suche nach 2-Qubit-Blöcken entwickelt und optimiert wurde, kann der neue Pass Blöcke jeder Größe finden.

  • Es gibt eine Builder-Schnittstelle für die neuen Kontrollflussoperationen auf QuantumCircuitwie zum Beispiel das neue ForLoopOp, IfElseOp, und WhileLoopOp. Die Schnittstelle verwendet die gleichen Schaltungsmethoden, d . h. QuantumCircuit.for_loop(), QuantumCircuit.if_test() und QuantumCircuit.while_loop()die überladen sind, so dass sie einen Kontextmanager zurückgeben, wenn der Parameter body nicht angegeben ist. Die Eingabe eines dieser Kontextmanager schiebt einen Bereich in den Schaltkreis und erfasst alle Gatteraufrufe (und andere Bereiche) sowie die von diesen verwendeten Ressourcen und baut am Ende die entsprechende Operation auf. Zum Beispiel können Sie jetzt tun:

    qc = QuantumCircuit(2, 2)
    with qc.for_loop(range(5)) as i:
        qc.rx(i * math.pi / 4, 0)

    Dies erzeugt eine ForLoopOp auf qc, das weiß, dass Qubit 0 die einzige Ressource ist, die innerhalb des Schleifenkörpers verwendet wird. Diese Kontextmanager können verschachtelt werden und werden ihre Breite korrekt bestimmen. Sie können verwenden QuantumCircuit.break_loop() und QuantumCircuit.continue_loop() innerhalb eines Kontexts verwenden, und er wird auf die richtige Breite für die ihn enthaltende Schleife erweitert, auch wenn er in weiteren QuantumCircuit.if_test() blöcken verschachtelt ist.

    Der if_test() kontextmanager stellt einen verketteten Manager zur Verfügung, der, falls gewünscht, zur Erstellung eines else -Blocks verwendet werden kann, z. B. durch:

    qreg = QuantumRegister(2)
    creg = ClassicalRegister(2)
    qc = QuantumCircuit(qreg, creg)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(0, 0)
    with qc.if_test((creg, 0)) as else_:
        qc.x(1)
    with else_:
        qc.z(1)

    Der Verwalter stellt sicher, dass die Stellen if und else über denselben Satz von Ressourcen definiert sind.

  • Einführung eines neuen Transpiler-Passes InverseCancellation eingeführt, der den CXCancellation pass verallgemeinert, um alle selbst-inversen Gatter oder Gatter-inversen Paare zu annullieren. Es kann verwendet werden, indem man initialisiert InverseCancellation und die Übergabe eines Gatters zum Abbrechen, zum Beispiel:

    from qiskit.transpiler.passes import InverseCancellation
    from qiskit import QuantumCircuit
    from qiskit.circuit.library import HGate
    from qiskit.transpiler import PassManager
    
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.h(0)
    pass_ = InverseCancellation([HGate()])
    pm = PassManager(pass_)
    new_circ = pm.run(qc)
  • Der Konstruktor von RZXCalibrationBuilder hat zwei neue kwargs instruction_schedule_map und qubit_channel_mapping , die eine InstructionScheduleMap und eine Liste von Kanalnamenlisten für jedes Qubit entgegennehmen. Diese neuen Argumente werden verwendet, um die von einem Backend-Ziel benötigten Informationen direkt anzugeben. Sie sollten verwendet werden, anstatt ein BaseBackend oder BackendV1 objekt direkt an die Übergabe mit dem Argument backend zu übergeben.

  • Die Statevectors von Zuständen, die nur aus Qubits bestehen, können nun in LaTeX in Ket-Notation gezeichnet werden. In der Ket-Notation werden die Einträge des Zustandsvektors so verarbeitet, dass exakte Faktoren wie Brüche oder Quadratwurzeln aus zwei als solche gezeichnet werden. Die jeweilige Konvention kann durch Übergabe des Schlüsselwortarguments convention als "ket" oder "vector" gewählt werden:

    import math
    from qiskit.quantum_info import Statevector
    
    sv = Statevector([math.sqrt(0.5), 0, 0, -math.sqrt(0.5)])
    sv.draw("latex", convention="ket")
    sv.draw("latex", convention="vector")
  • Hinzufügen eines neuen Transpiler-Passes EchoRZXWeylDecomposition der es dem Benutzer ermöglicht, ein beliebiges Zwei-Qubit-Gatter in Form von geechotem RZX-Gatter zu zerlegen, indem er die Cartan-Zerlegung nutzt. In Kombination mit anderen Transpiler-Passagen kann dies dazu verwendet werden, beliebige Schaltungen in RZX-Gate-basierte und impulseffiziente Schaltungen zu transpilieren, die dieselbe Unitary implementieren.

  • Die SPSA und QNSPSA sind nun in der Lage, so viele Schaltkreisauswertungen wie möglich sowohl für die Iterationen als auch für die Anfangskalibrierungen zu stapeln. Dies kann ausgenutzt werden, indem man den max_evals_grouped kwarg auf den Konstruktor für VQE gesetzt wird, wenn man entweder SPSA oder QNSPSA als optimizer Parameter verwenden. Zum Beispiel:

    from qiskit.circuit.library import TwoLocal
    from qiskit.algorithms import VQE
    from qiskit.algorithms.optimizers import QNSPSA
    from qiskit.test.mock import FakeMontreal
    
    backend = FakeMontreal()
    ansatz = TwoLocal(2, rotation_blocks=["ry", "rz"], entanglement_blocks="cz")
    qnspsa = QNSPSA(fidelity, maxiter=5)
    vqe = VQE(
        ansatz=ansatz,
        optimizer=qnspsa,
        max_evals_grouped=100,
        quantum_instance=backend,
    )
  • Mit dieser Version wird eine Zerlegungsmethode für Zwei-Qubit-Gatter eingeführt, die auf benutzerdefinierte Mengen von RZX-Gattern abzielt. Transpiler-Benutzer können die Dekomposition speziell für {RZX(pi/2), RZX(pi/4), and RZX(pi/6)} aktivieren, indem sie 'rzx' in ihre basis_gates -Liste aufnehmen, wenn sie transpile(). Benutzer des Quantum-Informationspakets finden die Methode selbst unter der XXDecomposer klasse.

  • Hinzufügen eines Transpiler-Passes Optimize1qGatesSimpleCommutationhinzugefügt, der eine Schaltung nach einer Strategie des Hin- und Herpendelns von Ein-Qubit-Gattern optimiert, um Resynthesemöglichkeiten zu entdecken.

  • Hinzufügen eines max_job_tries Parameters zu QuantumInstancehinzugefügt, um die Anzahl der Ausführungsversuche eines Auftrags auf einem Backend zu begrenzen. Zuvor wurde die Übermittlung und das Abrufen von Ergebnissen unendlich oft versucht, auch wenn der Auftrag abgebrochen wurde oder im Backend ein Fehler auftrat. Der Standardwert ist nun 50, und das vorherige Verhalten kann durch die Einstellung max_job_tries=-1 erreicht werden. Behebt #6872 und #6821.

  • Die Ausgabemethode latex für die circuit_drawer() funktion und die QuantumCircuit.draw() methode können nun Schaltungen zeichnen, die Gatter mit Einzelbitbedingungen enthalten. Dies wurde aus Gründen der Kompatibilität der Latex-Schublade mit der neuen Funktion der Unterstützung der klassischen Konditionierung von Gattern auf einzelne klassische Bits hinzugefügt.

  • Die Ausgabemethode "mpl" für die circuit_drawer() funktion und die QuantumCircuit.draw() methode können nun Schaltungen zeichnen, die Gatter mit Einzelbitbedingungen enthalten. Dies wurde hinzugefügt, um die Kompatibilität der "mpl" Schublade mit der neuen Funktion der Unterstützung der klassischen Konditionierung von Gattern auf einzelne klassische Bits zu gewährleisten.

  • Die Ausgabemethode text für die circuit_drawer() funktion und die QuantumCircuit.draw() methode können nun Schaltungen zeichnen, die Gatter mit Einzelbitbedingungen enthalten. Dies wurde aus Gründen der Kompatibilität der Textschublade mit der neuen Funktion der Unterstützung der klassischen Konditionierung von Gattern auf einzelne klassische Bits hinzugefügt.

  • Ein neuer Analyse-Transpiler-Pass, GatesInBasiswurde hinzugefügt zu qiskit.transpiler.passes. Dieser Durchgang wird verwendet, um zu prüfen, ob die DAGCircuit die transponiert wird, alle Gatter in der konfigurierten Basismenge hat oder nicht. Es setzt das Attribut "all_gates_in_basis" in der Eigenschaftsgruppe auf True , wenn alle Gates in der DAGCircuit in der konfigurierten Basismenge sind oder False , wenn sie es nicht sind. Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import GatesInBasis
    
    # Instatiate Pass
    basis_gates = ["cx", "h"]
    basis_check_pass = GatesInBasis(basis_gates)
    # Build circuit
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    # Run pass on circuit
    property_set = {}
    basis_check_pass(circuit, property_set=property_set)
    assert property_set["all_gates_in_basis"]
  • Zwei neue Konstruktormethoden hinzugefügt, from_heavy_hex() und from_heavy_square()zu der CouplingMap klasse. Diese Konstruktormethoden werden verwendet, um einen CouplingMap die ein schwerer hexagonaler oder schwerer quadratischer Graph sind, wie in Chamberland et al. beschrieben, 2020.

    Zum Beispiel:

    from qiskit.transpiler import CouplingMap
    
    cmap = CouplingMap.from_heavy_hex(5)
    cmap.draw()
    from qiskit.transpiler import CouplingMap
    
    cmap = CouplingMap.from_heavy_square(5)
    cmap.draw()
  • Der Algorithmus HHL kann nun Lösungen finden, wenn seine Matrix negative Eigenwerte hat. Um dies zu ermöglichen, fügt der Algorithmus nun ein zusätzliches Qubit hinzu, um das Vorzeichen des Wertes darzustellen, und der Hilfsalgorithmus ExactReciprocal wurde aktualisiert, um diese neue Information zu verarbeiten. Siehe #6971 für weitere Einzelheiten.

  • Zwei neue Klassen hinzugefügt, CompleteMeasFitter und TensoredMeasFitter zu dem qiskit.utils.mitigation modul. Diese Klassen sind nur zur Verwendung als Werte für die measurement_error_mitigation_cls kwarg der QuantumInstance klasse. Die Instanziierung und Verwendung dieser Klassen (oder aller anderen in qiskit.utils.mitigation) außerhalb des measurement_error_mitigation_cls kwarg sollte als interne private API behandelt werden, auf die man sich nicht verlassen sollte.

  • Die ListOp klasse in qiskit.opflow hat nun ein coeffs attribut, das eine Liste der Koeffizienten der Operatorliste zurückgibt, wobei der Gesamtkoeffizient (ListOp.coeff) multiplikativ auf die Liste verteilt wird. Beachten Sie, dass ListOp objekte verschachtelt sein können (enthalten in oplist eines ListOp objekts), und in diesen Fällen wird eine Ausnahme ausgelöst, wenn die Methode coeffs aufgerufen wird. Die ListOp.coeffs methode duckt sich praktischerweise gegen die coeffs Eigenschaftsmethode der nicht verschachtelten PauliSumOp klasse.

  • Die Klasse Statevector klasse ist jetzt subscriptable. Der Benutzer kann nun den n-ten Koeffizienten in einer Statevector per Index als statevec[n] abrufen.

  • Hinzufügen der Statevector.inner methode zur Berechnung innerer Produkte von Statevector instanzen. Zum Beispiel:

    statevec_inner_other = statevec.inner(other)

    gibt das innere Produkt von statevec mit other zurück. Während statevec ein Statevectorsein muss, kann other alles sein, was sich in ein Statevectorkonstruiert werden kann, wie zum Beispiel ein Numpy-Array.

  • Ein neuer Parameter, add_bits, wurde zu QuantumCircuit.measure_all(). Standardmäßig ist sie auf True eingestellt, um das bisherige Verhalten beizubehalten, ein neues ClassicalRegister mit der gleichen Größe wie die Anzahl der Qubits zum Speichern der Messungen. Bei der Einstellung False werden die Messungen in den bereits vorhandenen klassischen Bits gespeichert. Wenn Sie zum Beispiel eine Schaltung mit vorhandenen klassischen Bits erstellen, wie:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qr = QuantumRegister(2)
    cr = ClassicalRegister(2, "meas")
    circuit = QuantumCircuit(qr, cr)

    durch den Aufruf von circuit.measure_all(add_bits=False) wird das bestehende klassische Register cr als Ausgabeziel für die dem Schaltkreis hinzugefügten Objekte Measurement verwendet.

  • ParameterExpression delegiert nun seine numerischen Konvertierungen an die zugrunde liegende symbolische Bibliothek, selbst wenn es potenziell ungebundene Parameter gibt. Dies ermöglicht die Umwandlung von Ausdrücken wie:

    >>> from qiskit.circuit import Parameter
    >>> x = Parameter('x')
    >>> float(x - x + 2.3)
    2.3

    wobei der zugrunde liegende Ausdruck einen festen Wert hat, der Parameter x aber noch nicht gebunden ist.

  • Hinzufügen einer Optimizer.minimize() methode zu allen Optimierern hinzugefügt: Optimizer und abgeleitete Klassen. Diese Methode ahmt die Signatur der Funktion SciPy’s minimize() nach und gibt ein OptimizerResult.

    Zum Beispiel

    import numpy as np
    from qiskit.algorithms.optimizers import COBYLA
    
    def loss(x):
        return -(x[0] - 1) ** 2 - (x[1] + 1) ** 3
    
    initial_point = np.array([0, 0])
    optimizer = COBYLA()
    result = optimizer.minimize(loss, initial_point)
    
    optimal_parameters = result.x
    minimum_value = result.fun
    num_function_evals = result.nfev
  • Hinzufügen einer PauliEvolutionGate zur Schaltungsbibliothek (qiskit.circuit.library) hinzugefügt, die ein Gatter definiert, das die zeitliche Entwicklung von (Summen oder Summen-der-Summen von) Paulis. Die Synthese dieses Gatters wird durchgeführt von EvolutionSynthesis durchgeführt und ist vom Gatter selbst entkoppelt. Die derzeit verfügbaren Synthesemethoden sind:

    Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.synthesis import SuzukiTrotter
    
    operator = SparsePauliOp.from_list([
        ("XIZ", 0.5), ("ZZX", 0.5), ("IYY", -1)
    ])
    time = 0.12  # evolution time
    synth = SuzukiTrotter(order=4, reps=2)
    
    evo = PauliEvolutionGate(operator, time=time, synthesis=synth)
    
    circuit = QuantumCircuit(3)
    circuit.append(evo, range(3))
  • Eine neue Funktion plot_coupling_map() wurde eingeführt, die die Funktionalität der bestehenden Funktion plot_gate_map()erweitert, indem drei Parameter akzeptiert werden: num_qubit, qubit_coordinates und coupling_map (anstelle von backend), um eine beliebige Qubit-Kopplungskarte darzustellen.

  • Qiskit Terra bietet nun erste Unterstützung für die Serialisierung von QuantumCircuits auf OpenQASM 3 :

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit import qasm3
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    
    print(qasm3.dumps(qc))

    Diese erste Version bietet begrenzte Unterstützung für benannte Register, grundlegende eingebaute Befehle (wie measure, barrier und reset), benutzerdefinierte Gatter, benutzerdefinierte Befehle (als Unterprogramme) und die ebenfalls in dieser Version eingeführten neuen Kontrollflusskonstrukte:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit import qasm3
    import math
    
    composite_circ_qreg = QuantumRegister(2)
    composite_circ = QuantumCircuit(composite_circ_qreg, name="composite_circ")
    composite_circ.h(0)
    composite_circ.x(1)
    composite_circ.cx(0, 1)
    composite_circ_gate = composite_circ.to_gate()
    
    qr = QuantumRegister(2, "qr")
    cr = ClassicalRegister(2, "cr")
    qc = QuantumCircuit(qr, cr)
    with qc.for_loop(range(4)) as i:
        qc.rx(i * math.pi / 4, 0)
        qc.cx(0, 1)
    qc.barrier()
    qc.append(composite_circ_gate, [0, 1])
    qc.measure([0, 1], [0, 1])
    
    print(qasm3.dumps(qc))
  • Die QDrift klasse wurde neu formuliert als eine Synthesemethode für PauliEvolutionGate, abgeleitet von TrotterizationBase.

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.synthesis import QDrift
    from qiskit.opflow import X, Y, Z
    
    qdrift = QDrift(reps=2)
    operator = (X ^ 3) + (Y ^ 3) + (Z ^ 3)
    time = 2.345  # evolution time
    
    evolution_gate = PauliEvolutionGate(operator, time, synthesis=qdrift)
    
    circuit = QuantumCircuit(3)
    circuit.append(evolution_gate, range(3))
  • Die QPY-Serialisierung ist nun in der Lage, die global_phase attribute eines QuantumCircuit objekts darzustellen, die ein int sind, Parameter objekt, oder ParameterExpression objekt sind. Frühere Versionen von QPY akzeptierten nur eine global_phase das ein float war.

    Dies erfordert das QPY-Format Version 2, das mit dieser Version eingeführt wurde, um die zusätzlichen Typen darzustellen.

  • Eine neue find_bit() methode wurde zu der QuantumCircuit klasse hinzugefügt, die es ermöglicht, den Index und die Register eines bereitgestellten Bit auf der gegebenen Schaltung ermöglicht. Die Methode gibt ein zwei Elemente umfassendes namedtuple zurück, das 0) den Index der Bit in entweder qubits (für eine Qubit) oder clbits (für a Clbit) und 1) eine Liste von length-2 Tupeln, die jeden Schaltkreis Register die den Bit enthält, und den Index in diesem Register , an dem der Bit gefunden werden kann.

    Zum Beispiel:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit
    
    reg1 = QuantumRegister(3, 'foo')
    qubit = Qubit()
    reg2 = QuantumRegister(2, 'bar')
    
    qc = QuantumCircuit(reg1, [qubit], reg2)
    
    print(qc.find_bit(reg1[2]))
    print(qc.find_bit(qubit))

    erzeugen würde:

    BitLocations(index=2, registers=[(QuantumRegister(3, 'foo'), 2)])
    BitLocations(index=3, registers=[])
  • Drei neue Instruction unterklassen wurden hinzugefügt, um Kontrollflussoperationen in dynamischen Schaltungen zu unterstützen: WhileLoopOp, ForLoopOp, und IfElseOp. Zusätzlich gibt es zwei Unterklassen, BreakLoopOpund ContinueLoopOphinzugefügt, um den Abbruch bzw. die Fortsetzung der nächsten Iteration eines Schleifenkontextes zu unterstützen.

    Diese können als eigenständige Instructionerstellt oder an eine bestehende QuantumCircuit instanz über ihre jeweiligen Methoden hinzugefügt werden, QuantumCircuit.while_loop(), for_loop(), if_test(), if_else(), break_loop(), und continue_loop().

  • Hinzufügen der BaseReadoutMitigator abstrakte Basisklasse für die Implementierung klassischer Messfehlerkorrekturen. Diese Objekte sind für die Abschwächung von Messfehlern in Counts objekten, die von der Ausführung von Schaltungen auf Backends mit Messfehlern zurückgegeben werden.

    Readout Mitigator-Klassen haben zwei Hauptmethoden:

    Beachten Sie, dass derzeit das qiskit.algorithms modul und die QuantumInstance klasse noch die alten Mitigatoren verwenden, die von Qiskit Ignis in qiskit.utils.mitigation. Es ist geplant, das Modul zu aktualisieren, um die neuen Mitigator-Klassen zu verwenden und den veralteten Mitigationscode in einer zukünftigen Version zu verwerfen.

  • Hinzufügen der LocalReadoutMitigator klasse für die Durchführung von Messwertauslesefehlerkorrekturen bei lokalen Messfehlern. Lokale Messfehler sind solche, die durch ein Tensor-Produkt von Einzel-Qubit-Messfehlern beschrieben werden.

    Diese Klasse kann mit einer Liste von NN single-qubit of measurement error assignment matrices oder von einem Backend mit den Auslesefehlerinformationen in den Backend-Eigenschaften initialisiert werden.

    Die Abschwächung wird durch lokale Zuweisungs-Matrix-Inversion implementiert, die eine Komplexität von O(2N)O(2^N) für NN -qubit Abschwächung von QuasiDistribution und Erwartungswerte.

  • Hinzufügen der CorrelatedReadoutMitigator klasse für die Durchführung von Messwertauslesefehlerkorrekturen bei korrelierten Messfehlern. Diese Klasse kann mit einer einzigen 2N×2N2^N \times 2^N Messfehler-Zuordnungsmatrix initialisiert werden, die die Fehlerwahrscheinlichkeiten beschreibt. Die Abschwächung erfolgt durch Inversion der Zuordnungsmatrix, die eine Abschwächungskomplexität von O(4N)O(4^N) von QuasiDistribution und Erwartungswerten.

  • Hinzufügen eines QuasiDistribution.stddev_upper_bound attribut und ein kwarg zum Konstruktor der QuasiDistribution klasse, die zum Speichern von Standardfehlern in Quasi-Wahrscheinlichkeitsschätzungen verwendet wird. Dies wird verwendet von BaseReadoutMitigator klassen verwendet, um den Standardfehler in abgeschwächten Quasi-Wahrscheinlichkeiten zu speichern.

  • Hinzufügen einer shots() methode zu qiskit.result.Counts hinzugefügt, die die Summe aller Ergebnisse in den Zählungen zurückgibt.

  • Bei der Ausführung der Grover algorithmusklasse, wenn die optimale Leistung bekannt ist und nur eine einzige Schaltung ausgeführt wird, muss die AmplificationProblem.is_good_state callback-Funktion nicht mehr gesetzt werden, und die Grover-Suche gibt die wahrscheinlichste Bitfolge zurück. Wenn die optimale Potenz des Grover-Operators nicht bekannt ist, prüft der Algorithmus im Allgemeinen Grover algorithmus verschiedene Potenzen (d. h. Iterationen) und wendet die is_good_state funktion an, um zu prüfen, ob ein guter Bitstring gemessen wurde. Zum Beispiel können Sie jetzt etwas ausführen wie:

    from qiskit.algorithms import Grover, AmplificationProblem
    from qiskit.providers.aer import AerSimulator
    from qiskit.quantum_info import Statevector
    
    # Fixed Grover power: 2.
    grover = Grover(iterations=2, quantum_instance=AerSimulator())
    
    # The ``is_good_state`` argument not required here since Grover search
    # will be run only once, with a power of 2.
    problem = AmplificationProblem(Statevector.from_label("111"))
    
    # Run Grover search and print the best measurement
    result = grover.amplify(problem)
    print(result.top_measurement)  # should print 111
  • Methode hinzugefügt remove_cregs() zur Klasse DAGCircuit zur Unterstützung der klassischen Registerentfernung.

  • Methode hinzugefügt remove_clbits() zur Klasse DAGCircuit zugefügt, um das Entfernen von inaktiven klassischen Bits zu unterstützen. Alle klassischen Register, die auf ein entferntes Bit verweisen, werden ebenfalls entfernt.

  • Eine neue Methode wurde hinzugefügt, replace_block_with_op()zu der DAGCircuit klasse. Diese Methode wird verwendet, um einen Block von Knoten in der DAG mit einer einzigen Operation zu ersetzen. Das kanonische Beispiel ist für den ConsolidateBlocks durchgang, bei dem Blöcke von Knoten durch gleichwertige UnitaryGate Knoten ersetzt werden.

  • Ein neuer Analyse-Transpiler-Pass wurde hinzugefügt, Collect1qRunszu dem qiskit.transpiler.passes modul. Dieser Durchlauf wird verwendet, um Sequenzen von ununterbrochenen Gates zu finden, die auf ein einzelnes Qubit wirken. Sie ist ähnlich wie die Collect2qBlocks und CollectMultiQBlocks aber optimiert für Einzel-Qubit-Läufe anstelle von Mehrfach-Qubit-Blöcken.

  • Verschiedene Transpilationsinterna verwenden nun neue Funktionen in retworkx 0.10, wenn sie mit der internen Schaltkreisdarstellung arbeiten. Dies kann oft zu einer Beschleunigung der Aufrufe von transpile von etwa 10-40 % führen, wobei die Auswirkungen bei höheren Optimierungsgraden größer sind. Siehe #6302 für weitere Einzelheiten.

  • Der UnitarySynthesis transpiler-Pass in qiskit.transpiler.passes hat einen neuen kwarg im Konstruktor, min_qubits. Wenn angegeben, kann dies auf einen int Wert gesetzt werden, der die Mindestgröße des UnitaryGate Objekts für die Durchführung der unitären Synthese darstellt. Wenn ein UnitaryGate in einer QuantumCircuit weniger Qubits verwendet, wird sie von dieser Instanz des Durchlaufs übersprungen.

  • Die Schnittstellen Eigensolver und MinimumEigensolver unterstützen nun den Typ Dict[str, Optional[OperatorBase]] für den Parameter aux_operators in ihren jeweiligen Methoden compute_eigenvalues() und compute_minimum_eigenvalue() . In diesem Fall werden die Hilfseigenwerte ebenfalls in einem Wörterbuch unter denselben Schlüsseln gespeichert, die das Wörterbuch aux_operators liefert. Tasten, die einem Operator entsprechen, der nicht mit dem Hauptoperator übereinstimmt, werden nicht berücksichtigt.

  • Die BasisTranslator, GateDirection, und CheckGateDirection haben einen neuen target kwarg in ihren Konstruktoren, der verwendet werden kann, um ein Target objekt als Ziel für die Übergabe festzulegen. Wenn er gesetzt ist, wird er anstelle von target_basis (im Falle des BasisTranslator pass) oder coupling_map (im Falle der GateDirection und CheckGateDirection durchgänge) verwendet.

  • Erlauben Sie zwei Transpiler-Stufen in der QuantumInstanceeine für parametrisierte Schaltungen und eine zweite nur für gebundene Schaltungen (d.h. keine freien Parameter). Wenn eine Quanteninstanz mit Durchläufen für ungebundene und gebundene Schaltkreise an einen CircuitSamplerübergeben wird, versucht der Sampler, den ungebundenen Durchgang einmal auf den parametrisierten Schaltkreis anzuwenden, ihn zwischenzuspeichern und nur den gebundenen Durchgang für alle zukünftigen Auswertungen anzuwenden.

    Dies ermöglicht Variationsalgorithmen wie dem VQE einen benutzerdefinierten Pass-Manager für parametrisierte Schaltungen einmal ausführen und zusätzlich einen anderen Transpiler mit einem anderen benutzerdefinierten Pass-Manager für die gebundenen Schaltungen in jeder Iteration. Die Möglichkeit, verschiedene Durchlaufmanager einzusetzen, ist wichtig, da nicht alle Durchläufe parametrisierte Schaltkreise unterstützen (z. B Optimize1qGatesDecomposition funktioniert nur mit gebundenen Schaltkreisparametern).

    Diese Funktion ermöglicht zum Beispiel die Verwendung der impulseffizienten CX-Zerlegung in der VQE, da

    from qiskit.algorithms import VQE
    from qiskit.opflow import Z
    from qiskit.circuit.library.standard_gates.equivalence_library import StandardEquivalenceLibrary as std_eqlib
    from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap
    from qiskit.transpiler.preset_passmanagers import level_1_pass_manager
    from qiskit.transpiler.passes import (
        Collect2qBlocks, ConsolidateBlocks, Optimize1qGatesDecomposition,
        RZXCalibrationBuilderNoEcho, UnrollCustomDefinitions, BasisTranslator
    )
    from qiskit.transpiler.passes.optimization.echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition
    from qiskit.test.mock import FakeBelem
    from qiskit.utils import QuantumInstance
    
    # Replace by a real backend! If not ensure qiskit-aer is installed to simulate the backend
    backend = FakeBelem()
    
    # Build the pass manager for the parameterized circuit
    rzx_basis = ['rzx', 'rz', 'x', 'sx']
    coupling_map = CouplingMap(backend.configuration().coupling_map)
    config = PassManagerConfig(basis_gates=rzx_basis, coupling_map=coupling_map)
    pre = level_1_pass_manager(config)
    
    # Build a pass manager for the CX decomposition (works only on bound circuits)
    post = PassManager([
        # Consolidate consecutive two-qubit operations.
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=['rz', 'sx', 'x', 'rxx']),
    
        # Rewrite circuit in terms of Weyl-decomposed echoed RZX gates.
        EchoRZXWeylDecomposition(backend),
    
        # Attach scaled CR pulse schedules to the RZX gates.
        RZXCalibrationBuilderNoEcho(backend),
    
        # Simplify single-qubit gates.
        UnrollCustomDefinitions(std_eqlib, rzx_basis),
        BasisTranslator(std_eqlib, rzx_basis),
        Optimize1qGatesDecomposition(rzx_basis),
    ])
    
    quantum_instance = QuantumInstance(backend, pass_manager=pre, bound_pass_manager=post)
    
    vqe = VQE(quantum_instance=quantum_instance)
    result = vqe.compute_minimum_eigenvalue(Z ^ Z)
  • Es wurde eine neue Schnittstelle für unitäre Synthese-Plugins eingeführt, die es ermöglicht, alternative Synthesetechniken, die in externen Paketen enthalten sind, nahtlos mit dem UnitarySynthesis transpiler-Durchgang. Benutzer können ein Plugin auswählen, das beim Aufruf von transpile() ein Plugin auswählen, indem sie den unitary_synthesis_method kwarg auf den Namen des Plugins setzen. Eine vollständige Liste der installierten Plugins finden Sie mit der qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() funktion. Wenn Sie zum Beispiel ein Paket installiert haben, das ein Synthese-Plugin namens special_synth enthält, können Sie es mit verwenden:

    from qiskit import transpile
    
    transpile(qc, unitary_synthesis_method='special_synth', optimization_level=3)

    Dies ersetzt alle Verwendungen von UnitarySynthesis durch die Methode, die in dem externen Paket enthalten ist, das das Plugin special_synth exportiert.

    Die Plugin-Schnittstelle ist um setuptools-Einstiegspunkte herum aufgebaut, die es Paketen außerhalb von Qiskit ermöglichen, anzuzeigen, dass sie ein Synthese-Plugin enthalten. Einzelheiten zum Schreiben eines neuen Plugins finden Sie in der qiskit.transpiler.passes.synthesis.plugin modul-Dokumentation.

  • Ein neuer Transpiler-Pass wurde hinzugefügt, VF2Layout. Dieser Durchlauf modelliert das Layout-Zuordnungsproblem als Teilgraphen-Isomorphismus-Problem und verwendet die VF2 Algorithmus-Implementierung in rustworkx, um ein perfektes Layout zu finden (ein Layout, das kein zusätzliches Routing erfordern würde), falls ein solches existiert. Die Funktionalität dieses neuen Passes ähnelt sehr den bestehenden CSPLayout aber VF2Layout ist aber wesentlich schneller.

Bekannte Probleme

  • Die "ket" Konvention in der "latex" Schublade von Statevector.draw() ist nur für Zustände gültig, die nur aus Qubits bestehen. Wenn Sie Zustände mit einigen Leerzeichen von mehr als zwei Dimensionen verwenden, sollten Sie entweder convention="vector" übergeben oder eine andere Schublade verwenden.

  • Die Exportmöglichkeiten von OpenQASM 3 befinden sich im Beta-Stadium, und einige Funktionen von Qiskit Terra's QuantumCircuit werden noch nicht unterstützt. Insbesondere können Fehler auftreten, wenn Sie versuchen, benutzerdefinierte Unterprogramme mit klassischen Parametern zu exportieren, und es gibt noch keine Möglichkeit, impulskalibrierte Operationen in OpenPulse.

  • Wenn Sie das Programm BasisTranslator isoliert mit dem target Argument auf ein Target objekt gesetzt ist, bei dem einige Ein-Qubit-Gatter nur auf nicht überlappende Mengen von Qubits angewendet werden können, könnte die Ausgabeschaltung fälschlicherweise Operationen auf einem Qubit enthalten, die von der Target. Zum Beispiel, wenn Sie liefen:

    from qiskit.circuit import QuantumCircuit, Parameter
    from qiskit.circuit.library import UGate, RZGate, XGate, SXGate, CXGate
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    
    from qiskit.transpiler import PassManager, Target, InstructionProperties
    from qiskit.transpiler.passes import BasisTranslator
    
    gmap = Target()
    
    # U gate in qubit 0.
    theta = Parameter('theta')
    phi = Parameter('phi')
    lam = Parameter('lambda')
    u_props = {
        (0,): InstructionProperties(duration=5.23e-8, error=0.00038115),
    }
    gmap.add_instruction(UGate(theta, phi, lam), u_props)
    
    # Rz gate in qubit 1.
    phi = Parameter("phi")
    rz_props = {
        (1,): InstructionProperties(duration=0.0, error=0),
    }
    gmap.add_instruction(RZGate(phi), rz_props)
    
    # X gate in qubit 1.
    x_props = {
        (1,): InstructionProperties(
            duration=3.5555555555555554e-08, error=0.00020056469709026198
        ),
    }
    gmap.add_instruction(XGate(), x_props)
    
    # SX gate in qubit 1.
    sx_props = {
        (1,): InstructionProperties(
            duration=3.5555555555555554e-08, error=0.00020056469709026198
        ),
    }
    gmap.add_instruction(SXGate(), sx_props)
    
    cx_props = {
        (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115),
        (1, 0): InstructionProperties(duration=4.52e-7, error=0.00132115),
    }
    gmap.add_instruction(CXGate(), cx_props)
    
    bt_pass = BasisTranslator(sel, target_basis=None, target=gmap)
    
    qc = QuantumCircuit(2)
    qc.iswap(0, 1)
    output = bt_pass(qc)

    output haben RZGate und SXGate auf Qubit 0, obwohl dies verboten ist. Um dies zu korrigieren, können Sie den Basisübersetzer normalerweise ein zweites Mal ausführen (d.h. output = bt_pass(output) im obigen Beispiel), um dies zu korrigieren. Dies sollte keinen Einfluss auf die Ausgabe der Ausführung der transpile() funktion nicht beeinträchtigen und ist nur ein Problem, wenn Sie den Durchgang selbst ausführen.

Anmerkungen zu Upgrades

  • Ab dieser Version importiert from qiskit import * keine Untermodule mehr, sondern nur noch eine ausgewählte Liste von Objekten. Dies kann dazu führen, dass vorhandener Code, der from qiskit import * verwendet und auf Objekte verweist, die nicht Teil des aktuellen Namespaces sind, nicht mehr funktioniert. Zur Erinnerung: import * gilt als schlechte Praxis und sollte nicht in Produktionscode verwendet werden. Qiskit stellt __all__ in qiskit/__init__.py ein, um die Auswirkungen dieser schlechten Praxis zu mildern. Wenn Ihr Code name '<something>' is not defined aufruft, fügen Sie from qiskit import <something> hinzu und versuchen Sie es erneut.

  • Die voreingestellten Passmanager für die Optimierungsstufen 0, 1, 2 und 3, die durch level_0_pass_manager(), level_1_pass_manager(), level_2_pass_manager(), und level_3_pass_manager() erzeugt werden, führen nicht mehr bedingungslos die TimeUnitConversion. Bisher haben die voreingestellten Passmanager diesen Pass immer ausgeführt, unabhängig von den Eingängen des Transpilers und der Schaltung. Dieser Durchlauf wird nur ausgeführt, wenn ein scheduling_method Parameter gesetzt ist oder die Schaltung eine Delay anweisung enthält und der Parameter instruction_durations gesetzt ist. Diese Änderung wurde im Interesse der Laufzeitleistung vorgenommen, da in einigen Fällen bei transpile() schaltungen mit einer großen Anzahl von Gattern und ohne Verzögerungen, Timing oder Scheduling, die die TimeUnitConversion der größte Engpass bei der Transpilierung sein könnte.

  • Die Standardmethode für BIPMapping ist jetzt balanced und nicht mehr depth. Dieses neue Ziel führt im Allgemeinen zu einem besseren Ergebnis, da es sowohl die Schaltungstiefe als auch den Gatterfehler berücksichtigt.

  • Die sort_parameters_by_name der Klasse VQE klasse wurde entfernt, nachdem sie in Qiskit Terra 0.18 veraltet ist. Es ist keine Alternative vorgesehen, da die neue Reihenfolge der Parameter die natürlichere Sortierreihenfolge ist.

  • Die Schaltkreisschubladen QuantumCircuit.draw() und circuit_drawer() mit der Option latex speichern ihre Bilder nun in einem Format, das die Dateierweiterung bestimmt (wenn ein Dateiname angegeben ist). Zuvor wurden sie immer im PNG-Format gespeichert. Sie rufen jetzt ValueError auf, wenn das Bildformat nicht bekannt ist. Dies wurde getan, um das Speichern des Bildes in verschiedenen Formaten zu erleichtern.

  • Die Versionsanforderung für die Kernabhängigkeit retworkx wurde von 0.9 auf 0.10.1 angehoben. Dies ermöglicht eine Reihe von Leistungsverbesserungen über verschiedene Transpilationsdurchgänge hinweg.

  • Der zuvor veraltete condition kwarg, der als Teil der Version 0.15.0 veraltet war, wurde aus DAGCircuit.apply_operation_back() und entfernt DAGCircuit.apply_operation_front(). Setzen Sie stattdessen das Attribut condition auf die Instruction instanzen, die der DAGCircuit mit Instruction.c_if().

  • Die Methode DAGCircuit.extend_back() wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Stattdessen können Sie die DAGCircuit.compose() methode verwenden, die allgemeiner ist und dieselbe Funktionalität bietet.

  • Die Methode DAGCircuit.compose_back() wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Stattdessen können Sie die DAGCircuit.compose() methode verwenden, die allgemeiner ist und dieselbe Funktionalität bietet.

  • Die edge_map kwarg der DAGCircuit methode compose() wurde entfernt. Ursprünglich war sie in der Version 0.14.0 veraltet. Die Methode nimmt ein qubits und clbits kwargs, um die Positionsreihenfolge der Bits zu spezifizieren, auf die komponiert werden soll, anstatt eine Wörterbuchzuordnung zu verwenden, die edge_map zuvor bereitgestellt hat.

  • Die Methode DAGCircuit.twoQ_gates() wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Stattdessen, DAGCircuit.two_qubit_ops() verwendet werden.

  • Die Methode DAGCircuit.threeQ_or_more_gates() wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Stattdessen, DAGCircuit.multi_qubit_ops() methode verwendet werden.

  • Der benannte Zugriff für das erste Positionsargument für den Konstruktor der SingleQubitUnitary klasse mit u wurde entfernt. Ursprünglich war sie in der Version 0.14.0 veraltet. Stattdessen kann das erste Positionsargument mit dem Namen unitary_matrix gesetzt werden (oder einfach nur positionell statt mit dem Namen).

  • Benannter Zugriff für das erste Positionsargument für die QuantumCircuit methode squ mit u wurde entfernt. Ursprünglich war sie in der Version 0.14.0 veraltet. Stattdessen kann das erste Positionsargument mit dem Namen unitary_matrix gesetzt werden (oder einfach nur positionell anstelle des Namens).

  • Die unbenutzten proc und nested_scope kwargs für die qasm() Methode der QASM Knotenklassen im qiskit.qasm.node Modul wurden entfernt. Sie wurden ursprünglich in der Version 0.15.0 veraltet.

  • Die unbenutzten proc und nested_scope kwargs für die latex() Methode der QASM Knotenklassen im qiskit.qasm.node Modul wurden entfernt. Sie wurden ursprünglich in der Version 0.15.0 veraltet.

  • Die unbenutzten proc und nested_scope kwargs für die real() Methode der QASM Knotenklassen im qiskit.qasm.node Modul wurden entfernt. Sie wurden ursprünglich in der Version 0.15.0 veraltet.

  • Die Ausgabe von Statevector.draw() bei Verwendung der Ausgabe "latex" entspricht nun der neuen Konvention "ket" , wenn ein Zustand gezeichnet wird, der nur aus Qubits besteht. Dies wurde geändert, um das Lesen der Ausgabe zu erleichtern, insbesondere in Bildungskontexten, da die Ket-Beschriftungen angezeigt werden und nur die Nicht-Null-Elemente angezeigt werden.

  • Beim Betrieb execute() mit einem BackendV1 backend ausgeführt wird, werden die Standardwerte für die kwargs shots, max_credits, meas_level, meas_return und memory_slot_size nun so sein, wie sie im Ziel-Backend für das options attribut. Zuvor waren diese Standardwerte so eingestellt, dass sie mit den Standardwerten beim Aufruf von execute() mit einem alten BaseBackend Backend aufgerufen wurde. Zum Beispiel:

    from qiskit.test.mock import FakeMumbai
    from qiskit import QuantumCircuit, execute
    
    circuit = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    backend = FakeMumbai()
    backend.set_options(shots=4096)
    execute(qc, backend)

    läuft jetzt mit 4096 shots. Während es in früheren Versionen mit 1024 lief.

  • Die minimal unterstützte Version von Matplotlib wurde von 2.1.0 auf 3.3.0 angehoben. Sie müssen nun Matplotlib 3.3.0 installiert haben, wenn Sie Matplotlib -basierte Visualisierungsfunktionen wie das 'mpl' Backend für die circuit_drawer() funktion oder die plot_bloch_vector() funktion. Dies geschah aus zwei Gründen: erstens, weil neuere Versionen von Matplotlib die Verwendung von APIs rund um 3D Visualisierungen, die mit älteren Versionen kompatibel waren, veraltet haben, und zweitens, weil die Installation älterer Versionen von Matplotlib immer schwieriger wurde, da die Upstream-Abhängigkeiten von Matplotlib Inkompatibilitäten verursacht haben, die das Testen in der Zukunft erschwerten.

  • Die interne Verwendung des Zufallszahlengenerators in random_circuit() wurde angepasst, wodurch sich die Ausgabe gegenüber früheren Versionen ändert, selbst bei einem festen Seed. Dies wurde getan, um die Skalierung der Laufzeit mit der Anzahl der verwendeten Qubits erheblich zu verbessern. Wenn Sie sich auf eine identische Ausgabe aus einer früheren Version verlassen haben, empfiehlt es sich, die mit einer früheren Version erzeugte Zufallsschaltung mit qpy_serialization.dump() zu speichern und sie nicht mit der neuen Version neu zu erzeugen, sondern nur qpy_serialization.load() zu verwenden, um diese gespeicherte Schaltung zu laden.

  • Die Verwendung von * (__mul__) für die dot() methode und @ (__matmul__) für die compose() methode von BaseOperator (die die Mutter aller Operatorklassen in qiskit.quantum_info einschließlich Klassen wie Operator und Pauli) wird nicht mehr unterstützt. Die Verwendung dieser Operatoren war in der Version 0.17.0 bereits veraltet. Stattdessen sollten Sie die dot() und compose() methoden direkt verwenden, oder der & Operator (__and__) kann verwendet werden für compose(). Wenn Sie zum Beispiel vorher den Operator wie:

    from qiskit.quantum_info import random_hermitian
    
    op_a = random_hermitian(4)
    op_b = random_hermitian(4)
    
    new_op = op_a @ op_b

    sollte dies geändert werden in:

    from qiskit.quantum_info import random_hermitian
    
    op_a = random_hermitian(4)
    op_b = random_hermitian(4)
    new_op = op_a.compose(op_b)

    oder:

    new_op = op_a & op_b
  • Verschiedene Methoden der Zuweisung von Parametern zu Operanden von Impulsprogrammanweisungen wurden entfernt, da sie in Qiskit Terra 0.17 veraltet sind. Diese umfassen:

    • die Methode assign() von pulse.Instruction.
    • die Methode assign() von Channel, die die Grundlage von AcquireChannel, SnapshotChannel, MemorySlot und RegisterSlot.
    • die Methoden assign() und assign_parameters() von ParametricPulse, die die Grundlage für pulse.Gaussian, pulse.GaussianSquare, pulse.Drag und pulse.Constant bilden.

    Diese Parameter sollten vom Pulsprogramm aus zugewiesen werden (pulse.Schedule und pulse.ScheduleBlock) und nicht als Operanden des Impulsprogrammbefehls zugewiesen werden.

  • Die Methode flatten() von pulse.Instruction und qiskit.pulse.Schedule wurde entfernt und existiert nicht mehr, wie aus dem Verwerfungshinweis von Qiskit Terra 0.17 hervorgeht. Diese Transformation ist als eigenständige Funktion in qiskit.pulse.transforms.canonicalization.flatten() definiert.

  • qiskit.pulse.interfaces.ScheduleComponent wurde entfernt und existiert nicht mehr, wie in der Deprecation Notice von Qiskit Terra 0.15 angegeben. Es wird kein alternativer Unterricht angeboten.

  • Die alten Argumente für die Impulsschublade wurden von pulse.Waveform.draw() entfernt, Schedule.draw() und ScheduleBlock.draw() entfernt und existieren nicht mehr, wie aus dem Verwerfungshinweis von Qiskit Terra 0.16 hervorgeht. Diese Zeichenmethoden unterstützen jetzt nur noch V2 pulse drawer arguments. Siehe Methodendokumentation für Details.

  • Das Modul qiskit.pulse.reschedule wurde entfernt und der Importpfad existiert nicht mehr, wie in der Deprecation Notice von Qiskit Terra 0.14 beschrieben. Verwenden Sie qiskit.pulse.transforms stattdessen.

  • Eine geschützte Methode Schedule._children() wurde entfernt und durch eine geschützte Instanzvariable ersetzt, wie in der Deprecation Notice von Qiskit Terra 0.17 beschrieben. Dies wird nun als öffentliches Attribut bereitgestellt Schedule.children.

  • Die für Timeslots relevanten Methoden und Eigenschaften wurden entfernt und existieren nicht mehr in ScheduleBlock gemäß der Verwerfungsmitteilung von Qiskit Terra 0.17. Da diese Darstellung keine Vorstellung von der Befehlszeit t0 hat, sind die Zeitschlitzinformationen verfügbar, nachdem sie in eine Schedule. Entsprechende Attribute wurden nach dieser Umstellung bereitgestellt, werden aber nicht mehr unterstützt. Die folgenden Attribute werden entfernt:

    • timeslots
    • start_time
    • stop_time
    • ch_start_time
    • ch_stop_time
    • shift
    • insert
  • Ausrichtungsimpulsplan-Transformationen wurden entfernt und existieren nicht mehr, wie in der Verwerfungsmitteilung von Qiskit Terra 0.17 angegeben. Diese Transformationen werden in den AlignmentKind Kontext des Zeitplanblocks integriert und implementiert. Die folgenden expliziten Transformationsfunktionen werden entfernt:

    • qiskit.pulse.transforms.align_equispaced
    • qiskit.pulse.transforms.align_func
    • qiskit.pulse.transforms.align_left
    • qiskit.pulse.transforms.align_right
    • qiskit.pulse.transforms.align_sequential
  • Redundante Pulse Builder-Befehle wurden entfernt und existieren nicht mehr, wie in der Deprecation Notice von Qiskit Terra 0.17 angegeben. pulse.builder.call_schedule und pulse.builder.call_circuit wurden integriert in pulse.builder.call().

  • Eine interne Filterüberschreibung, die dazu führte, dass alle Qiskit-Verfallswarnungen angezeigt wurden, wurde entfernt. Das bedeutet, dass das Verhalten nun zum Standardverhalten von Python für Verwerfungen zurückkehrt; Sie sollten DeprecationWarning nur sehen, wenn es durch Code in der Hauptskriptdatei, der Interpreter-Sitzung oder dem Jupyter-Notebook ausgelöst wurde. Der Benutzer wird nicht mehr mit einer Warnung darauf hingewiesen, wenn interne Qiskit-Funktionen veraltetes Verhalten aufrufen. Wenn Sie Bibliotheken schreiben, sollten Sie gelegentlich mit deaktivierten Standard-Warnungsfiltern arbeiten oder Tests durchführen, die immer mit deaktivierten Filtern laufen. Weitere Informationen dazu finden Sie in der Python Dokumentation über Warnungen und insbesondere im Abschnitt über das Testen auf Verwerfungen.

  • Bestimmte Warnungen wurden bisher nur einmal ausgegeben, auch wenn sie an mehreren Stellen ausgelöst wurden. Dieses Verhalten wurde entfernt, so dass es möglich ist, dass beim Aufruf veralteter Funktionen mehr Warnungen angezeigt werden als zuvor. Sie sollten alle veralteten Funktionsaufrufe in die vorgeschlagenen Versionen ändern, da die veralteten Formen in zukünftigen Qiskit-Versionen entfernt werden.

  • Das veraltete qiskit.schemas Modul und das qiskit.validation Modul, das den jsonschema validator aus den Schemas erstellt, wurden entfernt. Diese wurde in der Version 0.17.0 veraltet und durch ein spezielles Repository für die IBM Quantum API Payload Schemas ersetzt.

    Wenn Sie sich auf die Schemadateien, die zuvor in qiskit.schemas verpackt waren, oder die darauf aufbauenden Validatoren verlassen haben, sollten Sie dieses Repository verwenden und Validatoren aus den darin enthaltenen Schemadateien erstellen.

  • Die Funktionen qiskit.qobj.validate_qobj_against_schema und qiskit.qobj.common.validator zusammen mit dem validate kwarg der Methoden QasmQobj.to_dict(), PulseQobj.to_dict(), und Qobj.to_dict() wurden entfernt. Diese wurden in der Version 0.17.0 veraltet. Wenn Sie diese Funktionen verwenden, müssen Sie manuell Jsonschema-Validierungsfunktionen für Qobj Objekte erstellen, indem Sie die Jsonschema-Dateien aus dem speziellen Repository für die IBM Quantum API-Nutzlastschemata verwenden.

  • Die Pakete fastjsonschema und jsonschema sind nicht mehr in der Anforderungsliste für qiskit-terra enthalten. Die interne Verwendung von jsonschema wurde entfernt und es ist nicht mehr erforderlich, qiskit-terra zu verwenden.

  • Die Ausnahme, die von der assemble() funktion ausgelöst wird, wenn ungültige Parameter für die Konstruktion eines PulseQobj ausgelöst wird, hat sich von einer SchemaValidationError zu einer QiskitError. Dies war notwendig, weil die Klasse SchemaValidationError zusammen mit dem Rest der veralteten qiskit.schemas und qiskit.validation entfernt wurde. Dies macht es auch konsistenter mit anderen Fehlerbedingungen von assemble() die bereits ein QiskitError.

  • Der Standard-Routing- und Layout-Pass für die Transpiler-Optimierungsstufe 3 wurde geändert und verwendet nun SabreSwap und SabreLayout zu verwenden. Dies geschah, um die Qualität des Ausgabeergebnisses zu verbessern, da die Verwendung der Säbeldurchgänge bessere Ergebnisse liefert als die Verwendung von StochasticSwap und DenseLayoutdie in früheren Versionen als Standardwerte verwendet wurden. Diese Änderung verbessert die Qualität der Ergebnisse bei der Ausführung von transpile() oder execute() funktionen mit der optimization_level kwarg auf 3 eingestellt ist. Dies ist zwar im Allgemeinen eine Verbesserung, aber wenn Sie das vorherige Verhalten aus irgendeinem Grund beibehalten müssen, können Sie dies tun, indem Sie die Werte routing_method="stochastic" und layout_method="dense" beim Aufruf von transpile() mit optimization_level=3.

  • Der Rückgabetyp von pauli_basis() wird sich von PauliTable zu PauliList in einer zukünftigen Version von Qiskit Terra ändern. Um sofort zum neuen Verhalten zu wechseln, übergeben Sie das Schlüsselwortargument pauli_list=True.

  • Das name attribut der SingleQubitUnitary gate-Klasse wurde von unitary auf squ geändert. Dies war notwendig, um einen Konflikt mit dem Namen der Klasse UnitaryGate zu vermeiden, die ebenfalls unitary hieß, da die beiden Gates nicht dasselbe sind und nicht dieselbe Implementierung haben (und nicht austauschbar verwendet werden können).

  • Die für die Installation erforderliche Mindestversion der Symengine wurde auf 0.8.0 erhöht. Dies war notwendig, um einige Probleme mit der Handhabung von numpy.float16 und numpy.float32 Werten zu beheben, wenn die bind() zur Bindung von Parametern in einer ParameterExpression.

  • Die Anforderungsliste wurde um eine neue Abhängigkeit Stauer ergänzt. Dies wird von qiskit-terra benötigt, da es zur Erstellung der unitären Synthese-Plugin-Schnittstelle verwendet wird.

Hinweise zu veralteten Versionen

  • Das Attribut gate und der Initialisierungsparameter von qiskit.transpiler.passes.Decompose ist veraltet und wird in einer zukünftigen Version entfernt werden. Anstelle dieses einzelnen Gatters sollten Sie eine Liste von Gatternamen an den neuen Parameter gates_to_decompose übergeben. Das neue Formular erlaubt es, mehr als ein Gatter als Zerlegungsziel auszuwählen, was flexibler ist, und es ist nicht notwendig, den Durchlauf mehrmals zu wiederholen, um eine Reihe von Gattern zu zerlegen.

  • Bei den Kalibrierungen hat es eine erhebliche Umstrukturierung des Transpilerpasses gegeben. Die Importpfade:

    from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilder
    from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilderNoEcho

    sind veraltet und werden in einer zukünftigen Version entfernt. Der Importpfad:

    from qiskit.transpiler.passes.scheduling.rzx_templates import rzx_templates

    ist ebenfalls veraltet und wird in einer zukünftigen Version entfernt werden. Sie sollten die neuen Importpfade verwenden:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.transpiler.passes import RZXCalibrationBuilderNoEcho
    from qiskit.transpiler.passes.calibration.rzx_templates import rzx_templates
  • Die Klasse DAGNode wird als eigenständige Klasse veraltet und wird in Zukunft nur noch als übergeordnete Klasse für DAGOpNode, DAGInNodeund DAGOutNode. Als Teil dieser Verwerfung werden die folgenden kwargs und zugehörigen Attribute in DAGNode werden ebenfalls veraltet: type, op, und wire.

  • Für den Konstruktor der RZXCalibrationBuilder ist die Übergabe eines Backends entweder als erstes Positionsargument oder mit dem benannten backend kwarg veraltet und wird in einer zukünftigen Version nicht mehr funktionieren. Stattdessen sollte ein InstructionScheduleMap direkt an den instruction_schedule_map kwarg übergeben werden und eine Liste von Kanalnamenlisten für jedes Qubit direkt an qubit_channel_mapping übergeben werden. Wenn Sie zum Beispiel den Pass wie folgt aufrufen würden:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.test.mock import FakeMumbai
    
    backend = FakeMumbai()
    cal_pass = RZXCalibrationBuilder(backend)

    stattdessen sollten Sie es so nennen:

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

    Diese Änderung ist notwendig, weil Backend-Objekte in der Regel nicht pickle-serialisierbar sind und es zu einem Bruch kommen würde, wenn es mit mehreren Prozessen innerhalb von transpile() verwendet wird, wenn mehrere Schaltkreise auf einmal kompiliert werden.

  • Die Eigenschaft label der Klasse MCMT und Unterklasse MCMTVChain ist veraltet und wird in einer zukünftigen Version entfernt werden. Folglich ist der label kwarg auf den Konstruktor für beide Klassen ebenfalls veraltet, zusammen mit dem label kwarg der Methode MCMT.control(). Derzeit wird die Eigenschaft label verwendet, um das kontrollierte Ziel zu benennen, wenn es aus mehr als einem Ziel-Qubit besteht. Dies war jedoch nie als benutzerdefinierte Angabe gedacht und kann zu einem falschen MCMT-Gate führen, wenn der Name einer bekannten Operation verwendet wird. Nach der Abschaffung wird die Eigenschaft label nicht mehr benutzerdefiniert sein. Sie können jedoch den generierten Namen des kontrollierten Ziels über

    MCMT.data[0][0].base_gate.name
  • Die Methode subgraph() der Klasse CouplingMap klasse ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollte die reduce() methode verwendet werden, die dasselbe tut, außer dass sie die Reihenfolge der Knotenlisten für die Ausgabe beibehält CouplingMap beibehält (während subgraph() die Listenreihenfolge nicht beibehalten hat).

  • Das Erstellen einer Instanz von InstructionSet mit dem Schlüsselwortargument circuit_cregs ist veraltet. Im Allgemeinen müssen diese Klassen nie von den Benutzern konstruiert werden (sondern werden intern verwendet), aber wenn Sie es doch tun müssen, sollten Sie einen Callable als Argument für das Schlüsselwort resource_requester übergeben. Zum Beispiel:

    from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet
    from qiskit.circuit.exceptions import CircuitError
    
    def my_requester(bits, registers):
        bits_set = set(bits)
        bits_flat = tuple(bits)
        registers_set = set(registers)
    
        def requester(specifier):
            if isinstance(specifer, Clbit) and specifier in bits_set:
                return specifier
            if isinstance(specifer, ClassicalRegster) and specifier in register_set:
                return specifier
            if isinstance(specifier, int) and 0 <= specifier < len(bits_flat):
                return bits_flat[specifier]
            raise CircuitError(f"Unknown resource: {specifier}")
    
        return requester
    
    my_bits = [Clbit() for _ in [None]*5]
    my_registers = [ClassicalRegister(n) for n in range(3)]
    
    InstructionSet(resource_requester=my_requester(my_bits, my_registers))
  • Die Verwendung der Messabschwächungsklassen qiskit.ignis.mitigation.CompleteMeasFitter und qiskit.ignis.mitigation.TensoredMeasFitter von qiskit-ignis als Werte für den measurement_error_mitigation_cls kwarg des Konstruktors für die QuantumInstance klasse ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen werden die entsprechenden Klassen von qiskit.utils.mitigation, CompleteMeasFitter und TensoredMeasFitter verwendet werden. Dies war notwendig, da das Projekt qiskit-ignis nun veraltet ist und in naher Zukunft nicht mehr unterstützt wird. Es ist erwähnenswert, dass im Gegensatz zu den entsprechenden Klassen von qiskit-ignis die Versionen von qiskit.utils.mitigation nur in ihrer Verwendung mit QuantumInstance (d.h. als Klasse und nicht als Instanz mit dem measurement_error_mitigation_cls kwarg) und nicht für die eigenständige Verwendung gedacht sind.

  • Die Methode Optimizer.optimize() für alle Optimierer (Optimizer und abgeleitete Klassen) ist jetzt veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollte die Optimizer.minimize() methode verwendet werden, die die Signatur der Funktion SciPy’s minimize() nachahmt.

    Um den aktuellen Aufruf von optimize durch minimize zu ersetzen, können Sie

    xopt, fopt, nfev = optimizer.optimize(
        num_vars,
        objective_function,
        gradient_function,
        variable_bounds,
        initial_point,
    )

    mit

    result = optimizer.minimize(
        fun=objective_function,
        x0=initial_point,
        jac=gradient_function,
        bounds=variable_bounds,
    )
    xopt, fopt, nfev = result.x, result.fun, result.nfev
  • Beim Import des Moduls qiskit.util wird nun eine DeprecationWarning ausgegeben. Die Benutzer sollten stattdessen die gleiche Funktionalität aus qiskit.utils. Das Modul util ist seit Terra 0.17 veraltet, hat aber bisher keine Warnung ausgegeben. Sie wird in Terra 0.20 entfernt.

  • Die Eigenschaft table ist veraltet und wird in einer zukünftigen Version entfernt werden. Der Grund dafür ist, dass SparsePauliOp aktualisiert wurde, um intern PauliList anstelle von PauliTable zu verwenden. Damit soll die Leistung deutlich verbessert werden. Sie sollten nun auf die PauliList daten zugreifen, indem Sie das SparsePauliOp.paulis attribut zugreifen.

Fehlerkorrekturen

  • Ein Fehler wurde behoben, bei dem viele Layout-Methoden 3 oder mehr Qubit-Gatter ignorierten, was zu unerwarteten Layout-Zuordnungsentscheidungen führte. Der Transpilerdurchlauf Unroll3qOrMore wird nun in allen voreingestellten Pass-Managern vor dem Layout-Pass ausgeführt, wenn transpile() aufgerufen wird. Behoben #7156.

  • Zerlegte Schaltkreise erben nun die Kalibrierungen von zusammengebauten QasmQobj und Experimenten. Behebt #5348.

  • Das Setzen der Attribute ansatz oder optimizer einer VQE instanz auf None führte zu einem fehlerhaften Verhalten. Siehe #7093 für weitere Einzelheiten.

  • Behobener Zusatz von PauliLists mit qargs. Die Methode, die verwendet wurde, um einen Laufzeitfehler auszulösen, wenn die Operanden eine unterschiedliche Anzahl von Qubits hatten.

  • Es wurde ein Problem behoben, das einen Fehler verursachte, wenn versucht wurde, einen Gradienten mit der CircuitGradient klasse für ein Tor zu berechnen, das nicht unterstützt wurde. Dieser Bugfix transponiert ein gegebenes Gatter in die Menge der unterstützten Gatter für eine angeforderte Gradientenmethode. Behebt #6918.

  • Entfernte Kalibrierungsergebnisse bei Verwendung der Fehlerminderung mit der execute() methode von QuantumInstance. Behebt #7129.

  • Eine Warnung bezüglich der Veralterung wurde behoben, die bei der Ausführung von QuantumCircuit.draw() oder circuit_drawer() mit installiertem Sympy 1.9 ausgegeben wurde, wobei die Sympy-Funktion expr_free_symbols() erwähnt wurde. Die Schaltkreiszeichner haben diese Methode bereits bei der Suche nach symbolischen Konstanten angewandt.

  • Es wurde ein Problem behoben, bei dem die ax kwarg und die figwidth Option in der style kwarg für die mpl Schaltkreisschublade nicht richtig skaliert wurden. Benutzer können nun ein ax aus einer Matplotlib Teilfläche an die mpl Schaltkreisschublade übergeben und der Schaltkreis wird innerhalb der Grenzen dieser Teilfläche gezeichnet. Alternativ können Benutzer die figwidth in Zoll im style dict kwarg einstellen und die Zeichnung wird auf die eingestellte Breite in Zoll skaliert. Behoben #6367.

  • Es wurde ein Problem mit der circuit_drawer() funktion und draw() methode von QuantumCircuit. Bei der Anzeige eines measure -Befehls, der auf ein klassisches Bit anstelle eines Registers abzielt und die Option latex drawer verwendet, schlägt die Schublade fehl.

  • Es wurde ein Problem mit der circuit_drawer() funktion und draw() methode von QuantumCircuit. Wenn bei einer der drei Schubladenoptionen mpl, latex oder text ein Gatter mit einer klassischen Bedingung auftritt, die auf ein klassisches Bit ohne Register konditioniert ist, würde die Schublade fehlschlagen.

  • Es wurde ein Problem mit der circuit_drawer() funktion und draw() methode von QuantumCircuit. Wenn bei einer der drei Schubladenoptionen mpl, latex oder text ein Gatter mit einer klassischen Bedingung auf dasselbe klassische Bit wie ein measure konditioniert wird und das Bit, auf das die Maßnahme abzielt, kein Register hat, würde die Schublade fehlschlagen.

  • C3SXGate hat nun eine korrekte Zerlegung und Matrixdarstellung. Zuvor war es gleichbedeutend mit SdgXGate().control(3) und nicht wie vorgesehen mit SXGate().control(3).

  • Das Mitglied name von qiskit.test.mock.utils.ConfigurableFakeBackend wurde in backend_name geändert. Dies wurde getan, um einen Konflikt mit der name() methode, die von der übergeordneten abstrakten BackendV1 klasse. Dies macht ConfigurableFakeBackend kompatibel mit allem, was ein BackendV1 objekt erwartet. Wenn Sie jedoch zuvor das Attribut name direkt verwendet haben, müssen Sie es nun entweder als Methode aufrufen oder stattdessen auf das Attribut backend_name zugreifen.

  • Ein Problem wurde behoben, bei dem der Aufruf von QuantumCircuit.decompose() auf einem Schaltkreis, der eine Instruction dessen definition attribut leer war, die Anweisung an Ort und Stelle ließ, anstatt sie in Nulloperationen zu zerlegen. Zum Beispiel mit einer Schaltung:

    from qiskit.circuit import QuantumCircuit
    empty = QuantumCircuit(1, name="decompose me!")
    circuit = QuantumCircuit(1)
    circuit.append(empty.to_gate(), [0])

    Zuvor hatte der Aufruf von circuit.decompose() die Schaltung nicht verändert. Nun wird die Zerlegung empty korrekt in Null-Befehle zerlegt. Siehe #6997 für weitere Informationen.

  • Es wurde ein Problem mit der circuit_drawer() funktion und draw() methode von QuantumCircuit. Bei der Anzeige einer measure -Anweisung, die eine klassische condition -Anweisung mit den Optionen mpl oder latex enthält, überschrieb die condition -Information manchmal die measure -Anzeige.

  • Es wurde ein Problem mit der circuit_drawer() funktion und draw() methode von QuantumCircuit. In der Schublade mpl wird der Wert condition in Hexadezimalschreibweise angezeigt, während in den Schubladen text und latex die Dezimalschreibweise verwendet wird. Alle drei Schubladen verwenden nun die Hexadezimalschreibweise.

  • Es wurde ein Fehler im Hoare-Optimierungsdurchlauf behoben, bei dem versucht werden konnte, ein Gatter zweimal zu entfernen, wenn es sowohl mit seinem Vorgänger als auch mit seinem Nachfolger getrennt kombiniert werden konnte, um die Identität zu bilden. Siehe #7271 für weitere Einzelheiten.

  • Die Bedingung einer Anweisung mit der Standard InstructionSet.c_if() methode mit ganzzahligen Indizes ist jetzt mit dem Nummerierungsschema der QuantumCircuit verwendet wird, zu dem die Anweisungen gehören. Zuvor war es so, dass bei zwei ClassicalRegisters mit überlappenden Clbits gab, war die Nummerierung falsch. Siehe #7246 für weitere Einzelheiten.

  • Die Konditionierung einer Anweisung mit der Standard InstructionSet.c_if() methode wird nun erfolgreich sein, auch wenn es keine ClassicalRegisters in der Schaltung gibt. Siehe #7250 für weitere Einzelheiten.

  • Konditionierung einer Anweisung mit der Standard InstructionSet.c_if() methode bei Verwendung einer Clbit die in einem Register ClassicalRegister der Größe eins enthalten ist, wird nun korrekt eine Bedingung für das Bit und nicht für das Register erstellt. Siehe #7255 für weitere Einzelheiten.

  • Der Versuch, eine Anweisung mit der Standard InstructionSet.c_if() methode eine Anweisung zu konditionieren, wird nun korrekt ein Fehler ausgelöst, wenn die klassische Ressource nicht in der Schaltung vorhanden ist. Siehe #7255 für weitere Einzelheiten.

  • Ein Kompatibilitätsproblem mit Matplotlib 3.5 wurde behoben, bei dem die Bloch-Kugel nicht gerendert werden konnte, wenn sie mit Vektoren versehen war, z. B. durch die Verwendung von plot_bloch_vector. Siehe #7272 für weitere Einzelheiten.

  • Ein Problem wurde behoben, bei dem die NLocal.add_layer() methode fälschlicherweise Ebenen anfügte, wenn das NLocal objekt bereits erstellt worden war.

  • Es wurde ein Problem mit dem Pickling InstructionScheduleMap objekt bei Verwendung von Python 3.6. Siehe #6944 für weitere Informationen.

  • Die Zuweisung von komplexwertigen Pulsparametern mit symengine wurde korrigiert. Beispiel:

    from qiskit import circuit, pulse
    import numpy as np
    
    amp = circuit.Parameter("amp")
    phase = circuit.Parameter("phase")
    
    with pulse.build() as sched:
        pulse.play(pulse.Gaussian(160, amp * np.exp(1j * phase), 40), pulse.DriveChannel(0))
    sched.assign_parameters({amp: 0.1, phase: 1.57}, inplace=True)

    Die zugewiesene Amplitude wurde als ParameterExpression(0.1*exp(1.57*I)) angezeigt, nachdem die Verwendung von symengine in der Version 0.18.0 eingeführt worden war. Diese wird nun korrekt ausgewertet und als 7.96327e-05 + 0.0999999683j angezeigt.

  • Ein Problem wurde behoben, bei dem QAOA.construct_circuit() mit verschiedenen Operatoren bei gleicher Anzahl von Qubits jedes Mal den gleichen Schaltkreis erzeugte. Siehe #7223 für weitere Einzelheiten.

  • Ein Problem wurde behoben, bei dem QAOAAnsatz eine falsche Anzahl von Parametern hatte, wenn Identitäten von PauliSumOp angegeben wurden, z.B. PauliSumOp.from_list([("III", 1)]). Siehe #7225 für weitere Einzelheiten.

  • Ein Fehler wurde behoben, bei dem die QuantumCircuit.qasm() methode OpenQASM 2 Anweisungen mit ungültigen Bezeichnern zurückgeben konnte. Der gleiche Fehler wurde für UnitaryGate behoben.

  • Es wurde ein Problem behoben, bei dem der Versuch, registerlose Bits anzuzeigen, zu einem Ausfall der mpl und der latex Schaltkreisschubladen führte. Ein führendes _ wurde aus der Anzeige der Nummern der registerlosen Bits in der text Schublade entfernt. Behoben #6732.

  • Bei Ein-Bit-Registern zeigen alle Schaltkreisschubladen nur noch den Registernamen und nicht mehr den Index 0 an. Behoben #5784.

  • Benennungskollisionen von impliziten Registern in QuantumCircuit.qasm beim Umgang mit registerlosen Qubits und Clbits. Zuvor wurden die registerlosen Qubits und Clbits in die entsprechenden qreg und creg eingetragen, die beide regless heißen, trotz der Kollision. Sie haben nun separate, deterministisch generierte Namen, die nicht mit benutzerdefinierten Registernamen in der Schaltung kollidieren.

  • Es wurde ein Problem bei der Planung von Schaltkreisen mit Clbits-Operationen behoben, z. B. Messungen, bedingte Gatter, Aktualisierungen ASAPSchedule, ALAPSchedule, und AlignMeasures. Die aktualisierten Scheduler gehen davon aus, dass alle clbits E/A-Operationen keine Zeit in Anspruch nehmen, measure schreibt den gemessenen Wert am Ende in ein clbit, und c_if liest den bedingten Wert in clbit(s) am Anfang. Behoben #7006.

  • Der Aufruf von transpile auf eine leere Liste wird nun korrekt eine leere Liste zurückgeben, ohne eine Warnung auszugeben. Behoben #7287.

  • Ein Problem wurde behoben in PiecewiseChebyshev wenn die zu approximierende Funktion konstant war. In diesen Fällen sollten Sie nun die Konstante direkt als f_x Argument übergeben, anstatt eine Funktion zu verwenden, wie z.B.:

    from qiskit.circuit.library.arithmetic import PiecewiseChebyshev
    
    PiecewiseChebyshev(1.0, degree=3)

    Siehe #6707 für weitere Einzelheiten.

  • Wenn eine HHL Algorithmus-Instanz ohne ein QuantumInstance (der Standard) erstellt wurde, würden Versuche, die Getter- und Setter-Eigenschaften zu verwenden, um eine Instanz später zu lesen oder zu setzen, fehlschlagen. Die Getter und Setter funktionieren jetzt wie erwartet.

  • Die Methode QuantumCircuit.qasm() methode bearbeitet nun die Namen der Kopien der Anweisungen, die in der Schaltung vorhanden sind, und nicht die Originalanweisungen, die sich in circuit.data befinden. Siehe #6952 für weitere Einzelheiten.

  • Ein Fehler wurde behoben in PauliSumOp.permute() der den Fehler verursachte:

    QiskitError: 'Pauli string label "" is not valid.'

    wenn die Permutation die gleiche Anzahl von Pauli-Termen hätte. Der Aufruf von permute([2, 1, 0]) auf X ^ Y ^ Z führt nicht mehr zu einem Fehler, sondern gibt jetzt Z ^ Y ^ X zurück.

  • Es wurde ein Fehler behoben, bei dem die Parametergrenzen für die Mixerparameter in der QAOAAnsatz nicht gesetzt wurden.

  • Feste Bestimmung der endgültigen Operationen (Barrieren und Maßnahmen) im Durchgang RemoveFinalMeasurements und in der Methode remove_final_measurements() der Klasse QuantumCircuit die bisher nur Knoten berücksichtigte, die unmittelbar vor einem Ausgangsknoten liegen.

  • Feste Bestimmung der endgültigen Operationen im Durchlauf RemoveFinalMeasurements und in der Methode remove_final_measurements() der Klasse QuantumCircuit die fälschlicherweise eine Barriere als endgültig betrachten konnte, auch wenn andere Schaltkreisoperationen darauf folgten.

  • Entfernung von klassischen Mehrbit-Registern im Durchgang behoben RemoveFinalMeasurements und in der Methode remove_final_measurements() der Klasse QuantumCircuit wo klassische Register nicht entfernt wurden, selbst wenn andere Bits im Leerlauf waren, es sei denn, eine abschließende Messung wurde in jedem einzelnen Bit durchgeführt. Jetzt werden klassische Register, die durch das Entfernen von Endmessungen und Schranken frei werden, immer entfernt. Klassische Bits werden entfernt, wenn sie nur von entfernten Registern referenziert werden oder überhaupt nicht referenziert sind und durch die Entfernung inaktiv wurden. Diese Korrektur fügt auch eine korrekte Handhabung von Registern mit gemeinsamen zugrunde liegenden Bits hinzu.

  • Es wurde ein Problem mit RemoveFinalMeasurements das dazu führen konnte, dass die resultierende DAGCircuit ungültig werden konnte. Siehe #7196 für weitere Einzelheiten.

  • Ein Problem mit der Methode remove_final_measurements() der Klasse QuantumCircuit die dazu führte, dass QuantumCircuit.clbits nach dem Aufruf nicht korrekt war. Siehe #7089 für Einzelheiten.

  • Beim Verjüngen eines leeren Null-Operators in qiskit.opflowwurde eine Warnung ausgegeben und der ursprüngliche Operator zurückgegeben, als der Code feststellte, dass es sich um eine Null handelt. Solche Operatoren werden häufig in den Hilfsoperatoren gefunden, wenn Qiskit Nature verwendet wird, und das obige Verhalten führte dazu, dass VQE eine Ausnahme auslöste, da die verjüngten Nicht-Null-Operatoren eine andere Anzahl von Qubits hatten als die verjüngten Null-Operatoren (da Taper den Eingabeoperator unverändert zurückgegeben hat). Der Code wird nun einen Null-Operator korrekt verjüngen, so dass die Anzahl der Qubits wie erwartet reduziert wird und mit verjüngten Nicht-Null-Operatoren übereinstimmt, z.B. wird `0*"IIII"` , wenn wir um 3 Qubits verjüngen, zu 0*"I".

  • Es wurde ein Problem mit der draw() methode und circuit_drawer() funktion, wo ein benutzerdefinierter Stil, der über die Benutzerkonfigurationsdatei (d.h. settings.conf) würde den gesetzten Wert des Feldes circuit_mpl_style ignorieren, wenn der style kwarg für die Funktion/Methode nicht gesetzt war.

Sonstige Anmerkungen

  • Der String-Cast für qiskit.circuit.ParameterExpression hat nicht mehr die volle Präzision. Dadurch wird das Ende von 0s beim Drucken von Parametern, die an Floats gebunden sind, entfernt. Dies hat Folgen für die QASM-Serialisierung und die Schaltkreistextschublade:

    >>> from qiskit.circuit import Parameter
    >>> x = Parameter('x')
    >>> str(x.bind({x:0.5}))
    '0.5'   # instead of '0.500000000000000'
  • Die QAOAAnsatz wurde aktualisiert, um das Parametersymbol γ für den Kostenoperator und β für den Mixeroperator zu verwenden, wie es der Standardnotation in der QAOA-Literatur entspricht.

Aer- 0.9.1

Keine Änderung

Ignis- 0.7.0

Vorspiel

Mit dieser Version wird das Qiskit Ignis Projekt veraltet, es wurde durch das Qiskit Experiments Projekt ersetzt und die aktive Entwicklung wurde eingestellt. Kritische Fehler- und Kompatibilitätskorrekturen werden weiterhin durchgeführt, um den Nutzern die Möglichkeit zu geben, von Ignis zu migrieren, auch wenn es veraltet ist. Nach Ablauf der Abschreibungsfrist (die nicht kürzer als 3 Monate nach dieser Veröffentlichung sein wird) wird das Projekt eingestellt und archiviert.

Neue Funktionen

  • Aktualisierung des Akkreditierungsprotokolls zur Verwendung der Anpassungsroutine von https://arxiv.org/abs/2103.06603. AccreditationFitter hat jetzt die Methoden FullAccreditation (früheres Protokoll) und MeanAccreditation (neues Protokoll). Außerdem wurde die Dateneingabe so geändert, dass entweder das Ergebnisobjekt AppendResult oder eine Liste von Strings AppendStrings verwendet wird. qiskit.ignis.verification.QOTPCorrectString() wurde ebenfalls hinzugefügt.

  • Hinzufügen der Option für die schnelle analytische Erstellung von Syndromdiagrammen. RepetitionCode hat jetzt ein neues bool-Argument brute, das es erlaubt, die Brute-Force-Methode weiterhin zu verwenden. Hilfsklasse RepetitionCodeSyndromeGenerator hinzugefügt, um dies zu erleichtern.

  • RepetitionCode hat jetzt Schlüsselwortargumente resets und delay. Ersteres bestimmt, ob nach der Messung Reset-Gates eingefügt werden. Letzteres ermöglicht es, eine Zeit (in dt) für eine Verzögerung nach jeder Messung (und ggf. Rückstellung) festzulegen.

    Die Methode syndrome_measurement() von RepetitionCode hat jetzt Schlüsselwortargumente final und delay. Ersteres bestimmt, ob Rücksetzgatter gemäß der globalen resets hinzugefügt werden sollen oder ob sie mit einem geeigneten Verhalten für die letzte Runde der Syndrommessungen überschrieben werden sollen. Letzteres ermöglicht es, eine Zeit (in dt) für eine Verzögerung nach jeder Messung (und ggf. Rückstellung) festzulegen.

  • Die Klasse RepetitionCode unterstützt nun die Kodierung mit x Basiszuständen. Dies kann verwendet werden, indem bei der Erstellung eines RepetitionCode -Objekts das Schlüsselwortargument xbasis gesetzt wird.

Anmerkungen zu Upgrades

  • Das Schlüsselwortargument reset wurde aus der Methode syndrome_measurement() von RepetitionCode entfernt. Dieses wird durch das globale Schlüsselwortargument resets für die Klasse sowie das Schlüsselwortargument final für syndrome_measurement ersetzt. In den Fällen, in denen man bisher die letzte Messrunde mit reset=False hinzugefügt hat, um die letzten Rücksetzgatter zu vermeiden, sollte man jetzt final=True verwenden.

  • Entfernen Sie ParametrizedSchedule von update_u_gates().

    ParametrizedSchedule wurde als Teil von Qiskit-terra 0.17.0 veraltet und wird in der nächsten Version entfernt werden. Die Funktion aktualisiert jetzt u gates mit Schedule Programmen, die nicht zugewiesene Parameter Objekte beinhalten.

Hinweise zu veralteten Versionen

  • Veraltete Methoden in AccreditationFitter , nämlich bound_variation_distance und single_protocol_run

  • Das Qiskit Ignis Projekt als Ganzes ist veraltet und wird in Zukunft eingestellt und archiviert werden. Obwohl veraltet, werden nur Kompatibilitätskorrekturen und Korrekturen von kritischen Fehlern in das Projekt aufgenommen. Anstatt Qiskit Ignis zu verwenden, sollten Sie auf Qiskit Experiments umsteigen. Sie können sich auf den Migrationsleitfaden beziehen:

    https://github.com/qiskit-community/qiskit-ignis#migration-guide

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