156 lines
3.7 KiB
Plaintext
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
|
|
}
|