common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING

Nobisuke

Dekisugi


autoQAOA
DEEPSCORE

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

D-Waveガチャのフロントエンドhtmlの公開とバックエンドpython flask APIの作り方を公開!

Yuichiro Minato

2020/11/08 00:55

#量子アニーリング #D-Wave #ボルツマンマシン

2

前回の記事、

「D-Waveの実機を使ったガチャの実践pythonコードを公開!みんなで量子コンピュータや量子アニーラで一万連ガチャしよう!」

https://blueqat.com/yuichiro_minato/3eaae4a2-8b62-4660-8bb6-8cd8351c6745

では、pythonの実際の実行コードを確認しました。今回はこれをウェブアプリとして完成させるために、フロントエンドのアプリ側のhtmlコードと、それを受けるサーバーサイドのフレームワークを確認します。

flaskコード

早速サーバーサイドを先に見てみます。前回はpythonでのコードを確認しました。前回は問題をイジングの式で作り、それからD-Waveに投げてガチャをとってました。今回はアプリから指令がきたらD-Waveに問題をなげ、それをアプリ側に返します。

インストール

pip install flask

ツール自体は、Flask,request,render_templateを使います。

from flask import Flask,request, render_template

app = Flask(__name__)
token = "ここにtoken"

@app.route('/')
def hello():
  return render_template("main.html")

@app.route('/api/')
def main():
  qubo = np.array([[0,-2,10],[0,0,-1],[0,0,-0.5]])
  bqm = dimod.BQM.from_numpy_matrix(qubo)

response = EmbeddingComposite(DWaveSampler(endpoint='https://cloud.dwavesys.com/sapi', token=token, solver='Advantage_system1.1')).sample(bqm, num_reads=1)
  a = list(response.first.sample.values())

if a == [1,0,0]:
    b = "4"
  elif a == [1,1,0]:
    b = "1"
  elif a == [0,0,0]:
    b = "3"
  else:
    b = "2"

return b

if __name__ == '__main__':

app.run(host='0.0.0.0')

基本的には、インターフェイスはtemplatesのフォルダに入れます。/api/をエンドポイントとして、getで処理しました。quboを設定し、BQMに落とします。また、D-Wave側にはエンドポイントとtokenを設定し、Advantage System 1.1をしています。サンプリングの回数は1回。そして、戻ってきた結果を配列に直して、レア度と対応させます。あとはフロントエンドに戻すので、returnで設定した値を返します。

あとは、サーバーを立ち上げます。

python3 hello.py

などと実行すればサーバーが立ち上がります。portはデフォルトで:5000になっていますので、ローカルもしくはクラウド上で設定してみてください。

フォルダ構成

hello.py
-templates
main.html

フォルダ構成はシンプルです。flaskで実行するpythonファイルと、テンプレートが入っています。次にテンプレートhtmlを解説します。

htmlファイル

アプリ側はなんでも良いのですが、今回はウェブアプリとしてhtmlにしました。

<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<style>
body{font-family:courier;}
.table-bordered{border:3px solid black;}
.table-bordered tr:nth-child(3n){border-bottom:2px solid black;}
.table-bordered td:nth-child(3n){border-right:2px solid black;}
.table td{padding:0;}
input{-webkit-appearance:none;border:0;background:none;text-align:center;font-weight:bold;line-height:35px;}
.answer{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;line-height:37px;font-weight:bold;color:skyblue;opacity:0.6}
.result{color:red;}
</style>
</head>
<body>
<div class="container" style="margin-top:20px">
<div class="row">
<div class="col-12">
<img src="ガチャの絵" style="width:100%;height:auto;" id="main">
<div style="text-align:center;margin-top:5px;">
 <button id="sudoku" type="button" class="btn btn-outline-dark" style="font-size:24px;font-weight:bold;padding:1px 15px;border:3px solid black;">gacha</button>
</div>
</div>
</div>
</div>

<script
 src="https://code.jquery.com/jquery-3.3.1.min.js"
 integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
 crossorigin="anonymous"></script>

<script>
$(function(){
 var url = "ガチャのキャラの絵の入ったフォルダ";

$('#sudoku').click(function(){

var anneal = setInterval(function(){
 //数字の表示系
 $('#main').attr('src',url + (Math.floor(Math.random()*4)+1) + '.jpg');
 },50)

$.ajax({
 type  : 'GET',
 url   : '設定したエンドポイント。サーバーがわ。',
 timeout : 15000
}).done(function(data, textStatus, jqXHR) {
 clearInterval(anneal);
 $('#main').attr('src',url +data+'.jpg');
}).fail(function(jqXHR, textStatus, errorThrown) {
 clearInterval(anneal);
 $('#main').attr('src',url + '0.jpg');
});

});

})
</script>

</body>
</html>

基本的にはボタンを押したら、ajaxでgetリクエストを投げます。戻ってきたら表示するだけです。全てflaskサーバー側で処理されてるので、基本的にインターフェイスのみになります。

やってみよう

是非やってみてください。アプリ側で式を作ると、問題が大きくなったときに苦労します。ですので、サーバー側での処理をするのがコツですので、その点だけ気をつければ簡単にアプリが作れますし、スマートフォンから量子コンピュータを操作することが可能になり、可能性が広がります。以上です!

© 2025, blueqat Inc. All rights reserved