From e367695231ba8e74c0718fceafc02f8e5b1d405d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Montan=CC=83ana?= Date: Wed, 14 Jun 2023 18:56:54 +0200 Subject: [PATCH] Complete experiment --- beflask/interactive/forms.py | 1 + beflask/interactive/main_interactive.py | 84 ++++++++++++++++++-- beflask/results/main_results.py | 32 ++++---- beflask/results/templates/_table_report.html | 3 +- 4 files changed, 97 insertions(+), 23 deletions(-) diff --git a/beflask/interactive/forms.py b/beflask/interactive/forms.py index e25332e..53ec036 100644 --- a/beflask/interactive/forms.py +++ b/beflask/interactive/forms.py @@ -16,6 +16,7 @@ class BenchmarkDatasetForm(FlaskForm): discretize = BooleanField("Discretize") stratified = BooleanField("Stratified") ignore_nan = BooleanField("Ignore NaN") + fit_features = BooleanField("Fit Features") n_folds = IntegerField("# Folds") hyperparameters = TextAreaField("Hyperparameters") submit = SubmitField("Do Experiment!") diff --git a/beflask/interactive/main_interactive.py b/beflask/interactive/main_interactive.py index 9fd2d10..8cb218e 100644 --- a/beflask/interactive/main_interactive.py +++ b/beflask/interactive/main_interactive.py @@ -1,15 +1,19 @@ import os +import json import shutil from pathlib import Path import dotenv from benchmark.Datasets import Datasets +from benchmark.Experiments import Experiment from benchmark.Models import Models from benchmark.ResultsFiles import Benchmark +from benchmark.Utils import Folders from flask import Blueprint, current_app, render_template, url_for from flask_login import current_user, login_required from .forms import BenchmarkDatasetForm +from ..results.main_results import prepare_report interactive = Blueprint("interactive", __name__, template_folder="templates") @@ -38,13 +42,79 @@ def experiment(): stratified = "1" if form.stratified.data else "0" discretize = "1" if form.discretize.data else "0" ignore_nan = "1" if form.ignore_nan.data else "0" - hyperparameters = form.hyperparameters.data - else: - form.model.data = env.get("model") - form.score.data = env.get("score") - form.n_folds.data = env.get("n_folds", 5) - form.stratified.data = env.get("stratified", "0") == "1" - form.discretize.data = env.get("discretize", "0") == "1" + fit_features = "1" if form.fit_features.data else "0" + hyperparameters = form.hyperparameters.data or "{}" + back = url_for("interactive.experiment") + try: + json.loads(hyperparameters) + except json.JSONDecodeError as e: + return render_template( + "error.html", + message="Hyperparameters has to be a valid JSON", + error=str(e), + back=back, + ) + try: + job = Experiment( + score_name=score, + model_name=model, + stratified=stratified, + datasets=Datasets(dataset_name=dataset, discretize=discretize), + hyperparams_dict=hyperparameters, + hyperparams_file=None, + grid_paramfile=None, + progress_bar=False, + platform="BeFlask", + ignore_nan=ignore_nan, + title="Created by the web interface", + folds=n_folds, + fit_features=fit_features, + discretize=discretize, + ) + job.do_experiment() + except ValueError as e: + breakpoint() + return render_template( + "error.html", + message=f"Couldn't complete the experiment!!", + error=str(e), + back=back, + ) + else: + file_name = str(Path(job.get_output_file()).name) + try: + result = prepare_report(file_name) + except FileNotFoundError as e: + return render_template( + "error.html", + message=f"This results file ({file_name}) " + "has not been found!", + error=str(e), + back=back, + ) + except ValueError as e: + return render_template( + "error.html", + message=str(e), + back=url_for("results.select"), + ) + os.remove(os.path.join(Folders.results, file_name)) + return render_template( + "report.html", + data=result["data"], + file=file_name, + summary=result["summary"], + back=back, + back_name="Experiment", + app_config=result["app_config"], + excel=False, + ) + + form.model.data = env.get("model") + form.score.data = env.get("score") + form.n_folds.data = env.get("n_folds", 5) + form.stratified.data = env.get("stratified", "0") == "1" + form.discretize.data = env.get("discretize", "0") == "1" return render_template("experiment.html", form=form, title="Experiment") diff --git a/beflask/results/main_results.py b/beflask/results/main_results.py index f2135c3..d76ac7a 100644 --- a/beflask/results/main_results.py +++ b/beflask/results/main_results.py @@ -100,39 +100,41 @@ def set_compare(): return AjaxResponse(True, "Ok").to_string() +def prepare_report(file_name): + app_config = dotenv_values(".env") + with open(os.path.join(Folders.results, file_name)) as f: + data = json.load(f) + summary = process_data(file_name, current_app.config["COMPARE"], data) + return dict(app_config=app_config, data=data, summary=summary) + + @results.route("/report/") @login_required def report(file_name): os.chdir(current_user.benchmark.folder) back = request.args.get("url") or "" back_name = request.args.get("url_name") or "" - app_config = dotenv_values(".env") try: - with open(os.path.join(Folders.results, file_name)) as f: - data = json.load(f) - try: - summary = process_data( - file_name, current_app.config["COMPARE"], data - ) - except Exception as e: - return render_template( - "error.html", message=str(e), back=url_for("results.select") - ) - except Exception as e: + result = prepare_report(file_name) + except FileNotFoundError as e: return render_template( "error.html", message=f"This results file ({file_name}) has not been found!", error=str(e), back=url_for("results.select"), ) + except ValueError as e: + return render_template( + "error.html", message=str(e), back=url_for("results.select") + ) return render_template( "report.html", - data=data, + data=result["data"], file=file_name, - summary=summary, + summary=result["summary"], back=back, back_name=back_name, - app_config=app_config, + app_config=result["app_config"], ) diff --git a/beflask/results/templates/_table_report.html b/beflask/results/templates/_table_report.html index 5f5b7f0..a77dc96 100644 --- a/beflask/results/templates/_table_report.html +++ b/beflask/results/templates/_table_report.html @@ -50,7 +50,8 @@ -
{{ excel_button([ file ]) }}
+ {% set show_excel = excel| default(True) %} + {% if show_excel %}
{{ excel_button([ file ]) }}
{% endif %}