arrow-up icon
Image

Fixstars Amplify SDK

Fixstars Amplifyは、複雑で専門性の高い量子アニーリング等による組合せ最適化アプリケーション開発を、もっと簡単で効率的にします。

deco-blob-1 decoration
graphical divider

ワークフロー

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

通常のプログラミング

1. 課題を定式化

解きたい課題をイジングマシンで実行可能な数式で表現する

2. 論理モデルへ変換

目的関数と制約条件をイジングモデルまたはQUBOに変換

3. 物理モデルへ変換

マシン仕様や制限に従った物理モデルに再変換

4. 各マシン・ソルバーの入力形式に変換

マシンのAPI仕様に従い物理モデルをデータに変換

5. マシン・ソルバーを実行

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

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

1. 課題を定式化

解きたい課題を数式で表現してコード化

 

 

 

 

 

 

2. マシン・ソルバーを実行

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

graphical divider

主な機能

様々な入力形式や制約条件とマシン・ソルバーを組み合わせることで、簡単に組合せ最適化問題の求解が可能です。
各マシン・ソルバーへの入力に伴う複雑なモデル変換や出力結果の逆変換は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

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

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

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

最小値制約
$$ f = 0 \space {\rm for} \space \min f = 0 $$
decoration
q = BinarySymbolGenerator().array(2) # バイナリ変数を2個生成
penalty(q[0] * q[1])  # q_0 q_1 が最小値 0 をとる制約
等式制約
$$ f = k $$
decoration
q = BinarySymbolGenerator().array(8)  # バイナリ変数を2個生成
equal_to(q, 1)  # 等式制約 \sum q = 1
不等式制約
$$ f \le k $$
decoration
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は、他のモジュールと比較して圧倒的に高速です。大規模な問題でもその性能は落ちることなく、実問題でも十分にご利用いただけます。

102,400ビットの巡回セールスマン問題の定式化速度

dimod(CQM)を1とした場合の性能比

ビット数900・10,000・102,400の時の定式化所要時間