Source code for alts.core.evaluator
from __future__ import annotations
from dataclasses import dataclass
from typing import TYPE_CHECKING
import os
if TYPE_CHECKING:
from typing import Callable, Optional
from alts.core.experiment import Experiment
from alts.core.configuration import Configurable, post_init
[docs]
class Evaluator(Configurable):
"""
Evaluator(Experiment)
| **Description**
| The Evaluator evaluates the results of an experiment.
:param experiment: The experiment to be evaluated
:type experiment: Experiment
"""
experiment: Experiment = post_init()
[docs]
def register(self, experiment: Experiment):
"""
register(self, experiment) -> None
| **Description**
| Registers a new experiment as the one to be evaluated.
:param experiment: The experiment to be evaluated
:type experiment: Experiment
"""
self.experiment = experiment
[docs]
@dataclass
class LogingEvaluator(Evaluator):
"""
LoggingEvaluator(experiment)
| **Description**
| Logs the evaluation of the experiment into a "./eval/log" folder
:param experiment: The experiment to be evaluated
:type experiment: Experiment
"""
folder: str = "log"
root_path: str = "./eval"
path = "./eval"
@property
def iteration(self):
"""
iteration(self) -> int
| **Description**
| Returns the current iteration of the experiment.
:return: Current iteration of the experiment
:rtype: int
"""
return self.experiment.iteration
[docs]
def register(self, experiment: Experiment):
"""
register(self, experiment) -> None
| **Description**
| Registers the experiment as the one to be evaluated and creates the logging folders.
:param experiment: The experiment to be evaluated
:type experiment: Experiment
"""
super().register(experiment)
self.path = self.root_path
if self.experiment.exp_path is not None:
self.path = os.path.join(self.experiment.exp_path, self.path)
if self.experiment.exp_name is not None:
self.path = os.path.join(self.path, self.experiment.exp_name)
self.path = os.path.join(self.path, self.folder)
self.path = os.path.join(self.path, f'exp_{self.experiment.exp_nr}')
os.makedirs(self.path, exist_ok=True)
import functools
[docs]
class Evaluate():
def __init__(self, func):
functools.update_wrapper(self, func)
self._warped_func = func
self._pre_func: Optional[Callable] = None
self._warp_func: Optional[Callable] = None
self._post_func: Optional[Callable] = None
def __call__(self, *args, **kwargs):
if not self._pre_func is None:
self._pre_func(*args, **kwargs)
if not self._warp_func is None:
result = self._warp_func(self._warped_func, *args, **kwargs)
else:
result = self._warped_func(*args, **kwargs)
if not self._post_func is None:
self._post_func(result)
return result
[docs]
def pre(self, methode):
self._pre_func = methode
[docs]
def warp(self, methode):
self._warp_func = methode
[docs]
def post(self, methode):
self._post_func = methode