#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Date : 2025-12-19
# Author : Lancelot PINCET
# GitHub : https://github.com/LancelotPincet
# Library : funcLP
# Module : Distribution
"""
Class defining the noise distribution in data.
"""
# %% Libraries
from corelp import prop, selfkwargs
from funclp import CudaReference
from abc import ABC, abstractmethod
import numpy as np
# %% Class
[docs]
class Distribution(ABC, CudaReference) :
'''
Class defining the noise distribution in data.
Parameters
----------
kwargs : dict
Attributes to change.
Attributes
----------
pdf : method
Probability Density Function for the given distribution
loglikelihood_reduced : method
Log-likelihood up to additive constants.
loglikelihood : method
Exact log-likelihood (with constants).
dloglikelihood : method
Derivative of log-likelihood w.r.t model parameter.
d2loglikelihood : method
Second derivative of log-likelihood (observed curvature).
fisher : method
Expected curvature (Fisher information).
'''
@prop()
def name(self) :
return self.__class__.__name__
def __init__(self, **kwargs) :
selfkwargs(self, kwargs)
@property
@abstractmethod
def default_attributes(self):
return ''
[docs]
@abstractmethod
def pdf(raw_data, model_data, weights=np.float32(1.), /, ignore=np.bool_(False)):
return np.float32(1.)
def __call__(self, *args, **kwargs) :
return self._pdf(*args, **kwargs)
[docs]
@abstractmethod
def loglikelihood_reduced(raw_data, model_data, weights=np.float32(1.), /, ignore=np.bool_(False)):
return np.float32(0.)
[docs]
@abstractmethod
def loglikelihood(raw_data, model_data, weights=np.float32(1.), /, ignore=np.bool_(False)):
return np.float32(0.)
[docs]
@abstractmethod
def dloglikelihood(raw_data, model_data, weights=np.float32(1.), /, ignore=np.bool_(False)):
return np.float32(0.)
[docs]
@abstractmethod
def d2loglikelihood(raw_data, model_data, weights=np.float32(1.), /, ignore=np.bool_(False)):
return np.float32(0.)
[docs]
@abstractmethod
def fisher(raw_data, model_data, weights=np.float32(1.), /, ignore=np.bool_(False)):
return np.float32(0.)
# %% Test function run
if __name__ == "__main__":
from corelp import test
test(__file__)