| {% 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}}&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}}&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 %} |