Source code for biogeme.bayesian_estimation.sampling
"""Sampling using MCMC with simplified configuration.Michel BierlaireMon Oct 27 2025, 17:04:31"""from__future__importannotationsimportloggingfromtypingimportAnyimportnumpyasnpfrom.sampling_strategyimportSamplingConfiglogger=logging.getLogger(__name__)
[docs]defrun_sampling(*,model:Any,draws:int,tune:int,chains:int,config:SamplingConfig,starting_values:dict[str,float]|None=None,):"""Execute sampling according to a simplified configuration. Returns (idata, used_numpyro: bool)."""ifconfig.backend=="numpyro":# Import lazily so environments without JAX/NumPyro can still import this modulefrompymc.sampling.jaximportsample_numpyro_nutskwargs={"model":model,"draws":draws,"tune":tune,"chains":chains,"target_accept":config.target_accept,}ifconfig.chain_methodisnotNone:kwargs["chain_method"]=config.chain_methodifconfig.nuts_kwargsisnotNone:kwargs["nuts_kwargs"]=config.nuts_kwargs# If starting values are provided, jitter them per chain and pass as initvalsifstarting_values:defjitter(values:dict[str,float],scale:float=0.01)->dict[str,float]:return{k:v+scale*np.random.randn()fork,vinvalues.items()}initvals=[jitter(starting_values)for_inrange(chains)]kwargs["initvals"]=initvalsidata=sample_numpyro_nuts(**kwargs)returnidata,True# PyMC multiprocessing pathimportpymcaspmkwargs={"model":model,"draws":draws,"tune":tune,"chains":chains,"cores":config.coresifconfig.coresisnotNoneelse1,"target_accept":config.target_accept,}ifconfig.initisnotNone:kwargs["init"]=config.initifconfig.max_treedepthisnotNone:kwargs["max_treedepth"]=config.max_treedepth# If starting values are provided, jitter them per chain and pass as initvalsifstarting_values:defjitter(values:dict[str,float],scale:float=0.01)->dict[str,float]:return{k:v+scale*np.random.randn()fork,vinvalues.items()}initvals=[jitter(starting_values)for_inrange(chains)]kwargs["initvals"]=initvalsidata=pm.sample(**kwargs)returnidata,False