{-# OPTIONS_GHC -fplugin=GHC.TypeLits.KnownNat.Solver -fplugin=GHC.TypeLits.Normalise -fconstraint-solver-iterations=10 #-}
{-# LANGUAGE UndecidableInstances #-}
module Goal.Graphical.Models
( Observation
, Observations
, ObservablyContinuous ( logObservableDensities, observableDensities )
, logObservableDensity
, observableDensity
) where
import Goal.Geometry
type family Observation f
type Observations f = [Observation f]
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]
:[])