diff options
Diffstat (limited to 'bestflags/example_algorithms.py')
-rw-r--r-- | bestflags/example_algorithms.py | 272 |
1 files changed, 146 insertions, 126 deletions
diff --git a/bestflags/example_algorithms.py b/bestflags/example_algorithms.py index 9775d491..c39b2943 100644 --- a/bestflags/example_algorithms.py +++ b/bestflags/example_algorithms.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. +# Copyright 2013 The ChromiumOS Authors # 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. @@ -10,7 +10,7 @@ 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)' +__author__ = "yuhenglong@google.com (Yuheng Long)" import json import multiprocessing @@ -27,170 +27,190 @@ 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') +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' +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' +NUM_TESTER = "NUM_TESTER" DEFAULT_NUM_TESTER = 1 -STOP_THRESHOLD = 'STOP_THRESHOLD' +STOP_THRESHOLD = "STOP_THRESHOLD" DEFAULT_STOP_THRESHOLD = 1 -NUM_CHROMOSOMES = 'NUM_CHROMOSOMES' +NUM_CHROMOSOMES = "NUM_CHROMOSOMES" DEFAULT_NUM_CHROMOSOMES = 20 -NUM_TRIALS = 'NUM_TRIALS' +NUM_TRIALS = "NUM_TRIALS" DEFAULT_NUM_TRIALS = 20 -MUTATION_RATE = 'MUTATION_RATE' +MUTATION_RATE = "MUTATION_RATE" DEFAULT_MUTATION_RATE = 0.01 def _ProcessGA(meta_data): - """Set up the meta data for the genetic algorithm. + """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] + 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] + 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 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 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_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 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 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_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 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] + if MUTATION_RATE not in meta_data: + mutation_rate = DEFAULT_MUTATION_RATE + else: + mutation_rate = meta_data[MUTATION_RATE] - specs = flags.ReadConf(conf_file) + 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. + 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) + # 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)] + # 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) + # Execute the experiment. + _StartExperiment(num_builders, num_testers, generations) def _ParseJson(file_name): - """Parse the input json file. + """Parse the input json file. - Parse the input json file and call the proper function to perform the - algorithms. + Parse the input json file and call the proper function to perform the + algorithms. - Args: - file_name: the input json file name. - """ + Args: + file_name: the input json file name. + """ - experiments = json.load(open(file_name)) + experiments = json.load(open(file_name)) - for experiment in experiments: - if experiment == 'GA': - # An GA experiment - _ProcessGA(experiments[experiment]) + 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() + """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) + (options, _) = parser.parse_args(argv) + assert options.filename + _ParseJson(options.filename) -if __name__ == '__main__': - main(sys.argv) +if __name__ == "__main__": + main(sys.argv) |