本日は土曜日です。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も結構出ています。トフォリ一回くらいで結構間違えるので、本格的な利用は厳しそうですが、お試しでは十分に動きそうです。ぜひやってみてくださいませ。今回は以上です。