common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


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