Mit Hello Pulse arbeiten - Amazon Braket

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Mit Hello Pulse arbeiten

In diesem Abschnitt erfahren Sie, wie Sie ein einzelnes Qubit-Gate direkt mit einem Impuls charakterisieren und konstruieren Rigetti Gerät. Das Anlegen eines elektromagnetischen Feldes an ein Qubit führt zu einer Rabi-Oszillation, wodurch Qubits zwischen dem Zustand 0 und dem Zustand 1 umgeschaltet werden. Bei kalibrierter Länge und Phase des Impulses kann die Rabi-Oszillation einzelne Qubit-Gates berechnen. Hier werden wir die optimale Impulslänge für die Messung eines Pi/2-Impulses bestimmen, eines elementaren Blocks, der zum Aufbau komplexerer Impulssequenzen verwendet wird.

Um eine Impulssequenz zu erstellen, importieren Sie zunächst die PulseSequence Klasse.

from braket.aws import AwsDevice from braket.circuits import FreeParameter from braket.devices import Devices from braket.pulse import PulseSequence, GaussianWaveform import numpy as np

Als Nächstes instanziieren Sie ein neues Braket-Gerät mit dem Amazon Resource Name (ARN) der QPU. Der folgende Codeblock verwendet Rigetti Ankaa-3.

device = AwsDevice(Devices.Rigetti.Ankaa3)

Die folgende Impulssequenz besteht aus zwei Komponenten: Das Abspielen einer Wellenform und das Messen eines Qubits. Die Pulssequenz kann normalerweise auf Frames angewendet werden. Mit einigen Ausnahmen wie Barrier und Delay, die auf Qubits angewendet werden können. Bevor Sie die Impulssequenz erstellen, müssen Sie die verfügbaren Frames abrufen. Der Antriebsrahmen dient zum Anlegen des Impulses für die Rabi-Oszillation, und der Ausleserahmen dient zur Messung des Qubit-Zustands. In diesem Beispiel werden die Frames von Qubit 25 verwendet. Weitere Informationen zu Frames finden Sie unter Rollen von Frames und Ports.

drive_frame = device.frames["Transmon_25_charge_tx"] readout_frame = device.frames["Transmon_25_readout_rx"]

Erstellen Sie nun die Wellenform, die im Drive-Frame abgespielt werden soll. Ziel ist es, das Verhalten der Qubits für verschiedene Pulslängen zu charakterisieren. Sie spielen jedes Mal eine Wellenform mit unterschiedlichen Längen ab. Anstatt jedes Mal eine neue Wellenform zu instanziieren, verwenden Sie den von Braket unterstützten freien Parameter in der Pulssequenz. Sie können die Wellenform und die Impulssequenz einmal mit freien Parametern erstellen und dann dieselbe Impulssequenz mit unterschiedlichen Eingabewerten ausführen.

waveform = GaussianWaveform(FreeParameter("length"), FreeParameter("length") * 0.25, 0.2, False)

Schließlich fügen Sie sie zu einer Impulssequenz zusammen. In der Impulssequenz wird die angegebene Wellenform auf dem Antriebsrahmen play abgespielt und der capture_v0 Status wird vom Ausleserahmen aus gemessen.

pulse_sequence = ( PulseSequence() .play(drive_frame, waveform) .capture_v0(readout_frame) )

Scannt über einen bestimmten Pulslängenbereich und sendet sie an die QPU.

start_length=12e-9 end_length=2e-7 lengths = np.arange(start_length, end_length, 12e-9) tasks = [ device.run(pulse_sequence, shots=100, inputs={"length": length}) for length in lengths ] probability_of_zero = [ task.result().measurement_counts['0']/N_shots for task in tasks ]

Die Statistik der Qubit-Messung zeigt die Schwingungsdynamik des Qubits, das zwischen dem 0-Zustand und dem 1-Zustand oszilliert. Aus den Messdaten können Sie die Rabi-Frequenz extrahieren und die Länge des Impulses fein abstimmen, um ein bestimmtes 1-Qubit-Gate zu implementieren. Aus den Daten in der Abbildung unten geht beispielsweise hervor, dass die Periodizität etwa 154 ns beträgt. Ein Pi/2-Rotationstor würde also der Impulsfolge mit einer Länge von 38,5 ns entsprechen.

Liniendiagramm, das den Anteil der Population an der Pulsdauer in Sekunden zeigt. Das Diagramm enthält zwei Spitzen und einen Tiefpunkt.

Hallo Pulse benutzt OpenPulse

OpenPulseist eine Sprache zur Spezifikation der Pulssteuerung eines allgemeinen Quantengeräts und Teil der OpenQASM 3.0-Spezifikation. Amazon Braket unterstützt OpenPulse für die direkte Programmierung von Impulsen mithilfe der OpenQASM 3.0-Darstellung.

Bracket verwendet OpenPulse als zugrundeliegende Zwischendarstellung für die Expression von Impulsen in nativen Befehlen. OpenPulse unterstützt das Hinzufügen von Befehlskalibrierungen in Form von Deklarationen defcal (kurz für „Kalibrierung definieren“). Mit diesen Deklarationen können Sie eine Implementierung einer Gate-Anweisung innerhalb einer Kontrollgrammatik auf niedrigerer Ebene spezifizieren.

Mit dem folgenden Befehl können Sie sich das OpenPulse Programm einer PulseSequence Braket-Datei ansehen.

print(pulse_sequence.to_ir())

Sie können ein OpenPulse Programm auch direkt erstellen.

from braket.ir.openqasm import Program openpulse_script = """ OPENQASM 3.0; cal { bit[1] psb; waveform my_waveform = gaussian(12.0ns, 3.0ns, 0.2, false); play(Transmon_25_charge_tx, my_waveform); psb[0] = capture_v0(Transmon_25_readout_rx); } """

Erstellen Sie ein Program Objekt mit Ihrem Skript. Senden Sie das Programm dann an eine QPU.

from braket.aws import AwsDevice from braket.devices import Devices from braket.ir.openqasm import Program program = Program(source=openpulse_script) device = AwsDevice(Devices.Rigetti.Ankaa3) task = device.run(program, shots=100)