diff --git a/gtsam/inference/Ordering.cpp b/gtsam/inference/Ordering.cpp index da61ca57e..0875755aa 100644 --- a/gtsam/inference/Ordering.cpp +++ b/gtsam/inference/Ordering.cpp @@ -213,11 +213,21 @@ Ordering Ordering::Metis(const MetisIndex& met) { #ifdef GTSAM_SUPPORT_NESTED_DISSECTION gttic(Ordering_METIS); + idx_t size = met.nValues(); + if (size == 0) + { + return Ordering(); + } + + if (size == 1) + { + return Ordering(KeyVector(1, met.intToKey(0))); + } + vector xadj = met.xadj(); vector adj = met.adj(); vector perm, iperm; - idx_t size = met.nValues(); for (idx_t i = 0; i < size; i++) { perm.push_back(0); iperm.push_back(0); diff --git a/gtsam/inference/Ordering.h b/gtsam/inference/Ordering.h index f770c7da1..a2d165792 100644 --- a/gtsam/inference/Ordering.h +++ b/gtsam/inference/Ordering.h @@ -191,7 +191,10 @@ public: template static Ordering Metis(const FACTOR_GRAPH& graph) { - return Metis(MetisIndex(graph)); + if (graph.empty()) + return Ordering(); + else + return Metis(MetisIndex(graph)); } /// @} diff --git a/gtsam/inference/tests/testOrdering.cpp b/gtsam/inference/tests/testOrdering.cpp index 0d23d9655..0305218af 100644 --- a/gtsam/inference/tests/testOrdering.cpp +++ b/gtsam/inference/tests/testOrdering.cpp @@ -294,6 +294,28 @@ TEST(Ordering, MetisLoop) { } #endif /* ************************************************************************* */ +#ifdef GTSAM_SUPPORT_NESTED_DISSECTION +TEST(Ordering, MetisEmptyGraph) { + SymbolicFactorGraph symbolicGraph; + + Ordering actual = Ordering::Create(Ordering::METIS, symbolicGraph); + Ordering expected; + EXPECT(assert_equal(expected, actual)); +} +#endif +/* ************************************************************************* */ +#ifdef GTSAM_SUPPORT_NESTED_DISSECTION +TEST(Ordering, MetisSingleNode) { + // create graph with a single node + SymbolicFactorGraph symbolicGraph; + symbolicGraph.push_factor(7); + + Ordering actual = Ordering::Create(Ordering::METIS, symbolicGraph); + Ordering expected = Ordering(list_of(7)); + EXPECT(assert_equal(expected, actual)); +} +#endif +/* ************************************************************************* */ TEST(Ordering, Create) { // create chain graph