blueqatSDKを作るモチベーションを上げるためにAmazon Braketにチャレンジします。
実はあんまり使ったことありません。。。
まずは準備運動でもつれ回路を作ってみます。こちらを参考にしています。
from braket.circuits import Circuit
from braket.devices import LocalSimulator
import matplotlib.pyplot as plt
%matplotlib inline
まずは回路を描画してみます。
bell = Circuit().h(0).cnot(0,1)
print(bell)
T : |0|1|
q0 : -H-C-
|
q1 : ---X-
T : |0|1|
次にローカルシミュレータを使って計算をしてみます。
#デバイス指定
device = LocalSimulator()
result = device.run(bell, shots=10).result()
#計算結果の表示
counts = result.measurement_counts
print(counts)
#そのまま描画
# plot using Counter
plt.bar(counts.keys(), counts.values());
Counter({'00': 7, '11': 3})
<Figure size 432x288 with 1 Axes>
できました。結構簡単ですね。次は早速実機を使ってみたいと思います。実機は種類によって得意なゲートが違うはずです。実際にはトランスパイラで変換されますので、問題はないと思いますが、一応念のため見てみます。
まずはIonQから。イオントラップ型です。
from braket.aws import AwsDevice
device = AwsDevice("arn:aws:braket:::device/qpu/ionq/ionQdevice")
print(device.properties.action['braket.ir.jaqcd.program'].supportedOperations)
['x', 'y', 'z', 'rx', 'ry', 'rz', 'h', 'cnot', 's', 'si', 't', 'ti', 'v', 'vi', 'xx', 'yy', 'zz', 'swap', 'i']
次はイギリスのOQCのLucyを見てみます。
device = AwsDevice("arn:aws:braket:eu-west-2::device/qpu/oqc/Lucy")
print(device.properties.action['braket.ir.jaqcd.program'].supportedOperations)
['ccnot', 'cnot', 'cphaseshift', 'cswap', 'cy', 'cz', 'h', 'i', 'phaseshift', 'rx', 'ry', 'rz', 's', 'si', 'swap', 't', 'ti', 'v', 'vi', 'x', 'y', 'z', 'ecr', 'start_verbatim_box', 'end_verbatim_box']
そして日本時間の昼間も使えるようになりましたRigetti
device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-2")
print(device.properties.action['braket.ir.jaqcd.program'].supportedOperations)
['cz', 'xy', 'ccnot', 'cnot', 'cphaseshift', 'cphaseshift00', 'cphaseshift01', 'cphaseshift10', 'cswap', 'h', 'i', 'iswap', 'phaseshift', 'pswap', 'rx', 'ry', 'rz', 's', 'si', 'swap', 't', 'ti', 'x', 'y', 'z', 'start_verbatim_box', 'end_verbatim_box']
次はD-Waveです。アニーラですのでゲートの指定はありません。システム6.1をみてみます。
device = AwsDevice('arn:aws:braket:us-west-2::device/qpu/d-wave/Advantage_system6')
topology = device.properties.dict()['provider']['topology']
qubit_number = device.properties.dict()['provider']['qubitCount']
print(topology)
print('qubit number = ', qubit_number)
{'type': 'pegasus', 'shape': [16]}
qubit number = 5760
こちらはペガサス結合の5760量子ビットと情報が出ました。
最後にあまり情報のないBolearisを見てみます。こちらは連続量でほかの量子ゲートは違いますがゲートセットがあります。
device = AwsDevice('arn:aws:braket:us-east-1::device/qpu/xanadu/Borealis')
print(device.properties.action['braket.ir.blackbird.program'].supportedOperations)
['s', 'r0', 'r1', 'r2', 'bs0', 'bs1', 'bs2', 'loop0_phase', 'loop1_phase', 'loop2_phase']
このように様々な種類のマシンがあります。最後の二つはD-WaveとBolearisはほかのマシンと使い方が異なります。また、近々もう一台特殊な使い方をするマシンが出ますので、そちらも楽しみです。一応実機での実行方法を確認してみます。
Rigettiのマシンで量子もつれを計算してみます。
device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-2")
bell = Circuit().h(0).cnot(0, 1)
task = device.run(bell)
print(task.result().measurement_counts)
Counter({'00': 447, '11': 432, '10': 65, '01': 56})
比較的早く戻ってきました。結構間違えますが答えも出ました。是非頑張って使いましょう!以上です。