Qiskit SDK 2.1 Versionshinweise
2.1.2
Vorspiel
Qiskit 2.1.2 ist ein kleines Patch-Release, das einige Fehler in der 2.1 Serie behebt.
Fehlerkorrekturen
-
In Qiskit 2.1.0 wurde der
VF2PostLayouttranspiler-Pass zuroptimizationStufe des Preset-Pass-Managers hinzugefügt, wennoptimization_level=3. Der Ausgang des Passes wurde jedoch nie in die Schaltung eingespeist. In dieser Version wird der Pass aus der Phaseoptimizationdes voreingestellten Pass-Managers entfernt, um Laufzeitkosten zu sparen. In Qiskit 2.2.0 wird der Pass Teil deroptimizationStufe sein und der Output wird angewendet, wenn der Pass ein besseres Layout findet. -
Es wurde ein Problem im
VF2Layouttranspiler-Durchgang behoben, bei dem selbst bei einem festen Seed-Set die Ausgabe des Durchgangs potenziell nicht-deterministisch war; insbesondere wenn der Eingangsschaltkreis aktive Qubits hatte, die nur einzelne Qubit-Operationen enthielten. Behoben #14729 -
Es wurde ein Fehler in
PassManager.run()behoben, bei dem die Funktioncallbacknicht aufgerufen wurde, wenn sie mit mehreren Schaltkreisen ausgeführt wurde. Der Rückruf wird nun bei jedem Durchlauf in jedem Schaltkreis korrekt ausgelöst, auch bei paralleler Ausführung. -
Eingebaute Transpiler-Durchläufe, die die Eigenschaft
final_layoutsetzen, behandeln die Aktualisierung dieses Feldes nun korrekt, wenn es bereits gesetzt war. Dies lässt sich daran erkennen, dass die MethodeTranspileLayout.routing_permutationnun eine korrekte Permutation zurückgibt, nachdem sie mehr als einen Durchlauf durchgeführt hat, derfinal_layoutsetzt.Dies hatte keine Auswirkungen auf normale Anrufe bei
transpile()odergenerate_preset_pass_manager()die die eingebauten Plugins von Qiskit verwenden; keine in dieser Form konstruierte Pipeline würde versuchen,final_layoutmehr als einmal zu setzen. -
Es wurde ein Fehler in
Target.instruction_supported()behoben, bei dem die Überprüfung der Qubit-Reihenfolge der Anweisung übersprungen wurde, wenn die Methode mit den Argumentenoperation_nameundparametersaufgerufen wurde, die mit einer bestehenden Anweisung übereinstimmten. -
Es wurde ein Fehler behoben, der beim Export von Schaltungen mit Verzögerungsanweisungen unter Verwendung von
psEinheiten nach QASM3 auftrat. -
Es wurde ein Fehler in der Anzeige des
QFTschaltung. Zuvor, wennQFT.inverse()aufgerufen wurde und dann die Attribute des QFT-Kreises geändert wurden, wurde der Name des QFT als"IQFT_dg"angezeigt. Dies war nicht korrekt, und jetzt wird"IQFT"korrekt angezeigt. Behoben #14758. -
Ein Speicherleck in der Koordination der Verwendung von
qk_circuit_get_instructionundqk_circuit_instruction_clearwurde behoben. -
Die Fehlermeldung für ungültig angegebene Versionen in
qpy.dump()um die Reaktion darauf zu erleichtern. -
Es wurde ein Problem mit der Funktion
generate_preset_pass_manager()funktion, die fälschlicherweise die Timing-Einschränkungsdaten ignorierte, die in einemTargetobjekt enthaltenen Timing Constraints ignorierte, wenn das Argumentbackendnicht gesetzt war. Behoben #14329 -
Es wurde ein Fehler in
SparsePauliOp.simplify()bei dem die Methode Pauli-Terme auf der Grundlage der Größe ihrer Koeffizienten entfernte, bevor sie Duplikate kombinierte. Dies führte zu fehlerhaftem Verhalten in zwei wichtigen Randfällen:- Wenn mehrere identische Pauli-Terme kleine Koeffizienten hatten, die einzeln unter der Vereinfachungsschwelle lagen, deren Summe aber die Schwelle überstieg, wurden diese Terme fälschlicherweise entfernt.
- Wenn mehrere identische Pauli-Terme Koeffizienten oberhalb des Schwellenwerts hatten, aber in der Summe nahe Null waren, wurden sie fälschlicherweise beibehalten.
Siehe #14194 für weitere Einzelheiten.
2.1.1
Vorspiel
Qiskit 2.1.1 ist ein kleines Patch-Release, das einige Fehler in der 2.1 Serie behebt.
Fehlerkorrekturen
-
Es wurde ein Fehler in der
DAGOpNodegleichheitsprüfung, bei der der Vergleich zweierDAGOpNodeobjekten, die eineBoxOpanweisung enthalten. Bisher wurde das AttributBoxOp.unitbei der Gleichheitsprüfung nicht berücksichtigt, was dazu führen konnte, dass zwei ungleiche Knoten als gleich bewertet wurden. -
Die Verwerfungswarnung für Python 3.9 wurde korrigiert, so dass beim Importieren von Qiskit korrekt erkannt wird, dass sie durch Anwendercode verursacht wurde. Zuvor konnte nicht erkannt werden, dass es sich um einen vom Benutzer verursachten Code handelte, und dies bedeutete, dass die Standard-Warnfilter von Python dem Benutzer die Warnung nicht anzeigten.
-
Das Verhalten des Arguments
max_trialsfürVF2Layoutwenn es aufNoneoder eine negative Zahl gesetzt wird. Der Durchlauf wurde so dokumentiert, dass er die Suche auf die Größe des Schaltkreises oder des Ziels beschränkt, wenn die Option aufNonegesetzt wurde, und dass er negative Werte akzeptiert, um eine unbegrenzte Suche anzugeben. In 2.1.0 wurde dieses Verhalten jedoch fälschlicherweise geändert, so dassNoneeine unbegrenzte Suche durchführte und die Verwendung einer negativen Zahl einen Fehler verursachte. Diese Versäumnisse wurden korrigiert, so dass sich der Pass nun wie dokumentiert verhält und mit früheren Versionen übereinstimmt. -
Ein Problem in High-Level-Synthese-Plugins wurde behoben
MCXSynthesis1DirtyKG24undMCXSynthesis2DirtyKG24fürMCXGate, wo die Plugins verfügbare saubere Hilfsqubits nicht als verfügbare schmutzige Hilfsqubits betrachteten. Insbesondere wurde das PluginMCXSynthesis2DirtyKG24kam nicht zur Anwendung, wenn ein sauberes und ein schmutziges Hilfsqubits zur Verfügung standen. -
Es wurde ein Leistungsabfall bei der inkrementellen Erstellung von
ParameterExpressiondurch Kombination einer großen Anzahl von Unterausdrücken. Behoben #14653
2.1.0
Vorspiel
Die neue Version von Qiskit v2.1 führt mehrere wichtige Verbesserungen in Schlüsselbereichen ein, darunter die C-API, Transpiler-Funktionen und die Benutzerfreundlichkeit von Quantenschaltungen. Darüber hinaus enthält sie viele allgemeine Verbesserungen und Fehlerbehebungen. Zu den wichtigsten Highlights gehören:
- C-API-Erweiterungen: Aufbauend auf der Arbeit, die in der vorherigen Version begonnen wurde, bietet Qiskit v2.1 Unterstützung für die Erstellung und Interaktion mit Quantenschaltungen über C-API-Funktionen, die das Hinzufügen von Standardgattern, Standardbefehlen und unitären Gattern unterstützen. Außerdem wurde in dieser Version eine Reihe von C-Funktionen zur Erstellung und Bearbeitung eines
Targetobjekts, als Vorbereitung für die Unterstützung eines vollständigen C-API-basierten Transpilierungs-Workflows in der nächsten Version. Darüber hinaus istQkComplex64jetzt als Struktur definiert und dient als Compiler-agnostische Darstellung für komplexe Zahlen bei der Arbeit mit der C-API von Qiskit. Die Header-Datei der C-API wurde ebenfalls aktualisiert, so dass sie allgemein kompatibel ist und nativ in C++ verwendet werden kann.- Unterstützung der Clifford+T-Basismenge: Das Transpilieren von Schaltungen für ein Ziel mit Clifford+T-Gattern wird jetzt sofort unterstützt. Wenn die Basismenge nur aus Clifford+T-Gattern besteht, sorgt Qiskit dafür, dass den voreingestellten Pass-Managern die entsprechenden Pässe für die Verarbeitung dieser Gatter hinzugefügt werden. Dies ist ein erster Schritt zur Unterstützung der Transpilation für fehlertolerante Backends.
- Erweiterungen in
BoxOp: Diese Version bietet die Möglichkeit, benutzerdefinierte Annotationen anBoxOpanweisungen anzuhängen, was das Konzept der Box-Anweisungen von OpenQASM 3 in Qiskit weiter unterstützt. Dazu gehört auch die Serialisierung von Kommentaren in den Formaten QASM und QPY. Außerdem wurde die Unterstützung für die Verwendung von Dehnungsdauern in Boxen hinzugefügt.- Python 3.9 deprecation: Python 3.9 ist ab Qiskit v2.1 veraltet und wird in Qiskit v2.3 nicht mehr unterstützt.
Weitere Einzelheiten zu den oben genannten Punkten und vieles mehr finden Sie in den nachstehenden Versionshinweisen und in der aktualisierten Dokumentation.
C-API-Funktionen
-
Die Qiskit C API ( qiskit.h ) unterstützt nun die Erstellung und Interaktion mit Quantenschaltungen. Im Mittelpunkt der C-API für Schaltungen steht der undurchsichtige Typ
QkCircuit, der die Schaltung darstellt. Der TypQkCircuitermöglicht den Aufbau eines Schaltkreises mit jedem Schaltkreiselement, das nativ im internen Rust-Datenmodell von Qiskit fürQuantumCircuit. Dazu gehören derzeit Standardtore,Measure,Delay,Reset,Barrier, undUnitaryGate. Die Möglichkeiten der C-API für Schaltkreise werden sich in zukünftigen Versionen erweitern, wenn weitere Teile des Qiskit-Datenmodells nativ in das interne Rust-Datenmodell aufgenommen werden, so dass sie in der C-API verwendet werden können.Sie können beispielsweise die C-API verwenden, um einen 1000-Qubit-GHZ-Zustand zu erzeugen:
#include <qiskit.h> int main() { // Create an empty circuit with 1000 qubits and 1000 clbits QkCircuit *qc = qk_circuit_new(1000, 1000); // Add a Hadamard Gate on Qubit 0 uint32_t one_qubit[1] = {0,}; qk_circuit_gate(qc, QkGate_H, one_qubit, NULL); // The NULL pointer is for the parameter array. // Since Hadamard doesn't have parameters it // is never accessed. // Add the CX Gates: uint32_t qubits[2] = {0, 0}; uint32_t num_qubits = qk_circuit_num_qubits(qc); for (int i = 1; i<num_qubits; i++) { qubits[1] = i; qk_circuit_gate(qc, QkGate_CX, qubits, NULL); } // Add the measurements: uint32_t num_clbits = qk_circuit_num_clbits(qc); for (uint32_t i = 0; i<num_clbits; i++) { qk_circuit_measure(qc, i, i); } qk_circuit_free(qc); return 0; } -
Die Qiskit C API ( qiskit.h ) unterstützt nun die Erstellung eines
Targetum ein Transpilationsziel zu repräsentieren. Zum Beispiel:#include <qiskit.h> #include <math.h> int main() { // Create a Target with 3 qubits QkTarget *target = qk_target_new(3); // Create a Target Entry for a CX Gate QkTargetEntry *cx_entry = qk_target_entry_new(QkGate_CX); // Define properties for CX between qubits (0, 1) with a duration of 1.93e-9 sec and error rate 3.17e-10. uint32_t qargs[2] = {0, 1}; qk_target_entry_add_property(cx_entry, qargs, 2, 1.93e-9, 3.17e-10); // Define properties for cx between qubits (1, 0) with a duration of 1.27e-9 sec and no error. uint32_t rev_qargs[2] = {1, 2}; qk_target_entry_add_property(cx_entry, rev_qargs, 2, 1.27e-9, NAN); // Add the cx entry to the target. QkExitCode result_cx = qk_target_add_instruction(target, cx_entry); // Add global ideal Y gate entry to the target QkExitCode result_y = qk_target_add_instruction(target, qk_target_entry_new(QkGate_Y)); // Create a Target entry for a Measurement with increasing duration and error as the qubit indices increase QkTargetEntry *measure = qk_target_entry_new_measure(); for (uint32_t i = 0; i< qk_target_num_qubits(target); i++) { uint32_t q[1] = {i}; qk_target_entry_add_property(measure, q, 1, 1e-6 * (i + 1), 1e-3 * (i + 1)); } QkExitCode result_measure = qk_target_add_instruction(target, measure); return 0; } -
Es wurde Unterstützung für die Abfrage der Qiskit-Versionsinformationen von der C-API mit Hilfe der folgenden Makros hinzugefügt:
QISKIT_VERSION_MAJOR: Enthält die Hauptversionsnummer.QISKIT_VERSION_MINOR: Enthält die Nebenversionsnummer.QISKIT_VERSION_PATCH: Enthält die Versionsnummer des Patches.QISKIT_VERSIONversion: Enthält eine numerische Darstellung der Versionsinformationen, die für Vergleiche verwendet werden kann.QISKIT_VERSION_NUMERIC(M,m,p)ein funktionsähnliches Makro, das die Version " M.m.p " als numerischen Wert zurückgibt, der für Vergleiche verwendet werden kann.
Um zum Beispiel zu prüfen, ob die aktuelle Version mindestens 2.1.0 ist, können Sie verwenden:
if (QISKIT_VERSION >= QISKIT_VERSION_NUMERIC(2, 1, 0)) { // Code for version 2.1.0 or later } -
Aktiviert die C++-Kompatibilität für die C-API. Der generierte Header erlaubt nun den direkten Aufruf von Objekten und Funktionen aus C++. Eine 100-Qubit-Beobachtungsgröße mit dem Term XYZ auf den ersten 3 Qubits kann zum Beispiel wie folgt konstruiert werden
#include <iostream> #include <complex> #include <vector> #include <qiskit.h> int main() { uint32_t num_qubits = 100; // Use smart pointer with custom deleter to manage QkObs memory QkObs *obs = qk_obs_zero(num_qubits); // Construct the observable term std::complex<double> coeff_complex = 2.0; QkComplex64 coeff = qk_complex64_from_native(coeff_complex); std::vector<QkBitTerm> bit_terms = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z}; std::vector<uint32_t> indices = {0, 1, 2}; QkObsTerm term { .coeff = coeff, .len = bit_terms.size(), .bit_terms = bit_terms.data(), .indices = indices.data(), .num_qubits = num_qubits }; qk_obs_add_term(obs.get(), &term); // Print observable properties std::cout << "num_qubits: " << qk_obs_num_qubits(obs) << "\n"; std::cout << "num_terms: " << qk_obs_num_terms(obs) << "\n"; qk_obs_free(obs); return 0; }
Schaltkreise Funktionen
-
Hinzufügen einer Funktion
random_circuit_from_graph()hinzugefügt, die einen zufälligen Schaltkreis erzeugt, der denselben Interaktionsgraphen wie der durch interaction_graph angegebene hervorruft.Die Wahrscheinlichkeit, dass eine Kante aus dem Interaktionsgraphen zufällig als Zwei-Qubit-Tor gezogen wird, kann vom Benutzer im Attribut "Gewicht" einer Kante im eingegebenen Interaktionsgraphen festgelegt werden. Wenn der Benutzer die Wahrscheinlichkeit nicht festlegt, wird jede Kante gleichmäßig gezogen. Das heißt, jedes Zwei-Qubit-Gatter, das durch eine Kante im Interaktionsgraphen repräsentiert wird, hat die gleiche Wahrscheinlichkeit, dem Zufallsschaltkreis hinzugefügt zu werden. Wenn nur eine Teilmenge der Kantenwahrscheinlichkeiten eingestellt ist, wird
ValueErrorangezeigt.In diesem Beispiel ist
cp_mapeine Liste von Kanten mit beliebiger Gewichtung.from qiskit.circuit.random.utils import random_circuit_from_graph import rustworkx as rx pydi_graph = rx.PyDiGraph() n_q = 5 cp_map = [(0, 1, 0.18), (1, 2, 0.15), (2, 3, 0.15), (3, 4, 0.22)] pydi_graph.extend_from_weighted_edge_list(cp_map) # cp_map can be passed in directly as interaction_graph qc = random_circuit_from_graph(interaction_graph = pydi_graph, min_2q_gate_per_edge = 1, max_operands = 2, measure = True, conditional = True, reset = True, seed = 0, insert_1q_oper = True, prob_conditional = 0.21, prob_reset = 0.1) qc.draw(output='mpl')
-
Hinzufügen einer neuen
QuantumCircuitmethode:QuantumCircuit.has_control_flow_op()um zu prüfen, ob einQuantumCircuitobjekt irgendwelche Kontrollflussoperationen enthält. -
Ein neues Modul
qiskit.circuit.annotationund ein HauptobjektAnnotationsind hinzugefügt worden.Anmerkungen sind eine Möglichkeit, Anweisungen (derzeit nur
BoxOp) mit lokalen, benutzerdefinierten Daten zu versehen. Diese Daten sollen von benutzerdefinierten Transpilerdurchläufen verwendet werden. Mit Hilfe von Anmerkungen können Daten an bestimmte Anweisungen angehängt werden, anstatt das Objekt global-contextPropertySetwährend der Kompilierung zu verwenden.Alle
Annotationobjekte haben ein Feldnamespace. Dieser String-Schlüssel wird für Nachschlagewerke verwendet, so dass die Verbraucher feststellen können, ob sie eine bestimmte Anmerkung bearbeiten oder nicht. Derzeit gibt es keine Methoden zur Abfrage der abstrakten Semantik einerAnnotationunterklasse abzufragen, aber es ist zu erwarten, dass diese in Zukunft erweitert werden.Siehe
qiskit.circuit.annotationfinden Sie eine ausführliche Beschreibung der Funktionen und Anwendungsfälle. -
BoxOpinstanzen (erstellt vonQuantumCircuit.box()) können nun mit benutzerdefiniertenAnnotationinstanzen versehen werden. Die Gleichheit zweier Kästchen hängt davon ab, dass die Anmerkungen gleich sind.Normalerweise wird dies erreicht, indem eine Liste von Anmerkungen als einziges Positionsargument übergeben wird, wenn man
QuantumCircuit.box()in Form eines Kontext-Managers verwendet wird:from qiskit.circuit import annotation, QuantumCircuit class MyAnnotation(annotation.Annotation): namespace = "my.annotation" def __eq__(self, other): return isinstance(other, MyAnnotation) qc = QuantumCircuit() with qc.box([MyAnnotation()]): pass -
Die Methode
UnitaryGate.control()methode verwendet nun internqs_decomposition()anstelle vonIsometryfür die Zerlegung, die zur Definition der kontrolliertenUnitaryGate. Durch diese Änderung wird die Anzahl derCXGatedie in derdefinitionfür die zurückgegebenenControlledGateum etwa 2x. -
Verbesserung der Synthese einer mehrfach gesteuerten
U1Gateverbessert, so dass sie nicht exponentiell mit der Anzahl der Kontrollen wächst. -
Das Attribut
BoxOp.durationkann nun einexpr.Exprknoten mit dem TypDurationsein, genau wieDelay.duration. Dazu gehört auch die UnterstützungStretchfür die Dauer einerBoxOp.
Primitive Funktionen
-
Schätzer-PUBs, die als Eingabe für
BaseEstimatorV2.run()verwendet werden, können nun definiert werden mitSparseObservableobjekte für die beobachtbare Komponente der PUB definiert werden. Dies gilt zusätzlich zu den bereits unterstützten Typen:str,Pauli,SparsePauliOpund einer Abbildung vonstroderPauliauffloatWerte. Wenn jedoch dieSparseObservableprojektoren enthält, hängt die Unterstützung für den Umgang damit von der Implementierung des Primitivs ab. Ab dieser Version werden die Implementierungen in Qiskit (StatevectorEstimatorundBackendEstimatorV2),qiskit-ibm-runtime(qiskit_ibm_runtime.EstimatorV2), und Qiskit Aer's (qiskit_aer.primitives.EstimatorV2) unterstützen die primitiven Implementierungen noch keine projektiven Observablen. Projektive Observablen sind solche, die die Begriffe enthalten:0,1,+,-,r, oderl. -
Fügen Sie Unterstützung für die
DataBinklasse, um sie serialisierbar zu machen mitpickle. Dies ermöglicht es, diePrimitiveJobundPrimitiveResultklasse serialisierbar mitpickleauch serialisierbar zu machen.
OpenQASM Funktionen
-
qasm3.dump()undqasm3.dumps()haben ein neues Argumentannotation_handlers, das verwendet wird, um Instanzen vonannotation.OpenQASM3Serializerdem OpenQASM 3 Exportprozess zur Verfügung zu stellen, der benutzerdefinierteAnnotationobjekte nach OpenQASM 3 serialisieren kann. -
Wenn
qiskit_qasm3_import>=0.6.0installiert ist,qasm3.load()undqasm3.loads()haben ein neues Argumentannotation_handlers, das verwendet wird, um Instanzen vonannotation.OpenQASM3Serializerdem OpenQASM 3-Importprozess zur Verfügung zu stellen, der die benutzerdefiniertenAnnotationobjekte von OpenQASM 3 deserialisieren kann. Diese Unterstützung ist derzeit aufboxAnweisungen beschränkt, da dies die einzige Stelle ist, an der Qiskit Anmerkungen in seinem Datenmodell darstellen kann.
QPY-Funktionen
-
Hinzufügen einer neuen Version 15 des QPY-Formats mit Unterstützung für die neuen
Annotationobjekte, mit Unterstützung von externen Serialisierern und Deserialisierern. Das Format erlaubt es solchen Serialisierern, zustandsbehaftet zu sein, und es werden sichere Plätze im Binärformat für die benutzerdefinierten Zustandsobjekte und benutzerdefinierten Anmerkungsrepräsentationen zugewiesen. -
qpy.dump()undqpy.load()haben jetzt ein optionalesannotation_factoriesArgument, das verwendet wird, um Konstruktorfunktionen vonannotation.QPYSerializerobjekten zur Behandlung vonAnnotationunterklassen. Diese müssen, ähnlich wie beimetadata_serializer, vom Benutzer bereitgestellt werden, da Qiskit im Allgemeinen nicht alle möglichen extern definiertenAnnotationobjekte kennen kann. -
Hinzufügen einer neuen Funktion
get_qpy_version()in dasqpymodul hinzugefügt. Diese Funktion untersucht eine QPY-Datei und ermittelt die in der Nutzlast verwendete Version des QPY-Formats. Die Version wird als Ganzzahl zurückgegeben, die für Protokollierungs- oder Debugging-Zwecke verwendet werden kann. siehe #14201.
Quanteninformationsmerkmale
-
Eine neue Klasse,
PauliLindbladMapwird hinzugefügt, die eine Pauli-basierte Parametrisierung einer Teilmenge von linearen Karten von Multi-Qubit-Operatoren ist, die in Rauschlernanwendungen verwendet werden. Es wird erwartet, dass diese Klasse das Rückgrat von verbesserten Algorithmen zum Erlernen von Rauschen bildet und eine bessere und effizientere Kontrolle über Rauschmodelle in zukünftigen Versionen von Qiskit ermöglicht. -
Eingeführt wurde die
QubitSparsePauliundQubitSparsePauliListklassen eingeführt, die dieselben Konzepte repräsentieren wiePauliundPauliListrepräsentieren, aber nur Nicht-Identitätsbegriffe speichern, analog zuSparseObservable. Diese Klassen sind in erster Linie für die Verwendung mit dem neuenPauliLindbladMap.
Synthesefunktionen
-
Hinzufügen eines neuen Synthesealgorithmus für
HalfAdderGateder keine zusätzlichen Qubits benötigt und eine bessere CX-Zahl aufweist alsadder_qft_d00(): -
Neue Zerlegungen hinzugefügt für
MCXGateverwendung sauberer Ancillae, Verbesserung der Schaltkreistiefe und Effizienz:synth_mcx_1_clean_kg24()mit 1 zusätzlichen sauberen Ancilla-Qubitsynth_mcx_1_dirty_kg24()unter Verwendung von 1 zusätzlichen dirty ancilla qubitsynth_mcx_2_clean_kg24()unter Verwendung von 2 zusätzlichen sauberen Hilfsqubitssynth_mcx_2_dirty_kg24()mit 2 zusätzlichen dirty ancillary qubits
Beispielverwendung:
from qiskit.synthesis.multi_controlled import synth_mcx_1_clean_kg24 n_ctrls = 10 qc = synth_mcx_1_clean_kg24(n_ctrls) qc.draw() -
Die Synthese von mehrfach gesteuerten
CZGategatter wurde verbessert, um die Anzahl der synthetisierten Gatter zu reduzieren, in einigen Fällen ist eine Reduzierung um bis zu 99 % möglich. Dies wurde erreicht, indem die verbesserte Synthese um denMCXGatemit kontrollierterCZGatesynthese zu erreichen. -
Verbesserung des Standard-Plugins für die Synthese von
AnnotatedOperationobjekte. Diese Verbesserung ist besonders nützlich bei der Erstellung und Umsetzung von gesteuerten Schaltungen mit gesteuerten Gattern. Zum Beispiel:from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import CXGate from qiskit.compiler import transpile inner = QuantumCircuit(5) inner.append(CXGate().control(3, annotated=True), [0, 1, 2, 3, 4]) controlled_inner_gate = inner.to_gate().control(2, annotated=True) qc = QuantumCircuit(15) qc.append(controlled_inner_gate, [0, 1, 2, 3, 4, 5, 6]) qct = transpile(qc, basis_gates=["cx", "u"])Dieser Code erstellt einen Quantenschaltkreis
qc, der einen 2-gesteuerten Quantenschaltkreis mit einem 3-gesteuerten CX-Gate enthält. Durch die Verbesserung wird die Anzahl der CX-Tore in der transponierten Schaltung von378auf30reduziert. Beachten Sie, dass durch die Angabe vonannotated=Truebei der Definition der Steuerlogik die kontrollierten Gatter als kommentierte Operationen erstellt werden. Dadurch wird eine eifrige Synthese vermieden und der Transpiler kann erkennen, dasscontrolled_inner_gateeinem 6-fach gesteuerten X-Gate entspricht, und die beste verfügbare Synthesemethode für mehrfach gesteuerte X-Gates wählen, insbesondere unter Verwendung verfügbarer Ancilla-Qubits. -
Die Funktion
adder_qft_d00(), die zur Synthese vonModularAdderGateundHalfAdderGategatter verwendet wird, akzeptiert jetzt einen zusätzlichen Parameterannotated. UnterTruewird das inverse QFT-Gate in den Addierern als annotierte Operation implementiert, so dass der Transpiler zusätzliche Optimierungen vornehmen kann. -
Die Quantum-Shannon-Zerlegung (
qs_decomposition()) enthält jetzt eine Optimierung, die dieCXGateanzahl in dem Fall reduziert, dass die Eingabe-Unitarie eine kontrollierte Unitarie ist. -
Die Synthesefunktion
synth_mcx_1_clean_b95()erzeugt nun eine Schaltung mit weniger CX-Gattern. -
Die Klasse
SolovayKitaevDecompositionklasse hat nun zusätzliche Argumente im Initialisierer, die es erlauben, sie direkt aus einer Menge vonbasis_gatesund einerdepthfür die grundlegenden Näherungen zu konstruieren. -
Hinzugefügt
SolovayKitaevDecomposition.save_basic_approximations()um die Menge der von der Klasse verwendeten Grundannäherungen in einem binären Format zu speichern. Diese Änderung in Kombination mit den neuen Initialisierungsargumenten ermöglicht es den Benutzern, die explizite Verwendung vongenerate_basic_approximations()zu überspringen und sich nur aufSolovayKitaevDecomposition.
Transpiler-Funktionen
-
Die Funktion
generate_preset_pass_manager()erzeugt nun einen speziellen Passmanager, wenn die Basismenge nur aus Clifford+T-Gattern besteht. Formal muss eine Clifford+T-Basismenge nur Clifford-Gatter enthalten, zusammen mit entwederTGate,TdgGate, oder beides. Die vollständige Liste der unterstützten Clifford-Gatter erhalten Sie, indem Sieget_clifford_gate_names().Zum Beispiel:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.quantum_info import get_clifford_gate_names basis_gates = get_clifford_gate_names() + ["t", "tdg"] pm = generate_preset_pass_manager(basis_gates=basis_gates) qc = QuantumCircuit(1) qc.rx(0.8, 0) qct = pm.run(qc) print(qct.count_ops())Würde mit resultieren:
OrderedDict([('h', 10210), ('t', 4508), ('tdg', 4503), ('sdg', 943), ('s', 941)])Zuvor konnte der generierte Passmanager das obige Beispiel nicht verarbeiten, da er Ein-Qubit-Rotationsgatter nicht in Clifford+T-Gatter zerlegen konnte
UGaterotationsgatter in Clifford+T-Gatter zerlegen konnte. Der neue Pass-Manager verwendet jedoch die Solovay-Kitaev-Zerlegung zur Annäherung von Ein-Qubit-Rotationsgattern mit den GatternH,TundTdgund ruft denBasisTranslatortranspiler-Pass auf, um die Gatter weiter in die Zielbasismenge zu übersetzen. Der neue Passmanager hat auch andere Änderungen, um eine effizientere Übersetzung in Clifford+T-Gatter zu ermöglichen.Es ist wichtig zu beachten, dass die angegebene Clifford+T-Basisgattermenge universell sein sollte, da sonst die Transpilation möglicherweise nicht gelingt. Während die Gattermenge
["h", "t", "tdg"]oder sogar["h", "t"]für die Universalität ausreicht, wird empfohlen, die Menge nach Möglichkeit um weitere Clifford-Gatter zu erweitern, da die Übersetzung sonst weniger effizient sein könnte. Wenn z. B. das S-Gatter nicht enthalten ist, könnten S-Gatter in Paare von T-Gattern zerlegt werden (d. h. Clifford-Gatter könnten in Nicht-Clifford-Gatter zerlegt werden, was nicht unbedingt das gewünschte Verhalten ist).Es folgt ein etwas größeres Beispiel:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import QFTGate from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager qc = QuantumCircuit(4) qc.append(QFTGate(4), [0, 1, 2, 3]) basis_gates = ["cx", "s", "sdg", "h", "t", "tdg"] pm = generate_preset_pass_manager(basis_gates=basis_gates, optimization_level=2) qc = QuantumCircuit(4) qc.append(QFTGate(4), [0, 1, 2, 3]) qct = pm.run(qc) print(qct.count_ops())Würde mit resultieren:
OrderedDict([('h', 96510), ('tdg', 42396), ('t', 42389), ('s', 8240), ('sdg', 8235), ('cx', 12)]) -
Ein neues High-Level-Synthese-Plugin wurde hinzugefügt
HalfAdderSynthesisR25zum Synthetisieren einesHalfAdderGate. Das neue Plugin basiert aufadder_ripple_r25().Die
HalfAdderSynthesisDefaultwurde ebenfalls aktualisiert, um der folgenden Sequenz von Halbaddierer-Synthesizern zu folgen:"HalfAdder.ripple_r25", wenn es Qubits gibt,"HalfAdder.ripple_c04", wenn ein zusätzliches Qubit verfügbar ist, und"HalfAdder.ripple_r25"in allen anderen Fällen. -
Mehrere High-Level-Synthese-Plugins für die Synthese eines
MCXGate:MCXSynthesis1CleanKG24. auf der Grundlage vonsynth_mcx_1_clean_kg24().MCXSynthesis1DirtyKG24. auf der Grundlage vonsynth_mcx_1_dirty_kg24().MCXSynthesis2CleanKG24. auf der Grundlage vonsynth_mcx_2_clean_kg24().MCXSynthesis2DirtyKG24. auf der Grundlage vonsynth_mcx_2_dirty_kg24().
Die
MCXSynthesisDefaultklasse wurde auch aktualisiert, um die folgende Sequenz von MCX-Synthesemethoden auszuführen, bis die erste erfolgreich ist: :"mcx.2_clean_kg24","mcx.1_clean_kg24","mcx.n_clean_m15","mcx.n_dirty_i15"`, ``"mcx.2_dirty_kg24","mcx.1_dirty_kg24","mcx.1_clean_b95","mcx.noaux_v24". Die Methoden sind so geordnet, dass die qualitativ besseren Methoden zuerst angewendet werden. -
VF2PostLayoutwurde am Ende der Standardoptimierungsphase bei Verwendung der Optimierungsstufe 3 hinzugefügt. -
Hinzufügen eines neuen
OptimizeCliffordTtranspiler-Optimierungsdurchgang hinzugefügt, der Paare von aufeinanderfolgenden T-Toren in S-Tore und Paare von aufeinanderfolgenden Tdg-Toren in Sdg-Tore zusammenführt. Diese Optimierung ist besonders wirksam bei der Verringerung der T-Zahl nach der Solovay-Kitaev-Zerlegung, bei der mehrere aufeinanderfolgende T- oder Tdg-Gatter entstehen. Zum Beispiel:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import SolovayKitaev, OptimizeCliffordT qc = QuantumCircuit(1) qc.rx(0.8, 0) # Run Solovay-Kitaev pass on qc transpiled = SolovayKitaev()(qc) print(transpiled.count_ops().get("t", 0) + transpiled.count_ops().get("tdg", 0)) # Should print 12779 # Run Clifford+T optimization optimized = OptimizeCliffordT()(transpiled) print(optimized.count_ops().get("t", 0) + optimized.count_ops().get("tdg", 0)) # Should print 9011 -
Hinzugefügt wurde der
ContextAwareDynamicalDecouplingpass, der eine kontextabhängige dynamische Entkopplung auf der Grundlage von Walsh-Hadamard-Sequenzen implementiert. Die eingefügten Verzögerungssequenzen sind gegenseitig orthogonal zu den Sequenzen auf benachbarten Qubits und berücksichtigen die Kontroll-/Zielzuschauer von CX- und ECR-Gattern. Siehe arXiv:2403.06852 für weitere Informationen.Beispiel:
from qiskit.circuit.library import QFT from qiskit.transpiler import PassManager, CouplingMap from qiskit.transpiler.passes import ALAPScheduleAnalysis, ContextAwareDynamicalDecoupling from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import GenericBackendV2 num_qubits = 10 circuit = QFT(num_qubits) circuit.measure_all() target = GenericBackendV2( 100, basis_gates=["id", "rz", "sx", "x", "ecr"], coupling_map=CouplingMap.from_grid(10, 10) ).target pm = generate_preset_pass_manager(optimization_level=2, target=target) dd = PassManager([ ALAPScheduleAnalysis(target=target), ContextAwareDynamicalDecoupling(target=target), ]) transpiled = pm.run(circuit) with_dd = dd.run(transpiled) with_dd.draw("mpl", idle_wires=False)
-
Die folgenden Attribute wurden der Klasse
DAGCircuitklasse hinzugefügt, um die Abfrage der Anzahl der Stretch-Variablen zu ermöglichen:num_stretches,num_captured_stretchesundnum_declared_stretches. -
Ein neues unitäres Synthese-Plugin wurde hinzugefügt
CliffordUnitarySynthesisdas versucht, ein gegebenes unitäres Gatter zu synthetisieren, indem es prüft, ob es durch ein Clifford-Gatter dargestellt werden kann. In diesem Fall gibt es eine Schaltung zurück, die dieses unitäre Gatter implementiert und nur aus Clifford-Gattern besteht.Das Plugin wird durch den
UnitarySynthesistranspiler pass aufgerufen, wenn der Parametermethodauf"clifford"gesetzt ist.Darüber hinaus kann der Parameter
plugin_configvonUnitarySynthesiszur Übergabe der folgenden Plugin-spezifischen Parameter verwendet werden:- min_qubits: die Mindestanzahl der zu berücksichtigenden Qubits (der Standardwert ist 1).
- max_qubits: die maximale Anzahl der zu berücksichtigenden Qubits (der Standardwert ist 3).
Zum Beispiel:
import math from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import UnitaryGate from qiskit.quantum_info import Operator from qiskit.transpiler.passes import UnitarySynthesis # clifford unitary over 2 qubits c2 = QuantumCircuit(2) c2.h(0) c2.rz(math.pi / 4, 1) c2.rz(math.pi / 4, 1) c2.sdg(1) uc2 = UnitaryGate(Operator(c2).data) # non-clifford unitary over 2 qubits n2 = QuantumCircuit(2) n2.h(0) n2.rz(math.pi / 4, 1) n2.sdg(1) un2 = UnitaryGate(Operator(n2).data) # quantum circuit with two unitary gates qc = QuantumCircuit(3) qc.append(uc2, [2, 1]) qc.append(un2, [0, 2]) transpiled = UnitarySynthesis(method="clifford")(qc) transpiled.draw("mpl")
Durch die Ausführung des obigen Codes wird das erste unitäre Gatter in Clifford-Gatter umstrukturiert, während das zweite Gatter unverändert bleibt.
Wenn wir das obige Beispiel wie folgt abändern:
config = {"min_qubits": 3} transpiled = UnitarySynthesis(method="clifford", plugin_config=config)(qc)dann bleiben beide Unitary Gates unverändert.
Visualisierungsfunktionen
-
Einführung von benutzerdefinierten Stilen für die
dag_drawer()funktion. Damit können Sie dem Parameterstyleein Wörterbuch mit benutzerdefinierten Attributen übergeben, die den Stil des DAG, den die Funktion zurückgibt, ändern. Zum Beispiel:from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.converters import circuit_to_dag from qiskit.visualization import dag_drawer q = QuantumRegister(3, 'q') c = ClassicalRegister(3, 'c') circ = QuantumCircuit(q, c) circ.h(q[0]) circ.cx(q[0], q[1]) circ.measure(q[0], c[0]) circ.rz(0.5, q[1]).c_if(c, 2) dag = circuit_to_dag(circ) style = { "inputnodecolor": "pink", "outputnodecolor": "lightblue", "opnodecolor": "red", } dag_drawer(dag, style=style)
Anmerkungen zu Upgrades
-
Die Bibliothek
python-dateutilist nicht länger eine Abhängigkeit von Qiskit. Seit Qiskit v2.0 verwendet nichts mehr in der Bibliothek diepython-dateutilund Qiskit ist eigentlich nicht mehr von der Bibliothek abhängig. In dieser Version wird es aus der Liste der Abhängigkeiten entfernt, so dass es nicht automatisch als Voraussetzung für die Verwendung von Qiskit installiert wird. Wenn Sie sich darauf verlassen haben, dass Qiskit dateutil als Abhängigkeit für Sie installiert, müssen Sie nun sicherstellen, dass Sie es manuell installieren (was bei direkten Abhängigkeiten die beste Vorgehensweise ist). -
sympyist keine Voraussetzung mehr für die Installation von Qiskit. Nach der Umstellung auf eine Rust-basierte symbolische Engine für dieParameterExpressionklasse sind die Verwendungen von SymPy auf einige Visualisierungsprogramme, denTemplateOptimizationtranspiler-Pass,ParameterExpression.sympify()(der ausdrücklich für die Interoperabilität von SymPy gedacht ist) undSparsePauliOp.simplify()wenn parametrisierte Koeffizienten verwendet werden. Diese Funktionalität wird nicht so häufig verwendet, so dass SymPy jetzt als optionale Abhängigkeit behandelt wird und diese Funktionen eineMissingOptionalLibraryErrorausnahme, wenn sie verwendet werden und SymPy nicht installiert ist. -
Die Abhängigkeit von
symengine, die für die Erstellung vonParameterExpressionobjekte verwendet wurde, wurde entfernt. Sie wurde durch eine interne symbolische Engine ersetzt und wird für die Kernfunktionen von Qiskit nicht mehr benötigt. Die einzige Ausnahme ist, dass symengine in die QPY-Formate 10, 11 und 12 eingebettet wurde, so dass es weiterhin erforderlich ist, wenn Sie diese Formate deserialisieren. Die Abhängigkeit von symengine fürqpy.load()wurde in 2.0.0 explizit optional gemacht, aber wenn Sie sich vorher darauf verlassen haben, dass symengine standardmäßig für diese Funktionalität installiert wird, müssen Sie es jetzt manuell installieren, um die Nutzlast zu laden. Wenn Sie mitParameterExpression.sympify()verwendet haben, um ein symengine-Ausdruck-Objekt aus einemParameterExpressionzu erhalten, wird jetzt einsympyAusdruck zurückgegeben. Wenn Sie dies mit symengine verwenden müssen, können Siesymengine.sympifynutzen, um densympy-Ausdruck in einen symengine-Ausdruck zu konvertieren.
Hinweise zur Aktualisierung von Schaltkreisen
-
Das
definitionattribut derHalfAdderGatewurde geändert, um internadder_ripple_r25()zu verwenden, um die Definition des Gatters für eine effizientere Schaltung ohne zusätzliche Qubits zu erzeugen. Wenn die alte Definition aus irgendeinem Grund gewünscht ist, können Sie stattdessen direkt dieadder_qft_d00()funktion verwenden, die eine Schaltung erzeugt, die dem entspricht, wasdefinitionin früheren Versionen zurückgeben würde. -
Der Schaltkreis, der von der
excitation_preserving()funktion undExcitationPreservingzurückgegebene Schaltung wird nun mit einer einzigenXXPlusYYGate. Dies ist eine Änderung gegenüber früheren Versionen, in denen einRXXGategefolgt von einemRYYGate. Diese neue Schaltungskonstruktion ist äquivalent, verwendet aber weniger Gatter, die alle erregungserhaltend sind, was per Definition einfacher ist. -
Die
definitionatribute mehrerer Standardtore wurden nach den folgenden Grundsätzen aktualisiert:- Wenn verfügbar, wird eine Definition, die Clifford-Gatter verwendet, gegenüber Definitionen bevorzugt, die Nicht-Clifford-Gatter enthalten.
- Wenn verfügbar, ist eine Definition mit Clifford+T-Gattern einer Definition vorzuziehen, bei der ein
UGate. - Die Verwendung von
PhaseGateist vorzuziehen gegenüberU1Gate. - Die Verwendung von
UGatewird gegenüber`U2Gateund`U3Gatebevorzugt.
Entscheidend ist, dass die folgende Invariante immer noch gilt: Durch rekursive Erweiterung der Gatterdefinitionen kann jedes Gatter letztlich nur durch die Basis
["cx", "u"]ausgedrückt werden. Die Definitionen aller Standardgatter sind alle gleichwertig, so dass sich die Semantik der Gatter nicht ändert, nur die genaue Schaltungskonstruktion, die für einige Gatter zurückgegeben wird, ist nicht mehr genau dieselbe. Diese Änderung war notwendig, um die Clifford+T-Transpilierung zu unterstützen. -
Qiskit verwendet nun seine eigene, auf Rust basierende Bibliothek für symbolische Ausdrücke, um die Interna von
ParameterExpressionundParameter. Da es sich um eine neue Implementierung des Kerns der symbolischen Mathematik handelt, die fürParameterExpressionverwendet wird, kann es geringfügige Unterschiede im genauen Verhalten einiger Funktionen geben. Sie sollte immer gleichwertige Ergebnisse für die dokumentierte API liefern. Bitte melden Sie sich, wenn Sie Probleme mit der Korrektheit feststellen.
Hinweise zum Upgrade der C-API
-
Die Art und Weise, wie komplexe Zahlen in der C-API von Qiskit dargestellt werden, hat sich geändert. Zuvor war
QkComplex64ein compilerabhängiger Typendef, der es ermöglichte, native komplexe Typen per Zeiger an die API von Qiskit zu übergeben (z. B. alsdouble complex*). Das war zwar praktisch, aber dieser Ansatz beruhte auf Annahmen zur Speicheraufteilung, die nicht unbedingt garantiert sind.Qiskit v2.1 stellt nun
QkComplex64 { double re; double im; }als Struktur dar, um sicherzustellen, dass das Speicherlayout immer kompatibel ist und um eine breitere Compilerunterstützung zu gewährleisten. Der Einfachheit halber werden die compilerabhängigen Konverterqk_complex64_from_nativeundqk_complex64_to_nativebereitgestellt, die eine Umwandlung von struct in eine native komplexe Zahl ermöglichen. Beachten Sie, dass diese nur auf Plattformen funktionieren, diedouble complexunterstützen oder für MSVC-Compiler, die_Dcomplexverwenden.Zum Beispiel:
#include <qiskit.h> #include <math.h> #include <stdio.h> #include <complex.h> int main(int argc, char *argv[]) { // platform-independent constructions: QkComplex64 coeff = {5.0, 3.0}; // ... or using converter // double complex native = 5.0 + I * 3; // uses C11 standard, does not work on MSVC // QkComplex64 coeff = qk_complex64_from_native(&native); // convert from native uint32_t num_qubits = 100; QkObs *obs = qk_obs_zero(num_qubits); QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z}; uint32_t indices[3] = {0, 1, 2}; QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits}; qk_obs_add_term(obs, &term); printf("num_qubits: %u\n", qk_obs_num_qubits(obs)); printf("num_terms: %lu\n", qk_obs_num_terms(obs)); qk_obs_free(obs); return 0; }
QPY-Upgrade-Hinweise
- Die Standard-QPY-Version, die von
qpy.dump()ausgegebene Standard-QPY-Version wurde auf die neueste QPY-Version 15 geändert. Wenn Sie aus irgendeinem Grund eine ältere Version des Formats erzeugen müssen, können Sie mit dem Schlüsselwortargumentversionaufqpy.dump()verwenden, um eine ältere Version zu erzeugen.
Hinweise zum Upgrade der Synthese
-
Das Serialisierungsformat für grundlegende Approximationen in den Solovay-Kitaev-Algorithmen wurde von
.npyauf ein anderes binäres Format geändert, das auf Rustsserdeundbincodebasiert. Alle Routinen, die grundlegende Näherungswerte laden (wiegenerate_basic_approximations(),SolovayKitaevDecomposition.load_basic_approximations()oder der Initialisierer vonSolovayKitaev) unterstützen nach wie vor das Laden des Legacy-Formats. Jede neue Datei wird jedoch in dem neuen Format gespeichert. Wenn Sie das alte Format verwendet haben, sollten Sie ein Downgrade von Qiskit auf < 2.2 durchführen und die erforderlichen Dateien speichern. -
Die Standardwerte für
SolovayKitaev(und verwandte Klassen) wurden aufdepth=12undreps=5erhöht. Das liegt daran, dass die zugrundeliegende Implementierung jetzt in Rust ist, was uns erlaubt, die Standardpräzision zu erhöhen, während sie immer noch deutlich schneller ist als die vorherige Python Version.
Hinweise zum Transpiler-Upgrade
-
Die eingebauten Layout-Plugins für die derzeitigen Passmanager enthalten nicht mehr ihre Hauptkomponente (z. B. eine
SabreLayoutinstanz für die "Säbel"-Bühne ), wenn keine Kopplungsbeschränkungen angegeben sind. Bisher konstruierten die Plugins ungültige Instanzen ihrer Layout-Passes, in der Annahme, dass eine separate Logik die Ausführung der Passes und das Auslösen von Exceptions verhindern würde.Dies sollte keine sinnvolle Auswirkung auf die Verwendung der voreingestellten Pass-Manager oder der Plugins haben, da es schon bisher nie gültig war, die Pässe in einem ungültigen Zustand aufzurufen.
Hinweise zu veralteten Versionen
-
Die Unterstützung für die Ausführung von Qiskit mit Python 3.9 ist veraltet und wird in der Qiskit v2.3 Version entfernt. Die Version 2.3.0 ist die erste Version, nachdem Python 3.9 das Ende seiner Lebensdauer erreicht hat und nicht mehr unterstützt wird [1]. Das bedeutet, dass Sie ab der Version 2.3.0 die von Ihnen verwendete Version Python auf Python 3.9 oder höher aktualisieren müssen.
Veraltete Schaltungen
-
Die Schaltkreisbibliothek wurde in der Version v1.3 von Qiskit einem Refactoring unterzogen, bei dem Alternativen für Objekte des Typs
QuantumCircuitbereitgestellt wurden, die entweder eineInstructionoder eine Python Funktion für die Konstruktion sind. Dieses Refactoring ermöglicht es dem Compiler, über High-Level-Anweisungen nachzudenken, und reduziert den Overhead für Schaltungen, die keine High-Level-Optimierungen erfordern.Alle
QuantumCircuitunterklassen sind nun veraltet und werden durch ihre Alternativen ersetzt, die in Qiskit v1.3 eingeführt wurden. In diesem Zusammenhang wird auch die BasisklasseBlueprintCircuitveraltet sein. Alle haben eine verlängerte Verfallsfrist und werden erst in Qiskit v3.0 entfernt.Die Klasse
BlueprintCircuithat keinen direkten Ersatz, sondern verwendet eineQuantumCircuitdirekt oder eine Funktion, die Schaltkreise erzeugt. Sieheqiskit.circuit.libraryfür weitere Einzelheiten, aber es folgen einige gängige Schaltungen und ihre Ersetzungen:QFT→QFTGateTwoLocal→n_local()(dies ist kein Tippfehler, diese Funktion deckt dieNLocalundTwoLocalfunktionalität)EfficientSU2→efficient_su2()RealAmplitudes→real_amplitudes()ZZFeatureMap→zz_feature_map()QuantumVolume→quantum_volume()EvolvedOperatorAnsatz→evolved_operator_ansatz()MCXGrayCode→synth_mcx_gray_code()MCXRecursive→synth_mcx_n_dirty_i15()MCXVChain→synth_mcx_n_clean_m15()
Fehlerkorrekturen
-
Es wurde ein Fehler in der
dag_drawer()funktion und derDAGCircuit.draw()methode, bei denen das Setzen des Schlüsselwortargumentsstyle=plainkeine Schaltkreisbeschriftungen für die Knoten der DAG in der Visualisierung anzeigte. -
Es wurde ein Fehler in der
QuantumCircuit.assign_parameters()methode behoben, bei dem Parameter, die nicht in der Schaltung verwendet und als Strings übergeben wurden, nicht ignoriert wurden, wenn das Argumentstrict=Falsegesetzt wurde. Weitere Einzelheiten finden Sie in Ausgabe #13933. -
Randfälle in der
MakefileKonfiguration für Windows behoben, bei denen die vordefinierte UmgebungsvariableOSnicht mit der Ausgabe desuname -sBefehls übereinstimmte. -
Behoben wurde das
nameattribut derOrGatebehoben, das zuvor fälschlicherweise auf die Zeichenkette"and"statt auf den erwarteten Wert"or"gesetzt war, der nun zurückgegeben wird. Dieser falsche Wert"and"stand im Konflikt mit demAndGate.nameund hätte möglicherweise zu verschiedenen Problemen bei der Verwendung vonOrgateund der Unterscheidung von einerAndGate. -
Es wurde ein Fehler in der Funktion
qpy.load()funktion, bei der die Deserialisierung von Schaltkreisen fehlschlagen konnte, deren Parameter an Parameter mit denselben Namen neu zugewiesen wurden. #13720, #13720 und #13720 behoben. -
Es wurde die
GenericBackendV2um jetzt auchBoxOpals unterstützter Anweisungstyp in der generiertenGenericBackendV2.targetwenn das Schlüsselwortargumentcontrol_flow=Trueim Konstruktor gesetzt ist. -
Bei der Synthese eines
MCXGategatters mit 3 Steuerelementen, benötigte die Synthesefunktionsynth_mcx_n_dirty_i15()ein zusätzliches Qubit, was zu einer Schaltung mit 5 Qubits führte (3 Kontroll-, 1 Ziel- und 1 Hilfsqubit). Der eigentliche Synthesealgorithmus macht jedoch keinen Gebrauch von diesem Hilfsqubit. Dieses Verhalten ist nun behoben: Die synthetisierte Schaltung besteht aus 4 Qubits (3 Kontroll- und 1 Zielbits), wodurch die Synthesefunktion in einer etwas größeren Anzahl von Fällen angewendet werden kann. -
Die
QuantumCircuit.draw()undcircuit_drawer()funktion wird nun dieBoxOpanweisungen in einerQuantumCircuitin der gleichen vertikalen Scheibe, wenn sich die vertikalen Spannen nicht überschneiden, werden jetzt in der gleichen vertikalen Scheibe gerendert, wenn möglich. -
Festgelegt wurde die
QuantumCircuit.draw()methode undcircuit_drawer()funktion im Modus"mpl"korrigiert, um beim Zeichnen von Instanzen in einem Feld weniger Leerraum innerhalb des linken Randes einzufügenBoxOpinstanzen in einemQuantumCircuit.
Sonstige Anmerkungen
-
Es wurde ein neues optionales zusätzliches Abhängigkeitsziel
qpy-compathinzugefügt. Dieses Ziel sollte verwendet werden, wenn Sie vorhabenqpydateien mit älteren QPY-Formaten zu laden. Das Ziel installiert zusätzliche Anforderungen, die zum Laden von QPY-Dateien mit Formatversionen < 13. If you are only using newer QPY format versions you do no need to install this. Theqpy.dump()only generates QPY > =13 verwendet werden. Dies ist nur für das Laden von Dateien erforderlich, die mit älteren (älter als 2.0.0 ) Qiskit-Versionen erzeugt wurden. Sie können diese neue optionale Variante mitpip install qiskit[qpy-compat]installieren. -
Die relativen Gewichte der "Basis"- und "Vorausschau"-Komponenten der
SabreSwapundSabreLayoutheuristiken wurden geändert, wenn die erweiterte Mengenverfolgung aktiv ist (wie es immer inSabreLayoutund ist standardmäßig inSabreSwap). Die heuristische Komponente, die sich auf den Abstand zwischen den Qubits in einem einzelnen Gatter in der vorderen Schicht bezieht, schwächt sich nun nicht mehr proportional zur Anzahl der Gatter in der vorderen Schicht ab; dieses Verhalten war eine historische Entscheidung, hat aber bei großen Schaltkreisen den unbeabsichtigten Effekt, dass die vordere Schicht fast ignoriert wird, was für die Effizienz katastrophal ist.Die daraus resultierenden Verbesserungen beim Routing dürften sich vor allem bei Schaltungen bemerkbar machen, die häufig in Schichten von mehr als 20 parallelen Zwei-Qubit-Gattern geschichtet werden können.