mindspore.nn.LGamma

class mindspore.nn.LGamma[source]

Calculates LGamma using Lanczos’ approximation referring to “A Precision Approximation of the Gamma Function”. The algorithm is:

lgamma(z+1)=(log(2)+log(pi))2+(z+1/2)log(t(z))t(z)+A(z)t(z)=z+kLanczosGamma+1/2A(z)=kBaseLanczosCoeff+k=1nkLanczosCoefficients[i]z+k

However, if the input is less than 0.5 use Euler’s reflection formula:

lgamma(x)=log(pi)lgamma(1x)log(abs(sin(pix)))

And please note that

lgamma(+/inf)=+inf

Thus, the behaviour of LGamma follows:

  • when x > 0.5, return log(Gamma(x))

  • when x < 0.5 and is not an integer, return the real part of Log(Gamma(x)) where Log is the complex logarithm

  • when x is an integer less or equal to 0, return +inf

  • when x = +/- inf, return +inf

Inputs:
  • x (Tensor) - The input tensor. Only float16, float32 are supported.

Outputs:

Tensor, has the same shape and dtype as the x.

Raises

TypeError – If dtype of x is neither float16 nor float32.

Supported Platforms:

Ascend GPU

Examples

>>> x = Tensor(np.array([2, 3, 4]).astype(np.float32))
>>> op = nn.LGamma()
>>> output = op(x)
>>> print(output)
[3.5762787e-07 6.9314754e-01 1.7917603e+00]