Skip to main content
IBM Quantum Platform

Qiskit 0.28 Versionshinweise


0.28.0

Terra- 0.18.0

Vorspiel

Diese Version enthält viele neue Funktionen und Fehlerkorrekturen. Die Highlights dieser Version sind die Einführung von zwei neuen Transpilerpässen, BIPMapping und DynamicalDecoupling, die in Kombination mit dem neuen pulse_optimize kwarg auf dem UnitarySynthesis passes die Wiederherstellung der Ergebnisse von Quantum Volume 64 unter Verwendung der in beschrieben Techniken ermöglicht: https://arxiv.org/abs/2008.08571. Diese neuen Transpiler-Passagen und -Optionen sind auch allgemein für die Optimierung jeder Schaltung anwendbar.

Neue Funktionen

  • Der measurement_error_mitgation kwarg für den QuantumInstance konstruktor kann nun auf die Klasse TensoredMeasFitter von qiskit-ignis gesetzt werden, zusätzlich zu CompleteMeasFitter , das bereits unterstützt wurde. Wenn Sie TensoredMeasFitter verwenden, können Sie auch den neuen mit_pattern kwarg setzen, um die Qubits zu spezifizieren, für die TensoredMeasFitter verwendet werden soll. Das erwartete Format finden Sie in der Dokumentation für mit_pattern in der Dokumentation für TensoredMeasFitter .

  • Die Zerlegungsmethoden für Ein-Qubit-Gatter, spezifiziert durch den basis kwarg, in OneQubitEulerDecomposer wurde um die Basis 'ZSXX' erweitert, um sowohl das direkte XX -Gatter als auch das X\sqrt{X} -Gatter nutzen zu können.

  • Zwei neue Pässe hinzugefügt AlignMeasures und ValidatePulseGates zu dem qiskit.transpiler.passes modul. Bei diesen Durchläufen handelt es sich um eine hardwarenahe Optimierung und eine Validierungsroutine, die zur Verwaltung von Ausrichtungsbeschränkungen bei der zeitlichen Zuordnung von Anweisungen für ein Backend verwendet werden.

    Wenn ein Backend eine Beschränkung für die Ausrichtung von Measure Anweisungen hat (in Bezug auf die zeitliche Quantisierung), wird der AlignMeasures pass verwendet, um Verzögerungen in einer geplanten Schaltung anzupassen, um sicherzustellen, dass alle Measure Anweisungen in der Schaltung unter Berücksichtigung der Beschränkungen des Backends ausgerichtet sind. Der ValidatePulseGates pass wird verwendet, um zu prüfen, ob benutzerdefinierte Impulsgatter (Gatter, die eine benutzerdefinierte Impulsdefinition im calibrations attribut eines QuantumCircuit objekts) angesichts einer Ausrichtungsbeschränkung für das Ziel-Backend gültig sind.

    In der eingebauten preset_passmangers , die von der Funktion transpile() funktion werden diese Übergänge automatisch ausgelöst, wenn die Ausrichtungsbeschränkung, entweder über den speziellen timing_constraints kwarg auf transpile() oder über ein timing_constraints Attribut in dem BackendConfiguration objekt des angepeilten Backends hat.

    Die Backends von IBM Quantum Services (zugänglich über das Paket qiskit-ibmq-provider ) werden in naher Zukunft die Alignment-Informationen bereitstellen.

    Zum Beispiel:

    from qiskit import circuit, transpile
    from qiskit.test.mock import FakeArmonk
    
    backend = FakeArmonk()
    
    qc = circuit.QuantumCircuit(1, 1)
    qc.x(0)
    qc.delay(110, 0, unit="dt")
    qc.measure(0, 0)
    qc.draw('mpl')
    qct = transpile(qc, backend, scheduling_method='alap',
                    timing_constraints={'acquire_alignment': 16})
    qct.draw('mpl')
  • Eine neue Transpiler-Pass-Klasse qiskit.transpiler.passes.BIPMapping , die versucht, das beste Layout und Routing auf einmal zu finden, indem sie ein BIP-Problem (binäre ganzzahlige Programmierung) löst, wie es in arXiv:2106.06446 beschrieben, wurde hinzugefügt.

    Der Durchgang BIPMapping (der Name "mapping" bezieht sich auf "Layout und Routing") stellt das Mapping-Problem als BIP-Problem (binäre ganzzahlige Programmierung) dar und stützt sich auf CPLEX (cplex) zur Lösung des BIP-Problems. Die abhängigen Bibliotheken einschließlich CPLEX können zusammen mit qiskit-terra installiert werden:

    pip install qiskit-terra[bip-mapper]

    Da die kostenlose Version von CPLEX nur kleine BIP-Probleme lösen kann, d. h. die Abbildung von Schaltkreisen mit weniger als etwa 5 Qubits, wird für die Abbildung größerer Schaltkreise möglicherweise die kostenpflichtige Version von CPLEX benötigt.

    Der BIP-Mapper skaliert schlecht in Bezug auf die Anzahl der Qubits oder Gatter. Beispielsweise funktioniert coupling_map nicht mit mehr als 10 Qubits, weil der BIP-Solver (CPLEX) keine Lösung innerhalb der Standardzeit findet.

    Beachten Sie, dass Sie, wenn Sie physische Qubits festlegen wollen, die in der Abbildung verwendet werden sollen (z. B. bei der Ausführung von Quantum Volume (QV)-Schaltungen), coupling_map angeben müssen, die nur die zu verwendenden Qubits enthält.

    Hier ist ein minimaler Beispielcode zur Erstellung eines Passmanagers, um einen QV-Schaltkreis zu transpilieren:

    num_qubits = 4  # QV16
    circ = QuantumVolume(num_qubits=num_qubits)
    
    backend = ...
    basis_gates = backend.configuration().basis_gates
    coupling_map = CouplingMap.from_line(num_qubits)  # supply your own coupling map
    
    def _not_mapped(property_set):
        return not property_set["is_swap_mapped"]
    
    def _opt_control(property_set):
        return not property_set["depth_fixed_point"]
    
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    pm = PassManager()
    # preparation
    pm.append([
        Unroll3qOrMore(),
        TrivialLayout(coupling_map),
        FullAncillaAllocation(coupling_map),
        EnlargeWithAncilla(),
        BarrierBeforeFinalMeasurements()
    ])
    # mapping
    pm.append(BIPMapping(coupling_map))
    pm.append(CheckMap(coupling_map))
    pm.append(Error(msg="BIP mapper failed to map", action="raise"),
              condition=_not_mapped)
    # post optimization
    pm.append([
        Depth(),
        FixedPoint("depth"),
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=basis_gates),
        UnitarySynthesis(basis_gates),
        Optimize1qGatesDecomposition(basis_gates),
        CommutativeCancellation(),
        UnrollCustomDefinitions(sel, basis_gates),
        BasisTranslator(sel, basis_gates)
    ], do_while=_opt_control)
    
    transpile_circ = pm.run(circ)
  • Eine neue Konstruktormethode initialize_from() wurde zu der Schedule und ScheduleBlock klassen hinzugefügt. Diese Methode initialisiert einen neuen leeren Zeitplan, der die Attribute von anderen Zeitplänen übernimmt. Zum Beispiel:

    sched = Schedule(name='my_sched')
    new_sched = Schedule.initialize_from(sched)
    
    assert sched.name == new_sched.name
  • Der Funktion wurde ein neuer kwarg, line_discipline, hinzugefügt job_monitor() funktion hinzugefügt. Mit diesem kwarg können die in der Ausgabe von job_monitor verwendeten Wagenrücklaufzeichen geändert werden. Der line_discipline kwarg ist standardmäßig auf '\r' eingestellt, was auch vorher verwendet wurde.

  • Die abstrakte Klasse Pulse (die die übergeordnete Klasse für Klassen wie Waveform, Constant, und Gaussian hat jetzt einen neuen kwarg auf den Konstruktor, limit_amplitude, der auf False gesetzt werden kann, um die zuvor fest kodierte Amplitudengrenze von 1 zu deaktivieren. Dies kann auch direkt als Klassenattribut gesetzt werden, um den globalen Standard für eine Pulse-Klasse zu ändern. Zum Beispiel:

    from qiskit.pulse.library import Waveform
    
    # Change the default value of limit_amplitude to False
    Waveform.limit_amplitude = False
    wave = Waveform(2.0 * np.exp(1j * 2 * np.pi * np.linspace(0, 1, 1000)))
  • Eine neue Klasse, PauliListwurde dem Modul qiskit.quantum_info modul hinzugefügt. Diese Klasse dient der effizienten Darstellung einer Liste von Pauli operatoren. Diese neue Klasse stammt von derselben übergeordneten Klasse ab wie die bestehende PauliTable (und kann daher größtenteils austauschbar verwendet werden), sie unterscheidet sich jedoch von der PauliTable , da die qiskit.quantum_info.PauliList klasse Z4 Phasen behandeln kann.

  • Ein neuer Transpiler-Pass wurde hinzugefügt, RemoveBarriers, zu qiskit.transpiler.passes. Dieser Durchgang wird verwendet, um alle Hindernisse in einem Stromkreis zu beseitigen.

  • Fügen Sie eine neue Optimiererklasse hinzu, SciPyOptimizerzu dem qiskit.algorithms.optimizers modul hinzu. Diese Klasse ist eine einfache Wrapper-Klasse der Funktion scipy.optimize.minimize (Dokumentation ), die die Verwendung aller Optimierungslöser und aller Parameter (z.B. Callback) ermöglicht, die von scipy.optimize.minimize unterstützt werden. Zum Beispiel:

    from qiskit.algorithms.optimizers import SciPyOptimizer
    
    values = []
    
    def callback(x):
        values.append(x)
    
    optimizer = SciPyOptimizer("BFGS", options={"maxiter": 1000}, callback=callback)
  • Der HoareOptimizer pass wurde verbessert, so dass er nun ein ControlledGate in einer Schaltung mit dem Basisgatter ersetzen kann, wenn sich alle Kontrollqubits im Zustand ∣1⟩|1\rangle befinden.

  • Zwei neue Methoden hinzugefügt, is_successor() und is_predecessor()zu der DAGCircuit klasse. Diese Funktionen werden verwendet, um zu prüfen, ob ein Knoten entweder ein Nachfolger oder ein Vorgänger eines anderen Knotens auf der DAGCircuit.

  • Ein neuer Transpiler-Pass, RZXCalibrationBuilderNoEchowurde dem qiskit.transpiler.passes modul hinzugefügt. Dieser Durchgang ähnelt dem bestehenden RZXCalibrationBuilder insofern, als dass er Kalibrierungen für eine RZXGate(theta) erstellt, jedoch RZXCalibrationBuilderNoEcho tut dies jedoch, ohne die Echoimpulse in den Impulsplan einzufügen. Dies ermöglicht es, das Echo in der Kreuzresonanzsequenz als Gatter darzustellen, so dass der Transpiler sie vereinfachen kann. Der RZXCalibrationBuilderNoEcho pass unterstützt nur die hardware-native Richtung der CXGate.

  • Ein neuer kwarg, wrap, wurde der compose() methode von QuantumCircuit. Auf diese Weise kann ausgewählt werden, ob zusammengesetzte Schaltungen in eine Anweisung eingeschlossen werden sollen oder nicht. Standardmäßig ist dies False, d.h. kein Umbruch. Zum Beispiel:

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.h([0, 1])
    other = QuantumCircuit(2)
    other.x([0, 1])
    print(circuit.compose(other, wrap=True))  # wrapped
    print(circuit.compose(other, wrap=False))  # not wrapped
  • Ein neues Attribut, control_channelswurde der Klasse PulseBackendConfiguration klasse hinzugefügt. Dieses Attribut stellt die Kontrollkanäle auf einem Backend als eine Abbildung von Qubits auf eine Liste von ControlChannel objekten.

  • Dem Konstruktor für die Klasse Isometry wurde ein neuer kwarg, epsilon, hinzugefügt und die entsprechende QuantumCircuit methode isometry(). Dieser Warg ermöglicht die optionale Einstellung der Epsilontoleranz, die von einem Isometry Gate verwendet wird. Zum Beispiel:

    import numpy as np
    from qiskit import QuantumRegister, QuantumCircuit
    
    tolerance = 1e-8
    iso = np.eye(2,2)
    num_q_output = int(np.log2(iso.shape[0]))
    num_q_input = int(np.log2(iso.shape[1]))
    q = QuantumRegister(num_q_output)
    qc = QuantumCircuit(q)
    
    qc.isometry(iso, q[:num_q_input], q[num_q_input:], epsilon=tolerance)
  • Ein Transpiler-Pass wurde hinzugefügt, DynamicalDecouplingzu qiskit.transpiler.passes zum Einfügen von dynamischen Entkopplungssequenzen in Leerlaufperioden eines Schaltkreises (nach Zuordnung zu physischen Qubits und Scheduling). Der Durchlauf ermöglicht die Kontrolle über die Reihenfolge der DD-Gates, den Abstand zwischen ihnen und die Qubits, auf die sie angewendet werden. Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import XGate
    from qiskit.transpiler import PassManager, InstructionDurations
    from qiskit.transpiler.passes import ALAPSchedule, DynamicalDecoupling
    from qiskit.visualization import timeline_drawer
    
    circ = QuantumCircuit(4)
    circ.h(0)
    circ.cx(0, 1)
    circ.cx(1, 2)
    circ.cx(2, 3)
    circ.measure_all()
    
    durations = InstructionDurations(
        [("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10),
         ("cx", [1, 2], 200), ("cx", [2, 3], 300),
         ("x", None, 50), ("measure", None, 1000)]
    )
    
    dd_sequence = [XGate(), XGate()]
    
    pm = PassManager([ALAPSchedule(durations),
                      DynamicalDecoupling(durations, dd_sequence)])
    circ_dd = pm.run(circ)
    timeline_drawer(circ_dd)
  • Die QuantumCircuit methode qasm() hat einen neuen kwarg, encoding, der verwendet werden kann, um optional die Zeichenkodierung einer von der Funktion erzeugten QASM-Ausgabedatei festzulegen. Dies kann auf jeden gültigen Codec oder Alias-String aus dem Codec-Modul der Standardbibliothek Python gesetzt werden.

  • Eine neue Klasse wurde hinzugefügt, EvolvedOperatorAnsatzzu dem qiskit.circuit.library modul hinzugefügt. Diese Bibliotheksschaltung, die sich zuvor in Qiskit Nature befand, kann verwendet werden, um Ansatzschaltungen zu konstruieren, die aus zeitlich entwickelten Operatoren bestehen, wobei die Evolutionszeit ein Variationsparameter ist. Beispiele für solche Ansatzschaltungen sind die Klasse UCCSD im Modul chemistry von Qiskit Nature oder die QAOAAnsatz klasse.

  • Eine neue Fake-Backend-Klasse ist unter qiskit.test.mock für das ibmq_guadalupe Backend verfügbar. Wie bei den anderen Fake-Backends umfasst dies einen Schnappschuss der 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.

  • Eine neue Methode children() für die Schedule klasse wurde hinzugefügt. Diese Methode wird verwendet, um die untergeordneten Zeitplankomponenten des Schedule objekts als Tupel zurückzugeben. Sie gibt verschachtelte Zeitpläne ohne Verflachung zurück. Diese Methode entspricht der privaten Methode _children() , hat aber eine öffentliche und stabile Schnittstelle.

  • Eine neue Optimiererklasse, GradientDescentwurde dem qiskit.algorithms.optimizers modul hinzugefügt. Diese Optimierungsklasse implementiert einen Standard-Gradientenabstiegs-Optimierungsalgorithmus zur Verwendung mit Quantenvariationsalgorithmen, wie z. B VQE. Eine detaillierte Beschreibung und Beispiele für die Verwendung dieser Klasse finden Sie in der GradientDescent dokumentation der Klasse.

  • Eine neue Optimiererklasse, QNSPSAwurde dem qiskit.algorithms.optimizers modul hinzugefügt. Diese Klasse implementiert den Quantum Natural SPSA (QN-SPSA) Algorithmus, eine Verallgemeinerung des 2-SPSA Algorithmus, und schätzt die Quantum Fisher Information Matrix anstelle der Hessian, um eine stochastische Schätzung des Quantum Natural Gradienten zu erhalten. Beispiele für die Verwendung dieses neuen Optimierers finden Sie in der QNSPSA klassendokumentation.

  • Ein neuer kwarg, second_order, wurde dem Konstruktor der Klasse SPSA klasse im qiskit.algorithms.optimizers modul hinzugefügt. Wenn diese Option auf True gesetzt ist, kann SPSA zweiter Ordnung verwendet werden. SPSA zweiter Ordnung, oder 2-SPSA, ist eine Erweiterung des gewöhnlichen SPSA-Algorithmus, die es ermöglicht, neben dem Gradienten auch die Hessian zu schätzen, die zur Vorkonditionierung des Gradienten vor dem Schritt der Parameteraktualisierung verwendet wird. Als Methode zweiter Ordnung wird damit versucht, die Konvergenz von SPSA zu verbessern. Beispiele für die Verwendung dieser Option finden Sie in der SPSA dokumentation der Klasse.

  • Bei Verwendung des Ausgabemodus latex oder latex_source von circuit_drawer() oder der draw() von QuantumCircuit kann der style kwarg jetzt genauso wie bei der mpl Ausgabeformatierung verwendet werden. Im Gegensatz zum Ausgabemodus mpl wird bei den Ausgabemodi latex und latex_source jedoch nur das Feld displaytext verwendet (da beide keine Farbe unterstützen).

  • Bei Verwendung der Ausgabemethoden mpl oder latex für die circuit_drawer() funktion oder der draw() von QuantumCircuitverwenden, können Sie jetzt die mathematische Formatierung für Text verwenden und die Farbformatierung einstellen (nurmpl ), indem Sie den style kwarg als Diktat mit einem benutzerdefinierten Namen oder Label setzen. Zum Beispiel, um tiefgestellte Zeichen hinzuzufügen und die Farbe eines Gatters zu ändern:

    from qiskit import QuantumCircuit
    from qiskit.circuit.library import HGate
    qc = QuantumCircuit(3)
    qc.append(HGate(label='h1'), [0])
    qc.append(HGate(label='h2'), [1])
    qc.append(HGate(label='h3'), [2])
    qc.draw('mpl', style={'displaytext': {'h1': 'H_1', 'h2': 'H_2', 'h3': 'H_3'},
        'displaycolor': {'h2': ('#EEDD00', '#FF0000')}})
  • Drei neue Klassen hinzugefügt, CDKMRippleCarryAdder, ClassicalAdder und DraperQFTAdder, zum qiskit.circuit.library modul hinzugefügt. Diese neuen Schaltungsklassen werden zur klassischen Addition von zwei gleich großen Qubit-Registern verwendet. Für zwei Register ∣a⟩n|a\rangle_n und ∣b⟩n|b\rangle_n auf nn führen die drei neuen Klassen die Operation aus:

∣a⟩n∣b⟩n↦∣a⟩n∣a+b⟩n+1.|a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b\rangle_{n + 1}.

Zum Beispiel:

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import CDKMRippleCarryAdder
from qiskit.quantum_info import Statevector

# a encodes |01> = 1
a = QuantumCircuit(2)
a.x(0)

# b encodes |10> = 2
b = QuantumCircuit(2)
b.x(1)

# adder on 2-bit numbers
adder = CDKMRippleCarryAdder(2)

# add the state preparations to the front of the circuit
adder.compose(a, [0, 1], inplace=True, front=True)
adder.compose(b, [2, 3], inplace=True, front=True)

# simulate and get the state of all qubits
sv = Statevector(adder)
counts = sv.probabilities_dict()
state = list(counts.keys())[0]  # we only have a single state

# skip the input carry (first bit) and the register |a> (last two bits)
result = state[1:-2]
print(result)  # '011' = 3 = 1 + 2
  • Zwei neue Klassen hinzugefügt, RGQFTMultiplier und HRSCumulativeMultiplierzu dem qiskit.circuit.library modul hinzugefügt. Diese Klassen werden für die klassische Multiplikation zweier gleich großer Qubit-Register verwendet. Für zwei Register ∣a⟩n|a\rangle_n und ∣b⟩n|b\rangle_n auf nn qubits führen die beiden neuen Klassen die Operation
∣a⟩n∣b⟩n∣0⟩2n↦∣a⟩n∣b⟩n∣a⋅b⟩2n.|a\rangle_n |b\rangle_n |0\rangle_{2n} \mapsto |a\rangle_n |b\rangle_n |a \cdot b\rangle_{2n}.

Zum Beispiel:

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import RGQFTMultiplier
from qiskit.quantum_info import Statevector

num_state_qubits = 2

# a encodes |11> = 3
a = QuantumCircuit(num_state_qubits)
a.x(range(num_state_qubits))

# b encodes |11> = 3
b = QuantumCircuit(num_state_qubits)
b.x(range(num_state_qubits))

# multiplier on 2-bit numbers
multiplier = RGQFTMultiplier(num_state_qubits)

# add the state preparations to the front of the circuit
multiplier.compose(a, [0, 1], inplace=True, front=True)
multiplier.compose(b, [2, 3], inplace=True, front=True)

# simulate and get the state of all qubits
sv = Statevector(multiplier)
counts = sv.probabilities_dict(decimals=10)
state = list(counts.keys())[0]  # we only have a single state

# skip both input registers
result = state[:-2*num_state_qubits]
print(result)  # '1001' = 9 = 3 * 3
  • Die Klasse Delay klasse kann nun ein ParameterExpression oder Parameter wert für den duration kwarg auf ihrem Konstruktor und für ihr duration attribut.

    Zum Beispiel:

    idle_dur = Parameter('t')
    qc = QuantumCircuit(1, 1)
    qc.x(0)
    qc.delay(idle_dur, 0, 'us')
    qc.measure(0, 0)
    print(qc)  # parameterized delay in us (micro seconds)
    
    # assign before transpilation
    assigned = qc.assign_parameters({idle_dur: 0.1})
    print(assigned)  # delay in us
    transpiled = transpile(assigned, some_backend_with_dt)
    print(transpiled)  # delay in dt
    
    # assign after transpilation
    transpiled = transpile(qc, some_backend_with_dt)
    print(transpiled)  # parameterized delay in dt
    assigned = transpiled.assign_parameters({idle_dur: 0.1})
    print(assigned)  # delay in dt
  • Es wurde ein neues binäres Serialisierungsformat, QPY, eingeführt. Es ist ein schnelles, binäres Serialisierungsformat, das rückwärtskompatibel ist (QPY-Dateien, die mit älteren Versionen von Qiskit erzeugt wurden, können von neueren Versionen von Qiskit geladen werden) und von Qiskit stammt. Das QPY-Serialisierungs-Tooling ist über das Modul qiskit.circuit.qpy_serialization verfügbar. Zum Beispiel, um eine QPY-Datei zu erzeugen:

    from datetime import datetime
    
    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit import qpy_serialization
    
    qc = QuantumCircuit(
      2, metadata={'created_at': datetime.utcnow().isoformat()}
    )
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    circuits = [qc] * 5
    
    with open('five_bells.qpy', 'wb') as qpy_file:
        qpy_serialization.dump(circuits, qpy_file)

    Anschließend können die fünf in der QPY-Datei gespeicherten Schaltkreise mit geladen werden:

    from qiskit.circuit.qpy_serialization
    
    with open('five_bells.qpy', 'rb') as qpy_file:
        circuits = qpy_serialization.load(qpy_file)

    Die Spezifikation des QPY-Dateiformats finden Sie in der Dokumentation des Moduls.

  • Die TwoQubitBasisDecomposer klasse wurde aktualisiert, um pulsoptimale Zerlegungen für eine Basis mit CX-, √X- und virtuellen Rz-Toren durchzuführen, wie in https://arxiv.org/pdf/2008.08571. Pulsoptimal bedeutet hier, dass die Dauer der Gatter zwischen den CX-Gattern der Zerlegung im Austausch für möglicherweise mehr lokale Gatter vor oder nach allen CX-Gattern reduziert wird, so dass beim Zusammensetzen zu einer Schaltung die Möglichkeit einer Einzel-Qubit-Kompression mit benachbarten Gattern besteht, die die Gesamtdauer der Sequenz reduziert.

    Ein neues Schlüsselwortargument, `pulse_optimize, wurde dem Konstruktor für TwoQubitBasisDecomposer hinzugefügt, um dies zu kontrollieren:

    • None: Versuch der pulsoptimalen Zerlegung. Wenn eine impulsoptimale Zerlegung für die Basis des Zerlegers unbekannt ist, wird ohne Vorwarnung auf die Standardzerlegung zurückgegriffen. Dies ist die Standardeinstellung.
    • True: Versuch der pulsoptimalen Zerlegung. Ist eine impulsoptimale Zerlegung für die Basis des Zerlegers unbekannt, erhöhen Sie QiskitError.
    • False: Versuchen Sie nicht, den Puls optimal zu zersetzen.

    Zum Beispiel:

    from qiskit.quantum_info import TwoQubitBasisDecomposer
    from qiskit.circuit.library import CXGate
    from qiskit.quantum_info import random_unitary
    
    unitary_matrix = random_unitary(4)
    
    decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="ZSX", pulse_optimize=True)
    circuit = decomposer(unitary_matrix)
  • Der Transpiler-Pass UnitarySynthesis , der sich in qiskit.transpiler.passes wurde aktualisiert, um die Durchführung der pulsoptimalen Dekomposition zu unterstützen. Dies geschieht in erster Linie mit dem Schlüsselwortargument pulse_optimize , das dem Konstruktor hinzugefügt wurde und mit dem gesteuert wird, ob eine pulsoptimale Synthese durchgeführt wird. Das Verhalten dieses kwarg spiegelt den pulse_optimize kwarg im TwoQubitBasisDecomposer konstruktor der Klasse. Zusätzlich hat der Konstruktor ein weiteres neues Schlüsselwortargument, synth_gates, mit dem die Liste der Gatternamen angegeben wird, über die eine Synthese versucht werden soll. Wenn None und pulse_optimize gleich False oder None sind, verwenden Sie "unitary". Wenn Keine und pulse_optimize True ist, verwenden Sie "unitary" und "swap". Da die Richtung des CX-Gatters in der Synthese willkürlich ist, wird ein weiteres Schlüsselwortargument, natural_direction, hinzugefügt, um zuerst eine Kopplungskarte und dann CXGate dauer bei der Wahl der CX-Richtung für die Synthese zu berücksichtigen.

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import PassManager, CouplingMap
    from qiskit.transpiler.passes import TrivialLayout, UnitarySynthesis
    from qiskit.test.mock import FakeVigo
    from qiskit.quantum_info.random import random_unitary
    
    backend = FakeVigo()
    conf = backend.configuration()
    coupling_map = CouplingMap(conf.coupling_map)
    triv_layout_pass = TrivialLayout(coupling_map)
    circ = QuantumCircuit(2)
    circ.unitary(random_unitary(4), [0, 1])
    unisynth_pass = UnitarySynthesis(
        basis_gates=conf.basis_gates,
        coupling_map=None,
        backend_props=backend.properties(),
        pulse_optimize=True,
        natural_direction=True,
        synth_gates=['unitary'])
    pm = PassManager([triv_layout_pass, unisynth_pass])
    optimal_circ = pm.run(circ)
  • Eine neue Basisoption, 'XZX', wurde für das Argument basis hinzugefügt OneQubitEulerDecomposer klasse.

  • Es wurde eine neue Methode hinzugefügt, get_instructions()wurde der Klasse QuantumCircuit klasse hinzugefügt. Diese Methode wird verwendet, um alle Instruction objekte im Schaltkreis zurück, die ein name haben, das mit dem angegebenen Argument name übereinstimmt, sowie die zugehörigen Listen qargs und cargs von Qubit und Clbit objekten.

  • Ein neues optionales Extra all wurde dem qiskit-terra Paket hinzugefügt. Dies ermöglicht die Installation aller optionalen Anforderungen mit einem einzigen Extra, zum Beispiel: pip install 'qiskit-terra[all]' zuvor war es notwendig, alle Extras einzeln aufzulisten, um alle optionalen Abhängigkeiten gleichzeitig zu installieren.

  • Zwei neue Klassen hinzugefügt ProbDistribution und QuasiDistribution für den Umgang mit Wahrscheinlichkeitsverteilungen bzw. Quasi-Wahrscheinlichkeitsverteilungen. Bei diesen Objekten handelt es sich um Wörterbuch-Unterklassen, die zusätzliche Methoden für die Arbeit mit Wahrscheinlichkeits- und Quasi-Wahrscheinlichkeitsverteilungen enthalten.

  • Hinzufügen einer neuen settings eigenschaft zu der Optimizer abstrakten Basisklasse, auf der alle Optimiererklassen im qiskit.algorithms.optimizers modul basieren. Diese Eigenschaft gibt ein Python Wörterbuch mit den Einstellungen für den Optimierer zurück, das verwendet werden kann, um eine andere Instanz derselben Optimiererklasse zu instanziieren. Zum Beispiel:

    from qiskit.algorithms.optimizers import GradientDescent
    
    optimizer = GradientDescent(maxiter=10, learning_rate=0.01)
    settings = optimizer.settings
    new_optimizer = GradientDescent(**settings)

    Das settings Wörterbuch kann auch für die Serialisierung von Optimierungsobjekten mit JSON oder einem anderen Serialisierungsformat nützlich sein.

  • Das Modul qiskit.user_config wurde um eine neue Funktion, set_config(), erweitert. Diese Funktion ermöglicht das Setzen von Werten in einer Benutzerkonfiguration über die Qiskit-API. Zum Beispiel:

    from qiskit.user_config import set_config
    set_config("circuit_drawer", "mpl", section="default", file="settings.conf")

    was dazu führt, dass dem Abschnitt default in der Datei settings.conf ein Wert von circuit_drawer = mpl hinzugefügt wird.

    Wenn kein file_path Argument angegeben wird, wird der aktuell verwendete Pfad zur Benutzerkonfigurationsdatei (entweder der Wert der Umgebungsvariablen QISKIT_SETTINGS , falls gesetzt, oder der Standardspeicherort ~/.qiskit/settings.conf) aktualisiert. Änderungen an der bestehenden Konfigurationsdatei werden jedoch nicht in der aktuellen Sitzung berücksichtigt, da die Konfigurationsdatei zum Zeitpunkt des Imports geparst wird.

  • Eine neue Zustandsklasse wurde hinzugefügt, StabilizerStatezu dem qiskit.quantum_info modul hinzugefügt. Diese Klasse repräsentiert einen Zustand des Stabilisatorsimulators nach der Konvention von Aaronson und Gottesman (2004).

  • Zwei neue Optionen, 'value' und 'value_desc' , wurden zu dem sort kwarg der Funktion qiskit.visualization.plot_histogram() funktion hinzugefügt. Wenn sort auf eine dieser Optionen eingestellt ist, sortiert die Ausgabevisualisierung die x-Achse basierend auf der maximalen Wahrscheinlichkeit für jede Bitfolge. Zum Beispiel:

    from qiskit.visualization import plot_histogram
    
    counts = {
      '000': 5,
      '001': 25,
      '010': 125,
      '011': 625,
      '100': 3125,
      '101': 15625,
      '110': 78125,
      '111': 390625,
    }
    plot_histogram(counts, sort='value')

Bekannte Probleme

  • Bei der Ausführung von parallel_map() (und Funktionen, die intern parallel_map() wie z.B transpile() und assemble()) auf Python 3.9 ausgeführt werden, wobei QISKIT_PARALLEL auf True gesetzt ist, ist es in einigen Szenarien möglich, dass das Programm in eine Sackgasse gerät und nie zu Ende läuft. Um dies zu vermeiden, wurde die Standardeinstellung für Python 3.9 so geändert, dass sie nicht parallel läuft, aber wenn QISKIT_PARALLEL ausdrücklich aktiviert ist, kann dies immer noch auftreten.

Anmerkungen zu Upgrades

  • Die Mindestversion der retworkx-Abhängigkeit wurde auf die Version 0.9.0 erhöht. Dies geschah, um neue APIs zu nutzen, die in dieser Version eingeführt wurden und die Leistung einiger Transpilerübergänge verbesserten.

  • Der Standardwert für QISKIT_PARALLEL in Python 3.9 Umgebungen wurde auf False geändert, was bedeutet, dass bei der Ausführung auf Python 3.9 standardmäßig kein Multiprocessing verwendet wird. Dies wurde getan, um ein potenzielles Deadlock-/Hanging-Problem zu vermeiden, das bei Multiprocessing auf Python 3.9 auftreten kann (siehe den Abschnitt "Bekannte Probleme" für weitere Details). Es ist immer noch möglich, sie manuell zu aktivieren, indem man die Umgebungsvariable QISKIT_PARALLEL explizit auf TRUE setzt.

  • Die bestehenden Fake-Backend-Klassen in qiskit.test.mock implementieren nun strikt die BackendV1 schnittstelle. Das bedeutet, dass Sie bei einer manuellen Erstellung von QasmQobj oder PulseQobj objekt zur Verwendung mit der Methode run() manuell erstellt haben, wird dies nicht mehr funktionieren. Die Methode run() akzeptiert nur QuantumCircuit oder Schedule objekte an. Dies war notwendig, um das Testen von neuen Backends zu ermöglichen, die ohne qobj implementiert wurden und für die es bisher keine Testmöglichkeiten innerhalb von qiskit terra gab. Wenn Sie die gefälschten Backends mit QasmQobj oder PulseQobj wurden neue Fake-Backend-Objekte hinzugefügt, um die Schnittstelle der Legacy-Anbieter explizit zu testen. Diese wird entfernt, sobald die alte Schnittstelle veraltet ist und entfernt wird. In Zukunft werden neue gefälschte Backends nur noch die BackendV1 schnittstelle implementieren und keine neuen Legacy-Backend-Klassen für neue gefälschte Backends hinzufügen.

  • Bei der Erstellung eines Pauli objekts mit einem ungültigen String-Label wird ein QiskitError ausgelöst. Dies ist eine Änderung gegenüber früheren Versionen, die bei einem ungültigen String-Label eine AttributeError auslösten. Diese Änderung wurde vorgenommen, um sicherzustellen, dass die Fehlermeldung informativer ist und sich von einer allgemeinen AttributeError unterscheidet.

  • Die Darstellung des Ausgabeprogramms aus dem Pulse Builder (qiskit.pulse.builder.build()) hat sich von einem Schedule zu a ScheduleBlock. Durch diese neue Darstellung werden einige zeitabhängige Operationen wie Verschieben und Einfügen deaktiviert. Dies ermöglicht jedoch parametrisierte Anweisungsdauern innerhalb des Builder-Kontextes. Zum Beispiel:

    from qiskit import pulse
    from qiskit.circuit import Parameter
    
    dur = Parameter('duration')
    
    with pulse.build() as sched:
        with pulse.align_sequential():
            pulse.delay(dur, pulse.DriveChannel(1))
            pulse.play(pulse.Gaussian(dur, 0.1, dur/4), pulse.DriveChannel(0))
    
    assigned0 = sched.assign_parameters({dur: 100})
    assigned1 = sched.assign_parameters({dur: 200})

    Sie können die der Dauer zugewiesenen Zeitpläne direkt an den Assembler (oder das Backend) weitergeben oder sie als Impulsgatter an Ihre Quantenschaltung anhängen.

  • Die tweedledum-Bibliothek, die bisher eine optionale Abhängigkeit war, wurde zu einer Voraussetzung gemacht. Dies geschah aufgrund der breiten Verwendung des PhaseOracle (die von der Installation von tweedledum abhängt) mit verschiedenen Algorithmen von qiskit.algorithms.

  • Das optionale Extra full-featured-simulators , das früher verwendet werden konnte, um qiskit-aer mit etwas wie pip install qiskit-terra[full-featured-simulators] zu installieren, wurde aus dem Paket qiskit-terra entfernt. Wenn dies verwendet wurde, um qiskit-aer mit qiskit-terra zu installieren, sollten Sie sich auf das qiskit-Metapaket verlassen oder einfach qiskit-terra und qiskit-aer zusammen mit pip install qiskit-terra qiskit-aer installieren.

  • Es wurde eine neue Anforderung symengine für Linux (auf x86_64, aarch64 und ppc64le ) und macOS Benutzer ( x86_64 und arm64 ) hinzugefügt. Es ist eine optionale Abhängigkeit von Windows (und verfügbar auf PyPi als vorkompiliertes Paket für 64bit Windows) und anderen Architekturen. Wenn es installiert ist, bietet es eine deutlich verbesserte Leistung bei der Bewertung von Parameter und ParameterExpression objekten.

  • Alle Bibliothekskreisklassen, d. h. alle QuantumCircuit abgeleiteten Klassen in qiskit.circuit.librarysind jetzt in einer Hülle aus Instruction (oder Gate, wenn sie unitär sind). Zum Beispiel, das Importieren und Zeichnen der QFT schaltung:

    vorher aussah wie

                                              ┌───┐
    q_0: ────────────────────■────────■───────┤ H ├─X─
                       ┌───┐ │        │P(π/2) └───┘ │
    q_1: ──────■───────┤ H ├─┼────────■─────────────┼─
         ┌───┐ │P(π/2) └───┘ │P(π/4)                │
    q_2: ┤ H ├─■─────────────■──────────────────────X─
         └───┘

    und sieht nun aus wie

         ┌──────┐
    q_0: ┤0     ├
         │      │
    q_1: ┤1 QFT ├
         │      │
    q_2: ┤2     ├
         └──────┘

    Um den alten Stromkreis zu erhalten, können Sie die Methode decompose() methode für die Schaltung

    Diese Änderung wurde hauptsächlich aus Gründen der Konsistenz vorgenommen, da vor dieser Version einige Schaltkreisklassen in qiskit.circuit.library vorher in ein Instruction oder Gate aber nicht alle.

Hinweise zu veralteten Versionen

  • Die Klasse qiskit.exceptions.QiskitIndexError ist veraltet und wird in einer zukünftigen Version entfernt werden. Diese Ausnahme wurde nicht aktiv von irgendetwas in Qiskit verwendet. Wenn Sie sie verwendet haben, können Sie eine eigene Ausnahmeklasse erstellen, um sie zu ersetzen.
  • Die kwargs epsilon und factr für den qiskit.algorithms.optimizers.L_BFGS_B konstruktor und factr kwarg der P_BFGS optimizer-Klasse sind veraltet und werden in einer zukünftigen Version entfernt. Bitte verwenden Sie stattdessen die eps karg anstelle von epsilon. Die factr kwarg wird durch ftol ersetzt. Die Beziehung zwischen den beiden ist ftol = factr * numpy.finfo(float).eps. Diese Änderung wurde vorgenommen, um der Verwendung der Methode scipy.optimize.minimize functions 'L-BFGS-B' zu entsprechen. Weitere Informationen über die Verwendung dieser neuen Parameter finden Sie in der Dokumentation : scipy.optimize.minimize(method='L-BFGS-B') .
  • Die frühere Anbieterschnittstelle, die aus den abstrakten Klassen qiskit.providers.BaseBackend, qiskit.providers.BaseJob und qiskit.providers.BaseProvider bestand, ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollten Sie die versionierte Schnittstelle verwenden. Die aktuellen Versionen der abstrakten Klassen sind qiskit.providers.BackendV1, qiskit.providers.JobV1, und qiskit.providers.ProviderV1. Die Objekte von V1 sind größtenteils abwärtskompatibel, um die Migration von der alten Schnittstelle zur neuen zu erleichtern. Es ist jedoch zu erwarten, dass die abstrakten Schnittstellen in künftigen Versionen stärker voneinander abweichen werden. Weitere Details zur versionierten Schnittstelle finden Sie in der qiskit.providers dokumentation nachlesen, um weitere Einzelheiten über die versionierte Schnittstelle zu erfahren.
  • Der condition kwarg an den DAGDepNode konstruktor zusammen mit dem entsprechenden condition Attribut des DAGDepNode sind veraltet und werden in einer zukünftigen Version entfernt. Stattdessen kann man auf die condition eines DAGDepNode zugreifen, wenn der Knoten vom Typ op ist, indem man DAGDepNode.op.condition verwendet.
  • Das Attribut condition der Klasse DAGNode klasse ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen können Sie auf die condition eines DAGNode Objekts zugreifen, wenn der Knoten vom Typ op ist, indem Sie DAGNode.op.condition verwenden.
  • Die Syntax für die Impulserstellung (qiskit.pulse.builder.build()) Syntax qiskit.pulse.builder.inline() ist veraltet und wird in einer zukünftigen Version entfernt werden. Anstatt diesen Kontext zu verwenden, können Sie einfach Ausrichtungskontexte innerhalb des Inline-Kontextes entfernen.
  • Die Syntax für die Impulserstellung (qiskit.pulse.builder.build()) Syntax qiskit.pulse.builder.pad() ist veraltet und wird in einer zukünftigen Version entfernt werden. Dies wurde getan, weil die ScheduleBlock die jetzt vom Pulse Builder zurückgegeben wird, die Methode .insert nicht unterstützt (und es gibt keine Insert-Syntax im Builder). Die Verwendung von Zeitschlitz-Platzhaltern zur Blockierung der Einfügung anderer Anweisungen ist nicht mehr erforderlich.

Fehlerkorrekturen

  • Die OneQubitEulerDecomposer und TwoQubitBasisDecomposer klassen für die Synthese von Ein- und Zwei-Qubit-Gattern wurden verbessert, um die Toleranzen zu verringern, die Wiederholbarkeit und die Vereinfachung zu verbessern und mehrere Fehler bei der globalen Phasenverfolgung zu beheben.

  • Es wurde ein Problem bei der Zuweisung des name attributs an Gate das durch mehrere Aufrufe der Methode inverse`() erzeugt wurde. Vor dieser Korrektur wurde beim Aufruf von inverse`() bei jedem Aufruf von inverse bedingungslos _dg angehängt. Dies wurde korrigiert, so dass bei einem zweiten Aufruf von inverse`() das Suffix _dg jetzt entfernt wird.

  • Legt die Bedingungen für die Trivialitätsprüfung von CZGate, CRZGate, CU1Gate und MCU1Gate im HoareOptimizer durchgang. Früher hat der Optimierer in einigen Fällen diese Gatter entfernt und damit die semantische Äquivalenz der Transformation aufgehoben.

  • Es wurde ein Problem bei der Konvertierung eines ListOp objekts von PauliSumOp objekten mit PauliExpectation oder AerPauliExpectation. Zuvor wurde eine Warnung über die Umwandlung in eine Pauli-Darstellung ausgegeben, die potenziell teuer ist. Dies wurde behoben, indem statt der internen Umwandlung der ListOp in eine SummedOp von PauliOp objekte konvertiert wird, wird nun ein PauliSumOp was effizienter ist. Behoben #6159

  • Es wurde ein Problem mit der NLocal klasse im qiskit.circuit.library modul, bei dem bei der Objektinitialisierung eine Ausnahme ausgelöst wurde, wenn ein ungültiger Typ für den reps kwarg verwendet wurde, was später zu einem unerwarteten Laufzeitfehler führte. Ein TypeError wird nun korrekt ausgelöst, wenn der reps kwarg kein int Wert ist. Behoben #6515

  • Ein Problem wurde behoben, bei dem die TwoLocal klasse im qiskit.circuit.library modul keine Numpy-Integer-Typen (z.B. numpy.int32, numpy.int64, usw.) als gültige Eingabe für den entanglement kwarg akzeptiert hat. Behoben #6455

  • Beim Laden einer OpenQASM2 Datei oder eines Strings mit den from_qasm_file() oder from_qasm_str() Konstruktoren für die QuantumCircuit klasse wird, wenn die Schaltung OpenQASM2 eine Anweisung mit dem Namen delay enthält, diese auf eine qiskit.circuit.Delay anweisung abgebildet. Zum Beispiel:

    from qiskit import QuantumCircuit
    
    qasm = """OPENQASM 2.0;
    include "qelib1.inc";
    opaque delay(time) q;
    qreg q[1];
    delay(172) q[0];
    u3(0.1,0.2,0.3) q[0];
    """
    circuit = QuantumCircuit.from_qasm_str(qasm)
    circuit.draw()

    Behoben #6510

  • Es wurde ein Problem mit der Addition zwischen PauliSumOp objekten, die ParameterExpression koeffizienten. Zuvor hatte dies zur Folge, dass eine QiskitError Ausnahme ausgelöst wurde, weil das Hinzufügen der ParameterExpression nicht korrekt behandelt wurde. Dies wurde behoben, so dass die Addition zwischen PauliSumOp objekten mit ParameterExpression koeffizienten.

  • Es wurde ein Problem mit der Initialisierung der AmplificationProblem klasse. Das Feld is_good_state kwarg war ein Pflichtfeld, wurde aber fälschlicherweise als fakultativ behandelt (und als solches dokumentiert). Dies wurde behoben und auch aktualisiert, so dass, wenn die Eingabe oracle ist ein PhaseOracle objekt ist (das seine eigene Auswertungsmethode bereitstellt), ist das Feld erforderlich und löst eine TypeError aus, wenn es ohne is_good_state erstellt wird.

  • Ein Problem wurde behoben, bei dem das Hinzufügen eines Steuerelements zu einem ControlledGate mit geöffneten Steuerelementen die inneren geöffneten Steuerelemente außer Kraft setzen konnte. Behebt #5857

  • Es wurde ein Problem mit der convert() methode der PauliExpectation klasse, bei der der Aufruf für einen nicht-hermitischen Operator ein falsches Ergebnis lieferte. Behoben #6307

  • Es wurde ein Problem mit der Funktion qiskit.pulse.transforms.inline_subroutines() funktion behoben, die früher fälschlicherweise nicht alle verschachtelten Komponenten entfernte, wenn sie bei verschachtelten Zeitplänen aufgerufen wurde. Behoben #6321

  • Es wurde ein Problem behoben, das auftrat, wenn eine teilweise gebundene Callable, die mit der Funktion functools.partial() der Python Standardbibliothek erstellt wurde, als schedule kwarg an die add() methode der InstructionScheduleMap klasse übergeben wurde, was bisher zu einem Fehler führte. Behoben #6278

  • Es wurde ein Problem mit dem PiecewiseChebyshev wenn das Setzen des breakpoints auf None bei einem bestehenden Objekt fälschlicherweise als Haltepunkt behandelt wurde. Dies wurde dahingehend korrigiert, dass bei der Einstellung None wieder das Standardverhalten der Annäherung über das gesamte Intervall gewählt wird. Behoben #6198

  • Es wurde ein Problem mit der num_connected_components() methode von QuantumCircuit die die falsche Anzahl von Komponenten zurückgab, wenn die Schaltung zwei oder mehr Gatter enthält, die auf klassische Register konditioniert sind. Behoben #6477

  • Es wurde ein Problem mit dem qiskit.opflow.expectations modul, bei dem die Koeffizienten einer Zustandsfunktion nicht korrekt multipliziert wurden. Dadurch wurden auch die Berechnungen von Gradienten und QFIs bei Verwendung der PauliExpectation oder AerPauliExpectation klassen. Zum Beispiel, früher:

    from qiskit.opflow import StateFn, I, One
    
    exp = ~StateFn(I) @ (2 * One)

    bewertet nach 2 für AerPauliExpectation und auf 4 für andere Erwartungskonverter. Da ~StateFn(I) @ (2 * One) eine Kurzschreibweise für ~(2 * One) @ I @ (2 * One) ist, wird der nun korrekte Koeffizient von 4 für alle Erwartungskonverter zurückgegeben. Behoben #6497

  • Der Fehler, der dazu führte, dass to_circuit() fehlschlug, wenn PauliOp eine Phase hatte, wurde behoben. Gleichzeitig wurde die Nutzung von PauliGate effizienter gestaltet.

  • Ein Problem wurde behoben, bei dem die QASM-Ausgabe, die von der qasm() methode von QuantumCircuit für zusammengesetzte Gatter wie MCXGate und seine Varianten ( MCXGrayCode, MCXRecursive, und MCXVChain) falsch sein. Wenn nun ein Gate in der Schaltung nicht in qelib1.inc vorhanden ist, wird seine Definition der QASM-Ausgangszeichenfolge hinzugefügt. Behoben #4943 und #3945

  • Es wurde ein Problem mit der circuit_drawer() funktion und draw() methode von QuantumCircuit. Bei Verwendung der Ausgabemodi mpl oder latex , wobei cregbundle kwarg auf False und reverse_bits kwarg auf True eingestellt ist, werden die Bits in den klassischen Registern in der gleichen Reihenfolge angezeigt, wie wenn reverse_bits auf False eingestellt ist.

  • Es wurde ein Problem bei der Verwendung der Anweisung qiskit.extensions.Initialize behoben, bei dem die globale Phase der synthetisierten Definition nicht korrekt gesetzt wurde, wenn sie konstruiert wurde. Behoben #5320

  • Ein Problem wurde behoben, bei dem die Bit-Reihenfolge in qiskit.circuit.library.PhaseOracle.evaluate_bitstring() nicht mit der Reihenfolge des gemessenen Bitstrings übereinstimmte. Diese Korrektur wirkt sich auch auf die Ausführung der Grover algorithmusklasse, wenn das Orakel als PhaseOracleangegeben wird, das nun korrekt die richtige Bitfolge identifiziert. Behoben #6314

  • Behebt einen Fehler in Optimize1qGatesDecomposition() der bisher dazu führte, dass bestimmte kurze Sequenzen von Gattern fälschlicherweise nicht umgeschrieben wurden.

  • In der Methode qiskit.opflow.gradients.Gradient.gradient_wrapper() wurde ein Problem mit der Berechnung des Gradienten behoben. Wenn der Operator nicht diagonal war, wurde in manchen Situationen ein falsches Ergebnis geliefert. Dies wurde durch die Verwendung eines Erwartungskonverters behoben, der sicherstellt, dass das Ergebnis immer korrekt ist.

  • Es wurde ein Problem mit der circuit_drawer() funktion und draw() methode von QuantumCircuit mit allen Ausgabemodi, bei denen eine benutzerdefinierte Anweisung, die klassische Bits enthält, unter bestimmten Umständen falsch dargestellt wurde. Behoben : #3201, #3202 und #6178

  • Ein Problem wurde behoben in circuit_drawer() und der draw() methode der QuantumCircuit klasse bei Verwendung des Ausgabemodus mpl wurden Controlled-Z Gates fälschlicherweise asymmetrisch gezeichnet. Behoben #5981

  • Es wurde ein Problem mit dem OptimizeSwapBeforeMeasure Transpilerdurchgang behoben, bei dem in manchen Situationen ein SwapGate die eine klassische Bedingung enthielt, entfernt wurde. Behoben #6192

  • Es wurde ein Problem mit der Phase der qiskit.opflow.gradients.QFI klasse, wenn die qfi_method auf lin_comb_full gesetzt ist, was dazu führte, dass die falsche Beobachtungsgröße ausgewertet wurde.

  • Es wurde ein Problem mit der VQE algorithmusklasse, wenn diese mit der L_BFGS_B oder P_BFGS optimizer-Klassen ausgeführt wird und Gradienten verwendet werden, wurde der Gradient fälschlicherweise als Numpy-Array statt der erwarteten Liste von Floats übergeben, was zu einem Fehler führte. Dieses Problem wurde behoben, so dass Sie Farbverläufe verwenden können mit VQE und der L_BFGS_B oder P_BFGS optimierern verwenden können.

Sonstige Anmerkungen

  • Die Abschaffung der Methode parameters() für die Klasse Instruction wurde rückgängig gemacht. Diese Methode wurde ursprünglich in der 0.17.0 veraltet, ist aber für verschiedene Anwendungen immer noch notwendig, unter anderem für Kalibrierungsexperimente. Diese Methode wird auch weiterhin unterstützt und nicht abgeschafft.

Aer- 0.8.2

Keine Änderung

Ignis- 0.6.0

Keine Änderung

Aqua- 0.9.4

Keine Änderung

IBM Q Anbieter 0.15.0

Neue Funktionen

  • Hinzufügen von Unterstützung für die neue Methode qiskit.providers.ibmq.runtime.RuntimeJob.error_message() , die einen String zurückgibt, der den Grund für das Scheitern des Auftrags angibt.

  • Der Input-Parameter für die Methode qiskit.providers.ibmq.runtime.IBMRuntimeService.run() kann jetzt als qiskit.providers.ibmq.runtime.ParameterNamespace -Instanz angegeben werden, die Auto-Vervollständigungsfunktionen unterstützt. Sie können qiskit.providers.ibmq.runtime.RuntimeProgram.parameters() verwenden, um eine ParameterNamespace Instanz abzurufen.

    Zum Beispiel:

    from qiskit import IBMQ
    
    provider = IBMQ.load_account()
    
    # Set the "sample-program" program parameters.
    params = provider.runtime.program(program_id="sample-program").parameters()
    params.iterations = 2
    
    # Configure backend options
    options = {'backend_name': 'ibmq_qasm_simulator'}
    
    # Execute the circuit using the "circuit-runner" program.
    job = provider.runtime.run(program_id="sample-program",
                               options=options,
                               inputs=params)
  • Der Benutzer kann nun die Sichtbarkeit (privat/öffentlich) eines Qiskit Runtime Programms mit qiskit.providers.ibmq.runtime.IBMRuntimeService.set_program_visibility() einstellen.

  • Der optionale boolesche Parameter pending wurde zu qiskit.providers.ibmq.runtime.IBMRuntimeService.jobs() hinzugefügt und ermöglicht die Filterung von Aufträgen nach ihrem Status. Wenn "pending" nicht angegeben wird, werden alle Aufträge zurückgegeben. Wenn pending auf True gesetzt ist, werden 'QUEUED' und 'RUNNING' Jobs zurückgegeben. Wenn "pending" auf "False" gesetzt ist, werden die Aufträge "DONE", "ERROR" und "CANCELLED" zurückgegeben.

  • Hinzufügen der Unterstützung für das use_measure_esp Flag in der qiskit.providers.ibmq.IBMQBackend.run() Methode. Wenn True, wird das Backend die ESP-Auslesung für alle Messungen verwenden, die die Endanweisung für dieses Qubit sind. Wenn es verwendet wird und das Backend das Auslesen von ESP nicht unterstützt, wird ein Fehler ausgegeben.

Anmerkungen zu Upgrades

  • qiskit.providers.ibmq.runtime.RuntimeProgram.parameters() ist jetzt eine Methode, die eine qiskit.providers.ibmq.runtime.ParameterNamespace -Instanz zurückgibt, die Sie verwenden können, um die Parameterwerte des Laufzeitprogramms auszufüllen und an qiskit.providers.ibmq.runtime.IBMRuntimeService.run() zu übergeben.
  • Das open_pulse Flag in der Backend-Konfiguration zeigt nicht mehr an, ob ein Backend die Puls-Level-Steuerung unterstützt. Infolgedessen kann qiskit.providers.ibmq.IBMQBackend.configuration() eine PulseBackendConfiguration instanz zurückgeben, auch wenn sein open_pulse Flag False lautet.
  • Die Ebene der Auftragsfreigabe wird aufgrund der geringen Akzeptanz nicht mehr unterstützt und die entsprechende Schnittstelle wird in einer zukünftigen Version entfernt werden. Das bedeutet, dass Sie nicht mehr share_level übergeben sollten, wenn Sie einen Auftrag erstellen oder die Methode qiskit.providers.ibmq.job.IBMQJob.share_level() verwenden, um die Freigabeebene eines Auftrags zu ermitteln.

Hinweise zu veralteten Versionen

  • Die Anweisung id ist auf IBM Hardware-Backends nicht mehr zulässig. Verwenden Sie stattdessen die Anweisung delay , die Verzögerungen variabler Länge implementiert, die in Einheiten von dt angegeben werden. Wenn eine Schaltung ausgeführt wird, die eine id Anweisung enthält, wird bei der Übermittlung des Auftrags eine Warnung ausgegeben und alle id Anweisungen im Auftrag werden automatisch durch die entsprechende delay Anweisung ersetzt.
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.