# Add any new likelihood wrappers here to be used with other calibration
# packages
import bilby
import numpy as np
[docs]
class likelihood_wrapper_for_bilby(bilby.Likelihood):
def __init__(self, mixed_model, x_exp, y_exp, y_err):
"""
Likelihood wrapper for Bilby calibrator
...
Attributes:
-----------
mixed_model : object
mixed model object from Taweret model mixing class
x_exp : array
The independent variables for the experimental data.
y_exp : array
The dependent variables for the data.
y_err : array
The error bands on the data.
Methods:
--------
log_likelihood(self)
calculates the log likelihood for the parameter values specified in
the wrapper object.
"""
self.parameters = {i: None for i in mixed_model.prior.keys()}
# super().__init__(parameters=param_dic)
super().__init__()
self._compute_ln_noise_evidence = lambda: 0.0
self.mixed_model = mixed_model
self.x_exp = x_exp
self.y_exp = y_exp
self.y_err = y_err
[docs]
def log_likelihood(self, parameters=None):
"""
The log likelihood function that can be used with Bilby.
Parameters:
-----------
None.
Returns:
--------
The scalar log likelihood value.
"""
# compatibility with older samplers and versions
if parameters is None:
parameters = self.parameters
params = list(parameters.values()) # if none doesn't work well
# Because when putting constraints dummy variables enter which are None
# in parameters
params = [i for i in params if i is not None]
params = np.array(params).flatten()
mix_param = params[0:self.mixed_model.n_mix]
models_params = []
tot_sum = self.mixed_model.n_mix
n_args_list = list(self.mixed_model.nargs_model_dic.values())
for i in range(0, len(n_args_list)):
models_params.append(params[tot_sum: tot_sum + n_args_list[i]])
tot_sum += n_args_list[i]
if self.mixed_model.same_parameters:
break
log_l = self.mixed_model.mix_loglikelihood(
mix_param, models_params, self.x_exp, self.y_exp, self.y_err)
if not np.isfinite(log_l):
return -np.inf
return log_l