Loading main.py +11 −2 Changes for main.py: 11 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -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'): Loading @@ -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) Loading roles/host.py +19 −9 Changes for roles/host.py: 19 added lines, 9 removed lines. Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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'} Loading Loading @@ -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 = [] Loading Loading @@ -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 Loading @@ -222,6 +226,8 @@ class Request(object): self.request_id = time.time() self.broadcast_time = None self.solvers = solvers self.response = dict() @property Loading Loading @@ -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, Loading Loading @@ -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() static/js/adc2019.js +33 −2 Changes for static/js/adc2019.js: 33 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -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(); } Loading Loading @@ -39,7 +40,27 @@ 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); }); } Loading @@ -47,12 +68,22 @@ class StatusView { 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) => { Loading templates/part_problem_status.html +34 −0 Changes for templates/part_problem_status.html: 34 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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"> Loading templates/part_solver_status.html 0 → 100644 +18 −0 Changes for templates/part_solver_status.html: 18 added lines, 0 removed lines. Original line number Diff line number Diff line <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> Loading
main.py +11 −2 Changes for main.py: 11 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -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'): Loading @@ -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) Loading
roles/host.py +19 −9 Changes for roles/host.py: 19 added lines, 9 removed lines. Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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'} Loading Loading @@ -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 = [] Loading Loading @@ -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 Loading @@ -222,6 +226,8 @@ class Request(object): self.request_id = time.time() self.broadcast_time = None self.solvers = solvers self.response = dict() @property Loading Loading @@ -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, Loading Loading @@ -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()
static/js/adc2019.js +33 −2 Changes for static/js/adc2019.js: 33 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -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(); } Loading Loading @@ -39,7 +40,27 @@ 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); }); } Loading @@ -47,12 +68,22 @@ class StatusView { 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) => { Loading
templates/part_problem_status.html +34 −0 Changes for templates/part_problem_status.html: 34 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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"> Loading
templates/part_solver_status.html 0 → 100644 +18 −0 Changes for templates/part_solver_status.html: 18 added lines, 0 removed lines. Original line number Diff line number Diff line <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>