Qiskit 0.33 Versionshinweise
0.33.1
Terra- 0.19.1
Vorspiel
Qiskit Terra 0.19.1 ist ein Bugfix-Release, das einige Probleme in 0.19.0 behebt, die mit dem Control-Flow-Builder-Interface konstruierte Schaltkreise, bedingte Gatter und die QPY-Serialisierung von neueren Terra-Objekten betreffen.
Hinweise zu veralteten Versionen
-
Die losen Funktionen
qiskit.circuit.measure.measure()undqiskit.circuit.reset.reset()sind veraltet und werden in einer zukünftigen Version entfernt. Stattdessen sollten Sie auf diese als Methoden aufQuantumCircuit:from qiskit import QuantumCircuit circuit = QuantumCircuit(1, 1) # Replace this deprecated form ... from qiskit.circuit.measure import measure measure(circuit, 0, 0) # ... with either of the next two lines: circuit.measure(0, 0) QuantumCircuit.measure(circuit, 0, 0)
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. Früher wurde die Anzahl der Bits, die für das erstellte Gatter oder die Anweisung erforderlich waren, falsch berechnet, was häufig zu einer Ausnahme während der Konvertierung führte. -
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() -
Die Schnittstelle des Control-Flow-Builders unterstützt jetzt die Verwendung von
ClassicalRegisters als Bedingungen in verschachtelten Kontrollablaufbereichen. Früher führte dies zwar nicht sofort zu einem Fehler, aber die internen Schaltkreisblöcke hatten nicht die richtigen Register definiert, so dass spätere Logik, die mit den inneren Blöcken arbeitete, fehlschlug.Früher schlugen die Schubladen beispielsweise fehl, wenn sie versuchten, einen inneren Block zu zeichnen, der durch ein klassisches Register bedingt war, während dies jetzt gelingt, wie in diesem Beispiel:
from qiskit import QuantumCircuit from qiskit.circuit import QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.for_loop(range(10)) as a: circ.ry(a, 0) with circ.if_test((creg, 1)): circ.break_loop() print(circ.draw(cregbundle=False)) print(circ.data[0][0].blocks[0].draw(cregbundle=False)) -
Behoben
qpy_serializationUnterstützung für die SerialisierungQuantumCircuitobjekten, dieParameterVectoroderParameterVectorElementals Parameter verwenden. Zuvor wurde einParameterVectorElementParameter einfach alsParameterfür die QPY-Serialisierung behandelt, was bedeutete, dass derParameterVectorkontext in QPY verloren ging und die Reihenfolge der Ausgabe vonparametersfalsch sein konnte.Um dieses Problem zu beheben, war eine neue Version des QPY-Formats, Version 3, erforderlich. Diese neue Formatversion enthält eine Darstellung der Klasse
ParameterVectorElement, die in der Dokumentationqpy_serializationunter PARAMETER_VECTOR_ELEMENT beschrieben ist. -
Die
qpy_serializationUnterstützung für die Serialisierung einesPauliEvolutionGateobjekts. Zuvor wurde dasPauliEvolutionGateals benutzerdefiniertes Gatter für die Serialisierung behandelt und würde als einGateobjekt deserialisiert, das die gleiche Definition und den gleichen Namen wie das Original hattePauliEvolutionGate. Dadurch würde jedoch der ursprüngliche Zustand derPauliEvolutionGate. Dies wurde behoben, so dass ab dieser Version einPauliEvolutionGatein der Schaltung nun 1:1 über die QPY-Serialisierung hinweg beibehalten wird. Die einzige Einschränkung dabei ist, dass keine benutzerdefiniertenEvolutionSynthesisklassen unterstützt. Nur die verfügbaren Klassen vonqiskit.synthesiskönnen mit einerPauliEvolutionGatefür die qpy-Serialisierung verwendet werden.Um dieses Problem zu beheben, war eine neue Version des QPY-Formats, Version 3, erforderlich. Diese neue Formatversion enthält eine Darstellung der
PauliEvolutionGateklasse, die in der Dokumentationqpy_serializationunter PAULI_EVOLUTION beschrieben ist. -
Zwei lose Funktionen
qiskit.circuit.measure.measure()undqiskit.circuit.reset.reset()wurden versehentlich entfernt, ohne dass eine Verfallsfrist angegeben wurde. Sie wurden wieder eingeführt, sind aber als veraltet gekennzeichnet und werden durch die MethodenQuantumCircuit.measure()undQuantumCircuit.reset()gekennzeichnet und werden in einer zukünftigen Version entfernt.
Sonstige Anmerkungen
-
Die neue Control-Flow-Builder-Schnittstelle verwendet verschiedene Kontextmanager und Hilfsobjekte, um ihre Arbeit zu erledigen. Diese sollten nicht als Teil der öffentlichen API betrachtet werden und können ohne Vorwarnung geändert und entfernt werden. Die Verwendung der Builder-Schnittstelle bietet Stabilitätsgarantien in dem Sinne, dass das Verhalten, das durch
QuantumCircuit.for_loop(),while_loop()undif_test()für die Builder-Schnittstelle beschriebene Verhalten den Standardverfallspolicen unterliegt, die eigentlichen Objekte, die dazu verwendet werden, jedoch nicht. Sie sollten sich nicht darauf verlassen, dass die Objekte (z. B.IfContextoderControlFlowBuilderBlock) an ihren aktuellen Positionen vorhanden sind oder dass ihnen Methoden oder Attribute zugeordnet sind.Dies war zuvor in der Pressemitteilung 0.19.0 nicht klar. Alle derartigen Objekte haben jetzt eine Warnung in ihren Dokumentationsstrings, die dies deutlich macht. Es ist wahrscheinlich, dass sich ihre Standorte und Unterstützungsmaßnahmen in Zukunft stark unterscheiden werden.
Aer- 0.9.1
Keine Änderung
Ignis- 0.7.0
Keine Änderung
IBM Q Anbieter 0.18.2
Fehlerkorrekturen
- In #1065 wurde ein Problem behoben, bei dem der Job abstürzte, wenn
Parameterin den Metadaten des Stromkreises übergeben wurde. - Fix geliefert in #1094 für das Problem, dass
qiskit.providers.ibmq.runtime.RuntimeEncoderein zusätzliches decompose() ausführt, wenn die zu serialisierende Schaltung eineBlueprintCircuitist.
0.33.0
Diese Version markiert offiziell das Ende der Unterstützung für das Qiskit Aqua Projekt in Qiskit. Ursprünglich war es in der Version 0.25.0 veraltet, und wie in dieser Version dokumentiert wurde, wurde das Paket qiskit-aqua aus dem Qiskit-Metapaket entfernt, was bedeutet, dass pip install qiskit nicht mehr qiskit-aqua enthalten wird. Aufgrund von Einschränkungen bei der Paketierung von Python können wir jedoch eine bereits vorhandene Installation von qiskit-aqua nicht automatisch entfernen, wenn wir eine frühere Version von Qiskit mit pip install -U qiskit auf diese Version (oder eine zukünftige Version) aktualisieren. Wenn Sie von einer früheren Version aufrüsten, wird empfohlen, Qiskit Aqua mit pip uninstall qiskit-aqua manuell zu deinstallieren oder in einer neuen Python-Umgebung zu installieren.
Die Anwendungsmodule, die von qiskit-aqua bereitgestellt wurden, wurden in mehrere neue Pakete aufgeteilt: qiskit-optimization, qiskit-nature, qiskit-machine-learning, und qiskit-finance. Diese Pakete können selbst installiert werden (über den Standardbefehl pip install, z. B. pip install qiskit-nature) oder mit dem Rest des Qiskit-Metapakets als optionale Extras (z. B. pip install 'qiskit[finance,optimization]' oder pip install 'qiskit[all]'). Die Kernalgorithmen und der Operator Flow sind jetzt als Teil von Qiskit Terra unter qiskit.algorithms und qiskit.opflow verfügbar. Abhängig von Ihrer bisherigen Nutzung von Aqua sollten Sie entweder die Anwendungspakete oder die neuen Module in Qiskit Terra verwenden. Weitere Einzelheiten zur Migration von Qiskit Aqua finden Sie in der Aqua-Migrationsanleitung.
Mit dieser Version wird auch das Qiskit Ignis-Projekt offiziell abgeschafft. Dementsprechend wird in einer zukünftigen Version das Paket qiskit-ignis aus dem Qiskit-Metapaket entfernt werden, was bedeutet, dass in dieser zukünftigen Version pip install qiskit nicht mehr qiskit-ignis enthalten sein wird. Qiskit Ignis wurde von dem Projekt Qiskit Experiments abgelöst und die aktive Entwicklung wurde eingestellt. Kritische Fehler- und Kompatibilitätskorrekturen werden weiterhin durchgeführt, um den Nutzern die Möglichkeit zu geben, von Ignis zu migrieren, auch wenn es veraltet ist. Nach Ablauf der Abschreibungsfrist (die nicht kürzer als 3 Monate nach dieser Veröffentlichung sein wird) wird das Projekt eingestellt und archiviert. Einzelheiten zum Wechsel von Qiskit Ignis zu Qiskit Experiments finden Sie in der Migrationsanleitung.
Terra- 0.19.0
Vorspiel
Die Highlights der Qiskit Terra 0.19 Version sind:
- Eine neue Version der abstrakten Qiskit/Hardware-Schnittstelle in Form von
BackendV2, die mit einer neuen DatenstrukturTargetausgestattet ist, die es Backends ermöglicht, ihre Constraints für den Transpiler besser zu modellieren. - Eine erweiterbare Plugin-Schnittstelle zum
UnitarySynthesistranspilerpass, die es Benutzern oder anderen Paketen ermöglicht, die Syntheseroutinen von Qiskit Terra um neue Methoden zu erweitern. - Kontrollflussanweisungen, zur Darstellung von
forundwhileSchleifen undif/elseAnweisungen inQuantumCircuit. Die Simulatoren in Qiskit Aer werden bald in der Lage sein, mit diesen neuen Befehlen zu arbeiten, so dass Sie dynamischere Quantenprogramme schreiben können. - Vorläufige Unterstützung für die sich entwickelnde Spezifikation OpenQASM 3. Sie können das neue
qiskit.qasm3modul verwenden, um IhreQuantumCircuits in OpenQASM 3 zu serialisieren, einschließlich der neuen Kontrollflusskonstrukte.
Mit dieser Version endet die Unterstützung für Python 3.6 in Qiskit. Diese Version von Qiskit Terra und alle nachfolgenden Bugfix-Versionen der 0.19.x Serie werden die letzte sein, die mit Python 3.6 funktioniert. Ab dem nächsten Minor-Release ( 0.20.0 ) von Qiskit Terra wird die minimal erforderliche Version Python 3.7 sein.
Wie immer gibt es auch in dieser Version viele weitere Funktionen und Fehlerbehebungen, die Sie weiter unten nachlesen können.
Neue Funktionen
-
QuantumCircuit.decompose()und der entsprechende Transpiler-PassDecomposeakzeptieren nun optional einen Parameter, der eine Sammlung von Gatternamen enthält. Wenn dieser Parameter angegeben wird, werden nur Gatter mit übereinstimmenden Namen zerlegt. Dies unterstützt Unix-Shell-ähnliche Wildcard-Matches. Zum Beispiel:qc.decompose(["h", "r[xz]"])zerlegt alle
h,rxoderrzGatter, lässt aber (z. B.)xGatter unangetastet. -
Das Argument
termination_checkerwurde demSPSAoptimierer hinzugefügt. Dies ermöglicht dem Benutzer, ein benutzerdefiniertes Abbruchkriterium zu implementieren.import numpy as np from qiskit.algorithms.optimizers import SPSA def objective(x): return np.linalg.norm(x) + .04*np.random.rand(1) class TerminationChecker: def __init__(self, N : int): """ Callback to terminate optimization when the average decrease over the last N data points is smaller than the specified tolerance. """ self.N = N self.values = [] def __call__(self, nfev, parameters, value, stepsize, accepted) -> bool: """ Returns: True if the optimization loop should be terminated. """ self.values.append(value) if len(self.values) > self.N: last_values = self.values[-self.N:] pp = np.polyfit(range(self.N), last_values, 1) slope = pp[0] / self.N if slope > 0: return True return False maxiter = 400 spsa = SPSA(maxiter=maxiter, termination_checker=TerminationChecker(10)) parameters, value, niter = spsa.optimize(2, objective, initial_point=np.array([0.5, 0.5])) -
Hinzufügen einer neuen Version der
Backendschnittstelle,BackendV2. Diese neue Version ist eine große Veränderung gegenüber der Vorgängerversion,BackendV1und ändert sowohl das Benutzerzugriffsmuster für die Eigenschaften des Backends (wie die Anzahl der Qubits usw.) als auch die Art und Weise, wie das Backend seine Beschränkungen dem Transpiler mitteilt. Die Ausführung von Schaltungen (über dierun()methode) bleibt unverändert. Mit einemBackendV2backend anstelle eines separatenconfiguration(),properties(), unddefaults()Methoden, die dieBackendConfiguration,BackendProperties, undPulseDefaultsobjekte konstruieren, wie in derBackendV1schnittstelle, sind die in diesen Ausgabeobjekten enthaltenen Attribute direkt als Attribute desBackendV2objekts. Um zum Beispiel die Anzahl der Qubits für ein Backend mitBackendV1zu erhalten, würden Sie dies tun:num_qubits = backend.configuration().n_qubitswährend bei
BackendV2es ist:num_qubits = backend.num_qubitsDie andere Änderung ist, dass die Anzahl der Attribute, die in der abstrakten
BackendV2klasse eine hardware- und herstellerunabhängige Menge an erforderlichen oder optionalen Feldern enthält, die der Rest von Qiskit heute mit jedem Backend verwenden kann. Unterklassen der abstraktenBackendV2klasse können Unterstützung für zusätzliche Attribute und Methoden hinzufügen, die über die inBackendV2definiert sind, hinzufügen, aber diese werden nicht durchgängig in Qiskit unterstützt.Die andere kritische Änderung, die vor allem für Autoren von Anbietern wichtig ist, ist die Art und Weise, wie ein
BackendV2die Eigenschaften eines bestimmten Backends an den Transpiler weitergibt. MitBackendV2erfolgt dies über einTargetobjekt. DieTarget, das über das Attributtargetattribut angezeigt wird, wird verwendet, um den Satz von Einschränkungen für die Ausführung von Schaltkreisen auf einem bestimmten Backend darzustellen. Sie enthält die Teilmenge der Informationen, die zuvor von derBackendConfiguration,BackendProperties, undPulseDefaultsveröffentlichten Informationen, die der Transpiler aktiv nutzen kann. Bei der Migration eines Anbieters zur Verwendung vonBackendV2(oder bei der Erstellung eines neuen Anbieterpakets) geht es bei der Konstruktion von Backend-Objekten hauptsächlich um die Erstellung einesTargetobjekts für das Backend. -
Hinzufügen einer neuen
Targetklasse zu demtranspilermodul hinzugefügt. DieTargetklasse soll dem Compiler die Beschränkungen des Backends darstellen. DieTargetklasse ist für die Verwendung mit einemBackendV2backend verwendet werden und ist die Art und Weise, wie Backends in Zukunft ihre Einschränkungen für den Transpiler modellieren werden. Sie fasst die bisher getrennten Felder, die zur Steuerung destranspile()zielgeräts (z. B.basis_gates,coupling_map,instruction_durations, usw.) in einer einzigen Datenstruktur. Außerdem werden zusätzliche Funktionen zu den bisher verfügbaren hinzugefügt, z. B. die Darstellung heterogener Gattersätze, Multi-Qubit-Gatterkonnektivität und abgestimmte Varianten derselben Gatter. Zurzeit berücksichtigt der Transpiler noch nicht alle diese Einschränkungen, aber mit der Zeit wird er die zusätzlichen Funktionen nutzen. -
Die
Optionsklasse hat jetzt optionale Unterstützung für die Angabe von Validatoren. Dies ermöglichtBackendautoren die Möglichkeit, optional eine grundlegende Validierung der vom Benutzer eingegebenen Werte für Felder imOptionsobjekt. Wenn Sie zum Beispiel einOptionsobjekt mit definiert:from qiskit.providers.Options options = Options(shots=1024)können Sie einen Validator für Schüsse einstellen, der zwischen 1 und 4096 liegt:
options.set_validator('shots', (1, 4096))Wenn der Validator gesetzt ist, wird bei jedem Aufruf der
update_options()methode, wennshotsaktualisiert wird, dass der vorgeschlagene neue Wert innerhalb des gültigen Bereichs liegt. -
Ein neuer Transpiler-Analysedurchgang wurde hinzugefügt,
ContainsInstructionzu demqiskit.transpiler.passesmodul. Dieser Durchlauf wird verwendet, um festzustellen, ob eine Schaltung eine bestimmte Anweisung enthält. Sie nimmt bei der Initialisierung einen einzigen Parameter auf, den Namen der Anweisung, auf die geprüft werden soll, und setzt einen Booleschen Wert im Eigenschaftssatz, ob die Schaltung diese Anweisung enthält oder nicht. Zum Beispiel:from qiskit.transpiler.passes import ContainsInstruction from qiskit.circuit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() property_set = {} # Contains Hadamard contains_h = ContainsInstruction("h") contains_h(circuit, property_set) assert property_set["contains_h"] == True # Not contains SX contains_sx = ContainsInstruction("sx") contains_sx(circuit, property_set) assert property_set["contains_sx"] == False -
Hinzufügen einer Hilfsfunktion
qiskit.utils.detach_prefix()hinzugefügt, die ein Gegenstück zuapply_prefix(). Die neue Funktion gibt ein Tupel aus skaliertem Wert und Präfix aus einem gegebenen Float-Wert zurück. Zum Beispiel wird ein Wert1.3e8in(130, "M")umgewandelt, der verwendet werden kann, um einen Wert im benutzerfreundlichen Format, wie130 MHz, anzuzeigen. -
Die Werte
"gate_error"und"balanced"sind jetzt für die Optionobjectivebei der Konstruktion des ObjektsBIPMappingverfügbar, und"balanced"ist jetzt der Standardwert.Das Ziel
"gate_error"erfordert die Übergabe einerBackendPropertiesinstanz imbackend_propkwarg, die die 2q-gate Gatterfehler enthält, die bei der Berechnung der Ziele verwendet werden. Das Ziel"balanced"verwendet dieBackendPropertiesinstanz, wenn sie gegeben ist, aber ansonsten wird eine CX-Fehlerquote angenommen, wie sie im neuen Parameterdefault_cx_error_rateangegeben ist. Die relative Gewichtung der Gate-Fehler- und Tiefenkomponenten des ausgewogenen Ziels kann mit dem neuen Parameterdepth_obj_weightgesteuert werden. -
Jedes Attribut der Klasse
VQEklasse, das bei der Initialisierung gesetzt wird, ist nun über Getter und Setter zugänglich. Außerdem können die Standardwerte der VQE-Attributeansatzundoptimizerzurückgesetzt werden, indem ihnenNonezugewiesen wird:vqe = VQE(my_ansatz, my_optimizer) vqe.ansatz = None # reset to default: RealAmplitudes ansatz vqe.optimizer = None # reset to default: SLSQP optimizer -
Hinzufügen einer neuen Methode
PauliList.group_qubit_wise_commuting()die a partitioniertPauliListin Mengen von gegenseitig qubit-weise kommutierendenPaulioperatoren unterteilt. Zum Beispiel:from qiskit.quantum_info import PauliList, Pauli pauli_list = PauliList([Pauli("IY"), Pauli("XX"), Pauli("YY"), Pauli("YX")]) pauli_list.group_qubit_wise_commuting() -
Hinzufügen einer neuen Kopplungskarten-Konstruktormethode
CouplingMap.from_hexagonal_lattice()für die Konstruktion einer hexagonalen Gitterkopplungskarte. Zum Beispiel, um eine 2x2 hexagonale Gitterkopplungskarte zu konstruieren:from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_hexagonal_lattice(2, 2) cmap.draw() -
Neue Fake-Backend-Klassen sind unter
qiskit.test.mockverfügbar. Dazu gehören nachgebildete Versionen vonibmq_brooklyn,ibmq_manila,ibmq_jakartaundibmq_lagos. Wie bei den anderen Fake-Backends enthalten diese Schnappschüsse von Kalibrierungsdaten (d. h.backend.defaults()) und Fehlerdaten (d.h.backend.properties()) die dem realen System entnommen sind und für lokale Tests, Kompilierung und Simulation verwendet werden können. -
Hinzufügen der
OperatorBase.is_hermitian()methode hinzugefügt, um zu prüfen, ob der Operator hermitisch ist oder nicht.NumPyEigensolverundNumPyMinimumEigensolvereighodereigshverwenden, um das Eigenwertproblem zu lösen, wenn der Operator hermitisch ist. -
Eine neue Konstruktormethode hinzugefügt
PassManagerConfig.from_backend(). Es konstruiert einPassManagerConfigobjekt mit Benutzeroptionen und der Konfiguration eines Backends. Mit dieser Funktion kann ein voreingestellter Passmanager einfacher erstellt werden. Zum Beispiel:from qiskit.transpiler.passmanager_config import PassManagerConfig from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.test.mock import FakeMelbourne pass_manager = level_1_pass_manager( PassManagerConfig.from_backend(FakeMelbourne(), seed_transpiler=42) ) -
Ein neuer Transpiler-Pass,
PulseGateswurde hinzugefügt, der automatisch benutzerdefinierte Kalibrierungen aus der Anweisungsübersicht extrahiert und den Gatterplan an die gegebene (transpilierte) Quantenschaltung als Impulsgatter anfügt.Der
PulseGatestranspiler-Pass wird auf alle Optimierungsstufen von 0 bis 3 angewendet. Es wird keine Gate-Implementierung aktualisiert, es sei denn, der Endnutzer setzt diebackend.defaults().instruction_schedule_mapausdrücklich außer Kraft. Dieser Durchgang erspart dem Benutzer den individuellen AufrufQuantumCircuit.add_calibration()für jeden Schaltkreis, der auf der Hardware läuft.Um diesen neuen Pass zu ergänzen, wurde ein Zeitplan zu
InstructionScheduleMapund wird implizit mit einem Metadatenfeld"publisher"aktualisiert. Backend-kalibrierte Gatterpläne haben eine spezielle Verlegerart, um zu vermeiden, dass Schaltkreise mit Kalibrierungen von bereits bekannten Plänen überlagert werden. Normalerweise brauchen sich die Endnutzer nicht um diese Metadaten zu kümmern, da sie automatisch angewendet werden. Sie könnenInstructionScheduleMap.has_custom_gate()aufrufen, um zu prüfen, ob die Karte über eine benutzerdefinierte Gate-Kalibrierung verfügt.Im folgenden Code-Beispiel erfahren Sie, wie Sie die benutzerdefinierte Gatter-Implementierung für alle ausgeführten Schaltungen anwenden können.
from qiskit.test.mock import FakeGuadalupe from qiskit import pulse, circuit, transpile backend = FakeGuadalupe() with pulse.build(backend, name="x") as x_q0: pulse.play(pulse.Constant(160, 0.1), pulse.drive_channel(0)) backend.defaults().instruction_schedule_map.add("x", (0,), x_q0) circs = [] for _ in range(100): circ = circuit.QuantumCircuit(1) circ.sx(0) circ.rz(1.57, 0) circ.x(0) circ.measure_active() circs.append(circ) circs = transpile(circs, backend) circs[0].calibrations # This returns calibration only for x gateBeachten Sie, dass die Befehlsplan-Map ein veränderbares Objekt ist. Wenn Sie einen der Einträge überschreiben und dieses Backend für andere Experimente verwenden, kann es sein, dass Sie versehentlich die Gate-Definition aktualisieren.
backend = FakeGuadalupe() instmap = backend.defaults().instruction_schedule_map instmap.add("x", (0, ), my_x_gate_schedule) qc = QuantumCircuit(1, 1) qc.x(0) qc.measure(0, 0) qc = transpile(qc, backend) # This backend uses custom X gateWenn Sie die Gatterdefinitionen eines bestimmten Experiments aktualisieren möchten, müssen Sie zunächst die Befehlsplan-Map tiefkopieren und sie direkt an den Transpiler übergeben.
-
Es wurde eine neue Option
qubit_subsetin den Konstruktor vonBIPMappingaufgenommen. Die Option ermöglicht es uns, die zu verwendenden physikalischen Qubits (incoupling_mapdes Geräts) während des Mappings in einer Zeile anzugeben:mapped_circ = BIPMapping( coupling_map=CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]), qubit_subset=[1, 3, 4] )(circ)Um dasselbe zu tun, mussten wir bisher eine reduzierte
coupling_mapbereitstellen, die nur die zu verwendenden Qubits enthält, die resultierende Schaltung in die ursprünglichecoupling_mapeinbetten und dieQuantumCircuit._layoutentsprechend aktualisieren:reduced_coupling = coupling_map.reduce(qubit_to_use) mapped = BIPMapping(reduced_coupling)(circ) # skip the definition of fill_with_ancilla() # recover circuit on original coupling map layout = Layout({q: qubit_to_use[i] for i, q in enumerate(mapped.qubits)}) for reg in mapped.qregs: layout.add_register(reg) property_set = {"layout": fill_with_ancilla(layout)} recovered = ApplyLayout()(mapped, property_set) # recover layout overall_layout = Layout({v: qubit_to_use[q] for v, q in mapped._layout.get_virtual_bits().items()}) for reg in mapped.qregs: overall_layout.add_register(reg) recovered._layout = fill_with_ancilla(overall_layout) -
Die Argumente
ignore_pauli_phaseundcopywurden dem Konstruktor vonSparsePauliOp.ignore_pauli_phaseverhindert, dass das Attributphaseeiner EingabePauliListvom Lesen abgehalten wird, was performanter ist, wenn diePauliListbereits bekannt ist, dass alle Phasen in der internen ZX-Konvention den Wert Null haben.copyermöglicht es den Nutzern, das Kopieren der Eingabedaten zu vermeiden, wenn sie ausdrücklichcopy=Falseeinstellen. -
Verbesserte Leistung der folgenden
SparsePauliOpoperationen:simplify()(siehe #7122 )compose()(siehe #7126 )_add()(siehe #7138 )from_list()und__init__()(siehe andere Diskussion in #7138 ).
-
Hinzufügen der
SparsePauliOp.sum()methode zum Zusammenzählen vielerSparsePauliOps. Diese Methode ist wesentlich leistungsfähiger als das Zusammenzählen der Instanzen in einer Schleife. Der bisherige Weg, um zum Beispiel mehrereSparsePauliOps zu addieren, wäre zum Beispiel so:from qiskit.quantum_info import SparsePauliOp, random_pauli_list sparse_ops = [SparsePauliOp(random_pauli_list(10, 10)) for _ in [None]*1000] total = sparse_ops[0] for op in sparse_ops[1:]: total += opDies kann nun wesentlich effizienter erfolgen (sowohl was die Geschwindigkeit als auch die Tipparbeit betrifft) als:
SparsePauliOp.sum(sparse_ops) -
Ein Argument
limit_amplitudewurde zum Konstruktor vonParametricPulsehinzugefügt, der die Basisklasse vonGaussian,GaussianSquare,DragundConstant, um die Deaktivierung der Amplitudengrenze von 1 für jeden einzelnen Impuls zu ermöglichen. Beilimit_amplitude=Falsekönnen einzelne Impulse eine Amplitude von mehr als 1 haben, ohne einePulseError. Siehe #6544 für weitere Einzelheiten. -
Mit
QuantumCircuit.draw()odercircuit_drawer()mit der Schubladelatexwird nun eine Datei in einem Bildformat erzeugt, das z. B. aus der Dateinamenerweiterung abgeleitet wird:import qiskit circuit = qiskit.QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.draw('latex', filename='./file.jpg')Dadurch wird die Schaltkreiszeichnung im JPEG-Format gespeichert. Zuvor war das Bild immer im PNG-Format. Siehe #6448 für weitere Einzelheiten.
Wenn es nun auf eine nicht unterstützte Dateinamenerweiterung stößt, zum Beispiel:
circuit.draw('latex', filename='./file.spooky')wird eine
ValueErrorerstellt, um die Dateinamenerweiterung in ein unterstütztes Bildformat zu ändern. -
Der Parameter
filenamewurde zuplot_gate_map()undplot_coupling_map()hinzugefügt, der das Speichern der resultierenden Bilder in einer Datei ermöglicht. -
Einführung eines approximativen Quantencompilers und einer entsprechenden Implementierung eines unitären Synthese-Plugins. Die wichtigste AQC-Klasse ist
AQCfür eine eigenständige Version, die eine unitäre Matrix in eine approximative Schaltung umwandelt. Das Plugin kann aufgerufen werden durchtranspile()aufgerufen werden, wenn das Argumentunitary_synthesis_methodauf'aqc'gesetzt ist. Sieheqiskit.transpiler.synthesis.aqcfür alle Einzelheiten. -
Ein
filter_functionArgument wurde hinzugefügt zuQuantumCircuit.depth()undQuantumCircuit.size()hinzugefügt, um Schaltkreisoperationen nach bestimmten Kriterien zu analysieren.Um die Anzahl der Zwei-Qubit-Tore zu ermitteln, kann man zum Beispiel Folgendes tun:
circuit.size(lambda x: x[0].num_qubits == 2)Oder um die Tiefe von T Gates zu erhalten, die auf das nullte Qubit wirken:
circuit.depth(lambda x: x[0].name == 't' and circuit.qubits[0] in x[1]) -
Ein neuer Transpiler-Pass wurde hinzugefügt,
CollectMultiQBlockszu demqiskit.transpiler.passesmodul hinzugefügt. Dieser Durchgang dient dazu, Sequenzen von ununterbrochenen Gates zu sammeln, die auf Gruppen von Qubits wirken. Er bietet eine ähnliche Funktion wie der bestehendeCollect2qBlockspass, aber während dieser Pass für die Suche nach 2-Qubit-Blöcken entwickelt und optimiert wurde, kann der neue Pass Blöcke jeder Größe finden. -
Es gibt eine Builder-Schnittstelle für die neuen Kontrollflussoperationen auf
QuantumCircuitwie zum Beispiel das neueForLoopOp,IfElseOp, undWhileLoopOp. Die Schnittstelle verwendet die gleichen Schaltungsmethoden, d . h.QuantumCircuit.for_loop(),QuantumCircuit.if_test()undQuantumCircuit.while_loop()die überladen sind, so dass sie einen Kontextmanager zurückgeben, wenn der Parameterbodynicht angegeben ist. Die Eingabe eines dieser Kontextmanager schiebt einen Bereich in den Schaltkreis und erfasst alle Gatteraufrufe (und andere Bereiche) sowie die von diesen verwendeten Ressourcen und baut am Ende die entsprechende Operation auf. Zum Beispiel können Sie jetzt tun:qc = QuantumCircuit(2, 2) with qc.for_loop(range(5)) as i: qc.rx(i * math.pi / 4, 0)Dies erzeugt eine
ForLoopOpaufqc, das weiß, dass Qubit 0 die einzige Ressource ist, die innerhalb des Schleifenkörpers verwendet wird. Diese Kontextmanager können verschachtelt werden und werden ihre Breite korrekt bestimmen. Sie können verwendenQuantumCircuit.break_loop()undQuantumCircuit.continue_loop()innerhalb eines Kontexts verwenden, und er wird auf die richtige Breite für die ihn enthaltende Schleife erweitert, auch wenn er in weiterenQuantumCircuit.if_test()blöcken verschachtelt ist.Der
if_test()kontextmanager stellt einen verketteten Manager zur Verfügung, der, falls gewünscht, zur Erstellung eineselse-Blocks verwendet werden kann, z. B. durch:qreg = QuantumRegister(2) creg = ClassicalRegister(2) qc = QuantumCircuit(qreg, creg) qc.h(0) qc.cx(0, 1) qc.measure(0, 0) with qc.if_test((creg, 0)) as else_: qc.x(1) with else_: qc.z(1)Der Verwalter stellt sicher, dass die Stellen
ifundelseüber denselben Satz von Ressourcen definiert sind. -
Einführung eines neuen Transpiler-Passes
InverseCancellationeingeführt, der denCXCancellationpass verallgemeinert, um alle selbst-inversen Gatter oder Gatter-inversen Paare zu annullieren. Es kann verwendet werden, indem man initialisiertInverseCancellationund die Übergabe eines Gatters zum Abbrechen, zum Beispiel:from qiskit.transpiler.passes import InverseCancellation from qiskit import QuantumCircuit from qiskit.circuit.library import HGate from qiskit.transpiler import PassManager qc = QuantumCircuit(2, 2) qc.h(0) qc.h(0) pass_ = InverseCancellation([HGate()]) pm = PassManager(pass_) new_circ = pm.run(qc) -
Der Konstruktor von
RZXCalibrationBuilderhat zwei neue kwargsinstruction_schedule_mapundqubit_channel_mapping, die eineInstructionScheduleMapund eine Liste von Kanalnamenlisten für jedes Qubit entgegennehmen. Diese neuen Argumente werden verwendet, um die von einem Backend-Ziel benötigten Informationen direkt anzugeben. Sie sollten verwendet werden, anstatt einBaseBackendoderBackendV1objekt direkt an die Übergabe mit dem Argumentbackendzu übergeben. -
Die
Statevectors von Zuständen, die nur aus Qubits bestehen, können nun in LaTeX in Ket-Notation gezeichnet werden. In der Ket-Notation werden die Einträge des Zustandsvektors so verarbeitet, dass exakte Faktoren wie Brüche oder Quadratwurzeln aus zwei als solche gezeichnet werden. Die jeweilige Konvention kann durch Übergabe des Schlüsselwortargumentsconventionals"ket"oder"vector"gewählt werden:import math from qiskit.quantum_info import Statevector sv = Statevector([math.sqrt(0.5), 0, 0, -math.sqrt(0.5)]) sv.draw("latex", convention="ket") sv.draw("latex", convention="vector") -
Hinzufügen eines neuen Transpiler-Passes
EchoRZXWeylDecompositionder es dem Benutzer ermöglicht, ein beliebiges Zwei-Qubit-Gatter in Form von geechotem RZX-Gatter zu zerlegen, indem er die Cartan-Zerlegung nutzt. In Kombination mit anderen Transpiler-Passagen kann dies dazu verwendet werden, beliebige Schaltungen in RZX-Gate-basierte und impulseffiziente Schaltungen zu transpilieren, die dieselbe Unitary implementieren. -
Die
SPSAundQNSPSAsind nun in der Lage, so viele Schaltkreisauswertungen wie möglich sowohl für die Iterationen als auch für die Anfangskalibrierungen zu stapeln. Dies kann ausgenutzt werden, indem man denmax_evals_groupedkwarg auf den Konstruktor fürVQEgesetzt wird, wenn man entwederSPSAoderQNSPSAalsoptimizerParameter verwenden. Zum Beispiel:from qiskit.circuit.library import TwoLocal from qiskit.algorithms import VQE from qiskit.algorithms.optimizers import QNSPSA from qiskit.test.mock import FakeMontreal backend = FakeMontreal() ansatz = TwoLocal(2, rotation_blocks=["ry", "rz"], entanglement_blocks="cz") qnspsa = QNSPSA(fidelity, maxiter=5) vqe = VQE( ansatz=ansatz, optimizer=qnspsa, max_evals_grouped=100, quantum_instance=backend, ) -
Mit dieser Version wird eine Zerlegungsmethode für Zwei-Qubit-Gatter eingeführt, die auf benutzerdefinierte Mengen von RZX-Gattern abzielt. Transpiler-Benutzer können die Dekomposition speziell für {
RZX(pi/2),RZX(pi/4), andRZX(pi/6)} aktivieren, indem sie'rzx'in ihrebasis_gates-Liste aufnehmen, wenn sietranspile(). Benutzer des Quantum-Informationspakets finden die Methode selbst unter derXXDecomposerklasse. -
Hinzufügen eines Transpiler-Passes
Optimize1qGatesSimpleCommutationhinzugefügt, der eine Schaltung nach einer Strategie des Hin- und Herpendelns von Ein-Qubit-Gattern optimiert, um Resynthesemöglichkeiten zu entdecken. -
Hinzufügen eines
max_job_triesParameters zuQuantumInstancehinzugefügt, um die Anzahl der Ausführungsversuche eines Auftrags auf einem Backend zu begrenzen. Zuvor wurde die Übermittlung und das Abrufen von Ergebnissen unendlich oft versucht, auch wenn der Auftrag abgebrochen wurde oder im Backend ein Fehler auftrat. Der Standardwert ist nun 50, und das vorherige Verhalten kann durch die Einstellungmax_job_tries=-1erreicht werden. Behebt #6872 und #6821. -
Die Ausgabemethode
latexfür diecircuit_drawer()funktion und dieQuantumCircuit.draw()methode können nun Schaltungen zeichnen, die Gatter mit Einzelbitbedingungen enthalten. Dies wurde aus Gründen der Kompatibilität der Latex-Schublade mit der neuen Funktion der Unterstützung der klassischen Konditionierung von Gattern auf einzelne klassische Bits hinzugefügt. -
Die Ausgabemethode
"mpl"für diecircuit_drawer()funktion und dieQuantumCircuit.draw()methode können nun Schaltungen zeichnen, die Gatter mit Einzelbitbedingungen enthalten. Dies wurde hinzugefügt, um die Kompatibilität der"mpl"Schublade mit der neuen Funktion der Unterstützung der klassischen Konditionierung von Gattern auf einzelne klassische Bits zu gewährleisten. -
Die Ausgabemethode
textfür diecircuit_drawer()funktion und dieQuantumCircuit.draw()methode können nun Schaltungen zeichnen, die Gatter mit Einzelbitbedingungen enthalten. Dies wurde aus Gründen der Kompatibilität der Textschublade mit der neuen Funktion der Unterstützung der klassischen Konditionierung von Gattern auf einzelne klassische Bits hinzugefügt. -
Ein neuer Analyse-Transpiler-Pass,
GatesInBasiswurde hinzugefügt zuqiskit.transpiler.passes. Dieser Durchgang wird verwendet, um zu prüfen, ob dieDAGCircuitdie transponiert wird, alle Gatter in der konfigurierten Basismenge hat oder nicht. Es setzt das Attribut"all_gates_in_basis"in der Eigenschaftsgruppe aufTrue, wenn alle Gates in derDAGCircuitin der konfigurierten Basismenge sind oderFalse, wenn sie es nicht sind. Zum Beispiel:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import GatesInBasis # Instatiate Pass basis_gates = ["cx", "h"] basis_check_pass = GatesInBasis(basis_gates) # Build circuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() # Run pass on circuit property_set = {} basis_check_pass(circuit, property_set=property_set) assert property_set["all_gates_in_basis"] -
Zwei neue Konstruktormethoden hinzugefügt,
from_heavy_hex()undfrom_heavy_square()zu derCouplingMapklasse. Diese Konstruktormethoden werden verwendet, um einenCouplingMapdie ein schwerer hexagonaler oder schwerer quadratischer Graph sind, wie in Chamberland et al. beschrieben, 2020.Zum Beispiel:
from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_hex(5) cmap.draw()from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_square(5) cmap.draw() -
Der Algorithmus
HHLkann nun Lösungen finden, wenn seine Matrix negative Eigenwerte hat. Um dies zu ermöglichen, fügt der Algorithmus nun ein zusätzliches Qubit hinzu, um das Vorzeichen des Wertes darzustellen, und der HilfsalgorithmusExactReciprocalwurde aktualisiert, um diese neue Information zu verarbeiten. Siehe #6971 für weitere Einzelheiten. -
Zwei neue Klassen hinzugefügt,
CompleteMeasFitterundTensoredMeasFitterzu demqiskit.utils.mitigationmodul. Diese Klassen sind nur zur Verwendung als Werte für diemeasurement_error_mitigation_clskwarg derQuantumInstanceklasse. Die Instanziierung und Verwendung dieser Klassen (oder aller anderen inqiskit.utils.mitigation) außerhalb desmeasurement_error_mitigation_clskwarg sollte als interne private API behandelt werden, auf die man sich nicht verlassen sollte. -
Die
ListOpklasse inqiskit.opflowhat nun eincoeffsattribut, das eine Liste der Koeffizienten der Operatorliste zurückgibt, wobei der Gesamtkoeffizient (ListOp.coeff) multiplikativ auf die Liste verteilt wird. Beachten Sie, dassListOpobjekte verschachtelt sein können (enthalten inoplisteinesListOpobjekts), und in diesen Fällen wird eine Ausnahme ausgelöst, wenn die Methode coeffs aufgerufen wird. DieListOp.coeffsmethode duckt sich praktischerweise gegen diecoeffsEigenschaftsmethode der nicht verschachteltenPauliSumOpklasse. -
Die Klasse
Statevectorklasse ist jetzt subscriptable. Der Benutzer kann nun den n-ten Koeffizienten in einerStatevectorper Index alsstatevec[n]abrufen. -
Hinzufügen der
Statevector.innermethode zur Berechnung innerer Produkte vonStatevectorinstanzen. Zum Beispiel:statevec_inner_other = statevec.inner(other)gibt das innere Produkt von
statevecmitotherzurück. WährendstateveceinStatevectorsein muss, kannotheralles sein, was sich in einStatevectorkonstruiert werden kann, wie zum Beispiel ein Numpy-Array. -
Ein neuer Parameter,
add_bits, wurde zuQuantumCircuit.measure_all(). Standardmäßig ist sie aufTrueeingestellt, um das bisherige Verhalten beizubehalten, ein neuesClassicalRegistermit der gleichen Größe wie die Anzahl der Qubits zum Speichern der Messungen. Bei der EinstellungFalsewerden die Messungen in den bereits vorhandenen klassischen Bits gespeichert. Wenn Sie zum Beispiel eine Schaltung mit vorhandenen klassischen Bits erstellen, wie:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(2) cr = ClassicalRegister(2, "meas") circuit = QuantumCircuit(qr, cr)durch den Aufruf von
circuit.measure_all(add_bits=False)wird das bestehende klassische Registercrals Ausgabeziel für die dem Schaltkreis hinzugefügten ObjekteMeasurementverwendet. -
ParameterExpressiondelegiert nun seine numerischen Konvertierungen an die zugrunde liegende symbolische Bibliothek, selbst wenn es potenziell ungebundene Parameter gibt. Dies ermöglicht die Umwandlung von Ausdrücken wie:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> float(x - x + 2.3) 2.3wobei der zugrunde liegende Ausdruck einen festen Wert hat, der Parameter
xaber noch nicht gebunden ist. -
Hinzufügen einer
Optimizer.minimize()methode zu allen Optimierern hinzugefügt:Optimizerund abgeleitete Klassen. Diese Methode ahmt die Signatur der Funktion SciPy’sminimize()nach und gibt einOptimizerResult.Zum Beispiel
import numpy as np from qiskit.algorithms.optimizers import COBYLA def loss(x): return -(x[0] - 1) ** 2 - (x[1] + 1) ** 3 initial_point = np.array([0, 0]) optimizer = COBYLA() result = optimizer.minimize(loss, initial_point) optimal_parameters = result.x minimum_value = result.fun num_function_evals = result.nfev -
Hinzufügen einer
PauliEvolutionGatezur Schaltungsbibliothek (qiskit.circuit.library) hinzugefügt, die ein Gatter definiert, das die zeitliche Entwicklung von (Summen oder Summen-der-Summen von)Paulis. Die Synthese dieses Gatters wird durchgeführt vonEvolutionSynthesisdurchgeführt und ist vom Gatter selbst entkoppelt. Die derzeit verfügbaren Synthesemethoden sind:LieTrotter: Trotterisierung erster OrdnungSuzukiTrotter: Trotterisierung höherer OrdnungMatrixExponentialexakte, matrixbasierte Entwicklung
Zum Beispiel:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparsePauliOp from qiskit.synthesis import SuzukiTrotter operator = SparsePauliOp.from_list([ ("XIZ", 0.5), ("ZZX", 0.5), ("IYY", -1) ]) time = 0.12 # evolution time synth = SuzukiTrotter(order=4, reps=2) evo = PauliEvolutionGate(operator, time=time, synthesis=synth) circuit = QuantumCircuit(3) circuit.append(evo, range(3)) -
Eine neue Funktion
plot_coupling_map()wurde eingeführt, die die Funktionalität der bestehenden Funktionplot_gate_map()erweitert, indem drei Parameter akzeptiert werden:num_qubit,qubit_coordinatesundcoupling_map(anstelle vonbackend), um eine beliebige Qubit-Kopplungskarte darzustellen. -
Qiskit Terra bietet nun erste Unterstützung für die Serialisierung von
QuantumCircuits auf OpenQASM 3 :from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) print(qasm3.dumps(qc))Diese erste Version bietet begrenzte Unterstützung für benannte Register, grundlegende eingebaute Befehle (wie measure, barrier und reset), benutzerdefinierte Gatter, benutzerdefinierte Befehle (als Unterprogramme) und die ebenfalls in dieser Version eingeführten neuen Kontrollflusskonstrukte:
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 import math composite_circ_qreg = QuantumRegister(2) composite_circ = QuantumCircuit(composite_circ_qreg, name="composite_circ") composite_circ.h(0) composite_circ.x(1) composite_circ.cx(0, 1) composite_circ_gate = composite_circ.to_gate() qr = QuantumRegister(2, "qr") cr = ClassicalRegister(2, "cr") qc = QuantumCircuit(qr, cr) with qc.for_loop(range(4)) as i: qc.rx(i * math.pi / 4, 0) qc.cx(0, 1) qc.barrier() qc.append(composite_circ_gate, [0, 1]) qc.measure([0, 1], [0, 1]) print(qasm3.dumps(qc)) -
Die
QDriftklasse wurde neu formuliert als eine Synthesemethode fürPauliEvolutionGate, abgeleitet vonTrotterizationBase.from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.synthesis import QDrift from qiskit.opflow import X, Y, Z qdrift = QDrift(reps=2) operator = (X ^ 3) + (Y ^ 3) + (Z ^ 3) time = 2.345 # evolution time evolution_gate = PauliEvolutionGate(operator, time, synthesis=qdrift) circuit = QuantumCircuit(3) circuit.append(evolution_gate, range(3)) -
Die QPY-Serialisierung ist nun in der Lage, die
global_phaseattribute einesQuantumCircuitobjekts darzustellen, die einintsind,Parameterobjekt, oderParameterExpressionobjekt sind. Frühere Versionen von QPY akzeptierten nur eineglobal_phasedas einfloatwar.Dies erfordert das QPY-Format Version 2, das mit dieser Version eingeführt wurde, um die zusätzlichen Typen darzustellen.
-
Eine neue
find_bit()methode wurde zu derQuantumCircuitklasse hinzugefügt, die es ermöglicht, den Index und die Register eines bereitgestelltenBitauf der gegebenen Schaltung ermöglicht. Die Methode gibt ein zwei Elemente umfassendesnamedtuplezurück, das 0) den Index derBitin entwederqubits(für eineQubit) oderclbits(für aClbit) und 1) eine Liste von length-2 Tupeln, die jeden SchaltkreisRegisterdie denBitenthält, und den Index in diesemRegister, an dem derBitgefunden werden kann.Zum Beispiel:
from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit reg1 = QuantumRegister(3, 'foo') qubit = Qubit() reg2 = QuantumRegister(2, 'bar') qc = QuantumCircuit(reg1, [qubit], reg2) print(qc.find_bit(reg1[2])) print(qc.find_bit(qubit))erzeugen würde:
BitLocations(index=2, registers=[(QuantumRegister(3, 'foo'), 2)]) BitLocations(index=3, registers=[]) -
Drei neue
Instructionunterklassen wurden hinzugefügt, um Kontrollflussoperationen in dynamischen Schaltungen zu unterstützen:WhileLoopOp,ForLoopOp, undIfElseOp. Zusätzlich gibt es zwei Unterklassen,BreakLoopOpundContinueLoopOphinzugefügt, um den Abbruch bzw. die Fortsetzung der nächsten Iteration eines Schleifenkontextes zu unterstützen.Diese können als eigenständige
Instructionerstellt oder an eine bestehendeQuantumCircuitinstanz über ihre jeweiligen Methoden hinzugefügt werden,QuantumCircuit.while_loop(),for_loop(),if_test(),if_else(),break_loop(), undcontinue_loop(). -
Hinzufügen der
BaseReadoutMitigatorabstrakte Basisklasse für die Implementierung klassischer Messfehlerkorrekturen. Diese Objekte sind für die Abschwächung von Messfehlern inCountsobjekten, die von der Ausführung von Schaltungen auf Backends mit Messfehlern zurückgegeben werden.Readout Mitigator-Klassen haben zwei Hauptmethoden:
expectation_value()die einen abgeschwächten Erwartungswert und Standardfehler eines Diagonaloperators aus einem verrauschtenCountsobjekt berechnet.quasi_probabilities()die einen abgeschwächten FehlerQuasiDistributioneinschließlich des Standardfehlers, aus einem verrauschten Zählobjekt berechnet.
Beachten Sie, dass derzeit das
qiskit.algorithmsmodul und dieQuantumInstanceklasse noch die alten Mitigatoren verwenden, die von Qiskit Ignis inqiskit.utils.mitigation. Es ist geplant, das Modul zu aktualisieren, um die neuen Mitigator-Klassen zu verwenden und den veralteten Mitigationscode in einer zukünftigen Version zu verwerfen. -
Hinzufügen der
LocalReadoutMitigatorklasse für die Durchführung von Messwertauslesefehlerkorrekturen bei lokalen Messfehlern. Lokale Messfehler sind solche, die durch ein Tensor-Produkt von Einzel-Qubit-Messfehlern beschrieben werden.Diese Klasse kann mit einer Liste von single-qubit of measurement error assignment matrices oder von einem Backend mit den Auslesefehlerinformationen in den Backend-Eigenschaften initialisiert werden.
Die Abschwächung wird durch lokale Zuweisungs-Matrix-Inversion implementiert, die eine Komplexität von für -qubit Abschwächung von
QuasiDistributionund Erwartungswerte. -
Hinzufügen der
CorrelatedReadoutMitigatorklasse für die Durchführung von Messwertauslesefehlerkorrekturen bei korrelierten Messfehlern. Diese Klasse kann mit einer einzigen Messfehler-Zuordnungsmatrix initialisiert werden, die die Fehlerwahrscheinlichkeiten beschreibt. Die Abschwächung erfolgt durch Inversion der Zuordnungsmatrix, die eine Abschwächungskomplexität von vonQuasiDistributionund Erwartungswerten. -
Hinzufügen eines
QuasiDistribution.stddev_upper_boundattribut und ein kwarg zum Konstruktor derQuasiDistributionklasse, die zum Speichern von Standardfehlern in Quasi-Wahrscheinlichkeitsschätzungen verwendet wird. Dies wird verwendet vonBaseReadoutMitigatorklassen verwendet, um den Standardfehler in abgeschwächten Quasi-Wahrscheinlichkeiten zu speichern. -
Hinzufügen einer
shots()methode zuqiskit.result.Countshinzugefügt, die die Summe aller Ergebnisse in den Zählungen zurückgibt. -
Bei der Ausführung der
Groveralgorithmusklasse, wenn die optimale Leistung bekannt ist und nur eine einzige Schaltung ausgeführt wird, muss dieAmplificationProblem.is_good_statecallback-Funktion nicht mehr gesetzt werden, und die Grover-Suche gibt die wahrscheinlichste Bitfolge zurück. Wenn die optimale Potenz des Grover-Operators nicht bekannt ist, prüft der Algorithmus im AllgemeinenGroveralgorithmus verschiedene Potenzen (d. h. Iterationen) und wendet dieis_good_statefunktion an, um zu prüfen, ob ein guter Bitstring gemessen wurde. Zum Beispiel können Sie jetzt etwas ausführen wie:from qiskit.algorithms import Grover, AmplificationProblem from qiskit.providers.aer import AerSimulator from qiskit.quantum_info import Statevector # Fixed Grover power: 2. grover = Grover(iterations=2, quantum_instance=AerSimulator()) # The ``is_good_state`` argument not required here since Grover search # will be run only once, with a power of 2. problem = AmplificationProblem(Statevector.from_label("111")) # Run Grover search and print the best measurement result = grover.amplify(problem) print(result.top_measurement) # should print 111 -
Methode hinzugefügt
remove_cregs()zur KlasseDAGCircuitzur Unterstützung der klassischen Registerentfernung. -
Methode hinzugefügt
remove_clbits()zur KlasseDAGCircuitzugefügt, um das Entfernen von inaktiven klassischen Bits zu unterstützen. Alle klassischen Register, die auf ein entferntes Bit verweisen, werden ebenfalls entfernt. -
Eine neue Methode wurde hinzugefügt,
replace_block_with_op()zu derDAGCircuitklasse. Diese Methode wird verwendet, um einen Block von Knoten in der DAG mit einer einzigen Operation zu ersetzen. Das kanonische Beispiel ist für denConsolidateBlocksdurchgang, bei dem Blöcke von Knoten durch gleichwertigeUnitaryGateKnoten ersetzt werden. -
Ein neuer Analyse-Transpiler-Pass wurde hinzugefügt,
Collect1qRunszu demqiskit.transpiler.passesmodul. Dieser Durchlauf wird verwendet, um Sequenzen von ununterbrochenen Gates zu finden, die auf ein einzelnes Qubit wirken. Sie ist ähnlich wie dieCollect2qBlocksundCollectMultiQBlocksaber optimiert für Einzel-Qubit-Läufe anstelle von Mehrfach-Qubit-Blöcken. -
Verschiedene Transpilationsinterna verwenden nun neue Funktionen in retworkx 0.10, wenn sie mit der internen Schaltkreisdarstellung arbeiten. Dies kann oft zu einer Beschleunigung der Aufrufe von
transpilevon etwa 10-40 % führen, wobei die Auswirkungen bei höheren Optimierungsgraden größer sind. Siehe #6302 für weitere Einzelheiten. -
Der
UnitarySynthesistranspiler-Pass inqiskit.transpiler.passeshat einen neuen kwarg im Konstruktor,min_qubits. Wenn angegeben, kann dies auf einenintWert gesetzt werden, der die Mindestgröße desUnitaryGateObjekts für die Durchführung der unitären Synthese darstellt. Wenn einUnitaryGatein einerQuantumCircuitweniger Qubits verwendet, wird sie von dieser Instanz des Durchlaufs übersprungen. -
Die Schnittstellen
EigensolverundMinimumEigensolverunterstützen nun den TypDict[str, Optional[OperatorBase]]für den Parameteraux_operatorsin ihren jeweiligen Methodencompute_eigenvalues()undcompute_minimum_eigenvalue(). In diesem Fall werden die Hilfseigenwerte ebenfalls in einem Wörterbuch unter denselben Schlüsseln gespeichert, die das Wörterbuchaux_operatorsliefert. Tasten, die einem Operator entsprechen, der nicht mit dem Hauptoperator übereinstimmt, werden nicht berücksichtigt. -
Die
BasisTranslator,GateDirection, undCheckGateDirectionhaben einen neuentargetkwarg in ihren Konstruktoren, der verwendet werden kann, um einTargetobjekt als Ziel für die Übergabe festzulegen. Wenn er gesetzt ist, wird er anstelle vontarget_basis(im Falle desBasisTranslatorpass) odercoupling_map(im Falle derGateDirectionundCheckGateDirectiondurchgänge) verwendet. -
Erlauben Sie zwei Transpiler-Stufen in der
QuantumInstanceeine für parametrisierte Schaltungen und eine zweite nur für gebundene Schaltungen (d.h. keine freien Parameter). Wenn eine Quanteninstanz mit Durchläufen für ungebundene und gebundene Schaltkreise an einenCircuitSamplerübergeben wird, versucht der Sampler, den ungebundenen Durchgang einmal auf den parametrisierten Schaltkreis anzuwenden, ihn zwischenzuspeichern und nur den gebundenen Durchgang für alle zukünftigen Auswertungen anzuwenden.Dies ermöglicht Variationsalgorithmen wie dem
VQEeinen benutzerdefinierten Pass-Manager für parametrisierte Schaltungen einmal ausführen und zusätzlich einen anderen Transpiler mit einem anderen benutzerdefinierten Pass-Manager für die gebundenen Schaltungen in jeder Iteration. Die Möglichkeit, verschiedene Durchlaufmanager einzusetzen, ist wichtig, da nicht alle Durchläufe parametrisierte Schaltkreise unterstützen (z. BOptimize1qGatesDecompositionfunktioniert nur mit gebundenen Schaltkreisparametern).Diese Funktion ermöglicht zum Beispiel die Verwendung der impulseffizienten CX-Zerlegung in der VQE, da
from qiskit.algorithms import VQE from qiskit.opflow import Z from qiskit.circuit.library.standard_gates.equivalence_library import StandardEquivalenceLibrary as std_eqlib from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.transpiler.passes import ( Collect2qBlocks, ConsolidateBlocks, Optimize1qGatesDecomposition, RZXCalibrationBuilderNoEcho, UnrollCustomDefinitions, BasisTranslator ) from qiskit.transpiler.passes.optimization.echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition from qiskit.test.mock import FakeBelem from qiskit.utils import QuantumInstance # Replace by a real backend! If not ensure qiskit-aer is installed to simulate the backend backend = FakeBelem() # Build the pass manager for the parameterized circuit rzx_basis = ['rzx', 'rz', 'x', 'sx'] coupling_map = CouplingMap(backend.configuration().coupling_map) config = PassManagerConfig(basis_gates=rzx_basis, coupling_map=coupling_map) pre = level_1_pass_manager(config) # Build a pass manager for the CX decomposition (works only on bound circuits) post = PassManager([ # Consolidate consecutive two-qubit operations. Collect2qBlocks(), ConsolidateBlocks(basis_gates=['rz', 'sx', 'x', 'rxx']), # Rewrite circuit in terms of Weyl-decomposed echoed RZX gates. EchoRZXWeylDecomposition(backend), # Attach scaled CR pulse schedules to the RZX gates. RZXCalibrationBuilderNoEcho(backend), # Simplify single-qubit gates. UnrollCustomDefinitions(std_eqlib, rzx_basis), BasisTranslator(std_eqlib, rzx_basis), Optimize1qGatesDecomposition(rzx_basis), ]) quantum_instance = QuantumInstance(backend, pass_manager=pre, bound_pass_manager=post) vqe = VQE(quantum_instance=quantum_instance) result = vqe.compute_minimum_eigenvalue(Z ^ Z) -
Es wurde eine neue Schnittstelle für unitäre Synthese-Plugins eingeführt, die es ermöglicht, alternative Synthesetechniken, die in externen Paketen enthalten sind, nahtlos mit dem
UnitarySynthesistranspiler-Durchgang. Benutzer können ein Plugin auswählen, das beim Aufruf vontranspile()ein Plugin auswählen, indem sie denunitary_synthesis_methodkwarg auf den Namen des Plugins setzen. Eine vollständige Liste der installierten Plugins finden Sie mit derqiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names()funktion. Wenn Sie zum Beispiel ein Paket installiert haben, das ein Synthese-Plugin namensspecial_synthenthält, können Sie es mit verwenden:from qiskit import transpile transpile(qc, unitary_synthesis_method='special_synth', optimization_level=3)Dies ersetzt alle Verwendungen von
UnitarySynthesisdurch die Methode, die in dem externen Paket enthalten ist, das das Pluginspecial_synthexportiert.Die Plugin-Schnittstelle ist um setuptools-Einstiegspunkte herum aufgebaut, die es Paketen außerhalb von Qiskit ermöglichen, anzuzeigen, dass sie ein Synthese-Plugin enthalten. Einzelheiten zum Schreiben eines neuen Plugins finden Sie in der
qiskit.transpiler.passes.synthesis.pluginmodul-Dokumentation. -
Ein neuer Transpiler-Pass wurde hinzugefügt,
VF2Layout. Dieser Durchlauf modelliert das Layout-Zuordnungsproblem als Teilgraphen-Isomorphismus-Problem und verwendet die VF2 Algorithmus-Implementierung in rustworkx, um ein perfektes Layout zu finden (ein Layout, das kein zusätzliches Routing erfordern würde), falls ein solches existiert. Die Funktionalität dieses neuen Passes ähnelt sehr den bestehendenCSPLayoutaberVF2Layoutist aber wesentlich schneller.
Bekannte Probleme
-
Die
"ket"Konvention in der"latex"Schublade vonStatevector.draw()ist nur für Zustände gültig, die nur aus Qubits bestehen. Wenn Sie Zustände mit einigen Leerzeichen von mehr als zwei Dimensionen verwenden, sollten Sie entwederconvention="vector"übergeben oder eine andere Schublade verwenden. -
Die Exportmöglichkeiten von OpenQASM 3 befinden sich im Beta-Stadium, und einige Funktionen von Qiskit Terra's
QuantumCircuitwerden noch nicht unterstützt. Insbesondere können Fehler auftreten, wenn Sie versuchen, benutzerdefinierte Unterprogramme mit klassischen Parametern zu exportieren, und es gibt noch keine Möglichkeit, impulskalibrierte Operationen in OpenPulse. -
Wenn Sie das Programm
BasisTranslatorisoliert mit demtargetArgument auf einTargetobjekt gesetzt ist, bei dem einige Ein-Qubit-Gatter nur auf nicht überlappende Mengen von Qubits angewendet werden können, könnte die Ausgabeschaltung fälschlicherweise Operationen auf einem Qubit enthalten, die von derTarget. Zum Beispiel, wenn Sie liefen:from qiskit.circuit import QuantumCircuit, Parameter from qiskit.circuit.library import UGate, RZGate, XGate, SXGate, CXGate from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel from qiskit.transpiler import PassManager, Target, InstructionProperties from qiskit.transpiler.passes import BasisTranslator gmap = Target() # U gate in qubit 0. theta = Parameter('theta') phi = Parameter('phi') lam = Parameter('lambda') u_props = { (0,): InstructionProperties(duration=5.23e-8, error=0.00038115), } gmap.add_instruction(UGate(theta, phi, lam), u_props) # Rz gate in qubit 1. phi = Parameter("phi") rz_props = { (1,): InstructionProperties(duration=0.0, error=0), } gmap.add_instruction(RZGate(phi), rz_props) # X gate in qubit 1. x_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(XGate(), x_props) # SX gate in qubit 1. sx_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(SXGate(), sx_props) cx_props = { (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115), (1, 0): InstructionProperties(duration=4.52e-7, error=0.00132115), } gmap.add_instruction(CXGate(), cx_props) bt_pass = BasisTranslator(sel, target_basis=None, target=gmap) qc = QuantumCircuit(2) qc.iswap(0, 1) output = bt_pass(qc)outputhabenRZGateundSXGateauf Qubit 0, obwohl dies verboten ist. Um dies zu korrigieren, können Sie den Basisübersetzer normalerweise ein zweites Mal ausführen (d.h.output = bt_pass(output)im obigen Beispiel), um dies zu korrigieren. Dies sollte keinen Einfluss auf die Ausgabe der Ausführung dertranspile()funktion nicht beeinträchtigen und ist nur ein Problem, wenn Sie den Durchgang selbst ausführen.
Anmerkungen zu Upgrades
-
Ab dieser Version importiert
from qiskit import *keine Untermodule mehr, sondern nur noch eine ausgewählte Liste von Objekten. Dies kann dazu führen, dass vorhandener Code, derfrom qiskit import *verwendet und auf Objekte verweist, die nicht Teil des aktuellen Namespaces sind, nicht mehr funktioniert. Zur Erinnerung:import *gilt als schlechte Praxis und sollte nicht in Produktionscode verwendet werden. Qiskit stellt__all__inqiskit/__init__.pyein, um die Auswirkungen dieser schlechten Praxis zu mildern. Wenn Ihr Codename '<something>' is not definedaufruft, fügen Siefrom qiskit import <something>hinzu und versuchen Sie es erneut. -
Die voreingestellten Passmanager für die Optimierungsstufen 0, 1, 2 und 3, die durch
level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager(), undlevel_3_pass_manager()erzeugt werden, führen nicht mehr bedingungslos dieTimeUnitConversion. Bisher haben die voreingestellten Passmanager diesen Pass immer ausgeführt, unabhängig von den Eingängen des Transpilers und der Schaltung. Dieser Durchlauf wird nur ausgeführt, wenn einscheduling_methodParameter gesetzt ist oder die Schaltung eineDelayanweisung enthält und der Parameterinstruction_durationsgesetzt ist. Diese Änderung wurde im Interesse der Laufzeitleistung vorgenommen, da in einigen Fällen beitranspile()schaltungen mit einer großen Anzahl von Gattern und ohne Verzögerungen, Timing oder Scheduling, die dieTimeUnitConversionder größte Engpass bei der Transpilierung sein könnte. -
Die Standardmethode für
BIPMappingist jetztbalancedund nicht mehrdepth. Dieses neue Ziel führt im Allgemeinen zu einem besseren Ergebnis, da es sowohl die Schaltungstiefe als auch den Gatterfehler berücksichtigt. -
Die
sort_parameters_by_nameder KlasseVQEklasse wurde entfernt, nachdem sie in Qiskit Terra 0.18 veraltet ist. Es ist keine Alternative vorgesehen, da die neue Reihenfolge der Parameter die natürlichere Sortierreihenfolge ist. -
Die Schaltkreisschubladen
QuantumCircuit.draw()undcircuit_drawer()mit der Optionlatexspeichern ihre Bilder nun in einem Format, das die Dateierweiterung bestimmt (wenn ein Dateiname angegeben ist). Zuvor wurden sie immer im PNG-Format gespeichert. Sie rufen jetztValueErrorauf, wenn das Bildformat nicht bekannt ist. Dies wurde getan, um das Speichern des Bildes in verschiedenen Formaten zu erleichtern. -
Die Versionsanforderung für die Kernabhängigkeit
retworkxwurde von 0.9 auf 0.10.1 angehoben. Dies ermöglicht eine Reihe von Leistungsverbesserungen über verschiedene Transpilationsdurchgänge hinweg. -
Der zuvor veraltete
conditionkwarg, der als Teil der Version 0.15.0 veraltet war, wurde ausDAGCircuit.apply_operation_back()und entferntDAGCircuit.apply_operation_front(). Setzen Sie stattdessen das Attributconditionauf dieInstructioninstanzen, die derDAGCircuitmitInstruction.c_if(). -
Die Methode
DAGCircuit.extend_back()wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Stattdessen können Sie dieDAGCircuit.compose()methode verwenden, die allgemeiner ist und dieselbe Funktionalität bietet. -
Die Methode
DAGCircuit.compose_back()wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Stattdessen können Sie dieDAGCircuit.compose()methode verwenden, die allgemeiner ist und dieselbe Funktionalität bietet. -
Die
edge_mapkwarg derDAGCircuitmethodecompose()wurde entfernt. Ursprünglich war sie in der Version 0.14.0 veraltet. Die Methode nimmt einqubitsundclbitskwargs, um die Positionsreihenfolge der Bits zu spezifizieren, auf die komponiert werden soll, anstatt eine Wörterbuchzuordnung zu verwenden, dieedge_mapzuvor bereitgestellt hat. -
Die Methode
DAGCircuit.twoQ_gates()wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Stattdessen,DAGCircuit.two_qubit_ops()verwendet werden. -
Die Methode
DAGCircuit.threeQ_or_more_gates()wurde entfernt. Ursprünglich war sie in der Version 0.13.0 veraltet. Stattdessen,DAGCircuit.multi_qubit_ops()methode verwendet werden. -
Der benannte Zugriff für das erste Positionsargument für den Konstruktor der
SingleQubitUnitaryklasse mituwurde entfernt. Ursprünglich war sie in der Version 0.14.0 veraltet. Stattdessen kann das erste Positionsargument mit dem Namenunitary_matrixgesetzt werden (oder einfach nur positionell statt mit dem Namen). -
Benannter Zugriff für das erste Positionsargument für die
QuantumCircuitmethodesqumituwurde entfernt. Ursprünglich war sie in der Version 0.14.0 veraltet. Stattdessen kann das erste Positionsargument mit dem Namenunitary_matrixgesetzt werden (oder einfach nur positionell anstelle des Namens). -
Die unbenutzten
procundnested_scopekwargs für dieqasm()Methode der QASM Knotenklassen imqiskit.qasm.nodeModul wurden entfernt. Sie wurden ursprünglich in der Version 0.15.0 veraltet. -
Die unbenutzten
procundnested_scopekwargs für dielatex()Methode der QASM Knotenklassen imqiskit.qasm.nodeModul wurden entfernt. Sie wurden ursprünglich in der Version 0.15.0 veraltet. -
Die unbenutzten
procundnested_scopekwargs für diereal()Methode der QASM Knotenklassen imqiskit.qasm.nodeModul wurden entfernt. Sie wurden ursprünglich in der Version 0.15.0 veraltet. -
Die Ausgabe von
Statevector.draw()bei Verwendung der Ausgabe"latex"entspricht nun der neuen Konvention"ket", wenn ein Zustand gezeichnet wird, der nur aus Qubits besteht. Dies wurde geändert, um das Lesen der Ausgabe zu erleichtern, insbesondere in Bildungskontexten, da die Ket-Beschriftungen angezeigt werden und nur die Nicht-Null-Elemente angezeigt werden. -
Beim Betrieb
execute()mit einemBackendV1backend ausgeführt wird, werden die Standardwerte für die kwargsshots,max_credits,meas_level,meas_returnundmemory_slot_sizenun so sein, wie sie im Ziel-Backend für dasoptionsattribut. Zuvor waren diese Standardwerte so eingestellt, dass sie mit den Standardwerten beim Aufruf vonexecute()mit einem altenBaseBackendBackend aufgerufen wurde. Zum Beispiel:from qiskit.test.mock import FakeMumbai from qiskit import QuantumCircuit, execute circuit = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() backend = FakeMumbai() backend.set_options(shots=4096) execute(qc, backend)läuft jetzt mit
4096shots. Während es in früheren Versionen mit1024lief. -
Die minimal unterstützte Version von Matplotlib wurde von 2.1.0 auf 3.3.0 angehoben. Sie müssen nun Matplotlib 3.3.0 installiert haben, wenn Sie Matplotlib -basierte Visualisierungsfunktionen wie das
'mpl'Backend für diecircuit_drawer()funktion oder dieplot_bloch_vector()funktion. Dies geschah aus zwei Gründen: erstens, weil neuere Versionen von Matplotlib die Verwendung von APIs rund um 3D Visualisierungen, die mit älteren Versionen kompatibel waren, veraltet haben, und zweitens, weil die Installation älterer Versionen von Matplotlib immer schwieriger wurde, da die Upstream-Abhängigkeiten von Matplotlib Inkompatibilitäten verursacht haben, die das Testen in der Zukunft erschwerten. -
Die interne Verwendung des Zufallszahlengenerators in
random_circuit()wurde angepasst, wodurch sich die Ausgabe gegenüber früheren Versionen ändert, selbst bei einem festen Seed. Dies wurde getan, um die Skalierung der Laufzeit mit der Anzahl der verwendeten Qubits erheblich zu verbessern. Wenn Sie sich auf eine identische Ausgabe aus einer früheren Version verlassen haben, empfiehlt es sich, die mit einer früheren Version erzeugte Zufallsschaltung mitqpy_serialization.dump()zu speichern und sie nicht mit der neuen Version neu zu erzeugen, sondern nurqpy_serialization.load()zu verwenden, um diese gespeicherte Schaltung zu laden. -
Die Verwendung von
*(__mul__) für diedot()methode und@(__matmul__) für diecompose()methode vonBaseOperator(die die Mutter aller Operatorklassen inqiskit.quantum_infoeinschließlich Klassen wieOperatorundPauli) wird nicht mehr unterstützt. Die Verwendung dieser Operatoren war in der Version 0.17.0 bereits veraltet. Stattdessen sollten Sie diedot()undcompose()methoden direkt verwenden, oder der&Operator (__and__) kann verwendet werden fürcompose(). Wenn Sie zum Beispiel vorher den Operator wie:from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a @ op_bsollte dies geändert werden in:
from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a.compose(op_b)oder:
new_op = op_a & op_b -
Verschiedene Methoden der Zuweisung von Parametern zu Operanden von Impulsprogrammanweisungen wurden entfernt, da sie in Qiskit Terra 0.17 veraltet sind. Diese umfassen:
- die Methode
assign()vonpulse.Instruction. - die Methode
assign()vonChannel, die die Grundlage vonAcquireChannel,SnapshotChannel,MemorySlotundRegisterSlot. - die Methoden
assign()undassign_parameters()vonParametricPulse, die die Grundlage fürpulse.Gaussian,pulse.GaussianSquare,pulse.Dragundpulse.Constantbilden.
Diese Parameter sollten vom Pulsprogramm aus zugewiesen werden (
pulse.Scheduleundpulse.ScheduleBlock) und nicht als Operanden des Impulsprogrammbefehls zugewiesen werden. - die Methode
-
Die Methode
flatten()vonpulse.Instructionundqiskit.pulse.Schedulewurde entfernt und existiert nicht mehr, wie aus dem Verwerfungshinweis von Qiskit Terra 0.17 hervorgeht. Diese Transformation ist als eigenständige Funktion inqiskit.pulse.transforms.canonicalization.flatten()definiert. -
qiskit.pulse.interfaces.ScheduleComponentwurde entfernt und existiert nicht mehr, wie in der Deprecation Notice von Qiskit Terra 0.15 angegeben. Es wird kein alternativer Unterricht angeboten. -
Die alten Argumente für die Impulsschublade wurden von
pulse.Waveform.draw()entfernt,Schedule.draw()undScheduleBlock.draw()entfernt und existieren nicht mehr, wie aus dem Verwerfungshinweis von Qiskit Terra 0.16 hervorgeht. Diese Zeichenmethoden unterstützen jetzt nur noch V2 pulse drawer arguments. Siehe Methodendokumentation für Details. -
Das Modul
qiskit.pulse.reschedulewurde entfernt und der Importpfad existiert nicht mehr, wie in der Deprecation Notice von Qiskit Terra 0.14 beschrieben. Verwenden Sieqiskit.pulse.transformsstattdessen. -
Eine geschützte Methode
Schedule._children()wurde entfernt und durch eine geschützte Instanzvariable ersetzt, wie in der Deprecation Notice von Qiskit Terra 0.17 beschrieben. Dies wird nun als öffentliches Attribut bereitgestelltSchedule.children. -
Die für Timeslots relevanten Methoden und Eigenschaften wurden entfernt und existieren nicht mehr in
ScheduleBlockgemäß der Verwerfungsmitteilung von Qiskit Terra 0.17. Da diese Darstellung keine Vorstellung von der Befehlszeitt0hat, sind die Zeitschlitzinformationen verfügbar, nachdem sie in eineSchedule. Entsprechende Attribute wurden nach dieser Umstellung bereitgestellt, werden aber nicht mehr unterstützt. Die folgenden Attribute werden entfernt:timeslotsstart_timestop_timech_start_timech_stop_timeshiftinsert
-
Ausrichtungsimpulsplan-Transformationen wurden entfernt und existieren nicht mehr, wie in der Verwerfungsmitteilung von Qiskit Terra 0.17 angegeben. Diese Transformationen werden in den
AlignmentKindKontext des Zeitplanblocks integriert und implementiert. Die folgenden expliziten Transformationsfunktionen werden entfernt:qiskit.pulse.transforms.align_equispacedqiskit.pulse.transforms.align_funcqiskit.pulse.transforms.align_leftqiskit.pulse.transforms.align_rightqiskit.pulse.transforms.align_sequential
-
Redundante Pulse Builder-Befehle wurden entfernt und existieren nicht mehr, wie in der Deprecation Notice von Qiskit Terra 0.17 angegeben.
pulse.builder.call_scheduleundpulse.builder.call_circuitwurden integriert inpulse.builder.call(). -
Eine interne Filterüberschreibung, die dazu führte, dass alle Qiskit-Verfallswarnungen angezeigt wurden, wurde entfernt. Das bedeutet, dass das Verhalten nun zum Standardverhalten von Python für Verwerfungen zurückkehrt; Sie sollten
DeprecationWarningnur sehen, wenn es durch Code in der Hauptskriptdatei, der Interpreter-Sitzung oder dem Jupyter-Notebook ausgelöst wurde. Der Benutzer wird nicht mehr mit einer Warnung darauf hingewiesen, wenn interne Qiskit-Funktionen veraltetes Verhalten aufrufen. Wenn Sie Bibliotheken schreiben, sollten Sie gelegentlich mit deaktivierten Standard-Warnungsfiltern arbeiten oder Tests durchführen, die immer mit deaktivierten Filtern laufen. Weitere Informationen dazu finden Sie in der Python Dokumentation über Warnungen und insbesondere im Abschnitt über das Testen auf Verwerfungen. -
Bestimmte Warnungen wurden bisher nur einmal ausgegeben, auch wenn sie an mehreren Stellen ausgelöst wurden. Dieses Verhalten wurde entfernt, so dass es möglich ist, dass beim Aufruf veralteter Funktionen mehr Warnungen angezeigt werden als zuvor. Sie sollten alle veralteten Funktionsaufrufe in die vorgeschlagenen Versionen ändern, da die veralteten Formen in zukünftigen Qiskit-Versionen entfernt werden.
-
Das veraltete
qiskit.schemasModul und dasqiskit.validationModul, das den jsonschema validator aus den Schemas erstellt, wurden entfernt. Diese wurde in der Version 0.17.0 veraltet und durch ein spezielles Repository für die IBM Quantum API Payload Schemas ersetzt.Wenn Sie sich auf die Schemadateien, die zuvor in
qiskit.schemasverpackt waren, oder die darauf aufbauenden Validatoren verlassen haben, sollten Sie dieses Repository verwenden und Validatoren aus den darin enthaltenen Schemadateien erstellen. -
Die Funktionen
qiskit.qobj.validate_qobj_against_schemaundqiskit.qobj.common.validatorzusammen mit demvalidatekwarg der MethodenQasmQobj.to_dict(),PulseQobj.to_dict(), undQobj.to_dict()wurden entfernt. Diese wurden in der Version 0.17.0 veraltet. Wenn Sie diese Funktionen verwenden, müssen Sie manuell Jsonschema-Validierungsfunktionen fürQobjObjekte erstellen, indem Sie die Jsonschema-Dateien aus dem speziellen Repository für die IBM Quantum API-Nutzlastschemata verwenden. -
Die Pakete
fastjsonschemaundjsonschemasind nicht mehr in der Anforderungsliste für qiskit-terra enthalten. Die interne Verwendung von jsonschema wurde entfernt und es ist nicht mehr erforderlich, qiskit-terra zu verwenden. -
Die Ausnahme, die von der
assemble()funktion ausgelöst wird, wenn ungültige Parameter für die Konstruktion einesPulseQobjausgelöst wird, hat sich von einerSchemaValidationErrorzu einerQiskitError. Dies war notwendig, weil die KlasseSchemaValidationErrorzusammen mit dem Rest der veraltetenqiskit.schemasundqiskit.validationentfernt wurde. Dies macht es auch konsistenter mit anderen Fehlerbedingungen vonassemble()die bereits einQiskitError. -
Der Standard-Routing- und Layout-Pass für die Transpiler-Optimierungsstufe 3 wurde geändert und verwendet nun
SabreSwapundSabreLayoutzu verwenden. Dies geschah, um die Qualität des Ausgabeergebnisses zu verbessern, da die Verwendung der Säbeldurchgänge bessere Ergebnisse liefert als die Verwendung vonStochasticSwapundDenseLayoutdie in früheren Versionen als Standardwerte verwendet wurden. Diese Änderung verbessert die Qualität der Ergebnisse bei der Ausführung vontranspile()oderexecute()funktionen mit deroptimization_levelkwarg auf3eingestellt ist. Dies ist zwar im Allgemeinen eine Verbesserung, aber wenn Sie das vorherige Verhalten aus irgendeinem Grund beibehalten müssen, können Sie dies tun, indem Sie die Werterouting_method="stochastic"undlayout_method="dense"beim Aufruf vontranspile()mitoptimization_level=3. -
Der Rückgabetyp von
pauli_basis()wird sich vonPauliTablezuPauliListin einer zukünftigen Version von Qiskit Terra ändern. Um sofort zum neuen Verhalten zu wechseln, übergeben Sie das Schlüsselwortargumentpauli_list=True. -
Das
nameattribut derSingleQubitUnitarygate-Klasse wurde vonunitaryaufsqugeändert. Dies war notwendig, um einen Konflikt mit dem Namen der KlasseUnitaryGatezu vermeiden, die ebenfallsunitaryhieß, da die beiden Gates nicht dasselbe sind und nicht dieselbe Implementierung haben (und nicht austauschbar verwendet werden können). -
Die für die Installation erforderliche Mindestversion der Symengine wurde auf 0.8.0 erhöht. Dies war notwendig, um einige Probleme mit der Handhabung von
numpy.float16undnumpy.float32Werten zu beheben, wenn diebind()zur Bindung von Parametern in einerParameterExpression. -
Die Anforderungsliste wurde um eine neue Abhängigkeit Stauer ergänzt. Dies wird von qiskit-terra benötigt, da es zur Erstellung der unitären Synthese-Plugin-Schnittstelle verwendet wird.
Hinweise zu veralteten Versionen
-
Das Attribut
gateund der Initialisierungsparameter vonqiskit.transpiler.passes.Decomposeist veraltet und wird in einer zukünftigen Version entfernt werden. Anstelle dieses einzelnen Gatters sollten Sie eine Liste von Gatternamen an den neuen Parametergates_to_decomposeübergeben. Das neue Formular erlaubt es, mehr als ein Gatter als Zerlegungsziel auszuwählen, was flexibler ist, und es ist nicht notwendig, den Durchlauf mehrmals zu wiederholen, um eine Reihe von Gattern zu zerlegen. -
Bei den Kalibrierungen hat es eine erhebliche Umstrukturierung des Transpilerpasses gegeben. Die Importpfade:
from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilder from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilderNoEchosind veraltet und werden in einer zukünftigen Version entfernt. Der Importpfad:
from qiskit.transpiler.passes.scheduling.rzx_templates import rzx_templatesist ebenfalls veraltet und wird in einer zukünftigen Version entfernt werden. Sie sollten die neuen Importpfade verwenden:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.transpiler.passes import RZXCalibrationBuilderNoEcho from qiskit.transpiler.passes.calibration.rzx_templates import rzx_templates -
Die Klasse
DAGNodewird als eigenständige Klasse veraltet und wird in Zukunft nur noch als übergeordnete Klasse fürDAGOpNode,DAGInNodeundDAGOutNode. Als Teil dieser Verwerfung werden die folgenden kwargs und zugehörigen Attribute inDAGNodewerden ebenfalls veraltet:type,op, undwire. -
Für den Konstruktor der
RZXCalibrationBuilderist die Übergabe eines Backends entweder als erstes Positionsargument oder mit dem benanntenbackendkwarg veraltet und wird in einer zukünftigen Version nicht mehr funktionieren. Stattdessen sollte einInstructionScheduleMapdirekt an deninstruction_schedule_mapkwarg übergeben werden und eine Liste von Kanalnamenlisten für jedes Qubit direkt anqubit_channel_mappingübergeben werden. Wenn Sie zum Beispiel den Pass wie folgt aufrufen würden:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() cal_pass = RZXCalibrationBuilder(backend)stattdessen sollten Sie es so nennen:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() inst_map = backend.defaults().instruction_schedule_map channel_map = self.backend.configuration().qubit_channel_mapping cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, )Diese Änderung ist notwendig, weil Backend-Objekte in der Regel nicht pickle-serialisierbar sind und es zu einem Bruch kommen würde, wenn es mit mehreren Prozessen innerhalb von
transpile()verwendet wird, wenn mehrere Schaltkreise auf einmal kompiliert werden. -
Die Eigenschaft
labelder KlasseMCMTund UnterklasseMCMTVChainist veraltet und wird in einer zukünftigen Version entfernt werden. Folglich ist derlabelkwarg auf den Konstruktor für beide Klassen ebenfalls veraltet, zusammen mit demlabelkwarg der MethodeMCMT.control(). Derzeit wird die Eigenschaftlabelverwendet, um das kontrollierte Ziel zu benennen, wenn es aus mehr als einem Ziel-Qubit besteht. Dies war jedoch nie als benutzerdefinierte Angabe gedacht und kann zu einem falschen MCMT-Gate führen, wenn der Name einer bekannten Operation verwendet wird. Nach der Abschaffung wird die Eigenschaftlabelnicht mehr benutzerdefiniert sein. Sie können jedoch den generierten Namen des kontrollierten Ziels überMCMT.data[0][0].base_gate.name -
Die Methode
subgraph()der KlasseCouplingMapklasse ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollte diereduce()methode verwendet werden, die dasselbe tut, außer dass sie die Reihenfolge der Knotenlisten für die Ausgabe beibehältCouplingMapbeibehält (währendsubgraph()die Listenreihenfolge nicht beibehalten hat). -
Das Erstellen einer Instanz von
InstructionSetmit dem Schlüsselwortargumentcircuit_cregsist veraltet. Im Allgemeinen müssen diese Klassen nie von den Benutzern konstruiert werden (sondern werden intern verwendet), aber wenn Sie es doch tun müssen, sollten Sie einen Callable als Argument für das Schlüsselwortresource_requesterübergeben. Zum Beispiel:from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet from qiskit.circuit.exceptions import CircuitError def my_requester(bits, registers): bits_set = set(bits) bits_flat = tuple(bits) registers_set = set(registers) def requester(specifier): if isinstance(specifer, Clbit) and specifier in bits_set: return specifier if isinstance(specifer, ClassicalRegster) and specifier in register_set: return specifier if isinstance(specifier, int) and 0 <= specifier < len(bits_flat): return bits_flat[specifier] raise CircuitError(f"Unknown resource: {specifier}") return requester my_bits = [Clbit() for _ in [None]*5] my_registers = [ClassicalRegister(n) for n in range(3)] InstructionSet(resource_requester=my_requester(my_bits, my_registers)) -
Die Verwendung der Messabschwächungsklassen
qiskit.ignis.mitigation.CompleteMeasFitterundqiskit.ignis.mitigation.TensoredMeasFittervonqiskit-ignisals Werte für denmeasurement_error_mitigation_clskwarg des Konstruktors für dieQuantumInstanceklasse ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen werden die entsprechenden Klassen vonqiskit.utils.mitigation,CompleteMeasFitterundTensoredMeasFitterverwendet werden. Dies war notwendig, da das Projektqiskit-ignisnun veraltet ist und in naher Zukunft nicht mehr unterstützt wird. Es ist erwähnenswert, dass im Gegensatz zu den entsprechenden Klassen vonqiskit-ignisdie Versionen vonqiskit.utils.mitigationnur in ihrer Verwendung mitQuantumInstance(d.h. als Klasse und nicht als Instanz mit demmeasurement_error_mitigation_clskwarg) und nicht für die eigenständige Verwendung gedacht sind. -
Die Methode
Optimizer.optimize()für alle Optimierer (Optimizerund abgeleitete Klassen) ist jetzt veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollte dieOptimizer.minimize()methode verwendet werden, die die Signatur der Funktion SciPy’sminimize()nachahmt.Um den aktuellen Aufruf von optimize durch minimize zu ersetzen, können Sie
xopt, fopt, nfev = optimizer.optimize( num_vars, objective_function, gradient_function, variable_bounds, initial_point, )mit
result = optimizer.minimize( fun=objective_function, x0=initial_point, jac=gradient_function, bounds=variable_bounds, ) xopt, fopt, nfev = result.x, result.fun, result.nfev -
Beim Import des Moduls
qiskit.utilwird nun eineDeprecationWarningausgegeben. Die Benutzer sollten stattdessen die gleiche Funktionalität ausqiskit.utils. Das Modulutilist seit Terra 0.17 veraltet, hat aber bisher keine Warnung ausgegeben. Sie wird in Terra 0.20 entfernt. -
Die Eigenschaft
tableist veraltet und wird in einer zukünftigen Version entfernt werden. Der Grund dafür ist, dassSparsePauliOpaktualisiert wurde, um internPauliListanstelle vonPauliTablezu verwenden. Damit soll die Leistung deutlich verbessert werden. Sie sollten nun auf diePauliListdaten zugreifen, indem Sie dasSparsePauliOp.paulisattribut zugreifen.
Fehlerkorrekturen
-
Ein Fehler wurde behoben, bei dem viele Layout-Methoden 3 oder mehr Qubit-Gatter ignorierten, was zu unerwarteten Layout-Zuordnungsentscheidungen führte. Der Transpilerdurchlauf
Unroll3qOrMorewird nun in allen voreingestellten Pass-Managern vor dem Layout-Pass ausgeführt, wenntranspile()aufgerufen wird. Behoben #7156. -
Zerlegte Schaltkreise erben nun die Kalibrierungen von zusammengebauten
QasmQobjund Experimenten. Behebt #5348. -
Das Setzen der Attribute
ansatzoderoptimizereinerVQEinstanz aufNoneführte zu einem fehlerhaften Verhalten. Siehe #7093 für weitere Einzelheiten. -
Behobener Zusatz von
PauliLists mitqargs. Die Methode, die verwendet wurde, um einen Laufzeitfehler auszulösen, wenn die Operanden eine unterschiedliche Anzahl von Qubits hatten. -
Es wurde ein Problem behoben, das einen Fehler verursachte, wenn versucht wurde, einen Gradienten mit der
CircuitGradientklasse für ein Tor zu berechnen, das nicht unterstützt wurde. Dieser Bugfix transponiert ein gegebenes Gatter in die Menge der unterstützten Gatter für eine angeforderte Gradientenmethode. Behebt #6918. -
Entfernte Kalibrierungsergebnisse bei Verwendung der Fehlerminderung mit der
execute()methode vonQuantumInstance. Behebt #7129. -
Eine Warnung bezüglich der Veralterung wurde behoben, die bei der Ausführung von
QuantumCircuit.draw()odercircuit_drawer()mit installiertem Sympy 1.9 ausgegeben wurde, wobei die Sympy-Funktionexpr_free_symbols()erwähnt wurde. Die Schaltkreiszeichner haben diese Methode bereits bei der Suche nach symbolischen Konstanten angewandt. -
Es wurde ein Problem behoben, bei dem die
axkwarg und diefigwidthOption in derstylekwarg für diemplSchaltkreisschublade nicht richtig skaliert wurden. Benutzer können nun einaxaus einer Matplotlib Teilfläche an diemplSchaltkreisschublade übergeben und der Schaltkreis wird innerhalb der Grenzen dieser Teilfläche gezeichnet. Alternativ können Benutzer diefigwidthin Zoll imstyledict kwarg einstellen und die Zeichnung wird auf die eingestellte Breite in Zoll skaliert. Behoben #6367. -
Es wurde ein Problem mit der
circuit_drawer()funktion unddraw()methode vonQuantumCircuit. Bei der Anzeige einesmeasure-Befehls, der auf ein klassisches Bit anstelle eines Registers abzielt und die Optionlatexdrawer verwendet, schlägt die Schublade fehl. -
Es wurde ein Problem mit der
circuit_drawer()funktion unddraw()methode vonQuantumCircuit. Wenn bei einer der drei Schubladenoptionenmpl,latexodertextein Gatter mit einer klassischen Bedingung auftritt, die auf ein klassisches Bit ohne Register konditioniert ist, würde die Schublade fehlschlagen. -
Es wurde ein Problem mit der
circuit_drawer()funktion unddraw()methode vonQuantumCircuit. Wenn bei einer der drei Schubladenoptionenmpl,latexodertextein Gatter mit einer klassischen Bedingung auf dasselbe klassische Bit wie einmeasurekonditioniert wird und das Bit, auf das die Maßnahme abzielt, kein Register hat, würde die Schublade fehlschlagen. -
C3SXGatehat nun eine korrekte Zerlegung und Matrixdarstellung. Zuvor war es gleichbedeutend mitSdgXGate().control(3)und nicht wie vorgesehen mitSXGate().control(3). -
Das Mitglied
namevonqiskit.test.mock.utils.ConfigurableFakeBackendwurde inbackend_namegeändert. Dies wurde getan, um einen Konflikt mit dername()methode, die von der übergeordneten abstraktenBackendV1klasse. Dies machtConfigurableFakeBackendkompatibel mit allem, was einBackendV1objekt erwartet. Wenn Sie jedoch zuvor das Attributnamedirekt verwendet haben, müssen Sie es nun entweder als Methode aufrufen oder stattdessen auf das Attributbackend_namezugreifen. -
Ein Problem wurde behoben, bei dem der Aufruf von
QuantumCircuit.decompose()auf einem Schaltkreis, der eineInstructiondessendefinitionattribut leer war, die Anweisung an Ort und Stelle ließ, anstatt sie in Nulloperationen zu zerlegen. Zum Beispiel mit einer Schaltung:from qiskit.circuit import QuantumCircuit empty = QuantumCircuit(1, name="decompose me!") circuit = QuantumCircuit(1) circuit.append(empty.to_gate(), [0])Zuvor hatte der Aufruf von
circuit.decompose()die Schaltung nicht verändert. Nun wird die Zerlegungemptykorrekt in Null-Befehle zerlegt. Siehe #6997 für weitere Informationen. -
Es wurde ein Problem mit der
circuit_drawer()funktion unddraw()methode vonQuantumCircuit. Bei der Anzeige einermeasure-Anweisung, die eine klassischecondition-Anweisung mit den Optionenmploderlatexenthält, überschrieb diecondition-Information manchmal diemeasure-Anzeige. -
Es wurde ein Problem mit der
circuit_drawer()funktion unddraw()methode vonQuantumCircuit. In der Schublademplwird der Wertconditionin Hexadezimalschreibweise angezeigt, während in den Schubladentextundlatexdie Dezimalschreibweise verwendet wird. Alle drei Schubladen verwenden nun die Hexadezimalschreibweise. -
Es wurde ein Fehler im Hoare-Optimierungsdurchlauf behoben, bei dem versucht werden konnte, ein Gatter zweimal zu entfernen, wenn es sowohl mit seinem Vorgänger als auch mit seinem Nachfolger getrennt kombiniert werden konnte, um die Identität zu bilden. Siehe #7271 für weitere Einzelheiten.
-
Die Bedingung einer Anweisung mit der Standard
InstructionSet.c_if()methode mit ganzzahligen Indizes ist jetzt mit dem Nummerierungsschema derQuantumCircuitverwendet wird, zu dem die Anweisungen gehören. Zuvor war es so, dass bei zweiClassicalRegisters mit überlappendenClbits gab, war die Nummerierung falsch. Siehe #7246 für weitere Einzelheiten. -
Die Konditionierung einer Anweisung mit der Standard
InstructionSet.c_if()methode wird nun erfolgreich sein, auch wenn es keineClassicalRegisters in der Schaltung gibt. Siehe #7250 für weitere Einzelheiten. -
Konditionierung einer Anweisung mit der Standard
InstructionSet.c_if()methode bei Verwendung einerClbitdie in einem RegisterClassicalRegisterder Größe eins enthalten ist, wird nun korrekt eine Bedingung für das Bit und nicht für das Register erstellt. Siehe #7255 für weitere Einzelheiten. -
Der Versuch, eine Anweisung mit der Standard
InstructionSet.c_if()methode eine Anweisung zu konditionieren, wird nun korrekt ein Fehler ausgelöst, wenn die klassische Ressource nicht in der Schaltung vorhanden ist. Siehe #7255 für weitere Einzelheiten. -
Ein Kompatibilitätsproblem mit Matplotlib 3.5 wurde behoben, bei dem die Bloch-Kugel nicht gerendert werden konnte, wenn sie mit Vektoren versehen war, z. B. durch die Verwendung von
plot_bloch_vector. Siehe #7272 für weitere Einzelheiten. -
Ein Problem wurde behoben, bei dem die
NLocal.add_layer()methode fälschlicherweise Ebenen anfügte, wenn dasNLocalobjekt bereits erstellt worden war. -
Es wurde ein Problem mit dem Pickling
InstructionScheduleMapobjekt bei Verwendung von Python 3.6. Siehe #6944 für weitere Informationen. -
Die Zuweisung von komplexwertigen Pulsparametern mit symengine wurde korrigiert. Beispiel:
from qiskit import circuit, pulse import numpy as np amp = circuit.Parameter("amp") phase = circuit.Parameter("phase") with pulse.build() as sched: pulse.play(pulse.Gaussian(160, amp * np.exp(1j * phase), 40), pulse.DriveChannel(0)) sched.assign_parameters({amp: 0.1, phase: 1.57}, inplace=True)Die zugewiesene Amplitude wurde als
ParameterExpression(0.1*exp(1.57*I))angezeigt, nachdem die Verwendung vonsymenginein der Version 0.18.0 eingeführt worden war. Diese wird nun korrekt ausgewertet und als7.96327e-05 + 0.0999999683jangezeigt. -
Ein Problem wurde behoben, bei dem
QAOA.construct_circuit()mit verschiedenen Operatoren bei gleicher Anzahl von Qubits jedes Mal den gleichen Schaltkreis erzeugte. Siehe #7223 für weitere Einzelheiten. -
Ein Problem wurde behoben, bei dem
QAOAAnsatzeine falsche Anzahl von Parametern hatte, wenn Identitäten vonPauliSumOpangegeben wurden, z.B.PauliSumOp.from_list([("III", 1)]). Siehe #7225 für weitere Einzelheiten. -
Ein Fehler wurde behoben, bei dem die
QuantumCircuit.qasm()methode OpenQASM 2 Anweisungen mit ungültigen Bezeichnern zurückgeben konnte. Der gleiche Fehler wurde fürUnitaryGatebehoben. -
Es wurde ein Problem behoben, bei dem der Versuch, registerlose Bits anzuzeigen, zu einem Ausfall der
mplund derlatexSchaltkreisschubladen führte. Ein führendes_wurde aus der Anzeige der Nummern der registerlosen Bits in dertextSchublade entfernt. Behoben #6732. -
Bei Ein-Bit-Registern zeigen alle Schaltkreisschubladen nur noch den Registernamen und nicht mehr den Index
0an. Behoben #5784. -
Benennungskollisionen von impliziten Registern in
QuantumCircuit.qasmbeim Umgang mit registerlosen Qubits und Clbits. Zuvor wurden die registerlosen Qubits und Clbits in die entsprechendenqregundcregeingetragen, die beidereglessheißen, trotz der Kollision. Sie haben nun separate, deterministisch generierte Namen, die nicht mit benutzerdefinierten Registernamen in der Schaltung kollidieren. -
Es wurde ein Problem bei der Planung von Schaltkreisen mit Clbits-Operationen behoben, z. B. Messungen, bedingte Gatter, Aktualisierungen
ASAPSchedule,ALAPSchedule, undAlignMeasures. Die aktualisierten Scheduler gehen davon aus, dass alle clbits E/A-Operationen keine Zeit in Anspruch nehmen,measureschreibt den gemessenen Wert am Ende in ein clbit, undc_ifliest den bedingten Wert in clbit(s) am Anfang. Behoben #7006. -
Der Aufruf von
transpileauf eine leere Liste wird nun korrekt eine leere Liste zurückgeben, ohne eine Warnung auszugeben. Behoben #7287. -
Ein Problem wurde behoben in
PiecewiseChebyshevwenn die zu approximierende Funktion konstant war. In diesen Fällen sollten Sie nun die Konstante direkt alsf_xArgument übergeben, anstatt eine Funktion zu verwenden, wie z.B.:from qiskit.circuit.library.arithmetic import PiecewiseChebyshev PiecewiseChebyshev(1.0, degree=3)Siehe #6707 für weitere Einzelheiten.
-
Wenn eine
HHLAlgorithmus-Instanz ohne einQuantumInstance(der Standard) erstellt wurde, würden Versuche, die Getter- und Setter-Eigenschaften zu verwenden, um eine Instanz später zu lesen oder zu setzen, fehlschlagen. Die Getter und Setter funktionieren jetzt wie erwartet. -
Die Methode
QuantumCircuit.qasm()methode bearbeitet nun die Namen der Kopien der Anweisungen, die in der Schaltung vorhanden sind, und nicht die Originalanweisungen, die sich incircuit.databefinden. Siehe #6952 für weitere Einzelheiten. -
Ein Fehler wurde behoben in
PauliSumOp.permute()der den Fehler verursachte:QiskitError: 'Pauli string label "" is not valid.'wenn die Permutation die gleiche Anzahl von Pauli-Termen hätte. Der Aufruf von
permute([2, 1, 0])aufX ^ Y ^ Zführt nicht mehr zu einem Fehler, sondern gibt jetztZ ^ Y ^ Xzurück. -
Es wurde ein Fehler behoben, bei dem die Parametergrenzen für die Mixerparameter in der
QAOAAnsatznicht gesetzt wurden. -
Feste Bestimmung der endgültigen Operationen (Barrieren und Maßnahmen) im Durchgang
RemoveFinalMeasurementsund in der Methoderemove_final_measurements()der KlasseQuantumCircuitdie bisher nur Knoten berücksichtigte, die unmittelbar vor einem Ausgangsknoten liegen. -
Feste Bestimmung der endgültigen Operationen im Durchlauf
RemoveFinalMeasurementsund in der Methoderemove_final_measurements()der KlasseQuantumCircuitdie fälschlicherweise eine Barriere als endgültig betrachten konnte, auch wenn andere Schaltkreisoperationen darauf folgten. -
Entfernung von klassischen Mehrbit-Registern im Durchgang behoben
RemoveFinalMeasurementsund in der Methoderemove_final_measurements()der KlasseQuantumCircuitwo klassische Register nicht entfernt wurden, selbst wenn andere Bits im Leerlauf waren, es sei denn, eine abschließende Messung wurde in jedem einzelnen Bit durchgeführt. Jetzt werden klassische Register, die durch das Entfernen von Endmessungen und Schranken frei werden, immer entfernt. Klassische Bits werden entfernt, wenn sie nur von entfernten Registern referenziert werden oder überhaupt nicht referenziert sind und durch die Entfernung inaktiv wurden. Diese Korrektur fügt auch eine korrekte Handhabung von Registern mit gemeinsamen zugrunde liegenden Bits hinzu. -
Es wurde ein Problem mit
RemoveFinalMeasurementsdas dazu führen konnte, dass die resultierendeDAGCircuitungültig werden konnte. Siehe #7196 für weitere Einzelheiten. -
Ein Problem mit der Methode
remove_final_measurements()der KlasseQuantumCircuitdie dazu führte, dassQuantumCircuit.clbitsnach dem Aufruf nicht korrekt war. Siehe #7089 für Einzelheiten. -
Beim Verjüngen eines leeren Null-Operators in
qiskit.opflowwurde eine Warnung ausgegeben und der ursprüngliche Operator zurückgegeben, als der Code feststellte, dass es sich um eine Null handelt. Solche Operatoren werden häufig in den Hilfsoperatoren gefunden, wenn Qiskit Nature verwendet wird, und das obige Verhalten führte dazu, dassVQEeine Ausnahme auslöste, da die verjüngten Nicht-Null-Operatoren eine andere Anzahl von Qubits hatten als die verjüngten Null-Operatoren (da Taper den Eingabeoperator unverändert zurückgegeben hat). Der Code wird nun einen Null-Operator korrekt verjüngen, so dass die Anzahl der Qubits wie erwartet reduziert wird und mit verjüngten Nicht-Null-Operatoren übereinstimmt, z.B. wird`0*"IIII"`, wenn wir um 3 Qubits verjüngen, zu0*"I". -
Es wurde ein Problem mit der
draw()methode undcircuit_drawer()funktion, wo ein benutzerdefinierter Stil, der über die Benutzerkonfigurationsdatei (d.h.settings.conf) würde den gesetzten Wert des Feldescircuit_mpl_styleignorieren, wenn derstylekwarg für die Funktion/Methode nicht gesetzt war.
Sonstige Anmerkungen
-
Der String-Cast für
qiskit.circuit.ParameterExpressionhat nicht mehr die volle Präzision. Dadurch wird das Ende von 0s beim Drucken von Parametern, die an Floats gebunden sind, entfernt. Dies hat Folgen für die QASM-Serialisierung und die Schaltkreistextschublade:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> str(x.bind({x:0.5})) '0.5' # instead of '0.500000000000000' -
Die
QAOAAnsatzwurde aktualisiert, um das Parametersymbolγfür den Kostenoperator undβfür den Mixeroperator zu verwenden, wie es der Standardnotation in der QAOA-Literatur entspricht.
Aer- 0.9.1
Keine Änderung
Ignis- 0.7.0
Vorspiel
Mit dieser Version wird das Qiskit Ignis Projekt veraltet, es wurde durch das Qiskit Experiments Projekt ersetzt und die aktive Entwicklung wurde eingestellt. Kritische Fehler- und Kompatibilitätskorrekturen werden weiterhin durchgeführt, um den Nutzern die Möglichkeit zu geben, von Ignis zu migrieren, auch wenn es veraltet ist. Nach Ablauf der Abschreibungsfrist (die nicht kürzer als 3 Monate nach dieser Veröffentlichung sein wird) wird das Projekt eingestellt und archiviert.
Neue Funktionen
-
Aktualisierung des Akkreditierungsprotokolls zur Verwendung der Anpassungsroutine von https://arxiv.org/abs/2103.06603.
AccreditationFitterhat jetzt die Methoden FullAccreditation (früheres Protokoll) und MeanAccreditation (neues Protokoll). Außerdem wurde die Dateneingabe so geändert, dass entweder das Ergebnisobjekt AppendResult oder eine Liste von Strings AppendStrings verwendet wird.qiskit.ignis.verification.QOTPCorrectString()wurde ebenfalls hinzugefügt. -
Hinzufügen der Option für die schnelle analytische Erstellung von Syndromdiagrammen.
RepetitionCodehat jetzt ein neues bool-Argumentbrute, das es erlaubt, die Brute-Force-Methode weiterhin zu verwenden. HilfsklasseRepetitionCodeSyndromeGeneratorhinzugefügt, um dies zu erleichtern. -
RepetitionCodehat jetzt Schlüsselwortargumenteresetsunddelay. Ersteres bestimmt, ob nach der Messung Reset-Gates eingefügt werden. Letzteres ermöglicht es, eine Zeit (in dt) für eine Verzögerung nach jeder Messung (und ggf. Rückstellung) festzulegen.Die Methode
syndrome_measurement()vonRepetitionCodehat jetzt Schlüsselwortargumentefinalunddelay. Ersteres bestimmt, ob Rücksetzgatter gemäß der globalenresetshinzugefügt werden sollen oder ob sie mit einem geeigneten Verhalten für die letzte Runde der Syndrommessungen überschrieben werden sollen. Letzteres ermöglicht es, eine Zeit (in dt) für eine Verzögerung nach jeder Messung (und ggf. Rückstellung) festzulegen. -
Die Klasse
RepetitionCodeunterstützt nun die Kodierung mit x Basiszuständen. Dies kann verwendet werden, indem bei der Erstellung einesRepetitionCode-Objekts das Schlüsselwortargumentxbasisgesetzt wird.
Anmerkungen zu Upgrades
-
Das Schlüsselwortargument
resetwurde aus der Methodesyndrome_measurement()vonRepetitionCodeentfernt. Dieses wird durch das globale Schlüsselwortargumentresetsfür die Klasse sowie das Schlüsselwortargumentfinalfürsyndrome_measurementersetzt. In den Fällen, in denen man bisher die letzte Messrunde mitreset=Falsehinzugefügt hat, um die letzten Rücksetzgatter zu vermeiden, sollte man jetztfinal=Trueverwenden. -
Entfernen Sie
ParametrizedSchedulevonupdate_u_gates().ParametrizedSchedulewurde als Teil von Qiskit-terra 0.17.0 veraltet und wird in der nächsten Version entfernt werden. Die Funktion aktualisiert jetzt u gates mitScheduleProgrammen, die nicht zugewieseneParameterObjekte beinhalten.
Hinweise zu veralteten Versionen
-
Veraltete Methoden in
AccreditationFitter, nämlich bound_variation_distance und single_protocol_run -
Das Qiskit Ignis Projekt als Ganzes ist veraltet und wird in Zukunft eingestellt und archiviert werden. Obwohl veraltet, werden nur Kompatibilitätskorrekturen und Korrekturen von kritischen Fehlern in das Projekt aufgenommen. Anstatt Qiskit Ignis zu verwenden, sollten Sie auf Qiskit Experiments umsteigen. Sie können sich auf den Migrationsleitfaden beziehen:
https://github.com/qiskit-community/qiskit-ignis#migration-guide