旧バージョンからの移行¶
Amplify SDK v1 は v0 とは一部の互換性が失われています。これまで旧バージョンを使っていた場合に、今後も動作し続けるようにコードを維持するための方法について説明します。
Amplify SDK v0 を使い続ける¶
現在のコードの動作環境を全く変更せず維持するために、Amplify SDK v0 を使い続けることができます。Amplify SDK モジュールのインストール時に次のようにしてバージョンに制限をかけることで実現できます。
$ python3 -m pip install -U 'amplify<1.0.0'
追加のパッケージを含める場合は、次のようにします。
$ python3 -m pip install -U 'amplify[extra]<1.0.0'
Amplify SDK v0 のドキュメントは次の URL で参照できます。
https://amplify.fixstars.com/ja/docs/amplify/v0/
重要
Amplify SDK v0 は今後も継続的に動作することは保証されません。クリティカルなバグ修正以外の機能追加や、対応ソルバーのアップデートなどは行われません。
また、Python の新バージョンのリリースやソルバーの仕様変更など、周辺環境の変化によっても動作しなくなる可能性があるため注意してください。
Amplify SDK v1 に移行する¶
次のような方針で v0 で書かれたコードを v1 に移行することができます。
決定変数の作成¶
BinarySymbolGenerator
と IsingSymbolGenerator
は整数変数、実数変数の追加に伴い VariableGenerator
に置き換えられました。変数の種類は array()
, scalar()
, matrix()
メソッドの引数で指定します。
従来の書き方:
from amplify import BinarySymbolGenerator, IsingSymbolGenerator
gen = BinarySymbolGenerator()
q = gen.array(10)
gen = IsingSymbolGenerator()
s = gen.array(shape=(4, 4))
新しい書き方:
from amplify import VariableGenerator
gen = VariableGenerator()
q = gen.array("Binary", 10)
s = gen.array("Ising", shape=(4, 4))
n = gen.array("Integer", shape=(3, 3), bounds=(0, 10))
x = gen.array("Real", shape=(2, 4), bounds=(-0.5, 0.5))
目的関数の作成¶
上記のように変数を作成すれば、多項式の構築は以前のバージョンと同様に行えます。ただし、辞書を用いた構築 は廃止されたため、今後は利用出来ません。
行列形式の目的関数の構築は、直接 Matrix クラスを作成するのではなく、matrix()
メソッドを用いて作成するように変更されました。また、Matrix
クラスは係数の二次、一次、定数の項と含まれる変数を内包するようになりました。詳しくは 係数行列による目的関数の作成 を参照してください。
従来の書き方 (現在は動作しません):
from amplify import BinaryMatrix
m = BinaryMatrix(3)
m[0, 0] = -2
m[0, 1] = 1
m[1, 2] = -1
m[2, 2] = 1
新しい書き方:
from amplify import VariableGenerator
gen = VariableGenerator()
m = gen.matrix("Binary", shape=3)
# 二次の項を取得する
m.quadratic[0, 0] = -2
m.quadratic[0, 1] = 1
m.quadratic[1, 2] = -1
m.quadratic[2, 2] = 1
# 係数行列に対応する変数を取得する
q = m.variable_array
制約条件の作成¶
制約条件を作成するための関数やクラスは、amplify.constraint
サブモジュールから amplify
モジュールに移動されました。また、penalty
関数は廃止され、ユーザ自身でペナルティ関数を定義する場合は Constraint
クラスの構築で行うようになりました。詳しくは ペナルティ関数の指定 を参照してください。その他のヘルパー関数についてはモジュールの変更のみで全て利用可能です。
従来の書き方:
from amplify.constraint import equal_to, penalty
c = equal_to(q.sum(), 1)
p = penalty(q[0] * q[1])
新しい書き方:
from amplify import Constraint, equal_to
c = equal_to(q.sum(), 1)
p = Constraint(q[0] + q[1], le=1, penalty=q[0] * q[1])
モデルの作成¶
以前と同様に、Amplify SDK v1 でのモデルクラス Model
を明示的に構築するか、あるいは目的関数と制約条件の和を取ることで、モデルを作成することができます。
以前のバージョンでは BinaryQuadraticModel
と IsingQuadraticModel
がモデルを表すクラスとして、変数の種類に応じた二次のモデルへの変換も担っていました。しかし Amplify SDK v1 では、モデルは様々な変数の種類や次数を扱えるソルバーに対応するため、モデル自身に変数の種類や次数への縛りを持たなくなりました。そのため、モデル構築時にはモデル変換処理は行われず、solve()
関数に実行したいソルバーに対応したクライアントを渡すことで、solve()
関数の内部でソルバーに最適な変換処理が行われるようになりました。
従来の書き方:
from amplify import BinaryQuadraticModel
model = BinaryQuadraticModel(q.sum() ** 2, c)
新しい書き方:
from amplify import Model
model = Model(q.sum() ** 2, c)
従来、二次のモデルへの変換結果は BinaryQuadraticModel
と IsingQuadraticModel
のアトリビュートから取得可能でしたが、Amplify SDK v1 では solve()
関数の返り値である Result
クラスのアトリビュートから取得するか、あるいは明示的にモデル変換メソッドを呼び出して確認できるようになりました。詳しくは 「変数変換と次数下げ」 を参照してください。
ソルバーの実行¶
ソルバークライアントは amplify.client
サブモジュールから amplify
モジュールに移動されました。また、Solver
クラスは廃止され、solve()
関数にモデルとソルバークライアントを渡すことで実行されるようになりました。モデル変換やグラフ埋め込みに関するパラメータは、モデルやソルバークラスのアトリビュートではなく、全て solve()
関数のパラメータとして与えるように変更されました。
従来の書き方:
from amplify import Solver, QuadratizationMethod
from amplify.client import FixstarsClient
client = FixstarsClient()
# client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.timeout = 1000
model = BinaryQuadraticModel(q.sum() **2, c, method=QuadratizationMethod.SUBSTITUTION)
solver = Solver(client)
solver.filter_solution = False
result = solver.solve(model)
新しい書き方:
from amplify import FixstarsClient, solve
client = FixstarsClient()
# client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client.parameters.timeout = 1000
model = Model(q.sum() **2, c)
result = solve(model, client, quadratization_method="Substitute", filter_solution=False)
また、中間モデル (旧論理モデル) の解や、グラフ埋め込みの結果なども solve()
関数の返り値である Result
クラスのアトリビュートに設定されるようになりました。詳しくは 「変数変換と次数下げ」 と 「グラフ埋め込み」 を参照してください。
後方互換 API を使う¶
Amplify SDK v1 でも v0 で書かれたコードが動作するように、従来の API を v1 の後方互換 API として提供しています。後方互換 API は 100% の互換性を保証するものではありませんが、よく使われる機能については互換性を維持しているため、多くの場合はそのままで動作するはずです。
重要
後方互換 API は将来のバージョンで削除される可能性があるため、早めに v1 API に移行することを推奨します。
このことは実行時に警告 (DeprecationWarning
) として送出されます。
次のような方針で後方互換 API を提供しています。
クラス¶
Amplify SDK v0 (リンク先は v1 互換 API) |
後方互換 API 詳細 |
---|---|
|
|
|
|
|
提供されません。 |
それぞれ バイナリ変数、イジング変数専用の |
|
|
提供されません。 |
|
|
|
提供されません。 |
これらは明示的にコンストラクタを呼び出さない限り作成されません。それぞれ バイナリ変数とイジング変数の二次の中間モデル (旧論理モデル) を取得することのできる v0 と互換性のあるモデルとして機能します。しかし、新しい |
|
|
提供されません。 |
|
関数¶
Amplify SDK v0 (リンク先は v1 互換 API) |
後方互換 API 詳細 |
---|---|
|
提供されません |
|
|
|
提供されません |
|
提供されません |
|
提供されません |
|
提供されません |
|
提供されません |
|
|
|
提供されません。 |
|
|
|
提供されません。 |
名前空間¶
Amplify SDK v0 (リンク先は v1 互換 API) |
後方互換 API 詳細 |
---|---|
|
互換性のために提供されます。 |
|
互換性のために提供されます。 |
|
互換性のために提供されます。 |