about summary refs log tree commit diff
diff options
context:
space:
mode:
authorArun Isaac2021-03-26 14:13:48 +0530
committerArun Isaac2021-03-26 14:16:44 +0530
commit7fdcd4d355274bdd70fa1de0ff9723790a45634f (patch)
tree85da612ac7dd606664ed88c4f648ad81cb3a6ca1
parent229a88c4a9c70b26b35cc22b75576f26d49bb19d (diff)
downloadsambal-7fdcd4d355274bdd70fa1de0ff9723790a45634f.tar.gz
sambal-7fdcd4d355274bdd70fa1de0ff9723790a45634f.tar.lz
sambal-7fdcd4d355274bdd70fa1de0ff9723790a45634f.zip
Remove inverse transform sampling based functions.
* src/sambal/sambal.py: Do not import numpy.arcsin, numpy.ones,
numpy.where, scipy.special.betainc, scipy.special.betaincinv.
(planar_angle2solid_angle_fraction, solid_angle_fraction2planar_angle,
random_planar_angle_cdf, random_vector_on_spherical_cap_cdf): Delete
functions.
(random_vector_on_spherical_cap_pdf): Remove reference to
random_vector_on_spherical_cap_cdf in docstring. Rename to
random_on_cap.
-rw-r--r--src/sambal/sambal.py37
1 files changed, 2 insertions, 35 deletions
diff --git a/src/sambal/sambal.py b/src/sambal/sambal.py
index de68d1c..3a35438 100644
--- a/src/sambal/sambal.py
+++ b/src/sambal/sambal.py
@@ -16,32 +16,15 @@
 # along with this program.  If not, see
 # <https://www.gnu.org/licenses/>.
 
-from numpy import arcsin, cos, dot, empty, log, ones, sin, sqrt, pi, where
+from numpy import cos, dot, empty, log, sin, sqrt, pi
 from numpy.random import randn, random
 from numpy.linalg import norm
-from scipy.special import betainc, betaincinv
 
 def random_on_sphere(dim):
     """Return a random vector uniformly distributed on the unit sphere."""
     x = randn(dim)
     return x / norm(x)
 
-def planar_angle2solid_angle_fraction(planar_angle, dim):
-    """Return the solid angle fraction for a given planar angle."""
-    alpha = (dim - 1) / 2
-    beta = 1/2
-    return where(planar_angle < pi/2,
-                 0.5*betainc(alpha, beta, sin(planar_angle)**2),
-                 1 - 0.5*betainc(alpha, beta, sin(planar_angle)**2))
-
-def solid_angle_fraction2planar_angle(solid_angle_fraction, dim):
-    """Return the planar angle for a given solid angle fraction."""
-    alpha = (dim - 1) / 2
-    beta = 1/2
-    return where(solid_angle_fraction < 1/2,
-                 arcsin(sqrt(betaincinv(alpha, beta, 2*solid_angle_fraction))),
-                 pi - arcsin(sqrt(betaincinv(alpha, beta, 2*(1-solid_angle_fraction)))))
-
 def rotate_from_nth_canonical(x, axis):
     """Rotate vector from around the nth canonical axis to the given axis.
     """
@@ -56,12 +39,6 @@ def rotate_from_nth_canonical(x, axis):
             - axisn*(xn*s + a*(axisn - 1))/b
     return x
 
-def random_planar_angle_cdf(maximum_planar_angle, dim):
-    """Return a random planar angle using inverse transform sampling."""
-    return solid_angle_fraction2planar_angle(
-        planar_angle2solid_angle_fraction(maximum_planar_angle, dim)*random(),
-        dim)
-
 def random_planar_angle_pdf(maximum_planar_angle, dim):
     """Return a random planar angle using rejection sampling."""
     # We apply the log function just to prevent the floats from
@@ -82,19 +59,9 @@ disk."""
     x[-1] = cos(planar_angle)
     return rotate_from_nth_canonical(x, axis)
 
-def random_vector_on_spherical_cap_cdf(axis, maximum_planar_angle):
-    """Return a random vector uniformly distributed on a spherical
-cap. The random planar angle is generated using inverse transform
-sampling."""
-    return random_on_disk(axis, random_planar_angle_cdf(maximum_planar_angle, axis.size))
-
-def random_vector_on_spherical_cap_pdf(axis, maximum_planar_angle):
+def random_on_cap(axis, maximum_planar_angle):
     """Return a random vector uniformly distributed on a spherical
 cap. The random planar angle is generated using rejection sampling.
 
-This function is more numerically stable than
-random_vector_on_spherical_cap_cdf for large dimensions and small
-angles.
-
     """
     return random_on_disk(axis, random_planar_angle_pdf(maximum_planar_angle, axis.size))