From 06a13bed70721bc1ad0412fa2064f0231857b7f2 Mon Sep 17 00:00:00 2001 From: p-zach Date: Mon, 14 Apr 2025 18:59:40 -0400 Subject: [PATCH] ClusterTree --- gtsam/inference/doc/ClusterTree.ipynb | 151 +------------------------- 1 file changed, 1 insertion(+), 150 deletions(-) diff --git a/gtsam/inference/doc/ClusterTree.ipynb b/gtsam/inference/doc/ClusterTree.ipynb index 402680078..2610edba7 100644 --- a/gtsam/inference/doc/ClusterTree.ipynb +++ b/gtsam/inference/doc/ClusterTree.ipynb @@ -19,156 +19,7 @@ "\n", "`ClusterTree` itself is a base class. `EliminatableClusterTree` adds the ability to perform elimination, and `JunctionTree` is a specific type of `EliminatableClusterTree` derived from an `EliminationTree`.\n", "\n", - "Direct use of `ClusterTree` in typical Python applications is less common than `JunctionTree` or `BayesTree`, as it's often an intermediate representation." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "clustertree_colab_md" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "clustertree_pip_code", - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "%pip install gtsam" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "id": "clustertree_import_code" - }, - "outputs": [], - "source": [ - "import gtsam\n", - "import numpy as np\n", - "\n", - "# Note: ClusterTree itself might not be directly exposed or used.\n", - "# We typically interact with JunctionTree or BayesTree which build upon it.\n", - "# We'll demonstrate concepts using JunctionTree which inherits Cluster features.\n", - "from gtsam import GaussianFactorGraph, Ordering, VariableIndex, GaussianBayesTree\n", - "from gtsam import symbol_shorthand\n", - "\n", - "X = symbol_shorthand.X\n", - "L = symbol_shorthand.L" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "clustertree_concept_md" - }, - "source": [ - "## Concept and Relation to JunctionTree\n", - "\n", - "A `JunctionTree` *is a* `ClusterTree` (specifically, an `EliminatableClusterTree`). It's constructed during multifrontal elimination. Each node in the `JunctionTree` is a `Cluster` containing factors that will be eliminated together to form a clique in the resulting `BayesTree`.\n", - "\n", - "We will create a `JunctionTree` and examine its properties, which include those inherited from `ClusterTree`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "clustertree_jt_code", - "outputId": "ef012345-6789-abcd-ef01-23456789abcd" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Junction Tree (as ClusterTree): \n", - ": cliques: 2, variables: 5\n", - "- p(x1 l2 x2 )\n", - " R = [ 1.61245 -0.620174 -0.620174 ]\n", - " [ 0 1.27098 -1.08941 ]\n", - " [ 0 0 0.654654 ]\n", - " d = [ 0 0 0 ]\n", - " mean: 3 elements\n", - " l2: 0\n", - " x1: 0\n", - " x2: 0\n", - " logNormalizationConstant: -2.46292\n", - " No noise model\n", - "| - p(l1 x0 | x1)\n", - " R = [ 1.41421 -0.707107 ]\n", - " [ 0 1.58114 ]\n", - " S[x1] = [ -0.707107 ]\n", - " [ -0.948683 ]\n", - " d = [ 0 0 ]\n", - " logNormalizationConstant: -1.03316\n", - " No noise model\n" - ] - }, - { - "ename": "AttributeError", - "evalue": "'gtsam.gtsam.GaussianBayesTree' object has no attribute 'roots'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[8], line 28\u001b[0m\n\u001b[0;32m 25\u001b[0m bayes_tree\u001b[38;5;241m.\u001b[39mprint() \u001b[38;5;66;03m# Printing BayesTree shows clique structure\u001b[39;00m\n\u001b[0;32m 27\u001b[0m \u001b[38;5;66;03m# Access root cluster(s)\u001b[39;00m\n\u001b[1;32m---> 28\u001b[0m roots \u001b[38;5;241m=\u001b[39m \u001b[43mbayes_tree\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mroots\u001b[49m()\n\u001b[0;32m 29\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m roots:\n\u001b[0;32m 30\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mAccessing a root cluster (node):\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[1;31mAttributeError\u001b[0m: 'gtsam.gtsam.GaussianBayesTree' object has no attribute 'roots'" - ] - } - ], - "source": [ - "# Create a graph (same as BayesTree example)\n", - "graph = GaussianFactorGraph()\n", - "model = gtsam.noiseModel.Isotropic.Sigma(1, 1.0)\n", - "graph.add(X(0), -np.eye(1), np.zeros(1), model)\n", - "graph.add(X(0), -np.eye(1), X(1), np.eye(1), np.zeros(1), model)\n", - "graph.add(X(1), -np.eye(1), X(2), np.eye(1), np.zeros(1), model)\n", - "graph.add(L(1), -np.eye(1), X(0), np.eye(1), np.zeros(1), model)\n", - "graph.add(L(1), -np.eye(1), X(1), np.eye(1), np.zeros(1), model)\n", - "graph.add(L(2), -np.eye(1), X(1), np.eye(1), np.zeros(1), model)\n", - "graph.add(L(2), -np.eye(1), X(2), np.eye(1), np.zeros(1), model)\n", - "\n", - "ordering = Ordering.Colamd(VariableIndex(graph))\n", - "\n", - "# Create a Junction Tree (implicitly uses ClusterTree structure)\n", - "# Note: JunctionTree constructor might not be directly exposed.\n", - "# It's usually an intermediate in eliminateMultifrontal.\n", - "# We might need to construct it indirectly or focus on BayesTree access.\n", - "\n", - "# Let's get the BayesTree first, as JunctionTree creation is internal.\n", - "bayes_tree = graph.eliminateMultifrontal(ordering)\n", - "\n", - "# We can print the BayesTree, which shows the cluster structure\n", - "# (Cliques in BayesTree correspond to Clusters in JunctionTree)\n", - "print(\"Junction Tree (as ClusterTree): \")\n", - "bayes_tree.print() # Printing BayesTree shows clique structure\n", - "\n", - "# Access root cluster(s)\n", - "roots = bayes_tree.roots()\n", - "if roots:\n", - " print(\"\\nAccessing a root cluster (node):\")\n", - " root_clique = roots[0]\n", - " # In the JunctionTree, this node would contain the factors that *produced*\n", - " # the conditional in the BayesTree clique. We can see the involved keys.\n", - " root_clique.print(\"\", gtsam.DefaultKeyFormatter) # Print clique details\n", - "\n", - "print(f\"\\nNumber of roots: {len(roots)}\")\n", - "\n", - "# Direct instantiation or manipulation of Cluster/JunctionTree nodes\n", - "# is less common in Python than using the results (BayesTree)." + "Direct use of `ClusterTree` in Python applications is uncommon; see the subclasses." ] } ],