量子コンピュータ¶
量子コンピュータのクライアントでは、QAOA に代表される量子アルゴリズムで最適化計算を実行します。
クラウドサービスとして提供されている各種量子コンピュータ及び、ローカルシミュレータを利用して量子回路を実行します。
Tip
ローカルシミュレータを使うクライアントは登録不要で利用できます。
その他のクライアントでは量子コンピューティングサービスを提供する各ベンダー等と自身での契約が必要です。
ヒント
量子コンピュータを使う場合は、次のコマンドで追加のパッケージを含めてインストールしてください。
$ python3 -m pip install -U 'amplify[extra]'
注意
Python のバージョンによっては追加パッケージが対応していないことがあります。動作確認済み環境を参照してください。
利用に必要な手順はクライアントごとに異なります。
クラウドAPIを利用するクライアントでは自身の保有するライセンスを用いての認証が必要になります。
クライアントクラス |
種別 |
利用に必要な手順 |
|---|---|---|
💻 Local |
なし |
|
💻 Local |
なし |
|
💻 Local |
なし |
|
☁️ Cloud |
自身の IBM Cloud Platform アカウントで取得可能な IBM Quantum API キーの設定 |
|
☁️ Cloud |
Amazon Braketを契約した自身の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