aboutsummaryrefslogtreecommitdiffstats
path: root/gen_exps.py
blob: 20a6c6fb32db6a0644deab293924b41341ed647f (plain) (blame)
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
#!/usr/bin/env python
from __future__ import print_function

import os
import re
import shutil as sh

from gen.edf_generators import GedfGenerator,PedfGenerator,CedfGenerator
from optparse import OptionParser

# There has to be a better way to do this...
GENERATORS = {'C-EDF':CedfGenerator,
              'P-EDF':PedfGenerator,
              'G-EDF':GedfGenerator}

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/exps"%os.getcwd()))
    parser.add_option('-f', '--force', action='store_true', default=False,
                      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)')

    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 main():
    opts, args = parse_args()

    # Print generator information on the command line
    if opts.list_gens:
        print(", ".join(GENERATORS.keys()))
    if opts.described != None:
        for generator in opts.described.split(','):
            if generator not in GENERATORS:
                print("No generator '%s'" % generator)
            else:
                GENERATORS[generator]().print_help()
    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))
    #TODO: get every loaded plugin, try and use that generator
    args = args or ['C-EDF', 'G-EDF', 'P-EDF']

    # Split into files to load, 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 GENERATORS:
            raise ValueError("Invalid generator name: %s" % gen_name)

        print("Creating experiments using %s generator..." % gen_name)

        params = dict(gen_params.items() + global_params.items())
        generator = GENERATORS[gen_name](params)

        generator.create_exps(opts.out_dir, opts.force, opts.trials)

if __name__ == '__main__':
    main()