From 76367bd946a39c89580f52d0f07b242a8bcd0ac6 Mon Sep 17 00:00:00 2001 From: Chris Beall Date: Thu, 10 Oct 2019 10:34:07 -0700 Subject: [PATCH] Fix Metis ordering for empty graph and single node --- gtsam/inference/Ordering.cpp | 12 +++++++++++- gtsam/inference/Ordering.h | 5 ++++- gtsam/inference/tests/testOrdering.cpp | 22 ++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) 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