Source code for pytomography.callbacks.likelihood

from __future__ import annotations
from .callback import Callback
import torch
from pytomography.projectors import SystemMatrix
from pytomography.priors import Prior

[docs]class LogLikelihoodCallback(Callback): r"""Computes the log-liklihood :math:`\sum \left(g\log(Hf) - Hf - \beta V(f) \right)` after a given iteration. Args: projections (torch.tensor): Data corresponding to measured projections system_matrix (SystemMatrix): System matrix of imaging system. prior (Prior, optional): Prior used in Bayesian algorithm. Defaults to None. """ def __init__( self, projections: torch.tensor, system_matrix: SystemMatrix, prior: Prior | None = None ) -> None: self.projections = projections self.system_matrix = system_matrix self.liklihoods = [] self.liklihoods_prior_component = [] self.prior = prior
[docs] def run(self, object: torch.tensor, n_iter: int): """Method used to compute the log liklihood Args: object (torch.tensor): Object on which the liklihood is computed n_iter (int): Iteration number """ projection_estimate = self.system_matrix.forward(object) liklihood = self.projections*torch.log(projection_estimate) - projection_estimate liklihood[self.projections<=0] = -projection_estimate[self.projections<=0] # Sum components of each voxel liklihood = liklihood.sum().item() # Add prior component if self.prior is not None: self.prior.set_object(object) prior_component = -self.prior.compute_prior() self.liklihoods_prior_component.append(prior_component) liklihood -= self.prior.compute_prior() self.liklihoods.append(liklihood)