東芝の最適化マシンを利用する

東芝のSimulated Bifurcation Machine (SBM) が、公開されましたので、それを使うところまでやってみたいと思います。

公開の記事は、東芝の「組み合わせ最適化最速アルゴリズム」、クラウドで一般公開　この辺りが参考になるとおもいます。
https://www.itmedia.co.jp/news/articles/1908/02/news104.html

本家のサイトでも日本語で利点が公開されています。
https://www.toshiba-sol.co.jp/pro/sbm/index_j.htm

AWSのマーケットプレイスのページは
https://aws.amazon.com/marketplace/pp/B07T8STKZR/ref=vdr_rf
になります。

注意することとしては、AWSのEC2 Instance typeが「p3.2xlarge」に限定されていることです。　いままで使ったことがない場合はAWSチームに申請して許可してもらわないと利用できません。　

[](
|Vendor Recommended | Software/hr | EC2/hr | Total/hr |
|----|----|----|
| 0USD | 3.06USD | 3.06USD|
)

東芝のソフトを利用するのに特別料金はかからないですが、p3.2xlargeを利用するのに１時間あたり3.06ドルかかる。使わないときはインスタンスを落としておけば、ディスク代くらいしかかからないので、１日2,3セントくらいで済みます。インスタンスを起動していると１ヶ月間で日本円で２５万円くらいかかるので注意が必要です。

Isingモデルを解くには、
MatrixMarket format (symmetric form only) でやる必要があります。MM formatについては(https://math.nist.gov/MatrixMarket/formats.html) が本家になるので、そちらを参照するといいです。
Ising以外にもMax-CUT, Max-SATのソルバーも用意されています。こちらも今後テストしてみたいと思います。

SciPyでMatrixMarket formatを利用するのに良いのがあるので、チェックなどにこちらを使うといいです。

```
import scipy as sp
from scipy.io import mmwrite, mmread
```

実際にAWSのマーケットプレイスのページは
https://aws.amazon.com/marketplace/pp/B07T8STKZR/ref=vdr_rf
からp3.2xlargeを起動するところはAWSのEC2をやったことがある方ならば簡単にできると思います。

ドキュメントに書いてあるように、MMformatのIsingのテキストをcurlコマンドでおくると答えが戻ってくるようになっています。
このあたりは使いやすさのためにpythonでPyQUBO と　requestで実装していこうと思っています。

前に書いた記事「PyQUBOでQUBOをつくって、そのままFujitsuデジタルアニーラへジョブ投入」　https://qiita.com/morimorijap/items/7dfe7d0c2a0bb7b0b88b
の　

```
# ハミルトニアンを記述　4個のうち1つを1にする
q1, q2, q3, q4 = Binary("q1"), Binary("q2"), Binary("q3"), Binary("q4")
H = (q1+q2+q3+q4-1)**2 
```
のPyQUBOでQuboファイルを作ってそれを投入してみます。　普通につくると
```
('q1', 'q1'): -1.0,
 ('q1', 'q2'): 2.0,
 ('q1', 'q3'): 2.0,
 ('q1', 'q4'): 2.0,
 ('q2', 'q2'): -1.0,
 ('q2', 'q3'): 2.0,
 ('q2', 'q4'): 2.0,
 ('q3', 'q3'): -1.0,
 ('q3', 'q4'): 2.0,
 ('q4', 'q4'): -1.0
```
となりますが、東芝のマシンでは、ドキュメントにあるように、以下のフォーマットに合わせて送信しないといけません。

MatrixMarket format (symmetric form only) (https://math.nist.gov/MatrixMarket/formats.html)

また、symmetricの場合、行列の下の三角成分のみで、row >= col とする必要があります。

```
%%MatrixMarket matrix coordinate real symmetric
4 4 10
1 1 -1.0
2 1 2.0
3 1 2.0
4 1 2.0
2 2 -1.0
3 2 2.0
4 2 2.0
3 3 -1.0
4 3 2.0
4 4 -1.0
```
となります。

このMMフォーマットは、scipyのmmwriteで書くことが可能です。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.mmwrite.html

```
from scipy.io import mmwrite, mmread
from scipy.sparse import csr_matrix

nparr = array([[-1.,  0.,  0.,  0.],
       [ 2., -1.,  0.,  0.],
       [ 2.,  2., -1.,  0.],
       [ 2.,  2.,  2., -1.]])

#スパース化
nparr = csr_matrix(nparr)
#mmformat保存,勝手に.mtxがつく
mmwrite("./000arr",nparr, symmetry="symmetric")
```

上記のようにすると、Toshiba SBMにそのまま投入できるMatrixMarket matrixのファイルを作成することができます。

```
$  curl -i -H "Content-Type: application/octet-stream" -X POST "http://xxxxxx:8000/solver/ising?steps=0&loops=10" --data-binary "@000arr.mtx"

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 114
ETag: W/"72-xxxxxxx"
Date: xxx, xx Aug 2019 xx:xx:xx GMT
Connection: keep-alive

{"id":"xxxxx","time":0.03,"wait":0,"runs":3200,"steps":8,"message":"finished","value":-1,"result":[0,0,1,0]}
```


"result":[0,0,1,0]

と出ているので４つのうち３番目のが１になり成功です。

東芝のマシンは、専用機ではなく、AWS上で、GPUをつかってイジングモデルを高速にとけるという夢のようなマシンです。　p3.2xlargeは高いのですが、計算をするときだけインスタンスをあげるなどすれば価格が抑えられるのでありがたいと思っています。今後の発展に期待です。


変更履歴：
2019.12.18 scipyのmmwriteについて追加