def prior_sampler(self, nsamples, seed=0, test_lprob=False, lks=None, verbose=True, debug=False, **args): """Draw parameters from prior. Parameters ---------- nsamples : int Size of the prior sample seed : int, optional Set the random seed (0 by default) test_lprob : bool, optional Whether to ensure that drawn parameters have a finite likelihood (False by default) verbose : bool, optional debug : bool, optional Returns ------- array Numpy array of parameters """ import tqdm from grgrlib import map2arr, serializer from .stats import get_prior store_reduce_sys = np.copy(self.fdict['reduce_sys']) l_max, k_max = lks or (None, None) # if not store_reduce_sys: # self.get_sys(reduce_sys=True, verbose=verbose > 1, **args) if test_lprob and not hasattr(self, 'ndim'): self.prep_estim(load_R=True, verbose=verbose > 2) frozen_prior = get_prior(self.prior, verbose=verbose)[0] self.debug |= debug if hasattr(self, 'pool'): from .estimation import create_pool create_pool(self) set_par = serializer(self.set_par) get_par = serializer(self.get_par) lprob = serializer(self.lprob) if test_lprob else None def runner(locseed): np.random.seed(seed + locseed) done = False no = 0 while not done: no += 1 with np.warnings.catch_warnings(record=False): try: np.warnings.filterwarnings('error') rst = np.random.randint(2**31) # win explodes with 2**32 pdraw = [ pl.rvs(random_state=rst + sn) for sn, pl in enumerate(frozen_prior) ] if test_lprob: draw_prob = lprob(pdraw, linear=None, verbose=verbose > 1) done = not np.isinf(draw_prob) else: set_par(pdraw) done = True except Exception as e: if verbose > 1: print(str(e) + '(%s) ' % no) return pdraw, no if verbose > 1: print('[prior_sample:]'.ljust(15, ' ') + ' Sampling from the pior...') wrapper = tqdm.tqdm if verbose < 2 else (lambda x, **kwarg: x) pmap_sim = wrapper(self.mapper(runner, range(nsamples)), total=nsamples) draws, nos = map2arr(pmap_sim) # if not store_reduce_sys: # self.get_sys(reduce_sys=False, verbose=verbose > 1, **args) if verbose: smess = '' if test_lprob: smess = 'of zero likelihood, ' print( '[prior_sample:]'.ljust(15, ' ') + ' Sampling done. %2.2f%% of the prior is either %sindetermined or explosive.' % (100 * (sum(nos) - nsamples) / sum(nos), smess)) return draws
def prior_sampler(self, nsample, seed=None, test_lprob=False, verbose=True): """Draw parameters from prior. Drawn parameters have a finite likelihood. Parameters ---------- nsample : int Size of the prior sample Returns ------- array Numpy array of parameters """ import tqdm from grgrlib import map2arr, serializer if seed is None: seed = 0 reduce_sys = np.copy(self.fdict['reduce_sys']) if not reduce_sys: self.get_sys(reduce_sys=True, verbose=verbose > 1) if test_lprob and not hasattr(self, 'ndim'): self.prep_estim(load_R=True, verbose=verbose > 2) if not 'frozen_prior' in self.fdict.keys(): from .stats import get_prior self.fdict['frozen_prior'] = get_prior(self.prior)[0] frozen_prior = self.fdict['frozen_prior'] if not hasattr(self, 'mapper'): self.mapper = map if hasattr(self, 'pool'): self.pool.clear() get_par = serializer(self.get_par) get_sys = serializer(self.get_sys) def runner(locseed): np.random.seed(seed + locseed) done = False no = 0 while not done: no += 1 with np.warnings.catch_warnings(record=False): try: np.warnings.filterwarnings('error') rst = np.random.randint(32**2 - 2) pdraw = [ pl.rvs(random_state=rst + sn) for sn, pl in enumerate(frozen_prior) ] if test_lprob: draw_prob = lprob(pdraw, None, verbose > 1) done = not np.isinf(draw_prob) else: pdraw_full = get_par(pdraw, asdict=False, full=True) get_sys(par=pdraw_full, reduce_sys=True) done = True except Exception as e: if verbose > 1: print(str(e) + '(%s) ' % no) return pdraw, no if verbose > 1: print('[prior_sample:]'.ljust(15, ' ') + ' sampling from the pior...') wrapper = tqdm.tqdm if verbose < 2 else (lambda x, **kwarg: x) pmap_sim = wrapper(self.mapper(runner, range(nsample)), total=nsample) draws, nos = map2arr(pmap_sim) if not reduce_sys: self.get_sys(reduce_sys=False, verbose=verbose > 1) if verbose: print( '[prior_sample:]'.ljust(15, ' ') + ' sampling done. %2.2f%% of the prior are either indetermined or explosive.' % (100 * (sum(nos) - nsample) / nsample)) return draws