Пример #1
0
    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
Пример #2
0
    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
        )]
Пример #3
0
    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