Source code for decode.simulation.noise_distributions
from abc import ABC, abstractmethod # abstract class
import torch
[docs]class NoiseDistribution(ABC):
"""
Abstract noise.
"""
def __init__(self):
super().__init__()
[docs] @abstractmethod
def forward(self, x: torch.Tensor) -> torch.Tensor:
"""
Samples the noise distribution based on the input x.
Args:
x: input
Returns:
noisy sample
"""
raise NotImplementedError
[docs]class ZeroNoise(NoiseDistribution):
"""
The No-Noise noise.
"""
def __init__(self):
super().__init__()
[docs] def forward(self, x):
return x
[docs]class Gamma(NoiseDistribution):
"""
Gamma distribution.
Attributes:
scale: 1 / rate of the Gamma distribution
"""
def __init__(self, scale: float):
"""
Args:
scale: 1 / rate of the Gamma distribution
"""
super().__init__()
self.scale = scale
[docs] def forward(self, x):
# disable validate_args because 0 is okay for sampling
return torch.distributions.gamma.Gamma(x, 1 / self.scale, validate_args=False).sample()
[docs]class Gaussian(NoiseDistribution):
"""
Gaussian distribution.
Attributes:
sigma (float, torch.Tensor): standard deviation fo the gaussian
"""
def __init__(self, sigma: (float, torch.Tensor)):
"""
Args:
sigma: standard deviation fo the gaussian
"""
super().__init__()
self.sigma = sigma
[docs] def forward(self, x):
return x + self.sigma * torch.randn_like(x)
[docs]class Poisson(NoiseDistribution):
"""
Poisson noise. 'Non-parametric' with respect initialisation since the only parameter (lambda) comes from the input in the forward method itself.
"""
def __init__(self):
super().__init__()
[docs] def forward(self, x):
# disable validate_args because 0 is okay for sampling
return torch.distributions.poisson.Poisson(x, validate_args=False).sample()