# ソルバークライアント Amplify SDK からソルバーを実行するには、各ソルバーを抽象化したソルバークライアントを作成します。そして、接続先、API トークン、実行パラメータなどを指定します。また、ソルバークライアントは対応関係にあるソルバーの扱える変数の種類、制約条件の有無、次数などの機能の情報を持ちます。Amplify SDK はこれを利用して **変数変換**、**次数下げ**、**制約条件の実装**、**ハードウェアトポロジーへの埋め込み** などの **モデル変換** を自動で行います。 ## ソルバークライアントの構成 Amplify Annealing Engine (AE) を例として、クライアント {py:class}`~amplify.AmplifyAEClient` を次のように作成します。 ```{testcode} from amplify import AmplifyAEClient client = AmplifyAEClient() ``` ```{tip} Amplify AE は[ユーザ登録](https://amplify.fixstars.com/register)を行うと無償の API トークンを入手できます。 ``` クライアントクラスのほとんどのパラメータは、構築後はソルバーのデフォルト値で初期化 (または未設定) されています。そのため、クライアントごとの必須パラメータを設定すればすぐに使えます。設定が必須のパラメータはクライアントによって異なりますが、多くのクラウド型ソルバーでは API トークンが必要です。`token` アトリビュートに設定します。 ```{testcode} client.token = "YOUR_API_TOKEN" ``` 全てのクライアントにおいて、ソルバーの実行パラメータの取得と設定は `parameters` プロパティ内のアトリビュートに設定します。設定項目は可能な限りソルバーの API に即しているため、詳細は下記の各ソルバーのリファレンスを参照してください。 たとえば Amplify AE では、実行時間を次のように設定します。 ```{testcode} from datetime import timedelta client.parameters.time_limit_ms = timedelta(milliseconds=1000) # 1000 ミリ秒 ``` ```{tip} 各クライアントのパラメータごとに時間の単位や時刻のフォーマットが異なるため、Amplify SDK では {py:mod}`datetime` モジュールを利用して入出力できるようになっています。 ``` クライアントクラスに設定したパラメータは、{py:class}`str` や {py:func}`print` 関数によって文字列として表示できます。 ```{doctest} >>> print(client) # doctest: +NORMALIZE_WHITESPACE {"url":"https://optigan.fixstars.com","token":"***","compression":true,"objective_format":"Auto","solver":"Constraint","parameters":{"time_limit_ms":1000.0}} ``` ```{note} トークンなどの認証情報は、意図せずに漏洩することを防ぐため `***` として表示されます。表示だけが隠されるので、値自体は {py:attr}`~amplify.FixstarsClient.token` で従来通り取得できます。 ``` 一部のパラメータでは {py:obj}`None` を設定すると、未設定つまりソルバーのデフォルト値が使用されます。 ```{testcode} client.parameters.time_limit_ms = None # ソルバーのデフォルト値にリセット ``` ## ソルバークライアントの一覧 (solver-clients)= Amplify SDK は下記のソルバー・マシンに対応しています。 ``````{grid} 2 :gutter: 3 `````{grid-item-card} [Fixstars Amplify Annealing Engine](https://amplify.fixstars.com/ja/engine) ````{button-ref} amplify.AmplifyAEClient :expand: amplify.AmplifyAEClient ```` ^^^ {bdg-problem}`PCBO-4th` {bdg-problem}`PUBO-4th` {bdg-problem}`QUBO` {bdg-processor}`GPU` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Documents`](amplify_ae.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-AmplifyAEClient) ``` ```` ````` `````{grid-item-card} [D-Wave Advantage2](https://www.dwavequantum.com/solutions-and-products/systems/) ````{button-ref} amplify.DWaveSamplerClient :expand: amplify.DWaveSamplerClient ```` ^^^ {bdg-problem}`QUBO` {bdg-problem}`Ising` {bdg-processor}`QPU` {bdg-qpu-type}`Annealing-Superconducting` {bdg-env}`☁️ Cloud` {bdg-graph}`Pegasus Graph` {bdg-graph}`Zephyr Graph` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Parameter Reference`](https://docs.dwavequantum.com/en/latest/quantum_research/solver_parameters.html#qpu-solver-parameters) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-DWaveSamplerClient) ``` ```` ````` `````{grid-item-card} [Leap's Hybrid BQM Solver](https://www.dwavequantum.com/solutions-and-products/cloud-platform/) ````{button-ref} amplify.LeapHybridSamplerClient :expand: amplify.LeapHybridSamplerClient ```` ^^^ {bdg-problem}`QUBO` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Annealing-Superconducting` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Parameter Reference`](https://docs.dwavequantum.com/en/latest/industrial_optimization/solver_bqm_parameters.html) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-LeapHybridSamplerClient) ``` ```` ````` `````{grid-item-card} [Leap's Hybrid CQM Solver](https://www.dwavequantum.com/solutions-and-products/cloud-platform/) ````{button-ref} amplify.LeapHybridCQMSamplerClient :expand: amplify.LeapHybridCQMSamplerClient ```` ^^^ {bdg-problem}`MIP` {bdg-problem}`QUBO` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Annealing-Superconducting` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Parameter Reference`](https://docs.dwavequantum.com/en/latest/industrial_optimization/solver_cqm_parameters.html) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-LeapHybridCQMSamplerClient) ``` ```` ````` `````{grid-item-card} [Fujitsu DA4 Solver](https://www.fujitsu.com/jp/digitalannealer/) ````{button-ref} amplify.FujitsuDA4Client :expand: amplify.FujitsuDA4Client ```` ^^^ {bdg-problem}`QUBO` {bdg-processor}`GPU` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 API Reference`](https://portal.aispf.global.fujitsu.com/apidoc/da/jp/api-ref/da-qubo-v4-ja.html) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-FujitsuDA4Client) ``` ```` ````` `````{grid-item-card} [Fujitsu DA3c Solver](https://www.fujitsu.com/jp/digitalannealer/) ````{button-ref} amplify.FujitsuDA3cClient :expand: amplify.FujitsuDA3cClient ```` ^^^ {bdg-problem}`QUBO` {bdg-processor}`GPU` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 API Reference`](https://portal.aispf.global.fujitsu.com/apidoc/da/jp/api-ref/da-qubo-v3c-ja.html) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-FujitsuDA3cClient) ``` ```` ````` `````{grid-item-card} [TOSHIBA SQBM+ V2](https://www.global.toshiba/jp/products-solutions/ai-iot/sbm.html) ````{button-ref} amplify.ToshibaSQBM2Client :expand: amplify.ToshibaSQBM2Client ```` ^^^ {bdg-problem}`QUBO` {bdg-problem}`PUBO-4th` {bdg-processor}`GPU` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 User Guide (v2.0.3)`](/../_static/User_Manual-SQBM+_for_On-premises.pdf) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-ToshibaSQBM2Client) ``` ```` ````` `````{grid-item-card} [Hitachi Annealing Cloud Web](https://annealing-cloud.com/ja/index.html) ````{button-ref} amplify.HitachiClient :expand: amplify.HitachiClient ```` ^^^ {bdg-problem}`Ising` {bdg-processor}`GPU` {bdg-env}`☁️ Cloud` {bdg-graph}`King Graph` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 API Reference`](https://annealing-cloud.com/ja/web-api/reference/v2.html) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-HitachiClient) ``` ```` ````` `````{grid-item-card} [Gurobi Optimization](https://www.gurobi.com/) ````{button-ref} amplify.GurobiClient :expand: amplify.GurobiClient ```` ^^^ {bdg-problem}`MIP` {bdg-processor}`CPU` {bdg-env}`💻 Local` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Reference Manual`](https://www.gurobi.com/documentation/current/refman/index.html) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](#clients-GurobiClient) ``` ```` ````` `````{grid-item-card} [Aer Simulator](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator.html) ````{button-ref} amplify.AerClient :expand: amplify.AerClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`CPU` {bdg-processor}`GPU` {bdg-qpu-type}`Gate-Simulator` {bdg-env}`💻 Local` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/aer.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [AQT](https://www.aqt.eu/) ````{button-ref} amplify.AQTClient :expand: amplify.AQTClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Gate-Trapped-ion` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/aqt.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [Amazon Braket Simulator](https://aws.amazon.com/braket/) ````{button-ref} amplify.BraketSimulatorClient :expand: amplify.BraketSimulatorClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`CPU` {bdg-processor}`GPU` {bdg-qpu-type}`Gate-Simulator` {bdg-env}`💻 Local` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/aws.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [IBM Quantum](https://quantum.cloud.ibm.com/) ````{button-ref} amplify.IBMClient :expand: amplify.IBMClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Gate-Superconducting` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/ibm.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [IonQ](https://ionq.com/) ````{button-ref} amplify.IonQClient :expand: amplify.IonQClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Gate-Trapped-ion` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/ionq.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [IQM](https://www.meetiqm.com/) ````{button-ref} amplify.IQMClient :expand: amplify.IQMClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Gate-Superconducting` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/iqm.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [Qulacs Simulator](http://docs.qulacs.org/) ````{button-ref} amplify.QulacsClient :expand: amplify.QulacsClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Gate-Simulator` {bdg-env}`💻 Local` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/qulacs.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [Rigetti](https://www.rigetti.com/) ````{button-ref} amplify.RigettiClient :expand: amplify.RigettiClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Gate-Superconducting` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/rigetti.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [QUDORA](https://qudora.com/) ````{button-ref} amplify.QUDORAClient :expand: amplify.QUDORAClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Gate-Trapped-ion` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/qudora.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````{grid-item-card} [OQTOPUS](https://oqtopus-cloud.readthedocs.io/) ````{button-ref} amplify.OqtopusClient :expand: amplify.OqtopusClient ```` ^^^ {bdg-problem}`PUBO-Nth` {bdg-problem}`Ising` {bdg-processor}`Hybrid` {bdg-qpu-type}`Gate-Superconducting` {bdg-qpu-type}`Gate-Simulator` {bdg-env}`☁️ Cloud` +++ ````{grid} 2 :margin: 0 :padding: 0 ```{grid-item} :margin: 0 :padding: 0 0 2 2 [{bdg-info}`📖 Document`](quantum/samplers/oqtopus.md) ``` ```{grid-item} :margin: 0 :padding: 0 0 2 2 :class: sd-text-right [Learn more »](clients/quantum_algorithm.md) ``` ```` ````` `````` --- {bdg-problem}`PCBO-Nth` {bdg-problem}`PUBO-Nth` {bdg-problem}`QUBO` {bdg-problem}`Ising` {bdg-problem}`MIP` : ソルバーが直接扱える問題の種類を表します。 - {bdg-problem}`PCBO-Nth` バイナリ変数の $N$ 次多項式の目的関数と $N$ 次多項式の制約条件を扱えるソルバーです。 - {bdg-problem}`PUBO-Nth` バイナリ変数の $N$ 次多項式の目的関数を求解できるソルバーです。制約条件は扱えません。 - {bdg-problem}`QUBO` バイナリ変数の二次多項式の目的関数を求解できるソルバーです。基本的には制約条件は扱えませんが、ソルバーによっては等式制約、不等式制約の入力に対応しています。 - {bdg-problem}`Ising` イジング変数の二次多項式の目的関数を求解できるソルバーです。基本的には制約条件は扱えませんが、ソルバーによっては等式制約、不等式制約の入力に対応しています。 - {bdg-problem}`MIP` 混合整数計画問題を求解できるソルバーです。バイナリ変数、整数変数と実数変数を扱うことができます。 一般的には1 次の問題 (線形計画問題) を対象としていますが、QUBO を含む2 次の問題を扱うことができるソルバーもあります。 ```{note} Amplify SDK は、ソルバーが直接扱えない問題に対して、自動で変数変換や次数下げ、制約条件のペナルティ関数の生成といった変換を行います。そのため、ユーザが自身でソルバーが直接扱える形式の問題を作成する必要は必ずしもありません。ただし、ソルバーの種類や入力するモデルの種類によっては、未対応であったり、厳密な定式化にならないことがあります。詳細は [](conversion.md) を参照してください。 ``` {bdg-graph}`Graph` : ソルバーに入力できる 2 次の項を表します。これらのタグがついていないソルバーには、2 次の項に関する制限はありません。そうでないソルバーは、与えられる 2 次の項に制限があり、任意の二次多項式を解くためにはグラフ埋め込みと呼ばれる操作が必要です。扱える問題のサイズは、ソルバーに入力可能な変数の数 $N$ に対して最悪ケースで $O\left( \sqrt N \right)$ 程度になります。詳細は「[](graph.md)」を参照してください。 {bdg-processor}`CPU` {bdg-processor}`GPU` {bdg-processor}`QPU` {bdg-processor}`Hybrid` : マシンの動作する演算装置の種類を表します。Hybrid は QPU とその他の技術のハイブリッドソルバーであることを表します。 {bdg-qpu-type}`Annealing-XXX` {bdg-qpu-type}`Gate-XXX` : QPU または Hybrid ソルバーについてその方式を表します。 - {bdg-qpu-type}`Annealing-Superconducting` 量子アニーリング方式・超伝導量子ビットのソルバーです。 - {bdg-qpu-type}`Gate-Superconducting` ゲート型・超伝導量子ビットのソルバーです。 - {bdg-qpu-type}`Gate-Trapped-ion` ゲート型・イオントラップ方式のソルバーです。 - {bdg-qpu-type}`Gate-Neutral-atom` ゲート型・中性原子方式のソルバーです。 - {bdg-qpu-type}`Gate-Simulator` ゲート型・量子コンピュータシミュレータのソルバーです。 {bdg-env}`☁️ Cloud` {bdg-env}`💻 Local` : クラウドサービスとして提供されるソルバーなのか、ユーザのマシンにインストールする必要があるソルバーなのかを表します。