diff --git a/benchmark/Utils.py b/benchmark/Utils.py index 177b49f..229b187 100644 --- a/benchmark/Utils.py +++ b/benchmark/Utils.py @@ -108,7 +108,8 @@ class Files: ) return None - def get_all_results(self, hidden) -> list[str]: + @staticmethod + def get_all_results(hidden) -> list[str]: result_path = os.path.join( ".", Folders.hidden_results if hidden else Folders.results ) @@ -117,7 +118,7 @@ class Files: else: raise ValueError(f"{result_path} does not exist") result = [] - prefix, suffix = self.results_suffixes() + prefix, suffix = Files.results_suffixes() for result_file in files_list: if result_file.startswith(prefix) and result_file.endswith(suffix): result.append(result_file) diff --git a/benchmark/scripts/flask_app/app.py b/benchmark/scripts/flask_app/app.py index 41957c3..f5f9307 100644 --- a/benchmark/scripts/flask_app/app.py +++ b/benchmark/scripts/flask_app/app.py @@ -5,7 +5,7 @@ from flask_login import LoginManager from .config import Config from .models import User, db -# from .results import results +from .results.main import results from .main import main bootstrap = Bootstrap5() @@ -31,6 +31,7 @@ def create_app(): login_manager.init_app(app) login_manager.login_view = "main.login" app.jinja_env.auto_reload = True + app.register_blueprint(results, url_prefix="/results") app.register_blueprint(main) app.shell_context_processor(make_shell_context) with app.app_context(): diff --git a/benchmark/scripts/flask_app/main.py b/benchmark/scripts/flask_app/main.py index 700f1d6..d5f7ee1 100644 --- a/benchmark/scripts/flask_app/main.py +++ b/benchmark/scripts/flask_app/main.py @@ -1,19 +1,14 @@ -import os from flask import ( Blueprint, - current_app, render_template, url_for, flash, redirect, request, - abort, ) from flask_login import login_user, current_user, logout_user, login_required from werkzeug.urls import url_parse -from benchmark.Utils import Files, Folders from .forms import LoginForm -from benchmark.ResultsBase import StubReport from .models import User main = Blueprint("main", __name__) @@ -22,46 +17,13 @@ main = Blueprint("main", __name__) @main.route("/") @main.route("/index") def index(): - # Get a list of files in a directory - files = {} - compare = False - # names = Files.get_all_results(hidden=False) - # for name in names: - # report = StubReport(os.path.join(Folders.results, name)) - # report.report() - # files[name] = { - # "duration": report.duration, - # "score": report.score, - # "title": report.title, - # } - # candidate = current_app.config["FRAMEWORKS"].copy() - # candidate.remove(current_app.config["FRAMEWORK"]) - # return render_template( - # "select.html", - # files=files, - # candidate=candidate[0], - # framework=current_app.config["FRAMEWORK"], - # compare=compare.capitalize() == "True", - # ) return render_template("index.html") -@main.route("/results") -@login_required -def results(): - return render_template("results.html") - - -@main.route("/datasets") -@login_required -def datasets(): - pass - - @main.route("/config") @login_required def config(): - pass + return render_template("config.html") @main.route("/login", methods=["GET", "POST"]) diff --git a/benchmark/scripts/flask_app/results/main.py b/benchmark/scripts/flask_app/results/main.py new file mode 100644 index 0000000..d04c047 --- /dev/null +++ b/benchmark/scripts/flask_app/results/main.py @@ -0,0 +1,46 @@ +import os +import json +import shutil +import xlsxwriter +from benchmark.Utils import Files, Folders +from benchmark.Arguments import EnvData +from benchmark.ResultsBase import StubReport +from benchmark.ResultsFiles import Excel, ReportDatasets +from benchmark.Datasets import Datasets +from flask import Blueprint, current_app, send_file +from flask import render_template, current_app, request, redirect, url_for +from flask_login import login_required + +results = Blueprint("results", __name__, template_folder="templates") + + +@results.route("/select") +@login_required +def select(compare="False"): + # Get a list of files in a directory + files = {} + names = Files.get_all_results(hidden=False) + for name in names: + report = StubReport(os.path.join(Folders.results, name)) + report.report() + files[name] = { + "duration": report.duration, + "score": report.score, + "title": report.title, + } + candidate = current_app.config["FRAMEWORKS"].copy() + candidate.remove(current_app.config["FRAMEWORK"]) + return render_template( + "select.html", + files=files, + candidate=candidate[0], + framework=current_app.config["FRAMEWORK"], + compare=compare.capitalize() == "True", + ) + return render_template("test.html") + + +@results.route("/datasets") +@login_required +def datasets(compare="False"): + return render_template("test.html") diff --git a/benchmark/scripts/flask_app/results.py b/benchmark/scripts/flask_app/results/results.ant.py similarity index 60% rename from benchmark/scripts/flask_app/results.py rename to benchmark/scripts/flask_app/results/results.ant.py index bf83600..43a9c56 100644 --- a/benchmark/scripts/flask_app/results.py +++ b/benchmark/scripts/flask_app/results/results.ant.py @@ -1,88 +1,91 @@ #!/usr/bin/env python -import os -import json -import shutil -import xlsxwriter -from benchmark.Utils import Files, Folders -from benchmark.Arguments import EnvData -from benchmark.ResultsBase import StubReport -from benchmark.ResultsFiles import Excel, ReportDatasets -from benchmark.Datasets import Datasets -from flask import Blueprint, current_app, send_file -from flask import render_template, request, redirect, url_for +# import os +# import json +# import shutil +# import xlsxwriter +# from benchmark.Utils import Files, Folders +# from benchmark.Arguments import EnvData +# from benchmark.ResultsBase import StubReport +# from benchmark.ResultsFiles import Excel, ReportDatasets +# from benchmark.Datasets import Datasets +# from flask import Blueprint, current_app, send_file +# from flask import render_template, request, redirect, url_for +from flask import Blueprint, render_template -main = Blueprint("main", __name__) -FRAMEWORK = "framework" -FRAMEWORKS = "frameworks" -OUTPUT = "output" -TEST = "test" +results = Blueprint("results", __name__, template_folder="results") +# FRAMEWORK = "framework" +# FRAMEWORKS = "frameworks" +# OUTPUT = "output" +# TEST = "test" -class AjaxResponse: - def __init__(self, success, file_name, code=200): - self.success = success - self.file_name = file_name - self.code = code +# class AjaxResponse: +# def __init__(self, success, file_name, code=200): +# self.success = success +# self.file_name = file_name +# self.code = code - def to_string(self): - return ( - json.dumps( - { - "success": self.success, - "file": self.file_name, - "output": current_app.config[OUTPUT], - } - ), - self.code, - {"ContentType": "application/json"}, - ) +# def to_string(self): +# return ( +# json.dumps( +# { +# "success": self.success, +# "file": self.file_name, +# "output": current_app.config[OUTPUT], +# } +# ), +# self.code, +# {"ContentType": "application/json"}, +# ) -def process_data(file_name, compare, data): - report = StubReport( - os.path.join(Folders.results, file_name), compare=compare - ) - new_list = [] - for result in data["results"]: - symbol = report._compute_status(result["dataset"], result["score"]) - result["symbol"] = symbol if symbol != " " else " " - new_list.append(result) - data["results"] = new_list - # Compute summary with explanation of symbols - summary = {} - for key, value in report._compare_totals.items(): - summary[key] = (report._status_meaning(key), value) - return summary +# def process_data(file_name, compare, data): +# report = StubReport( +# os.path.join(Folders.results, file_name), compare=compare +# ) +# new_list = [] +# for result in data["results"]: +# symbol = report._compute_status(result["dataset"], result["score"]) +# result["symbol"] = symbol if symbol != " " else " " +# new_list.append(result) +# data["results"] = new_list +# # Compute summary with explanation of symbols +# summary = {} +# for key, value in report._compare_totals.items(): +# summary[key] = (report._status_meaning(key), value) +# return summary -@results.route("/index/") -@results.route("/") -def index(compare="False"): - # Get a list of files in a directory - files = {} - names = Files.get_all_results(hidden=False) - for name in names: - report = StubReport(os.path.join(Folders.results, name)) - report.report() - files[name] = { - "duration": report.duration, - "score": report.score, - "title": report.title, - } - candidate = current_app.config[FRAMEWORKS].copy() - candidate.remove(current_app.config[FRAMEWORK]) - return render_template( - "select.html", - files=files, - candidate=candidate[0], - framework=current_app.config[FRAMEWORK], - compare=compare.capitalize() == "True", - ) +@results.route("/results/") +def results(compare="False"): + # # Get a list of files in a directory + # files = {} + # names = Files.get_all_results(hidden=False) + # for name in names: + # report = StubReport(os.path.join(Folders.results, name)) + # report.report() + # files[name] = { + # "duration": report.duration, + # "score": report.score, + # "title": report.title, + # } + # candidate = current_app.config[FRAMEWORKS].copy() + # candidate.remove(current_app.config[FRAMEWORK]) + # return render_template( + # "select.html", + # files=files, + # candidate=candidate[0], + # framework=current_app.config[FRAMEWORK], + # compare=compare.capitalize() == "True", + # ) + return render_template("test.html") +""" @results.route("/datasets/") -def datasets(compare): +@results.route("datasets") +def datasets(compare=False): dt = Datasets() datos = [] for dataset in dt: @@ -206,3 +209,4 @@ def best_results(file, compare): compare=compare, framework=current_app.config[FRAMEWORK], ) + """ diff --git a/benchmark/scripts/flask_app/results/templates/_table_select.html b/benchmark/scripts/flask_app/results/templates/_table_select.html new file mode 100644 index 0000000..26fa05f --- /dev/null +++ b/benchmark/scripts/flask_app/results/templates/_table_select.html @@ -0,0 +1,50 @@ +{%- macro get_button_tag(icon_name, method, visible=True, name="") -%} + +{%- endmacro -%} + + + + + + + + + + + + + + + {% for file, data in files.items() %} + {% set parts = file.split('_') %} + {% set stratified = parts[6].split('.')[0] %} + + + + + + + + + + + + {% endfor %} + +
ModelMetricPlatformDateTimeStratifiedTitleScore + + +
{{ parts[2] }}{{ parts[1] }}{{ parts[3] }}{{ parts[4] }}{{ parts[5] }}{{ 'True' if stratified =='1' else 'False' }}{{ "%s" % data["title"] }}{{ "%.6f" % data["score"] }} + {{ get_button_tag("table-eye", "showFile('" ~ file ~ "') ") | safe }} + {% set file_best = "best_results_" ~ parts[1] ~ "_" ~ parts[2] ~ ".json" %} + {{ get_button_tag("star-circle-outline", "redirectDouble('best_results', '" ~ file_best ~ "') ", visible=False, name="best_buttons") | safe }} + +
diff --git a/benchmark/scripts/flask_app/results/templates/select.html b/benchmark/scripts/flask_app/results/templates/select.html new file mode 100644 index 0000000..14cf448 --- /dev/null +++ b/benchmark/scripts/flask_app/results/templates/select.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} +{% block content %} + {% include "_table_select.html" %} +{% endblock %} +{% block jscript %} + {{ super() }} + + +{% endblock %} diff --git a/benchmark/scripts/flask_app/static/js/select.js b/benchmark/scripts/flask_app/static/js/select.js new file mode 100644 index 0000000..0ab59f4 --- /dev/null +++ b/benchmark/scripts/flask_app/static/js/select.js @@ -0,0 +1,97 @@ +$(document).ready(function () { + var table = $("#file-table").DataTable({ + paging: true, + searching: true, + ordering: true, + info: true, + "select.items": "row", + pageLength: 25, + columnDefs: [ + { + targets: 8, + orderable: false, + }, + ], + //"language": { + // "lengthMenu": "_MENU_" + //} + }); + $('#file-table').on( 'draw.dt', function () { + enable_disable_best_buttons(); + } ); + // Check if row is selected + $("#file-table tbody").on("click", "tr", function () { + if ($(this).hasClass("selected")) { + $(this).removeClass("selected"); + } else { + table + .$("tr.selected") + .removeClass("selected"); + $(this).addClass("selected"); + } + }); + // Show file with doubleclick + $("#file-table tbody").on("dblclick", "tr", function () { + showFile($(this).attr("id")); + }); + $(document).ajaxStart(function () { + $("body").addClass("ajaxLoading"); + }); + $(document).ajaxStop(function () { + $("body").removeClass("ajaxLoading"); + }); + $('#compare').change(function() { + enable_disable_best_buttons(); + }); + enable_disable_best_buttons(); + }); + function enable_disable_best_buttons(){ + if ($('#compare').is(':checked')) { + $("[name='best_buttons']").addClass("tag is-link is-normal"); + $("[name='best_buttons']").removeAttr("hidden"); + } else { + $("[name='best_buttons']").removeClass("tag is-link is-normal"); + $("[name='best_buttons']").attr("hidden", true); + } + } + function showFile(selectedFile) { + var form = $( + '
' + + '' + + '