FitModel.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from contextlib import closing
  2. from flask import make_response, request, abort
  3. from flask.views import View
  4. from pycs.database.Database import Database
  5. from pycs.interfaces.AnnotatedMediaFile import AnnotatedMediaFile
  6. from pycs.jobs.JobGroupBusyException import JobGroupBusyException
  7. from pycs.jobs.JobRunner import JobRunner
  8. from pycs.util.PipelineUtil import load_from_root_folder as load_pipeline
  9. class FitModel(View):
  10. """
  11. use annotated data to fit a model
  12. """
  13. # pylint: disable=arguments-differ
  14. methods = ['POST']
  15. def __init__(self, db: Database, jobs: JobRunner):
  16. # pylint: disable=invalid-name
  17. self.db = db
  18. self.jobs = jobs
  19. def dispatch_request(self, project_id):
  20. # extract request data
  21. data = request.get_json(force=True)
  22. if 'fit' not in data or data['fit'] is not True:
  23. return abort(400)
  24. # find project
  25. project = self.db.project(project_id)
  26. if project is None:
  27. return abort(404)
  28. # get model
  29. model = project.model()
  30. # get data and results
  31. files = list(map(AnnotatedMediaFile, project.files()))
  32. # create job
  33. try:
  34. self.jobs.run(project,
  35. 'Model Interaction',
  36. f'{project.name} (fit model with new data)',
  37. f'{project.name}/model-interaction',
  38. self.load_and_fit, model, files)
  39. except JobGroupBusyException:
  40. return abort(400)
  41. return make_response()
  42. def load_and_fit(self, model, files):
  43. with closing(load_pipeline(model.root_folder)) as pipeline:
  44. pipeline.fit(files)