Client

このセクションではアニーリングマシンのクライアントについて説明します。

クライアントクラスの概要

クライアントクラスは各イジングマシンに対するハードウェアのパラメータ取得及び設定と、問題を入力して実行を行うインターフェースを提供します。パラメータ設定は二種類あり、

  • イジングマシンへのアクセス情報の設定

  • ハードウェアの実行パラメータの設定

それぞれにパラメータへのインタフェースが分類されています。

問題の入力と実行については共通で下記の入力が可能です。

  • バイナリ二次二値多項式

  • イジング二次二値多項式

  • バイナリ行列

  • イジング行列

ただし上記は「物理模型」である必要があります。つまり、変数間の結合についてハードウェア仕様に基づいたグラフを持ち、そのグラフによっては変数間の結合に制限がある場合があります。 これらに加えて、マシンによっては独自の入力可能形式を持つ場合があります。

クライアントクラスは「物理模型」に対する直接的なソルバーとしても利用できますが、クライアントオブジェクトをソルバークラス Solver のドライバとして与えることで、ソルバークラスは「論理模型」に対するソルバーとして利用されます。後者の場合クライアントオブジェクトに対する操作はソルバークラスが代替するため、直接的に実行操作を行う必要はありません。

Note

通常の使用方法ではソルバークラスを通じて実行する手順を推奨します。 具体的な手順については Solver を参照してください。

共通インターフェース

アトリビュート

全てのクライアントは共通で下記のアトリビュートを持ちます。optional は一部のクライアントのみ提供されます。

  • num_bits : マシンの持つ物理ビット数の最小値を取得します。

  • parameters : 各クライアント特有の実行パラメータを取得します。

  • version : クライアントのバージョン情報を取得します。

  • url : APIエンドポイントのURLを取得・設定します。

  • proxy (optional) : プロキシサーバのアドレスを取得・設定します。

  • token (optional) : APIトークンを取得・設定します。

  • compression (optional) : 送信データを可能なら圧縮して転送します。

メソッド

全てのクライアントは共通で solve() メソッドを持ちます。次の入力が可能です。行列オブジェクトの入力に対して第二引数は定数項を表します。

solve() メソッドはクライアント固有の ClientResult クラスのオブジェクトを返却します。

ClientResult クラスは共通で次のアトリビュートを持ちます。optional は一部のクライアントのみ提供されます。

  • annealing_time_ms : (代表的な) 実行時間をミリ秒単位で取得します。

  • execution_parameters (optional) : 実行時パラメータを取得します。

  • timing : 実行時間オブジェクトを取得します。

  • solutions : 実行結果のリストを取得します。各要素は以下のアトリビュートを持ちます。

    • energy : エネルギー値 (物理模型の評価値) を取得します。

    • values : 物理変数の値をリストで取得します。

    • frequency : 同一の解の個数を取得します。

Note

各クライアントとその周辺クラスの詳細はクライアントリファレンス Client を参照してください。

Fixstars

名称

Fixstars Optigan

クライアントクラス

FixstarsClient

実行パラメータクラス

FixstarsClientParameters

実行結果クラス

FixstarsClientResult

実行時間クラス

FixstarsClientResultTiming

物理グラフ

全結合

物理ビット数

65536~

論理ビット数 (全結合)

65536~

APIエンドポイント (デフォルト)

N/A

実行例

from amplify import BinaryPoly, gen_symbols
from amplify.client import FixstarsClient

q = gen_symbols(BinaryPoly, 8)
f = 2 * q[0] * q[4] - q[0] - q[4] + 1

client = FixstarsClient()
client.url = "http://xxx.xxx.xxx.xxx"
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.timeout = 1000  # タイムアウト1秒

result = client.solve(f)
>>> f
2.000000 q_0 q_4 - q_0 - q_4 + 1.000000
>>> [f"energy = {s.energy}, q[0] = {s.values[0]}, q[4] = {s.values[4]}" for s in result.solutions]
['energy = 0.0, q[0] = 0, q[4] = 1']

D-Wave

名称

D-Wave SAPI

クライアントクラス

DWaveClient

実行パラメータクラス

DWaveClientQuantumSolverParameters

実行結果クラス

DWaveClientResult

実行時間クラス

DWaveClientResultTiming

物理グラフ

キメラグラフ

物理ビット数

2048 (VFYC)

論理ビット数 (全結合)

64

APIエンドポイント (デフォルト)

https://cloud.dwavesys.com/sapi

名称

D-Wave Sampler (Ocean SDK)

クライアントクラス

DWaveSamplerClient

実行パラメータクラス

DWaveSamplerClientQuantumSolverParametersOcean

実行結果クラス

DWaveSamplerClientResult

実行時間クラス

DWaveSamplerClientResultTiming

物理グラフ

キメラグラフ

物理ビット数

2048 (VFYC)

論理ビット数 (全結合)

64

APIエンドポイント (デフォルト)

https://cloud.dwavesys.com/sapi

名称

Leap Hybrid Solver (Ocean SDK)

クライアントクラス

LeapHybridSamplerClient

実行パラメータクラス

LeapHybridSamplerClientLeapHybridSolverParameters

実行結果クラス

LeapHybridSamplerClientResult

実行時間クラス

LeapHybridSamplerClientResultTiming

物理グラフ

全結合

物理ビット数

10000

論理ビット数 (全結合)

10000

APIエンドポイント (デフォルト)

https://cloud.dwavesys.com/sapi

Note

D-Wave Sampler 及び Leap Hybrid Solver を使用するには、D-Wave Ocean SDK のインストールが必要です。

Note

ソルバークラスのドライバとして使用する場合、 VFYC タイプまたは全結合のマシンのみサポートします。

アトリビュート

追加で下記のアトリビュートを持ちます。

  • solver : 利用するソルバ名を取得・設定します

  • solver_names : D-Wave クラウドで利用可能なソルバの一覧を取得します

実行例

DWaveClient

from amplify import BinaryPoly, gen_symbols
from amplify.client import DWaveClient

q = gen_symbols(BinaryPoly, 8)
f = 2 * q[0] * q[4] - q[0] - q[4] + 1

client = DWaveClient()
client.token = "XXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.solver = "DW_2000Q_VFYC_6"
client.parameters.num_reads = 100  # 実行回数

result = client.solve(f)
>>> f
2.000000 q_0 q_4 - q_0 - q_4 + 1.000000
>>> client.solver_names
['c4-sw_sample', 'DW_2000Q_VFYC_6', 'c4-sw_optimize', 'DW_2000Q_6', 'hybrid_v1']
>>> [f"energy = {s.energy}, q[0] = {s.values[0]}, q[4] = {s.values[4]}" for s in result.solutions]
['energy = 0.0, q[0] = 0, q[4] = 1',
 'energy = 0.0, q[0] = 1, q[4] = 0']

DWaveSamplerClient

from amplify import BinaryPoly, gen_symbols
from amplify.client.ocean import DWaveSamplerClient

q = gen_symbols(BinaryPoly, 8)
f = 2 * q[0] * q[4] - q[0] - q[4] + 1

client = DWaveSamplerClient()
client.token = "XXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.solver = "DW_2000Q_VFYC_6"
client.parameters.num_reads = 100  # 実行回数

result = client.solve(f)
>>> f
2.000000 q_0 q_4 - q_0 - q_4 + 1.000000
>>> [f"energy = {s.energy}, q[0] = {s.values[0]}, q[4] = {s.values[4]}" for s in result.solutions]
['energy = 0.0, q[0] = 0, q[4] = 1',
 'energy = 0.0, q[0] = 1, q[4] = 0']

LeapHybridSamplerClient

from amplify import BinaryPoly, gen_symbols
from amplify.client.ocean import LeapHybridSamplerClient

q = gen_symbols(BinaryPoly, 8)
f = 2 * q[0] * q[4] - q[0] - q[4] + 1

client = LeapHybridSamplerClient()
client.token = "XXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.solver = "hybrid_v1"
client.parameters.time_limit = 3  # タイムリミット3秒

result = client.solve(f)
>>> f
2.000000 q_0 q_4 - q_0 - q_4 + 1.000000
>>> [f"energy = {s.energy}, q[0] = {s.values[0]}, q[4] = {s.values[4]}" for s in result.solutions]
['energy = 0.0, q[0] = 0, q[4] = 1']

Fujitsu

名称

FujitsuDASolver

クライアントクラス

FujitsuDASolverClient

実行パラメータクラス

FujitsuDASolverClientParameters

実行結果クラス

FujitsuDASolverClientResult

実行時間クラス

FujitsuDASolverClientResultTiming

物理グラフ

全結合

物理ビット数

1024

論理ビット数 (全結合)

1024

APIエンドポイント (デフォルト)

https://api.aispf.global.fujitsu.com/da/

名称

FujitsuDASolver (Expert Mode)

クライアントクラス

FujitsuDASolverExpertClient

実行パラメータクラス

FujitsuDASolverExpertClientParameters

実行結果クラス

FujitsuDASolverExpertClientResult

実行時間クラス

FujitsuDASolverExpertClientResultTiming

物理グラフ

全結合

物理ビット数

1024

論理ビット数 (全結合)

1024

APIエンドポイント (デフォルト)

https://api.aispf.global.fujitsu.com/da/

名称

FujitsuDAPTSolver

クライアントクラス

FujitsuDAPTSolverClient

実行パラメータクラス

FujitsuDAPTSolverClientParameters

実行結果クラス

FujitsuDAPTSolverClientResult

実行時間クラス

FujitsuDAPTSolverClientResultTiming

物理グラフ

全結合

物理ビット数

1024

論理ビット数 (全結合)

1024

APIエンドポイント (デフォルト)

https://api.aispf.global.fujitsu.com/da/

名称

FujitsuDAMixedModeSolver

クライアントクラス

FujitsuDAMixedModeSolverClient

実行パラメータクラス

FujitsuDAMixedModeSolverClientParameters

実行結果クラス

FujitsuDAMixedModeSolverClientResult

実行時間クラス

FujitsuDAMixedModeSolverClientResultTiming

物理グラフ

全結合

物理ビット数

1024

論理ビット数 (全結合)

1024

APIエンドポイント (デフォルト)

https://api.aispf.global.fujitsu.com/da/

名称

FujitsuDA2Solver

クライアントクラス

FujitsuDA2SolverClient

実行パラメータクラス

FujitsuDA2SolverClientParameters

実行結果クラス

FujitsuDA2SolverClientResult

実行時間クラス

FujitsuDA2SolverClientResultTiming

物理グラフ

全結合

物理ビット数

8192

論理ビット数 (全結合)

8192

APIエンドポイント (デフォルト)

https://api.aispf.global.fujitsu.com/da/

名称

FujitsuDAS2olver (Expert Mode)

クライアントクラス

FujitsuDA2SolverExpertClient

実行パラメータクラス

FujitsuDA2SolverExpertClientParameters

実行結果クラス

FujitsuDA2SolverExpertClientResult

実行時間クラス

FujitsuDA2SolverExpertClientResultTiming

物理グラフ

全結合

物理ビット数

8192

論理ビット数 (全結合)

8192

APIエンドポイント (デフォルト)

https://api.aispf.global.fujitsu.com/da/

名称

FujitsuDA2PTSolver

クライアントクラス

FujitsuDA2PTSolverClient

実行パラメータクラス

FujitsuDA2PTSolverClientParameters

実行結果クラス

FujitsuDA2PTSolverClientResult

実行時間クラス

FujitsuDA2PTSolverClientResultTiming

物理グラフ

全結合

物理ビット数

8192

論理ビット数 (全結合)

8192

APIエンドポイント (デフォルト)

https://api.aispf.global.fujitsu.com/da/

名称

FujitsuDA2MixedModeSolver

クライアントクラス

FujitsuDA2MixedModeSolverClient

実行パラメータクラス

FujitsuDA2MixedModeSolverClientParameters

実行結果クラス

FujitsuDA2MixedModeSolverClientResult

実行時間クラス

FujitsuDA2MixedModeSolverClientResultTiming

物理グラフ

全結合

物理ビット数

8192

論理ビット数 (全結合)

8192

APIエンドポイント (デフォルト)

https://api.aispf.global.fujitsu.com/da/

実行例

FujitsuDA2PTSolverClient

from amplify import BinaryPoly, gen_symbols
from amplify.client import FujitsuDA2PTSolverClient

q = gen_symbols(BinaryPoly, 8)
f = 2 * q[0] * q[4] - q[0] - q[4] + 1

client = FujitsuDA2PTSolverClient()
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.number_iterations = 1000

result = client.solve(f)
>>> f
2.000000 q_0 q_4 - q_0 - q_4 + 1.000000
>>> [f"energy = {s.energy}, q[0] = {s.values[0]}, q[4] = {s.values[4]}" for s in result.solutions]
['energy = 0.0, q[0] = 0, q[4] = 1',
 'energy = 0.0, q[0] = 1, q[4] = 0']

Toshiba

名称

Toshiba SBM

クライアントクラス

ToshibaClient

実行パラメータクラス

ToshibaClientParameters

実行結果クラス

ToshibaClientResult

実行時間クラス

ToshibaClientResultTiming

物理グラフ

全結合

物理ビット数

10000

論理ビット数 (全結合)

10000

APIエンドポイント (デフォルト)

N/A

実行例

ToshibaClient

from amplify import BinaryPoly, gen_symbols
from amplify.client import ToshibaClient

q = gen_symbols(BinaryPoly, 8)
f = 2 * q[0] * q[4] - q[0] - q[4] + 1

client = ToshibaClient()
client.url = "http://xxx.xxx.xxx.xxx"
client.parameters.timeout = 1  # タイムアウト1秒

result = client.solve(f)
>>> f
2.000000 q_0 q_4 - q_0 - q_4 + 1.000000
>>> [f"energy = {s.energy}, q[0] = {s.values[0]}, q[4] = {s.values[4]}" for s in result.solutions]
['energy = 0.0, q[0] = 0, q[4] = 1']

Hitachi

名称

Hitachi CMOS annealing machine (type 4: GPU)

クライアントクラス

HitachiClient

実行パラメータクラス

HitachiClientParameters

実行結果クラス

HitachiClientResult

実行時間クラス

HitachiClientResultTiming

物理グラフ

キンググラフ

物理ビット数

262144 (512x512)

論理ビット数 (全結合)

512

APIエンドポイント (デフォルト)

https://annealing−cloud.com/api/v2/

HitachiClient

from amplify import BinaryPoly, gen_symbols
from amplify.client import HitachiClient

q = gen_symbols(BinaryPoly, 512, 512)
f = -2 * q[0][0] * q[1][1] - q[0][0] - q[1][1] + 1

client = HitachiClient()
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.temperature_num_steps = 10
client.parameters.temperature_step_length = 100
client.parameters.temperature_initial = 100.0
client.parameters.temperature_target = 0.02

result = client.solve(f)
>>> f
- 2.000000 q_0 q_513 - q_0 - q_513 + 1.000000
>>> [f"energy = {s.energy}, q[0][0] = {s.values[0]}, q[1][1] = {s.values[513]}" for s in result.solutions]
['energy = -3.0, q[0][0] = 1, q[1][1] = 1']

Note

CMOS アニーリングマシンの物理グラフはサイズ 512x512 のキンググラフです。物理模型変数のインデックス \(i\) はキンググラフ上の座標 \(x\), \(y\) について \(i = L x + y\) で与える事に注意してください。ここで \(L = 512\) はキンググラフの一辺の長さを表します。