common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

Amazon Braketで光量子コンピュータ(連続量)の計算をBorelais実機で実行してみる

Yuichiro Minato

2022/10/14 02:20

光量子コンピュータを使いたいですが、ベースとなる理論があまりに今の量子ゲートや量子アニーリングと違うので二の足を踏んでいる人が多いようです。ということで、やってみましょう!

今回使ったのはbolearisです。こちらはカナダのベンチャー企業Xanaduが出しているマシンで、光連続量と呼ばれる手法を使っています。詳しい解説や計算手法はblueqat.comで連続量で検索してみてください。

今回のチュートリアルはこの辺りを使います。 https://github.com/aws/amazon-braket-examples

最初にBorealisに行く前に、まずは光連続量の簡単な使い方を確認します。 ツールはstrawberryfieldsを使います。

import strawberryfields as sf from strawberryfields.ops import * import numpy as np from numpy import pi, sqrt # set the random seed np.random.seed(42)

まずは量子ビットに対応する量子モードを準備します。

prog = sf.Program(3)

そうしたらさっそく回路を記述します。以前別のブログでも確認しましたが使えるゲートの種類が異なります。

from braket.aws import AwsDevice 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']

上記のゲートの種類を使ってStrawberryFields形式で書いていきます。
これはチュートリアルからとってきましたが、量子テレポーテーションでしょうか。

alpha = 1+0.5j r = np.abs(alpha) phi = np.angle(alpha) with prog.context as q: # prepare initial states Coherent(r, phi) | q[0] Squeezed(-2) | q[1] Squeezed(2) | q[2] # apply gates BS = BSgate(pi/4, pi) BS | (q[1], q[2]) BS | (q[0], q[1]) # Perform homodyne measurements MeasureX | q[0] MeasureP | q[1] # Displacement gates conditioned on # the measurements Xgate(sqrt(2) * q[0].par) | q[2] Zgate(-sqrt(2) * q[1].par) | q[2]

早速計算しますが、シミュレーションをします。Fock既定のシミュレータで5次元のカットオフで実行します。
シミュレータは複数ありFockシミュレータやGaussianシミュレータなどあります。

eng = sf.Engine('fock', backend_options={"cutoff_dim": 5})

シミュレータが指定できましたので実行します。

result = eng.run(prog, shots=1, modes=None, compile_options={})
print(result.samples)
[[1.74371744 0.67170672]]

計算結果が出ました。Fockシミュレータは比較的内部の計算は重たいのでシミュレータとして軽量のものを使う場合には注意が必要です。

次にさっそくBorealisを使ってみましょう。こちらは光のパルスがループ内を時系列で並んで、時間差で計算をするタイプになっていて、今回はGBSという光量子超越を達成したアルゴリズムについてみてみます。

https://github.com/aws/amazon-braket-examples/blob/main/examples/photonics/Borealis_quickstart.ipynb

import strawberryfields as sf import numpy as np from braket.strawberryfields_plugin import BraketEngine eng = BraketEngine("arn:aws:braket:us-east-1::device/qpu/xanadu/Borealis") device = eng.device

時間ごとの管理は大変なのでヘルパー関数を使うようです。

from strawberryfields.tdm import borealis_gbs, get_mode_indices gate_args_list = borealis_gbs(device, modes=216, squeezing="high") delays = [1, 6, 36] n, N = get_mode_indices(delays)
2022-10-14 01:53:44,917 - WARNING - 133/259 arguments of phase gate 1 have been shifted by pi in order to be compatible with the phase modulators.

2022-10-14 01:53:44,921 - WARNING - 145/259 arguments of phase gate 2 have been shifted by pi in order to be compatible with the phase modulators.

先ほど確認した光連続量量子ゲートで回路を記述します。

from strawberryfields.ops import Sgate, Rgate, BSgate, MeasureFock prog = sf.TDMProgram(N) with prog.context(*gate_args_list) as (p, q): Sgate(p[0]) | q[n[0]] for i in range(len(delays)): Rgate(p[2 * i + 1]) | q[n[i]] BSgate(p[2 * i + 2], np.pi / 2) | (q[n[i + 1]], q[n[i]]) MeasureFock() | q[0]

いざ実行です!

shots = 10_000 results = eng.run(prog, shots=shots, crop=True) print(results.samples)

© 2024, blueqat Inc. All rights reserved