Source code for bayesflow.adapters.transforms.scale
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 Scale(ElementwiseTransform):
def __init__(self, scale: float | Tensor):
self.scale = scale
[docs]
def get_config(self) -> dict:
return serialize({"scale": self.scale})
[docs]
def forward(self, data: Tensor, **kwargs) -> Tensor:
scale = ops.convert_to_tensor(self.scale, dtype=ops.dtype(data))
return ops.multiply(data, scale)
[docs]
def inverse(self, data: Tensor, **kwargs) -> Tensor:
scale = ops.convert_to_tensor(self.scale, dtype=ops.dtype(data))
return ops.divide(data, scale)
[docs]
def log_det_jac(self, data: Tensor, inverse: bool = False, **kwargs) -> Tensor:
scale = ops.convert_to_tensor(self.scale, dtype=ops.dtype(data))
ldj = ops.log(ops.abs(scale))
ldj = ops.broadcast_to(ldj, ops.shape(data))
if inverse:
ldj = -ldj
return self._sum_except_batch(ldj)