Source code for lenstronomy.PointSource.point_source_param

import numpy as np

__all__ = ['PointSourceParam']


[docs]class PointSourceParam(object): """ """ def __init__(self, model_list, kwargs_fixed, num_point_source_list=None, linear_solver=True, fixed_magnification_list=None, kwargs_lower=None, kwargs_upper=None): """ :param model_list: list of point source model names :param kwargs_fixed: list of keyword arguments with parameters to be held fixed :param num_point_source_list: list of number of point sources per point source model class :param linear_solver: bool, if True, does not return linear parameters for the sampler (will be solved linearly instead) :param fixed_magnification_list: list of booleans, if entry is True, keeps one overall scaling among the point sources in this class """ self.model_list = model_list if num_point_source_list is None: num_point_source_list = [1] * len(model_list) self._num_point_sources_list = num_point_source_list if fixed_magnification_list is None: fixed_magnification_list = [False] * len(model_list) self._fixed_magnification_list = fixed_magnification_list self.kwargs_fixed = kwargs_fixed if linear_solver is True: self.kwargs_fixed = self.add_fix_linear(kwargs_fixed) self._linear_solver = linear_solver if kwargs_lower is None: kwargs_lower = [] for k, model in enumerate(self.model_list): num = self._num_point_sources_list[k] if model in ['LENSED_POSITION', 'UNLENSED']: fixed_low = {'ra_image': [-100] * num, 'dec_image': [-100] * num} elif model in ['SOURCE_POSITION']: fixed_low = {'ra_source': -100, 'dec_source': -100} else: raise ValueError("%s not a valid point source model" % model) if self._fixed_magnification_list[k] is True and model in ['LENSED_POSITION', 'SOURCE_POSITION']: fixed_low['source_amp'] = 0 else: fixed_low['point_amp'] = np.zeros(num) kwargs_lower.append(fixed_low) if kwargs_upper is None: kwargs_upper = [] for k, model in enumerate(self.model_list): num = self._num_point_sources_list[k] if model in ['LENSED_POSITION', 'UNLENSED']: fixed_high = {'ra_image': [100] * num, 'dec_image': [100] * num} elif model in ['SOURCE_POSITION']: fixed_high = {'ra_source': 100, 'dec_source': 100} else: raise ValueError("%s not a valid point source model" % model) if self._fixed_magnification_list[k] is True and model in ['LENSED_POSITION', 'SOURCE_POSITION']: fixed_high['source_amp'] = 100 else: fixed_high['point_amp'] = np.ones(num)*100 kwargs_upper.append(fixed_high) self.lower_limit = kwargs_lower self.upper_limit = kwargs_upper
[docs] def get_params(self, args, i): """ :param args: sorted list of floats corresponding to the parameters being sampled :param i: int, index of first entry relevant for being managed by this class :return: keyword argument list of point sources, index relevant for the next class """ kwargs_list = [] for k, model in enumerate(self.model_list): kwargs = {} kwargs_fixed = self.kwargs_fixed[k] if model in ['LENSED_POSITION', 'UNLENSED']: if 'ra_image' not in kwargs_fixed: kwargs['ra_image'] = np.array(args[i:i + self._num_point_sources_list[k]]) i += self._num_point_sources_list[k] else: kwargs['ra_image'] = kwargs_fixed['ra_image'] if 'dec_image' not in kwargs_fixed: kwargs['dec_image'] = np.array(args[i:i + self._num_point_sources_list[k]]) i += self._num_point_sources_list[k] else: kwargs['dec_image'] = kwargs_fixed['dec_image'] if model in ['SOURCE_POSITION']: if 'ra_source' not in kwargs_fixed: kwargs['ra_source'] = args[i] i += 1 else: kwargs['ra_source'] = kwargs_fixed['ra_source'] if 'dec_source' not in kwargs_fixed: kwargs['dec_source'] = args[i] i += 1 else: kwargs['dec_source'] = kwargs_fixed['dec_source'] # amplitude parameter handling if self._fixed_magnification_list[k] is True and model in ['LENSED_POSITION', 'SOURCE_POSITION']: if 'source_amp' not in kwargs_fixed: kwargs['source_amp'] = args[i] i += 1 else: kwargs['source_amp'] = kwargs_fixed['source_amp'] else: if 'point_amp' not in kwargs_fixed: kwargs['point_amp'] = np.array(args[i:i + self._num_point_sources_list[k]]) i += self._num_point_sources_list[k] else: kwargs['point_amp'] = kwargs_fixed['point_amp'] kwargs_list.append(kwargs) return kwargs_list, i
[docs] def set_params(self, kwargs_list): """ :param kwargs_list: keyword argument list :return: sorted list of parameters being sampled extracted from kwargs_list """ args = [] for k, model in enumerate(self.model_list): kwargs = kwargs_list[k] kwargs_fixed = self.kwargs_fixed[k] if model in ['LENSED_POSITION', 'UNLENSED']: if 'ra_image' not in kwargs_fixed: x_pos = kwargs['ra_image'][0:self._num_point_sources_list[k]] for x in x_pos: args.append(x) if 'dec_image' not in kwargs_fixed: y_pos = kwargs['dec_image'][0:self._num_point_sources_list[k]] for y in y_pos: args.append(y) if model in ['SOURCE_POSITION']: if 'ra_source' not in kwargs_fixed: args.append(kwargs['ra_source']) if 'dec_source' not in kwargs_fixed: args.append(kwargs['dec_source']) # amplitude parameter handling if self._fixed_magnification_list[k] is True and model in ['LENSED_POSITION', 'SOURCE_POSITION']: if 'source_amp' not in kwargs_fixed: args.append(kwargs['source_amp']) else: if 'point_amp' not in kwargs_fixed: amp = kwargs['point_amp'][0:self._num_point_sources_list[k]] for a in amp: args.append(a) return args
[docs] def num_param(self): """ number of parameters and their names :return: int, list of parameter names """ num = 0 name_list = [] for k, model in enumerate(self.model_list): kwargs_fixed = self.kwargs_fixed[k] if model in ['LENSED_POSITION', 'UNLENSED']: if 'ra_image' not in kwargs_fixed: num += self._num_point_sources_list[k] for i in range(self._num_point_sources_list[k]): name_list.append('ra_image') if 'dec_image' not in kwargs_fixed: num += self._num_point_sources_list[k] for i in range(self._num_point_sources_list[k]): name_list.append('dec_image') if model in ['SOURCE_POSITION']: if 'ra_source' not in kwargs_fixed: num += 1 name_list.append('ra_source') if 'dec_source' not in kwargs_fixed: num += 1 name_list.append('dec_source') # amplitude handling if self._fixed_magnification_list[k] is True and model in ['LENSED_POSITION', 'SOURCE_POSITION']: if 'source_amp' not in kwargs_fixed: num += 1 name_list.append('source_amp') else: if 'point_amp' not in kwargs_fixed: num += self._num_point_sources_list[k] for i in range(self._num_point_sources_list[k]): name_list.append('point_amp') return num, name_list
[docs] def add_fix_linear(self, kwargs_fixed): """ updates fixed keyword argument list with linear parameters :param kwargs_fixed: list of keyword arguments held fixed during sampling :return: updated keyword argument list """ for k, model in enumerate(self.model_list): if self._fixed_magnification_list[k] is True and model in ['LENSED_POSITION', 'SOURCE_POSITION']: kwargs_fixed[k]['source_amp'] = 1 else: kwargs_fixed[k]['point_amp'] = np.ones(self._num_point_sources_list[k]) return kwargs_fixed
[docs] def num_param_linear(self): """ :return: number of linear parameters """ num = 0 if self._linear_solver is True: for k, model in enumerate(self.model_list): if self._fixed_magnification_list[k] is True and model in ['LENSED_POSITION', 'SOURCE_POSITION']: num += 1 else: num += self._num_point_sources_list[k] return num