Source code for hierarc.Likelihood.LensLikelihood.ddt_dd_kde_likelihood
from lenstronomy.Cosmo.kde_likelihood import KDELikelihood
import numpy as np
from scipy import interpolate
[docs]
class DdtDdKDELikelihood(object):
"""Class for evaluating the 2-d posterior of Ddt vs Dd coming from a lens with time
delays and kinematics measurement."""
def __init__(
self,
z_lens,
z_source,
dd_samples,
ddt_samples,
kde_type="scipy_gaussian",
bandwidth=1,
interpol=False,
num_interp_grid=100,
):
"""
:param z_lens: lens redshift
:param z_source: source redshift
:param dd_samples: angular diameter to the lens posteriors (in physical Mpc)
:param ddt_samples: time-delay distance posteriors (in physical Mpc)
:param kde_type: kernel density estimator type (see KDELikelihood class)
:param bandwidth: width of kernel (in same units as the angular diameter quantities)
:param interpol: bool, if True pre-computes an interpolation likelihood in 2d on a grid
:param num_interp_grid: int, number of interpolations per axis
"""
self._kde_likelihood = KDELikelihood(
dd_samples, ddt_samples, kde_type=kde_type, bandwidth=bandwidth
)
if interpol is True:
dd_grid = np.linspace(
start=max(np.min(dd_samples), 0),
stop=min(np.max(dd_samples), 10000),
num=num_interp_grid,
)
ddt_grid = np.linspace(
np.min(ddt_samples), np.max(ddt_samples), num=num_interp_grid
)
z = np.zeros((num_interp_grid, num_interp_grid))
for i, dd in enumerate(dd_grid):
for j, ddt in enumerate(ddt_grid):
z[j, i] = self._kde_likelihood.logLikelihood(dd, ddt)[0]
self._interp_log_likelihood = interpolate.interp2d(
dd_grid, ddt_grid, z, kind="cubic"
)
self._interpol = interpol
self.num_data = 2
[docs]
def log_likelihood(self, ddt, dd, kin_scaling=None):
"""
:param ddt: time-delay distance
:param dd: angular diameter distance to the deflector
:param kin_scaling: array of size of the velocity dispersion measurement or None, scaling of the predicted
dimensionless quantity J (proportional to sigma_v^2) of the anisotropy model in the sampling relative to the
anisotropy model used to derive the prediction and covariance matrix in the init of this class.
:return: log likelihood given the single lens analysis
"""
if kin_scaling is not None:
dd_ = dd * kin_scaling[0]
else:
dd_ = dd
if self._interpol is True:
return self._interp_log_likelihood(dd_, ddt)[0]
return self._kde_likelihood.logLikelihood(dd_, ddt)[0]