{-# LANGUAGE OverloadedStrings #-}
module Mcmc.Chain.Link
( Link (..),
)
where
import Data.Aeson
import Data.Aeson.Types
import Numeric.Log
data Link a = Link
{
Link a -> a
state :: a,
Link a -> Log Double
prior :: Log Double,
Link a -> Log Double
likelihood :: Log Double
}
deriving (Link a -> Link a -> Bool
(Link a -> Link a -> Bool)
-> (Link a -> Link a -> Bool) -> Eq (Link a)
forall a. Eq a => Link a -> Link a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Link a -> Link a -> Bool
$c/= :: forall a. Eq a => Link a -> Link a -> Bool
== :: Link a -> Link a -> Bool
$c== :: forall a. Eq a => Link a -> Link a -> Bool
Eq, Eq (Link a)
Eq (Link a)
-> (Link a -> Link a -> Ordering)
-> (Link a -> Link a -> Bool)
-> (Link a -> Link a -> Bool)
-> (Link a -> Link a -> Bool)
-> (Link a -> Link a -> Bool)
-> (Link a -> Link a -> Link a)
-> (Link a -> Link a -> Link a)
-> Ord (Link a)
Link a -> Link a -> Bool
Link a -> Link a -> Ordering
Link a -> Link a -> Link a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Link a)
forall a. Ord a => Link a -> Link a -> Bool
forall a. Ord a => Link a -> Link a -> Ordering
forall a. Ord a => Link a -> Link a -> Link a
min :: Link a -> Link a -> Link a
$cmin :: forall a. Ord a => Link a -> Link a -> Link a
max :: Link a -> Link a -> Link a
$cmax :: forall a. Ord a => Link a -> Link a -> Link a
>= :: Link a -> Link a -> Bool
$c>= :: forall a. Ord a => Link a -> Link a -> Bool
> :: Link a -> Link a -> Bool
$c> :: forall a. Ord a => Link a -> Link a -> Bool
<= :: Link a -> Link a -> Bool
$c<= :: forall a. Ord a => Link a -> Link a -> Bool
< :: Link a -> Link a -> Bool
$c< :: forall a. Ord a => Link a -> Link a -> Bool
compare :: Link a -> Link a -> Ordering
$ccompare :: forall a. Ord a => Link a -> Link a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (Link a)
Ord, Int -> Link a -> ShowS
[Link a] -> ShowS
Link a -> String
(Int -> Link a -> ShowS)
-> (Link a -> String) -> ([Link a] -> ShowS) -> Show (Link a)
forall a. Show a => Int -> Link a -> ShowS
forall a. Show a => [Link a] -> ShowS
forall a. Show a => Link a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Link a] -> ShowS
$cshowList :: forall a. Show a => [Link a] -> ShowS
show :: Link a -> String
$cshow :: forall a. Show a => Link a -> String
showsPrec :: Int -> Link a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Link a -> ShowS
Show, ReadPrec [Link a]
ReadPrec (Link a)
Int -> ReadS (Link a)
ReadS [Link a]
(Int -> ReadS (Link a))
-> ReadS [Link a]
-> ReadPrec (Link a)
-> ReadPrec [Link a]
-> Read (Link a)
forall a. Read a => ReadPrec [Link a]
forall a. Read a => ReadPrec (Link a)
forall a. Read a => Int -> ReadS (Link a)
forall a. Read a => ReadS [Link a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Link a]
$creadListPrec :: forall a. Read a => ReadPrec [Link a]
readPrec :: ReadPrec (Link a)
$creadPrec :: forall a. Read a => ReadPrec (Link a)
readList :: ReadS [Link a]
$creadList :: forall a. Read a => ReadS [Link a]
readsPrec :: Int -> ReadS (Link a)
$creadsPrec :: forall a. Read a => Int -> ReadS (Link a)
Read)
instance ToJSON a => ToJSON (Link a) where
toJSON :: Link a -> Value
toJSON (Link a
x (Exp Double
p) (Exp Double
l)) = [Pair] -> Value
object [Text
"s" Text -> a -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= a
x, Text
"p" Text -> Double -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Double
p, Text
"l" Text -> Double -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Double
l]
toEncoding :: Link a -> Encoding
toEncoding (Link a
x (Exp Double
p) (Exp Double
l)) = Series -> Encoding
pairs (Text
"s" Text -> a -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= a
x Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
<> Text
"p" Text -> Double -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Double
p Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
<> Text
"l" Text -> Double -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Double
l)
link :: FromJSON a => Object -> Parser (Link a)
link :: Object -> Parser (Link a)
link Object
v = do
a
s <- Object
v Object -> Text -> Parser a
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"s"
Double
p <- Object
v Object -> Text -> Parser Double
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"p"
Double
l <- Object
v Object -> Text -> Parser Double
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"l"
Link a -> Parser (Link a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Link a -> Parser (Link a)) -> Link a -> Parser (Link a)
forall a b. (a -> b) -> a -> b
$ a -> Log Double -> Log Double -> Link a
forall a. a -> Log Double -> Log Double -> Link a
Link a
s (Double -> Log Double
forall a. a -> Log a
Exp Double
p) (Double -> Log Double
forall a. a -> Log a
Exp Double
l)
instance FromJSON a => FromJSON (Link a) where
parseJSON :: Value -> Parser (Link a)
parseJSON = String -> (Object -> Parser (Link a)) -> Value -> Parser (Link a)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Link" Object -> Parser (Link a)
forall a. FromJSON a => Object -> Parser (Link a)
link