量子コンピュータ¶
量子コンピュータのクライアントでは、QAOA に代表される量子アルゴリズムで最適化計算を実行します。
クラウドサービスとして提供されている各種量子コンピュータ及びローカルシミュレータを利用して、量子回路を実行します。
Tip
ローカルシミュレータを使うクライアントは登録不要で利用できます。
その他のクライアントでは、量子コンピューティングサービスを提供する各ベンダーとの契約が必要です。
ヒント
量子コンピュータを利用する場合は、以下のコマンドで追加パッケージを含む Amplify をインストールしてください。
$ python3 -m pip install -U 'amplify[quantum]'
注意
Python のバージョンによっては追加パッケージが対応していないことがあります。動作確認済み環境を参照してください。
利用に必要な手順はクライアントごとに異なります。
クラウド API を利用するクライアントでは、保有しているライセンスを使って認証を行う必要があります。
クライアントクラス |
種別 |
事前準備 |
|---|---|---|
💻 Local |
なし |
|
💻 Local |
なし |
|
💻 Local |
なし |
|
☁️ Cloud |
Fixstars Amplify のユーザ登録で取得できる無償のお試し API トークンまたは、自身の QUDORA Cloud アカウントで取得した API トークンが必要 |
|
☁️ Cloud |
IBM Cloud アカウントで取得した IBM Quantum API キーが必要 |
|
☁️ Cloud |
AWS アカウントでの認証が必要 |
また、量子コンピュータ向けのクライアントでは、初期化時にアルゴリズムを指定する必要があります。
入力できる問題の変数型や次数は、選択したアルゴリズムに依存します。
クライアントの引数で QAOA が設定されている場合
バイナリ変数
イジング変数
整数変数
実数変数
目的関数
-
N次*
-
-
等式制約
-
**
-
-
不等式制約
-
-
-
-
*: 任意次数の問題を求解できます。ただし、量子コンピュータのビットの接続によっては必要な量子ビットが増えることがあります。
クライアントの引数で RQAOA が設定されている場合
バイナリ変数
イジング変数
整数変数
実数変数
目的関数
-
N次*
-
-
等式制約
-
-
-
-
不等式制約
-
-
-
-
*: 任意次数の問題を求解できます。ただし、量子コンピュータのビットの接続によっては必要な量子ビットが増えることがあります。
量子コンピュータクライアントはクライアントクラスの共通インターフェースに加えて、それぞれの量子コンピュータ/シミュレータ固有のパラメータを設定することができます。
同じアルゴリズムを選択したソルバークライアントでは、client.parametersから同じパラメータを取得および設定できます。パラメータや解情報の詳細はアルゴリズムの詳細 を参照してください。
- 設定例:
QAOAを Qulacs Simulator を使って動かすクライアントを例として以下のように作成します。
from amplify import QAOA, QulacsClient # アルゴリズムを表すクラス QAOA と バックエンドを表すクラス QulacsClient を組み合わせてソルバークライアントを作成 client = QulacsClient(QAOA) # QAOAのreps, shotsを設定 client.parameters.reps = 1 client.parameters.shots = 100
- 実行例:
from amplify import Model, VariableGenerator, solve # 決定変数と目的関数を定義 g = VariableGenerator() q = g.array("Binary", 2) f = q[0] * q[1] + q[0] - q[1] + 1 # モデルを作成 model = Model(f) # ソルバーを実行 result = solve(model, client)
バックエンドのバージョンを取得:
>>> client.version() '0.6.13'
実行時間を取得:
>>> d = result.client_result.durations >>> result.total_time # amplify.solveにかかった時間 datetime.timedelta(microseconds=26152) >>> d.total_time # QAOA 全体の経過時間 datetime.timedelta(microseconds=25779) >>> d.total_response_time # QPU との通信時間の合計 datetime.timedelta(microseconds=283) >>> d.total_execution_time # QPU での実行時間の合計 datetime.timedelta(microseconds=283) >>> d.classical_processing_time # 古典最適化にかかった時間 (= total_time - total_response_time) datetime.timedelta(microseconds=25496)
量子回路の取得:
>>> print(result.client_result.history[0].sampling_meta.circuit)
バックエンドによって回路オブジェクトの型は異なります。
サンプリング結果の解釈:
>>> sorted_counts = sorted(result.client_result.optimized_counts, key=lambda x: x[1], reverse=True) >>> for sol, freq in sorted_counts[:5]: ... values = q.substitute( ... { ... k: p.substitute( ... {v: sol[v.id] for v in result.intermediate.model.get_variables()} ... ) ... for k, p in result.intermediate.mapping.items() ... } ... ) ... print(f"解: {values}, 出現回数: {freq}") 解: [0, 1], 出現回数: 76 解: [0, 0], 出現回数: 17 解: [1, 0], 出現回数: 4 解: [1, 1], 出現回数: 3