Source code for jetset.mcmc

from __future__ import absolute_import, division, print_function

from builtins import (bytes, str, open, super, range,
                      zip, round, input, int, pow, object, map, zip)

__author__ = "Andrea Tramacere"

import numpy as np
import scipy as sp
from scipy import stats


__all__=['MCMC']
[docs]class MCMC (object): def __init__(self,fit_par,range_rel,range_sigma,jump_step_rel,jump_step_sigma,proposal='uniform'): self.burn_in_size self.trials_size self.fit_par=fit_par self.par_range self.jump_step if proposal=='uniform': self.proposal_prob=stats.uniform.pdf self.proposal_val=stats.uniform.rvs elif proposal=='normal': self.proposal_prob=stats.norm.pdf self.proposal_val=stats.norm.rvs else: print ("proposal distribution not in allowed") return
[docs] def run(self): LEN=0 TRIAL=0 oldLike=self.func_stat() self.init_par() while TRIAL <=self.MCMC_TRIALS and LEN<self.Lenght: TRIAL+=1 #Draw parameters self.random_walk() self.update_prior() if self.prior21>0: self.UpdatePrefac() newLike=self.func_stat() ratio=np.exp(newLike-oldLike)*(self.Prefac) aprob=min([1.0,ratio]) u = stats.uniform.rvs(loc=0.0,scale=1.0) #Decide trial acceptance if u < aprob: LEN+=1 print("TRIAL=%d accetto ratio=%e u=%e par[1]=%s -LogLike=%e "%(TRIAL,ratio,u,self.par[1],-newLike)) oldLike=newLike
[docs] def init_MCMC_pars(self): for pi in range(len(self.fit_par)): if self.fit_par[pi].err is not None: delta_par=self.fit_par[pi].err*self.range_sigma step_par=self.fit_par[pi].err*self.jump_step_sigma else: delta_par=self.fit_par[pi].val*self.range_rel step_par=self.fit_par[pi].val*self.jump_step_rel self.fit_par[pi].MCMC_range_min=self.fit_par[pi].val - delta_par self.fit_par[pi].MCMC_range_max=self.fit_par[pi].val + delta_par self.fit_par[pi].MCMC_jump_step=step_par self.fit_par[pi].MCMC_val=self.fit_par[pi].val self.fit_par[pi].MCMC_trial=None self.fit_par[pi].MCMC_sample=sp.zeros(self.trials_size)
[docs] def random_walk(self,size): for pi in range(len(self.fit_par)): self.fit_par[pi].MCMC_trial=self.draw_proposal(self.parfit_par[pi])
[docs] def draw_proposal(self,par): loc=par.MCMC_range_min scale=par.MCMC_range_max-par.MCMC_range_min return self.proposal_val(loc=loc,scale=scale)
[docs] def update_prior(self): self.prior12=1 self.prior21=1 for pi in range(len(self.fit_par)): self.prior12 =self.prior12 * self.prior_fact(self.fit_par[pi],self.fit_par[pi].MCMC_val,self.fit_par[pi].MCMC_trial) self.prior21 =self.prior21 * self.prior_fact(self.fit_par[pi],self.fit_par[pi].MCMC_trial,self.fit_par[pi].MCMC_val)
[docs] def prior_fact(self,_prime,x,scale): loc=par.MCMC_range_min scale=par.MCMC_range_max-par.MCMC_range_min return self.proposal_prob(x,loc=loc,scale=scale)