D-Wave leap のDemoみてみる（１回目）。

前回の　[n個のうちmだけを１にする問題をPyQUBOを使ってアニーリングマシンで解く](https://qiita.com/morimorijap/items/196e7fc86ecff927bf40)　では、[D-Wave Ocean SDK](https://github.com/dwavesystems/dwave-ocean-sdk/)をつかってD-Waveで解いてみましたが、D-Wave Leapには、３つのデモが用意されています。
無料で日本からも利用できるようになっているので、闇雲に論文等を調べるのもいいのですが、せっかくソースまで見えるので、使い倒したほうが絶対にいいとおもっています。そのようなことからデモをすこし紹介できればと思います。
ただ３つ目はLeapが発表されて（たしかぼくが初めてみた2018年10月からは）ずっとComing Soonでいまだ(2019/4現在）に公開されていません。それでは、見ていきたいとおもいます。

https://cloud.dwavesys.com/leap/resources/demos

(ログインが必要ですので、ユーザ登録などは済ませてください。)
<img width="819" alt="Screen Shot 2019-04-19 at 8.40.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/a09b02bd-3fe9-b043-80f1-36fb479654e4.png">


Factoring、Social Network Analysis、Quantum Materials Simulation（これが公開されてない）の３つのデモがありますが、先に述べたように３つ目のQuantum Materials Simulationは公開されていません。

インタラクティブなデモとなっているので、ぜひ実物を試してみてください。

今回は、Factoringを見ていきます。　ファクタリングと日本でいうと、売掛債権取引の方が多いようにも思いますが、素因数分解のことです。

Factoringに進んでいくと、
<img width="887" alt="Screen Shot 2019-04-19 at 8.43.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/e544e765-eb08-53a3-b76b-bb50ae8ac7c4.png">

Factoring by running a multiplication circuit in reverse
とは、
[乗算器](https://ja.wikipedia.org/wiki/%E4%B9%97%E7%AE%97%E5%99%A8)を、反対につかうという意味です。のちほど詳細は出てきますが、素数21は、$3*7 = 21$なので、3,7の乗算器を使うと21がでます。その反対に3,7を求める問題となるので、21を与えて、乗算器を反対に使えば回答が出るだろうということになります。

また、more informationをクリックすると、

<img width="875" alt="Screen Shot 2019-04-19 at 8.44.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/0a4d9f68-9eac-b022-3b4e-65556e43eaf0.png">

背景にあるCSP（Constraint satisfaction problem、[制約充足問題](https://ja.wikipedia.org/wiki/%E5%88%B6%E7%B4%84%E5%85%85%E8%B6%B3%E5%95%8F%E9%A1%8C)) と、Shorアルゴリズムアニーリングマシンでは、Shorアルゴリズムを動かすことはできないことと、その説明があります。
アニーリングマシンでは、最適化計算が得意といわれますが、この制約充足問題にような最適化問題をIsingモデルに置き換えることがうまくできれば、アニーリングマシンで解いてくれるといった具合になります。

次にいきます。
まず、１２、２１、４９といった素数が並んでいるので、どれかを選択します。今回は21を選びました。

<img width="877" alt="Screen Shot 2019-04-19 at 9.04.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/8fd9db71-9ca0-fbfa-d3e3-d6fccab54274.png">

<img width="883" alt="Screen Shot 2019-04-19 at 9.04.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/5fd2f602-c72d-6002-b560-c087b7547758.png">

more informationをクリックすると、trial division(数全てを順に割り切れるかどうか試す方法)について説明が書いてあります。

<img width="873" alt="Screen Shot 2019-04-19 at 9.05.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/626e396e-915d-a965-9245-73eaa4beb39c.png">

そして次には、Boolean logic circuit(ブール論理回路)

<img width="871" alt="Screen Shot 2019-04-19 at 9.05.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/9d659766-9b36-668d-1bf6-723e3f4cc259.png">

more informationをクリックすると、
<img width="874" alt="Screen Shot 2019-04-19 at 9.05.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/1430ed85-0f88-c4fa-5381-336c01479291.png">

実は、[PyQUBOにもLogical Gate](https://pyqubo.readthedocs.io/en/latest/reference/logic.html)
という表現が存在し、PyQUBOで表現することも可能です。

次にいくと
<img width="883" alt="Screen Shot 2019-04-19 at 9.08.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/0c386e50-3027-c513-064b-027e7175cabf.png">

CSP（Constraint satisfaction problem、制約充足問題)をブール論理回路
へ変換して、といて行く方法が述べられています。

<img width="878" alt="Screen Shot 2019-04-19 at 9.08.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/08b9147d-ef7d-7356-a9a9-a724cfec61fb.png">

<img width="864" alt="Screen Shot 2019-04-19 at 9.09.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/99427795-2785-8b5d-6f27-b713bf73980b.png">

<img width="879" alt="Screen Shot 2019-04-19 at 9.10.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/4b653dd9-6e4a-3e41-6c66-1d1dd4531232.png">

このブール論理回路をD-WaveのChimeraグラフにMappingして解くのですが、それについて書かれています。

<img width="871" alt="Screen Shot 2019-04-19 at 9.10.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/a46c4de0-7e5e-2546-a464-d8189e522541.png">

どのようにハミルトニアンの最小値を探して行くのかといった説明があります。

<img width="876" alt="Screen Shot 2019-04-19 at 9.10.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/a4fa0858-8e5f-d21a-d4b6-d78315c627e9.png">

Runボタンを押す

<img width="898" alt="Screen Shot 2019-04-19 at 9.10.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/0e254237-32b7-05c8-2078-ce759b5429d4.png">

計算結果がでてきて（たぶんここは実機は動かしてないとおもう）をして、50回やって、2のユニークな答えがあり、0.016sで答えが戻ってきたとのこと。

<img width="865" alt="Screen Shot 2019-04-19 at 9.11.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/1a3f155d-7146-0d4a-a918-eb283d999775.png">

<img width="882" alt="Screen Shot 2019-04-19 at 9.12.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/f5fb5e95-10fe-8357-c0fc-8d82f63e5226.png">

このRecapのところの more informationには、有用な論文の紹介あるので、参考になります。

<img width="767" alt="Screen Shot 2019-04-19 at 9.12.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/91653d99-303d-82cb-fbb4-4f32074a79f9.png">

次に、２つ目のデモのSocial Network Analysisにはいかず、Learnをクリックしてみましょう。

<img width="754" alt="Screen Shot 2019-04-19 at 9.13.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/f35bcc0e-8070-1ac6-0e34-bbcd794e462f.png">

ここまでだと、概要で、本当のソースを見ながらD-Waveの実機を動かしてみたいとおもうので人情だとおもいます。さすがD-Waveそのあたりもちゃんと公開してくれています。

このFactoring以外にも、２個目のDEMOのSocial Network Analysisや、アニーリングのスケジュール、リバースアニーリングのJupyterNote形式で公開されています。

<img width="811" alt="Screen Shot 2019-04-19 at 9.13.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/af9a5ebe-8b5e-4903-95a6-8f0202c28f0f.png">


<img width="885" alt="Screen Shot 2019-04-19 at 9.14.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260261/79d0faa8-d542-383e-621c-8694f866543c.png">


このjupyter noteのソースコードはDownloadもできますので詳細を今後2個目DEMOのSocial Network Analysisも含め、どこかで紹介をしていこうと思います。

今日はこのくらいで。。。