{-# LANGUAGE TypeFamilies #-}
--- Imports ---
-- Goal --
import Goal.Core
import Goal.Geometry
import Goal.Probability
--- Program ---
-- Globals --
vr = 1
mn = -4
mx = 4
nkrns = 10
mus = range mn mx nkrns
sps = [ fromList Normal [mu,vr] | mu <- mus]
gn1 = 2
gn2 = 4
trns1 = modulateTransducerGain gn1 $ buildNormalTransducer sps
trns2 = modulateTransducerGain gn2 $ buildNormalTransducer sps
x0 = 0
stps = 2000
pltrng = range mn mx stps
laxprms = LinearAxisParams (show . round) 2 2
iaxprms = LinearAxisParams show 3 3
xaxprms = LinearAxisParams (show . round) 5 5
-- Functions --
-- Main --
main = do
rs1 <- runWithSystemRandom . generate $ conditionalLatentDistribution trns1 x0
rs2 <- runWithSystemRandom . generate $ conditionalLatentDistribution trns2 x0
let tclyt = execEC $ do
layout_y_axis . laxis_generate .= scaledAxis laxprms (0,1.5)
layout_x_axis . laxis_generate .= autoScaledAxis xaxprms
--layout_y_axis . laxis_title .= "Activation"
layout_y_axis . laxis_override .= axisGridHide
--layout_x_axis . laxis_title .= "Stimulus"
layout_x_axis . laxis_override .= axisGridHide
plot . liftEC $ do
--plot_lines_title .= "Tuning Curves"
plot_lines_style .= solidLine 2 (opaque black)
plot_lines_values .= ( zip pltrng <$> transpose
(listCoordinates . (gn1 />) . potentialMapping <$> conditionalLatentDistributions trns1 pltrng) )
let rsplytfun trns rs = execEC $ do
let posterior = conditionalObservableDistribution trns rs
scl = 10
--layoutlr_title .= ("μ=" ++ showFFloat (Just 3) mu "" ++ "; σ=" ++ showFFloat (Just 3) sd "")
layoutlr_left_axis . laxis_generate .= scaledAxis laxprms (0,2)
--layoutlr_left_axis . laxis_title .= "Probability Density"
layoutlr_left_axis . laxis_override .= axisGridHide
layoutlr_right_axis . laxis_generate .= scaledIntAxis iaxprms (0,round scl)
--layoutlr_right_axis . laxis_title .= "Response Count"
layoutlr_right_axis . laxis_override .= axisGridHide
--layoutlr_x_axis . laxis_title .= "Stimulus"
layoutlr_margin .= 10
layoutlr_x_axis . laxis_override .= axisGridHide
layoutlr_x_axis . laxis_generate .= autoScaledAxis xaxprms
layoutlr_plots
.= [ Left $ vlinePlot "" (solidLine 2 $ opaque black) x0 ]
plotRight . liftEC $ do
plot_points_style .= filledCircles 3 (opaque black)
plot_points_values .= zip mus rs
--plot_points_title .= "Response"
plotLeft . liftEC $ do
plot_lines_style .= solidLine 2 (opaque red)
plot_lines_values .= [zip pltrng $ density posterior <$> pltrng]
--plot_lines_title .= "Posterior Density"
let rsplyt1 = rsplytfun trns1 rs1
rsplyt2 = rsplytfun trns2 rs2
rsplyt3 = rsplytfun trns2 (zipWith (+) rs1 rs2)
let rnbl = toRenderable . weights (1,1)
$ tval (StackedLayouts [StackedLayout tclyt, StackedLayoutLR rsplyt2] True)
.|. tval (StackedLayouts [StackedLayoutLR rsplyt1, StackedLayoutLR rsplyt3] True)
void $ renderableToAspectWindow False 1200 800 rnbl
--void $ renderableToFile (FileOptions (600,300) PDF) "population-code.pdf" rnbl