blueqat cloudでクレジットを購入し、IonQ量子コンピュータを動かしてみる

## :dvd: この記事の目的

本記事は令和3年8月に書いています。

**blueqat cloud**(ブルーキャットクラウド)は、国内で量子コンピュータ関連ソフトウエアを開発しているベンチャー企業、blueqat株式会社(東京/渋谷)([blueqat.com](https://blueqat.com/blueqat_official_news_ja/eb9c0c75-8209-4242-8d72-c8933b47ee4d))が提供する、量子コンピュータ関連フレームワークです。

blueqat cloudを使用して、量子コンピュータ実機であるIonQ社の量子コンピュータ実機へ接続し、様々な計算を実行することができます。

ここで、**IonQ**(アイオンキューまたはイオンキュー)とは、米国のIonQ社が開発・提供するイオントラップ型量子コンピュータです。

本記事では、blueqat cloudでIonQへ接続するためのクレジットの購入と、実際に接続して計算を実行する手順を確認してみたいと思います。

なお、これに関連する記事を以前に書きましたので、以下も併せてお読み頂けると幸いです。

:paperclip: 公式英語ガイドに従い、Google CloudからIonQ量子コンピュータを実行する手順
https://qiita.com/ttabata/items/ed9a7a7688f5fc9db7f4


## :dvd: blueqat cloudの使い方

blueqat cloudは、インターネット上でクラウドサービスとして提供されている量子コンピュータ開発用フレームワークです。

このフレームワーク(ソフトウエア)はPython言語を採用しており、ブラウザを介してJupyter Notebook形式で開発などを行うことができます。

基本的な流れとしては以下となります。

　(1) blueqat cloudにアカウント登録する
　　　※個人での登録及び使用は無料
　(2) アカウントでログイン後、blueqat cloudを起動する
　(3) 起動したJupyter Notebook(実際にはJupyter Lab)画面で、新規に
　　　ノートブックファイルを起動する
　(4) 起動した画面で、Pythonモジュールであるblueqatモジュールをインポートする
　(5) プログラムを作成し、量子コンピュータ接続機能を使用して量子コンピュータに
　　　接続、計算を実行する
　(6) 返却された計算結果を確認する


手順(1)～(3)については本記事では説明を省略します。詳しい説明が必要な場合は、以下のblueqat cloudの本サイトでご確認をお願いします。

:paperclip: blueqat cloud
https://blueqat.com/


## :dvd: クレジットの購入

blueqat cloudからIonQへ接続を行うには、クレジットを購入する必要があります。
blueqat cloudではこのクレジットを使用して、IonQやその他の量子コンピュータメーカであるD-WAVE社、ハネウェル社などの量子コンピュータマシンへ接続することができます。

#### 1. クレジット購入ページを開く

1.1. クレジットの購入ページを開きます。

:paperclip: クレジット購入
https://store.blueqat.com/collections/credit

クレジット代金は為替や本家の料金改定などの影響を受けるために多少変動します。
執筆時点では、10000クレジットが500円となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/034dfce6-ee07-4c6e-8c09-0b754954612a.png)

#### 2. クレジットを購入する

2.1. 上記画面からさらに先に手続きを進めます。以下の画面のように購入を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/aacafa51-272f-418a-3c5a-c0bdc9d40be9.png)

2.2. 必要事項を入力して購入を行います。支払方法として、shop Pay, PayPal, G Pay, クレジットカード払いが利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/a42956d3-bb71-e20f-0946-e4558da2acb1.png)

2.3. 購入が完了すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/3cfcb525-11b3-66d6-fe34-3b12ac913c44.png)

#### 3. 購入したクレジットを確認する

しばらく待つと、購入したクレジットがアカウントへ反映されます。

3.1. blueqat cloudへログインします。

[https://blueqat.com/](https://blueqat.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/ca35d7a8-2e96-82ec-a8d7-e2ef25e51fb2.png)

3.2. ログイン後、アカウントのメニューから「API設定」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/50429f87-b362-74ae-c99f-da9fd559021f.png)

3.3. API Credit項目を確認すると、購入したクレジットが反映されます。
反映されていない場合は、少し時間を置いてから再度確認して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/ae0b4fe1-21cc-ec51-31ef-54972e28022d.png)

## :dvd: プログラムの作成

クレジットを購入したら、さっそくプログラムを作成します。

#### 4. blueqat cloudを起動する

4.1. blueqat cloudにログイン後、「Cloud」ボタンをクリックしノートブックを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/11ba4a3d-875c-1f70-977a-10a4fcf69c10.png)

4.2. ノートブックが起動したら、新規にファイルを作成します。以下の画像の通り、Notebookの「Python 3」を選択して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/6ebb1df5-abc2-b8ef-a816-80e2914e945d.png)

4.3. ノートブックが起動したらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/517d9ce9-a300-c548-9a69-035148822514.png)

4.4. 新規にファイル"Untitled.ipynb"が作成されるので、必要に応じてファイル名を修正します。左枠のファイル一覧にある当該ファイルを右クリックし、「Rename」を選択することでファイル名を変更できます。

#### 5. APIキーを登録する

IonQに接続する際にAPIキーが必要となります。
以下の手順でAPIキーを登録します。

なお、本手順はこちらの公式サイトにも記載されているため、併せてご確認をお願いします。

:paperclip: Blueqat cloud SDK (bqcloud)
https://github.com/Blueqat/bqcloud

5.1. 事前に「blueqat-cloud」をインストールします。
以下のプログラム文を入力し、実行してください。

```ruby:IonQTest.ipynb
!pip install blueqat-cloud
```

以下が実行例です。この場合は、すでにインストール済みの場合の実行結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f9778369-0f0c-baa1-1814-2375fdf15aa9.png)


5.2. APIキーの登録では、以下のプログラム文を入力します。

```ruby:IonQTest.ipynb
import bqcloud
api = bqcloud.register_api("Your API key here")
```

**"Your API key here"**の部分に自分のAPIキーを設定します。
APIキーは手順「3.3.」で確認した際の画面で、以下のように表示されている値を取得してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/020a6c83-77c3-027b-8895-aea7b4e6c6aa.png)

5.3. APIキーを入力後、プログラムを実行します。
実行後は、以下のファイルが作成されます。

` $HOME/.bqcloud/api_key `

なお、一度作成を実行すると、次回以降は以下のプログラム文でAPIキーを呼び出すことができます。

```ruby:IonQTest.ipynb
import bqcloud
api = bqcloud.load_api()
```

また、APIキーファイルを作成したくない場合は、以下のプログラム文でAPIキーを直接設定することも可能です。

```ruby:IonQTest.ipynb
import bqcloud
api = bqcloud.api.Api("Your API key here")
```


#### 6. プログラムを作成、実行する

6.1. 実行するプログラムを作成します。

今回実行するプログラムは以下の量子回路とします。
これはドイチ・ジョサのアルゴリズムで、バランス関数かどうかを確認する、入力xが1量子ビットの量子回路です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/0d5a5def-b6e3-90b3-44e3-94eef1a4521d.png)

blueqatでのプログラムは以下のようになります。

` task = api.execute(Circuit().x[1].h[:].cx[0,1].x[1].h[:], Device.IonQDevice, 10) `

上記のapi.executeのパラメータは以下となります。

**api.execute(回路, デバイス名(量子コンピュータの指定), ショット数, グループ名(オプション))**


6.2. プログラムを実行します。今回実行するプログラムを以下に示します。

```ruby:IonQTest.ipynb
import bqcloud
from blueqat import Circuit
from bqcloud import Device

api = bqcloud.load_api()

# 実行するプログラム
task = api.execute(Circuit().x[1].h[:].cx[0,1].x[1].h[:], Device.IonQDevice, 10)
```

#### 7. 実行結果を確認する

実行結果の確認コマンドはいくつかあります。

7.1. 以下のコマンドで実行ステータスを確認します。

```ruby:IonQTest.ipynb
print(task.status())
```

ステータス結果には、以下があります。
　**Status.QUEUED**　処理実行中
　**Status.COMPLETED**　処理完了

7.2. 以下のコマンドで、最新のステータスを取得します。

```ruby:IonQTest.ipynb
task.update()
```

7.3. さらに、以下のコマンドで処理の実行結果を待機及び結果の取得を行うことができます。

```ruby:IonQTest.ipynb
result = task.wait(timeout=10)
if result:
    print(result.shots())
else:
    print("timeout")
```

上記で、task.wait()にタイムアウト時間(秒)を指定すると、タイムアウトしても結果が取得できない場合はNoneを返します。タイムアウト時間を省略、または0にすると、タスクが完了するまで待ち続けます。


7.4. 一度完了した処理を次のようにして、結果を取得することができます。

```ruby:IonQTest.ipynb
result = task.result()
if result:
    print(result.shots())
else:
    print("result is not fetched")
```

今回の実行結果は以下となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4592677e-46b6-86ff-14d0-5399da19a86e.png)

ドイチ・ジョサのアルゴリズムによると、入力のうち、第一量子ビットがf(0)、第二量子ビットがf(1)となります。

結果を見ると、f(0)の値が1,f(1)の値が0なので、バランス関数であることが確認できました。


## :dvd: 関連情報

:paperclip: 公式英語ガイドに従い、Google CloudからIonQ量子コンピュータを実行する手順
https://qiita.com/ttabata/items/ed9a7a7688f5fc9db7f4

:paperclip: Blueqat cloud SDK (bqcloud)
https://github.com/Blueqat/bqcloud


## :dvd: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。