NEC

NEC Vector Annealing (VA) サービス 2.0

NEC の提供する QUBO ソルバーです。ベクトル型スーパーコンピュータ SX-Aurora TSUBASA 上で動作します。

Amplify SDK の提供する NECVA2Client を使用することで、リクエストパラメータの自動検出・自動設定を行いながら NEC Vector Annealing サービス 2.0 API を呼び出すことができます。

ソルバー仕様:

1: API リファレンス「3-3-2 solve_paramsのパラメータ」に相当します
2: API リファレンス「3-4.レスポンス」に相当します
3: 追加インストールの必要はありません

バイナリ変数

イジング変数

整数変数

実数変数

目的関数

2次

-

-

-

等式制約

*

-

-

-

不等式制約

*

-

-

-

*: 後述する1次または2次の特別な制約条件に対応しています。

クライアントクラス:

クライアントクラスの共通インターフェース に加えて以下のアトリビュートを持ちます。

アトリビュート

データ型

詳細

set_fixed

bool

True に設定すると、モデルの持つ制約条件の中から fixed 制約を可能な限り検出してフリップオプションの fixed パラメータに与えます (デフォルト: True)

set_onehot

bool

True に設定すると、モデルの持つ制約条件の中から onehot 制約を可能な限り検出してフリップオプションの onehot パラメータに与えます (デフォルト: True)

set_andzero

bool

True に設定すると、モデルの持つ制約条件の中から andzero 制約を可能な限り検出してフリップオプションの andzero パラメータに与えます (デフォルト: True)

set_orone

bool

True に設定すると、モデルの持つ制約条件の中から orone 制約を可能な限り検出してフリップオプションの orone パラメータに与えます (デフォルト: True)

set_supplement

bool

True に設定すると、モデルの持つ制約条件の中から supplement 制約を可能な限り検出してフリップオプションの supplement パラメータに与えます (デフォルト: True)

set_maxone

bool

True に設定すると、モデルの持つ制約条件の中から maxone 制約を可能な限り検出してフリップオプションの maxone パラメータに与えます (デフォルト: True)

set_minmaxone

bool

True に設定すると、モデルの持つ制約条件の中から minmaxone 制約を可能な限り検出してフリップオプションの minmaxone パラメータに与えます (デフォルト: True)

フリップオプションの各制約は、係数を含めて以下の形と一致する制約条件式が設定されたときのみ検出されます。 \(q_1, q_2, \dots , q_N\) (\(N\) は自然数) を互いに独立なバイナリ変数、\(m, n, k\) を整数定数とします。

フリップオプション

検出する制約条件の形式

set_fixed

\(q_1 + k = k\)
\(q_1 + k = k + 1\)

set_onehot

\(q_1 + q_2 + \cdots + q_N + k = k + 1\)

set_andzero

\(q_1 + q_2 + \cdots + q_N + k \leq k + N - 1\)
\(n q_1 q_2 + k = k\)

set_orone

\(q_1 + q_2 + \cdots + q_N + k \geq k + 1\)
\(n (q_1 - 1)(q_2 - 1) + k = k\)

set_supplement

\(n (q_1 - q_2 q_3) + k = k\)

set_maxone

\(q_1 + q_2 + \cdots + q_N + k \leq n \quad (0 \leq n - k \leq N)\)

set_minmaxone

\(m \leq q_1 + q_2 + \cdots + q_N + k \leq n \quad (0 \leq m - k, n - k \leq N)\)

注釈

フリップオプションが有効であるかにかかわらず、制約条件は必要に応じてペナルティ関数として目的関数に追加されます。

実行時間:

NEC VA 2.0 は VA の各サンプリングの実行時間を返却しますが、一方で求解全体に要した実行時間は返却されません。NECVA2Client では、サンプリング時間に加えて、独自に SAC サービスクライアントの solve_qubo() API のレスポンス時間 (solve_qubo_time) 、このうち VA の実行に係る時間 (execution_time) およびキュー待ち時間 (queue_time)を計測し返却します。これらは実行結果クラスの timing アトリビュートに格納されます。

アトリビュート

詳細

amplify.NECVA2Client.Result.Result.time

VA の各サンプリングの実行時間

amplify.NECVA2Client.Result.Timing.solve_qubo_time

solve_qubo() Python API のレスポンス時間

amplify.NECVA2Client.Result.Timing.execution_time

VA の実行時間 (ネットワークオーバーヘッド・キュー待ち時間等を含む)

amplify.NECVA2Client.Result.Timing.queue_time

キュー待ち時間

設定例:
from amplify import NECVA2Client

client = NECVA2Client()

# API トークンを設定
client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# 速度優先モードで実行
client.parameters.vector_mode = "speed"
実行例:
from amplify import VariableGenerator, Model, 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)

# API の実行時間を表示
print(result.execution_time)

ソルバーのバージョンを取得:

>>> client.version
'2.0.2'

詳細な実行時間を取得:

>>> result.client_result.result[0].time
datetime.timedelta(microseconds=4257)

>>> result.client_result.timing
NECVA2Client.Result.Timing({
"execution_time": 3.8289530351758003,
"solve_qubo_time": 24.603095658123493,
"queue_time": 0.0007024258375167847
})