Example #1
0
def compare_params(project_name):
    excluded_keys = ['param_name', 'job_name', 'save_path', 'project_path']

    if request.method == 'POST':
        param_names = request.get_json()['param_names']
        print('param_names:')
        print(param_names)
    else:
        param_names = []

    param2val_list = []
    for param_name in param_names:
        param_path = to_param_path(project_name, param_name)
        with (param_path / 'param2val.yaml').open('r') as f:
            param2val = yaml.load(f, Loader=yaml.FullLoader)
        param2val_list.append(param2val)

    message = ''
    keys = [k for k in param2val_list[0].keys() if k not in excluded_keys]
    for key in keys:
        param_values = [param2val[key] for param2val in param2val_list]
        if len(set(param_values)
               ) != 1:  # param_values differ between configurations
            message += '<p><b>{}</b>={}</p>'.format(key, param_values)
    return message + '<p>(shown in order of configurations selected)</p>'
Example #2
0
def plot(project_name):
    """
    is requested in two ways:
    1. directly clicking on row in project.html
    2. by selecting multiple runs and clicking on "plot" button

    in case 1, param_names is retrieved from request object.
    in case 2, param_names is retrieved from session object (because of redirect)

    check request object first, and only then check session
    """

    param_names = request.args.getlist('param_name') or session.get(
        'param_names')

    # TODO is there a way to plot confidence interval?
    # TODO if not, then plot all the individual lines, instead of their average?

    # get all patterns (all possible csv file names) - assume each run has same pattern
    first_param_path = to_param_path(project_name, param_names[0])
    patterns = set([p.name for p in first_param_path.rglob('*.csv')])

    if not patterns:
        raise LudwigVizNoCsvFound(first_param_path)
    else:
        print('Detected patterns={}'.format(patterns))

    # iterate over unique df file names (e.g. results_a.csv, results_b.csv)
    json_charts = []
    for pattern in patterns:
        print('pattern="{}"'.format(pattern))
        # get data frame where each column represents a mean for a particular param_name
        try:
            data = aggregate_data(project_name, param_names, pattern)
        except ValueError:  # empty data frames
            print(f'WARNING: Failed ot aggregate data for pattern={pattern}')
            continue
        # make chart
        title = pattern.rstrip('.csv').capitalize()
        column_name = data.columns[0]
        json_chart = make_json_chart(data, column_name, title)
        # collect chart
        json_charts.append(json_chart)

    # get number of reps for each param_name
    param_name2n = {
        param_name: count_replications(project_name, param_name)
        for param_name in param_names
    }
    return render_template(
        'plots.html',
        topbar_dict=topbar_dict,
        project_name=project_name,
        param_names=param_names,
        param_name2n=param_name2n,
        json_charts=json_charts,
    )
Example #3
0
def count_replications(project_name, param_name):
    return len(list(to_param_path(project_name, param_name).glob('*[!.yaml]')))