量子コンピュータ

量子コンピュータのクライアントでは、QAOA に代表される量子アルゴリズムで最適化計算を実行します。

クラウドサービスとして提供されている各種量子コンピュータ及び、ローカルシミュレータを利用して量子回路を実行します。

Tip

ローカルシミュレータを使うクライアントは登録不要で利用できます。

その他のクライアントでは量子コンピューティングサービスを提供する各ベンダー等と自身での契約が必要です。

ヒント

量子コンピュータを使う場合は、次のコマンドで追加のパッケージを含めてインストールしてください。

$ python3 -m pip install -U 'amplify[extra]'

注意

Python のバージョンによっては追加パッケージが対応していないことがあります。動作確認済み環境を参照してください。

利用に必要な手順はクライアントごとに異なります。

クラウドAPIを利用するクライアントでは自身の保有するライセンスを用いての認証が必要になります。

クライアントクラス

種別

利用に必要な手順

QulacsClient

💻 Local

なし

AerClient

💻 Local

なし

BraketSimulatorClient

💻 Local
☁️ Cloud

なし
ただし、クラウドシミュレータの利用にはAmazon Braketを契約した自身のAWSアカウントでの認証が必要

IBMClient

☁️ Cloud

自身の IBM Cloud Platform アカウントで取得可能な IBM Quantum API キーの設定

AQTClient IonQClient IQMClient RigettiClient

☁️ Cloud

Amazon Braketを契約した自身のAWSアカウントでの認証

また、ゲート式量子コンピュータのクライアントでは初期化時にアルゴリズムを指定する必要があります。

入力可能な問題の変数型や次数は選択するアルゴリズムに依存します。

  • クライアントの引数で QAOA が設定されている場合

    バイナリ変数

    イジング変数

    整数変数

    実数変数

    目的関数

    -

    N次*

    -

    -

    等式制約

    -

    **

    -

    -

    不等式制約

    -

    -

    -

    -

    *: 任意次数の問題を求解できます。ただし、量子コンピュータのビットの接続によっては必要な量子ビットが増えることがあります。

    **: QAOA の種別制約付き QAOAが選ばれた場合 N-HOT 制約に対応しています。

  • クライアントの引数で 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