{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Stochaskell, version 0.1.0\n",
"Copyright (C) 2015-2020 David A Roberts\n",
"This program comes with ABSOLUTELY NO WARRANTY.\n",
"This is free software, and you are welcome to redistribute it\n",
"under certain conditions; see the LICENSE for details.\n",
"\n",
"Using installation directory at \n",
" /home/jovyan/stochaskell"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"{-# LANGUAGE FlexibleContexts, MonadComprehensions, NoImplicitPrelude, RebindableSyntax, TypeFamilies #-}\n",
"import Language.Stochaskell\n",
"stochaskell"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import IHaskell.Display"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"let v_0_0 = sin a :: R\n",
" v_0_1 = 4.2 + v_0_0 :: R\n",
" in v_0_1"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"let z = 4.2 + sin (symbol \"a\")\n",
"print z\n",
"svg <$> vizIR (return z)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import Language.Graphviz"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"/*\n",
"let v_0_0 = \n",
" [ let v_1_0 = 2 * i_1_1 :: Z\n",
" v_1_1 = 1 + v_1_0 :: Z\n",
" in v_1_1\n",
" | i_1_1 <- 1...n ] :: ZVec\n",
" v_0_1 = \n",
" [ let v_1_0 = i_1_1 - i_1_2 :: Z\n",
" v_1_1 = v_1_0 * v_1_0 :: Z\n",
" in v_1_1\n",
" | i_1_1 <- 1...n, i_1_2 <- 1...k ] :: ZMat\n",
" v_0_2 = getExternal x_ns_0_0 :: Array 1...n R\n",
" in do x_ns_0_0 <- \n",
" [ normal i_1_1 1.0 :: P R\n",
" | i_1_1 <- 1...n ] :: Array 1...n R\n",
" return [v_0_0,v_0_1,x_ns_0_0]\n",
"*/\n",
"\n",
"digraph {\n",
" compound=\"true\"\n",
" subgraph cluster_array__v_0_0 {\n",
" label=\"array\"\n",
" _v_0_0_i_1_1 [shape=\"record\" label=\"index 1|1|n\"]\n",
" \n",
" _v_0_0_v_1_0 [shape=\"record\" label=\"2|*|\"]\n",
" \n",
" _v_0_0 [shape=\"record\" label=\"1|+|\"]\n",
" \n",
" \n",
" _v_0_0 [style=\"bold\"]\n",
" }\n",
" \n",
" subgraph cluster_array__v_0_1 {\n",
" label=\"array\"\n",
" _v_0_1_i_1_1 [shape=\"record\" label=\"index 1|1|n\"]\n",
" _v_0_1_i_1_2 [shape=\"record\" label=\"index 2|1|k\"]\n",
" \n",
" _v_0_1_v_1_0 [shape=\"record\" label=\"|-|\"]\n",
" \n",
" _v_0_1 [shape=\"record\" label=\"|*|\"]\n",
" \n",
" \n",
" _v_0_1 [style=\"bold\"]\n",
" }\n",
" \n",
" \n",
" \n",
" \n",
" subgraph cluster_loop__x_ns_0_0 {\n",
" label=\"joint\"\n",
" _x_ns_0_0_i_1_1 [shape=\"record\" label=\"index 1|1|n\"]\n",
" \n",
" \n",
" _x_ns_0_0 [shape=\"record\" label=\"~normal||1\"]\n",
" _x_ns_0_0 [style=\"bold\"]\n",
" }\n",
" \n",
" _v_0_0 [style=\"bold\"]\n",
" _v_0_1 [style=\"bold\"]\n",
" _x_ns_0_0 [style=\"bold\"]\n",
" \n",
" \n",
" \n",
" \n",
" _v_0_0_i_1_1 -> _v_0_0_v_1_0:f2 [style=\"solid\"]\n",
" \n",
" _v_0_0_v_1_0 -> _v_0_0:f2 [style=\"solid\"]\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" _v_0_1_i_1_1 -> _v_0_1_v_1_0:f1 [style=\"solid\"]\n",
" _v_0_1_i_1_2 -> _v_0_1_v_1_0:f2 [style=\"solid\"]\n",
" \n",
" _v_0_1_v_1_0 -> _v_0_1:f1 [style=\"solid\"]\n",
" _v_0_1_v_1_0 -> _v_0_1:f2 [style=\"solid\"]\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" _x_ns_0_0_i_1_1 -> _x_ns_0_0:f1 [style=\"solid\"]\n",
" \n",
"}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"p :: P (ZVec,ZMat,RMat)\n",
"p = do\n",
" let n = symbol \"n\"\n",
" k = symbol \"k\"\n",
" v = vector [ 2*i + 1 | i <- 1...n ]\n",
" m = matrix [ (i-j)^2 | i <- 1...n, j <- 1...k ]\n",
" z <- joint matrix [ normal (cast i) 1 | i <- 1...n ]\n",
" return (v,m,z)\n",
"putStrLn $ graphviz p\n",
"svg <$> vizIR p"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"prior :: P (Z,RVec,RVec)\n",
"prior = do\n",
" n <- poisson 5\n",
" let base = uniform 0 5\n",
" x <- orderedSample n base\n",
" let mu = vector [ 0 | i <- 1...n ]\n",
" kernel a b = exp (-(a - b)^2 / 2) + if a == b then 1e-6 else 0\n",
" cov = matrix [ kernel (x!i) (x!j) | i <- 1...n, j <- 1...n ]\n",
" y <- normal mu cov\n",
" return (n,x,y)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"let posterior = [ y | (n,x,y) <- prior, n == 5, x == list [0.5,1.5,2.5,3.5,4.5] ]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"/*\n",
"let v_0_0 = getExternal x_ns_0_0 :: Z\n",
" v_0_1 = \n",
" [ 0.0\n",
" | i_1_1 <- 1...x_ns_0_0 ] :: RVec\n",
" v_0_2 = getExternal x_ns_0_1 :: Array 1...x_ns_0_0 R\n",
" v_0_3 = \n",
" [ let v_1_0 = id x_ns_0_1!i_1_1 :: R\n",
" v_1_1 = id x_ns_0_1!i_1_2 :: R\n",
" v_1_2 = v_1_0 - v_1_1 :: R\n",
" v_1_3 = v_1_2 * v_1_2 :: R\n",
" v_1_4 = v_1_3 / 2.0 :: R\n",
" v_1_5 = negate v_1_4 :: R\n",
" v_1_6 = exp v_1_5 :: R\n",
" v_1_7 = v_1_0 == v_1_1 :: B\n",
" v_1_8 = ifThenElse v_1_7 1.0e-6 0.0 :: R\n",
" v_1_9 = v_1_6 + v_1_8 :: R\n",
" in v_1_9\n",
" | i_1_1 <- 1...x_ns_0_0, i_1_2 <- 1...x_ns_0_0 ] :: RMat\n",
" v_0_4 = getExternal x_ns_0_2 :: RVec\n",
" in do x_ns_0_0 <- poisson 5.0 :: P Z\n",
" x_ns_0_1 <- orderedSample (uniform 0.0 5.0 :: P R) x_ns_0_0 :: P Array 1...x_ns_0_0 R\n",
" x_ns_0_2 <- multi_normal v_0_1 v_0_3 :: P RVec\n",
" return [x_ns_0_2]\n",
"*/\n",
"\n",
"digraph {\n",
" compound=\"true\"\n",
" \n",
" \n",
" subgraph cluster_array__v_0_1 {\n",
" label=\"array\"\n",
" _v_0_1_i_1_1 [shape=\"record\" label=\"index 1|1|\"]\n",
" \n",
" \n",
" _v_0_1 [label=\"0\" style=\"bold\"]\n",
" }\n",
" \n",
" \n",
" \n",
" subgraph cluster_array__v_0_3 {\n",
" label=\"array\"\n",
" _v_0_3_i_1_1 [shape=\"record\" label=\"index 1|1|\"]\n",
" _v_0_3_i_1_2 [shape=\"record\" label=\"index 2|1|\"]\n",
" \n",
" _v_0_3_v_1_0 [shape=\"record\" label=\"|!|\"]\n",
" \n",
" _v_0_3_v_1_1 [shape=\"record\" label=\"|!|\"]\n",
" \n",
" _v_0_3_v_1_2 [shape=\"record\" label=\"|-|\"]\n",
" \n",
" _v_0_3_v_1_3 [shape=\"record\" label=\"|*|\"]\n",
" \n",
" _v_0_3_v_1_4 [shape=\"record\" label=\"|/|2\"]\n",
" \n",
" _v_0_3_v_1_5 [shape=\"record\" label=\"negate|\"]\n",
" \n",
" _v_0_3_v_1_6 [shape=\"record\" label=\"exp|\"]\n",
" \n",
" _v_0_3_v_1_7 [shape=\"record\" label=\"|==|\"]\n",
" \n",
" _v_0_3_v_1_8 [shape=\"record\" label=\"ifThenElse||1.0e-6|0\"]\n",
" \n",
" _v_0_3 [shape=\"record\" label=\"|+|\"]\n",
" \n",
" \n",
" _v_0_3 [style=\"bold\"]\n",
" }\n",
" \n",
" \n",
" \n",
" \n",
" _x_ns_0_0 [shape=\"record\" label=\"~poisson|5\"]\n",
" subgraph cluster_order__x_ns_0_1 {\n",
" label=\"ordered sample\"\n",
" _x_ns_0_1_index [shape=\"record\" label=\"index|1|\"]\n",
" _x_ns_0_1 [shape=\"record\" label=\"~uniform|0|5\"]\n",
" _x_ns_0_1 [style=\"bold\"]\n",
" }\n",
" _x_ns_0_2 [shape=\"record\" label=\"~multi_normal||\"]\n",
" \n",
" _x_ns_0_2 [style=\"bold\"]\n",
" \n",
" _x_ns_0_0 [style=\"filled\" fillcolor=\"gray\"]\n",
" _x_ns_0_1 [style=\"filled\" fillcolor=\"gray\"]\n",
" \n",
" \n",
" _x_ns_0_0 -> _v_0_1_i_1_1:f2 [style=\"solid\"]\n",
" \n",
" \n",
" \n",
" \n",
" _x_ns_0_0 -> _v_0_3_i_1_1:f2 [style=\"solid\"]\n",
" \n",
" _x_ns_0_0 -> _v_0_3_i_1_2:f2 [style=\"solid\"]\n",
" \n",
" \n",
" _x_ns_0_1 -> _v_0_3_v_1_0:f1 [style=\"solid\"]\n",
" _v_0_3_i_1_1 -> _v_0_3_v_1_0:f2 [style=\"solid\"]\n",
" \n",
" _x_ns_0_1 -> _v_0_3_v_1_1:f1 [style=\"solid\"]\n",
" _v_0_3_i_1_2 -> _v_0_3_v_1_1:f2 [style=\"solid\"]\n",
" \n",
" _v_0_3_v_1_0 -> _v_0_3_v_1_2:f1 [style=\"solid\"]\n",
" _v_0_3_v_1_1 -> _v_0_3_v_1_2:f2 [style=\"solid\"]\n",
" \n",
" _v_0_3_v_1_2 -> _v_0_3_v_1_3:f1 [style=\"solid\"]\n",
" _v_0_3_v_1_2 -> _v_0_3_v_1_3:f2 [style=\"solid\"]\n",
" \n",
" _v_0_3_v_1_3 -> _v_0_3_v_1_4:f1 [style=\"solid\"]\n",
" \n",
" _v_0_3_v_1_4 -> _v_0_3_v_1_5:f1 [style=\"solid\"]\n",
" \n",
" _v_0_3_v_1_5 -> _v_0_3_v_1_6:f1 [style=\"solid\"]\n",
" \n",
" _v_0_3_v_1_0 -> _v_0_3_v_1_7:f1 [style=\"solid\"]\n",
" _v_0_3_v_1_1 -> _v_0_3_v_1_7:f2 [style=\"solid\"]\n",
" \n",
" _v_0_3_v_1_7 -> _v_0_3_v_1_8:f1 [style=\"solid\"]\n",
" \n",
" _v_0_3_v_1_6 -> _v_0_3:f1 [style=\"solid\"]\n",
" _v_0_3_v_1_8 -> _v_0_3:f2 [style=\"solid\"]\n",
" \n",
" \n",
" \n",
" \n",
" _x_ns_0_0 -> _x_ns_0_1 [style=\"invis\"]\n",
" _x_ns_0_1 -> _x_ns_0_2 [style=\"invis\"]\n",
" \n",
" \n",
" _x_ns_0_0 -> _x_ns_0_1_index:f2 [style=\"solid\"]\n",
" \n",
" \n",
" _v_0_1 -> _x_ns_0_2:f1 [style=\"solid\"]\n",
" _v_0_3 -> _x_ns_0_2:f2 [style=\"solid\"]\n",
" \n",
"}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"putStrLn $ graphviz posterior\n",
"svg <$> vizIR posterior"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Haskell",
"language": "haskell",
"name": "haskell"
},
"language_info": {
"codemirror_mode": "ihaskell",
"file_extension": ".hs",
"name": "haskell",
"pygments_lexer": "Haskell",
"version": "8.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}