diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-04-08 16:42:43 -0400 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-04-08 16:42:43 -0400 |
| commit | 40df618c33f56fcdcbc9afc1f4b963e7dfe23a10 (patch) | |
| tree | 2a58d482d3fdf8d8dcdd1aaa3ecd9def7a803a09 | |
| parent | 2ddd4b06389b7dde8c8fbb43b19b23fde5c40b22 (diff) | |
Create generator map in gen/__init__.py.
| -rw-r--r-- | gen/__init__.py | 6 | ||||
| -rw-r--r-- | gen/edf_generators.py | 8 | ||||
| -rw-r--r-- | gen/generator.py | 25 | ||||
| -rwxr-xr-x | gen_exps.py | 28 |
4 files changed, 40 insertions, 27 deletions
diff --git a/gen/__init__.py b/gen/__init__.py index e69de29..8c60b46 100644 --- a/gen/__init__.py +++ b/gen/__init__.py | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | import generator as gen | ||
| 2 | import edf_generators as edf | ||
| 3 | |||
| 4 | gen.register_generator("G-EDF", edf.GedfGenerator) | ||
| 5 | gen.register_generator("P-EDF", edf.PedfGenerator) | ||
| 6 | gen.register_generator("C-EDF", edf.CedfGenerator) | ||
diff --git a/gen/edf_generators.py b/gen/edf_generators.py index 78b0ba1..3f05b76 100644 --- a/gen/edf_generators.py +++ b/gen/edf_generators.py | |||
| @@ -9,8 +9,8 @@ TP_PART_TASK = TP_TBASE.format("-p $t.cpu") | |||
| 9 | 9 | ||
| 10 | class EdfGenerator(gen.Generator): | 10 | class EdfGenerator(gen.Generator): |
| 11 | '''Creates sporadic task sets with the most common Litmus options.''' | 11 | '''Creates sporadic task sets with the most common Litmus options.''' |
| 12 | def __init__(self, name, templates, options, params): | 12 | def __init__(self, scheduler, templates, options, params): |
| 13 | super(EdfGenerator, self).__init__(name, templates, | 13 | super(EdfGenerator, self).__init__(scheduler, templates, |
| 14 | self.__make_options() + options, | 14 | self.__make_options() + options, |
| 15 | params) | 15 | params) |
| 16 | 16 | ||
| @@ -45,8 +45,8 @@ class EdfGenerator(gen.Generator): | |||
| 45 | 45 | ||
| 46 | 46 | ||
| 47 | class PartitionedGenerator(EdfGenerator): | 47 | class PartitionedGenerator(EdfGenerator): |
| 48 | def __init__(self, name, templates, options, params): | 48 | def __init__(self, scheduler, templates, options, params): |
| 49 | super(PartitionedGenerator, self).__init__(name, | 49 | super(PartitionedGenerator, self).__init__(scheduler, |
| 50 | templates + [TP_PART_TASK], options, params) | 50 | templates + [TP_PART_TASK], options, params) |
| 51 | 51 | ||
| 52 | def _customize(self, taskset, exp_params): | 52 | def _customize(self, taskset, exp_params): |
diff --git a/gen/generator.py b/gen/generator.py index 56563b1..f35a22b 100644 --- a/gen/generator.py +++ b/gen/generator.py | |||
| @@ -51,14 +51,14 @@ class Generator(object): | |||
| 51 | This class also performs checks of parameter values and prints out help. | 51 | This class also performs checks of parameter values and prints out help. |
| 52 | All subclasses must implement _create_exp. | 52 | All subclasses must implement _create_exp. |
| 53 | ''' | 53 | ''' |
| 54 | def __init__(self, name, templates, options, params): | 54 | def __init__(self, scheduler, templates, options, params): |
| 55 | self.options = self.__make_options(params) + options | 55 | self.options = self.__make_options(params) + options |
| 56 | 56 | ||
| 57 | self.__setup_params(params) | 57 | self.__setup_params(params) |
| 58 | 58 | ||
| 59 | self.params = params | 59 | self.params = params |
| 60 | self.template = "\n".join([TP_RM] + templates) | 60 | self.template = "\n".join([TP_RM] + templates) |
| 61 | self.name = name | 61 | self.scheduler = scheduler |
| 62 | 62 | ||
| 63 | def __make_options(self, params): | 63 | def __make_options(self, params): |
| 64 | '''Return generic Litmus options.''' | 64 | '''Return generic Litmus options.''' |
| @@ -137,7 +137,7 @@ class Generator(object): | |||
| 137 | 137 | ||
| 138 | exp_params_file = self.out_dir + "/" + DEFAULTS['params_file'] | 138 | exp_params_file = self.out_dir + "/" + DEFAULTS['params_file'] |
| 139 | with open(exp_params_file, 'wa') as f: | 139 | with open(exp_params_file, 'wa') as f: |
| 140 | params['scheduler'] = self.name | 140 | params['scheduler'] = self.scheduler |
| 141 | pprint.pprint(params, f) | 141 | pprint.pprint(params, f) |
| 142 | 142 | ||
| 143 | if tasks: | 143 | if tasks: |
| @@ -210,7 +210,7 @@ class Generator(object): | |||
| 210 | for dp in DesignPointGenerator(self.params): | 210 | for dp in DesignPointGenerator(self.params): |
| 211 | for trial in xrange(trials): | 211 | for trial in xrange(trials): |
| 212 | # Create directory name from relevant parameters | 212 | # Create directory name from relevant parameters |
| 213 | dir_leaf = "sched=%s_%s" % (self.name, col_map.encode(dp)) | 213 | dir_leaf = "sched=%s_%s" % (self.scheduler, col_map.encode(dp)) |
| 214 | dir_leaf = dir_leaf.strip('_') # If there are none | 214 | dir_leaf = dir_leaf.strip('_') # If there are none |
| 215 | dir_leaf += ("_trial=%s" % trial) if trials > 1 else "" | 215 | dir_leaf += ("_trial=%s" % trial) if trials > 1 else "" |
| 216 | 216 | ||
| @@ -239,12 +239,12 @@ class Generator(object): | |||
| 239 | 239 | ||
| 240 | def print_help(self): | 240 | def print_help(self): |
| 241 | display_options = [o for o in self.options if not o.hidden] | 241 | display_options = [o for o in self.options if not o.hidden] |
| 242 | s = str(Template("""Generator $name: | 242 | s = str(Template("""scheduler $scheduler: |
| 243 | #for $o in $options | 243 | #for $o in $options |
| 244 | $o.name -- $o.help | 244 | $o.name -- $o.help |
| 245 | \tDefault: $o.default | 245 | \tDefault: $o.default |
| 246 | \tAllowed: $o.types | 246 | \tAllowed: $o.types |
| 247 | #end for""", searchList={'name':self.name, 'options':display_options})) | 247 | #end for""", searchList={'scheduler':self.scheduler, 'options':display_options})) |
| 248 | 248 | ||
| 249 | # Has to be an easier way to print this out... | 249 | # Has to be an easier way to print this out... |
| 250 | for line in s.split("\n"): | 250 | for line in s.split("\n"): |
| @@ -258,3 +258,12 @@ class Generator(object): | |||
| 258 | res = [" "*Generator.HELP_INDENT +res[-1]] | 258 | res = [" "*Generator.HELP_INDENT +res[-1]] |
| 259 | i = Generator.HELP_INDENT + len(word) | 259 | i = Generator.HELP_INDENT + len(word) |
| 260 | print(", ".join(res)) | 260 | print(", ".join(res)) |
| 261 | |||
| 262 | |||
| 263 | generators = {} | ||
| 264 | |||
| 265 | def register_generator(name, clazz): | ||
| 266 | generators[name] = clazz | ||
| 267 | |||
| 268 | def get_generators(): | ||
| 269 | return generators | ||
diff --git a/gen_exps.py b/gen_exps.py index 8688ae9..6488cdc 100755 --- a/gen_exps.py +++ b/gen_exps.py | |||
| @@ -1,18 +1,14 @@ | |||
| 1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python |
| 2 | from __future__ import print_function | 2 | from __future__ import print_function |
| 3 | 3 | ||
| 4 | import gen.generator as gen | ||
| 4 | import os | 5 | import os |
| 5 | import re | 6 | import re |
| 6 | import shutil as sh | 7 | import shutil as sh |
| 8 | import sys | ||
| 7 | 9 | ||
| 8 | from gen.edf_generators import GedfGenerator,PedfGenerator,CedfGenerator | ||
| 9 | from optparse import OptionParser | 10 | from optparse import OptionParser |
| 10 | 11 | ||
| 11 | # There has to be a better way to do this... | ||
| 12 | GENERATORS = {'C-EDF':CedfGenerator, | ||
| 13 | 'P-EDF':PedfGenerator, | ||
| 14 | 'G-EDF':GedfGenerator} | ||
| 15 | |||
| 16 | def parse_args(): | 12 | def parse_args(): |
| 17 | parser = OptionParser("usage: %prog [options] [files...] " | 13 | parser = OptionParser("usage: %prog [options] [files...] " |
| 18 | "[generators...] [param=val[,val]...]") | 14 | "[generators...] [param=val[,val]...]") |
| @@ -51,13 +47,14 @@ def main(): | |||
| 51 | 47 | ||
| 52 | # Print generator information on the command line | 48 | # Print generator information on the command line |
| 53 | if opts.list_gens: | 49 | if opts.list_gens: |
| 54 | print(", ".join(GENERATORS.keys())) | 50 | print(", ".join(gen.get_generators())) |
| 55 | if opts.described != None: | 51 | if opts.described != None: |
| 56 | for generator in opts.described.split(','): | 52 | for generator in opts.described.split(','): |
| 57 | if generator not in GENERATORS: | 53 | if generator not in gen.get_generators(): |
| 58 | print("No generator '%s'" % generator) | 54 | print("No generator '%s'" % generator) |
| 59 | else: | 55 | else: |
| 60 | GENERATORS[generator]().print_help() | 56 | sys.stdout.write("Generator '%s', " % generator) |
| 57 | gen.get_generators()[generator]().print_help() | ||
| 61 | if opts.list_gens or opts.described: | 58 | if opts.list_gens or opts.described: |
| 62 | return 0 | 59 | return 0 |
| 63 | 60 | ||
| @@ -65,10 +62,9 @@ def main(): | |||
| 65 | 62 | ||
| 66 | # Ensure some generator is loaded | 63 | # Ensure some generator is loaded |
| 67 | args = list(set(args) - set(params)) | 64 | args = list(set(args) - set(params)) |
| 68 | #TODO: get every loaded plugin, try and use that generator | 65 | args = args or gen.get_generators().keys() |
| 69 | args = args or ['C-EDF', 'G-EDF', 'P-EDF'] | ||
| 70 | 66 | ||
| 71 | # Split into files to load, named generators | 67 | # Split into files to load and named generators |
| 72 | files = filter(os.path.exists, args) | 68 | files = filter(os.path.exists, args) |
| 73 | gen_list = list(set(args) - set(files)) | 69 | gen_list = list(set(args) - set(files)) |
| 74 | 70 | ||
| @@ -86,13 +82,15 @@ def main(): | |||
| 86 | os.mkdir(opts.out_dir) | 82 | os.mkdir(opts.out_dir) |
| 87 | 83 | ||
| 88 | for gen_name, gen_params in exp_sets: | 84 | for gen_name, gen_params in exp_sets: |
| 89 | if gen_name not in GENERATORS: | 85 | if gen_name not in gen.get_generators(): |
| 90 | raise ValueError("Invalid generator name: %s" % gen_name) | 86 | raise ValueError("Invalid generator '%s'" % gen_name) |
| 91 | 87 | ||
| 92 | print("Creating experiments using %s generator..." % gen_name) | 88 | print("Creating experiments using %s generator..." % gen_name) |
| 93 | 89 | ||
| 94 | params = dict(gen_params.items() + global_params.items()) | 90 | params = dict(gen_params.items() + global_params.items()) |
| 95 | generator = GENERATORS[gen_name](params=params) | 91 | clazz = gen.get_generators()[gen_name] |
| 92 | |||
| 93 | generator = clazz(params=params) | ||
| 96 | 94 | ||
| 97 | generator.create_exps(opts.out_dir, opts.force, opts.trials) | 95 | generator.create_exps(opts.out_dir, opts.force, opts.trials) |
| 98 | 96 | ||
