Fixstars Amplifyは、複雑で専門性の高い量子アニーリング等による組合せ最適化アプリケーション開発を、もっと簡単で効率的にします。
Fixstars Amplifyは、「論理モデルの変換」「物理モデルの変換」「求解の実行」の3つのステップを自動化することで、より直観的な量子アニーリングプログラミングのワークフローを実現しています。
解きたい課題をイジングマシンで実行可能な数式で表現する
目的関数と制約条件をイジングモデルまたはQUBOに変換
マシン仕様や制限に従った物理モデルに再変換
マシンのAPI仕様に従い物理モデルをデータに変換
特定マシンのみで実行可能
解きたい課題を数式で表現してコード化
複数マシンの中から選択可能
様々な入力形式や制約条件とマシン・ソルバーを組み合わせることで、簡単に組合せ最適化問題の求解が可能です。
各マシン・ソルバーへの入力に伴う複雑なモデル変換や出力結果の逆変換はAmplify SDKが解決します。
# 入力モデルの構築
q = BinarySymbolGenerator().array(2)
f = 1 - q[0] * q[1]
# 実行マシンの設定
client = FixstarsClient()
# アニーリングの実行
s = Solver(client)
result = s.solve(f)
values = result[0].values
# 結果の取得
solution = q.decode(values)
>>> print(f"result: {q} = {solution}")
result: [q_0, q_1] = [1. 1.]
マシン・ソルバーの対応に依らず多様な数式の取り扱いが可能になります。
また通常の量子アニーリング・イジングマシンでは対応の難しい高次多項式の入力にも対応しています。
q = BinarySymbolGenerator().array(3)
f = 1 - q[0] * q[1] + q[2]
>>> f
- q_0 q_1 + q_2 + 1
s = IsingSymbolGenerator().array(3)
f = 1 - s[0] * s[1] + s[2]
>>> f
- s_0 s_1 + s_2 + 1
m = BinaryMatrix([[0, -1, 0], [0, 0], [1]])
>>> m
[[0, -1, 0],
[0, 0, 0],
[0, 0, 1]]
>>> m.to_Poly()
- q_0 q_1 + q_2
m = IsingMatrix([[0, -1, 0], [0, 0], [1]])
>>> m
[[0, -1, 0],
[0, 0, 0],
[0, 0, 1]]
>>> m.to_Poly()
- s_0 s_1 + s_2
q = BinarySymbolGenerator().array(3)
f = q[0] * q[1] * q[2] + q[0] * q[0]
>>> f
q_0 q_1 q_2 + q_0
q = IsingSymbolGenerator().array(3)
f = s[0] * s[1] * s[2] + s[0] * s[0]
>>> f
s_0 s_1 s_2 + 1
q = BinarySymbolGenerator().array(3)
f = (q[0] | q[1]) & (q[1] | q[2])
>>> f
- q_0 q_1 q_2 + q_0 q_2 + q_1
バイナリ・イジング変数多項式に対する四則演算やそれぞれの代数法則に特化した高速数式処理を行います。
また、数式を自然な形で表現するために便利な関数が用意されています。
q = BinarySymbolGenerator().array(8)
f = q.sum()
>>> f
q_0 + q_1 + q_2 + q_3 + q_4 + q_5 + q_6 + q_7
q = BinarySymbolGenerator().array(3)
f = einsum("i,j->", q, q)
>>> f
2 q_0 q_1 + 2 q_0 q_2 + 2 q_1 q_2 + q_0 + q_1 + q_2
q = BinarySymbolGenerator().array(2, 2)
f = ((q.sum(axis=1) - 1) ** 2).sum()
>>> f
2 q_0 q_1 + 2 q_2 q_3 - q_0 - q_1 - q_2 - q_3 + 2
入力変数間に働く制約条件を抽象化し、量子アニーリング・イジングマシンで実行するためのペナルティ関数の生成や結果の制約充足チェックなどを自動処理します。
ユーザーは煩雑になりがちな制約条件式の管理の必要がなくなります。
q = BinarySymbolGenerator().array(2) # バイナリ変数を2個生成
penalty(q[0] * q[1]) # q_0 q_1 が最小値 0 をとる制約
q = BinarySymbolGenerator().array(8) # バイナリ変数を2個生成
equal_to(q, 1) # 等式制約 \sum q = 1
q = BinarySymbolGenerator().array(3) # バイナリ変数を3個生成
less_equal(3 * q[0] + 2 * q[1] + q[2], 3) # 不等式制約 3 * q[0] + 2 * q[1] + q[2] <= 3
公開されているほぼ全ての量子アニーリング・イジングマシン、数理最適化ソルバーやゲート型量子コンピュータの組合せ最適化を解くアルゴリズムなど幅広くサポートしています。
共通ドライバを提供することで、それぞれの仕様の違いを吸収します。これにより簡便かつ最小限の変更でマシン・ソルバーの切り替えが可能です。
# Fixstars Amplify AE を使用する例
client = FixstarsClient()
# D-Wave Advantage/2000Q を使用する例
client = DWaveSamplerClient()
# 富士通デジタルアニーラを使用する例
client = FujitsuDA3SolverClient()
# 東芝SQBM+を使用する例
client = ToshibaClient()
# Gurobi Optimizer を使用する例
client = GurobiClient()
# IBM Quantum QAOA を使用する例
client = QiskitClient()
# Qulacs QAOA を使用する例
client = QulacsClient()
# ソルバーに使用マシンを設定
s = Solver(client)
Fixstars Amplify SDKは、他のモジュールと比較して圧倒的に高速です。大規模な問題でもその性能は落ちることなく、実問題でも十分にご利用いただけます。
dimod(CQM)を1とした場合の性能比