Commit 62d5f661 authored by Kento HASEGAWA's avatar Kento HASEGAWA

Update UI to support selective and parallel processing

parent 66c1b321
......@@ -36,6 +36,14 @@ def webui_parte_workers():
else:
return abort(404)
@webui.route('/part/solver-status')
def webui_part_solver_status():
if (adc2019system.role is not None) and (adc2019system.role.type == 'host'):
workers = adc2019system.role.get_workers()
return render_template('part_system_summary.html', workers=workers)
else:
return abort(404)
@webui.route('/part/request/<request_id>')
def webui_part_request_status(request_id=None):
if (adc2019system.role is not None) and (adc2019system.role.type == 'host'):
......@@ -45,17 +53,18 @@ def webui_part_request_status(request_id=None):
return abort(404)
@webui.route('/part/problem/<name>')
def webui_partem_status(name=None):
def webui_part_problem_status(name=None):
if name is None:
return abort(404)
if (adc2019system.role is not None) and (adc2019system.role.type == 'host'):
problem = adc2019system.role.get_problem(name)
workers = adc2019system.role.get_workers()
if problem is None:
return abort(404)
else:
return render_template('part_problem_status.html', problem=problem)
return render_template('part_problem_status.html', problem=problem, workers=workers)
else:
return abort(404)
......
......@@ -46,13 +46,13 @@ class Host(object):
def get_workers(self):
return self.worker_manager.get_workers()
def distribute_problem(self, problem_key):
def distribute_problem(self, problem_key, solvers=None):
problem = self.get_problem(problem_key)
if problem is None:
return {'status': 'key error'}
else:
request = Request(self.worker_manager, problem.get_dict())
request = Request(self.worker_manager, problem.get_dict(), solvers=solvers)
request_id = request.get_id()
self.request[request_id] = request
......@@ -128,7 +128,11 @@ class Host(object):
elif cmd == 'problem/solve':
# params['problem']に指定された問題をworkerに配信
problem_key = params['problem']
return self.distribute_problem(problem_key)
if 'solvers' in params:
solvers = params['solvers']
else:
solvers = None
return self.distribute_problem(problem_key, solvers)
elif cmd == 'problem/solution':
self.store_solution(params)
return {'status': 'received'}
......@@ -169,7 +173,7 @@ class WorkerManager(object):
def request_stop(self):
self.broadcast('stop', {})
def broadcast(self, cmd, params):
def broadcast(self, cmd, params, solvers=None):
threads = []
......@@ -213,7 +217,7 @@ class Worker(object):
class Request(object):
def __init__(self, worker_manager, data, timeout=10):
def __init__(self, worker_manager, data, timeout=10000, solvers=None):
self.worker_manager = worker_manager
self.data = data
......@@ -222,6 +226,8 @@ class Request(object):
self.request_id = time.time()
self.broadcast_time = None
self.solvers = solvers
self.response = dict()
@property
......@@ -254,10 +260,14 @@ class Request(object):
status = ''
if worker_count == response_count:
status = 'done'
elif time.time() - self.broadcast_time > self.timeout:
status = 'timeout'
# elif time.time() - self.broadcast_time > self.timeout:
# status = 'timeout'
else:
status = 'processing'
elapsed_time = time.time() - self.broadcast_time
et_minutes = int(elapsed_time // 60)
et_seconds = int(elapsed_time % 60)
# status = 'processing'
status = f'{et_minutes}:{et_seconds:02}'
if self.broadcast_time is None:
progress = 0,
......@@ -285,5 +295,5 @@ class Request(object):
}
def broadcast(self):
self.worker_manager.broadcast('solve', self.request_data)
self.worker_manager.broadcast('solve', self.request_data, solvers=self.solvers)
self.broadcast_time = time.time()
......@@ -6,6 +6,7 @@ class StatusView {
this.container = $(selector);
this.problem_key = null;
this.request_refresh_timer = null;
// this.solver_status_refresh_timer = null;
this.event = Object();
}
......@@ -39,20 +40,50 @@ class StatusView {
var problem_name = $(e.target).parent("tr").data("problem");
var viewer_url = "/view/solution#" + problem_name + "/" + solution_id;
window.open(viewer_url, "_blank");
})
});
_this.container.find('#chk-solver-all').prop('checked', true);
_this.container.find('#chk-solver-all').on('change', (e) => {
var _me = $(e.target);
if(_me.prop('checked')){
_this.container.find('#solver-list-table-wrapper .chk-solver').each((i, el) => {
$(el).prop('checked', true);
});
}else{
_this.container.find('#solver-list-table-wrapper .chk-solver').each((i, el) => {
$(el).prop('checked', false);
});
}
}).trigger('change');
// _this.solver_status_refresh_timer = setInterval((function _t(){
// _this.refresh_solver_status();
// return _t;
// }()), 1000);
});
}
// 問題を解くのをスタート
start_solver(){
var _this = this;
var solvers = new Array();
_this.container.find('#solver-list-table-wrapper .chk-solver:checked').each((i, el) => {
var _val = $(el).val();
solvers.push(_val);
});
console.log(solvers);
$.ajax({
type: "POST",
dataType: "json",
url: "/api/problem/solve",
data: JSON.stringify({
"problem": _this.problem_key
"problem": _this.problem_key,
"solvers": solvers
}),
contentType: 'application/json'
}).done((d) => {
......
......@@ -10,6 +10,40 @@
{#% endif %#}
</div>
<div id="solver-list-container">
<h4>ソルバ一覧</h4>
<div id="solver-list-table-wrapper">
<table class="table table-bordered table-sm" id="workers-table">
<thead>
<tr>
<th>
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" name="solver-all" id="chk-solver-all">
</div>
</th>
<th class="">Worker</th>
<th class="">Status</th>
</tr>
</thead>
<tbody>
{% for k, w in workers.items() %}
<tr class="worker-status-row" data-cname="{{w.name}}">
<td>
<div class="form-group form-check">
<input type="checkbox" class="form-check-input chk-solver" name="solver-{{k}}" id="chk-solver-{{k}}" value="{{k}}">
</div>
</td>
<td class="worker-status-name">
{{w.name}} ({{w.address}})
</td>
<td class="worker-status-value">{{w.status}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div id='solution-list-container'>
<h4>処理結果一覧</h4>
<table class="table table-bordered table-striped">
......
<table class="table table-bordered" id="workers-table">
<thead>
<tr>
<th class="">Worker</th>
<th class="">Status</th>
</tr>
</thead>
<tbody>
{% for k, w in workers.items() %}
<tr class="worker-status-row" data-cname="{{w.name}}">
<td class="worker-status-name">
{{w.name}} ({{w.address}})
</td>
<td class="worker-status-value">{{w.status}}</td>
</tr>
{% endfor %}
</tbody>
</table>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment