{ "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", "\n", "%3\n", "\n", "\n", "\n", "_v_0_0\n", "\n", "sin\n", "\n", "a\n", "\n", "\n", "\n", "_v_0_1\n", "\n", "4.2\n", "\n", "+\n", "\n", " \n", "\n", "\n", "\n", "_v_0_0->_v_0_1:f2\n", "\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", "\n", "%3\n", "\n", "\n", "cluster_array__v_0_0\n", "\n", "array\n", "\n", "\n", "cluster_array__v_0_1\n", "\n", "array\n", "\n", "\n", "cluster_loop__x_ns_0_0\n", "\n", "joint\n", "\n", "\n", "\n", "_v_0_0_i_1_1\n", "\n", "index 1\n", "\n", "1\n", "\n", "n\n", "\n", "\n", "\n", "_v_0_0_v_1_0\n", "\n", "2\n", "\n", "*\n", "\n", " \n", "\n", "\n", "\n", "_v_0_0_i_1_1->_v_0_0_v_1_0:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_0\n", "\n", "1\n", "\n", "+\n", "\n", " \n", "\n", "\n", "\n", "_v_0_0_v_1_0->_v_0_0:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_1_i_1_1\n", "\n", "index 1\n", "\n", "1\n", "\n", "n\n", "\n", "\n", "\n", "_v_0_1_v_1_0\n", "\n", " \n", "\n", "-\n", "\n", " \n", "\n", "\n", "\n", "_v_0_1_i_1_1->_v_0_1_v_1_0:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_1_i_1_2\n", "\n", "index 2\n", "\n", "1\n", "\n", "k\n", "\n", "\n", "\n", "_v_0_1_i_1_2->_v_0_1_v_1_0:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_1\n", "\n", " \n", "\n", "*\n", "\n", " \n", "\n", "\n", "\n", "_v_0_1_v_1_0->_v_0_1:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_1_v_1_0->_v_0_1:f2\n", "\n", "\n", "\n", "\n", "\n", "_x_ns_0_0_i_1_1\n", "\n", "index 1\n", "\n", "1\n", "\n", "n\n", "\n", "\n", "\n", "_x_ns_0_0\n", "\n", "~normal\n", "\n", " \n", "\n", "1\n", "\n", "\n", "\n", "_x_ns_0_0_i_1_1->_x_ns_0_0:f1\n", "\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", "\n", "%3\n", "\n", "\n", "cluster_array__v_0_1\n", "\n", "array\n", "\n", "\n", "cluster_array__v_0_3\n", "\n", "array\n", "\n", "\n", "cluster_order__x_ns_0_1\n", "\n", "ordered sample\n", "\n", "\n", "\n", "_v_0_1_i_1_1\n", "\n", "index 1\n", "\n", "1\n", "\n", " \n", "\n", "\n", "\n", "_v_0_1\n", "\n", "0\n", "\n", "\n", "\n", "_x_ns_0_2\n", "\n", "~multi_normal\n", "\n", " \n", "\n", " \n", "\n", "\n", "\n", "_v_0_1->_x_ns_0_2:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_i_1_1\n", "\n", "index 1\n", "\n", "1\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_v_1_0\n", "\n", " \n", "\n", "!\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_i_1_1->_v_0_3_v_1_0:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_i_1_2\n", "\n", "index 2\n", "\n", "1\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_v_1_1\n", "\n", " \n", "\n", "!\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_i_1_2->_v_0_3_v_1_1:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_2\n", "\n", " \n", "\n", "-\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_v_1_0->_v_0_3_v_1_2:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_7\n", "\n", " \n", "\n", "==\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_v_1_0->_v_0_3_v_1_7:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_1->_v_0_3_v_1_2:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_1->_v_0_3_v_1_7:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_3\n", "\n", " \n", "\n", "*\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_v_1_2->_v_0_3_v_1_3:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_2->_v_0_3_v_1_3:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_4\n", "\n", " \n", "\n", "/\n", "\n", "2\n", "\n", "\n", "\n", "_v_0_3_v_1_3->_v_0_3_v_1_4:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_5\n", "\n", "negate\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_v_1_4->_v_0_3_v_1_5:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_6\n", "\n", "exp\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_v_1_5->_v_0_3_v_1_6:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3\n", "\n", " \n", "\n", "+\n", "\n", " \n", "\n", "\n", "\n", "_v_0_3_v_1_6->_v_0_3:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_8\n", "\n", "ifThenElse\n", "\n", " \n", "\n", "1.0e-6\n", "\n", "0\n", "\n", "\n", "\n", "_v_0_3_v_1_7->_v_0_3_v_1_8:f1\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3_v_1_8->_v_0_3:f2\n", "\n", "\n", "\n", "\n", "\n", "_v_0_3->_x_ns_0_2:f2\n", "\n", "\n", "\n", "\n", "\n", "_x_ns_0_0\n", "\n", "~poisson\n", "\n", "5\n", "\n", "\n", "\n", "_x_ns_0_0->_v_0_1_i_1_1:f2\n", "\n", "\n", "\n", "\n", "\n", "_x_ns_0_0->_v_0_3_i_1_1:f2\n", "\n", "\n", "\n", "\n", "\n", "_x_ns_0_0->_v_0_3_i_1_2:f2\n", "\n", "\n", "\n", "\n", "\n", "_x_ns_0_1_index\n", "\n", "index\n", "\n", "1\n", "\n", " \n", "\n", "\n", "\n", "_x_ns_0_0->_x_ns_0_1_index:f2\n", "\n", "\n", "\n", "\n", "\n", "_x_ns_0_1\n", "\n", "~uniform\n", "\n", "0\n", "\n", "5\n", "\n", "\n", "\n", "\n", "_x_ns_0_1->_v_0_3_v_1_0:f1\n", "\n", "\n", "\n", "\n", "\n", "_x_ns_0_1->_v_0_3_v_1_1:f1\n", "\n", "\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 }