Beispiel #1
0
def continuous_induced_measure_ppf(var,
                                   ab,
                                   ii,
                                   u_samples,
                                   quad_tol=1e-8,
                                   opt_tol=1e-6):
    if is_bounded_continuous_variable(var):
        # canonical domain of bounded variables does not coincide with scipy
        # variable canonical pdf domain with loc,scale=0,1
        lb, ub = -1, 1
        loc, scale = -1, 2
    else:
        lb, ub = var.support()
        loc, scale = 0, 1
    shapes = get_distribution_info(var)[2]

    # need to map x from canonical polynomial domain to canonical domain of pdf
    pdf = lambda x: var.dist._pdf((x - loc) / scale, **shapes) / scale

    def pdf(x):
        vals = var.dist._pdf((x - loc) / scale, **shapes) / scale
        #print('x',x,(x-loc)/scale,vals)
        return vals

    #pdf = var.pdf
    #func = partial(continuous_induced_measure_cdf,pdf,ab,ii,lb,ub,quad_tol)
    from pyapprox.cython.orthonormal_polynomials_1d import\
        continuous_induced_measure_cdf_pyx
    func = partial(continuous_induced_measure_cdf_pyx, pdf, ab, ii, lb,
                   quad_tol)
    method = 'bisect'
    samples = invert_monotone_function(func, [lb, ub], u_samples, method,
                                       opt_tol)
    assert np.all(np.isfinite(samples))
    return samples
Beispiel #2
0
def univariate_quantile_continuous_variable(pdf, bounds, beta, opt_tol=1e-8,
                                            quad_opts={}):
    if quad_opts.get("epsabs", 1.49e-8) > opt_tol:
        raise ValueError("epsabs must be smaller than opt_tol")
    func = partial(univariate_cdf_continuous_variable,
                   pdf, bounds[0], bounds[1], quad_opts=quad_opts)
    method = 'bisect'
    quantile = invert_monotone_function(
        func, bounds, np.array([beta]), method, opt_tol)
    return quantile