# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""An example main file running the algorithms.

Part of the Chrome build flags optimization.

An example use of the framework. It parses the input json configuration file.
Then it initiates the variables of the generation. Finally, it sets up the
processes for different modules and runs the experiment.
"""

__author__ = 'yuhenglong@google.com (Yuheng Long)'

import json
import multiprocessing
from optparse import OptionParser
import sys

import flags
from genetic_algorithm import GAGeneration
from pipeline_process import PipelineProcess
import pipeline_worker
from steering import Steering
from task import BUILD_STAGE
from task import Task
from task import TEST_STAGE
import testing_batch

parser = OptionParser()

parser.add_option('-f', '--file', dest='filename',
                  help='configuration file FILE input', metavar='FILE')

# The meta data for the genetic algorithm.
BUILD_CMD = 'BUILD_CMD'
TEST_CMD = 'TEST_CMD'
OUTPUT = 'OUTPUT'
DEFAULT_OUTPUT = 'output'
CONF = 'CONF'
DEFAULT_CONF = 'conf'
NUM_BUILDER = 'NUM_BUILDER'
DEFAULT_NUM_BUILDER = 1
NUM_TESTER = 'NUM_TESTER'
DEFAULT_NUM_TESTER = 1
STOP_THRESHOLD = 'STOP_THRESHOLD'
DEFAULT_STOP_THRESHOLD = 1
NUM_CHROMOSOMES = 'NUM_CHROMOSOMES'
DEFAULT_NUM_CHROMOSOMES = 20
NUM_TRIALS = 'NUM_TRIALS'
DEFAULT_NUM_TRIALS = 20
MUTATION_RATE = 'MUTATION_RATE'
DEFAULT_MUTATION_RATE = 0.01


def _ProcessGA(meta_data):
  """Set up the meta data for the genetic algorithm.

  Args:
    meta_data: the meta data for the genetic algorithm.
  """
  assert BUILD_CMD in meta_data
  build_cmd = meta_data[BUILD_CMD]

  assert TEST_CMD in meta_data
  test_cmd = meta_data[TEST_CMD]

  if OUTPUT not in meta_data:
    output_file = DEFAULT_OUTPUT
  else:
    output_file = meta_data[OUTPUT]

  if CONF not in meta_data:
    conf_file = DEFAULT_CONF
  else:
    conf_file = meta_data[CONF]

  if NUM_BUILDER not in meta_data:
    num_builders = DEFAULT_NUM_BUILDER
  else:
    num_builders = meta_data[NUM_BUILDER]

  if NUM_TESTER not in meta_data:
    num_testers = DEFAULT_NUM_TESTER
  else:
    num_testers = meta_data[NUM_TESTER]

  if STOP_THRESHOLD not in meta_data:
    stop_threshold = DEFAULT_STOP_THRESHOLD
  else:
    stop_threshold = meta_data[STOP_THRESHOLD]

  if NUM_CHROMOSOMES not in meta_data:
    num_chromosomes = DEFAULT_NUM_CHROMOSOMES
  else:
    num_chromosomes = meta_data[NUM_CHROMOSOMES]

  if NUM_TRIALS not in meta_data:
    num_trials = DEFAULT_NUM_TRIALS
  else:
    num_trials = meta_data[NUM_TRIALS]

  if MUTATION_RATE not in meta_data:
    mutation_rate = DEFAULT_MUTATION_RATE
  else:
    mutation_rate = meta_data[MUTATION_RATE]

  specs = flags.ReadConf(conf_file)

  # Initiate the build/test command and the log directory.
  Task.InitLogCommand(build_cmd, test_cmd, output_file)

  # Initiate the build/test command and the log directory.
  GAGeneration.InitMetaData(stop_threshold, num_chromosomes, num_trials,
                            specs, mutation_rate)

  # Generate the initial generations.
  generation_tasks = testing_batch.GenerateRandomGATasks(specs, num_chromosomes,
                                                         num_trials)
  generations = [GAGeneration(generation_tasks, set([]), 0)]

  # Execute the experiment.
  _StartExperiment(num_builders, num_testers, generations)


def _ParseJson(file_name):
  """Parse the input json file.

  Parse the input json file and call the proper function to perform the
  algorithms.

  Args:
    file_name: the input json file name.
  """

  experiments = json.load(open(file_name))

  for experiment in experiments:
    if experiment == 'GA':
      # An GA experiment
      _ProcessGA(experiments[experiment])


def _StartExperiment(num_builders, num_testers, generations):
  """Set up the experiment environment and execute the framework.

  Args:
    num_builders: number of concurrent builders.
    num_testers: number of concurrent testers.
    generations: the initial generation for the framework.
  """

  manager = multiprocessing.Manager()

  # The queue between the steering algorithm and the builder.
  steering_build = manager.Queue()
  # The queue between the builder and the tester.
  build_test = manager.Queue()
  # The queue between the tester and the steering algorithm.
  test_steering = manager.Queue()

  # Set up the processes for the builder, tester and steering algorithm module.
  build_process = PipelineProcess(num_builders, 'builder', {}, BUILD_STAGE,
                                  steering_build, pipeline_worker.Helper,
                                  pipeline_worker.Worker, build_test)

  test_process = PipelineProcess(num_testers, 'tester', {}, TEST_STAGE,
                                 build_test, pipeline_worker.Helper,
                                 pipeline_worker.Worker, test_steering)

  steer_process = multiprocessing.Process(target=Steering,
                                          args=(set([]), generations,
                                                test_steering, steering_build))

  # Start the processes.
  build_process.start()
  test_process.start()
  steer_process.start()

  # Wait for the processes to finish.
  build_process.join()
  test_process.join()
  steer_process.join()


def main(argv):
  (options, _) = parser.parse_args(argv)
  assert options.filename
  _ParseJson(options.filename)


if __name__ == '__main__':
  main(sys.argv)
