# Source code for pyklip.covars

import numpy as np

def _matern32(x, y, sigmas, corr_len):
"""
Generates a Matern (nu=3/2) covariance matrix that assumes x/y has the same correlation length

C_ij = \sigma_i \sigma_j (1 + sqrt(3) r_ij / l) exp(-sqrt(3) r_ij / l)

Args:
x (np.array): 1-D array of x coordinates
y (np.array): 1-D array of y coordinates
sigmas (np.array): 1-D array of errors on each pixel
corr_len (float): correlation length of the Matern function

Returns:
cov (np.array): 2-D covariance matrix parameterized by the Matern function
"""
r = np.sqrt((x[:, None] - x[None, :])**2 + (y[:, None] - y[None, :])**2)
arg = np.sqrt(3) * r / corr_len
cov = sigmas[:, None] * sigmas[None, :] * (1+arg) * np.exp(-arg)
return cov

[docs]
def matern32(x, y, sigmas, corr_len):
"""
Generates a Matern (nu=3/2) covariance matrix that assumes x/y has the same correlation length

C_ij = \sigma_i \sigma_j (1 + sqrt(3) r_ij / l) exp(-sqrt(3) r_ij / l)

Args:
x (np.array): 1-D array of x coordinates
y (np.array): 1-D array of y coordinates
sigmas (np.array): 1-D array of errors on each pixel
corr_len (float): correlation length of the Matern function

Returns:
cov (np.array): 2-D covariance matrix parameterized by the Matern function
"""
return _matern32(x, y, sigmas, corr_len)

def _sq_exp(x, y, sigmas, corr_len):
"""
Generates square exponential covariance matrix that assumes x/y has the same correlation length

C_ij = \sigma_i \sigma_j exp(-r_ij^2/[2 l^2])

Args:
x (np.array): 1-D array of x coordinates
y (np.array): 1-D array of y coordinates
sigmas (np.array): 1-D array of errors on each pixel
corr_len (float): correlation length (i.e. standard deviation of Gaussian)

Returns:
cov (np.array): 2-D covariance matrix parameterized by the Matern function
"""
r = np.sqrt((x[:, None] - x[None, :])**2 + (y[:, None] - y[None, :])**2)
arg = r**2 / (2 * corr_len**2)
cov = sigmas[:, None] * sigmas[None, :] * np.exp(-arg)
return cov

[docs]
def sq_exp(x, y, sigmas, corr_len):
"""
Generates square exponential covariance matrix that assumes x/y has the same correlation length

C_ij = \sigma_i \sigma_j exp(-r_ij^2/[2 l^2])

Args:
x (np.array): 1-D array of x coordinates
y (np.array): 1-D array of y coordinates
sigmas (np.array): 1-D array of errors on each pixel
corr_len (float): correlation length (i.e. standard deviation of Gaussian)
mode (string): either "numpy", "cython", or None, specifying the implementation of the kernel.

Returns:
cov (np.array): 2-D covariance matrix parameterized by the Matern function
"""
return _sq_exp(x, y, sigmas, corr_len)

[docs]
def delta(x, y, sigmas, *args):
"""
Generates a diagonal covariance matrix

C_ij = \sigma_i \sigma_j delta_{ij}

Args:
x (np.array): 1-D array of x coordinates
y (np.array): 1-D array of y coordinates
sigmas (np.array): 1-D array of errors on each pixel
"""
return np.diag(sigmas**2)