From 9fe58e7502b8d7ed52704acfd30df2b181bd58e6 Mon Sep 17 00:00:00 2001 From: Yashas Ambati Date: Tue, 15 Apr 2025 17:49:25 -0400 Subject: [PATCH 1/8] Trigger doxygen generation in cibuildwheel --- .github/scripts/python_wheels/cibw_before_all.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/scripts/python_wheels/cibw_before_all.sh b/.github/scripts/python_wheels/cibw_before_all.sh index 2398877a8..1906ede89 100644 --- a/.github/scripts/python_wheels/cibw_before_all.sh +++ b/.github/scripts/python_wheels/cibw_before_all.sh @@ -14,7 +14,7 @@ export PYTHON="python${PYTHON_VERSION}" if [ "$(uname)" == "Linux" ]; then # manylinux2014 is based on CentOS 7, so use yum to install dependencies - yum install -y wget + yum install -y wget doxygen # Install Boost from source wget https://archives.boost.io/release/1.87.0/source/boost_1_87_0.tar.gz --quiet @@ -24,7 +24,7 @@ if [ "$(uname)" == "Linux" ]; then ./b2 install --prefix=/opt/boost --with=all cd .. elif [ "$(uname)" == "Darwin" ]; then - brew install wget cmake boost + brew install wget cmake boost doxygen fi $(which $PYTHON) -m pip install -r $PROJECT_DIR/python/dev_requirements.txt @@ -48,11 +48,14 @@ cmake $PROJECT_DIR \ -DGTSAM_PYTHON_VERSION=$PYTHON_VERSION \ -DPYTHON_EXECUTABLE:FILEPATH=$(which $PYTHON) \ -DGTSAM_ALLOW_DEPRECATED_SINCE_V43=OFF \ - -DCMAKE_INSTALL_PREFIX=$PROJECT_DIR/gtsam_install + -DCMAKE_INSTALL_PREFIX=$PROJECT_DIR/gtsam_install \ + -DGTSAM_GENERATE_DOC_XML=1 -cd $PROJECT_DIR/build/python +# Generate Doxygen XML documentation +doxygen build/doc/Doxyfile # Install the Python wrapper module and generate Python stubs +cd $PROJECT_DIR/build/python if [ "$(uname)" == "Linux" ]; then make -j $(nproc) install make -j $(nproc) python-stubs From 2d043579528d3abab7d6308d5d6f37ebcff0c5a7 Mon Sep 17 00:00:00 2001 From: Yashas Ambati Date: Wed, 16 Apr 2025 12:06:23 -0400 Subject: [PATCH 2/8] Set GTWRAP_ADD_DOCSTRINGS to ON --- .github/scripts/python_wheels/cibw_before_all.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/scripts/python_wheels/cibw_before_all.sh b/.github/scripts/python_wheels/cibw_before_all.sh index 1906ede89..eab6481c6 100644 --- a/.github/scripts/python_wheels/cibw_before_all.sh +++ b/.github/scripts/python_wheels/cibw_before_all.sh @@ -49,7 +49,8 @@ cmake $PROJECT_DIR \ -DPYTHON_EXECUTABLE:FILEPATH=$(which $PYTHON) \ -DGTSAM_ALLOW_DEPRECATED_SINCE_V43=OFF \ -DCMAKE_INSTALL_PREFIX=$PROJECT_DIR/gtsam_install \ - -DGTSAM_GENERATE_DOC_XML=1 + -DGTSAM_GENERATE_DOC_XML=1 \ + -DGTWRAP_ADD_DOCSTRINGS=ON # Generate Doxygen XML documentation doxygen build/doc/Doxyfile From 0db2a0d16bea88680573ca748daaa1e6ef2cbead Mon Sep 17 00:00:00 2001 From: Yashas Ambati Date: Wed, 16 Apr 2025 12:35:10 -0400 Subject: [PATCH 3/8] Supress boost output --- .github/scripts/python_wheels/cibw_before_all.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/python_wheels/cibw_before_all.sh b/.github/scripts/python_wheels/cibw_before_all.sh index eab6481c6..d0cfc996d 100644 --- a/.github/scripts/python_wheels/cibw_before_all.sh +++ b/.github/scripts/python_wheels/cibw_before_all.sh @@ -21,7 +21,7 @@ if [ "$(uname)" == "Linux" ]; then tar -xzf boost_1_87_0.tar.gz cd boost_1_87_0 ./bootstrap.sh --prefix=/opt/boost - ./b2 install --prefix=/opt/boost --with=all + ./b2 install --prefix=/opt/boost --with=all -d0 cd .. elif [ "$(uname)" == "Darwin" ]; then brew install wget cmake boost doxygen From 7f62e8c65e8df0b1bcd9287161f49866fe7d2bda Mon Sep 17 00:00:00 2001 From: Yashas Ambati Date: Wed, 16 Apr 2025 13:48:24 -0400 Subject: [PATCH 4/8] Fix errors in xml_parser and rerun --- wrap/gtwrap/xml_parser/xml_parser.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/wrap/gtwrap/xml_parser/xml_parser.py b/wrap/gtwrap/xml_parser/xml_parser.py index 9920027ac..e133b4882 100644 --- a/wrap/gtwrap/xml_parser/xml_parser.py +++ b/wrap/gtwrap/xml_parser/xml_parser.py @@ -56,9 +56,14 @@ class XMLDocParser: documenting_index = self.determine_documenting_index( cpp_class, cpp_method, method_args_names, member_defs) + if member_defs: + self.print_if_verbose( + f"Extracted {len(member_defs)} member definitions for {cpp_class}.{cpp_method}." + ) + # Extract the docs for the function that matches cpp_class.cpp_method(*method_args_names). return self.get_formatted_docstring(member_defs[documenting_index], - ignored_params) + ignored_params) if member_defs else "" def get_member_defs(self, xml_folder: str, cpp_class: str, cpp_method: str): @@ -95,7 +100,7 @@ class XMLDocParser: return "" # Create the path to the file with the documentation for cpp_class. - xml_class_file = xml_folder_path / class_index.attrib['refid'] + '.xml' + xml_class_file = xml_folder_path / f"{class_index.attrib['refid']}.xml" # Parse the class file class_tree = self.parse_xml(xml_class_file) From f6ff9745a120276b490964cd1f30f8bb0e0e855d Mon Sep 17 00:00:00 2001 From: Yashas Ambati Date: Wed, 16 Apr 2025 20:13:01 -0400 Subject: [PATCH 5/8] Remove unnecessary change --- wrap/gtwrap/xml_parser/xml_parser.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/wrap/gtwrap/xml_parser/xml_parser.py b/wrap/gtwrap/xml_parser/xml_parser.py index e133b4882..c73b80c4e 100644 --- a/wrap/gtwrap/xml_parser/xml_parser.py +++ b/wrap/gtwrap/xml_parser/xml_parser.py @@ -56,11 +56,6 @@ class XMLDocParser: documenting_index = self.determine_documenting_index( cpp_class, cpp_method, method_args_names, member_defs) - if member_defs: - self.print_if_verbose( - f"Extracted {len(member_defs)} member definitions for {cpp_class}.{cpp_method}." - ) - # Extract the docs for the function that matches cpp_class.cpp_method(*method_args_names). return self.get_formatted_docstring(member_defs[documenting_index], ignored_params) if member_defs else "" From ab3243fd5833f6cf7734be12d737a60aa920505e Mon Sep 17 00:00:00 2001 From: p-zach Date: Wed, 16 Apr 2025 21:12:10 -0400 Subject: [PATCH 6/8] Clarify Symbol --- gtsam/inference/doc/Symbol.ipynb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/gtsam/inference/doc/Symbol.ipynb b/gtsam/inference/doc/Symbol.ipynb index 20d9fd7e2..c9de75957 100644 --- a/gtsam/inference/doc/Symbol.ipynb +++ b/gtsam/inference/doc/Symbol.ipynb @@ -43,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": { "id": "symbol_import_code" }, @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -110,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -151,12 +151,12 @@ "source": [ "## Shorthand Functions\n", "\n", - "GTSAM provides convenient shorthand functions `gtsam.symbol_shorthand.X(j)`, `gtsam.symbol_shorthand.L(j)`, etc., which are equivalent to `gtsam.Symbol('x', j)`, `gtsam.Symbol('l', j)`." + "GTSAM provides convenient shorthand functions `X(j)`, `L(j)`, etc., which are equivalent to `gtsam.Symbol('x', j)`, `gtsam.Symbol('l', j)`. To use these, first import with `from gtsam import symbol_shorthand`, then set up the variables you want to use with statements like `X = symbol_shorthand.X`." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -169,19 +169,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "Symbol('x', 0).key() == gtsam.symbol_shorthand.X(0): True\n", - "Symbol('l', 1).key() == gtsam.symbol_shorthand.L(1): True\n" + "Symbol('x', 0).key() == X(0): True\n", + "Symbol('l', 1).key() == L(1): True\n" ] } ], "source": [ "from gtsam import symbol_shorthand\n", "\n", - "x0_key = symbol_shorthand.X(0)\n", - "l1_key = symbol_shorthand.L(1)\n", + "X = symbol_shorthand.X\n", + "L = symbol_shorthand.L\n", "\n", - "print(f\"Symbol('x', 0).key() == gtsam.symbol_shorthand.X(0): {Symbol('x', 0).key() == x0_key}\")\n", - "print(f\"Symbol('l', 1).key() == gtsam.symbol_shorthand.L(1): {Symbol('l', 1).key() == l1_key}\")" + "print(f\"Symbol('x', 0).key() == X(0): {Symbol('x', 0).key() == X(0)}\")\n", + "print(f\"Symbol('l', 1).key() == L(1): {Symbol('l', 1).key() == L(1)}\")" ] } ], From 768076615a84af4bbfc3caa1a98bee3e6946c75f Mon Sep 17 00:00:00 2001 From: p-zach Date: Wed, 16 Apr 2025 21:12:43 -0400 Subject: [PATCH 7/8] COLAMD vs METIS details --- gtsam/inference/doc/Ordering.ipynb | 2636 +++++++++++++++++++++++++++- 1 file changed, 2603 insertions(+), 33 deletions(-) diff --git a/gtsam/inference/doc/Ordering.ipynb b/gtsam/inference/doc/Ordering.ipynb index 80dbc58f9..1648e8b45 100644 --- a/gtsam/inference/doc/Ordering.ipynb +++ b/gtsam/inference/doc/Ordering.ipynb @@ -17,7 +17,7 @@ "source": [ "An `Ordering` specifies the order in which variables are eliminated during inference (e.g., Gaussian elimination, multifrontal QR). The choice of ordering significantly impacts the computational cost and fill-in (sparsity) of the resulting Bayes net or Bayes tree.\n", "\n", - "GTSAM provides several algorithms to compute good orderings automatically (like COLAMD, METIS) or allows you to specify a custom ordering." + "GTSAM provides several algorithms to compute good orderings automatically, such as COLAMD and METIS (if available), or allows you to specify a custom ordering." ] }, { @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 1, "metadata": { "id": "ordering_import_code" }, @@ -53,9 +53,10 @@ "source": [ "import gtsam\n", "from gtsam import Ordering, VariableIndex\n", - "# Need a graph type for automatic ordering\n", - "from gtsam import SymbolicFactorGraph\n", + "# Need graph types\n", + "from gtsam import SymbolicFactorGraph, SymbolicBayesNet\n", "from gtsam import symbol_shorthand\n", + "import graphviz\n", "\n", "X = symbol_shorthand.X\n", "L = symbol_shorthand.L" @@ -74,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 44, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -99,21 +100,14 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "ordering_auto_code", - "outputId": "789abcde-f012-3456-789a-bcdef0123456" - }, + "execution_count": 45, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "COLAMD Ordering: Position 0: l1, x0, x1, l2, x2\n", - "Constrained COLAMD (x0, x2 last): Position 0: l2, l1, x1, x2, x0\n" + "COLAMD Ordering: Position 0: l1, x0, x1, l2, x2\n" ] } ], @@ -129,13 +123,2589 @@ "graph.push_factor(X(1), L(2))\n", "graph.push_factor(X(2), L(2))\n", "\n", - "# COLAMD (Column Approximate Minimum Degree) ordering\n", + "# COLAMD ordering\n", "colamd_ordering = Ordering.ColamdSymbolicFactorGraph(graph)\n", - "colamd_ordering.print(\"COLAMD Ordering: \")\n", + "colamd_ordering.print(\"COLAMD Ordering: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ordering_auto_intro_md" + }, + "source": [ + "## Automatic Ordering Algorithms: COLAMD vs METIS\n", "\n", - "# Constrained COLAMD (force x0 and x2 to be eliminated last)\n", - "constrained_ordering = Ordering.ColamdConstrainedLastSymbolicFactorGraph(graph, gtsam.KeyVector([X(0), X(2)]))\n", - "constrained_ordering.print(\"Constrained COLAMD (x0, x2 last): \")" + "GTSAM provides algorithms to automatically compute an elimination ordering from a factor graph. Two common algorithms are:\n", + "\n", + "1. **COLAMD (Column Approximate Minimum Degree):** A greedy algorithm that aims to minimize *fill-in* at each elimination step. It typically produces orderings that are good for sparse direct methods executed sequentially.\n", + "2. **METIS:** A graph partitioning algorithm (requires METIS library to be installed when compiling GTSAM). It aims to find orderings that partition the graph well, often leading to more balanced elimination trees which can be beneficial for parallel computation and sometimes reduce overall fill-in compared to purely local greedy methods like COLAMD, especially on large, structured problems.\n", + "\n", + "Let's illustrate the difference using a 2D grid factor graph." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "id": "ordering_grid_setup_code" + }, + "outputs": [], + "source": [ + "# Create a 5x5 grid graph\n", + "ROWS, COLS = 5, 5\n", + "\n", + "# Use 'x' symbols for grid nodes\n", + "X_grid = lambda r, c: gtsam.symbol('x', r * COLS + c)\n", + "\n", + "def create_grid_graph():\n", + " \"\"\"Creates a SymbolicFactorGraph representing a 2D grid.\"\"\"\n", + " graph = SymbolicFactorGraph()\n", + " keys = []\n", + "\n", + " for r in range(ROWS):\n", + " for c in range(COLS):\n", + " key = X_grid(r, c)\n", + " keys.append(key)\n", + " # Add a unary factor (like a prior or measurement)\n", + " graph.push_factor(key)\n", + " # Add binary factors connecting to right and down neighbors\n", + " if c + 1 < COLS:\n", + " key_right = X_grid(r, c + 1)\n", + " graph.push_factor(key, key_right)\n", + " if r + 1 < ROWS:\n", + " key_down = X_grid(r + 1, c)\n", + " graph.push_factor(key, key_down)\n", + " return graph, keys\n", + "\n", + "grid_graph, grid_keys = create_grid_graph()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ordering_grid_viz_md" + }, + "source": [ + "Here's the structure of our 5x5 grid graph. Edges represent factors connecting variables (nodes)." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "ordering_grid_viz_code" + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\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", + "factor2\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352320--factor2\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352321\n", + "\n", + "x1\n", + "\n", + "\n", + "\n", + "var8646911284551352321--factor1\n", + "\n", + "\n", + "\n", + "\n", + "factor3\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352321--factor3\n", + "\n", + "\n", + "\n", + "\n", + "factor4\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352321--factor4\n", + "\n", + "\n", + "\n", + "\n", + "factor5\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352321--factor5\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322\n", + "\n", + "x2\n", + "\n", + "\n", + "\n", + "var8646911284551352322--factor4\n", + "\n", + "\n", + "\n", + "\n", + "factor6\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322--factor6\n", + "\n", + "\n", + "\n", + "\n", + "factor7\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322--factor7\n", + "\n", + "\n", + "\n", + "\n", + "factor8\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322--factor8\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352323\n", + "\n", + "x3\n", + "\n", + "\n", + "\n", + "var8646911284551352323--factor7\n", + "\n", + "\n", + "\n", + "\n", + "factor9\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352323--factor9\n", + "\n", + "\n", + "\n", + "\n", + "factor10\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352323--factor10\n", + "\n", + "\n", + "\n", + "\n", + "factor11\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352323--factor11\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352324\n", + "\n", + "x4\n", + "\n", + "\n", + "\n", + "var8646911284551352324--factor10\n", + "\n", + "\n", + "\n", + "\n", + "factor12\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352324--factor12\n", + "\n", + "\n", + "\n", + "\n", + "factor13\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352324--factor13\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352325\n", + "\n", + "x5\n", + "\n", + "\n", + "\n", + "var8646911284551352325--factor2\n", + "\n", + "\n", + "\n", + "\n", + "factor14\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352325--factor14\n", + "\n", + "\n", + "\n", + "\n", + "factor15\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352325--factor15\n", + "\n", + "\n", + "\n", + "\n", + "factor16\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352325--factor16\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326\n", + "\n", + "x6\n", + "\n", + "\n", + "\n", + "var8646911284551352326--factor5\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326--factor15\n", + "\n", + "\n", + "\n", + "\n", + "factor17\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326--factor17\n", + "\n", + "\n", + "\n", + "\n", + "factor18\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326--factor18\n", + "\n", + "\n", + "\n", + "\n", + "factor19\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326--factor19\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327\n", + "\n", + "x7\n", + "\n", + "\n", + "\n", + "var8646911284551352327--factor8\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327--factor18\n", + "\n", + "\n", + "\n", + "\n", + "factor20\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327--factor20\n", + "\n", + "\n", + "\n", + "\n", + "factor21\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327--factor21\n", + "\n", + "\n", + "\n", + "\n", + "factor22\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327--factor22\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328\n", + "\n", + "x8\n", + "\n", + "\n", + "\n", + "var8646911284551352328--factor11\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328--factor21\n", + "\n", + "\n", + "\n", + "\n", + "factor23\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328--factor23\n", + "\n", + "\n", + "\n", + "\n", + "factor24\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328--factor24\n", + "\n", + "\n", + "\n", + "\n", + "factor25\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328--factor25\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329\n", + "\n", + "x9\n", + "\n", + "\n", + "\n", + "var8646911284551352329--factor13\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329--factor24\n", + "\n", + "\n", + "\n", + "\n", + "factor26\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329--factor26\n", + "\n", + "\n", + "\n", + "\n", + "factor27\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329--factor27\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330\n", + "\n", + "x10\n", + "\n", + "\n", + "\n", + "var8646911284551352330--factor16\n", + "\n", + "\n", + "\n", + "\n", + "factor28\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330--factor28\n", + "\n", + "\n", + "\n", + "\n", + "factor29\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330--factor29\n", + "\n", + "\n", + "\n", + "\n", + "factor30\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330--factor30\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331\n", + "\n", + "x11\n", + "\n", + "\n", + "\n", + "var8646911284551352331--factor19\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331--factor29\n", + "\n", + "\n", + "\n", + "\n", + "factor31\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331--factor31\n", + "\n", + "\n", + "\n", + "\n", + "factor32\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331--factor32\n", + "\n", + "\n", + "\n", + "\n", + "factor33\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331--factor33\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332\n", + "\n", + "x12\n", + "\n", + "\n", + "\n", + "var8646911284551352332--factor22\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332--factor32\n", + "\n", + "\n", + "\n", + "\n", + "factor34\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332--factor34\n", + "\n", + "\n", + "\n", + "\n", + "factor35\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332--factor35\n", + "\n", + "\n", + "\n", + "\n", + "factor36\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332--factor36\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333\n", + "\n", + "x13\n", + "\n", + "\n", + "\n", + "var8646911284551352333--factor25\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333--factor35\n", + "\n", + "\n", + "\n", + "\n", + "factor37\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333--factor37\n", + "\n", + "\n", + "\n", + "\n", + "factor38\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333--factor38\n", + "\n", + "\n", + "\n", + "\n", + "factor39\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333--factor39\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334\n", + "\n", + "x14\n", + "\n", + "\n", + "\n", + "var8646911284551352334--factor27\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334--factor38\n", + "\n", + "\n", + "\n", + "\n", + "factor40\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334--factor40\n", + "\n", + "\n", + "\n", + "\n", + "factor41\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334--factor41\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352335\n", + "\n", + "x15\n", + "\n", + "\n", + "\n", + "var8646911284551352335--factor30\n", + "\n", + "\n", + "\n", + "\n", + "factor42\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352335--factor42\n", + "\n", + "\n", + "\n", + "\n", + "factor43\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352335--factor43\n", + "\n", + "\n", + "\n", + "\n", + "factor44\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352335--factor44\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336\n", + "\n", + "x16\n", + "\n", + "\n", + "\n", + "var8646911284551352336--factor33\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336--factor43\n", + "\n", + "\n", + "\n", + "\n", + "factor45\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336--factor45\n", + "\n", + "\n", + "\n", + "\n", + "factor46\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336--factor46\n", + "\n", + "\n", + "\n", + "\n", + "factor47\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336--factor47\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337\n", + "\n", + "x17\n", + "\n", + "\n", + "\n", + "var8646911284551352337--factor36\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337--factor46\n", + "\n", + "\n", + "\n", + "\n", + "factor48\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337--factor48\n", + "\n", + "\n", + "\n", + "\n", + "factor49\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337--factor49\n", + "\n", + "\n", + "\n", + "\n", + "factor50\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337--factor50\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352338\n", + "\n", + "x18\n", + "\n", + "\n", + "\n", + "var8646911284551352338--factor39\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352338--factor49\n", + "\n", + "\n", + "\n", + "\n", + "factor51\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352338--factor51\n", + "\n", + "\n", + "\n", + "\n", + "factor52\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352338--factor52\n", + "\n", + "\n", + "\n", + "\n", + "factor53\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352338--factor53\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339\n", + "\n", + "x19\n", + "\n", + "\n", + "\n", + "var8646911284551352339--factor41\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339--factor52\n", + "\n", + "\n", + "\n", + "\n", + "factor54\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339--factor54\n", + "\n", + "\n", + "\n", + "\n", + "factor55\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339--factor55\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352340\n", + "\n", + "x20\n", + "\n", + "\n", + "\n", + "var8646911284551352340--factor44\n", + "\n", + "\n", + "\n", + "\n", + "factor56\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352340--factor56\n", + "\n", + "\n", + "\n", + "\n", + "factor57\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352340--factor57\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352341\n", + "\n", + "x21\n", + "\n", + "\n", + "\n", + "var8646911284551352341--factor47\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352341--factor57\n", + "\n", + "\n", + "\n", + "\n", + "factor58\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352341--factor58\n", + "\n", + "\n", + "\n", + "\n", + "factor59\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352341--factor59\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342\n", + "\n", + "x22\n", + "\n", + "\n", + "\n", + "var8646911284551352342--factor50\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342--factor59\n", + "\n", + "\n", + "\n", + "\n", + "factor60\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342--factor60\n", + "\n", + "\n", + "\n", + "\n", + "factor61\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342--factor61\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343\n", + "\n", + "x23\n", + "\n", + "\n", + "\n", + "var8646911284551352343--factor53\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343--factor61\n", + "\n", + "\n", + "\n", + "\n", + "factor62\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343--factor62\n", + "\n", + "\n", + "\n", + "\n", + "factor63\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343--factor63\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352344\n", + "\n", + "x24\n", + "\n", + "\n", + "\n", + "var8646911284551352344--factor55\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352344--factor63\n", + "\n", + "\n", + "\n", + "\n", + "factor64\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352344--factor64\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(graphviz.Source(grid_graph.dot()))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ordering_colamd_md" + }, + "source": [ + "### COLAMD Ordering and Resulting Bayes Net\n", + "\n", + "Now, we compute the COLAMD ordering and eliminate the variables according to this order. We then visualize the resulting Symbolic Bayes Net. The structure of the Bayes Net (specifically, the cliques formed by the conditional dependencies) reflects the structure of the elimination tree (or Bayes Tree)." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ordering_colamd_code", + "outputId": "789abcde-f012-3456-789a-bcdef0123456" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "COLAMD Ordering: \n", + "Position 0: x0, x5, x1, x6, x4, x9, x3, x8, x12, x24\n", + "Position 10: x23, x19, x18, x20, x21, x15, x16, x22, x17, x14\n", + "Position 20: x13, x10, x11, x2, x7\n", + "\n", + "COLAMD Bayes Net Structure:\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352320\n", + "\n", + "x0\n", + "\n", + "\n", + "\n", + "var8646911284551352321\n", + "\n", + "x1\n", + "\n", + "\n", + "\n", + "var8646911284551352321->var8646911284551352320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352325\n", + "\n", + "x5\n", + "\n", + "\n", + "\n", + "var8646911284551352321->var8646911284551352325\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322\n", + "\n", + "x2\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352321\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352323\n", + "\n", + "x3\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352323\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326\n", + "\n", + "x6\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328\n", + "\n", + "x8\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330\n", + "\n", + "x10\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352330\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331\n", + "\n", + "x11\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352331\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333\n", + "\n", + "x13\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334\n", + "\n", + "x14\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352334\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352324\n", + "\n", + "x4\n", + "\n", + "\n", + "\n", + "var8646911284551352323->var8646911284551352324\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329\n", + "\n", + "x9\n", + "\n", + "\n", + "\n", + "var8646911284551352323->var8646911284551352329\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352325->var8646911284551352320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326->var8646911284551352321\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326->var8646911284551352325\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327\n", + "\n", + "x7\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352322\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352330\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352331\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332\n", + "\n", + "x12\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352332\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352334\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337\n", + "\n", + "x17\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352337\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328->var8646911284551352323\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328->var8646911284551352329\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329->var8646911284551352324\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352321\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352325\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352334\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352335\n", + "\n", + "x15\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352335\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336\n", + "\n", + "x16\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352337\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342\n", + "\n", + "x22\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352342\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331->var8646911284551352330\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331->var8646911284551352332\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331->var8646911284551352334\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331->var8646911284551352337\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331->var8646911284551352342\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352332\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352334\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352337\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352338\n", + "\n", + "x18\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352338\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352342\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334->var8646911284551352323\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334->var8646911284551352328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334->var8646911284551352329\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334->var8646911284551352337\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334->var8646911284551352338\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339\n", + "\n", + "x19\n", + "\n", + "\n", + "\n", + "var8646911284551352334->var8646911284551352339\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334->var8646911284551352342\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352340\n", + "\n", + "x20\n", + "\n", + "\n", + "\n", + "var8646911284551352335->var8646911284551352340\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352341\n", + "\n", + "x21\n", + "\n", + "\n", + "\n", + "var8646911284551352335->var8646911284551352341\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336->var8646911284551352335\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336->var8646911284551352341\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352332\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352338\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352342\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352338->var8646911284551352339\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343\n", + "\n", + "x23\n", + "\n", + "\n", + "\n", + "var8646911284551352338->var8646911284551352343\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339->var8646911284551352343\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352344\n", + "\n", + "x24\n", + "\n", + "\n", + "\n", + "var8646911284551352339->var8646911284551352344\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352341->var8646911284551352340\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352335\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352338\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352339\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352341\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352343\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343->var8646911284551352344\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# COLAMD (Column Approximate Minimum Degree) ordering\n", + "colamd_ordering = Ordering.ColamdSymbolicFactorGraph(grid_graph)\n", + "print(\"COLAMD Ordering: \")\n", + "colamd_ordering.print()\n", + "\n", + "# Eliminate using COLAMD ordering\n", + "bayes_net_colamd = grid_graph.eliminateSequential(colamd_ordering)\n", + "\n", + "# Visualize the resulting Bayes Net\n", + "print(\"\\nCOLAMD Bayes Net Structure:\")\n", + "display(graphviz.Source(bayes_net_colamd.dot()))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ordering_metis_md" + }, + "source": [ + "### METIS Ordering and Resulting Bayes Net\n", + "\n", + "Next, we compute the METIS ordering and visualize its resulting Bayes Net. Compare its structure to the one generated by COLAMD." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "id": "ordering_metis_code" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "METIS Ordering: \n", + "Position 0: x21, x1, x15, x11, x5, x20, x0, x16, x6, x10\n", + "Position 10: x24, x4, x18, x14, x8, x23, x3, x19, x9, x13\n", + "Position 20: x7, x17, x2, x22, x12\n", + "\n", + "METIS Bayes Net Structure:\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352320\n", + "\n", + "x0\n", + "\n", + "\n", + "\n", + "var8646911284551352321\n", + "\n", + "x1\n", + "\n", + "\n", + "\n", + "var8646911284551352320->var8646911284551352321\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352325\n", + "\n", + "x5\n", + "\n", + "\n", + "\n", + "var8646911284551352320->var8646911284551352325\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322\n", + "\n", + "x2\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352321\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352323\n", + "\n", + "x3\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352323\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326\n", + "\n", + "x6\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327\n", + "\n", + "x7\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352327\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329\n", + "\n", + "x9\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352329\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330\n", + "\n", + "x10\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352330\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333\n", + "\n", + "x13\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337\n", + "\n", + "x17\n", + "\n", + "\n", + "\n", + "var8646911284551352322->var8646911284551352337\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352324\n", + "\n", + "x4\n", + "\n", + "\n", + "\n", + "var8646911284551352323->var8646911284551352324\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352328\n", + "\n", + "x8\n", + "\n", + "\n", + "\n", + "var8646911284551352323->var8646911284551352328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326->var8646911284551352320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326->var8646911284551352321\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352326->var8646911284551352325\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352331\n", + "\n", + "x11\n", + "\n", + "\n", + "\n", + "var8646911284551352326->var8646911284551352331\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336\n", + "\n", + "x16\n", + "\n", + "\n", + "\n", + "var8646911284551352326->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352323\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352329\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352330\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352327->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329->var8646911284551352323\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329->var8646911284551352324\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352329->var8646911284551352328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352334\n", + "\n", + "x14\n", + "\n", + "\n", + "\n", + "var8646911284551352329->var8646911284551352334\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339\n", + "\n", + "x19\n", + "\n", + "\n", + "\n", + "var8646911284551352329->var8646911284551352339\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352325\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352331\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352335\n", + "\n", + "x15\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352335\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352340\n", + "\n", + "x20\n", + "\n", + "\n", + "\n", + "var8646911284551352330->var8646911284551352340\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332\n", + "\n", + "x12\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352322\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352327\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352330\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352331\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352337\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342\n", + "\n", + "x22\n", + "\n", + "\n", + "\n", + "var8646911284551352332->var8646911284551352342\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352323\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352329\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352334\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352338\n", + "\n", + "x18\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352338\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352339\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343\n", + "\n", + "x23\n", + "\n", + "\n", + "\n", + "var8646911284551352333->var8646911284551352343\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336->var8646911284551352331\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336->var8646911284551352335\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352336->var8646911284551352340\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352341\n", + "\n", + "x21\n", + "\n", + "\n", + "\n", + "var8646911284551352336->var8646911284551352341\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352327\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352329\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352330\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352338\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352339\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352337->var8646911284551352343\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339->var8646911284551352334\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339->var8646911284551352338\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352339->var8646911284551352343\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352344\n", + "\n", + "x24\n", + "\n", + "\n", + "\n", + "var8646911284551352339->var8646911284551352344\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352340->var8646911284551352335\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352340->var8646911284551352341\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352322\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352326\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352327\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352329\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352330\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352333\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352337\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352339\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352340\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352341\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342->var8646911284551352343\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343->var8646911284551352338\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343->var8646911284551352344\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "metis_ordering = Ordering.MetisSymbolicFactorGraph(grid_graph)\n", + "print(\"METIS Ordering: \")\n", + "metis_ordering.print()\n", + "\n", + "# Eliminate using METIS ordering\n", + "bayes_net_metis = grid_graph.eliminateSequential(metis_ordering)\n", + "\n", + "# Visualize the resulting Bayes Net\n", + "print(\"\\nMETIS Bayes Net Structure:\")\n", + "display(graphviz.Source(bayes_net_metis.dot()))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ordering_comparison_md" + }, + "source": [ + "### Comparison\n", + "\n", + "Observe the differences in the Bayes Net structures produced by COLAMD and METIS:\n", + "\n", + "* **COLAMD:** Often produces a more 'stringy' or deeper elimination tree/Bayes Net. The cliques (conditionals in the Bayes Net) might be smaller initially but can grow larger towards the root (variables eliminated last).\n", + "* **METIS:** Tends to produce a more 'bushy' or balanced tree. It tries to partition the graph, eliminating variables within partitions first, leading to potentially larger initial cliques but often a shallower overall structure and smaller separators (variables connecting cliques high up in the tree). \n", + "\n", + "When should you choose one over the other? The best choice often depends on the specific problem structure and computational goals:\n", + "\n", + "* **Use COLAMD when:**\n", + " * You need a good, general-purpose ordering quickly. COLAMD is typically much faster *to compute the ordering itself* than METIS.\n", + " * You are primarily using a *sequential* solver (running on a single CPU core). COLAMD's greedy strategy is often well-suited for minimizing fill-in in this scenario.\n", + " * The factor graph is relatively small or doesn't have a highly regular structure where complex partitioning would yield significant benefits.\n", + "\n", + "* **Use METIS when:**\n", + " * You are aiming for maximum performance with a *parallel* solver (e.g., using GTSAM's multifrontal solvers with TBB). METIS's graph partitioning approach tends to create more balanced elimination trees, which allows for better workload distribution across multiple CPU cores.\n", + " * You are dealing with very large-scale problems, especially those with a regular structure (like large grids, meshes from finite element analysis, or extensive SLAM maps). On such problems, METIS can sometimes find an ordering with significantly less *total fill-in* than COLAMD, leading to faster factorization, even if computing the ordering itself takes longer.\n", + " * The cost of computing the ordering is negligible compared to the cost of the subsequent factorization and solve steps (e.g., you compute the ordering once for a structure that is solved repeatedly).\n", + "\n", + "**In summary:** COLAMD is a robust and fast default. METIS is often the preferred choice for large-scale problems and parallel execution, potentially offering better final factorization performance at the cost of a slower ordering computation. Experimentation on your specific problem type might be necessary to determine the optimal choice.\n", + "\n", + "For more information on COLAMD and METIS, see [Factor Graphs for Robot Perception](https://www.cs.cmu.edu/~kaess/pub/Dellaert17fnt.pdf)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ordering_constrained_md" + }, + "source": [ + "### Constrained Ordering\n", + "\n", + "Sometimes, we want to force certain variables to be eliminated last (e.g., the current robot pose in SLAM). `Ordering.ColamdConstrainedLast` allows this for COLAMD." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ordering_constrained_code", + "outputId": "89abcdef-0123-4567-89ab-cdef01234567" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Constrained COLAMD (x0, x24 last):\n", + "Position 0: x5, x1, x6, x23, x20, x21, x15, x16, x22, x12\n", + "Position 10: x19, x4, x9, x3, x8, x14, x13, x18, x17, x2\n", + "Position 20: x7, x10, x11, x24, x0\n" + ] + } + ], + "source": [ + "# Example: Constrained COLAMD forcing corners (x0, x24) to be eliminated last\n", + "# Note: We use the grid_graph defined earlier\n", + "corner_keys = gtsam.KeyVector([X_grid(0, 0), X_grid(ROWS-1, COLS-1)])\n", + "constrained_ordering = Ordering.ColamdConstrainedLastSymbolicFactorGraph(grid_graph, corner_keys)\n", + "print(f\"Constrained COLAMD ({gtsam.DefaultKeyFormatter(corner_keys[0])}, {gtsam.DefaultKeyFormatter(corner_keys[1])} last):\")\n", + "constrained_ordering.print()" ] }, { @@ -151,7 +2721,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 52, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -164,17 +2734,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "Ordering size: 5\n", - "Key at position 0: l1\n" + "COLAMD Ordering size: 25\n", + "Key at position 0 (COLAMD): x0\n" ] } ], "source": [ - "print(f\"Ordering size: {colamd_ordering.size()}\")\n", + "print(f\"COLAMD Ordering size: {colamd_ordering.size()}\")\n", "\n", "# Access by index\n", "key_at_0 = colamd_ordering.at(0)\n", - "print(f\"Key at position 0: {gtsam.DefaultKeyFormatter(key_at_0)}\")" + "print(f\"Key at position 0 (COLAMD): {gtsam.DefaultKeyFormatter(key_at_0)}\")" ] }, { @@ -185,12 +2755,12 @@ "source": [ "## Appending Keys\n", "\n", - "You can append keys using `push_back`." + "You can append keys to an existing ordering using `push_back`." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 53, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -203,23 +2773,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "Appended Ordering: Position 0: l1, x0, x1, l2, x2, l0, x3\n" + "Appended Ordering: Position 0: x0, x5, x1, x6, x4, x9, x3, x8, x12, x24\n", + "Position 10: x23, x19, x18, x20, x21, x15, x16, x22, x17, x14\n", + "Position 20: x13, x10, x11, x2, x7, l0, x25\n" ] } ], "source": [ + "# Use the COLAMD ordering from the grid example\n", "appended_ordering = Ordering(colamd_ordering)\n", - "appended_ordering.push_back(L(0))\n", - "appended_ordering.push_back(X(3))\n", + "appended_ordering.push_back(L(0)) # Append a landmark key\n", + "appended_ordering.push_back(X(ROWS*COLS)) # Append a new pose key x25\n", "\n", "appended_ordering.print(\"Appended Ordering: \")" ] } ], "metadata": { - "colab": { - "provenance": [] - }, "kernelspec": { "display_name": "gtsam", "language": "python", From eee10eb75dfe42b647c7ec9e04c9362bd6840fa4 Mon Sep 17 00:00:00 2001 From: p-zach Date: Wed, 16 Apr 2025 23:41:41 -0400 Subject: [PATCH 8/8] Ameliorate visuals --- gtsam/inference/doc/Ordering.ipynb | 2614 ++++------------------------ 1 file changed, 348 insertions(+), 2266 deletions(-) diff --git a/gtsam/inference/doc/Ordering.ipynb b/gtsam/inference/doc/Ordering.ipynb index 1648e8b45..9f4a595ed 100644 --- a/gtsam/inference/doc/Ordering.ipynb +++ b/gtsam/inference/doc/Ordering.ipynb @@ -45,16 +45,16 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 21, "metadata": { "id": "ordering_import_code" }, "outputs": [], "source": [ "import gtsam\n", - "from gtsam import Ordering, VariableIndex\n", + "from gtsam import Ordering\n", "# Need graph types\n", - "from gtsam import SymbolicFactorGraph, SymbolicBayesNet\n", + "from gtsam import SymbolicFactorGraph\n", "from gtsam import symbol_shorthand\n", "import graphviz\n", "\n", @@ -75,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -100,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -146,29 +146,29 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 24, "metadata": { "id": "ordering_grid_setup_code" }, "outputs": [], "source": [ - "# Create a 5x5 grid graph\n", - "ROWS, COLS = 5, 5\n", + "# Create a 3x4 grid graph\n", + "ROWS, COLS = 3, 4\n", "\n", "# Use 'x' symbols for grid nodes\n", - "X_grid = lambda r, c: gtsam.symbol('x', r * COLS + c)\n", + "X_grid = lambda r, c: X(10 * (r + 1) + c + 1)\n", + "\n", "\n", "def create_grid_graph():\n", " \"\"\"Creates a SymbolicFactorGraph representing a 2D grid.\"\"\"\n", " graph = SymbolicFactorGraph()\n", " keys = []\n", - "\n", + " positions = {}\n", " for r in range(ROWS):\n", " for c in range(COLS):\n", " key = X_grid(r, c)\n", + " positions[key] = gtsam.Point2(c, COLS-r)\n", " keys.append(key)\n", - " # Add a unary factor (like a prior or measurement)\n", - " graph.push_factor(key)\n", " # Add binary factors connecting to right and down neighbors\n", " if c + 1 < COLS:\n", " key_right = X_grid(r, c + 1)\n", @@ -176,9 +176,10 @@ " if r + 1 < ROWS:\n", " key_down = X_grid(r + 1, c)\n", " graph.push_factor(key, key_down)\n", - " return graph, keys\n", + " return graph, keys, positions\n", "\n", - "grid_graph, grid_keys = create_grid_graph()" + "\n", + "grid_graph, grid_keys, positions = create_grid_graph()" ] }, { @@ -187,15 +188,13 @@ "id": "ordering_grid_viz_md" }, "source": [ - "Here's the structure of our 5x5 grid graph. Edges represent factors connecting variables (nodes)." + "Here's the structure of our grid graph. Edges represent factors connecting variables (nodes)." ] }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "id": "ordering_grid_viz_code" - }, + "execution_count": 25, + "metadata": {}, "outputs": [ { "data": { @@ -206,1015 +205,172 @@ "\n", "\n", - "\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", - "factor2\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352320--factor2\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352321\n", - "\n", - "x1\n", - "\n", - "\n", - "\n", - "var8646911284551352321--factor1\n", - "\n", - "\n", - "\n", - "\n", - "factor3\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352321--factor3\n", - "\n", - "\n", - "\n", - "\n", - "factor4\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352321--factor4\n", - "\n", - "\n", - "\n", - "\n", - "factor5\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352321--factor5\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352322\n", - "\n", - "x2\n", - "\n", - "\n", - "\n", - "var8646911284551352322--factor4\n", - "\n", - "\n", - "\n", - "\n", - "factor6\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352322--factor6\n", - "\n", - "\n", - "\n", - "\n", - "factor7\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352322--factor7\n", - "\n", - "\n", - "\n", - "\n", - "factor8\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352322--factor8\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352323\n", - "\n", - "x3\n", - "\n", - "\n", - "\n", - "var8646911284551352323--factor7\n", - "\n", - "\n", - "\n", - "\n", - "factor9\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352323--factor9\n", - "\n", - "\n", - "\n", - "\n", - "factor10\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352323--factor10\n", - "\n", - "\n", - "\n", - "\n", - "factor11\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352323--factor11\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352324\n", - "\n", - "x4\n", - "\n", - "\n", - "\n", - "var8646911284551352324--factor10\n", - "\n", - "\n", - "\n", - "\n", - "factor12\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352324--factor12\n", - "\n", - "\n", - "\n", - "\n", - "factor13\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352324--factor13\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352325\n", - "\n", - "x5\n", - "\n", - "\n", - "\n", - "var8646911284551352325--factor2\n", - "\n", - "\n", - "\n", - "\n", - "factor14\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352325--factor14\n", - "\n", - "\n", - "\n", - "\n", - "factor15\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352325--factor15\n", - "\n", - "\n", - "\n", - "\n", - "factor16\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352325--factor16\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326\n", - "\n", - "x6\n", - "\n", - "\n", - "\n", - "var8646911284551352326--factor5\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326--factor15\n", - "\n", - "\n", - "\n", - "\n", - "factor17\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326--factor17\n", - "\n", - "\n", - "\n", - "\n", - "factor18\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326--factor18\n", - "\n", - "\n", - "\n", - "\n", - "factor19\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326--factor19\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327\n", - "\n", - "x7\n", - "\n", - "\n", - "\n", - "var8646911284551352327--factor8\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327--factor18\n", - "\n", - "\n", - "\n", - "\n", - "factor20\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327--factor20\n", - "\n", - "\n", - "\n", - "\n", - "factor21\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327--factor21\n", - "\n", - "\n", - "\n", - "\n", - "factor22\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327--factor22\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328\n", - "\n", - "x8\n", - "\n", - "\n", - "\n", - "var8646911284551352328--factor11\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328--factor21\n", - "\n", - "\n", - "\n", - "\n", - "factor23\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328--factor23\n", - "\n", - "\n", - "\n", - "\n", - "factor24\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328--factor24\n", - "\n", - "\n", - "\n", - "\n", - "factor25\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328--factor25\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329\n", - "\n", - "x9\n", - "\n", - "\n", - "\n", - "var8646911284551352329--factor13\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329--factor24\n", - "\n", - "\n", - "\n", - "\n", - "factor26\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329--factor26\n", - "\n", - "\n", - "\n", - "\n", - "factor27\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329--factor27\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330\n", - "\n", - "x10\n", - "\n", - "\n", - "\n", - "var8646911284551352330--factor16\n", - "\n", - "\n", - "\n", - "\n", - "factor28\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330--factor28\n", - "\n", - "\n", - "\n", - "\n", - "factor29\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330--factor29\n", - "\n", - "\n", - "\n", - "\n", - "factor30\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330--factor30\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "var8646911284551352331\n", - "\n", - "x11\n", - "\n", - "\n", - "\n", - "var8646911284551352331--factor19\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331--factor29\n", - "\n", - "\n", - "\n", - "\n", - "factor31\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331--factor31\n", - "\n", - "\n", - "\n", - "\n", - "factor32\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331--factor32\n", - "\n", - "\n", - "\n", - "\n", - "factor33\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331--factor33\n", - "\n", + "\n", + "x11\n", "\n", "\n", - "\n", + "\n", "var8646911284551352332\n", - "\n", - "x12\n", + "\n", + "x12\n", "\n", - "\n", - "\n", - "var8646911284551352332--factor22\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332--factor32\n", - "\n", - "\n", - "\n", - "\n", - "factor34\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332--factor34\n", - "\n", - "\n", - "\n", - "\n", - "factor35\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332--factor35\n", - "\n", - "\n", - "\n", - "\n", - "factor36\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332--factor36\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333\n", - "\n", - "x13\n", - "\n", - "\n", - "\n", - "var8646911284551352333--factor25\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333--factor35\n", - "\n", - "\n", - "\n", - "\n", - "factor37\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333--factor37\n", - "\n", - "\n", - "\n", - "\n", - "factor38\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333--factor38\n", - "\n", - "\n", - "\n", - "\n", - "factor39\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333--factor39\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334\n", - "\n", - "x14\n", - "\n", - "\n", - "\n", - "var8646911284551352334--factor27\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334--factor38\n", - "\n", - "\n", - "\n", - "\n", - "factor40\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334--factor40\n", - "\n", - "\n", - "\n", - "\n", - "factor41\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334--factor41\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352335\n", - "\n", - "x15\n", - "\n", - "\n", - "\n", - "var8646911284551352335--factor30\n", - "\n", - "\n", - "\n", - "\n", - "factor42\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352335--factor42\n", - "\n", - "\n", - "\n", - "\n", - "factor43\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352335--factor43\n", - "\n", - "\n", - "\n", - "\n", - "factor44\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352335--factor44\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336\n", - "\n", - "x16\n", - "\n", - "\n", - "\n", - "var8646911284551352336--factor33\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336--factor43\n", - "\n", - "\n", - "\n", - "\n", - "factor45\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336--factor45\n", - "\n", - "\n", - "\n", - "\n", - "factor46\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336--factor46\n", - "\n", - "\n", - "\n", - "\n", - "factor47\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336--factor47\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337\n", - "\n", - "x17\n", - "\n", - "\n", - "\n", - "var8646911284551352337--factor36\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337--factor46\n", - "\n", - "\n", - "\n", - "\n", - "factor48\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337--factor48\n", - "\n", - "\n", - "\n", - "\n", - "factor49\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337--factor49\n", - "\n", - "\n", - "\n", - "\n", - "factor50\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337--factor50\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352338\n", - "\n", - "x18\n", - "\n", - "\n", - "\n", - "var8646911284551352338--factor39\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352338--factor49\n", - "\n", - "\n", - "\n", - "\n", - "factor51\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352338--factor51\n", - "\n", - "\n", - "\n", - "\n", - "factor52\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352338--factor52\n", - "\n", - "\n", - "\n", - "\n", - "factor53\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352338--factor53\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339\n", - "\n", - "x19\n", - "\n", - "\n", - "\n", - "var8646911284551352339--factor41\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339--factor52\n", - "\n", - "\n", - "\n", - "\n", - "factor54\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339--factor54\n", - "\n", - "\n", - "\n", - "\n", - "factor55\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339--factor55\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352340\n", - "\n", - "x20\n", - "\n", - "\n", - "\n", - "var8646911284551352340--factor44\n", - "\n", - "\n", - "\n", - "\n", - "factor56\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352340--factor56\n", - "\n", - "\n", - "\n", - "\n", - "factor57\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352340--factor57\n", - "\n", + "\n", + "\n", + "var8646911284551352331--var8646911284551352332\n", + "\n", "\n", "\n", - "\n", + "\n", "var8646911284551352341\n", - "\n", - "x21\n", + "\n", + "x21\n", "\n", - "\n", - "\n", - "var8646911284551352341--factor47\n", - "\n", + "\n", + "\n", + "var8646911284551352331--var8646911284551352341\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352341--factor57\n", - "\n", + "\n", + "\n", + "var8646911284551352333\n", + "\n", + "x13\n", "\n", - "\n", - "\n", - "factor58\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352341--factor58\n", - "\n", - "\n", - "\n", - "\n", - "factor59\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352341--factor59\n", - "\n", + "\n", + "\n", + "var8646911284551352332--var8646911284551352333\n", + "\n", "\n", "\n", - "\n", + "\n", "var8646911284551352342\n", - "\n", - "x22\n", + "\n", + "x22\n", "\n", - "\n", - "\n", - "var8646911284551352342--factor50\n", - "\n", + "\n", + "\n", + "var8646911284551352332--var8646911284551352342\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352342--factor59\n", - "\n", + "\n", + "\n", + "var8646911284551352334\n", + "\n", + "x14\n", "\n", - "\n", - "\n", - "factor60\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342--factor60\n", - "\n", - "\n", - "\n", - "\n", - "factor61\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342--factor61\n", - "\n", + "\n", + "\n", + "var8646911284551352333--var8646911284551352334\n", + "\n", "\n", "\n", - "\n", + "\n", "var8646911284551352343\n", - "\n", - "x23\n", + "\n", + "x23\n", "\n", - "\n", - "\n", - "var8646911284551352343--factor53\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352343--factor61\n", - "\n", - "\n", - "\n", - "\n", - "factor62\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352343--factor62\n", - "\n", - "\n", - "\n", - "\n", - "factor63\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352343--factor63\n", - "\n", + "\n", + "\n", + "var8646911284551352333--var8646911284551352343\n", + "\n", "\n", "\n", - "\n", + "\n", "var8646911284551352344\n", - "\n", - "x24\n", + "\n", + "x24\n", "\n", - "\n", - "\n", - "var8646911284551352344--factor55\n", - "\n", + "\n", + "\n", + "var8646911284551352334--var8646911284551352344\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352344--factor63\n", - "\n", + "\n", + "\n", + "var8646911284551352341--var8646911284551352342\n", + "\n", "\n", - "\n", - "\n", - "factor64\n", - "\n", + "\n", + "\n", + "var8646911284551352351\n", + "\n", + "x31\n", "\n", - "\n", - "\n", - "var8646911284551352344--factor64\n", - "\n", + "\n", + "\n", + "var8646911284551352341--var8646911284551352351\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352342--var8646911284551352343\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352352\n", + "\n", + "x32\n", + "\n", + "\n", + "\n", + "var8646911284551352342--var8646911284551352352\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352343--var8646911284551352344\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352353\n", + "\n", + "x33\n", + "\n", + "\n", + "\n", + "var8646911284551352343--var8646911284551352353\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352354\n", + "\n", + "x34\n", + "\n", + "\n", + "\n", + "var8646911284551352344--var8646911284551352354\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352351--var8646911284551352352\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352352--var8646911284551352353\n", + "\n", + "\n", + "\n", + "\n", + "var8646911284551352353--var8646911284551352354\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1222,7 +378,9 @@ } ], "source": [ - "display(graphviz.Source(grid_graph.dot()))" + "writer = gtsam.DotWriter(binaryEdges = True)\n", + "writer.variablePositions = positions\n", + "display(graphviz.Source(grid_graph.dot(writer=writer), engine='neato'))" ] }, { @@ -1238,7 +396,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 26, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1252,9 +410,14 @@ "output_type": "stream", "text": [ "COLAMD Ordering: \n", - "Position 0: x0, x5, x1, x6, x4, x9, x3, x8, x12, x24\n", - "Position 10: x23, x19, x18, x20, x21, x15, x16, x22, x17, x14\n", - "Position 20: x13, x10, x11, x2, x7\n", + "Position 0: x11, x31, x14, x34, x33, x24, x23, x32, x13, x22\n", + "Position 10: x21, x12\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "\n", "COLAMD Bayes Net Structure:\n" ] @@ -1267,628 +430,119 @@ " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "G\n", + "\n", + "\n", "\n", - "var8646911284551352320\n", - "\n", - "x0\n", + "0\n", + "\n", + "x11, x21, x12\n", "\n", - "\n", + "\n", "\n", - "var8646911284551352321\n", - "\n", - "x1\n", + "1\n", + "\n", + "x13, x22 : x12, x21\n", "\n", - "\n", - "\n", - "var8646911284551352321->var8646911284551352320\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352325\n", - "\n", - "x5\n", - "\n", - "\n", - "\n", - "var8646911284551352321->var8646911284551352325\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352322\n", - "\n", - "x2\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352321\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352323\n", - "\n", - "x3\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352323\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326\n", - "\n", - "x6\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352326\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328\n", - "\n", - "x8\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352328\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330\n", - "\n", - "x10\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352330\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331\n", - "\n", - "x11\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352331\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333\n", - "\n", - "x13\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352333\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334\n", - "\n", - "x14\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352334\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352324\n", - "\n", - "x4\n", - "\n", - "\n", - "\n", - "var8646911284551352323->var8646911284551352324\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329\n", - "\n", - "x9\n", - "\n", - "\n", - "\n", - "var8646911284551352323->var8646911284551352329\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352325->var8646911284551352320\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326->var8646911284551352321\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326->var8646911284551352325\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327\n", - "\n", - "x7\n", - "\n", - "\n", + "\n", "\n", - "var8646911284551352327->var8646911284551352322\n", - "\n", - "\n", + "0->1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352326\n", - "\n", - "\n", + "\n", + "\n", + "2\n", + "\n", + "x32 : x13, x21, x22\n", "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352328\n", - "\n", - "\n", + "\n", + "\n", + "1->2\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352330\n", - "\n", - "\n", + "\n", + "\n", + "3\n", + "\n", + "x31 : x21, x32\n", "\n", - "\n", + "\n", "\n", - "var8646911284551352327->var8646911284551352331\n", - "\n", - "\n", + "2->3\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352332\n", - "\n", - "x12\n", + "\n", + "\n", + "4\n", + "\n", + "x23 : x13, x22, x32\n", "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352332\n", - "\n", - "\n", + "\n", + "\n", + "2->4\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352333\n", - "\n", - "\n", + "\n", + "\n", + "5\n", + "\n", + "x24 : x13, x23, x32\n", "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352334\n", - "\n", - "\n", + "\n", + "\n", + "4->5\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352337\n", - "\n", - "x17\n", + "\n", + "\n", + "6\n", + "\n", + "x14 : x13, x24\n", "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352337\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328->var8646911284551352323\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328->var8646911284551352329\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329->var8646911284551352324\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352321\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352325\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352326\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352333\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352334\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352335\n", - "\n", - "x15\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352335\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336\n", - "\n", - "x16\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352337\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342\n", - "\n", - "x22\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352342\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331->var8646911284551352326\n", - "\n", - "\n", - "\n", - "\n", + "\n", "\n", - "var8646911284551352331->var8646911284551352330\n", - "\n", - "\n", + "5->6\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352331->var8646911284551352332\n", - "\n", - "\n", + "\n", + "\n", + "7\n", + "\n", + "x33 : x23, x24, x32\n", "\n", - "\n", - "\n", - "var8646911284551352331->var8646911284551352333\n", - "\n", - "\n", + "\n", + "\n", + "5->7\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352331->var8646911284551352334\n", - "\n", - "\n", + "\n", + "\n", + "8\n", + "\n", + "x34 : x24, x33\n", "\n", - "\n", - "\n", - "var8646911284551352331->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331->var8646911284551352337\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331->var8646911284551352342\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352328\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352332\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352334\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352337\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352338\n", - "\n", - "x18\n", - "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352338\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352342\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334->var8646911284551352323\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334->var8646911284551352328\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334->var8646911284551352329\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334->var8646911284551352337\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334->var8646911284551352338\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339\n", - "\n", - "x19\n", - "\n", - "\n", - "\n", - "var8646911284551352334->var8646911284551352339\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334->var8646911284551352342\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352340\n", - "\n", - "x20\n", - "\n", - "\n", - "\n", - "var8646911284551352335->var8646911284551352340\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352341\n", - "\n", - "x21\n", - "\n", - "\n", - "\n", - "var8646911284551352335->var8646911284551352341\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336->var8646911284551352335\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336->var8646911284551352341\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352332\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352338\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352342\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352338->var8646911284551352339\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352343\n", - "\n", - "x23\n", - "\n", - "\n", - "\n", - "var8646911284551352338->var8646911284551352343\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339->var8646911284551352343\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352344\n", - "\n", - "x24\n", - "\n", - "\n", - "\n", - "var8646911284551352339->var8646911284551352344\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352341->var8646911284551352340\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352335\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352338\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352339\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352341\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352343\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352343->var8646911284551352344\n", - "\n", - "\n", + "\n", + "\n", + "7->8\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1902,11 +556,11 @@ "colamd_ordering.print()\n", "\n", "# Eliminate using COLAMD ordering\n", - "bayes_net_colamd = grid_graph.eliminateSequential(colamd_ordering)\n", + "bayes_tree_colamd = grid_graph.eliminateMultifrontal(colamd_ordering)\n", "\n", "# Visualize the resulting Bayes Net\n", "print(\"\\nCOLAMD Bayes Net Structure:\")\n", - "display(graphviz.Source(bayes_net_colamd.dot()))" + "display(graphviz.Source(bayes_tree_colamd.dot()))" ] }, { @@ -1922,7 +576,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 27, "metadata": { "id": "ordering_metis_code" }, @@ -1932,9 +586,8 @@ "output_type": "stream", "text": [ "METIS Ordering: \n", - "Position 0: x21, x1, x15, x11, x5, x20, x0, x16, x6, x10\n", - "Position 10: x24, x4, x18, x14, x8, x23, x3, x19, x9, x13\n", - "Position 20: x7, x17, x2, x22, x12\n", + "Position 0: x34, x23, x14, x24, x13, x32, x11, x31, x21, x12\n", + "Position 10: x33, x22\n", "\n", "METIS Bayes Net Structure:\n" ] @@ -1947,676 +600,107 @@ " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "G\n", + "\n", + "\n", "\n", - "var8646911284551352320\n", - "\n", - "x0\n", + "8\n", + "\n", + "x21, x12, x33, x22\n", "\n", - "\n", + "\n", "\n", - "var8646911284551352321\n", - "\n", - "x1\n", + "9\n", + "\n", + "x11 : x12, x21\n", "\n", - "\n", - "\n", - "var8646911284551352320->var8646911284551352321\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352325\n", - "\n", - "x5\n", - "\n", - "\n", - "\n", - "var8646911284551352320->var8646911284551352325\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352322\n", - "\n", - "x2\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352320\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352321\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352323\n", - "\n", - "x3\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352323\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326\n", - "\n", - "x6\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352326\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327\n", - "\n", - "x7\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352327\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329\n", - "\n", - "x9\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352329\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330\n", - "\n", - "x10\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352330\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333\n", - "\n", - "x13\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352333\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337\n", - "\n", - "x17\n", - "\n", - "\n", - "\n", - "var8646911284551352322->var8646911284551352337\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352324\n", - "\n", - "x4\n", - "\n", - "\n", - "\n", - "var8646911284551352323->var8646911284551352324\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352328\n", - "\n", - "x8\n", - "\n", - "\n", - "\n", - "var8646911284551352323->var8646911284551352328\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326->var8646911284551352320\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326->var8646911284551352321\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352326->var8646911284551352325\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352331\n", - "\n", - "x11\n", - "\n", - "\n", - "\n", - "var8646911284551352326->var8646911284551352331\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336\n", - "\n", - "x16\n", - "\n", - "\n", - "\n", - "var8646911284551352326->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352323\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352326\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352328\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352329\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352330\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352327->var8646911284551352333\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329->var8646911284551352323\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329->var8646911284551352324\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352329->var8646911284551352328\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352334\n", - "\n", - "x14\n", - "\n", - "\n", - "\n", - "var8646911284551352329->var8646911284551352334\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339\n", - "\n", - "x19\n", - "\n", - "\n", - "\n", - "var8646911284551352329->var8646911284551352339\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352320\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352325\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352326\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352331\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352335\n", - "\n", - "x15\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352335\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352340\n", - "\n", - "x20\n", - "\n", - "\n", - "\n", - "var8646911284551352330->var8646911284551352340\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332\n", - "\n", - "x12\n", - "\n", - "\n", - "\n", - "var8646911284551352332->var8646911284551352322\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332->var8646911284551352326\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332->var8646911284551352327\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332->var8646911284551352330\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332->var8646911284551352331\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332->var8646911284551352333\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352332->var8646911284551352337\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342\n", - "\n", - "x22\n", - "\n", - "\n", + "\n", "\n", - "var8646911284551352332->var8646911284551352342\n", - "\n", - "\n", + "8->9\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352323\n", - "\n", - "\n", + "\n", + "\n", + "10\n", + "\n", + "x31 : x21, x22, x33\n", "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352328\n", - "\n", - "\n", + "\n", + "\n", + "8->10\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352329\n", - "\n", - "\n", + "\n", + "\n", + "12\n", + "\n", + "x13 : x12, x22, x33\n", "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352334\n", - "\n", - "\n", + "\n", + "\n", + "8->12\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352338\n", - "\n", - "x18\n", + "\n", + "\n", + "11\n", + "\n", + "x32 : x22, x31, x33\n", "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352338\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352339\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352343\n", - "\n", - "x23\n", - "\n", - "\n", - "\n", - "var8646911284551352333->var8646911284551352343\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336->var8646911284551352331\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336->var8646911284551352335\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352336->var8646911284551352340\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352341\n", - "\n", - "x21\n", - "\n", - "\n", - "\n", - "var8646911284551352336->var8646911284551352341\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352326\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352327\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352329\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352330\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352333\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352338\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352339\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352337->var8646911284551352343\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339->var8646911284551352334\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339->var8646911284551352338\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352339->var8646911284551352343\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352344\n", - "\n", - "x24\n", - "\n", - "\n", - "\n", - "var8646911284551352339->var8646911284551352344\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352340->var8646911284551352335\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352340->var8646911284551352341\n", - "\n", - "\n", - "\n", - "\n", + "\n", "\n", - "var8646911284551352342->var8646911284551352322\n", - "\n", - "\n", + "10->11\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352326\n", - "\n", - "\n", + "\n", + "\n", + "13\n", + "\n", + "x23, x24 : x13, x22, x33\n", "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352327\n", - "\n", - "\n", + "\n", + "\n", + "12->13\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352329\n", - "\n", - "\n", + "\n", + "\n", + "14\n", + "\n", + "x14 : x13, x24\n", "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352330\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352333\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352336\n", - "\n", - "\n", - "\n", - "\n", + "\n", "\n", - "var8646911284551352342->var8646911284551352337\n", - "\n", - "\n", + "13->14\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352339\n", - "\n", - "\n", + "\n", + "\n", + "15\n", + "\n", + "x34 : x24, x33\n", "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352340\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352341\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352342->var8646911284551352343\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352343->var8646911284551352338\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var8646911284551352343->var8646911284551352344\n", - "\n", - "\n", + "\n", + "\n", + "13->15\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2629,11 +713,11 @@ "metis_ordering.print()\n", "\n", "# Eliminate using METIS ordering\n", - "bayes_net_metis = grid_graph.eliminateSequential(metis_ordering)\n", + "bayes_tree_metis = grid_graph.eliminateMultifrontal(metis_ordering)\n", "\n", "# Visualize the resulting Bayes Net\n", "print(\"\\nMETIS Bayes Net Structure:\")\n", - "display(graphviz.Source(bayes_net_metis.dot()))" + "display(graphviz.Source(bayes_tree_metis.dot()))" ] }, { @@ -2644,9 +728,9 @@ "source": [ "### Comparison\n", "\n", - "Observe the differences in the Bayes Net structures produced by COLAMD and METIS:\n", + "Observe the differences in the Bayes tree structures produced by COLAMD and METIS:\n", "\n", - "* **COLAMD:** Often produces a more 'stringy' or deeper elimination tree/Bayes Net. The cliques (conditionals in the Bayes Net) might be smaller initially but can grow larger towards the root (variables eliminated last).\n", + "* **COLAMD:** Often produces a more 'stringy' or deeper Bayes tree. The cliques (conditionals in the Bayes tree) might be smaller initially but can grow larger towards the root (variables eliminated last).\n", "* **METIS:** Tends to produce a more 'bushy' or balanced tree. It tries to partition the graph, eliminating variables within partitions first, leading to potentially larger initial cliques but often a shallower overall structure and smaller separators (variables connecting cliques high up in the tree). \n", "\n", "When should you choose one over the other? The best choice often depends on the specific problem structure and computational goals:\n", @@ -2657,7 +741,7 @@ " * The factor graph is relatively small or doesn't have a highly regular structure where complex partitioning would yield significant benefits.\n", "\n", "* **Use METIS when:**\n", - " * You are aiming for maximum performance with a *parallel* solver (e.g., using GTSAM's multifrontal solvers with TBB). METIS's graph partitioning approach tends to create more balanced elimination trees, which allows for better workload distribution across multiple CPU cores.\n", + " * You are aiming for maximum performance with a *parallel* solver (e.g., using GTSAM's multifrontal solvers with TBB). METIS's graph partitioning approach tends to create more balanced Bayes trees, which allows for better workload distribution across multiple CPU cores.\n", " * You are dealing with very large-scale problems, especially those with a regular structure (like large grids, meshes from finite element analysis, or extensive SLAM maps). On such problems, METIS can sometimes find an ordering with significantly less *total fill-in* than COLAMD, leading to faster factorization, even if computing the ordering itself takes longer.\n", " * The cost of computing the ordering is negligible compared to the cost of the subsequent factorization and solve steps (e.g., you compute the ordering once for a structure that is solved repeatedly).\n", "\n", @@ -2679,7 +763,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -2692,10 +776,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Constrained COLAMD (x0, x24 last):\n", - "Position 0: x5, x1, x6, x23, x20, x21, x15, x16, x22, x12\n", - "Position 10: x19, x4, x9, x3, x8, x14, x13, x18, x17, x2\n", - "Position 20: x7, x10, x11, x24, x0\n" + "Constrained COLAMD (x11, x34 last):\n", + "Position 0: x31, x32, x21, x14, x24, x13, x23, x33, x22, x12\n", + "Position 10: x34, x11\n" ] } ], @@ -2721,7 +804,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -2734,8 +817,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "COLAMD Ordering size: 25\n", - "Key at position 0 (COLAMD): x0\n" + "COLAMD Ordering size: 12\n", + "Key at position 0 (COLAMD): x11\n" ] } ], @@ -2760,7 +843,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 30, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -2773,9 +856,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Appended Ordering: Position 0: x0, x5, x1, x6, x4, x9, x3, x8, x12, x24\n", - "Position 10: x23, x19, x18, x20, x21, x15, x16, x22, x17, x14\n", - "Position 20: x13, x10, x11, x2, x7, l0, x25\n" + "Appended Ordering: Position 0: x11, x31, x14, x34, x33, x24, x23, x32, x13, x22\n", + "Position 10: x21, x12, l0, x12\n" ] } ], @@ -2791,7 +873,7 @@ ], "metadata": { "kernelspec": { - "display_name": "gtsam", + "display_name": "py312", "language": "python", "name": "python3" }, @@ -2805,7 +887,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.1" + "version": "3.12.6" } }, "nbformat": 4,