JerMa88's picture
Upload folder using huggingface_hub
3ce19a2 verified
Raw
History Blame Contribute Delete
1.31 kB
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