import numpy as np from scipy import interpolate class Angle_Generator: def __init__(self, dim): self.dim = dim curve, inverse_cdf = self.sample(self.f) self.curve = curve self.inverse_cdf = inverse_cdf def f(self, x): # does not need to be normalized return np.sin(x)** (self.dim - 2) def sample(self, g): x = np.linspace(0,np.pi,10000) y = g(x) # probability density function, pdf cdf_y = np.cumsum(y) # cumulative distribution function, cdf cdf_y = cdf_y/cdf_y.max() # takes care of normalizing cdf to 1.0 inverse_cdf = interpolate.interp1d(cdf_y,x) # this is a function curve = interpolate.interp1d(x,cdf_y) self.curve = curve self.inverse_cdf = inverse_cdf return curve, inverse_cdf def return_samples(self, N=1000, angle_low = 0, angle_high = np.pi): # let's generate some samples according to the chosen pdf, f(x) u_low = self.curve(angle_low) u_high = self.curve(angle_high) uniform_samples = np.random.uniform(u_low, u_high,int(N)) required_samples = self.inverse_cdf(uniform_samples) required_samples = required_samples.astype(np.float32) return required_samples