Source code for bayesflow.adapters.transforms.log
import keras.ops as ops
from bayesflow.utils.serialization import serializable, serialize
from bayesflow.types import Tensor
from .elementwise_transform import ElementwiseTransform
[docs]
@serializable("bayesflow.adapters")
class Log(ElementwiseTransform):
"""Log transforms a variable.
Parameters
----------
p1 : boolean
Add 1 to the input before taking the logarithm?
Examples
--------
>>> adapter = bf.Adapter().log(["x"])
"""
def __init__(self, *, p1: bool = False):
super().__init__()
self.p1 = p1
[docs]
def forward(self, data: Tensor, **kwargs) -> Tensor:
if self.p1:
return ops.log1p(data)
else:
return ops.log(data)
[docs]
def inverse(self, data: Tensor, **kwargs) -> Tensor:
if self.p1:
return ops.expm1(data)
else:
return ops.exp(data)
[docs]
def get_config(self) -> dict:
return serialize({"p1": self.p1})
[docs]
def log_det_jac(self, data: Tensor, inverse: bool = False, **kwargs) -> Tensor:
if self.p1:
ldj = -ops.log1p(data)
else:
ldj = -ops.log(data)
if inverse:
ldj = -ldj
return self._sum_except_batch(ldj)