Refactor be_list

This commit is contained in:
2022-11-21 20:22:59 +01:00
parent e76366561c
commit 4e0be95a00
3 changed files with 95 additions and 73 deletions

View File

@@ -1,6 +1,7 @@
import os import os
import sys import sys
from operator import itemgetter from operator import itemgetter
from types import SimpleNamespace
import math import math
import json import json
import abc import abc
@@ -22,8 +23,8 @@ from .Utils import (
from ._version import __version__ from ._version import __version__
def get_input(is_test): def get_input(is_test=False, message=""):
return "test" if is_test else input() return "test" if is_test else input(message)
class BestResultsEver: class BestResultsEver:
@@ -1402,18 +1403,15 @@ class Summary:
self.data.append(entry) self.data.append(entry)
def get_results_criteria( def get_results_criteria(
self, self, score, model, input_data, sort_key, number, nan=False
score,
model,
input_data,
sort_key,
number,
): ):
data = self.data.copy() if input_data is None else input_data data = self.data.copy() if input_data is None else input_data
if score: if score:
data = [x for x in data if x["score"] == score] data = [x for x in data if x["score"] == score]
if model: if model:
data = [x for x in data if x["model"] == model] data = [x for x in data if x["model"] == model]
if nan:
data = [x for x in data if x["metric"] != x["metric"]]
keys = ( keys = (
itemgetter(sort_key, "time") itemgetter(sort_key, "time")
if sort_key == "date" if sort_key == "date"
@@ -1431,11 +1429,12 @@ class Summary:
input_data=None, input_data=None,
sort_key="date", sort_key="date",
number=0, number=0,
nan=False,
) -> None: ) -> None:
"""Print the list of results""" """Print the list of results"""
if self.data_filtered == []: if self.data_filtered == []:
self.data_filtered = self.get_results_criteria( self.data_filtered = self.get_results_criteria(
score, model, input_data, sort_key, number score, model, input_data, sort_key, number, nan=nan
) )
if self.data_filtered == []: if self.data_filtered == []:
raise ValueError(NO_RESULTS) raise ValueError(NO_RESULTS)
@@ -1477,37 +1476,79 @@ class Summary:
) )
) )
def manage_results(self, excel, is_test): def manage_results(self, is_test):
"""Manage results showed in the summary """Manage results showed in the summary
return True if excel file is created False otherwise return True if excel file is created False otherwise
""" """
num = ""
book = None def process_file(num, command, path):
while True: num = int(num)
print( name = self.data_filtered[num]["file"]
"Which result do you want to report? (q to quit, r to list " file_name_result = os.path.join(path, name)
"again, number to report): ", verb1, verb2 = (
end="", ("delete", "Deleting")
if command == cmd.delete
else (
"hide",
"Hiding",
) )
num = get_input(is_test) )
if num == "r": conf_message = (
TextColor.RED
+ f"Are you sure to {verb1} {file_name_result} (y/n)? "
)
confirm = get_input(message=conf_message, is_test=is_test)
if confirm == "y":
print(TextColor.YELLOW + f"{verb2} {file_name_result}")
if command == cmd.delete:
os.unlink(file_name_result)
else:
os.rename(
os.path.join(Folders.results, name),
os.path.join(Folders.hidden_results, name),
)
self.data_filtered.pop(num)
get_input(message="Press enter to continue")
self.list_results() self.list_results()
if num == "q":
if excel: cmd = SimpleNamespace(quit="q", relist="r", delete="d", excel="e")
if not self.hidden:
cmd.hide = "h"
message = (
TextColor.ENDC
+ f"Choose option {str(cmd).replace('namespace', '')}: "
)
path = Folders.hidden_results if self.hidden else Folders.results
book = None
max_value = len(self.data)
while True:
match get_input(message=message, is_test=is_test).split():
case [cmd.relist]:
self.list_results()
case [cmd.quit]:
if book is not None: if book is not None:
book.close() book.close()
return True return True
return False return False
if num.isdigit() and int(num) < len(self.data) and int(num) >= 0: case [
path = ( cmd.hide,
Folders.hidden_results if self.hidden else Folders.results num,
) ] if not self.hidden and num.isdigit() and int(
num
) < max_value:
process_file(num, path=path, command=cmd.hide)
case [cmd.delete, num] if num.isdigit() and int(
num
) < max_value:
process_file(num=num, path=path, command=cmd.delete)
case [cmd.excel, num] if num.isdigit() and int(
num
) < max_value:
# Add to excel file result #num
file_name_result = os.path.join( file_name_result = os.path.join(
path, self.data_filtered[int(num)]["file"] path, self.data_filtered[num]["file"]
) )
rep = Report(file_name_result, compare=self.compare)
rep.report()
if excel:
if book is None: if book is None:
file_name = Files.be_list_excel file_name = Files.be_list_excel
book = xlsxwriter.Workbook( book = xlsxwriter.Workbook(
@@ -1519,9 +1560,16 @@ class Summary:
compare=self.compare, compare=self.compare,
) )
excel.report() excel.report()
else: print(f"Added {file_name_result} to {Files.be_list_excel}")
if num not in ("r", "q"): case [num] if num.isdigit() and int(num) < max_value:
print(f"Invalid option {num}. Try again!") # Report the result #num
file_name_result = os.path.join(
path, self.data_filtered[num]["file"]
)
rep = Report(file_name_result, compare=self.compare)
rep.report()
case _:
print("Invalid option. Try again!")
def show_result(self, data: dict, title: str = "") -> None: def show_result(self, data: dict, title: str = "") -> None:
def whites(n: int) -> str: def whites(n: int) -> str:

View File

@@ -113,8 +113,7 @@ class Files:
if os.path.isdir(result_path): if os.path.isdir(result_path):
files_list = os.listdir(result_path) files_list = os.listdir(result_path)
else: else:
os.makedirs(result_path) raise ValueError(f"{result_path} does not exist")
files_list = []
result = [] result = []
prefix, suffix = self.results_suffixes() prefix, suffix = self.results_suffixes()
for result_file in files_list: for result_file in files_list:
@@ -147,3 +146,7 @@ class TextColor:
ENDC = "\033[0m" ENDC = "\033[0m"
BOLD = "\033[1m" BOLD = "\033[1m"
UNDERLINE = "\033[4m" UNDERLINE = "\033[4m"
WHITE = "\033[97m"
GREY = "\033[90m"
BLACK = "\033[90m"
DEFAULT = "\033[99m"

View File

@@ -1,7 +1,6 @@
#! /usr/bin/env python #! /usr/bin/env python
import os
from benchmark.Results import Summary from benchmark.Results import Summary
from benchmark.Utils import Folders, Files from benchmark.Utils import Files
from benchmark.Arguments import Arguments from benchmark.Arguments import Arguments
"""List experiments of a model """List experiments of a model
@@ -9,10 +8,10 @@ from benchmark.Arguments import Arguments
def main(args_test=None): def main(args_test=None):
is_test = args_test is not None
arguments = Arguments(prog="be_list") arguments = Arguments(prog="be_list")
arguments.xset("number").xset("model", required=False).xset("key") arguments.xset("number").xset("model", required=False).xset("key")
arguments.add_exclusive(["hidden", "nan"]) arguments.xset("score", required=False).xset("compare").xset("hidden")
arguments.xset("score", required=False).xset("compare").xset("excel")
args = arguments.parse(args_test) args = arguments.parse(args_test)
data = Summary(hidden=args.hidden, compare=args.compare) data = Summary(hidden=args.hidden, compare=args.compare)
data.acquire() data.acquire()
@@ -23,38 +22,10 @@ def main(args_test=None):
sort_key=args.key, sort_key=args.key,
number=args.number, number=args.number,
) )
is_test = args_test is not None
excel_generated = data.manage_results(args.excel, is_test)
if args.excel and excel_generated:
print(f"Generated file: {Files.be_list_excel}")
Files.open(Files.be_list_excel, is_test)
except ValueError as e: except ValueError as e:
print(e) print(e)
return return
if args.nan: excel_generated = data.manage_results(is_test=is_test)
results_nan = [] if excel_generated:
results = data.get_results_criteria( print(f"Generated file: {Files.be_list_excel}")
score=args.score, Files.open(Files.be_list_excel, is_test)
model=args.model,
input_data=None,
sort_key=args.key,
number=args.number,
)
for result in results:
if result["metric"] != result["metric"]:
results_nan.append(result)
if results_nan != []:
print(
"\n"
+ "*" * 30
+ " Results with nan moved to hidden "
+ "*" * 30
)
data.data_filtered = []
data.list_results(input_data=results_nan)
for result in results_nan:
name = result["file"]
os.rename(
os.path.join(Folders.results, name),
os.path.join(Folders.hidden_results, name),
)