From 60d00621ff08fb6961c9abba58d2633256c4da59 Mon Sep 17 00:00:00 2001 From: p-zach Date: Wed, 16 Apr 2025 16:28:58 -0400 Subject: [PATCH] Better visualizations --- gtsam/inference/doc/BayesTree.ipynb | 350 +++++++++++++++++----------- 1 file changed, 208 insertions(+), 142 deletions(-) diff --git a/gtsam/inference/doc/BayesTree.ipynb b/gtsam/inference/doc/BayesTree.ipynb index 5364adc0a..a9452f4d4 100644 --- a/gtsam/inference/doc/BayesTree.ipynb +++ b/gtsam/inference/doc/BayesTree.ipynb @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 9, "metadata": { "id": "bayestree_import_code" }, @@ -88,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -101,74 +101,165 @@ "name": "stdout", "output_type": "stream", "text": [ - "Original Factor Graph:\n", - "\n", - "size: 7\n", - "factor 0: \n", - " A[x0] = [\n", - "\t-1\n", - "]\n", - " b = [ 0 ]\n", - " Noise model: unit (1) \n", - "factor 1: \n", - " A[x0] = [\n", - "\t-1\n", - "]\n", - " A[x1] = [\n", - "\t1\n", - "]\n", - " b = [ 0 ]\n", - " Noise model: unit (1) \n", - "factor 2: \n", - " A[x1] = [\n", - "\t-1\n", - "]\n", - " A[x2] = [\n", - "\t1\n", - "]\n", - " b = [ 0 ]\n", - " Noise model: unit (1) \n", - "factor 3: \n", - " A[l1] = [\n", - "\t-1\n", - "]\n", - " A[x0] = [\n", - "\t1\n", - "]\n", - " b = [ 0 ]\n", - " Noise model: unit (1) \n", - "factor 4: \n", - " A[l1] = [\n", - "\t-1\n", - "]\n", - " A[x1] = [\n", - "\t1\n", - "]\n", - " b = [ 0 ]\n", - " Noise model: unit (1) \n", - "factor 5: \n", - " A[l2] = [\n", - "\t-1\n", - "]\n", - " A[x1] = [\n", - "\t1\n", - "]\n", - " b = [ 0 ]\n", - " Noise model: unit (1) \n", - "factor 6: \n", - " A[l2] = [\n", - "\t-1\n", - "]\n", - " A[x2] = [\n", - "\t1\n", - "]\n", - " b = [ 0 ]\n", - " Noise model: unit (1) \n" + "Original Factor Graph:\n" ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var7782220156096217089\n", + "\n", + "l1\n", + "\n", + "\n", + "\n", + "factor3\n", + "\n", + "\n", + "\n", + "\n", + "var7782220156096217089--factor3\n", + "\n", + "\n", + "\n", + "\n", + "factor4\n", + "\n", + "\n", + "\n", + "\n", + "var7782220156096217089--factor4\n", + "\n", + "\n", + "\n", + "\n", + "var7782220156096217090\n", + "\n", + "l2\n", + "\n", + "\n", + "\n", + "factor5\n", + "\n", + "\n", + "\n", + "\n", + "var7782220156096217090--factor5\n", + "\n", + "\n", + "\n", + "\n", + "factor6\n", + "\n", + "\n", + "\n", + "\n", + "var7782220156096217090--factor6\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352320\n", + "\n", + "x0\n", + "\n", + "\n", + "\n", + "factor0\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352320--factor0\n", + "\n", + "\n", + "\n", + "\n", + "factor1\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352320--factor1\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352320--factor3\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352321\n", + "\n", + "x1\n", + "\n", + "\n", + "\n", + "var8646911284551352321--factor1\n", + "\n", + "\n", + "\n", + "\n", + "factor2\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352321--factor2\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352321--factor4\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352321--factor5\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322\n", + "\n", + "x2\n", + "\n", + "\n", + "\n", + "var8646911284551352322--factor2\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322--factor6\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "# Create a simple Gaussian Factor Graph (more complex this time)\n", + "# Create a simple Gaussian Factor Graph\n", "graph = GaussianFactorGraph()\n", "model = gtsam.noiseModel.Isotropic.Sigma(1, 1.0)\n", "graph.add(X(0), -np.eye(1), np.zeros(1), model) # Prior on x0\n", @@ -180,19 +271,18 @@ "graph.add(L(2), -np.eye(1), X(2), np.eye(1), np.zeros(1), model) # l2 -> x2 (measurement)\n", "\n", "print(\"Original Factor Graph:\")\n", - "graph.print()" + "display(graphviz.Source(graph.dot()))" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", "Resulting BayesTree:\n", ": cliques: 2, variables: 5\n", "- p(x1 l2 x2 )\n", @@ -213,8 +303,52 @@ " [ -0.948683 ]\n", " d = [ 0 0 ]\n", " logNormalizationConstant: -1.03316\n", - " No noise model\n" + " No noise model\n", + "\n", + "Visualization:\n" ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "G\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "x1, l2, x2\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "l1, x0 : x1\n", + "\n", + "\n", + "\n", + "2->3\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -223,8 +357,10 @@ "# Note: Multifrontal typically yields multiple roots if graph is disconnected\n", "bayes_tree = graph.eliminateMultifrontal(ordering)\n", "\n", - "print(\"\\nResulting BayesTree:\")\n", - "bayes_tree.print()" + "print(\"Resulting BayesTree:\")\n", + "bayes_tree.print()\n", + "print(\"\\nVisualization:\")\n", + "display(graphviz.Source(bayes_tree.dot()))" ] }, { @@ -328,76 +464,6 @@ "print(\"\\nJoint Marginal Factor Graph on (x0, x2):\")\n", "joint_x0_x2.print()" ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bayestree_viz_md" - }, - "source": [ - "## Visualization\n", - "\n", - "Bayes trees can be visualized using Graphviz." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "bayestree_dot_code", - "outputId": "789abcde-f012-3456-789a-bcdef0123456" - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "G\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "x1, l2, x2\n", - "\n", - "\n", - "\n", - "1\n", - "\n", - "l1, x0 : x1\n", - "\n", - "\n", - "\n", - "0->1\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "graphviz.Source(bayes_tree.dot())" - ] } ], "metadata": {