{ "metadata": { "language": "Julia", "name": "", "signature": "sha256:bfe37583b04e0163e37a1ad6edbbab8e47e789bdecde334bf334eb29afc4918a" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Based on https://probmods.org/learning-as-conditional-inference.html" ] }, { "cell_type": "code", "collapsed": false, "input": [ "using DataStructures, Stochy" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ "INFO: Load Gadfly before Stochy to extend plot function.\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "identity(" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "function repeat(##7973,f::Function,n::Int64)\n", " (##7974->begin \n", " Stochy.Thunk(()->begin \n", " if ##7974\n", " ##7973(list())\n", " else \n", " f(##7975->begin \n", " Stochy.Thunk(()->begin \n", " (##7977->begin \n", " Stochy.Thunk(()->begin \n", " repeat(##7976->begin \n", " Stochy.Thunk(()->begin \n", " ##7973(cons(##7975,##7976))\n", " end)\n", " end,f,##7977)\n", " end)\n", " end)(n - 1)\n", " end)\n", " end)\n", " end\n", " end)\n", " end)(n < 1)\n", " end)\n" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "Stochy.debug(false)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "false" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "@pp function loop(f,n)\n", " n > 0 && begin; f(); loop(f,n-1); end\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "loop (generic function with 1 method)" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "function loop2(k,f,n)\n", " if n > 0\n", " f() do _\n", " loop2(k,f,n-1)\n", " end\n", " else\n", " k(nothing)\n", " end\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "loop2 (generic function with 1 method)" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "@pp begin\n", " loop2(10) do\n", " println(\"x\")\n", " end\n", " :done\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "x\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "x\n", "x\n", "x\n", "x\n", "x\n", "x\n", "x\n", "x\n", "x\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ ":done" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "function repeat2(k,f,n)\n", " if n==1\n", " f(val->k(list(val)))\n", " else\n", " f(h->repeat2(t->k(cons(h,t)), f, n-1))\n", " end\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "repeat2 (generic function with 1 method)" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "function repeat3(k,f,n)\n", " ret = list()\n", " for _ in 1:n\n", " ret = cons(f(identity), ret)\n", " end\n", " k(ret)\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "repeat3 (generic function with 1 method)" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "Stochy.debug(false)\n", "ret = @pp repeat2(10) do\n", "flip() ? :head : :tail\n", "end\n", "println(typeof(ret))\n", "ret" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Cons{" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Symbol}\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "list(:tail, :head, :tail, :tail, :head, :head, :head, :tail, :head, :head)" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "obslist = @pp repeat2(()->:head, 10)\n", "@time posterior = @pp pmcmc(200,200) do\n", " local faircoin = flip(0.999) # Prior.\n", " local coin = () -> flip(faircoin ? 0.5 : 0.95) ? :head : :tail\n", " local flips = repeat2(coin, 10)\n", " factor(flips == obslist ? 0 : -Inf)\n", " #loop(10) do\n", " # factor(coin() == :head ? 0 : -Inf)\n", " #end\n", " faircoin\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "elapsed time: 16" ] }, { "output_type": "stream", "stream": "stdout", "text": [ ".615144245 seconds (2688771928 bytes allocated, 16.79% gc time)\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "Empirical([false=>0.2238,true=>0.7762])" ] } ], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "obsarray = [:head for _ in 1:10]\n", "@time posterior = @pp pmcmc(1000,100) do\n", " local faircoin = flip(0.999) # Prior.\n", " local coin = () -> flip(faircoin ? 0.5 : 0.95) ? :head : :tail\n", " local flips = [coin(),coin(),coin(),coin(),coin(),coin(),coin(),coin(),coin(),coin()]\n", " factor(flips == obsarray ? 0 : -Inf)\n", " faircoin\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "elapsed time: " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "51.466698294 seconds (8476414016 bytes allocated, 14.41% gc time)\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "Empirical([false=>0.38907,true=>0.61093])" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "exactposterior = @pp enum() do\n", " local faircoin = flip(0.999)\n", " observe(Bernoulli(faircoin ? 0.5 : 0.95),\n", " true, true, true, true, true, true, true, true, true, true)\n", " faircoin\n", "end" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "Categorical([false=>0.3803139420033197,true=>0.6196860579966804])" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "@pp ~Categorical([0.5,0.5], [:head,:tail])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ ":tail" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "list(:head, :tail) == list()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 71, "text": [ "false" ] } ], "prompt_number": 71 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }