{-# OPTIONS_GHC -fplugin=GHC.TypeLits.KnownNat.Solver -fplugin=GHC.TypeLits.Normalise -fconstraint-solver-iterations=10 #-}
{-# LANGUAGE UndecidableInstances #-}

-- | A few general definitions for Graphical Models.
module Goal.Graphical.Models
    ( Observation
    , Observations
    -- ** Hierarchical Models
    , ObservablyContinuous ( logObservableDensities, observableDensities )
    , logObservableDensity
    , observableDensity
    ) where

--- Imports ---


-- Package --

import Goal.Geometry

--- Latent Variable Class ---

-- | An observation from a latent variable model.
type family Observation f

-- | A list of observations.
type Observations f = [Observation f]

-- | Probability densities over observations in a latent variable model.
class ObservablyContinuous c f where
    logObservableDensities :: c # f -> Observations f -> [Double]
    logObservableDensities c # f
p = (Observation f -> Double) -> Observations f -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map ((c # f) -> Observation f -> Double
forall c f.
ObservablyContinuous c f =>
(c # f) -> Observation f -> Double
logObservableDensity c # f
p)

    observableDensities :: c # f -> Observations f -> [Double]
    observableDensities c # f
p = (Observation f -> Double) -> Observations f -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> Double
forall a. Floating a => a -> a
exp (Double -> Double)
-> (Observation f -> Double) -> Observation f -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (c # f) -> Observation f -> Double
forall c f.
ObservablyContinuous c f =>
(c # f) -> Observation f -> Double
logObservableDensity c # f
p)


logObservableDensity :: ObservablyContinuous c f => c # f -> Observation f -> Double
logObservableDensity :: (c # f) -> Observation f -> Double
logObservableDensity c # f
p = [Double] -> Double
forall a. [a] -> a
head ([Double] -> Double)
-> (Observation f -> [Double]) -> Observation f -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (c # f) -> Observations f -> [Double]
forall c f.
ObservablyContinuous c f =>
(c # f) -> Observations f -> [Double]
logObservableDensities c # f
p (Observations f -> [Double])
-> (Observation f -> Observations f) -> Observation f -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Observation f -> Observations f -> Observations f
forall a. a -> [a] -> [a]
:[])


observableDensity :: ObservablyContinuous c f => c # f -> Observation f -> Double
observableDensity :: (c # f) -> Observation f -> Double
observableDensity c # f
p = Double -> Double
forall a. Floating a => a -> a
exp (Double -> Double)
-> (Observation f -> Double) -> Observation f -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Double] -> Double
forall a. [a] -> a
head ([Double] -> Double)
-> (Observation f -> [Double]) -> Observation f -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (c # f) -> Observations f -> [Double]
forall c f.
ObservablyContinuous c f =>
(c # f) -> Observations f -> [Double]
logObservableDensities c # f
p (Observations f -> [Double])
-> (Observation f -> Observations f) -> Observation f -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Observation f -> Observations f -> Observations f
forall a. a -> [a] -> [a]
:[])