def purge_run(self, run): # Remove bad tasks purged = False chi2 = calculate_residuals(run) if 'bad_tasks' not in run: run['bad_tasks'] = [] for task in run['tasks']: if task['worker_key'] in chi2['bad_users']: purged = True task['bad'] = True run['bad_tasks'].append(task) run['tasks'].remove(task) if purged: # Generate new tasks if needed run['results_stale'] = True results = self.get_results(run) played_games = results['wins'] + results['losses'] + results['draws'] if played_games < run['args']['num_games']: run['tasks'] += self.generate_tasks( run['args']['num_games'] - played_games) run['finished'] = False if 'sprt' in run['args'] and 'state' in run['args']['sprt']: fishtest.stats.stat_util.update_SPRT(results, run['args']['sprt']) run['args']['sprt']['state'] = '' self.buffer(run, True) return purged
def purge_run(self, run): # Remove bad tasks purged = False chi2 = calculate_residuals(run) if "bad_tasks" not in run: run["bad_tasks"] = [] for task in run["tasks"]: if task["worker_key"] in chi2["bad_users"]: purged = True task["bad"] = True run["bad_tasks"].append(task) run["tasks"].remove(task) if purged: # Generate new tasks if needed run["results_stale"] = True results = self.get_results(run) played_games = results["wins"] + results["losses"] + results["draws"] if played_games < run["args"]["num_games"]: run["tasks"] += self.generate_tasks( run["args"]["num_games"] - played_games ) run["finished"] = False if "sprt" in run["args"] and "state" in run["args"]["sprt"]: fishtest.stats.stat_util.update_SPRT(results, run["args"]["sprt"]) run["args"]["sprt"]["state"] = "" self.buffer(run, True) return purged
def tests_view(request): run = request.rundb.get_run(request.matchdict['id']) if run is None: raise exception_response(404) results = request.rundb.get_results(run) run['results_info'] = format_results(results, run) run_args = [('id', str(run['_id']), '')] for name in [ 'new_tag', 'new_signature', 'new_options', 'resolved_new', 'base_tag', 'base_signature', 'base_options', 'resolved_base', 'sprt', 'num_games', 'spsa', 'tc', 'threads', 'book', 'book_depth', 'auto_purge', 'priority', 'itp', 'username', 'tests_repo', 'info' ]: if name not in run['args']: continue value = run['args'][name] url = '' if name == 'new_tag' and 'msg_new' in run['args']: value += ' (' + run['args']['msg_new'][:50] + ')' if name == 'base_tag' and 'msg_base' in run['args']: value += ' (' + run['args']['msg_base'][:50] + ')' if name == 'sprt' and value != '-': value = 'elo0: %.2f alpha: %.2f elo1: %.2f beta: %.2f state: %s (%s)' % \ (value['elo0'], value['alpha'], value['elo1'], value['beta'], value.get('state', '-'), value.get('elo_model', 'BayesElo')) if name == 'spsa' and value != '-': iter_local = value['iter'] + 1 # assume at least one completed, # and avoid division by zero A = value['A'] alpha = value['alpha'] gamma = value['gamma'] summary = 'Iter: %d, A: %d, alpha %0.3f, gamma %0.3f, clipping %s, rounding %s' \ % (iter_local, A, alpha, gamma, value['clipping'] if 'clipping' in value else 'old', value['rounding'] if 'rounding' in value else 'deterministic') params = value['params'] value = [summary] for p in params: value.append([ p['name'], '{:.2f}'.format(p['theta']), int(p['start']), int(p['min']), int(p['max']), '{:.3f}'.format(p['c'] / (iter_local**gamma)), '{:.3f}'.format(p['a'] / (A + iter_local)**alpha) ]) if 'tests_repo' in run['args']: if name == 'new_tag': url = run['args']['tests_repo'] + '/commit/' + run['args'][ 'resolved_new'] elif name == 'base_tag': url = run['args']['tests_repo'] + '/commit/' + run['args'][ 'resolved_base'] elif name == 'tests_repo': url = value if name == 'spsa': run_args.append(('spsa', value, '')) else: try: strval = str(value) except: strval = value.encode('ascii', 'replace') strval = html.escape(strval) run_args.append((name, strval, url)) active = 0 cores = 0 for task in run['tasks']: if task['active']: active += 1 cores += task['worker_info']['concurrency'] last_updated = task.get('last_updated', datetime.datetime.min) task['last_updated'] = last_updated if run['args'].get('sprt'): page_title = 'SPRT {} vs {}'.format(run['args']['new_tag'], run['args']['base_tag']) elif run['args'].get('spsa'): page_title = 'SPSA {}'.format(run['args']['new_tag']) else: page_title = '{} games - {} vs {}'.format(run['args']['num_games'], run['args']['new_tag'], run['args']['base_tag']) return { 'run': run, 'run_args': run_args, 'page_title': page_title, 'approver': has_permission('approve_run', request.context, request), 'chi2': calculate_residuals(run), 'totals': '(%s active worker%s with %s core%s)' % (active, ('s' if active != 1 else ''), cores, ('s' if cores != 1 else '')) }
def tests_view(request): run = request.rundb.get_run(request.matchdict["id"]) if run is None: raise exception_response(404) results = request.rundb.get_results(run) run["results_info"] = format_results(results, run) run_args = [("id", str(run["_id"]), "")] if run.get("rescheduled_from"): run_args.append(("rescheduled_from", run["rescheduled_from"], "")) for name in [ "new_tag", "new_signature", "new_options", "resolved_new", "new_net", "base_tag", "base_signature", "base_options", "resolved_base", "base_net", "sprt", "num_games", "spsa", "tc", "threads", "book", "book_depth", "auto_purge", "priority", "itp", "username", "tests_repo", "info", ]: if name not in run["args"]: continue value = run["args"][name] url = "" if name == "new_tag" and "msg_new" in run["args"]: value += " (" + run["args"]["msg_new"][:50] + ")" if name == "base_tag" and "msg_base" in run["args"]: value += " (" + run["args"]["msg_base"][:50] + ")" if name == "sprt" and value != "-": value = "elo0: %.2f alpha: %.2f elo1: %.2f beta: %.2f state: %s (%s)" % ( value["elo0"], value["alpha"], value["elo1"], value["beta"], value.get("state", "-"), value.get("elo_model", "BayesElo"), ) if name == "spsa" and value != "-": iter_local = value["iter"] + 1 # assume at least one completed, # and avoid division by zero A = value["A"] alpha = value["alpha"] gamma = value["gamma"] summary = ( "Iter: %d, A: %d, alpha %0.3f, gamma %0.3f, clipping %s, rounding %s" % ( iter_local, A, alpha, gamma, value["clipping"] if "clipping" in value else "old", value["rounding"] if "rounding" in value else "deterministic", )) params = value["params"] value = [summary] for p in params: value.append([ p["name"], "{:.2f}".format(p["theta"]), int(p["start"]), int(p["min"]), int(p["max"]), "{:.3f}".format(p["c"] / (iter_local**gamma)), "{:.3f}".format(p["a"] / (A + iter_local)**alpha), ]) if "tests_repo" in run["args"]: if name == "new_tag": url = (run["args"]["tests_repo"] + "/commit/" + run["args"]["resolved_new"]) elif name == "base_tag": url = (run["args"]["tests_repo"] + "/commit/" + run["args"]["resolved_base"]) elif name == "tests_repo": url = value if name == "spsa": run_args.append(("spsa", value, "")) else: try: strval = str(value) except: strval = value.encode("ascii", "replace") if name not in ["new_tag", "base_tag"]: strval = html.escape(strval) run_args.append((name, strval, url)) active = 0 cores = 0 for task in run["tasks"]: if task["active"]: active += 1 cores += task["worker_info"]["concurrency"] last_updated = task.get("last_updated", datetime.datetime.min) task["last_updated"] = last_updated if run["args"].get("sprt"): page_title = "SPRT {} vs {}".format(run["args"]["new_tag"], run["args"]["base_tag"]) elif run["args"].get("spsa"): page_title = "SPSA {}".format(run["args"]["new_tag"]) else: page_title = "{} games - {} vs {}".format(run["args"]["num_games"], run["args"]["new_tag"], run["args"]["base_tag"]) return { "run": run, "run_args": run_args, "page_title": page_title, "approver": has_permission("approve_run", request.context, request), "chi2": calculate_residuals(run), "totals": "(%s active worker%s with %s core%s)" % (active, ("s" if active != 1 else ""), cores, ("s" if cores != 1 else "")), }