

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

# Braket은 어떤 OpenQASM 기능을 지원하나요?
<a name="braket-openqasm-supported-features"></a>

다음 섹션에는 Braket에서 지원하는 OpenQASM 3.0 데이터 유형, 문 및 pragma 명령이 나열되어 있습니다.

**Topics**
+ [

## 지원되는 OpenQASM 데이터 유형
](#braket-openqasm-supported-features-datatypes)
+ [

## 지원되는 OpenQASM 문
](#braket-openqasm-supported-features-statements)
+ [

## Braket OpenQASM pragma
](#braket-openqasm-supported-features-pragmas)
+ [

## 로컬 시뮬레이터에서의 OpenQASM에 대한 고급 기능 지원
](#braket-openqasm-supported-features-advanced-feature-local-simulator)
+ [

## OpenPulse에서 지원되는 연산 및 문법
](#braket-openpulse-supported-operations-grammar)

## 지원되는 OpenQASM 데이터 유형
<a name="braket-openqasm-supported-features-datatypes"></a>

Amazon Braket은 다음과 같은 OpenQASM 데이터 유형을 지원합니다.
+ (가상 및 물리적) 큐비트 인덱스에는 음이 아닌 정수가 사용됩니다.
  +  `cnot q[0], q[1];` 
  +  `h $0;` 
+ 게이트 회전 각도에는 부동 소수점 숫자 또는 상수를 사용할 수 있습니다.
  +  `rx(-0.314) $0;` 
  +  `rx(pi/4) $0;` 

**참고**  
pi는 OpenQASM의 기본 제공 상수이며 파라미터 이름으로 사용할 수 없습니다.
+ 복소수 배열(허수부에 대한 OpenQASM `im` 표기법 사용)은 일반적인 에르미트 관찰 가능 항목을 정의하기 위한 결과 유형 pragma와 단위 pragma에서 허용됩니다.
  +  `#pragma braket unitary [[0, -1im], [1im, 0]] q[0]` 
  +  `#pragma braket result expectation hermitian([[0, -1im], [1im, 0]]) q[0]` 

## 지원되는 OpenQASM 문
<a name="braket-openqasm-supported-features-statements"></a>

Amazon Braket은 다음과 같은 OpenQASM 문을 지원합니다.
+  `Header: OPENQASM 3;` 
+ 클래식 비트 선언:
  +  `bit b1;`(동등하게, `creg b1;`)
  +  `bit[10] b2;`(동등하게, `creg b2[10];`)
+ 큐비트 선언:
  +  `qubit b1;`(동등하게, `qreg b1;`)
  +  `qubit[10] b2;`(동등하게, `qreg b2[10];`)
+ 배열 내 인덱싱: `q[0]` 
+ 입력: `input float alpha;` 
+ 물리적 qubits의 사양: `$0` 
+ 디바이스에서 지원되는 게이트 및 연산:
  +  `h $0;` 
  +  `iswap q[0], q[1];` 

**참고**  
디바이스의 지원되는 게이트는 OpenQASM 작업에 대한 디바이스 속성에서 확인할 수 있습니다. 이러한 게이트를 사용하는 데 게이트 정의가 필요하지 않습니다.
+ 축어적 상자 문. 현재, 상자 기간 표기법은 지원되지 않습니다. 축어적 상자에는 네이티브 게이트와 물리적 qubits가 필요합니다.

```
#pragma braket verbatim
box{
    rx(0.314) $0;
}
```
+ qubits 또는 전체 qubit 레지스터에 대한 측정 및 측정 할당입니다.
  +  `measure $0;` 
  +  `measure q;` 
  +  `measure q[0];` 
  +  `b = measure q;` 
  +  `measure q → b;` 
+ 장벽 문은 장벽 경계에서 게이트 재정렬 및 최적화를 방지하여 회로 컴파일 및 실행을 명시적으로 제어할 수 있습니다. 또한 실행 중에 엄격한 시간 순서를 적용하여 후속 작업이 시작되기 전에 모든 작업이 완료되도록 합니다.
  +  `barrier;` 
  +  `barrier q[0], q[1];` 
  +  `barrier $3, $6;` 

## Braket OpenQASM pragma
<a name="braket-openqasm-supported-features-pragmas"></a>

Amazon Braket은 다음과 같은 OpenQASM pragma 명령을 지원합니다.
+ 노이즈 pragma
  +  `#pragma braket noise bit_flip(0.2) q[0]` 
  +  `#pragma braket noise phase_flip(0.1) q[0]` 
  +  `#pragma braket noise pauli_channel` 
+ 축어적 pragma
  +  `#pragma braket verbatim` 
+ 결과 유형 pragma
  + 기저 불변 결과 유형:
    + 상태 벡터: `#pragma braket result state_vector` 
    + 밀도 행렬: `#pragma braket result density_matrix` 
  + 기울기 계산 pragma:
    + 수반 기울기: `#pragma braket result adjoint_gradient expectation(2.2 * x[0] @ x[1]) all` 
  + Z 기저 결과 유형:
    + 진폭: `#pragma braket result amplitude "01"` 
    + 확률: `#pragma braket result probability q[0], q[1]` 
  + 기저 회전 결과 유형
    + 기대값: `#pragma braket result expectation x(q[0]) @ y([q1])` 
    + 분산: `#pragma braket result variance hermitian([[0, -1im], [1im, 0]]) $0` 
    + 샘플: `#pragma braket result sample h($1)` 

**참고**  
OpenQASM 3.0은 OpenQASM 2.0과 역호환되므로 2.0을 사용하여 작성된 프로그램은 Braket에서 실행할 수 있습니다. 그러나 Braket에서 지원하는 OpenQASM 3.0의 기능은 `qreg` vs `creg` 및 `qubit` vs `bit`와 같이 약간의 구문 차이가 있습니다. 측정 구문에도 차이가 있으므로 올바른 구문으로 뒷받침되어야 합니다.

## 로컬 시뮬레이터에서의 OpenQASM에 대한 고급 기능 지원
<a name="braket-openqasm-supported-features-advanced-feature-local-simulator"></a>

`LocalSimulator`는 Braket의 QPU 또는 온디맨드 시뮬레이터의 일부로 제공되지 않는 고급 OpenQASM 기능을 지원합니다. 다음 기능 목록은 `LocalSimulator`에서만 지원됩니다.
+ 게이트 한정자
+ OpenQASM 기본 제공 게이트
+ 고전적 변수
+ 고전적 연산
+ 사용자 지정 게이트
+ 고전적 제어
+ QASM 파일
+ 서브루틴

각 고급 기능의 예제는 이 [샘플 노트북](https://github.com/aws/amazon-braket-examples/blob/main/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb)을 참조하세요. 전체 OpenQASM 사양은 [OpenQASM 웹 사이트](https://openqasm.com/language/index.html)를 참조하세요.

## OpenPulse에서 지원되는 연산 및 문법
<a name="braket-openpulse-supported-operations-grammar"></a>

 **지원되는 OpenPulse 데이터 유형** 

Cal 블록:

```
cal {
    ...
}
```

Defcal 블록:

```
// 1 qubit
defcal x $0 {
...
}

// 1 qubit w. input parameters as constants
defcal my_rx(pi) $0 {
...
}

// 1 qubit w. input parameters as free parameters
defcal my_rz(angle theta) $0 {
...
}

// 2 qubit (above gate args are also valid)
defcal cz $1, $0 {
...
}
```

프레임:

```
frame my_frame = newframe(port_0, 4.5e9, 0.0);
```

파형:

```
// prebuilt
waveform my_waveform_1 = constant(1e-6, 1.0);

//arbitrary
waveform my_waveform_2 = {0.1 + 0.1im, 0.1 + 0.1im, 0.1, 0.1};
```

 **사용자 지정 게이트 보정 예제:** 

```
cal {
    waveform wf1 = constant(1e-6, 0.25);
}

defcal my_x $0 {
   play(wf1, q0_rf_frame);
}

defcal my_cz $1, $0 {
    barrier q0_q1_cz_frame, q0_rf_frame;
    play(q0_q1_cz_frame, wf1);
    delay[300ns] q0_rf_frame
    shift_phase(q0_rf_frame, 4.366186381749424);
    delay[300ns] q0_rf_frame;
    shift_phase(q0_rf_frame.phase, 5.916747563126659);
    barrier q0_q1_cz_frame, q0_rf_frame;
    shift_phase(q0_q1_cz_frame, 2.183093190874712);
}

bit[2] ro;
my_x $0;
my_cz $1,$0;
c[0] = measure $0;
```

 **임의 펄스 예제:** 

```
bit[2] ro;
cal {
    waveform wf1 = {0.1 + 0.1im, 0.1 + 0.1im, 0.1, 0.1};
    barrier q0_drive, q0_q1_cross_resonance;
    play(q0_q1_cross_resonance, wf1);
    delay[300ns] q0_drive;
    shift_phase(q0_drive, 4.366186381749424);
    delay[300dt] q0_drive;
   barrier q0_drive, q0_q1_cross_resonance;
   play(q0_q1_cross_resonance, wf1);
    ro[0] = capture_v0(r0_measure);
    ro[1] = capture_v0(r1_measure);
}
```