def mock_trained_emulator(mock_emulator): filename = os.path.join(test_base, "data", "emu.hdf5") if os.path.exists(filename): yield Emulator.load(filename) else: mock_emulator.train() mock_emulator.save(filename) yield mock_emulator
def test_save_load(self, mock_emulator, tmpdir): init = mock_emulator.get_param_dict() filename = tmpdir.join("emu.hdf5") mock_emulator.save(filename) emulator = Emulator.load(filename) final = emulator.get_param_dict() assert init == final assert emulator._trained == mock_emulator._trained
def __init__( self, emulator: Union[str, Emulator], data: Union[str, Spectrum], grid_params: Sequence[float], max_deque_len: int = 100, name: str = "SpectrumModel", **params, ): if isinstance(emulator, str): emulator = Emulator.load(emulator) if isinstance(data, str): data = Spectrum.load(data) if len(data) > 1: raise ValueError( "Multiple orders detected in data, please use EchelleModel") self.emulator: Emulator = emulator self.data_name = data.name self.data = data[0] dv = calculate_dv(self.data.wave) self.min_dv_wave = create_log_lam_grid(dv, self.emulator.wl.min(), self.emulator.wl.max())["wl"] self.bulk_fluxes = resample(self.emulator.wl, self.emulator.bulk_fluxes, self.min_dv_wave) self.residuals = deque(maxlen=max_deque_len) # manually handle cheb coeffs to offset index by 1 chebs = params.pop("cheb", []) cheb_idxs = [str(i) for i in range(1, len(chebs) + 1)] params["cheb"] = dict(zip(cheb_idxs, chebs)) # load rest of params into FlatterDict self.params = FlatterDict(params) self.frozen = [] self.name = name # Unpack the grid parameters self.n_grid_params = len(grid_params) self.grid_params = grid_params # None means "yet to be calculated", do not use NaN self._lnprob = None self._glob_cov = None self._loc_cov = None self.log = logging.getLogger(self.__class__.__name__) self.flux_scalar_func = flux_scalar = LinearNDInterpolator( self.emulator.grid_points, self.emulator.flux_scalar)