named constructor "Create"
parent
d86ac21b0e
commit
8d19f45825
|
|
@ -170,6 +170,28 @@ namespace gtsam {
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
/// @name Named Constructors @{
|
||||||
|
|
||||||
|
template<class FACTOR>
|
||||||
|
static Ordering Create(OrderingType orderingType,
|
||||||
|
const FactorGraph<FACTOR>& graph) {
|
||||||
|
|
||||||
|
switch (orderingType) {
|
||||||
|
case COLAMD:
|
||||||
|
return colamd(graph);
|
||||||
|
case METIS:
|
||||||
|
return metis(graph);
|
||||||
|
case CUSTOM:
|
||||||
|
throw std::runtime_error(
|
||||||
|
"Ordering::Create error: called with CUSTOM ordering type.");
|
||||||
|
default:
|
||||||
|
throw std::runtime_error(
|
||||||
|
"Ordering::Create error: called with unknown ordering type.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
/// @name Testable @{
|
/// @name Testable @{
|
||||||
|
|
||||||
GTSAM_EXPORT void print(const std::string& str = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const;
|
GTSAM_EXPORT void print(const std::string& str = "", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const;
|
||||||
|
|
|
||||||
|
|
@ -28,16 +28,22 @@ using namespace std;
|
||||||
using namespace gtsam;
|
using namespace gtsam;
|
||||||
using namespace boost::assign;
|
using namespace boost::assign;
|
||||||
|
|
||||||
|
namespace example {
|
||||||
|
SymbolicFactorGraph symbolicChain() {
|
||||||
|
SymbolicFactorGraph sfg;
|
||||||
|
sfg.push_factor(0, 1);
|
||||||
|
sfg.push_factor(1, 2);
|
||||||
|
sfg.push_factor(2, 3);
|
||||||
|
sfg.push_factor(3, 4);
|
||||||
|
sfg.push_factor(4, 5);
|
||||||
|
return sfg;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST(Ordering, constrained_ordering) {
|
TEST(Ordering, constrained_ordering) {
|
||||||
SymbolicFactorGraph sfg;
|
|
||||||
|
|
||||||
// create graph with wanted variable set = 2, 4
|
// create graph with wanted variable set = 2, 4
|
||||||
sfg.push_factor(0,1);
|
SymbolicFactorGraph sfg = example::symbolicChain();
|
||||||
sfg.push_factor(1,2);
|
|
||||||
sfg.push_factor(2,3);
|
|
||||||
sfg.push_factor(3,4);
|
|
||||||
sfg.push_factor(4,5);
|
|
||||||
|
|
||||||
// unconstrained version
|
// unconstrained version
|
||||||
Ordering actUnconstrained = Ordering::colamd(sfg);
|
Ordering actUnconstrained = Ordering::colamd(sfg);
|
||||||
|
|
@ -57,16 +63,11 @@ TEST(Ordering, constrained_ordering) {
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST(Ordering, grouped_constrained_ordering) {
|
TEST(Ordering, grouped_constrained_ordering) {
|
||||||
SymbolicFactorGraph sfg;
|
|
||||||
|
|
||||||
// create graph with constrained groups:
|
// create graph with constrained groups:
|
||||||
// 1: 2, 4
|
// 1: 2, 4
|
||||||
// 2: 5
|
// 2: 5
|
||||||
sfg.push_factor(0,1);
|
SymbolicFactorGraph sfg = example::symbolicChain();
|
||||||
sfg.push_factor(1,2);
|
|
||||||
sfg.push_factor(2,3);
|
|
||||||
sfg.push_factor(3,4);
|
|
||||||
sfg.push_factor(4,5);
|
|
||||||
|
|
||||||
// constrained version - push one set to the end
|
// constrained version - push one set to the end
|
||||||
FastMap<size_t, int> constraints;
|
FastMap<size_t, int> constraints;
|
||||||
|
|
@ -140,7 +141,6 @@ TEST(Ordering, csr_format_2) {
|
||||||
EXPECT(xadjExpected == mi.xadj());
|
EXPECT(xadjExpected == mi.xadj());
|
||||||
EXPECT(adjExpected.size() == mi.adj().size());
|
EXPECT(adjExpected.size() == mi.adj().size());
|
||||||
EXPECT(adjExpected == mi.adj());
|
EXPECT(adjExpected == mi.adj());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
@ -170,7 +170,6 @@ TEST(Ordering, csr_format_3) {
|
||||||
EXPECT(xadjExpected == mi.xadj());
|
EXPECT(xadjExpected == mi.xadj());
|
||||||
EXPECT(adjExpected.size() == mi.adj().size());
|
EXPECT(adjExpected.size() == mi.adj().size());
|
||||||
EXPECT(adjExpected == adjAcutal);
|
EXPECT(adjExpected == adjAcutal);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
@ -207,7 +206,6 @@ TEST(Ordering, csr_format_4) {
|
||||||
sfg.push_factor(Symbol('x', 4), Symbol('l', 1));
|
sfg.push_factor(Symbol('x', 4), Symbol('l', 1));
|
||||||
|
|
||||||
Ordering metOrder2 = Ordering::metis(sfg);
|
Ordering metOrder2 = Ordering::metis(sfg);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
@ -231,6 +229,37 @@ TEST(Ordering, metis) {
|
||||||
|
|
||||||
Ordering metis = Ordering::metis(sfg);
|
Ordering metis = Ordering::metis(sfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST(Ordering, Create) {
|
||||||
|
|
||||||
|
// create graph with wanted variable set = 2, 4
|
||||||
|
SymbolicFactorGraph sfg = example::symbolicChain();
|
||||||
|
|
||||||
|
// COLAMD
|
||||||
|
{
|
||||||
|
Ordering actual = Ordering::Create(Ordering::COLAMD,sfg);
|
||||||
|
Ordering expected = Ordering(list_of(0)(1)(2)(3)(4)(5));
|
||||||
|
EXPECT(assert_equal(expected, actual));
|
||||||
|
}
|
||||||
|
|
||||||
|
// METIS
|
||||||
|
{
|
||||||
|
Ordering actual = Ordering::Create(Ordering::METIS,sfg);
|
||||||
|
// 2
|
||||||
|
// 0
|
||||||
|
// 1
|
||||||
|
// 4
|
||||||
|
// 3
|
||||||
|
// 5
|
||||||
|
Ordering expected = Ordering(list_of(5)(3)(4)(1)(0)(2));
|
||||||
|
EXPECT(assert_equal(expected, actual));
|
||||||
|
}
|
||||||
|
|
||||||
|
// CUSTOM
|
||||||
|
CHECK_EXCEPTION(Ordering::Create(Ordering::CUSTOM,sfg),runtime_error);
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
int main() { TestResult tr; return TestRegistry::runAllTests(tr); }
|
int main() { TestResult tr; return TestRegistry::runAllTests(tr); }
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue