Qiskit 0.35 Versionshinweise
0.35.0
Terra- 0.20.0
Vorspiel
Die Highlights der Qiskit Terra 0.20.0 Version sind:
- Die Einführung von Multithreading-Modulen, die in Rust geschrieben sind, um die Leistung bestimmter Teile von Qiskit Terra zu beschleunigen und die Skalierung mit einer größeren Anzahl von Qubits zu verbessern. Für die Erstellung von Qiskit aus dem Quellcode ist nun jedoch ein Rust-Compiler erforderlich.
- Mehr native Unterstützung für die Arbeit mit einem
Targetim Transpiler. Mehrere Durchläufe unterstützen nun das direkte Arbeiten mit einemTargetobjekt zu arbeiten, was den Transpiler hinsichtlich der Arten von Backends, die er ansprechen kann, robust macht. - Die Einführung des
qiskit.primitivesmoduls. Diese APIs bieten verschiedene Abstraktionsebenen für die Berechnung der gewünschten Ergebnisse vonQuantumCircuitund die Verwendung von Backends. Zum Beispiel definiert dieBaseEstimatoreine abstrakte Schnittstelle für die Schätzung eines Erwartungswerts einer Beobachtungsgröße definiert. Auf dieser Grundlage können dann Algorithmen und Anwendungen auf höherer Ebene konstruiert werden, die auf der Schätzung von Erwartungswerten beruhen, ohne dass man sich um die Implementierung der Berechnung des Erwartungswertes kümmern muss. Durch diese Entkopplung kann die Implementierung an Geschwindigkeit und Qualität gewinnen, während sie sich an die definierte abstrakte Schnittstelle hält. Ebenso kann derBaseSamplerberechnet Quasi-Wahrscheinlichkeitsverteilungen aus Schaltkreismessungen. Weitere Primitive werden in Zukunft eingeführt werden.
Diese Version bietet keine Unterstützung mehr für Python 3.6. Für diese Version sind Python 3.7 bis Python 3.10 erforderlich.
Neue Funktionen
-
Hinzufügen einer neuen Konstruktormethode für die
Operatorklasse,Operator.from_circuit()zum Erzeugen eines neuenOperatorobjekts aus einerQuantumCircuit. Während dies normalerweise mit dem Standardkonstruktor möglich war, bietet dieOperator.from_circuit()methode bietet zusätzliche Optionen zur Anpassung der Art und Weise, wie der Operator erstellt wird. In erster Linie können Sie damit die Reihenfolge der Qubits auf der Grundlage eines Satzes permutierenLayout. Zum Beispiel:from qiskit.circuit import QuantumCircuit from qiskit import transpile from qiskit.transpiler import CouplingMap from qiskit.quantum_info import Operator circuit = QuantumCircuit(3) circuit.h(0) circuit.cx(0, 1) circuit.cx(1, 2) cmap = CouplingMap.from_line(3) out_circuit = transpile(circuit, initial_layout=[2, 1, 0], coupling_map=cmap) operator = Operator.from_circuit(out_circuit)bei der Variablen
operatorwerden die Qubits auf der Grundlage des Layouts permutiert, so dass sie mit dem Ergebnis vonOperator(circuit)vor der Transpilierung identisch ist. -
Hinzufügen einer neuen Methode
DAGCircuit.copy_empty_like()zu derDAGCircuitklasse. Diese Methode wird verwendet, um eine neue Kopie eines bestehendenDAGCircuitobjekts mit der gleichen Struktur, aber ohne Anweisungen. Diese Methode ist die gleiche wie die private Methode_copy_circuit_metadata(), ist aber jetzt Teil der öffentlichen API der Klasse. -
Die Fake-Backend- und Fake-Provider-Klassen, die bisher in
qiskit.test.mockverfügbar waren, sind nun auch in einem neuen Modul zugänglich:qiskit.providers.fake_provider. Dieses neue Modul ersetzt das vorherige Modulqiskit.test.mock, das in Qiskit 0.21.0 veraltet sein wird. -
Eine neue Gatterklasse wurde hinzugefügt,
LinearFunctionhinzugefügt, die effizient eine lineare Funktion kodiert (d.h. eine Funktion, die durch eine Folge vonCXGateundSwapGategattern dargestellt werden kann). -
Ein neuer Transpiler-Pass wurde hinzugefügt
CollectLinearFunctionsder Blöcke von aufeinanderfolgendenCXGateundSwapGategattern in einer Schaltung sammelt und jeden Block durch einLinearFunctiongatter. -
Ein neuer Transpiler-Pass wurde hinzugefügt
LinearFunctionsSynthesisder beliebige Gatter synthetisiertLinearFunctiongatter unter Verwendung des Patel-Markov-Hayes-Algorithmus synthetisiert. In Kombination mit demCollectLinearFunctionstranspiler-Durchgang ermöglicht dies das Sammeln von Blöcken aus aufeinanderfolgendenCXGateundSwapGategatter in einer Schaltung zu sammeln und sie mit dem Patel-Markov-Hayes-Algorithmus neu zu synthetisieren. -
Ein neuer Transpiler-Pass wurde hinzugefügt
LinearFunctionsToPermutationsder einLinearFunctiongatter durch einenPermutationschaltkreis ersetzt, wann immer dies möglich ist. -
FlowControllerklassen (wie z.BConditionalController) können nun innerhalb einerPassManagerinstanz verschachtelt werden, wenn man diePassManager.append()methode. Dies ermöglicht die Verwendung von verschachtelter Logik zur Steuerung der Ausführung von Durchläufen in derPassManager. Zum Beispiel:from qiskit.transpiler import ConditionalController, PassManager from qiskit.transpiler.passes import ( BasisTranslator, GatesInBasis, Optimize1qGatesDecomposition, FixedPoint, Depth ) from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel pm = PassManager() def opt_control(property_set): return not property_set["depth_fixed_point"] def unroll_condition(property_set): return not property_set["all_gates_in_basis"] depth_check = [Depth(), FixedPoint("depth")] opt = [Optimize1qGatesDecomposition(['rx', 'ry', 'rz', 'rxx'])] unroll = [BasisTranslator(sel, ['rx', 'ry', 'rz', 'rxx'])] unroll_check = [GatesInBasis(['rx', 'ry', 'rz', 'rxx'])] flow_unroll = [ConditionalController(unroll, condition=unroll_condition)] pm.append(depth_check + opt + unroll_check + flow_unroll, do_while=opt_control)Das
pmPassManagerobjekt führt nur dann denBasisTranslatordurchlauf (im Schrittunroll) in jeder Schleifeniteration nur dann aus, wenn dieunroll_conditionerfüllt ist. -
Die Konstruktoren für die
ZFeatureMapundZZFeatureMapklassen haben ein neues Schlüsselwortargumentparameter_prefix. Dieses neue Argument wird verwendet, um das Präfix der Parameter der Datenkodierungsschaltung festzulegen. Zum Beispiel:from qiskit.circuit.library import ZFeatureMap feature_map = ZFeatureMap(feature_dimension=4, parameter_prefix="my_prefix") feature_map.decompose().draw('mpl')die erzeugte
ZFeatureMapschaltung hat allen internen Parametern das Präfix"my_prefix"vorangestellt. -
Der
TemplateOptimizationtranspiler-Pass kann nun mitGateobjekten arbeiten, dieParameterExpressionparameter haben. Ein anschauliches Beispiel für die Verwendung vonParameters mitTemplateOptimizationist das folgende:from qiskit import QuantumCircuit, transpile, schedule from qiskit.circuit import Parameter from qiskit.transpiler import PassManager from qiskit.transpiler.passes import TemplateOptimization # New contributions to the template optimization from qiskit.transpiler.passes.calibration import RZXCalibrationBuilder, rzx_templates from qiskit.test.mock import FakeCasablanca backend = FakeCasablanca() phi = Parameter('φ') qc = QuantumCircuit(2) qc.cx(0,1) qc.p(2*phi, 1) qc.cx(0,1) print('Original circuit:') print(qc) pass_ = TemplateOptimization(**rzx_templates.rzx_templates(['zz2'])) qc_cz = PassManager(pass_).run(qc) print('ZX based circuit:') print(qc_cz) # Add the calibrations pass_ = RZXCalibrationBuilder(backend) cal_qc = PassManager(pass_).run(qc_cz.bind_parameters({phi: 0.12})) # Transpile to the backend basis gates cal_qct = transpile(cal_qc, backend) qct = transpile(qc.bind_parameters({phi: 0.12}), backend) # Compare the schedule durations print('Duration of schedule with the calibration:') print(schedule(cal_qct, backend).duration) print('Duration of standard with two CNOT gates:') print(schedule(qct, backend).duration)Ausgaben
Original circuit: q_0: ──■──────────────■── ┌─┴─┐┌────────┐┌─┴─┐ q_1: ┤ X ├┤ P(2*φ) ├┤ X ├ └───┘└────────┘└───┘ ZX based circuit: ┌─────────────┐ » q_0: ────────────────────────────────────┤0 ├────────────» ┌──────────┐┌──────────┐┌──────────┐│ Rzx(2.0*φ) │┌──────────┐» q_1: ┤ Rz(-π/2) ├┤ Rx(-π/2) ├┤ Rz(-π/2) ├┤1 ├┤ Rx(-2*φ) ├» └──────────┘└──────────┘└──────────┘└─────────────┘└──────────┘» « «q_0: ──────────────────────────────────────────────── « ┌──────────┐┌──────────┐┌──────────┐┌──────────┐ «q_1: ┤ Rz(-π/2) ├┤ Rx(-π/2) ├┤ Rz(-π/2) ├┤ P(2.0*φ) ├ « └──────────┘└──────────┘└──────────┘└──────────┘ Duration of schedule with the calibration: 1600 Duration of standard with two CNOT gates: 6848 -
Die
DAGOpNode,DAGInNodeundDAGOutNodeklassen definieren nun eine eigene__repr__Methode, die eine Darstellung ausgibt. Gemäß der Dokumentation Python ist die Ausgabe eine Zeichenkettendarstellung, die ungefähr der Zeichenkette Python entspricht, die zur Erstellung eines entsprechenden Objekts verwendet wird. -
Die Leistung der
SparsePauliOp.simplify()methode wurde erheblich verbessert, indem die Verwendung vonnumpy.uniquezur Berechnung eindeutiger Elemente eines Arrays durch eine neue, ähnliche, in Rust implementierte Funktion ersetzt wurde, die das Array nicht vorsortiert. -
Hinzufügen einer neuen Methode
equiv()in derSparsePauliOpklasse hinzugefügt, um die Gleichwertigkeit einerSparsePauliOpmit einem anderenSparsePauliOpobjekt. Anders als der==Operator, der Operatoren elementweise vergleicht,equiv()vergleicht, ob zwei Operatoren gleichwertig sind oder nicht. Zum Beispiel:op = SparsePauliOp.from_list([("X", 1), ("Y", 1)]) op2 = SparsePauliOp.from_list([("X", 1), ("Y", 1), ("Z", 0)]) op3 = SparsePauliOp.from_list([("Y", 1), ("X", 1)]) print(op == op2) # False print(op == op3) # False print(op.equiv(op2)) # True print(op.equiv(op3)) # True -
Hinzufügen neuer Fake-Backend-Klassen aus Snapshots der IBM Quantum -Systeme auf Basis der
BackendV2schnittstelle und stellte eineTargetfür jedes Backend.BackendV2basierten Versionen aller bestehenden Backends hinzugefügt, mit Ausnahme der drei alten BackendsFakeRueschlikon,FakeTenerifeundFakeTokyo, da für sie keine Snapshot-Dateien verfügbar sind, die für die Erstellung einer neuen Fake-Backend-Klasse auf der Grundlage vonBackendV2.Diese neuen V2 Fake-Backends werden das Testen und die Entwicklung neuer Funktionen ermöglichen, die von
BackendV2undTargetwie z.B. die Verbesserung des Transpilers. -
Hinzufügen einer neuen Gatterklasse
XXMinusYYGatein die Schaltkreisbibliothek (qiskit.circuit.library) für die XX-YY-Interaktion hinzugefügt. Dieses Gatter kann zur Implementierung des bSwap Gatters und seiner Potenzen verwendet werden. Sie tritt auch bei der Simulation von supraleitenden fermionischen Modellen auf. -
Neue Gatterklasse hinzugefügt,
XXPlusYYGatein die Schaltkreisbibliothek (qiskit.circuit.library). Dieses Gatter ist eine parametrisierte 2-Qubit-XX+YY-Wechselwirkung, auch als XY-Gatter bekannt, und basiert auf dem in https://arxiv.org/abs/1912.04424. -
Die gefälschten Backends
FakeBogota,FakeManila,FakeRomeundFakeSantiago, die im Modulqiskit.providers.fake_providerzu finden sind, können nun als Backends in Pulse-Experimenten verwendet werden, da sie nun einePulseDefaultsenthalten, das aus einem Schnappschuss der Eigenschaften der entsprechenden IBM Quantum Maschine erstellt wurde. -
Der
ConsolidateBlockspass hat ein neues Schlüsselwortargument in seinem Konstruktor,target. Dieses Argument wird verwendet, um einTargetobjekt anzugeben, das das Kompilierungsziel für den Durchgang darstellt. Wenn er angegeben wird, ersetzt er denbasis_gateskwarg. Wenn ein Ziel angegeben ist, berücksichtigt der Durchlauf die Gatter und Qubits für die in der Tabelle definierten AnweisungenTargetdefinierten Anweisungen, wenn er entscheidet, welche Gatter zu einer Unitary zusammengefasst werden sollen. -
Die Klasse
Targetklasse hat eine neue Methode,instruction_supported()die verwendet wird, um das Ziel abzufragen, um zu sehen, ob eine Anweisung (die Kombination aus einer Operation und dem/den Qubit(s), auf dem/denen sie ausgeführt wird) auf dem Backend unterstützt wird, das durch dieTarget. -
Ein neuer kwarg,
metadata_serializer, wurde der Funktionqpy.dump()funktion hinzugefügt, um eine benutzerdefinierteJSONEncoderUnterklasse anzugeben, die bei der Serialisierung desQuantumCircuit.metadataattributs und einen doppelten kwargmetadata_deserializerin dieqpy.load()funktion für die Angabe einerJSONDecoderUnterklasse. Standardmäßig werden diedump()undload()funktionen versuchen, JSON mit dem stdlib-Standard-Json-Encoder und -Decoder zu serialisieren und zu deserialisieren. DaQuantumCircuit.metadatajedes beliebige Python Wörterbuch enthalten kann, auch solche mit Inhalten, die vom Standard-Encoder nicht in JSON serialisierbar sind, führt dies zu Schaltungen, die nicht serialisiert werden können. Das neue Argumentmetadata_serializerfürdump()ermöglicht es den Benutzern, ein benutzerdefiniertesJSONEncoderanzugeben, das mit dem internenjson.dump()Aufruf zur Serialisierung desQuantumCircuit.metadatawörterbuchs. Dies kann dann mit dem neuen Argumentmetadata_deserializerder Funktionqpy.load()funktion kombiniert werden, um diese benutzerdefinierten JSON-Kodierungen zu dekodieren. Wennmetadata_serializerunterdump()angegeben wird,metadata_deserializeraber nicht beiload()wird der QPY geladen, aber die Metadaten des Stromkreises werden möglicherweise nicht vollständig rekonstruiert.Wenn Sie zum Beispiel eine benutzerdefinierte Serialisierung für Metadaten definieren und diese dann laden möchten, können Sie so vorgehen:
from qiskit.qpy import dump, load from qiskit.circuit import QuantumCircuit, Parameter import json import io class CustomObject: """Custom string container object.""" def __init__(self, string): self.string = string def __eq__(self, other): return self.string == other.string class CustomSerializer(json.JSONEncoder): """Custom json encoder to handle CustomObject.""" def default(self, o): if isinstance(o, CustomObject): return {"__type__": "Custom", "value": o.string} return json.JSONEncoder.default(self, o) class CustomDeserializer(json.JSONDecoder): """Custom json decoder to handle CustomObject.""" def __init__(self, *args, **kwargs): super().__init__(*args, object_hook=self.object_hook, **kwargs) def object_hook(self, o): """Hook to override default decoder.""" if "__type__" in o: obj_type = o["__type__"] if obj_type == "Custom": return CustomObject(o["value"]) return o theta = Parameter("theta") qc = QuantumCircuit(2, global_phase=theta) qc.h(0) qc.cx(0, 1) qc.measure_all() circuits = [qc, qc.copy()] circuits[0].metadata = {"key": CustomObject("Circuit 1")} circuits[1].metadata = {"key": CustomObject("Circuit 2")} with io.BytesIO() as qpy_buf: dump(circuits, qpy_buf, metadata_serializer=CustomSerializer) qpy_buf.seek(0) new_circuits = load(qpy_buf, metadata_deserializer=CustomDeserializer) -
Der
DenseLayoutpass hat ein neues Schlüsselwortargument in seinem Konstruktor,target. Dieses Argument wird verwendet, um einTargetobjekt anzugeben, das das Kompilierungsziel für den Durchgang darstellt. Wenn er angegeben wird, ersetzt er die anderen Argumente des Konstruktors,coupling_mapundbackend_prop. -
Die Klasse
Targetklasse hat eine neue Methode,operation_names_for_qargs(). Diese Methode wird verwendet, um die Namen der Operationen (d. h. die Nachschlageschlüssel im Ziel) für die Operationen auf einem gegebenenqargsTupel zu erhalten. -
Ein neuer Pass
DynamicalDecouplingPaddingwurde demqiskit.transpiler.passesmodul hinzugefügt. Dieser neue Durchgang ersetzt den bestehendenDynamicalDecouplingpass, um mit dem neuen Planungsworkflow im Transpiler zu arbeiten. Er ist eine Unterklasse desBasePadding-Durchlaufs und hängt davon ab, dass die Planungs- und Ausrichtungsanalyse-Durchläufe vor ihm in einerPassManager. Dieser neue Durchlauf kann einpulse_alignmentArgument annehmen, das eine Hardware-Beschränkung für das Start-Timing der Wellenform darstellt. Der Abstand zwischen den Gattern, die eine dynamische Entkopplungssequenz bilden, wird nun so angepasst, dass diese Bedingung erfüllt ist, so dass die Schaltung auf Hardware mit dieser Bedingung ausgeführt werden kann. Dieser Wert ist in der Regel unterBackendConfiguration.timing_constraintszu finden. Zusätzlich verfügt der Pass über eineextra_slack_distributionOption, mit der Sie steuern können, wie der zusätzliche Spielraum verteilt werden soll, wenn die Dauer der erstellten dynamischen Entkopplungssequenz kürzer ist als die Leerlaufzeit Ihrer Schaltung, die Sie mit der Sequenz füllen möchten. Die Standardeinstellung istmiddle, was dem herkömmlichen Verhalten entspricht. Mit der neuen Strategiesplit_edgeswird der zusätzliche Spielraum gleichmäßig auf den Anfang und das Ende der Sequenz aufgeteilt, anstatt ihn dem Intervall in der Mitte der Sequenz hinzuzufügen. Dies kann zu einer besseren Rauschunterdrückung führen, insbesondere wennpulse_alignment> 1 ist. -
Die Klasse
Z2Symmetriesklasse zeigt nun die Schwellentoleranzen an, mit denen kleine Real- und Imaginärteile von Koeffizienten zerhackt werden. Damit kann man steuern, wie die Koeffizienten des verjüngten Operators vereinfacht werden. Zum Beispiel:from qiskit.opflow import Z2Symmetries from qiskit.quantum_info import Pauli z2_symmetries = Z2Symmetries( symmetries=[Pauli("IIZI"), Pauli("IZIZ"), Pauli("ZIII")], sq_paulis=[Pauli("IIXI"), Pauli("IIIX"), Pauli("XIII")], sq_list=[1, 0, 3], tapering_values=[1, -1, -1], tol=1e-10, )Standardmäßig werden die Koeffizienten mit einer Toleranz von
tol=1e-14zerhackt. -
Hinzufügen einer
chop()methode zu derSparsePauliOpklasse hinzugefügt, die Real- und Imaginärteile von Koeffizienten einzeln abschneidet. Dies ist anders als dieSparsePauliOp.simplify()methode, bei der ein Koeffizient nur dann entfernt wird, wenn der absolute Wert nahe bei 0 liegt. Zum Beispiel:>>> from qiskit.quantum_info import SparsePauliOp >>> op = SparsePauliOp(["X", "Y", "Z"], coeffs=[1+1e-17j, 1e-17+1j, 1e-17]) >>> op.simplify() SparsePauliOp(['X', 'Y'], coeffs=[1.e+00+1.e-17j, 1.e-17+1.e+00j]) >>> op.chop() SparsePauliOp(['X', 'Y'], coeffs=[1.+0.j, 0.+1.j])Beachten Sie, dass bei der Chop-Methode die Koeffizienten desselben Paulis nicht kumuliert werden, z. B.
>>> op = SparsePauliOp(["X", "X"], coeffs=[1+1e-17j, 1e-17+1j) >>> op.chop() SparsePauliOp(['X', 'X'], coeffs=[1.+0.j, 0.+1.j]) -
Ein neuer kwarg,
target, wurde zum Konstruktor für denGatesInBasistranspiler-Pass. Dieses neue Argument kann verwendet werden, um optional einTargetobjekt anzugeben, das das Backend repräsentiert. Wenn dies eingestellt istTargetverwendet, um festzustellen, ob einDAGCircuitgatter außerhalb der Basismenge enthält, und das Argumentbasis_gateswird nicht verwendet. -
Teilweise Unterstützung für den Betrieb auf den Plattformen ppc64le und s390x Linux hinzugefügt. Mit dieser Version werden vorkompilierte Binärdateien für die Plattformen ppc64le und s390x Linux auf allen Python Versionen veröffentlicht. Im Gegensatz zu anderen unterstützten Plattformen unterstützen jedoch noch nicht alle Upstream-Abhängigkeiten von Qiskit diese Plattformen. Daher kann ein C/C++-Compiler erforderlich sein, um diese Abhängigkeiten zu erstellen und zu installieren, und ein einfaches
pip install qiskit-terramit einer funktionierenden Python Umgebung wird nicht ausreichen, um Qiskit zu installieren. Außerdem hindern uns dieselben Einschränkungen daran, die vorkompilierten Räder vor der Veröffentlichung zu testen, so dass die gleichen Garantien für die Plattformunterstützung, die für andere Plattformen gelten, hier nicht gelten. -
Die
GradientundQFIklassen können nun den Imaginärteil der Erwartungswertgradienten berechnen. Bei Verwendung einer anderen Bemessungsgrundlage, d. h.-Yanstelle vonZkönnen wir den Imaginärteil von Gradienten messen. Die Messbasis kann mit dem Argumentaux_meas_opfestgelegt werden.Für die Gradienten berechnet
aux_meas_op = Z0.5Re[(⟨ψ(ω)|)O(θ)|dωψ(ω)〉]undaux_meas_op = -Y0.5Im[(⟨ψ(ω)|)O(θ)|dωψ(ω)〉]. Für die QFIs berechnetaux_meas_op = Z4Re[(dω⟨<ψ(ω)|)(dω|ψ(ω)〉)]undaux_meas_op = -Yberechnet4Im[(dω⟨<ψ(ω)|)(dω|ψ(ω)〉)]. Zum Beispiel:from qiskit import QuantumRegister, QuantumCircuit from qiskit.opflow import CircuitStateFn, Y from qiskit.opflow.gradients.circuit_gradients import LinComb from qiskit.circuit import Parameter a = Parameter("a") b = Parameter("b") params = [a, b] q = QuantumRegister(1) qc = QuantumCircuit(q) qc.h(q) qc.rz(params[0], q[0]) qc.rx(params[1], q[0]) op = CircuitStateFn(primitive=qc, coeff=1.0) aux_meas_op = -Y prob_grad = LinComb(aux_meas_op=aux_meas_op).convert(operator=op, params=params) -
Die Klasse
InstructionDurationsklasse unterstützt nun die Arbeit mit Parametern einer Anweisung. Jeder Eintrag in einemInstructionDurationsobjekt besteht nun aus einem Tupel von(inst_name, qubits, duration, parameters, unit). Dies ermöglicht es einemInstructionDurationsdie Dauer eines Befehls bei einem bestimmten Parameterwert zu definieren, um unterschiedliche Dauern bei unterschiedlichen Parameterwerten eines Befehls mit einem numerischen Parameter zu berücksichtigen. -
Ein neuer Wert für das Schlüsselwortargument
stylefür die Funktion Schaltkreiszeichner wurde hinzugefügtcircuit_drawer()undQuantumCircuit.draw()methode,iqx_dark. Wennstyleaufiqx_darkmit demmplSchubladen-Backend eingestellt ist, wird die Ausgabevisualisierung ein Farbschema verwenden, das dem Farbschema des dunklen Modus ähnelt, das vom IBM Quantum Composer verwendet wird. Zum Beispiel:from qiskit.circuit import QuantumCircuit from matplotlib.pyplot import show circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.p(0.2, 1) circuit.draw("mpl", style="iqx-dark") -
Dem neuen Modul wurden mehrere "Lazy Dependency Checker" hinzugefügt
qiskit.utils.optionalshinzugefügt, mit denen abgefragt werden kann, ob bestimmte Qiskit-Funktionen verfügbar sind. Sie können zum Beispiel fragen, ob Qiskit das Vorhandensein vonmatplotliberkannt hat, indem Sieif qiskit.utils.optionals.HAS_MATPLOTLIBfragen. Diese Objekte versuchen nur, ihre Abhängigkeiten zu importieren, wenn sie abgefragt werden, so dass Sie sie im Laufzeitcode verwenden können, ohne die Importzeit zu beeinflussen. -
Die Importzeit für
qiskitwurde erheblich verbessert, insbesondere für diejenigen, die viele der optionalen Abhängigkeiten von Qiskit Terra installiert haben. -
Die Funktion
marginal_counts()funktion unterstützt nun die Marginalisierung desmemoryFeldes eines EingabeResultobjekts. Wenn zum Beispiel das Eingabeargumentresultein qiskitResultobjekt ist, das aus einer 4-Qubit-Messung stammt, können wir das erste Qubit mit marginalisieren:print(result.results[0].data.memory) marginal_result = marginal_counts(result, [0]) print(marginal_result.results[0].data.memory)Die Ausgabe sieht wie folgt aus:
['0x0', '0x1', '0x2', '0x3', '0x4', '0x5', '0x6', '0x7'] ['0x0', '0x1', '0x0', '0x1', '0x0', '0x1', '0x0', '0x1'] -
Die Interna des
StochasticSwapalgorithmus wurden neu implementiert, um multithreadingfähig zu sein, und sind nun in der Programmiersprache Rust statt in Cython geschrieben. Dadurch wird die Laufzeitleistung des Compiler-Passes und damit auchtranspile()wenn er mitoptimization_level0, 1 und 2 ausgeführt wird. Standardmäßig verwendet der Durchlauf die Anzahl der logischen CPUs auf Ihrem lokalen System, aber Sie können die Anzahl der vom Durchlauf verwendeten Threads steuern, indem Sie die UmgebungsvariableRAYON_NUM_THREADSauf einen ganzzahligen Wert setzen. Wenn Sie zum BeispielRAYON_NUM_THREADS=4einstellen, läuft dieStochasticSwapmit 4 Threads. -
Eine neue Umgebungsvariable
QISKIT_FORCE_THREADSsteht zur Verfügung, mit der Benutzer direkt steuern können, ob potenziell multithreadingfähige Teile des Qiskit-Codes in mehreren Threads ausgeführt werden sollen. Momentan wird dies nur von demStochasticSwaptranspiler pass verwendet, aber es wird wahrscheinlich in Zukunft auch in anderen Teilen von Qiskit verwendet werden. Wenn diese Umgebungsvariable aufTRUEgesetzt ist, wird jeder Multithreading-Code in Qiskit Terra immer mehrere Threads verwenden, unabhängig von anderen Laufzeitbedingungen, die andernfalls die Funktion dazu veranlasst hätten, eine Single-Thread-Variante zu verwenden. Zum Beispiel, wennStochasticSwapwenn der Durchlauf als Teil einestranspile()aufrufs mit > 1 Schaltkreis, der parallel zumultiprocessingüberparallel_map()derStochasticSwapwerden nicht mehrere Threads verwendet, um eine mögliche Überbelegung von CPU-Ressourcen zu vermeiden. Wenn Sie jedoch mehrere Threads im Durchlauf zusammen mit mehreren Prozessen verwenden möchten, können SieQISKIT_FORCE_THREADS=TRUEeinstellen. -
Neue Fake-Backend-Klassen sind unter
qiskit.providers.fake_providerverfügbar. Dazu gehören nachgebildete Versionen vonibm_cairo,ibm_hanoi,ibmq_kolkata,ibm_nairobiundibm_washington. Wie bei den anderen Fake-Backends enthalten diese Schnappschüsse von Kalibrierungs- und Fehlerdaten, die dem realen System entnommen wurden, und können für lokale Tests, Kompilierung und Simulation verwendet werden. -
Einführung einer neuen Klasse
StatePreparation. Diese Klasse ermöglicht es dem Benutzer, einen gewünschten Zustand auf die gleiche Weise wieInitializevorzubereiten, ohne dass der Reset automatisch durchgeführt wird.Um zum Beispiel ein Qubit in den Zustand zu versetzen:
import numpy as np from qiskit import QuantumCircuit circuit = QuantumCircuit(1) circuit.prepare_state([1/np.sqrt(2), -1/np.sqrt(2)], 0) circuit.draw()Die Ausgabe ist wie folgt:
┌─────────────────────────────────────┐ q_0: ┤ State Preparation(0.70711,-0.70711) ├ └─────────────────────────────────────┘ -
Der
Optimize1qGatestranspiler-Pass unterstützt jetzt die Optimierung vonU1Gate,U2Gate, undPhaseGategatter mit ungebundenen Parametern in einer Schaltung. Wenn diese Gates ungebundene Parameter hatten, konnte der Pass diese nicht verwenden. Zum Beispiel:from qiskit import QuantumCircuit from qiskit.circuit import Parameter from qiskit.transpiler import PassManager from qiskit.transpiler.passes import Optimize1qGates, Unroller phi = Parameter('φ') alpha = Parameter('α') qc = QuantumCircuit(1) qc.u1(2*phi, 0) qc.u1(alpha, 0) qc.u1(0.1, 0) qc.u1(0.2, 0) pm = PassManager([Unroller(['u1', 'cx']), Optimize1qGates()]) nqc = pm.run(qc)wird zu einer Schaltung mit nur einem Ein-Qubit-Gatter kombiniert:
qc = QuantumCircuit(1) qc.u1(2*phi + alpha + 0.3, 0) -
Die Methoden
Pauli.evolve()undPauliList.evolve()haben jetzt ein neues Schlüsselwortargument,frame, das verwendet wird, um eine Evolution eines Pauli durch einen Clifford durchzuführen. Wennframe='h'(Standardeinstellung), dann wird die Entwicklung des Heisenberg-Bildes von Pauli durch Clifford ( ) berechnet, und wennframe='s', dann wird die Entwicklung des Schrödinger-Bildes von Pauli durch Clifford ( ) berechnet. Die letztere Option führt zu einer schnelleren Berechnung und ist in bestimmten Fällen auch nützlich. Diese neue Option macht die Berechnung der gierigen Clifford-Zerlegung indecompose_clifforddeutlich schneller. -
Ein neues Modul zu Qiskit hinzugefügt:
qiskit.primitives. Im Primitivmodul werden APIs definiert, die verschiedene Abstraktionen für die Berechnung bestimmter allgemeiner Funktionen vonQuantumCircuitbereitstellen, wodurch die Details der zugrunde liegenden Ausführung aufBackendabstrahiert werden. Dadurch können sich Algorithmen und Anwendungen auf höherer Ebene auf die Durchführung der Berechnungen konzentrieren und müssen sich nicht um die Ausführung und Verarbeitung der Ergebnisse kümmern. Beispielsweise kann die Schätzung eines Erwartungswerts eines Quantenschaltkreises und einer Beobachtungsgröße von jeder Klasse durchgeführt werden, die dieBaseEstimatorimplementiert und unabhängig von der zugrundeliegenden Implementierung in einer standardisierten Weise verbraucht werden. Die Anwendungen können dann direkt über die primitive Schnittstelle geschrieben werden.Zu Beginn enthält das Modul zwei Arten von Primitiven, die
Sampler(sieheBaseSamplerfür die Definition der abstrakten Klasse) undEstimator(sieheBaseEstimatorfür die Definition der abstrakten Klasse). Referenzimplementierungen sind imqiskit.primitivesmodul enthalten und werden mit demqiskit.quantum_infomodul erstellt, die eine ideale Simulation der primitiven Operation durchführen. Die Erwartung ist, dass Anbieterpakete ihre eigenen Implementierungen dieser Schnittstellen für Anbieter anbieten, die das Protokoll effizient nativ implementieren können (typischerweise unter Verwendung einer klassischen Laufzeit). Zusätzlich wird in Zukunft für Provider, die keine native Implementierung der Primitive anbieten, eine Methode bereitgestellt, die es ermöglicht, primitive Objekte aus einerBackend. -
Ein neues Modul wurde hinzugefügt,
qiskit.qpy, das die Funktionalität enthält, die zuvor inqiskit.circuit.qpy_serializationenthalten war. Die öffentlichen Funktionen, die zuvor aufqiskit.circuit.qpy_serializationveröffentlicht wurden,dump()undload()sind jetzt über dieses neue Modul verfügbar (obwohl sie weiterhin überqiskit.circuit.qpy_serializationzugänglich sind, aber dies wird in einer zukünftigen Version veraltet sein). Dieses neue Modul wurde im Interesse der zukünftigen Ausrichtung des QPY-Dateiformats hinzugefügt, das in zukünftigen Versionen die Darstellung vonpulseScheduleundScheduleBlockobjekte zusätzlich zu denQuantumCircuitobjekte unterstützt. -
Ein neues Attribut wurde hinzugefügt,
qubit_propertieszu derTargetklasse. Dieses Attribut enthält eine Liste vonQubitPropertiesobjekten für jedes Qubit im Ziel. Zum Beispiel:target.qubit_properties[2]enthält die
QubitPropertiesfür das Qubit Nummer 2 im Ziel.Für
BackendV2autoren, wenn Sie bisherQubitPropertiesdirekt in IhrerBackendV2implementierung durch Überschreiben vonBackendV2.qubit_properties()definiert haben, wird dies immer noch gut funktionieren. Wenn Sie jedoch die Definition in das zugrunde liegendeTargetobjekt verschieben und die spezialisierteBackendV2.qubit_properties()implementierung entfernen, was die Verwendung von Qubit-Eigenschaften im Transpiler ermöglicht und auch die API-Kompatibilität mit Ihrer vorherigen Implementierung aufrechterhält. -
Eine neue Funktion wurde hinzugefügt,
qiskit.algorithms.eval_observables(), die verwendet wird, um Beobachtungswerte zu bewerten, die durch eine GrenzeQuantumCircuit. Sie stammt aus einer privaten Methode,_eval_aux_ops(), der Klasseqiskit.algorithms.VQEklasse, aber die neueeval_observables()funktion ist nun allgemeiner, so dass sie auch in anderen Algorithmen, z. B. Zeitentwicklungsalgorithmen, verwendet werden kann. -
Die Strategie der Basissuche in
BasisTranslatortranspiler pass wurde in eine Variante der Dijkstra-Suche umgewandelt, die die Laufzeitleistung des Passes erheblich verbessert, wenn versucht wird, eine unerreichbare Basis zu finden. -
Der
DenseLayouttranspiler-Durchlauf ist jetzt multithreaded, was die Laufzeitleistung des Durchlaufs erheblich verbessert. Standardmäßig wird die Anzahl der logischen CPUs auf Ihrem lokalen System verwendet, aber Sie können die Anzahl der vom Pass verwendeten Threads steuern, indem Sie die UmgebungsvariableRAYON_NUM_THREADSauf einen ganzzahligen Wert setzen. Wenn Sie zum BeispielRAYON_NUM_THREADS=4einstellen, wird derDenseLayoutdurchlauf mit 4 Threads. -
Die internen Berechnungen von
Statevector.expectation_value()undDensityMatrix.expectation_value()methoden wurden in der Programmiersprache Rust neu implementiert. Diese neue Implementierung ist multithreadingfähig und standardmäßig für eineStatevectoroderDensityMatrix>= 19 Qubits wird ein Thread-Pool mit der Anzahl der auf dem lokalen System verfügbaren logischen CPUs erzeugt. Sie können die Anzahl der verwendeten Threads steuern, indem Sie die UmgebungsvariableRAYON_NUM_THREADSauf einen ganzzahligen Wert setzen. Wenn Sie zum BeispielRAYON_NUM_THREADS=4einstellen, werden nur 4 Threads im Thread-Pool verwendet. -
Hinzufügen eines neuen
SparsePauliOp.from_sparse_list()konstruktor hinzugefügt, der eine iterable nimmt, wobei die Elemente Pauli-Terme darstellen, die selbst sparse sind, so dass"XIIIIIIIIIIIIIIIX"jetzt als("XX", [0, 16])geschrieben werden kann. Zum Beispiel, der Operator
kann nun konstruiert werden als
op = SparsePauliOp.from_sparse_list([("XZ", [0, 3], 1), ("YY", [1, 4], 2)], num_qubits=5)
# or equivalently, as previously
op = SparsePauliOp.from_list([("IZIIX", 1), ("YIIYI", 2)])Dies erleichtert die Konstruktion von sehr spärlichen Operatoren auf vielen Qubits, wie es bei Ising-Hamiltonianern oft der Fall ist.
-
Der
UnitarySynthesistranspilerpass hat ein neues Schlüsselwortargument in seinem Konstruktor,target. Dies kann verwendet werden, um optional einTargetobjekt anzugeben, das das Kompilierungsziel für den Durchgang darstellt. Wenn er angegeben wird, ersetzt er die fürbasis_gates,coupling_mapundbackend_propsfestgelegten Werte. -
Die
UnitarySynthesisPluginabstrakte Plugin-Klasse hat ein neues optionales Attribut, das Implementierungen hinzufügen können,supports_target. Wenn ein Plugin dieses Attribut aufTruegesetzt hat, wird einTargetobjekt in der Nutzlastoptionsunter dem Feldtargetübergeben. Die Erwartung ist, dass diesesTargetobjekt anstelle voncoupling_map,gate_lengths,basis_gatesundgate_errorsverwendet wird. -
Einführung eines neuen Transpiler-Pass-Workflows zur Erstellung von
PassManagerobjekten für die TerminierungQuantumCircuitobjekte im Transpiler. In dem neuen Arbeitsablauf sind alle Planungs- und AusrichtungsdurchläufeAnalysisPassobjekte, die nur den Eigenschaftssatz des Durchlaufmanagers aktualisieren, insbesondere das neue Eigenschaftssatz-Elementnode_start_time, das die absolute Startzeit jedes Opnodes enthält. Eine separateTransformationPasswie z.BPadDelaywird anschließend verwendet, um die Zeitplanung auf die DAG anzuwenden. Dieser neue Arbeitsablauf ist sowohl effizienter als auch in der Lage, zusätzliche zeitliche Beschränkungen zu korrigieren, die durch ein Backend aufgedeckt werden.Zuvor wurde die Durchlaufkette als
scheduling -> alignmentimplementiert, die beide Transformationsdurchläufe waren, so dass bei jedem Durchlauf mehrereDAGCircuitinstanzen während jedes Durchgangs neu erstellt. Darüber hinaus wurde in jedem Durchgang eine Zeitplanung vorgenommen, um die Startzeit der Anweisungen zu erhalten. Jetzt wird die erforderliche Passkettescheduling -> alignment -> padding, wobei dieDAGCircuitaktualisierung erst am Ende mit dem Durchgangpaddingerfolgt.Für diejenigen, die benutzerdefinierte
PassManagerobjekte erstellen, die eine Schaltkreisplanung beinhalten, müssen Sie IhrePassManageranpassen, um einen derBasePaddingDurchläufe einzufügen (derzeit entwederPadDelayoderPadDynamicalDecouplingverwendet werden kann) am Ende der Planungskette einfügen. Ohne den Auffüllungsdurchgang werden die Zeitplanungsdurchgänge nicht in der Ausgangsschaltung derrun()methode Ihrer benutzerdefiniertenPassManager.Wenn Sie zum Beispiel vorher Ihre
PassManagermit etwas wie:from qiskit.transpiler import PassManager from qiskit.transpiler.passes import TimeUnitConversion, ALAPSchedule, ValidatePulseGates, AlignMeasures pm = PassManager() scheduling = [ ALAPSchedule(instruction_durations), PadDelay()), ValidatePulseGates(granularity=timing_constraints.granularity, min_length=timing_constraints.min_length), AlignMeasures(alignment=timing_constraints.acquire_alignment), ] pm.append(scheduling)können Sie stattdessen verwenden:
from qiskit.transpiler import PassManager from qiskit.transpiler.passes import TimeUnitConversion, ALAPScheduleAnalysis, ValidatePulseGates, AlignMeasures, PadDelay pm = PassManager() scheduling = [ ALAPScheduleAnalysis(instruction_durations), PadDelay()), ConstrainedReschedule(acquire_alignment=timing_constraints.acquire_alignment, pulse_alignment=timing_constraints.pulse_alignment), ValidatePulseGates(granularity=timing_constraints.granularity, min_length=timing_constraints.min_length), PadDelay() ] pm.append(scheduling)die sowohl effizienter ist als auch die Befehle auf der Grundlage von Hardware-Beschränkungen ausrichtet.
-
Ein neuer Transpiler-Pass wurde hinzugefügt
ConstrainedReschedulepassieren. DerConstrainedReschedulepass berücksichtigt sowohl Hardware-Ausrichtungsbeschränkungen, die in einemBackendConfigurationobjekt definiert werden können,pulse_alignmentundacquire_alignment. Diese neue Klasse ersetzt die vorher existierendeAlignMeasuresda sie zusätzlich zur allgemeinen Befehlsausrichtung die gleiche Ausrichtung (über den Eigenschaftssatz) für Messanweisungen durchführt. Durch das Setzen desacquire_alignmentconstraint-Arguments für denConstrainedReschedulepasses ist es ein sofortiger Ersatz fürAlignMeasureswenn er mit einem neuenBasePaddingPass gepaart wird. -
Zwei neue Transpilerpässe hinzugefügt
ALAPScheduleAnalysisundASAPScheduleAnalysisdie die ÜbergängeALAPScheduleundASAPScheduleals Teil des überarbeiteten Transpiler-Workflows für Schedling ersetzen. Die neuen Durchläufe führen die gleiche Planung durch, jedoch im Eigenschaftssatz und unter Verwendung einesBasePaddingDurchlaufs, um die Schaltung auf der Grundlage der gesamten Analyse der Planungsausrichtung anzupassen.Das Standardverhalten dieser Durchläufe richtet auch die zeitliche Reihenfolge an der topologischen Reihenfolge der DAG-Knoten aus. Diese Änderung kann sich auf das Ergebnis der Zeitplanung auswirken, wenn sie bedingte Operationen oder die gleichzeitige Messung von zwei Qubits mit demselben klassischen Register umfasst (Edge-Case). Um das herkömmliche Verhalten zu reproduzieren, stellen Sie
clbit_write_latencygleich der Länge der Messanweisung ein.Betrachten Sie zum Beispiel die Planung einer Eingangsschaltung wie:
┌───┐┌─┐ q_0: ┤ X ├┤M├────────────── └───┘└╥┘ ┌───┐ q_1: ──────╫────┤ X ├────── ║ └─╥─┘ ┌─┐ q_2: ──────╫──────╫─────┤M├ ║ ┌────╨────┐└╥┘ c: 1/══════╩═╡ c_0=0x1 ╞═╩═ 0 └─────────┘ 0from qiskit import QuantumCircuit from qiskit.transpiler import InstructionDurations, PassManager from qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDelay, SetIOLatency from qiskit.visualization.timeline import draw circuit = QuantumCircuit(3, 1) circuit.x(0) circuit.measure(0, 0) circuit.x(1).c_if(0, 1) circuit.measure(2, 0) durations = InstructionDurations([("x", None, 160), ("measure", None, 800)]) pm = PassManager( [ SetIOLatency(clbit_write_latency=800, conditional_latency=0), ALAPScheduleAnalysis(durations), PadDelay(), ] ) draw(pm.run(circuit))Wie Sie in der Zeitachsenansicht sehen können, beginnt die Messung auf
q_2vor dem bedingten X-Gate aufq_1, was der topologischen Anordnung des Knotens entgegengesetzt zu sein scheint. Dies ist auch das erwartete Verhalten, da der Schreibzugriff von clbit an der Endflanke des Messbefehls erfolgt und der Lesezugriff des bedingten Gatters an der Anfangsflanke des Befehls erfolgt. So bleibt die topologische Ordnung auf dem Zeitschlitz des klassischen Registers erhalten, die von der Zeitleistenansicht nicht erfasst wird. Dies setzt jedoch eine bestimmte Mikroarchitektur voraus, und die Schaltung muss nicht so geplant werden.Bei Verwendung der Standardkonfiguration von Pässen sieht der Schaltplan wie folgt aus.
from qiskit import QuantumCircuit from qiskit.transpiler import InstructionDurations, PassManager from qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDelay from qiskit.visualization.timeline import draw circuit = QuantumCircuit(3, 1) circuit.x(0) circuit.measure(0, 0) circuit.x(1).c_if(0, 1) circuit.measure(2, 0) durations = InstructionDurations([("x", None, 160), ("measure", None, 800)]) pm = PassManager([ALAPScheduleAnalysis(durations), PadDelay()]) draw(pm.run(circuit))Beachten Sie, dass clbit während des gesamten Intervalls der Messanweisung gesperrt ist. Dieses Verhalten basiert auf dem Qiskit Pulse, bei dem der Acquire-Befehl
AcquireChannelundMemorySlotverwendet, die sich nicht mit anderen Befehlen überschneiden dürfen, d. h. ein gleichzeitiger Speicherzugriff durch die verschiedenen Befehle ist verboten. Dadurch wird auch die zeitliche Reihenfolge immer mit der topologischen Knotenreihenfolge in Einklang gebracht. -
Ein neuer Transpiler-Pass wurde hinzugefügt
PadDynamicalDecouplingder denDynamicalDecouplingdurchgang als Teil des überarbeiteten Transpiler-Workflows für die Zeitplanung ersetzt. In diesem neuen Durchgang werden dynamische Entkopplungssequenzen in die Schaltung eingefügt, und zwar nach allen Planungs- und Ausrichtungsanalysen, die in früheren Durchgängen durchgeführt wurden. -
Die
plot_gate_map()visualisierungsfunktion und die darauf aufbauenden Funktionen,plot_error_map()undplot_circuit_layout()haben ein neues Schlüsselwortargument,qubit_coordinates. Dieses Argument nimmt eine Folge von 2D Koordinaten auf, die für die Darstellung jedes Qubits im zu visualisierenden Backend verwendet werden. Falls angegeben, muss diese Sequenz eine Länge haben, die der Anzahl der Qubits auf dem Backend entspricht, und sie wird anstelle des Standardverhaltens verwendet. -
Die
plot_gate_map()visualisierungsfunktion und die darauf aufbauenden Funktionen,plot_error_map()undplot_circuit_layout()sind nun in der Lage, jedes beliebige Backend darzustellen, nicht nur solche, deren Anzahl von Qubits gleich einem der IBM Backends ist. Dies beruht auf der Funktion retworkxspring_layout(), um das Layout für die Visualisierung zu erzeugen. Wenn das Standardlayout nicht mit einem bestimmten Kopplungsgraphen eines Backends funktioniert, können Sie die Funktionqubit_coordinatesverwenden, um ein benutzerdefiniertes Layout festzulegen. -
Die
plot_gate_map()visualisierungsfunktion und die darauf aufbauenden Funktionen,plot_error_map()undplot_circuit_layout()sind nun in der Lage, mit einemBackendV2basierten Backend. Bisher funktionierten diese Funktionen nur mitBaseBackendoderBackendV1basierten Backends. -
Ein neuer Transpiler-Pass wurde hinzugefügt,
SetIOLatency. Dieser Durchlauf benötigt zwei Argumenteclbit_write_latencyundconditional_latency, um die E/A-Latenz für klassische Bits und klassische Bedingungen auf einem Backend zu definieren. Dieser Durchlauf definiert dann diese Werte im Eigenschaftssatz des Durchlaufmanagers, damit nachfolgende Durchläufe zur Planung und Ausrichtung diese Latenzen korrigieren und eine präzisere Planungsausgabe einer dynamischen Schaltung liefern können. -
Ein neuer Transpiler-Pass
PadDelaywurde hinzugefügt. Dieser Durchlauf füllt die ungenutzte Zeit auf den Qubit-Drähten mitDelayanweisungen. Dieser Durchlauf ist Teil des neuen Arbeitsablaufs für Planungsdurchläufe im Transpiler und hängt von einem Planungsanalyse-Durchlauf (wieALAPScheduleAnalysisoderASAPScheduleAnalysis) und etwaigen Ausrichtungsdurchläufen (wie z. BConstrainedReschedule), die vor dem Durchlauf vonPadDelay. -
Der
VF2Layouttranspilerpass hat ein neues Schlüsselwortargument,target, das verwendet wird, um einTargetobjekt für die Übergabe. Wenn angegeben, wird dieTargetvom Pass für alle Informationen über das Zielgerät verwendet. Wenn sie angegeben ist, hat die OptiontargetVorrang vor den Argumentencoupling_mapundproperties. -
Erlaube Callables als Optimierer in
VQEundQAOA. Nun kann der Optimierer entweder einer von Qiskits Optimierern sein, wie z.BSPSAoder ein Callable mit der folgenden Signatur sein:from qiskit.algorithms.optimizers import OptimizerResult def my_optimizer(fun, x0, jac=None, bounds=None) -> OptimizerResult: # Args: # fun (callable): the function to minimize # x0 (np.ndarray): the initial point for the optimization # jac (callable, optional): the gradient of the objective function # bounds (list, optional): a list of tuples specifying the parameter bounds result = OptimizerResult() result.x = # optimal parameters result.fun = # optimal function value return resultDie obige Signatur erlaubt auch die direkte Übergabe eines beliebigen SciPy Minimizers, zum Beispiel als
from functools import partial from scipy.optimize import minimize optimizer = partial(minimize, method="L-BFGS-B")
Bekannte Probleme
- Bei der Ausführung von
parallel_map()(was intern durch leistungsempfindliche Funktionen wietranspile()undassemble()) in einem Unterprozess, der außerhalb vonparallel_map()gestartet wird, ist es möglich, dass die parallele Abfertigung, die innerhalb vonparallel_map()ausgeführt wird, hängen bleibt und nie zurückkehrt. Dies ist auf Upstream-Probleme in CPython zurückzuführen, die die Standardmethode zum Starten von Unterprozessen auf Linux und macOS mit Python 3.7 betreffen (siehe https://bugs.python.org/issue40379 für weitere Details). Wenn Sie auf dieses Problem stoßen, haben Sie zwei Möglichkeiten: Sie können entweder die verschachtelten parallelen Prozesse entfernen, da der Aufrufparallel_map()von einem Hauptprozess aus funktionieren sollte; oder Sie können das Modulmultiprocessingder CPython-Standardbibliothek manuell aufrufen, um einen ähnlichen parallelen Versand von einem Unterprozess aus durchzuführen, aber die Startmethoden"spawn"oder"forkserver"verwenden, um zu vermeiden, dass die Dinge stecken bleiben und nie zurückkehren.
Anmerkungen zu Upgrades
-
Die Klassen
Qubit,ClbitundAncillaQubithaben jetzt das Attribut__slots__. Dadurch wird ihr Speicherbedarf reduziert. Als Nebeneffekt können ihnen nicht mehr beliebige Daten als Attribute beigefügt werden. Es ist sehr unwahrscheinlich, dass dies irgendwelche Auswirkungen auf den nachgelagerten Code hat, abgesehen von Leistungsvorteilen. -
Die Versionsanforderung für die Kernabhängigkeit
retworkxwurde von 0.10.1 auf 0.11.0 angehoben. Dadurch wird die Leistung des Transpilationspasses verbessertConsolidateBlocks. -
Die minimal unterstützte Version von
symengineist jetzt 0.9.0. Dies war notwendig, um die Kompatibilität mit dem Modul Python 'spicklezu verbessern, das intern als Teil der parallelen Abfertigung mitparallel_map(). -
Der Standardwert von
QISKIT_PARALLELbei der Ausführung mit Python 3.9 auf Linux ist jetzt aufTRUEgesetzt. Das bedeutet, dass bei der Ausführung vonparallel_map()oder Funktionen, die es intern aufrufen, wietranspile()undassemble()aufruft, wird die Funktion in mehreren Prozessen ausgeführt und sollte eine bessere Laufzeitleistung haben. Diese Änderung wurde vorgenommen, weil die Probleme mit der Zuverlässigkeit des parallelen Versands behoben zu sein scheinen (siehe #6188 für weitere Details). Wenn Sie immer noch Probleme damit haben, können Sie das Multiprocessing deaktivieren und zum vorherigen Standardverhalten zurückkehren, indem Sie die UmgebungsvariableQISKIT_PARALLELaufFALSEsetzen oder die Optionparallelin Ihrer Benutzerkonfigurationsdatei aufFalsesetzen (bitte reichen Sie auch eine Meldung ein, damit wir alle Probleme im Zusammenhang mit Multiprocessing verfolgen können). -
Die zuvor veraltete Klasse
MSGategate, die sich inqiskit.circuit.libraryzu finden war, wurde entfernt. Ursprünglich war sie in der Version 0.16.0 veraltet. Stattdessen sollte dieGMSklasse verwendet werden, da diese es ermöglicht, ein äquivalentes 2-Qubit-MS-Gate zusätzlich zu einemMSGatefür eine beliebige Anzahl von Qubits zu erstellen. -
Die zuvor veraltete Methode
mirror()der KlasseInstructionklasse wurde entfernt. Ursprünglich war sie in der Version 0.15.0 veraltet. Stattdessen sollten SieInstruction.reverse_ops(). -
Die zuvor veraltete
num_ancilla_qubits()Methode derqiskit.circuit.library.PiecewiseLinearPauliRotationsundqiskit.circuit.library.WeightedAdderklassen wurde entfernt. Ursprünglich war sie in der Version 0.16.0 veraltet. Stattdessen sollten die MethodenPiecewiseLinearPauliRotations.num_ancillas()undWeightedAdder.num_ancillas()verwendet werden. -
Das zuvor veraltete
reverseArgument im Konstruktor für diePolynomialPauliRotationsklasse wurde entfernt. Ursprünglich war sie in der Version 0.15.0 veraltet. Stattdessen sollten Sie dieQuantumCircuit.reverse_bits()methode zur Umkehrung desPolynomialPauliRotationsstromkreis umzukehren, falls erforderlich. -
Das zuvor veraltete
angleArgument bei den Konstruktoren für dieC3SXGateundC3XGategate-Klassen wurde entfernt. Ursprünglich war sie in der Version 0.17.0 veraltet. Für gebrochene 3 gesteuerte X-Gatter können Sie stattdessen die MethodeC3XGate.power()verwenden. -
Unterstützung für die Verwendung von
np.ndarrayObjekten als Teil desparamsattributs einesGateobjekts wurde entfernt. Dies ist seit Qiskit Terra 0.16.0 veraltet und wird nicht mehr funktionieren. Stattdessen sollte man eine neue Unterklasse vonGateerstellen und explizit einenp.ndarrayEingabe durch Überladen dervalidate_parameter()methode. -
Dem Installationsziel für
pip install qiskit-terrawurde ein neues Extracsp-layout-passhinzugefügt, das auch im Extraallenthalten ist. In Qiskit Terra 0.20 hat dies keine Auswirkungen, aber ab Qiskit Terra 0.21 werden die Abhängigkeiten, die nur für denCSPLayouttranspiler-Pass benötigt werden, werden von Anforderungen zu Optionen herabgestuft und durch dieses Extra installiert. Sie können ein Paket, das von diesem Pass abhängt, vorbereiten, indem Sie seine Anforderungen (oder den Befehlpip install) auf das Zielqiskit-terra[csp-layout-pass]setzen. -
Die Unterstützung für den Betrieb mit Python 3.6 wurde entfernt. Um Qiskit auszuführen, benötigen Sie mindestens die Version Python von 3.7.
-
Die
AmplitudeEstimatorerbt nun von der KlasseABCaus der Standardbibliothek Python. Dies erfordert von jeder Unterklasse die Implementierung derestimate()methode zu implementieren, während dies vorher nicht erforderlich war. Dies wurde getan, weil die ursprüngliche Absicht der Klasse war, immer eine Unterklasse vonABCzu sein, da dieestimate()für den Betrieb einesAmplitudeEstimatorobjekts erforderlich ist. Wenn Sie jedoch zuvor eineAmplitudeEstimatorunterklasse definiert haben, die nichtestimate()nicht implementiert hat, führt dies nun zu einem Fehler. -
Der Fehler, der von
HoareOptimizerausgelöst wird, wenn die optionale Abhängigkeitz3nicht verfügbar ist, hat sich vonTranspilerErrorzuMissingOptionalLibraryError(was sowohl einQiskitErrorund einImportError). Dies wurde getan, um mit den anderen optionalen Abhängigkeiten übereinzustimmen. -
Auf Linux wurde die minimale Bibliotheksunterstützung von manylinux2010 VM auf manylinux2014. Dies spiegelt ähnliche Änderungen in Numpy und Scipy wider. Für die meisten Benutzer sollte es keine nennenswerten Auswirkungen geben, es sei denn, Ihr System enthält noch eine sehr alte Version von
glibc. -
Die Funktion
marginal_counts()funktion, wenn sie mit einemResultobjekt aufgerufen wird, wird nun dasmemoryFeld der Experimentdaten marginalisiert, wenn es in der Eingabe gesetzt istResult. Zuvor wurde das Feldmemoryin der Eingabe nicht ausgegrenzt. Diese Änderung wurde vorgenommen, weil das vorherige Verhalten dazu führte, dass das Feldcountsnicht mit dem Feldmemoryübereinstimmte, nachdemmarginal_counts()aufgerufen wurde. Wenn das vorherige Verhalten gewünscht wird, kann es wiederhergestellt werden, indem manmarginalize_memory=Noneals Argument fürmarginal_counts()gesetzt wird, wodurch das Feldmemorynicht marginalisiert wird. -
Der
StochasticSwaptranspiler-Durchgang kann bei gleichem Seed-Wert unterschiedliche Ergebnisse liefern. Dies ist auf die interne Neuschreibung des Transpiler-Passes zur Verbesserung der Laufzeitleistung zurückzuführen. Das bedeutet jedoch, dass Sie, wenn Sietranspile()mitoptimization_level0, 1 (Standard) oder 2 mit einem Wert fürseed_transpilerausgeführt haben, können Sie nach dem Upgrade auf Qiskit Terra 0.20.0 eine Ausgabe mit einer anderen Swap-Zuordnung erhalten. -
Um Qiskit Terra aus dem Quellcode zu erstellen, wird nun ein Rust-Compiler benötigt. Dies ist auf die interne Neuschreibung des
StochasticSwaptranspiler-Passes, der die Laufzeitleistung des Transpilers erheblich verbessert. Der Rust-Compiler kann einfach mit rustup installiert werden, das hier zu finden ist: https://rustup.rs/ -
Das
nameattribut derPauliEvolutionGateklasse wurde so geändert, dass es immer"PauliEvolution"lautet. Diese Änderung wurde vorgenommen, um mit anderen Gates in Qiskit konsistent zu sein und ermöglicht es anderen Teilen von Qiskit, schnell zu erkennen, wann eine bestimmte Operation in einer Schaltung einPauliEvolutionGate. Sie ermöglicht zum Beispiel das Abrollen zu Pauli-Evolutionstoren.Zuvor enthielt der Name die Operatoren, die entwickelt werden, was jetzt über das
PauliEvolutionGate.labelattribut. Wenn eine Schaltung mit einemPauliEvolutionGategezeichnet wird, zeigt das Gatter immer noch die gleiche Information an, welche Gatter entwickelt werden. -
Die zuvor veralteten Methoden:
qiskit.algorithms.VQE.get_optimal_costqiskit.algorithms.VQE.get_optimal_circuitqiskit.algorithms.VQE.get_optimal_vectorqiskit.algorithms.VQE.optimal_paramsqiskit.algorithms.HamiltonianPhaseEstimationResult.most_likely_phaseqiskit.algorithms.PhaseEstimationResult.most_likely_phase
die ursprünglich in der Version Qiskit Terra 0.18.0 veraltet waren, wurden entfernt und werden nicht mehr funktionieren.
-
Die Klasse
qiskit.algorithms.VariationalAlgorithmist jetzt als abstrakte Basisklasse (ABC) definiert, so dass Klassen, die von ihr erben, sowohl eine Getter- als auch eine Setter-MethodeVariationalAlgorithm.initial_pointdefinieren müssen. -
Der
pass_managerkwarg für dietranspile()funktion wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Der bevorzugte Weg, einen Schaltkreis mit einem benutzerdefinierten Objekt zu transpilierenPassManagerobjekt zu transponieren, ist die Verwendung derrun()methode desPassManagerobjekts. -
Die früher veraltete Klasse
ParametrizedSchedulewurde entfernt und existiert nicht mehr. Diese Klasse wurde im Rahmen der Veröffentlichung von 0.17.0 veraltet. Anstatt diese Klasse zu verwenden, können Sie direkt die ParameterScheduleoderScheduleBlockobjekte parametrisieren, indem Sie einParameterobjekts an das parametrische Impulsargument. -
Das Modul
qiskit.circuit.library.probability_distributionswurde entfernt und existiert nicht mehr, wie in der Deprecation Notice von qiskit-terra 0.17.0 (veröffentlicht am 1. April 2021) beschrieben. Die betroffenen Klassen sindUniformDistribution,NormalDistributionundLogNormalDistribution. Sie werden alle in die qiskit-Finanzbibliothek in das Modul der Schaltkreisbibliothek verschoben:qiskit_finance.circuit.library.probability_distributions. -
Die bisherige Klasse
qiskit.test.mock.fake_mumbai_v2.FakeMumbaiV2wurde inFakeMumbaiFractionalCXumbenannt, um sie von demBackendV2basierten Fake-Backend für das Gerät IBM Mumbai,qiskit.test.mock.backends.FakeMumbaiV2zu unterscheiden. Wenn Sie sich bisher auf die KlasseFakeMumbaiV2verlassen haben, um ein gefälschtes Backend zu erhalten, das in seinem Ziel eine gebrochene Anwendung vonCXGatedefiniert sind, müssen Sie die KlasseFakeMumbaiFractionalCXverwenden, da die KlasseFakeMumbaiV2diese zusätzlichen Gatterdefinitionen nicht mehr in ihremTarget. -
Der Resolver, der von
QuantumCircuit.append()(und folglich alle Methoden, die eine Anweisung an eineQuantumCircuit) zur Konvertierung von Bitspezifizierern wurde geändert, um ihn schneller und zuverlässiger zu machen. Bestimmte Konstrukte wie:import numpy as np from qiskit import QuantumCircuit qc = QuantumCircuit(1, 1) qc.measure(np.array([0]), np.array([0]))funktionieren jetzt, wo sie vorher fälschlicherweise einen Fehler auslösten, aber bestimmte pathologische Eingaben wie z.B.:
from sympy import E, I, pi qc.x(E ** (I * pi))wird nun Fehler auslösen, wo sie vorher gelegentlich (fälschlicherweise) erfolgreich waren. Bei fast allen korrekten Verwendungen sollte es außer einer allgemeinen Beschleunigung keine spürbaren Änderungen geben.
-
Die halböffentliche interne Methode
QuantumCircuit._append()prüft nicht mehr die Typen ihrer Eingaben und geht davon aus, dass es keine ungültigen Duplikate in ihren Argumentlisten gibt. Diese Funktion wird von bestimmten internen Teilen von Qiskit und anderen Bibliotheken verwendet, umQuantumCircuitinstanzen so schnell wie möglich aufzubauen, indem die Fehlerprüfung übersprungen wird, wenn die Daten bereits als korrekt bekannt sind. Im Allgemeinen sollten Benutzer oder Funktionen, die Benutzerdaten entgegennehmen, die öffentlicheQuantumCircuit.append()methode verwenden, die ganzzahlige Bitspezifikationen auflöst, ihre Argumente überträgt und die Eingaben auf Korrektheit überprüft. -
Cython ist nicht länger eine Build-Abhängigkeit von Qiskit Terra und muss nicht mehr installiert werden, wenn Qiskit Terra aus dem Quellcode erstellt wird.
-
Die voreingestellten Passmanager in
qiskit.transpiler.preset_passmanagersfür alle Optimierungsstufen 2 und 3, wie sie vonlevel_2_pass_manager()undlevel_3_pass_manager()generiert werden, wurden so geändert, dass derVF2Layoutstandardmäßig vor dem Layoutdurchlauf auszuführen. DerVF2Layoutdurchgang wird schnell geprüft, ob ein perfektes Layout gefunden werden kann, und ersetzt die bisherige Vorgehensweise für die Optimierungsstufen 2 und 3, bei der eine Kombination ausTrivialLayoutundCSPLayoutum ein perfektes Layout zu finden. Dies führt zu einem potentiell anderen Verhalten, wenntranspile()standardmäßig aufgerufen wird, da es einen Standardpfad für alle Optimierungsstufen >=2 entfernt, der ein triviales Layout verwendet (bei demcircuit.qubits[0]auf das physische Qubit 0,circuit.qubits[1]auf das physische Qubit 1 usw. abgebildet wird), unter der Annahme, dass das triviale Layout perfekt ist. Wenn Ihr Anwendungsfall vom trivialen Layout abhängt, können Sie es beim Transpilieren explizit anfordern, indem Sie beim Aufruf vonlayout_method="trivial"angebentranspile(). -
Der voreingestellte Passmanager für Optimierungsstufe 1 (beim Aufruf
transpile()mitoptimization_level=1oder wenn keinoptimization_levelArgument gesetzt ist), wie er vonlevel_1_pass_manager()generiert wurde, wurde so geändert, dassVF2Layoutstandardmäßig aufgerufen wird, um schnell zu prüfen, ob ein perfektes Layout gefunden werden kann, bevor dieDenseLayout. Anders als bei den Optimierungsstufen 2 und 3 wird jedoch vor der Ausführung vonVF2Layoutein triviales Layout versucht, und wenn es ein perfektes Mapping ist, wird die Ausgabe vonVF2Layoutverwendet wird.
Hinweise zu veralteten Versionen
-
Das Argument
max_creditsfürexecute()und alle Konfigurationen vonQobj(z. B.QasmQobjConfigundPulseQobjConfig), ist veraltet und wird in einer zukünftigen Version entfernt werden. Das Kreditsystem wird auf IBM Quantum schon seit zwei Jahren nicht mehr verwendet, und die Option hat keine Auswirkungen. Eine Alternative ist nicht erforderlich. Wenn Sie zum Beispiel Folgendes aufrufenexecute()als:job = execute(qc, backend, shots=4321, max_credits=10)können Sie das Argument
max_creditseinfach weglassen:job = execute(qc, backend, shots=4321) -
Die Verwendung einer ungeraden Ganzzahl für das
orderArgument im Konstruktor derSuzukiTrotterklasse ist veraltet und wird in einer zukünftigen Version nicht mehr funktionieren. Die Produktformeln, die von derSuzukiTrotterverwendeten Produktformeln sind nur definiert, wenn die Reihenfolge gerade ist, da die Suzuki-Produktformeln symmetrisch sind. -
Die kwargs
qregs,cregs,layoutundglobal_phasefür die KlassenMatplotlibDrawer,TextDrawingundQCircuitImagesowie der kwargcalibrationsfür die KlasseMatplotlibDrawersind veraltet und werden in einer späteren Version entfernt.
Fehlerkorrekturen
-
Ein Fehler in den Schaltkreisumwandlungsfunktionen wurde behoben
circuit_to_gate()undcircuit_to_instruction()(und den zugehörigen SchaltungsmethodenQuantumCircuit.to_gate()undQuantumCircuit.to_instruction()), wenn sie auf eine Schaltung mit registerlosen Bits oder Bits in mehr als einem Register wirken. -
Ein Problem wurde behoben, bei dem der Aufruf von
QuantumCircuit.copy()in den "body"-Schaltungen einer Kontrollflussoperation, die mit der Builder-Schnittstelle erstellt wurde, einen Fehler auslöste. Zum Beispiel war dies früher ein Fehler, aber jetzt wird es erfolgreich zurückgegeben:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.if_test((creg, 0)): circ.h(0) if_else_instruction, _, _ = circ.data[0] true_body = if_else_instruction.params[0] true_body.copy() -
Ein fehlender Eintrag aus der Standard-Session-Äquivalenzbibliothek wurde zwischen
CXGateundCPhaseGatesowie zwischenCXGateundCRZGate. -
Ein Problem wurde behoben, bei dem die Ausführung des
==Operators zwischen zweiSparsePauliOpobjekten einen Fehler auslöste, wenn die beiden Operatoren eine unterschiedliche Anzahl von Koeffizienten hatten. Zum Beispiel:op = SparsePauliOp.from_list([("X", 1), ("Y", 1)]) op2 = SparsePauliOp.from_list([("X", 1), ("Y", 1), ("Z", 0)]) print(op == op2)Dies würde bisher
ValueErrorauslösen, anstattFalsezurückzugeben. -
Fixierte Unterstützung in
transpile()für die Übergabe einesInstructionScheduleMapobjekts an das zugrunde liegendePassManagerbasierend auf derTargetfürBackendV2basierten Backends. Zuvor hat dietranspile()funktion diese Verarbeitung nicht und alle Transpilerdurchläufe, die die Arbeit mit einemTargetobjekt noch nicht unterstützen, hätten keinen Zugriff auf die Standard-Impulskalibrierungen für die Anweisungen aus einemBackendV2backend. -
Die Seite
AmplitudeAmplifierist jetzt korrekt aus dem Rootqiskit.algorithmsmodul direkt verfügbar. Zuvor war sie nicht in den re-exportierten Klassen des Root-Moduls enthalten und war nur überqiskit.algorithms.amplitude_amplifierszugänglich. Behoben #7751. -
Ein Problem mit dem
mplBackend für die Schaltkreisschubladenfunktion wurde behobencircuit_drawer()und derQuantumCircuit.draw()methode, wo Gatter mit Bedingungen nicht richtig angezeigt wurden, wenn eine ausreichende Anzahl von Gattern dazu führte, dass die Schublade auf eine zweite Reihe umklappte. Behoben: #7752. -
Ein Problem wurde behoben, bei dem die Methode
HHL.construct_circuit()unter bestimmten Bedingungen kein korrektes Ergebnis lieferteQuantumCircuit. Zuvor hatte die Funktion einen Rundungsfehler bei der Berechnung der Anzahl der Qubits, die zur Darstellung der Eigenwerte erforderlich waren, was zu einer falschen Schaltungsausgabe führte. -
Ein Endianness-Fehler wurde in
BaseReadoutMitigator.expectation_value()wenn eine Zeichenkettediagonalübergeben wurde. Sie wird nun korrekt als Little Endian interpretiert, so wie der Rest von Qiskit Terra, anstatt als Big Endian. -
Es wurde ein Problem mit der Funktion
quantum_info.partial_trace()wenn die Funktion aufgefordert wurde, keine Subsysteme zu ermitteln, gibt sie nun korrekt denDensityMatrixdes Eingabezustandes mit allen verbleibenden Dimensionen zurück, anstatt einen Fehler zu verursachen. Behoben #7613 -
Ein Problem mit dem
textBackend für die Schaltkreisschubladenfunktion wurde behobencircuit_drawer()und derQuantumCircuit.draw()methode, wenn Gatter, die Seitentext verwenden, wie z.B. dieCPhaseGateundRZZGategatterklassen, mit klassischen Bedingungen nicht richtig angezeigt wurden. Behoben #7532. -
Es wurde ein Problem mit der
circuit_drawer()funktion unddraw()methode vonQuantumCircuit. Bei Verwendung der Optionreverse_bitsmit den Optionenmpl,latexodertextwurden Bits ohne Register nicht in der richtigen Reihenfolge angezeigt. Behoben #7303. -
Es wurde ein Problem in der
LocalReadoutMitigator.assignment_matrix()methode behoben, bei der zuvor ein Eingabewert für das Argumentqubitszurückgewiesen wurde, der keine triviale Folge von Qubits in der Form:[0, 1, 2, ..., n-1]war. Dies wurde korrigiert, so dass nun eine beliebige Liste von zu messenden Qubit-Indizes von der Methode akzeptiert wird. -
Es wurde ein Problem in der
StabilizerState.expectation_value()erwartungswertberechnung der Methode behoben, bei der der Ausgabeerwartungswert falsch war, wenn der Eingabeoperator für das ArgumentPaulioperator für dasoperArgument eine nicht-triviale Phase hatte. Behoben #7441. -
Ein Opflow-Ausdruck, der die Pauli-Identität
opflow.Ienthält, erzeugt nicht mehr einIGatewenn er in eine Schaltung umgewandelt wird. Diese Änderung behebt einen Unterschied in der Erwartung; das Identitätsgatter in der Schaltung zeigt eine Verzögerung an, während wir in Opflow eine mathematische Identität erwarten - was bedeutet, dass überhaupt keine Operation stattfindet. -
Die Website
PauliGatefügt nicht mehr einIGatefür Paulis mit der Bezeichnung"I"ein. -
PauliSumOpgleichheitstests behandeln jetzt den Fall, dass eines der verglichenen Elemente ein einzelnes istPauliOp. Beispielsweise ergibt0 * X + I == Ijetzt den Wert True, während er vor dieser Version False war. -
Es wurde ein Problem mit den
ALAPScheduleundASAPScheduletranspilerdurchläufen, wenn mit Anweisungen gearbeitet wurde, für die benutzerdefinierte Impulskalibrierungen (d.h. Impulsgatter) festgelegt waren. Bisher wurde bei den Planungsdurchläufen nicht die Dauer aus der benutzerdefinierten Impulskalibrierung für diese Anweisungen verwendet, was dazu führte, dass eine falsche Planung für die Schaltung erstellt wurde. Dieses Problem wurde behoben, so dass die Planungsdurchläufe jetzt die Dauer der benutzerdefinierten Impulskalibrierung für jeden Befehl im Schaltkreis verwenden, der eine benutzerdefinierte Kalibrierung hat. -
Unterstützung für die Verwendung von
ParameterExpressionanweisungsparamater imRZXCalibrationBuildertranspiler-Durchgang. Wenn ein Befehlsparameter eine BindungParameterExpressionenthielt, konnte der Pass dies nicht korrekt verarbeiten. -
Stoppte den Parser in
QuantumCircuit.from_qasm_str()undfrom_qasm_file()OpenQASM Programme zu akzeptieren, die sich als aus einer anderen Sprachversion als 2.0 stammend identifizieren. Dieser Parser ist nur für OpenQASM 2.0; Unterstützung für importierte Schaltungen von OpenQASM 3.0 wird in einer kommenden Version hinzugefügt werden. -
Der OpenQASM 3 Exporter,
qasm3.Exporterentgeht nun Register- und Parameternamen, die mit reservierten OpenQASM 3 Schlüsselwörtern kollidieren, indem er einen neuen eindeutigen Namen erzeugt. Bei Registern und Parametern mit demselben Namen kommt es in der Codeausgabe des OpenQASM 3-Exporters nicht mehr zu Namenskonflikten. Behoben #7742.
Aer- 0.10.3
Keine Änderung
Ignis- 0.7.0
Keine Änderung
IBM Q Anbieter 0.18.3
Keine Änderung