The scale term is applied without necessarily materializing constituent
matrices, i.e., the matmul is matrix-free when possible.
Examples
# Y = X
b = Affine()
# Y = X + shift
b = Affine(shift=[1., 2, 3])
# Y = 2 * I @ X.T + shift
b = Affine(shift=[1., 2, 3],
scale_identity_multiplier=2.)
# Y = tf.linalg.tensor_diag(d1) @ X.T + shift
b = Affine(shift=[1., 2, 3],
scale_diag=[-1., 2, 1]) # Implicitly 3x3.
# Y = (I + v * v.T) @ X.T + shift
b = Affine(shift=[1., 2, 3],
scale_perturb_factor=[[1., 0],
[0, 1],
[1, 1]])
# Y = (diag(d1) + v * diag(d2) * v.T) @ X.T + shift
b = Affine(shift=[1., 2, 3],
scale_diag=[1., 3, 3], # Implicitly 3x3.
scale_perturb_diag=[2., 1], # Implicitly 2x2.
scale_perturb_factor=[[1., 0],
[0, 1],
[1, 1]])
Args
shift
Floating-point Tensor. If this is set to None, no shift is
applied.
scale_identity_multiplier
floating point rank 0 Tensor representing a
scaling done to the identity matrix.
When scale_identity_multiplier = scale_diag = scale_tril = None then
scale += IdentityMatrix. Otherwise no scaled-identity-matrix is added
to scale.
scale_diag
Floating-point Tensor representing the diagonal matrix.
scale_diag has shape [N1, N2, ... k], which represents a k x k
diagonal matrix.
When None no diagonal term is added to scale.
scale_tril
Floating-point Tensor representing the diagonal matrix.
scale_diag has shape [N1, N2, ... k, k], which represents a k x k
lower triangular matrix.
When None no scale_tril term is added to scale.
The upper triangular elements above the diagonal are ignored.
scale_perturb_factor
Floating-point Tensor representing factor matrix
with last two dimensions of shape (k, r). When None, no rank-r
update is added to scale.
scale_perturb_diag
Floating-point Tensor representing the diagonal
matrix. scale_perturb_diag has shape [N1, N2, ... r], which
represents an r x r diagonal matrix. When None low rank updates will
take the form scale_perturb_factor * scale_perturb_factor.T.
validate_args
Python bool indicating whether arguments should be
checked for correctness.
name
Python str name given to ops managed by this object.
Raises
ValueError
if perturb_diag is specified but not perturb_factor.
TypeError
if shift has different dtype from scale arguments.
Attributes
dtype
dtype of Tensors transformable by this distribution.
forward_min_event_ndims
Returns the minimal number of dimensions bijector.forward operates on.
graph_parents
Returns this Bijector's graph_parents as a Python list.
inverse_min_event_ndims
Returns the minimal number of dimensions bijector.inverse operates on.
is_constant_jacobian
Returns true iff the Jacobian matrix is not a function of x.
name
Returns the string name of this Bijector.
scale
The scaleLinearOperator in Y = scale @ X + shift.
shift
The shiftTensor in Y = scale @ X + shift.
validate_args
Returns True if Tensor arguments will be validated.
Tensor. The input to the "forward" Jacobian determinant evaluation.
event_ndims
Number of dimensions in the probabilistic events being
transformed. Must be greater than or equal to
self.forward_min_event_ndims. The result is summed over the final
dimensions to produce a scalar Jacobian determinant for each event,
i.e. it has shape x.shape.ndims - event_ndims dimensions.
name
The name to give this op.
Returns
Tensor, if this bijector is injective.
If not injective this is not implemented.
Raises
TypeError
if self.dtype is specified and y.dtype is not
self.dtype.
NotImplementedError
if neither _forward_log_det_jacobian
nor {_inverse, _inverse_log_det_jacobian} are implemented, or
this is a non-injective bijector.
Note that forward_log_det_jacobian is the negative of this function,
evaluated at g^{-1}(y).
Args
y
Tensor. The input to the "inverse" Jacobian determinant evaluation.
event_ndims
Number of dimensions in the probabilistic events being
transformed. Must be greater than or equal to
self.inverse_min_event_ndims. The result is summed over the final
dimensions to produce a scalar Jacobian determinant for each event,
i.e. it has shape y.shape.ndims - event_ndims dimensions.
name
The name to give this op.
Returns
Tensor, if this bijector is injective.
If not injective, returns the tuple of local log det
Jacobians, log(det(Dg_i^{-1}(y))), where g_i is the restriction
of g to the ith partition Di.
Raises
TypeError
if self.dtype is specified and y.dtype is not
self.dtype.