blob: 7350de89363c75edad015a7d04bd779242ee32ff [file] [log] [blame]
{% import "utils.html" as utils %}
{% import "local.html" as local %}
{% set hash_field = ts.Sample.get_hash_of_binary_field() %}
{% set machine = run.machine %}
{% set neighboring_runs = request_info.neighboring_runs %}
{% set comparison_neighboring_runs = request_info.comparison_neighboring_runs %}
{% extends "layout.html" %}
{% set components = [(ts.name, v4_url_for(".v4_recent_activity")),
('%s:%s' % (machine.name, machine.id),
v4_url_for(".v4_machine", id=machine.id))] %}
{% block head %}
<script>
g_urls = {{urls|tojson|safe}};
g_machine = {{run.machine.id}};
</script>
<script src="{{ url_for('.static', filename='popup.js') }}"></script>
<script src="{{ url_for('.static', filename='sorttable.js') }}"></script>
<script src="{{ url_for('.static', filename='lnt_run.js') }}"></script>
<link href="{{ url_for('.static', filename='lnt_run.css') }}" rel="stylesheet" media="screen"/>
<script type="text/javascript">
function selectAll(source) {
$(source).closest("table").find("input:checkbox").prop("checked", source.checked);
}
</script>
{% endblock %}
{% block onload %}
$('.profile-but-no-prev').tooltip();
$('.profile-prev-only').tooltip();
{% endblock %}
{% block title %}Run Results{% endblock %}
{% macro get_cell_value(cr, field) %}
{% set test_status = cr.get_test_status() %}
{% set value_status = cr.get_value_status(ignore_small=not options.show_small_diff) %}
{% set run_cell_value = cr.current|print_value(field.unit, field.unit_abbrev) %}
{% set run_cell_value = "-" if test_status in [analysis.REGRESSED, analysis.UNCHANGED_FAIL] else run_cell_value %}
{% if options.show_previous %}
{% set prev_cell_value = "-" if cr.previous is none else "%.4f" % cr.previous %}
{% set prev_cell_value = "-" if test_status in [analysis.IMPROVED, analysis.UNCHANGED_FAIL] else prev_cell_value %}
<td>{{prev_cell_value}}</td>
{% endif %}
{% set cell_color = none %}
{% if test_status == analysis.REGRESSED %}
{% set cell_color = (233,128,128) %}
{% elif test_status == analysis.IMPROVED %}
{% set cell_color = (143,223,95) %}
{% elif test_status == analysis.UNCHANGED_FAIL %}
{% set cell_color = (255,195,67) %}
{% endif %}
{% if cell_color %}
<td class="right" style="background-color:{{ '#%02x%02x%02x' % cell_color }}">{{ run_cell_value }}</td>
{% else %}
<td class="right">{{run_cell_value}}</td>
{% endif %}
{% if test_status == analysis.UNCHANGED_PASS and
(options.show_all or
value_status == analysis.REGRESSED or
value_status == analysis.IMPROVED) %}
{{ cr.pct_delta|aspctcell(reverse=cr.bigger_is_better)|safe }}
{% else %}
<td>-</td>
{% endif %}
{% if options.show_delta %}
<td>{{ "-" if cr.delta is none or test_status != analysis.UNCHANGED_PASS else "%.4f" % cr.delta }}</td>
{% endif %}
{% if options.show_stddev %}
<td>{{ "-" if cr.stddev is none or test_status != analysis.UNCHANGED_PASS else "%.4f" % cr.stddev }}</td>
{% endif %}
{% if options.show_mad %}
<td>{{ "-" if cr.MAD is none or test_status != analysis.UNCHANGED_PASS else "%.4f" % cr.MAD }}</td>
{% endif %}
{% if options.show_all_samples %}
<td>
[
{%- for v in cr.samples -%}
{{ ", " if not loop.first else "" }}
{{ "%.4f" % v }}
{%- endfor -%}
]
</td>
{% endif %}
{% if options.show_sample_counts %}
<td>{{cr.samples|length}}</td>
{% endif %}
{% endmacro %}
{% block sidebar %}
<ul class="nav nav-list bs-docs-sidenav">
<li><a href="#machine_info"><i class="icon-chevron-right"></i>Machine Info</a></li>
<li><a href="#run_info"><i class="icon-chevron-right"></i>Run Info</a></li>
<li><a href="#view_options"><i class="icon-chevron-right"></i>View Options</a></li>
<li><a href="#report"><i class="icon-chevron-right"></i>Report</a></li>
{% for field in metric_fields %}
<li id="link_{{ field.name }}"><a href="#{{ field.name }}"><i class="icon-chevron-right"></i>{{ field.display_name }}</a></li>
{% endfor %}
</ul>
<h4>Runs:</h4>
<ul>
{# Show a small number of neighboring runs. #}
{% for r in neighboring_runs %}
<li>
{{ "<b>"|safe if r.id == run.id else "" }}
{{ local.render_compare_to_run(r, v4_url_for('.v4_run', id=r.id)) }}
{{ "</b>"|safe if r.id == run.id else "" }}
</li>
{% endfor %}
</ul>
{# Show a small number of runs in the neighborhood of the comparison run. #}
{% if comparison_neighboring_runs %}
<h4>Compare To:</h4>
<ul>
{% for r in comparison_neighboring_runs %}
<li>
{{ "<b>"|safe if compare_to and r.id == compare_to.id else "" }}
{{ local.render_compare_to_run(r, v4_url_for('.v4_run', id=run.id, compare_to=r.id)) }}
{{ "</b>"|safe if compare_to and r.id == compare_to.id else "" }}
</li>
{% endfor %}
</ul>
{% endif %}
{% endblock %}
{% block body %}
<section id="machine_info">
{{ utils.render_popup_begin('machine_info', 'Machine Info', true) }}
<h4>Fields</h4>
<table class="table table-striped table-condensed table-hover">
{% for item in machine.fields %}
<tr>
<td> <b>{{item.name}}</b> </td>
<td>{{ utils.newline_to_br(machine.get_field(item)) }}</td>
</tr>
{% endfor %}
</table>
<h4>Parameters</h4>
<table class="table table-striped table-condensed table-hover">
{% for key,value in machine.parameters|dictsort %}
<tr>
<td> <b>{{key}}</b> </td>
<td>{{ utils.newline_to_br(value) }}</td>
</tr>
{% endfor %}
</table>
{{ utils.render_popup_end() }}
</section>
<section id="run_info">
{{ utils.render_popup_begin('run_info', 'Run Info', true) }}
<h4>Fields</h4>
<table class="table table-striped table-condensed table-hover">
<thead>
<tr><th>Name</th><th>Value</th></tr>
</thead>
{% for item in run.fields %}
<tr>
<td> <b>{{item.name}}</b> </td>
<td>{{ utils.newline_to_br(run.get_field(item)) }}</td>
</tr>
{% endfor %}
</table>
<h4>Parameters</h4>
<table class="table table-striped table-condensed table-hover">
<thead>
<tr><th>Name</th><th>Value</th></tr>
</thead>
{% for key, value in run.parameters|dictsort(case_sensitive=True) %}
<tr>
<td> <b>{{key}}</b> </td>
<td>{{ utils.newline_to_br(value) }}</td>
</tr>
{% endfor %}
</table>
{{ utils.render_popup_end() }}
</section>
<section id="view_options">
{{ utils.render_popup_begin('view_options', 'View Options', true) }}
<form method="GET">
<table class="table table-striped table-condensed table-hover">
<tr>
<td><label for="show_delta">Show Delta</label></td>
<td><input id="show_delta" type="checkbox" name="show_delta" value="yes" {{ "checked" if options.show_delta else "" }}/></td>
</tr>
<tr>
<td><label for="show_previous">Show Previous Value</label></td>
<td><input id="show_previous" type="checkbox" name="show_previous" value="yes" {{ "checked" if options.show_previous else "" }}/></td>
</tr>
<tr>
<td><label for="show_stddev">Show Standard Deviation</label></td>
<td><input id="show_stddev" type="checkbox" name="show_stddev" value="yes" {{ "checked" if options.show_stddev else "" }}/></td>
</tr>
<tr>
<td><label for="show_mad">Show Median Absolute Deviation</label></td>
<td><input id="show_mad" type="checkbox" name="show_mad" value="yes" {{ "checked" if options.show_mad else "" }}/></td>
</tr>
<tr>
<td><label for="show_all">Show All Values</label></td>
<td><input id="show_all" type="checkbox" name="show_all" value="yes" {{ "checked" if options.show_all else "" }}/></td>
</tr>
<tr>
<td><label for="show_all_samples">Show All Samples</label></td>
<td><input id="show_all_samples" type="checkbox" name="show_all_samples" value="yes" {{ "checked" if options.show_all_samples else "" }}/></td>
</tr>
<tr>
<td><label for="show_sample_counts">Show Sample Counts</label></td>
<td><input id="show_sample_counts" type="checkbox" name="show_sample_counts" value="yes" {{ "checked" if options.show_sample_counts else "" }}/></td>
</tr>
<tr>
<td><label for="show_small_diff">Show Small Differences</label></td>
<td><input id="show_small_diff" type="checkbox" name="show_small_diff" value="yes" {{ "checked" if options.show_small_diff else "" }}/></td>
</tr>
<tr>
<td><label for="num_comparison_runs">Number of Comparison Runs</label></td>
<td><input id="num_comparison_runs" type="text" name="num_comparison_runs" value="{{ options.num_comparison_runs }}"/></td>
</tr>
<tr>
<td><label for="show_graphs">Show Report Graphs</label></td>
<td><input id="show_graphs" type="checkbox" name="show_graphs" value="yes" {{ "checked" if options.show_graphs else "" }}/></td>
</tr>
<tr>
<td><label for="show_data_table">Show Data Table</label></td>
<td><input id="show_data_table" type="checkbox" name="show_data_table" value="yes" {{ "checked" if options.show_data_table else ""}}/></td>
</tr>
<tr>
<td><label for="hide_report_by_default">Hide Report By Default</label></td>
<td><input id="hide_report_by_default" type="checkbox" name="hide_report_by_default" value="yes" {{ "checked" if options.hide_report_by_default else ""}}/></td>
</tr>
<tr>
<td><label for="test_filter">Test Filter (regexp)</label></td>
<td><input id="test_filter" type="text" name="test_filter" value="{{ options.test_filter }}"/></td>
</tr>
<tr>
<td><label for="test_min_value_filter">Test Min. Value Filter</label></td>
<td><input id="test_min_value_filter" type="text" name="test_min_value_filter" value="{{ options.test_min_value_filter }}"/></td>
</tr>
<tr>
<td><label for="agg_func">Aggregation Function</label></td>
<td>
<select id="agg_func" name="aggregation_fn">
<option value="min" {{ ('selected="selected"' if "min" == options.aggregation_fn else '')|safe}}>
Minimum</option>
<option value="median" {{ ('selected="selected"' if "median" == options.aggregation_fn else '')|safe}}>
Median</option>
</select>
</td>
</tr>
<tr>
<td><label for="mannwhit">Mann-Whitney test confidence level</label></td>
<td>
<select id="mannwhit" name="MW_confidence_lv">
<option value="0.10" {{ ('selected="selected"' if options.MW_confidence_lv == 0.10 else '')|safe}}>
10%</option>
<option value="0.05" {{ ('selected="selected"' if options.MW_confidence_lv == 0.05 else '')|safe}}>
5%</option>
<option value="0.01" {{ ('selected="selected"' if options.MW_confidence_lv == 0.01 else '')|safe}}>
1%</option>
</select>
</td>
</tr>
<tr>
<td colspan="2">
{% if compare_to %}
<input type="hidden" name="compare_to" value="{{compare_to.id}}"/>
{% endif %}
{% if baseline %}
<input type="hidden" name="baseline" value="{{baseline.id}}"/>
{% endif %}
<input type="submit" name="submit" value="Update"/>
</td>
</tr>
</table>
</form>
{{ utils.render_popup_end() }}
</section>
<section id="report">
{{ utils.render_popup_begin('html_report', 'Report',
options.hide_report_by_default) }}
{{ utils.regex_filter_box(input_id='filter',
selector='.searchable tr',
placeholder="Benchmark name regex...",
selector_part_to_search=".benchmark-name") }}
{% include "reporting/runs.html" %}
{{ utils.render_popup_end() }}
{% set graph_base=v4_url_for('.v4_graph', highlight_run=run.id) %}
<form id="graph_selection_form" method="GET" action="{{ graph_base }}">
{# Report one table for each primary field. #}
{% for field in metric_fields %}
{% set field_index = ts.get_field_index(field) %}
<section id="{{ field.name }}">
{% set tests = [] %}
{% set (runs, compare_runs) = request_info.sri.get_sliding_runs(session, run, compare_to, request_info.num_comparison_runs) %}
{% for test_name,test_id in test_info %}
{% set cr = request_info.sri.get_comparison_result(
runs, compare_runs, test_id, field, hash_field) %}
{% if cr.previous is not none or cr.current is not none %}
{% if cr.current is none or cr.current >= test_min_value_filter %}
{% if tests.append((test_name, test_id, cr)) %}{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if tests %}
{% set unit_suffix = ' (%s)' % field.unit if field.unit else '' %}
{% set title = field.display_name + unit_suffix %}
{{ utils.render_popup_begin('test_data-' + field.name, title, false) }}
<table class="table table-striped table-hover table-condensed floating_header datatable">
<thead>
<tr>
<th rowspan="1" class="sorttable_nosort"><input type="checkbox" id="select-all-{{ field.name }}" onClick="selectAll(this)"/></th>
<th rowspan="1">Name</th>
{% if options.show_previous %}<th>Prev</th>{% endif %}
<th>Current</th>
<th>%</th>
{% if options.show_delta %}<th>Δ</th>{% endif %}
{% if options.show_stddev %}<th>σ</th>{% endif %}
{% if options.show_mad %}<th>MAD</th>{% endif %}
{% if options.show_all_samples %}<th>Samples</th>{% endif %}
{% if options.show_sample_counts %}<th>N</th>{% endif %}
</tr>
</thead>
<tbody class="searchable">
{% for test_name,test_id,cr in tests %}
<tr>
<td><input type="checkbox" name="plot.{{test_id}}" value="{{machine.id}}.{{test_id}}.{{field_index}}"/></td>
<td class="benchmark-name">
<a href="{{graph_base}}&amp;plot.{{test_id}}={{ machine.id}}.{{test_id}}.{{field_index}}">
{{ test_name }}
</a>
{{ utils.render_profile_link(cr.cur_profile, cr.prev_profile, run.id, compare_to.id, test_id) }}
</td>
{{ get_cell_value(cr, field) }}
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
{% set cr = request_info.sri.get_geomean_comparison_result(
run, compare_to, field, tests) %}
<td><input type="checkbox" name="mean" value="{{machine.id}}.{{field_index}}"/></td>
<td><a href="{{graph_base}}&amp;mean={{machine.id}}.{{field_index}}">Geometric Mean</a></td>
{{ get_cell_value(cr, field) }}
</tr>
</tfoot>
</table>
{{ utils.render_popup_end() }}
{% else %}
<script>$('#link_{{ field.name }}').hide();</script>
{% endif %}
</section>
{% endfor %}
<p>
<input id="graph_button" type="submit" value="Graph"/>
<input id="matrix_button" type="submit" value="Matrix"/>
</p>
</form>
</section>
{% if options.show_data_table %}
<h3>Test Data</h3>
<table class="table table-striped table-condensed table-hover">
<thead>
<th>Name</th>
{% for field in metric_fields %}
<th colspan="3">{{field.name}}</th>
{% endfor %}
</thead>
<thead>
<th>-</th>
{% for field in metric_fields %}
<th>Prev</th>
<th>Value</th>
<th>%</th>
{% endfor %}
</thead>
<tbody class="searchable">
{% for test_name,test_id in test_info %}
<tr>
<td class="benchmark-name">{{ test_name }}</td>
{% for field in metric_fields %}
{% set cr = request_info.sri.get_run_comparison_result(
run, compare_to, test_id, field, hash_field) %}
<td>{{cr.previous}}</td>
<td>{{cr.current}}</td>
<td>{{cr.pct_delta}}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<script type="text/javascript" language="Javascript">
$("#matrix_button").on("click", function(e){
e.preventDefault();
{% set matrix_base=v4_url_for('.v4_matrix') %}
$('#graph_selection_form').attr('action', "{{ matrix_base }}").submit();
});
$("#graph_button").on("click", function(e){
e.preventDefault();
{% set graph_base=v4_url_for('.v4_graph') %}
$('#graph_selection_form').attr('action', "{{ graph_base }}").submit();
});
</script>
{% endblock %}