Source code for bayesflow.links.positive_definite
import keras
from keras.saving import register_keras_serializable as serializable
from bayesflow.types import Tensor
from bayesflow.utils import layer_kwargs, fill_triangular_matrix
[docs]
@serializable(package="bayesflow.links")
class PositiveDefinite(keras.Layer):
"""Activation function to link from flat elements of a lower triangular matrix to a positive definite matrix."""
def __init__(self, **kwargs):
super().__init__(**layer_kwargs(kwargs))
self.built = True
[docs]
def call(self, inputs: Tensor) -> Tensor:
# Build cholesky factor from inputs
L = fill_triangular_matrix(inputs, positive_diag=True)
# calculate positive definite matrix from cholesky factors
psd = keras.ops.matmul(
L,
keras.ops.moveaxis(L, -2, -1), # L transposed
)
return psd
[docs]
def compute_output_shape(self, input_shape):
m = input_shape[-1]
n = int((0.25 + 2.0 * m) ** 0.5 - 0.5)
return input_shape[:-1] + (n, n)