Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Hola Pulse
Aquí aprenderá a construir un par de Bell simple directamente con pulsos y a ejecutar este programa de impulsos en elRigetti dispositivo. Un par Bell es un circuito de dos cúbits que consiste en una puerta de Hadamard en el primer cúbit seguida de unacnot
puerta entre el primer y el segundo cúbit. La creación de estados entrelazados con pulsos requiere mecanismos específicos que dependen del tipo de hardware y de la arquitectura del dispositivo. No utilizaremos un mecanismo nativo para crear lacnot
puerta. En su lugar, utilizaremos formas de onda y marcos específicos que habiliten lacz
puerta de forma nativa. En este ejemplo, crearemos una puerta de Hadamard utilizando las puertas nativas de un solo cúbitrx
rz
y expresaremos lacz
puerta mediante pulsos.
Primero, importemos las bibliotecas necesarias. Además de laCircuit
clase, ahora también tendrás quePulseSequence
importarla.
from braket.aws import AwsDevice from braket.pulse import PulseSequence, ArbitraryWaveform, GaussianWaveform from braket.circuits import Circuit import braket.circuits.circuit as circuit
A continuación, cree una instancia de un dispositivo de Braket nuevo con el nombre de recurso de Amazon (ARN) delRigetti Aspen-M-3 dispositivo. Consulte la página Dispositivos de la consola de Amazon Braket para ver el diseño delRigetti Aspen-M-3 dispositivo.
a=10 #specifies the control qubit b=113 #specifies the target qubit device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-3")
Como la puerta de Hadamard no es una puerta nativa delRigetti dispositivo, no se puede utilizar en combinación con pulsos. Por lo tanto, debe descomponerlo en una secuencia de puertasrx
yrz
nativas.
import numpy as np import matplotlib.pyplot as plt @circuit.subroutine(register=True) def rigetti_native_h(q0): return ( Circuit() .rz(q0, np.pi) .rx(q0, np.pi/2) .rz(q0, np.pi/2) .rx(q0, -np.pi/2) )
Para lacz
puerta, utilizaremos una forma de onda arbitraria con parámetros (amplitud, tiempo de subida/caída y duración) predeterminados por el proveedor de hardware durante una etapa de calibración. Esta forma de onda se aplicará en elq10_q113_cz_frame
. Para obtener una versión más reciente de la forma de onda arbitraria utilizada aquí, consulte QCS
a_b_cz_wfm = ArbitraryWaveform([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00017888439538396808, 0.00046751103636033026, 0.0011372942989106456, 0.002577059611929697, 0.005443941944632366, 0.010731922770068104, 0.01976701723583167, 0.03406712171899736, 0.05503285980691202, 0.08350670755829034, 0.11932853352131022, 0.16107456696238298, 0.20614055551722368, 0.2512065440720643, 0.292952577513137, 0.328774403476157, 0.3572482512275353, 0.3782139893154499, 0.3925140937986156, 0.40154918826437913, 0.4068371690898149, 0.4097040514225177, 0.41114381673553674, 0.411813599998087, 0.4121022266390633, 0.4122174383870584, 0.41226003881132406, 0.4122746298554775, 0.4122792591252675, 0.4122806196003006, 0.41228098995582513, 0.41228108334474756, 0.4122811051578895, 0.4122811098772742, 0.4122811108230642, 0.4122811109986316, 0.41228111102881937, 0.41228111103362725, 0.4122811110343365, 0.41228111103443343, 0.4122811110344457, 0.4122811110344471, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.4122811110344471, 0.4122811110344457, 0.41228111103443343, 0.4122811110343365, 0.41228111103362725, 0.41228111102881937, 0.4122811109986316, 0.4122811108230642, 0.4122811098772742, 0.4122811051578895, 0.41228108334474756, 0.41228098995582513, 0.4122806196003006, 0.4122792591252675, 0.4122746298554775, 0.41226003881132406, 0.4122174383870584, 0.4121022266390633, 0.411813599998087, 0.41114381673553674, 0.4097040514225176, 0.4068371690898149, 0.40154918826437913, 0.3925140937986155, 0.37821398931544986, 0.3572482512275351, 0.32877440347615655, 0.2929525775131368, 0.2512065440720641, 0.20614055551722307, 0.16107456696238268, 0.11932853352131002, 0.08350670755829034, 0.05503285980691184, 0.03406712171899729, 0.01976701723583167, 0.010731922770068058, 0.005443941944632366, 0.002577059611929697, 0.0011372942989106229, 0.00046751103636033026, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) a_b_cz_frame = device.frames[f'q{a}_q{b}_cz_frame'] dt = a_b_cz_frame.port.dt a_b_cz_wfm_duration = len(a_b_cz_wfm.amplitudes)*dt print('CZ pulse duration:', a_b_cz_wfm_duration*1e9, 'ns')
Esto debería devolver:
CZ pulse duration: 124 ns
Ahora podemos construir lacz
puerta usando la forma de onda que acabamos de definir. Recuerde que lacz
puerta consiste en un cambio de fase del cúbit objetivo si el cúbit de control está en ese|1>
estado.
phase_shift_a=1.1733407221086924 phase_shift_b=6.269846678712192 a_rf_frame = device.frames[f'q{a}_rf_frame'] b_rf_frame = device.frames[f'q{b}_rf_frame'] frames = [a_rf_frame, b_rf_frame, a_b_cz_frame] cz_pulse_sequence = ( PulseSequence() .barrier(frames) .play(a_b_cz_frame, a_b_cz_wfm) .delay(a_rf_frame, a_b_cz_wfm_duration) .shift_phase(a_rf_frame, phase_shift_a) .delay(b_rf_frame, a_b_cz_wfm_duration) .shift_phase(b_rf_frame, phase_shift_b) .barrier(frames) )
Laa_b_cz_wfm
forma de onda se reproduce en un cuadro asociado a un puerto de flujo rápido. Su función es cambiar la frecuencia de los cúbits para activar una interacción entre cúbits y cúbits. Para obtener más información, consulte Roles de marcos y puertos. A medida que la frecuencia varía, los fotogramas de cúbits giran a diferentes velocidades que losrf
fotogramas de un solo cúbit que se mantienen intactos: estos últimos se desfasan. Estos cambios de fase se calibraron previamente medianteRamsey secuencias y se proporcionan aquí como información codificada hastaphase_shift_a
yphase_shift_b
(período completo). Corregimos esta desfase medianteshift_phase
instrucciones en losrf
marcos. Tenga en cuenta que esta secuencia solo funcionará en programas en los que no haya ningúnXY fotograma relacionado con el cúbita
yb
se utiliza, ya que no compensamos el cambio de fase que se produce en estos fotogramas. Este es el caso de este programa de un solo par de Bell, que solo usacz
marcosrf
y. Para obtener más información, consulte Caldwell et al.
Ahora estamos listos para crear un par de campanas con pulsos.
bell_circuit_pulse = ( Circuit() .rigetti_native_h(a) .rigetti_native_h(b) .pulse_gate([a, b], cz_pulse_sequence) .rigetti_native_h(b) ) print(bell_circuit_pulse)
T : | 0 | 1 | 2 | 3 |4 | 5 | 6 | 7 | 8 | q5 : -Rz(3.14)-Rx(1.57)-Rz(1.57)-Rx(-1.57)-PG-------------------------------------- | q6 : -Rz(3.14)-Rx(1.57)-Rz(1.57)-Rx(-1.57)-PG-Rz(3.14)-Rx(1.57)-Rz(1.57)-Rx(-1.57)- T : | 0 | 1 | 2 | 3 |4 | 5 | 6 | 7 | 8 |
Vamos a ejecutar este par de Bell en elRigetti dispositivo. Tenga en cuenta que ejecutar este bloque de código conllevará un cargo. Para obtener más información sobre estos costos, consulte la página de precios
task = device.run(bell_pair_pulses, shots=100) counts = task.result().measurement_counts plt.bar(sorted(counts), [counts[k] for k in sorted(counts)])
