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

土曜日でストップしているはずのIonQからの計算結果が戻ってきたので、もしかしたら計算できるのでは?ということでチャレンジしてみました。

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
)

#ionq
dprig = IonqDeviceParameters(paradigmParameters=paradigm_parameters)

params = {
    "action": circuit.to_ir().json(),
    "device": "aws/ionq/ionQdevice",
    "deviceParameters": dprig.json(),
    "shots": 10,
    "taskGroup": "bell_ionq",
    "sendEmail": True,
}
ionq_result = create_quantum_task(params)
tid = get_quantum_tasks({"index":0})['tasks'][0]['id']
res = get_quantum_task(tid)
res['result']['measurementProbabilities']

なんと時間外でも解けました。以外と動いてるんですね。土日はねらい目かもしれません。回路は単純なもつれ回路でしたので、きちんと取れました。

もちょっと長い回路でやってみます。こちらはトフォリゲートです。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
)

#ionq
dprig = IonqDeviceParameters(paradigmParameters=paradigm_parameters)

params = {
    "action": circuit.to_ir().json(),
    "device": "aws/ionq/ionQdevice",
    "deviceParameters": dprig.json(),
    "shots": 100,
    "taskGroup": "bell_ionq",
    "sendEmail": False,
}
ionq_result = create_quantum_task(params)

結構早く計算が終わるので、タスクのidから結果を取得して、取得した結果をカウントしてみます

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

IonQはRigettiとカウントの仕方が違っていますね。IonQは111の出る確率が明らかに大きいので、精度が高い気がします。値段は高いですが、たくさん稼いでマシンがたくさん使えるといいですね。以上です。

Yuichiro Minato
blueqat CEO/CTO 2015年総務省異能vation最終採択 2017年内閣府ImPACTプロジェクトPM補佐 2019年文科省さきがけ量子情報処理領域アドバイザー
Comments
Yuichiro Minato
blueqat CEO/CTO 2015年総務省異能vation最終採択 2017年内閣府ImPACTプロジェクトPM補佐 2019年文科省さきがけ量子情報処理領域アドバイザー
Related posts

blueqat Inc.

Shibuya Scramble Square 39F 2-24-12, Shibuya, Shibuya-ku, Tokyo
Contact: info@blueqat.com