diff options
Diffstat (limited to 'bestflags/example_algorithms.py')
-rw-r--r-- | bestflags/example_algorithms.py | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/bestflags/example_algorithms.py b/bestflags/example_algorithms.py new file mode 100644 index 00000000..9775d491 --- /dev/null +++ b/bestflags/example_algorithms.py @@ -0,0 +1,196 @@ +# 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) |