Qiskit 0.40 Versionshinweise
0.40.0
Mit dieser Version wird das Qiskit IBMQ-Provider-Projekt als Teil des Qiskit-Metapakets offiziell abgeschafft. Das bedeutet, dass pip install qiskit in einer zukünftigen Version nicht mehr automatisch qiskit-ibmq-provider enthalten wird. Wenn Sie derzeit qiskit als Abhängigkeit installieren oder auflisten, um qiskit-ibmq-provider zu erhalten, sollten Sie aktualisieren, um auch qiskit-ibmq-provider explizit einzuschließen. Dies geschieht in dem Maße, in dem sich das Qiskit-Projekt auf ein Modell zubewegt, bei dem das Paket qiskit nur noch die gemeinsame Kernfunktionalität für die Erstellung und Kompilierung von Quantenschaltungen, Programmen und Anwendungen enthält. Pakete, die auf diesem Kern aufbauen oder Qiskit mit Hardware oder Simulatoren verbinden, können als separate Pakete installiert werden.
Terra- 0.23.0
Vorspiel
Qiskit Terra 0.23.0 ist eine neue Version, die eine Vielzahl von neuen Funktionen und Fehlerbehebungen enthält. Die Highlights dieser Veröffentlichung sind:
Unterstützung für den Import von OpenQASM 3 Programmen und die Erstellung von
QuantumCircuitobjekten aus dem Eingabeprogramm über zwei neue Funktionenqiskit.qasm3.load()undqiskit.qasm3.loads().Verbesserungen an der Bibliothek der in Qiskit enthaltenen Synthesealgorithmen. Dazu gehören die folgenden neuen Synthesefunktionen:
Clifford-Synthese
Lineare Funktionssynthese:
Permutationssynthese:
SolovayKitaevDecompositionausführlich in: https://arxiv.org/abs/quant-ph/0505030Neue Plugins für
HighLevelSynthesis:
ACGSynthesisPermutationKMSSynthesisPermutationBasicSynthesisPermutationNeues Plugin für
UnitarySynthesisLeistungsverbesserungen für
SabreLayout. Der Pass ist nun hauptsächlich in Rust geschrieben, was zu einer Laufzeitverbesserung führen kann, aber die größere Verbesserung liegt in der Qualität der Ausgabe (im Durchschnitt werden wenigerSwapGategatter, die durchSabreSwap). Zum Beispiel, wenn SieSabreLayoutundSabreSwapauf Bernstein-Vazirani-Schaltungen, die auf dasFakeSherbrookebackend die folgenden Ergebnisse:![]()
Mit dieser Version wird auch die Unterstützung für die Ausführung mit Python 3.7 veraltet. Ein DeprecationWarning wird nun ausgegeben, wenn Sie Qiskit mit Python 3.7 ausführen. Die Unterstützung für Python 3.7 wird im Rahmen der Veröffentlichung von 0.25.0 (derzeit geplant für Juli 2023) entfernt werden. Zu diesem Zeitpunkt benötigen Sie Python 3.8 oder neuer, um Qiskit zu verwenden.
Neue Funktionen
-
Die Impulse in
qiskit.pulse.librarykann mit dem neuen Parameter
angleinitialisiert werden, so dass zwei Float-Parameter bereitgestellt werden können:ampundangle. Die Initialisierung mit komplexenampwird weiterhin unterstützt. -
Die Klasse
AdaptVQEklasse hat ein neues Attribut,eigenvalue_history, das dazu dient, die niedrigste erreichte Energie pro Iteration der AdaptVQE zu verfolgen. Zum Beispiel:from qiskit.algorithms.minimum_eigensolvers import VQE from qiskit.algorithms.minimum_eigensolvers.adapt_vqe import AdaptVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import EvolvedOperatorAnsatz from qiskit.opflow import PauliSumOp from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp from qiskit.utils import algorithm_globals excitation_pool = [ PauliSumOp( SparsePauliOp(["IIIY", "IIZY"], coeffs=[0.5 + 0.0j, -0.5 + 0.0j]), coeff=1.0 ), PauliSumOp( SparsePauliOp(["ZYII", "IYZI"], coeffs=[-0.5 + 0.0j, 0.5 + 0.0j]), coeff=1.0 ), PauliSumOp( SparsePauliOp( ["ZXZY", "IXIY", "IYIX", "ZYZX", "IYZX", "ZYIX", "ZXIY", "IXZY"], coeffs=[ -0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, 0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, ], ), coeff=1.0, ), ] ansatz = EvolvedOperatorAnsatz(excitation_pool, initial_state=self.initial_state) optimizer = SLSQP() h2_op = PauliSumOp.from_list( [ ("IIII", -0.8105479805373266), ("ZZII", -0.2257534922240251), ("IIZI", +0.12091263261776641), ("ZIZI", +0.12091263261776641), ("IZZI", +0.17218393261915543), ("IIIZ", +0.17218393261915546), ("IZIZ", +0.1661454325638243), ("ZZIZ", +0.1661454325638243), ("IIZZ", -0.2257534922240251), ("IZZZ", +0.16892753870087926), ("ZZZZ", +0.17464343068300464), ("IXIX", +0.04523279994605788), ("ZXIX", +0.04523279994605788), ("IXZX", -0.04523279994605788), ("ZXZX", -0.04523279994605788), ] ) algorithm_globals.random_seed = 42 calc = AdaptVQE(VQE(Estimator(), ansatz, self.optimizer)) res = calc.compute_minimum_eigenvalue(operator=h2_op) print(calc.eigenvalue_history)der zurückgegebene Wert von
calc.historysollte ungefähr[-1.85727503]sein, da es sich um eine einzige Iteration handelt. -
Die Laufzeitprotokollierung bei der Ausführung des Programms
AdaptVQEwurde verbessert. Wenn die Klasse jetzt ausgeführt wird, werden Protokollmeldungen der EbenenDEBUGundINFOausgegeben, während die Klasse läuft. -
Es wurde ein neuer Transpiler-Durchgang
CollectAndCollapsehinzugefügt, um Blöcke von Knoten in einem Schaltkreis zu sammeln und zu konsolidieren. Dieser Pass ist als allgemeine Basisklasse für die kombinierte Sammlung und Konsolidierung von Blöcken gedacht. Um ganz allgemein zu sein, wird die Arbeit des Sammelns und Zusammenlegens der Blöcke durch Funktionen erledigt, die bei der Instanziierung des Passes bereitgestellt werden. Zum Beispiel wurde dieCollectLinearFunctionswurde aktualisiert, um vonCollectAndCollapsezu erben und sammelt Blöcke vonCXGateundSwapGatetoren und ersetzt jeden Block durch einLinearFunction. Das ProgrammCollectCliffordsdas nun ebenfalls aufCollectAndCollapsebasiert, sammelt Blöcke von "Clifford"-Gattern und ersetzt jeden Block durch einClifford.Die Schnittstelle unterstützt auch die Option
do_commutative_analysis, die es ermöglicht, die Kommutativität zwischen Gattern auszunutzen, um größere Blöcke von Knoten zu sammeln. Zum Beispiel, das Sammeln von Blöcken von CX-Gattern in der folgenden Schaltung:qc = QuantumCircuit(2) qc.cx(0, 1) qc.z(0) qc.cx(1, 0)die Verwendung von
do_commutative_analysisermöglicht die Konsolidierung der beiden CX-Tore, da das erste CX-Tor und das Z-Tor pendeln. -
Hinzufügen einer neuen Klasse
BlockCollector, die verschiedene Sammelstrategien implementiert, und einer neuen KlasseBlockCollapser, die verschiedene Kollabierungsstrategien implementiert. Derzeit umfasstBlockCollectordie Strategie, alle Gatter, die einer bestimmten Filterfunktion entsprechen, gierig zu sammeln (z. B. alle Clifford-Gatter), undBlockCollapserumfasst die Strategie, alle Gatter in einem Block zu einem einzigen Objekt zu konsolidieren (z. B. kann ein Block von Clifford-Gattern zu einem einzigen Objekt konsolidiert werdenClifford). -
Hinzufügen eines neuen
CollectCliffordstranspiler-Durchgang hinzugefügt, der Blöcke von Clifford-Gattern sammelt und diese Blöcke zuqiskit.quantum_info.Cliffordobjekten zusammenfasst. Dieser Pass erbt vonCollectAndCollapseund unterstützt insbesondere die Optiondo_commutative_analysis. Es unterstützt auch zwei zusätzliche Optionensplit_blocksundmin_block_size. Siehe die Versionshinweise fürCollectAndCollapseundCollectLinearFunctionsfür zusätzliche Details. -
Der
CollectLinearFunctionstranspiler-Pass hat mehrere neue Argumente in seinem Konstruktor:-
do_commutative_analysis: ermöglicht die Ausnutzung der Kommutativität zwischen den Gattern, um größere Blöcke von Knoten zu sammeln. -
split_blocks: ermöglicht die Aufteilung gesammelter Blöcke in Unterblöcke über disjunkte Teilmengen von Qubits. Zum Beispiel in der folgenden Schaltung:qc = QuantumCircuit(4) qc.cx(0, 2) qc.cx(1, 3) qc.cx(2, 0) qc.cx(3, 1) qc.cx(1, 3)kann der einzelne Block von CX-Gattern über Qubits
{0, 1, 2, 3}in zwei disjunkte Teilblöcke aufgeteilt werden, einen über Qubits{0, 2}und den anderen über Qubits{1, 3}. -
min_block_size: Ermöglicht die Angabe der Mindestgröße des zu konsolidierenden Blocks; Blöcke mit weniger Gates werden nicht geändert. Zum Beispiel in der folgenden Schaltung:qc = QuantumCircuit(4) qc.cx(1, 2) qc.cx(2, 1)die beiden CX-Gatter werden zusammengelegt, wenn
min_block_size1 oder 2 ist, und bleiben unverändert, wennmin_block_size3 oder größer ist.
-
-
Hinzufügen eines tiefenwirksamen Synthesealgorithmus
synth_cnot_depth_line_kms()für lineare reversible SchaltungenLinearFunctionüber die lineare Nearest-Neighbor-Architektur, in Anlehnung an das Papier: https://arxiv.org/abs/quant-ph/0701194. -
Die Methode
DAGCircuit.replace_block_with_op()methode gibt nun den neuenDAGOpNodezurück, das beim Ersetzen des Blocks erstellt wird. Zuvor gab der Aufruf dieser Methode nichts zurück. -
Hinzufügen eines tiefenwirksamen Synthesealgorithmus
synth_permutation_depth_lnn_kms()fürPermutationüber die lineare Nearest-Neighbor-Architektur, in Anlehnung an das Papier: https://arxiv.org/abs/quant-ph/0701194 -
Hinzufügen einer neuen Klasse
PermutationGatezur Darstellung von Permutationslogik als Schaltungselement. Im Gegensatz zu dem bestehendenPermutationschaltungsbibliothekselement, das eine statische Definition hatte, vermeidet diese neue Klasse die Synthese einer Permutationsschaltung, wenn sie deklariert wird. Dadurch wird die eigentliche Synthese zum Transpiler verzögert. Es ermöglicht auch die Verwendung verschiedener Algorithmen zur Synthese von Permutationen, die als High-Level-Synthese-Plugins für Permutationen verfügbar sind.Ein weiteres Hauptmerkmal der
PermutationGateist die Implementierung der Schnittstelle__array__zur effizienten Rückgabe einer unitären Matrix für eine Permutation. -
Mehrere High-Level-Synthese-Plugins für die Synthese von Permutationen hinzugefügt:
BasicSynthesisPermutation: gilt für vollständig vernetzte Architekturen und basiert auf Sortierung. Dies ist der bisher verwendete Algorithmus zur Konstruktion von Quantenschaltungen für Permutationen.ACGSynthesisPermutation: gilt für vollständig verbundene Architekturen, basiert aber auf der Methode von Alon, Chung und Graham. Es synthetisiert jede Permutation in der Tiefe 2 (gemessen in SWAPs).KMSSynthesisPermutation: gilt für lineare Architekturen mit nächsten Nachbarn und entspricht der kürzlich hinzugefügten Methode von Kutin, Moulton und Smithline.
Zum Beispiel:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PermutationGate from qiskit.transpiler import PassManager from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis from qiskit.transpiler.passes.synthesis.plugin import HighLevelSynthesisPluginManager # Create a permutation and add it to a quantum circuit perm = PermutationGate([4, 6, 3, 7, 1, 2, 0, 5]) qc = QuantumCircuit(8) qc.append(perm, range(8)) # Print available plugin names for synthesizing permutations # Returns ['acg', 'basic', 'default', 'kms'] print(HighLevelSynthesisPluginManager().method_names("permutation")) # Default plugin for permutations # Returns a quantum circuit with size 6 and depth 3 qct = PassManager(HighLevelSynthesis()).run(qc) print(f"Default: {qct.size() = }, {qct.depth() = }") # KMSSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 18 and depth 6 # but adhering to the linear nearest-neighbor architecture. qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("kms", {})]))).run(qc) print(f"kms: {qct.size() = }, {qct.depth() = }") # BasicSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 6 and depth 3 qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("basic", {})]))).run(qc) print(f"basic: {qct.size() = }, {qct.depth() = }") # ACGSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 6 and depth 2 qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("acg", {})]))).run(qc) print(f"acg: {qct.size() = }, {qct.depth() = }") -
Neue Klassen für die Algorithmen Quantum Fisher Information (QFI) und Quantum Geometric Tensor (QGT) mit
primitives,qiskit.algorithms.gradients.QFIundqiskit.algorithms.gradients.LinCombQGTzum Modul Gradienten hinzugefügt:qiskit.algorithms.gradients. Zum Beispiel:from qiskit.circuit import QuantumCircuit, Parameter from qiskit.algorithms.gradients import LinCombQGT, QFI estimator = Estimator() a, b = Parameter("a"), Parameter("b") qc = QuantumCircuit(1) qc.h(0) qc.rz(a, 0) qc.rx(b, 0) parameter_value = [[np.pi / 4, 0]] qgt = LinCombQGT(estimator) qgt_result = qgt.run([qc], parameter_value).result() qfi = QFI(qgt) qfi_result = qfi.run([qc], parameter_value).result() -
Ein neues Schlüsselwortargument,
derivative_type, wurde dem Konstruktor für dieLinCombEstimatorGradient. Dieses Argument nimmt einDerivativeTypeenum auf, mit dem angegeben werden kann, ob nur die realen oder imaginären Teile des Gradienten berechnet werden sollen. -
Eine neue Option
circuit_reverse_bitswurde zur Benutzerkonfigurationsdatei hinzugefügt. Dies ermöglicht es den Benutzern, einen Booleschen Wert für das bevorzugte Standardverhalten desreverse_bitsArguments der Schaltkreiszeichner zu setzenQuantumCircuit.draw()undcircuit_drawer(). Fügen Sie z. B. der Benutzerkonfigurationsdatei am Standardspeicherort~/.qiskit/settings.confeinen Abschnitt mit hinzu:[default] circuit_reverse_bits = Trueändert die Standardeinstellung so, dass die Bits in umgekehrter Reihenfolge angezeigt werden.
-
Eine neue Klasse hinzugefügt
Z2Symmetrieszuqiskit.quantum_infohinzugefügt, die verwendet wird, um alle Symmetrien aus einer Eingabe zu identifizierenSparsePauliOp. -
Eine neue Impulsrichtlinie hinzugefügt
TimeBlockade. Diese Anweisung verhält sich fast genauso wie die Anweisung delay, wird aber vor der Ausführung entfernt. Diese Richtlinie ist für die interne Verwendung im Pulse Builder vorgesehen und hilftScheduleBlockanweisungen mit absoluten Zeitintervallen darzustellen. Dies ermöglicht es dem Pulsersteller,ScheduleinScheduleBlockumzuwandeln, anstatt mitCallanweisungen. -
Hinzufügen von primitiv-aktivierten Algorithmen für die Variationsquantenzeitentwicklung, die die Schnittstelle für die Quantenzeitentwicklung implementieren. Die
qiskit.algorithms.VarQRTEklasse wird für reelle und dieqiskit.algorithms.VarQITEklasse wird für die imaginäre Quantenzeitentwicklung nach einem übergebenen Variationsprinzip verwendet.Jeder Algorithmus akzeptiert ein Variationsprinzip, das die
ImaginaryVariationalPrincipleabstrakte Schnittstelle implementiert. Die folgenden Implementierungen sind enthalten:Zum Beispiel:
from qiskit.algorithms import TimeEvolutionProblem, VarQITE from qiskit.algorithms.time_evolvers.variational import ImaginaryMcLachlanPrinciple from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import SparsePauliOp import numpy as np observable = SparsePauliOp.from_list( [ ("II", 0.2252), ("ZZ", 0.5716), ("IZ", 0.3435), ("ZI", -0.4347), ("YY", 0.091), ("XX", 0.091), ] ) ansatz = EfficientSU2(observable.num_qubits, reps=1) init_param_values = np.zeros(len(ansatz.parameters)) for i in range(len(ansatz.parameters)): init_param_values[i] = np.pi / 2 var_principle = ImaginaryMcLachlanPrinciple() time = 1 evolution_problem = TimeEvolutionProblem(observable, time) var_qite = VarQITE(ansatz, var_principle, init_param_values) evolution_result = var_qite.evolve(evolution_problem) -
Regeln für die Konvertierung von
XXPlusYYGateundXXMinusYYGatein andere Gates auf derSessionEquivalenceLibrary. Dies ermöglicht die Ausführungtranspile()die auf ein Backend oderTargetdas diese Gates verwendet. -
Zwei neue Fake-Backends hinzugefügt,
FakePragueundFakeSherbrookezumqiskit.providers.fake_providermodul.FakePraguebietet ein Backend mit einem Schnappschuss der Eigenschaften des IBM Prague Egret R1 Backends undFakeSherbrookebietet ein Backend mit einem Schnappschuss der Eigenschaften des IBM Sherbrooke Eagle R3 Backends. -
Ein neues Schlüsselwortargument,
allow_unknown_parameters, wurde zu denParameterExpression.bind()undParameterExpression.subs()methoden. Wenn dieses neue Argument gesetzt ist, kann ein Wörterbuch mit unbekannten Parametern an diese Methoden übergeben werden, ohne dass ein Fehler ausgelöst wird. Zuvor führte dies immer zu einer Fehlermeldung, ohne dass es eine Möglichkeit gab, dieses Verhalten zu deaktivieren. -
Die Methode
BaseEstimator.run()das Argumentobservablesder Methode akzeptiert nun zusätzlich zu den anderen bereits akzeptierten Typen den Eingabetypstroder eine Folge vonstr. Wenn sie verwendet wird, sollte das Format der Eingabestrings mit der Pauli-String-Darstellung übereinstimmen, die vom Konstruktor fürPauliobjekte akzeptiert. -
Hinzufügen einer neuen Konstruktor-Methode
QuantumCircuit.from_instructions()hinzugefügt, die die Erstellung einesQuantumCircuitobjekts aus einer Iterable von Anweisungen ermöglicht. Zum Beispiel:from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit.circuit.quantumcircuitdata import CircuitInstruction from qiskit.circuit import Measure from qiskit.circuit.library import HGate, CXGate qr = QuantumRegister(2) cr = ClassicalRegister(2) instructions = [ CircuitInstruction(HGate(), [qr[0]], []), CircuitInstruction(CXGate(), [qr[0], qr[1]], []), CircuitInstruction(Measure(), [qr[0]], [cr[0]]), CircuitInstruction(Measure(), [qr[1]], [cr[1]]), ] circuit = QuantumCircuit.from_instructions(instructions) circuit.draw("mpl")
-
Die Klasse
Cliffordklasse nimmt jetzt ein optionalescopySchlüsselwortargument in ihrem Konstruktor auf. BeiFalsewird einStabilizerTableals Eingabe nicht kopiert, sondern direkt verwendet. Dies kann Leistungsvorteile bringen, wenn die Daten in der Tabelle niemals auf andere Weise verändert werden. -
Die Leistung von
Clifford.compose()wurde für alle Zahlen von Qubits erheblich verbessert. Für Operatoren mit 20 Qubits liegt die Beschleunigung in der Größenordnung des 100-fachen. -
Hinzufügen einer neuen Synthesefunktion
synth_clifford_layers()zum Synthetisieren einerCliffordin Schichten. Der Algorithmus basiert auf S. Bravyi, D. Maslov, Hadamard-freie Schaltungen legen die Struktur der Clifford-Gruppe offen, arxiv:2003.09412. Dadurch wird der Clifford-Baustein in 8 Schichten von Gattern zerlegt, darunter zwei Schichten von CZ-Gattern und eine Schicht von CX-Gattern. Eine 5-Qubit-Clifford-Schaltung wird beispielsweise in die folgenden Schichten zerlegt:┌─────┐┌─────┐┌────────┐┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐ q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_1: ┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_2: ┤2 S2 ├┤2 CZ ├┤2 CX_dg ├┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_3: ┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_4: ┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├ └─────┘└─────┘└────────┘└─────┘└─────┘└─────┘└─────┘└────────┘Diese Methode ermöglicht die Zerlegung von a
Cliffordin die 2-Qubit-Tiefe für die LNN-Konnektivität (Linear Nearest Neighbour) zu zerlegen. -
Die Rückgabetypen für die
power()methoden mehrerer Standardbibliotheks-Gate-Klassen wurden aktualisiert, um spezifischere Gate-Objekte zurückzugeben, die zu einer weniger verlustbehafteten und effizienteren Ausgabe führen. Zum Beispiel gibt die Ausführung vonpower()gibt jetzt eineIGateinstanz anstelle vonUnitaryGatezurück, wie es vorher der Fall war.Die vollständige Liste der verbesserten Nachrichtenarten lautet wie folgt:
-
Die
EquivalenceLibrarywird nun intern alsPyDiGraphdargestellt. Auf dieses zugrunde liegende Graph-Objekt kann über das neuegraphattribut zugreifen. Dieses Attribut ist für die interne Verwendung in Qiskit vorgesehen und sollte daher immer kopiert werden, bevor es vom Benutzer geändert wird, um eine mögliche Beschädigung des internen Äquivalenzgraphen zu verhindern. -
Die
Operator.from_circuit()konstruktormethode kehrt nun die durch die Routing/Swap-Mapping-Phase des Transpilers verursachte Ausgabe-Permutation um. Wenn in eine transpilierte Schaltung Swap-Gatter eingefügt wurden, wird die Ausgangsmatrix standardmäßig die umgekehrte Permutation aufweisen, so dass die zurückgegebene Matrix der ursprünglichen, nicht transpilierten Schaltung entspricht. Wenn Sie dieses Standardverhalten deaktivieren möchten, kann das Schlüsselwortargumentignore_set_layoutaufTruegesetzt werden, um dies zu tun (zusätzlich zum vorherigen Verhalten, das ursprüngliche Layout aus der Transpilierung zu ignorieren). Wenn Sie ein endgültiges Layout manuell festlegen möchten, können Sie das neue Schlüsselwortargumentfinal_layoutverwenden, um einLayoutobjekt übergeben, das für die Ausgabe-Permutation verwendet wird. -
Unterstützung für den
GateDirectiontranspilerpasses zur Behandlung der symmetrischenRXXGate,RYYGate, undRZZGategatter. Der Pass behandelt diese Gates nun korrekt und kehrt die qargs-Reihenfolge einfach um, ohne weitere Änderungen vorzunehmen. -
Unterstützung für die Verwendung des Python Potenzierungsoperators,
**, mitGateobjekten wird nun unterstützt. Dies ist gleichbedeutend mit der Ausführung derGate.power()methode auf das Objekt anzuwenden.Zum Beispiel:
from qiskit.circuit.library import XGate sx = XGate() ** 0.5 -
Neue Impulsform
GaussianSquareDragzum Modul hinzugefügtqiskit.pulse.librarymodul. Diese Impulsform ist ähnlich wieGaussianSquareverwendet aber dieDragform während des Anstiegs und Abfalls. Die Korrektur der DRAG-Pulsform kann einen Teil des Frequenzspektrums des Pulsanstiegs und -abfalls unterdrücken, was dazu beitragen kann, die Anregung von Spektator-Qubits zu vermeiden, wenn deren Frequenz nahe bei der Antriebsfrequenz des Pulses liegt. -
Ein neues Schlüsselwortargument,
method, wurde zu den Konstruktoren für dieFiniteDiffEstimatorGradientundFiniteDiffSamplerGradientklassen. Das Argumentmethodakzeptiert eine Zeichenkette zur Angabe der Berechnungsmethode, die für den Gradienten verwendet werden soll. Es stehen drei Methoden zur Verfügung:"central","forward"und"backward". Die Definition der Methoden sind:MethodeBerechnung"central""forward""backward"wobei das Offset-Epsilon ist.
-
Alle Gradientenklassen in
qiskit.algorithms.gradientsbehalten nun unparametrisierte Operationen bei, anstatt zu versuchen, sie abzurollen. Dadurch können Gradienten auf benutzerdefinierten, undurchsichtigen Gattern ausgewertet werden, die von einzelnen Primitiven verarbeitet werden können, und es wird eine höhere Abstraktionsebene für optimierte Synthese und Kompilierung beibehalten, nachdem die Gradientenschaltungen konstruiert wurden. -
Hinzugefügt wurde ein
TranslateParameterizedGatesdurchgang hinzugefügt, um nur parametrisierte Gatter in einer Schaltung auf eine bestimmte Basis abzubilden, nicht parametrisierte Gatter jedoch unberührt zu lassen. Der Durchlauf versucht zunächst das Abrollen und übersetzt schließlich, wenn ein parametrisiertes Tor nicht weiter abgerollt werden kann. -
Der
CollectCliffordstranspiler-Pass wurde erweitert, um Blöcke von "Clifford-Gattern" zu sammeln und zu kombinierenCliffordobjekten zu sammeln und zu kombinieren, wobei "clifford gates" nun auch Objekte des TypsLinearFunction,Clifford, undPauliGate. Zum Beispiel:from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import LinearFunction, PauliGate from qiskit.quantum_info.operators import Clifford from qiskit.transpiler.passes import CollectCliffords from qiskit.transpiler import PassManager # Create a Clifford cliff_circuit = QuantumCircuit(2) cliff_circuit.cx(0, 1) cliff_circuit.h(0) cliff = Clifford(cliff_circuit) # Create a linear function lf = LinearFunction([[0, 1], [1, 0]]) # Create a pauli gate pauli_gate = PauliGate("XYZ") # Create a quantum circuit with the above and also simple clifford gates. qc = QuantumCircuit(4) qc.cz(0, 1) qc.append(cliff, [0, 1]) qc.h(0) qc.append(lf, [0, 2]) qc.append(pauli_gate, [0, 2, 1]) qc.x(2) # Run CollectCliffords transpiler pass qct = PassManager(CollectCliffords()).run(qc)Alle Gates werden gesammelt und zu einem einzigen zusammengefasst
Clifford. Die endgültige Schaltung besteht also aus einem einzigenCliffordobjekt. -
CouplingMapist nun implizit iterierbar, wobei die Iteration identisch ist mit der Iteration durch die Ausgabe vonCouplingMap.get_edges(). Mit anderen Worten,from qiskit.transpiler import CouplingMap coupling = CouplingMap.from_line(3) list(coupling) == list(coupling.get_edges())wird nun wie erwartet funktionieren, ebenso wie andere Iterationen. Dies ist eine rein syntaktische Vereinfachung.
-
Eine neue Funktion wurde hinzugefügt
synth_cnot_count_full_pmh()hinzugefügt, die zur Synthese von linearen reversiblen Schaltungen für All-to-All-Architekturen unter Verwendung der Patel-, Markov- und Hayes-Methode verwendet wird. Diese Funktion ist identisch mit der verfügbaren Funktionqiskit.transpiler.synthesis.cnot_synth(), 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. -
InstructionScheduleMapwurde aktualisiert, um Backend-Kalibrierungsdaten im Format PulseQobj JSON zu speichern und die Konvertierung aufzurufen, wenn zum ersten Mal auf die Daten zugegriffen wird, d. h. eine "Lazy Conversion". Diese interne Logikaktualisierung verbessert die Leistung des Lade-Backends drastisch, insbesondere bei vielen Kalibrierungseinträgen. -
Es wurde ein neues Modul
qiskit.pulse.calibration_entrieshinzugefügt. Diese enthält mehrere Wrapper-Klassen für verschiedene Impulsplan-Darstellungen.ScheduleDefCallableDefPulseQobjDef
Diese Klassen implementieren die Methoden
get_schedule()undget_signature(), die den Impulsplan bzw. die zuzuweisenden Parameternamen zurückgeben. Diese Klassen werden intern von derInstructionScheduleMapoder BackendTargetverwaltet und werden daher in einem typischen Benutzerprogramm nicht angezeigt. -
Es wurde eine neue Unterklasse
ScalableSymbolicPulseeingeführt, die eine Unterklasse vonSymbolicPulse. Die neue Unterklasse verhält sich genauso wieSymbolicPulsemit der Ausnahme, dass sie davon ausgeht, dass die Hüllkurve des Impulses einen komplexen Amplituden-Vorfaktor der Form enthält. Diese Hüllkurvenform passt zu vielen gängigen Impulsen, einschließlich aller Impulse in der Qiskit Pulse-Bibliothek (die in dieser Version auch in die Darstellungamp,anglekonvertiert wurden).Die neue Unterklasse beseitigt die nicht eindeutige Natur der Darstellung
amp,angleund vergleicht die Impulse korrekt nach ihrer komplexen Amplitude. -
Ein neues Schlüsselwortargument,
dtype, wurde derPauliSumOp.from_list()methode. Wenn angegeben, kann dieses Argument verwendet werden, um diedtypedes Numpy-Arrays anzugeben, das für dieSparsePauliOpdas intern von der konstruiertenPauliSumOp. -
Es wurde Unterstützung für den Import von OpenQASM 3 Programmen in Qiskit hinzugefügt. Dies ist am einfachsten mit den Funktionen
qasm3.loads()undqasm3.load()um ein Programm direkt aus einer Zeichenkette bzw. indirekt aus einem Dateinamen zu laden. Zum Beispiel kann man jetzt tun:from qiskit import qasm3 circuit = qasm3.loads(""" OPENQASM 3.0; include "stdgates.inc"; qubit q; qubit[5] qr; bit c; bit[5] cr; h q; c = measure q; if (c) { h qr[0]; cx qr[0], qr[1]; cx qr[0], qr[2]; cx qr[0], qr[3]; cx qr[0], qr[4]; } else { h qr[4]; cx qr[4], qr[3]; cx qr[4], qr[2]; cx qr[4], qr[1]; cx qr[4], qr[0]; } cr = measure qr; """)Dadurch wird das Programm in eine
QuantumCircuitinstanz in die Variablecircuit.Zunächst werden nicht alle Funktionen von OpenQASM 3 unterstützt, da Qiskit noch nicht über eine Möglichkeit verfügt, fortgeschrittene klassische Datenverarbeitung darzustellen. Die Fähigkeiten des Importeurs werden zusammen mit den Fähigkeiten des restlichen Qiskit wachsen. Die anfängliche Merkmalsmenge des Importeurs entspricht ungefähr der Menge der Merkmale, die der Exporteur ausgeben würde (
qasm3.dump()undqasm3.dumps()).Beachten Sie, dass die Unterstützung von OpenQASM 3 durch Qiskit nicht dazu gedacht ist, eine völlig verlustfreie Darstellung von
QuantumCircuits. Ziehen Sie dafür die Verwendung vonqiskit.qpy. -
Die
primitives-basierten Gradientenklassen, die durch dieBaseEstimatorGradientundBaseSamplerGradientdefinierten abstrakten Klassen wurden aktualisiert, um die Erweiterung der Basisschnittstelle zu vereinfachen. Es gibt drei neue interne Methoden, die überschrieben werden können:_preprocess(),_postprocess(), und_run_unique()._preprocess()ermöglicht einer Unterklasse die Anpassung der Eingangsgradientenschaltungen und -parameter,_postprocessermöglicht die Anpassung des Ausgangsergebnisses, und_run_uniqueermöglicht die Berechnung des Gradienten einer Schaltung mit eindeutigen Parametern. -
Der
SabreLayouttranspiler-Pass hat seine Leistung erheblich verbessert, da er in Rust neu geschrieben wurde. Im Rahmen dieser Neufassung wurde der Durchlauf von einem Analysedurchlauf in einen Transformationsdurchlauf umgewandelt, der sowohl Layout als auch Routing durchführt. Dies wurde getan, um nicht nur die Laufzeitleistung, sondern auch die Qualität der Ergebnisse zu verbessern. Die bisherige Funktionalität des Durchlaufs als Analysedurchlauf kann beibehalten werden, indem das Argumentrouting_passmanuell gesetzt oder das neue Argumentskip_routingverwendet wird. -
Der
SabreLayouttranspilerpass hat ein neues Konstruktorargumentlayout_trials. Dieses Argument wird verwendet, um zu kontrollieren, wie viele Zufallszahlengenerator-Samen versucht werdenSabreLayoutmit. Wenn diese Option aktiviert ist, wird der SABRE-Layout-Algorithmuslayout_trialsso oft wie möglich ausgeführt, und die beste Qualität (gemessen an der geringsten Anzahl der hinzugefügten Swap-Gates) wird ausgewählt. Diese Seed-Versuche werden parallel unter Verwendung von Multithreading ausgeführt, um den potenziellen Leistungsaufwand zu minimieren, der durch die mehrfache Ausführung des Layouts entsteht. Wenn dies nicht angegeben ist, wird standardmäßig dieSabreLayoutpass standardmäßig die Anzahl der physischen CPUs, die auf dem lokalen System verfügbar sind. -
Zwei neue Klassen hinzugefügt
SciPyRealEvolverundSciPyImaginaryEvolverdie Integrationsmethoden für die zeitliche Entwicklung eines Quantenzustandes implementieren. Der Wert und die Standardabweichung der Observablen sowie die Zeitpunkte, zu denen sie ausgewertet werden, können abgefragt werden alsTimeEvolutionResult.observablesundTimeEvolutionResult.times. Zum Beispiel:from qiskit.algorithms.time_evolvers.time_evolution_problem import TimeEvolutionProblem from qiskit.quantum_info import SparsePauliOp from qiskit.quantum_info.states.statevector import Statevector from qiskit.algorithms import SciPyImaginaryEvolver initial_state = Statevector.from_label("+++++") hamiltonian = SparsePauliOp("ZZZZZ") evolution_problem = TimeEvolutionProblem(hamiltonian, 100, initial_state, {"Energy":hamiltonian}) classic_evolver = SciPyImaginaryEvolver(num_timesteps=300) result = classic_evolver.evolve(evolution_problem) print(result.observables) -
Hinzufügen des
SolovayKitaevtranspiler-Passus hinzugefügt, um den Solovay-Kitaev-Algorithmus zur Annäherung von Ein-Qu-Bit-Unitarien unter Verwendung einer diskreten Gattermenge auszuführen. In Kombination mit dem Basisübersetzer kann so jede unitäre Schaltung in eine universelle diskrete Gattermenge umgewandelt werden, die fehlertolerant implementiert werden kann.Dieser Pass kann z.B. nach dem Kompilieren zu U- und CX-Toren verwendet werden:
from qiskit import transpile from qiskit.circuit.library import QFT from qiskit.transpiler.passes.synthesis import SolovayKitaev qft = QFT(3) # optimize to general 1-qubit unitaries and CX transpiled = transpile(qft, basis_gates=["u", "cx"], optimization_level=1) skd = SolovayKitaev() # uses T Tdg and H as default basis discretized = skd(transpiled) print(discretized.count_ops())Die Zerlegung kann auch mit dem unitären Synthese-Plugin verwendet werden, da die Methode "sk" im
UnitarySynthesistranspiler-Durchgang:from qiskit import QuantumCircuit from qiskit.quantum_info import Operator from qiskit.transpiler.passes import UnitarySynthesis circuit = QuantumCircuit(1) circuit.rx(0.8, 0) unitary = Operator(circuit).data unitary_circ = QuantumCircuit(1) unitary_circ.unitary(unitary, [0]) synth = UnitarySynthesis(basis_gates=["h", "s"], method="sk") out = synth(unitary_circ) out.draw('mpl')
-
Die Erzeugung von Zufallsschaltungen mit
qiskit.circuit.random.random_circuit()ist jetzt bei großen Schaltungen deutlich schneller. -
Die Erzeugung von Zufallsschaltungen mit
qiskit.circuit.random.random_circuit()gibt nun alle "Standard"-Gatter in Qiskits Schaltkreisbibliothek (qiskit.circuit.library). Dazu gehören zwei 4-Qubit-GatterC3SXGateundRC3XGateund die erlaubten Werte vonmax_operandswurden entsprechend erweitert. -
Der
Optimize1qGatesDecompositiontranspilerpass hat ein neues Schlüsselwortargument,target, in seinem Konstruktor. Dieses Argument kann verwendet werden, um einTargetobjekt anzugeben, das das Kompilierungsziel repräsentiert. Wenn es verwendet wird, überlagert es das Argumentbasis, um festzustellen, ob eine Anweisung in der Schaltung auf dem Ziel-Backend vorhanden ist. -
Der
UnrollCustomDefinitionstranspilerpass hat ein neues Schlüsselwortargument,target, in seinem Konstruktor. Dieses Argument kann verwendet werden, um einTargetobjekt anzugeben, das das Kompilierungsziel repräsentiert. Wenn es verwendet wird, überlagert es das Argumentbasis_gates, um festzustellen, ob eine Anweisung in der Schaltung auf dem Ziel-Backend vorhanden ist. -
Hinzufügen der
ReverseEstimatorGradientklasse für eine klassische, schnelle Auswertung von Erwartungswertgradienten auf Basis von Backpropagation oder Reverse-Mode-Gradienten. Diese Klasse verwendet Zustandsvektoren und liefert somit exakte Gradienten, skaliert aber exponentiell mit der Systemgröße. Es ist für die schnelle Referenzberechnung kleinerer Systemgrößen konzipiert. Es kann zum Beispiel verwendet werden als:from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import SparsePauliOp from qiskit.algorithms.gradients import ReverseEstimatorGradient observable = SparsePauliOp.from_sparse_list([("ZZ", [0, 1], 1)], num_qubits=10) circuit = EfficientSU2(num_qubits=10) values = [i / 100 for i in range(circuit.num_parameters)] gradient = ReverseEstimatorGradient() result = gradient.run([circuit], [observable], [values]).result() -
Ein neues Schlüsselwortargument,
use_dag, wurde zum Konstruktor für dieOneQubitEulerDecomposerklasse. Wennuse_dagaufTruegesetzt ist, ist die Ausgabe des Dekomposers einDAGCircuitobjekt statt einesQuantumCircuitobjekt. Dies ist nützlich für Transpilerübergänge, dieOneQubitEulerDecomposer(wie zum BeispielOptimize1qGatesDecomposition), da das direkte Arbeiten mit einerDAGCircuitden Overhead der Konvertierung zwischenQuantumCircuitundDAGCircuit. -
Für Analysedurchläufe wurde die Möglichkeit hinzugefügt, benutzerdefinierte heuristische Gewichtungen für die
VF2LayoutundVF2PostLayouttranspiler-Durchläufe festzulegen. Wenn ein Analysedurchgang den Schlüsselvf2_avg_error_mapim Eigenschaftssatz setzt, wird sein Wert für die Fehlergewichte anstelle der Fehlerquoten aus dem Backend verwendetTarget(oderBackendPropertiesfürBackendV1). Der Wert sollte eineErrorMapInstanz sein, wobei jeder Wert die durchschnittliche Fehlerrate für alle 1 oder 2 Qubit Operationen auf diesen Qubits darstellt. Wenn ein WertNaNist, wird die entsprechende Kante als ideale Kante (oder Qubit für 1q Operationen) behandelt. Zum Beispiel wird eine Fehlerkarte erstellt als:from qiskit.transpiler.passes.layout.vf2_utils import ErrorMap error_map = ErrorMap(3) error_map.add_error((0, 0), 0.0024) error_map.add_error((0, 1), 0.01) error_map.add_error((1, 1), 0.0032)beschreibt ein 2-Qubit-Target, bei dem die durchschnittliche 1q -Fehlerrate
0.0024auf Qubit 0 und0.0032auf Qubit 1 ist, die durchschnittliche 2q -Fehlerrate für Gatter, die auf (0, 1) arbeiten, ist 0.01, und (1, 0) wird vom Target nicht unterstützt. Dies wird für die Bewertung verwendet, wenn es für den Schlüsselvf2_avg_error_mapin der Eigenschaft festgelegt ist, wennVF2LayoutundVF2PostLayoutausgeführt werden. Zum Beispiel:from qiskit.transpiler import AnalysisPass, PassManager, Target from qiskit.transpiler.passes import VF2Layout from qiskit.transpiler.passes.layout.vf2_utils import ErrorMap from qiskit.circuit.library import CZGate, UGate from qiskit.circuit import Parameter class CustomVF2Scoring(AnalysisPass): """Set custom score for vf2.""" def run(self, dag): error_map = ErrorMap(3) error_map.add_error((0, 0), 0.0024) error_map.add_error((0, 1), 0.01) error_map.add_error((1, 1), 0.0032) self.property_set["vf2_avg_error_map"] = error_map target = Target(num_qubits=2) target.add_instruction( UGate(Parameter('theta'), Parameter('phi'), Parameter('lam')), {(0,): None, (1,): None} ) target.add_instruction( CZGate(), {(0, 1): None} ) vf2_pass = VF2Layout(target=target, seed=1234568942) pm = PassManager([CustomVF2Scoring(), vf2_pass])Das wird laufen
VF2Layoutmit dem benutzerdefinierten Scoring vonerror_mapfür ein 2-QubitTargetdas keine Fehlerraten enthält.
Anmerkungen zu Upgrades
-
Bei der Initialisierung einer der Pulsklassen in
qiskit.pulse.library:ein komplexes Argument
ampmit einem endlichenangleergibtPulseErrorjetzt. Zum Beispiel sollte man stattGaussian(duration=100,sigma=20,amp=0.5j)jetztGaussian(duration=100,sigma=20,amp=0.5,angle=np.pi/2)verwenden. Die Impulseinhüllende, die früher alsamp * ...definiert war, ist nun wiederum alsamp * exp(1j * angle) * ...definiert. Diese Änderung wurde vorgenommen, um Qiskit-Experimente besser zu unterstützen, bei denen die Amplitude und der Winkel von Impulsen in separaten Experimenten kalibriert werden. -
Für Python 3.7 ist singledispatchmethod jetzt eine Abhängigkeit. Dies wurde hinzugefügt, um den Methodenversandmechanismus in der Standardbibliothek neuerer Versionen von Python nutzen zu können. Wenn Sie mit Python >= 3.8 arbeiten, ist keine zusätzliche Abhängigkeit erforderlich.
-
Der zuvor veraltete
MSBasisDecomposerTranspiler-Pass, der über dasqiskit.transpiler.passesmodul verfügbar war, wurde entfernt. Ursprünglich wurde es mit der Veröffentlichung von Qiskit Terra 0.16.0 (16.10.2020) veraltet. Stattdessen sollte derBasisTranslatortranspiler-Pass verwendet werden, um eine Schaltung in eine geeignete Basis mit einerRXXGate -
EquivalenceLibraryobjekte, die mit dem Attributbaseinitialisiert werden, haben keine gemeinsame Referenz mehr mit demEquivalenceLibraryübergeben. Wenn Sie in früheren Versionenbasemutierten, nachdem es zur Erstellung einer neuen Instanz verwendet wurdeEquivalenceLibraryinstanz verwendet wurde, würden beide Instanzen diese Änderung widerspiegeln. Dies ist nicht mehr der Fall, und Aktualisierungen vonbasewerden nicht mehr in der neuenEquivalenceLibrary. Zum Beispiel, wenn Sie eine Äquivalenzbibliothek mit:import math from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import XGate from qiskit.circuit.equivalence import EquivalenceLibrary original_lib = EquivalenceLibrary() qc = QuantumCircuit(1) qc.rx(math.pi, 0) original_lib.add_equivalence(XGate(), qc) new_lib = EquivalenceLibrary(base=original_lib)wenn Sie
original_libmit geändert haben:import from qiskit.circuit.library import SXGate qc = QuantumCircuit(1) qc.rx(math.pi / 2, 0) original_lib.add_equivalence(SXGate(), qc)in früheren Versionen enthielt
new_libauch die Definition vonSXGate, nachdem sie zuoriginal_libhinzugefügt worden war, aber in dieser Version wird dies nicht mehr der Fall sein. Diese Änderung wurde vorgenommen, weil die interne Datenstruktur in einen Graphen umgewandelt wurde, was die Leistung derEquivalenceLibraryklasse verbessert, insbesondere wenn mehrere Durchläufe desBasisTranslatortranspiler-Durchlaufs. -
Das Argument
initial_statefür den Konstruktor der KlasseNLocalklasse sowie die direkte Zuweisung an das AttributNLocal.initial_statemuss einQuantumCircuitsein. Die Unterstützung für die Verwendung anderer Typen für dieses Argument und Attribut wird nicht mehr unterstützt. Die Unterstützung für andere Typen wurde im Rahmen der Veröffentlichung von Qiskit Terra 0.18.0 (Juli 2021) veraltet. -
Die LaTeX Array-Schubladen (z.B.
array_to_latex,Statevector.draw('latex')) verwenden jetzt die gleiche sympy-Funktion wie die ket-Konventionsschublade. Das bedeutet, dass einige Zahlen anders dargestellt werden können als in früheren Versionen, aber sie werden eine einheitlichere Darstellung bieten. So können beispielsweise neue Faktoren identifiziert oder Nenner rationalisiert werden, die zuvor nicht bekannt waren. Die Standardeinstellungprecisionwurde von 5 auf 10 geändert. -
Die Version des QPY-Versionsformats, die von
dump()ausgegeben wird, wurde auf Version 6 erhöht. Diese neue Formatversion ist inkompatibel mit den Vorgängerversionen und führt zu einem Fehler, wenn versucht wird, sie mit einem Deserialisierer zu laden, der nicht in der Lage ist, QPY Version 6 zu verarbeiten. Diese Änderung war notwendig, um die Einführung vonScalableSymbolicPulsezu unterstützen, die durch Hinzufügen einesclass_name_size-Attributs zum Header der gedumptenSymbolicPulseobjekte. -
Die Methode
__hash__für dieSymbolicPulsewurde entfernt. Dies geschah, um die veränderliche Natur (über die Parameterzuweisung) dieser Klasse widerzuspiegeln, die zu Fehlern führen konnte, wenn manSymbolicPulsein Situationen, in denen ein hashfähiges Objekt benötigt wird. Das bedeutet, dass die eingebaute Methodehash()und die Verwendung vonSymbolicPulseals Schlüssel in Wörterbüchern oder Mengenmitgliedern wird nicht mehr funktionieren. -
Die Namen der
Registerinstanzen (einschließlich der Instanzen vonQuantumRegisterundClassicalRegigster) müssen nicht mehr zwangsläufig gültige OpenQASM 2 Bezeichner sein. Dies geschieht, da die Einschränkung zu streng ist, da Qiskit immer mehr von OpenQASM 2 entkoppelt wird und sogar die OpenQASM 3 Spezifikation nicht so restriktiv ist. Wenn Sie sich darauf verlassen haben, dass die Register gültige OpenQASM 2 Bezeichnernamen haben, müssen Sie damit beginnen, die Namen zu escapen. Eine vereinfachte Version dieses Vorgangs könnte zum Beispiel wie folgt aussehen:import re import string def escape(name: str) -> str: out = re.sub(r"\W", "_", name, flags=re.ASCII) if not out or out[0] not in string.ascii_lowercase: return "reg_" + out return out -
Die Methoden
QuantumCircuitmethodenu1,u2,u3, und ihre kontrollierten Variantencu1,cu3undmcu1wurden entfernt, nachdem sie in Qiskit Terra 0.16.0 veraltet sind. Damit wurden die üblicherweise IBM -spezifischen Gatternamen zugunsten der allgemeineren Methodenp(),u(),cp()undcu(). Die GatterklassenU1Gate,U2GateundU3Gatesind weiterhin für die Verwendung mitQuantumCircuit.append()verfügbar, so dass Backends weiterhin Basen mit diesen explizit angegebenen Gates unterstützen können. -
Die Methoden
QuantumCircuitmethodencombineundextendwurden entfernt, nachdem sie in Qiskit Terra 0.17.0 veraltet sind. Dies wurde getan, weil diese Funktionen einfach weniger leistungsfähige Versionen vonQuantumCircuit.compose()waren, die stattdessen verwendet werden sollten.Die Entfernung von
extendbedeutet auch, dass die Operatoren+und+=nicht mehr definiert sind fürQuantumCircuit. Stattdessen können Sie die Operatoren&und&=verwenden, die mitQuantumCircuit.compose(). -
Die zuvor veralteten Funktionen
qiskit.circuit.measure.measure()undqiskit.circuit.reset.reset()wurden entfernt. Diese Funktionen wurden in der Version Qiskit Terra 0.19.0 (Dezember 2021) veraltet. Stattdessen sollten Sie dieQuantumCircuit.measure()undQuantumCircuit.reset()methoden desQuantumCircuitobjekts verwenden, an das Sie eineMeasureoderResetoperation anhängen möchten. -
Die zuvor veralteten Methoden von
ParameterView, die vonsetgeerbt wurden, wurden ausParameterViewentfernt, der Typ, der vonQuantumCircuit.parameters. Die folgenden spezifischen Methoden wurden gestrichen:add()difference()difference_update()discard()intersection()intersection_update()issubset()issuperset()symmetric_difference()symmetric_difference_update()union()update()
zusammen mit der Unterstützung für die Betreiber von Python :
ixor:^=isub:-=ior:|=
Diese wurden in der Version Qiskit Terra 0.17.0 (April 2021) veraltet. Der Typ
ParameterViewist jetzt ein allgemeiner Sequenzansichtstyp und unterstützt diesesetOperationen nicht mehr. -
Die zuvor veralteten NetworkX konvertierungsmethoden für die
DAGCircuitundDAGDependencyklassen:DAGCircuit.to_networkx(),DAGCircuit.from_networkx(), undDAGDependency.to_networkx()wurden entfernt. Diese Methoden wurden ursprünglich als Teil der Qiskit Terra 0.21.0 Version (Juni 2022) veraltet. Qiskit verwendet rustworkx als Graphenbibliothek seit der Veröffentlichung von qiskit-terra 0.12.0 und seither ist die Konvertierungsfunktion NetworkX ein verlustbehafteter Prozess. Sie wurden ursprünglich hinzugefügt, damit Benutzer die NetworkX’s Algorithmen-Bibliothek nutzen können, um Funktionen zu verwenden, die inDAGCircuitund/oder rustworkx vorhanden sind. Seit dieser Zeit sind jedoch sowohlDAGCircuitund rustworkx ausgereift und bieten mehr Funktionalität, und dieDAGCircuitist für seinen Betrieb eng an rustworkx gekoppelt, und diese Konvertermethoden boten nur begrenzte Funktionalität und wurden daher entfernt. -
tweedledumwurde als Kernanforderung von Qiskit Terra gestrichen. Die bereitgestellte Funktionalität (qiskit.circuit.classicalfunction) ist weiterhin verfügbar, wenntweedledummanuell installiert wird, z. B. durch:pip install tweedledumDiese Änderung wurde vorgenommen, weil sich die Entwicklung von
tweedledumverlangsamt hat und nicht mehr mit den neuen Versionen von Python und Betriebssystemen mithalten konnte, was einige Qiskit-Benutzer an der Installation von Qiskit hinderte. -
Die faule optionale Kontrolleure
HAS_MATPLOTLIB,HAS_PIL,HAS_PYLATEXundHAS_PDFTOCAIROwerden nicht mehr vonqiskit.visualization, da sie in Qiskit Terra 0.21 veraltet sind. Der kanonische Ort für diese (und viele andere faule Prüfer) istqiskit.utils.optionalsund alle vier Objekte können dort gefunden werden. -
Das zuvor veraltete Argument
gatefür den Konstruktor desDecomposetranspilerpasses wurde zusammen mit dem dazugehörigen AttributDecompose.gateentfernt. Das Argument und das Attribut wurden mit dem Release von Qiskit Terra 0.19.0 (Dezember 2021) veraltet. Stattdessen sollte das Argumentgates_to_decomposefür den Konstruktor zusammen mit dem AttributDecompose.gates_to_decomposeverwendet werden. Das Argument und Attributgates_to_decomposesollte die gleiche Funktion haben, hat aber einen eindeutigeren Namen und ermöglicht auch die Angabe von Listen von Gattern, anstatt nur ein einzelnes Gatter zu unterstützen. -
Das zuvor veraltete
labelArgument für den Konstruktor derMCMTundMCMTVChainklassen wurde entfernt. Sie wurde mit der Veröffentlichung von Qiskit Terra 0.19.0 (Dezember 2021) veraltet. Die Verwendung des Argumentslabelfür diese Klassen war undefiniertes Verhalten, da sie Unterklassen vonQuantumCircuitanstatt vonInstruction. Dies würde dazu führen, dass das zugewiesene Etikett im Allgemeinen ignoriert wird. Wenn Sie einer Instanz vonlabelzuweisen müssenMCMToderMCMTVChainzuweisen müssen, sollten Sie sie in eineGateinstanz mitto_gate()umwandeln und dann das gewünschte Label demlabelattribut zu. Zum Beispiel:from qiskit.circuit.library import MCMT, XGate mcmt_circuit = MCMT(XGate(), 3, 2) mcmt_gate = mcmt_circuit.to_gate() mcmt_gate.label = "Custom MCMT X" -
Die Abhängigkeit von
retworkxfür Qiskit wurde entfernt und durch die Bibliothekrustworkxersetzt. Es handelt sich um dieselben Pakete, aberrustworkxist der neue Name fürretworkx, das im Rahmen der gemeinsamen Veröffentlichung von 0.12.0 umbenannt wurde. Wenn Sie zuvor retworkx 0.12.0 mit Qiskit verwendet haben, dann haben Sie bereits rustworkx installiert (retworkx 0.12.0 war nur ein redirect shim für die Abwärtskompatibilität). Diese Änderung wurde vorgenommen, um auf den neuen Paketnamen zu migrieren, der in Zukunft das einzige unterstützte Paket sein wird. -
Das Standardverhalten des
SabreLayoutcompilerpasses hat sich geändert. Der Durchlauf ist nicht länger einAnalysisPassund berechnet standardmäßig das ursprüngliche Layout, wendet es auf die Schaltung an und führt außerdemSabreSwapintern und wendet die Swap-Zuordnung an und setzt die Eigenschaftfinal_layoutmit der durch die Swap-Einfügungen verursachten Permutation. Dies bedeutet für Benutzer, dieSabreLayoutals Teil eines benutzerdefiniertenPassManagerlaufen, müssen den Passmanager anpassen, um dies zu berücksichtigen (es sei denn, sie haben das Argumentrouting_passfürSabreLayout). Diese Änderung wurde vorgenommen, um die Qualität der Ausgabe zu verbessern, da Layout und Routingqualität eng miteinander verbunden sindSabreLayoutführt nun mehrere parallele Seed-Versuche durch, und um zu berechnen, welches Seed die besten Ergebnisse liefert, müssen sowohl das Layout als auch das Routing zusammen durchgeführt werden. Es gibt drei Möglichkeiten, wie Sie die Verwendung Ihres benutzerdefinierten Pass-Managers anpassen können. Die erste besteht darin, dass Sie die Einbettung in Ihrem Preset-Pass-Manager vermeiden. Wenn Sie zuvor etwas wie:from qiskit.transpiler import PassManager from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.SabreLayout pm = PassManager() pm.append(SabreLayout(coupling_map) pm += common.generate_embed_passmanager(coupling_map)um das Layout zu berechnen und es dann anzuwenden (worauf in der Regel das Routing folgte), können Sie die Verwendung so anpassen, dass sie einfach ist:
from qiskit.transpiler import PassManager from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.SabreLayout pm = PassManager() pm.append(SabreLayout(coupling_map)als
SabreLayoutwendet das Layout an und Sie brauchen die Einbettungsphase nicht mehr. Alternativ können Sie auch das Argumentrouting_passangeben, dasSabreLayoutzu seinem vorherigen Verhalten zurückkehrt. Wenn Sie zum Beispiel das ProgrammSabreLayoutwie in früheren Versionen ausführen möchten, können Sie etwas wie folgt tun:from qiskit.transpiler.passes import SabreSwap, SabreLayout routing_pass = SabreSwap( coupling_map, "decay", seed=seed, fake_run=True ) layout_pass = SabreLayout(coupling_map, routing_pass=routing_pass, seed=seed)die dann
SabreLayoutals Analysedurchlauf ausgeführt und nur die Eigenschaftlayouteingestellt. Der letzte Ansatz besteht darin, das Argumentskip_routingaufSabreLayoutzu nutzen. Wenn dieses Argument aufTruegesetzt ist, wird die Anwendung des gefundenen Layouts und das Einfügen der Swap-Gates aus dem Routing übersprungen. Dies geht jedoch zu Lasten der Laufzeit, daSabreLayoutweiterhin das Routing berechnet und diese Daten einfach nicht verwendet. Die beiden erstgenannten Ansätze sind mit keinem zusätzlichen Aufwand verbunden. -
Die Layouts, die durch den
SabreLayoutpass (wenn ohne das Argumentrouting_passausgeführt) mit einem festen Seed-Wert berechnet werden, können sich gegenüber früheren Versionen ändern. Dies ist auf die Verwendung eines neuen Zufallszahlengenerators zurückzuführen, der im Rahmen der Neuschreibung desSabreLayoutpasses in Rust verwendet wird, der die Leistung erheblich verbessert hat. Wenn Sie auf eine konsistente Ausgabe angewiesen sind, können Sie den Durchlauf in einer früheren Version von Qiskit durchführen und die Funktionqiskit.qpyverwenden, um den Schaltkreis zu speichern und ihn dann mit der aktuellen Version zu laden. Alternativ dazu können Sie das Argumentrouting_passexplizit auf eine Instanz vonSabreSwapsetzen, um das vorherige Verhalten vonSabreLayout:from qiskit.transpiler.passes import SabreSwap, SabreLayout routing_pass = SabreSwap( coupling_map, "decay", seed=seed, fake_run=True ) layout_pass = SabreLayout(coupling_map, routing_pass=routing_pass, seed=seed)die das Verhalten des Passes in der vorherigen Version widerspiegelt. Beachten Sie, dass Sie, wenn Sie das Argument
swap_trialsaufSabreLayoutin früheren Versionen verwendet haben, wenn Sie die Verwendung an diese Form anpassen, müssen Sie das Argumenttrialsfür denSabreSwapkonstruktor setzen müssen, wenn Sie die vorherige Ausgabe mit einem festen Seed beibehalten wollen. -
Der genaue Schaltkreis, der von
qiskit.circuit.random.random_circuitfür ein bestimmtes Saatgut zurückgegeben wird, hat sich geändert. Dies ist auf Effizienzsteigerungen bei der internen Zufallszahlengenerierung für die Funktion zurückzuführen. -
Die Versionsanforderung für das optionale Funktionspaket
qiskit-toqm, das überpip install qiskit-terra[toqm]installiert werden kann, wurde von der Version0.0.4auf0.1.0angehoben. Um dietoqmRouting-Methode mittranspile()zu verwenden, müssen Sie jetzt qiskit-toqm Version0.1.0oder neuer verwenden. Ältere Versionen sind für den Transpiler nicht mehr auffindbar. -
Die Ausgabe
QuasiDistributionder MethodeSampler.runwurde aktualisiert, um alle Zustände mit einer Wahrscheinlichkeit von Null herauszufiltern. Wenn nun ein gültiger Zustand in der Wörterbuchausgabe fehlt, kann davon ausgegangen werden, dass er eine Wahrscheinlichkeit von 0 hat. Zuvor wurden alle möglichen Ergebnisse für eine bestimmte Anzahl von Bits (z. B. für ein 3-Bit-Ergebnis000,001,010,011,100,101,110und111) angezeigt, selbst wenn die Wahrscheinlichkeit eines bestimmten Zustands 0 war. Diese Änderung wurde vorgenommen, um die Größe der Ausgabe zu verringern, da bei einer größeren Anzahl von Bits die Ausgabegröße recht groß werden kann. Durch das Filtern der Nullwahrscheinlichkeitsresultate ist die Ausgabe auch mit anderen Implementierungen vonBaseSampler. -
Das Verhalten des Pulse Builders beim Aufruf von
Scheduleaufgerufen wird, wurde verbessert. Aufgerufene Zeitpläne werden intern in eineScheduleBlockrepräsentation umgewandelt und es wird nun immer ein Referenzmechanismus angewandt, anstatt die von der Anweisung umschlossenenCallanweisung. Beachten Sie, dass der konvertierte Block nicht unbedingt den ursprünglichen Ausrichtungskontext wiederherstellt. Dabei handelt es sich einfach um eine ASAP-ausgerichtete Folge von Impulsanweisungen mit absoluten Zeitabständen. Dies ist ein Upgrade der internen Darstellung von aufgerufenen Pulsprogrammen und somit keine API-Änderung. Allerdings ist dieCallanweisung undSchedulenicht mehr im Pulsprogramm des Erbauers erscheinen. Diese Änderung garantiert, dass die generierten Fahrplanblöcke immer QPY-kompatibel sind. Wenn Sie die Ausgabeplananweisungen nachCallfiltern, können Sie stattdessen auf dieScheduleBlock.referenceszugreifen, um das aufgerufene Programm abzurufen. -
RZXCalibrationBuilderundRZXCalibrationBuilderNoEchotranspiler pass wurden aktualisiert, um Folgendes zu erzeugenScheduleBlock. Diese Änderung garantiert, dass die umgesetzten Schaltungen immer QPY-kompatibel sind. Wenn Sie direkt die Methoderescale_cr_inst()methode aus einem anderen Programm oder einer Pass-Subklasse verwenden, um den Kreuzresonanzimpuls des Geräts neu zu skalieren, wird diese Methode jetzt zu einem Pulsbuilder-Makro, und Sie müssen diese Methode im Pulsbuilder-Kontext verwenden, um die neue Version anzunehmen. Der Methodenaufruf injiziert eine Abspielanweisung in das Kontextimpulsprogramm, anstatt einePlayanweisung mit dem gestreckten Impuls zurückzugeben.
Hinweise zu veralteten Versionen
-
Die Unterstützung für die Ausführung von Qiskit mit Python 3.7 ist veraltet und wird in der Version qiskit-terra 0.25.0 entfernt. Das bedeutet, dass Sie ab der Version 0.25.0 die Version Python, die Sie verwenden, auf Python 3.8 oder höher aktualisieren müssen.
-
Die Klasse
LinearFunctionsSynthesisist jetzt veraltet und wird in einer zukünftigen Version entfernt werden. Sie wurde ersetzt durch die allgemeinereHighLevelSynthesisklasse ersetzt, die stattdessen verwendet werden sollte. Sie können zum Beispiel eine Instanz vonHighLevelSynthesisinstanziieren, die sich genauso verhält wieLinearFunctionSynthesismit:from qiskit.transpiler.passes import HighLevelSynthesis from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig HighLevelSynthesis( HLSConfig( linear_function=[("default", {})], use_default_on_unspecified=False, ) ) -
Die Unterstützung für die Übergabe von Listen von Argumentwerten an die
transpile()funktion ist veraltet und wird in der Version 0.25.0 entfernt werden. Dies geschieht, um den Aufwand für die parallele Ausführung bei der gleichzeitigen Umsetzung mehrerer Schaltkreise erheblich zu reduzieren. Wenn Sie diese Funktion derzeit verwenden, können Sie stattdessentranspile()stattdessen mehrere Male aufrufen. Zum Beispiel, wenn Sie vorher etwas getan haben wie:from qiskit.transpiler import CouplingMap from qiskit import QuantumCircuit from qiskit import transpile qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)] results = transpile([qc] * 6, coupling_map=cmaps)stattdessen sollten Sie etwas wie folgt ausführen:
from itertools import cycle from qiskit.transpiler import CouplingMap from qiskit import QuantumCircuit from qiskit import transpile qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)] results = [] for qc, cmap in zip(cycle([qc]), cmaps): results.append(transpile(qc, coupling_map=cmap))Sie können auch
parallel_map()odermultiprocessingaus der Python Standardbibliothek verwenden, wenn Sie dies parallel ausführen möchten. -
Die alte Version der Impulsschublade auf
qiskit.visualization.pulseist veraltet und wird in einer zukünftigen Version entfernt werden. Dazu gehören die KlassenScheduleDrawerund :class`WaveformDrawer`. Dieses Modul wurde durch die Schubladeqiskit.visualization.pulse_v2abgelöst, und die typische Benutzer-APIpulse_drawer()undPulseBlock.draw()sind bereits intern aktualisiert worden, umqiskit.visualization.pulse_v2zu verwenden. -
Die Methode
pulse.Instruction.draw()ist veraltet und wird in einer zukünftigen Version entfernt. Die Notwendigkeit dieser Methode wurde durch dieqiskit.visualization.pulse_v2Schublade abgelöst, die keineInstrucionObjekte benötigt, um ihre eigene Zeichnungsmethode zu haben. Wenn Sie eine Impulsanweisung zeichnen müssen, sollten Sie diepulse_drawer()stattdessen verwenden. -
Der Import
qiskit.circuit.qpy_serializationist veraltet, da QPY zur obersten Ebene aufgestiegen ist. Sie sollten die gleichen Objekte ausqiskit.qpystattdessen importieren. Der alte Pfad wird in einer zukünftigen Version von Qiskit Terra entfernt werden. -
Das Objekt
qiskit.IBMQist veraltet. Dieses Alias-Objekt leitet den Zugriff auf Attribute aufqiskit.providers.ibmq.IBMQum. Da das Paketqiskit-ibmq-providerdurch das Paketqiskit-ibm-providerersetzt wurde, das seinen eigenen Namensraum unterhält, ist die Beibehaltung dieses Alias mit dem neuen Paket nicht mehr relevant. Wenn Sie sich auf den Aliasqiskit.IBMQverlassen haben, sollten Sie Ihre Verwendung aktualisieren und stattdessenqiskit.providers.ibmq.IBMQdirekt verwenden (und auch eine Migration zuqiskit-ibm-providerin Betracht ziehen, siehe Migrationsleitfaden für weitere Einzelheiten). -
Mehrere öffentliche Methoden der Puls Qobj Konverter wurden veraltet und werden in einer zukünftigen Version nicht mehr direkt aufrufbar sein. Die Liste der Methoden lautet:
Unter
InstructionToQobjConverter,convert_acquire()convert_bundled_acquires()convert_set_frequency()convert_shift_frequency()convert_set_phase()convert_shift_phase()convert_delay()convert_play()convert_snapshot()
Unter
QobjToInstructionConverter,convert_acquire()convert_set_phase()convert_shift_phase()convert_set_frequency()convert_shift_frequency()convert_delay()bind_pulse()convert_parametric()convert_snapshot()
Anstatt eine dieser Methoden direkt aufzurufen, werden sie implizit ausgewählt, wenn eine Konverterinstanz direkt aufgerufen wird. Zum Beispiel:
converter = QobjToInstructionConverter() converter(pulse_qobj) -
Die Funktionen
qiskit.visualization.state_visualization.num_to_latex_ket()undqiskit.visualization.state_visualization.num_to_latex_terms()sind veraltet und werden in einer zukünftigen Version entfernt. Diese Funktionen wurden in erster Linie intern von der LaTeX Ausgabe vonStatevector.draw()undDensityMatrix.draw()die diese Funktionen nicht mehr verwenden und stattdessen Sympy dafür einsetzen. Wenn Sie diese Funktionen verwendet haben, sollten Sie die nsimplify() -Latex() -Funktionen von Sympy verwenden. -
Die Methode
Register.qasm()ist veraltet und wird in einer zukünftigen Version entfernt werden. Diese Methode findet sich in den UnterklassenQuantumRegisterundClassicalRegister. Der Grund für die Ablehnung ist, dass die Methodeqasm()eine falsche Sichtweise des Verantwortlichen für die sichere Konvertierung in OpenQASM 2 fördert; ein einzelnes Objekt allein verfügt nicht über den Kontext, um eine sichere Konvertierung zu gewährleisten, z. B. ob sein Name nach dem Escapen kollidiert, um einen gültigen Bezeichner zu erzeugen. -
Der reguläre Ausdruck class-variable
Register.name_formatist veraltet und wird in einer zukünftigen Version entfernt werden. Die Namen von Registern dürfen jetzt jede gültige Python Zeichenkette sein, so dass der reguläre Ausdruck keine Verwendung mehr hat. -
Die Funktionen
qiskit.quantum_info.synthesis.decompose_clifford()undqiskit.quantum_info.synthesis.decompose_cnot_dihedral()sind veraltet und werden in einer zukünftigen Version entfernt. Sie werden ersetzt durch die beiden Funktionenqiskit.synthesis.synth_clifford_full()undqiskit.synthesis.synth_cnotdihedral_full()ersetzt.
Fehlerkorrekturen
-
Es wurde ein Problem in der
PauliOp.adjoint()methode behoben, bei der der korrekte Wert für Paulis mit komplexen Koeffizienten zurückgegeben wurde, zum Beispiel:PauliOp(Pauli("iX")). Behoben #9433. -
Es wurde ein Problem mit den Algorithmen zur Amplitudenschätzung im Modul
qiskit.algorithms.amplitude_estimatorsbehoben (sieheamplitude_estimators), das bei der Verwendung von Primitiven, die aus dem abstraktenBaseSamplerprimitiven (wie z.BSamplerundBackendSampler). Bisher wurden die Messergebnisse auf mehr Bits ausgedehnt, als tatsächlich gemessen wurden, was bei Orakeln mit mehr als einem Qubit zu potenziellen Fehlern bei der Erkennung der "guten" Quantenzustände von Orakeln führte. -
Es wurde ein Problem behoben, bei dem die Methoden
QuantumCircuit.add_calibrations()undDAGCircuit.add_calibrations()sich in Bezug auf die Logik der Parameterformatierung nicht richtig verhielten. Zuvor versuchteDAGCircuit.add_calibrations(), jeden Parameter infloatzu übertragen.QuantumCircuit.add_calibrations()verwendete die gegebenen Parameter so, wie sie sind. Dies würde möglicherweise einen Fehler verursachen, wenn dietranspile()auf einemQuantumCircuitmit Impulstoren führen, da die Parameter der Kalibrierungen alsParameterExpresionObjekte gehalten werden könnten. -
Es wurde ein Deserialisierungsproblem in QPYs (
qiskit.qpy)load()funktion, bei der Schaltungen, die Gatter der KlasseMCXGate,MCXGrayCode,MCXRecursive, undMCXVChainenthalten, nicht deserialisiert werden können. Behoben #9390. -
Ein Problem wurde behoben in
TensoredOp.to_matrix()wo der globale Koeffizient des Operators mehr als einmal mit der Endmatrix multipliziert wurde. Jetzt wird der globale Koeffizient korrekt angewendet, unabhängig von der Anzahl der gespannten Operatoren oder Zustände. Behoben #9398. -
Die Ausgabe der
run()methode der KlasseBackendSamplerklasse setzt nun die Attributeshotsundstddev_upper_boundder zurückgegebenenQuasiDistribution. Zuvor fehlten diese Attribute, was einige Nachbearbeitungen der Ausgabe verhinderte. Behoben #9311 -
Die Exporter-Methode OpenQASM 2
QuantumCircuit.qasm()gibt nun standardmäßig Fließkommazahlen höherer Genauigkeit für Gatterparameter aus. Außerdem wird eine engere Schranke ( anstelle von ) verwendet, um zu prüfen, ob ein bestimmter Parameter nahe an einem Bruchteil/einer Potenz von liegt. #7166 behoben. -
Feste Unterstützung im
primitivesmodul für die Ausführung vonQuantumCircuitobjekten mit Kontrollflussanweisungen (z. B.IfElseOp). Zuvor konnten die BasisklassenBaseSamplerundBaseEstimatorsolche Schaltungen nicht korrekt normalisieren. Die Ausführung dieser Schaltungen hängt jedoch von der jeweiligen Implementierung der primitiven, den Kontrollfluss unterstützenden Anweisungen ab. Damit wurde lediglich die Unterstützung festgelegt, die es einer bestimmten Implementierung vonBaseSampleroderBaseEstimatorermöglicht, Kontrollflussanweisungen zu verwenden. -
Es wurde ein Problem mit der Methode
PauliOp.matmul()behoben, das beiiIzu falschen Ergebnissen führte. Behoben #8680. -
Es wurde ein Problem mit der Klasse Approximate Quantum Compiler (
AQC) behoben, der dazu führte, dass ein falscher Schaltkreis zurückgegeben wurde, wenn die Eingabe-Unitarie eine Determinante von -1 hatte. Behoben #9327 -
Es wurde ein Problem mit der
QuantumCircuit.compose()methode, die fälschlicherweise gültige Qubit- oder Clbit-Spezifikationen zurückwies. Dies wurde korrigiert, so dass die Methode nun denselben Satz von qubit- und clbit-Spezifikationen akzeptiert wie andereQuantumCircuitmethoden, wie zum Beispielappend(). Behoben #8691. -
Es wurde ein Problem mit der
QuantumCircuit.compose()methode behoben, bei der Register in Bedingungen auf der gegebenen Schaltung fälschlicherweise vollständigen Registern auf der Basis zugeordnet wurden. Zuvor war die Zuordnung sehr ungenau; die in jeder Bedingung verwendeten Bits waren nicht Gegenstand der Zuordnung, und stattdessen wurde ein ungenauer Versuch unternommen, ein entsprechendes Register zu finden. Dies könnte auch dazu führen, dass eine Bedingung in einem kleineren Register zu einer Bedingung in einem größeren Register erweitert wird, was keine gültige Umwandlung ist. Jetzt wird eine Bedingung für ein einzelnes Bit oder ein Register so zusammengesetzt, dass sie sich auf genau die Bits bezieht, die durch das Argumentclbitsdefiniert sind. Um dies zu erleichtern, wird der Basisschaltung gegebenenfalls ein neues Aliasing-Register hinzugefügt. Behoben #6583. -
Es wurde ein Problem mit der Funktion
transpile()funktion, wennoptimization_levelauf1,2oder3gesetzt wird und keinbackend,basis_gatesodertargetArgument angegeben wird. Wenn der Eingangsschaltkreis Läufe von Einzel-Qubit-Gattern enthielte, die vereinfacht werden könnten, wäre der Ausgangsschaltkreis nicht so optimal wie möglich, da diese Läufe von Einzel-Qubit-Gattern nicht entfernt worden wären. Dies hätte früher durch die Angabe der Argumentebackend,basis_gatesodertargetbeim Aufruf der Funktion korrigiert werden könnentranspile()aufrufs, aber jetzt wird die Ausgabe so vereinfacht, wie es ohne Kenntnis der erlaubten Zielgatter möglich ist. Behoben #9217 -
Es wurde ein Problem mit der Funktion
transpile()funktion, wenn sie mitoptimization_level=3ausgeführt wird und keinbackend,basis_gatesodertargetArgument angegeben wird. Wenn die Eingangsschaltung beliebige 2-Qubit-Blöcke enthielte, die einer Identitätsmatrix entsprechen, wäre die Ausgangsschaltung nicht so optimal wie möglich und würde immer noch diesen Identitätsblock enthalten. Dies hätte früher durch die Angabe der Argumentebackend,basis_gatesodertargetbeim Aufruf der Funktion korrigiert werden könnentranspile()aufrufs, aber jetzt wird die Ausgabe so vereinfacht, wie es ohne Kenntnis der erlaubten Zielgatter möglich ist. Behoben #9217 -
Es wurde ein Problem mit
LinCombSamplerGradientdas möglicherweise einen Fehler auslöste, wenn es mit derSamplerklasse vonqiskit-aerausgeführt wurde. -
Ein Problem wurde behoben mit
NumPyEigensolverund durch ErweiterungNumPyMinimumEigensolverwo die Lösung fürBaseOperatorUnterklassen, die nichtOperatorsind, einen Fehler verursachte. -
Es wurde ein Problem in der Metadatenausgabe von
primitivesbehoben, bei dem die Liste Kopien per Verweis erstellte und alle Elemente bei jeder Iteration mit demselben Wert aktualisiert wurden. -
Ein Problem mit
QobjToInstructionConverterwurde behoben, das auftrat, wenn mehrere Backends aufgerufen wurden und diese versehentlich denselben Pulsnamen in der Pulsbibliothek hatten. Dies war ein Randfall, der nur dann auftreten konnte, wenn eine Konverterinstanz über mehrere Backends hinweg wiederverwendet wurde (dies war kein typisches Nutzungsmuster). -
Es wurde ein Problem mit der
PVQDklasse, bei dem die Verlustfunktion fälschlicherweise die Treue quadriert hat. Dies wurde korrigiert, so dass die Verlustfunktion mit der Definition in der ursprünglichen Algorithmusdefinition übereinstimmt. -
Es wurde ein Fehler in QPY (
qiskit.qpy), bei dem Schaltungen, die Register enthalten, deren Bits in der Schaltung nach losen Bits auftraten, nicht deserialisiert werden konnten. Siehe #9094. -
Die Klasse
TwoQubitWeylDecompositionist jetzt mit dem Protokollpicklekompatibel. Zuvor konnte die Deserialisierung nicht durchgeführt werden und es wurde einTypeErrorausgegeben. Siehe #7312. -
Es wurde ein Problem mit der
LocalReadoutMitigator.quasi_probabilities()methode, bei der das Argumentshotsnicht verwendet wurde. Sie wird nun verwendet, um die Anzahl der Schüsse im Rückgabeobjekt festzulegen. -
Eine Regression in der Konstruktion von
Cliffordobjekten ausQuantumCircuits, die andereCliffordobjekte enthalten. -
Ein Problem mit der Klasse
TwoQubitWeylDecomposition(und ihren Unterklassen) wurde behoben, damit die Standardbibliothek Pythonpicklediese Klassen serialisieren kann. Dies behebt teilweise #7312 -
QuantumCircuit.qasm()wird nun Gatter- und Registernamen, die mit reservierten OpenQASM 2 Schlüsselwörtern kollidieren, korrekt umgehen. Behebt #5043. -
Es wurde ein Problem im Programm
RZXCalibrationBuilderbei dem die ECR-Impulsfolge falsch ausgerichtet war. Behoben #9013. -
Es wurde ein Problem mit dem Programm
pulse_drawer()wo in einigen Fällen die Ausgabevisualisierung einige der Kanäle in einem Zeitplan ausließ. Behoben #8981.
Aer- 0.11.2
Keine Änderung
IBM Q Anbieter 0.19.2
Keine Änderung