blueqat cloudでIonQ, Rigettiのマシンを使う
お待たせしました! ついにblueqat cloudがIonQ, Rigettiのマシンにも対応しました!
blueqatの知識だけで簡単にゲート方式の実機を動かすことができます。
使い方はbqcloud READMEにもありますが、こちらでも簡単に説明をします。
APIの登録
まずは、APIキーを登録します。
- 初めて利用する場合など、APIキーが保存されていない場合は、次のようにAPIキーを登録することができます。(キーはローカルファイルに保存されます)
from bqcloud import register_api
api = register_api("APIキーをここに入れる")
- 既にAPIキーが保存されている場合は、次のようにAPIキーを読み込むことができます。
from bqcloud import load_api
api = load_api()
- 不特定多数がアクセスするマシンなどで、APIキーをファイルに保存したくない場合は、次のようにできます。
import bqcloud
api = bqcloud.api.Api("APIキーをここに入れる")
量子回路のクラウド経由での実行
blueqatの回路を使って、量子回路をクラウド経由で実行できます。
現状は、測定は自動で全ての量子ビットに対して行われるため、測定は回路に含めないでください。(この仕様は将来変更されたりデバイスにより変わるかもしれません)
- IonQデバイスでの実行
from blueqat import Circuit
from bqcloud import Device
# 回路, デバイス, ショット数, グループ名(オプション)
task = api.execute(Circuit().h[0].cx[0, 1], Device.IonQDevice, 10, "hello-world")
# task = api.execute(Circuit().h[0].cx[0, 1], Device.IonQDevice, 10)
# のように、グループ名は無しでも構いませんが、付けておくと後でタスクを探す場合に便利です。
- Rigettiデバイス(Aspen-9)での実行
from blueqat import Circuit
from bqcloud import Device
# 回路, デバイス, ショット数, グループ名(オプション)
task2 = api.execute(Circuit().h[0].cx[0, 1], Device.Aspen9, 10, "hello-world")
# task = api.execute(Circuit().h[0].cx[0, 1], Device.Aspen9, 10)
# のように、グループ名は無しでも構いませんが、付けておくと後でタスクを探す場合に便利です。
タスクの取扱い
ゲート型の量子コンピュータは、現時点では常時稼働はしておらず、また、実行の順番待ちなどもあります。そのため、実行が完了するのを待たずにTaskという形で一旦処理が返ってきます。
statusを見る
次のようにすることで、現在のタスクのステータスを取得できます。Status.COMPLETED
になると、結果の準備ができていることになります。
print(task.status())
Status.QUEUED
taskをupdateする
次のようにして、タスクを最新の状態に更新できます。完了後にupdateすることで、結果もタスクに取得されます。
task.update()
タスクの完了を待つ
次のようにして、タスクの完了を待ち、結果を取得することもできます。
task.wait()
にタイムアウト時間(秒)を指定すると、タイムアウトしても結果が取得できない場合はNoneを返します。
タイムアウト時間を省略、または0にすると、タスクが完了するまで待ち続けます。
# Wait 10 sec. If complete, result is returned, otherwise, None is returned.
result = task.wait(timeout=10)
if result:
print(result.shots())
else:
print("timeout")
timeout
完了済みのタスクの結果を取得する
一度完了したタスクは、次のようにしても結果を取得することができます。
# Once updated or waited after task completed, task.result() returns the result.
result = task.result()
if result:
print(result.shots())
else:
print("result is not fetched.")
result is not fetched.