aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-04-08 16:42:43 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2013-04-08 16:42:43 -0400
commit40df618c33f56fcdcbc9afc1f4b963e7dfe23a10 (patch)
tree2a58d482d3fdf8d8dcdd1aaa3ecd9def7a803a09
parent2ddd4b06389b7dde8c8fbb43b19b23fde5c40b22 (diff)
Create generator map in gen/__init__.py.
-rw-r--r--gen/__init__.py6
-rw-r--r--gen/edf_generators.py8
-rw-r--r--gen/generator.py25
-rwxr-xr-xgen_exps.py28
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 @@
1import generator as gen
2import edf_generators as edf
3
4gen.register_generator("G-EDF", edf.GedfGenerator)
5gen.register_generator("P-EDF", edf.PedfGenerator)
6gen.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
10class EdfGenerator(gen.Generator): 10class 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
47class PartitionedGenerator(EdfGenerator): 47class 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
263generators = {}
264
265def register_generator(name, clazz):
266 generators[name] = clazz
267
268def 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
2from __future__ import print_function 2from __future__ import print_function
3 3
4import gen.generator as gen
4import os 5import os
5import re 6import re
6import shutil as sh 7import shutil as sh
8import sys
7 9
8from gen.edf_generators import GedfGenerator,PedfGenerator,CedfGenerator
9from optparse import OptionParser 10from optparse import OptionParser
10 11
11# There has to be a better way to do this...
12GENERATORS = {'C-EDF':CedfGenerator,
13 'P-EDF':PedfGenerator,
14 'G-EDF':GedfGenerator}
15
16def parse_args(): 12def 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