You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
5.5 KiB
217 lines
5.5 KiB
# 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.
|
|
|
|
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)
|