def run_rewriter(original_solutions, tasks, num_threads, deadline): if not FLAGS.rewriter: logging.warning('Rewriter not available. Scores will suffer.') return [] rewriter_args = [FLAGS.rewriter] rewriter_args.extend(['-p', ','.join(FLAGS.powerphrase)]) task_map = {} for task in tasks: task_map[(task['id'], task['sourceSeeds'][0])] = task original_solutions = sorted( original_solutions, key=lambda solution: solution['_score'], reverse=True) solution_rank_map = collections.defaultdict(lambda: 0) jobs = [] for solution in original_solutions: key = (solution['problemId'], solution['seed']) priority = solution_rank_map[key] solution_rank_map[key] += 1 job = supervisor_util.RewriterJob( args=rewriter_args, solution=solution, priority=priority, task=task_map[(solution['problemId'], solution['seed'])], cgroup=None if FLAGS.disable_cgroup else CGROUP_NAME) jobs.append(job) soft_deadline = deadline - 0.5 start_time = time.time() logging.info( 'Start rewriter phase: jobs=%d, soft_deadline=%.1fs hard_deadline=%.1fs', len(jobs), soft_deadline - start_time, deadline - start_time) supervisor_util.run_generic_jobs(jobs, num_threads, soft_deadline, deadline) solutions = [job.solution for job in jobs if job.solution['_score'] > 0] end_time = time.time() logging.info( 'End rewriter phase: solutions=%d, time=%.1fs', len(solutions), end_time - start_time) return solutions
def run_solvers(tasks, num_threads, deadline): jobs = [] primary_tasks = [] secondary_tasks = [] primary_task_map = {} for task in tasks: if task['id'] not in primary_task_map: primary_task_map[task['id']] = task primary_tasks.append(task) else: secondary_tasks.append(task) primary_jobs_map = collections.defaultdict(list) for quick_solver in FLAGS.quick_solver: for task in tasks: job = supervisor_util.SolverJob( args=[quick_solver], task=task, priority=100, data='quick', cgroup=None if FLAGS.disable_cgroup else CGROUP_NAME) jobs.append(job) if task is primary_task_map[job.problem_id]: primary_jobs_map[job.problem_id].append(job) for heavy_solver in FLAGS.heavy_solver: for task in primary_tasks: job = supervisor_util.SolverJob( args=[heavy_solver], task=task, priority=200, data='heavy', cgroup=None if FLAGS.disable_cgroup else CGROUP_NAME) jobs.append(job) primary_jobs_map[job.problem_id].append(job) for heavy_solver in FLAGS.heavy_solver: for task in secondary_tasks: job = supervisor_util.SolverJob( args=[heavy_solver], task=task, priority=500, data='heavy', cgroup=None if FLAGS.disable_cgroup else CGROUP_NAME) jobs.append(job) register_reschedule_callbacks(job, primary_jobs_map[job.problem_id]) for extra_solver in FLAGS.extra_solver: for task in tasks: job = supervisor_util.SolverJob( args=[extra_solver], task=task, priority=900, data='extra', cgroup=None if FLAGS.disable_cgroup else CGROUP_NAME) jobs.append(job) soft_deadline = deadline - 0.5 start_time = time.time() logging.info( 'Start solver phase: jobs=%d, soft_deadline=%.1fs hard_deadline=%.1fs', len(jobs), soft_deadline - start_time, deadline - start_time) supervisor_util.run_generic_jobs(jobs, num_threads, soft_deadline, deadline) solutions = [job.solution for job in jobs if job.solution['_score'] > 0] end_time = time.time() logging.info( 'End solver phase: solutions=%d, time=%.1fs', len(solutions), end_time - start_time) return solutions