製品紹介
Amplifyは、複雑で専門性の高い開発プロセスの負荷を低減し、アプリケーションの開発を効率化するミドルウェアです。Amplifyをベースに作られたアプリケーションは、再実装することなく、Optiganを含む他社の量子コンピュータやアニーリングマシン上でも動かすことができます。
ワークフロー
量子プログラミングをより直感的に現在開発が進められている量子アニーリングマシンは機種によってハードウェアの仕様や制約条件が異なります。
現在はこれらを理解した上でマシンを使用する必要があり、そのためには定式化、論理モデルへの変換、物理モデルへの変換、マシン実行といったステップを踏まなければなりません。
Amplifyは論理モデル、物理モデルの変換とマシン実行を自動化することで、より直観的な量子プログラミングのワークフローを実現しています。
通常アニーリングマシンのプログラミング

Step1.
課題を定式化
マシンのSDKやAPI仕様に合わせて物理モデルをデータ化

Step2.
論理モデルへ変換
目的関数をマシンの動作モデルで再定義

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

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

Step5.
マシンを実行
1つのマシンを使う
Amplifyを用いたアニーリングマシンのプログラミング

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

ミドルウェアの提供するAPIが自動で各マシンの入力可能な形式への多段変換と実行結果の逆変換を行い、ユーザにとって結果の解釈が容易な形で返却。

Step2.
マシンを実行
複数のマシンを切り替えながら実行
機能紹介
アニーリングの実行
様々な入力形式や制約条件と実行マシンを組み合わせることで、簡単にアニーリングの実行が可能です。
各マシンへの入力に伴う複雑なモデル変換や出力結果の逆変換はミドルウェアが解決します。
# 入力モデルの構築
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 $$
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 $$
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 $$
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 $$
q = gen_symbols(BinaryPoly, 2) # バイナリ変数を2個生成
penalty(q[0] * q[1]) # 最小値制約 q_0 q_1 = 0
等式制約
$$ f = k $$
q = gen_symbols(BinaryPoly, 8) # バイナリ変数を8個生成
equal_to(sum_poly(q), 1) # 等式制約 \sum q = 1
不等式制約
$$ f \le k $$
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 Optigan を使用する例
client = FixstarsClient()
# D-Wave 2000Q を使用する例
client = DWaveClient()
# 富士通デジタルアニーラを使用する例
client = FujitsuDASolverClient()
# 東芝SBMを使用する例
client = ToshibaClient()
# ソルバーに使用マシンを設定
s = Solver(client)
スペック
- 対応言語
-
Python 3.6 - 3.8
C++17
- 動作環境
-
Ubuntu 16.04 18.04 20.04 CentOS 7/8
Windows 10(WSL)
macOS Catalina
- 対応マシン
-
Fujitsu DA/DA2
D-wave / Leap Hybird
Toshiba SBM
Hitachi CMOS
Fixstars GPU
- 定式化
-
QUBO多項式
QUBO行列
Ising多項式
Ising行列
論理式
高次多項式(Binary / Ising)
制約式管理(Binary)
- グラフ埋め込み
-
完全グラフ
スパースグラフ
使用方法
GPUベースのアニーリングマシン「Optigan」は、ミドルウェアの「Amplify」とともに使用することで開発効率を飛躍的に高め、その性能を余すところなく発揮することができます。 また「Amplify」をベースに作られたアプリケーションは、再実装することなく、他社の量子コンピュータやアニーリングマシン上でも動かすことができます。
まずは無料ウェブ体験版をお試しいただくか、弊社担当までお問い合わせください。