about summary refs log tree commit diff
path: root/src/samball
diff options
context:
space:
mode:
authorArun Isaac2021-03-26 12:35:06 +0530
committerArun Isaac2021-03-26 12:35:06 +0530
commit9d5bd7208a48a75786e3135e0f6edf5890a1d849 (patch)
treef522c80845de0c4f6367c38c7872cca23c8465e7 /src/samball
parentdc8551007b4625c46f02215ab97943a22a7b7014 (diff)
downloadsambal-9d5bd7208a48a75786e3135e0f6edf5890a1d849.tar.gz
sambal-9d5bd7208a48a75786e3135e0f6edf5890a1d849.tar.lz
sambal-9d5bd7208a48a75786e3135e0f6edf5890a1d849.zip
Rename to sambal.
* README.md: Rename samball to sambal.
* setup.cfg (name): Rename samball to sambal.
(description): Update description.
(url): Update URL.
* src/samball/samball.py: Rename to src/sambal/sambal.py. Replace
samball with sambal.
Diffstat (limited to 'src/samball')
-rw-r--r--src/samball/__init__.py0
-rw-r--r--src/samball/samball.py100
2 files changed, 0 insertions, 100 deletions
diff --git a/src/samball/__init__.py b/src/samball/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/src/samball/__init__.py
+++ /dev/null
diff --git a/src/samball/samball.py b/src/samball/samball.py
deleted file mode 100644
index e5d84ad..0000000
--- a/src/samball/samball.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# samball --- Sample n-dimensional balls
-# Copyright © 2021 Arun I <arunisaac@systemreboot.net>
-# Copyright © 2021 Murugesan Venkatapathi <murugesh@iisc.ac.in>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# 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.random import randn, random
-from numpy.linalg import norm
-from scipy.special import betainc, betaincinv
-
-def random_vector_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.
-    """
-    xn = x[-1]
-    axisn = axis[-1]
-    if axisn != 1:
-        b = norm(axis[:-1])
-        a = (dot(x, axis) - xn*axisn) / b
-        s = sqrt(1 - axisn**2)
-        x = x + (xn*s + a*(axisn - 1))/b * axis
-        x[-1] = x[-1] + xn*(axisn - 1) - a*s \
-            - 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
-    # underflowing.
-    box_height = (dim-2)*log(sin(min(maximum_planar_angle, pi/2)))
-    while True:
-        theta = maximum_planar_angle*random()
-        f = box_height + log(random())
-        if f < (dim-2)*log(sin(theta)):
-            return theta
-
-def random_vector_on_disk(axis, planar_angle):
-    """Return a random vector uniformly distributed on the periphery of a
-disk."""
-    dim = axis.size
-    x = empty(dim)
-    x[:-1] = sin(planar_angle) * random_vector_on_sphere(dim - 1)
-    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_vector_on_disk(axis, random_planar_angle_cdf(maximum_planar_angle, axis.size))
-
-def random_vector_on_spherical_cap_pdf(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_vector_on_disk(axis, random_planar_angle_pdf(maximum_planar_angle, axis.size))