generate.py 3.53 KB
Newer Older
Tobias Langer committed
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
#!/usr/bin/env python3.4

"""
This utility script helps in the creation of experiment setups. It therefore
reads experiment descriptions from json files and creates everything necessary
as a result.

It therefore performs the following actions:
* [x] Read the json file of every experiment
* [x] Create folders for every experiment
* [ ] Create the header file for every experiment
* [x] Add the make file for every experiment
* [x] Add c++ file for every experiment
"""

import sys
import os
import argparse
import shutil
import json

def query_yes_no(question, default=None):
    """
    Queries the user for a decision.
    """

    if default is None:
        prompt = ' [y/n]'
    elif default.lower() is 'yes':
        prompt = ' [Y/n]'
    elif default.lower() is 'no':
        prompt = ' [y/N]'
    else:
        raise ValueError('Invalid default answer {}'.format(default))

    while True:
        print(question, prompt)
        choice = input().lower()
        if 'yes'.find(choice) == 0:
            return True
        elif 'no'.find(choice) == 0:
            return False

def create_dir(filename):
    """
    Create the directory denoted by filename, if it doesn't exists. Ask for its
    removal if it exists.
    """
    try:
        os.makedirs(path)
    except FileExistsError:
        if not query_yes_no('Folder exists, remove?', default='yes'):
            return False
        shutil.rmtree(path)
        os.makedirs(path)
    return True

def create_header(headerfile, tasks, destination):
    """
    Create a header file for the experiment.
    """
    pass

def main():
    """
    Starting point of the script, parses arguments and creates the experiments.
    """

    parser = argparse.ArgumentParser(description='Generate experiment data.')
    parser.add_argument('description', type=str, nargs='+', help='file containing the taskset description.')
    parser.add_argument('header', type=str, nargs='?', default='./template/config.h', help='path to optional custom header file.')
    parser.add_argument('makefile', type=str, nargs='?', default='./template/Makefile', help='path to optional custom makefile.')
    parser.add_argument('cpp', type=str, nargs='?', default='./template/experiment.cpp', help='path to optional custom c++ implementation.')

    args = parser.parse_args()
76 77
    cwd = os.getcwd()

Tobias Langer committed
78 79 80 81 82 83 84 85 86 87
    for num, experiment_file in enumerate(args.description):
        with open(experiment_file, 'r') as experiment_description:
            descr_json = experiment_description.read()
        experiment = json.loads(descr_json)

        print('[{}/{}] Creating experiment {}:'.format(num,
                                                       len(args.description),
                                                       experiment['name']),
              file=sys.stderr)

88 89
        experiment_dir = os.path.join(cwd, experiment['name'])

Tobias Langer committed
90 91
        # Create folder
        print('create folder')
92
        if not create_dir(experiment_dir):
Tobias Langer committed
93 94 95 96 97 98 99 100
            print('Skipping experiment ', experiment['name'], file=sys.stderr)
            continue

        # Read tasks
        tasks = []

        # Add header
        print('create header file')
101
        create_header(args.headerfile, experiment, experiment_dir)
Tobias Langer committed
102 103 104

        # Add makefile & c++ file
        print('add Makefile')
105 106
        makefile_path = os.path.join(experiment_dir, 'Makefile')
        shutil.copyfile(args.makefile, makefile_path)
Tobias Langer committed
107
        print('add C++ file')
108 109
        cpp_file_path = os.path.join(experiment_dir, 'experiment.cpp')
        shutil.copyfile(args.cpp, cpp_file_path)
Tobias Langer committed
110 111 112

if __name__ == '__main__':
    main()