def generation_strategy_from_json( generation_strategy_json: Dict[str, Any], experiment: Optional[Experiment] = None) -> GenerationStrategy: """Load generation strategy from JSON.""" steps = object_from_json(generation_strategy_json.pop("steps")) gs = GenerationStrategy(steps=steps, name=generation_strategy_json.pop("name")) gs._db_id = object_from_json(generation_strategy_json.pop("db_id")) gs._experiment = experiment or object_from_json( generation_strategy_json.pop("experiment")) gs._curr = gs._steps[generation_strategy_json.pop("curr_index")] gs._generator_runs = object_from_json( generation_strategy_json.pop("generator_runs")) if generation_strategy_json.pop( "had_initialized_model"): # pragma: no cover # If model in the current step was not directly from the `Models` enum, # pass its type to `restore_model_from_generator_run`, which will then # attempt to use this type to recreate the model. if type(gs._curr.model) != Models: models_enum = type(gs._curr.model) assert issubclass(models_enum, ModelRegistryBase) # pyre-ignore[6]: `models_enum` typing hackiness gs._restore_model_from_generator_run(models_enum=models_enum) return gs gs._restore_model_from_generator_run() return gs
def generation_strategy_from_sqa( self, gs_sqa: SQAGenerationStrategy) -> GenerationStrategy: """Convert SQALchemy generation strategy to Ax `GenerationStrategy`.""" steps = object_from_json(gs_sqa.steps) gs = GenerationStrategy(name=gs_sqa.name, steps=steps) gs._curr = gs._steps[gs_sqa.curr_index] gs._generator_runs = [ self.generator_run_from_sqa(gr) for gr in gs_sqa.generator_runs ] if len(gs._generator_runs) > 0: # Generation strategy had an initialized model. # pyre-ignore[16]: SQAGenerationStrategy does not have `experiment` attr. gs._experiment = self.experiment_from_sqa(gs_sqa.experiment) # If model in the current step was not directly from the `Models` enum, # pass its type to `restore_model_from_generator_run`, which will then # attempt to use this type to recreate the model. if type(gs._curr.model) != Models: models_enum = type(gs._curr.model) assert issubclass(models_enum, Models) # pyre-ignore[6]: `models_enum` typing hackiness gs._restore_model_from_generator_run(models_enum=models_enum) else: gs._restore_model_from_generator_run() gs._db_id = gs_sqa.id return gs
def _save_generation_strategy(generation_strategy: GenerationStrategy, encoder: Encoder) -> int: # If the generation strategy has not yet generated anything, there will be no # experiment set on it. if generation_strategy._experiment is None: experiment_id = None else: # Experiment was set on the generation strategy, so need to check whether # if has been saved and create a relationship b/w GS and experiment if so. experiment_id = _get_experiment_id( experiment=generation_strategy._experiment, encoder=encoder) gs_sqa = encoder.generation_strategy_to_sqa( generation_strategy=generation_strategy, experiment_id=experiment_id) with session_scope() as session: if generation_strategy._db_id is None: session.add(gs_sqa) session.flush() # Ensures generation strategy id is set. generation_strategy._db_id = gs_sqa.id else: gs_sqa_class = encoder.config.class_to_sqa_class[ GenerationStrategy] existing_gs_sqa = session.query(gs_sqa_class).get( generation_strategy._db_id) existing_gs_sqa.update(gs_sqa) # our update logic ignores foreign keys, i.e. fields ending in _id, # because we want SQLAlchemy to handle those relationships for us # however, generation_strategy.experiment_id is an exception, so we # need to update that manually existing_gs_sqa.experiment_id = gs_sqa.experiment_id return generation_strategy._db_id
def generation_strategy_from_sqa( self, gs_sqa: SQAGenerationStrategy) -> GenerationStrategy: """Convert SQALchemy generation strategy to Ax `GenerationStrategy`.""" steps = object_from_json(gs_sqa.steps) gs = GenerationStrategy(name=gs_sqa.name, steps=steps) gs._curr = gs._steps[gs_sqa.curr_index] gs._generator_runs = [ self.generator_run_from_sqa(gr) for gr in gs_sqa.generator_runs ] if len(gs._generator_runs) > 0: # Generation strategy had an initialized model. # pyre-ignore[16]: SQAGenerationStrategy does not have `experiment` attr. gs._experiment = self.experiment_from_sqa(gs_sqa.experiment) gs._restore_model_from_generator_run() gs._db_id = gs_sqa.id return gs
def generation_strategy_from_json( generation_strategy_json: Dict[str, Any] ) -> GenerationStrategy: """Load generation strategy from JSON.""" steps = object_from_json(generation_strategy_json.pop("steps")) gs = GenerationStrategy(steps=steps, name=generation_strategy_json.pop("name")) gs._db_id = object_from_json(generation_strategy_json.pop("db_id")) gs._experiment = object_from_json(generation_strategy_json.pop("experiment")) gs._generated = generation_strategy_json.pop("generated") gs._observed = generation_strategy_json.pop("observed") gs._data = object_from_json(generation_strategy_json.pop("data")) gs._curr = gs._steps[generation_strategy_json.pop("curr_index")] gs._generator_runs = object_from_json( generation_strategy_json.pop("generator_runs") ) if generation_strategy_json.pop("had_initialized_model"): # pragma: no cover gs._restore_model_from_generator_run() return gs
def save_generation_strategy(generation_strategy: GenerationStrategy, config: Optional[SQAConfig] = None) -> int: """Save generation strategy (using default SQAConfig if no config is specified). If the generation strategy has an experiment set, the experiment will be saved first. Returns: The ID of the saved generation strategy. """ # Start up SQA encoder. config = config or SQAConfig() encoder = Encoder(config=config) # If the generation strategy has not yet generated anything, there will be no # experiment set on it. if generation_strategy._experiment is None: experiment_id = None else: # Experiment was set on the generation strategy, so we need to save it first. save_experiment(experiment=generation_strategy._experiment, config=config) experiment_id = _get_experiment_id( experiment=generation_strategy._experiment, encoder=encoder) gs_sqa = encoder.generation_strategy_to_sqa( generation_strategy=generation_strategy, experiment_id=experiment_id) with session_scope() as session: if generation_strategy._db_id is None: session.add(gs_sqa) session.flush() # Ensures generation strategy id is set. generation_strategy._db_id = gs_sqa.id else: existing_gs_sqa = session.query(SQAGenerationStrategy).get( generation_strategy._db_id) existing_gs_sqa.update(gs_sqa) # our update logic ignores foreign keys, i.e. fields ending in _id, # because we want SQLAlchemy to handle those relationships for us # however, generation_strategy.experiment_id is an exception, so we # need to update that manually existing_gs_sqa.experiment_id = gs_sqa.experiment_id return generation_strategy._db_id
def _save_generation_strategy(generation_strategy: GenerationStrategy, encoder: Encoder) -> int: # If the generation strategy has not yet generated anything, there will be no # experiment set on it. if generation_strategy._experiment is None: experiment_id = None else: # Experiment was set on the generation strategy, so need to check whether # if has been saved and create a relationship b/w GS and experiment if so. experiment_id = _get_experiment_id( # pyre-fixme[6]: Expected `Experiment` for 1st param but got # `Optional[Experiment]`. experiment=generation_strategy._experiment, encoder=encoder, ) gs_sqa = encoder.generation_strategy_to_sqa( generation_strategy=generation_strategy, experiment_id=experiment_id) if generation_strategy._db_id is not None: gs_sqa_class = encoder.config.class_to_sqa_class[GenerationStrategy] with session_scope() as session: existing_gs_sqa = session.query(gs_sqa_class).get( generation_strategy._db_id) # pyre-fixme[16]: `Optional` has no attribute `update`. existing_gs_sqa.update(gs_sqa) # our update logic ignores foreign keys, i.e. fields ending in _id, # because we want SQLAlchemy to handle those relationships for us # however, generation_strategy.experiment_id is an exception, so we # need to update that manually # pyre-fixme[16]: `Optional` has no attribute `experiment_id`. existing_gs_sqa.experiment_id = gs_sqa.experiment_id gs_sqa = existing_gs_sqa with session_scope() as session: session.add(gs_sqa) session.flush() # Ensures generation strategy id is set. # pyre-fixme[16]: `None` has no attribute `id`. generation_strategy._db_id = gs_sqa.id # pyre-fixme[7]: Expected `int` but got `Optional[int]`. return generation_strategy._db_id