Client
このセクションではイジングマシンのクライアントについて説明します。
参考
クライアントクラスの具体的な使用方法は Solver を参照してください。
クライアントクラスの概要
クライアントクラスは各イジングマシンを使用する際のパラメータ取得と設定、マシンの実行を行うインターフェースを提供します。通常は、クライアントクラスのオブジェクトをソルバークラス Solver
のドライバとして与えることで、クライアントに対応したマシンを実行する「論理模型」のソルバーとして利用されます。詳細と実行例については、Solver または下記の 各クライアントの実行例 を参照してください。
注釈
クライアントクラス自体も「物理模型」に対するソルバーとして利用できますが(詳細については 物理模型ソルバー を参照)、ソルバークラスを経由した使用を推奨します。
クライアントクラスで設定できるパラメータには二種類あります。
イジングマシンのアクセス情報や実行に対する設定
クライアントクラスのアトリビュートで提供されます。アクセス先の URL や API トークンを設定します。一部のクライアントでは通信データの圧縮設定や送信データの構築方法に関する設定を持ちます。
イジングマシンの実行パラメータの設定
クライアントクラスの
parameters
アトリビュートで提供されます。マシンの API 仕様に準じた実行パラメータ設定を行います。
参考
クライアントクラスとその周辺クラスの詳細についてはクライアントリファレンス Client を参照してください。
Fixstars
Amplify AE クライアントクラス
詳細については Fixstars client reference の各項目を参照してください。
名称 |
Fixstars Amplify Annealing Engine |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
262144 |
論理ビット数 (全結合) |
131072 |
API URL (デフォルト) |
Amplify AE クライアントアトリビュート
Name |
Description |
---|---|
実行可能な変数の最大値を取得します |
|
実行パラメータ |
|
実行マシンのバージョン文字列を取得します |
|
API URL を取得・設定します |
|
プロキシサーバのアドレスを取得・設定します |
|
APIトークンを取得・設定します |
|
送信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
受信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
送信データを圧縮するかを指定します。デフォルトは |
Amplify AE クライアントの実行例
from amplify import BinarySymbolGenerator, Solver
from amplify.client import FixstarsClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = FixstarsClient()
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.timeout = 1000 # タイムアウト1秒
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
D-Wave
注釈
D-Wave Sampler 及び Leap Hybrid Solver を使用するには、dwave-system パッケージのインストールが必要です。次のように Amplify SDK をインストールすると依存パッケージも同時にインストールされます。
$ pip install amplify[extra]
D-Wave クライアントクラス
詳細については D-Wave client reference の各項目を参照してください。
名称 |
D-Wave Sampler (Ocean SDK) |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
ゼファーグラフ (Advantage2_prototype1.1), ペガサスグラフ (Advantage_system4.1, Advantage_system6.3) |
物理ビット数 |
563 (Advantage2_prototype1.1), 5627 (Advantage_system4.1), 5614 (Advantage_system6.3) |
論理ビット数 (全結合) |
52 (Advantage2_prototype1.1), 177 (Advantage_system4.1), 175 (Advantage_system6.3) |
API URL (デフォルト) |
名称 |
Leap Hybrid Solver (Ocean SDK) |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
1000000 |
論理ビット数 (全結合) |
1000000 |
API URL (デフォルト) |
D-Wave クライアントアトリビュート
Name |
Description |
---|---|
|
実行可能な変数の最大値を取得します
|
|
実行パラメータを取得します
|
|
プロキシサーバのアドレスを取得・設定します |
|
実行するソルバー名を取得・設定します
|
|
使用可能なソルバー名のリストを取得します |
|
APIトークンを取得・設定します |
|
API URL を取得・設定します |
|
実行マシン名とそのバージョン文字列を取得します |
D-Wave クライアントの実行例
D-Wave Sampler クライアント
from amplify import BinarySymbolGenerator, Solver
from amplify.client.ocean import DWaveSamplerClient
client = DWaveSamplerClient()
client.token = "XXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# 実行するソルバーを指定 (使用可能ソルバーは solver_names で取得)
client.solver = "Advantage_system4.1"
client.parameters.num_reads = 100 # 実行回数
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
token
を設定することで、トークンに紐付いた使用可能なソルバー名のリストを以下のように取得できます。
>>> client.solver_names
['Advantage_system4.1', 'Advantage_system6.3', 'Advantage2_prototype1.1']
D-Wave Leap Hybrid Solver クライアント
from amplify import BinarySymbolGenerator, Solver
from amplify.client.ocean import LeapHybridSamplerClient
client = LeapHybridSamplerClient()
client.token = "XXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# 実行するソルバーを指定 (使用可能ソルバーは solver_names で取得)
client.solver = "hybrid_binary_quadratic_model_version2"
client.parameters.time_limit = 3 # タイムリミット3秒
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
DwaveSamplerClient
と同様に、使用可能なソルバーのリストは以下のように取得できます。
>>> client.solver_names
['hybrid_binary_quadratic_model_version2']
Fujitsu
Fujitsu クライアントクラス
詳細については Fujitsu client reference の各項目を参照してください。
名称 |
FujitsuDASolver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
1024 |
論理ビット数 (全結合) |
1024 |
API URL (デフォルト) |
名称 |
FujitsuDASolver (Expert Mode) |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
1024 |
論理ビット数 (全結合) |
1024 |
API URL (デフォルト) |
名称 |
FujitsuDAPTSolver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
1024 |
論理ビット数 (全結合) |
1024 |
API URL (デフォルト) |
名称 |
FujitsuDAMixedModeSolver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
1024 |
論理ビット数 (全結合) |
1024 |
API URL (デフォルト) |
名称 |
FujitsuDA2Solver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
8192 |
論理ビット数 (全結合) |
8192 |
API URL (デフォルト) |
名称 |
FujitsuDA2Solver (Expert Mode) |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
8192 |
論理ビット数 (全結合) |
8192 |
API URL (デフォルト) |
名称 |
FujitsuDA2PTSolver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
8192 |
論理ビット数 (全結合) |
8192 |
API URL (デフォルト) |
名称 |
FujitsuDA2MixedModeSolver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
8192 |
論理ビット数 (全結合) |
8192 |
API URL (デフォルト) |
名称 |
FujitsuDA3Solver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
100000 |
論理ビット数 (全結合) |
100000 |
API URL (デフォルト) |
名称 |
FujitsuDA4Solver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
100000 |
論理ビット数 (全結合) |
100000 |
API URL (デフォルト) |
Fujitsu クライアントアトリビュート
Name |
Description |
---|---|
|
実行可能な変数の最大値を取得します |
|
実行パラメータ を取得します
|
|
API URL を取得・設定します |
|
プロキシサーバのアドレスを取得・設定します |
|
APIトークンを取得・設定します |
送信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
受信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
|
実行マシンのAPIバージョン文字列を取得します |
|
|
|
|
|
|
|
Fujitsu クライアントの実行例
FujitsuDA2PTSolverClient
from amplify import BinarySymbolGenerator, Solver
from amplify.client import FujitsuDA2PTSolverClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = FujitsuDA2PTSolverClient()
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.number_iterations = 1000
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
注釈
FujitsuDA と FujitsuDA2 の各種クライアントのパラメータの詳細については、 Digital Annealer API リファレンス (QUBO API V2) の Schemas の該当箇所を参照してください。
FujitsuDA3SolverClient
from amplify import BinarySymbolGenerator, Solver
from amplify.client import FujitsuDA3SolverClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = FujitsuDA3SolverClient()
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.time_limit_sec = 1 # タイムリミット1秒
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]',
'energy = 0.0, q = [1. 0. 0.]',
'energy = 0.0, q = [0. 1. 1.]',
'energy = 1.0, q = [0. 0. 0.]']
注釈
FujitsuDA3SolverClient
のパラメータの詳細については、 Digital Annealer API リファレンス (QUBO API V3) の FujitsuDA3Solver Schemas を参照してください。
FujitsuDA4SolverClient
from amplify import BinarySymbolGenerator, Solver
from amplify.client import FujitsuDA4SolverClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = FujitsuDA4SolverClient()
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.time_limit_sec = 1 # タイムリミット1秒
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]',
'energy = 0.0, q = [1. 0. 0.]',
'energy = 0.0, q = [0. 1. 1.]',
'energy = 1.0, q = [0. 0. 0.]']
注釈
FujitsuDA4SolverClient
のパラメータの詳細については、 Digital Annealer API リファレンス (QUBO API V4) の FujitsuDA4Solver Schemas を参照してください。
Toshiba
Toshiba クライアントクラス
詳細については Toshiba client reference の各項目を参照してください。
名称 |
Toshiba SQBM+ |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
100000 |
論理ビット数 (全結合) |
100000 |
API URL (デフォルト) |
N/A |
名称 |
Toshiba SQBM+ (version 2.0.0 ~) |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
100000 |
論理ビット数 (全結合) |
100000 |
API URL (デフォルト) |
N/A |
Toshiba クライアントアトリビュート
Name |
Description |
---|---|
実行可能な変数の最大値を取得します |
|
実行パラメータ を取得します |
|
API URL を取得・設定します |
|
プロキシサーバのアドレスを取得・設定します |
|
APIトークンを取得・設定します |
|
送信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
受信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
実行マシンのバージョン文字列を取得します |
ToshibaSQBM2Client クライアントアトリビュート
ToshibaSQBM2Client でのみ使用可能なアトリビュートは以下の通りです。
Name |
Description |
---|---|
送信データのファイルフォーマットを |
Toshiba クライアントの実行例
ToshibaClient
from amplify import BinarySymbolGenerator, Solver
from amplify.client import ToshibaClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = ToshibaClient()
client.url = "http://xxx.xxx.xxx.xxx:xxxx/"
client.parameters.loops = 0 # not specify the number of loops (only timeout will be used)
client.parameters.timeout = 1 # timeout 1 second
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
注釈
Toshiba SBM の詳細については Simulated Bifurcation Machine (SBM) User Manual を参照ください。
ToshibaSQBM2Client
from amplify import BinarySymbolGenerator, Solver
from amplify.client import ToshibaSQBM2Client
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = ToshibaSQBM2Client()
client.url = "http://xxx.xxx.xxx.xxx:xxxx/"
client.parameters.loops = 0 # not specify the number of loops (only timeout will be used)
client.parameters.timeout = 1 # timeout 1 second
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
Hitachi
Hitachi クライアントクラス
詳細については Hitachi client reference の各項目を参照してください。
名称 |
Hitachi CMOS annealing machine (type 4: GPU) |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
キンググラフ |
物理ビット数 |
262144 (512x512) |
論理ビット数 (全結合) |
512 |
API URL (デフォルト) |
Hitachi クライアントアトリビュート
Name |
Description |
---|---|
実行可能な変数の最大値を取得します |
|
実行パラメータ |
|
API URL を取得・設定します |
|
プロキシサーバのアドレスを取得・設定します |
|
APIトークンを取得・設定します |
|
送信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
受信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
実行マシンのAPIバージョン文字列を取得します |
Hitachi クライアントの実行例
HitachiClient
from amplify import BinarySymbolGenerator, Solver
from amplify.client import HitachiClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 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
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
注釈
Hitachi CMOS annealing machine の詳細については APIリファレンス V2 を参照ください。
Hiroshima Univ. / NTT DATA
ABS クライアントクラス
詳細については ABS client reference の各項目を参照してください。
名称 |
ABS QUBO Solver |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
32768 |
論理ビット数 (全結合) |
32768 |
API URL (デフォルト) |
ABS クライアントアトリビュート
Name |
Description |
---|---|
実行可能な変数の最大値を取得します |
|
実行パラメータ |
|
API URL を取得・設定します |
|
プロキシサーバのアドレスを取得・設定します |
|
ユーザIDを取得・設定します |
|
パスワードを取得・設定します |
|
送信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
受信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
実行マシンのAPIバージョン文字列を取得します |
ABS クライアントの実行例
ABSClient
from amplify import BinarySymbolGenerator, Solver
from amplify.client import ABSClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = ABSClient()
client.user_name = "xxxx"
client.password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.timeout = 10
client.parameters.word_size = 16
client.parameters.arithmetic_precision = 32
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
注釈
ABS QUBO Solver の詳細については https://qubo.cs.hiroshima-u.ac.jp/solver-trial を参照ください。
Gurobi
注釈
Gurobi Client を使用するには、お使いのコンピュータに Gurobi のソフトウェアおよびライセンスが適切にインストールされていることが必要です。
Gurobi クライアントクラス
詳細については gurobi client reference の各項目を参照してください。
名称 |
Gurobi Optimizer |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
Gurobi クライアントアトリビュート
Name |
Description |
---|---|
実行可能な変数の最大値を取得します |
|
実行パラメータ |
|
Gurobi の動的ライブラリへのパスを指定します |
|
Gurobi に入力したモデルデータを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です。保存形式 (拡張子) として |
|
Gurobi の出力した解を保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です。保存形式 (拡張子) として |
|
Gurobi の動的ライブラリのバージョン文字列を取得します |
Gurobi クライアントの実行例
GurobiClient
from amplify import BinarySymbolGenerator, Solver
from amplify.client import GurobiClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = GurobiClient()
client.parameters.time_limit = 10
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
注釈
Gurobi Optimizer の詳細については ドキュメント を参照してください。
IBM Qiskit
Qiskit を用いて IBM Quantum またはそのシミュレータによる QAOA を実行します。
注釈
Qiskit Client で実機の量子コンピュータを使用するには、事前に IBM Quantum への登録とトークンの取得が必要になります。
注釈
Qiskit クライアントを使用するには、amplify.qaoa パッケージのインストールが必要です。次のように Amplify SDK をインストールすると依存パッケージも同時にインストールされます。
$ pip install amplify[extra]
Qiskit クライアントクラス
詳細については qiskit client reference の各項目を参照してください。
名称 |
Qiskit Classes |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
Qiskit クライアントアトリビュート
Name |
Description |
---|---|
実行可能な変数の最大値を取得します |
|
QAOA を実行する環境 ("CPU", "GPU", "QPU") を取得・設定します |
|
IBM Quantum に接続するためのAPIトークンを取得・設定します |
|
QAOA を実行する実機名 (もしくはシミュレーションのメソッド名) を取得・設定します |
|
実行パラメータ |
|
クライアントのバージョン情報を取得します |
注釈
GPU を使用したシミュレーションを実行するには、次のように qiskit-aer
パッケージをアンインストールして qiskit-aer-gpu
パッケージで置き換える必要があります。
$ pip uninstall qiskit-aer
$ pip install qiskit-aer-gpu
QiskitClient クライアントの実行例
実機を用いた QAOA の実行
from amplify import BinarySymbolGenerator, Solver
from amplify.client import QiskitClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = QiskitClient()
client.device = "QPU" # 実機を用いる場合は "QPU" を指定
client.token = "xxxxxxxx" # 実機を用いる場合は API トークンの設定が必要
# 実行するマシン名を指定
# 指定しない場合は実行に必要ビット数を満たす "least busy" なマシンが自動選択される
client.backend = "ibmq_bogota"
# QAOA のパラメータの設定
client.parameters.reps = 10 # 回路の深さ
client.parameters.shots = 1024 # 実行サンプル数
client.parameters.optimizer = "COBYLA" # チューニングに使用する古典最適化アルゴリズム
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}, frequency = {s.frequency}" for s in result]
['energy = -1.0, q = [1. 0. 1.], frequency = 216', 'energy = 0.0, q = [0. 0. 1.], frequency = 56', 'energy = 0.0, q = [0. 1. 1.], frequency = 188', 'energy = 0.0, q = [1. 0. 0.], frequency = 235', 'energy = 1.0, q = [0. 1. 0.], frequency = 199', 'energy = 1.0, q = [1. 1. 1.], frequency = 41', 'energy = 1.0, q = [0. 0. 0.], frequency = 62', 'energy = 2.0, q = [1. 1. 0.], frequency = 27']
注釈
QAOA パラメータの詳細については QiskitClientParameters
を参照してください。
理想的な量子回路シミュレータによる実行
from amplify import BinaryPoly, BinarySymbolGenerator, Solver
from amplify.client import QiskitClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = QiskitClient()
client.device = "CPU" # シミュレーションに使用するデバイスとして "CPU" または "GPU" を指定
client.backend = "statevector" # シミュレータのメソッドを指定
# QAOA のパラメータの設定
client.parameters.reps = 10 # 回路の深さ
client.parameters.shots = 1024 # 実行サンプル数
client.parameters.optimizer = "COBYLA" # チューニングに使用する古典最適化アルゴリズム
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}, frequency = {s.frequency}" for s in result]
['energy = -1.0, q = [1. 0. 1.], frequency = 250', 'energy = 0.0, q = [0. 1. 1.], frequency = 246', 'energy = 0.0, q = [1. 0. 0.], frequency = 250', 'energy = 1.0, q = [0. 1. 0.], frequency = 278']
注釈
シミュレータのメソッド名については Qiskit のドキュメント を参照してください。
実機を模したシミュレータによる実行
from amplify import BinaryPoly, BinarySymbolGenerator, Solver
from amplify.client import QiskitClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = QiskitClient()
client.device = "CPU" # シミュレーションに使用するデバイスとして "CPU" または "GPU" を指定
client.token = "xxxxxxxx" # 実機を模す場合は API トークンの設定が必要
# シミュレーション対象のマシン名を指定
# 指定しない場合は実行に必要ビット数を満たす "least busy" なマシンが自動選択される
client.backend = "ibmq_bogota"
# QAOA のパラメータの設定
client.parameters.reps = 10 # 回路の深さ
client.parameters.shots = 1024 # 実行サンプル数
client.parameters.optimizer = "COBYLA" # チューニングに使用する古典最適化アルゴリズム
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}, frequency = {s.frequency}" for s in result]
['energy = -1.0, q = [1. 0. 1.], frequency = 250', 'energy = 0.0, q = [0. 1. 1.], frequency = 246', 'energy = 0.0, q = [1. 0. 0.], frequency = 250', 'energy = 1.0, q = [0. 1. 0.], frequency = 278']
Qulacs
量子回路シミュレータ Qulacs を用いて QAOA を実行します。
注釈
Qulacs クライアントを使用するには、amplify.qaoa パッケージのインストールが必要です。次のように Amplify SDK をインストールすると依存パッケージも同時にインストールされます。
$ pip install amplify[extra]
Qulacs クライアントクラス
詳細については qulacs client reference の各項目を参照してください。
名称 |
Qulacs Classes |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
Qulacs クライアントアトリビュート
Name |
Description |
---|---|
実行可能な変数の最大値を取得します |
|
実行パラメータ |
|
クライアントのバージョン情報を取得します |
QulacsClient クライアントの実行例
QulacsClient
from amplify import BinarySymbolGenerator, Solver
from amplify.client import QulacsClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = QulacsClient()
# QAOA のパラメータの設定
client.parameters.reps = 10 # 回路の深さ
client.parameters.shots = 1024 # 実行サンプル数
client.parameters.optimizer = "COBYLA" # チューニングに使用する古典最適化アルゴリズム
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}, frequency = {s.frequency}" for s in result]
['energy = -1.0, q = [1. 0. 1.], frequency = 0', 'energy = 0.0, q = [0. 0. 1.], frequency = 0', 'energy = 0.0, q = [0. 1. 1.], frequency = 30', 'energy = 0.0, q = [1. 0. 0.], frequency = 0', 'energy = 1.0, q = [0. 0. 0.], frequency = 2', 'energy = 1.0, q = [0. 1. 0.], frequency = 988', 'energy = 1.0, q = [1. 1. 1.], frequency = 0', 'energy = 2.0, q = [1. 1. 0.], frequency = 2']
NEC
NEC クライアントクラス
詳細についてはユーザーズマニュアルの各項目を参照してください。
名称 |
NEC Vector Annealing Service |
---|---|
クライアントクラス |
|
実行パラメータクラス |
|
実行結果クラス |
|
実行時間クラス |
|
物理グラフ |
全結合 |
物理ビット数 |
300000 |
論理ビット数 (全結合) |
300000 |
NEC クライアントアトリビュート
Name |
Description |
---|---|
実行可能な変数の最大値を取得します |
|
実行パラメータ |
|
実行マシンのバージョン文字列を取得します |
|
プロキシサーバのアドレスを取得・設定します |
|
APIトークンを取得・設定します |
|
VA の onehot 制約条件のパラメータを設定するかどうかを指定します。デフォルトは |
|
VA の andzero 制約条件のパラメータを設定するかどうかを指定します。デフォルトは |
|
VA の orone 制約条件のパラメータを設定するかどうかを指定します。デフォルトは |
|
VA の maxone 制約条件のパラメータを設定するかどうかを指定します。デフォルトは |
|
VA の minmaxone 制約条件のパラメータを設定するかどうかを指定します。デフォルトは |
|
送信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
|
受信データを保存するファイルパスを取得・設定します。デフォルトは空文字で保存は無効です |
NEC クライアントの実行例
from amplify import BinarySymbolGenerator, Solver
from amplify.client import NECClient
gen = BinarySymbolGenerator()
q = gen.array(3)
f = 2 * q[0] * q[1] - q[0] - q[2] + 1
client = NECClient()
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.num_sweeps = 500
solver = Solver(client)
result = solver.solve(f)
>>> f
2 q_0 q_1 - q_0 - q_2 + 1
>>> [f"energy = {s.energy}, q = {q.decode(s.values)}" for s in result]
['energy = -1.0, q = [1. 0. 1.]']
物理模型ソルバー
通常の使用方法ではソルバークラスを通じて実行する手順を推奨しますが、クライアントクラスは「物理模型」の直接的なソルバーとして利用することも可能です。
注釈
この機能は各マシンを直接操作する場合やデバッグ用途を想定しています。
全てのクライアントは共通で solve()
メソッドを持ちます。次の入力が可能です。行列オブジェクトの入力に対して第二引数は定数項を表します。
solve(
BinaryPoly
)solve(
IsingPoly
)solve(
BinaryIntPoly
)solve(
IsingIntPoly
)solve(
BinaryMatrix
,float
=0.0
)solve(
IsingMatrix
,int
=0.0
)solve(
BinaryIntMatrix
float
=0
)solve(
IsingIntMatrix
,int
=0
)
入力できる多項式は二次に限られ、使用できる変数インデックスと相互作用は各マシンの仕様に準じます。これらは「物理模型」である必要があり、変数間の結合についてハードウェア仕様に基づいたグラフを持ち、そのグラフによっては変数間の結合に制限がある場合があります。
注釈
D-Wave マシンの QPU トポロジについては 公式のドキュメント を参照してください。
注釈
Hitachi CMOS annealing machine は 二次元インデックスで指定する 仕様ですが、Amplify SDK では一次元化したインデックスを用います。キンググラフ上の座標 \(x\), \(y\) について、一次元化した変数インデックス \(i = L x + y\) で与えることに注意してください。ここで \(L = 512\) はキンググラフの一辺の長さを表します。
solve()
メソッドはクライアント固有の ClientResult
クラスのオブジェクトを返却します。
ClientResult
クラスは共通で次のアトリビュートを持ちます。optional
は一部のクライアントのみ提供されます。