Source code for infomeasure.estimators.utils.unit_ball_volume

"""Helper function for the unit ball volume."""

from numpy import pi
from scipy.special import gamma


[docs] def unit_ball_volume(d, r=1, p=2): r"""Calculate the volume of the d-dimensional ball with radius r in :math:`L^p` norm. .. math:: V_d = \begin{cases} 2r & \text{if } d = 1 \text{ and } p = 2, \\ \frac{4\pi r^3}{3} & \text{if } d = 3 \text{ and } p = 2, \\ (2r)^d & \text{if } p = \infty, \\ \frac{(\pi r^2)^{d/2}}{\Gamma(1 + d/2)} & \text{if } p = 2, \\ \frac{(2r)^d \Gamma(1 + \frac{1}{p})^d}{\Gamma(1 + \frac{d}{p})} & \text{otherwise}. \end{cases} Parameters ---------- d : int The dimensionality of the space. p : float The :math:`L^p` norm. r : float, optional The radius of the ball (default is 1). Returns ------- float The volume of the d-dimensional ball with radius r in :math:`L^p` norm. """ if p == float("inf"): return (2 * r) ** d elif p == 2: if d == 1: return 2 * r if d == 2: return pi * r**2 elif d == 3: return (4 / 3) * pi * r**3 else: return (pi ** (d / 2) * r**d) / gamma(1 + d / 2) else: return ((2 * r) ** d * gamma(1 + 1 / p) ** d) / gamma(1 + d / p)