Source code for torchdrug.layers.distribution
import math
from collections.abc import Sequence
import torch
from torch import nn
[docs]class IndependentGaussian(nn.Module):
"""
Independent Gaussian distribution.
Parameters:
mu (Tensor): mean of shape :math:`(N,)`
sigma2 (Tensor): variance of shape :math:`(N,)`
learnable (bool, optional): learnable parameters or not
"""
def __init__(self, mu, sigma2, learnable=False):
super(IndependentGaussian, self).__init__()
if learnable:
self.mu = nn.Parameter(torch.as_tensor(mu))
self.sigma2 = nn.Parameter(torch.as_tensor(sigma2))
else:
self.register_buffer("mu", torch.as_tensor(mu))
self.register_buffer("sigma2", torch.as_tensor(sigma2))
self.dim = len(mu)
[docs] def forward(self, input):
"""
Compute the likelihood of input data.
Parameters:
input (Tensor): input data of shape :math:`(..., N)`
"""
log_likelihood = -0.5 * (math.log(2 * math.pi) + self.sigma2.log() + (input - self.mu) ** 2 / self.sigma2)
return log_likelihood
[docs] def sample(self, *size):
"""
Draw samples from the distribution.
Parameters:
size (tuple of int): shape of the samples
"""
if len(size) == 1 and isinstance(size[0], Sequence):
size = size[0]
size = list(size) + [self.dim]
sample = torch.randn(size, device=self.mu.device) * self.sigma2.sqrt() + self.mu
return sample