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

Update UI to support selective and parallel processing

parent 66c1b321
Loading
Loading
Loading
Loading
+11 −2
Changes for main.py: 11 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -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)

+19 −9
Changes for roles/host.py: 19 added lines, 9 removed lines.
Original line number Diff line number Diff line
@@ -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()
+33 −2
Changes for static/js/adc2019.js: 33 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -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,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);
        });
    }

@@ -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) => {
+34 −0
Changes for templates/part_problem_status.html: 34 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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">
+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>