diff options
-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 | ||