def create_new_study(self, study_name=None): # type: (Optional[str]) -> int if study_name is not None and self._redis.exists( self._key_study_name(study_name)): raise exceptions.DuplicatedStudyError if not self._redis.exists("study_counter"): # We need the counter to start with 0. self._redis.set("study_counter", -1) study_id = self._redis.incr("study_counter", 1) # We need the trial_number counter to start with 0. self._redis.set("study_id:{:010d}:trial_number".format(study_id), -1) if study_name is None: study_name = "{}{:010d}".format(DEFAULT_STUDY_NAME_PREFIX, study_id) with self._redis.pipeline() as pipe: pipe.multi() pipe.set(self._key_study_name(study_name), pickle.dumps(study_id)) pipe.set("study_id:{:010d}:study_name".format(study_id), pickle.dumps(study_name)) pipe.set( "study_id:{:010d}:direction".format(study_id), pickle.dumps(structs.StudyDirection.NOT_SET), ) study_summary = structs.StudySummary( study_name=study_name, direction=structs.StudyDirection.NOT_SET, best_trial=None, user_attrs={}, system_attrs={}, n_trials=0, datetime_start=datetime.now(), study_id=study_id, ) pipe.rpush("study_list", pickle.dumps(study_id)) pipe.set(self._key_study_summary(study_id), pickle.dumps(study_summary)) pipe.execute() return study_id
def get_all_study_summaries(self): # type: () -> List[structs.StudySummary] best_trial = None n_complete_trials = len([t for t in self.trials if t.state == structs.TrialState.COMPLETE]) if n_complete_trials > 0: best_trial = self.get_best_trial(IN_MEMORY_STORAGE_STUDY_ID) datetime_start = None if len(self.trials) > 0: datetime_start = min([t.datetime_start for t in self.trials]) return [structs.StudySummary( study_id=IN_MEMORY_STORAGE_STUDY_ID, study_name=self.study_name, direction=self.direction, best_trial=best_trial, user_attrs=copy.deepcopy(self.study_user_attrs), system_attrs=copy.deepcopy(self.study_system_attrs), n_trials=len(self.trials), datetime_start=datetime_start )]
def get_all_study_summaries(self): # type: () -> List[structs.StudySummary] session = self.scoped_session() study_models = models.StudyModel.all(session) trial_models = models.TrialModel.all(session) param_models = models.TrialParamModel.all(session) value_models = models.TrialValueModel.all(session) trial_user_attribute_models = models.TrialUserAttributeModel.all( session) trial_system_attribute_models = models.TrialSystemAttributeModel.all( session) study_summaries = [] for study_model in study_models: # Filter model objects by study. study_trial_models = [ t for t in trial_models if t.study_id == study_model.study_id ] # Get best trial. completed_trial_models = [ t for t in study_trial_models if t.state is structs.TrialState.COMPLETE ] best_trial = None if len(completed_trial_models) > 0: if study_model.direction == structs.StudyDirection.MAXIMIZE: best_trial_model = max(completed_trial_models, key=lambda t: t.value) else: best_trial_model = min(completed_trial_models, key=lambda t: t.value) best_param_models = [ p for p in param_models if p.trial_id == best_trial_model.trial_id ] best_value_models = [ v for v in value_models if v.trial_id == best_trial_model.trial_id ] best_trial_user_models = [ u for u in trial_user_attribute_models if u.trial_id == best_trial_model.trial_id ] best_trial_system_models = [ s for s in trial_system_attribute_models if s.trial_id == best_trial_model.trial_id ] # Merge model objects related to the best trial. best_trial = self._merge_trials_orm( [best_trial_model], best_param_models, best_value_models, best_trial_user_models, best_trial_system_models)[0] # Find datetime_start. datetime_start = None if len(study_trial_models) > 0: datetime_start = min( [t.datetime_start for t in study_trial_models]) attributes = models.StudySystemAttributeModel.where_study_id( study_model.study_id, session) system_attrs = { attr.key: json.loads(attr.value_json) for attr in attributes } # Consolidate StudySummary. study_summaries.append( structs.StudySummary( study_name=study_model.study_name, direction=self.get_study_direction(study_model.study_id), best_trial=best_trial, user_attrs=self.get_study_user_attrs(study_model.study_id), system_attrs=system_attrs, n_trials=len(study_trial_models), datetime_start=datetime_start, study_id=study_model.study_id)) # Terminate transaction explicitly to avoid connection timeout during transaction. self._commit(session) return study_summaries