以前はAmazon Braket経由で利用しましたが、今回は直接OQCのマシンを使ってみたいと思います。
https://oxfordquantumcircuits.com/
今回は「OQC QCaaS Client」というSDKを利用しました。基本的に量子コンピュータ業界はQASMという共通言語でハードウェアに投げるので、今回はIBM Qiskit経由でQASM変換する方法を試してみました。
以前はAmazon Braket経由での利用は行ったことがありますが、今回は直接OQCとの契約により、QCaaS Clientを利用します。
参考記事:OQCのイギリス製量子コンピュータを使ってみました
https://blueqat.com/yuichiro_minato2/4e3cabcc-3586-4d10-a72b-83e41c715069
具体的な手順は、
・アカウントの登録
・量子回路の作成と投入
・計算結果の取得
となります。量子コンピュータ業界は最近とてもこなれていてタスクの投入と回収はかなり簡単です。では、始めましょう。
OQCのOCaaS ClientのドキュメントURLは、
https://docs.oqc.app/index.html
となっています。
インストール
インストールはpypi経由で入れます。
pip install qiskit oqc-qcaas-client
ソフトウェアが入りましたら早速実行してみます。ツールを読み込み、契約アカウントの情報を入れてクライアントの設定を最初にします。
from qiskit import QuantumCircuit
from qcaas_client.client import OQCClient, QPUTask, TaskStatus
from scc.compiler.config import CompilerConfig, QuantumResultsFormat, Tket, TketOptimizations
url = "hogehoge"
email = "hoge@hoge.com"
password = "hogehoge"
クライアントの設定
client = OQCClient(url=url, email=email, password=password)
client.get_next_window()
client.get_next_window()では、マシンの実行の時間が指定されるようです。実行時間内でしたら一瞬で答えが返ってくるのでちょっとした確認程度に利用してみます。たとえば下記のように稼働時間を取得できます。
2023-12-29 19:00:00
まずは量子回路の作成です。QASM形式で記述して投げればいいのですが、Qiskitを使っている人が多いと思うので、Qiskit経由で記述をしてみます。
# なんかQiskitで量子回路作ります。
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0,1)
qc.measure(range(2), range(2))
今回は2量子ビットを準備し、H-CXでもつれ状態を作ってみました。測定も設定します。ショット数のほか、結果の取り出し方を設定し、QPUに投入まですぐできます。そして、投入が終わったかどうか確認するため、task_statusを取得します。
# ショット数なんかたくさん増やしても大丈夫らしいが1000に
shot_count = 1000
バイナリ文字列で結果を取得。そうしないと共振器電圧が得られるらしい。
res_format = QuantumResultsFormat().binary_count()
config = CompilerConfig(repeats=shot_count, results_format=res_format)
QPUTaskのオブジェクトを作成
task = QPUTask(program=qc.qasm(), config=config)
QPUに投入
task_id = client.schedule_tasks(task)[0].task_id
print(task_id)
ステータスを取得します
task_status = client.get_task_status(task_id)
print(task_status)
一応後で使うこともあるので、task_idとステータスを表示してみました。SUBMITTEDになっているので無事QPUに投入されました。
15a53b11-a602-4d48-9143-d245a88685a8
SUBMITTED
投入後に程よいところでタスクの状態を確認します。
# ステータスを取得します
task_status = client.get_task_status(task_id)
print(task_id)
print(task_status)
実際何度か試しましたが混んでなければ、一瞬で計算が終わるので待たずに計算結果を取得できます。
15a53b11-a602-4d48-9143-d245a88685a8
COMPLETED
無事計算が終わったようです。計算が終わった段階で結果を取り出します。
# 計算が終わっていれば結果を取り出します
if task_status == TaskStatus.COMPLETED.value:
schedule_result = client.get_task_results(task_id)
print(schedule_result.result)
task_idを使って結果を取得します。
{'c': {'00': 524, '01': 49, '10': 40, '11': 387}}
きちんともつれ状態が取れています。
今回はOQCのQCaaSを利用してみましたが、全く問題なく利用できました。計算も一瞬で終わりすぐに答えが返ってきます。企業向けの契約などあるようですので、ぜひ企業で利用してみてください。