{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Controlling a Cart in a 1D Space" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Challenge\n", "\n", "In this demo, we consider a cart that can move in a 1D space. At each time step the cart can be steered a bit to the left or right by a controller (the \"agent\"). The agent's knowledge about the cart's process dynamics (equations of motion) are known up to some additive Gaussian process noise. The agent also makes noisy observations of the position and velocity of the cart. Your challenge is to design an agent that steers the car to the zero position. (The agent should be specified as a probabilistic model and the control signal should be formulated as a Bayesian inference task). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set up environment\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "using Pkg;Pkg.activate(\"../probprog/workspace/\");Pkg.instantiate()\n", "using Random\n", "Random.seed!(87613) # Set random seed\n", "\n", "using LinearAlgebra\n", "using PyPlot\n", "using ForneyLab\n", "\n", "include(\"environment_1d.jl\") # Include environmental dynamics\n", "include(\"helpers_1d.jl\") # Include helper functions for plotting\n", "include(\"agent_1d.jl\") # Load agent's internal beliefs over external dynamics\n", "IJulia.clear_output()\n", ";" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Build model\n", "\n", "Here we specify the generative model for the agent. We define a state-space model that includes prior beliefs about desired future outcomes. The target future outcome is position $0$ (zero).\n", "\\begin{align*}\n", " p_t(o, s, u) &\\propto p(s_{t-1}) \\prod_{k=t}^{t+T} p(o_k | s_k)\\, p(s_k | s_{k-1}, u_k)\\, p(u_k)\\, \\tilde{p}(o_k)\\,.\n", "\\end{align*}\n", "\n", "We further detail the model by making the following assumptions:\n", "\\begin{align*}\n", " p(s_{t-1}) &= \\mathcal{N}(s_{t-1} | m_{s, t-t}, v_{s, t-1})\\\\\n", " p(s_k | s_{k-1}, u_k) &= \\mathcal{N}(s_k | s_{k-1} + u_k, \\gamma^{-1})\\\\\n", " p(o_k | s_k) &= \\mathcal{N}(o_k | s_k, \\phi^{-1})\\\\\n", " p(u_k) &= \\mathcal{N}(u_k | 0, \\upsilon) \\text{, for } k>t\\\\\n", " \\tilde{p}(o_k) &= \\mathcal{N}(o_k | 0, \\sigma) \\text{, for } k>t\\\\\n", " p(u_t) &= \\delta(u_t - \\hat{u}_t)\\\\\n", " \\tilde{p}(o_t) &= \\delta(o_t - \\hat{o}_t)\\,.\n", "\\end{align*}" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Internal model perameters\n", "gamma = 100.0 # Transition precision\n", "phi = 10.0 # Observation precision\n", "upsilon = 1.0 # Control prior variance\n", "sigma = 1.0 # Goal prior variance\n", ";" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "T = 10 # Lookahead\n", "\n", "# Build internal model\n", "fg = FactorGraph()\n", "\n", "o = Vector{Variable}(undef, T) # Observed states\n", "s = Vector{Variable}(undef, T) # Noisy brain states\n", "u = Vector{Variable}(undef, T) # Control states\n", "\n", "@RV s_t_min ~ GaussianMeanVariance(placeholder(:m_s_t_min),\n", " placeholder(:v_s_t_min)) # Prior brain state\n", "u_t = placeholder(:u_t)\n", "@RV u[1] ~ GaussianMeanVariance(u_t, tiny)\n", "@RV s[1] ~ GaussianMeanPrecision(s_t_min + u[1], gamma)\n", "@RV o[1] ~ GaussianMeanPrecision(s[1], phi)\n", "placeholder(o[1], :o_t)\n", "\n", "s_k_min = s[1]\n", "for k=2:T\n", " @RV u[k] ~ GaussianMeanVariance(0.0, upsilon) # Control prior\n", " @RV s[k] ~ GaussianMeanPrecision(s_k_min + u[k], gamma) # State transition model\n", " @RV o[k] ~ GaussianMeanPrecision(s[k], phi) # Observation model\n", " GaussianMeanVariance(o[k], \n", " placeholder(:m_o, var_id=:m_o_*k, index=k-1),\n", " placeholder(:v_o, var_id=:v_o_*k, index=k-1)) # Goal prior\n", " s_k_min = s[k]\n", "end\n", ";" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Infer algorithm\n", "\n", "Next, we call upon [ForneyLab](http://forneylab.org) package to generate a message passing algorithm to *infer* the next action. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "function step!(data::Dict, marginals::Dict=Dict(), messages::Vector{Message}=Array{Message}(undef, 59))\n", "\n", "messages[1] = ruleSPGaussianMomentsOutNPP(nothing, Message(Univariate, PointMass, m=0.0), Message(Univariate, PointMass, m=1.0))\n", "messages[2] = ruleSPGaussianMomentsOutNPP(nothing, Message(Univariate, PointMass, m=data[:m_s_t_min]), Message(Univariate, PointMass, m=data[:v_s_t_min]))\n", "messages[3] = ruleSPGaussianMomentsOutNPP(nothing, Message(Univariate, PointMass, m=data[:u_t]), Message(Univariate, PointMass, m=1.0e-12))\n", "messages[4] = ruleSPAdditionOutNGG(nothing, messages[2], messages[3])\n", "messages[5] = \n", "\n", "...\n", "\n", "marginals[:u_2] = messages[1].dist * messages[59].dist\n", "\n", "return marginals\n", "\n", "end\n" ] } ], "source": [ "# Schedule message passing algorithm\n", "algo = messagePassingAlgorithm(u[2]) # Infer internal states\n", "code = algorithmSourceCode(algo) # Generate algorithm source code\n", "\n", "eval(Meta.parse(code)) # Loads the step!() function for inference\n", "inspectSnippet(code) # Inspect a snippet of the algorithm code\n", ";" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the inference algorithm completely consists of a sequence of messages. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Execute algorithm\n", "\n", "Now we run this message passing algorithm for each time step so as to infer the next action. And when we're done, we plot the position of the cart as a function of time. Note that the cart get steered to the target position." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Initial state\n", "s_0 = 2.0\n", ";" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "N = 20 # Total simulation time\n", "\n", "(execute, observe) = initializeWorld() # Let there be a world\n", "(infer, act, slide) = initializeAgent() # Let there be an agent\n", "\n", "# Step through action-perception loop\n", "u_hat = Vector{Float64}(undef, N) # Actions\n", "o_hat = Vector{Float64}(undef, N) # Observations\n", "for t=1:N\n", " u_hat[t] = act() # Evoke an action from the agent\n", " execute(u_hat[t]) # The action influences hidden external states\n", " o_hat[t] = observe() # Observe the current environmental outcome (update p)\n", " infer(u_hat[t], o_hat[t]) # Infer beliefs from current model state (update q)\n", " slide() # Prepare for next iteration\n", "end\n", ";" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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Kisra40fHh6O5ORkAEBGRgY0Gg2WLl1q0x6JqHkYgIjI6QQEBGDZsmXo2rUrnn32WXTt2hVlZWV444030KVLF8THx0OlUuHAgQMAgA0bNkChUODrr79G79690b17d3zzzTfIysrCnj17ao3v5uaGgIAAAEBQUJC0N4qIHAfnABGR0+nZsycUiv/7/7vg4GD06tVLWnZzc0OrVq1w9epVAMCxY8dw4cIF+Pj4mIxTUVGBixcv2qZoIrIpBiAicjpKpdJkWRCEOtcZDAYAgMFgQEREBP71r3/VGqt169bWK5SIZMMAREQub8CAAdi4cSOCgoLg6+vbqNeoVCoAQHV1tTVLIyIr4RwgInJ5f/3rXxEYGIhx48bht99+Q2ZmJvbu3YtXXnkFOTk5db6mffv2EAQBP/30E65du4aSkhIbV01EzcEAREQuz8vLC/v27UO7du0wfvx4dO/eHc8++yzKy8vr3SPUpk0bzJ8/H3FxcQgODsaLL75o46qJqDkEURRFuYsgIiIisiXuASIiIiKXwwBERERELocBiIiIiFwOAxARERG5HAYgIiIicjkMQERERORyGICIiIjI5TAAERERkcthACIiIiKXwwBERERELocBiIiIiFzO/w+TqvjmSPOVrAAAAABJRU5ErkJggg==", "text/plain": [ "Figure(PyObject
)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot active inference results\n", "plotTrajectory(u_hat, o_hat)\n", ";" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We conclude that it is possible to design an agent that makes goal-directed actions in an uncertain environment, solely based on (automatable) Bayesian inference in a generative model of the environment that is constrained by priors on future outcomes. " ] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "kernelspec": { "display_name": "Julia 1.7.2", "language": "julia", "name": "julia-1.7" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.7.2" } }, "nbformat": 4, "nbformat_minor": 2 }