旧バージョンからの移行#

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 に移行することができます。

決定変数の作成#

BinarySymbolGeneratorIsingSymbolGenerator は整数変数、実数変数の追加に伴い 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 を明示的に構築するか、あるいは目的関数と制約条件の和を取ることで、モデルを作成することができます。

以前のバージョンでは BinaryQuadraticModelIsingQuadraticModel がモデルを表すクラスとして、変数の種類に応じた二次のモデルへの変換も担っていました。しかし 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)

従来、二次のモデルへの変換結果は BinaryQuadraticModelIsingQuadraticModel のアトリビュートから取得可能でしたが、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 詳細

BinaryPoly, IsingPoly

Poly のエイリアスとしてサブクラス化されていますが、それぞれバイナリ変数、イジング変数には制限されません。また、コンストラクタや一部のメソッドに互換性がありません。

BinaryPolyArray, IsingPolyArray

PolyArray のエイリアスとしてサブクラス化されていますが、それぞれバイナリ変数、イジング変数には制限されません。また、コンストラクタや一部のメソッドに互換性がありません。

BinaryIntPoly, IsingIntPoly,
BinaryIntPolyArray, IsingIntPolyArray

提供されません。

BinarySymbolGenerator, IsingSymbolGenerator

それぞれ バイナリ変数、イジング変数専用の VariableGenerator として機能します。

BinaryIntSymbolGenerator, IsingIntSymbolGenerator

提供されません。

BinaryMatrix, IsingMatrix

Matrix のエイリアスとしてサブクラス化されていますが、それぞれバイナリ変数、イジング変数には制限されません。また、インターフェースに互換性はありません。

BinaryIntMatrix, IsingIntMatrix

提供されません。

BinaryQuadraticModel, IsingQuadraticModel

これらは明示的にコンストラクタを呼び出さない限り作成されません。それぞれ バイナリ変数とイジング変数の二次の中間モデル (旧論理モデル) を取得することのできる v0 と互換性のあるモデルとして機能します。しかし、新しい solve() 関数には渡せず、後方互換用の Solver クラス専用です。

BinaryIntQuadraticModel, IsingIntQuadraticModel

提供されません。

Solver, SolverResult, SolverSolution

solve() 関数のラッパークラスとして v0 と同様のインターフェースを提供します。メソッドやプロパティの返却値は対応する v1 のクラスに変更されています。

関数#

Amplify SDK v0 (リンク先は v1 互換 API)

後方互換 API 詳細

replace_all()

提供されません

sum_poly()

sum のエイリアスとします。

pair_sum()

提供されません

product()

提供されません

intersection()

提供されません

union()

提供されません

symmetric_difference()

提供されません

SymbolGenerator()

VariableGenerator のエイリアスとします。

gen_symbols

提供されません。

decode_solution()

evaluate() の関数版として機能します。

convert_to_matrix

提供されません。

名前空間#

Amplify SDK v0 (リンク先は v1 互換 API)

後方互換 API 詳細

amplify.constraint

互換性のために提供されます。

amplify.client

互換性のために提供されます。

amplify.client.ocean

互換性のために提供されます。