Qiskit 0.28 Versionshinweise
0.28.0
Terra- 0.18.0
Vorspiel
Diese Version enthält viele neue Funktionen und Fehlerkorrekturen. Die Highlights dieser Version sind die Einführung von zwei neuen Transpilerpässen, BIPMapping und DynamicalDecoupling, die in Kombination mit dem neuen pulse_optimize kwarg auf dem UnitarySynthesis passes die Wiederherstellung der Ergebnisse von Quantum Volume 64 unter Verwendung der in beschrieben Techniken ermöglicht: https://arxiv.org/abs/2008.08571. Diese neuen Transpiler-Passagen und -Optionen sind auch allgemein für die Optimierung jeder Schaltung anwendbar.
Neue Funktionen
-
Der
measurement_error_mitgationkwarg für denQuantumInstancekonstruktor kann nun auf die KlasseTensoredMeasFittervon qiskit-ignis gesetzt werden, zusätzlich zuCompleteMeasFitter, das bereits unterstützt wurde. Wenn SieTensoredMeasFitterverwenden, können Sie auch den neuenmit_patternkwarg setzen, um die Qubits zu spezifizieren, für dieTensoredMeasFitterverwendet werden soll. Das erwartete Format finden Sie in der Dokumentation fürmit_patternin der Dokumentation fürTensoredMeasFitter. -
Die Zerlegungsmethoden für Ein-Qubit-Gatter, spezifiziert durch den
basiskwarg, inOneQubitEulerDecomposerwurde um die Basis'ZSXX'erweitert, um sowohl das direkte -Gatter als auch das -Gatter nutzen zu können. -
Zwei neue Pässe hinzugefügt
AlignMeasuresundValidatePulseGateszu demqiskit.transpiler.passesmodul. Bei diesen Durchläufen handelt es sich um eine hardwarenahe Optimierung und eine Validierungsroutine, die zur Verwaltung von Ausrichtungsbeschränkungen bei der zeitlichen Zuordnung von Anweisungen für ein Backend verwendet werden.Wenn ein Backend eine Beschränkung für die Ausrichtung von
MeasureAnweisungen hat (in Bezug auf die zeitliche Quantisierung), wird derAlignMeasurespass verwendet, um Verzögerungen in einer geplanten Schaltung anzupassen, um sicherzustellen, dass alleMeasureAnweisungen in der Schaltung unter Berücksichtigung der Beschränkungen des Backends ausgerichtet sind. DerValidatePulseGatespass wird verwendet, um zu prüfen, ob benutzerdefinierte Impulsgatter (Gatter, die eine benutzerdefinierte Impulsdefinition imcalibrationsattribut einesQuantumCircuitobjekts) angesichts einer Ausrichtungsbeschränkung für das Ziel-Backend gültig sind.In der eingebauten
preset_passmangers, die von der Funktiontranspile()funktion werden diese Übergänge automatisch ausgelöst, wenn die Ausrichtungsbeschränkung, entweder über den speziellentiming_constraintskwarg auftranspile()oder über eintiming_constraintsAttribut in demBackendConfigurationobjekt des angepeilten Backends hat.Die Backends von IBM Quantum Services (zugänglich über das Paket qiskit-ibmq-provider ) werden in naher Zukunft die Alignment-Informationen bereitstellen.
Zum Beispiel:
from qiskit import circuit, transpile from qiskit.test.mock import FakeArmonk backend = FakeArmonk() qc = circuit.QuantumCircuit(1, 1) qc.x(0) qc.delay(110, 0, unit="dt") qc.measure(0, 0) qc.draw('mpl')qct = transpile(qc, backend, scheduling_method='alap', timing_constraints={'acquire_alignment': 16}) qct.draw('mpl') -
Eine neue Transpiler-Pass-Klasse
qiskit.transpiler.passes.BIPMapping, die versucht, das beste Layout und Routing auf einmal zu finden, indem sie ein BIP-Problem (binäre ganzzahlige Programmierung) löst, wie es in arXiv:2106.06446 beschrieben, wurde hinzugefügt.Der Durchgang
BIPMapping(der Name "mapping" bezieht sich auf "Layout und Routing") stellt das Mapping-Problem als BIP-Problem (binäre ganzzahlige Programmierung) dar und stützt sich auf CPLEX (cplex) zur Lösung des BIP-Problems. Die abhängigen Bibliotheken einschließlich CPLEX können zusammen mit qiskit-terra installiert werden:pip install qiskit-terra[bip-mapper]Da die kostenlose Version von CPLEX nur kleine BIP-Probleme lösen kann, d. h. die Abbildung von Schaltkreisen mit weniger als etwa 5 Qubits, wird für die Abbildung größerer Schaltkreise möglicherweise die kostenpflichtige Version von CPLEX benötigt.
Der BIP-Mapper skaliert schlecht in Bezug auf die Anzahl der Qubits oder Gatter. Beispielsweise funktioniert
coupling_mapnicht mit mehr als 10 Qubits, weil der BIP-Solver (CPLEX) keine Lösung innerhalb der Standardzeit findet.Beachten Sie, dass Sie, wenn Sie physische Qubits festlegen wollen, die in der Abbildung verwendet werden sollen (z. B. bei der Ausführung von Quantum Volume (QV)-Schaltungen),
coupling_mapangeben müssen, die nur die zu verwendenden Qubits enthält.Hier ist ein minimaler Beispielcode zur Erstellung eines Passmanagers, um einen QV-Schaltkreis zu transpilieren:
num_qubits = 4 # QV16 circ = QuantumVolume(num_qubits=num_qubits) backend = ... basis_gates = backend.configuration().basis_gates coupling_map = CouplingMap.from_line(num_qubits) # supply your own coupling map def _not_mapped(property_set): return not property_set["is_swap_mapped"] def _opt_control(property_set): return not property_set["depth_fixed_point"] from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel pm = PassManager() # preparation pm.append([ Unroll3qOrMore(), TrivialLayout(coupling_map), FullAncillaAllocation(coupling_map), EnlargeWithAncilla(), BarrierBeforeFinalMeasurements() ]) # mapping pm.append(BIPMapping(coupling_map)) pm.append(CheckMap(coupling_map)) pm.append(Error(msg="BIP mapper failed to map", action="raise"), condition=_not_mapped) # post optimization pm.append([ Depth(), FixedPoint("depth"), Collect2qBlocks(), ConsolidateBlocks(basis_gates=basis_gates), UnitarySynthesis(basis_gates), Optimize1qGatesDecomposition(basis_gates), CommutativeCancellation(), UnrollCustomDefinitions(sel, basis_gates), BasisTranslator(sel, basis_gates) ], do_while=_opt_control) transpile_circ = pm.run(circ) -
Eine neue Konstruktormethode
initialize_from()wurde zu derScheduleundScheduleBlockklassen hinzugefügt. Diese Methode initialisiert einen neuen leeren Zeitplan, der die Attribute von anderen Zeitplänen übernimmt. Zum Beispiel:sched = Schedule(name='my_sched') new_sched = Schedule.initialize_from(sched) assert sched.name == new_sched.name -
Der Funktion wurde ein neuer kwarg,
line_discipline, hinzugefügtjob_monitor()funktion hinzugefügt. Mit diesem kwarg können die in der Ausgabe vonjob_monitorverwendeten Wagenrücklaufzeichen geändert werden. Derline_disciplinekwarg ist standardmäßig auf'\r'eingestellt, was auch vorher verwendet wurde. -
Die abstrakte Klasse
Pulse(die die übergeordnete Klasse für Klassen wieWaveform,Constant, undGaussianhat jetzt einen neuen kwarg auf den Konstruktor,limit_amplitude, der aufFalsegesetzt werden kann, um die zuvor fest kodierte Amplitudengrenze von1zu deaktivieren. Dies kann auch direkt als Klassenattribut gesetzt werden, um den globalen Standard für eine Pulse-Klasse zu ändern. Zum Beispiel:from qiskit.pulse.library import Waveform # Change the default value of limit_amplitude to False Waveform.limit_amplitude = False wave = Waveform(2.0 * np.exp(1j * 2 * np.pi * np.linspace(0, 1, 1000))) -
Eine neue Klasse,
PauliListwurde dem Modulqiskit.quantum_infomodul hinzugefügt. Diese Klasse dient der effizienten Darstellung einer Liste vonPaulioperatoren. Diese neue Klasse stammt von derselben übergeordneten Klasse ab wie die bestehendePauliTable(und kann daher größtenteils austauschbar verwendet werden), sie unterscheidet sich jedoch von derPauliTable, da dieqiskit.quantum_info.PauliListklasse Z4 Phasen behandeln kann. -
Ein neuer Transpiler-Pass wurde hinzugefügt,
RemoveBarriers, zuqiskit.transpiler.passes. Dieser Durchgang wird verwendet, um alle Hindernisse in einem Stromkreis zu beseitigen. -
Fügen Sie eine neue Optimiererklasse hinzu,
SciPyOptimizerzu demqiskit.algorithms.optimizersmodul hinzu. Diese Klasse ist eine einfache Wrapper-Klasse der Funktionscipy.optimize.minimize(Dokumentation ), die die Verwendung aller Optimierungslöser und aller Parameter (z.B. Callback) ermöglicht, die vonscipy.optimize.minimizeunterstützt werden. Zum Beispiel:from qiskit.algorithms.optimizers import SciPyOptimizer values = [] def callback(x): values.append(x) optimizer = SciPyOptimizer("BFGS", options={"maxiter": 1000}, callback=callback) -
Der
HoareOptimizerpass wurde verbessert, so dass er nun einControlledGatein einer Schaltung mit dem Basisgatter ersetzen kann, wenn sich alle Kontrollqubits im Zustand befinden. -
Zwei neue Methoden hinzugefügt,
is_successor()undis_predecessor()zu derDAGCircuitklasse. Diese Funktionen werden verwendet, um zu prüfen, ob ein Knoten entweder ein Nachfolger oder ein Vorgänger eines anderen Knotens auf derDAGCircuit. -
Ein neuer Transpiler-Pass,
RZXCalibrationBuilderNoEchowurde demqiskit.transpiler.passesmodul hinzugefügt. Dieser Durchgang ähnelt dem bestehendenRZXCalibrationBuilderinsofern, als dass er Kalibrierungen für eineRZXGate(theta)erstellt, jedochRZXCalibrationBuilderNoEchotut dies jedoch, ohne die Echoimpulse in den Impulsplan einzufügen. Dies ermöglicht es, das Echo in der Kreuzresonanzsequenz als Gatter darzustellen, so dass der Transpiler sie vereinfachen kann. DerRZXCalibrationBuilderNoEchopass unterstützt nur die hardware-native Richtung derCXGate. -
Ein neuer kwarg,
wrap, wurde dercompose()methode vonQuantumCircuit. Auf diese Weise kann ausgewählt werden, ob zusammengesetzte Schaltungen in eine Anweisung eingeschlossen werden sollen oder nicht. Standardmäßig ist diesFalse, d.h. kein Umbruch. Zum Beispiel:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h([0, 1]) other = QuantumCircuit(2) other.x([0, 1]) print(circuit.compose(other, wrap=True)) # wrapped print(circuit.compose(other, wrap=False)) # not wrapped -
Ein neues Attribut,
control_channelswurde der KlassePulseBackendConfigurationklasse hinzugefügt. Dieses Attribut stellt die Kontrollkanäle auf einem Backend als eine Abbildung von Qubits auf eine Liste vonControlChannelobjekten. -
Dem Konstruktor für die Klasse
Isometrywurde ein neuer kwarg,epsilon, hinzugefügt und die entsprechendeQuantumCircuitmethodeisometry(). Dieser Warg ermöglicht die optionale Einstellung der Epsilontoleranz, die von einemIsometryGate verwendet wird. Zum Beispiel:import numpy as np from qiskit import QuantumRegister, QuantumCircuit tolerance = 1e-8 iso = np.eye(2,2) num_q_output = int(np.log2(iso.shape[0])) num_q_input = int(np.log2(iso.shape[1])) q = QuantumRegister(num_q_output) qc = QuantumCircuit(q) qc.isometry(iso, q[:num_q_input], q[num_q_input:], epsilon=tolerance) -
Ein Transpiler-Pass wurde hinzugefügt,
DynamicalDecouplingzuqiskit.transpiler.passeszum Einfügen von dynamischen Entkopplungssequenzen in Leerlaufperioden eines Schaltkreises (nach Zuordnung zu physischen Qubits und Scheduling). Der Durchlauf ermöglicht die Kontrolle über die Reihenfolge der DD-Gates, den Abstand zwischen ihnen und die Qubits, auf die sie angewendet werden. Zum Beispiel:from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import XGate from qiskit.transpiler import PassManager, InstructionDurations from qiskit.transpiler.passes import ALAPSchedule, DynamicalDecoupling from qiskit.visualization import timeline_drawer circ = QuantumCircuit(4) circ.h(0) circ.cx(0, 1) circ.cx(1, 2) circ.cx(2, 3) circ.measure_all() durations = InstructionDurations( [("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10), ("cx", [1, 2], 200), ("cx", [2, 3], 300), ("x", None, 50), ("measure", None, 1000)] ) dd_sequence = [XGate(), XGate()] pm = PassManager([ALAPSchedule(durations), DynamicalDecoupling(durations, dd_sequence)]) circ_dd = pm.run(circ) timeline_drawer(circ_dd) -
Die
QuantumCircuitmethodeqasm()hat einen neuen kwarg,encoding, der verwendet werden kann, um optional die Zeichenkodierung einer von der Funktion erzeugten QASM-Ausgabedatei festzulegen. Dies kann auf jeden gültigen Codec oder Alias-String aus dem Codec-Modul der Standardbibliothek Python gesetzt werden. -
Eine neue Klasse wurde hinzugefügt,
EvolvedOperatorAnsatzzu demqiskit.circuit.librarymodul hinzugefügt. Diese Bibliotheksschaltung, die sich zuvor in Qiskit Nature befand, kann verwendet werden, um Ansatzschaltungen zu konstruieren, die aus zeitlich entwickelten Operatoren bestehen, wobei die Evolutionszeit ein Variationsparameter ist. Beispiele für solche Ansatzschaltungen sind die KlasseUCCSDim Modulchemistryvon Qiskit Nature oder dieQAOAAnsatzklasse. -
Eine neue Fake-Backend-Klasse ist unter
qiskit.test.mockfür dasibmq_guadalupeBackend verfügbar. Wie bei den anderen Fake-Backends umfasst dies einen Schnappschuss der 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. -
Eine neue Methode
children()für dieScheduleklasse wurde hinzugefügt. Diese Methode wird verwendet, um die untergeordneten Zeitplankomponenten desScheduleobjekts als Tupel zurückzugeben. Sie gibt verschachtelte Zeitpläne ohne Verflachung zurück. Diese Methode entspricht der privaten Methode_children(), hat aber eine öffentliche und stabile Schnittstelle. -
Eine neue Optimiererklasse,
GradientDescentwurde demqiskit.algorithms.optimizersmodul hinzugefügt. Diese Optimierungsklasse implementiert einen Standard-Gradientenabstiegs-Optimierungsalgorithmus zur Verwendung mit Quantenvariationsalgorithmen, wie z. BVQE. Eine detaillierte Beschreibung und Beispiele für die Verwendung dieser Klasse finden Sie in derGradientDescentdokumentation der Klasse. -
Eine neue Optimiererklasse,
QNSPSAwurde demqiskit.algorithms.optimizersmodul hinzugefügt. Diese Klasse implementiert den Quantum Natural SPSA (QN-SPSA) Algorithmus, eine Verallgemeinerung des 2-SPSA Algorithmus, und schätzt die Quantum Fisher Information Matrix anstelle der Hessian, um eine stochastische Schätzung des Quantum Natural Gradienten zu erhalten. Beispiele für die Verwendung dieses neuen Optimierers finden Sie in derQNSPSAklassendokumentation. -
Ein neuer kwarg,
second_order, wurde dem Konstruktor der KlasseSPSAklasse imqiskit.algorithms.optimizersmodul hinzugefügt. Wenn diese Option aufTruegesetzt ist, kann SPSA zweiter Ordnung verwendet werden. SPSA zweiter Ordnung, oder 2-SPSA, ist eine Erweiterung des gewöhnlichen SPSA-Algorithmus, die es ermöglicht, neben dem Gradienten auch die Hessian zu schätzen, die zur Vorkonditionierung des Gradienten vor dem Schritt der Parameteraktualisierung verwendet wird. Als Methode zweiter Ordnung wird damit versucht, die Konvergenz von SPSA zu verbessern. Beispiele für die Verwendung dieser Option finden Sie in derSPSAdokumentation der Klasse. -
Bei Verwendung des Ausgabemodus
latexoderlatex_sourcevoncircuit_drawer()oder derdraw()vonQuantumCircuitkann derstylekwarg jetzt genauso wie bei dermplAusgabeformatierung verwendet werden. Im Gegensatz zum Ausgabemodusmplwird bei den Ausgabemodilatexundlatex_sourcejedoch nur das Felddisplaytextverwendet (da beide keine Farbe unterstützen). -
Bei Verwendung der Ausgabemethoden
mploderlatexfür diecircuit_drawer()funktion oder derdraw()vonQuantumCircuitverwenden, können Sie jetzt die mathematische Formatierung für Text verwenden und die Farbformatierung einstellen (nurmpl), indem Sie denstylekwarg als Diktat mit einem benutzerdefinierten Namen oder Label setzen. Zum Beispiel, um tiefgestellte Zeichen hinzuzufügen und die Farbe eines Gatters zu ändern:from qiskit import QuantumCircuit from qiskit.circuit.library import HGate qc = QuantumCircuit(3) qc.append(HGate(label='h1'), [0]) qc.append(HGate(label='h2'), [1]) qc.append(HGate(label='h3'), [2]) qc.draw('mpl', style={'displaytext': {'h1': 'H_1', 'h2': 'H_2', 'h3': 'H_3'}, 'displaycolor': {'h2': ('#EEDD00', '#FF0000')}}) -
Drei neue Klassen hinzugefügt,
CDKMRippleCarryAdder,ClassicalAdderundDraperQFTAdder, zumqiskit.circuit.librarymodul hinzugefügt. Diese neuen Schaltungsklassen werden zur klassischen Addition von zwei gleich großen Qubit-Registern verwendet. Für zwei Register und auf führen die drei neuen Klassen die Operation aus:
Zum Beispiel:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import CDKMRippleCarryAdder
from qiskit.quantum_info import Statevector
# a encodes |01> = 1
a = QuantumCircuit(2)
a.x(0)
# b encodes |10> = 2
b = QuantumCircuit(2)
b.x(1)
# adder on 2-bit numbers
adder = CDKMRippleCarryAdder(2)
# add the state preparations to the front of the circuit
adder.compose(a, [0, 1], inplace=True, front=True)
adder.compose(b, [2, 3], inplace=True, front=True)
# simulate and get the state of all qubits
sv = Statevector(adder)
counts = sv.probabilities_dict()
state = list(counts.keys())[0] # we only have a single state
# skip the input carry (first bit) and the register |a> (last two bits)
result = state[1:-2]
print(result) # '011' = 3 = 1 + 2- Zwei neue Klassen hinzugefügt,
RGQFTMultiplierundHRSCumulativeMultiplierzu demqiskit.circuit.librarymodul hinzugefügt. Diese Klassen werden für die klassische Multiplikation zweier gleich großer Qubit-Register verwendet. Für zwei Register und auf qubits führen die beiden neuen Klassen die Operation
Zum Beispiel:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import RGQFTMultiplier
from qiskit.quantum_info import Statevector
num_state_qubits = 2
# a encodes |11> = 3
a = QuantumCircuit(num_state_qubits)
a.x(range(num_state_qubits))
# b encodes |11> = 3
b = QuantumCircuit(num_state_qubits)
b.x(range(num_state_qubits))
# multiplier on 2-bit numbers
multiplier = RGQFTMultiplier(num_state_qubits)
# add the state preparations to the front of the circuit
multiplier.compose(a, [0, 1], inplace=True, front=True)
multiplier.compose(b, [2, 3], inplace=True, front=True)
# simulate and get the state of all qubits
sv = Statevector(multiplier)
counts = sv.probabilities_dict(decimals=10)
state = list(counts.keys())[0] # we only have a single state
# skip both input registers
result = state[:-2*num_state_qubits]
print(result) # '1001' = 9 = 3 * 3-
Die Klasse
Delayklasse kann nun einParameterExpressionoderParameterwert für dendurationkwarg auf ihrem Konstruktor und für ihrdurationattribut.Zum Beispiel:
idle_dur = Parameter('t') qc = QuantumCircuit(1, 1) qc.x(0) qc.delay(idle_dur, 0, 'us') qc.measure(0, 0) print(qc) # parameterized delay in us (micro seconds) # assign before transpilation assigned = qc.assign_parameters({idle_dur: 0.1}) print(assigned) # delay in us transpiled = transpile(assigned, some_backend_with_dt) print(transpiled) # delay in dt # assign after transpilation transpiled = transpile(qc, some_backend_with_dt) print(transpiled) # parameterized delay in dt assigned = transpiled.assign_parameters({idle_dur: 0.1}) print(assigned) # delay in dt -
Es wurde ein neues binäres Serialisierungsformat, QPY, eingeführt. Es ist ein schnelles, binäres Serialisierungsformat, das rückwärtskompatibel ist (QPY-Dateien, die mit älteren Versionen von Qiskit erzeugt wurden, können von neueren Versionen von Qiskit geladen werden) und von Qiskit stammt. Das QPY-Serialisierungs-Tooling ist über das Modul
qiskit.circuit.qpy_serializationverfügbar. Zum Beispiel, um eine QPY-Datei zu erzeugen:from datetime import datetime from qiskit.circuit import QuantumCircuit from qiskit.circuit import qpy_serialization qc = QuantumCircuit( 2, metadata={'created_at': datetime.utcnow().isoformat()} ) qc.h(0) qc.cx(0, 1) qc.measure_all() circuits = [qc] * 5 with open('five_bells.qpy', 'wb') as qpy_file: qpy_serialization.dump(circuits, qpy_file)Anschließend können die fünf in der QPY-Datei gespeicherten Schaltkreise mit geladen werden:
from qiskit.circuit.qpy_serialization with open('five_bells.qpy', 'rb') as qpy_file: circuits = qpy_serialization.load(qpy_file)Die Spezifikation des QPY-Dateiformats finden Sie in der Dokumentation des Moduls.
-
Die
TwoQubitBasisDecomposerklasse wurde aktualisiert, um pulsoptimale Zerlegungen für eine Basis mit CX-, √X- und virtuellen Rz-Toren durchzuführen, wie in https://arxiv.org/pdf/2008.08571. Pulsoptimal bedeutet hier, dass die Dauer der Gatter zwischen den CX-Gattern der Zerlegung im Austausch für möglicherweise mehr lokale Gatter vor oder nach allen CX-Gattern reduziert wird, so dass beim Zusammensetzen zu einer Schaltung die Möglichkeit einer Einzel-Qubit-Kompression mit benachbarten Gattern besteht, die die Gesamtdauer der Sequenz reduziert.Ein neues Schlüsselwortargument,
`pulse_optimize, wurde dem Konstruktor fürTwoQubitBasisDecomposerhinzugefügt, um dies zu kontrollieren:None: Versuch der pulsoptimalen Zerlegung. Wenn eine impulsoptimale Zerlegung für die Basis des Zerlegers unbekannt ist, wird ohne Vorwarnung auf die Standardzerlegung zurückgegriffen. Dies ist die Standardeinstellung.True: Versuch der pulsoptimalen Zerlegung. Ist eine impulsoptimale Zerlegung für die Basis des Zerlegers unbekannt, erhöhen Sie QiskitError.False: Versuchen Sie nicht, den Puls optimal zu zersetzen.
Zum Beispiel:
from qiskit.quantum_info import TwoQubitBasisDecomposer from qiskit.circuit.library import CXGate from qiskit.quantum_info import random_unitary unitary_matrix = random_unitary(4) decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="ZSX", pulse_optimize=True) circuit = decomposer(unitary_matrix) -
Der Transpiler-Pass
UnitarySynthesis, der sich inqiskit.transpiler.passeswurde aktualisiert, um die Durchführung der pulsoptimalen Dekomposition zu unterstützen. Dies geschieht in erster Linie mit dem Schlüsselwortargumentpulse_optimize, das dem Konstruktor hinzugefügt wurde und mit dem gesteuert wird, ob eine pulsoptimale Synthese durchgeführt wird. Das Verhalten dieses kwarg spiegelt denpulse_optimizekwarg imTwoQubitBasisDecomposerkonstruktor der Klasse. Zusätzlich hat der Konstruktor ein weiteres neues Schlüsselwortargument,synth_gates, mit dem die Liste der Gatternamen angegeben wird, über die eine Synthese versucht werden soll. WennNoneundpulse_optimizegleichFalseoderNonesind, verwenden Sie"unitary". Wenn Keine und pulse_optimizeTrueist, verwenden Sie"unitary"und"swap". Da die Richtung des CX-Gatters in der Synthese willkürlich ist, wird ein weiteres Schlüsselwortargument,natural_direction, hinzugefügt, um zuerst eine Kopplungskarte und dannCXGatedauer bei der Wahl der CX-Richtung für die Synthese zu berücksichtigen.from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager, CouplingMap from qiskit.transpiler.passes import TrivialLayout, UnitarySynthesis from qiskit.test.mock import FakeVigo from qiskit.quantum_info.random import random_unitary backend = FakeVigo() conf = backend.configuration() coupling_map = CouplingMap(conf.coupling_map) triv_layout_pass = TrivialLayout(coupling_map) circ = QuantumCircuit(2) circ.unitary(random_unitary(4), [0, 1]) unisynth_pass = UnitarySynthesis( basis_gates=conf.basis_gates, coupling_map=None, backend_props=backend.properties(), pulse_optimize=True, natural_direction=True, synth_gates=['unitary']) pm = PassManager([triv_layout_pass, unisynth_pass]) optimal_circ = pm.run(circ) -
Eine neue Basisoption,
'XZX', wurde für das ArgumentbasishinzugefügtOneQubitEulerDecomposerklasse. -
Es wurde eine neue Methode hinzugefügt,
get_instructions()wurde der KlasseQuantumCircuitklasse hinzugefügt. Diese Methode wird verwendet, um alleInstructionobjekte im Schaltkreis zurück, die einnamehaben, das mit dem angegebenen Argumentnameübereinstimmt, sowie die zugehörigen ListenqargsundcargsvonQubitundClbitobjekten. -
Ein neues optionales Extra
allwurde dem qiskit-terra Paket hinzugefügt. Dies ermöglicht die Installation aller optionalen Anforderungen mit einem einzigen Extra, zum Beispiel:pip install 'qiskit-terra[all]'zuvor war es notwendig, alle Extras einzeln aufzulisten, um alle optionalen Abhängigkeiten gleichzeitig zu installieren. -
Zwei neue Klassen hinzugefügt
ProbDistributionundQuasiDistributionfür den Umgang mit Wahrscheinlichkeitsverteilungen bzw. Quasi-Wahrscheinlichkeitsverteilungen. Bei diesen Objekten handelt es sich um Wörterbuch-Unterklassen, die zusätzliche Methoden für die Arbeit mit Wahrscheinlichkeits- und Quasi-Wahrscheinlichkeitsverteilungen enthalten. -
Hinzufügen einer neuen
settingseigenschaft zu derOptimizerabstrakten Basisklasse, auf der alle Optimiererklassen imqiskit.algorithms.optimizersmodul basieren. Diese Eigenschaft gibt ein Python Wörterbuch mit den Einstellungen für den Optimierer zurück, das verwendet werden kann, um eine andere Instanz derselben Optimiererklasse zu instanziieren. Zum Beispiel:from qiskit.algorithms.optimizers import GradientDescent optimizer = GradientDescent(maxiter=10, learning_rate=0.01) settings = optimizer.settings new_optimizer = GradientDescent(**settings)Das
settingsWörterbuch kann auch für die Serialisierung von Optimierungsobjekten mit JSON oder einem anderen Serialisierungsformat nützlich sein. -
Das Modul
qiskit.user_configwurde um eine neue Funktion,set_config(), erweitert. Diese Funktion ermöglicht das Setzen von Werten in einer Benutzerkonfiguration über die Qiskit-API. Zum Beispiel:from qiskit.user_config import set_config set_config("circuit_drawer", "mpl", section="default", file="settings.conf")was dazu führt, dass dem Abschnitt
defaultin der Dateisettings.confein Wert voncircuit_drawer = mplhinzugefügt wird.Wenn kein
file_pathArgument angegeben wird, wird der aktuell verwendete Pfad zur Benutzerkonfigurationsdatei (entweder der Wert der UmgebungsvariablenQISKIT_SETTINGS, falls gesetzt, oder der Standardspeicherort~/.qiskit/settings.conf) aktualisiert. Änderungen an der bestehenden Konfigurationsdatei werden jedoch nicht in der aktuellen Sitzung berücksichtigt, da die Konfigurationsdatei zum Zeitpunkt des Imports geparst wird. -
Eine neue Zustandsklasse wurde hinzugefügt,
StabilizerStatezu demqiskit.quantum_infomodul hinzugefügt. Diese Klasse repräsentiert einen Zustand des Stabilisatorsimulators nach der Konvention von Aaronson und Gottesman (2004). -
Zwei neue Optionen,
'value'und'value_desc', wurden zu demsortkwarg der Funktionqiskit.visualization.plot_histogram()funktion hinzugefügt. Wennsortauf eine dieser Optionen eingestellt ist, sortiert die Ausgabevisualisierung die x-Achse basierend auf der maximalen Wahrscheinlichkeit für jede Bitfolge. Zum Beispiel:from qiskit.visualization import plot_histogram counts = { '000': 5, '001': 25, '010': 125, '011': 625, '100': 3125, '101': 15625, '110': 78125, '111': 390625, } plot_histogram(counts, sort='value')
Bekannte Probleme
- Bei der Ausführung von
parallel_map()(und Funktionen, die internparallel_map()wie z.Btranspile()undassemble()) auf Python 3.9 ausgeführt werden, wobeiQISKIT_PARALLELauf True gesetzt ist, ist es in einigen Szenarien möglich, dass das Programm in eine Sackgasse gerät und nie zu Ende läuft. Um dies zu vermeiden, wurde die Standardeinstellung für Python 3.9 so geändert, dass sie nicht parallel läuft, aber wennQISKIT_PARALLELausdrücklich aktiviert ist, kann dies immer noch auftreten.
Anmerkungen zu Upgrades
-
Die Mindestversion der retworkx-Abhängigkeit wurde auf die Version 0.9.0 erhöht. Dies geschah, um neue APIs zu nutzen, die in dieser Version eingeführt wurden und die Leistung einiger Transpilerübergänge verbesserten.
-
Der Standardwert für
QISKIT_PARALLELin Python 3.9 Umgebungen wurde aufFalsegeändert, was bedeutet, dass bei der Ausführung auf Python 3.9 standardmäßig kein Multiprocessing verwendet wird. Dies wurde getan, um ein potenzielles Deadlock-/Hanging-Problem zu vermeiden, das bei Multiprocessing auf Python 3.9 auftreten kann (siehe den Abschnitt "Bekannte Probleme" für weitere Details). Es ist immer noch möglich, sie manuell zu aktivieren, indem man die UmgebungsvariableQISKIT_PARALLELexplizit aufTRUEsetzt. -
Die bestehenden Fake-Backend-Klassen in
qiskit.test.mockimplementieren nun strikt dieBackendV1schnittstelle. Das bedeutet, dass Sie bei einer manuellen Erstellung vonQasmQobjoderPulseQobjobjekt zur Verwendung mit der Methoderun()manuell erstellt haben, wird dies nicht mehr funktionieren. Die Methoderun()akzeptiert nurQuantumCircuitoderScheduleobjekte an. Dies war notwendig, um das Testen von neuen Backends zu ermöglichen, die ohne qobj implementiert wurden und für die es bisher keine Testmöglichkeiten innerhalb von qiskit terra gab. Wenn Sie die gefälschten Backends mitQasmQobjoderPulseQobjwurden neue Fake-Backend-Objekte hinzugefügt, um die Schnittstelle der Legacy-Anbieter explizit zu testen. Diese wird entfernt, sobald die alte Schnittstelle veraltet ist und entfernt wird. In Zukunft werden neue gefälschte Backends nur noch dieBackendV1schnittstelle implementieren und keine neuen Legacy-Backend-Klassen für neue gefälschte Backends hinzufügen. -
Bei der Erstellung eines
Pauliobjekts mit einem ungültigen String-Label wird einQiskitErrorausgelöst. Dies ist eine Änderung gegenüber früheren Versionen, die bei einem ungültigen String-Label eineAttributeErrorauslösten. Diese Änderung wurde vorgenommen, um sicherzustellen, dass die Fehlermeldung informativer ist und sich von einer allgemeinenAttributeErrorunterscheidet. -
Die Darstellung des Ausgabeprogramms aus dem Pulse Builder (
qiskit.pulse.builder.build()) hat sich von einemSchedulezu aScheduleBlock. Durch diese neue Darstellung werden einige zeitabhängige Operationen wie Verschieben und Einfügen deaktiviert. Dies ermöglicht jedoch parametrisierte Anweisungsdauern innerhalb des Builder-Kontextes. Zum Beispiel:from qiskit import pulse from qiskit.circuit import Parameter dur = Parameter('duration') with pulse.build() as sched: with pulse.align_sequential(): pulse.delay(dur, pulse.DriveChannel(1)) pulse.play(pulse.Gaussian(dur, 0.1, dur/4), pulse.DriveChannel(0)) assigned0 = sched.assign_parameters({dur: 100}) assigned1 = sched.assign_parameters({dur: 200})Sie können die der Dauer zugewiesenen Zeitpläne direkt an den Assembler (oder das Backend) weitergeben oder sie als Impulsgatter an Ihre Quantenschaltung anhängen.
-
Die tweedledum-Bibliothek, die bisher eine optionale Abhängigkeit war, wurde zu einer Voraussetzung gemacht. Dies geschah aufgrund der breiten Verwendung des
PhaseOracle(die von der Installation von tweedledum abhängt) mit verschiedenen Algorithmen vonqiskit.algorithms. -
Das optionale Extra
full-featured-simulators, das früher verwendet werden konnte, umqiskit-aermit etwas wiepip install qiskit-terra[full-featured-simulators]zu installieren, wurde aus dem Paket qiskit-terra entfernt. Wenn dies verwendet wurde, umqiskit-aermitqiskit-terrazu installieren, sollten Sie sich auf das qiskit-Metapaket verlassen oder einfach qiskit-terra und qiskit-aer zusammen mitpip install qiskit-terra qiskit-aerinstallieren. -
Es wurde eine neue Anforderung symengine für Linux (auf x86_64, aarch64 und ppc64le ) und macOS Benutzer ( x86_64 und arm64 ) hinzugefügt. Es ist eine optionale Abhängigkeit von Windows (und verfügbar auf PyPi als vorkompiliertes Paket für 64bit Windows) und anderen Architekturen. Wenn es installiert ist, bietet es eine deutlich verbesserte Leistung bei der Bewertung von
ParameterundParameterExpressionobjekten. -
Alle Bibliothekskreisklassen, d. h. alle
QuantumCircuitabgeleiteten Klassen inqiskit.circuit.librarysind jetzt in einer Hülle ausInstruction(oderGate, wenn sie unitär sind). Zum Beispiel, das Importieren und Zeichnen derQFTschaltung:vorher aussah wie
┌───┐ q_0: ────────────────────■────────■───────┤ H ├─X─ ┌───┐ │ │P(π/2) └───┘ │ q_1: ──────■───────┤ H ├─┼────────■─────────────┼─ ┌───┐ │P(π/2) └───┘ │P(π/4) │ q_2: ┤ H ├─■─────────────■──────────────────────X─ └───┘und sieht nun aus wie
┌──────┐ q_0: ┤0 ├ │ │ q_1: ┤1 QFT ├ │ │ q_2: ┤2 ├ └──────┘Um den alten Stromkreis zu erhalten, können Sie die Methode
decompose()methode für die SchaltungDiese Änderung wurde hauptsächlich aus Gründen der Konsistenz vorgenommen, da vor dieser Version einige Schaltkreisklassen in
qiskit.circuit.libraryvorher in einInstructionoderGateaber nicht alle.
Hinweise zu veralteten Versionen
- Die Klasse
qiskit.exceptions.QiskitIndexErrorist veraltet und wird in einer zukünftigen Version entfernt werden. Diese Ausnahme wurde nicht aktiv von irgendetwas in Qiskit verwendet. Wenn Sie sie verwendet haben, können Sie eine eigene Ausnahmeklasse erstellen, um sie zu ersetzen. - Die kwargs
epsilonundfactrfür denqiskit.algorithms.optimizers.L_BFGS_Bkonstruktor undfactrkwarg derP_BFGSoptimizer-Klasse sind veraltet und werden in einer zukünftigen Version entfernt. Bitte verwenden Sie stattdessen dieepskarg anstelle vonepsilon. Diefactrkwarg wird durchftolersetzt. Die Beziehung zwischen den beiden istftol = factr * numpy.finfo(float).eps. Diese Änderung wurde vorgenommen, um der Verwendung der Methodescipy.optimize.minimizefunctions'L-BFGS-B'zu entsprechen. Weitere Informationen über die Verwendung dieser neuen Parameter finden Sie in der Dokumentation :scipy.optimize.minimize(method='L-BFGS-B'). - Die frühere Anbieterschnittstelle, die aus den abstrakten Klassen
qiskit.providers.BaseBackend,qiskit.providers.BaseJobundqiskit.providers.BaseProviderbestand, ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen sollten Sie die versionierte Schnittstelle verwenden. Die aktuellen Versionen der abstrakten Klassen sindqiskit.providers.BackendV1,qiskit.providers.JobV1, undqiskit.providers.ProviderV1. Die Objekte von V1 sind größtenteils abwärtskompatibel, um die Migration von der alten Schnittstelle zur neuen zu erleichtern. Es ist jedoch zu erwarten, dass die abstrakten Schnittstellen in künftigen Versionen stärker voneinander abweichen werden. Weitere Details zur versionierten Schnittstelle finden Sie in derqiskit.providersdokumentation nachlesen, um weitere Einzelheiten über die versionierte Schnittstelle zu erfahren. - Der
conditionkwarg an denDAGDepNodekonstruktor zusammen mit dem entsprechendenconditionAttribut desDAGDepNodesind veraltet und werden in einer zukünftigen Version entfernt. Stattdessen kann man auf dieconditioneinesDAGDepNodezugreifen, wenn der Knoten vom Typopist, indem manDAGDepNode.op.conditionverwendet. - Das Attribut
conditionder KlasseDAGNodeklasse ist veraltet und wird in einer zukünftigen Version entfernt werden. Stattdessen können Sie auf dieconditioneinesDAGNodeObjekts zugreifen, wenn der Knoten vom Typopist, indem SieDAGNode.op.conditionverwenden. - Die Syntax für die Impulserstellung (
qiskit.pulse.builder.build()) Syntaxqiskit.pulse.builder.inline()ist veraltet und wird in einer zukünftigen Version entfernt werden. Anstatt diesen Kontext zu verwenden, können Sie einfach Ausrichtungskontexte innerhalb des Inline-Kontextes entfernen. - Die Syntax für die Impulserstellung (
qiskit.pulse.builder.build()) Syntaxqiskit.pulse.builder.pad()ist veraltet und wird in einer zukünftigen Version entfernt werden. Dies wurde getan, weil dieScheduleBlockdie jetzt vom Pulse Builder zurückgegeben wird, die Methode.insertnicht unterstützt (und es gibt keine Insert-Syntax im Builder). Die Verwendung von Zeitschlitz-Platzhaltern zur Blockierung der Einfügung anderer Anweisungen ist nicht mehr erforderlich.
Fehlerkorrekturen
-
Die
OneQubitEulerDecomposerundTwoQubitBasisDecomposerklassen für die Synthese von Ein- und Zwei-Qubit-Gattern wurden verbessert, um die Toleranzen zu verringern, die Wiederholbarkeit und die Vereinfachung zu verbessern und mehrere Fehler bei der globalen Phasenverfolgung zu beheben. -
Es wurde ein Problem bei der Zuweisung des
nameattributs anGatedas durch mehrere Aufrufe der Methodeinverse`()erzeugt wurde. Vor dieser Korrektur wurde beim Aufruf voninverse`()bei jedem Aufruf von inverse bedingungslos_dgangehängt. Dies wurde korrigiert, so dass bei einem zweiten Aufruf voninverse`()das Suffix_dgjetzt entfernt wird. -
Legt die Bedingungen für die Trivialitätsprüfung von
CZGate,CRZGate,CU1GateundMCU1GateimHoareOptimizerdurchgang. Früher hat der Optimierer in einigen Fällen diese Gatter entfernt und damit die semantische Äquivalenz der Transformation aufgehoben. -
Es wurde ein Problem bei der Konvertierung eines
ListOpobjekts vonPauliSumOpobjekten mitPauliExpectationoderAerPauliExpectation. Zuvor wurde eine Warnung über die Umwandlung in eine Pauli-Darstellung ausgegeben, die potenziell teuer ist. Dies wurde behoben, indem statt der internen Umwandlung derListOpin eineSummedOpvonPauliOpobjekte konvertiert wird, wird nun einPauliSumOpwas effizienter ist. Behoben #6159 -
Es wurde ein Problem mit der
NLocalklasse imqiskit.circuit.librarymodul, bei dem bei der Objektinitialisierung eine Ausnahme ausgelöst wurde, wenn ein ungültiger Typ für denrepskwarg verwendet wurde, was später zu einem unerwarteten Laufzeitfehler führte. EinTypeErrorwird nun korrekt ausgelöst, wenn derrepskwarg keinintWert ist. Behoben #6515 -
Ein Problem wurde behoben, bei dem die
TwoLocalklasse imqiskit.circuit.librarymodul keine Numpy-Integer-Typen (z.B.numpy.int32,numpy.int64, usw.) als gültige Eingabe für denentanglementkwarg akzeptiert hat. Behoben #6455 -
Beim Laden einer OpenQASM2 Datei oder eines Strings mit den
from_qasm_file()oderfrom_qasm_str()Konstruktoren für dieQuantumCircuitklasse wird, wenn die Schaltung OpenQASM2 eine Anweisung mit dem Namendelayenthält, diese auf eineqiskit.circuit.Delayanweisung abgebildet. Zum Beispiel:from qiskit import QuantumCircuit qasm = """OPENQASM 2.0; include "qelib1.inc"; opaque delay(time) q; qreg q[1]; delay(172) q[0]; u3(0.1,0.2,0.3) q[0]; """ circuit = QuantumCircuit.from_qasm_str(qasm) circuit.draw()Behoben #6510
-
Es wurde ein Problem mit der Addition zwischen
PauliSumOpobjekten, dieParameterExpressionkoeffizienten. Zuvor hatte dies zur Folge, dass eineQiskitErrorAusnahme ausgelöst wurde, weil das Hinzufügen derParameterExpressionnicht korrekt behandelt wurde. Dies wurde behoben, so dass die Addition zwischenPauliSumOpobjekten mitParameterExpressionkoeffizienten. -
Es wurde ein Problem mit der Initialisierung der
AmplificationProblemklasse. Das Feldis_good_statekwarg war ein Pflichtfeld, wurde aber fälschlicherweise als fakultativ behandelt (und als solches dokumentiert). Dies wurde behoben und auch aktualisiert, so dass, wenn die Eingabeoracleist einPhaseOracleobjekt ist (das seine eigene Auswertungsmethode bereitstellt), ist das Feld erforderlich und löst eineTypeErroraus, wenn es ohneis_good_stateerstellt wird. -
Ein Problem wurde behoben, bei dem das Hinzufügen eines Steuerelements zu einem
ControlledGatemit geöffneten Steuerelementen die inneren geöffneten Steuerelemente außer Kraft setzen konnte. Behebt #5857 -
Es wurde ein Problem mit der
convert()methode derPauliExpectationklasse, bei der der Aufruf für einen nicht-hermitischen Operator ein falsches Ergebnis lieferte. Behoben #6307 -
Es wurde ein Problem mit der Funktion
qiskit.pulse.transforms.inline_subroutines()funktion behoben, die früher fälschlicherweise nicht alle verschachtelten Komponenten entfernte, wenn sie bei verschachtelten Zeitplänen aufgerufen wurde. Behoben #6321 -
Es wurde ein Problem behoben, das auftrat, wenn eine teilweise gebundene Callable, die mit der Funktion
functools.partial()der Python Standardbibliothek erstellt wurde, alsschedulekwarg an dieadd()methode derInstructionScheduleMapklasse übergeben wurde, was bisher zu einem Fehler führte. Behoben #6278 -
Es wurde ein Problem mit dem
PiecewiseChebyshevwenn das Setzen desbreakpointsaufNonebei einem bestehenden Objekt fälschlicherweise als Haltepunkt behandelt wurde. Dies wurde dahingehend korrigiert, dass bei der EinstellungNonewieder das Standardverhalten der Annäherung über das gesamte Intervall gewählt wird. Behoben #6198 -
Es wurde ein Problem mit der
num_connected_components()methode vonQuantumCircuitdie die falsche Anzahl von Komponenten zurückgab, wenn die Schaltung zwei oder mehr Gatter enthält, die auf klassische Register konditioniert sind. Behoben #6477 -
Es wurde ein Problem mit dem
qiskit.opflow.expectationsmodul, bei dem die Koeffizienten einer Zustandsfunktion nicht korrekt multipliziert wurden. Dadurch wurden auch die Berechnungen von Gradienten und QFIs bei Verwendung derPauliExpectationoderAerPauliExpectationklassen. Zum Beispiel, früher:from qiskit.opflow import StateFn, I, One exp = ~StateFn(I) @ (2 * One)bewertet nach
2fürAerPauliExpectationund auf4für andere Erwartungskonverter. Da~StateFn(I) @ (2 * One)eine Kurzschreibweise für~(2 * One) @ I @ (2 * One)ist, wird der nun korrekte Koeffizient von4für alle Erwartungskonverter zurückgegeben. Behoben #6497 -
Der Fehler, der dazu führte, dass
to_circuit()fehlschlug, wennPauliOpeine Phase hatte, wurde behoben. Gleichzeitig wurde die Nutzung vonPauliGateeffizienter gestaltet. -
Ein Problem wurde behoben, bei dem die QASM-Ausgabe, die von der
qasm()methode vonQuantumCircuitfür zusammengesetzte Gatter wieMCXGateund seine Varianten (MCXGrayCode,MCXRecursive, undMCXVChain) falsch sein. Wenn nun einGatein der Schaltung nicht inqelib1.incvorhanden ist, wird seine Definition der QASM-Ausgangszeichenfolge hinzugefügt. Behoben #4943 und #3945 -
Es wurde ein Problem mit der
circuit_drawer()funktion unddraw()methode vonQuantumCircuit. Bei Verwendung der Ausgabemodimploderlatex, wobeicregbundlekwarg aufFalseundreverse_bitskwarg aufTrueeingestellt ist, werden die Bits in den klassischen Registern in der gleichen Reihenfolge angezeigt, wie wennreverse_bitsaufFalseeingestellt ist. -
Es wurde ein Problem bei der Verwendung der Anweisung
qiskit.extensions.Initializebehoben, bei dem die globale Phase der synthetisierten Definition nicht korrekt gesetzt wurde, wenn sie konstruiert wurde. Behoben #5320 -
Ein Problem wurde behoben, bei dem die Bit-Reihenfolge in
qiskit.circuit.library.PhaseOracle.evaluate_bitstring()nicht mit der Reihenfolge des gemessenen Bitstrings übereinstimmte. Diese Korrektur wirkt sich auch auf die Ausführung derGroveralgorithmusklasse, wenn das Orakel alsPhaseOracleangegeben wird, das nun korrekt die richtige Bitfolge identifiziert. Behoben #6314 -
Behebt einen Fehler in
Optimize1qGatesDecomposition()der bisher dazu führte, dass bestimmte kurze Sequenzen von Gattern fälschlicherweise nicht umgeschrieben wurden. -
In der Methode
qiskit.opflow.gradients.Gradient.gradient_wrapper()wurde ein Problem mit der Berechnung des Gradienten behoben. Wenn der Operator nicht diagonal war, wurde in manchen Situationen ein falsches Ergebnis geliefert. Dies wurde durch die Verwendung eines Erwartungskonverters behoben, der sicherstellt, dass das Ergebnis immer korrekt ist. -
Es wurde ein Problem mit der
circuit_drawer()funktion unddraw()methode vonQuantumCircuitmit allen Ausgabemodi, bei denen eine benutzerdefinierte Anweisung, die klassische Bits enthält, unter bestimmten Umständen falsch dargestellt wurde. Behoben : #3201, #3202 und #6178 -
Ein Problem wurde behoben in
circuit_drawer()und derdraw()methode derQuantumCircuitklasse bei Verwendung des Ausgabemodusmplwurden Controlled-Z Gates fälschlicherweise asymmetrisch gezeichnet. Behoben #5981 -
Es wurde ein Problem mit dem
OptimizeSwapBeforeMeasureTranspilerdurchgang behoben, bei dem in manchen Situationen einSwapGatedie eine klassische Bedingung enthielt, entfernt wurde. Behoben #6192 -
Es wurde ein Problem mit der Phase der
qiskit.opflow.gradients.QFIklasse, wenn dieqfi_methodauflin_comb_fullgesetzt ist, was dazu führte, dass die falsche Beobachtungsgröße ausgewertet wurde. -
Es wurde ein Problem mit der
VQEalgorithmusklasse, wenn diese mit derL_BFGS_BoderP_BFGSoptimizer-Klassen ausgeführt wird und Gradienten verwendet werden, wurde der Gradient fälschlicherweise als Numpy-Array statt der erwarteten Liste von Floats übergeben, was zu einem Fehler führte. Dieses Problem wurde behoben, so dass Sie Farbverläufe verwenden können mitVQEund derL_BFGS_BoderP_BFGSoptimierern verwenden können.
Sonstige Anmerkungen
- Die Abschaffung der Methode
parameters()für die KlasseInstructionwurde rückgängig gemacht. Diese Methode wurde ursprünglich in der 0.17.0 veraltet, ist aber für verschiedene Anwendungen immer noch notwendig, unter anderem für Kalibrierungsexperimente. Diese Methode wird auch weiterhin unterstützt und nicht abgeschafft.
Aer- 0.8.2
Keine Änderung
Ignis- 0.6.0
Keine Änderung
Aqua- 0.9.4
Keine Änderung
IBM Q Anbieter 0.15.0
Neue Funktionen
-
Hinzufügen von Unterstützung für die neue Methode
qiskit.providers.ibmq.runtime.RuntimeJob.error_message(), die einen String zurückgibt, der den Grund für das Scheitern des Auftrags angibt. -
Der Input-Parameter für die Methode
qiskit.providers.ibmq.runtime.IBMRuntimeService.run()kann jetzt alsqiskit.providers.ibmq.runtime.ParameterNamespace-Instanz angegeben werden, die Auto-Vervollständigungsfunktionen unterstützt. Sie könnenqiskit.providers.ibmq.runtime.RuntimeProgram.parameters()verwenden, um eineParameterNamespaceInstanz abzurufen.Zum Beispiel:
from qiskit import IBMQ provider = IBMQ.load_account() # Set the "sample-program" program parameters. params = provider.runtime.program(program_id="sample-program").parameters() params.iterations = 2 # Configure backend options options = {'backend_name': 'ibmq_qasm_simulator'} # Execute the circuit using the "circuit-runner" program. job = provider.runtime.run(program_id="sample-program", options=options, inputs=params) -
Der Benutzer kann nun die Sichtbarkeit (privat/öffentlich) eines Qiskit Runtime Programms mit
qiskit.providers.ibmq.runtime.IBMRuntimeService.set_program_visibility()einstellen. -
Der optionale boolesche Parameter pending wurde zu
qiskit.providers.ibmq.runtime.IBMRuntimeService.jobs()hinzugefügt und ermöglicht die Filterung von Aufträgen nach ihrem Status. Wenn "pending" nicht angegeben wird, werden alle Aufträge zurückgegeben. Wenn pending auf True gesetzt ist, werden 'QUEUED' und 'RUNNING' Jobs zurückgegeben. Wenn "pending" auf "False" gesetzt ist, werden die Aufträge "DONE", "ERROR" und "CANCELLED" zurückgegeben. -
Hinzufügen der Unterstützung für das
use_measure_espFlag in derqiskit.providers.ibmq.IBMQBackend.run()Methode. WennTrue, wird das Backend die ESP-Auslesung für alle Messungen verwenden, die die Endanweisung für dieses Qubit sind. Wenn es verwendet wird und das Backend das Auslesen von ESP nicht unterstützt, wird ein Fehler ausgegeben.
Anmerkungen zu Upgrades
qiskit.providers.ibmq.runtime.RuntimeProgram.parameters()ist jetzt eine Methode, die eineqiskit.providers.ibmq.runtime.ParameterNamespace-Instanz zurückgibt, die Sie verwenden können, um die Parameterwerte des Laufzeitprogramms auszufüllen und anqiskit.providers.ibmq.runtime.IBMRuntimeService.run()zu übergeben.- Das
open_pulseFlag in der Backend-Konfiguration zeigt nicht mehr an, ob ein Backend die Puls-Level-Steuerung unterstützt. Infolgedessen kannqiskit.providers.ibmq.IBMQBackend.configuration()einePulseBackendConfigurationinstanz zurückgeben, auch wenn seinopen_pulseFlagFalselautet. - Die Ebene der Auftragsfreigabe wird aufgrund der geringen Akzeptanz nicht mehr unterstützt und die entsprechende Schnittstelle wird in einer zukünftigen Version entfernt werden. Das bedeutet, dass Sie nicht mehr share_level übergeben sollten, wenn Sie einen Auftrag erstellen oder die Methode
qiskit.providers.ibmq.job.IBMQJob.share_level()verwenden, um die Freigabeebene eines Auftrags zu ermitteln.
Hinweise zu veralteten Versionen
- Die Anweisung
idist auf IBM Hardware-Backends nicht mehr zulässig. Verwenden Sie stattdessen die Anweisungdelay, die Verzögerungen variabler Länge implementiert, die in Einheiten vondtangegeben werden. Wenn eine Schaltung ausgeführt wird, die eineidAnweisung enthält, wird bei der Übermittlung des Auftrags eine Warnung ausgegeben und alleidAnweisungen im Auftrag werden automatisch durch die entsprechendedelayAnweisung ersetzt.