Skip to main content
IBM Quantum Platform

Qiskit 0.43 Versionshinweise


0.43.3

Terra- 0.24.2

Vorspiel

Qiskit Terra 0.24.2 ist eine Fehlerbehebungsversion, die einige kleinere Probleme behebt, die seit der Version 0.24.1 festgestellt wurden.

Anmerkungen zu Upgrades

  • Die von dump ausgegebene Version des QPY-Formats hat sich auf 8 erhöht. Diese neue Formatversion bietet Unterstützung für die Serialisierung des QuantumCircuit.layout attributs.

Fehlerkorrekturen

  • Behebung der Deserialisierung von DiagonalGate instanzen durch QPY. Behoben #10364

  • Es wurde ein Problem mit der Funktion qs_decomposition() behoben, die eine Quanten-Shannon-Zerlegung durchführt. Wenn sie für triviale numerische Einheiten aufgerufen wurde, die nicht von dieser Zerlegung profitieren, wurde ein unerwarteter Fehler ausgelöst. Dieser Fehler wurde behoben, so dass solche Einheiten erkannt werden und das Ersatzschaltbild zurückgegeben wird. Behoben #10036

  • Es wurde ein Problem in der BasicSwap klasse, das verhinderte, dass die BasicSwap.run() methode nicht funktionierte, wenn das Schlüsselwortargument fake_run bei der Instanziierung der Klasse auf True gesetzt wurde. Behoben #10147

  • Ein Problem beim Kopieren von Schaltkreisen mit new-style Clbits und Qubits (Bits ohne Register), bei denen Verweise auf diese Bits aus der enthaltenen Schaltung unterbrochen werden konnten, was zu Problemen bei der Serialisierung und der Visualisierung von Schaltungen führte. Behoben #10409

  • Der CheckMap transpiler-Pass wird nicht mehr fälschlicherweise fehlschlagen, wenn es sich um verschachtelte bedingte Strukturen handelt, die von der Control-Flow-Builder-Schnittstelle erstellt wurden. Siehe #10394.

  • Ein Fehler des Pulse Builders wurde behoben, wenn der Kontext mit BackendV2.

  • Die Ausgabe von pulse measure() und measure_all() beim Aufruf von Funktionen mit dem BackendV2 backend aufgerufen werden.

  • Die Dimensionen der Ausgangsdichtematrix von DensityMatrix.partial_transpose() so dass sie mit den Dimensionen der entsprechenden Eingabedichtematrix übereinstimmen.

  • Der Import von qiskit.primitives führt nicht mehr zu Verwerfungswarnungen, die von dem veralteten qiskit.opflow modul stammen. Diese Warnungen wären den Benutzern durch die Standardfilter von Python verborgen geblieben, lösten aber den eifrigen Import von opflowaus, so dass ein späterer Import durch einen Benutzer die Warnungen nicht auslösen würde. Behoben #10245

  • Die OpenQASM 2 Ausgabe von QuantumCircuit.qasm() wenn ein benutzerdefiniertes Torobjekt ein Tor mit demselben Namen enthielt. Idealerweise sollte dies bei den meisten Gattern nicht passieren, aber komplexe algorithmische Operationen wie die GroverOperator klasse könnten solche Strukturen versehentlich erzeugen. Siehe #10162.

  • Es wurde eine Regression in der LaTeX Schublade von QuantumCircuit.draw() wenn temporäre Dateien in einem vom Arbeitsverzeichnis getrennten Dateisystem abgelegt werden. Siehe #10211.

  • Ein Problem wurde behoben mit UnitarySynthesis bei Verwendung des Parameters target , bei dem Schaltkreise mit Kontrollfluss nicht korrekt auf das Ziel abgebildet wurden.

  • Fehler behoben in VQD wo result.optimal_values eine Kopie von result.optimal_points war. Sie gibt nun die entsprechenden Werte zurück. Behoben #10263

  • Die Fehlermeldungen, die ausgegeben werden, wenn ein Versuch, einen vollständig gebundenen ParameterExpression in ein konkretes float oder int zu konvertieren, fehlgeschlagen ist, zum Beispiel weil der Ausdruck natürlich eine komplexe Zahl war. Behoben #9187

  • Feste float Umrechnungen für ParameterExpression werte, die zu irgendeinem Zeitpunkt in ihrer Konstruktionsgeschichte eine imaginäre Komponente hatten, die später gelöscht wurde. Bei Verwendung von Sympy als Backend hätten diese Konvertierungen in der Regel bereits funktioniert. Bei der Verwendung von Symengine als Backend schlugen diese Konvertierungen oft mit Typfehlern fehl, obwohl das Ergebnis symbolisch ausgewertet wurde, um real zu sein, und ParameterExpression.is_real() wahr ist. Behoben #10191

  • Behebung der qpy serialisierung von QuantumCircuit.layout attribut. Zuvor wurde das layout bei der Serialisierung eines Schaltkreises nach QPY weggelassen. Behoben #10112

Aer- 0.12.2

Vorspiel

Qiskit Aer 0.12.2 ist das zweite Patch-Release zu 0.12.0. Damit werden einige Fehler behoben, die seit der Veröffentlichung von 0.12.1 entdeckt wurden.

Anmerkungen zu Upgrades

  • Qiskit Aer erfordert nun eine CUDA-Version für den GPU-Simulator auf 11.2 oder höher. Zuvor war CUDA 10.1 die minimal unterstützte Version. Diese Änderung war aufgrund von Änderungen im Upstream-CUDA-Ökosystem, einschließlich der Unterstützung von cuQuantum, notwendig. Zur Unterstützung von Benutzern, die mit verschiedenen CUDA-Versionen arbeiten, ist jetzt ein separates Paket für CUDA 11 verfügbar: qiskit-aer-gpu-cu11 . Die Verwendung des Pakets qiskit-aer-gpu erfordert jetzt CUDA 12. Wenn Sie bereits ein Benutzer des Pakets qiskit-aer-gpu sind und CUDA 11 verwenden möchten, müssen Sie das Programm ausführen:

    pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11

    um von den früheren CUDA 10.x kompatiblen qiskit-aer-gpu Paketen auf das neue CUDA 11 kompatible Paket zu wechseln. Wenn Sie CUDA 12 bereits lokal einsetzen, können Sie das qiskit-aer-gpu Paket wie gewohnt aktualisieren.

Fehlerkorrekturen

  • Wenn eine Schaltung bedingte und Parameter hat, wurde die Schaltung nicht korrekt simuliert, weil die Parameterbindungen von Aer falsche Positionen für die Anwendung der Parameter verwendeten. Dies liegt an der mangelnden Berücksichtigung von bfunc-Operationen, die durch Conditional injiziert werden. Mit diesem Commit werden die Parameter unter Berücksichtigung der injizierten bfun-Operationen auf die richtigen Positionen gesetzt.

  • Parameter für globale Phasen wurden in #1814 nicht korrekt gesetzt. https://github.com/Qiskit/qiskit-aer/pull/1814 Parameterwerte für globale Phasen wurden in eine Schablonenschaltung kopiert und nicht in die tatsächlich zu simulierenden Schaltungen. Diese Übergabe kopiert die Parameterwerte korrekt in die zu simulierenden Schaltkreise.

  • Die Ergebnisse von backend.run() waren nicht serialisierbar, da sie AerCircuits enthalten. Diese Übergabe macht die Ergebnisse serialisierbar, indem AerCircuits aus den Metadaten entfernt wird.

  • meth:QuantumCircuit.save_statevector() funktioniert nicht, wenn der Schaltkreis aus OpenQASM3 text generiert wurde, weil seine Quantenregister doppelte Qubit-Instanzen haben. Mit dieser Übergabe verwendet :meth:QuantumCircuit.save_statevector() :data:QuantumCircuit.qubits , um die zu speichernden Qubits zu erhalten.

IBM Q Anbieter 0.20.2

Keine Änderung.


0.43.2

Zur Erinnerung: Die Aufnahme von Qiskit Aer in das Paket qiskit ist veraltet. Die nächste Unterversion von Qiskit Aer ( 0.13 ) wird in keiner Version des qiskit Pakets enthalten sein, und Sie sollten sofort damit beginnen, Aer separat zu installieren:

pip install qiskit-aer

und importiert sie als:

import qiskit_aer

Ab Qiskit 0.44 wird der Befehl pip install qiskit nicht mehr Qiskit Aer oder den veralteten IBM Q Provider installieren, der bereits durch den neuen IBM Provider ersetzt wurde.

Terra- 0.24.1

Keine Änderung

Aer- 0.12.1

Vorspiel

Qiskit Aer 0.12.1 ist die erste Patch-Veröffentlichung auf 0.12.0. Damit werden einige Fehler behoben, die seit der Veröffentlichung von 0.12.0 entdeckt wurden.

Bekannte Probleme

  • Behebung eines Fehlers, der falsche Erwartungswerte in Estimator liefert, wenn abelian_grouping=True.

Anmerkungen zu Upgrades

  • Verbesserte Leistung, wenn die gleichen Schaltungen und mehrere Parameter an Estimator mit approximation=True übergeben werden.

Hinweise zu veralteten Versionen

  • Die Optionen von meth:~.AerSimulator.run müssen die richtigen Typen verwenden.

Fehlerkorrekturen

  • Leistungseinbußen aufgrund der Einführung von AER::Config wurden behoben. Diese Klasse hat viele Felder, wird aber häufig in AER::Transpile::CircuitOptimization kopiert. Ursprünglich wurde json_t (die frühere Klasse für die Konfiguration) auch häufig kopiert, aber sie hat in den meisten Fällen Einträge, und dann ist dieser Kopier-Overhead kein Problem. Mit dieser Korrektur kopiert AER::Transpile::CircuitOptimization nicht AER::Config.

  • Wenn BLAS-Aufrufe fehlschlagen, weil omp-Threads keine Ausnahmen behandeln, stürzt Aer ohne Fehlermeldung ab. Dieser Fix sorgt dafür, dass omp-Threads Ausnahmen korrekt abfangen und dann außerhalb von omp-Schleifen erneut auslösen.

  • Bisher werden Parameter für Gatter in C++ nicht validiert. Wenn die Parameter kürzer sind als erwartet (aufgrund eines benutzerdefinierten Gatters), werden Segmentierungsfehler ausgelöst. Dieser Commit fügt Überprüfungen hinzu, ob die Parameterlänge expediert wird. Dieser Commit behebt die in #1612 gemeldeten Probleme. https://github.com/Qiskit/qiskit-aer/issues/1612

  • Seit 0.12.0 werden Parameterwerte in Schaltkreisen vorübergehend durch konstante Werte ersetzt, und die Parameterwerte werden in der C++-Bibliothek zugewiesen. Wenn also parameter_binds angegeben ist, gibt der Simulator Ergebnisse mit den Konstantenwerten als Parameterwerte zurück. Mit dieser Änderung löst Aer einen Fehler aus, wenn parameter_binds nicht angegeben ist, obwohl Schaltkreise Parameter haben.

  • Verfügbare Geräte und Methoden werden beim Import von Aer nicht mehr abgefragt.

  • Zuvor hatte AerSimulator die Metadaten von Schaltkreisen verändert, um die Konsistenz zwischen Eingabe und Ausgabe der Simulation aufrechtzuerhalten, mit dem Nebeneffekt einer unerwarteten Ansicht der Metadaten aus der Anwendung in der Simulation. Diese Lösung vermeidet die Verwendung von Schaltkreis-Metadaten, um die Konsistenz intern aufrechtzuerhalten, und bietet der Anwendung stets eine konsistente Ansicht der Metadaten.

  • Ein Fehler wurde behoben, bei dem die Abweichung in den Metadaten in EstimatorResult komplex war und nun einen Float zurückgibt.

  • Ein Build-Break wurde behoben, um Qiskit Aer mit cuQuautum -Unterstützung (AER_ENABLE_CUQUANTUM=true) zu kompilieren. Diese Änderung hat keine Auswirkungen auf die Erstellung von CPU- und normalen GPU-Binärdateien.

  • Ein Fehler in from_backend() wurde behoben, der einen Fehler auslöste, wenn das Backend keine T1 und T2 Werte (d.h. Keine) für ein Qubit in seinen Qubit-Eigenschaften hat. Diese Übergabe aktualisiert NoiseModel.from_backend() und basic_device_gate_errors() , so dass sie eine Identität QuantumError (d.h. effektiv kein thermischer Relaxationsfehler) zu einem Qubit ohne T1 und T2 Werte für alle Gatter, die auf Qubits einschließlich des Qubits wirken, hinzufügen. #1779 und #1815 behoben.

  • Behebung eines Problems: Auch wenn die Anzahl der Qubits durch eine Kopplungskarte oder die Gerätekonfiguration festgelegt ist, wird die Anzahl der Qubits bei der Konfiguration der Simulationsmethode entsprechend der Methode überschrieben. Behoben #1769

  • Dies ist ein Fix für die Einstellung des Bibliothekspfades in CMakeLists.txt für cuQuantum SDK. Da die neueste Version von cuQuantum Bibliotheken für CUDA 11.x und 12.x enthält, verwendet dieser Fix die von FindCUDA zurückgegebene CUDA-Version für den Pfad der Bibliotheken von cuQuantum und cuTENSOR.

  • Dies ist ein Fix für statische Link-Bibliotheken von cuQuantum, wenn mit CUQUANTUM_STATIC=true gebaut wird.

  • Die MPI-Parallelisierung wurde nicht aktiviert, da wir qobj nicht verwendet haben. Diese Korrektur setzt die Anzahl der Prozesse und den MPI-Rang korrekt.

  • AerCircuit wird aus einer Schaltung durch Iteration ihrer Operationen unter Überspringen von Sperrbefehlen erstellt. Das Überspringen von Sperranweisungen führt jedoch zu einer falschen Positionierung von Parameterbindungen. Diese Korrektur fügt barrier() hinzu und sorgt für korrekte Parameterbindungen.

  • Aer unterstützt immer noch Qobj als Argument von run() , obwohl es veraltet ist. Seit 0.12.0 schlägt es jedoch immer fehl, wenn keine run_options angegeben ist. Diese Korrektur ermöglicht die Simulation von Qobj ohne run_options.

  • Seit 0.12.0 wird AerConfig für die Simulationskonfiguration verwendet, während für die Argumente von meth:~.AerSimulator.run eine strenge Typüberprüfung durchgeführt wird. Diese Änderung fügt Casting hinzu, wenn Argumenttypen nicht erwartet werden.

  • :meth:QuantumCircuit.initialize() mit int-Wert wurde nicht korrekt verarbeitet, wie in #1821 <https://github.com/Qiskit/qiskit-aer/issues/1821> berichtet. Dieser Commit ermöglicht eine solche Initialisierung durch die Zerlegung von initialize-Anweisungen.

  • QuantumCircuit unterstützt die Parametrisierung seiner globalen_phase. Aer lässt eine solche Parametrisierung jedoch nicht zu und versagt, wenn der Transpiler parametrisierte globale Phasen erzeugt. Dieser Commit unterstützt die Parametrisierung von global_phase und behebt Probleme im Zusammenhang mit https://github.com/Qiskit/qiskit-aer/issues/1795, https://github.com/Qiskit/qiskit-aer/issues/1781, und https://github.com/Qiskit/qiskit-aer/issues/1798.

  • Aer wird nun omp_set_max_active_levels() anstelle des veralteten omp_set_nested() verwenden, wenn es gegen aktuelle Versionen von OpenMP kompiliert wird.

IBM Q Anbieter 0.20.2

Keine Änderung.


0.43.1

Terra- 0.24.1

Vorspiel

Qiskit Terra 0.24.1 ist die erste Patch-Veröffentlichung auf 0.24.0. Damit werden einige Fehler behoben, die seit der Veröffentlichung von 0.24.0 entdeckt wurden.

Anmerkungen zu Upgrades

  • Geändert QuantumCircuit.assign_parameters() um zugewiesene Integer- und Float-Werte direkt in die Parameter von Instruction instanzen in der Schaltung zu binden, anstatt die Werte innerhalb einer ParameterExpression. Diese Änderung sollte nur geringe Auswirkungen auf die Benutzer haben, da float(QuantumCircuit.data[i].operation.params[j]) immer noch eine float erzeugt (und die einzige Möglichkeit ist, auf den Wert einer ParameterExpression). Außerdem, Instruction() parameter können bereits float sein, ebenso wie ein ParameterExpressionsein, so dass Code, der sich mit Befehlsparametern befasst, bereits beide Fälle behandeln sollte. Die größte Wahrscheinlichkeit für Auswirkungen auf den Benutzer besteht in Code, der isinstance verwendet, um zu prüfen, ob ParameterExpression verwendet und sich je nach Ergebnis unterschiedlich verhält. Zusätzlich serialisiert qpy den numerischen Wert in einem bound ParameterExpression mit einer anderen Genauigkeit als float (siehe auch den zugehörigen Fehlerbehebungshinweis zu QuantumCircuit.assign_parameters()).

Fehlerkorrekturen

  • Aktualisiert plot_gate_map(), plot_error_map(), und plot_circuit_layout() um 433 Qubit Heavy-Hex-Kopplungskarten zu unterstützen. Dies ermöglicht die Kopplung von Kartenvisualisierungen für das Backend von IBM Quantum 's ibm_seattle .

  • Die Bindung von numerischen Werten wurde mit QuantumCircuit.assign_parameters() um eine Fehlanpassung zwischen den Werten der Schaltkreisanweisungsparameter und den entsprechenden Parameterschlüsseln im Kalibrierungswörterbuch des Schaltkreises zu vermeiden. #9764 und #10166 behoben. Siehe auch den entsprechenden Upgrade-Hinweis zu QuantumCircuit.assign_parameters().

  • Ein Fehler in BlockCollapser wurde behoben, bei dem klassische Bits ignoriert wurden, wenn ein Block von Knoten kollabiert wurde.

  • Ein Fehler wurde behoben in replace_block_with_op() und replace_block_with_op() der dazu führte, dass klassische Bits ignoriert wurden.

  • Es wurde ein Fehler in QuantumCircuit.compose() behoben, bei dem das Attribut SwitchCaseOp.target in der Unterschaltung nicht korrekt auf ein Register in der Basisschaltung abgebildet wurde.

  • Behebung eines Fehlers in RZXCalibrationBuilder bei dem der Aufruf von calibration mit falschen Parametern zum Absturz führte, anstatt eine Exception auszulösen.

  • Es wurde ein Problem mit der BooleanExpression.from_dimacs_file() konstruktormethode, bei der der Ausnahmetyp, der ausgelöst wurde, wenn tweedledum nicht installiert war, nicht dem erwarteten MissingOptionalLibrary entsprach. Behoben #10079

  • Die Verwendung von initial_layout in Aufrufen von transpile() wird kein Fehler mehr auftreten, wenn die Schaltung Qubits enthält, die in keinem Register enthalten sind, oder Qubits, die in mehr als einem Register vorhanden sind. Siehe #10125.

  • Die Gatterzerlegung von mehrfach gesteuerten Z-Rotationsgattern wurde korrigiert, die über QuantumCircuit.mcrz(). Bisher wurde bei dieser Methode ein mehrfach gesteuertes Phasentor eingesetzt, das eine relative Phasendifferenz zur Z-Drehung aufweist. Um das vorherige QuantumCircuit.mcrz() verhalten zu erhalten, verwenden Sie QuantumCircuit.mcp().

  • Es wurde ein Problem mit dem PassManagerConfig.from_backend() konstruktor beim Erstellen eines PassManagerConfig objekts aus einer BackendV1 instanz erstellt wurde, für die kein Kopplungskartenattribut definiert war. Zuvor erzeugte der Konstruktor fälschlicherweise ein CouplingMap objekt mit 0 Qubits, anstatt None zu verwenden. Behoben #10171

  • Behebt einen Fehler in Qiskit 0.24.0, bei dem numerische Drehwinkel vor der Vorbereitung der Zwei-Qubit-Synthese nicht mehr durch symbolische ersetzt wurden. Dies führte zu einer Ausnahme, da die Syntheseroutinen numerische Matrizen benötigen.

  • Behebung eines Fehlers, bei dem die parallele Ausführung von Optimize1qGatesDecomposition parallel ausgeführt wurde, einen Fehler auslöste, weil OneQubitGateErrorMap nicht gepickt werden konnte.

  • Behebung eines Fehlers in den VF2Layout und VF2PostLayout durchgängen, bei denen die Durchgänge die 1-Qubit-Fehlerkomponente bei der Auswertung eines potenziellen Layouts nicht berücksichtigten.

Aer- 0.12.0

Keine Änderung

IBM Q Anbieter 0.20.2

Keine Änderung


0.43.0

Terra- 0.24.0

Vorspiel

Dies ist eine wichtige Funktionsversion, die zahlreiche neue Funktionen und Fehlerbehebungen enthält.

Diese Version ist die letzte Version mit Unterstützung für die Ausführung von Qiskit mit Python 3.7. Ab der nächsten Minor-Version wird Python >= 3.8 benötigt, um Qiskit auszuführen.

Die Highlights dieser Veröffentlichung:

QuantumInstance, OpFlow, und die Veraltung der Verwendung von Algorithmen

Mit dieser Version wird offiziell die Klasse QuantumInstance klasse (und die zugehörigen Hilfsmethoden und -klassen), das qiskit.opflow modul, und jede Verwendung dieser in qiskit.algorithms. Diese Verwerfung ist das Ergebnis einer langen Arbeit, die in Qiskit Terra 0.21.0 begann, um das qiskit.algorithms modul zu überarbeiten, damit es auf dem rechnergestützten primitives. Für alle bestehenden Benutzer gibt es entsprechende Migrationsleitfäden für die Umstellung auf den neuen Arbeitsablauf:

OpenQASM2 Verbesserungen

Diese Version enthält eine umfassende Überarbeitung der OpenQASM 2.0 Unterstützung in Qiskit. Die erste Änderung ist die Einführung eines neuen Parsers für OpenQASM 2.0 im qiskit.qasm2 modul. Dieses neue Modul ersetzt das bestehende qiskit.qasm modul. Der neue Parser ist expliziter und korrekter in Bezug auf die Sprachspezifikation. Er ist ebenfalls in Rust implementiert und ist deutlich schneller als der bisherige Parser. Zusammen mit dem neuen Parser wurde der OpenQASM 2.0 Exporter einem umfangreichen Refactoring unterzogen, das die Korrektheit der Ausgabe bei Verwendung der QuantumCircuit.qasm() methode zur Erzeugung von QASM-Ausgaben aus einem QuantumCircuit objekt.

Transpiler-Unterstützung für Geräte mit getrennter Konnektivität

Der Transpiler unterstützt nun Backends mit disjunkter Konnektivität. Bisher unterstützte der Transpiler nur Backends, die vollständig verbunden waren (d.h. es gab einen Pfad, um Operationen zwischen allen Qubit-Paaren im Backend durchzuführen). Wenn ein Backend keine Konnektivität hat, kann der Transpiler nun schlussfolgern, wie Layout (Layout Stage ) und Routing (Routing Stage ) für das Backend anzuwenden sind. Wenn die Eingabeschaltung nicht auf der Hardware ausgeführt werden kann, weil die Konnektivität zwischen den angeschlossenen Komponenten nicht gegeben ist, wird ein beschreibender Fehler zurückgegeben.

Das Heron-Gerät, das in der Hardware-Roadmap von IBM Quantum vorgestellt wird, beschreibt beispielsweise ein künftiges Backend mit gemeinsamer Steuerungshardware und klassischer Echtzeitkommunikation zwischen einzelnen Quantenprozessoren. Diese Unterstützung ermöglicht es dem Target die genaue Modellierung dieser Arten von zukünftigen Geräten oder anderer Hardware mit ähnlichen Einschränkungen.

Schalterbetrieb

Diese Version fügt eine neue Kontrollflussoperation hinzu, die switch-Anweisung. Dies wird durch eine neue Operationsklasse implementiert SwitchCaseOp und der QuantumCircuit.switch() methode. Dies ermöglicht das Einschalten eines numerischen Eingangs (z. B. eines klassischen Registers oder Bits) und die Ausführung der Schaltung, die dem entsprechenden Wert entspricht.

Neue Funktionen

  • Hinzufügen der Funktionen add_deprecation_to_docstring(), deprecate_arg(), und deprecate_func() zu dem qiskit.utils modul hinzugefügt.

    add_deprecation_to_docstring() wird den Docstring der Funktion umschreiben, um eine Sphinx .. deprecated:: Direktive einzuschließen, so dass die Verwerfung in den Docs und auf help() angezeigt wird. Die Verwerfungsdekoratoren von qiskit.utils rufen add_deprecation_to_docstring() bereits für Sie; aber Sie können sie direkt aufrufen, wenn Sie andere Mechanismen für Verwerfungen verwenden.

    @deprecate_func ersetzt @deprecate_function und wird verwendet, um eine ganze Funktion zu verwerfen. Es wird den größten Teil der Verwerfungsmeldung automatisch für Sie generieren.

    @deprecate_arg ersetzt @deprecate_arguments und wird verwendet, um ein Argument in einer Funktion zu verwerfen. Sie wird eine nützlichere Meldung als die vorherige Funktion erzeugen. Es ist auch flexibler, z. B. ist es möglich, predicate so einzustellen, dass nur bestimmte Situationen veraltet sind, wie z. B. die Verwendung eines veralteten Wertes oder Datentyps.

Transpiler-Funktionen
  • Es wurde ein alternativer Weg hinzugefügt, um in HLSConfig die Liste der Synthesemethoden anzugeben, die für ein bestimmtes High-Level-Objekt verwendet werden. Wie bisher kann eine Synthesemethode als Tupel angegeben werden, das aus dem Namen der Methode und zusätzlichen Argumenten besteht. Außerdem kann eine Synthesemethode als Tupel angegeben werden, das aus einer Instanz von HighLevelSynthesisPlugin und zusätzlichen Argumenten besteht. Wenn es keine zusätzlichen Argumente gibt, kann eine Synthesemethode außerdem einfach durch ihren Namen oder durch eine Instanz von HighLevelSynthesisPlugin. Das folgende Beispiel veranschaulicht die neue Funktionalität:

    from qiskit import QuantumCircuit
    from qiskit.circuit.library.generalized_gates import PermutationGate
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import ACGSynthesisPermutation
    
    qc = QuantumCircuit(6)
    qc.append(PermutationGate([1, 2, 3, 0]), [1, 2, 3, 4])
    
    # All of the ways to specify hls_config are equivalent
    hls_config = HLSConfig(permutation=[("acg", {})])
    hls_config = HLSConfig(permutation=["acg"])
    hls_config = HLSConfig(permutation=[(ACGSynthesisPermutation(), {})])
    hls_config = HLSConfig(permutation=[ACGSynthesisPermutation()])
    
    # The hls_config can then be passed as an argument to HighLevelSynthesis
    pm = PassManager(HighLevelSynthesis(hls_config=hls_config))
    qc_synthesized = pm.run(qc)
  • Unterstützung für das CouplingMap objekts, eine disjunkte Konnektivität zu haben. Zuvor konnte ein CouplingMap nur konstruiert werden, wenn der Graph zusammenhängend war. Dies ermöglicht die Verwendung von CouplingMap um Hardware mit disjunkten Qubits darzustellen, z. B. Hardware mit Qubits auf mehreren separaten Chips.

  • Eine neue Methode hinzugefügt CouplingMap.connected_components() hinzugefügt, die verwendet wird, um eine Liste von CouplingMap komponenten-Untergraphen für eine disjunkte CouplingMap. Wenn das CouplingMap objekt verbunden ist, gibt dies nur ein einzelnes CouplingMap zurück, das dem Original entspricht.

  • Neue Regeln zur eingebauten EquivalenceLibrary instanz: qiskit.circuit.equivalence_library.SessionEquivalenceLibrary. Die neu hinzugefügten Regeln sind:

  • High-Level-Synthese-Plugins hinzugefügt für LinearFunction und für qiskit.quantum_info.Cliffordhinzugefügt, die die Menge der Synthesemethoden erweitern, die von HighLevelSynthesis transpiler-Pass aufgerufen werden können.

    Für LinearFunction sind die verfügbaren Plugins unten aufgeführt:

    Plug-in-Name
    High-Level-Synthese-Plugin
    defaultDefaultSynthesisLinearFunction
    kmsKMSSynthesisLinearFunction
    pmhPMHSynthesisLinearFunction

    Für qiskit.quantum_info.Clifford sind die verfügbaren Plugins unten aufgeführt:

    Plug-in-Name
    High-Level-Synthese-Plugin
    defaultDefaultSynthesisClifford
    agAGSynthesisClifford
    bmBMSynthesisClifford
    greedyGreedySynthesisClifford
    layersLayerSynthesisClifford
    lnnLayerLnnSynthesisClifford

    Bitte lesen Sie die qiskit.synthesis dokumentation für weitere Informationen zu den einzelnen Methoden.

    Das folgende Beispiel veranschaulicht einige der neuen Plugins:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import LinearFunction
    from qiskit.quantum_info import Clifford
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis
    
    # Create a quantum circuit with one linear function and one clifford
    qc1 = QuantumCircuit(3)
    qc1.cx(0, 1)
    qc1.swap(0, 2)
    lin_fun = LinearFunction(qc1)
    
    qc2 = QuantumCircuit(3)
    qc2.h(0)
    qc2.cx(0, 2)
    cliff = Clifford(qc2)
    
    qc = QuantumCircuit(4)
    qc.append(lin_fun, [0, 1, 2])
    qc.append(cliff, [1, 2, 3])
    
    # Choose synthesis methods that adhere to linear-nearest-neighbour connectivity
    hls_config = HLSConfig(linear_function=["kms"], clifford=["lnn"])
    
    # Synthesize
    qct = HighLevelSynthesis(hls_config)(qc)
    print(qct.decompose())
  • Ein neuer Transpiler-Pass wurde hinzugefügt, MinimumPoint hinzugefügt, der in erster Linie zur Überprüfung einer Schleifenbedingung in einer PassManager. Dieser Durchlauf verfolgt den Zustand der Felder in der Eigenschaftsmenge über die vergangenen Ausführungen und setzt ein boolesches Feld, wenn entweder ein fester Punkt über der Backtracking-Tiefe erreicht wird oder der minimale gefundene Wert ausgewählt wird, wenn die Backtracking-Tiefe erreicht ist. Dies ist eine Alternative zu FixedPoint die einfach nach einem festen Wert in einem Eigenschaftsfeld zwischen aufeinanderfolgenden Ausführungen sucht.

  • Eine neue Methode wurde hinzugefügt, swap_nodes()zu der Methode DAGCircuit um das Vertauschen von teilweise verbundenen Knoten zu ermöglichen. Teilweise verbunden bedeutet hier, dass die beiden Knoten mindestens eine Kante teilen (die ein Qubit oder Clbit darstellt). Wenn die Knoten keine gemeinsamen Kanten haben, wird a DAGCircuitError erhoben.

  • Hinzufügen eines neuen Synthesealgorithmus synth_cz_depth_line_mr() eines CZ-Schaltkreises für Linear Nearest Neighbor (LNN)-Verbindungen in 2-Qubit-Tiefe von 2n+2 unter Verwendung von CX- und Phasengattern (S, Sdg oder Z). Die synthetisierte Schaltung kehrt die Reihenfolge der Qubits um. Der Synthesealgorithmus basiert auf der Arbeit von Maslov und Roetteler ( https://arxiv.org/abs/1705.09176 ).

  • Hinzufügen eines neuen Synthesealgorithmus synth_clifford_depth_lnn() einer Clifford-Schaltung für LNN-Konnektivität in 2-Qubit-Tiefe von 9n+4 (was immer noch nicht optimal ist), unter Verwendung der geschichteten Clifford-Synthese (synth_clifford_layers()), synth_cnot_depth_line_kms() um die CX-Schicht in der Tiefe 5n zu synthetisieren, und synth_cz_depth_line_mr() um jede der CZ-Schichten in der Tiefe 2n+2 zu synthetisieren. Auf diese PR wird eine weitere PR folgen, die auf der jüngsten Arbeit von Maslov und Yang ( https://arxiv.org/abs/2210.16195 ), die die CX-CZ-Schichten in der Tiefe 5n für LNN-Konnektivität synthetisiert und eine weitere Optimierung durchführt, wodurch die Tiefe einer Clifford-Schaltung auf 7n-4 für LNN-Konnektivität reduziert wird.

  • Äquivalenzen zwischen den kontrollierten Pauli-Drehungen und Übersetzungen in Zwei-Pauli-Drehungen sind jetzt in der Äquivalenzbibliothek für Qiskit-Standardgatter verfügbar. Dies ermöglicht zum Beispiel die Übersetzung eines CRZGate in ein RZZGate plus RZGate oder a CRYGate in ein einzelnes RZXGate plus Einzel-Qubit-Gatter:

    from qiskit.circuit import QuantumCircuit
    from qiskit.compiler import transpile
    
    angle = 0.123
    circuit = QuantumCircuit(2)
    circuit.cry(angle, 0, 1)
    
    basis = ["id", "sx", "x", "rz", "rzx"]
    transpiled = transpile(circuit, basis_gates=basis)
    print(transpiled.draw())
  • Eine neue Option, copy_operations, wurde zu circuit_to_dag() um das optionale Deaktivieren des tiefen Kopierens der Operationen von der Eingabe QuantumCircuit zur Ausgabe QuantumCircuit. In Fällen, in denen die Eingabe :class`~.QuantumCircuit` nach der Konvertierung nicht mehr verwendet wird, ist dieses tiefe Kopieren ein unnötiger Overhead, da alle gemeinsam genutzten Referenzen keine potenziellen unerwünschten Nebeneffekte haben, wenn die Eingabe QuantumCircuit verworfen wird.

  • Eine neue Option, copy_operations, wurde zu dag_to_circuit() um das optionale Deaktivieren des tiefen Kopierens der Operationen von der Eingabe DAGCircuit zur Ausgabe QuantumCircuit. In Fällen, in denen die Eingabe DAGCircuit nach der Konvertierung nicht mehr verwendet wird, ist dieses tiefe Kopieren ein unnötiger Overhead, da alle gemeinsam genutzten Referenzen keine potenziellen unerwünschten Nebeneffekte haben, wenn die Eingabe DAGCircuit verworfen wird.

  • Hinzufügen einer neuen Funktion passmanager_stage_plugins() in das qiskit.transpiler.preset_passmanagers.plugin modul hinzugefügt. Diese Funktion wird verwendet, um eine Zuordnung von Plugin-Namen zu ihrem Klassentyp zu erhalten. Dies ermöglicht die Identifizierung und Abfrage jeder definierten Pass Manager Stage Plugin Dokumentation. Zum Beispiel:

    >>> from qiskit.transpiler.preset_passmanagers.plugin import passmanager_stage_plugins
    >>> passmanager_stage_plugins('routing')['lookahead'].__class__
    
    qiskit.transpiler.preset_passmanagers.builtin_plugins.LookaheadSwapPassManager
    
    >>> help(passmanager_stage_plugins('routing')['lookahead'])
    Help on BasicSwapPassManager in module qiskit.transpiler.preset_passmanagers.builtin_plugins object:
    
    class BasicSwapPassManager(qiskit.transpiler.preset_passmanagers.plugin.PassManagerStagePlugin)
    |  Plugin class for routing stage with :class:`~.BasicSwap`
    ...
  • Der Transpiler-Pass Error akzeptiert nun auch aufrufbare Eingaben für seinen msg Parameter. Wenn diese Eingabe-Callables verwendet werden, wird das property_set -Attribut des Durchlaufs übergeben und es wird erwartet, dass sie eine Zeichenkette zurückgeben, die für die Fehlermeldung verwendet wird, wenn der Durchlauf ausgeführt wird. Zum Beispiel:

    from qiskit.transpiler.passes import Error
    
    def error_message(property_set):
    
        size = property_set["size']
        return f"The circuit size is: {size}"
    
    error_pass = Error(error_message)

    Wenn error_pass in einem Durchlaufmanager enthalten ist, wird die Fehlermeldung "The circuit size is: n" ausgegeben, wobei n die im Eigenschaftssatz eingestellte Schaltkreisgröße ist (in der Regel von der vorherigen Ausführung des Size durchlaufs).

  • Die Methode build_coupling_map() methode hat ein neues Schlüsselwortargument, filter_idle_qubits , das, wenn es auf True gesetzt wird, alle Qubits aus der Ausgabe entfernt CouplingMap die keine Operationen unterstützen.

  • Der GateDirection transpiler-Durchlauf kann nun korrekt mit SwapGate instanzen, die in der Schaltung vorhanden sein können, wenn sie in einer Schaltung ausgeführt werden. In diesen Fällen, wenn die Qubit-Argumente des Swap-Gates auf der nicht-nativen Richtung einer Kante liegen, wird die Reihenfolge der Argumente umgedreht.

  • Die RZXCalibrationBuilder und RZXCalibrationBuilderNoEcho transpilerübergänge verwenden nun korrekt ein ECRGate für das Verschlusstor, wenn das native Verschlusstor des Backends ECRGate. Zuvor funktionierten die Pässe nur dann korrekt, wenn das Verschlusstor CXGate.

  • Hinzufügen eines neuen Konstruktors für die Target klasse, Target.from_configuration()hinzugefügt, mit dem Sie ein Target objekt aus den separaten Objekttypen für die Beschreibung der Einschränkungen eines Backends (z.B. Basisgatter, CouplingMap, BackendProperties, etc). Zum Beispiel:

    target = Target.from_configuration(
        basis_gates=["u", "cx", "measure"],
        coupling_map=CouplingMap.from_line(25),
    )

    Dies konstruiert ein Target objekt, das die Eigenschaften UGate, CXGate, und Measure global auf 25 Qubits verfügbar sind, die in einer Linie verbunden sind.

  • Es wurde eine neue Funktion synth_cnot_phase_aam() hinzugefügt, die zur Synthese von cnot-Phasenschaltungen für all-to-all-Architekturen unter Verwendung der Methode von Amy, Azimzadeh und Mosca verwendet wird. Diese Funktion ist identisch mit der verfügbaren Funktion qiskit.transpiler.synthesis.graysynth() , hat aber einen aussagekräftigeren Namen und ist logischer im Paketbaum platziert. Diese neue Funktion ersetzt die alte Funktion, die wahrscheinlich in einer zukünftigen Version veraltet sein wird.

  • Interne Optimierungen des Routing-Algorithmus in SabreSwapdie bei der Transpilierung nicht-dynamischer Schaltungen auf allen Optimierungsebenen ungleich Null verwendet werden, haben das Routing für sehr große Schaltungen beschleunigt. Zum Beispiel wird die Zeit für das Routen einer depth-5 QuantumVolume schaltung für eine 1081-Qubit-Schwer-Hex-Kopplungskarte ungefähr halbiert werden.

  • Die Laufzeitleistung des Optimize1qGatesDecomposition transpilerpasses wurde erheblich verbessert. Dazu wurden alle Berechnungen für den Durchlauf in Rust umgeschrieben und die Anzahl der Zwischenobjekte, die bei der Ausführung des Durchlaufs erstellt werden, verringert. Dies sollte auch zu einer ähnlichen Verbesserung der Laufzeitleistung von transpile() entsprechen, wenn das Schlüsselwortargument optimization_level auf 1, 2 oder 3 gesetzt ist.

  • Hinzufügen einer neuen Synthesemethode synth_stabilizer_layers() eines Stabilisierungszustandes in Schichten. Sie bietet eine ähnliche Zerlegung wie die in Lemma 8 von Bravyi und Maslov ( arxiv:2003.09412 ) beschriebene Synthese ohne den anfänglichen Hadamard-freien Teilkreis, der den Stabilisatorzustand nicht beeinflusst.

  • Hinzufügen einer neuen Synthesemethode synth_stabilizer_lnn() eines Stabilisatorzustands für lineare Nächste-Nachbarn-Konnektivität in 2-Qubit-Tiefe von 2n+2 und zwei verschiedenen CX-Schichten, unter Verwendung von CX- und Phasengattern (S, Sdg oder Z). Der Synthesealgorithmus basiert auf der Arbeit von Maslov und Roetteler ( https://arxiv.org/abs/1705.09176 ).

  • Der SabreLayout pass unterstützt nun die Ausführung gegen ein Ziel mit einer disjunkten CouplingMap. Wenn eine disjunkte Kopplung angestrebt wird, wird die Eingabe DAGCircuit in seine zusammenhängenden Komponenten virtueller Qubits aufgeteilt, jede Komponente wird auf die zusammenhängenden Komponenten der virtuellen Qubits abgebildet CouplingMapdas Layout wird für jede zusammenhängende Komponente isoliert ausgeführt, und dann werden alle Layouts kombiniert und zurückgegeben. Wenn das Argument routing_pass gesetzt ist, unterstützt der Pass nicht die Ausführung mit disjunkten Verbindungen.

  • Die folgenden Layout- und Routing-Transpilerpässe aus den qiskit.transpiler.passes modulen unterstützen nun die Annahme eines Target objekt, das verwendet wird, um die Einschränkungen eines Ziel-Backends über das erste Positionsargument zu modellieren (derzeit entweder coupling_map oder backend_properties genannt).

    Die Liste der Pässe mit der neuen Unterstützung für Target eingabe sind:

  • Die Konstruktionshilfsfunktion des Passmanagers generate_embed_passmanager() akzeptiert nun auch ein Target für ihr einziges Positionsargument (derzeit coupling_map). Dies kann verwendet werden, um eine Layout-Einbettung zu konstruieren PassManager aus einem Target objekt zu konstruieren, anstatt aus einem CouplingMap.

  • Die folgenden Layout- und Routing-Transpilerpässe aus den qiskit.transpiler.passes modulen haben ein neues Schlüsselwortargument, target , das ein Target objekt aufnimmt, das zur Modellierung der Beschränkungen eines Ziel-Backends verwendet wird. Wenn das Schlüsselwortargument target angegeben ist, wird es als Wahrheitsquelle für alle Hardwarebeschränkungen verwendet, die bei der Durchführung des Transpilerdurchlaufs verwendet werden. Es ersetzt alle anderen Argumente zur Angabe von Hardware-Einschränkungen, typischerweise diejenigen, die ein CouplingMap, InstructionScheduleMap oder eine Basis-Gate-Liste enthalten. Die Liste dieser Durchgänge mit dem neuen Argument target sind:

  • Die Hilfsfunktion für die Konstruktion des Pass-Managers generate_scheduling() hat ein neues Schlüsselwortargument target welches verwendet wird um ein Target objekts verwendet wird, um die Einschränkungen des Ziel-Backends zu modellieren, für das kompiliert wird, wenn eine neue PassManager. Wenn dieses neue Argument angegeben wird, ersetzt es das andere Argument inst_map.

  • Das default Plugin, das vom UnitarySynthesis transpiler-Pass verwendete Plugin wählt nun die Ein- und Zwei-Qubit-Unitaritätssynthese auf der Grundlage der Fehlerraten aus, die in der Target. Insbesondere werden alle möglichen Synthesemethoden, die vom Plugin unterstützt werden, durchgespielt und die Option gewählt, die den geringsten Fehler ergibt. Für eine Ein-Qubit-Zerlegung können Pauli-Basis (z. B. RZ-RX-RZ oder RZ-RY-RZ), generische unitäre Basis (z. B. U) und einige andere verwendet werden. Für eine Zwei-Qubit-Zerlegung kann eine beliebige superkontrollierte Basis (z. B. CNOT, iSWAP, B) oder eine mehrfach kontrollierte Basis (z. B. CZ, CH, ZZ^.5, ZX^.2, usw.) verwendet werden.

  • Die Schnittstelle für UnitarySynthesisPlugin hat zwei neue optionale Eigenschaften supports_gate_lengths_by_qubit und supports_gate_errors_by_qubit , die, wenn sie gesetzt sind, die Felder gate_lengths_by_qubit bzw. gate_errors_by_qubit zu den Eingabeoptionen für die Methode run() des Plugins hinzufügen. Diese neuen Felder sind eine alternative Ansicht der von gate_lengths und gate_errors gelieferten Daten, haben aber stattdessen die Form: {(qubits,): [Gate, length]} (wobei Gate die Instanz von Gate für diese Definition ist). Dies ermöglicht es Plugins, mit Gates desselben Typs zu arbeiten, die jedoch unterschiedliche Parameter haben.

  • Ein neuer Transpiler-Pass wurde hinzugefügt, UnrollForLoopsder verwendet wird, um alle ForLoopOp operationen in einer Schaltung. Dieser Durchlauf rollt, wenn möglich, for-Schleifen ab, wenn es keine ContinueLoopOp oder BreakLoopOp innerhalb des Body-Blocks der Schleife gibt. Zum Beispiel:

    from qiskit.transpiler.passes import UnrollForLoops
    from qiskit import QuantumCircuit
    
    unroll_pass = UnrollForLoops()
    
    qc = QuantumCircuit(1)
    # For loop over range 5
    with qc.for_loop(range(5)) as i:
        qc.rx(i, 0)
    # Unroll loop into 5 rx gates
    unroll_pass(qc).draw("mpl")
    _images/legacy_release_notes-1.png
  • Es wurde ein neuer Parameter max_trials zur Übergabe hinzugefügt VF2PostLayout der, wenn er angegeben wird, die Anzahl der ermittelten und verglichenen Layouts bei der Suche nach dem besten Layout begrenzt. Dieser Parameter unterscheidet sich von den bestehenden Parametern call_limit und time_limit (mit denen die Anzahl der vom Algorithmus VF2 durchgeführten Zustandsbesuche bzw. die Gesamtzeit für pass VF2PostLayoutverwendet werden), indem er dazu dient, eine Obergrenze für die Zeit festzulegen, die für die Bewertung potenzieller Layouts aufgewendet wird, was bei größeren Geräten nützlich sein kann.

  • Der CheckMap transpilerpass hat ein neues Schlüsselwortargument in seinem Konstruktor, property_set_field. Mit diesem Argument kann ein Feld im Eigenschaftssatz angegeben werden, in dem die Ergebnisse der Analyse gespeichert werden. Zuvor war es nur möglich, das Ergebnis im Feld "is_swap_mapped" zu speichern (was die Standardeinstellung ist). So können Sie das Ergebnis mehrerer Instanzen des Durchlaufs in einem PassManager in verschiedenen Feldern zu speichern.

Schaltkreise Funktionen
  • Eine neue Gate-Klasse wurde hinzugefügt, GlobalPhaseGatehinzugefügt, die verwendet werden kann, um eine globale Phase auf der QuantumCircuit instanz.

  • Ein neues Attribut wurde hinzugefügt, layoutzu der QuantumCircuit klasse. Dieses Attribut wird in der Regel ausgefüllt durch transpile() oder PassManager.run() (wenn die Layoutstufe und die Routingstufe in der PassManager) und enthält ein TranspileLayout das die Information über die Permutation der Eingangsschaltung während transpile().

  • Dem Konstruktor der Klasse wurde ein neues Argument, var_order, hinzugefügt PhaseOracle konstruktor der Klasse hinzugefügt, um die Reihenfolge festzulegen, in der die Variablen im logischen Ausdruck berücksichtigt werden. Zum Beispiel:

    from qiskit.tools.visualization import plot_histogram
    from qiskit.primitives import Sampler
    from qiskit.circuit.library import PhaseOracle
    from qiskit.algorithms import Grover, AmplificationProblem
    
    oracle = PhaseOracle('((A & C) | (B & D)) & ~(C & D)', var_order=['A', 'B', 'C', 'D'])
    problem = AmplificationProblem(oracle=oracle, is_good_state=oracle.evaluate_bitstring)
    grover = Grover(sampler=Sampler())
    result = grover.amplify(problem)
    print(result.circuit_results[0])
  • Ein neuer OpenQASM 2 Parser ist verfügbar in qiskit.qasm2. Dieser hat zwei Einstiegspunkte: qasm2.load() und qasm2.loads()zum Lesen des Quellcodes aus einer Datei bzw. aus einer Zeichenkette:

    import qiskit.qasm2
    program = """
      OPENQASM 2.0;
      include "qelib1.inc";
      qreg q[2];
      h q[0];
      cx q[0], q[1];
    """
    bell = qiskit.qasm2.loads(program)

    Dieser neue Parser ist etwa 10x schneller als die bestehenden Parser bei QuantumCircuit.from_qasm_file() und QuantumCircuit.from_qasm_str() für große Dateien und hat auch weniger Overhead bei jedem Aufruf. Der neue Parser ist besser erweiterbar, anpassbar und im Allgemeinen auch typsicherer; er versucht nicht, benutzerdefinierte Qiskit-Objekte auszugeben, wenn die Definition in der Datei OpenQASM 2 mit dem Qiskit-Objekt kollidiert, im Gegensatz zum aktuellen Exporter. Siehe die qiskit.qasm2 dokumentation des Moduls finden Sie alle Einzelheiten und weitere Beispiele.

  • Verbesserung der Zerlegung von mehrfach gesteuerten Pauli-X- und Pauli-Y-Drehungen mit QuantumCircuit.mcrx() und QuantumCircuit.mcry on :math:`n() zu 16n−4016n - 40 CX-Gattern, für n≥4n \geq 4. Diese Verbesserung basiert auf arXiv:2302.06377.

  • Qiskit unterstützt nun die Darstellung von switch Anweisungen, indem es die neue SwitchCaseOp anweisung und der QuantumCircuit.switch() methode. Dies ermöglicht das Einschalten eines numerischen Eingangs (z. B. eines klassischen Registers oder Bits) und die Ausführung der Schaltung, die dem entsprechenden Wert entspricht. Mehrere Werte können auf denselben Stromkreis verweisen, und CASE_DEFAULT kann als immer übereinstimmende Bezeichnung verwendet werden.

    Sie können auch eine Builder-Schnittstelle verwenden, ähnlich wie bei den anderen Kontrollflusskonstrukten, um diese Switch-Anweisungen aufzubauen:

    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(2)
    creg = ClassicalRegister(2)
    qc = QuantumCircuit(qreg, creg)
    
    qc.h([0, 1])
    qc.measure([0, 1], [0, 1])
    with qc.switch(creg) as case:
      with case(0):  # if the register is '00'
        qc.z(0)
      with case(1, 2):  # if the register is '01' or '10'
        qc.cx(0, 1)
      with case(case.DEFAULT):  # the default case
        qc.h(0)

    Die Anweisung switch wird vom gesamten Qiskit-Compiler-Stack unterstützt; Sie können transpile() schaltungen, die sie enthalten (wenn das Backend seine Unterstützung für das Konstrukt ankündigt), und sie wird nach QPY serialisiert.

    Der switch Die Anweisung ist derzeit kein Feature von OpenQASM 3, wird aber aktiv entwickelt und in Erwägung gezogen und soll in naher Zukunft übernommen werden. Qiskit Terra bietet experimentelle Unterstützung für den Export dieser Anweisung in die OpenQASM 3-Syntax, die im verlinkten Pull-Request vorgeschlagen wird, unter Verwendung eines experimentellen Feature-Flags. Um eine switch Anweisungsschaltung (wie die oben erstellte) mit dieser spekulativen Unterstützung nach OpenQASM 3 zu exportieren, gehen Sie wie folgt vor

    from qiskit import qasm3
    
    qasm3.dumps(qc, experimental=qasm3.ExperimentalFeatures.SWITCH_CASE_V1)
Algorithmen Funktionen
  • Ein neues Attribut hinzugefügt eigenvalue_threshold für die AdaptVQE klasse hinzugefügt, mit dem eine neue Art von Schwellenwert konfiguriert werden kann, um den Algorithmus zu beenden, sobald sich der Eigenwert weniger als ein bestimmter Wert ändert.

  • Ein neues Attribut hinzugefügt gradient_threshold für die AdaptVQE klasse hinzugefügt, das das Attribut threshold in Zukunft ersetzen wird. Dieses neue Attribut verhält sich genauso wie das bestehende Attribut threshold , hat aber aufgrund der Einführung zusätzlicher Schwellenwertoptionen in der Klasse einen genaueren Namen.

  • Hinzufügen des EstimationProblem.has_good_state attribut hinzugefügt, mit dem überprüft werden kann, ob ein EstimationProblem einen eigenen EstimationProblem.is_good_state hat oder ob es der Standard ist. Dies ist nützlich für Überprüfungen in Amplitudenschätzern, wie z. B AmplitudeEstimation, die nur die Standardimplementierung unterstützen.

  • Fügt ein Flag local zur ComputeUncompute state Fidelity Klasse, die es erlaubt, die lokale Fidelität zu berechnen, die durch Mittelung über Einzel-Qubit-Projektoren definiert ist.

  • Gradientenklassen ordnen das Gradientenergebnis nun entsprechend der Reihenfolge der Eingabeparameter neu an.

    Beispiel:

    from qiskit.algorithms.gradients import ParamShiftEstimatorGradient
    from qiskit.circuit import QuantumCircuit, Parameter
    from qiskit.primitives import Estimator
    from qiskit.quantum_info import SparsePauliOp
    
    # Create a circuit with a parameter
    p = {i: Parameter(f'p{i}') for i in range(3)}
    qc = QuantumCircuit(1)
    qc.rx(p[0], 0)
    qc.ry(p[1], 0)
    qc.rz(p[2], 0)
    op = SparsePauliOp.from_list([("Z", 1)])
    param_values = [0.1, 0.2, 0.3]
    
    # Create a gradient object
    estimator = Estimator()
    grad = ParamShiftEstimatorGradient(estimator)
    result = grad.run(qc, op, [param_values]).result()
    # would produce a gradient of the form [df/dp0, df/dp1, df/dp2]
    result = grad.run(qc, op, [param_values], parameters=[[p[2], p[0]]]).result()
    # would produce a gradient of the form [df/dp2, df/dp0]
  • Unterstützung für den Umgang mit zeitabhängigen Hamiltonianern (d.h. einfach parametrisierten Operatoren) wurde der TrotterQRTE klasse. Um die Arbeit damit zu erleichtern, wurde das num_timesteps attribut und ein passendes Schlüsselwortargument in den TrotterQRTE konstruktor hinzugefügt, um die Anzahl der Zeitschritte zu bestimmen, die die vollständige Entwicklung unterteilen.

  • Unterstützung für beobachtbare Auswertungen in jedem Zeitschritt während der Ausführung der TrotterQRTE klasse. Die TimeEvolutionProblem.aux_operators wird bei jedem Zeitschritt ausgewertet, wenn das Attribut ProductFormula.reps des Eingangsarguments product_formula im Konstruktor auf 1 gesetzt ist.

  • Es wurden Erweiterungen zum VQD algorithmus, die es erlauben, eine Liste von Optimierern und Anfangspunkten für die verschiedenen Minimierungsläufe zu übergeben. So werden beispielsweise der k-te Ausgangspunkt und der k-te Optimierer für die Optimierung des k-1-ten erwarteten Zustands verwendet.

Quanteninformationsmerkmale
  • Zwei neue Konstruktormethoden hinzugefügt, Clifford.from_matrix() und Clifford.from_operator(), die ein Clifford objekt aus seiner unitären Matrix- bzw. Operatordarstellung erzeugen.

  • Der Konstruktor von Clifford kann nun jedes Clifford-Gatter-Objekt mit bis zu 3 Qubits aufnehmen, solange es eine to_matrix -Methode implementiert, einschließlich parametrisierter Gatter wie Rz(pi/2), die vorher nicht konvertierbar waren.

  • Neue Hilfsfunktionen hinzugefügt: commutator(), anti_commutator(), und double_commutator() die verwendet werden, um Kommutatoren für jedes Objekt zu berechnen, das die abstrakte Basisklasse LinearOp implementiert, z. B. QuantumChannel, SparsePauliOp, oder ScalarOp.

  • Es wurde die Methode StabilizerState.equiv hinzugefügt, die prüft, ob die Erzeugungsmengen zweier Stabilisatorzustände dieselbe Stabilisatorgruppe erzeugen. Zum Beispiel enthält die Stabilisatorgruppe des Zwei-Qubit-Bell-Zustands die vier Elemente {II,XX,−YY,ZZ}\{II, XX, -YY, ZZ\} und kann daher entweder durch [XX,ZZ][XX, ZZ], [XX,−YY][XX, -YY] oder [−YY,ZZ][-YY, ZZ] erzeugt werden.

  • Eine neue Methode wurde hinzugefügt, partial_transpose()zur qiskit.quantum_info modul der DensityMatrix klasse. Diese Methode wird zur Berechnung der partiellen Transposition einer Dichtematrix verwendet, die für den Nachweis der Verschränkung zwischen zweiseitigen Quantensystemen erforderlich ist.

  • Hinzufügen einer Methode qiskit.quantum_info.Operator.apply_permutation() hinzugefügt, die einen Operator mit einer Permutation vorkomponiert oder nachkomponiert. Diese Methode funktioniert für allgemeine Quanten.

    Hier ist ein Beispiel zur Berechnung von P†.O.PP^\dagger.O.P, das die Bits von Operator neu ordnet:

    import numpy as np
    from qiskit.quantum_info.operators import Operator
    
    op = Operator(np.array(range(576)).reshape((24, 24)), input_dims=(2, 3, 4), output_dims=(2, 3, 4))
    perm = [1, 2, 0]
    inv_perm = [2, 0, 1]
    conjugate_op = op.apply_permutation(inv_perm, front=True).apply_permutation(perm, front=False)

    Der konjugierte Operator hat die Dimensionen (4, 2, 3) x (4, 2, 3), was mit der Permutation übereinstimmt, die das Qutrit an die Position 0, das Qubit an die Position 1 und das 4-Qudit an die Position 2 bringt.

  • Unterstützt nativ die Konstruktion von SparsePauliOp objekten mit ParameterExpression koeffizienten, ohne dass die explizite Konstruktion eines Objektarrays erforderlich ist. Jetzt wird Folgendes unterstützt:

    from qiskit.circuit import Parameter
    from qiskit.quantum_info import SparsePauliOp
    
    x = Parameter("x")
    op = SparsePauliOp(["Z", "X"], coeffs=[1, x])
  • Hinzufügen der SparsePauliOp.assign_parameters() methode und SparsePauliOp.parameters attribut zum Zuweisen und Abfragen von ungebundenen Parametern innerhalb einer SparsePauliOp. Diese Funktion kann z.B. verwendet werden als:

    from qiskit.circuit import Parameter
    from qiskit.quantum_info import SparsePauliOp
    
    x = Parameter("x")
    op = SparsePauliOp(["Z", "X"], coeffs=[1, x])
    
    # free_params will be: ParameterView([x])
    free_params = op.parameters
    
    # assign the value 2 to the parameter x
    bound = op.assign_parameters([2])
Puls-Funktionen
  • Hinzufügen neuer SymbolicPulse klassen zur Impulsbibliothek (qiskit.pulse.library) Die neuen Pulse in der Bibliothek sind:

    Diese neuen Klassen sind Instanzen von ScalableSymbolicPulse. Mit Ausnahme der Phase Sawtooth ist das Verhalten identisch mit dem der entsprechenden Wellenformgeneratorfunktion (z. B. sin()). Die Phase für die Klasse Sawtooth ist so definiert, dass sich eine Phase von 2π2\pi um einen vollen Zyklus verschiebt.

  • Unterstützung für QPY (qiskit.qpy) für die Arbeit mit pulse ScheduleBlock instanzen mit nicht zugewiesenen Referenzen und der Beibehaltung der Datenstruktur für die Referenz auf Unterprogramme. Diese Funktion ermöglicht es dem Benutzer, ein Musterimpulsprogramm für Aufgaben wie die Impulskalibrierung zu serialisieren und zu deserialisieren. Zum Beispiel:

    from qiskit import pulse
    from qiskit import qpy
    
    with pulse.build() as schedule:
        pulse.reference("cr45p", "q0", "q1")
        pulse.reference("x", "q0")
        pulse.reference("cr45p", "q0", "q1")
    
    with open('template_ecr.qpy', 'wb') as fd:
        qpy.dump(schedule, fd)
  • Eine neue Methode CalibrationEntry.user_provided() wurde zu den Kalibrierungseinträgen hinzugefügt. Diese Methode kann aufgerufen werden, um zu prüfen, ob der Eintrag von einem Endbenutzer oder einem Backend definiert wurde.

  • Hinzufügen einer neuen Methode Target.get_calibration() hinzugefügt, die einen bequemen Zugriff auf die Kalibrierung einer Anweisung in einem Target objekts ermöglicht. Diese Methode kann mit den Parametern args und kwargs aufgerufen werden und gibt einen mit Parametern erstellten Impulsplan zurück, wenn die Kalibrierung mit Parametern schabloniert ist.

Anbieter Funktionen
  • Die Klasse BackendV2Converter klasse hat ein neues Schlüsselwortargument, filter_faulty, in ihrem Konstruktor. Wenn dieses Argument auf True gesetzt wird, filtert die Konverterklasse alle Qubits oder Operationen heraus, die als nicht-operativ in der BackendProperties nutzlast für die Eingabe BackendV1. Obwohl es nicht sehr häufig verwendet wird, unterstützt ein BackendProperties objekt unterstützt die Anmerkung, dass sowohl Qubits als auch Gatter nicht-operativ sind. Wenn ein Backend dieses Flag für ein Qubit oder ein Gatter gesetzt hatte, enthielt die Ausgabeinstanz BackendV2 und ihre Target alle Operationen enthalten, unabhängig davon, ob sie als funktionsfähig aufgelistet waren oder nicht. Durch den Einsatz des neuen Flags können Sie diese nicht-operativen Qubits und Gates aus der Target. Wenn das Flag gesetzt ist, wird das Ausgabe-Backend immer noch mit der vollen Breite aufgeführt (z. B. ein 24-Qubit-Backend mit 4 als nicht betriebsbereit aufgeführten Qubits hat immer noch 24 Qubits), aber die fehlerhaften Qubits haben keine Operationen, die in der Target.

  • Die Klasse Options klasse implementiert nun das Mapping Protokoll und die __setitem__ Methode. Das bedeutet, dass Options instanzen jetzt die gleiche Schnittstelle wie Standardwörterbücher bieten, mit Ausnahme der Löschmethoden (__delitem__, pop, clear). Die Schlüsselzuweisungen werden von den Prüfern validiert, sofern sie registriert sind.

Visualisierungsfunktionen
  • Es wurde eine neue Funktion staged_pass_manager_drawer() hinzugefügt, die zur Visualisierung einer StagedPassManager instanz. Er zeichnet den kompletten Passmanager mit jeder Stufe als äußeres Kästchen.

    Zum Beispiel:

    from qiskit.visualization import staged_pass_manager_drawer
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.providers.fake_provider import FakeSherbrooke
    
    backend = FakeSherbrooke()
    pm = generate_preset_pass_manager(3, backend)
    staged_pass_manager_drawer(pm)
  • Die StagedPassManager.draw() methode wurde aktualisiert, so dass sie nun neben dem Gesamtpassmanager auch eine Visualisierung der Stufen enthält. Die Stufen werden in der Visualisierung durch äußere Kästen dargestellt. In früheren Versionen waren die Stufen nicht in der Visualisierung enthalten. Zum Beispiel:

    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.providers.fake_provider import FakeSherbrooke
    
    backend = FakeSherbrooke()
    pm = generate_preset_pass_manager(3, backend)
    pm.draw(pm)
  • Ein neues Schlüsselwortargument, figsize, wurde der plot_bloch_multivector() funktion. Dieses Argument kann verwendet werden, um eine Größe für einzelne Bloch-Sphären-Teilplots festzulegen. Wenn es zum Beispiel nn Qubits gibt und figsize auf (w, h) gesetzt wird, dann wird die Gesamtbreite der Figur auf n⋅wn \cdot w gesetzt, während die Gesamthöhe auf hh gesetzt wird.

  • Ein neues Schlüsselwortargument, font_size, wurde der plot_bloch_multivector() funktion. Dieses Argument kann verwendet werden, um die Schriftgröße in der Ausgabevisualisierung zu steuern.

  • Zwei neue Schlüsselwortargumente, title_font_size und title_pad, wurden der plot_bloch_multivector() funktion. Diese Argumente können verwendet werden, um die Schriftgröße des Gesamttitels bzw. seine Auffüllung zu steuern.

Anmerkungen zu Upgrades

  • Die minimal unterstützte Rust-Version (MSRV) wurde von 1.56.1 auf 1.61.0 erhöht. Wenn Sie Qiskit aus dem Quellcode bauen, müssen Sie jetzt sicherstellen, dass Sie mindestens Rust 1.61.0 installiert haben, um Qiskit bauen zu können. Diese Änderung wurde vorgenommen, weil mehrere Upstream-Abhängigkeiten ihre MSRVs erhöht haben.

  • Die Verwendung von Primitiven mit dem Kontextmanager und die Initialisierung mit Schaltkreisen (Observables nur für Estimator) und Parametern, die in der Version Qiskit Terra 0.22.0 im Oktober 2022 veraltet war, wurde entfernt.

  • PrimitiveJob.submit() blockiert nicht mehr bei Beendigung der Ausführung. Daraus ergibt sich, Sampler.run(), BackendSampler.run(), Estimator.run() und BaseEstimator.run() nicht blockieren, bis die Methode PrimitiveJob.result() aufgerufen wird.

Hinweise zum Transpiler-Upgrade
  • Die maximale Anzahl von Versuchen, die bei der Suche nach dem besten Layout mit VF2Layout und VF2PostLayout ist nun begrenzt auf level_1_pass_manager(), level_2_pass_manager(), und level_3_pass_manager() auf 2 500, 25 000 bzw. 250 000 begrenzt. Zuvor wurden alle gefundenen möglichen Layouts bewertet. Diese Änderung wurde vorgenommen, um zu verhindern, dass die Transpilierung bei der Layoutbewertung von Schaltungen mit vielen angeschlossenen Bauteilen auf größeren Bauteilen hängen bleibt, was zu einer kombinatorischen Skalierung führt, da jedes angeschlossene Bauteil in allen möglichen Positionen auf dem Bauteil bewertet wird. Um eine vollständige Suche wie zuvor durchzuführen, führen Sie manuell VF2PostLayout über die transpilierte Schaltung im strikten Modus und geben Sie 0 für max_trials an.

  • Das zuvor veraltete condition -Attribut der Klasse DAGDepNode klasse wurde entfernt. Sie wurde in der Version 0.18 (07-2021) als veraltet gekennzeichnet. Stattdessen sollten Sie das condition attribut des op Attributs verwenden, um auf die Bedingung eines Operationsknotens zuzugreifen. Für andere Knotentypen gibt es keine Bedingung für den Zugriff.

  • Der Standardwert von metadata sowohl in DAGCircuit und DAGDependency wurde aus Gründen der Kompatibilität mit dem entsprechenden Attribut metadata von None auf {} geändert QuantumCircuit.

  • Die Methode CouplingMap.__eq__`() wurde aktualisiert, um zu prüfen, ob die Kantenlisten der zugrundeliegenden Graphen die gleichen Elemente enthalten. Unter der Annahme, dass die zugrundeliegenden Graphen zusammenhängend sind, stellt diese Prüfung zusätzlich sicher, dass die Graphen die gleiche Anzahl von Knoten mit den gleichen Bezeichnungen haben. Jeder Code, der CouplingMap() == CouplingMap() zur Überprüfung der Objektgleichheit verwendet, sollte auf CouplingMap() is CouplingMap() aktualisiert werden.

  • Bei der Ausführung der transpile() funktion mit einem BackendV1 basierten Backend oder einem BackendProperties über das backend_properties -Schlüsselwortargument ausgeführt wird, das irgendwelche Qubits oder Gates als fehlerhaft gekennzeichnet hat, wird die Funktion nicht mehr versuchen, die Qubits auf der Grundlage dieser Information automatisch neu zuzuordnen. Die Methode, mit der transpile() versuchte, diese Neuzuordnung vorzunehmen, war grundlegend fehlerhaft, und in den meisten Fällen eines solchen Backends würde ein interner Fehler ausgelöst werden. In der Praxis setzen nur sehr wenige Backends jemals die Felder in BackendProperties um ein Qubit oder ein Gate als fehlerhaft zu kennzeichnen. Wenn Sie sich darauf verlassen haben, dass transpile() verlassen haben, müssen Sie dies nun manuell tun und den Argumenten coupling_map und backend_properties eine gemappte Eingabe übergeben, die die fehlerhaften Qubits und Gates herausgefiltert hat, und dann die Ausgabe manuell neu mappen.

  • Das Ergebnis von Transpilationen für fixe Samen kann sich im Vergleich zu früheren Versionen von Qiskit Terra geändert haben. Der Grund dafür sind interne Anpassungen des Routing-Algorithmus, der von SabreSwap und SabreLayoutverwendeten Routing-Algorithmus, die die Standard-Routing- bzw. Layout-Durchläufe sind, um sie für große Schaltungen deutlich schneller zu machen.

Hinweise zur Aktualisierung von Schaltkreisen
  • Die QuantumCircuit metadata attribut gibt jetzt immer ein Wörterbuch zurück und kann nur auf ein Wörterbuch gesetzt werden. Zuvor war der Standardwert None und konnte manuell auf None oder ein Wörterbuch gesetzt werden.
Hinweise zum Algorithmus-Upgrade
  • Die veralteten Module factorizers und linear_solvers, die HHL und Shor enthalten, wurden aus qiskit.algorithms. Diese Funktionen wurden ursprünglich als Teil der Version 0.22.0 (veröffentlicht am 13. Oktober 2022) veraltet. Sie können den Code stattdessen über das Qiskit-Lehrbuch aufrufen: Lineare Löser (HHL), Faktorisierer (Shor)
Hinweise zum Pulse-Upgrade
  • Target.update_from_instruction_schedule_map() löst nicht mehr KeyError oder ValueError aus, wenn im Zielbefehl Qubits fehlen oder inst_name_map nicht für den undefinierten Befehl vorgesehen ist. Im ersten Fall ignoriert es einfach die Definition der Eingabe InstructionScheduleMapdie Definition für undefinierte Qubits. Im letzteren Fall wird eine Gatterzuordnung aus den Standard-Qiskit-Gattern gezogen und schließlich wird ein benutzerdefiniertes opakes Gate objekt anhand des Zeitplannamens definiert, wenn keine Zuordnung gefunden wird.
Hinweise zum Upgrade für Anbieter
  • Das veraltete max_credits Argument für execute(), assemble() und alle Qobj -Konfigurationen (z. B. QasmQobjConfig und PulseQobjConfig) wurde entfernt. Dieses Argument geht auf frühe Versionen von Qiskit zurück, die enger mit dem Dienstleistungsangebot von IBM Quantum verbunden waren. Damals war das Feld max_credits Teil des "Kreditsystems", das im Rahmen des Serviceangebots von IBM Quantum verwendet wurde. Dieses Kreditsystem wird jedoch seit fast drei Jahren nicht mehr auf IBM Quantum verwendet, und auch Qiskit ist nicht mehr an das Serviceangebot von IBM Quantum gebunden (und war es schon lange nicht mehr). Wenn Sie sich in irgendeiner Weise auf diese Option für ein Backend verlassen, müssen Sie sicherstellen, dass Ihre BackendV2 implementierung ein max_credits Feld in ihrem Options objekt enthält.

  • Das Attribut name attribut der BackendV2 basierenden Fake-Backend-Klassen in qiskit.providers.fake_provider haben sich gegenüber früheren Versionen geändert. Zuvor hatten die Namen ein Suffix "_v2" , um die Klasse von der BackendV1 version zu unterscheiden. Dieses Suffix wurde entfernt, da es zu Inkonsistenzen mit anderen Snapshot-Daten führen könnte, die zum Aufbau des Backend-Objekts verwendet werden.

Hinweise zu veralteten Versionen

Transpiler-Veraltungen
  • Der Transpiler-Routing-Pass, BIPMapping , ist veraltet und wird in einer zukünftigen Version entfernt. Es wurde durch ein externes Plugin-Paket ersetzt: qiskit-bip-mapper. Details zu diesem neuen Paket finden Sie im Github-Repository des Pakets:

    https://github.com/qiskit-community/qiskit-bip-mapper

    Der Pass wurde aus zwei Gründen zu einem separaten Plugin-Paket gemacht: Erstens erschwert die Abhängigkeit von CPLEX die Verwendung und zweitens lässt sich das Plugin-Paket sauberer in transpile().

  • Die falsche Schreibweise aquire_alignment in der Klasse Target wurde durch die korrekte Schreibweise acquire_alignment ersetzt. Die alten Konstruktorargumente aquire_alignment und Target.aquire_alignment sind veraltet und werden in einer zukünftigen Version entfernt. Verwenden Sie Target.acquire_alignment um den Wert der Ausrichtungsbeschränkung zu erhalten und zu setzen.

Veraltete Schaltungen
  • Einstellung der QuantumCircuit metadata attributs auf None ist veraltet und wird in einer zukünftigen Version nicht mehr unterstützt werden. Stattdessen sollten die Benutzer es auf ein leeres Wörterbuch setzen, wenn es keine Daten enthalten soll.
Algorithmen-Veraltungen
Quantuminformations-Deprecations
  • Die Seiten PauliTable und StabilizerTable sind veraltet und werden in einer zukünftigen Version entfernt. Stattdessen sollte die PauliList verwendet werden. Mit dieser Änderung wurde table() veraltet, so dass Sie direkt von tableau() aus ohne diese Funktion arbeiten sollten.
Impuls-Deprecations
  • Die Zuweisung komplexer Werte an ParameterExpression in einem beliebigen Qiskit Pulse Objekt löst nun eine PendingDeprecationWarning aus. Dadurch wird das Modul Pulse mit anderen Modulen abgeglichen, bei denen eine solche Zuordnung zunächst nicht möglich war. Der typische Anwendungsfall für komplexe Parameter in dem Modul war die Bibliothek SymbolicPulse. Ab Qiskit-Terra 0.23.0 wurden alle Bibliotheksimpulse von der komplexen Amplitudendarstellung in die reelle Darstellung unter Verwendung von zwei Fließkommazahlen (amp,angle) umgewandelt, wie in der Klasse ScalableSymbolicPulse verwendet. Damit entfällt die Notwendigkeit, komplexe Parameter zu verwenden. Jegliche Verwendung komplexer Parameter (und insbesondere kundenspezifischer Impulse) sollte auf ähnliche Weise umgewandelt werden, um die Verwendung komplexer Parameter zu vermeiden.

Fehlerkorrekturen

  • Die AmplitudeEstimation klasse warnt nun korrekt, wenn eine EstimationProblem mit einer gesetzten is_good_state Eigenschaft als Eingabe übergeben wird, da dies nicht unterstützt und ignoriert wird. Bisher hat der Algorithmus diese Option ignoriert, was zu unerwarteten Ergebnissen führte.

  • QuantumCircuit.append() löst nun korrekt einen Fehler aus, wenn eine falsche Anzahl von klassischen Bits für eine Operation angegeben wird. Fix #9385.

  • Die BarrierBeforeFinalMeasurements und MergeAdjacentBarriers hatten zuvor eine nicht-deterministische Reihenfolge der ausgegebenen Barrier anweisungen. Dies änderte die Semantik der Schaltkreise nicht, konnte aber in begrenzten Fällen, in denen es nicht ganz breite Barrieren gab, dazu führen, dass spätere stochastische Transpiler-Durchläufe eine andere topologische Anordnung des Schaltkreises sahen und folglich unterschiedliche Ausgaben für feste Seeds hatten. Um dies zu vermeiden, wurden die Übergänge deterministisch gestaltet.

  • Der Rückgabetyp von run() ist nun immer derselbe wie der seines ersten Arguments. Die Übergabe eines einzelnen Stromkreises ergibt einen einzelnen Stromkreis, die Übergabe einer Liste von Stromkreisen, auch der Länge 1, ergibt eine Liste von Stromkreisen. Siehe #9798.

  • Ein Fehler wurde behoben, bei dem PauliOp.adjoint() keinen korrekten Wert für Paulis mit komplexen Koeffizienten lieferte, wie PauliOp(Pauli("iX")). Behoben #9433.

  • Ein Problem mit der Funktion der Schaltkreisschublade wurde behoben circuit_drawer() und QuantumCircuit.draw() methode bei der Anzeige von Befehlsparametern des Typs QuantumCircuit was zu einer unleserlichen Zeichnung führte. Behoben #9908

  • Ein Problem mit der Funktion der Schaltkreisschublade wurde behoben circuit_drawer() und QuantumCircuit.draw() bei Verwendung der Methode text und des Arguments vertical_compression="low" behoben, bei dem ein falsches Zeichen für die obere rechte Ecke von Kästchen verwendet wurde, die Gatter in der Schaltung darstellen.

  • Es wurde ein Problem mit der Gate.control() methode behoben, bei der bisher die Eingabetypen str oder None für das Argument ctrl_state falsch behandelt wurden.

  • Es wurde ein Randfall in der Konstruktion von Pauli instanzen; eine Zeichenkette mit einer optionalen Phase und ohne Qubits ist nun ein gültiges Label, wodurch ein Operator ohne Qubits (wie Pauli("-i")) entsteht. Dies war bereits bei der Verwendung von Array-Formularen oder leeren Slices möglich. Behoben #9720.

  • Es wurde ein Problem bei der Verwendung des pulse makro measure() bei der Arbeit mit einem BackendV2 basierten Backend. Zuvor führte der Versuch, qiskit.pulse.macros.measure() mit einem BackendV2 basierten Backend zu verwenden, hätte zu einem Fehler geführt. Behoben #9488

  • Es wurde ein Problem mit der Funktion marginal_distribution() funktion, die fälschlicherweise einen Fehler auslöste, wenn ein eingegebenes Zählwörterbuch den Typ numpy integer anstelle des Typs Python int verwendete. Die zugrundeliegende Funktion würde die verschiedenen Typen immer korrekt behandeln, aber die Überprüfung des Eingabetyps hat in diesem Fall fälschlicherweise eine TypeError ausgelöst.

  • Ein Fehler wurde behoben, bei dem Parameter.is_real() nicht None zurückgegeben hat, wenn der Parameter nicht gebunden ist. Behoben #8619.

  • Schaltkreise, die C3SXGate enthalten, können nun sicher über den OpenQASM 2.0 exporter (QuantumCircuit.qasm()) und Parser (QuantumCircuit.from_qasm_str()).

  • Es wurde ein Fehler in QPY (qiskit.qpy), bei dem Schaltungen mit Gattern der Klasse MCXGate, MCXGrayCode, und MCXRecursive, und MCXVChain nicht serialisiert werden konnten. Siehe #9390.

  • Die Transpiler-Routing-Pässe wurden korrigiert StochasticSwap, SabreSwap, LookaheadSwap, und BasicSwap so dass sie konsistent ein TranspilerError auslösen, wenn ihre jeweilige Methode .run() aufgerufen wird, wenn die Pässe mit coupling_map=None initialisiert wurden. Früher haben diese Durchläufe in diesem Fall Fehler ausgelöst, aber sie wurden alle durch Seiteneffekte verursacht und die spezifische Ausnahme war nicht vorhersehbar. Behoben #7127

  • Das manuelle Setzen eines Elements in QuantumCircuit.data wird nun korrekt erlauben, dass die Operation jedes Objekt sein kann, das Operationimplementiert, nicht nur ein circuit.Instruction. Beachten Sie, dass jede manuelle Mutation von QuantumCircuit.data wird abgeraten; sie ist in der Regel nicht effizienter als die Erstellung eines neuen Schaltkreisobjekts, da die Überprüfung der Invarianten, die parametrisierte Objekte umgeben, erstaunlich teuer sein kann.

  • Fehler behoben, der beim Konstruieren von DAGDependency innerhalb des TemplateOptimization transpilerpasses, der zu falschen Optimierungen führen konnte.

  • Es wurde ein Fehler in TensoredOp.to_matrix() behoben, bei dem der globale Koeffizient des Operators mehr als einmal mit der Endmatrix multipliziert wurde. Jetzt wird der globale Koeffizient unabhängig von der Anzahl der gespannten Operatoren oder Zustände korrekt angewendet. Behoben #9398.

  • Die Behandlung der globalen Phase im UnrollCustomDefinitions transpiler-Durchgang, wenn die betreffende Anweisung eine globale Phase, aber keine Anweisungen in ihrem Definitionsfeld hatte.

  • Die Typ-Anmerkungen für die Funktion transpile() funktion. Der Rückgabetyp wird nun korrekt eingegrenzt, je nachdem, ob ein einzelner Stromkreis oder eine Liste von Stromkreisen übergeben wurde.

  • Ein Fehler wurde behoben, bei dem IterativePhaseEstimation den falschen Schaltkreis erzeugte, was dazu führte, dass der Algorithmus in einfachen Fällen versagte. Behoben #9280.

  • Es wurde ein Fehler behoben, der es erlaubte, Broadcasting zu betreiben, wenn ein PauliList initialisiert wird von Paulis oder Etiketten. Zum Beispiel löst der Code PauliList(["XXX", "Z"]) nun ValueError aus, anstatt das Äquivalent PauliList(["XXX", "ZZZ"]) zu konstruieren.

  • Der OpenQASM 2 Exporter (QuantumCircuit.qasm()) gibt keine doppelten Definitionen für Gatter mehr aus, die in den Definitionen anderer Gatter vorkommen. Siehe #7771, #8086, #8402, #8558, und #9805.

  • Der OpenQASM 2-Exporter (QuantumCircuit.qasm()) kann nun mehrere und verschachtelte Definitionen von UnitaryGate. Siehe #4623, #6712, #7772, und #8222.

  • Der OpenQASM 2 Exporter (QuantumCircuit.qasm()) gibt nun die Definitionen für Gatter, die nur in den Definitionen anderer Gatter verwendet werden, in der richtigen Reihenfolge aus. Siehe #7769 und #7773.

  • Von Qiskit definierte Standard-Gates, wie z.B RZXGatehaben nun korrekt parametrisierte Definitionen, wenn sie mit dem OpenQASM 2-Exporter (QuantumCircuit.qasm()). Siehe #7172.

  • Quantenvolumenkreise (QuantumVolume) werden jetzt vom OpenQASM 2-Exporter (QuantumCircuit.qasm()). Siehe #6466 und #7051.

  • Der OpenQASM 2 Exporter gibt nun Gatter ohne bekannte Definition mit opaque Anweisungen aus, anstatt fehlzuschlagen. Siehe #5036.

  • Ein Problem, das transpile() daran hinderte, zu funktionieren, wenn eine Liste von CouplingMap objekten wurde behoben. Beachten Sie, dass die Übergabe einer solchen Liste von Kopplungskarten veraltet ist und ab Qiskit Terra 0.25 nicht mehr möglich sein wird. Behebt #9885.

  • Bis zu dieser Version wurde das Argument figsize von plot_bloch_multivector() wurde von der Visualisierung nicht verwendet, so dass es unmöglich war, seine Größe zu ändern (z. B. um es für Ein-Qubit-Zustände zu verkleinern). Diese Version behebt das Problem, indem sie eine Verwendung für das Argument figsize einführt.

  • Ein Problem wurde behoben in transpile() mit optimization_level=1 (sowie in den voreingestellten Pass-Managern, die von generate_preset_pass_manager() und level_1_pass_manager()zurückgegeben werden), wo früher, wenn die Argumente routing_method und layout_method nicht gesetzt waren und keine Kontrollflussoperationen in der Schaltung vorhanden waren, in Fällen, in denen Routing erforderlich war, der VF2PostLayout transpiler-Durchlauf nicht ausgeführt werden konnte. Dies war das Gegenteil des erwarteten Verhaltens, da VF2PostLayout ein potenziell leistungsfähigeres Layout finden soll, nachdem ein heuristischer Layoutdurchlauf und ein Routing durchgeführt wurden. Behoben #9936

  • Konstruktion eines Statevector aus einer QuantumCircuit die Null-Qubit-Operationen enthält, führt nicht mehr zu einem Fehler. Diese Operationen verleihen dem resultierenden Zustandsvektor eine globale Phase.

  • Es wurde ein Problem in den Tranpiler-Durchläufen für das Auffüllen von Verzögerungen behoben, das die Beschränkungen des Ziels nicht respektierte und Verzögerungen auch für Qubits einfügte, die den Delay anweisung. PadDelay und PadDynamicalDecoupling sind so festgelegt, dass sie keine Leerlaufzeit von Qubits auffüllen, so dass das Target keine Delay Anweisungen für die Qubits unterstützt. Auch die alten Zeitplanungsdurchläufe ASAPSchedule und ALAPSchedule, die intern Verzögerungen auffüllen, werden auf die gleiche Weise festgelegt. Außerdem wurde transpile() korrigiert, um PadDelay mit einem target Objekt aufzurufen, so dass es korrekt funktioniert, wenn es mit der Option scheduling_method aufgerufen wird. Behoben #9993

  • Die Typ-Anmerkungen der Methode QuantumCircuit.assign_parameters() methode korrigiert, um die Änderung des Rückgabetyps in Abhängigkeit vom Wert des Arguments inplace korrekt wiederzugeben.

  • Ein Problem mit der Leistungsskalierung bei den VF2Layout und VF2PostLayout durchgängen in den voreingestellten Durchgangsmanagern und transpile()behoben, das bei der Umsetzung von Schaltungen mit vielen angeschlossenen Komponenten auf großen Geräten auftrat. Der Transpiler setzt nun Obergrenzen für die Anzahl der möglichen Layouts, die ausgewertet werden.

  • Es wurde ein Problem in der Funktion state_to_latex() behoben, bei dem die Funktion aufgrund unbeabsichtigter Koeffizientenrundung möglicherweise ungültige LaTeX erzeugte. Dies konnte auch zu Fehlern führen, wenn die Website state_drawer() aufgerufen wurde. Behoben #9297.

Aer- 0.12.0

Keine Änderung

IBM Q Anbieter 0.20.2

Keine Änderung

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