def _run_pso(self, n_particles, n_iterations, kwargs_fixed_lens, kwargs_mean_lens, kwargs_sigma_lens, kwargs_fixed_source, kwargs_mean_source, kwargs_sigma_source, kwargs_fixed_lens_light, kwargs_mean_lens_light, kwargs_sigma_lens_light, kwargs_fixed_ps, kwargs_mean_ps, kwargs_sigma_ps, kwargs_fixed_cosmo, kwargs_mean_cosmo, kwargs_sigma_cosmo, threadCount=1, mpi=False, print_key='PSO', sigma_factor=1, compute_bool=None, fix_solver=False): # initialise mcmc classes param_class = Param(self.kwargs_model, self.kwargs_constraints, kwargs_fixed_lens, kwargs_fixed_source, kwargs_fixed_lens_light, kwargs_fixed_ps, kwargs_fixed_cosmo, self._lens_lower, self._source_lower, self._lens_light_lower, self._ps_lower, self._cosmo_lower, self._lens_upper, self._source_upper, self._lens_light_upper, self._ps_upper, self._cosmo_upper, kwargs_lens_init=kwargs_mean_lens, fix_lens_solver=fix_solver) init_pos = param_class.setParams(kwargs_mean_lens, kwargs_mean_source, kwargs_mean_lens_light, kwargs_mean_ps, kwargs_mean_cosmo) sigma_start = param_class.setParams(kwargs_sigma_lens, kwargs_sigma_source, kwargs_sigma_lens_light, kwargs_sigma_ps, kwargs_sigma_cosmo) lowerLimit = np.array(init_pos) - np.array(sigma_start) * sigma_factor upperLimit = np.array(init_pos) + np.array(sigma_start) * sigma_factor num_param, param_list = param_class.num_param() # initialize ImSim() class kwargs_likelihood = copy.deepcopy(self.kwargs_likelihood) if compute_bool is not None: kwargs_likelihood['bands_compute'] = compute_bool imSim_class = class_creator.create_multiband(self.multi_band_list, self.kwargs_model) likelihoodModule = LikelihoodModule( imSim_class=imSim_class, param_class=param_class, kwargs_likelihood=kwargs_likelihood) # run PSO mcmc_class = Sampler(likelihoodModule=likelihoodModule) result, chain = mcmc_class.pso(n_particles, n_iterations, lowerLimit, upperLimit, init_pos=init_pos, threadCount=threadCount, mpi=mpi, print_key=print_key) lens_result, source_result, lens_light_result, ps_result, cosmo_result = param_class.getParams( result, bijective=True) return lens_result, source_result, lens_light_result, ps_result, cosmo_result, chain, param_list
class TestFittingSequence(object): """ test the fitting sequences """ def setup(self): self.SimAPI = Simulation() # data specifics sigma_bkg = 0.05 # background noise per pixel exp_time = 100 # exposure time (arbitrary units, flux per pixel is in units #photons/exp_time unit) numPix = 10 # cutout pixel size deltaPix = 0.1 # pixel size in arcsec (area per pixel = deltaPix**2) fwhm = 0.5 # full width half max of PSF # PSF specification kwargs_data = self.SimAPI.data_configure(numPix, deltaPix, exp_time, sigma_bkg) data_class = Data(kwargs_data) kwargs_psf = self.SimAPI.psf_configure(psf_type='GAUSSIAN', fwhm=fwhm, kernelsize=11, deltaPix=deltaPix, truncate=3, kernel=None) kwargs_psf = self.SimAPI.psf_configure( psf_type='PIXEL', fwhm=fwhm, kernelsize=11, deltaPix=deltaPix, truncate=6, kernel=kwargs_psf['kernel_point_source']) psf_class = PSF(kwargs_psf) kwargs_spemd = { 'theta_E': 1., 'gamma': 1.8, 'center_x': 0, 'center_y': 0, 'e1': 0.1, 'e2': 0.1 } lens_model_list = ['SPEP'] self.kwargs_lens = [kwargs_spemd] lens_model_class = LensModel(lens_model_list=lens_model_list) kwargs_sersic = { 'amp': 1., 'R_sersic': 0.1, 'n_sersic': 2, 'center_x': 0, 'center_y': 0 } # 'SERSIC_ELLIPSE': elliptical Sersic profile kwargs_sersic_ellipse = { 'amp': 1., 'R_sersic': .6, 'n_sersic': 3, 'center_x': 0, 'center_y': 0, 'e1': 0.1, 'e2': 0.1 } lens_light_model_list = ['SERSIC'] self.kwargs_lens_light = [kwargs_sersic] lens_light_model_class = LightModel( light_model_list=lens_light_model_list) source_model_list = ['SERSIC_ELLIPSE'] self.kwargs_source = [kwargs_sersic_ellipse] source_model_class = LightModel(light_model_list=source_model_list) kwargs_numerics = {'subgrid_res': 1, 'psf_subgrid': False} imageModel = ImageModel(data_class, psf_class, lens_model_class, source_model_class, lens_light_model_class, kwargs_numerics=kwargs_numerics) image_sim = self.SimAPI.simulate(imageModel, self.kwargs_lens, self.kwargs_source, self.kwargs_lens_light) data_class.update_data(image_sim) self.data_class = data_class self.psf_class = psf_class kwargs_model = { 'lens_model_list': lens_model_list, 'source_light_model_list': source_model_list, 'lens_light_model_list': lens_light_model_list, 'fixed_magnification_list': [False], } self.kwargs_numerics = {'subgrid_res': 1, 'psf_subgrid': False} num_source_model = len(source_model_list) kwargs_constraints = { 'joint_center_lens_light': False, 'joint_center_source_light': False, 'additional_images_list': [False], 'fix_to_point_source_list': [False] * num_source_model, 'image_plane_source_list': [False] * num_source_model, 'solver': False, } kwargs_likelihood = { 'source_marg': True, 'point_source_likelihood': False, 'position_uncertainty': 0.004, 'check_solver': False, 'solver_tolerance': 0.001, } self.param_class = Param(kwargs_model, kwargs_constraints) self.Likelihood = LikelihoodModule(imSim_class=imageModel, param_class=self.param_class, kwargs_likelihood=kwargs_likelihood) self.sampler = Sampler(likelihoodModule=self.Likelihood) def test_pso(self): n_particles = 2 n_iterations = 2 result, chain = self.sampler.pso(n_particles, n_iterations, lower_start=None, upper_start=None, threadCount=1, init_pos=None, mpi=False, print_key='PSO') assert len(result) == 16 def test_mcmc_emcee(self): n_walkers = 36 n_run = 2 n_burn = 2 mean_start = self.param_class.setParams( kwargs_lens=self.kwargs_lens, kwargs_source=self.kwargs_source, kwargs_lens_light=self.kwargs_lens_light) sigma_start = np.ones_like(mean_start) * 0.1 samples = self.sampler.mcmc_emcee(n_walkers, n_run, n_burn, mean_start, sigma_start, mpi=False) assert len(samples) == n_walkers * n_run def test_mcmc_CH(self): walkerRatio = 2 n_run = 2 n_burn = 2 mean_start = self.param_class.setParams( kwargs_lens=self.kwargs_lens, kwargs_source=self.kwargs_source, kwargs_lens_light=self.kwargs_lens_light) sigma_start = np.ones_like(mean_start) * 0.1 self.sampler.mcmc_CH(walkerRatio, n_run, n_burn, mean_start, sigma_start, threadCount=1, init_pos=None, mpi=False)
def _mcmc_run(self, n_burn, n_run, walkerRatio, kwargs_fixed_lens, kwargs_mean_lens, kwargs_sigma_lens, kwargs_fixed_source, kwargs_mean_source, kwargs_sigma_source, kwargs_fixed_lens_light, kwargs_mean_lens_light, kwargs_sigma_lens_light, kwargs_fixed_ps, kwargs_mean_ps, kwargs_sigma_ps, kwargs_fixed_cosmo, kwargs_mean_cosmo, kwargs_sigma_cosmo, threadCount=1, mpi=False, init_samples=None, sigma_factor=1, compute_bool=None, fix_solver=False): param_class = Param(self.kwargs_model, self.kwargs_constraints, kwargs_fixed_lens, kwargs_fixed_source, kwargs_fixed_lens_light, kwargs_fixed_ps, kwargs_fixed_cosmo, self._lens_lower, self._source_lower, self._lens_light_lower, self._ps_lower, self._cosmo_lower, self._lens_upper, self._source_upper, self._lens_light_upper, self._ps_upper, self._cosmo_upper, kwargs_lens_init=kwargs_mean_lens, fix_lens_solver=fix_solver) # initialize ImSim() class kwargs_likelihood = copy.deepcopy(self.kwargs_likelihood) if compute_bool is not None: kwargs_likelihood['bands_compute'] = compute_bool imSim_class = class_creator.create_multiband(self.multi_band_list, self.kwargs_model) likelihoodModule = LikelihoodModule( imSim_class=imSim_class, param_class=param_class, kwargs_likelihood=kwargs_likelihood) # run PSO mcmc_class = Sampler(likelihoodModule=likelihoodModule) mean_start = param_class.setParams(kwargs_mean_lens, kwargs_mean_source, kwargs_mean_lens_light, kwargs_mean_ps, kwargs_mean_cosmo) sigma_start = param_class.setParams(kwargs_sigma_lens, kwargs_sigma_source, kwargs_sigma_lens_light, kwargs_sigma_ps, kwargs_sigma_cosmo) num_param, param_list = param_class.num_param() # run MCMC if not init_samples is None: initpos = ReusePositionGenerator(init_samples) else: initpos = None samples, dist = mcmc_class.mcmc_CH(walkerRatio, n_run, n_burn, mean_start, np.array(sigma_start) * sigma_factor, threadCount=threadCount, mpi=mpi, init_pos=initpos) return samples, param_list, dist
class TestFittingSequence(object): """ test the fitting sequences """ def setup(self): np.random.seed(42) self.SimAPI = Simulation() # data specifics sigma_bkg = 0.05 # background noise per pixel exp_time = 100 # exposure time (arbitrary units, flux per pixel is in units #photons/exp_time unit) numPix = 50 # cutout pixel size deltaPix = 0.1 # pixel size in arcsec (area per pixel = deltaPix**2) fwhm = 0.5 # full width half max of PSF # PSF specification kwargs_data = self.SimAPI.data_configure(numPix, deltaPix, exp_time, sigma_bkg) data_class = Data(kwargs_data) kwargs_psf = self.SimAPI.psf_configure(psf_type='GAUSSIAN', fwhm=fwhm, kernelsize=11, deltaPix=deltaPix, truncate=3, kernel=None) psf_class = PSF(kwargs_psf) kwargs_spemd = { 'theta_E': 1., 'gamma': 1.95, 'center_x': 0, 'center_y': 0, 'e1': 0.1, 'e2': 0.1 } lens_model_list = ['SPEP'] self.kwargs_lens = [kwargs_spemd] lens_model_class = LensModel(lens_model_list=lens_model_list) kwargs_sersic = { 'amp': 1., 'R_sersic': 0.1, 'n_sersic': 2, 'center_x': 0, 'center_y': 0 } # 'SERSIC_ELLIPSE': elliptical Sersic profile kwargs_sersic_ellipse = { 'amp': 1., 'R_sersic': .6, 'n_sersic': 3, 'center_x': 0, 'center_y': 0, 'e1': 0.1, 'e2': 0.1 } lens_light_model_list = ['SERSIC'] self.kwargs_lens_light = [kwargs_sersic] lens_light_model_class = LightModel( light_model_list=lens_light_model_list) source_model_list = ['SERSIC_ELLIPSE'] self.kwargs_source = [kwargs_sersic_ellipse] source_model_class = LightModel(light_model_list=source_model_list) self.kwargs_ps = [ { 'ra_source': 0.55, 'dec_source': 0.02, 'source_amp': 1. } ] # quasar point source position in the source plane and intrinsic brightness self.kwargs_cosmo = {'D_dt': 1000} point_source_list = ['SOURCE_POSITION'] point_source_class = PointSource( point_source_type_list=point_source_list, fixed_magnification_list=[True]) kwargs_numerics = {'subgrid_res': 1, 'psf_subgrid': False} imageModel = ImageModel(data_class, psf_class, lens_model_class, source_model_class, lens_light_model_class, point_source_class, kwargs_numerics=kwargs_numerics) image_sim = self.SimAPI.simulate(imageModel, self.kwargs_lens, self.kwargs_source, self.kwargs_lens_light, self.kwargs_ps) data_class.update_data(image_sim) self.data_class = data_class self.psf_class = psf_class kwargs_model = { 'lens_model_list': lens_model_list, 'source_light_model_list': source_model_list, 'lens_light_model_list': lens_light_model_list, 'point_source_model_list': point_source_list, 'cosmo_type': 'D_dt' } self.kwargs_numerics = {'subgrid_res': 1, 'psf_subgrid': False} kwargs_constraints = { 'num_point_source_list': [4], 'additional_images_list': [True], 'solver': False, 'solver_type': 'PROFILE_SHEAR', # 'PROFILE', 'PROFILE_SHEAR', 'ELLIPSE', 'CENTER' } kwargs_likelihood = { 'force_no_add_image': True, 'source_marg': True, 'point_source_likelihood': True, 'position_uncertainty': 0.004, 'check_solver': True, 'solver_tolerance': 0.001, 'check_positive_flux': True, } self.param_class = Param(kwargs_model, kwargs_constraints) self.imageModel = ImageModel(data_class, psf_class, lens_model_class, source_model_class, lens_light_model_class, point_source_class, kwargs_numerics=kwargs_numerics) self.Likelihood = LikelihoodModule(imSim_class=self.imageModel, param_class=self.param_class, kwargs_likelihood=kwargs_likelihood) def test_logL(self): args = self.param_class.setParams( kwargs_lens=self.kwargs_lens, kwargs_source=self.kwargs_source, kwargs_lens_light=self.kwargs_lens_light, kwargs_ps=self.kwargs_ps, kwargs_cosmo=self.kwargs_cosmo) logL, _ = self.Likelihood.logL(args) num_data_evaluate = self.Likelihood.imSim.numData_evaluate() npt.assert_almost_equal(logL / num_data_evaluate, -1 / 2., decimal=1) def test_time_delay_likelihood(self): kwargs_likelihood = { 'time_delay_likelihood': True, 'time_delays_measured': np.ones(4), 'time_delays_uncertainties': np.ones(4) } likelihood = LikelihoodModule(imSim_class=self.imageModel, param_class=self.param_class, kwargs_likelihood=kwargs_likelihood) args = self.param_class.setParams( kwargs_lens=self.kwargs_lens, kwargs_source=self.kwargs_source, kwargs_lens_light=self.kwargs_lens_light, kwargs_ps=self.kwargs_ps, kwargs_cosmo=self.kwargs_cosmo) logL, _ = likelihood.logL(args) npt.assert_almost_equal(logL, -3313.79, decimal=-1) def test_solver(self): # make simulation with point source positions in image plane x_pos, y_pos = self.imageModel.PointSource.image_position( self.kwargs_ps, self.kwargs_lens) kwargs_ps = [{'ra_image': x_pos[0], 'dec_image': y_pos[0]}] kwargs_likelihood = { 'source_marg': True, 'point_source_likelihood': True, 'position_uncertainty': 0.004, 'check_solver': True, 'solver_tolerance': 0.001, 'check_positive_flux': True, 'solver': True }