common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

blueqat cloudから量子ゲートマシンのRigettiにタスクを投げて計算してみた

Yuichiro Minato

2021/04/17 16:28

#量子ゲート

本日は土曜日です。blueqat cloudからIonQに投げてみたかったですが、休みでした。Rigettiは投げられますので、使ってみたいと思います。

APIはblueqat.comから利用できます。今回は事前に、.passに保存して使っています。以前D-Waveはv1のAPIを利用しましたが、今回はv2になっています。

まだツールの検証がまだなので、バックエンドに投げるときのamazon braketそのまま使ってみます。blueqat cloudの無料クレジットを持っている人はぜひ試してみてください。

from braket.circuits import Circuit from braket.device_schema import GateModelParameters from braket.device_schema.rigetti import RigettiDeviceParameters from braket.device_schema.ionq import IonqDeviceParameters import json import urllib.request f = open('../.pass', 'r', encoding='UTF-8') API_KEY = f.read()[:-1] f.close() API_ENDPOINT = "https://cloudapi.blueqat.com/v2/" def post_request(path, body): headers = { "Content-Type": "application/json", "X-Api-Key": API_KEY, } req = urllib.request.Request( API_ENDPOINT + path, json.dumps(body).encode(), headers ) with urllib.request.urlopen(req) as res: body = res.read() return json.loads(body) def get_quantum_tasks(body): path = "quantum-tasks/list" return post_request(path, params) def get_quantum_task_status(id): path = "quantum-tasks/get/status" body = { "id": id, } return post_request(path, body) def get_quantum_task(id): path = "quantum-tasks/get" body = { "id": id, } return post_request(path, body) def create_quantum_task(body): path = "quantum-tasks/create" return post_request(path, body) def get_credit(): path = "credit/get" return post_request(path, {}) #circuit circuit = Circuit().h(0).cnot(0, 1) paradigm_parameters = GateModelParameters( qubitCount=circuit.qubit_count, disableQubitRewiring=False ) # rigetti dprig = RigettiDeviceParameters(paradigmParameters=paradigm_parameters) dprig.json() params = { "action": circuit.to_ir().json(), "device": "aws/rigetti/Aspen-9", "deviceParameters": dprig.json(), "shots": 10, "taskGroup": "bell_rigetti", "sendEmail": True, } rigetti_result = create_quantum_task(params)

これでタスクが作成されますが、いくつかやってみましたが、結構早く解いてくれました。今回は投げたジョブの履歴から一番最新のものをとって、その結果を取得したいと思います。 もっと厳密にはステータスなどをとりながらなのですが、今日は調子が良さそうなので、そのまま結果を取得します。

tid = get_quantum_tasks({"index":0})['tasks'][0]['id'] res = get_quantum_task(tid) res['result']['measurements']
[[0, 0],

 [0, 0],

 [0, 0],

 [0, 0],

 [0, 0],

 [0, 0],

 [1, 1],

 [0, 0],

 [0, 1],

 [1, 1]]

回路は単純なもつれ回路でしたので、きちんと取れました。すごいですね。

もちょっと長い回路でやってみます。こちらはとふぉりゲートです。CCXとも呼ばれますが、最初の回路に011を設定したので、最終的には111が正解になります。まずジョブを投げます。

import numpy as np circuit = Circuit().x(1).x(2).h(0).cnot(1,0).ti(0).cnot(2,0).t(0).cnot(1,0).ti(0).cnot(2,0).t(0).t(1).h(0).swap(1,0).cnot(2,0).ti(0).t(2).cnot(2,0) paradigm_parameters = GateModelParameters( qubitCount=circuit.qubit_count, disableQubitRewiring=False ) # rigetti dprig = RigettiDeviceParameters(paradigmParameters=paradigm_parameters) dprig.json() params = { "action": circuit.to_ir().json(), "device": "aws/rigetti/Aspen-9", "deviceParameters": dprig.json(), "shots": 100, "taskGroup": "bell_rigetti", "sendEmail": False, } rigetti_result = create_quantum_task(params)

結構早く計算が終わるので、タスクのidから結果を取得します。

tid = get_quantum_tasks({"index":0})['tasks'][0]['id'] res = get_quantum_task(tid) a = res['result']['measurements']

取得した結果をカウントしてみます。

b = [] for i in a: b.append("".join(map(str, i))) import collections collections.Counter(b)
Counter({'000': 6,

         '101': 16,

         '001': 8,

         '111': 31,

         '011': 6,

         '100': 14,

         '110': 14,

         '010': 5})

なんとか111が最大ででましたが、101とか100とか110も結構出ています。トフォリ一回くらいで結構間違えるので、本格的な利用は厳しそうですが、お試しでは十分に動きそうです。ぜひやってみてくださいませ。今回は以上です。

© 2024, blueqat Inc. All rights reserved