module HLearn.Models.Distributions.Multivariate.Internal.Marginalization
where
import GHC.TypeLits
import HLearn.Algebra
import HLearn.Models.Distributions.Common
import HLearn.Models.Distributions.Multivariate.Internal.TypeLens
class (Marginalize' (TypeLensIndex index) dist, TypeLens index) => Marginalize index dist where
type Margin index dist
getMargin :: index -> dist -> Margin index dist
type MarginalizeOut index dist
marginalizeOut :: index -> dist -> MarginalizeOut index dist
condition :: index -> Datapoint (Margin' (TypeLensIndex index) dist) -> dist -> MarginalizeOut' (TypeLensIndex index) dist
instance
( Marginalize' (TypeLensIndex index) dist
, TypeLens index
) => Marginalize index dist
where
type Margin index dist = Margin' (TypeLensIndex index) dist
getMargin _ dist = getMargin' (undefined :: (TypeLensIndex index)) dist
type MarginalizeOut index dist = MarginalizeOut' (TypeLensIndex index) dist
marginalizeOut _ dist = marginalizeOut' (undefined :: (TypeLensIndex index)) dist
condition _ dp dist = condition' (undefined :: (TypeLensIndex index)) dist dp
class Marginalize' index dist where
type Margin' index dist
getMargin' :: index -> dist -> Margin' index dist
type MarginalizeOut' index dist
marginalizeOut' :: index -> dist -> MarginalizeOut' index dist
condition' :: index -> dist -> Datapoint (Margin' index dist) -> MarginalizeOut' index dist