from contextlib import closing from flask import make_response, request, abort from flask.views import View from pycs.database.Database import Database from pycs.interfaces.AnnotatedMediaFile import AnnotatedMediaFile from pycs.jobs.JobGroupBusyException import JobGroupBusyException from pycs.jobs.JobRunner import JobRunner from pycs.util.PipelineUtil import load_from_root_folder as load_pipeline class FitModel(View): """ use annotated data to fit a model """ # pylint: disable=arguments-differ methods = ['POST'] def __init__(self, db: Database, jobs: JobRunner): # pylint: disable=invalid-name self.db = db self.jobs = jobs def dispatch_request(self, project_id): # extract request data data = request.get_json(force=True) if 'fit' not in data or data['fit'] is not True: return abort(400) # find project project = self.db.project(project_id) if project is None: return abort(404) # get model model = project.model() # get data and results files = list(map(AnnotatedMediaFile, project.files())) # create job try: self.jobs.run(project, 'Model Interaction', f'{project.name} (fit model with new data)', f'{project.name}/model-interaction', self.load_and_fit, model, files) except JobGroupBusyException: return abort(400) return make_response() def load_and_fit(self, model, files): with closing(load_pipeline(model.root_folder)) as pipeline: pipeline.fit(files)