a, b = -2, 0
domain = [-float("inf"), 0]
n_samples = 20000
sigma = 3
def halfgaussian_logpdf(x):
out = np.log(np.exp(-(x**2) / sigma)) * np.heaviside(-x, 1)
return out
xs = np.arange(-3 * sigma, 0.01, 0.1)
y = np.exp(halfgaussian_logpdf(xs))
samples = adaptive_rejection_sampling(logpdf=halfgaussian_logpdf, a=a, b=b, domain=domain, n_samples=n_samples)
plt.title("f(x) half-gaussian")
plt.xlim(-3 * sigma, 3 * sigma)
plt.ylim(0, 1)
plt.plot(xs, y)
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
sns.despine()
savefig("ars_demo1")
plt.show()
plt.title("samples from f(x) (by ARS)", x=0.45)
plt.xlim(-3 * sigma, 3 * sigma)
plt.ylim(0, 1100)
plt.hist(samples, bins=75)
plt.xlabel("$x$")
plt.ylabel("samples")
sns.despine()
savefig("ars_demo2")
plt.show()