

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Hello Pulse 작업
<a name="braket-hello-pulse"></a>

이 섹션에서는 Rigetti 디바이스에서 펄스를 사용하여 직접 단일 큐비트 게이트를 특성화하고 구성하는 방법을 알아봅니다. 큐비트에 전자기장을 가하면 Rabi 진동이 발생하여 큐비트가 0 상태와 1 상태 사이를 전환합니다. 펄스의 보정된 길이와 위상을 사용하면 Rabi 진동이 단일 큐비트 게이트를 계산할 수 있습니다. 여기서는 보다 복잡한 펄스 시퀀스를 빌드하는 데 사용되는 기본 블록인 pi/2 펄스를 측정하기 위한 최적의 펄스 길이를 결정합니다.

먼저 펄스 시퀀스를 빌드하려면 `PulseSequence` 클래스를 가져옵니다.

```
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
```

그런 다음 QPU의 Amazon Resource Name(ARN)을 사용하여 새 Braket 디바이스를 인스턴스화합니다. 다음 코드 블록은 Rigetti Ankaa-3을 사용합니다.

```
device = AwsDevice(Devices.Rigetti.Ankaa3)
```

다음 펄스 시퀀스에는 파형 재생과 큐비트 측정이라는 두 가지 구성 요소가 포함됩니다. 펄스 시퀀스는 일반적으로 프레임에 적용할 수 있습니다. 장벽 및 지연과 같은 몇 가지 예외를 제외하고, 큐비트에 적용할 수 있습니다. 펄스 시퀀스를 구성하기 전에 사용 가능한 프레임을 검색해야 합니다. 드라이브 프레임은 Rabi 진동에 대한 펄스를 적용하는 데 사용되며, 판독 프레임은 큐비트 상태를 측정하는 데 사용됩니다. 이 예제에서는 큐비트 25의 프레임을 사용합니다.

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

이제 드라이브 프레임에서 재생할 파형을 생성합니다. 목표는 다양한 펄스 길이에 대한 큐비트의 동작을 특성화하는 것입니다. 매번 길이가 다른 파형을 재생합니다. 매번 새 파형을 인스턴스화하는 대신, Braket에서 지원하는 펄스 시퀀스 내 `FreeParameter`를 사용합니다. 자유 파라미터로 파형과 펄스 시퀀스를 한 번 생성한 다음, 다른 입력 값으로 동일한 펄스 시퀀스를 실행할 수 있습니다.

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

마지막으로, 펄스 시퀀스로 결합합니다. 펄스 시퀀스에서 `play`는 드라이브 프레임에서 지정된 파형을 재생하고 `capture_v0`은 판독 프레임에서 상태를 측정합니다.

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

다양한 펄스 길이를 스캔하여 QPU에 제출합니다. QPU에서 펄스 시퀀스를 실행하기 전에 자유 파라미터의 값을 바인딩합니다.

```
start_length = 12e-9
end_length = 2e-7
lengths = np.arange(start_length, end_length, 12e-9)
N_shots = 100

tasks = [
    device.run(pulse_sequence(length=length), shots=N_shots)
    for length in lengths
]

probability_of_zero = [
    task.result().measurement_counts['0']/N_shots
    for task in tasks
]
```

큐비트 측정의 통계는 0 상태와 1 상태 사이에서 진동하는 큐비트의 진동 역학을 보여줍니다. 측정 데이터에서 Rabi 주파수를 추출하고 펄스 길이를 미세 조정하여 특정 1큐비트 게이트를 구현할 수 있습니다. 예를 들어 아래 그림의 데이터에서 주기성은 약 154ns입니다. 따라서 pi/2 회전 게이트는 길이=38.5ns인 펄스 시퀀스에 해당합니다.

![펄스 지속 시간에 대한 모집단 양을 초 단위로 보여주는 선 그래프입니다. 그래프에는 2개의 최고점과 1개의 최저점이 있습니다.](http://docs.aws.amazon.com/ko_kr/braket/latest/developerguide/images/Rabi-frequency.png)


## OpenPulse를 사용한 Hello Pulse
<a name="braket-hello-pulse-openpulse"></a>

 [OpenPulse](https://openqasm.com/language/openpulse.html)는 일반 양자 디바이스의 펄스 수준 제어를 지정하는 언어이며 OpenQASM 3.0 사양의 일부입니다. Amazon Braket은 OpenQASM 3.0 표현을 사용하여 펄스를 직접 프로그래밍할 수 있도록 OpenPulse를 지원합니다.

 Braket은 네이티브 명령에서 펄스를 표현하기 위한 기본 중간 표현으로 OpenPulse를 사용합니다. OpenPulse는 `defcal`(“define calibration”의 줄임말) 선언 형태로 명령 보정 추가를 지원합니다. 이러한 선언을 사용하면 저수준 제어 문법 내에서 게이트 명령의 구현을 지정할 수 있습니다.

다음 명령을 사용하여 Braket `PulseSequence`의 OpenPulse 프로그램을 볼 수 있습니다.

```
print(pulse_sequence.to_ir())
```

OpenPulse 프로그램을 직접 구성할 수도 있습니다.

```
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);
}
"""
```

스크립트로 `Program` 객체를 생성합니다. 그런 다음 프로그램을 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)
```