Complete experiment

This commit is contained in:
2023-06-14 18:56:54 +02:00
parent 962246d3fa
commit e367695231
4 changed files with 97 additions and 23 deletions

View File

@@ -16,6 +16,7 @@ class BenchmarkDatasetForm(FlaskForm):
discretize = BooleanField("Discretize") discretize = BooleanField("Discretize")
stratified = BooleanField("Stratified") stratified = BooleanField("Stratified")
ignore_nan = BooleanField("Ignore NaN") ignore_nan = BooleanField("Ignore NaN")
fit_features = BooleanField("Fit Features")
n_folds = IntegerField("# Folds") n_folds = IntegerField("# Folds")
hyperparameters = TextAreaField("Hyperparameters") hyperparameters = TextAreaField("Hyperparameters")
submit = SubmitField("Do Experiment!") submit = SubmitField("Do Experiment!")

View File

@@ -1,15 +1,19 @@
import os import os
import json
import shutil import shutil
from pathlib import Path from pathlib import Path
import dotenv import dotenv
from benchmark.Datasets import Datasets from benchmark.Datasets import Datasets
from benchmark.Experiments import Experiment
from benchmark.Models import Models from benchmark.Models import Models
from benchmark.ResultsFiles import Benchmark from benchmark.ResultsFiles import Benchmark
from benchmark.Utils import Folders
from flask import Blueprint, current_app, render_template, url_for from flask import Blueprint, current_app, render_template, url_for
from flask_login import current_user, login_required from flask_login import current_user, login_required
from .forms import BenchmarkDatasetForm from .forms import BenchmarkDatasetForm
from ..results.main_results import prepare_report
interactive = Blueprint("interactive", __name__, template_folder="templates") interactive = Blueprint("interactive", __name__, template_folder="templates")
@@ -38,8 +42,74 @@ def experiment():
stratified = "1" if form.stratified.data else "0" stratified = "1" if form.stratified.data else "0"
discretize = "1" if form.discretize.data else "0" discretize = "1" if form.discretize.data else "0"
ignore_nan = "1" if form.ignore_nan.data else "0" ignore_nan = "1" if form.ignore_nan.data else "0"
hyperparameters = form.hyperparameters.data 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: 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.model.data = env.get("model")
form.score.data = env.get("score") form.score.data = env.get("score")
form.n_folds.data = env.get("n_folds", 5) form.n_folds.data = env.get("n_folds", 5)

View File

@@ -100,39 +100,41 @@ def set_compare():
return AjaxResponse(True, "Ok").to_string() 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/<file_name>") @results.route("/report/<file_name>")
@login_required @login_required
def report(file_name): def report(file_name):
os.chdir(current_user.benchmark.folder) os.chdir(current_user.benchmark.folder)
back = request.args.get("url") or "" back = request.args.get("url") or ""
back_name = request.args.get("url_name") or "" back_name = request.args.get("url_name") or ""
app_config = dotenv_values(".env")
try: try:
with open(os.path.join(Folders.results, file_name)) as f: result = prepare_report(file_name)
data = json.load(f) except FileNotFoundError as e:
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:
return render_template( return render_template(
"error.html", "error.html",
message=f"This results file ({file_name}) has not been found!", message=f"This results file ({file_name}) has not been found!",
error=str(e), error=str(e),
back=url_for("results.select"), 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( return render_template(
"report.html", "report.html",
data=data, data=result["data"],
file=file_name, file=file_name,
summary=summary, summary=result["summary"],
back=back, back=back,
back_name=back_name, back_name=back_name,
app_config=app_config, app_config=result["app_config"],
) )

View File

@@ -50,7 +50,8 @@
</tr> </tr>
</thead> </thead>
</table> </table>
<div>{{ excel_button([ file ]) }}</div> {% set show_excel = excel| default(True) %}
{% if show_excel %}<div>{{ excel_button([ file ]) }}</div>{% endif %}
<table class="table table-striped table-hover table-bordered bg-light" <table class="table table-striped table-hover table-bordered bg-light"
id="report-table" id="report-table"
data-toggle="table" data-toggle="table"