Fixstars Amplifyは、複雑で専門性の高い量子アニーリング向けアプリケーション開発を、もっと簡単で便利にします。
Fixstars Amplifyは、「論理モデルの変換」「物理モデルの変換」「マシン実行」の3つのステップをを自動化することで、より直観的な量子アニーリングプログラミングのワークフローを実現しています。
マシンのSDKやAPI仕様に合わせて物理モデルをデータ化
目的関数をマシンの動作モデルで再定義
マシン仕様や制約を考慮した物理モデルに再変換
マシンのSDKやAPI仕様に合わせて物理モデルをデータ化
特定マシンのみで実行可能
定式化された数式をプログラムコードで表現
複数マシンの中から選択可能
様々な入力形式や制約条件と実行マシンを組み合わせることで、簡単にアニーリングの実行が可能です。
各マシンへの入力に伴う複雑なモデル変換や出力結果の逆変換はAmplify SDKが解決します。
# 入力モデルの構築
q = gen_symbols(BinaryPoly, 2)
f = 1 - q[0] * q[1]
# 実行マシンの設定
client = FixstarsClient()
client.url = "http://xxx.xxx.xxx.xxx"
# アニーリングの実行
s = Solver(client)
result = s.solve(f)
values = result.solutions[0].values
# 結果の解釈
solution = decode_solution(q, values)
>>> print(f"result: {q} = {solution}")
result: [q_0, q_1] = [1, 1]
マシンの対応に依らず多様な数式の取り扱いが可能になります。
また通常のアニーリングマシンでは対応の難しい高次多項式の入力にも対応しています。
q = gen_symbols(BinaryPoly, 3)
f = 1 - q[0] * q[1] + q[2]
>>> f
- q_0 q_1 + q_2 + 1.000000
s = gen_symbols(IsingPoly, 3)
f = 1 - s[0] * s[1] + s[2]
>>> f
- s_0 s_1 + s_2 + 1.000000
q = BinaryMatrix(4)
>>> q
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
q = IsingMatrix(4)
>>> q
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
q = gen_symbols(BinaryPoly, 3)
f = q[0] * q[1] * q[2] + q[0] * q[0]
>>> f
q_0 q_1 q_2 + q_0
s = gen_symbols(IsingPoly, 3)
f = s[0] * s[1] * s[2] + s[0] * s[0]
>>> f
s_0 s_1 s_2 + 1.000000
x = gen_symbols(LogicPoly, 3)
f = (x[0] | x[1]) & (x[1] | x[2])
>>> f
- x_0 x_1 x_2 + x_0 x_2 + x_1
バイナリ・イジング変数多項式に対する四則演算やそれぞれの代数法則に特化した高速数式処理を行います。
また、数式を自然な形で表現するために便利な関数が用意されています。
q = gen_symbols(BinaryPoly, 8) # バイナリ変数を8個生成
f = sum_poly(q) # 全ての変数の総和を取る
>>> f
q_0 + q_1 + q_2 + q_3 + q_4 + q_5 + q_6 + q_7
q = gen_symbols(BinaryPoly, 3) # バイナリ変数を3個生成
f = sum_poly(3, lambda i: # 全ての変数の組合せの和を取る
sum_poly(3, lambda j: q[i] * q[j]))
>>> f
2.0 q_0 q_1 + 2.0 q_0 q_2 + 2.0 q_1 q_2 + q_0 + q_1 + q_2
q = gen_symbols(BinaryPoly, 2, 2) # 2x2バイナリ変数を生成
f = sum_poly(2, lambda i: ( # 2乗や四則演算を含む数式の二重和
sum_poly(2, lambda j: q[i][j]) - 1) ** 2)
>>> f
2.0 q_0 q_1 + 2.0 q_2 q_3 - q_0 - q_1 - q_2 - q_3 + 2.0
入力変数間に働く制約条件を抽象化し、アニーリングマシンで実行するためのペナルティ関数の生成や結果の制約充足チェックなどを自動処理します。
ユーザは煩雑になりがちな制約条件式の管理の必要がなくなります。
q = gen_symbols(BinaryPoly, 2) # バイナリ変数を2個生成
penalty(q[0] * q[1]) # 最小値制約 q_0 q_1 = 0
q = gen_symbols(BinaryPoly, 8) # バイナリ変数を8個生成
equal_to(sum_poly(q), 1) # 等式制約 \sum q = 1
q = gen_symbols(BinaryPoly, 3) # バイナリ変数を3個生成
less_equal(3 * q[0] + 2 * q[1] + q[2], 3) # 最小値制約 3 * q[0] + 2 * q[1] + q[2] <= 3
公開されているほぼ全てのアニーリングマシンに対応しています。
共通ドライバを提供することで、それぞれのマシンのハードウェア仕様やインターフェースの仕様の違いを吸収します。これにより簡便かつ最小限の変更でマシンの切り替えが可能です。
# Fistars Amplify AE を使用する例
client = FixstarsClient()
# D-Wave 2000Q を使用する例
client = DWaveClient()
# 富士通デジタルアニーラを使用する例
client = FujitsuDASolverClient()
# 東芝SBMを使用する例
client = ToshibaClient()
# ソルバーに使用マシンを設定
s = Solver(client)