arrow-up icon
Image

Fixstars Amplify SDK

Fixstars Amplifyは、複雑で専門性の高い量子アニーリング向けアプリケーション開発を、もっと簡単で便利にします。

deco-blob-1 decoration
graphical divider

ワークフロー

Fixstars Amplifyは、「論理モデルの変換」「物理モデルの変換」「マシン実行」の3つのステップをを自動化することで、より直観的な量子アニーリングプログラミングのワークフローを実現しています。

通常のプログラミング

1. 課題を定式化

マシンのSDKやAPI仕様に合わせて物理モデルをデータ化

2. 論理モデルへ変換

目的関数をマシンの動作モデルで再定義

3. 物理モデルへ変換

マシン仕様や制約を考慮した物理モデルに再変換

4. マシンにデータを入力

マシンのSDKやAPI仕様に合わせて物理モデルをデータ化

5. マシンを実行

特定マシンのみで実行可能

Fixstars Amplifyを用いたプログラミング

1. 課題を定式化

定式化された数式をプログラムコードで表現

 

 

 

 

 

 

2. マシンを実行

複数マシンの中から選択可能

graphical divider

主な機能

様々な入力形式や制約条件と実行マシンを組み合わせることで、簡単にアニーリングの実行が可能です。
各マシンへの入力に伴う複雑なモデル変換や出力結果の逆変換は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

バイナリ・イジング変数多項式に対する四則演算やそれぞれの代数法則に特化した高速数式処理を行います。
また、数式を自然な形で表現するために便利な関数が用意されています。

$$ f=\displaystyle\sum_{i=0}^{n-1}q_i $$
decoration
                  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
$$ f=\displaystyle\sum_{i=0}^{n-1}\displaystyle\sum_{j=0}^{n-1}q_i q_j $$
decoration
                  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
$$ f=\displaystyle\sum_{i=0}^{n-1}\bigg(\displaystyle\sum_{j=0}^{n-1}q_{ij} -1\bigg)^2 $$
decoration
                  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

入力変数間に働く制約条件を抽象化し、アニーリングマシンで実行するためのペナルティ関数の生成や結果の制約充足チェックなどを自動処理します。
ユーザは煩雑になりがちな制約条件式の管理の必要がなくなります。

最小値制約
$$ f = 0 \space {\rm for} \space \min f = 0 $$
decoration
q = gen_symbols(BinaryPoly, 2)  # バイナリ変数を2個生成
penalty(q[0] * q[1])        # 最小値制約 q_0 q_1 = 0
等式制約
$$ f = k $$
decoration
q = gen_symbols(BinaryPoly, 8)  # バイナリ変数を8個生成
equal_to(sum_poly(q), 1)        # 等式制約 \sum q = 1
不等式制約
$$ f \le k $$
decoration
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)