diff --git a/gtsam/discrete/DiscreteBayesTree.cpp b/gtsam/discrete/DiscreteBayesTree.cpp index 48413405a..09a1f47aa 100644 --- a/gtsam/discrete/DiscreteBayesTree.cpp +++ b/gtsam/discrete/DiscreteBayesTree.cpp @@ -55,8 +55,21 @@ namespace gtsam { return result; } -} // \namespace gtsam - - - + /* **************************************************************************/ + std::string DiscreteBayesTree::_repr_markdown_( + const KeyFormatter& keyFormatter) const { + using std::endl; + std::stringstream ss; + ss << "`DiscreteBayesTree` of size " << nodes_.size() << endl << endl; + auto visitor = [&](const DiscreteBayesTreeClique::shared_ptr& clique, + size_t& indent) { + ss << "\n" << clique->conditional()->_repr_markdown_(keyFormatter); + return indent + 1; + }; + size_t indent; + treeTraversal::DepthFirstForest(*this, indent, visitor); + return ss.str(); + } + /* **************************************************************************/ + } // namespace gtsam diff --git a/gtsam/discrete/DiscreteBayesTree.h b/gtsam/discrete/DiscreteBayesTree.h index 42ec7d417..675b951ed 100644 --- a/gtsam/discrete/DiscreteBayesTree.h +++ b/gtsam/discrete/DiscreteBayesTree.h @@ -72,6 +72,8 @@ class GTSAM_EXPORT DiscreteBayesTree typedef DiscreteBayesTree This; typedef boost::shared_ptr shared_ptr; + /// @name Standard interface + /// @{ /** Default constructor, creates an empty Bayes tree */ DiscreteBayesTree() {} @@ -82,10 +84,19 @@ class GTSAM_EXPORT DiscreteBayesTree double evaluate(const DiscreteValues& values) const; //** (Preferred) sugar for the above for given DiscreteValues */ - double operator()(const DiscreteValues & values) const { + double operator()(const DiscreteValues& values) const { return evaluate(values); } + /// @} + /// @name Wrapper support + /// @{ + + /// Render as markdown table. + std::string _repr_markdown_( + const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; + + /// @} }; } // namespace gtsam diff --git a/gtsam/discrete/discrete.i b/gtsam/discrete/discrete.i index 07334cf9b..a2377dc59 100644 --- a/gtsam/discrete/discrete.i +++ b/gtsam/discrete/discrete.i @@ -126,6 +126,9 @@ class DiscreteBayesTree { const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const; double operator()(const gtsam::DiscreteValues& values) const; + + string _repr_markdown_(const gtsam::KeyFormatter& keyFormatter = + gtsam::DefaultKeyFormatter) const; }; #include diff --git a/python/gtsam/notebooks/DiscreteSwitching.ipynb b/python/gtsam/notebooks/DiscreteSwitching.ipynb index 0707cbd3b..6872e78c8 100644 --- a/python/gtsam/notebooks/DiscreteSwitching.ipynb +++ b/python/gtsam/notebooks/DiscreteSwitching.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -57,21 +57,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": "\n\n\n\n\n\nG\n\n\n\ns1\n\ns1\n\n\n\ns2\n\ns2\n\n\n\ns1->s2\n\n\n\n\n\ns3\n\ns3\n\n\n\ns2->s3\n\n\n\n\n\nm1\n\nm1\n\n\n\nm1->s2\n\n\n\n\n\ns4\n\ns4\n\n\n\ns3->s4\n\n\n\n\n\nm2\n\nm2\n\n\n\nm2->s3\n\n\n\n\n\ns5\n\ns5\n\n\n\ns4->s5\n\n\n\n\n\nm3\n\nm3\n\n\n\nm3->s4\n\n\n\n\n\nm4\n\nm4\n\n\n\nm4->s5\n\n\n\n\n\n", - "text/plain": [ - "<__main__.show at 0x119a80d90>" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nrStates = 3\n", "K = 5\n", @@ -81,59 +69,36 @@ " key = S(k), nrStates\n", " key_plus = S(k+1), nrStates\n", " mode = M(k), 2\n", - " bayesNet.add(key_plus, P(key, mode), \"1/1/1 1/2/1 3/2/3 1/1/1 1/2/1 3/2/3\")\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", - "show(bayesNet)\n" + "bayesNet" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": "\n\n\n\n\n\n\n\n\nvar7854277750134145025\n\nm1\n\n\n\nfactor0\n\n\n\n\nvar7854277750134145025--factor0\n\n\n\n\nvar7854277750134145026\n\nm2\n\n\n\nfactor1\n\n\n\n\nvar7854277750134145026--factor1\n\n\n\n\nvar7854277750134145027\n\nm3\n\n\n\nfactor2\n\n\n\n\nvar7854277750134145027--factor2\n\n\n\n\nvar7854277750134145028\n\nm4\n\n\n\nfactor3\n\n\n\n\nvar7854277750134145028--factor3\n\n\n\n\nvar8286623314361712641\n\ns1\n\n\n\nvar8286623314361712641--factor0\n\n\n\n\nvar8286623314361712642\n\ns2\n\n\n\nvar8286623314361712642--factor0\n\n\n\n\nvar8286623314361712642--factor1\n\n\n\n\nvar8286623314361712643\n\ns3\n\n\n\nvar8286623314361712643--factor1\n\n\n\n\nvar8286623314361712643--factor2\n\n\n\n\nvar8286623314361712644\n\ns4\n\n\n\nvar8286623314361712644--factor2\n\n\n\n\nvar8286623314361712644--factor3\n\n\n\n\nvar8286623314361712645\n\ns5\n\n\n\nvar8286623314361712645--factor3\n\n\n\n\n", - "text/plain": [ - "<__main__.show at 0x119a80820>" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "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)\n" + "show(factorGraph)" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Position 0: s1, s2, s3, s4, s5, m1, m2, m3, m4\n", - "\n" - ] - }, - { - "data": { - "image/svg+xml": "\n\n\n\n\n\nG\n\n\n\n0\n\ns4,s5,m1,m2,m3,m4\n\n\n\n1\n\ns3 : m1,m2,m3,s4\n\n\n\n0->1\n\n\n\n\n\n2\n\ns2 : m1,m2,s3\n\n\n\n1->2\n\n\n\n\n\n3\n\ns1 : m1,s2\n\n\n\n2->3\n\n\n\n\n\n", - "text/plain": [ - "<__main__.show at 0x119a76b80>" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Create a BayesTree out of the factor graph.\n", "ordering = Ordering()\n", @@ -144,8 +109,22 @@ " ordering.push_back(M(k))\n", "print(ordering)\n", "bayesTree = factorGraph.eliminateMultifrontal(ordering)\n", - "show(bayesTree)\n" + "bayesTree" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show(bayesTree)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": {