gtsam/python/gtsam/notebooks/DiscreteSwitching.ipynb

156 lines
3.7 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A Discrete Switching System\n",
"\n",
"A la MHS, but all discrete.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from gtsam import DiscreteBayesNet, DiscreteKeys, DiscreteFactorGraph, Ordering\n",
"from gtsam.symbol_shorthand import S\n",
"from gtsam.symbol_shorthand import M\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def P(*args):\n",
" \"\"\" Create a DiscreteKeys instances from a variable number of DiscreteKey pairs.\"\"\"\n",
" # TODO: We can make life easier by providing variable argument functions in C++ itself.\n",
" dks = DiscreteKeys()\n",
" for key in args:\n",
" dks.push_back(key)\n",
" return dks\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import graphviz\n",
"\n",
"\n",
"class show(graphviz.Source):\n",
" \"\"\" Display an object with a dot method as a graph.\"\"\"\n",
"\n",
" def __init__(self, obj):\n",
" \"\"\"Construct from object with 'dot' method.\"\"\"\n",
" # This small class takes an object, calls its dot function, and uses the\n",
" # resulting string to initialize a graphviz.Source instance. This in turn\n",
" # has a _repr_mimebundle_ method, which then renders it in the notebook.\n",
" super().__init__(obj.dot())\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nrStates = 3\n",
"K = 5\n",
"\n",
"bayesNet = DiscreteBayesNet()\n",
"for k in range(1, K):\n",
" key = S(k), nrStates\n",
" key_plus = S(k+1), nrStates\n",
" mode = M(k), 2\n",
" bayesNet.add(key_plus, P(mode, key), \"9/1/0 1/8/1 0/1/9 1/9/0 0/1/9 9/0/1\")\n",
"\n",
"bayesNet"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"show(bayesNet)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Create a factor graph out of the Bayes net.\n",
"factorGraph = DiscreteFactorGraph(bayesNet)\n",
"show(factorGraph)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Create a BayesTree out of the factor graph.\n",
"ordering = Ordering()\n",
"# First eliminate \"continuous\" states in time order\n",
"for k in range(1, K+1):\n",
" ordering.push_back(S(k))\n",
"for k in range(1, K):\n",
" ordering.push_back(M(k))\n",
"print(ordering)\n",
"bayesTree = factorGraph.eliminateMultifrontal(ordering)\n",
"bayesTree"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"show(bayesTree)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"interpreter": {
"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
},
"kernelspec": {
"display_name": "Python 3.8.9 64-bit",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}