Skip to main content
IBM Quantum Platform

Qiskit 0.25 Versionshinweise


0.25.4

Terra- 0.17.2

Vorspiel

Dies ist eine Fehlerbehebungsversion, die mehrere Probleme der Version 0.17.1 behebt. Vor allem aber behebt diese Version die Kompatibilität der QuantumInstance klasse, wenn sie auf Backends läuft, die auf der BackendV1 abstrakten Klasse basieren. Dies behebt alle Algorithmen und Anwendungen, die auf qiskit.algorithms oder qiskit.opflow wenn sie auf neueren Backends laufen.

Fehlerkorrekturen

Aer- 0.8.2

Keine Änderung

Ignis- 0.6.0

Keine Änderung

Aqua- 0.9.1

Keine Änderung

IBM Q Anbieter 0.12.3

Keine Änderung


0.25.3

Terra- 0.17.1

Keine Änderung

Aer- 0.8.2

Bekannte Probleme

  • SaveExpectationValue und SaveExpectationValueVariance wurden für die extended_stabilizer-Methode von QasmSimulator und AerSimulator deaktiviert, da sie den falschen Wert für bestimmte Pauli-Operator-Komponenten zurückgeben. Siehe #1227 <https://github.com/Qiskit/qiskit-aer/issues/1227> für weitere Informationen und Beispiele.

Fehlerkorrekturen

  • Behebt ein Leistungsproblem mit der Art und Weise, wie das Konfigurationsattribut basis_gates gesetzt wurde. Zuvor gab es unbeabsichtigte Nebeneffekte in der Backend-Klasse, die dazu führen konnten, dass sich die Laufzeit der wiederholten Simulationen inkrementell erhöhte. Siehe #1229 <https://github.com/Qiskit/qiskit-aer/issues/1229> für weitere Informationen und Beispiele.
  • Behebt einen Fehler in der "multiplexer" Simulator-Anweisung, bei der die Reihenfolge der Ziel- und Kontroll-Qubits gegenüber der Reihenfolge in der Qiskit-Anweisung vertauscht war.
  • Behebt einen in 0.8.0 eingeführten Fehler, bei dem GPU-Simulationen zusätzlich zum GPU-Speicher unbenötigten Host-Speicher zugewiesen haben.
  • Behebt einen Fehler in der stabilizer Simulator-Methode von QasmSimulator und AerSimulator , bei dem der Erwartungswert für save_expectation_value und snapshot_expectation_value für bestimmte Y Pauli's das falsche Vorzeichen haben konnte.

Ignis- 0.6.0

Keine Änderung

Aqua- 0.9.1

Keine Änderung

IBM Q Anbieter 0.12.3

Keine Änderung


0.25.2

Terra- 0.17.1

Keine Änderung

Aer- 0.8.1

Keine Änderung

Ignis- 0.6.0

Keine Änderung

Aqua- 0.9.1

Keine Änderung

IBM Q Anbieter 0.12.3

Sonstige Anmerkungen

  • Das Attribut qiskit.providers.ibmq.experiment.analysis_result.AnalysisResult fit ist jetzt optional.

0.25.1

Terra- 0.17.1

Vorspiel

Dies ist eine Fehlerbehebungsversion, die mehrere Probleme der Version 0.17.0 behebt. Am wichtigsten ist, dass diese Version das falsch zusammengestellte sdist-Paket für die Version 0.17.0 korrigiert, das nicht wirklich baubar war und die Installation auf Plattformen ohne vorkompilierte Binärdateien blockierte.

Fehlerkorrekturen

  • Ein Problem wurde behoben, bei dem das global_phase attribut im Ausgabeobjekt nicht beibehalten wurde QuantumCircuit objekt erhalten blieb, wenn die qiskit.circuit.QuantumCircuit.reverse_bits() methode aufgerufen wurde. Zum Beispiel:

    import math
    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(3, 2, global_phase=math.pi)
    qc.h(0)
    qc.s(1)
    qc.cx(0, 1)
    qc.measure(0, 1)
    qc.x(0)
    qc.y(1)
    
    reversed = qc.reverse_bits()
    print(reversed.global_phase)

    wird nun korrekt gedruckt π\pi.

  • Ein Problem wurde behoben, bei dem der Transpilerdurchlauf Unroller bei verschachtelten Anweisungen mit einer Regel in der Definition die globale Phase nicht beibehalten hat. Behoben #6134

  • Ein Problem wurde behoben, bei dem das Attribut parameter eines ControlledGate objekts, das aus einem UnitaryGate erstellt wurde, nicht auf die unitäre Matrix des UnitaryGate Objekts gesetzt wurde. Zuvor baute control() eine ControlledGate mit dem Attribut parameter auf die kontrollierte Version der UnitaryGate -Matrix gesetzt. Dies würde zu einer Änderung der parameter des Basisobjekts UnitaryGate führen und nachfolgende Aufrufe von inverse() würde die Umkehrung eines doppelt gesteuerten UnitaryGate erzeugen. Behoben #5750

  • Ein Problem mit den voreingestellten Pass-Managern wurde behoben level_0_pass_manager und level_1_pass_manager (das entspricht optimization_level 0 und 1 für transpile()), die in manchen Fällen Schaltkreise erzeugten, die nicht der gewünschten Basis entsprachen.

  • Behebung eines Fehlers bei der Verwendung von SPSA mit automatischer Kalibrierung der Lernrate und Störung (d.h. learning_rate und perturbation sind None im Initialisierer), speichert die Kalibrierung für alle zukünftigen Optimierungen. Stattdessen sollte die Kalibrierung für jede neue Zielfunktion durchgeführt werden.

Aer- 0.8.1

Fehlerkorrekturen

  • Es wurde ein Problem bei der Verwendung der Methode matrix_product_state der Simulatoren AerSimulator und QasmSimulator behoben, wenn eine verrauschte Simulation mit Kraus-Fehlern ausgeführt wurde. Bisher wurden bei der Matrixprodukt-Zustandssimulationsmethode nach Anwendung der Kraus-Matrix keine Änderungen an benachbarte Qubits weitergegeben. Dies wurde behoben, so dass die Ausgabe der Simulation korrekt ist. Behoben #1184 und #1205
  • Es wurde ein Problem behoben, bei dem die Anweisung qiskit.extensions.Initialize die Optimierung der Messwertabtastung für die Simulationsmethoden statevector und matrix_product_state der Simulatoren AerSimulator und QasmSimulator deaktivierte, selbst wenn es sich um die erste Schaltungsanweisung handelte oder sie auf alle Qubits angewendet wurde und somit deterministisch war. Behoben #1210
  • Behebung eines Problems mit den Anweisungen SaveStatevector und SnapshotStatevector bei Verwendung mit der Simulationsmethode extended_stabilizer der Simulatoren AerSimulator und QasmSimulator , bei dem ein nicht normalisierter Zustandsvektor zurückgegeben wurde. Behoben #1196
  • Die Simulationsmethode matrix_product_state unterstützt nun die bisher fehlende Anweisung qiskit.providers.aer.library.SetMatrixProductState, die es ermöglicht, den Zustand einer Simulation in einer Schaltung zu setzen.

Ignis- 0.6.0

Keine Änderung

Aqua- 0.9.1

IBM Q Anbieter 0.12.2

Keine Änderung


0.25.0

Mit dieser Version wird das Projekt Qiskit Aqua offiziell eingestellt. Dementsprechend wird in einer zukünftigen Version das Paket qiskit-aqua aus dem Qiskit-Metapaket entfernt werden, was bedeutet, dass in dieser zukünftigen Version pip install qiskit nicht mehr qiskit-aqua enthalten sein wird. Die Anwendungsmodule, die von qiskit-aqua bereitgestellt werden, 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 Operatorfluss sind jetzt als Teil von qiskit-terra unter qiskit.algorithms und qiskit.opflow. 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 Migrationsanleitung.

Terra- 0.17.0

Vorspiel

Die Qiskit Terra 0.17.0 enthält viele neue Funktionen und Fehlerbehebungen. Die wichtigste Neuerung in dieser Version ist die Einführung der Funktionen qiskit.algorithms und qiskit.opflow module, die aus dem Projekt qiskit.aqua migriert und angepasst wurden.

Neue Funktionen

  • Die Funktion qiskit.pulse.call() kann jetzt ein Parameter objekt zusammen mit einer parametrisierten Subroutine verwenden. Dies ermöglicht es, den Objekten für jeden Unterprogrammaufruf unterschiedliche Werte Parameter objekten für jeden Unterprogrammaufruf zuzuweisen.

    Beispiel:

    from qiskit.circuit import Parameter
    from qiskit import pulse
    
    amp = Parameter('amp')
    
    with pulse.build() as subroutine:
        pulse.play(pulse.Gaussian(160, amp, 40), DriveChannel(0))
    
    with pulse.build() as main_prog:
        pulse.call(subroutine, amp=0.1)
        pulse.call(subroutine, amp=0.3)
  • Die qiskit.providers.models.QasmBackendConfiguration hat ein neues Feld processor_type , das optional verwendet werden kann, um Informationen über den Prozessor eines Backends in der Form {"family": <str>, "revision": <str>, segment: <str>} bereitzustellen. Beispiel: {"family": "Canary", "revision": "1.0", segment: "A"}.

  • Die Klassen qiskit.pulse.Schedule, qiskit.pulse.Instruction und qiskit.pulse.Channel haben jetzt eine parameter Eigenschaft, die alle Parameter objekte zurückgibt, die in dem Objekt verwendet werden, und eine is_parameterized() methode, die True zurückgibt, wenn irgendwelche Parameter im Objekt verwendet werden.

    Zum Beispiel:

    from qiskit.circuit import Parameter
    from qiskit import pulse
    
    shift = Parameter('alpha')
    
    schedule = pulse.Schedule()
    schedule += pulse.SetFrequency(shift, pulse.DriveChannel(0))
    
    assert schedule.is_parameterized() == True
    print(schedule.parameters)
  • Hinzufügen eines PiecewiseChebyshev zu der qiskit.circuit.library zur Implementierung einer stückweisen Tschebyscheff-Approximation einer Eingabefunktion. Für eine gegebene Funktion f(x)f(x) und den Grad dd implementiert diese Klasse eine stückweise polynomiale Tschebyscheff-Approximation auf nn qubits zu f(x)f(x) auf den gegebenen Intervallen. Alle Polynome in der Approximation sind vom Grad dd.

    Zum Beispiel:

    import numpy as np
    from qiskit import QuantumCircuit
    from qiskit.circuit.library.arithmetic.piecewise_chebyshev import PiecewiseChebyshev
    f_x, degree, breakpoints, num_state_qubits = lambda x: np.arcsin(1 / x), 2, [2, 4], 2
    pw_approximation = PiecewiseChebyshev(f_x, degree, breakpoints, num_state_qubits)
    pw_approximation._build()
    qc = QuantumCircuit(pw_approximation.num_qubits)
    qc.h(list(range(num_state_qubits)))
    qc.append(pw_approximation.to_instruction(), qc.qubits)
    qc.draw(output='mpl')
  • Die BackendProperties klasse hat nun eine readout_length() methode, die die Ausleselänge [sec] des gegebenen Qubits zurückgibt.

  • Eine neue Klasse, ScheduleBlockwurde dem Modul qiskit.pulse modul hinzugefügt. Diese Klasse bietet eine neue Darstellung eines Pulsprogramms. Diese Darstellung eignet sich am besten für die Syntax des Pulse Builders und basiert auf der relativen Reihenfolge der Anweisungen.

    Bei dieser Darstellung wird alignment_context verwendet, anstatt die Startzeit t0 für jede Anweisung anzugeben. Der Startzeitpunkt einer Anweisung wird implizit mit der angegebenen Transformation und der relativen Position der Anweisungen zugewiesen.

    Die ScheduleBlock ermöglicht ein lazy instruction scheduling, d. h. wir können der Dauer der Anweisungen beliebige Parameter zuweisen.

    Zum Beispiel:

    from qiskit.pulse import ScheduleBlock, DriveChannel, Gaussian
    from qiskit.pulse.instructions import Play, Call
    from qiskit.pulse.transforms import AlignRight
    from qiskit.circuit import Parameter
    
    dur = Parameter('rabi_duration')
    
    block = ScheduleBlock(alignment_context=AlignRight())
    block += Play(Gaussian(dur, 0.1, dur/4), DriveChannel(0))
    block += Call(measure_sched)  # subroutine defined elsewhere

    dieser Code definiert ein Experiment, bei dem die Dauer eines Gauß-Pulses abgetastet wird, gefolgt von einer Messung measure_sched, d.h. ein Rabi-Experiment. Sie können das Objekt block für jede gescannte Dauer wiederverwenden, indem Sie einen Zielwert für die Dauer zuweisen.

  • Hinzufügen einer neuen Funktion array_to_latex() zum qiskit.visualization modul hinzugefügt, die zur Darstellung und Visualisierung von Vektoren und Matrizen mit LaTeX verwendet werden kann.

    from qiskit.visualization import array_to_latex
    from numpy import sqrt, exp, pi
    mat = [[0, exp(pi*.75j)],
           [1/sqrt(8), 0.875]]
    array_to_latex(mat)
  • Die Statevector und DensityMatrix klassen haben jetzt draw() methoden, mit denen Objekte entweder als Textmatrizen, IPython-Latex-Objekte, Latex-Quellen, Q-Sphären, Bloch-Sphären und Hinton-Plots gezeichnet werden können. Standardmäßig ist der Ausgabetyp die entsprechende Ausgabe von __repr__ , aber diese Vorgabe kann in einer Benutzerkonfigurationsdatei durch Setzen der Option state_drawer geändert werden. Zum Beispiel:

    from qiskit.quantum_info import DensityMatrix
    dm = DensityMatrix.from_label('r0')
    dm.draw('latex')
    from qiskit.quantum_info import Statevector
    sv = Statevector.from_label('+r')
    sv.draw('qsphere')

    Außerdem wird die draw() methode nun für die ipython-Anzeige dieser Klassen verwendet. Wenn Sie also den Standardausgabetyp in einer Benutzerkonfigurationsdatei ändern, dann wird, wenn eine Statevector oder ein DensityMatrix objekt in einem Jupyter-Notebook angezeigt werden, wird dieser Ausgabetyp für das Objekt verwendet.

  • Pulse qiskit.pulse.Instruction Objekte und parametrische Pulsobjekte (z.B Gaussian unterstützen jetzt die Verwendung von Parameter und ParameterExpression objekte für den Parameter duration . Zum Beispiel:

    from qiskit.circuit import Parameter
    from qiskit.pulse import Gaussian
    
    dur = Parameter('x_pulse_duration')
    double_dur = dur * 2
    rx_pulse = Gaussian(dur, 0.1, dur/4)
    double_rx_pulse = Gaussian(double_dir, 0.1, dur/4)

    Beachten Sie, dass wir zwar eine Anweisung mit einem parametrisierten duration erstellen können, das Hinzufügen einer Anweisung mit ungebundenem Parameter duration zu einem Zeitplan aber nur von der neu eingeführten Darstellung unterstützt wird ScheduleBlock. Weitere Einzelheiten finden Sie in den Versionshinweisen zu bekannten Problemen.

  • Die run() methode für die QasmSimulatorPy, StatevectorSimulatorPy, und UnitarySimulatorPy backends nimmt jetzt eine QuantumCircuit (oder eine Liste von QuantumCircuit objekte) als Eingabe. Das vorherige QasmQobj objekt wird im Moment noch unterstützt, wird aber in einer zukünftigen Version veraltet sein.

    Ein Beispiel für die Anwendung dieses Verfahrens finden Sie unter:

    from qiskit import transpile, QuantumCircuit
    
    from qiskit.providers.basicaer import BasicAer
    
    backend = BasicAer.get_backend('qasm_simulator')
    
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    
    tqc = transpile(circuit, backend)
    result = backend.run(tqc, shots=4096).result()
  • Der CommutativeCancellation transpiler-Pass hat einen neuen optionalen kwarg im Konstruktor basis_gates, der eine Liste der Namen der Basis-Gates für das Ziel-Backend enthält. Wenn dies angegeben wird, werden nur Tore im basis_gates kwarg verwendet. Zuvor ersetzte der Pass automatisch aufeinanderfolgende Gates, die mit ZGate mit dem U1Gate bedingungslos. Mit basis_gates kwarg können Sie angeben, welche z-Rotationsgates in der Zielbasis vorhanden sind, um dies zu vermeiden.

  • Die Konstruktoren der Bit klasse und der Unterklassen, Qubit, Clbit, und AncillaQubitwurden dahingehend aktualisiert, dass ihre beiden Parameter register und index nun optional sind. Dies ermöglicht die Erstellung von Bit-Objekten, die unabhängig von einem Register sind.

  • Eine neue Klasse, BooleanExpressionwurde dem Modul qiskit.circuit.classicalfunction modul hinzugefügt. Diese Klasse ermöglicht die Erstellung eines Orakels aus einem booleschen Ausdruck Python. Zum Beispiel:

    from qiskit.circuit import BooleanExpression, QuantumCircuit
    
    expression = BooleanExpression('~x & (y | z)')
    circuit = QuantumCircuit(4)
    circuit.append(expression, [0, 1, 2, 3])
    circuit.draw('mpl')
    circuit.decompose().draw('mpl')

    Die Website BooleanExpression enthält auch eine Methode, from_dimacs_file()die das Laden von Formeln ermöglicht, die im DIMACS-CNF-Format beschrieben sind. Zum Beispiel:

    from qiskit.circuit import BooleanExpression, QuantumCircuit
    
    boolean_exp = BooleanExpression.from_dimacs_file("simple_v3_c2.cnf")
    circuit = QuantumCircuit(boolean_exp.num_qubits)
    circuit.append(boolean_exp, range(boolean_exp.num_qubits))
    circuit.draw('text')
         ┌───────────────────┐
    q_0: ┤0                  ├
         │                   │
    q_1: ┤1                  ├
         │  SIMPLE_V3_C2.CNF │
    q_2: ┤2                  ├
         │                   │
    q_3: ┤3                  ├
         └───────────────────┘
    circuit.decompose().draw('text')
    q_0: ──o────o────────────
           │    │
    q_1: ──■────o────■───────
           │    │    │
    q_2: ──■────┼────o────■──
         ┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐
    q_3: ┤ X ├┤ X ├┤ X ├┤ X ├
         └───┘└───┘└───┘└───┘
  • Eine neue Klasse wurde hinzugefügt, PhaseOraclewurde dem qiskit.circuit.library modul hinzugefügt. Diese Klasse ermöglicht die Konstruktion von Phasenorakelschaltungen aus Python booleschen Ausdrücken.

    from qiskit.circuit.library.phase_oracle import PhaseOracle
    
    oracle = PhaseOracle('x1 & x2 & (not x3)')
    oracle.draw('mpl')

    Diese Phasenorakel können als Teil eines größeren Algorithmus verwendet werden, zum Beispiel mit qiskit.algorithms.AmplificationProblem:

    from qiskit.algorithms import AmplificationProblem, Grover
    from qiskit import BasicAer
    
    backend = BasicAer.get_backend('qasm_simulator')
    
    problem = AmplificationProblem(oracle, is_good_state=oracle.evaluate_bitstring)
    grover = Grover(quantum_instance=backend)
    result = grover.amplify(problem)
    result.top_measurement

    Die PhaseOracle klasse enthält auch eine from_dimacs_file() methode, die es ermöglicht, ein Phasenorakel aus einer Datei zu konstruieren, die eine Formel im DIMACS-CNF-Format beschreibt.

    from qiskit.circuit.library.phase_oracle import PhaseOracle
    
    oracle = PhaseOracle.from_dimacs_file("simple_v3_c2.cnf")
    oracle.draw('text')
    state_0: ─o───────o──────────────
              │ ┌───┐ │ ┌───┐
    state_1: ─■─┤ X ├─■─┤ X ├─■──────
              │ └───┘   └───┘ │ ┌───┐
    state_2: ─■───────────────o─┤ Z ├
                                └───┘
  • Alle Transpilerübergänge (d.h. alle Instanzen von BasePass) sind jetzt direkt aufrufbar. Der Aufruf eines Passes bietet eine bequeme Schnittstelle zur Ausführung des Passes auf einem QuantumCircuit objekt.

    Zum Beispiel kann ein einzelner Transformationsdurchgang, wie z. B BasisTranslatorkann mit durchgeführt werden:

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import BasisTranslator
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    
    circuit = QuantumCircuit(1)
    circuit.h(0)
    
    pass_instance = BasisTranslator(sel, ['rx', 'rz', 'cx'])
    result = pass_instance(circuit)
    result.draw(output='mpl')

    Bei der Durchführung eines Analysedurchlaufs muss ein Eigenschaftssatz (als dict oder als PropertySet) als Parameter hinzugefügt und möglicherweise "an Ort und Stelle" geändert werden. Zum Beispiel:

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import Depth
    
    circuit = QuantumCircuit(1)
    circuit.h(0)
    
    property_set = {}
    pass_instance = Depth()
    pass_instance(circuit, property_set)
    print(property_set)
  • Die Klasse QasmQobjConfig klasse hat jetzt einen optionalen kwarg für meas_level und meas_return. Diese Felder können verwendet werden, um die Erzeugung von QasmQobj auftragspayloads zu generieren, die meas_level=1 (mit Kernelementen versehene Daten) für Schaltkreisaufträge unterstützen (bisher war dies nur für PulseQobj objekte). Die Funktion assemble() funktion wurde aktualisiert, um dieses Feld für QasmQobj objekte, die sie erzeugt.

  • Eine neue tensor() methode wurde zu der QuantumCircuit klasse hinzugefügt. Diese Methode ermöglicht das Tensoring eines anderen Stromkreises mit einem bestehenden Stromkreis. Diese Methode funktioniert analog zu qiskit.quantum_info.Operator.tensor() und ist mit der Little-Endian-Konvention von Qiskit vereinbar.

    Zum Beispiel:

    from qiskit import QuantumCircuit
    top = QuantumCircuit(1)
    top.x(0);
    bottom = QuantumCircuit(2)
    bottom.cry(0.2, 0, 1);
    bottom.tensor(top).draw(output='mpl')
  • Die qiskit.circuit.QuantumCircuit klasse unterstützt nun beliebige Freiform-Metadaten mit dem metadata attribut. Ein Benutzer (oder ein Programm, das auf der Basis von QuantumCircuit) kann einem Stromkreis Metadaten zuordnen, um den Stromkreis zu verfolgen. Zum Beispiel:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2, user_metadata_field_1='my_metadata',
                        user_metadata_field_2='my_other_value')

    oder:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.metadata = {'user_metadata_field_1': 'my_metadata',
                   'user_metadata_field_2': 'my_other_value'}

    Diese Metadaten werden nicht verwendet, um die Ausführung des Schaltkreises zu beeinflussen, sondern dienen lediglich dazu, den Schaltkreis während der Lebensdauer des Objekts zu verfolgen. Das Attribut metadata bleibt zwischen allen Schaltkreistransformationen bestehen, einschließlich transpile() und assemble(). Es wird erwartet, dass die Anbieter die Metadaten mit dem zurückgegebenen Ergebnis verknüpfen, so dass die Nutzer die Ergebnisse auf der Grundlage von Schaltkreis-Metadaten filtern können, so wie sie es derzeit mit QuantumCircuit.name tun können.

  • Hinzufügen einer neuen Operatorklasse CNOTDihedral wurde dem qiskit.quantum_info modul hinzugefügt. Diese Klasse wird verwendet, um die CNOT-Dihedral-Gruppe darzustellen, die durch die Quantengatter CXGate, TGate, und XGate.

  • Fügt einen & (__and__) Binäroperator zu BaseOperator Unterklassen (z.B qiskit.quantum_info.Operator) in dem qiskit.quantum_info modul. Dies ist eine Abkürzung für den Aufruf der Klassen compose() methode (d.h. A & B == A.compose(B)).

    Zum Beispiel:

    import qiskit.quantum_info as qi
    
    qi.Pauli('X') & qi.Pauli('Y')
  • Fügt einen binären Operator & (__and__) zu qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix klassen. Dies ist eine Abkürzung für den Aufruf der Klassen evolve() methode (d.h. psi & U == psi.evolve(U)).

    Zum Beispiel:

    import qiskit.quantum_info as qi
    
    qi.Statevector.from_label('0') & qi.Pauli('X')
  • Ein neues 2-Qubit-Tor, ECRGatedie Echo-Kreuzresonanz (ECR), wurde dem qiskit.circuit.library modul zusammen mit einer entsprechenden Methode hinzugefügt, ecr() für die QuantumCircuit klasse. Das ECR-Tor besteht aus zwei CR(π4)CR(\frac{π}{4}) Impulsen mit einem XGate zwischen ihnen für das Echo. Dieses Tor ist lokal äquivalent zu einem CXGate (kann durch lokale Vor- oder Nachrotation in ein CNOT umgewandelt werden). Es ist das native Gatter auf der aktuellen IBM -Hardware, und die Kompilierung zu diesem Gatter ermöglicht es, die Pre-/Post-Rotationen in den Rest der Schaltung zu integrieren.

  • Ein neuer kwarg approximation_degree wurde der Funktion transpile() funktion hinzugefügt, um eine ungefähre Kompilierung zu ermöglichen. Gültige Werte reichen von 0 bis 1, wobei ein höherer Wert eine geringere Annäherung bedeutet. Dies ist eine heuristische Wählscheibe zum Experimentieren mit Schaltkreisannäherungen. Die konkrete Auslegung dieser Zahl ist jedem Durchgang überlassen, der sie zur Durchführung einer ungefähren Version des Durchgangs verwenden kann. Konkrete Beispiele sind der UnitarySynthesis pass oder die oder Übersetzer zu diskreten Gattersätzen. Wenn ein Pass diese Option nicht unterstützt, bedeutet dies eine exakte Transformation.

  • Zwei neue Übersetzerpässe, GateDirection und qiskit.transpiler.passes.CheckGateDirectionwurden dem qiskit.transpiler.passes modul hinzugefügt. Diese neuen Übergänge sind als allgemeiner Ersatz für CXDirection und CheckCXDirection gedacht (die beide jetzt veraltet sind, siehe die Verwerfungshinweise für weitere Details), die die gleiche Funktion erfüllen, aber mit anderen Gates als nur CXGate.

  • Unter Windows kann die parallele Ausführung mit der Funktion parallel_map() funktion jetzt aktiviert werden (standardmäßig ist sie noch deaktiviert). Um dies zu tun, können Sie entweder parallel = True in einer Benutzerkonfigurationsdatei oder die Umgebungsvariable QISKIT_PARALLEL auf TRUE setzen (dies wirkt sich auch auf transpile() und assemble() die beide parallel_map() intern verwenden). Es ist wichtig zu beachten, dass es bei der Aktivierung der Parallelität unter Windows Einschränkungen bei der Art und Weise gibt, wie Python Prozesse unter Windows startet. Weitere Einzelheiten zu den Einschränkungen bei der parallelen Ausführung unter Windows finden Sie im Abschnitt Bekannte Probleme weiter unten.

  • Eine neue Funktion, hellinger_distance()zur Berechnung des Hellinger-Abstands zwischen zwei Zählverteilungen wurde dem qiskit.quantum_info modul hinzugefügt.

  • Die Funktion decompose_clifford() im Modul qiskit.quantum_info modul (die intern von der qiskit.quantum_info.Clifford.to_circuit() methode verwendet wird) hat einen neuen kwarg method , der die Auswahl der verwendeten Synthesemethode ermöglicht, indem er entweder auf 'AG' oder 'greedy' gesetzt wird. Für mehr als drei Qubits ist er standardmäßig auf 'greedy' eingestellt, das eine nicht-optimale, gierige Kompilierungsroutine für die Synthese von Clifford-Elementen von Bravyi et. al., was in der Regel zu besseren CX-Kosten führt als die zuvor verwendete Aaronson-Gottesman-Methode (für mehr als zwei Qubits). Sie können die method kwarg verwenden, um zur vorherigen Standardmethode von Aaronson-Gottesman zurückzukehren, indem Sie method='AG' einstellen.

  • Die Klasse Initialize im Modul qiskit.extensions modul kann nun unter Verwendung einer Ganzzahl konstruiert werden. Die "1"-Bits der ganzen Zahl fügen ein Reset und ein XGate in die Schaltung für das entsprechende Qubit ein. Dies geschieht unter Verwendung der standardmäßigen Little-Endian-Konvention von qiskit, d.h. das ganz rechte Bit der Ganzzahl setzt das Qubit 0. Wenn Sie beispielsweise den Parameter in Initialize auf 5 setzen, werden die Qubits 0 und 2 auf den Wert 1 gesetzt.

    from qiskit.extensions import Initialize
    
    initialize = Initialize(13)
    initialize.definition.draw('mpl')
  • Die Klasse Initialize im Modul qiskit.extensions modul unterstützt nun die direkte Konstruktion aus einem Pauli-Label (analog zur qiskit.quantum_info.Statevector.from_label() methode). Die Pauli-Etiketten beziehen sich auf Basiszustände der Pauli-Eigenzustände Z, X, Y. Diese Bezeichnungen verwenden die standardmäßige Little-Endian-Notation von Qiskit, z.B. würde eine Bezeichnung '01' das Qubit 0 mit ∣1⟩|1\rangle und das Qubit 1 mit ∣0⟩|0\rangle initialisieren.

    from qiskit.extensions import Initialize
    
    initialize = Initialize("10+-lr")
    initialize.definition.draw('mpl')
  • Der kwarg, template_list, für den Konstruktor des qiskit.transpiler.passes.TemplateOptimization transpilerpasses unterstützt nun die Aufnahme einer Liste von sowohl QuantumCircuit und DAGDependency objekten. Zuvor wurden nur QuantumCircuit akzeptiert (die intern in DAGDependency objekte) in die Eingabeliste aufgenommen.

  • Ein neuer Transpiler-Pass, qiskit.transpiler.passes.RZXCalibrationBuilderder Kalibrierungen erzeugen und zu einem Quantenkreis hinzufügen kann, wurde eingeführt. Dieser Durchlauf nimmt kalibrierte CXGate objekte und erstellt die Kalibrierungen für qiskit.circuit.library.RZXGate objekte mit einem beliebigen Drehwinkel. Die Zeitpläne werden durch Dehnen und Stauchen der GaussianSquare Impulse der Echo-Cross-Resonanztore erstellt.

  • Neue Vorlagenschaltungen für die Verwendung von qiskit.circuit.library.RZXGate werden dem qiskit.circuit.library modul hinzugefügt (z.B rzx_yz). Dies ermöglicht die Kopplung des TemplateOptimization pass mit dem qiskit.transpiler.passes.RZXCalibrationBuilder passes, um automatisch Gate-Sequenzen, wie CNOT - P(theta) - CNOT, zu finden und durch effizientere Schaltungen zu ersetzen, die auf qiskit.circuit.library.RZXGate mit einer Kalibrierung.

  • Der Matplotlib-Ausgabetyp für die circuit_drawer() und die draw() methode für die QuantumCircuit klasse unterstützen nun Konfigurationsdateien zur Einstellung des Visualisierungsstils. In früheren Versionen gab es eine Grundfunktion, die es den Benutzern ermöglichte, einen style kwarg zu übergeben, der eine dict enthielt, um die Farben und andere Anzeigefunktionen der mpl Schublade anzupassen. Dies wurde nun erweitert, so dass diese Wörterbücher direkt aus JSON-Dateien geladen werden können, ohne dass ein Wörterbuch übergeben werden muss. Dies ermöglicht es Benutzern, neue Stildateien zu erstellen und diesen Stil für Visualisierungen zu verwenden, indem sie den Dateinamen des Stils als String an den style kwarg übergeben.

    Um diese Funktion zu nutzen, müssen Sie die Option circuit_mpl_style_path in einer Benutzerkonfigurationsdatei festlegen. Diese Option sollte auf den Pfad gesetzt werden, in dem qiskit nach Style-JSON-Dateien suchen soll. Wenn Sie mehrere Pfadangaben machen, sollten diese durch : getrennt werden. Wenn Sie zum Beispiel circuit_mpl_style_path = ~/.qiskit:~/user_styles in einer Benutzerkonfigurationsdatei einstellen, werden JSON-Dateien sowohl in ~/.qiskit als auch in ~/user_styles gesucht.

  • Der Funktion marginal_counts() wurde ein neuer kwarg format_marginal hinzugefügt, der, wenn er auf True gesetzt wird, die ausgegebenen Zählerstände entsprechend cregs in der Schaltung formatiert, und fehlende Indizes werden mit _ dargestellt. Zum Beispiel:

    from qiskit import QuantumCircuit, execute, BasicAer, result
    from qiskit.result.utils import marginal_counts
    qc = QuantumCircuit(5, 5)
    qc.x(0)
    qc.measure(0, 0)
    
    result = execute(qc, BasicAer.get_backend('qasm_simulator')).result()
    print(marginal_counts(result.get_counts(), [0, 2, 4], format_marginal=True))
  • Verbesserte die Leistung von qiskit.quantum_info.Statevector.expectation_value() und qiskit.quantum_info.DensityMatrix.expectation_value() wenn der Argumentoperator ein Pauli oder SparsePauliOp operator ist.

  • Die Benutzer-Konfigurationsdatei hat 2 neue Konfigurationsoptionen, num_processes und parallel, die verwendet werden, um das Standardverhalten von parallel_map(). Die Option parallel ist ein Boolescher Wert, mit dem festgelegt wird, ob parallel_map() in mehreren Prozessen ausgeführt wird oder nicht. Wenn er auf False gesetzt ist, werden Aufrufe an parallel_map() seriell ausgeführt, während die Einstellung auf True eine parallele Ausführung ermöglicht. Die Option num_processes nimmt eine ganze Zahl, die angibt, wie viele CPUs bei der parallelen Ausführung verwendet werden sollen. Standardmäßig wird die Anzahl der CPU-Kerne auf einem System verwendet.

  • Es gibt 2 neue Umgebungsvariablen, QISKIT_PARALLEL und QISKIT_NUM_PROCS, die verwendet werden können, um das Standardverhalten von parallel_map(). Die Option QISKIT_PARALLEL kann auf TRUE (beliebige Großschreibung) gesetzt werden, um festzulegen, dass der Standard in mehreren Prozessen ausgeführt wird, wenn parallel_map() aufgerufen wird. Wenn er auf einen anderen Wert gesetzt ist parallel_map() wird seriell ausgeführt. QISKIT_NUM_PROCS nimmt eine ganze Zahl (z. B. QISKIT_NUM_PROCS=5), die als Standardanzahl von Prozessen verwendet wird, mit denen das Programm laufen soll. Diese beiden Optionen haben Vorrang vor der entsprechenden Option in der Benutzerkonfigurationsdatei.

  • Eine neue Methode, gradient()wurde der Klasse ParameterExpression klasse hinzugefügt. Diese Methode wird verwendet, um den Gradienten eines ParameterExpression objekts.

  • Die Methode __eq__ (d. h. die Methode, die aufgerufen wird, wenn der Operator == verwendet wird) für die Option ParameterExpression erlaubt nun den Vergleich mit einem numerischen Wert. Zuvor war es nur möglich, zwei Instanzen von ParameterExpression mit == vergleichen. Zum Beispiel:

    from qiskit.circuit import Parameter
    
    x = Parameter("x")
    y = x + 2
    y = y.assign(x, -1)
    
    assert y == 1
  • Die PauliFeatureMap klasse im Modul qiskit.circuit.library modul unterstützt nun die Anpassung des Rotationsfaktors α\alpha, indem er entweder mit dem kwarg alpha im Konstruktor oder mit dem alpha attribut nach der Erstellung. Zuvor war dieser Wert auf 2.0 festgelegt. Die Anpassung dieses Attributs ermöglicht eine bessere Kontrolle der Entscheidungsgrenzen und bietet zusätzliche Flexibilität bei der Handhabung der Eingabemerkmale, ohne dass diese im Datensatz explizit skaliert werden müssen.

  • Eine neue Gate klasse, PauliGatewurde das qiskit.circuit.library modul und die entsprechende Methode hinzugefügt, pauli()wurde der Klasse QuantumCircuit klasse hinzugefügt. Diese neue Gatterklasse ermöglicht es, mehrere individuelle Pauli-Gatter gleichzeitig auf verschiedene Qubits anzuwenden. Dies ist vor allem für Simulatoren nützlich, die dieses neue Gatter nutzen können, um mehrere gleichzeitige Pauli-Gatter effizienter zu implementieren.

  • Verbessern Sie den qiskit.quantum_info.Pauli betreiber. Diese Klasse repräsentiert nun ein Element aus der vollständigen N-Qubit-Pauli-Gruppe einschließlich komplexer Koeffizienten. Es unterstützt jetzt die Operator-API-Methoden einschließlich compose(), dot(), tensor() usw., wobei compose und dot in Bezug auf die vollständige Pauli-Gruppe definiert sind.

    Diese Klasse ermöglicht auch die Konvertierung in und aus der Zeichenkettendarstellung von Pauli's zur Vereinfachung.

    Zum Beispiel

    from qiskit.quantum_info import Pauli
    
    P1 = Pauli('XYZ')
    P2 = Pauli('YZX')
    P1.dot(P2)

    Pauli's können auch direkt angehängt werden an QuantumCircuit objekte

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import Pauli
    
    circ = QuantumCircuit(3)
    circ.append(Pauli('XYZ'), [0, 1, 2])
    circ.draw(output='mpl')

    Zusätzliche Methoden erlauben es zu berechnen, wann zwei Pauli's kommutieren (unter Verwendung der commutes() methode) oder anticommute (mit der anticommutes() methode), und die Berechnung der Pauli, die sich aus der Clifford-Konjugation P′=C.P.C†P^\prime = C.P.C^\dagger ergeben, mit der evolve() methode.

    Weitere Informationen finden Sie in der API-Dokumentation der Pauli klasse für zusätzliche Informationen.

  • Eine neue Funktion, random_pauli()zur Erzeugung eines Zufallselements der N-Qubit-Pauli-Gruppe wurde dem qiskit.quantum_info modul hinzugefügt.

  • Eine neue Klasse, PiecewisePolynomialPauliRotationswurde dem Modul qiskit.circuit.library modul hinzugefügt. Dieses Element der Schaltkreisbibliothek dient der Abbildung einer stückweisen Polynomfunktion f(x)f(x), die durch Haltepunkte und Koeffizienten definiert ist, auf Qubit-Amplituden. Die Haltepunkte (x0,...,xJ)(x_0, ..., x_J) sind eine Teilmenge von [0,2n−1][0, 2^n-1], wobei nn die Anzahl der Zustandsbits ist. Die entsprechenden Koeffizienten [aj,1,...,aj,d][a_{j,1},...,a_{j,d}], wobei dd der höchste Grad aller Polynome ist. Dann ist f(x)f(x) definiert als:

f(x)={0,x<x0∑i=0i=daj,ixi,xj≤x<xj+1\begin{split}f(x) = \begin{cases} 0, x < x_0 \\ \sum_{i=0}^{i=d}a_{j,i} x^i, x_j \leq x < x_{j+1} \end{cases}\end{split}

wobei wir implizit xJ+1=2nx_{J+1} = 2^n annehmen. Und die auf die Amplituden angewandte Abbildung ist gegeben durch

F∣x⟩∣0⟩=cos⁡(pj(x))∣x⟩∣0⟩+sin⁡(pj(x))∣x⟩∣1⟩F|x\rangle |0\rangle = \cos(p_j(x))|x\rangle |0\rangle + \sin(p_j(x))|x\rangle |1\rangle

Diese Abbildung basiert auf kontrollierten Pauli-Y-Rotationen und wurde mit Hilfe der PolynomialPauliRotations.

  • Ein neues Modul qiskit.algorithms ist eingeführt worden. Dieses Modul enthält Funktionen, die denen des (inzwischen veralteten) Moduls qiskit.aqua.algorithms entsprechen, und stellt die Bausteine für die Konstruktion von Quantenalgorithmen bereit. Einzelheiten zur Migration von qiskit-aqua zu diesem neuen Modul finden Sie in der Migrationsanleitung.

  • Ein neues Modul qiskit.opflow ist eingeführt worden. Dieses Modul enthält die gleiche Funktionalität wie das (inzwischen veraltete) Modul qiskit.aqua.operators und stellt die Operatoren und Zustandsfunktionen bereit, die zum Aufbau von Quantenalgorithmen verwendet werden. Einzelheiten zur Migration von qiskit-aqua zu diesem neuen Modul finden Sie in der Migrationsanleitung.

  • Dies ist die erste Version, die vorkompilierte Binär-Räder für die Systeme Linux aarch64 enthält. Wenn Sie ein manylinux2014 kompatibles aarch64 Linux System verwenden, gibt es jetzt vorkompilierte Räder auf PyPI,. Sie müssen nicht mehr aus den Quellen bauen, um qiskit-terra zu installieren.

  • Die Funktion qiskit.quantum_info.process_fidelity() funktion kann nun auch mit einem nicht einheitlichen Zielkanal verwendet werden. In diesem Fall ist der zurückgegebene Wert gleich dem qiskit.quantum_info.state_fidelity() der normalisierten qiskit.quantum_info.Choi matrizen für die Kanäle.

    Beachten Sie, dass die qiskit.quantum_info.average_gate_fidelity() und qiskit.quantum_info.gate_error() immer noch voraussetzen, dass der Zielkanal einheitlich ist und eine Ausnahme auslösen, wenn dies nicht der Fall ist.

  • Es wurde eine neue Funktion zur Impulserzeugung hinzugefügt: qiskit.pulse.macro(). Dadurch können normale Python Funktionen als Makros dekoriert werden. Dies ermöglicht die Verwendung von Pulsbuilder-Funktionen innerhalb der dekorierten Funktion. Das Builder-Makro kann dann aus einem Pulse-Building-Kontext heraus aufgerufen werden, was die Wiederverwendung von Code ermöglicht.

    Beispiel:

    from qiskit import pulse
    
    @pulse.macro
    def measure(qubit: int):
        pulse.play(pulse.GaussianSquare(16384, 256, 15872),
                   pulse.MeasureChannel(qubit))
        mem_slot = pulse.MemorySlot(0)
        pulse.acquire(16384, pulse.AcquireChannel(0), mem_slot)
        return mem_slot
    
    with pulse.build(backend=backend) as sched:
        mem_slot = measure(0)
        print(f"Qubit measured into {mem_slot}")
    
    sched.draw()
  • Eine neue Klasse, PauliTwoDesign, wurde der qiskit.circuit.library hinzugefügt, die eine bestimmte Form einer 2-Entwurfsschaltung aus https://arxiv.org/pdf/1803.11173.pdf Diese Schaltung kann zum Beispiel so aussehen:

    from qiskit.circuit.library import PauliTwoDesign
    circuit = PauliTwoDesign(4, reps=2, seed=5, insert_barriers=True)
    circuit.decompose().draw(output='mpl')
  • Eine neue Impulsschublade qiskit.visualization.pulse_v2.draw() (mit dem Alias qiskit.visualization.pulse_drawer_v2) ist jetzt verfügbar. Diese neue Impulsschublade unterstützt mehrere neue Funktionen, die in der ursprünglichen Impulsschublade nicht vorhanden waren (pulse_drawer()).

    • Abschneiden von langen Impulsbefehlen.
    • Visualisierung von parametrischen Impulsen.
    • Neue Stylesheets IQXStandard, IQXSimple, IQXDebugging.
    • Visualisierung von Systeminformationen (Kanalfrequenz, etc...) durch Angabe von qiskit.providers.Backend objekte für die Visualisierung.
    • Angabe von axis Objekten für das Plotten, um die generierten Plots weiter auszubauen, z. B. für Publikationsmanipulationen.

    Neue Stylesheets können Callback-Funktionen übernehmen, die das Erscheinungsbild des Ausgabebildes dynamisch verändern, z. B. eine Sammlung von Kanälen neu zusammensetzen, Details von Anweisungen anzeigen, das Erscheinungsbild von Impulshüllkurven aktualisieren usw Sie können benutzerdefinierte Callback-Funktionen erstellen und diese in eine Stylesheet-Instanz einspeisen, um das Erscheinungsbild der Figur zu ändern, ohne den Code der Schublade zu modifizieren. Weitere Einzelheiten finden Sie in den Dokumentationen zum Modul Impulsschublade.

    Beachten Sie, dass das Speichern von Dateien jetzt an Matplotlib delegiert wird. Um Bilddateien zu speichern, müssen Sie die Methode savefig mit dem zurückgegebenen Objekt Figure aufrufen.

  • Fügt eine reverse_qargs() methode zu den qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix klassen. Diese Methode kehrt die Reihenfolge der Teilsysteme in den Zuständen um und ist äquivalent zu der qiskit.circuit.QuantumCircuit.reverse_bits() methode für N-Qubit-Zustände. Zum Beispiel:

    from qiskit.circuit.library import QFT
    from qiskit.quantum_info import Statevector
    
    circ = QFT(3)
    
    state1 = Statevector.from_instruction(circ)
    state2 = Statevector.from_instruction(circ.reverse_bits())
    
    state1.reverse_qargs() == state2
  • Fügt eine reverse_qargs() methode zu der qiskit.quantum_info.Operator klasse. Diese Methode kehrt die Reihenfolge der Subsysteme im Operator um und ist äquivalent zu der qiskit.circuit.QuantumCircuit.reverse_bits() methode für N-Qubit-Operatoren. Zum Beispiel:

    from qiskit.circuit.library import QFT
    from qiskit.quantum_info import Operator
    
    circ = QFT(3)
    
    op1 = Operator(circ)
    op2 = Operator(circ.reverse_bits())
    
    op1.reverse_qargs() == op2
  • Die Ausgabemethode latex für die qiskit.visualization.circuit_drawer() funktion und die draw() methode verwenden nun eine benutzerdefinierte Beschriftung für Gates in der Ausgabevisualisierung. Zum Beispiel:

    import math
    
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.rx(math.pi/2, 0, label='My Special Rotation')
    
    qc.draw(output='latex')
  • Der routing_method kwarg für die Funktion transpile() funktion akzeptiert jetzt eine neue Option, 'none'. Unter routing_method='none' wird kein Routing-Durchgang als Teil der Transpilation durchgeführt. Wenn die Schaltung nicht in den Kopplungsplan passt, wird eine TranspilerError ausnahme ausgelöst werden.

  • Eine neue Gatterklasse, RVGatewurde dem qiskit.circuit.library modul hinzugefügt, zusammen mit der entsprechenden QuantumCircuit methode rv(). Die RVGate ist ein allgemeines Drehtor, ähnlich dem UGatejedoch werden anstelle von Euler-Winkeln die drei Komponenten eines Rotationsvektors angegeben, wobei die Richtung des Vektors die Rotationsachse und der Betrag den Rotationswinkel um die Achse in Radiant angibt. Zum Beispiel:

    import math
    
    import np
    
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(1)
    theta = math.pi / 5
    phi = math.pi / 3
    # RGate axis:
    axis = np.array([math.cos(phi), math.sin(phi)])
    rotation_vector = theta * axis
    qc.rv(*rotation_vector, 0)
  • Ungebunden Parameter objekte, die in einem QuantumCircuit objekt verwendet werden, werden nun nach Namen sortiert. Dies wird für die Parameter wirksam, die vom parameters attribut zurückgegeben werden. Außerdem werden die qiskit.circuit.QuantumCircuit.bind_parameters() und qiskit.circuit.QuantumCircuit.assign_parameters() methoden nun eine Liste von a-Werten aufnehmen, die sie in nach Namen sortierter Reihenfolge an die Parameter binden/zuweisen. Zuvor konnten diese Methoden nur ein Wörterbuch mit Parametern und Werten aufnehmen. Zum Beispiel:

    from qiskit.circuit import QuantumCircuit, Parameter
    
    circuit = QuantumCircuit(1)
    circuit.rx(Parameter('x'), 0)
    circuit.ry(Parameter('y'), 0)
    
    print(circuit.parameters)
    
    bound = circuit.bind_parameters([1, 2])
    bound.draw(output='mpl')
  • Die Konstruktoren für die qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix klassen können nun ein QuantumCircuit objekt aufnehmen, um ein Statevector und DensityMatrix objekt aus dieser Schaltung erstellen, vorausgesetzt, die Qubits sind in ∣0⟩|0\rangle initialisiert. Zum Beispiel:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import Statevector
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    
    statevector = Statevector(qc)
    statevector.draw(output='latex')
  • Neue Fake-Backend-Klassen sind unter qiskit.test.mock verfügbar. Dazu gehören nachgebildete Versionen von ibmq_casablanca, ibmq_sydney, ibmq_mumbai, ibmq_lima, ibmq_belem, ibmq_quito. Wie bei den anderen gefälschten Backends enthalten diese Schnappschüsse von Kalibrierungsdaten (z. B. 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.

Bekannte Probleme

  • Der Versuch, ein qiskit.pulse.Instruction Objekt mit einem parametrisierten duration hinzuzufügen (d.h. der Wert von duration ist ein ungebundenes Parameter oder ParameterExpression objekt) zu einem qiskit.pulse.Schedule wird nicht unterstützt. Der Versuch, dies zu tun, führt zu UnassignedDurationError PulseError ausgelöst werden. Dies ist eine Einschränkung der Art und Weise, wie die Instruction Überschneidungsbeschränkungen derzeit ausgewertet werden. Dies wird unterstützt durch ScheduleBlockunterstützt, bei dem die Überschneidungsbeschränkungen unmittelbar vor der Ausführung ausgewertet werden.

  • Auf Windows-Systemen, auf denen die parallele Ausführung für parallel_map() aktiviert ist, funktioniert die Parallelität möglicherweise nicht, wenn sie von einem Skript aufgerufen wird, das außerhalb eines if __name__ == '__main__': -Blocks läuft. Das liegt daran, wie Python unter Windows parallele Prozesse startet. Wenn ein RuntimeError oder AttributeError von Skripten ausgelöst wird, die parallel_map() (einschließlich der Verwendung von Funktionen, die parallel_map() intern verwenden, wie transpile()) mit Windows und aktivierter Parallelität aufrufen, können Sie versuchen, die Skriptaufrufe in if __name__ == '__main__': einzubetten, um das Problem zu umgehen. Zum Beispiel:

    from qiskit import QuantumCircuit, QiskitError
    from qiskit import execute, Aer
    
    qc1 = QuantumCircuit(2, 2)
    qc1.h(0)
    qc1.cx(0, 1)
    qc1.measure([0,1], [0,1])
    # making another circuit: superpositions
    qc2 = QuantumCircuit(2, 2)
    qc2.h([0,1])
    qc2.measure([0,1], [0,1])
    execute([qc1, qc2], Aer.get_backend('qasm_simulator'))

    geändert werden in

    from qiskit import QuantumCircuit, QiskitError
    from qiskit import execute, Aer
    
    def main():
        qc1 = QuantumCircuit(2, 2)
        qc1.h(0)
        qc1.cx(0, 1)
        qc1.measure([0,1], [0,1])
        # making another circuit: superpositions
        qc2 = QuantumCircuit(2, 2)
        qc2.h([0,1])
        qc2.measure([0,1], [0,1])
        execute([qc1, qc2], Aer.get_backend('qasm_simulator'))
    
    if __name__ == '__main__':
        main()

    wenn bei der Parallelisierung unter Windows Fehler aufgetreten sind.

Anmerkungen zu Upgrades

  • Die voreingestellten Passmanager level_1_pass_manager, level_2_pass_manager, und level_3_pass_manager (die für optimization_level 1, 2, und 3 im transpile() und execute() funktionen verwendet werden) verwenden nun unbedingt den Optimize1qGatesDecomposition pass für die 1-Qubit-Gate-Optimierung. Zuvor verwendeten diese Passmanager den Optimize1qGates verwendet, wenn die Basis-Gates u1, u2 oder u3 enthielten. Wenn Sie weiterhin das alte Optimize1qGates verwenden möchten, müssen Sie eine benutzerdefinierte PassManager mit dem Pass.

  • Nach der Transpilation eines parametrisierten QuantumCircuitist das global_phase attribut der Ausgangsschaltung nicht mehr in vereinfachter Form zurückgegeben werden, wenn die globale Phase eine ParameterExpression.

    Zum Beispiel:

    qc = QuantumCircuit(1)
    theta = Parameter('theta')
    
    qc.rz(theta, 0)
    qc.rz(-theta, 0)
    
    print(transpile(qc, basis_gates=['p']).global_phase)

    lieferte bisher 0, jetzt aber -0.5*theta + 0.5*theta. Diese Änderung war notwendig, um einen großen Verlust an Laufzeitleistung zu vermeiden, da die Vereinfachung symbolischer Ausdrücke recht langsam sein kann, insbesondere wenn es viele ParameterExpression objekte in einem Schaltkreis gibt.

  • Die BasicAerJob job-Objekte, die von BasicAer Backends zurückgegeben werden, sind nun synchrone Instanzen von JobV1. Das bedeutet, dass die Aufrufe der run() blockiert werden, bis die Ausführung der Simulation beendet ist. Wenn Sie das vorherige asynchrone Verhalten wiederherstellen wollen, müssen Sie die run() mit etwas verpacken, das in einem separaten Thread oder Prozess wie futures.ThreadPoolExecutor oder futures.ProcessPoolExecutor ausgeführt wird.

  • Die Option allow_sample_measuring für den Simulator BasicAer QasmSimulatorPy wurde vom Standardwert False auf True geändert. Dies geschah, um das tatsächliche Standardverhalten des Simulators besser widerzuspiegeln, der die Probenmessung verwendet, wenn der Eingangsschaltkreis dies unterstützt (auch wenn sie nicht aktiviert ist). Wenn Sie eine Schaltung betreiben, die keine Sample-Messung unterstützt (d.h. sie hat Reset Operationen oder wenn es Operationen nach einer Messung auf einem Qubit gibt), sollten Sie sicherstellen, dass Sie diese Option explizit auf False setzen, wenn Sie run().

  • Der CommutativeCancellation transpiler-Pass kennt nun die Gatter der Zielbasis, d. h. er verwendet nur Gatter in der angegebenen Basis. Zuvor ersetzte der Pass bedingungslos aufeinanderfolgende Gatter, die sich mit ZGate mit dem U1Gate. Da der Pass nun jedoch basisbewusst ist und über einen kwarg, basis_gates, zur Angabe der Zielbasis verfügt, kann sich das Verhalten ändern, wenn der kwarg nicht gesetzt ist. Wenn der basis_gates kwarg nicht verwendet wird und keine variablen z-Rotationsgatter in der Schaltung vorhanden sind, erfolgt keine kommutative Aufhebung.

  • Register (das ist die übergeordnete Klasse für QuantumRegister und ClassicalRegister und Bit (die die übergeordnete Klasse für Qubit und Clbit) sind jetzt unveränderlich. In früheren Versionen war es möglich, den Wert von a size oder name attribute eines Register objekts und der index oder register attribute eines Bit objekts, nachdem es ursprünglich erstellt wurde. Dies würde jedoch zu einem unzulässigen Verhalten führen, das Container-Strukturen beschädigen würde, die auf einem Hash beruhen (wie z.B. ein dict), da diese Attribute als unveränderliche Eigenschaften eines Registers oder Bits behandelt werden (siehe #4705 für weitere Details). Um dieses unzulässige Verhalten zu vermeiden, werden die Attribute a Register und Bit nach der ersten Erstellung nicht mehr setzbar sind. Wenn Sie die Objekte bisher zur Laufzeit angepasst haben, müssen Sie nun ein neues Register oder Bit Objekt mit den neuen Werten erstellen.

  • Die Methode DAGCircuit.__eq__ (die vom Operator == verwendet wird), mit der die strukturelle Gleichheit von DAGCircuit und QuantumCircuit instanzen prüft, wird nun die global_phase und calibrations attribute in die auf Gleichheit geprüften Felder ein. Das bedeutet, dass Stromkreise, die in früheren Versionen als gleichwertig eingestuft wurden, nun möglicherweise nicht mehr gleichwertig sind, wenn sich die global_phase oder calibrations zwischen den Stromkreisen unterscheiden. In früheren Versionen würde dies beispielsweise True zurückgeben:

    import math
    
    from qiskit import QuantumCircuit
    
    qc1 = QuantumCircuit(1)
    qc1.x(0)
    
    qc2 = QuantumCircuit(1, global_phase=math.pi)
    qc2.x(0)
    
    print(qc2 == qc1)

    Da jedoch das Attribut global_phase der Schaltkreise unterschiedlich ist, wird nun False zurückgegeben.

  • Die zuvor veralteten Methoden qubits() und clbits() der Klasse DAGCircuit klasse, die in der Terra-Version 0.15.0 veraltet waren, wurden entfernt. Stattdessen sollten Sie die Attribute qubits und clbits der DAGCircuit klasse verwenden. Zum Beispiel, wenn Sie laufen würden:

    from qiskit.dagcircuit import DAGCircuit
    
    dag = DAGCircuit()
    qubits = dag.qubits()

    Dies würde durch ersetzt werden:

    from qiskit.dagcircuit import DAGCircuit
    
    dag = DAGCircuit()
    qubits = dag.qubits
  • Die PulseDefaults die von den Fake-Puls-Backends qiskit.test.mock.FakeOpenPulse2Q und qiskit.test.mock.FakeOpenPulse3Q zurückgegeben werden, wurden aktualisiert und enthalten nun realistischere Impulsfolgen-Definitionen. Wenn Sie diese gefälschten Backend-Klassen verwenden, müssen Sie Ihre Verwendung aufgrund dieser Änderungen möglicherweise aktualisieren.

  • Die Standard-Synthesemethode, die von der Funktion decompose_clifford() im quantum_info modul (die intern von der qiskit.quantum_info.Clifford.to_circuit() methode) für mehr als 3 Qubits verwendet nun eine nicht-optimale, gierige Kompilierungsroutine für die Synthese von Clifford-Elementen, die von Bravyi et. al., was in der Regel zu besseren CX-Kosten im Vergleich zum alten Standard führt. Wenn Sie zur vorherigen Aaronson-Gottesman-Methode zurückkehren möchten, können Sie dies unter method='AG' tun.

  • Das zuvor veraltete Modul qiskit.visualization.interactive, das in der Version 0.15.0 veraltet war, wurde nun entfernt. Stattdessen sollten Sie die matplotlib-basierten Visualisierungen verwenden:

    Interaktive Funktion entfernt
    Äquivalente Matplotlib-Funktion
    iplot_bloch_multivectorqiskit.visualization.plot_bloch_multivector()
    iplot_state_cityqiskit.visualization.plot_state_city()
    iplot_state_qsphereqiskit.visualization.plot_state_qsphere()
    iplot_state_hintonqiskit.visualization.plot_state_hinton()
    iplot_histogramqiskit.visualization.plot_histogram()
    iplot_state_paulivecqiskit.visualization.plot_state_paulivec()
  • Die Top-Level-Attribute qiskit.Aer und qiskit.IBMQ werden jetzt verzögert geladen. Dies bedeutet, dass die Objekte nun immer vorhanden sind und beim Import keine Warnungen mehr ausgegeben werden, wenn qiskit-aer oder qiskit-ibmq-provider nicht installiert sind (oder von Python nicht gefunden werden können). Wenn Sie das Vorhandensein von qiskit-aer oder qiskit-ibmq-provider mit Hilfe dieser Modulattribute überprüft haben und explizit mit None verglichen haben oder nach dem Fehlen des Attributs gesucht haben, wird dies nicht mehr funktionieren, da sie jetzt immer als Objekt definiert sind. Mit anderen Worten: Es läuft etwas wie:

    try:
        from qiskit import Aer
    except ImportError:
        print("Aer not available")
    
    or::
    
    try:
        from qiskit import IBMQ
    except ImportError:
        print("IBMQ not available")

    wird nicht mehr funktionieren. Um festzustellen, ob diese Anbieter vorhanden sind, können Sie entweder explizit qiskit.providers.aer.Aer und qiskit.providers.ibmq.IBMQ verwenden:

    try:
        from qiskit.providers.aer import Aer
    except ImportError:
        print("Aer not available")
    
    try:
        from qiskit.providers.ibmq import IBMQ
    except ImportError:
        print("IBMQ not available")

    oder überprüfen Sie stattdessen z. B. bool(qiskit.Aer) und bool(qiskit.IBMQ) :

    import qiskit
    
    if not qiskit.Aer:
        print("Aer not available")
    if not qiskit.IBMQ:
        print("IBMQ not available")

    Diese Änderung war notwendig, um potentielle Probleme mit dem Importzyklus zwischen den qiskit-Paketen zu vermeiden und auch um die Importzeit zu verbessern, wenn Aer oder IBMQ nicht verwendet werden.

  • Die Option suppress_packaging_warnings in der Benutzerkonfigurationsdatei und die Umgebungsvariable QISKIT_SUPPRESS_PACKAGING_WARNINGS haben keine Wirkung mehr und werden stillschweigend ignoriert. Die Warnungen, die diese Option kontrollierte, wurden entfernt und werden nicht mehr beim Import aus dem Modul qiskit ausgegeben.

  • Der zuvor veraltete condition kwarg für qiskit.dagcircuit.DAGNode konstruktor wurde entfernt. Sie wurde in der Version 0.15.0 veraltet. Stattdessen sollten Sie nun die klassische Bedingung auf das Instruction objekt setzen, das an den DAGNode konstruktor übergeben wird, wenn Sie einen neuen op Knoten erstellen.

  • Beim Erstellen einer neuen Register (das ist die übergeordnete Klasse für QuantumRegister und ClassicalRegister) oder QuantumCircuit objekts mit einer Anzahl von Bits (z. B. QuantumCircuit(2)) ist es jetzt erforderlich, dass die Anzahl der Bits als Ganzzahl oder als ein anderer Typ angegeben wird, der in eindeutige Ganzzahlen gecastet werden kann (z. B. 2.0). Nicht-ganzzahlige Werte führen nun zu einem Fehler, da die Absicht in diesen Fällen unklar war (man kann keine Nachkommastellen haben). Weitere Informationen darüber, warum dies geändert wurde, finden Sie unter: #4855

  • networkx ist keine Voraussetzung mehr für qiskit-terra. Die gesamte networkx-Nutzung in qiskit-terra wurde mit Ausnahme von 3 Methoden entfernt:

    • qiskit.dagcircuit.DAGCircuit.to_networkx
    • qiskit.dagcircuit.DAGCircuit.from_networkx
    • qiskit.dagcircuit.DAGDependency.to_networkx

    Wenn Sie eine dieser Methoden verwenden, müssen Sie networkx manuell in Ihrer Umgebung installieren, um sie weiterhin nutzen zu können.

  • Standardmäßig wird auf macOS mit Python >= 3.8 parallel_map() nicht mehr in mehreren Prozessen ausgeführt. Dies ist eine Änderung gegenüber früheren Versionen, bei denen das Standardverhalten war, dass parallel_map() mehrere Prozesse starten würde. Diese Änderung wurde vorgenommen, weil bei neueren Versionen von macOS mit Python 3.8 und 3.9 Multiprocessing entweder unzuverlässig ist oder einen erheblichen Overhead verursacht, weil Python 3.8 neue Prozesse mit spawn statt fork startet. Um die parallele Ausführung auf macOS mit Python >= 3.8 wieder zu aktivieren, können Sie die Option parallel in der Benutzerkonfigurationsdatei verwenden oder die Umgebungsvariable QISKIT_PARALLEL auf True setzen.

  • Der zuvor veraltete kwarg callback auf dem Konstruktor für die PassManager klasse wurde entfernt. Dieser Warg ist seit der Veröffentlichung von 0.13.0 (9. April 2020) veraltet. Stattdessen können Sie den callback kwarg direkt an die qiskit.transpiler.PassManager.run() methode direkt übergeben. Zum Beispiel, wenn Sie verwenden:

    from qiskit.circuit.random import random_circuit
    from qiskit.transpiler import PassManager
    
    qc = random_circuit(2, 2)
    
    def callback(**kwargs)
      print(kwargs['pass_'])
    
    pm = PassManager(callback=callback)
    pm.run(qc)

    kann dies durch ersetzt werden:

    from qiskit.circuit.random import random_circuit
    from qiskit.transpiler import PassManager
    
    qc = random_circuit(2, 2)
    
    def callback(**kwargs)
      print(kwargs['pass_'])
    
    pm = PassManager()
    pm.run(qc, callback=callback)
  • Es ist nun nicht mehr möglich, einen Basiskanal ohne ein Präfix wie qiskit.pulse.Channel oder qiskit.pulse.PulseChannel zu instanziieren. Diese Klassen dienen der Klassifizierung der verschiedenen Arten von benutzerseitigen Kanälen, wie z. B. qiskit.pulse.DriveChannel, haben aber keine Definition als Zielressource. Wenn Sie bisher entweder qiskit.pulse.Channel oder qiskit.pulse.PulseChannel direkt instanziiert haben, ist dies nicht mehr erlaubt. Bitte verwenden Sie die entsprechende Unterklasse.

  • Wenn die require_cp und/oder require_tp kwargs von qiskit.quantum_info.process_fidelity(), qiskit.quantum_info.average_gate_fidelity(), qiskit.quantum_info.gate_error()True sind, wird jetzt nur noch eine Warnung protokolliert und nicht wie bisher eine QiskitError ausnahme auslöst, wenn der Eingabekanal nicht-CP bzw. nicht-TP ist.

  • Die QFT klasse im Modul qiskit.circuit.library modul berechnet nun die Fourier-Transformation unter Verwendung einer Little-Endian-Darstellung von Tensoren, d. h. der Zustand ∣1⟩|1\rangle wird auf ∣0⟩−∣1⟩+∣2⟩−..|0\rangle - |1\rangle + |2\rangle - .. abgebildet, wobei angenommen wird, dass die Berechnungsbasis der Little-Endian-Bit-Reihenfolge der ganzen Zahlen entspricht. ∣0⟩=∣000⟩,∣1⟩=∣001⟩|0\rangle = |000\rangle, |1\rangle = |001\rangle, usw. Dies wurde getan, um eine bessere Übereinstimmung mit dem Rest von Qiskit zu erreichen, das eine Little-Endian-Konvention für die Bitreihenfolge verwendet. Wenn Sie von der vorherigen Bitreihenfolge abhängig waren, können Sie die Methode reverse_bits() verwenden, um zum vorherigen Verhalten zurückzukehren. Zum Beispiel:

    from qiskit.circuit.library import QFT
    
    qft = QFT(5).reverse_bits()
  • Das qiskit.__qiskit_version__ Modul-Attribut war zuvor ein dict und gibt nun ein benutzerdefiniertes, schreibgeschütztes Mapping Objekt zurück, das die Version von qiskit-Elementen zur Laufzeit statt zur Importzeit überprüft. Dies wurde getan, um den Importpfad von qiskit zu beschleunigen und einen möglichen Importzyklus zu eliminieren, indem die Elementpakete nur zur Laufzeit importiert werden, wenn die Version aus dem Paket benötigt wird. Dies sollte vollständig kompatibel mit dem dict sein, das zuvor zurückgegeben wurde, und für die meisten normalen Anwendungsfälle wird es keinen Unterschied geben. Wenn jedoch einige Anwendungen entweder auf die Mutation des Inhalts oder auf eine explizite Typüberprüfung angewiesen waren, kann es erforderlich sein, Aktualisierungen vorzunehmen, um sich an diese Änderung anzupassen.

  • Das Modul qiskit.execute wurde umbenannt in qiskit.execute_function. Dies war notwendig, um einen potentiellen Namenskonflikt zwischen der execute() funktion zu vermeiden, die als qiskit.execute re-exportiert wird. qiskit.execute die Funktion in einigen Situationen mit qiskit.execute dem Modul in Konflikt geraten könnte, was zu einem kryptischen Fehler führen würde, weil Python qiskit.execute als das Modul behandelt, obwohl die Absicht die Funktion war oder umgekehrt. Die Umbenennung des Moduls war notwendig, um diesen Konflikt zu vermeiden. Wenn Sie qiskit.execute importieren, um das Modul zu erhalten (typischerweise wurde from qiskit.execute import execute verwendet), müssen Sie dies aktualisieren, um stattdessen qiskit.execute_function zu verwenden. qiskit.execute wird nun immer in die Funktion aufgelöst.

  • Die Module qiskit.compiler.transpile, qiskit.compiler.assemble, qiskit.compiler.schedule und qiskit.compiler.sequence wurden umbenannt in qiskit.compiler.transpiler, qiskit.compiler.assembler, qiskit.compiler.scheduler bzw. qiskit.compiler.sequence . Dies war notwendig, um einen potentiellen Namenskonflikt zwischen den Modulen und den neu exportierten Funktionspfaden zu vermeiden qiskit.compiler.transpile(), qiskit.compiler.assemble(), qiskit.compiler.schedule(), und qiskit.compiler.sequence(). In manchen Situationen führte dieser Namenskonflikt zwischen dem Modulpfad und dem Pfad der reexportierten Funktion zu einem kryptischen Fehler, weil Python einen Import als Modul behandelte, obwohl die Funktion verwendet werden sollte oder umgekehrt. Die Umbenennung des Moduls war notwendig, um diesen Konflikt zu vermeiden. Wenn Sie zuvor die Importe verwendet haben, um die Module zu erhalten (eine typische Verwendung wäre wie from qiskit.compiler.transpile import transpile), müssen Sie dies aktualisieren, um die neuen Modulpfade zu verwenden. qiskit.compiler.transpile(), qiskit.compiler.assemble(), qiskit.compiler.schedule(),, und qiskit.compiler.sequence() werden nun immer zu den Funktionen aufgelöst.

  • Die Klasse qiskit.quantum_info.Quaternion wurde aus dem Submodul qiskit.quantum_info.operator in das Submodul qiskit.quantum_info.synthesis verschoben, um ihren Zweck besser zu erfüllen. Es ist keine Änderung erforderlich, wenn Sie das Modul aus dem Stamm qiskit.quantum_info modul importiert haben, aber wenn Sie von qiskit.quantum_info.operator importiert haben, müssen Sie Ihren Importpfad aktualisieren.

  • Die Methode QuantumCircuit.mcmt wurde entfernt, da sie seit der Veröffentlichung von Qiskit Terra 0.14.0 im April 2020 veraltet ist. Anstatt die Methode zu verwenden, benutzen Sie bitte die MCMT klasse, um ein Multi-Control-Multi-Target-Gate zu konstruieren, und verwenden Sie die qiskit.circuit.QuantumCircuit.append() oder qiskit.circuit.QuantumCircuit.compose() um es in eine Schaltung einzufügen.

    Sie können zum Beispiel ersetzen:

    circuit.mcmt(ZGate(), [0, 1, 2], [3, 4])

    mit:

    from qiskit.circuit.library import MCMT
    mcmt = MCMT(ZGate(), 3, 2)
    circuit.compose(mcmt, range(5))
  • Die Methode QuantumCircuit.diag_gate wurde entfernt, da sie seit der Veröffentlichung von Qiskit Terra 0.14.0 im April 2020 veraltet ist. Verwenden Sie stattdessen die diagonal() methode von QuantumCircuit.

  • Die Methode QuantumCircuit.ucy wurde entfernt, da sie seit der Veröffentlichung von Qiskit Terra 0.14.0 im April 2020 veraltet ist. Verwenden Sie stattdessen die ucry() methode von QuantumCircuit.

  • Die zuvor veraltete mirror() Methode für qiskit.circuit.QuantumCircuit wurde entfernt. Sie wurde in der Version 0.15.0 veraltet. Die qiskit.circuit.QuantumCircuit.reverse_ops() methode sollte stattdessen verwendet werden, da das Spiegeln mit dem Vertauschen der Ausgangsqubits der Schaltung verwechselt werden könnte. Bei der Methode reverse_ops() wird lediglich die Reihenfolge der angelegten Gatter umgekehrt, anstatt sie zu spiegeln.

  • Die zuvor veraltete Unterstützung der Übergabe eines Floats (für scale kwarg) als erstes Positionsargument an die Funktion qiskit.circuit.QuantumCircuit.draw() wurde entfernt. Sie wurde in der Version 0.12.0 veraltet. Das erste Positionsargument für die qiskit.circuit.QuantumCircuit.draw() methode ist jetzt die output kwarg, die keinen Float akzeptiert. Stattdessen sollten Sie scale als benanntes kwarg verwenden, anstatt es an einer bestimmten Stelle einzusetzen.

    Wenn Sie zum Beispiel vorher draw mit aufgerufen haben:

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.draw(0.75, output='mpl')

    müsste dies nun der Fall sein:

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.draw(output='mpl', scale=0.75)

    oder:

    qc.draw('mpl', scale=0.75)
  • Funktionen von Qiskit Pulse (qiskit.pulse), die in der Version 0.15.0 (August 2020) veraltet waren, wurden entfernt. Die Änderungen umfassen folgende Punkte:

    Modul
    Alt
    Neu
    qiskit.pulse.librarySamplePulseWaveform
    qiskit.pulse.libraryConstantPulseConstant
    (Modul umbenennen)pulse.pulse_lib Modulqiskit.pulse.library
    Klasse
    Alte Methode
    Neue Methode
    ParametricPulseget_sample_pulseget_waveform
    InstructioncommandNicht zutreffend. Die Befehle und Anweisungen wurden vereinheitlicht. Verwenden Sie operands() , um Informationen über die Befehlsdaten zu erhalten.
    Acquireacquires, mem_slots, reg_slotsacquire(), mem_slot(), reg_slot(). (Der Acquire anweisung sendet nicht mehr über mehrere Qubits.)
  • Das Wörterbuch, das zuvor auf DAGCircuit kanten gespeichert war, wurde entfernt. Stattdessen enthalten die Kanten nun die Bit instanz, die zuvor im Wörterbuch enthalten war, als ihr 'wire' Feld. Beachten Sie, dass der von to_networkx() zurückgegebene Graph NetworkX immer noch ein Wörterbuch für seine Kantenattribute hat, aber das Feld 'name' wird nicht mehr ausgefüllt.

  • Das parameters attribut der QuantumCircuit klasse gibt nicht mehr set zurück. Stattdessen wird ein ParameterView -Objekt zurückgegeben, das alle Methoden implementiert, die set bietet (wenn auch veraltet). Dies wurde getan, um ein Modell zu unterstützen, das nach Namen sortierte Parameter beibehält. Es sollte vollständig kompatibel sein mit jeder früheren Verwendung von set , die von dem parameters attributs zurückgegeben wird, mit Ausnahme der Fälle, in denen eine explizite Typüberprüfung einer Menge durchgeführt wurde.

  • Beim Betrieb transpile() auf einer QuantumCircuit mit delay() ausgeführt wird, werden die Einheiten in dt umgerechnet, wenn der Wert von dt (Abtastzeit) bekannt ist transpile()bekannt ist, entweder explizit über den dt kwarg oder über den BackendConfiguration für ein Backend Objekt, das über den backend kwarg übergeben wird.

  • Die Interpretation von meas_map (das ein Attribut eines PulseBackendConfiguration objekts oder als das entsprechende meas_map kwarg auf der schedule(), assemble(), sequence(), oder execute() funktionen) wurde aktualisiert, um den tatsächlichen Beschränkungen der Hardware besser zu entsprechen. Das Format dieser Daten ist eine Liste von Listen, wobei die Elemente in der inneren Liste ganze Zahlen sind, die die Bezeichnungen der Qubits angeben. Zum Beispiel:

    [[A, B, C], [D, E, F, G]]

    Zuvor wurde die Einschränkung meas_map so interpretiert, dass, wenn ein Qubit erfasst wurde (z. B. A), alle anderen Qubits, die eine Untergruppe mit diesem Qubit teilen (B und C), zur gleichen Zeit und für die gleiche Dauer erfasst werden müssen. Diese Einschränkung wurde gelockert. Ein Erwerb erfordert keine weiteren Erwerbe. (Wenn A erworben wird, brauchen B und C nicht erworben zu werden) Stattdessen können Qubits in der gleichen Messgruppe nicht teilweise überlappend erfasst werden - stellen Sie sich vor, dass meas_map eine gemeinsame Erfassungsressource angibt (wenn wir A von t=1000 bis t=2000 erfassen, können wir B nicht ab 1000<t<2000 erfassen). Zum Beispiel:

    # Good
    meas_map = [[0, 1]]
    # Acquire a subset of [0, 1]
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    
    # Acquire 0 and 1 together (same start time, same duration)
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    sched = sched.append(pulse.Acquire(10, acq_q1))
    
    # Acquire 0 and 1 disjointly
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    sched = sched.append(pulse.Acquire(10, acq_q1)) << 10
    
    # Acquisitions overlap, but 0 and 1 aren't in the same measurement
    # grouping
    meas_map = [[0], [1]]
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    sched = sched.append(pulse.Acquire(10, acq_q1)) << 1
    
    # Bad: 0 and 1 are in the same grouping, but acquisitions
    # partially overlap
    meas_map = [[0, 1]]
    sched = pulse.Schedule()
    sched = sched.append(pulse.Acquire(10, acq_q0))
    sched = sched.append(pulse.Acquire(10, acq_q1)) << 1

Hinweise zu veralteten Versionen

  • Es wurden zwei neue Argumente hinzugefügt qiskit.dagcircuit.DAGNode.semantic_eq(), bit_indices1 und bit_indices2, hinzugefügt, von denen erwartet wird, dass sie die Bit instanzen in jeder DAGNode auf ihren Index in der Liste qubits oder clbits der jeweiligen DAGCircuit. Während des Abschaffungszeitraums sind diese Argumente optional, und wenn sie nicht angegeben werden, werden die Zuordnungen automatisch auf der Grundlage der Eigenschaften register und index der einzelnen Bit instanz. In einer zukünftigen Version werden sie jedoch erforderliche Argumente sein, und die Zuordnung muss vom Benutzer vorgenommen werden.

  • Die pulse funktionen des Erbauers:

    • qiskit.pulse.call_circuit()
    • qiskit.pulse.call_schedule()

    sind veraltet und werden in einer zukünftigen Version entfernt. Diese Funktionen sind in qiskit.pulse.call() zusammengefasst und sollten stattdessen verwendet werden.

  • Die Methode qiskit.pulse.Schedule methode qiskit.pulse.Schedule.flatten() ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen können Sie die Funktion qiskit.pulse.transforms.flatten() funktion verwenden, die denselben Vorgang ausführt.

  • Die assign_parameters() für die folgenden Klassen:

    und alle ihre Unterklassen sind jetzt veraltet und werden in einer zukünftigen Version entfernt werden. Diese Funktionalität wurde subsumiert ScheduleBlock was die zukünftige Richtung für die Konstruktion von parametrisierten Pulsprogrammen ist.

  • Das Attribut parameters für die folgenden Klassen:

    ist veraltet und wird in einer zukünftigen Version entfernt werden. Diese Funktionalität wurde subsumiert ScheduleBlock was die zukünftige Richtung für die Konstruktion von parametrisierten Pulsprogrammen ist.

  • Python 3.6 unterstützung ist veraltet und wird in einer zukünftigen Version entfernt werden. Wenn die Unterstützung eingestellt wird, müssen Sie die von Ihnen verwendete Version von Python auf Python 3.7 oder höher aktualisieren.

  • Zwei QuantumCircuit methoden combine() und extend() sowie die entsprechenden Operatoren Python + und += sind veraltet und werden in einer zukünftigen Version entfernt. Stattdessen wird die QuantumCircuit methode compose() verwendet werden. Die compose() methode ermöglicht mehr Flexibilität bei der Zusammenstellung von zwei Schaltkreisen, die keine übereinstimmenden Register haben. Sie fügt jedoch im Gegensatz zu den veralteten Methoden nicht automatisch Qubits/Clbits hinzu. Um eine Schaltung auf neuen Qubits/Clbits hinzuzufügen, kann die qiskit.circuit.QuantumCircuit.tensor() methode verwendet werden. Zum Beispiel:

    from qiskit.circuit import QuantumRegister, QuantumCircuit
    
    a = QuantumRegister(2, 'a')
    circuit_a = QuantumCircuit(a)
    circuit_a.cx(0, 1)
    
    b = QuantumRegister(2, 'b')
    circuit_b = QuantumCircuit(b)
    circuit_b.cz(0, 1)
    
    # same as circuit_a + circuit_b (or combine)
    added_with_different_regs = circuit_b.tensor(circuit_a)
    
    # same as circuit_a + circuit_a (or combine)
    added_with_same_regs = circuit_a.compose(circuit_a)
    
    # same as circuit_a += circuit_b (or extend)
    circuit_a = circuit_b.tensor(circuit_a)
    
    # same as circuit_a += circuit_a (or extend)
    circuit_a.compose(circuit_a, inplace=True)
  • Unterstützung für die Übergabe von Qubit instanzen an den qubits kwarg der qiskit.transpiler.InstructionDurations.get() methode ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollten Sie die Methode get() methode mit den ganzzahligen Indizes der gewünschten Qubits aufrufen.

  • Die Verwendung von @ (__matmul__) für den Aufruf der Methode compose von BaseOperator Unterklassen (z.B Operator) ist veraltet und wird in einer zukünftigen Version entfernt werden. Die Methode qiskit.quantum_info.Operator.compose() methode kann direkt verwendet oder auch über den Operator & (__and__) aufgerufen werden.

  • Die Verwendung von * (__mul__) für den Aufruf der dot() methode von BaseOperator Unterklassen (z.B qiskit.quantum_info.Operator) ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen können Sie einfach die dot() direkt aufrufen.

  • Verwendung von @ (__matmul__) für den Aufruf der evolve() methode der qiskit.quantum_info.Statevector und qiskit.quantum_info.DensityMatrix klassen ist veraltet und wird in einer zukünftigen Version entfernt werden. Die Methode evolve kann direkt verwendet oder auch über den Operator & (__and__) aufgerufen werden.

  • Die Klasse qiskit.pulse.schedule.ParameterizedSchedule ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen können Sie direkt Impuls Schedule objekte direkt mit einem Parameter objekt parametrisieren, zum Beispiel:

    from qiskit.circuit import Parameter
    from qiskit.pulse import Schedule
    from qiskit.pulse import ShiftPhase, DriveChannel
    
    theta = Parameter('theta')
    target_schedule = Schedule()
    target_schedule.insert(0, ShiftPhase(theta, DriveChannel(0)), inplace=True)
  • Die Klasse qiskit.pulse.ScheduleComponent im Modul qiskit.pulse modul ist veraltet und wird in einer zukünftigen Version entfernt werden. Seine Verwendung sollte entweder durch eine qiskit.pulse.Schedule oder qiskit.pulse.Instruction direkt ersetzt werden. Darüber hinaus war der Hauptzweck der Klasse ScheduleComponent als gemeinsame Basisklasse sowohl für Schedule und Instruction für jede Stelle, die explizit eine Typüberprüfung durchführt oder dokumentiert, dass eine ScheduleComponent -Eingabe akzeptiert wird, sollte aktualisiert werden, um Instruction oder Schedule.

  • Die JSON-Schemadateien und die Verwendung für die IBMQ-API-Payloads sind veraltet und werden in einer zukünftigen Version entfernt. Dies umfasst alles unter dem Modul qiskit.schemas und dem Modul qiskit.validation . Dazu gehören auch die validate kwargs für qiskit.qobj.QasmQobj.to_dict() und qiskit.qobj.QasmQobj.to_dict() zusammen mit den Fastjsonschema-Validatoren auf Modulebene in qiskit.qobj (die keine Verwerfungswarnung auslösen). Die Schemadateien wurden in das Repository Qiskit/ibmq-schemas verschoben und sollten als die kanonischen Versionen der API-Schemas behandelt werden. In Zukunft werden nur noch diese Schemata aktualisiert und als Quelle der Wahrheit für die Schemata verwendet. Wenn Sie sich auf die in qiskit-terra gebündelten Schemata verlassen haben, sollten Sie ein Update durchführen und stattdessen dieses Repository verwenden.

  • Das Modul qiskit.util ist veraltet und wird in einer zukünftigen Version entfernt werden. Sie wurde ersetzt durch qiskit.utils ersetzt, das die gleiche Funktionalität bietet und in Zukunft noch erweitert werden soll. Beachten Sie, dass keine DeprecationWarning bezüglich dieser Verwerfung ausgegeben wird, da dies auf Python 3.6 nicht möglich war.

  • Der CXDirection Transpiler-Pass im qiskit.transpiler.passes modul ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollte die GateDirection verwendet werden. Es verhält sich identisch zu CXDirection , mit der Ausnahme, dass es nun auch die Transformation einer Schaltung mit ECRGate gattern zusätzlich zu CXGate gattern.

  • Der CheckCXDirection Transpiler-Pass im qiskit.transpiler.passes modul ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollte der CheckGateDirection Pass verwendet werden. Es verhält sich identisch zu CheckCXDirection , mit der Ausnahme, dass es jetzt auch die Überprüfung der Richtung aller 2-Qubit-Gatter unterstützt, nicht nur der CXGate gatter.

  • Die Methode WeightedAdder methode num_ancilla_qubits() ist veraltet und wird in einer zukünftigen Version entfernt werden. Es wurde ersetzt durch das qiskit.circuit.library.WeightedAdder.num_ancillas attribut ersetzt, das mit den APIs anderer Schaltkreisbibliotheken konsistent ist.

  • Die folgenden Legacy-Methoden der Klasse qiskit.quantum_info.Pauli klasse wurden veraltet. Siehe die Methodendokumentation zur Ersatzverwendung in der aktualisierten Pauli-Klasse.

    • from_label()
    • sgn_prod()
    • to_spmatrix()
    • kron()
    • update_z()
    • update_x()
    • insert_paulis()
    • append_paulis()
    • delete_qubits()
    • pauli_single()
    • random()
  • Die Verwendung eines list oder numpy.ndarray als channel oder target Argument für die qiskit.quantum_info.process_fidelity(), qiskit.quantum_info.average_gate_fidelity(), qiskit.quantum_info.gate_error(), und qiskit.quantum_info.diamond_norm() funktionen ist veraltet und wird in zukünftigen Versionen nicht mehr unterstützt. Die Eingaben sollten stattdessen ein Gate oder ein Objekt der Unterklasse BaseOperator (z. B. Operator, Choi, etc.)

  • Zugriff auf Referenzen von Qubit und Clbit instanzen auf die sie enthaltenden Register über die register oder index eigenschaften wurde veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen, Register können Objekte abgefragt werden, um die Bit objekte zu finden, die sie enthalten.

  • Die derzeitige Funktionalität der qiskit.visualization.pulse_drawer() funktion ist veraltet und wird in einer zukünftigen Version durch qiskit.visualization.pulse_drawer_v2() (die nicht abwärtskompatibel ist) ersetzt werden.

  • Die Verwendung von Methoden, die vom Typ set geerbt wurden, bei der Ausgabe des parameters attributs (das früher ein set war) der QuantumCircuit klasse sind veraltet und werden in einer zukünftigen Version entfernt werden. Dazu gehören die Methoden von add(), difference(), difference_update(), discard(), intersection(), intersection_update(), issubset(), issuperset(), symmetric_difference(), symmetric_difference_update(), union(), update(), __isub__() (das ist der Operator -= ) und __ixor__() (das ist der Operator ^= ).

  • Der Name des ersten (und einzigen) Positionsarguments für die qiskit.circuit.QuantumCircuit.bind_parameters() methode hat sich von value_dict in values geändert. Die Übergabe eines Arguments mit dem Namen values_dict ist veraltet und wird in zukünftigen Versionen entfernt werden. Wenn Sie zum Beispiel vorher bind_parameters() mit einem Aufruf wie: bind_parameters(values_dict={}) aufgerufen haben, ist dies veraltet und sollte durch bind_parameters(values={}) ersetzt werden, oder noch besser, Sie übergeben das Argument einfach an der Position bind_parameters({}).

  • Der Name des ersten (und einzigen) Positionsarguments für die qiskit.circuit.QuantumCircuit.assign_parameters() methode hat sich von param_dict in parameters geändert. Die Übergabe eines Arguments mit dem Namen param_dict ist veraltet und wird in zukünftigen Versionen entfernt werden. Wenn Sie zum Beispiel vorher assign_parameters() mit einem Aufruf wie: assign_parameters(param_dict={}) aufgerufen haben, ist dies veraltet und sollte durch assign_parameters(values={}) ersetzt werden, oder noch besser, Sie übergeben das Argument einfach an der Position assign_parameters({}).

Fehlerkorrekturen

  • Ein Problem wurde behoben, bei dem die execute() funktion eine QiskitError auslöste, wenn ein ParameterVector objekt für den parameter_bind kwarg übergeben wurde. Parameter an. Zum Beispiel ist es jetzt möglich, etwas aufzurufen wie:

    execute(circuit, backend, parameter_binds=[{pv1: [...], pv2: [...]}])

    wobei pv1 und pv2 ParameterVector objekte sind. Behoben #5467

  • Es wurde ein Problem behoben, bei dem die Beschriftungen von parametrischen Impulsen in der PulseQobjInstruction klasse nicht richtig gesetzt wurden, wie es bei abgetasteten Impulsen der Fall ist. Das bedeutet auch, dass Impulsnamen, die aus dem PulseDefaults die von einem Backendzurückgegeben werden, wie z. B. x90, x90m, usw., richtig gesetzt werden. Behoben #5363

  • Ein Problem wurde behoben, bei dem ungebundene Parameter nur im global_phase attribut eines QuantumCircuit objekts vorkommen, nicht im parameters attribut angezeigt und konnten nicht gebunden werden. Behoben #5806

  • Das calibrations attribut von QuantumCircuit objekten bleiben nun erhalten, wenn += (d.h. die Methode extend() ) und + (d.h. die Methode combine() ) verwendet werden. Behoben #5930 und #5908

  • Die name setter-Methode der Klasse Register (die die übergeordnete Klasse von QuantumRegister und ClassicalRegister) prüfte bisher nicht, ob die zugewiesene Zeichenkette ein gültiger Registername gemäß der Spezifikation von OpenQASM ist. Diese Prüfung wurde bisher nur durchgeführt, wenn der Name im Konstruktor angegeben wurde. Dies wurde nun korrigiert, so dass das direkte Setzen des Attributs name mit einem ungültigen Wert nun ebenfalls eine Ausnahme auslöst. Behoben #5461

  • Es wurde ein Problem mit der qiskit.visualization.circuit_drawer() funktion und qiskit.circuit.QuantumCircuit.draw() methode bei der Visualisierung einer QuantumCircuit mit einer Gate die eine klassische Bedingung nach einer Measure hat, die die gleiche ClassicalRegisterverwendet, war es möglich, dass die Bedingung Gate auf der linken Seite des Measure angezeigt werden. Behoben #5387

  • Im Transpiler-Durchgang qiskit.transpiler.passes.CSPLayout konnte eine Tendenz zu den niederwertigen Qubits beobachtet werden. Diese unerwünschte Verzerrung wurde beseitigt, indem die Kandidaten gemischt wurden, um die Ergebnisse zu randomisieren. Außerdem ist die Verwendung des CSPLayout passes in der preset_passmanagers (für Level 2 und 3) angepasst worden, um einen konfigurierten Seed zu verwenden, wenn der seed_transpiler kwarg beim transpile() aufgerufen wird. Behoben #5990

  • Behebt einen Fehler, bei dem das Feld channels für ein PulseBackendConfiguration objekt nicht in die Ausgabe der qiskit.providers.models.PulseBackendConfiguration.to_dict methode enthalten war. Behoben #5579

  • Behebung der 'circular' Verschränkung in der qiskit.circuit.library.NLocal schaltkreisklasse für den Grenzfall, dass der Schaltkreis die gleiche Größe wie der Verschränkungsblock hat (z. B. ein Zwei-Qubit-Schaltkreis und CZ-Verschränkungsgatter). In diesem Fall sollte es nur ein Verschränkungsgatter geben, aber es wurde versehentlich ein zweites in der umgekehrten Richtung wie das erste hinzugefügt. Festgelegt qiskit-community/qiskit-aqua#1452

  • Die Behandlung von Haltepunkten in der PiecewisePolynomialPauliRotations klasse in der qiskit.circuit.library. Für die Intervalle n sind jetzt n+1 Haltepunkte erlaubt. Dies ermöglicht die Angabe eines anderen Endintervalls als 2num qubits2^\text{num qubits}. Dies ist wichtig, weil die Funktion vom Ende des letzten Intervalls bis 2num qubits2^\text{num qubits} die Identität ist.

  • Es wurde ein Problem in der qiskit.circuit.library.Permutation schaltkreisklasse, bei dem einige Permutationen nicht korrekt erzeugt wurden. Dieses Problem könnte auch auftreten qiskit.circuit.library.QuantumVolume wenn es mit classical_permutation=False` aufgerufen wurde. Behoben #5812

  • Ein Problem wurde behoben, bei dem die QASM-Ausgabe mit der qasm() methode für ein QuantumCircuit objekt, das eine ControlledGate mit einem offenen Steuerelement die Ausgabe so erfolgte, als ob alle Steuerelemente geschlossen wären, unabhängig von dem angegebenen Zustand des Steuerelements. Dies würde dazu führen, dass ein anderer Schaltkreis aus from_qasm_str() beim Parsen des erzeugten QASM.

    Dies wurde behoben, indem der QASM-Ausgang von qasm() behoben, indem ein zusammengesetztes Gatter definiert wurde, das XGate zur Implementierung der Öffnungssteuerung verwendet. Der Name des zusammengesetzten Gatters lautet <original_gate_name>_o<ctrl_state> , wobei o für die offene Steuerung und ctrl_state für den ganzzahligen Wert des Steuerungszustands steht. Behoben #5443

  • Ein Problem wurde behoben, bei dem die Bindung von Parameter objekte in einer QuantumCircuit mit der parameter_binds in der execute funktion dazu führen würde, dass alle gebundenen QuantumCircuit objekte denselben name haben, was bedeutete, dass auch die Ergebnisnamen nicht eindeutig waren. Diese Korrektur bewirkt, dass die bind_parameters() und assign_parameters() einen eindeutigen Schaltkreisnamen zuweisen, wenn inplace=False als:

    <base name>-<class instance no.>[-<pid name>]

    wobei <base name> der Name ist, der mit dem Kwarg "name" angegeben wird, andernfalls wird "circuit" verwendet. Die Klasseninstanznummer wird jedes Mal erhöht, wenn eine Instanz der Klasse erzeugt wird. <pid name> wird angehängt, wenn es außerhalb des Hauptprozesses aufgerufen wird. Behoben #5185

  • Es wurde ein Problem mit der Funktion scheduler() behoben, bei dem eine Ausnahme ausgelöst wurde, wenn ein Eingangskreis ein ungebundenes Objekt enthielt QuantumCircuit objekt enthielt. Behoben #5304

  • Es wurde ein Problem in den qiskit.transpiler.passes.TemplateOptimization transpiler-Durchläufen behoben, bei denen Template-Schaltungen, die ungebundene Parameter objekte enthielten, in einigen Szenarien abstürzten, wenn die Parameter während der Anpassung der Vorlage nicht gebunden werden konnten. Nun, wenn die Parameter objekte nicht gebunden werden können, werden Templates mit ungebundenen Parameter werden verworfen und von der TemplateOptimization passieren. Behoben #5533

  • Es wurde ein Problem mit der qiskit.visualization.timeline_drawer() funktion, bei der klassische Bits nicht korrekt behandelt wurden. Behoben #5361

  • Ein Problem in der qiskit.visualization.circuit_drawer() funktion und der qiskit.circuit.QuantumCircuit.draw() methode, bei denen Delay anweisungen in einem QuantumCircuit objekt nicht korrekt als Leerlaufzeit behandelt wurden. Wenn also die idle_wires kwarg auf False gesetzt wurde, wurden die Drähte mit den Delay objekte immer noch angezeigt werden. Dies wurde behoben, so dass die Leerlaufdrähte aus der Visualisierung entfernt werden, wenn sich nur Delay objekte auf einem Draht sind.

  • Wenn zuvor die Option layout_method kwarg an die Funktion transpile() funktion übergeben wurde und die optimization_level kwarg auf >= 2 gesetzt wurde, damit der Durchlauf qiskit.transpiler.passes.CSPLayout ausgeführt werden sollte, wenn CSPLayout eine Lösung fand, wurde die Methode in layout_method nicht ausgeführt. Dies wurde korrigiert, so dass die Angabe layout_method immer beachtet wird. Behoben #5409

  • Wenn das Argument coupling_map=None (entweder explizit gesetzt, implizit als Standardwert gesetzt oder über das backend kwarg), wurde der Schaltkreis beim Transpilieren nicht "eingebettet". Das heißt, selbst wenn eine initial_layout angegeben war, wurden die virtuellen Qubits nicht den physischen Qubits zugeordnet. Dies wurde korrigiert, so dass die qiskit.compiler.transpile() funktion das Argument initial_layout beachtet, indem sie den Schaltkreis einbettet:

    from qiskit import QuantumCircuit, QuantumRegister
    from qiskit.compiler import transpile
    
    qr = QuantumRegister(2, name='qr')
    circ = QuantumCircuit(qr)
    circ.h(qr[0])
    circ.cx(qr[0], qr[1])
    
    transpile(circ, initial_layout=[1, 0]).draw(output='mpl')

    Wenn sich die initial_layout auf mehr Qubits bezieht als in der Schaltung vorhanden sind, wird die Schaltung durch den Transpilierungsprozess um Ancillas erweitert.

    from qiskit import QuantumCircuit, QuantumRegister
    from qiskit.compiler import transpile
    
    qr = QuantumRegister(2, name='qr')
    circ = QuantumCircuit(qr)
    circ.h(qr[0])
    circ.cx(qr[0], qr[1])
    
    transpile(circ, initial_layout=[4, 2], coupling_map=None).draw()

    Behoben #5345

  • Ein neuer kwarg, user_cost_dict , wurde dem Konstruktor für den qiskit.transpiler.passes.TemplateOptimization transpiler-Pass hinzugefügt. Dies ermöglicht es den Nutzern, ein benutzerdefiniertes Kostenverzeichnis für die Gates des zugrundeliegenden Template-Matching-Algorithmus zu erstellen. Zum Beispiel:

    from qiskit.transpiler.passes import TemplateOptimization
    
    cost_dict = {'id': 0, 'x': 1, 'y': 1, 'z': 1, 'h': 1, 't': 1}
    pass = TemplateOptimization(user_cost_dict=cost_dict)
  • Ein Problem bei der Übergabe des Counts objekt, das von get_counts() an marginal_counts() zurückgegebene Objekt ein nicht korrekt formatiertes Counts objekt mit bestimmten Eingaben erzeugte, wurde behoben. Korrekturen #5424

  • Verbesserte Zuweisung von Hilfsqubits in PolynomialPauliRotations und PiecewiseLinearPauliRotations was die Implementierung dieser Schaltungen effizienter macht. #5320 und #5322 behoben

  • Fixierung der Verwendung der zugewiesenen Hilfsqubits in der MCXGate in der WeightedAdder klasse. Diese wurden zuvor zugewiesen, aber nicht verwendet. Behoben #5321

  • In einer Reihe von Fällen ist die latex Ausgabemethode für die qiskit.visualization.circuit_drawer() funktion und die draw() methode den Gatternamen nicht korrekt an, und in anderen Fällen wurden die Gatterparameter nicht an der richtigen Stelle angezeigt. Jetzt werden die Gatternamen auf die gleiche Weise angezeigt wie bei der Ausgabemethode mpl , und die Parameter werden für alle Gatter angezeigt, die sie haben. Außerdem wurden einige der Tore nicht in der richtigen Form angezeigt, was nun behoben wurde. Behebungen #5605, #4938 und #3765

  • Ein Problem wurde behoben, das auftrat, wenn die Methode qiskit.circuit.Instruction.to_instruction() auf einen Subcircuit angewendet wurde, der klassische Register enthielt und dieses Instruction objekt wurde dann zu einem QuantumCircuit objekt hinzugefügt wurde, dann wurde die Ausgabe der qiskit.visualization.circuit_drawer() funktion und der qiskit.circuit.QuantumCircuit.draw() methode in einigen Fällen die Teilschaltung links von einem Takt anzeigte, obwohl sie rechts hätte angezeigt werden müssen. Behoben #5947

  • Ein Problem wurde behoben mit Delay objekten in einer QuantumCircuit wo qiskit.compiler.transpile() nicht die Einheiten der Delay in die Einheiten des Backendumgewandelt, wenn die backend kwarg auf transpile() eingestellt ist. Dies könnte zu einem falschen Verhalten führen, da die Einheiten nicht übereinstimmen, z. B. beim Laufen:

    from qiskit import transpile, execute
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(1)
    qc.delay(100, [0], unit='us')
    
    qc = transpile(qc, backend)
    job = execute(qc, backend)

    hätte früher dazu geführt, dass das Backend 100 Zeitschritte (jeweils mit der Dauer dt) statt der erwarteten ( 100e-6 / dt) Zeitschritte verzögert hätte. Dies wurde korrigiert, so dass die qiskit.compiler.transpile() funktion die Einheiten korrekt umrechnet.

Sonstige Anmerkungen

  • Die Snapshots aller Fake-/Mock-Backends in qiskit.test.mock wurden aktualisiert, um die jüngsten Geräteänderungen zu berücksichtigen. Dies beinhaltet eine Änderung des basis_gates attributs für die BackendConfiguration in ['cx', 'rz', 'sx', 'x', 'id'], die Hinzufügung einer readout_length Eigenschaft zu den Qubit-Eigenschaften in der BackendPropertiesund die Aktualisierung der PulseDefaults so dass alle Mock-Backends parametrische puls-basierte InstructionScheduleMap instanzen.

Aer- 0.8.0

Vorspiel

Die Version 0.8 enthält mehrere neue Funktionen und Fehlerkorrekturen. Die Highlights dieser Version sind: die Einführung eines einheitlichen AerSimulator Backends für die Ausführung von Schaltungssimulationen mit jeder der unterstützten Simulationsmethoden; eine Simulatorbefehlsbibliothek (qiskit.providers.aer.library), die benutzerdefinierte Befehle zum Speichern verschiedener Arten von Simulatordaten enthält; MPI-Unterstützung für die Ausführung großer Simulationen in einer verteilten Computerumgebung.

Neue Funktionen

  • Python 3.9 unterstützung wurde in dieser Version hinzugefügt. Sie können Qiskit Aer jetzt mit Python 3.9 ausführen, ohne es aus dem Quellcode zu erstellen.

  • Fügen Sie das CMake-Flag DISABLE_CONAN (default=``OFF``) hinzu. Bei der Installation aus dem Quellcode ermöglicht die Einstellung ON die Umgehung des Conan-Paketmanagers, um Bibliotheken zu finden, die bereits auf Ihrem System installiert sind. Dies ist auch als Umgebungsvariable DISABLE_CONAN verfügbar, die Vorrang vor dem CMake-Flag hat. Dies ist nicht das offizielle Verfahren zur Erstellung der VRE. Daher ist der Benutzer dafür verantwortlich, alle benötigten Bibliotheken und die dazugehörigen Dateien bereitzustellen, damit sie von CMake gefunden werden können.

  • Diese Version enthält Unterstützung für die Erstellung von qiskit-aer mit MPI-Unterstützung, um große Simulationen auf einer verteilten Rechnerumgebung durchzuführen. Anweisungen zur Erstellung und Ausführung in einer MPI-Umgebung finden Sie in der Anleitung für Mitwirkende.

  • Es ist nun möglich, qiskit-aer mit aktiviertem CUDA unter Windows zu erstellen. Siehe den Leitfaden für Mitwirkende für Anweisungen zur Erstellung aus dem Quellcode mit GPU-Unterstützung.

  • Wenn Sie die Erweiterung qiskit-aer Python aus dem Quellcode erstellen, müssen mehrere Abhängigkeiten vorinstalliert werden, um die C++-Kompilierung zu ermöglichen. Als Annehmlichkeit für den Benutzer wurden bei der Erstellung der Erweiterung fehlende Build-Abhängigkeiten automatisch mit pip vor den normalen setuptools -Installationsschritten installiert, allerdings war es bisher nicht möglich, diese automatische Installation zu vermeiden. Um dieses Problem zu lösen, wurde eine neue Umgebungsvariable DISABLE_DEPENDENCY_INSTALL hinzugefügt. Wenn es auf 1 oder ON gesetzt ist, wenn die Python-Erweiterung aus dem Quellcode gebaut wird, wird die automatische Installation dieser fehlenden Build-Abhängigkeiten deaktiviert.

  • Fügt Unterstützung für optimierte N-Qubit-Pauli-Gatter ( qiskit.circuit.library.PauliGate) zu StatevectorSimulator, UnitarySimulator und den Zustandsvektor- und Dichtematrixmethoden von QasmSimulator und AerSimulator.

  • Die Methode run() für die Backends AerSimulator, QasmSimulator, StatevectorSimulator und UnitarySimulator nimmt nun eine QuantumCircuit (oder eine Liste von QuantumCircuit objekte) als Eingabe. Das vorherige QasmQobj objekt wird im Moment noch unterstützt, wird aber in einer zukünftigen Version veraltet sein.

    Ein Beispiel für die Anwendung dieses Verfahrens finden Sie unter:

    from qiskit import transpile, QuantumCircuit
    
    from qiskit.providers.aer import Aer
    
    backend = Aer.get_backend('aer_simulator')
    
    circuit = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    tqc = transpile(circuit, backend)
    result = backend.run(tqc, shots=4096).result()
  • Die run() Methode für das PulseSimulator Backend nimmt nun eine Schedule (oder eine Liste von Schedule objekten) als Eingabe. Das vorherige PulseQobj objekt wird im Moment noch unterstützt, wird aber in einer zukünftigen Version veraltet sein.

  • Fügt das neue AerSimulator Simulator-Backend hinzu, das die folgenden Simulationsmethoden unterstützt

    • automatic
    • statevector
    • stabilizer
    • density_matrix
    • matrix_product_state
    • unitary
    • superop

    Die automatische Standardmethode wählt automatisch eine Simulationsmethode für jeden ausgeführten Schaltkreis auf der Grundlage der Schaltungsanweisungen und des Rauschmodells (falls vorhanden). Die Initialisierung eines Simulators mit einer bestimmten Methode kann mit der Option method erfolgen.

    Die GPU-Simulation für die Zustandsvektor-, Dichtematrix- und unitären Methoden kann durch Setzen der Option device='GPU' backend aktiviert werden.

    Beachten Sie, dass die Methoden unitary und superop keine Messungen unterstützen, da sie die unitäre Matrix oder die Superoperatormatrix der Laufschaltung simulieren. Daher muss eine der neuen Anweisungen save_unitary(), save_superop() oder save_state() verwendet werden, um den Simulatorstatus in den zurückgegebenen Ergebnissen zu speichern. Auch der Zustand der anderen Simulationsmethoden kann mit den entsprechenden Anweisungen gespeichert werden. Weitere Einzelheiten finden Sie in den qiskit.providers.aer.library API-Dokumenten.

    Beachten Sie, dass der AerSimulator Simulator die Backends QasmSimulator, StatevectorSimulator und UnitarySimulator ersetzt, die in einer zukünftigen Version veraltet sein werden.

  • Aktualisiert die Klasse AerProvider um mehrere AerSimulator Backends, die für alle verfügbaren Simulationsmethoden und Simulationsgeräte vorkonfiguriert sind. Auf die neuen Backends kann über die Anbieterschnittstelle mit den Namen

    • "aer_simulator"
    • "aer_simulator_statevector"
    • "aer_simulator_stabilizer"
    • "aer_simulator_density_matrix"
    • "aer_simulator_matrix_product_state"
    • "aer_simulator_extended_stabilizer"
    • "aer_simulator_unitary"
    • "aer_simulator_superop"

    Wenn Aer mit GPU-Unterstützung auf einem kompatiblen System installiert wurde, sind zusätzlich die folgenden GPU-Backends verfügbar

    • "aer_simulator_statevector_gpu"
    • "aer_simulator_density_matrix_gpu"
    • "aer_simulator_unitary_gpu"

    Zum Beispiel:

    from qiskit import Aer
    
    # Get the GPU statevector simulator backend
    backend = Aer.get_backend('aer_simulator_statevector_gpu')
  • Es wurde eine neue norm estimation Methode zur Durchführung von Messungen bei Verwendung der "extended_stabilizer" Simulationsmethode hinzugefügt. Diese Normschätzungsmethode kann verwendet werden, indem die folgenden Optionen an die Backends AerSimulator und QasmSimulator übergeben werden

    simulator = QasmSimulator(
        method='extended_stabilizer',
        extended_stabilizer_sampling_method='norm_estimation')

    Die Methode der Normschätzung ist langsamer als die alternativen Optionen metropolis oder resampled_metropolis , bietet aber eine bessere Leistung bei Schaltungen mit spärlichen Ausgangsverteilungen. Weitere Informationen finden Sie in der Dokumentation von QasmSimulator .

  • Fügt Anweisungen zum Speichern des Simulatorstatus in verschiedenen Formaten hinzu. Diese Anweisungen sind

    • qiskit.providers.aer.library.SaveDensityMatrix
    • qiskit.providers.aer.library.SaveMatrixProductState
    • qiskit.providers.aer.library.SaveStabilizer
    • qiskit.providers.aer.library.SaveState
    • qiskit.providers.aer.library.SaveStatevector
    • qiskit.providers.aer.library.SaveStatevectorDict
    • qiskit.providers.aer.library.SaveUnitary

    Diese Anweisungen können einem Quantenschaltkreis mit Hilfe der Schaltkreismethoden save_density_matrix, save_matrix_product_state, save_stabilizer, save_state, save_statevector, save_statevector_dict, save_unitary hinzugefügt werden, die beim Import von Aer zu QuantumCircuit hinzugefügt werden.

    Einzelheiten zur Methodenkompatibilität der einzelnen Befehle finden Sie in der API-Dokumentation qiskit.providers.aer.library .

    Beachten Sie, dass die Snapshot-Anweisungen SnapshotStatevector, SnapshotDensityMatrix, SnapshotStabilizer noch unterstützt werden, aber in einer zukünftigen Version veraltet sein werden.

  • Fügt die Quantenschaltungsanweisungen qiskit.providers.aer.library.SaveExpectationValue und qiskit.providers.aer.library.SaveExpectationValueVariance hinzu, um den Erwartungswert ⟨H⟩=Tr[Hρ]\langle H\rangle = Tr[H\rho] oder den Erwartungswert und die Varianz Var(H)=⟨H2⟩−⟨H⟩2Var(H) = \langle H^2\rangle - \langle H\rangle^2 eines Hermitschen Operators HH für den Simulatorzustand ρ\rho zu speichern. Diese Anweisungen können einem Quantenschaltkreis mit Hilfe der Schaltkreismethoden save_expectation_value und save_expectation_value_variance hinzugefügt werden, die beim Importieren von Aer zu QuantumCircuit hinzugefügt werden.

    Beachten Sie, dass die Snapshot-Anweisung SnapshotExpectationValue noch unterstützt wird, aber in einer zukünftigen Version veraltet sein wird.

  • Fügt qiskit.providers.aer.library.SaveProbabilities und qiskit.providers.aer.library.SaveProbabilitiesDict Quantenschaltungsanweisung zum Speichern aller Messergebniswahrscheinlichkeiten für Z-Basis-Messungen des Simualtor-Zustands hinzu. Diese Anweisungen können einem Quantenschaltkreis mit Hilfe der Schaltkreismethoden save_probabilities und save_probabilities_dict hinzugefügt werden, die beim Importieren von Aer zu QuantumCircuit hinzugefügt wird.

    Beachten Sie, dass die Snapshot-Anweisung SnapshotProbabilities noch unterstützt wird, aber in einer zukünftigen Version veraltet sein wird.

  • Fügt qiskit.providers.aer.library.SaveAmplitudes und qiskit.providers.aer.library.SaveAmplitudesSquared Schaltungsanweisungen zum Speichern ausgewählter komplexer Zustandsvektoramplituden oder ausgewählter Wahrscheinlichkeiten (Amplituden im Quadrat) für unterstützte Simulationsmethoden hinzu. Diese Anweisungen können einem Quantenschaltkreis mit Hilfe der Schaltkreismethoden save_amplitudes und save_amplitudes_squared hinzugefügt werden, die beim Importieren von Aer zu QuantumCircuit hinzugefügt wird.

  • Fügt Anweisungen zum Einstellen des Status der Simulatoren hinzu. Diese Anweisungen müssen für die gesamte Anzahl der Qubits in der Schaltung definiert werden. Sie können an jedem beliebigen Punkt einer Schaltung angewendet werden und überschreiben den Simulatorzustand mit dem angegebenen Zustand. Die zusätzlichen Anweisungen lauten

    • qiskit.providers.aer.library.SetDensityMatrix
    • qiskit.providers.aer.library.SetStabilizer
    • qiskit.providers.aer.library.SetStatevector
    • qiskit.providers.aer.library.SetUnitary

    Diese Anweisungen können einem Quantenschaltkreis mit Hilfe der Schaltkreismethoden set_density_matrix, set_stabilizer, set_statevector, set_unitary hinzugefügt werden, die beim Import von Aer zu QuantumCircuit hinzugefügt werden.

    Einzelheiten zur Methodenkompatibilität der einzelnen Befehle finden Sie in der API-Dokumentation qiskit.providers.aer.library .

  • Unterstützung für diagonale Gatter in der "matrix_product_state" Simulationsmethode hinzugefügt.

  • Die Simulationsmethode "matrix_product_state" unterstützt nun die Anweisung initialize .

Bekannte Probleme

  • Es gibt ein bekanntes Problem, bei dem die Simulation bestimmter Schaltungen mit einem Kraus-Rauschmodell unter Verwendung der Simulationsmethode "matrix_product_state" zu einem Absturz des Simulators führen kann. Für weitere Informationen siehe #306.

Anmerkungen zu Upgrades

  • Die Mindestversion von Conan wurde auf 1.31.2 erhöht. Dies war notwendig, um ein Kompatibilitätsproblem mit neueren Versionen des Programms urllib3 (die eine Abhängigkeit von Conan ist) zu beheben. Außerdem wird die native Unterstützung für AppleClang 12 hinzugefügt, was für Benutzer mit neuen Apple-Computern nützlich ist.

  • pybind11 die erforderliche Mindestversion ist 2.6 anstelle von 2.4. Dies ist erforderlich, um die CUDA-fähige Kompilierung unter Windows zu unterstützen.

  • Cython wurde als Build-Abhängigkeit entfernt.

  • Die x90 Gatterzerlegung von Rauschmodellen, die in qiskit-aer 0.7 veraltet war, wurde entfernt. Diese Zerlegung erfolgt nun unter Verwendung regulärer Rauschmodell-Basisgatter und des qiskit-Transpilers.

  • Die folgenden Optionen für die Simulationsmethode "extended_stabilizer" haben sich geändert.

    • extended_stabilizer_measure_sampling: Diese Option wurde durch die Option extended_stabilizer_sampling_method ersetzt, die steuert, wie wir die Qubit-Messung simulieren.
    • extended_stabilizer_mixing_time: Diese Option wurde in extended_stabilizer_metropolis_mixing_time umbenannt, um klarzustellen, dass sie nur für die Probenahmeverfahren metropolis und resampled_metropolis gilt.
    • extended_stabilizer_norm_estimation_samples: Diese Option wurde umbenannt in extended_stabilizer_norm_estimation_default_samples.

    Eine zusätzliche Option, extended_stabilizer_norm_estimation_repetitions , wurde hinzugefügt, die einen Teil des Verhaltens der Stichprobenmethode der Normschätzung steuert.

Hinweise zu veralteten Versionen

  • Python 3.6 unterstützung ist veraltet und wird in einer zukünftigen Version entfernt werden. Wenn die Unterstützung eingestellt wird, müssen Sie die von Ihnen verwendete Version von Python auf Python 3.7 oder höher aktualisieren.

Fehlerkorrekturen

  • Behebt einen Fehler mit AerProvider , bei dem Optionen, die für die zurückgegebenen Backends mit set_options() gesetzt wurden, im Anbieter gespeichert wurden und bei nachfolgenden Aufrufen von get_backend() für das gleiche benannte Backend bestehen blieben. Jetzt gibt jeder Aufruf von und backends() eine neue Instanz des Simulator-Backends zurück, die konfiguriert werden kann.
  • Behebt einen Fehler in der Fehlermeldung, die ausgegeben wird, wenn eine Schaltung nicht unterstützte Simulatoranweisungen enthält. Zuvor wurden einige unterstützte Anweisungen in der Fehlermeldung zusammen mit den nicht unterstützten Anweisungen aufgeführt.
  • Behebt ein Problem mit der Einstellung von QasmSimulator Basis-Gates, wenn die Optionen "method" und "noise_model" zusammen verwendet werden, und wenn sie mit einem Simulator verwendet werden, der mit from_backend() erstellt wurde. Die aufgelisteten Basisgatter sind die Schnittmenge der Gatter, die von der Backend-Konfiguration, der Simulationsmethode und den Basisgattern des Rauschmodells unterstützt werden. Wenn die Schnittmenge der Basistore des Geräuschmodells und der Basistore des Simulators leer ist, wird eine Warnung ausgegeben.
  • Behebung eines Fehlers, bei dem das Tor "sx"` SXGate nicht als unterstütztes Gatter im C++-Code aufgeführt war, in StateOpSet von matrix_product_state.hp.
  • Behebung eines Fehlers, bei dem "csx", "cu2", "cu3" fälschlicherweise als unterstützte Basistore für die Methode "density_matrix" des QasmSimulator aufgeführt wurden.
  • Behebung eines Fehlers, bei dem Parameter zwischen Funktionen in matrix_product_state_internal.cpp falsch übergeben wurden, was zu einer falschen Simulation führte, sowie zum Erreichen ungültiger Zustände, was wiederum eine Endlosschleife verursachte.
  • Behebt einen Fehler, der dazu führte, dass c_if nicht funktionierte, wenn die Breite des bedingten Registers größer als 64 war. Siehe #1077.
  • Behebt einen Fehler (#1153 ), bei dem Rauschen auf bedingte Gatter immer angewendet wurde, unabhängig davon, ob das bedingte Gatter tatsächlich auf der Grundlage des klassischen Registerwertes angewendet wurde. Jetzt wird das Rauschen eines bedingten Gatters nur in dem Fall angewendet, in dem das bedingte Gatter angewendet wird.
  • Behebt einen Fehler mit verschachtelten OpenMP Flagge wurde auf true gesetzt, wenn es nicht sein sollte.
  • Behebt einen Fehler bei der Anwendung der Trunkierung in der Matrixprodukt-Zustandsmethode der QasmSimulator.
  • Problem #1126 behoben: Fehler bei der Meldung der Messung eines einzelnen Qubits. Der Fehler trat beim Kopieren des Messwertes in die Ausgabedatenstruktur auf.
  • In MPS arbeitete apply_kraus direkt mit den Eingabebits in den Parameter-Qubits, anstatt mit den internen Qubits. Beim MPS-Algorithmus sind die Qubits ständig in Bewegung, so dass alle Operationen auf die internen Qubits angewendet werden sollten.
  • Beim Aufruf von MPS::sample_measure müssen wir zunächst die Qubits in der Standardreihenfolge sortieren, da dies in qasm_controller.This durch den Aufruf der Methode move_all_qubits_to_sorted_ordering erfolgt. Sie war korrekt in sample_measure_using_apply_measure, fehlte aber in sample_measure_using_probabilities.
  • Behebt einen Fehler in der from_backend() -Methode von QasmSimulator , der das local -Attribut der Konfiguration auf den Backend-Wert setzt und nicht immer auf True.
  • Behebt einen Fehler in from_backend() und from_backend() , bei dem basis_gates für IBMQ-Geräte mit dem Basis-Gate ['id', 'rz', 'sx', 'x', 'cx'] falsch gesetzt war. Das Rauschmodell hat nun immer dieselben Basisgatter wie die Backend-Basisgatter, unabhängig davon, ob diese Anweisungen Fehler im Rauschmodell aufweisen oder nicht.
  • Behebt ein Problem, bei dem die erweiterte "extended_stabilizer"-Simulationsmethode bei Quantenschaltungen mit spärlichen Ausgangsverteilungen zu falschen Ergebnissen führte. Weitere Informationen und Beispiele finden Sie unter #306.

Ignis- 0.6.0

Neue Funktionen

  • Die Funktion qiskit.ignis.mitigation.expval_meas_mitigator_circuits() wurde verbessert, so dass die Anzahl der von der Funktion erzeugten Schaltkreise, die für die Kalibrierung durch die CTMP-Methode verwendet werden, von O(n)O(n) auf O(log⁡n)O(\log{n}) reduziert wurde (wobei nn die Anzahl der Qubits ist).

Anmerkungen zu Upgrades

  • Die Funktion qiskit.ignis.verification.randomized_benchmarking_seq() verwendet jetzt die erweiterte CNOTDihedral-Klasse qiskit.ignis.verification.CNOTDihedral, die es ermöglicht, CNOT-Dihedral Randomized Benchmarking auf mehr als zwei Qubits durchzuführen.
  • Das Python-Paket retworkx ist nun eine Voraussetzung für die Installation von qiskit-ignis. Sie ersetzt die bisherige Verwendung von networkx (die nicht mehr erforderlich ist), um eine bessere Leistung zu erzielen.
  • Die Abhängigkeit von scikit-learn wird nicht mehr benötigt und ist nun eine optionale Voraussetzung. Wenn Sie die IQ-Messungsdiskriminatoren (IQDiscriminationFitter, LinearIQDiscriminationFitter, QuadraticIQDiscriminationFitter oder SklearnIQDiscriminator) verwenden, müssen Sie nun scikit-learn manuell installieren, entweder indem Sie pip install scikit-learn ausführen oder wenn Sie auch qiskit-ignis mit pip install qiskit-ignis[iq] installieren.

Fehlerkorrekturen

  • Ein Problem in der Erwartungswert-Methode expectation_value() wurde behoben. Bei den Fehlerminderungsklassen TensoredExpvalMeasMitigator und CTMPExpvalMeasMitigator wurde fälschlicherweise die Gesamtzahl der Qubits des Mitigators und nicht die Anzahl der klassischen Bits im Zählwörterbuch verwendet, was zu einer stark verringerten Leistung führte, wenn der qubits kwarg nicht angegeben war. Behoben #561
  • Die "auto" -Methode von TomographyFitter, StateTomographyFitter und ProcessTomographyFitter sollte nur dann "cvx" verwenden, wenn CVXPY installiert ist und ein anderer SDP-Löser als SCS verfügbar ist. Der Grund dafür ist, dass der SCS-Solver eine geringere Genauigkeit als andere Solver-Methoden aufweist und häufig eine Dichtematrix oder Choi-Matrix liefert, die nicht vollständig positiv ist und die Validierung fehlschlägt, wenn sie mit dem qiskit.quantum_info.state_fidelity() oder qiskit.quantum_info.process_fidelity() funktionen.

Aqua- 0.9.0

Mit dieser Version wird das Qiskit-Aqua-Projekt offiziell abgeschafft. In der Zukunft (frühestens 3 Monate nach dieser Version) wird das Aqua-Projekt seine letzte Version erhalten und archiviert werden. Alle Funktionen, die qiskit-aqua bietet, wurden entweder in neue Pakete oder in andere qiskit-Pakete migriert. Die Anwendungsmodule, die von qiskit-aqua bereitgestellt werden, wurden in mehrere neue Pakete aufgeteilt: qiskit-optimization, qiskit-nature, qiskit-machine-learning, und qiskit-finance. Diese Pakete können einzeln (über den Standardbefehl pip install, z.B. pip install qiskit-nature) oder zusammen mit dem Rest des Qiskit-Metapakets als optionale Extras (z.B. pip install 'qiskit[finance,optimization]' oder pip install 'qiskit[all]') installiert werden. Die Kernbausteine für die Algorithmen und den Operatorfluss sind nun als Teil von qiskit-terra unter qiskit.algorithms und qiskit.opflow. 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 der Verwendung von Qiskit Aqua finden Sie in der Migrationsanleitung.

IBM Q Anbieter 0.12.2

Keine Änderung

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