Exemple #1
0
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
Exemple #2
0
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