forked from enviPath/enviPy
[Feature] Basic logging of Jobs, Model Evaluation (#169)
Co-authored-by: Tim Lorsbach <tim@lorsba.ch> Reviewed-on: enviPath/enviPy#169
This commit is contained in:
@ -2225,10 +2225,18 @@ class PackageBasedModel(EPModel):
|
||||
self.model_status = self.BUILT_NOT_EVALUATED
|
||||
self.save()
|
||||
|
||||
def evaluate_model(self):
|
||||
def evaluate_model(self, multigen: bool, eval_packages: List["Package"] = None):
|
||||
if self.model_status != self.BUILT_NOT_EVALUATED:
|
||||
raise ValueError(f"Can't evaluate a model in state {self.model_status}!")
|
||||
|
||||
if multigen:
|
||||
self.multigen_eval = multigen
|
||||
self.save()
|
||||
|
||||
if eval_packages is not None:
|
||||
for p in eval_packages:
|
||||
self.eval_packages.add(p)
|
||||
|
||||
self.model_status = self.EVALUATING
|
||||
self.save()
|
||||
|
||||
@ -2525,7 +2533,6 @@ class RuleBasedRelativeReasoning(PackageBasedModel):
|
||||
package: "Package",
|
||||
rule_packages: List["Package"],
|
||||
data_packages: List["Package"],
|
||||
eval_packages: List["Package"],
|
||||
threshold: float = 0.5,
|
||||
min_count: int = 10,
|
||||
max_count: int = 0,
|
||||
@ -2574,10 +2581,6 @@ class RuleBasedRelativeReasoning(PackageBasedModel):
|
||||
for p in rule_packages:
|
||||
rbrr.data_packages.add(p)
|
||||
|
||||
if eval_packages:
|
||||
for p in eval_packages:
|
||||
rbrr.eval_packages.add(p)
|
||||
|
||||
rbrr.save()
|
||||
|
||||
return rbrr
|
||||
@ -2632,7 +2635,6 @@ class MLRelativeReasoning(PackageBasedModel):
|
||||
package: "Package",
|
||||
rule_packages: List["Package"],
|
||||
data_packages: List["Package"],
|
||||
eval_packages: List["Package"],
|
||||
threshold: float = 0.5,
|
||||
name: "str" = None,
|
||||
description: str = None,
|
||||
@ -2672,10 +2674,6 @@ class MLRelativeReasoning(PackageBasedModel):
|
||||
for p in rule_packages:
|
||||
mlrr.data_packages.add(p)
|
||||
|
||||
if eval_packages:
|
||||
for p in eval_packages:
|
||||
mlrr.eval_packages.add(p)
|
||||
|
||||
if build_app_domain:
|
||||
ad = ApplicabilityDomain.create(
|
||||
mlrr,
|
||||
@ -2995,7 +2993,6 @@ class EnviFormer(PackageBasedModel):
|
||||
def create(
|
||||
package: "Package",
|
||||
data_packages: List["Package"],
|
||||
eval_packages: List["Package"],
|
||||
threshold: float = 0.5,
|
||||
name: "str" = None,
|
||||
description: str = None,
|
||||
@ -3028,10 +3025,6 @@ class EnviFormer(PackageBasedModel):
|
||||
for p in data_packages:
|
||||
mod.data_packages.add(p)
|
||||
|
||||
if eval_packages:
|
||||
for p in eval_packages:
|
||||
mod.eval_packages.add(p)
|
||||
|
||||
# if build_app_domain:
|
||||
# ad = ApplicabilityDomain.create(mod, app_domain_num_neighbours, app_domain_reliability_threshold,
|
||||
# app_domain_local_compatibility_threshold)
|
||||
@ -3144,10 +3137,18 @@ class EnviFormer(PackageBasedModel):
|
||||
args = {"clz": "EnviFormer"}
|
||||
return args
|
||||
|
||||
def evaluate_model(self):
|
||||
def evaluate_model(self, multigen: bool, eval_packages: List["Package"] = None):
|
||||
if self.model_status != self.BUILT_NOT_EVALUATED:
|
||||
raise ValueError(f"Can't evaluate a model in state {self.model_status}!")
|
||||
|
||||
if multigen:
|
||||
self.multigen_eval = multigen
|
||||
self.save()
|
||||
|
||||
if eval_packages is not None:
|
||||
for p in eval_packages:
|
||||
self.eval_packages.add(p)
|
||||
|
||||
self.model_status = self.EVALUATING
|
||||
self.save()
|
||||
|
||||
@ -3671,3 +3672,53 @@ class Setting(EnviPathModel):
|
||||
self.public = True
|
||||
self.global_default = True
|
||||
self.save()
|
||||
|
||||
|
||||
class JobLogStatus(models.TextChoices):
|
||||
INITIAL = "INITIAL", "Initial"
|
||||
SUCCESS = "SUCCESS", "Success"
|
||||
FAILURE = "FAILURE", "Failure"
|
||||
REVOKED = "REVOKED", "Revoked"
|
||||
IGNORED = "IGNORED", "Ignored"
|
||||
|
||||
|
||||
class JobLog(TimeStampedModel):
|
||||
user = models.ForeignKey("epdb.User", models.CASCADE)
|
||||
task_id = models.UUIDField(unique=True)
|
||||
job_name = models.TextField(null=False, blank=False)
|
||||
status = models.CharField(
|
||||
max_length=20,
|
||||
choices=JobLogStatus.choices,
|
||||
default=JobLogStatus.INITIAL,
|
||||
)
|
||||
|
||||
done_at = models.DateTimeField(null=True, blank=True, default=None)
|
||||
task_result = models.TextField(null=True, blank=True, default=None)
|
||||
|
||||
def check_for_update(self):
|
||||
async_res = self.get_result()
|
||||
new_status = async_res.state
|
||||
|
||||
TERMINAL_STATES = [
|
||||
"SUCCESS",
|
||||
"FAILURE",
|
||||
"REVOKED",
|
||||
"IGNORED",
|
||||
]
|
||||
|
||||
if new_status != self.status and new_status in TERMINAL_STATES:
|
||||
self.status = new_status
|
||||
self.done_at = async_res.date_done
|
||||
|
||||
if new_status == "SUCCESS":
|
||||
self.task_result = async_res.result
|
||||
|
||||
self.save()
|
||||
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_result(self):
|
||||
from celery.result import AsyncResult
|
||||
|
||||
return AsyncResult(str(self.task_id))
|
||||
|
||||
Reference in New Issue
Block a user