Source code for jetset.mcmc_parameters
"""MCMC sampling paramters ."""
__author__ = "Andrea Tramacere"
import ast
from astropy.table import Table,MaskedColumn
from .model_parameters import _show_table,CompositeModelParameterArray
import numpy as np
[docs]
def sci_if_large(self,val):
try:
if val is None:
return "--"
if abs(val) > 1e4:
return f"{val:.3e}"
return f"{val}"
except Exception:
return "--"
[docs]
class McmcCompositeModelParameterArray(CompositeModelParameterArray):
def _build_sampler_par_table(self, names_list=None):
_name=[]
_model_name = []
_best_fit_mcmc_val=[]
_q16=[]
_q50=[]
_q84=[]
_val_start=[]
_mcmc_bound_min=[]
_mcmc_bound_max=[]
_frozen=[]
_val=[]
_log=[]
_fields=[_model_name,_name,_val,_log,_best_fit_mcmc_val,_q16,_q50,_q84,_mcmc_bound_min,_mcmc_bound_max,_frozen]
_names=['model name','name','val','log','bestfit mcmc','q16','q50','q84','mcmc bound min','mcmc bound max','frozen']
for par in self.par_array:
append=False
if names_list is not None:
if par.name in names_list:
append=True
else:
append = True
if par.hidden is True:
append=False
if type(par.val_start) is str:
try:
ast.literal_eval(par.val_start)
except:
append= False
if append:
#if self.model is not None:
_model_name.append(par.model.name)
_log.append(par.islog)
#else:
# _model_name.append('no_name')
if par._linked is True and par._linked_root_model != par.model:
_p_name = par.name + '(L,%s)' % par._linked_root_model.name
_val_start.append(None)
_best_fit_mcmc_val.append(None)
_q16.append(None)
_q50.append(None)
_q84.append(None)
_mcmc_bound_min.append(par.mcmc_bound_min)
_mcmc_bound_max.append(par.mcmc_bound_max)
else:
if par._linked is False and par._depending_pars!=[]:
_p_name = par.name + '(M)'
else:
_p_name = par.name
if par.frozen == True:
best_fit_mcmc_val = None
q16 = None
q50 = None
q84 = None
else:
best_fit_mcmc_val=par.best_fit_mcmc_val
q16 = par.q_16
q50 = par.q_50
q84 = par.q_84
_val_start.append(par.val_start)
_best_fit_mcmc_val.append(best_fit_mcmc_val)
_q16.append(q16)
_q50.append(q50)
_q84.append(q84)
_mcmc_bound_min.append(par.mcmc_bound_min)
_mcmc_bound_max.append(par.mcmc_bound_max)
if par._is_dependent is True and par._linked is False:
for p in par._master_pars:
_p_name = '*' + par.name + '(D,%s)' % p.name
if par._linked_root_model is not None:
if par._linked_root_model != par.model:
_p_name += par._linked_root_model.name
_name.append(_p_name)
_frozen.append(par.frozen)
_val.append(par.val)
t = Table(_fields, names=_names, masked=False)
self._fromat_column_entry(t)
t=t.group_by('frozen')
return t
def _fromat_column_entry(self, t):
_numeric_fields =['val','bestfit mcmc','q16','q50','q84','mcmc bound min','mcmc bound max']
for n in _numeric_fields:
if n in t.colnames:
try:
if None in t[n].data:
t[n] = MaskedColumn(t[n].data, name=n, dtype=np.float64, mask=t[n].data==None)
else:
t[n] = MaskedColumn(t[n].data, name=n, dtype=np.float64)
t[n].format = '%e'
except:
for ID,v in enumerate(t[n].data):
try:
c=ast.literal_eval(t[n].data[ID])
if type(c) == int:
t[n].data[ID] = '%d' % c
else:
t[n].data[ID] = '%e' % c
except:
pass
# Methods added dynamically to the mcmc parameters
[docs]
def get_mcmc_bound_max(self):
return self._mcmc_bound_max
[docs]
def set_mcmc_bound_max(self,v):
self._check_par_mcmc_bounds(v)
self._mcmc_bound_max=v
[docs]
def get_mcmc_bound_min(self):
return self._mcmc_bound_min
[docs]
def set_mcmc_bound_min(self,v):
self._check_par_mcmc_bounds(v)
self._mcmc_bound_min=v
def _check_par_mcmc_bounds(self,v):
if v is not None:
if self.val_max is not None:
if v>self.val_max :
raise RuntimeError(f'par {self.name} mcmc_bound_max {v} > val_max {self.val_max}')
if self.val_min is not None:
if v<self.val_min :
raise RuntimeError(f'par {self.name} mcmc_bound_max {v} < val_min {self.val_min}')