aboutsummaryrefslogtreecommitdiffstats
path: root/gen_exps.py
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-02-07 11:21:23 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-02-07 11:21:23 -0500
commit39020cf5ae3030bc15035925a0c72eb44eea67b7 (patch)
treefb82b339c1e5c14334f8d9839f8d836b120fbb08 /gen_exps.py
parentd524da9bd072ad1be4ac0d633e3e783094ddc2d7 (diff)
Added gen_exps.py script.
Diffstat (limited to 'gen_exps.py')
-rwxr-xr-x[-rw-r--r--]gen_exps.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/gen_exps.py b/gen_exps.py
index e69de29..e4e8187 100644..100755
--- a/gen_exps.py
+++ b/gen_exps.py
@@ -0,0 +1,98 @@
1#!/usr/bin/env python
2from __future__ import print_function
3
4import os
5import re
6import shutil as sh
7
8from gen.generators import GedfGenerator,PedfGenerator,CedfGenerator
9from optparse import OptionParser
10
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():
17 parser = OptionParser("usage: %prog [options] [files...] "
18 "[generators...] [param=val[,val]...]")
19
20 parser.add_option('-o', '--out-dir', dest='out_dir',
21 help='directory for data output',
22 default=("%s/exps"%os.getcwd()))
23 parser.add_option('-f', '--force', action='store_true', default=False,
24 dest='force', help='overwrite existing data')
25 parser.add_option('-l', '--list-generators', dest='list_gens',
26 help='list allowed generators', action='store_true',
27 default=False)
28 parser.add_option('-d', '--describe-generators', metavar='generator[,..]',
29 dest='described', default=None,
30 help='describe parameters for generator(s)')
31
32 return parser.parse_args()
33
34def load_file(fname):
35 with open(fname, 'r') as f:
36 data = f.read().strip()
37 try:
38 values = eval(data)
39 if 'generator' not in values:
40 raise ValueError()
41 generator = values['generator']
42 del values['generator']
43 return generator, values
44 except:
45 raise IOError("Invalid generation file: %s" % fname)
46
47def main():
48 opts, args = parse_args()
49
50 # Print generator information on the command line
51 if opts.list_gens:
52 print(", ".join(GENERATORS.keys()))
53 if opts.described != None:
54 for generator in opts.described.split(','):
55 if generator not in GENERATORS:
56 print("No generator '%s'" % generator)
57 else:
58 GENERATORS[generator]().print_help()
59 if opts.list_gens or opts.described:
60 return 0
61
62 params = filter(lambda x : re.match("\w+=\w+", x), args)
63
64 # Ensure some generator is loaded
65 args = list(set(args) - set(params))
66 #TODO: get every loaded plugin, try and use that generator
67 args = args or ['C-EDF', 'G-EDF', 'P-EDF']
68
69 # Split into files to load, named generators
70 files = filter(os.path.exists, args)
71 gen_list = list(set(args) - set(files))
72
73 # Parse all specified parameters to be applied to every experiment
74 global_params = dict(map(lambda x : tuple(x.split("=")), params))
75 for k, v in global_params.iteritems():
76 global_params[k] = v.split(',')
77
78 exp_sets = map(load_file, files)
79 exp_sets += map(lambda x: (x, {}), gen_list)
80
81 if opts.force and os.path.exists(opts.out_dir):
82 sh.rmtree(opts.out_dir)
83 if not os.path.exists(opts.out_dir):
84 os.mkdir(opts.out_dir)
85
86 for gen_name, gen_params in exp_sets:
87 if gen_name not in GENERATORS:
88 raise ValueError("Invalid generator name: %s" % gen_name)
89
90 print("Creating experiments using %s generator..." % gen_name)
91
92 params = dict(gen_params.items() + global_params.items())
93 generator = GENERATORS[gen_name](params)
94
95 generator.create_exps(opts.out_dir, opts.force)
96
97if __name__ == '__main__':
98 main()