-
Compute integral transforms:
$$G(y) = \int_0^\infty F(x) K(xy) \frac{dx}x;$$ -
Inverse transform without analytic inversion;
-
Integral kernels as derivatives:
$$G(y) = \int_0^\infty F(x) K'(xy) \frac{dx}x;$$ -
Transform input array along any axis of
ndarray
; -
Output the matrix form;
-
1-to-n transform for multiple kernels (TODO):
$$G(y_1, \cdots, y_n) = \int_0^\infty \frac{dx}x F(x) \prod_{a=1}^n K_a(xy_a);$$ -
Easily extensible for other kernels;
-
Support NumPy and JAX.
mcfit
computes integral transforms of the form
where
where
mcfit
implements the FFTLog algorithm.
The idea is to take advantage of the convolution theorem in
pip install mcfit
See docstring of mcfit.mcfit
, which also applies to other
subclasses of transformations.
Also see doc/mcfit.tex
for more explanations.
One can perform the following pair of Hankel transforms
easily as follows
def F_fun(x):
return 1 / (1 + x*x)**1.5
def G_fun(y):
return numpy.exp(-y)
x = numpy.logspace(-3, 3, num=60, endpoint=False)
F = F_fun(x)
H = mcfit.Hankel(x, lowring=True)
y, G = H(F, extrap=True)
numpy.allclose(G, G_fun(y), rtol=1e-8, atol=1e-8)
y = numpy.logspace(-4, 2, num=60, endpoint=False)
G = G_fun(y)
H_inv = mcfit.Hankel(y, lowring=True)
x, F = H_inv(G, extrap=True)
numpy.allclose(F, F_fun(x), rtol=1e-10, atol=1e-10)
To use JAX instead of the default numpy backend:
H = mcfit.Hankel(x, lowring=True, backend='jax') # do not jit
H_jit = jax.jit(functools.partial(H, extrap=True))
y, G = H_jit(F)
Most of the time one does not need to apply jit
or other JAX
transforms to the constructor.
By forbidding this, mcfit
allows the constructor to use any special
function implementations available in Python with the 'jax'
backend.
Cosmologists often need to transform a power spectrum to its correlation function
k, P = numpy.loadtxt('P.txt', unpack=True)
r, xi = mcfit.P2xi(k)(P)
and the other way around
r, xi = numpy.loadtxt('xi.txt', unpack=True)
k, P = mcfit.xi2P(r)(xi)
Similarly for the quadrupoles
k, P2 = numpy.loadtxt('P2.txt', unpack=True)
r, xi2 = mcfit.P2xi(k, l=2)(P2)
Also useful to cosmologists is the tool below that computes the variance
of the overdensity field as a function of radius, from which
R, var = mcfit.TophatVar(k, lowring=True)(P, extrap=True)
varR = scipy.interpolate.CubicSpline(R, var)
sigma8 = numpy.sqrt(varR(8))