--- Imports ---
-- Goal --
import Goal.Core
import Goal.Geometry
import Goal.Probability
import qualified Data.Vector.Storable as C
--- Globals ---
nsmps = 10
tru = chart Standard $ fromList (MultivariateNormal 2) [0,0.5,1,0.5,0,1]
rng = (-4,4,400)
niso = 10
axprms = LinearAxisParams (show . round) 5 5
vectorToPair xs = (xs C.! 0, xs C.! 1)
pairToVector (x,y) = C.fromList [x,y]
--- Main ---
main :: IO ()
main = do
smps <- runWithSystemRandom . replicateM nsmps $ generate tru
let mlenrm = chart Standard $ mle (MultivariateNormal 2) smps
--efnrm = chart Natural $ mle (MultivariateNormal 2) smps
truf x y = density tru $ pairToVector (x,y)
mlef x y = density mlenrm $ pairToVector (x,y)
--eff x y = density efnrm $ pairToVector (x,y)
trucntrs = contours rng rng niso truf
mlecntrs = contours rng rng niso mlef
--efcntrs = contours rng rng niso eff
truclrs = rgbaGradient (1,0,0,0.5) (1,0,0,1) niso
mleclrs = rgbaGradient (0,0,1,0.5) (0,0,1,1) niso
--efclrs = rgbaGradient (0,1,0,0.5) (0,1,0,1) niso
bls = True : repeat False
rnbl = toRenderable . execEC $ do
--layout_title .= ("Multivariate Normal" ++ "; KLD: " ++ showFFloat (Just 3) (klDivergence mlenrm tru) "")
layout_x_axis . laxis_generate .= scaledAxis axprms (-4,4)
layout_x_axis . laxis_override .= axisGridHide
layout_x_axis . laxis_title .= "x"
layout_y_axis . laxis_generate .= scaledAxis axprms (-4,4)
layout_y_axis . laxis_override .= axisGridHide
layout_y_axis . laxis_title .= "y"
sequence_ $ do
((_,cntr),clr,bl) <- zip3 trucntrs truclrs bls
return . plot . liftEC $ do
--when bl $ plot_lines_title .= "True"
plot_lines_style .= solidLine 3 clr
plot_lines_values .= cntr
sequence_ $ do
((_,cntr),clr,bl) <- zip3 mlecntrs mleclrs bls
return . plot . liftEC $ do
--when bl $ plot_lines_title .= "Standard MLE"
plot_lines_style .= solidLine 3 clr
plot_lines_values .= cntr
plot . liftEC $ do
--plot_points_title .= "Samples"
plot_points_values .= map vectorToPair smps
plot_points_style .= filledCircles 4 (opaque black)
{-
sequence $ do
((_,cntr),clr,bl) <- zip3 efcntrs efclrs bls
return . plot . liftEC $ do
when bl $ plot_lines_title .= "Exponential Family MLE"
plot_lines_style .= solidLine 3 clr
plot_lines_values .= cntr
-}
--renderableToAspectWindow False 800 600 rnbl
void $ renderableToFile (FileOptions (250,250) PDF) "multivariate.pdf" rnbl