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