def generate_distorted_problem(self, problem, arrival_time=0):
     problem_active_execution_time = 0
     distorted_job_list = problem.get_jobs_list()
     for job in distorted_job_list:
         problem_active_execution_time += JobUtil.calculate_active_execution_time(job)
         job.arrival_time = arrival_time
     expected_distortion_level = self.distortion_factor * problem_active_execution_time
     distortion_level = 0
     while distortion_level < expected_distortion_level:
         job = self.__draw_random_job(distorted_job_list)
         task = self.__draw_random_task(job)
         distortion_level += self.__distort_task(task)
     return Problem(distorted_job_list)
 def add_job(self, job):
     if self.__total_active_execution_time > self.__predictive_time:
         raise Exception("Job window is already full")
     self.__total_active_execution_time += JobUtil.calculate_active_execution_time(job)
     self.__jobs.append(job)
     return self.is_full()