common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


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

© 2025, blueqat Inc. All rights reserved