packages feed

goal-simulation-0.1: scripts/pendulum/filter-simulation.hs



-- Goal --

import Pendulum

import Goal.Core
import Goal.Geometry
import Goal.Probability
import Goal.Simulation

-- Qualified --

import qualified System.Directory as D


--- Program ---


-- Globals --

xaxprms = LinearAxisParams (show . round) 5 5
yaxprms = LinearAxisParams (show . round) 5 5

-- Functions --

coordinateLayout n rng (xs,ns,zs) = execEC $ do

    layout_x_axis . laxis_override .= axisGridHide
    layout_y_axis . laxis_generate .= scaledAxis yaxprms rng
    layout_y_axis . laxis_override .= axisGridHide
    layout_x_axis . laxis_generate .= autoScaledAxis xaxprms

    plot . liftEC $ do

        plot_lines_values .= [ zip ts $ coordinate n <$> xs ]
        plot_lines_style .= solidLine 2 (opaque black)

    plot . liftEC $ do

        plot_points_style .= filledCircles 2 (opaque black)
        plot_points_values .=
            zip ts (coordinate (2*n) . potentialMapping <$> (harmoniumTranspose trns >$> ns))

    plot . liftEC $ do

        plot_lines_style .= solidLine 2 (opaque red)
        plot_lines_values .=
            [zip ts $ coordinate (2*n) . potentialMapping <$> (harmoniumTranspose trns >$> zs)]


-- Main --

main :: IO ()
main = do

    bl <- D.doesFileExist flnm
    c0s <- if bl
              then read <$> readFile flnm
              else error "Script requires a 'ppc-dynamics' file"

    let nnp = fromList nn c0s
        qdq0 = fromList (Bundle pndl) [1,0]

    xnzs <- runWithSystemRandom $ generatePath nstpssml nnp qdq0

    let (xs,ns,zs) = unzip3 $ splitTriple <$> xnzs
        (lns,lzs) = unzip $ beliefNegativeLogLikelihoods trns <$> xnzs

        gnlyt = execEC $ do

            layout_x_axis . laxis_override .= axisGridHide
            layout_y_axis . laxis_generate .= scaledAxis xaxprms (0,100)
            layout_y_axis . laxis_override .= axisGridHide
            layout_x_axis . laxis_generate .= autoScaledAxis xaxprms

            plot . liftEC $ do
                plot_points_values .= zip ts (sum . listCoordinates <$> ns)
                plot_points_style .= filledCircles 2 (opaque black)

            plot . liftEC $ do
                plot_lines_values .= [zip ts $ sum . listCoordinates <$> zs]
                plot_lines_style .= solidLine 2 (opaque red)

{-
            plot . liftEC $ do
                plot_lines_values .= [zip ts $ sum . listCoordinates <$> zipWith (<->) zs ns]
                plot_lines_style .= solidLine 2 (opaque blue)
                -}

        qlyt = coordinateLayout 0 (-2,2) (xs,ns,zs)
        dqlyt = coordinateLayout 1 (-4,4) (xs,ns,zs)

        rnbl = toRenderable $ StackedLayouts [StackedLayout qlyt, StackedLayout dqlyt, StackedLayout gnlyt] True

    putStrLn "Average Observation Likelihood:"
    print $ mean lns
    putStrLn "Average Belief Likelihood:"
    print $ mean lzs
    putStrLn "Average Observation Spike Count:"
    print . mean $ sum . listCoordinates <$> ns
    putStrLn "Average Belief Rate:"
    print . mean $ sum . listCoordinates <$> zs

    --void $ renderableToAspectWindow False 1200 1200 rnbl
    void $ renderableToFile (FileOptions (600,400) PDF) "simulation.pdf" rnbl