1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
#!/usr/bin/env python
from __future__ import print_function
import gen.generator as gen
import os
import re
import shutil as sh
import sys
from config.config import DEFAULTS
from optparse import OptionParser
import ecrts14.graph as graph
import schedcat.generator.tasks as tasks
def parse_args():
parser = OptionParser("usage: %prog [options] [files...] "
"[generators...] [param=val[,val]...]")
parser.add_option('-o', '--out-dir', dest='out_dir',
help='directory for data output',
default=("%s/%s"% (os.getcwd(), DEFAULTS['out-gen'])))
parser.add_option('-f', '--force', action='store_true', default=True,
dest='force', help='overwrite existing data')
parser.add_option('-n', '--num-trials', default=1, type='int', dest='trials',
help='number of task systems for every config')
parser.add_option('-l', '--list-generators', dest='list_gens',
help='list allowed generators', action='store_true',
default=False)
parser.add_option('-d', '--describe-generators', metavar='generator[,..]',
dest='described', default=None,
help='describe parameters for generator(s)')
parser.add_option('-u', '--nr-source', default=1, type='int', dest='nr_source',
help='number of source nodes')
parser.add_option('-v', '--nr-sink', default=1, type='int', dest='nr_sink',
help='number of sink nodes')
return parser.parse_args()
def load_file(fname):
with open(fname, 'r') as f:
data = f.read().strip()
try:
values = eval(data)
if 'generator' not in values:
raise ValueError()
generator = values['generator']
del values['generator']
return generator, values
except:
raise IOError("Invalid generation file: %s" % fname)
def print_descriptions(described):
for generator in described.split(','):
if generator not in gen.get_generators():
sys.stderr.write("No generator '%s'\n" % generator)
else:
print("Generator '%s', " % generator)
gen.get_generators()[generator]().print_help()
def main():
opts, args = parse_args()
# Print generator information on the command line
if opts.list_gens:
print(", ".join(gen.get_generators()))
if opts.described != None:
print_descriptions(opts.described)
if opts.list_gens or opts.described:
return 0
params = filter(lambda x : re.match("\w+=\w+", x), args)
# Ensure some generator is loaded
args = list(set(args) - set(params))
args = args or gen.get_generators().keys()
# Split into files to load and named generators
files = filter(os.path.exists, args)
gen_list = list(set(args) - set(files))
# Parse all specified parameters to be applied to every experiment
global_params = dict(map(lambda x : tuple(x.split("=")), params))
for k, v in global_params.iteritems():
global_params[k] = v.split(',')
exp_sets = map(load_file, files)
exp_sets += map(lambda x: (x, {}), gen_list)
if opts.force and os.path.exists(opts.out_dir):
sh.rmtree(opts.out_dir)
if not os.path.exists(opts.out_dir):
os.mkdir(opts.out_dir)
for gen_name, gen_params in exp_sets:
if gen_name not in gen.get_generators():
raise ValueError("Invalid generator '%s'" % gen_name)
sys.stderr.write("Creating experiments with %s generator...\n" % gen_name)
params = dict(gen_params.items() + global_params.items())
clazz = gen.get_generators()[gen_name]
generator = clazz(params=params)
generator.create_pgm_exps(opts)
sys.stderr.write("Experiments saved in %s.\n" % opts.out_dir)
if __name__ == '__main__':
main()
|