generate.py 3.77 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 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 113 114 115 116 117 118 119 120 121
#!/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.
    """
    cwd = os.getcwd()
    path = os.path.join(cwd, filename)

    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 copy_files(makefile, codefile, destination):
    """
    Populate the experiments directory with Makefile and Codefile.
    """
    cwd = os.getcwd()
    target = os.path.join(cwd, destination)

    makefile_path = os.path.join(cwd, makefile)
    shutil.copyfile(makefile_path, os.path.join(target, 'Makefile'))
    codefile_path = os.path.join(cwd, destination)
    shutil.copyfile(codefile_path, os.path.join(target, 'experiment.cpp'))

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()
    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)

        # Create folder
        print('create folder')
        if not create_dir(experiment['name']):
            print('Skipping experiment ', experiment['name'], file=sys.stderr)
            continue

        # Read tasks
        tasks = []

        # Add header
        print('create header file')
        create_header(parser.header, tasks, experiment['name'])

        # Add makefile & c++ file
        print('add Makefile')
        print('add C++ file')

        copy_files(args.makefile, args.cpp, experiment['name'])

if __name__ == '__main__':
    main()