

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon Braket 上的量子任务示例
<a name="braket-submit-tasks-to-braket"></a>

本节介绍运行示例量子任务的各个阶段，从选择设备到查看结果。作为 Amazon Braket 的最佳实践，我们建议您首先在模拟器上运行电路，如 SV1。

**Topics**
+ [指定设备](#braket-example-specify-device)
+ [提交量子任务示例](#braket-submit-example-task)
+ [提交参数化任务](#braket-submit-parametrized-task)
+ [指定 shots](#braket-shots)
+ [轮询结果](#braket-polling-results)
+ [示例：查看结果](#braket-example-results)

## 指定设备
<a name="braket-example-specify-device"></a>

首先，为您的量子任务选择并指定设备。此示例显示了如何选择模拟器 SV1。

```
from braket.aws import AwsDevice

# Choose the on-demand simulator to run the circuit
device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/sv1")
```

您可以按如下方式查看此设备的某些属性：

```
print(device.name)
for iter in device.properties.action['braket.ir.jaqcd.program']:
    print(iter)
```

```
SV1
('version', ['1.0', '1.1'])
('actionType', 'braket.ir.jaqcd.program')
('supportedOperations', ['ccnot', 'cnot', 'cphaseshift', 'cphaseshift00', 'cphaseshift01', 'cphaseshift10', 'cswap', 'cy', 'cz', 'ecr', 'h', 'i', 'iswap', 'pswap', 'phaseshift', 'rx', 'ry', 'rz', 's', 'si', 'swap', 't', 'ti', 'unitary', 'v', 'vi', 'x', 'xx', 'xy', 'y', 'yy', 'z', 'zz'])
('supportedResultTypes', [ResultType(name='Sample', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=1, maxShots=100000), ResultType(name='Expectation', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=0, maxShots=100000), ResultType(name='Variance', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=0, maxShots=100000), ResultType(name='Probability', observables=None, minShots=1, maxShots=100000), ResultType(name='Amplitude', observables=None, minShots=0, maxShots=0)])
('disabledQubitRewiringSupported', None)
```

## 提交量子任务示例
<a name="braket-submit-example-task"></a>

提交要在按需模拟器上运行的量子任务示例。

```
from braket.circuits import Circuit, Observable

# Create a circuit with a result type
circ = Circuit().rx(0, 1).ry(1, 0.2).cnot(0, 2).variance(observable=Observable.Z(), target=0)
# Add another result type
circ.probability(target=[0, 2])

# Set up S3 bucket (where results are stored)
my_bucket = "amazon-braket-s3-demo-bucket"  # The name of the bucket
my_prefix = "your-folder-name"  # The name of the folder in the bucket
s3_location = (my_bucket, my_prefix)

# Submit the quantum task to run
my_task = device.run(circ, s3_location, shots=1000, poll_timeout_seconds=100, poll_interval_seconds=10)
# The positional argument for the S3 bucket is optional if you want to specify a bucket other than the default

# Get results of the quantum task
result = my_task.result()
```

该 `device.run()` 命令通过 `CreateQuantumTask` API 创建量子任务。在短暂的初始化时间后，量子任务将进行排队，直到有能力在设备上运行量子任务为止。在本例中，设备为 SV1。设备完成计算后，Amazon Braket 会将结果写入调用中指定的 Amazon S3 位置。除本地模拟器 `s3_location` 之外，所有设备都需要有位置参数。

**注意**  
Braket 量子任务动作的大小限制为 5MB。

## 提交参数化任务
<a name="braket-submit-parametrized-task"></a>

 Amazon Braket 按需模拟器和本地模拟器， QPUs 还支持在任务提交时指定免费参数的值。您可以通过使用 `device.run()` 的 `inputs` 参数来执行此操作，如以下示例所示。`inputs` 必须是字符串浮点对的字典，其中键是参数名。

参数化编译可以提高在某些情况下执行参数电路的性能。 QPUs将参数电路作为量子任务提交给支持的 QPU 时，Braket 将编译电路一次，然后缓存结果。对于同一电路的后续参数更新，无需重新编译，从而缩短了使用相同电路的任务的运行时。编译电路时，Braket 会自动使用硬件提供商提供的更新的校准数据，以确保获得高质量的结果。

**注意**  
除脉冲电平程序外，所有基于门的 QPUs 超导模式都支持参数化编译。Rigetti Computing

```
from braket.circuits import Circuit, FreeParameter, Observable

# Create the free parameters
alpha = FreeParameter('alpha')
beta = FreeParameter('beta')

# Create a circuit with a result type
circ = Circuit().rx(0, alpha).ry(1, alpha).cnot(0, 2).xx(0, 2, beta)
circ.variance(observable=Observable.Z(), target=0)

# Add another result type
circ.probability(target=[0, 2])

# Submit the quantum task to run
my_task = device.run(circ, inputs={'alpha': 0.1, 'beta': 0.2}, shots=100)
```

## 指定 shots
<a name="braket-shots"></a>

shots 参数指的是所需的测量 shots 的次数。诸如 SV1 之类的模拟器支持两种模拟模式。
+ 对于 shots = 0，模拟器执行精确模拟，返回所有结果类型的真实值。（对 TN1 暂不可用。）
+ 对于的非零值shots，仿真器会从输出分布中采样以模拟真实的shot噪声。 QPUsQPU 设备仅允许 shots > 0。

有关每个量子任务的最大拍摄次数的信息，请参阅 [Braket 配额](braket-quotas.md)。

## 轮询结果
<a name="braket-polling-results"></a>

执行 `my_task.result()` 时，SDK 开始使用您在创建量子任务时定义的参数轮询结果：
+  `poll_timeout_seconds` 是在按需模拟器和/或 QPU 设备上运行量子任务时，在量子任务超时之前对其进行轮询的秒数。默认值为 43.2 万秒（5 天）。
+  **注意：**对于 Rigetti 和 IonQ 之类的 QPU 设备，我们建议您留出几天时间。如果您的轮询超时时间太短，则可能无法在轮询时间内返回结果。例如，当 QPU 不可用时，会返回本地超时错误。
+  `poll_interval_seconds` 是轮询量子任务的频率。它指定了在按需模拟器和 QPU 设备上运行量子任务时，您多久调用 Braket API 以获取状态。默认值为 1 秒。

这种异步执行便于与并非总是可用的 QPU 设备进行交互。例如，在常规维护时段内，设备可能不可用。

返回的结果包含一系列与量子任务相关的元数据。您可以使用以下命令检查测量结果：

```
print('Measurement results:\n', result.measurements)
print('Counts for collapsed states:\n', result.measurement_counts)
print('Probabilities for collapsed states:\n', result.measurement_probabilities)
```

```
Measurement results:
 [[1 0 1]
 [0 0 0]
 [0 0 0]
 ...
 [0 0 0]
 [0 0 0]
 [1 0 1]]
Counts for collapsed states:
 Counter({'000': 766, '101': 220, '010': 11, '111': 3})
Probabilities for collapsed states:
 {'101': 0.22, '000': 0.766, '010': 0.011, '111': 0.003}
```

## 示例：查看结果
<a name="braket-example-results"></a>

由于您还指定了 `ResultType`，您可以查看返回的结果。结果类型按添加到电路的添加顺序显示这些类型。

```
print('Result types include:\n', result.result_types)
print('Variance=', result.values[0])
print('Probability=', result.values[1])

# Plot the result and do some analysis
import matplotlib.pyplot as plt
plt.bar(result.measurement_counts.keys(), result.measurement_counts.values())
plt.xlabel('bitstrings')
plt.ylabel('counts')
```

```
Result types include:
 [ResultTypeValue(type=Variance(observable=['z'], targets=[0], type=<Type.variance: 'variance'>), value=0.693084), ResultTypeValue(type=Probability(targets=[0, 2], type=<Type.probability: 'probability'>), value=array([0.777, 0.   , 0.   , 0.223]))]
Variance= 0.693084
Probability= [0.777 0.    0.    0.223]
Text(0, 0.5, 'counts')
```

![条形图显示了不同位串的计数，“000”的最高条形包含 700 多个计数。](http://docs.aws.amazon.com/zh_cn/braket/latest/developerguide/images/demo-result.png)
