def inverse_transform_sampling_1d(var, ab, ii, u_samples): name = var.dist.name if is_bounded_discrete_variable(var): xk, pk = get_probability_masses(var) if type(var.dist) == float_rv_discrete and name != 'discrete_chebyshev': lb, ub = xk.min(), xk.max() xk = (xk-lb)/(ub-lb)*2-1 return float_rv_discrete_inverse_transform_sampling_1d( xk, pk, ab, ii, u_samples) elif name in _continuous_distns._distn_names: return continuous_induced_measure_ppf(var, ab, ii, u_samples) else: msg = 'induced sampling not yet implemented for var type %s' % name raise Exception(msg) return samples
def get_recursion_coefficients_from_variable(var, num_coefs, opts): """ Generate polynomial recursion coefficients by inspecting a random variable. """ var_name, _, shapes = get_distribution_info(var) if var_name == "continuous_monomial": return None loc, scale = transform_scale_parameters(var) if var_name == "rv_function_indpndt_vars": shapes["loc"] = loc shapes["scale"] = scale return get_function_independent_vars_recursion_coefficients( shapes, num_coefs) if var_name == "rv_product_indpndt_vars": shapes["loc"] = loc shapes["scale"] = scale return get_product_independent_vars_recursion_coefficients( shapes, num_coefs) if (var_name in askey_variable_names and opts.get("numeric", False) is False): return get_askey_recursion_coefficients_from_variable(var, num_coefs) orthonormality_tol = opts.get("orthonormality_tol", 1e-8) truncated_probability_tol = opts.get("truncated_probability_tol", 0) if (not is_continuous_variable(var)): if hasattr(shapes, "xk"): xk, pk = shapes["xk"], shapes["pk"] else: xk, pk = get_probability_masses(var, truncated_probability_tol) xk = (xk - loc) / scale return get_numerically_generated_recursion_coefficients_from_samples( xk, pk, num_coefs, orthonormality_tol, truncated_probability_tol) # integration performed in canonical domain so need to map back to # domain of pdf lb, ub = var.interval(1) # Get version var.pdf without error checking which runs much faster pdf = get_pdf(var) def canonical_pdf(x): # print(x, lb, ub, x*scale+loc) # print(var.pdf(x*scale+loc)*scale) # assert np.all(x*scale+loc >= lb) and np.all(x*scale+loc <= ub) return pdf(x * scale + loc) * scale # return var.pdf(x*scale+loc)*scale if (is_bounded_continuous_variable(var) or is_bounded_discrete_variable(var)): can_lb, can_ub = -1, 1 elif is_continuous_variable(var): can_lb = (lb - loc) / scale can_ub = (ub - loc) / scale return predictor_corrector_known_pdf(num_coefs, can_lb, can_ub, canonical_pdf, opts)