예제 #1
0
def test_dlogz_reactive_run_SLOW():
    from ultranest import ReactiveNestedSampler
    import ultranest.mlfriends

    def loglike(y):
        return -0.5 * np.sum(((y - 0.5)/0.001)**2, axis=1)

    paramnames = ['Hinz', 'Kunz']

    sampler = ReactiveNestedSampler(paramnames, loglike, vectorized=True)
    print("running for ess")
    firstresults = sampler.run(min_num_live_points=50, cluster_num_live_points=0, max_num_improvement_loops=3, min_ess=10000, viz_callback=None)
    print()
    print({k:v for k, v in firstresults.items() if 'logzerr' in k})
    print()
    assert firstresults['logzerr'] > 0.1 * 2
    print("running again for logz")
    for niter, results in enumerate(sampler.run_iter(min_num_live_points=1, cluster_num_live_points=0, max_num_improvement_loops=10, dlogz=0.1, viz_callback=None, region_class=ultranest.mlfriends.RobustEllipsoidRegion)):
        print("logzerr in iteration %d" % niter, results['logzerr'])
    print()
    print({k:v for k, v in results.items() if 'logzerr' in k})
    assert results['logzerr'] < 0.1 * 2
예제 #2
0
def main(args):
    ndim = args.x_dim
    paramnames = list(string.ascii_lowercase)[:ndim]

    np.random.seed(args.seed)
    if args.wrapped_dims:
        wrapped_params = [True] * ndim
    else:
        wrapped_params = None

    true_Z = None

    if args.log_dir is None:
        if args.delete_dir:
            return
        log_dir = None
    else:
        log_dir = args.log_dir + '-%s' % args.problem
        log_dir += '-%dd' % ndim
        if args.wrapped_dims:
            log_dir += '-wrapped'

        if args.delete_dir:
            shutil.rmtree(log_dir, ignore_errors=True)

    if ndim >= 20 and args.num_live_points >= 1000:
        print("skipping, probably too slow to run")
        return

    if args.problem == 'gauss':
        sigma = 0.01
        if args.wrapped_dims:
            centers = (np.sin(np.arange(ndim) / 2.) + 1.) / 2.
        else:
            centers = (np.sin(np.arange(ndim) / 2.) / 2. + 1.) / 2.
        true_Z = 0

        def loglike(theta):
            like = -0.5 * (((theta - centers) / sigma)**2).sum(
                axis=1) - 0.5 * np.log(2 * np.pi * sigma**2) * ndim
            return like

        def transform(x):
            return x
    elif args.problem == 'slantedeggbox':
        if not args.pass_transform:
            return

        def loglike(z):
            chi = (2. + (np.cos(z[:, :2] / 2.)).prod(axis=1))**5
            chi2 = -np.abs((z - 5 * np.pi) / 0.5).sum(axis=1)
            return chi + chi2

        def transform(x):
            return x * 100
    elif args.problem == 'funnel':
        if args.wrapped_dims: return
        if not args.pass_transform:
            return

        sigma = 0.01
        centers = np.sin(np.arange(ndim) / 2.)
        data = np.random.normal(centers, sigma).reshape((1, -1))

        def loglike(theta):
            sigma = 10**theta[:, 0]
            like = -0.5 * (((theta[:, 1:] - data) / sigma.reshape(
                (-1, 1)))**2).sum(axis=1) - 0.5 * np.log(
                    2 * np.pi * sigma**2) * ndim
            return like

        def transform(x):
            z = x * 20 - 10
            z[:, 0] = x[:, 0] * 6 - 3
            return z

        paramnames.insert(0, 'sigma')
    elif args.problem == 'loggamma':
        true_Z = 0.0
        if args.wrapped_dims: return
        rv1a = scipy.stats.loggamma(1, loc=2. / 3, scale=1. / 30)
        rv1b = scipy.stats.loggamma(1, loc=1. / 3, scale=1. / 30)
        rv2a = scipy.stats.norm(2. / 3, 1. / 30)
        rv2b = scipy.stats.norm(1. / 3, 1. / 30)
        rv_rest = []
        for i in range(2, ndim):
            if i <= (ndim + 2) / 2:
                rv = scipy.stats.loggamma(1, loc=2. / 3., scale=1. / 30)
            else:
                rv = scipy.stats.norm(2. / 3, 1. / 30)
            rv_rest.append(rv)
            del rv

        def loglike(theta):
            L1 = np.log(0.5 * rv1a.pdf(theta[:, 0]) +
                        0.5 * rv1b.pdf(theta[:, 0]))
            L2 = np.log(0.5 * rv2a.pdf(theta[:, 1]) +
                        0.5 * rv2b.pdf(theta[:, 1]))
            Lrest = np.sum([
                rv.logpdf(t)
                for rv, t in zip(rv_rest, theta[:, 2:].transpose())
            ],
                           axis=0)
            like = L1 + L2 + Lrest
            like = np.where(like < -300,
                            -300 - ((np.asarray(theta) - 0.5)**2).sum(), like)
            assert like.shape == (len(theta), ), (like.shape, theta.shape)
            return like

        def transform(x):
            return x

    from ultranest import ReactiveNestedSampler
    sampler = ReactiveNestedSampler(
        paramnames,
        loglike,
        transform=transform if args.pass_transform else None,
        log_dir=log_dir,
        vectorized=True,
        resume='resume' if args.resume else 'overwrite',
        wrapped_params=wrapped_params,
    )
    for result in sampler.run_iter(
            update_interval_iter_fraction=args.update_interval_iter_fraction,
            dlogz=args.dlogz,
            dKL=args.dKL,
            frac_remain=args.frac_remain,
            min_ess=args.min_ess,
            max_iters=args.max_iters,
            cluster_num_live_points=args.cluster_num_live_points,
            min_num_live_points=args.num_live_points,
            max_ncalls=int(args.max_ncalls),
    ):
        sampler.print_results()
        print(" (remember, we are trying to achive: %s ) " % (dict(
            dlogz=args.dlogz,
            dKL=args.dKL,
            frac_remain=args.frac_remain,
            min_ess=args.min_ess,
        )))

    results = sampler.results
    sampler.plot()
    sampler.pointstore.close()
    if results['logzerr_tail'] < 0.5 and results[
            'logzerr'] < 1.0 and true_Z is not None and args.num_live_points > 50:
        assert results['logz'] - results['logzerr'] * 3 < true_Z < results[
            'logz'] + results['logzerr'] * 3
    return results