Skip to main content
IBM Quantum Platform

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 BackendProperties abzurufen: gate_property, gate_error, gate_length, qubit_property, t1, t2, readout_error und frequency. 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 gibt True nur dann zurück, wenn die Anweisung ein ParameterExpression oder Parameter Objekt als einen ihrer Parameter hat.

  • Ein neuer Analysedurchgang wurde hinzugefügt Layout2qDistance. Mit diesem Durchgang kann eine Layoutauswahl "bewertet" werden, sobald property_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, setzt Layout2qDistance property_set['layout_score'] = 1. Wenn das Layout {qr[0]:0, qr[1]:2} ist, dann ist das Ergebnis property_set['layout_score'] = 0. Je niedriger die Punktzahl, desto besser.

  • qiskit.QuantumCircuit.cnot als Alias für die Methode cx von QuantumCircuit hinzugefügt. Die Namen cnot und cx werden oft austauschbar verwendet, da die cx-Methode mit beiden Namen aufgerufen werden kann.

  • qiskit.QuantumCircuit.toffoli als Alias für die Methode ccx von QuantumCircuit hinzugefügt. Die Namen toffoli und ccx werden häufig synonym verwendet, so dass die ccx-Methode mit beiden Namen aufgerufen werden kann.

  • qiskit.QuantumCircuit.fredkin als Alias für die Methode cswap von QuantumCircuit hinzugefügt. Die Namen fredkin und cswap werden oft austauschbar verwendet, so dass die cswap-Methode mit beiden Namen aufgerufen werden kann.

  • Der Ausgabemodus latex für qiskit.visualization.circuit_drawer() und die Methode qiskit.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 α_gate mit einer tiefgestellten 2 und die des letzten benutzerdefinierten Gatters als $α$_gate dargestellt.

  • Hinzufügen der Klasse ControlledGate zur Darstellung von kontrollierten Gates. Kontrollierte Gatterinstanzen werden mit der Methode control(n) von Gate Objekten erstellt, wobei n die 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_level Parametern und Feldern können nun ein Member der Klasse IntEnum qiskit.qobj.utils.MeasLevel sein. Dies kann beim Aufruf von execute (oder an anderen Stellen, an denen meas_level angegeben 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.CLASSIFIED und meas_level=2 nun 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, dass CXDirection danach 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 als backend.defaults()) hat ein Attribut, circuit_instruction_map , das die Methoden von CmdDef hat. Das neue circuit_instruction_map ist ein InstructionScheduleMap Objekt 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 an
    • cmds und cmd_qubits sind veraltet und werden ersetzt durch instructions und qubits_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 Methode qiskit.pulse.Schedule.draw() wurden um einen neuen kwarg-Parameter show_framechange_channels erweitert, mit dem die Anzeige von Kanälen, die nur Framechange-Befehle enthalten, in Impulsvisualisierungen optional deaktiviert werden kann. Wenn dieser neue kwarg auf False eingestellt 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 scheduler Modul wurde nun zu Qiskit hinzugefügt. Der Scheduler plant eine transpilierte Eingabe QuantumCircuit in einen Impuls Schedule ein. Der Scheduler akzeptiert als Eingabe ein Schedule und entweder einen Impuls Backend oder ein CmdDef , das die Objekte der Schaltung Instruction auf bestimmten Qubits mit den Impuls-Schedules in Beziehung setzt, und ein meas_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 Eingangsargument method ausgewählt werden:

    schedule(qc_transpiled, backend, method='alap')

    Es ist einfach, einen Impuls Schedule innerhalb eines QuantumCircuit zu verwenden, indem man ihn auf eine benutzerdefinierte Schaltungsanweisung wie z.B. ein Gatter abbildet, das in einem QuantumCircuit verwendet 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 in CmdDef für das Gatter hinzu. Das Tor kann dann auf der Website QuantumCircuit verwendet 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.SystemTopology wurde als Hilfsklasse für PulseChannelSpec verwendet. Sie wurde mit der Abschaffung von PulseChannelSpec entfernt und die Änderungen an BackendConfiguration machen 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 Qubit und Clbit ist 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 Methode BaseModel.to_dict entfernt.
  • In PulseDefaults (normaler Zugriff als backend.defaults ()) werden qubit_freq_est und meas_freq_est jetzt 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 Tor U3Gate verwendet werden.
  • Das zuvor veraltete Tor CXBase, das in der Version 0.9 veraltet war, wurde entfernt. Stattdessen sollte das Tor CnotGate verwendet werden.
  • Die Anweisung snapshot wird verwendet, um den Parameter label implizit 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 Gate IdGate sollte stattdessen zum Einfügen von Verzögerungen verwendet werden.

Hinweise zu veralteten Versionen

  • Die Klasse qiskit.pulse.CmdDef ist veraltet. Verwenden Sie stattdessen die Seite qiskit.pulse.InstructionScheduleMap. Das Objekt InstructionScheduleMap für ein impulsfähiges System kann unter backend.defaults().instruction_schedules aufgerufen werden.

  • PulseChannelSpec wird veraltet sein. Verwenden Sie stattdessen BackendConfiguration . Der Zugriff auf die Backend-Konfiguration erfolgt ganz normal über backend.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 BackendConfigurationError mit einer hilfreichen Erklärung angezeigt.

    Die Methoden memoryslots und registerslots der 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 qubits wird nicht in die Backend-Konfiguration migriert. Das Ergebnis von qubits kann als solches aufgebaut werden:

    [q for q in range(backend.configuration().n_qubits)]
  • Qubit innerhalb von pulse.channels ist 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 TranspilerAccessError ist veraltet. Eine alternative Funktion TranspilerError kann 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.Expr und sympy.Matrix als 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:

    • int
    • float
    • complex
    • str
    • np.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.seed wurde entfernt, so dass Aufrufe von qiskit-Funktionen nicht die Ergebnisse zukünftiger Aufrufe von numpy.random
  • Eine Wettlaufbedingung wurde behoben, die im Jobmonitor auftrat, wenn job.queue_position() None zurückgab. None ist eine gültige Rückgabe von job.queue_position().
  • Backend-Unterstützung für memory=True wird nun geprüft, wenn der kwarg übergeben wird. QiskitError ergebnisse, 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-ignis qiskit.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 QuantumCircuit Objekten, qasm ast-Knoten oder Qobj Objekten.

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 über IBMQJob.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_level Parameter beim Übermitteln des Auftrags mit anderen Benutzern geteilt werden.
  • IBMQJob instanzen 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 einen refresh Parameter, um eine Aktualisierung zu erzwingen.
  • .result() akzeptiert einen optionalen Parameter partial , um ggf. Teilergebnisse von fehlgeschlagenen Aufträgen zurückzugeben. Beachten Sie, dass die Methoden von Result , 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 synchrone IBMQBackend.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 5
provider.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() und provider.backends.retrieve_job() können zum Abrufen von anbieterweiten Aufträgen verwendet werden.

Sonstige Änderungen
  • Die Funktion backend.properties() akzeptiert jetzt einen optionalen Parameter datetime . Falls angegeben, gibt die Funktion die Backend-Eigenschaften zurück, die dem angegebenen Datumsfilter am nächsten kommen, aber älter sind als dieser.
  • Einige warnings wurden zu logger.warning abgeschwächt.
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.