Example #1
0
    def test_joint_source_with_point_source(self):
        kwargs_model = {'lens_model_list': ['SIS'], 'source_light_model_list': ['SERSIC'], 'point_source_model_list': ['SOURCE_POSITION']}
        i_source, k_ps = 0, 0
        kwargs_constraints = {'joint_source_with_point_source': [[k_ps, i_source]]} # list[[i_point_source, k_source, ['param_name1', 'param_name2', ...]], [

        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_source = [{'amp': 1, 'n_sersic': 2, 'R_sersic': 0.3, 'center_x': 1, 'center_y': 1}]
        kwargs_ps = [{'ra_source': 0.5, 'dec_source': 0.5}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens, kwargs_source=kwargs_source, kwargs_ps=kwargs_ps)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        kwargs_source_out = kwargs_return['kwargs_source']
        #kwargs_lens_out, kwargs_source_out, _, kwargs_ps_out, _ = param.args2kwargs(args)
        assert kwargs_lens_out[0]['theta_E'] == kwargs_lens[0]['theta_E']
        assert kwargs_source_out[0]['center_x'] == kwargs_ps[0]['ra_source']

        kwargs_model = {'lens_model_list': ['SIS'], 'source_light_model_list': ['SERSIC'], 'point_source_model_list': ['LENSED_POSITION']}
        i_source, k_ps = 0, 0
        kwargs_constraints = {'joint_source_with_point_source': [[k_ps, i_source]]} # list[[i_point_source, k_source, ['param_name1', 'param_name2', ...]], [

        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_source = [{'amp': 1, 'n_sersic': 2, 'R_sersic': 0.3, 'center_x': 1, 'center_y': 1}]
        kwargs_ps = [{'ra_image': [0.5], 'dec_image': [0.5]}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens, kwargs_source=kwargs_source, kwargs_ps=kwargs_ps)
        #kwargs_lens_out, kwargs_source_out, _, kwargs_ps_out, _ = param.args2kwargs(args)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        kwargs_source_out = kwargs_return['kwargs_source']
        assert kwargs_lens_out[0]['theta_E'] == kwargs_lens[0]['theta_E']
        npt.assert_almost_equal(kwargs_source_out[0]['center_x'], -0.207, decimal=2)
Example #2
0
    def test_joint_lens_with_light(self):
        kwargs_model = {'lens_model_list': ['CHAMELEON'], 'lens_light_model_list': ['CHAMELEON']}
        i_light, k_lens = 0, 0
        kwargs_constraints = {'joint_lens_with_light': [[i_light, k_lens, ['w_t', 'w_c', 'center_x', 'center_y', 'e1', 'e2']]]}
        kwargs_lens = [{'alpha_1': 10}]
        kwargs_lens_light = [{'amp': 1, 'w_t': 0.5, 'w_c': 0.1, 'center_x': 0, 'center_y': 0.3, 'e1': 0.1, 'e2': -0.2}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens, kwargs_lens_light=kwargs_lens_light)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens_light']
        kwargs_lens_light_out = kwargs_return['kwargs_lens_light']
        assert kwargs_lens_out[0]['w_c'] == kwargs_lens_light[0]['w_c']
        assert kwargs_lens_light_out[0]['w_c'] == kwargs_lens_light[0]['w_c']

        kwargs_model = {'lens_model_list': ['SIS'], 'lens_light_model_list': ['SERSIC']}
        i_light, k_lens = 0, 0
        kwargs_constraints = {'joint_lens_with_light': [[i_light, k_lens, ['center_x',
                                                       'center_y']]]}  # list[[i_point_source, k_source, ['param_name1', 'param_name2', ...]], [
        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_lens_light = [{'amp': 1, 'R_sersic': 0.5, 'n_sersic': 2, 'center_x': 1, 'center_y': 1}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens, kwargs_lens_light=kwargs_lens_light)
        #kwargs_lens_out, kwargs_source_out, _, kwargs_ps_out, _ = param.args2kwargs(args)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']

        assert kwargs_lens_out[0]['theta_E'] == kwargs_lens[0]['theta_E']
        assert kwargs_lens_out[0]['center_x'] == kwargs_lens_light[0]['center_x']
Example #3
0
    def test_get_cosmo(self):
        kwargs_model = {'lens_model_list': ['SPEP'], 'source_light_model_list': ['GAUSSIAN'],
                        'lens_light_model_list': ['SERSIC'], 'point_source_model_list': ['LENSED_POSITION'],
                        }
        kwargs_param = {'Ddt_sampling': True}
        kwargs_fixed_lens = [{'gamma': 1.9}]  # for SPEP lens
        kwargs_fixed_source = [{'sigma_x': 0.1, 'sigma_y': 0.1, 'center_x': 0.2, 'center_y': 0.2}]
        kwargs_fixed_ps = [{'ra_image': [-1, 1], 'dec_image': [-1, 1]}]
        kwargs_fixed_lens_light = [{}]
        kwargs_fixed_cosmo = {'D_dt': 1000}
        param_class = Param(kwargs_model, kwargs_fixed_lens=kwargs_fixed_lens, kwargs_fixed_source=kwargs_fixed_source,
                            kwargs_fixed_lens_light=kwargs_fixed_lens_light, kwargs_fixed_ps=kwargs_fixed_ps,
                            kwargs_fixed_special=kwargs_fixed_cosmo, **kwargs_param)

        kwargs_true_lens = [
            {'theta_E': 1., 'gamma': 1.9, 'e1':0.01, 'e2':-0.01, 'center_x': 0., 'center_y': 0.}]  # for SPEP lens
        kwargs_true_source = [
            {'amp': 1 * 2 * np.pi * 0.1 ** 2, 'center_x': 0.2, 'center_y': 0.2, 'sigma_x': 0.1, 'sigma_y': 0.1}]
        kwargs_true_lens_light = [{'center_x': -0.06, 'center_y': 0.4, 'phi_G': 4.8,
                                   'q': 0.86, 'n_sersic': 1.7,
                                   'amp': 11.8, 'R_sersic': 0.697, 'phi_G_2': 0}]
        kwargs_true_ps = [{'point_amp': [1, 1], 'ra_image': [-1, 1], 'dec_image': [-1, 1]}]
        args = param_class.kwargs2args(kwargs_true_lens, kwargs_true_source,
                                       kwargs_lens_light=kwargs_true_lens_light, kwargs_ps=kwargs_true_ps,
                                       kwargs_special={'D_dt': 1000})
        assert param_class.specialParams._D_dt_sampling is True
Example #4
0
 def test_joint_lens_with_light_dict(self):
     kwargs_model = {
         'lens_model_list': ['SHEAR'],
         'lens_light_model_list': ['SERSIC']
     }
     i_light, k_lens = 0, 0
     kwargs_constraints = {
         'joint_lens_with_light':
         [[i_light, k_lens, {
             'ra_0': 'center_x',
             'dec_0': 'center_y'
         }]]
     }
     kwargs_lens = [{'gamma1': 0.05, 'gamma2': 0.06}]
     kwargs_lens_light = [{
         'amp': 1,
         'R_sersic': 1,
         'n_sersic': 4,
         'center_x': 0.1,
         'center_y': 0.3
     }]
     param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
     args = param.kwargs2args(kwargs_lens=kwargs_lens,
                              kwargs_lens_light=kwargs_lens_light)
     kwargs_return = param.args2kwargs(args)
     kwargs_lens_out = kwargs_return['kwargs_lens']
     kwargs_lens_light_out = kwargs_return['kwargs_lens_light']
     assert kwargs_lens_out[0]['gamma1'] == kwargs_lens[0]['gamma1']
     assert kwargs_lens_out[0]['ra_0'] == kwargs_lens_light[0]['center_x']
     assert kwargs_lens_out[0]['dec_0'] == kwargs_lens_light[0]['center_y']
Example #5
0
    def test_logsampling(self):
        kwargs_model = {
            'lens_model_list': ['SIS'],
            'source_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION'],
            'lens_light_model_list': ['SERSIC']
        }
        kwargs_constraints = {'log_sampling_lens': [[0, ['theta_E']]]}

        kwargs_lens = [{'theta_E': 0.1, 'center_x': 0, 'center_y': 0}]
        kwargs_source = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 1,
            'center_y': 1
        }]
        kwargs_lens_light = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        kwargs_ps = [{'ra_image': [0.5], 'dec_image': [0.5]}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_source=kwargs_source,
                                 kwargs_lens_light=kwargs_lens_light,
                                 kwargs_ps=kwargs_ps)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        assert args[0] == -1
        assert kwargs_lens_out[0]['theta_E'] == 0.1
    def test_force_positive_source_surface_brightness(self):
        kwargs_likelihood = {'force_minimum_source_surface_brightness': True}
        kwargs_model = {'source_light_model_list': ['SERSIC']}

        kwargs_constraints = {}
        param_class = Param(kwargs_model, **kwargs_constraints)

        kwargs_data = sim_util.data_configure_simple(numPix=10, deltaPix=0.1, exposure_time=1, sigma_bkg=0.1)
        data_class = ImageData(**kwargs_data)
        kwargs_psf = {'psf_type': 'NONE'}
        psf_class = PSF(**kwargs_psf)
        kwargs_sersic = {'amp': -1., 'R_sersic': 0.1, 'n_sersic': 2, 'center_x': 0, 'center_y': 0}
        source_model_list = ['SERSIC']
        kwargs_source = [kwargs_sersic]
        source_model_class = LightModel(light_model_list=source_model_list)

        imageModel = ImageModel(data_class, psf_class, lens_model_class=None, source_model_class=source_model_class)

        image_sim = sim_util.simulate_simple(imageModel, [], kwargs_source)

        kwargs_data['image_data'] = image_sim
        kwargs_data_joint = {'multi_band_list': [[kwargs_data, kwargs_psf, {}]], 'multi_band_type': 'single-band'}
        likelihood = LikelihoodModule(kwargs_data_joint=kwargs_data_joint, kwargs_model=kwargs_model, param_class=param_class, **kwargs_likelihood)

        logL, _ = likelihood.logL(args=param_class.kwargs2args(kwargs_source=kwargs_source), verbose=True)
        assert logL <= -10**10
Example #7
0
    def test_with_solver(self):
        kwargs_model = {
            'lens_model_list': ['SPEP'],
            'source_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION']
        }
        i_lens_light, k_ps = 0, 0
        kwargs_constraints = {
            'solver_type': 'PROFILE',
            'num_point_source_list': [4]
        }

        kwargs_lens = [{
            'theta_E': 1,
            'gamma': 2,
            'e1': 0.1,
            'e2': 0.1,
            'center_x': 0,
            'center_y': 0
        }]
        kwargs_source = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 1,
            'center_y': 1
        }]
        kwargs_lens_light = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        lensModel = LensModel(lens_model_list=['SPEP'])
        lensEquationSlover = LensEquationSolver(lensModel=lensModel)
        x_image, y_image = lensEquationSlover.image_position_from_source(
            sourcePos_x=0.0, sourcePos_y=0.01, kwargs_lens=kwargs_lens)
        print(x_image, y_image, 'test')
        kwargs_ps = [{'ra_image': x_image, 'dec_image': y_image}]
        param = Param(kwargs_model=kwargs_model,
                      kwargs_lens_init=kwargs_lens,
                      **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_source=kwargs_source,
                                 kwargs_lens_light=kwargs_lens_light,
                                 kwargs_ps=kwargs_ps)
        #kwargs_lens_out, kwargs_source_out, kwargs_lens_light_out, kwargs_ps_out, _ = param.args2kwargs(args)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        kwargs_ps_out = kwargs_return['kwargs_ps']
        dist = param.check_solver(kwargs_lens=kwargs_lens_out,
                                  kwargs_ps=kwargs_ps_out)
        npt.assert_almost_equal(dist, 0, decimal=10)
Example #8
0
    def test_pixelbased_modelling(self):
        ss_source = 2
        numPix_source = self.numPix*ss_source
        n_scales = 3
        kwargs_pixelbased = {
            'source_interpolation': 'nearest',
            'supersampling_factor_source': ss_source, # supersampling of pixelated source grid

            # following choices are to minimize pixel solver runtime (not to get accurate reconstruction!)
            'threshold_decrease_type': 'none',
            'num_iter_source': 2,
            'num_iter_lens': 2,
            'num_iter_global': 2,
            'num_iter_weights': 2,
        }
        kwargs_likelihood = {
             'image_likelihood': True,
             'kwargs_pixelbased': kwargs_pixelbased,
             'check_positive_flux': True,  # effectively not applied, activated for code coverage purposes
        }
        kernel = PSF(**self.kwargs_psf).kernel_point_source
        kwargs_psf = {'psf_type': 'PIXEL', 'kernel_point_source': kernel}
        kwargs_numerics = {'supersampling_factor': 1}
        kwargs_data = {'multi_band_list': [[self.kwargs_band, kwargs_psf, kwargs_numerics]]}
        kwargs_model = {
            'lens_model_list': ['SPEP'],
            'lens_light_model_list': ['SLIT_STARLETS'],
            'source_light_model_list': ['SLIT_STARLETS'],
        }
        
        kwargs_fixed_source = [{'n_scales': n_scales, 'n_pixels': numPix_source**2, 'scale': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_fixed_lens_light = [{'n_scales': n_scales, 'n_pixels': self.numPix**2, 'scale': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_constraints = {'source_grid_offset': True}
        param_class = Param(kwargs_model, 
                            kwargs_fixed_source=kwargs_fixed_source, 
                            kwargs_fixed_lens_light=kwargs_fixed_lens_light,
                            **kwargs_constraints)

        likelihood = LikelihoodModule(kwargs_data_joint=kwargs_data, kwargs_model=kwargs_model, 
                                      param_class=param_class, **kwargs_likelihood)

        kwargs_source = [{'amp': np.ones(n_scales*numPix_source**2)}]
        kwargs_lens_light = [{'amp': np.ones(n_scales*self.numPix**2)}]
        kwargs_special = {'delta_x_source_grid': 0, 'delta_y_source_grid': 0}
        args = param_class.kwargs2args(kwargs_lens=self.kwargs_lens, kwargs_source=kwargs_source,
                                       kwargs_lens_light=kwargs_lens_light, kwargs_special=kwargs_special)

        logL = likelihood.logL(args, verbose=True)
        num_data_evaluate = likelihood.num_data
        npt.assert_almost_equal(logL/num_data_evaluate, -1/2., decimal=1)
    def test_force_positive_source_surface_brightness(self):
        kwargs_likelihood = {
            'force_positive_source_surface_brightness': True,
            'numPix_source': 10,
            'deltaPix_source': 0.1
        }
        kwargs_model = {'source_light_model_list': ['SERSIC']}

        kwargs_constraints = {}
        param_class = Param(kwargs_model, **kwargs_constraints)

        kwargs_data = sim_util.data_configure_simple(numPix=10,
                                                     deltaPix=0.1,
                                                     exposure_time=1,
                                                     sigma_bkg=0.1)
        data_class = Data(kwargs_data)
        kwargs_psf = {'psf_type': 'NONE'}
        psf_class = PSF(kwargs_psf)
        kwargs_sersic = {
            'amp': -1.,
            'R_sersic': 0.1,
            'n_sersic': 2,
            'center_x': 0,
            'center_y': 0
        }
        source_model_list = ['SERSIC']
        kwargs_source = [kwargs_sersic]
        source_model_class = LightModel(light_model_list=source_model_list)

        imageModel = ImageModel(data_class,
                                psf_class,
                                lens_model_class=None,
                                source_model_class=source_model_class)

        image_sim = sim_util.simulate_simple(imageModel, [], kwargs_source)

        data_class.update_data(image_sim)
        likelihood = LikelihoodModule(imSim_class=imageModel,
                                      param_class=param_class,
                                      **kwargs_likelihood)
        logL, _ = likelihood.logL(args=param_class.kwargs2args(
            kwargs_source=kwargs_source))
        assert logL <= -10**10
Example #10
0
    def test_mass_scaling(self):
        kwargs_model = {'lens_model_list': ['SIS', 'NFW', 'NFW', 'SIS', 'SERSIC', 'HERNQUIST']}
        kwargs_constraints = {'mass_scaling_list': [False, 1, 1, 1, 1, 1]}
        kwargs_fixed_lens = [{}, {'alpha_Rs': 0.1}, {'alpha_Rs': 0.3}, {'theta_E': 0.1},
                             {'k_eff': 0.3}, {'sigma0': 1}]
        kwargs_fixed_cosmo = {}
        param_class = Param(kwargs_model, kwargs_fixed_lens=kwargs_fixed_lens, kwargs_fixed_special=kwargs_fixed_cosmo
                            , **kwargs_constraints)
        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0},
                       {'alpha_Rs': 0.1, 'Rs': 5, 'center_x': 1., 'center_y': 0},
                       {'alpha_Rs': 0.1, 'Rs': 5, 'center_x': 0, 'center_y': 1.},
                       {'theta_E': 0.1, 'center_x': 3, 'center_y': 1.},
                       {'k_eff': 0.3, 'R_sersic': 1, 'n_sersic': 2, 'center_x': 3, 'center_y': 1.},
                       {'sigma0': 1, 'Rs': 1, 'center_x': 3, 'center_y': 1.}]
        kwargs_source = []
        kwargs_lens_light = []
        kwargs_ps = []
        mass_scale = 2
        kwargs_cosmo = {'scale_factor': [mass_scale]}
        args = param_class.kwargs2args(kwargs_lens, kwargs_source, kwargs_lens_light, kwargs_ps, kwargs_special=kwargs_cosmo)
        assert args[-1] == mass_scale


        kwargs_return = param_class.args2kwargs(args)
        kwargs_lens = kwargs_return['kwargs_lens']
        print(kwargs_lens, 'test')
        assert kwargs_lens[0]['theta_E'] == 1
        assert kwargs_lens[1]['alpha_Rs'] == 0.1 * mass_scale
        assert kwargs_lens[2]['alpha_Rs'] == 0.3 * mass_scale
        assert kwargs_lens[3]['theta_E'] == 0.1 * mass_scale
        assert kwargs_lens[4]['k_eff'] == 0.3 * mass_scale
        assert kwargs_lens[5]['sigma0'] == 1 * mass_scale

        kwargs_return = param_class.args2kwargs(args, bijective=True)
        kwargs_lens = kwargs_return['kwargs_lens']
        assert kwargs_lens[0]['theta_E'] == 1
        assert kwargs_lens[1]['alpha_Rs'] == 0.1
        assert kwargs_lens[2]['alpha_Rs'] == 0.3
    def test_joint_lens_light_with_point_source(self):
        kwargs_model = {
            'lens_model_list': ['SIS'],
            'source_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION'],
            'lens_light_model_list': ['SERSIC']
        }
        i_lens_light, k_ps = 0, 0
        kwargs_constraints = {
            'joint_lens_light_with_point_source': [[k_ps, i_lens_light]]
        }  # list[[i_point_source, k_source, ['param_name1', 'param_name2', ...]], [

        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_source = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 1,
            'center_y': 1
        }]
        kwargs_lens_light = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        kwargs_ps = [{'ra_image': [0.5], 'dec_image': [0.5]}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_source=kwargs_source,
                                 kwargs_lens_light=kwargs_lens_light,
                                 kwargs_ps=kwargs_ps)
        kwargs_lens_out, kwargs_source_out, kwargs_lens_light_out, kwargs_ps_out, _ = param.args2kwargs(
            args)
        assert kwargs_lens_light_out[0]['center_x'] == kwargs_ps_out[0][
            'ra_image']
Example #12
0
    def test_general_scaling(self):
        kwargs_model = {
            'lens_model_list': ['PJAFFE', 'PJAFFE', 'NFW', 'PJAFFE', 'NFW']
        }
        # Scale Rs for two of the PJAFFEs, and sigma0 for a different set of PJAFFEs
        # Scale alpha_Rs for the NFWs
        kwargs_constraints = {
            'general_scaling': {
                'Rs': [1, False, False, 1, False],
                'sigma0': [False, 1, False, 1, False],
                'alpha_Rs': [False, False, 1, False, 1],
            }
        }
        # PJAFFE: sigma0, Ra, Rs, center_x, center_y
        # NFW: Rs, alpha_Rs, center_x, center_y
        kwargs_fixed_lens = [
            {
                'Rs': 2.0,
                'center_x': 1.0
            },
            {
                'sigma0': 2.0,
                'Ra': 2.0,
                'Rs': 3.0,
                'center_y': 1.5
            },
            {
                'alpha_Rs': 0.1
            },
            {
                'Ra': 0.1,
                'center_x': 0,
                'center_y': 0
            },
            {
                'Rs': 3,
                'center_x': -1,
                'center_y': 3
            },
        ]
        kwargs_fixed_cosmo = {}
        param_class = Param(kwargs_model,
                            kwargs_fixed_lens=kwargs_fixed_lens,
                            kwargs_fixed_special=kwargs_fixed_cosmo,
                            **kwargs_constraints)
        kwargs_lens = [{
            'sigma0': 3,
            'Ra': 2,
            'center_y': 5
        }, {
            'center_x': 1.
        }, {
            'Rs': 3,
            'center_x': 0.0,
            'center_y': -1.0
        }, {
            'sigma0': 3,
            'Rs': 1.5
        }, {
            'alpha_Rs': 4
        }]
        kwargs_source = []
        kwargs_lens_light = []
        kwargs_ps = []
        # Define the scaling and power for each parameter
        kwargs_cosmo = {
            'Rs_scale_factor': [2.0],
            'Rs_scale_pow': [1.1],
            'sigma0_scale_factor': [3],
            'sigma0_scale_pow': [2.0],
            'alpha_Rs_scale_factor': [0.3],
            'alpha_Rs_scale_pow': [0.5],
        }
        args = param_class.kwargs2args(kwargs_lens,
                                       kwargs_source,
                                       kwargs_lens_light,
                                       kwargs_ps,
                                       kwargs_special=kwargs_cosmo)
        num, names = param_class.num_param()
        print(names)
        print(args)

        kwargs_return = param_class.args2kwargs(args)
        kwargs_lens = kwargs_return['kwargs_lens']
        print('kwargs_lens:', kwargs_lens)
        npt.assert_almost_equal(kwargs_lens[0]['Rs'], 2.0 * 2.0**1.1)
        npt.assert_almost_equal(kwargs_lens[0]['sigma0'], 3)
        npt.assert_almost_equal(kwargs_lens[1]['Rs'], 3.0)
        npt.assert_almost_equal(kwargs_lens[1]['sigma0'], 3.0 * 2.0**2.0)
        npt.assert_almost_equal(kwargs_lens[2]['alpha_Rs'], 0.3 * 0.1**0.5)
        npt.assert_almost_equal(kwargs_lens[3]['Rs'], 2.0 * 1.5**1.1)
        npt.assert_almost_equal(kwargs_lens[3]['sigma0'], 3.0 * 3**2.0)
        npt.assert_almost_equal(kwargs_lens[4]['alpha_Rs'], 0.3 * 4**0.5)

        kwargs_return = param_class.args2kwargs(args, bijective=True)
        kwargs_lens = kwargs_return['kwargs_lens']
        npt.assert_almost_equal(kwargs_lens[0]['Rs'], 2.0)
        npt.assert_almost_equal(kwargs_lens[1]['sigma0'], 2.0)
        npt.assert_almost_equal(kwargs_lens[2]['alpha_Rs'], 0.1)
        npt.assert_almost_equal(kwargs_lens[3]['Rs'], 1.5)
        npt.assert_almost_equal(kwargs_lens[3]['sigma0'], 3)
        npt.assert_almost_equal(kwargs_lens[4]['alpha_Rs'], 4)
Example #13
0
class TestFittingSequence(object):
    """
    test the fitting sequences
    """
    def setup(self):

        # 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 = sim_util.data_configure_simple(numPix, deltaPix,
                                                     exp_time, sigma_bkg)
        data_class = ImageData(**kwargs_data)
        kwargs_psf_gaussian = {
            'psf_type': 'GAUSSIAN',
            'fwhm': fwhm,
            'pixel_size': deltaPix
        }
        psf = PSF(**kwargs_psf_gaussian)
        kwargs_psf = {
            'psf_type': 'PIXEL',
            'kernel_point_source': 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 = {
            'supersampling_factor': 1,
            'supersampling_convolution': False,
            'compute_mode': 'regular'
        }
        imageModel = ImageModel(data_class,
                                psf_class,
                                lens_model_class,
                                source_model_class,
                                lens_light_model_class,
                                kwargs_numerics=kwargs_numerics)
        image_sim = sim_util.simulate_simple(imageModel, self.kwargs_lens,
                                             self.kwargs_source,
                                             self.kwargs_lens_light)

        data_class.update_data(image_sim)
        kwargs_data['image_data'] = image_sim
        kwargs_data_joint = {
            'multi_band_list': [[kwargs_data, kwargs_psf, kwargs_numerics]],
            'multi_band_type': 'single-band'
        }
        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}

        kwargs_constraints = {
            'image_plane_source_list': [False] * len(source_model_list)
        }

        kwargs_likelihood = {
            'source_marg': True,
            'position_uncertainty': 0.004,
            'check_solver': False,
            'solver_tolerance': 0.001,
        }
        self.param_class = Param(kwargs_model, **kwargs_constraints)
        self.Likelihood = LikelihoodModule(kwargs_data_joint=kwargs_data_joint,
                                           kwargs_model=kwargs_model,
                                           param_class=self.param_class,
                                           **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.kwargs2args(
            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, dist = self.sampler.mcmc_emcee(n_walkers,
                                                n_run,
                                                n_burn,
                                                mean_start,
                                                sigma_start,
                                                mpi=False)
        assert len(samples) == n_walkers * n_run
Example #14
0
class TestParam(object):
    def setup(self):
        kwargs_model = {
            'lens_model_list': ['SPEP'],
            'source_light_model_list': ['GAUSSIAN'],
            'lens_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION'],
            'multi_plane': True,
            'lens_redshift_list': [0.5],
            'z_source': 2,
            'source_redshift_list': [0.5]
        }
        kwargs_param = {
            'num_point_source_list': [2],
            'lens_redshift_sampling_indexes': [0],
            'source_redshift_sampling_indexes': [0],
            'image_plane_source_list': [True]
        }
        kwargs_fixed_lens = [{'gamma': 1.9}]  # for SPEP lens
        kwargs_fixed_source = [{
            'sigma': 0.1,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        kwargs_fixed_ps = [{'ra_image': [-1, 1], 'dec_image': [-1, 1]}]
        kwargs_fixed_lens_light = [{}]
        kwargs_fixed_cosmo = [{}]
        self.param_class = Param(
            kwargs_model,
            kwargs_fixed_lens=kwargs_fixed_lens,
            kwargs_fixed_source=kwargs_fixed_source,
            kwargs_fixed_lens_light=kwargs_fixed_lens_light,
            kwargs_fixed_ps=kwargs_fixed_ps,
            kwargs_fixed_special=kwargs_fixed_cosmo,
            **kwargs_param)
        self.param_class.print_setting()

    def test_num_param(self):
        num_param, list = self.param_class.num_param()
        assert list[0] == 'theta_E_lens0'
        assert num_param == 10

        kwargs_model = {
            'lens_model_list': ['SPEP'],
            'source_light_model_list': ['GAUSSIAN'],
            'lens_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION']
        }
        kwargs_param = {}
        kwargs_fixed_lens = [{'gamma': 1.9}]  # for SPEP lens
        kwargs_fixed_source = [{
            'sigma': 0.1,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        kwargs_fixed_ps = [{'ra_image': [-1, 1], 'dec_image': [-1, 1]}]
        kwargs_fixed_lens_light = [{}]
        kwargs_fixed_cosmo = [{}]
        param_class_linear = Param(kwargs_model,
                                   kwargs_fixed_lens,
                                   kwargs_fixed_source,
                                   kwargs_fixed_lens_light,
                                   kwargs_fixed_ps,
                                   kwargs_fixed_cosmo,
                                   linear_solver=True,
                                   **kwargs_param)
        num_param, list = param_class_linear.num_param()
        assert list[0] == 'theta_E_lens0'
        print(list)
        assert len(list) == num_param
        assert num_param == 9

    def test_num_param_linear(self):
        num_param = self.param_class.num_param_linear()
        assert num_param == 4

    def test_get_params(self):
        kwargs_true_lens = [{
            'theta_E': 1.,
            'gamma': 1.9,
            'e1': 0.01,
            'e2': -0.01,
            'center_x': 0.,
            'center_y': 0.
        }]  #for SPEP lens
        kwargs_true_source = [{
            'amp': 1 * 2 * np.pi * 0.1**2,
            'center_x': 0.2,
            'center_y': 0.2,
            'sigma': 0.1
        }]
        kwargs_true_lens_light = [{
            'center_x': -0.06,
            'center_y': 0.4,
            'phi_G': 4.8,
            'q': 0.86,
            'n_sersic': 1.7,
            'amp': 11.8,
            'R_sersic': 0.697,
            'phi_G_2': 0
        }]
        kwargs_true_ps = [{
            'point_amp': [1, 1],
            'ra_image': [-1, 1],
            'dec_image': [-1, 1]
        }]
        kwargs_special = {'z_sampling': [0.5]}
        args = self.param_class.kwargs2args(
            kwargs_true_lens,
            kwargs_true_source,
            kwargs_lens_light=kwargs_true_lens_light,
            kwargs_ps=kwargs_true_ps,
            kwargs_special=kwargs_special)
        kwargs_return = self.param_class.args2kwargs(args)
        lens_dict_list = kwargs_return['kwargs_lens']
        lens_light_dict_list = kwargs_return['kwargs_lens_light']
        lens_dict = lens_dict_list[0]
        assert lens_dict['theta_E'] == 1.
        assert lens_dict['gamma'] == 1.9
        assert lens_dict['e1'] == 0.01
        assert lens_dict['e2'] == -0.01
        assert lens_dict['center_x'] == 0.
        assert lens_dict['center_y'] == 0.
        assert lens_light_dict_list[0]['center_x'] == -0.06

    def test_get_cosmo(self):
        kwargs_model = {
            'lens_model_list': ['SPEP'],
            'source_light_model_list': ['GAUSSIAN'],
            'lens_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION'],
        }
        kwargs_param = {'Ddt_sampling': True}
        kwargs_fixed_lens = [{'gamma': 1.9}]  # for SPEP lens
        kwargs_fixed_source = [{
            'sigma': 0.1,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        kwargs_fixed_ps = [{'ra_image': [-1, 1], 'dec_image': [-1, 1]}]
        kwargs_fixed_lens_light = [{}]
        kwargs_fixed_cosmo = {'D_dt': 1000}
        param_class = Param(kwargs_model,
                            kwargs_fixed_lens=kwargs_fixed_lens,
                            kwargs_fixed_source=kwargs_fixed_source,
                            kwargs_fixed_lens_light=kwargs_fixed_lens_light,
                            kwargs_fixed_ps=kwargs_fixed_ps,
                            kwargs_fixed_special=kwargs_fixed_cosmo,
                            **kwargs_param)

        kwargs_true_lens = [{
            'theta_E': 1.,
            'gamma': 1.9,
            'e1': 0.01,
            'e2': -0.01,
            'center_x': 0.,
            'center_y': 0.
        }]  # for SPEP lens
        kwargs_true_source = [{
            'amp': 1 * 2 * np.pi * 0.1**2,
            'center_x': 0.2,
            'center_y': 0.2,
            'sigma': 0.1
        }]
        kwargs_true_lens_light = [{
            'center_x': -0.06,
            'center_y': 0.4,
            'phi_G': 4.8,
            'q': 0.86,
            'n_sersic': 1.7,
            'amp': 11.8,
            'R_sersic': 0.697,
            'phi_G_2': 0
        }]
        kwargs_true_ps = [{
            'point_amp': [1, 1],
            'ra_image': [-1, 1],
            'dec_image': [-1, 1]
        }]
        args = param_class.kwargs2args(
            kwargs_true_lens,
            kwargs_true_source,
            kwargs_lens_light=kwargs_true_lens_light,
            kwargs_ps=kwargs_true_ps,
            kwargs_special={'D_dt': 1000})
        assert param_class.specialParams._D_dt_sampling is True

    def test_mass_scaling(self):
        kwargs_model = {
            'lens_model_list':
            ['SIS', 'NFW', 'NFW', 'SIS', 'SERSIC', 'HERNQUIST']
        }
        kwargs_constraints = {'mass_scaling_list': [False, 1, 1, 1, 1, 1]}
        kwargs_fixed_lens = [{}, {
            'alpha_Rs': 0.1
        }, {
            'alpha_Rs': 0.3
        }, {
            'theta_E': 0.1
        }, {
            'k_eff': 0.3
        }, {
            'sigma0': 1
        }]
        kwargs_fixed_cosmo = {}
        param_class = Param(kwargs_model,
                            kwargs_fixed_lens=kwargs_fixed_lens,
                            kwargs_fixed_special=kwargs_fixed_cosmo,
                            **kwargs_constraints)
        kwargs_lens = [{
            'theta_E': 1,
            'center_x': 0,
            'center_y': 0
        }, {
            'alpha_Rs': 0.1,
            'Rs': 5,
            'center_x': 1.,
            'center_y': 0
        }, {
            'alpha_Rs': 0.1,
            'Rs': 5,
            'center_x': 0,
            'center_y': 1.
        }, {
            'theta_E': 0.1,
            'center_x': 3,
            'center_y': 1.
        }, {
            'k_eff': 0.3,
            'R_sersic': 1,
            'n_sersic': 2,
            'center_x': 3,
            'center_y': 1.
        }, {
            'sigma0': 1,
            'Rs': 1,
            'center_x': 3,
            'center_y': 1.
        }]
        kwargs_source = []
        kwargs_lens_light = []
        kwargs_ps = []
        mass_scale = 2
        kwargs_cosmo = {'scale_factor': [mass_scale]}
        args = param_class.kwargs2args(kwargs_lens,
                                       kwargs_source,
                                       kwargs_lens_light,
                                       kwargs_ps,
                                       kwargs_special=kwargs_cosmo)
        assert args[-1] == mass_scale

        kwargs_return = param_class.args2kwargs(args)
        kwargs_lens = kwargs_return['kwargs_lens']
        print(kwargs_lens, 'test')
        assert kwargs_lens[0]['theta_E'] == 1
        assert kwargs_lens[1]['alpha_Rs'] == 0.1 * mass_scale
        assert kwargs_lens[2]['alpha_Rs'] == 0.3 * mass_scale
        assert kwargs_lens[3]['theta_E'] == 0.1 * mass_scale
        assert kwargs_lens[4]['k_eff'] == 0.3 * mass_scale
        assert kwargs_lens[5]['sigma0'] == 1 * mass_scale

        kwargs_return = param_class.args2kwargs(args, bijective=True)
        kwargs_lens = kwargs_return['kwargs_lens']
        assert kwargs_lens[0]['theta_E'] == 1
        assert kwargs_lens[1]['alpha_Rs'] == 0.1
        assert kwargs_lens[2]['alpha_Rs'] == 0.3

    def test_joint_lens_with_light(self):
        kwargs_model = {
            'lens_model_list': ['CHAMELEON'],
            'lens_light_model_list': ['CHAMELEON']
        }
        i_light, k_lens = 0, 0
        kwargs_constraints = {
            'joint_lens_with_light': [[
                i_light, k_lens,
                ['w_t', 'w_c', 'center_x', 'center_y', 'e1', 'e2']
            ]]
        }
        kwargs_lens = [{'alpha_1': 10}]
        kwargs_lens_light = [{
            'amp': 1,
            'w_t': 0.5,
            'w_c': 0.1,
            'center_x': 0,
            'center_y': 0.3,
            'e1': 0.1,
            'e2': -0.2
        }]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_lens_light=kwargs_lens_light)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        kwargs_lens_light_out = kwargs_return['kwargs_lens_light']
        assert kwargs_lens_out[0]['w_c'] == kwargs_lens_light[0]['w_c']
        assert kwargs_lens_light_out[0]['w_c'] == kwargs_lens_light[0]['w_c']

        kwargs_model = {
            'lens_model_list': ['SIS'],
            'lens_light_model_list': ['SERSIC']
        }
        i_light, k_lens = 0, 0
        kwargs_constraints = {
            'joint_lens_with_light':
            [[i_light, k_lens, ['center_x', 'center_y']]]
        }  # list[[i_point_source, k_source, ['param_name1', 'param_name2', ...]], [
        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_lens_light = [{
            'amp': 1,
            'R_sersic': 0.5,
            'n_sersic': 2,
            'center_x': 1,
            'center_y': 1
        }]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_lens_light=kwargs_lens_light)
        #kwargs_lens_out, kwargs_source_out, _, kwargs_ps_out, _ = param.args2kwargs(args)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']

        assert kwargs_lens_out[0]['theta_E'] == kwargs_lens[0]['theta_E']
        assert kwargs_lens_out[0]['center_x'] == kwargs_lens_light[0][
            'center_x']

    def test_joint_lens_with_light_dict(self):
        kwargs_model = {
            'lens_model_list': ['SHEAR'],
            'lens_light_model_list': ['SERSIC']
        }
        i_light, k_lens = 0, 0
        kwargs_constraints = {
            'joint_lens_with_light':
            [[i_light, k_lens, {
                'ra_0': 'center_x',
                'dec_0': 'center_y'
            }]]
        }
        kwargs_lens = [{'gamma1': 0.05, 'gamma2': 0.06}]
        kwargs_lens_light = [{
            'amp': 1,
            'R_sersic': 1,
            'n_sersic': 4,
            'center_x': 0.1,
            'center_y': 0.3
        }]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_lens_light=kwargs_lens_light)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        kwargs_lens_light_out = kwargs_return['kwargs_lens_light']
        assert kwargs_lens_out[0]['gamma1'] == kwargs_lens[0]['gamma1']
        assert kwargs_lens_out[0]['ra_0'] == kwargs_lens_light[0]['center_x']
        assert kwargs_lens_out[0]['dec_0'] == kwargs_lens_light[0]['center_y']

    def test_joint_source_with_point_source(self):
        kwargs_model = {
            'lens_model_list': ['SIS'],
            'source_light_model_list': ['SERSIC'],
            'point_source_model_list': ['SOURCE_POSITION']
        }
        i_source, k_ps = 0, 0
        kwargs_constraints = {
            'joint_source_with_point_source': [[k_ps, i_source]]
        }  # list[[i_point_source, k_source, ['param_name1', 'param_name2', ...]], [

        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_source = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 1,
            'center_y': 1
        }]
        kwargs_ps = [{'ra_source': 0.5, 'dec_source': 0.5}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_source=kwargs_source,
                                 kwargs_ps=kwargs_ps)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        kwargs_source_out = kwargs_return['kwargs_source']
        #kwargs_lens_out, kwargs_source_out, _, kwargs_ps_out, _ = param.args2kwargs(args)
        assert kwargs_lens_out[0]['theta_E'] == kwargs_lens[0]['theta_E']
        assert kwargs_source_out[0]['center_x'] == kwargs_ps[0]['ra_source']

        kwargs_model = {
            'lens_model_list': ['SIS'],
            'source_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION']
        }
        i_source, k_ps = 0, 0
        kwargs_constraints = {
            'joint_source_with_point_source': [[k_ps, i_source]]
        }  # list[[i_point_source, k_source, ['param_name1', 'param_name2', ...]], [

        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_source = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 1,
            'center_y': 1
        }]
        kwargs_ps = [{'ra_image': [0.5], 'dec_image': [0.5]}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_source=kwargs_source,
                                 kwargs_ps=kwargs_ps)
        #kwargs_lens_out, kwargs_source_out, _, kwargs_ps_out, _ = param.args2kwargs(args)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        kwargs_source_out = kwargs_return['kwargs_source']
        assert kwargs_lens_out[0]['theta_E'] == kwargs_lens[0]['theta_E']
        npt.assert_almost_equal(kwargs_source_out[0]['center_x'],
                                -0.207,
                                decimal=2)

    def test_joint_lens_light_with_point_source(self):
        kwargs_model = {
            'lens_model_list': ['SIS'],
            'source_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION'],
            'lens_light_model_list': ['SERSIC']
        }
        i_lens_light, k_ps = 0, 0
        kwargs_constraints = {
            'joint_lens_light_with_point_source': [[k_ps, i_lens_light]]
        }  # list[[i_point_source, k_source, ['param_name1', 'param_name2', ...]], [

        kwargs_lens = [{'theta_E': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_source = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 1,
            'center_y': 1
        }]
        kwargs_lens_light = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        kwargs_ps = [{'ra_image': [0.5], 'dec_image': [0.5]}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_source=kwargs_source,
                                 kwargs_lens_light=kwargs_lens_light,
                                 kwargs_ps=kwargs_ps)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_light_out = kwargs_return['kwargs_lens_light']
        kwargs_ps_out = kwargs_return['kwargs_ps']
        assert kwargs_lens_light_out[0]['center_x'] == kwargs_ps_out[0][
            'ra_image']

    def test_logsampling(self):
        kwargs_model = {
            'lens_model_list': ['SIS'],
            'source_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION'],
            'lens_light_model_list': ['SERSIC']
        }
        kwargs_constraints = {'log_sampling_lens': [[0, ['theta_E']]]}

        kwargs_lens = [{'theta_E': 0.1, 'center_x': 0, 'center_y': 0}]
        kwargs_source = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 1,
            'center_y': 1
        }]
        kwargs_lens_light = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        kwargs_ps = [{'ra_image': [0.5], 'dec_image': [0.5]}]
        param = Param(kwargs_model=kwargs_model, **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_source=kwargs_source,
                                 kwargs_lens_light=kwargs_lens_light,
                                 kwargs_ps=kwargs_ps)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        assert args[0] == -1
        assert kwargs_lens_out[0]['theta_E'] == 0.1

    def test_with_solver(self):
        kwargs_model = {
            'lens_model_list': ['SPEP'],
            'source_light_model_list': ['SERSIC'],
            'point_source_model_list': ['LENSED_POSITION']
        }
        i_lens_light, k_ps = 0, 0
        kwargs_constraints = {
            'solver_type': 'PROFILE',
            'num_point_source_list': [4]
        }

        kwargs_lens = [{
            'theta_E': 1,
            'gamma': 2,
            'e1': 0.1,
            'e2': 0.1,
            'center_x': 0,
            'center_y': 0
        }]
        kwargs_source = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 1,
            'center_y': 1
        }]
        kwargs_lens_light = [{
            'amp': 1,
            'n_sersic': 2,
            'R_sersic': 0.3,
            'center_x': 0.2,
            'center_y': 0.2
        }]
        lensModel = LensModel(lens_model_list=['SPEP'])
        lensEquationSlover = LensEquationSolver(lensModel=lensModel)
        x_image, y_image = lensEquationSlover.image_position_from_source(
            sourcePos_x=0.0, sourcePos_y=0.01, kwargs_lens=kwargs_lens)
        print(x_image, y_image, 'test')
        kwargs_ps = [{'ra_image': x_image, 'dec_image': y_image}]
        param = Param(kwargs_model=kwargs_model,
                      kwargs_lens_init=kwargs_lens,
                      **kwargs_constraints)
        args = param.kwargs2args(kwargs_lens=kwargs_lens,
                                 kwargs_source=kwargs_source,
                                 kwargs_lens_light=kwargs_lens_light,
                                 kwargs_ps=kwargs_ps)
        #kwargs_lens_out, kwargs_source_out, kwargs_lens_light_out, kwargs_ps_out, _ = param.args2kwargs(args)
        kwargs_return = param.args2kwargs(args)
        kwargs_lens_out = kwargs_return['kwargs_lens']
        kwargs_ps_out = kwargs_return['kwargs_ps']
        dist = param.check_solver(kwargs_lens=kwargs_lens_out,
                                  kwargs_ps=kwargs_ps_out)
        npt.assert_almost_equal(dist, 0, decimal=10)

    def test_num_point_source_images(self):
        num = self.param_class.num_point_source_images
        assert num == 2

    def test_shapelet_lens(self):
        kwargs_model = {
            'lens_model_list': ['SHAPELETS_CART'],
            'source_light_model_list': [],
            'lens_light_model_list': [],
            'point_source_model_list': []
        }
        kwargs_param = {'num_shapelet_lens': 6}
        kwargs_fixed_lens = [{'beta': 1}]  # for SPEP lens
        kwargs_fixed_source = [{}]
        kwargs_fixed_ps = [{}]
        kwargs_fixed_lens_light = [{}]
        kwargs_fixed_cosmo = [{}]
        self.param_class = Param(
            kwargs_model,
            kwargs_fixed_lens=kwargs_fixed_lens,
            kwargs_fixed_source=kwargs_fixed_source,
            kwargs_fixed_lens_light=kwargs_fixed_lens_light,
            kwargs_fixed_ps=kwargs_fixed_ps,
            kwargs_fixed_special=kwargs_fixed_cosmo,
            **kwargs_param)
        self.param_class.print_setting()
Example #15
0
class TestLikelihoodModule(object):
    """
    test the fitting sequences
    """
    def setup(self):
        np.random.seed(42)

        # 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

        kwargs_model = {
            'lens_model_list': ['SPEP'],
            'lens_light_model_list': ['SERSIC'],
            'source_light_model_list': ['SERSIC_ELLIPSE'],
            'point_source_model_list': ['SOURCE_POSITION'],
            'fixed_magnification_list': [True]
        }

        # PSF specification
        kwargs_band = sim_util.data_configure_simple(numPix, deltaPix,
                                                     exp_time, sigma_bkg)
        data_class = ImageData(**kwargs_band)
        kwargs_psf = {
            'psf_type': 'GAUSSIAN',
            'fwhm': fwhm,
            'pixel_size': deltaPix
        }
        psf_class = PSF(**kwargs_psf)
        print(np.shape(psf_class.kernel_point_source), 'test kernel shape -')
        kwargs_spemd = {
            'theta_E': 1.,
            'gamma': 1.95,
            'center_x': 0,
            'center_y': 0,
            'e1': 0.1,
            'e2': 0.1
        }

        self.kwargs_lens = [kwargs_spemd]
        kwargs_sersic = {
            'amp': 1 / 0.05**2.,
            '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
        }

        self.kwargs_lens_light = [kwargs_sersic]
        self.kwargs_source = [kwargs_sersic_ellipse]
        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}
        kwargs_numerics = {
            'supersampling_factor': 1,
            'supersampling_convolution': False,
            'compute_mode': 'gaussian'
        }
        lens_model_class, source_model_class, lens_light_model_class, point_source_class, extinction_class = class_creator.create_class_instances(
            **kwargs_model)
        imageModel = ImageModel(data_class,
                                psf_class,
                                lens_model_class,
                                source_model_class,
                                lens_light_model_class,
                                point_source_class,
                                extinction_class,
                                kwargs_numerics=kwargs_numerics)
        image_sim = sim_util.simulate_simple(imageModel, self.kwargs_lens,
                                             self.kwargs_source,
                                             self.kwargs_lens_light,
                                             self.kwargs_ps)
        ra_pos, dec_pos = imageModel.PointSource.image_position(
            kwargs_ps=self.kwargs_ps, kwargs_lens=self.kwargs_lens)

        data_class.update_data(image_sim)
        kwargs_band['image_data'] = image_sim
        self.data_class = data_class
        self.psf_class = psf_class

        self.kwargs_model = kwargs_model
        self.kwargs_numerics = {
            'supersampling_factor': 1,
            'supersampling_convolution': False
        }

        kwargs_constraints = {
            'num_point_source_list': [4],
            'solver_type':
            'NONE',  # 'PROFILE', 'PROFILE_SHEAR', 'ELLIPSE', 'CENTER'
            'Ddt_sampling': True
        }

        def condition_definition(kwargs_lens,
                                 kwargs_source,
                                 kwargs_lens_light,
                                 kwargs_ps=None,
                                 kwargs_special=None,
                                 kwargs_extinction=None):
            logL = 0
            if kwargs_lens_light[0]['R_sersic'] > kwargs_source[0]['R_sersic']:
                logL -= 10**15
            return logL

        kwargs_likelihood = {
            'force_no_add_image': True,
            'source_marg': True,
            'astrometric_likelihood': True,
            'image_position_uncertainty': 0.004,
            'check_matched_source_position': False,
            'source_position_tolerance': 0.001,
            'source_position_sigma': 0.001,
            'check_positive_flux': True,
            'flux_ratio_likelihood': True,
            'prior_lens': [[0, 'theta_E', 1, 0.1]],
            'custom_logL_addition': condition_definition,
            'image_position_likelihood': True
        }
        self.kwargs_data = {
            'multi_band_list': [[kwargs_band, kwargs_psf, kwargs_numerics]],
            'multi_band_type': 'single-band',
            'time_delays_measured': np.ones(4),
            'time_delays_uncertainties': np.ones(4),
            'flux_ratios': np.ones(4),
            'flux_ratio_errors': np.ones(4),
            'ra_image_list': ra_pos,
            'dec_image_list': dec_pos
        }
        self.param_class = Param(self.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(kwargs_data_joint=self.kwargs_data,
                                           kwargs_model=kwargs_model,
                                           param_class=self.param_class,
                                           **kwargs_likelihood)

    def test_logL(self):
        args = self.param_class.kwargs2args(
            kwargs_lens=self.kwargs_lens,
            kwargs_source=self.kwargs_source,
            kwargs_lens_light=self.kwargs_lens_light,
            kwargs_ps=self.kwargs_ps,
            kwargs_special=self.kwargs_cosmo)

        logL = self.Likelihood.logL(args, verbose=True)
        num_data_evaluate = self.Likelihood.num_data
        npt.assert_almost_equal(logL / num_data_evaluate, -1 / 2., decimal=1)

    def test_time_delay_likelihood(self):
        kwargs_likelihood = {
            'time_delay_likelihood': True,
        }
        likelihood = LikelihoodModule(kwargs_data_joint=self.kwargs_data,
                                      kwargs_model=self.kwargs_model,
                                      param_class=self.param_class,
                                      **kwargs_likelihood)
        args = self.param_class.kwargs2args(
            kwargs_lens=self.kwargs_lens,
            kwargs_source=self.kwargs_source,
            kwargs_lens_light=self.kwargs_lens_light,
            kwargs_ps=self.kwargs_ps,
            kwargs_special=self.kwargs_cosmo)

        logL = likelihood.logL(args, verbose=True)
        npt.assert_almost_equal(logL, -3080.29, 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,
    #                         'astrometric_likelihood': True,
    #                         'position_uncertainty': 0.004,
    #                         'check_solver': True,
    #                         'solver_tolerance': 0.001,
    #                         'check_positive_flux': True,
    #                         'solver': True
    #                         }

    #imageModel = ImageModel(self.data_class, self.psf_class, self.lens_model_class, self.source_model_class,
    #                        self.lens_light_model_class,
    #                        point_source_class, kwargs_numerics=kwargs_numerics)

    def test_force_positive_source_surface_brightness(self):
        kwargs_likelihood = {'force_minimum_source_surface_brightness': True}
        kwargs_model = {'source_light_model_list': ['SERSIC']}

        kwargs_constraints = {}
        param_class = Param(kwargs_model, **kwargs_constraints)

        kwargs_data = sim_util.data_configure_simple(numPix=10,
                                                     deltaPix=0.1,
                                                     exposure_time=1,
                                                     background_rms=0.1)
        data_class = ImageData(**kwargs_data)
        kwargs_psf = {'psf_type': 'NONE'}
        psf_class = PSF(**kwargs_psf)
        kwargs_sersic = {
            'amp': -1.,
            'R_sersic': 0.1,
            'n_sersic': 2,
            'center_x': 0,
            'center_y': 0
        }
        source_model_list = ['SERSIC']
        kwargs_source = [kwargs_sersic]
        source_model_class = LightModel(light_model_list=source_model_list)

        imageModel = ImageModel(data_class,
                                psf_class,
                                lens_model_class=None,
                                source_model_class=source_model_class)

        image_sim = sim_util.simulate_simple(imageModel, [], kwargs_source)

        kwargs_data['image_data'] = image_sim
        kwargs_data_joint = {
            'multi_band_list': [[kwargs_data, kwargs_psf, {}]],
            'multi_band_type': 'single-band'
        }
        likelihood = LikelihoodModule(kwargs_data_joint=kwargs_data_joint,
                                      kwargs_model=kwargs_model,
                                      param_class=param_class,
                                      **kwargs_likelihood)

        logL = likelihood.logL(
            args=param_class.kwargs2args(kwargs_source=kwargs_source),
            verbose=True)
        assert logL <= -10**10
Example #16
0
class TestLikelihoodModule(object):
    """
    test the fitting sequences
    """

    def setup(self):
        np.random.seed(42)

        # 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

        kwargs_model = {'lens_model_list': ['SPEP'],
                        'lens_light_model_list': ['SERSIC'],
                        'source_light_model_list': ['SERSIC'],
                        'point_source_model_list': ['SOURCE_POSITION'],
                        'fixed_magnification_list': [True]}

        # PSF specification
        kwargs_band = sim_util.data_configure_simple(numPix, deltaPix, exp_time, sigma_bkg)
        data_class = ImageData(**kwargs_band)
        kwargs_psf = {'psf_type': 'GAUSSIAN', 'fwhm': fwhm, 'pixel_size': deltaPix}
        psf_class = PSF(**kwargs_psf)
        print(np.shape(psf_class.kernel_point_source), 'test kernel shape -')
        kwargs_spep = {'theta_E': 1., 'gamma': 1.95, 'center_x': 0, 'center_y': 0, 'e1': 0.1, 'e2': 0.1}

        self.kwargs_lens = [kwargs_spep]
        kwargs_sersic = {'amp': 1/0.05**2., '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}

        self.kwargs_lens_light = [kwargs_sersic]
        self.kwargs_source = [kwargs_sersic_ellipse]
        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}
        kwargs_numerics = {'supersampling_factor': 1, 'supersampling_convolution': False}
        lens_model_class, source_model_class, lens_light_model_class, point_source_class, extinction_class = class_creator.create_class_instances(**kwargs_model)
        imageModel = ImageModel(data_class, psf_class, lens_model_class, source_model_class,
                                lens_light_model_class, point_source_class, extinction_class, kwargs_numerics=kwargs_numerics)
        image_sim = sim_util.simulate_simple(imageModel, self.kwargs_lens, self.kwargs_source,
                                         self.kwargs_lens_light, self.kwargs_ps)
        ra_pos, dec_pos = imageModel.PointSource.image_position(kwargs_ps=self.kwargs_ps, kwargs_lens=self.kwargs_lens)

        data_class.update_data(image_sim)
        kwargs_band['image_data'] = image_sim
        self.data_class = data_class
        self.psf_class = psf_class

        self.kwargs_model = kwargs_model
        self.kwargs_numerics = {
            'supersampling_factor': 1,
            'supersampling_convolution': False}

        kwargs_constraints = {
                                   'num_point_source_list': [4],
                                   'solver_type': 'NONE',  # 'PROFILE', 'PROFILE_SHEAR', 'ELLIPSE', 'CENTER'
                                   'Ddt_sampling': True
                                   }

        def condition_definition(kwargs_lens, kwargs_source, kwargs_lens_light, kwargs_ps=None, kwargs_special=None, kwargs_extinction=None):
            logL = 0
            if kwargs_lens_light[0]['R_sersic'] > kwargs_source[0]['R_sersic']:
                logL -= 10**15
            return logL

        kwargs_likelihood = {'force_no_add_image': True,
                             'source_marg': True,
                             'astrometric_likelihood': True,
                             'image_position_uncertainty': 0.004,
                             'check_matched_source_position': False,
                             'source_position_tolerance': 0.001,
                             'source_position_sigma': 0.001,
                             'check_positive_flux': True,
                             'flux_ratio_likelihood': True,
                             'prior_lens': [[0, 'theta_E', 1, 0.1]],
                             'custom_logL_addition': condition_definition,
                             'image_position_likelihood': True
                             }
        self.kwargs_data = {'multi_band_list': [[kwargs_band, kwargs_psf, kwargs_numerics]], 'multi_band_type': 'single-band',
                            'time_delays_measured': np.ones(4),
                            'time_delays_uncertainties': np.ones(4),
                            'flux_ratios': np.ones(4),
                            'flux_ratio_errors': np.ones(4),
                            'ra_image_list': ra_pos,
                            'dec_image_list': dec_pos
                            }
        self.param_class = Param(self.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(kwargs_data_joint=self.kwargs_data, kwargs_model=kwargs_model, param_class=self.param_class, **kwargs_likelihood)
        self.kwargs_band = kwargs_band
        self.kwargs_psf = kwargs_psf
        self.numPix = numPix

    def test_logL(self):
        args = self.param_class.kwargs2args(kwargs_lens=self.kwargs_lens, kwargs_source=self.kwargs_source,
                                            kwargs_lens_light=self.kwargs_lens_light, kwargs_ps=self.kwargs_ps, kwargs_special=self.kwargs_cosmo)

        logL = self.Likelihood.logL(args, verbose=True)
        num_data_evaluate = self.Likelihood.num_data
        npt.assert_almost_equal(logL/num_data_evaluate, -1/2., decimal=1)

    def test_time_delay_likelihood(self):
        kwargs_likelihood = {'time_delay_likelihood': True,
                             }
        likelihood = LikelihoodModule(kwargs_data_joint=self.kwargs_data, kwargs_model=self.kwargs_model, param_class=self.param_class, **kwargs_likelihood)
        args = self.param_class.kwargs2args(kwargs_lens=self.kwargs_lens, kwargs_source=self.kwargs_source,
                                            kwargs_lens_light=self.kwargs_lens_light, kwargs_ps=self.kwargs_ps, kwargs_special=self.kwargs_cosmo)

        logL = likelihood.logL(args, verbose=True)
        npt.assert_almost_equal(logL, -3097.189103539873, decimal=-1)

    def test_check_bounds(self):
        penalty, bound_hit = self.Likelihood.check_bounds(args=[0, 1], lowerLimit=[1, 0], upperLimit=[2, 2],
                                                          verbose=True)
        assert bound_hit

    def test_pixelbased_modelling(self):
        ss_source = 2
        numPix_source = self.numPix*ss_source
        n_scales = 3
        kwargs_pixelbased = {
            'source_interpolation': 'nearest',
            'supersampling_factor_source': ss_source, # supersampling of pixelated source grid

            # following choices are to minimize pixel solver runtime (not to get accurate reconstruction!)
            'threshold_decrease_type': 'none',
            'num_iter_source': 2,
            'num_iter_lens': 2,
            'num_iter_global': 2,
            'num_iter_weights': 2,
        }
        kwargs_likelihood = {
             'image_likelihood': True,
             'kwargs_pixelbased': kwargs_pixelbased,
             'check_positive_flux': True,  # effectively not applied, activated for code coverage purposes
        }
        kernel = PSF(**self.kwargs_psf).kernel_point_source
        kwargs_psf = {'psf_type': 'PIXEL', 'kernel_point_source': kernel}
        kwargs_numerics = {'supersampling_factor': 1}
        kwargs_data = {'multi_band_list': [[self.kwargs_band, kwargs_psf, kwargs_numerics]]}
        kwargs_model = {
            'lens_model_list': ['SPEP'],
            'lens_light_model_list': ['SLIT_STARLETS'],
            'source_light_model_list': ['SLIT_STARLETS'],
        }
        
        kwargs_fixed_source = [{'n_scales': n_scales, 'n_pixels': numPix_source**2, 'scale': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_fixed_lens_light = [{'n_scales': n_scales, 'n_pixels': self.numPix**2, 'scale': 1, 'center_x': 0, 'center_y': 0}]
        kwargs_constraints = {'source_grid_offset': True}
        param_class = Param(kwargs_model, 
                            kwargs_fixed_source=kwargs_fixed_source, 
                            kwargs_fixed_lens_light=kwargs_fixed_lens_light,
                            **kwargs_constraints)

        likelihood = LikelihoodModule(kwargs_data_joint=kwargs_data, kwargs_model=kwargs_model, 
                                      param_class=param_class, **kwargs_likelihood)

        kwargs_source = [{'amp': np.ones(n_scales*numPix_source**2)}]
        kwargs_lens_light = [{'amp': np.ones(n_scales*self.numPix**2)}]
        kwargs_special = {'delta_x_source_grid': 0, 'delta_y_source_grid': 0}
        args = param_class.kwargs2args(kwargs_lens=self.kwargs_lens, kwargs_source=kwargs_source,
                                       kwargs_lens_light=kwargs_lens_light, kwargs_special=kwargs_special)

        logL = likelihood.logL(args, verbose=True)
        num_data_evaluate = likelihood.num_data
        npt.assert_almost_equal(logL/num_data_evaluate, -1/2., decimal=1)
class TestDynestySampler(object):
    """
    test the fitting sequences
    """
    def setup(self):

        # 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 = sim_util.data_configure_simple(numPix, deltaPix,
                                                     exp_time, sigma_bkg)
        data_class = ImageData(**kwargs_data)
        kwargs_psf_gaussian = {
            'psf_type': 'GAUSSIAN',
            'fwhm': fwhm,
            'pixel_size': deltaPix
        }
        psf = PSF(**kwargs_psf_gaussian)
        kwargs_psf = {
            'psf_type': 'PIXEL',
            'kernel_point_source': 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 = {
            'supersampling_factor': 1,
            'supersampling_convolution': False,
            'compute_mode': 'regular'
        }
        imageModel = ImageModel(data_class,
                                psf_class,
                                lens_model_class,
                                source_model_class,
                                lens_light_model_class,
                                kwargs_numerics=kwargs_numerics)
        image_sim = sim_util.simulate_simple(imageModel, self.kwargs_lens,
                                             self.kwargs_source,
                                             self.kwargs_lens_light)

        data_class.update_data(image_sim)
        kwargs_data['image_data'] = image_sim
        kwargs_data_joint = {
            'multi_band_list': [[kwargs_data, kwargs_psf, kwargs_numerics]],
            'multi_band_type': 'single-band'
        }
        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}

        kwargs_constraints = {
            'image_plane_source_list': [False] * len(source_model_list)
        }

        kwargs_likelihood = {
            'source_marg': False,
            'position_uncertainty': 0.004,
            'check_solver': False,
            'solver_tolerance': 0.001,
        }

        # reduce number of param to sample (for runtime)
        kwargs_fixed_lens = [{
            'gamma': 1.8,
            'center_x': 0,
            'center_y': 0,
            'e1': 0.1,
            'e2': 0.1
        }]
        kwargs_lower_lens = [{'theta_E': 0.8}]
        kwargs_upper_lens = [{'theta_E': 1.2}]
        kwargs_fixed_source = [{
            'R_sersic': 0.6,
            'n_sersic': 3,
            'center_x': 0,
            'center_y': 0,
            'e1': 0.1,
            'e2': 0.1
        }]
        kwargs_fixed_lens_light = [{
            'R_sersic': 0.1,
            'n_sersic': 2,
            'center_x': 0,
            'center_y': 0
        }]

        self.param_class = Param(
            kwargs_model,
            kwargs_fixed_lens=kwargs_fixed_lens,
            kwargs_fixed_source=kwargs_fixed_source,
            kwargs_fixed_lens_light=kwargs_fixed_lens_light,
            kwargs_lower_lens=kwargs_lower_lens,
            kwargs_upper_lens=kwargs_upper_lens,
            **kwargs_constraints)

        self.Likelihood = LikelihoodModule(kwargs_data_joint=kwargs_data_joint,
                                           kwargs_model=kwargs_model,
                                           param_class=self.param_class,
                                           **kwargs_likelihood)

        prior_means = self.param_class.kwargs2args(
            kwargs_lens=self.kwargs_lens,
            kwargs_source=self.kwargs_source,
            kwargs_lens_light=self.kwargs_lens_light)
        prior_sigmas = np.ones_like(prior_means) * 0.1
        self.sampler = DynestySampler(self.Likelihood,
                                      prior_type='uniform',
                                      prior_means=prior_means,
                                      prior_sigmas=prior_sigmas,
                                      sigma_scale=0.5)

    def test_sampler(self):
        kwargs_run = {
            'dlogz_init': 0.01,
            'nlive_init': 4,
            'nlive_batch': 4,
            'maxbatch': 1,
            'wt_kwargs': {
                'pfrac': 0.8
            },
        }
        samples, means, logZ, logZ_err, logL, results = self.sampler.run(
            kwargs_run)
        assert len(means) == 1

    def test_sampler_init(self):
        try:
            sampler = DynestySampler(
                self.Likelihood,
                prior_type='gaussian',
                prior_means=None,  # will raise an Error 
                prior_sigmas=None)  # will raise an Error
        except Exception as e:
            assert isinstance(e, ValueError)
        try:
            sampler = DynestySampler(self.Likelihood, prior_type='some_type')
        except Exception as e:
            assert isinstance(e, ValueError)

    def test_prior(self):
        n_dims = self.sampler.n_dims
        cube_low = np.zeros(n_dims)
        cube_upp = np.ones(n_dims)

        self.prior_type = 'uniform'
        cube_low = self.sampler.prior(cube_low)
        npt.assert_equal(cube_low, self.sampler.lowers)
        cube_upp = self.sampler.prior(cube_upp)
        npt.assert_equal(cube_upp, self.sampler.uppers)

        cube_mid = 0.5 * np.ones(n_dims)
        self.prior_type = 'gaussian'
        self.sampler.prior(cube_mid)
        cube_gauss = np.array([0.5])
        npt.assert_equal(cube_mid, cube_gauss)

    def test_log_likelihood(self):
        n_dims = self.sampler.n_dims
        args = np.nan * np.ones(n_dims)
        logL = self.sampler.log_likelihood(args)
        npt.assert_almost_equal(logL, -47.167446538898204)
Example #18
0
class TestMultiNestSampler(object):
    """
    test the fitting sequences
    """
    def setup(self):

        # 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 = sim_util.data_configure_simple(numPix, deltaPix,
                                                     exp_time, sigma_bkg)
        data_class = ImageData(**kwargs_data)
        kwargs_psf_gaussian = {
            'psf_type': 'GAUSSIAN',
            'fwhm': fwhm,
            'pixel_size': deltaPix
        }
        psf = PSF(**kwargs_psf_gaussian)
        kwargs_psf = {
            'psf_type': 'PIXEL',
            'kernel_point_source': 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 = {
            'supersampling_factor': 1,
            'supersampling_convolution': False,
            'compute_mode': 'regular'
        }
        imageModel = ImageModel(data_class,
                                psf_class,
                                lens_model_class,
                                source_model_class,
                                lens_light_model_class,
                                kwargs_numerics=kwargs_numerics)
        image_sim = sim_util.simulate_simple(imageModel, self.kwargs_lens,
                                             self.kwargs_source,
                                             self.kwargs_lens_light)

        data_class.update_data(image_sim)
        kwargs_data['image_data'] = image_sim
        kwargs_data_joint = {
            'multi_band_list': [[kwargs_data, kwargs_psf, kwargs_numerics]],
            'multi_band_type': 'single-band'
        }
        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}

        kwargs_constraints = {
            'image_plane_source_list': [False] * len(source_model_list)
        }

        kwargs_likelihood = {
            'source_marg': False,
            'position_uncertainty': 0.004,
            'check_solver': False,
            'solver_tolerance': 0.001,
        }
        self.param_class = Param(kwargs_model, **kwargs_constraints)
        self.Likelihood = LikelihoodModule(kwargs_data_joint=kwargs_data_joint,
                                           kwargs_model=kwargs_model,
                                           param_class=self.param_class,
                                           **kwargs_likelihood)

        prior_means = self.param_class.kwargs2args(
            kwargs_lens=self.kwargs_lens,
            kwargs_source=self.kwargs_source,
            kwargs_lens_light=self.kwargs_lens_light)
        prior_sigmas = np.ones_like(prior_means) * 0.1
        self.output_dir = 'test_nested_out'
        self.sampler = MultiNestSampler(self.Likelihood,
                                        prior_type='uniform',
                                        prior_means=prior_means,
                                        prior_sigmas=prior_sigmas,
                                        output_dir=self.output_dir,
                                        remove_output_dir=True)

    def test_sampler(self):
        kwargs_run = {
            'n_live_points': 10,
            'evidence_tolerance': 0.5,
            'sampling_efficiency':
            0.8,  # 1 for posterior-only, 0 for evidence-only
            'importance_nested_sampling': False,
            'multimodal': True,
            'const_efficiency_mode':
            False,  # reduce sampling_efficiency to 5% when True
        }
        samples, means, logZ, logZ_err, logL, results = self.sampler.run(
            kwargs_run)
        assert len(means) == 16
        if not pymultinest_installed:
            # trivial test when pymultinest is not installed properly
            assert np.count_nonzero(samples) == 0
        if os.path.exists(self.output_dir):
            shutil.rmtree(self.output_dir, ignore_errors=True)

    def test_sampler_init(self):
        test_dir = 'some_dir'
        os.mkdir(test_dir)
        sampler = MultiNestSampler(self.Likelihood,
                                   prior_type='uniform',
                                   output_dir=test_dir)
        shutil.rmtree(test_dir, ignore_errors=True)
        try:
            sampler = MultiNestSampler(
                self.Likelihood,
                prior_type='gaussian',
                prior_means=None,  # will raise an Error 
                prior_sigmas=None,  # will raise an Error
                output_dir=None,
                remove_output_dir=True)
        except Exception as e:
            assert isinstance(e, ValueError)
        try:
            sampler = MultiNestSampler(self.Likelihood, prior_type='some_type')
        except Exception as e:
            assert isinstance(e, ValueError)

    def test_prior(self):
        n_dims = self.sampler.n_dims
        cube_low = np.zeros(n_dims)
        cube_upp = np.ones(n_dims)

        self.prior_type = 'uniform'
        self.sampler.prior(cube_low, n_dims, n_dims)
        npt.assert_equal(cube_low, self.sampler.lowers)
        self.sampler.prior(cube_upp, n_dims, n_dims)
        npt.assert_equal(cube_upp, self.sampler.uppers)

        cube_mid = 0.5 * np.ones(n_dims)
        self.prior_type = 'gaussian'
        self.sampler.prior(cube_mid, n_dims, n_dims)
        cube_gauss = np.array([
            50., 50., 0., 0., 0., 0., 50., 4.25, 0., 0., 0., 0., 50., 4.25, 0.,
            0.
        ])
        npt.assert_equal(cube_mid, cube_gauss)

    def test_log_likelihood(self):
        n_dims = self.sampler.n_dims
        args = np.nan * np.ones(n_dims)
        logL = self.sampler.log_likelihood(args, n_dims, n_dims)
        assert logL < 0
class TestFittingSequence(object):
    """
    test the fitting sequences
    """
    def setup(self):
        np.random.seed(42)

        # 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 = sim_util.data_configure_simple(numPix, deltaPix,
                                                     exp_time, sigma_bkg)
        data_class = Data(kwargs_data)
        kwargs_psf = sim_util.psf_configure_simple(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 / 0.05**2.,
            '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 = sim_util.simulate_simple(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

        self.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,
        }

        self.kwargs_numerics = {'subgrid_res': 1, 'psf_subgrid': False}

        kwargs_constraints = {
            'num_point_source_list': [4],
            'solver_type':
            'NONE',  # 'PROFILE', 'PROFILE_SHEAR', 'ELLIPSE', 'CENTER'
            'cosmo_type': 'D_dt'
        }

        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(self.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)

    def test_logL(self):
        args = self.param_class.kwargs2args(
            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)
        args = self.param_class.kwargs2args(
            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, -3340.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
        }

        #imageModel = ImageModel(self.data_class, self.psf_class, self.lens_model_class, self.source_model_class,
        #                        self.lens_light_model_class,
        #                        point_source_class, kwargs_numerics=kwargs_numerics)

    def test_force_positive_source_surface_brightness(self):
        kwargs_likelihood = {
            'force_positive_source_surface_brightness': True,
            'numPix_source': 10,
            'deltaPix_source': 0.1
        }
        kwargs_model = {'source_light_model_list': ['SERSIC']}

        kwargs_constraints = {}
        param_class = Param(kwargs_model, **kwargs_constraints)

        kwargs_data = sim_util.data_configure_simple(numPix=10,
                                                     deltaPix=0.1,
                                                     exposure_time=1,
                                                     sigma_bkg=0.1)
        data_class = Data(kwargs_data)
        kwargs_psf = {'psf_type': 'NONE'}
        psf_class = PSF(kwargs_psf)
        kwargs_sersic = {
            'amp': -1.,
            'R_sersic': 0.1,
            'n_sersic': 2,
            'center_x': 0,
            'center_y': 0
        }
        source_model_list = ['SERSIC']
        kwargs_source = [kwargs_sersic]
        source_model_class = LightModel(light_model_list=source_model_list)

        imageModel = ImageModel(data_class,
                                psf_class,
                                lens_model_class=None,
                                source_model_class=source_model_class)

        image_sim = sim_util.simulate_simple(imageModel, [], kwargs_source)

        data_class.update_data(image_sim)
        likelihood = LikelihoodModule(imSim_class=imageModel,
                                      param_class=param_class,
                                      **kwargs_likelihood)
        logL, _ = likelihood.logL(args=param_class.kwargs2args(
            kwargs_source=kwargs_source))
        assert logL <= -10**10