# Copyright (c) 2013 The ChromiumOS 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)
