Qiskit 0.14 Versionshinweise
0.14.0
Terra- 0.11.0
Vorspiel
Die Version 0.11.0 enthält mehrere neue Funktionen und Fehlerkorrekturen. Die größte Änderung in dieser Version ist die Hinzufügung des Impulsplaners. Auf diese Weise können Benutzer ihr Quantenprogramm als QuantumCircuit definieren und es dann auf die zugrundeliegenden Impulsbefehle abbilden, die die Quantenhardware zur Implementierung des Schaltkreises steuern werden.
Neue Funktionen
-
Es wurden 5 neue Befehle hinzugefügt, um auf einfache Weise benutzerspezifische Daten aus
BackendPropertiesabzurufen:gate_property,gate_error,gate_length,qubit_property,t1,t2,readout_errorundfrequency. Sie geben die spezifischen Werte der Backend-Eigenschaften zurück. Zum Beispiel:from qiskit.test.mock import FakeOurense backend = FakeOurense() properties = backend.properties() gate_property = properties.gate_property('u1') gate_error = properties.gate_error('u1', 0) gate_length = properties.gate_length('u1', 0) qubit_0_property = properties.qubit_property(0) t1_time_0 = properties.t1(0) t2_time_0 = properties.t2(0) readout_error_0 = properties.readout_error(0) frequency_0 = properties.frequency(0) -
Methode
Instruction.is_parameterized()hinzugefügt, um zu prüfen, ob ein Instruktionsobjekt parametrisiert ist. Diese Methode gibtTruenur dann zurück, wenn die Anweisung einParameterExpressionoderParameterObjekt als einen ihrer Parameter hat. -
Ein neuer Analysedurchgang wurde hinzugefügt
Layout2qDistance. Mit diesem Durchgang kann eine Layoutauswahl "bewertet" werden, sobaldproperty_set['layout']eingestellt ist. Die Punktzahl ergibt sich aus der Summe der Entfernungen für jedes Zwei-Qubit-Gatter in der Schaltung, wenn sie nicht direkt miteinander verbunden sind. Bei dieser Wertung wird die Richtung in der Kopplungskarte nicht berücksichtigt. Je niedriger die Zahl, desto besser ist die Layoutauswahl.Nehmen wir zum Beispiel eine lineare Kopplungskarte
[0]--[2]--[1]und die folgende Schaltung:qr = QuantumRegister(2, 'qr') circuit = QuantumCircuit(qr) circuit.cx(qr[0], qr[1])Wenn das Layout
{qr[0]:0, qr[1]:1}ist, setztLayout2qDistanceproperty_set['layout_score'] = 1. Wenn das Layout{qr[0]:0, qr[1]:2}ist, dann ist das Ergebnisproperty_set['layout_score'] = 0. Je niedriger die Punktzahl, desto besser. -
qiskit.QuantumCircuit.cnotals Alias für die MethodecxvonQuantumCircuithinzugefügt. Die Namencnotundcxwerden oft austauschbar verwendet, da die cx-Methode mit beiden Namen aufgerufen werden kann. -
qiskit.QuantumCircuit.toffolials Alias für die MethodeccxvonQuantumCircuithinzugefügt. Die Namentoffoliundccxwerden häufig synonym verwendet, so dass die ccx-Methode mit beiden Namen aufgerufen werden kann. -
qiskit.QuantumCircuit.fredkinals Alias für die MethodecswapvonQuantumCircuithinzugefügt. Die Namenfredkinundcswapwerden oft austauschbar verwendet, so dass die cswap-Methode mit beiden Namen aufgerufen werden kann. -
Der Ausgabemodus
latexfürqiskit.visualization.circuit_drawer()und die Methodeqiskit.circuit.QuantumCircuit.draw()verfügt nun über einen Modus zum Durchreichen von Rohlatex aus Gatterbeschriftungen und Parametern. Die Syntax hierfür spiegelt die Syntax des mathtext-Modus von matplotlib wider. Jeder Teil einer Beschriftungszeichenfolge zwischen einem Paar von '$'-Zeichen wird als Rohlatex behandelt und direkt in den generierten Ausgabelatex übernommen. Dies kann genutzt werden, um Schaltpläne, die mit der Latex-Schublade erstellt wurden, mit erweiterten Formatierungen zu versehen.Vor dieser Version wurden alle Gate-Etiketten einer utf8 -> Latex-Konvertierung unterzogen, um sicherzustellen, dass die Latex-Ausgabe die Zeichenfolge wie erwartet kompiliert. Dies gilt nach wie vor für alle Teile eines Etiketts außerhalb des Paares "$". Wenn Sie ein Dollarzeichen in Ihrer Beschriftung verwenden möchten, stellen Sie sicher, dass Sie es in der Beschriftungszeichenfolge auslassen (z. B.
'\$').Sie können dieses Passthrough mit der Konvertierung utf8 -> Latex mischen und anpassen, um z. B. genau das gewünschte Etikett zu erstellen:
from qiskit import circuit circ = circuit.QuantumCircuit(2) circ.h([0, 1]) circ.append(circuit.Gate(name='α_gate', num_qubits=1, params=[0]), [0]) circ.append(circuit.Gate(name='α_gate$_2$', num_qubits=1, params=[0]), [1]) circ.append(circuit.Gate(name='\$α\$_gate', num_qubits=1, params=[0]), [1]) circ.draw(output='latex')wird nun die Beschriftung des ersten benutzerdefinierten Gatters als
α_gate, die des zweiten alsα_gatemit einer tiefgestellten 2 und die des letzten benutzerdefinierten Gatters als$α$_gatedargestellt. -
Hinzufügen der Klasse
ControlledGatezur Darstellung von kontrollierten Gates. Kontrollierte Gatterinstanzen werden mit der Methodecontrol(n)vonGateObjekten erstellt, wobeindie Anzahl der Kontrollen darstellt. Die Kontroll-Qubits kommen im neuen Tor vor den kontrollierten Qubits. Zum Beispiel:from qiskit import QuantumCircuit from qiskit.extensions import HGate hgate = HGate() circ = QuantumCircuit(4) circ.append(hgate.control(3), [0, 1, 2, 3]) print(circ)erzeugt:
q_0: |0>──■── │ q_1: |0>──■── │ q_2: |0>──■── ┌─┴─┐ q_3: |0>┤ H ├ └───┘ -
Erlaubte Werte von
meas_levelParametern und Feldern können nun ein Member der Klasse IntEnumqiskit.qobj.utils.MeasLevelsein. Dies kann beim Aufruf vonexecute(oder an anderen Stellen, an denenmeas_levelangegeben ist) mit einem Impulsexperiment verwendet werden. Zum Beispiel:from qiskit import QuantumCircuit, transpile, schedule, execute from qiskit.test.mock import FakeOpenPulse2Q from qiskit.qobj.utils import MeasLevel, MeasReturnType backend = FakeOpenPulse2Q() qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0,1) qc_transpiled = transpile(qc, backend) sched = schedule(qc_transpiled, backend) execute(sched, backend, meas_level=MeasLevel.CLASSIFIED)Im obigen Beispiel können
meas_level=MeasLevel.CLASSIFIEDundmeas_level=2nun austauschbar verwendet werden. -
Ein neuer Layout-Selektor auf der Basis von Constraint-Solving ist enthalten. CSPLayout modelliert das Problem, ein Layout zu finden, als ein Constraint-Problem und verwendet rekursives Backtracking, um es zu lösen.
cmap16 = CouplingMap(FakeRueschlikon().configuration().coupling_map) qr = QuantumRegister(5, 'q') circuit = QuantumCircuit(qr) circuit.cx(qr[0], qr[1]) circuit.cx(qr[0], qr[2]) circuit.cx(qr[0], qr[3]) pm = PassManager(CSPLayout(cmap16)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])Layout({ 1: Qubit(QuantumRegister(5, 'q'), 1), 2: Qubit(QuantumRegister(5, 'q'), 0), 3: Qubit(QuantumRegister(5, 'q'), 3), 4: Qubit(QuantumRegister(5, 'q'), 4), 15: Qubit(QuantumRegister(5, 'q'), 2) })Der Parameter
CSPLayout(...,strict_direction=True)ist restriktiver, aber er garantiert, dassCXDirectiondanach nicht mehr ausgeführt werden muss.pm = PassManager(CSPLayout(cmap16, strict_direction=True)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])Layout({ 8: Qubit(QuantumRegister(5, 'q'), 4), 11: Qubit(QuantumRegister(5, 'q'), 3), 5: Qubit(QuantumRegister(5, 'q'), 1), 6: Qubit(QuantumRegister(5, 'q'), 0), 7: Qubit(QuantumRegister(5, 'q'), 2) })Wenn das Constraint-System nicht lösbar ist, wird die Layout-Eigenschaft nicht gesetzt.
circuit.cx(qr[0], qr[4]) pm = PassManager(CSPLayout(cmap16)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])None -
PulseBackendConfiguration (normalerweise als backend.configuration () aufgerufen) wurde mit nützlichen Methoden erweitert, um die Daten und die Funktionalität von PulseChannelSpec zu erkunden. PulseChannelSpec wird in Zukunft veraltet sein. Zum Beispiel:
backend = provider.get_backend(backend_name) config = backend.configuration() q0_drive = config.drive(0) # or, DriveChannel(0) q0_meas = config.measure(0) # MeasureChannel(0) q0_acquire = config.acquire(0) # AcquireChannel(0) config.hamiltonian # Returns a dictionary with hamiltonian info config.sample_rate() # New method which returns 1 / dt -
PulseDefaults(normaler Zugriff alsbackend.defaults()) hat ein Attribut,circuit_instruction_map, das die Methoden von CmdDef hat. Das neue circuit_instruction_map ist einInstructionScheduleMapObjekt mit drei neuen Funktionen, die über die Funktionen von CmdDef hinausgehen:- qubit_instructions(qubits) liefert die für die Qubits definierten Operationen
- assert_has(instruction, qubits) löst einen Fehler aus, wenn der Befehl nicht definiert ist
- remove(instruction, qubits) wie pop, benötigt aber keine Parameter
Es gibt einige Unterschiede zum CmdDef:
__init__nimmt keine Argumente ancmdsundcmd_qubitssind veraltet und werden ersetzt durchinstructionsundqubits_with_instruction
Beispiel:
backend = provider.get_backend(backend_name) inst_map = backend.defaults().circuit_instruction_map qubit = inst_map.qubits_with_instruction('u3')[0] x_gate = inst_map.get('u3', qubit, P0=np.pi, P1=0, P2=np.pi) pulse_schedule = x_gate(DriveChannel(qubit)) -
Die Funktion
qiskit.visualization.pulse_drawer()und die Methodeqiskit.pulse.Schedule.draw()wurden um einen neuen kwarg-Parametershow_framechange_channelserweitert, mit dem die Anzeige von Kanälen, die nur Framechange-Befehle enthalten, in Impulsvisualisierungen optional deaktiviert werden kann. Wenn dieser neue kwarg aufFalseeingestellt ist, werden in der Visualisierung des Ausgangsimpulsplans keine Kanäle berücksichtigt, die nur Bildwechsel enthalten.Zum Beispiel:
from qiskit.pulse import * from qiskit.pulse import library as pulse_lib gp0 = pulse_lib.gaussian(duration=20, amp=1.0, sigma=1.0) sched = Schedule() channel_a = DriveChannel(0) channel_b = DriveChannel(1) sched += Play(gp0, channel_a) sched = sched.insert(60, ShiftPhase(-1.57, channel_a)) sched = sched.insert(30, ShiftPhase(-1.50, channel_b)) sched = sched.insert(70, ShiftPhase(1.50, channel_b)) sched.draw(show_framechange_channels=False) -
Es wird eine neue Nutzenfunktion
qiskit.result.marginal_counts()hinzugefügt, die eine Marginalisierung der Zählungen über einige Indizes von Interesse ermöglicht. Dies ist nützlich, wenn mehr Qubits gemessen werden, als benötigt werden, und man die Beobachtungszahlen nur für eine Teilmenge von ihnen erhalten möchte. -
Wenn
passmanager.run(...)mit mehr als einem Schaltkreis aufgerufen wird, läuft die Umsetzung dieser Schaltkreise parallel. -
PassManagers kann nun zerlegt werden, um eine neue PassManager zu erstellen, die eine Teilmenge von Durchläufen mit dem Operator der eckigen Klammer enthält. Dies ermöglicht das Ausführen oder Zeichnen eines Teils der PassManager zur einfacheren Prüfung und Visualisierung. Versuchen wir zum Beispiel, die ersten 3 Durchgänge einer PassManager pm zu zeichnen, oder nur den zweiten Durchgang auf unserer Schaltung zu fahren:
pm[0:4].draw() circuit2 = pm[1].run(circuit)Auch jetzt kann PassManagers durch Hinzufügen von zwei PassManagers oder durch direktes Hinzufügen eines Passes/einer Liste von Pässen zu einem PassManager erstellt werden.
pm = pm1[0] + pm2[1:3] pm += [setLayout, unroller] -
Ein grundlegendes
schedulerModul wurde nun zu Qiskit hinzugefügt. Der Scheduler plant eine transpilierte EingabeQuantumCircuitin einen ImpulsScheduleein. Der Scheduler akzeptiert als Eingabe einScheduleund entweder einen ImpulsBackendoder einCmdDef, das die Objekte der SchaltungInstructionauf bestimmten Qubits mit den Impuls-Schedules in Beziehung setzt, und einmeas_map, das festlegt, welche Messungen zusammen erfolgen müssen.Beispiel für Terminplanung:
from qiskit import QuantumCircuit, transpile, schedule from qiskit.test.mock import FakeOpenPulse2Q backend = FakeOpenPulse2Q() qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0,1) qc_transpiled = transpile(qc, backend) schedule(qc_transpiled, backend)Der Scheduler unterstützt derzeit zwei Scheduling-Policies, as_late_as_possible (
alap) und as_soon_as_possible (asap), die jeweils Impulsbefehle so spät wie möglich bzw. so früh wie möglich über die Qubits in einem Schaltkreis verteilen. Die Zeitplanungspolitik kann z. B. mit dem Eingangsargumentmethodausgewählt werden:schedule(qc_transpiled, backend, method='alap')Es ist einfach, einen Impuls
Scheduleinnerhalb einesQuantumCircuitzu verwenden, indem man ihn auf eine benutzerdefinierte Schaltungsanweisung wie z.B. ein Gatter abbildet, das in einemQuantumCircuitverwendet werden kann. Definieren Sie dazu zunächst das benutzerdefinierte Gatter und fügen Sie dann für jedes Qubit, auf das das Gatter angewendet werden soll, einen Eintrag inCmdDeffür das Gatter hinzu. Das Tor kann dann auf der WebsiteQuantumCircuitverwendet werden. Zum Zeitpunkt der Planung wird das Tor auf den zugrunde liegenden Impulsplan abgebildet. Die Verwendung dieser Technik ermöglicht eine einfache Integration mit bereits vorhandenen qiskit-Modulen wie Ignis.Zum Beispiel:
from qiskit import pulse, circuit, schedule from qiskit.pulse import pulse_lib custom_cmd_def = pulse.CmdDef() # create custom gate custom_gate = circuit.Gate(name='custom_gate', num_qubits=1, params=[]) # define schedule for custom gate custom_schedule = pulse.Schedule() custom_schedule += pulse_lib.gaussian(20, 1.0, 10)(pulse.DriveChannel) # add schedule to custom gate with same name custom_cmd_def.add('custom_gate', (0,), custom_schedule) # use custom gate in a circuit custom_qc = circuit.QuantumCircuit(1) custom_qc.append(custom_gate, qargs=[0]) # schedule the custom gate schedule(custom_qc, cmd_def=custom_cmd_def, meas_map=[[0]])
Bekannte Probleme
- Die Funktion zum parallelen Transpilieren, wenn
passmanager.run(...)mit mehr als einem Schaltkreis aufgerufen wird, wird unter Windows nicht unterstützt. Siehe #2988 für weitere Einzelheiten.
Anmerkungen zu Upgrades
- Die Klasse
qiskit.pulse.channels.SystemTopologywurde als Hilfsklasse fürPulseChannelSpecverwendet. Sie wurde mit der Abschaffung vonPulseChannelSpecentfernt und die Änderungen anBackendConfigurationmachen sie überflüssig. - Die zuvor veraltete Darstellung von Qubits und klassischen Bits als Tupel, die in der Version 0.9 veraltet war, wurde entfernt. Die Verwendung der Objekte
QubitundClbitist die neue Art, Qubits und klassische Bits darzustellen. - Die bisher veraltete Darstellung der Basismenge als einzelne Zeichenkette wurde entfernt. Eine Liste von Zeichenketten ist die neue bevorzugte Methode.
- Die Methode
BaseModel.as_dict, die in der Version 0.9 veraltet war, wurde zu Gunsten der MethodeBaseModel.to_dictentfernt. - In PulseDefaults (normaler Zugriff als backend.defaults ()) werden
qubit_freq_estundmeas_freq_estjetzt in Hz statt in GHz zurückgegeben. Das bedeutet, dass die neuen Rückgabewerte 1e9 * ihr vorheriger Wert sind. - dill wurde als Anforderung hinzugefügt. Dies ist erforderlich, damit
passmanager.run()für mehr als einen Stromkreis parallel betrieben werden kann. - Das zuvor veraltete Tor
UBase, das in der Version 0.9 veraltet war, wurde entfernt. Stattdessen sollte das TorU3Gateverwendet werden. - Das zuvor veraltete Tor
CXBase, das in der Version 0.9 veraltet war, wurde entfernt. Stattdessen sollte das TorCnotGateverwendet werden. - Die Anweisung
snapshotwird verwendet, um den Parameterlabelimplizit in einen String zu konvertieren. Diese Umwandlung wurde entfernt, und es wird ein Fehler ausgegeben, wenn keine Zeichenkette angegeben wird. - Das zuvor veraltete Tor
U0Gate, das in der Version 0.9 veraltet war, wurde entfernt. Das GateIdGatesollte stattdessen zum Einfügen von Verzögerungen verwendet werden.
Hinweise zu veralteten Versionen
-
Die Klasse
qiskit.pulse.CmdDefist veraltet. Verwenden Sie stattdessen die Seiteqiskit.pulse.InstructionScheduleMap. Das ObjektInstructionScheduleMapfür ein impulsfähiges System kann unterbackend.defaults().instruction_schedulesaufgerufen werden. -
PulseChannelSpecwird veraltet sein. Verwenden Sie stattdessenBackendConfiguration. Der Zugriff auf die Backend-Konfiguration erfolgt ganz normal überbackend.configuration(). Die Konfiguration wurde um die meisten Funktionen von PulseChannelSpec, erweitert, mit einigen Modifikationen wie folgt, wobei 0 ein beispielhafter Qubit-Index ist:pulse_spec.drives[0] -> config.drive(0) pulse_spec.measures[0] -> config.measure(0) pulse_spec.acquires[0] -> config.acquire(0) pulse_spec.controls[0] -> config.control(0)Wenn nun versucht wird, einen Kanal für ein Qubit zu erhalten, der für das Gerät nicht existiert, wird eine
BackendConfigurationErrormit einer hilfreichen Erklärung angezeigt.Die Methoden
memoryslotsundregisterslotsder PulseChannelSpec sind nicht in die Backend-Konfiguration migriert worden. Diese klassischen Ressourcen sind nicht durch die physische Konfiguration eines Backend-Systems eingeschränkt. Bitte instanziieren Sie sie direkt:pulse_spec.memoryslots[0] -> MemorySlot(0) pulse_spec.registerslots[0] -> RegisterSlot(0)Die Methode
qubitswird nicht in die Backend-Konfiguration migriert. Das Ergebnis vonqubitskann als solches aufgebaut werden:[q for q in range(backend.configuration().n_qubits)] -
Qubitinnerhalb vonpulse.channelsist veraltet. Sie sollten nicht verwendet werden. Es ist möglich, Kanal <=> Qubit-Zuordnungen über BackendConfiguration (oder backend.configuration ()) zu erhalten. -
Die Funktion
qiskit.visualization.circuit_drawer.qx_color_scheme()ist veraltet. Diese Funktion wird intern nicht mehr verwendet und entspricht nicht dem aktuellen IBM QX-Stil. Wenn Sie diese Funktion verwenden, um lokal ein Stildiktat zu erzeugen, müssen Sie die Ausgabe speichern und dieses Wörterbuch direkt verwenden. -
Die Exception
TranspilerAccessErrorist veraltet. Eine alternative FunktionTranspilerErrorkann stattdessen verwendet werden, um die gleiche Funktionalität zu bieten. Diese alternative Funktion bietet genau die gleiche Funktionalität, aber mit größerer Allgemeinheit. -
Puffer in Pulse sind veraltet. Wird ein Puffer ungleich Null angegeben, wird eine Warnung ausgegeben, die daran erinnert, stattdessen eine Verzögerung zu verwenden. Andere Möglichkeiten wären das Hinzufügen von Samples zu einem Impulsbefehl, die ( 0.+0.j ) sind, oder das Setzen der Startzeit des nächsten Impulses auf
schedule.duration + buffer. -
Die Übergabe der Typen
sympy.Basic,sympy.Exprundsympy.Matrixals Anweisungsparameter ist veraltet und wird in einer zukünftigen Version entfernt werden. Sie müssen die Eingabe in einen der unterstützten Typen konvertieren, die da wären:intfloatcomplexstrnp.ndarray
Fehlerkorrekturen
- Die Durchläufe Collect2qBlocks und CommutationAnalysis im Transpiler waren nicht in der Lage, Schaltungen zu verarbeiten, die parametrisierte Gatter enthalten, wodurch parametrisierte Schaltungen nicht auf Optimierungsebene 2 oder höher transpiliert werden konnten. Diese Durchgänge wurden korrigiert, um parametrisierte Gatter als undurchsichtig zu behandeln.
- Die Funktion align_measures hatte ein Problem, bei dem die Stimulusimpulse von Measure nicht richtig mit den Acquire-Impulsen abgeglichen wurden, was zu einem Fehler führte. Dies wurde behoben.
- Die Verwendung von
numpy.random.seedwurde entfernt, so dass Aufrufe von qiskit-Funktionen nicht die Ergebnisse zukünftiger Aufrufe vonnumpy.random - Eine Wettlaufbedingung wurde behoben, die im Jobmonitor auftrat, wenn
job.queue_position()Nonezurückgab.Noneist eine gültige Rückgabe vonjob.queue_position(). - Backend-Unterstützung für
memory=Truewird nun geprüft, wenn der kwarg übergeben wird.QiskitErrorergebnisse, wenn sie nicht unterstützt werden. - Beim Transpilieren ohne Kopplungskarte wurde die Anzahl der Qubits der zu transpilierenden Schaltung nicht überprüft. Nun prüft der Transpile-Prozess, ob das Backend über genügend Qubits verfügt, um die Schaltung zuzuweisen.
Sonstige Anmerkungen
- Die Funktion
qiskit.result.marginal_counts()ersetzt eine ähnliche Funktion in qiskit-ignisqiskit.ignis.verification.tomography.marginal_counts(), die in einer zukünftigen Version von qiskit-ignis veraltet sein wird. - Alle Sympy-Parameter, die den Ausgabetyp unterstützen, wurden aus qiskit-terra entfernt (oder wie angegeben veraltet). Dies gilt auch für Parameter des Typs sympy in
QuantumCircuitObjekten, qasm ast-Knoten oderQobjObjekten.
Aer- 0.3
Keine Änderung
Ignis- 0.2
Keine Änderung
Aqua- 0.6
Keine Änderung
IBM Q Anbieter 0.4
Vorspiel
Die Version 0.4.0 ist die erste Version, die alle Funktionen der neuen IBM Q API nutzt. Insbesondere wurde die Klasse IBMQJob überarbeitet, um mehr Informationen von IBM Q abrufen zu können, und es wurde eine Klasse Job Manager hinzugefügt, die eine übergeordnete und nahtlosere Nutzung von großen oder komplexen Aufträgen ermöglicht. Wenn Sie noch nicht von der alten Version IBM Q Experience oder QConsole aufgerüstet haben, lesen Sie bitte die Versionshinweise für IBM Q Provider 0.3 (Qiskit 0.11 ), um weitere Informationen über den Übergang zu erhalten. Die alten Konten werden ab dieser Version nicht mehr unterstützt.
Neue Funktionen
Arbeitsanpassungen
Die Klasse IBMQJob wurde überarbeitet und bildet nun den Inhalt eines Remote-Auftrags mit neuen Funktionen besser ab:
- Sie können jetzt einem Auftrag einen Namen zuweisen, indem Sie bei der Übermittlung eines Auftrags
IBMQBackend.run(..., job_name='...')angeben. Dieser Name ist überIBMQJob.name()abrufbar und kann zur Filterung verwendet werden. - Aufträge können jetzt auf verschiedenen Ebenen (global, pro Hub, Gruppe oder Projekt) über einen optionalen
job_share_levelParameter beim Übermitteln des Auftrags mit anderen Benutzern geteilt werden. IBMQJobinstanzen haben jetzt mehr Attribute, die den Inhalt der IBM Q-Aufträge widerspiegeln. Dies bedeutet, dass neue Attribute, die durch die IBM Q API eingeführt werden, automatisch und sofort zur Verwendung zur Verfügung stehen (z. B.job.new_api_attribute). Die neuen Attribute werden zu Methoden erhoben, wenn sie als stabil angesehen werden (z. B.job.name())..error_message()liefert weitere Informationen darüber, warum ein Auftrag fehlgeschlagen ist..queue_position()akzeptiert einenrefreshParameter, um eine Aktualisierung zu erzwingen..result()akzeptiert einen optionalen Parameterpartial, um ggf. Teilergebnisse von fehlgeschlagenen Aufträgen zurückzugeben. Beachten Sie, dass die Methoden vonResult, z. B.get_counts(), eine Ausnahme auslösen, wenn sie auf fehlgeschlagene Experimente angewendet werden.
Bitte beachten Sie, dass die Änderungen einige geringfügige Modifikationen der Klasse beinhalten. Wenn Sie die Instanzen manuell erstellt haben, beachten Sie dies:
- die Signatur des Konstruktors wurde geändert, um den neuen Funktionen Rechnung zu tragen.
- kann die Methode
.submit()nicht mehr direkt aufgerufen werden, und es wird erwartet, dass Aufträge entweder über die synchroneIBMQBackend.run()oder über den Job Manager übermittelt werden.
Job-Manager
Ein neuer Job Manager (IBMQJobManager) wurde als übergeordneter Mechanismus für die Bearbeitung von Aufträgen eingeführt, die aus mehreren Schaltkreisen oder Impulszeitplänen bestehen. Der Job Manager soll eine transparente Schnittstelle bieten, die den Input auf intelligente Weise in effiziente Arbeitseinheiten aufteilt und die Vorteile der verschiedenen Komponenten voll ausschöpft. Sie wird in den kommenden Versionen erweitert und zum empfohlenen Einstiegspunkt für die Einreichung von Aufträgen werden.
Die Methode .run() empfängt eine Liste von Schaltkreisen oder Impulszeitplänen und gibt eine ManagedJobSet instance zurück, die dann verwendet werden kann, um den Status und die Ergebnisse dieser Aufträge zu verfolgen. Zum Beispiel:
from qiskit.providers.ibmq.managed import IBMQJobManager
from qiskit.circuit.random import random_circuit
from qiskit import IBMQ
from qiskit.compiler import transpile
provider = IBMQ.load_account()
backend = provider.backends.ibmq_ourense
circs = []
for _ in range(1000000):
circs.append(random_circuit(2, 2))
transpile(circs, backend=backend)
# Farm out the jobs.
jm = IBMQJobManager()
job_set = jm.run(circs, backend=backend, name='foo')
job_set.statuses() # Gives a list of job statuses
job_set.report() # Prints detailed job information
results = job_set.results()
counts = results.get_counts(5) # Returns data for experiment 5provider.backends Änderungen
Das Mitglied provider.backends , das zuvor eine Funktion war, die eine Liste von Backends zurückgab, wurde zu einem Dienst erhoben. Dies bedeutet, dass es sowohl auf die bisherige Weise, als .backends() Methode, als auch als .backends Attribut mit erweiterten Möglichkeiten verwendet werden kann:
-
enthält sie die vorhandenen Backends dieses Anbieters als Attribute, die für die automatische Vervollständigung verwendet werden können. Zum Beispiel:
my_backend = provider.get_backend('ibmq_qasm_simulator')Diese Angabe ist gleichbedeutend mit:
my_backend = provider.backends.ibmq_qasm_simulator -
die Methoden
provider.backends.jobs()undprovider.backends.retrieve_job()können zum Abrufen von anbieterweiten Aufträgen verwendet werden.
Sonstige Änderungen
- Die Funktion
backend.properties()akzeptiert jetzt einen optionalen Parameterdatetime. Falls angegeben, gibt die Funktion die Backend-Eigenschaften zurück, die dem angegebenen Datumsfilter am nächsten kommen, aber älter sind als dieser. - Einige
warningswurden zulogger.warningabgeschwächt.