Skip to main content
IBM Quantum Platform

Qiskit 1.0 Versionshinweise


1.0.2

Vorspiel

Qiskit 1.0.2 ist ein kleineres Bugfix-Release für die 1.0 Serie.

Fehlerkorrekturen

  • Ein Problem wurde behoben mit convert_to_target() bei dem der Konverter fälschlicherweise Kontrollflussanweisungen ignorierte, wenn sie im Attribut BackendConfiguration.supported_instructions angegeben waren, was der typische Ort ist, an dem Kontrollflussanweisungen in einem BackendConfiguration objekt angegeben werden. Behoben #11872.

  • Der Aufruf von EquivalenceLibrary.set_entry() wird nun das interne Graph-Objekt der Bibliothek korrekt aktualisiert. Bisher wurden zwar die Metadaten aktualisiert, aber die Diagrammstruktur blieb unverändert, so dass Benutzer wie BasisTranslator immer noch die alten Regeln verwenden würden. Behoben #11958.

  • Das Programm EvolvedOperatorAnsatz behandelt jetzt korrekt den Fall, dass das Argument operators eine leere Liste ist. Zuvor hatte dies zu einem Fehler geführt.

  • Es wurde ein Konsistenzproblem mit EvolvedOperatorAnsatz instanzen mit Null-Qubits. Zuvor enthielten solche Instanzen eine einzelne QuantumRegister in qregs mit null Qubits, aber jetzt werden keine Register erstellt. Dieses Verhalten steht im Einklang mit seiner Oberklasse QuantumCircuit.

  • Behebung eines Absturzes in convert_to_target() der auftrat, wenn Qubit-Eigenschaften (entweder T1, T2 oder Frequenz) fehlten. Die fehlenden Eigenschaftswerte in QubitProperties werden nun mit None aufgefüllt.

  • Es wurde ein Leistungsproblem in der Funktion qpy.load() funktion bei der Deserialisierung von QPY-Payloads mit einer großen Anzahl von Qubits oder Clbits in einem Schaltkreis.

  • Es wurde ein Fehler behoben, bei dem EstimatorPub.coerce() und SamplerPub.coerce() einen Parameter vom Typ BindingsArray nicht korrekt behandelten. Zuvor wurde fälschlicherweise eine ValueError Ausnahme ausgelöst.

  • Die voreingestellten Pass-Manager, die von transpile() verwendeten voreingestellten Pass-Manager schlagen bei Schaltungen mit Kontrollfluss nicht mehr fehl, wenn kein Hardware-Ziel oder Basis-Gate-Set angegeben ist. Sie werden nun solche abstrakten Ziele so behandeln, als ob sie alle Kontrollflussoperationen zulassen. Behoben #11906.

  • coerce() wurde korrigiert, so dass es ein 0-d-Array zurückgibt, wenn die Eingabe ein einzelnes, nicht verschachteltes Observable ist. Zuvor wurde es fälschlicherweise auf eine einzige Dimension aktualisiert, mit der Form (1,).

  • Parameter wurde aktualisiert, so dass Instanzen, die gleich sind, immer den gleichen Hash haben. Zuvor wurde nur die Parameter.uuid verglichen, so dass Parameter instanzen mit unterschiedlichen Namen konnten gleich verglichen werden, wenn sie mit einem gemeinsamen Wert für den Parameter uuid konstruiert worden waren (der normalerweise nicht explizit übergeben wird).

  • Fehler behoben in QuantumCircuit.draw() der dazu führte, dass benutzerdefinierte Stilwörterbücher für die Schublade Matplotlib bei der Ausführung geändert wurden.


1.0.1

Vorspiel

Qiskit 1.0.1 ist ein Patch-Release, das eine kleine Anzahl von Fehlern behebt, die in der Qiskit 1.0.0 Version identifiziert wurden.

Fehlerkorrekturen

  • Es wurde ein Fehler bei der Konvertierung von benutzerdefinierten Impulsanweisungen in das Legacy qiskit.qobj format. Der Fehler wurde in Qiskit 1.0.0 eingeführt und führte dazu, dass die Konvertierung von Anweisungen mit benutzerdefinierten Pulsformen einen Fehler auslöste. Nach der Korrektur wird die Konvertierung korrekt durchgeführt, und der benutzerdefinierte Impuls wird ordnungsgemäß in eine pulse.Waveform umgewandelt. Behoben #11828.

  • Es wurde ein Problem im InverseCancellation transpiler-Durchgang, bei dem in einigen Fällen ein selbstinverses parametrisiertes Gatter fälschlicherweise abgebrochen wurde, selbst wenn der Parameterwert nicht übereinstimmte. Behoben #11815.

  • BasePassManager.run() wird nicht mehr die vorherige PropertySet in neue Workflows, wenn sie mehr als einmal aufgerufen werden. Zuvor wurden die gleichen PropertySet zur Initialisierung von Folgeläufen verwendet, was dazu führen konnte, dass ungültige Eigenschaftsinformationen an Aufgaben weitergegeben wurden. Das Verhalten entspricht nun dem von Qiskit 0.44. Behoben #11784.

  • In convert_durations_to_dt() wurde ein Fehler behoben, bei dem die Funktion davon ausging, dass alle Eingaben in Sekunden erfolgten, anstatt die tatsächliche Einheit zu lesen. Dies könnte zu falschen Größenordnungen bei den angegebenen Schaltkreisdauern führen.


1.0.0

Vorspiel

Wir freuen uns sehr über die Veröffentlichung von Qiskit 1.0.0. Diese Version ist der Höhepunkt von 7 Jahren Entwicklung, um Qiskit zu einem stabilen, hochleistungsfähigen SDK für Quantencomputer auszubauen, und ist der Beginn einer neuen Ära für das Qiskit-Projekt und die Community. Neben allgemeinen Leistungs- und Stabilitätsverbesserungen beziehen sich die wichtigsten Änderungen der Version 1.0.0 auf die Stabilitätspolitik, die Veröffentlichungszyklen und die Versionierung. Qiskit verwendet nun offiziell die semantische Versionierung, was bedeutet, dass das Projekt während des gesamten Lebenszyklus der 1.x Versionsreihe die Abwärtskompatibilität seiner öffentlich dokumentierten APIs aufrechterhalten will. Wir bieten jetzt auch Bugfix-Support für Hauptversionen an, so dass Sie noch 6 Monate nach der Veröffentlichung der nächsten Hauptversion über einen unterstützten Zweig verfügen. Dies beginnt nun mit den Hauptversionen 1.x und 0.x : Die Version 0.46.x wird weiterhin unterstützt, mit regelmäßigen Patch-Versionen, die Fehlerkorrekturen enthalten, für 6 Monate nach der Veröffentlichung von 1.0. Das heißt, 0.46.x wird bis 2024-08 unterstützt. Die vollständigen Einzelheiten der neuen Politik können Sie hier einsehen:

start/install#qiskit-versioning

Von zentraler Bedeutung in dieser Version ist auch die Änderung der Verpackung. Seit der Veröffentlichung von Qiskit 0.7 im Jahr 2018-12, als Qiskit sein Elementemodell einführte, ist das Paket qiskit , das Sie installieren würden, ein Meta-Paket (oder ein Paket von Paketen), das die kombinierten Elemente installiert, aus denen Qiskit besteht. Wie bereits in früheren Veröffentlichungen angekündigt (weitere Einzelheiten finden Sie in der 0.44.0, 0.45.3, und 0.46.0 release Notes, zusammen mit diesem Blog-Post ), schließen wir mit der 1.0 Release den Übergang zu einem einzigen qiskit Paket ab, das nur noch das Kern-SDK enthält (was vorher qiskit-terra war). Das bedeutet, dass wir für die Versionen >= 1.0.0 das Paket qiskit-terra nicht mehr verwenden und nur noch qiskit veröffentlichen werden. Da diese Änderung in der Paketstruktur vom Python -Paketinstallationsprogramm pip nicht vollständig unterstützt wird, ist es nicht möglich, einfach pip install -U qiskit für ein Upgrade von qiskit 0.46.0 auf 1.0.0 zu verwenden. Es wird dringend empfohlen, dass Sie für das Upgrade auf Qiskit 1.0.0 eine separate virtuelle Umgebung erstellen, um die Installation zu isolieren. Es gibt einen detaillierten Migrationsleitfaden, der die Änderungen an den Paketen und die Installation von Qiskit 1.0.0 in verschiedenen Szenarien erklärt und hier zu finden ist:

https://qisk.it/1-0-packaging-migration

Wie alle unsere Hauptversionen hat auch Qiskit 1.0.0 eine Fülle neuer Funktionen, die Highlights dieser Version sind:

  • Die QuantumCircuit die interne Struktur der Klasse data struktur der Klasse wurde in Rust umgeschrieben, um die Speichereffizienz der QuantumCircuit objekte zu verbessern, indem die Argumente der Anweisungen zwischengespeichert werden.
  • Eine neue Version der Schnittstellendefinition für Primitive in qiskit.primitives mit den BaseSamplerV2 und BaseEstimatorV2 abstrakten Klassen. Diese neue Version der Schnittstelle unterstützt die Durchführung von vektorisierten Aufrufen des Primitivs, so dass Sweeps über Parameterwertsätze und Observablen effizient spezifiziert werden können.
  • Ein neuer experimenteller nativer OpenQASM 3 Parser qiskit.qasm3.loads_experimental() und qiskit.qasm3.load_experimental(). Dieser neue Parser befindet sich noch in der Entwicklung und hat noch einige Einschränkungen und ist noch experimentell. Der neue Parser ist jedoch wesentlich schneller und verfügt über eine bessere Fehlermeldung, die eine Fehlersuche in einem OpenQASM 3 Programm ermöglicht, wenn dieses ungültig ist. Dieser neue Parser ist in Rust geschrieben und basiert auf einer neu entwickelten Rust-Bibliothek zum Parsen von OpenQASM3, die hier zu finden ist: https://github.com/Qiskit/openqasm3_parser

Schließlich war die Veröffentlichung von Qiskit 1.0.0 eine Gelegenheit, einige technische Schulden zu bereinigen, die sich in den letzten 7 Jahren der Entwicklung angesammelt hatten. Sie werden feststellen, dass die Version von Qiskit 1.0.0 praktisch frei von DeprecationWarningist, und gleichzeitig ist der Abschnitt über die Aktualisierung in den Versionshinweisen von 1.0.0 länger als üblich. Dies sind unmittelbare Folgen der Bereinigung der technischen Schulden. Um die Migration von 0.46.x auf 1.0.0 zu erleichtern, haben wir neben den Versionshinweisen auch eine spezielle Migrationsanleitung veröffentlicht, die Sie hier finden:

Qiskit 1.0 Funktionsänderungen

Dieser Leitfaden ist als Ergänzung zu den Versionshinweisen gedacht und enthält gezielte Hinweise für die Migration der API-Änderungen nach der Entfernung der veralteten Funktionen aus der Version 0.46.0.

Schaltkreise Funktionen

  • Ein neues Argument, annotated, wurde zu den Methoden QuantumCircuit.inverse(), circuit.Instruction.inverse() und .inverse() Methoden von Instruction unterklassen (wie z.B SwapGate oder SGate) zur optionalen Rückgabe eines AnnotatedOperation. Der Standardwert von annotated ist False und entspricht dem bereits vorhandenen Verhalten der Methode. Darüber hinaus hat das Argument annotated bei Standardgattern mit einer explizit definierten Methode inverse keine Wirkung, z. B. bei beiden:

    SwapGate().inverse(annotated=False)
    SwapGate().inverse(annotated=True)

    rückgabe a SwapGateund beides:

    SGate().inverse(annotated=False)
    SGate().inverse(annotated=True)

    rückgabe eines SdgGate. Der Unterschied zeigt sich bei benutzerdefinierten Anweisungen ohne explizit definierte Umkehrung. Mit annotated=False gibt die Methode eine neue Anweisung mit der rekursiv invertierten Definition zurück, genau wie zuvor. Während annotated=True eine AnnotatedOperation zurück, das die mit dem Befehl InverseModifier.

  • Hinzufügen einer Kommutierungsbibliothek zur CommutationChecker. Diese Bibliothek speichert alle Kommutationsbeziehungen von unparametrisierbaren Standardgattern in einem Wörterbuch, das ein effizientes Nachschlagen zur Laufzeit ermöglicht. Dies beschleunigt die Ausführung der CommutationChecker klasse und damit auch des CommutationAnalysis transpiler-Durchlaufs, denn statt zu berechnen, ob zwei nicht parametrisierbare Standardtore pendeln, muss er nur in der Bibliothek nachschlagen.

    Außerdem wurde die CommutationChecker überarbeitet und hat nun eine Obergrenze für die Anzahl der zwischengespeicherten Kommutationsbeziehungen, die nicht in der Kommutationsbibliothek enthalten sind. Dies betrifft: # Nr. 8020 und Nr. 7101

  • QuantumCircuit.assign_parameters() akzeptiert jetzt String-Schlüssel in der Mapping-Form der Eingabe. Diese Namen werden verwendet, um die entsprechende Parameter instanz mit get_parameter(). Das können Sie tun:

    from qiskit.circuit import QuantumCircuit, Parameter
    
    a = Parameter("a")
    qc = QuantumCircuit(1)
    qc.rx(a, 0)
    
    qc.assign_parameters({"a": 1}) == qc.assign_parameters({a: 1})
  • QuantumCircuit hat zwei neue Methoden, get_parameter() und has_parameter(), die jeweils eine Parameter instanz, die in der Schaltung verwendet wird, anhand ihres Namens abrufen und einen booleschen Wert zurückgeben, der angibt, ob ein Parameter mit dem gleichen Namen (oder die genaue Instanz) in der Schaltung verwendet wird.

  • A uuid eigenschaft wurde der qiskit.circuit.Parameter klasse hinzugefügt. In fortgeschrittenen Anwendungsfällen kann diese Eigenschaft verwendet werden, um qiskit.circuit.Parameter instanzen, die miteinander verglichen werden.

  • Es wurde eine neue Methode hinzugefügt, ParameterExpression.numeric()hinzugefügt, die einen vollständig gebundenen Parameterausdruck in den restriktivsten eingebauten numerischen Typ Python umwandelt, der das Ergebnis der symbolischen Auswertung genau beschreibt. Zum Beispiel wird eine symbolische ganze Zahl zu einem int, während eine symbolische reelle Zahl zu einem float und eine komplexe Zahl wird zu a complex. Diese Methode enthält mehrere Umgehungen für die Besonderheiten der Auswertungskontexte von symengine, die manchmal zu falschen Ergebnissen führen können, wenn man complex oder float für einen Ausdruck direkt aufrufen.

Primitive Funktionen

  • Version 2 der Primitive wird durch eine neue Basisklasse sowohl für den Sampler als auch für den Estimator eingeführt, zusammen mit neuen Typen für ihre Eingänge und Ausgänge. Der Schwerpunkt dieser neuen Version liegt auf der Durchführung von vektorisierten Aufrufen der primitiven run() Methoden, so dass Sweeps über Parameterwertsätze und Observablen effizient spezifiziert werden können. Siehe StatevectorSampler und StatevectorEstimator für Referenzimplementierungen der V2 Primitive.

    Außerdem hat der Schätzer ein precision Argument in der run() das die angestrebte Genauigkeit der Erwartungswertschätzungen angibt. Analog dazu hat der Probenehmer shots aus den Optionen in die Argumente der run() methode verschoben. Der Sampler wurde auch dahingehend geändert, dass er die Ausgaben (z. B. Bitstrings) von jedem Schuss zurückgibt, anstatt eine Counts-zurückzugeben, und auch die Daten von separaten ClassicalRegisters. Dies ermöglicht es abgeleiteten Klassen, Sampler-Unterstützung für Schaltungen mit klassischem Kontrollfluss zu implementieren.

    Die primitiven Basisklassen V2 sind:

    Die neuen Typen, die für Eingänge und Ausgänge verwendet werden, sind:

    • SamplerPubLikeprimitiver einheitlicher Block ( PUB ) von Sampler-Eingängen; ein Vereinigungstyp von zulässigen Eingängen zu einem Sampler
    • EstimatorPubLike: Primitiver vereinheitlichter Block ( PUB ) von Schätzereingaben; eine Art Vereinigung von zulässigen Eingaben für einen Schätzer
    • PubResultdie Daten und Metadaten, die sich aus der Ausführung einer einzelnen PUB ergeben
    • DataBin: Ein Namespace, der die Daten einer einzelnen Ausführung von PUB enthält
    • BitArrayeine array-bewertete Sammlung von Bitwerten in einem dichten Format
    • PrimitiveResult: eine Iterable von PubResults zusammen mit Metadaten
  • Die Referenzimplementierung StatevectorEstimator von BaseEstimatorV2 wurde hinzugefügt. Wie im folgenden Beispiel zu sehen ist, unterstützt dieser Schätzer (und alle V2 Schätzer) die Bereitstellung von Arrays von Beobachtungswerten und/oder Arrays von Parameterwertsätzen, die mit bestimmten Schaltkreisen verbunden sind.

    Jedes Tupel von (circuit, observables, <optional> parameter values, <optional> precision), das als primitiver vereinheitlichter Schätzer-Block ( PUB ) bezeichnet wird, erzeugt sein eigenes array-basiertes Ergebnis. Die Methode run() kann in vielen Lokalen gleichzeitig angewendet werden.

    from qiskit.circuit import Parameter, QuantumCircuit
    from qiskit.primitives import StatevectorEstimator
    from qiskit.quantum_info import Pauli, SparsePauliOp
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define a circuit with two parameters.
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.ry(Parameter("a"), 0)
    circuit.rz(Parameter("b"), 0)
    circuit.cx(0, 1)
    circuit.h(0)
    
    # Define a sweep over parameter values, where the second axis is over
    # the two parameters in the circuit.
    params = np.vstack([
        np.linspace(-np.pi, np.pi, 100),
        np.linspace(-4 * np.pi, 4 * np.pi, 100)
    ]).T
    
    # Define three observables. Many formats are supported here including
    # classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1
    # lists cause this array of observables to have shape (3, 1), rather
    # than shape (3,) if they were omitted.
    observables = [
        [SparsePauliOp(["XX", "IY"], [0.5, 0.5])],
        [Pauli("XX")],
        [Pauli("IY")]
    ]
    
    # Instantiate a new statevector simulation based estimator object.
    estimator = StatevectorEstimator()
    
    # Estimate the expectation value for all 300 combinations of
    # observables and parameter values, where the pub result will have
    # shape (3, 100). This shape is due to our array of parameter
    # bindings having shape (100,), combined with our array of observables
    # having shape (3, 1)
    pub = (circuit, observables, params)
    job = estimator.run([pub])
    
    # Extract the result for the 0th pub (this example only has one pub).
    result = job.result()[0]
    
    # Error-bar information is also available, but the error is 0
    # for this StatevectorEstimator.
    result.data.stds
    
    # Pull out the array-based expectation value estimate data from the
    # result and plot a trace for each observable.
    for idx, pauli in enumerate(observables):
        plt.plot(result.data.evs[idx], label=pauli)
    plt.legend()
  • Die Referenzimplementierung StatevectorSampler von BaseSamplerV2 wurde hinzugefügt. Wie im folgenden Beispiel zu sehen ist, unterstützt dieser Probenehmer (und alle V2 Probenehmer) die Bereitstellung von Arrays von Parameterwertsätzen zur Bindung an einen einzelnen Schaltkreis.

    Jedes Tupel von (circuit, <optional> parameter values, <optional> shots), das als Sampler Primitive Unified Bloc ( PUB ) bezeichnet wird, erzeugt sein eigenes Array-basiertes Ergebnis. Die Methode run() kann in vielen Lokalen gleichzeitig angewendet werden.

    from qiskit.circuit import (
        Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister
    )
    from qiskit.primitives import StatevectorSampler
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define our circuit registers, including classical registers
    # called 'alpha' and 'beta'.
    qreg = QuantumRegister(3)
    alpha = ClassicalRegister(2, "alpha")
    beta = ClassicalRegister(1, "beta")
    
    # Define a quantum circuit with two parameters.
    circuit = QuantumCircuit(qreg, alpha, beta)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.cx(1, 2)
    circuit.ry(Parameter("a"), 0)
    circuit.rz(Parameter("b"), 0)
    circuit.cx(1, 2)
    circuit.cx(0, 1)
    circuit.h(0)
    circuit.measure([0, 1], alpha)
    circuit.measure([2], beta)
    
    # Define a sweep over parameter values, where the second axis is over.
    # the two parameters in the circuit.
    params = np.vstack([
        np.linspace(-np.pi, np.pi, 100),
        np.linspace(-4 * np.pi, 4 * np.pi, 100)
    ]).T
    
    # Instantiate a new statevector simulation based sampler object.
    sampler = StatevectorSampler()
    
    # Start a job that will return shots for all 100 parameter value sets.
    pub = (circuit, params)
    job = sampler.run([pub], shots=256)
    
    # Extract the result for the 0th pub (this example only has one pub).
    result = job.result()[0]
    
    # There is one BitArray object for each ClassicalRegister in the
    # circuit. Here, we can see that the BitArray for alpha contains data
    # for all 100 sweep points, and that it is indeed storing data for 2
    # bits over 256 shots.
    assert result.data.alpha.shape == (100,)
    assert result.data.alpha.num_bits == 2
    assert result.data.alpha.num_shots == 256
    
    # We can work directly with a binary array in performant applications.
    raw = result.data.alpha.array
    
    # For small registers where it is anticipated to have many counts
    # associated with the same bitstrings, we can turn the data from,
    # for example, the 22nd sweep index into a dictionary of counts.
    counts = result.data.alpha.get_counts(22)
    
    # Or, convert into a list of bitstrings that preserve shot order.
    bitstrings = result.data.alpha.get_bitstrings(22)
    print(bitstrings)

Anbieter Funktionen

  • Eine neue Klasse wurde hinzugefügt, GenericBackendV2zu dem qiskit.providers.fake_provider modul hinzugefügt. Diese Klasse ist konfigurierbar und erstellt eine BackendV2 backend-Instanz, die lokal ausgeführt werden kann (im Sinne der Fake-Backends). Die Benutzer können die Anzahl der Qubits, die Basisgatter, die Kopplungskarte, die Fähigkeit zur Ausführung dynamischer Schaltungen (Kontrollflussanweisungen), die Anweisungskalibrierungen und die Messzeitschritte des Backends konfigurieren, ohne sich mit der manuellen Konstruktion von Targets befassen zu müssen. Qubit- und Gate-Eigenschaften (Dauer, Fehler) werden durch Zufallsstichproben aus Standardbereichen erzeugt. Der Seed für diese Zufallsgenerierung kann festgelegt werden, um die Reproduzierbarkeit der Backend-Ausgabe zu gewährleisten. Es ist wichtig zu beachten, dass dieses Backend nur Gates aus der Standardbibliothek unterstützt. Wenn Sie ein flexibleres Backend benötigen, gibt es immer die Möglichkeit, direkt ein Target objekt zu instanziieren, das für die Transpilierung verwendet wird.

    Anwendungsbeispiel 1:

    from qiskit import QuantumCircuit, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    # Create a simple circuit
    circuit = QuantumCircuit(3)
    circuit.h(0)
    circuit.cx(0,1)
    circuit.cx(0,2)
    circuit.measure_all()
    circuit.draw('mpl')
    
    # Define backend with 3 qubits
    backend = GenericBackendV2(num_qubits=3)
    
    # Transpile and run
    transpiled_circuit = transpile(circuit, backend)
    result = backend.run(transpiled_circuit).result()

    Anwendungsbeispiel 2:

    from qiskit import QuantumCircuit, ClassicalRegister, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    # Create a circuit with classical control
    creg = ClassicalRegister(19)
    qc = QuantumCircuit(25)
    qc.add_register(creg)
    qc.h(0)
    for i in range(18):
        qc.cx(0, i + 1)
    for i in range(18):
        qc.measure(i, creg[i])
    with qc.if_test((creg, 0)):
        qc.ecr(20, 21)
    
    # Define backend with custom basis gates and control flow instructions
    backend = GenericBackendV2(
        num_qubits=25,
        basis_gates=["ecr", "id", "rz", "sx", "x"],
        control_flow=True,
      )
    
    #Transpile
    transpiled_qc = transpile(qc, backend)
    Anmerkung

    Die von dieser Klasse erzeugten Rauscheigenschaften ahmen kein konkretes Quantengerät nach und sollten nicht dazu verwendet werden, konkrete Verhaltensweisen zu messen. Es handelt sich um "vernünftige Vorgaben", die zum Testen von Backend-Schnittstellenfunktionen verwendet werden können, die nicht an bestimmte Rauschwerte realer Quantensysteme gebunden sind. Für eine genauere Simulation vorhandener Geräte können Sie manuell ein Geräuschmodell aus dem realen Backend erstellen, indem Sie die Funktionen in qiskit_aer.

  • Das qiskit.providers.fake_provider modul enthält nun eine Reihe von generischen Fake-Backends, die der BackendV1 schnittstelle. Sie wurden als Alternative zu den Snapshot-basierten Fake-Backends eingeführt, die in den veralteten FakeProvider (FakeVigo, FakeTokyo, etc) enthalten sind. Die Liste der neuen gefälschten Backends umfasst:

    Sie können nach folgendem Muster importiert werden: from qiskit.providers.fake_provider import Fake5QV1. Weitere Einzelheiten zu den Backend-Eigenschaften finden Sie in der API-Dokumentation des jeweiligen Backends.

OpenQASM Funktionen

  • Das qiskit.qasm3 paket enthält nun einen eingebauten, auf Rust basierenden Parser zum Einlesen von OpenQASM 3 Programmen in QuantumCircuits, zu finden unter qiskit.qasm3.load_experimental() und loads_experimental(). Diese sind in der Regel um ein Vielfaches schneller als die bestehenden, reinen Python load() und loads() funktionen, für die zusätzlich qiskit-qasm3-import installiert werden muss.

    Wir können zum Beispiel eine Verschränkung mit 20.000 Befehlen erstellen QuantumCircuit:

    import numpy as np
    import qiskit.qasm3
    from qiskit.circuit.library import RealAmplitudes
    
    qc = RealAmplitudes(100, reps=100, flatten=True)
    qc = qc.assign_parameters(np.random.rand(qc.num_parameters))
    oq3 = qiskit.qasm3.dumps(qc)

    Das alte qasm3.loads() brauchte etwa 7.3s um das resultierende OpenQASM 3 Programm zu laden, während qasm3.loads_experimental() unter 300ms auf einem Macbook Pro ( i7, 2020) - eine Beschleunigung von 25x!

    Der unterstützte Funktionsumfang des experimentellen Parsers ist in dieser Vorabversion sehr begrenzt, wird aber mit der Verbesserung sowohl der Qiskit-Seite als auch des nativen Rust-basierten Parsers erweitert.

    Eines unserer Hauptziele bei diesem neuen Parser ist neben den enormen Geschwindigkeitsverbesserungen die Bereitstellung einer erstklassigen Fehlerdiagnose. Wie bei anderen Teilen des Parsers sind diese noch in Arbeit, aber Sie werden schon bald viel bessere Fehlermeldungen sehen, wenn Sie ungültige OpenQASM 3 Programme mit dem experimentellen Parser parsen.

  • Der OpenQASM 3 Exporter (siehe dump() und dumps() funktionen in qiskit.qasm3) unterstützt jetzt standardmäßig die stabilisierte Syntax der Anweisung switch in OpenQASM 3. Die Vorzertifizierungssyntax der Anweisung switch ist weiterhin verfügbar, indem das ExperimentalFeatures.SWITCH_CASE_V1 flagge im experimental Argument des Exporteurs. Für die stabilisierte Syntax ist kein Merkmalsflag erforderlich, aber wenn Sie mit anderen Werkzeugen arbeiten, die noch nicht aktualisiert wurden, müssen Sie möglicherweise das Experimentalflag übergeben.

    Die Syntax der stabilisierten Form unterscheidet sich geringfügig in Bezug auf die Beendigung von break Anweisungen (nicht mehr erforderlich und nicht mehr zulässig), und mehrere Fälle werden nun in einer einzigen case Zeile zusammengefasst, anstatt das Fall-Through-Verfahren im Stil von C zu verwenden. Weitere Einzelheiten finden Sie in der Dokumentation OpenQASM 3 über das switch-case-Konstrukt.

QPY-Funktionen

  • Eine neue Warnklasse wurde hinzugefügt, QPYLoadingDeprecatedFeatureWarningzum QPY-Modul hinzugefügt. Diese Klasse ermöglicht es, Warnungen vor veralteten Funktionen auch dann anzuzeigen, wenn der Zugriff auf die veraltete Funktion an einer variablen Stelle im Aufrufstapel erfolgt, wie dies bei vielen rekursiv aufgerufenen QPY-Ladefunktionen der Fall ist.

  • Ein neues Flag, version, wurde der qpy.dump() funktion. Dies erlaubt qpy.dump() optional einen ganzzahligen Wert für die auszugebende QPY-Format-Version annehmen. Dies ist nützlich, wenn Sie eine QPY-Datei erzeugen wollen, die von einer älteren Version von Qiskit geladen werden soll. Allerdings ist die Anzahl der unterstützten Versionen begrenzt. Es können nur Versionen zwischen der letzten QPY-Version (Standardversion) und der kompatiblen QPY-Version 10 (eingeführt mit Qiskit 0.45.0 ) verwendet werden. Die Kompatibilitätsversion wird für die gesamte Hauptversionsreihe 1.x.y beibehalten. Dies ändert nichts an den Rückwärtskompatibilitätsgarantien des QPY-Formats beim Aufruf von qpy.load()es ermöglicht den Nutzern lediglich, eine ältere Version von QPY zu emittieren, um die Kompatibilität und Interoperabilität zwischen den Versionsreihen 0.x und 1.x zu erhalten.

Quanteninformationsmerkmale

  • Hinzufügen einer qiskit.quantum_info.StabilizerState.from_stabilizer_list() methode hinzugefügt, die einen Stabilisatorzustand aus einer Liste von Stabilisatoren erzeugt:

    from qiskit.quantum_info import StabilizerState
    
    stabilizer_list = ["ZXX", "-XYX", "+ZYY"]
    stab = StabilizerState.from_stabilizer_list(stabilizer_list)
  • SparsePauliOp.from_operator() verwendet nun eine Implementierung des in Hatznko, Binkowski und Gupta (2023 ) vorgestellten "tensorisierten Pauli-Zerlegungsalgorithmus". Die Methode ist nun um mehrere Größenordnungen schneller; so ist es zum Beispiel möglich, einen zufälligen 10-Qubit-Operator in etwa 250ms auf einem Macbook Pro (Intel i7, 2020) zu zerlegen.

Synthesefunktionen

  • Hinzugefügt wurde eine qiskit.synthesis.synth_circuit_from_stabilizers() funktion hinzugefügt, die eine Schaltung zurückgibt, die den durch eine Reihe von gegebenen Stabilisatoren stabilisierten Zustand ausgibt.

  • Die AQC-Plugin-Methode für die unitäre Synthese verwendet nun standardmäßig eine schnellere Bewertung der Zielfunktion, was zu einer erheblichen Verbesserung der Synthesezeit führt.

  • Hinzufügen einer neuen Synthesemethode synth_qft_line() einer QFT-Schaltung für lineare Nächste-Nachbarn-Verbindungen, die die Anzahl der SWAPs für eine große Anzahl von Qubits im Vergleich zu SABRE erheblich reduziert.

  • Die Klasse TwoQubitWeylDecomposition wurde der öffentlichen API hinzugefügt in qiskit.synthesis. Diese Klasse ermöglicht die Anwendung der Weyl-Zerlegung von Zwei-Qubit-Unitariern. Wenn Sie diese Klasse zuvor importiert haben, als sie noch eine nicht-öffentliche Klasse in dem jetzt entfernten Modul qiskit.quantum_info.synthesis war, sollten Sie Ihre Importpfade aktualisieren.

Transpiler-Funktionen

  • Eine neue Ausnahmeklasse wurde hinzugefügt: InvalidLayoutError. Dies ist eine TranspilerError unterklasse, die ausgelöst wird, wenn ein vom Benutzer bereitgestelltes Layout ungültig ist (ungleiche Größe, doppelte Qubits usw.).

  • Ein neues Schlüsselwortargument, num_processes, wurde zu transpile() und der PassManager.run() methode. Dadurch können sowohl QISKIT_NUM_PROCS als auch das Feld num_processes in den Benutzerkonfigurationsdateien auf der Basis der einzelnen Dateien überschrieben werden. Zum Beispiel:

    from qiskit import transpile, QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    transpile([qc]*10, basis_gates=['u', 'cz'], num_processes=2)

    führt das Transpilieren über die 10 Eingangskreise mit nur 2 Prozessen durch und überschreibt die Systemvorgabe, die Umgebungsvariable oder die Benutzerkonfigurationsdatei für diesen transpile() aufruf.

  • Es wurde ein neuer Transpiler-Pass hinzugefügt, OptimizeAnnotatedhinzugefügt, der kommentierte Operationen auf einem Quantenschaltkreis optimiert.

    Sehen Sie sich dazu das folgende Beispiel an:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.annotated_operation import (
        AnnotatedOperation,
        InverseModifier,
        ControlModifier,
    )
    from qiskit.circuit.library import CXGate, SwapGate
    from qiskit.transpiler.passes import OptimizeAnnotated
    
    # Create a quantum circuit with multiple annotated gates
    gate1 = AnnotatedOperation(
        SwapGate(),
        [InverseModifier(), ControlModifier(2), InverseModifier(), ControlModifier(1)],
    )
    gate2 = AnnotatedOperation(
        SwapGate(),
        [InverseModifier(), InverseModifier()]
    )
    gate3 = AnnotatedOperation(
        AnnotatedOperation(CXGate(), ControlModifier(2)),
        ControlModifier(1)
    )
    qc = QuantumCircuit(6)
    qc.append(gate1, [3, 2, 4, 0, 5])
    qc.append(gate2, [1, 5])
    qc.append(gate3, [5, 4, 3, 2, 1])
    
    # Optimize the circuit using OptimizeAnnotated transpiler pass
    qc_optimized = OptimizeAnnotated()(qc)
    
    # This is how the optimized circuit should look like
    gate1_expected = AnnotatedOperation(SwapGate(), ControlModifier(3))
    gate2_expected = SwapGate()
    gate3_expected = AnnotatedOperation(CXGate(), ControlModifier(3))
    qc_expected = QuantumCircuit(6)
    qc_expected.append(gate1_expected, [3, 2, 4, 0, 5])
    qc_expected.append(gate2_expected, [1, 5])
    qc_expected.append(gate3_expected, [5, 4, 3, 2, 1])
    
    assert qc_optimized == qc_expected

    Im Fall von gate1 werden die Modifikatoren des kommentierten Swap-Gates in die kanonische Form gebracht: Die beiden InverseModifiers heben sich auf, und die beiden ControlModifiers werden kombiniert. Im Fall von gate2 werden alle Modifikatoren entfernt und die kommentierte Operation wird durch ihre Basisoperation ersetzt. Im Fall von gate3 werden mehrere Ebenen von Anmerkungen zu einer einzigen zusammengefasst.

    Der Konstruktor des OptimizeAnnotated passes akzeptiert optionale Argumente target, equivalence_library, basis_gates und recurse. Wenn recurse gleich True ist (der Standardwert) und entweder target oder basis_gates angegeben wird, geht der Durchlauf rekursiv bis zu den Schaltkreisen des Gatters definition , mit Ausnahme von Gattern, die bereits vom Ziel unterstützt werden oder die zur Äquivalenzbibliothek gehören. Wenn hingegen weder target noch basis_gates angegeben sind oder wenn recurse auf False gesetzt ist, synthetisiert der Durchlauf nur die kommentierten Operationen der "obersten Ebene", d. h. er steigt nicht rekursiv in die Schaltungen von definition hinab. Dieses Verhalten ist konsistent mit dem des HighLevelSynthesis transpiler-Pass, der aufgerufen werden muss, um die kommentierten Operationen in 1-Qubit- und 2-Qubit-Gatter zu "entrollen".

  • Eine neue HighLevelSynthesisPlugin für PermutationGate objekte, die auf dem Token-Swapper-Algorithmus von Qiskit basieren. Um dieses Plugin zu verwenden, geben Sie bei der Definition der High-Level-Synthese-Konfiguration token_swapper an.

    Dieses Synthese-Plugin kann vor oder nach der Festlegung des Layouts ausgeführt werden. Wenn die Synthese erfolgreich ist, gibt das Plugin eine Quantenschaltung aus, die nur aus Tauschgattern besteht. Wenn die Synthese nicht erfolgreich ist, gibt das Plugin None aus.

    Der folgende Code veranschaulicht, wie das neue Plugin ausgeführt werden kann:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PermutationGate
    from qiskit.transpiler import PassManager, CouplingMap
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HighLevelSynthesis, HLSConfig
    
    # This creates a circuit with a permutation gate.
    qc = QuantumCircuit(8)
    perm_gate = PermutationGate([0, 1, 4, 3, 2])
    qc.append(perm_gate, [3, 4, 5, 6, 7])
    
    # This defines the coupling map.
    coupling_map = CouplingMap.from_ring(8)
    
    # This high-level-synthesis config specifies that we want to use
    # the "token_swapper" plugin for synthesizing permutation gates,
    # with the option to use 10 trials.
    synthesis_config = HLSConfig(permutation=[("token_swapper", {"trials": 10})])
    
    # This creates the pass manager that runs high-level-synthesis on our circuit.
    # The option use_qubit_indices=True indicates that synthesis is run after the layout is set,
    # and hence should preserve the specified coupling map.
    pm = PassManager(
        HighLevelSynthesis(
            synthesis_config, coupling_map=coupling_map, target=None, use_qubit_indices=True
        )
    )
    
    qc_transpiled = pm.run(qc)
  • Zwei neue Argumente, matrix_based und max_qubits, wurden dem Konstruktor des CommutativeInverseCancellation transpiler-Passes. Wenn matrix_based True ist, verwendet der Durchlauf Matrixdarstellungen, um zu prüfen, ob zwei Operationen die Inverse voneinander sind. Dies macht die Prüfungen leistungsfähiger und ermöglicht darüber hinaus die Aufhebung von Paaren von Operationen, die bis zu einer Phase invers sind, während die globale Phase der Schaltung entsprechend aktualisiert wird. Dies führt im Allgemeinen zu mehr Kürzungen auf Kosten einer längeren Laufzeit. Das Argument max_qubits begrenzt die Anzahl der Qubits bei matrixbasierten Kommutativitäts- und Inversitätsprüfungen. Zum Beispiel:

    import numpy as np
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import CommutativeInverseCancellation
    
    circuit = QuantumCircuit(1)
    circuit.rz(np.pi / 4, 0)
    circuit.p(-np.pi / 4, 0)
    
    passmanager = PassManager(CommutativeInverseCancellation(matrix_based=True))
    new_circuit = passmanager.run(circuit)

    Der Pass ist in der Lage, die Gatter RZ und P zu löschen und gleichzeitig die globale Phase der Schaltung auf 15π8\frac{15 \pi}{8} einzustellen.

  • Eine neue Funktion wurde hinzugefügt, high_level_synthesis_plugin_names()hinzugefügt, die verwendet werden kann, um die Liste der installierten High-Level-Synthese-Plugins für einen bestimmten Operationsnamen zu erhalten.

Visualisierungsfunktionen

  • Die Ausgänge text und mpl für die QuantumCircuit.draw() und circuit_drawer() zeigen nun detaillierte Informationen zu den Operationen der Schaltkreisschublade AnnotatedOperation. Wenn die AnnotatedOperation.modifiers ein ControlModifierenthält, wird der Vorgang auf dieselbe Weise angezeigt wie bei kontrollierten Gattern. Wenn die InverseModifier oder PowerModifier verwendet wird, werden diese mit dem Namen der Basisoperation angezeigt. Zum Beispiel:

    from qiskit.circuit import (
        AnnotatedOperation,
        ControlModifier,
        PowerModifier,
        InverseModifier,
        QuantumCircuit
    )
    from qiskit.circuit.library import SGate
    
    annotated_op = AnnotatedOperation(SGate(), [PowerModifier(3.4), ControlModifier(3), InverseModifier()])
    qc = QuantumCircuit(4)
    qc.append(annotated_op, range(4))
    qc.draw("mpl")
    _images/release_notes-1.png

Versch. Funktionen

  • Eine neue Warnungs-Basisklasse wurde hinzugefügt, QiskitWarning. Während Qiskit weiterhin die eingebauten Python Warnungen (wie DeprecationWarning) verwenden, wenn diese am besten geeignet sind, werden die Warnungen für Fälle, die spezifischer für Qiskit sind, Unterklassen von QiskitWarning.

  • Die Tester für die optionale Funktionalität (qiskit.utils.optionals) unterscheiden nun zwischen einer optionalen Abhängigkeit, die überhaupt nicht gefunden wurde (eine normale Situation) und einer, die zwar gefunden wurde, aber beim Import Fehler auslöste. Im letzteren Fall werden sie nun eine OptionalDependencyImportWarning aus, was passiert ist, da es sich um eine fehlgeschlagene Installation oder eine inkompatible Version handeln könnte.

Anmerkungen zu Upgrades

  • Qiskit 1.0 benötigt jetzt die Version 0.14.0 von rustworkx. Die Mindestversionsanforderung wurde erhöht, um das neue token_swapper PermutationGate synthese-Plugin für HighLevelSynthesisPlugin.

  • Die minimal unterstützte Rust-Version für die Erstellung von Qiskit aus dem Quellcode ist nun 1.70. Diese wurde von der vorherigen minimal unterstützten Rust-Version von 1.64 in der Qiskit 0.45.x und 0.46.0 Release-Serie angehoben.

  • Die Abhängigkeit von psutil wurde entfernt. Die psutil-Bibliothek wurde bisher nur zur Ermittlung der Anzahl der physischen CPUs und des gesamten Systemspeichers verwendet. Diese Informationen sind jedoch nicht wertvoll genug, um die zusätzlichen Abhängigkeiten und den Overhead zu rechtfertigen, und wurden daher entfernt. Dies bedeutet, dass die Standardanzahl der Prozesse, die von parallel_map() verwendeten Prozesse und Funktionen, die intern parallel_map() wie z.B transpile() und PassManager.run() mehr oder weniger parallele Prozesse als in früheren Versionen verwenden können. Wenn Sie die Anzahl der verwendeten Prozesse anpassen möchten, können Sie das neue Argument num_processes für diese Funktionen oder die Umgebungsvariable QISKIT_NUM_PROCS oder das Feld num_processes in einer Benutzerkonfigurationsdatei verwenden (weitere Einzelheiten finden Sie in der Anleitung zur lokalen Konfiguration ), wenn Sie die Anzahl der Prozesse, die Qiskit potenziell verwendet, anpassen müssen.

  • Die Methoden scoped_parameters und search_parameters wurden aus der Klasse ScheduleBlock klasse entfernt. Diese Methoden gaben Parameter objekte zurück, die teilweise mit den Parametern in der ScheduleBlock instanz verknüpften, aber die Zuweisung von Werten über diese Objekte funktionierte nicht korrekt. Benutzer sollten ScheduleBlock.parameters stattdessen verwenden und sich durch ScheduleBlock.references und vergleichen mit den Schedule.parameters attributen der Unterreferenzen vergleichen, wenn sie unterscheiden müssen, in welchem Unterprogramm ein Parameter verwendet wird. Siehe #11654 für weitere Informationen.

  • Die Logik für die Injektion von QuantumCircuit und Gate operationen in den Pulskontext (wie in pulse.builder.call()), was ein veraltetes Verhalten war, das in Qiskit 0.46 veraltet ist. Impulsfahrpläne sollten als vollständiger Fahrplankontext aufgebaut werden; Schaltungen und Gatter sind eine höhere Abstraktionsebene.

    Dazu gehört auch die Abschaffung der entsprechenden Funktionen:

    • pulse.builder.call_gate
    • pulse.builder.cx
    • pulse.builder.u1
    • pulse.builder.u2
    • pulse.builder.u3
    • pulse.builder.x
    • pulse.builder.active_transpiler_settings
    • pulse.builder.active_circuit_scheduler_settings
    • pulse.builder.transpiler_settings
    • pulse.builder.circuit_scheduler_settings

    Die Argumente default_transpiler_settings und default_circuit_scheduler_settings für pulse.builder.build() werden in ähnlicher Weise entfernt.

    from qiskit import transpile, schedule, QuantumCircuit, pulse
    from qiskit.providers.fake_provider import Fake7QPulseV1
    
    backend = Fake7QPulseV1()
    
    # Create a schedule from a hardware-based circuit.
    qc = QuantumCircuit(2)
    qc.cx(0, 1)
    qc = transpile(qc, backend)
    sched = schedule(qc, backend)
    
    # These pulse schedules can still be called in builder contexts.
    with pulse.build(backend) as qc_sched:
      pulse.call(sched)
    
    # Schedules for certain operations can also be directly retrieved
    # from BackendV1 instances:
    sched = backend.defaults().instruction_schedule_map.get('x', (0,))
    
    # ... and from BackendV2 instances:
    sched = backend.target['x'][(0,)].calibration
  • Die für symengine erforderliche Mindestversion wurde auf >= 0.11 erhöht.

Hinweise zur Aktualisierung von Schaltkreisen

  • Entfernt wurde die Methode Instruction.qasm , die in Qiskit 0.45.0 veraltet war. Verwenden Sie qiskit.qasm2.dump() mit einem vollständigen QuantumCircuit stattdessen.

  • Die Eigenschaften Bit.register und Bit.index werden entfernt. Sie wurden in Qiskit 0.25 (veröffentlicht in 2021-04) veraltet. Die Qubits und Bits leben nur noch im Kontext einer QuantumCircuit. Die Alternative zu den Eigenschaften ist die Verwendung von QuantumCircuit.find_bit() um alle Register innerhalb einer Schaltung und den Index des Bits innerhalb der Schaltung zu finden.

  • Die Methode QuantumCircuit.bind_parameters wurde entfernt, nachdem sie in Qiskit 0.45 veraltet ist. Sie können QuantumCircuit.assign_parameters() als Drop-in-Ersatz mit all seinen Voreinstellungen verwenden, und es bietet auch zusätzliche Funktionen gegenüber der alten Methode.

  • Der Import von Int1, Int2, BooleanFunction, classical_function() von qiskit.circuit ist jetzt deaktiviert. Importieren Sie stattdessen die Objekte aus dem qiskit.circuit.classicalfunction submodul, das das Paket tweedledum benötigt.

  • Die Nur-Daten-Attribute header und extension_lib von QuantumCircuit werden entfernt, nachdem sie in Qiskit 0.45 veraltet sind. Dies waren interne Angaben des OpenQASM 2 Exporters, die nicht mehr verwendet werden.

  • Das Modul qiskit.extensions wurde entfernt, da es seit der Version 0.45 zur Verwerfung ansteht und in der Version 0.46 vollständig verwerflich ist. Die folgenden Operationen dieses Moduls sind verfügbar in qiskit.circuit.library:

    Die folgenden Objekte wurden entfernt:

    • SingleQubitUnitary (verwenden Sie stattdessen library.UnitaryGate),
    • Snapshot (ersetzt durch die Speicheranweisungen von Aer),
    • ExtensionError,

    zusammen mit den folgenden Schaltungsmethoden:

    • QuantumCircuit.snapshot,
    • QuantumCircuit.squ,
    • QuantumCircuit.diagonal,
    • QuantumCircuit.hamiltonian,
    • QuantumCircuit.isometry und QuantumCircuit.iso,
    • QuantumCircuit.uc,
    • QuantumCircuit.ucrx,
    • QuantumCircuit.ucry,
    • QuantumCircuit.ucrz.

    Diese Operationen können immer noch durchgeführt werden, indem der entsprechende Befehl an eine Quantenschaltung angehängt wird.

  • Entfernte veraltete, duplizierte QuantumCircuit methoden. Diese umfassen:

  • Sie können nicht mehr QuantumCircuit.metadata auf None setzen, nachdem es in Qiskit 0.43.0 veraltet ist. Sein Typ ist dict. Um ihn zu löschen, setzen Sie ihn auf {}.

  • Das Attribut .Register.name_format wurde entfernt, nachdem es in Qiskit 0.40.0 veraltet ist. Es gibt keine Einschränkung mehr bei den Registernamen, und der reguläre Ausdruck dort war einfach [a-z][a-zA-Z0-9_]*.

Hinweise zum Upgrade von Primitives

Hinweise zum Upgrade für Anbieter

  • Geänderter Standardwert von zwei Argumenten (add_delay und filter_faulty) in der convert_to_target() funktion. Diese Konvertierungsfunktion fügt nun standardmäßig Verzögerungsanweisungen hinzu und entfernt fehlerhafte Anweisungen.

  • Die BackendProperties und PulseDefaults modellobjekte, die von der FakeOpenPulse2Q verwendeten Objekte wurden aktualisiert, um intern konsistent zu sein und fehlende Anweisungen hinzuzufügen. Wenn Sie sich auf die vorherigen Modellobjekte als Kompilierungsziel verlassen haben, können Sie das Backend mit Qiskit 0.46 verwenden und eine QuantumCircuit generiert mit transpile() exportieren und mit qpy.dump serialisieren, um in dieser Version darauf zuzugreifen.

  • Das Modul qiskit.providers.basicaer , das unter qiskit.BasicAer zu finden ist, wurde entfernt, nachdem es mit der Version 0.46 veraltet ist. Seine Funktionalität wurde ersetzt durch das qiskit.quantum_info modul und das neue qiskit.providers.basic_provider modul ersetzt.

    Die Umstellung von der Verwendung von qiskit.providers.basicaer (qiskit.BasicAer) auf qiskit.providers.basic_provider kann wie folgt durchgeführt werden:

    Migrieren von
    Ersetzen durch
    qiskit.BasicAerDer neue Anbieter hat keine globale Instanz, die Importe sollten von qiskit.providers.basic_provider
    qiskit.providers.basicaerbasic_provider
    BasicAerProviderBasicProvider
    BasicAerJobBasicProviderJob
    QasmSimulatorPyBasicSimulator
    UnitarySimulatorPyverwenden Operator
    StatevectorSimulatorPyverwenden Statevector

    Ein bemerkenswerter Unterschied ist, dass der neue Anbieter nicht mehr über eine globale Instanz (wie BasicAer) zugänglich ist, so dass es nicht möglich ist, from qiskit import BasicProvider zu verwenden. Stattdessen muss die Anbieterklasse aus ihrem Submodul importiert und manuell instanziiert werden:

    from qiskit.providers.basic_provider import BasicProvider
    
    provider = BasicProvider()
    backend = provider.get_backend("basic_simulator")

    Die folgenden Beispiele zeigen die Migrationspfade der drei Simulatoren in BasicAer.

    1. Zustandsvektor-Simulator:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("statevector_simulator")
      statevector = backend.run(qc).result().get_statevector()
      
      # New path
      from qiskit.quantum_info import Statevector
      statevector = Statevector(qc)
    2. Einheits-Simulator:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("unitary_simulator")
      result = backend.run(qc).result()
      
      # New path
      from qiskit.quantum_info import Operator
      result = Operator(qc).data
    3. Qasm-Simulator:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      qc.measure_all()
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("qasm_simulator")
      result = backend.run(qc).result()
      
      # New path
      from qiskit.providers.basic_provider import BasicProvider
      backend = BasicProvider().get_backend("basic_simulator")
      result = backend.run(qc).result()
      # or, directly
      from qiskit.providers.basic_provider import BasicSimulator
      backend = BasicSimulator()
      result = backend.run(qc).result()
  • Entfernt die ConfigurableFakeBackend Klasse, die in Qiskit 0.46.0 veraltet ist. Stattdessen kann eine geeignete FakeBackend verwendet werden.

  • Das abgelehnte qiskit.providers.fake_provider modul wurde in das qiskit-ibm-runtime Python Paket migriert. Aus diesem Grund wurden die folgenden Elemente in der qiskit.providers.fake_provider entfernt worden, nachdem sie in Qiskit veraltet sind 0.46:

    • qiskit.providers.fake_provider.FakeProvider
    • qiskit.providers.fake_provider.FakeProviderForBackendV2
    • qiskit.providers.fake_provider.FakeProviderFactory
    • qiskit.providers.fake_provider.fake_backends.FakeBackendV2
    • jedes gefälschte Backend, das in qiskit.providers.fake_provider.backends enthalten ist (zugänglich über den Provider)
    • qiskit.providers.fake_provider.FakeQasmSimulator
    • qiskit.providers.fake_provider.FakeJob
    • qiskit.providers.fake_provider.FakeQobj

    Um das neue Fake-Provider-Modul zu verwenden, können Sie pip install qiskit-ibm-runtime ausführen und den qiskit-Importpfad (qiskit.providers.fake_provider) durch den neuen Importpfad (qiskit_ibm_runtime.fake_provider) ersetzen. Beispiel für die Migration:

    # Legacy path
    from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()
    
    # New path
    # run "pip install qiskit-ibm-runtime"
    from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()

    Darüber hinaus wurden die folgenden, für spezielle Testzwecke entwickelten Fake-Backends durch die neue GenericBackendV2 klasse ersetzt und werden ebenfalls entfernt, nachdem sie in Qiskit veraltet sind 0.46:

    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2
    • `qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitProps
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple

    Beispiel für die Migration zur neuen GenericBackendV2 klasse:

    # Legacy path
    from qiskit.providers.fake_provider import FakeBackend5QV2
    backend = FakeBackend5QV2()
    
    # New path
    from qiskit.providers.fake_provider import GenericBackendV2
    backend = GenericBackendV2(num_qubits=5)
    # note that this class will generate 5q backend with generic
    # properties that serves the same purpose as FakeBackend5QV2
    # but will generate different results

Hinweise zum Pulse-Upgrade

  • Die veraltete Klasse qiskit.pulse.instructions.Call wurde entfernt. Es wird keine alternative Impulsanweisung bereitgestellt.

  • Veraltete Methoden in InstructionToQobjConverter und QobjToInstructionConverter wurden entfernt. Dazu gehören

    • InstructionToQobjConverter.convert_acquire()
    • InstructionToQobjConverter.convert_bundled_acquires()
    • InstructionToQobjConverter.convert_set_frequency()
    • InstructionToQobjConverter.convert_shift_frequency()
    • InstructionToQobjConverter.convert_set_phase()
    • InstructionToQobjConverter.convert_shift_phase()
    • InstructionToQobjConverter.convert_delay()
    • InstructionToQobjConverter.convert_play()
    • InstructionToQobjConverter.convert_snapshot()
    • QobjToInstructionConverter.convert_acquire()
    • QobjToInstructionConverter.convert_set_phase()
    • QobjToInstructionConverter.convert_shift_phase()
    • QobjToInstructionConverter.convert_set_frequency()
    • QobjToInstructionConverter.convert_shift_frequency()
    • QobjToInstructionConverter.convert_delay()
    • QobjToInstructionConverter.bind_pulse()
    • QobjToInstructionConverter.convert_parametric()
    • QobjToInstructionConverter.convert_snapshot()

    Diese öffentlichen Methoden werden alle durch geschützte Methoden ersetzt, die implizit vom einzigen Einstiegspunkt aus aufgerufen werden, d. h. die Klasse wird wie eine Funktion aufgerufen.

  • Die Klasse qiskit.pulse.library.ParametricPulse und alle Unterklassen werden entfernt. Diese wurden seit Qiskit 0.39 (mit qiskit-terra 0.22 ), veröffentlicht im Jahr 2022-10, veraltet. Verwenden Sie stattdessen SymbolicPulse und lesen Sie die Dokumentation für weitere Details.

OpenQASM Upgrade-Hinweise

  • Die Methoden qasm() der Klassen QuantumRegister und ClassicalRegister wurden entfernt. Es ist kein Ersatz notwendig; diese waren ein internes Detail einer alten Implementierung des OpenQASM 2 Exporters. Um ein Programm nach OpenQASM 2 zu exportieren, verwenden Sie qasm2.dump() oder qasm2.dumps().

QPY-Upgrade-Hinweise

  • Die neueste Formatversion von QPY ist jetzt Version 11, und das ist das, was standardmäßig ausgegeben wird, wenn man qpy.dump().

  • Der Modulpfad qiskit.circuit.qpy_serialization wurde entfernt, nachdem er in Qiskit 0.40.0 veraltet ist. Für die QPY-Serialisierung verwenden Sie qiskit.qpywas der neue Standort ist.

Hinweise zum Upgrade der Quanteninformation

  • Entfernt die veralteten __getitem__/__setitem__ magischen Methoden von Clifford. Die Methoden sind seit Qiskit 0.44, das im Jahr 2023-07 veröffentlicht wurde, veraltet. Stattdessen indexieren oder iterieren Sie das Attribut Clifford.tableau .

  • Das Modul qiskit.quantum_info.synthesis wurde entfernt, da es seit der Version 0.46 veraltet ist. Die folgenden Objekte wurden verschoben nach qiskit.synthesis:

    Diese Funktion wurde entfernt, da sie in der Version 0.46 bereits veraltet ist: * cnot_rxx_decompose

    Diese Funktionen wurden entfernt, da sie bereits in einer früheren Version veraltet waren: * decompose_clifford (verwenden Sie synth_clifford_full() stattdessen) * decompose_cnotdihedral (verwenden Sie synth_cnotdihedral_full() stattdessen)

  • Die Funktionen process_fidelity(), average_gate_fidelity(), gate_error() und diamond_norm() werden nicht mehr versuchen, beliebige Eingaben in ihre markierten erwarteten Typen zu zwingen, nachdem sie in Qiskit 0.25.0 veraltet sind. Übergeben Sie Eingaben der markierten Typen direkt an jedes Argument.

Hinweise zum Upgrade der Synthese

Hinweise zum Transpiler-Upgrade

  • Die veraltete Methode Target.aquire_alignment wurde entfernt. Es wurde in Qiskit 0.43 (veröffentlicht 2023-05) als veraltet markiert. Stattdessen sollte die Methode Target.acquire_alignment() verwendet werden.

  • Die veraltete Funktion qiskit.transpiler.preset_passmanagers.common.get_vf2_call_limit wurde entfernt. Verwenden Sie stattdessen get_vf2_limits().

  • Die implizite Verwendung von approximation_degree!=1.0 als Standard in der generate_preset_pass_manager() funktion wurde deaktiviert. Der vorherige Standardwert konnte zu unangemessenen und unerwarteten Annäherungen führen, insbesondere bei Arbeitslasten, die eine Trotterisierung oder ähnliche Operationen beinhalten, die nahe an der Identität liegen, aber eindeutig nicht gleich sind.

    Mit dieser Änderung werden die Standardeinstellungen für die Erzeugung von Pass-Managern an die Vorgaben von transpile()an, was immer die Absicht war. Siehe #8595 für weitere Einzelheiten.

  • Die veraltete Klasse Unroller wurde in qiskit.transpiler.passes.basis entfernt. Diese Klasse wurde in Qiskit 0.45 veraltet und die Verwendung kann durch die kombinierte Verwendung von BasisTranslator und ersetzt werden UnrollCustomDefinitions.

    Beachten Sie, dass BasisTranslator und UnrollCustomDefinitions andere Argumente benötigen als Unroller, da sie die Übergabe eines EquivalenceLibrary Objekts erfordern.

    Wo bisher Unroller(basis_gates) verwendet werden konnte, können Sie jetzt verwenden:

    from qiskit.circuit.library.standard_gates.equivalence_library import (
        StandardEquivalenceLibrary as std_eqlib,
    )
    pm = PassManager([
        UnrollCustomDefinitions(std_eqlib, basis_gates)
        BasisTranslator(std_eqlib, basis_gates),
    ])
    translated = pm.run(circuit)
  • Der veraltete NoiseAdaptiveLayout transpiler pass wurde entfernt. Sie wurde in Qiskit 0.46.0 als veraltet markiert. Dieser Pass wurde weitgehend ersetzt durch VF2Layout und VF2PostLayout ersetzt, die ein Layout auf der Grundlage der gemeldeten Geräuschmerkmale eines Backends festlegen. Zusammen mit dem Pass wurde auch das Plugin layout_method "noise_adaptive" entfernt.

  • Der veraltete CrosstalkAdaptiveSchedule transpiler pass wurde entfernt. Sie wurde in Qiskit 0.46.0 als veraltet markiert. Dieser Pass war nicht mehr verwendbar, da seine interne Funktionsweise davon abhing, dass benutzerdefinierte Eigenschaften in der BackendProperties nutzlast einer BackendV1 instanz. Da keine Backends diese Felder setzen, wurde der Pass entfernt. Wenn Sie den Pass für einen benutzerdefinierten Workflow benötigen, können Sie die Version in Qiskit 0.46.x verwenden.

  • Das Modul qiskit.transpiler.synthesis wurde entfernt, da es seit der Veröffentlichung von 0.46 veraltet ist. Die folgenden Objekte wurden verschoben:

  • Das Schlüsselwort target alias beim Aufruf von TwoQubitBasisDecomposer instanzen als Funktionen wurde entfernt, nachdem es in Qiskit 0.40.0 veraltet ist. Sie sollten das Argument positionell als erstes Argument übergeben oder den neuen Namen unitary verwenden.

  • Der spezielle Transpiler-Pass LinearFunctionsSynthesis wurde entfernt, nachdem er in Qiskit 0.40.0 veraltet ist. Seit seiner Abschaffung ist es nur noch ein sehr dünner Wrapper um HighLevelSynthesisdie Sie stattdessen verwenden sollten.

  • Der Importpfad qiskit.transpiler.passes.scheduling.calibration_creators wird entfernt. Der Transpiler gibt sie untergebracht weiter, RZXCalibrationBuilder und RZXCalibrationBuilderNoEcho kann direkt von qiskit.transpiler.passes.

  • Der Importpfad qiskit.transpiler.passes.scheduling.rzx_templates wird entfernt. Sie sollten importieren rzx_templates() von qiskit.transpiler.passes direkt importieren.

  • Ein Muster für die Konstruktion der Passpierlinie wurde verbessert. Der unten gezeigte syntaktische Zucker für die Instanziierung des Flusscontrollers wurde entfernt.

    from qiskit.transpiler import PassManager
    
    pm = PassManager()
    pm.append(my_pass, condition=condition_callable, do_while=do_while_callable)

    Anstatt dieses Schlüsselwort-Argument-Muster zu verwenden, sollten Sie den Ablaufregler explizit instanziieren.

    from qiskit.passmanager import ConditionalController, DoWhileController
    from qiskit.transpiler import PassManager
    
    pm = PassManager()
    pm.append(
      ConditionalController(
        DoWhileController(my_pass, do_while=do_while_callable),
        condition=condition_callable,
      )
    )

    Beachten Sie, dass Sie die Hackordnung von Controllern verwalten können, wenn Sie sie verschachteln wollen, was mit Schlüsselwortargumenten nicht möglich war. Sie können die Pipeline auch mit dem Konstruktor des Pass-Managers wie unten aufbauen, da es keinen Grund gibt, die Append-Methode jetzt aufzurufen.

    pm = PassManager(
      ConditionalController(
        DoWhileController(my_pass, do_while=do_while_callable),
        condition=condition_callable,
      )
    )
  • Die Append-Methode von eingebauten Flow Controllern wurde entfernt. Dazu gehören

    • ConditionalController.append
    • DoWhileController.append
    • FlowControllerLinear.append

    Die Task-Pipeline in einem Ablaufsteuerungsgerät ist eingefroren und muss bei der Erstellung der Steuerungsinstanz übergeben werden.

  • Entfernt wurden die Methoden passess von PassManager und StagedPassManager die eine Darstellung der eingeschlossenen Pässe in Form einer Liste von Wörterbüchern zurückgaben. Dieses Format kann jedoch kompliziertere Durchlaufpipelines, die bedingte Verzweigungen und verschachtelte Bedingungen enthalten können, nicht effizient darstellen. Anstelle dieser Darstellung verwenden Sie bitte folgendes Muster

    pm = PassManager(...)
    pm.to_flow_controller().tasks

    Dies gibt direkt eine linearisierte Basisaufgabeninstanz im Tupelformat zurück.

  • Das Argument max_iteration wurde entfernt aus PassManager.append() und PassManager.replace().

  • Die folgenden Legacy-Klassen wurden aus den Modulen Pass Manager und Transpiler entfernt, nachdem sie in Qiskit veraltet sind 0.46:

    • qiskit.passmanager.flow_controllers.FlowController
    • qiskit.transpiler.fencedobjs.FencedObject
    • qiskit.transpiler.fencedobjs.FencedPropertySet
    • qiskit.transpiler.fencedobjs.FencedDAGCircuit
    • qiskit.transpiler.runningpassmanager.RunningPassManager

Hinweise zum Upgrade der Visualisierung

  • Der Standardstil für die Schaltkreisvisualisierung mit Matplotlib wurde in "iqp" geändert, passend zur IBM Quantum Platform.

  • Das veraltete Modul qiskit.visualization.qcstyle wurde entfernt. Dieses Modul ist seit Qiskit 0.39.0 als veraltet gekennzeichnet. Verwenden Sie stattdessen die Seite qiskit.visualization.circuit.qcstyle.

  • Die veraltete Unterstützung für die Übergabe einer QuasiDistribution, ProbDistributionoder ein Verteilungswörterbuch an das data Argument der plot_histogram() visualisierung wurde entfernt. Diese Funktionalität wurde in der Qiskit 0.39.0 Version (2022-10) als veraltet markiert. Wenn Sie stattdessen ein Histogramm von einem QuasiDistribution, ProbDistributionoder einem Verteilungswörterbuch zeichnen möchten, sollten Sie stattdessen die Funktion plot_distribution() funktion verwenden.

  • Die Taste link_interval_dt von QiskitTimelineStyle wurde entfernt. Sie sollten den neuen Namen link_interval_percent verwenden.

Versch. Anmerkungen zu Upgrades

  • Das Objekt qiskit.Aer wurde entfernt, nachdem es in Qiskit 0.46 veraltet ist. Sie können stattdessen qiskit_aer.Aer verwenden, das ein einfacher Ersatz ist.

  • Der Import von qiskit.providers.aer wird nicht mehr funktionieren, da er in Qiskit 0.46 veraltet ist. Sie sollten stattdessen von qiskit_aer importieren, das einen sofortigen Ersatz darstellt.

  • Pulse-Jobs werden in Fake-Backends nicht mehr unterstützt, nachdem die zugrunde liegende Simulationsfunktionalität in Aer veraltet ist und entfernt wurde. Für die Simulation auf Impulsebene außerhalb des Kontextes von Schaltkreisobjekten sollten Sie eine Spezialbibliothek wie Qiskit Dynamics verwenden.

  • Die Funktion execute() von Qiskit wird entfernt. Diese Funktion diente als High-Level-Wrapper, um einen Schaltkreis mit einigen Transpile-Optionen zu transpilieren und ihn auf einem Backend mit einigen Run-Optionen auszuführen. Um das Gleiche zu tun, können Sie explizit die transpile() funktion (mit den entsprechenden Transpile-Optionen) gefolgt von backend.run() (mit den entsprechenden Run-Optionen).

    Zum Beispiel, anstatt zu laufen:

    from qiskit import execute
    job = execute(circuit, backend)

    können Sie laufen:

    from qiskit import transpile
    new_circuit = transpile(circuit, backend)
    job = backend.run(new_circuit)

    Alternativ dazu ist das Primitiv Sampler semantisch äquivalent zu der veralteten Funktion execute() . Die Klasse BackendSampler ist ein generischer Wrapper für Backends, die keine Primitive unterstützen:

    from qiskit.primitives import BackendSampler
    sampler = BackendSampler(backend)
    job = sampler.run(circuit)
  • Das veraltete qiskit.IBMQ Objekt wurde entfernt. Dieses Alias-Objekt wurde in der Qiskit 0.40.0 Version als veraltet markiert. Dieses Alias-Objekt leitete den Zugriff auf Attribute nach qiskit.providers.ibmq.IBMQ um. Da das Paket qiskit-ibmq-provider nun aus dem Verkehr gezogen und durch das Paket qiskit-ibm-provider ersetzt wurde, das seinen eigenen Namensraum unterhält, ist die Beibehaltung dieses Alias nicht mehr relevant. Wenn Sie auf den Alias qiskit.IBMQ angewiesen waren, sollten Sie Ihre Nutzung auf das Paket qiskit-ibm-provider umstellen; weitere Einzelheiten finden Sie im Migrationsleitfaden.

  • Das veraltete Modul qiskit.tools.jupyter , das zuvor Jupyter-Magics und Widgets zur interaktiven Visualisierung einiger Daten aus Qiskit enthielt, wurde entfernt. Dieses Modul wurde in Qiskit 0.46.0 veraltet. Die meisten dieser Funktionen waren direkt an das alte Paket qiskit-ibmq-provider gebunden und nicht mehr gültig, weshalb das Modul entfernt wurde. Eine ähnliche Funktionalität bietet das Modul qiskit_ibm_provider.jupyter aus dem Paket qiskit-ibm-provider.

  • Das veraltete Modul qiskit.tools.monitor wurde entfernt, das früher Werkzeuge zur Verfolgung von JobV1 job-Instanzen enthielt, hauptsächlich aus dem alten Paket qiskit-ibm-provider . Dieses Modul wurde in Qiskit 0.46.0 als veraltet markiert. Sie wird entfernt, weil sie direkt mit dem alten Paket qiskit-ibm-provider verbunden war.

  • Der veraltete Importpfad qiskit.test.mock wurde entfernt, der zuvor verwendet wurde, um Importe für die Mock-Backends zu ihrem neueren Speicherort in der qiskit.providers.fake_provider. Dieses Modul wurde in Qiskit 0.37.0 als veraltet markiert. Wenn Sie dieses Modul verwendet haben, sollten Sie Ihre Importe von qiskit.test.mock auf qiskit.providers.fake_provider stattdessen.

  • Das Modul qiskit.test ist nicht länger ein öffentliches Modul. Diese war nie für die Öffentlichkeit bestimmt und sollte auch nicht außerhalb von Qiskits eigenem Testprogramm verwendet werden. Alle Funktionen waren spezifisch für Qiskit und es werden keine Alternativen angeboten; wenn Sie ähnliche Funktionen benötigen, sollten Sie sie in Ihre eigenen Test-Kabelbäume integrieren.

  • Das veraltete qiskit.tools.visualization Modul wurde entfernt. Dieses Modul wurde in der Qiskit 0.46.0 Version veraltet. Dieses Modul war eine Weiterleitung vom ursprünglichen Standort des Visualisierungsmoduls von Qiskit und wurde nach qiskit.visualization in Qiskit 0.8.0 verschoben. Wenn Sie immer noch diesen Pfad verwenden, können Sie einfach Ihre Importe von qiskit.tools.visualization auf qiskit.visualization.

  • Das veraltete Modul qiskit.tools.events und das zugehörige Dienstprogramm qiskit.tools.progressbar , das es enthielt, wurde entfernt. Sie wurde in der Qiskit 0.46.0 Version veraltet. Die Funktionalität dieses Moduls war nicht weit verbreitet und wurde besser von speziellen Paketen wie tqdm abgedeckt.

  • Das Modul qiskit.tools ist entfernt worden. Dieses Modul wurde in Qiskit 0.46.0 veraltet. Der gesamte Inhalt dieses Moduls wurde entfernt, mit Ausnahme der Funktion qiskit.tools.parallel_map , die nun von qiskit.utils.parallel_map() stattdessen verwendet werden kann.

Veraltete Primitive

  • Die Methoden PrimitiveJob.submit() und PrimitiveJob.wait_for_final_state() wurden entfernt, nachdem sie in Qiskit 0.46 veraltet sind. Diese waren nicht als öffentliche Methoden gedacht, sondern waren ein Erbe einer falschen Vererbungsstruktur.

Fehlerkorrekturen

  • Die Rückgabe von falschen Messplänen, wenn nur eine Teilmenge von Qubits angefordert wurde, wurde behoben. Zuvor wurde ein Messplan für alle Qubits zurückgegeben.

  • Es wurde ein Problem in der text Schaltkreisschublade behoben, wenn Operationen angezeigt wurden, die nicht circuit.instruction.Instruction klasse. Diese Vorgänge würden dazu führen, dass die Schublade ausfällt. Beispiele waren Clifford und AnnotatedOperation.

  • Es wurde ein Problem mit dem SetLayout transpilerdurchgang, bei dem eine ungültige Integer-Listeneingabe, die doppelte Einträge enthielt, dazu führte, dass ein ungültiger Layout erzeugt wurde und nachfolgende Transpilerdurchläufe mit einem kryptischen Fehler fehlschlugen. Dies wird nun abgefangen, wenn SetLayout.run() aufgerufen wird, wird ein InvalidLayoutError fehler ausgelöst, der anzeigt, dass es doppelte Einträge in der Integer-Liste gibt.

  • QPY (mit qpy.dump() und qpy.load()) serialisiert und deserialisiert nun korrekt Quantenschaltungen mit kommentierten Operationen (AnnotatedOperation).

  • Aufruf von copy() oder copy_empty_like() auf einer BlueprintCircuit wird nun korrekt die global_phase auf die Kopie übertragen. Zuvor war die globale Phase nach dem Kopieren immer gleich Null.

  • QuantumCircuit.compose() löst nun korrekt eine CircuitError wenn es Duplikate in den Argumenten qubits oder clbits gibt.

  • QPY (mit qpy.dump() und qpy.load()) serialisiert und deserialisiert nun korrekt Quantenschaltungen mit Clifford-Operatoren (Clifford).

  • Ein Problem in der mpl Schaltkreisschublade wurde behoben, bei dem der Text über das Ende des Feldes für eine SwitchCaseOp über das Ende des Feldes hinaus gedruckt wurde, wenn der Standardfall leer war.

  • Die Übertragung von Qubit-Argumenten von QuantumCircuit.delay() erzeugt nun korrekt einzelne Delay anweisungen für jedes Qubit, wie beabsichtigt. Zuvor wurde bei bestimmten Iterabilien (z. B sets) eine ungültige Schaltung erzeugt, die an ungewöhnlichen Stellen fehlschlagen konnte.

  • Ein Problem wurde behoben, das bei der Verwendung von transpile() oder beim Ausführen eines voreingestellten Pass-Managers (z. B. generiert von generate_preset_pass_manager()), wenn er auf ein Backend abzielt, das eine disjunkte Konnektivität hat und der Ausgabe zusätzliche Barrieren hinzufügt QuantumCircuit. In einigen Fällen werden mehrere Einzel-Qubit Barrier direktiven in die Ausgangsschaltung aufgenommen werden, und zwar unmittelbar vor den endgültigen Messungen in der Schaltung. Dabei handelte es sich um einen internen Zustand, der von der internen Verarbeitung für disjunkte Verbindungen erzeugt und fälschlicherweise in den Ausgabeschaltkreis eingefügt wurde. Behoben #11649

  • Ein Fehler wurde behoben, der auftrat, wenn ein Benutzer versuchte, die Kalibrierungsdaten eines Gatters aus einem Target in einer bestimmten Situation. Dies tritt auf, wenn das Backend nur teilweise Kalibrierungsdaten meldet, z. B. wenn in einer Befehlsdefinition auf einen Wellenformimpuls verwiesen wird, dieser Wellenformimpuls aber nicht in der Impulsbibliothek enthalten ist. In diesem Fall konnte das Qiskit-Impulsobjekt nicht erstellt werden, was dazu führte, dass der Impulsplan für die Kalibrierung nicht erstellt werden konnte. Wenn nun die Kalibrierungsdaten unvollständig sind, wird Target behandelt dies so, als ob überhaupt keine Kalibrierung gemeldet würde, und löst keine Ausnahme aus.

  • Die Methode Operator.power() methode arbeitet jetzt mit Fließkomma-Exponenten und entspricht damit der dokumentierten Beschreibung.

  • Es wurde ein Problem mit dem OptimizeSwapBeforeMeasure Pass behoben, bei dem Schaltungen mit Swap- und Measure-Anweisungen falsch optimiert wurden. Zum Beispiel:

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import OptimizeSwapBeforeMeasure
    pass_ = OptimizeSwapBeforeMeasure()
    qc = QuantumCircuit(2, 1)
    qc.swap(0, 1)
    qc.measure(0, 0)
    qc.measure(0, 0)
    print(qc.draw())
    print(pass_(qc).draw())

    vorher drucken würde:

            ┌─┐┌─┐
    q_0: ─X─┤M├┤M├
          │ └╥┘└╥┘
    q_1: ─X──╫──╫─
             ║  ║
    c: 1/════╩══╩═
             0  0
         ┌─┐
    q_0: ┤M├───
         └╥┘┌─┐
    q_1: ─╫─┤M├
          ║ └╥┘
    c: 1/═╩══╩═
          0  0

    und jetzt ist die zweite Schaltung korrekt auf optimiert:

    q_0: ──────
         ┌─┐┌─┐
    q_1: ┤M├┤M├
         └╥┘└╥┘
    c: 1/═╩══╩═
          0  0
  • Ein Problem mit der QPY-Serialisierung wurde behoben, wenn eine QuantumCircuit mehrere benutzerdefinierte Instanzen von Anweisungen mit demselben name attribut haben. In Versionen des QPY-Formats vor Version 11 unterschied die QPY-Nutzlast nicht zwischen diesen Instanzen und serialisierte nur die Eigenschaften der ersten Instanz in einem Schaltkreis. Dies könnte zu einer fehlerhaften Deserialisierung führen, wenn die anderen Eigenschaften der benutzerdefinierten Anweisung unterschiedlich sind, aber die Namen gleich sind. Dies wurde in QPY Version 11 behoben, so dass jede Instanz einer benutzerdefinierten Anweisung einzeln serialisiert wird und es nicht mehr zu einem potenziellen Konflikt mit überlappenden Namen kommt. Behebt #8941.

  • Es wurde ein Problem mit der Funktion qpy.dump() funktion behoben, bei der, wenn das use_symengine Flag auf ein wahrheitsgemäßes Objekt gesetzt wurde, das zu True ausgewertet wurde, aber eigentlich nicht der boolesche Wert True war, die generierte QPY-Nutzlast beschädigt wurde. Wenn Sie zum Beispiel use_symengine auf HAS_SYMENGINEsetzen, wird dieses Objekt als True ausgewertet, wenn es als bool gecastet wird, ist aber nicht wirklich True.

  • Behebung eines Fehlers in der StabilizerState string-Darstellung.

  • Ein Fehler, bei dem convert_to_target() und BackendV2Converter einen unerwarteten Fehler auslöste, wurde behoben. Der Fehler trat auf, wenn das zu konvertierende Backend Kalibrierungen für ein Tor enthielt, für das in den Backend-Eigenschaften keine Definition vorhanden war. Ein solches Gatter wird nun als ideale fehlerfreie Anweisung an alle Qubits gesendet, selbst wenn Kalibrierungen für eine endliche Anzahl von Qubits gemeldet werden.

  • Es wurde ein Problem mit der circuit_drawer() funktion und QuantumCircuit.draw() methode beim Laden eines Matplotlib-Stils über die Benutzerkonfigurationsdatei.

  • InstructionDurations.from_backend() gibt nun eine Instanz einer beliebigen Unterklasse von InstructionDurations anstelle der Basisklasse zurück.

  • Der UnitarySynthesis transpiler-Pass erzeugt nun bei der Initialisierung einen Fehler, wenn ein nicht existierendes Synthese-Plugin angegeben wird, anstatt bis zur Laufzeit zu warten. Behoben #11355.

  • Die OpenQASM 3 Ausführer qasm3.dump() und dumps() geben nun korrekt Dateien aus, die als Version 3.0 und nicht als unqualifiziertes 3 angegeben werden, da das OpenQASM 3 Projekt die Versionierung nun standardisiert hat.

  • Die parametrische Form von XXPlusYYGate und XXMinusYYGate die von get_standard_gate_name_mapping() zurückgegeben wird, enthält nun korrekt den Parameter β\beta sowie die anfängliche Drehung θ\theta.

  • Der TemplateOptimization pass gibt nun parametrische Ausdrücke zurück, die das native symbolische Ausdrucksformat von ParameterExpressionzurück, anstatt immer Sympy zu verwenden. Für die meisten unterstützten Plattformen bedeutet dies, dass die Ausdrücke Symengine-Objekte sein werden. Zuvor konnte die Übergabe nicht übereinstimmende Objekte zurückgeben, was zu späteren Fehlern im Code für die Parameterbehandlung führen konnte.

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