Exemple #1
0
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
Exemple #2
0
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