Added generic re-key function to nonlinear factor
parent
54f6f3629c
commit
2bd7a0ed43
|
@ -157,11 +157,20 @@ public:
|
||||||
/**
|
/**
|
||||||
* Creates a shared_ptr clone of the factor - needs to be specialized to allow
|
* Creates a shared_ptr clone of the factor - needs to be specialized to allow
|
||||||
* for subclasses
|
* for subclasses
|
||||||
*
|
|
||||||
* Default implementation will slice the factor
|
|
||||||
*/
|
*/
|
||||||
virtual shared_ptr clone() const =0;
|
virtual shared_ptr clone() const =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones a factor and replaces its keys
|
||||||
|
*/
|
||||||
|
shared_ptr rekey(const std::vector<Key>& new_keys) const {
|
||||||
|
assert(new_keys.size() == this->keys().size());
|
||||||
|
shared_ptr new_factor = clone();
|
||||||
|
new_factor->keys() = new_keys;
|
||||||
|
return new_factor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}; // \class NonlinearFactor
|
}; // \class NonlinearFactor
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
|
@ -392,7 +392,7 @@ TEST(NonlinearFactor, NoiseModelFactor6) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST( NonlinearFactor, clone )
|
TEST( NonlinearFactor, clone_rekey )
|
||||||
{
|
{
|
||||||
shared_nlf init(new TestFactor4());
|
shared_nlf init(new TestFactor4());
|
||||||
EXPECT_LONGS_EQUAL(PoseKey(1), init->keys()[0]);
|
EXPECT_LONGS_EQUAL(PoseKey(1), init->keys()[0]);
|
||||||
|
@ -400,9 +400,31 @@ TEST( NonlinearFactor, clone )
|
||||||
EXPECT_LONGS_EQUAL(PoseKey(3), init->keys()[2]);
|
EXPECT_LONGS_EQUAL(PoseKey(3), init->keys()[2]);
|
||||||
EXPECT_LONGS_EQUAL(PoseKey(4), init->keys()[3]);
|
EXPECT_LONGS_EQUAL(PoseKey(4), init->keys()[3]);
|
||||||
|
|
||||||
|
// Standard clone
|
||||||
shared_nlf actClone = init->clone();
|
shared_nlf actClone = init->clone();
|
||||||
EXPECT(actClone.get() != init.get()); // Ensure different pointers
|
EXPECT(actClone.get() != init.get()); // Ensure different pointers
|
||||||
EXPECT(assert_equal(*init, *actClone));
|
EXPECT(assert_equal(*init, *actClone));
|
||||||
|
|
||||||
|
// Re-key factor - clones with different keys
|
||||||
|
std::vector<Key> new_keys(4);
|
||||||
|
new_keys[0] = PoseKey(5);
|
||||||
|
new_keys[1] = PoseKey(6);
|
||||||
|
new_keys[2] = PoseKey(7);
|
||||||
|
new_keys[3] = PoseKey(8);
|
||||||
|
shared_nlf actRekey = init->rekey(new_keys);
|
||||||
|
EXPECT(actRekey.get() != init.get()); // Ensure different pointers
|
||||||
|
|
||||||
|
// Ensure init is unchanged
|
||||||
|
EXPECT_LONGS_EQUAL(PoseKey(1), init->keys()[0]);
|
||||||
|
EXPECT_LONGS_EQUAL(PoseKey(2), init->keys()[1]);
|
||||||
|
EXPECT_LONGS_EQUAL(PoseKey(3), init->keys()[2]);
|
||||||
|
EXPECT_LONGS_EQUAL(PoseKey(4), init->keys()[3]);
|
||||||
|
|
||||||
|
// Check new keys
|
||||||
|
EXPECT_LONGS_EQUAL(PoseKey(5), actRekey->keys()[0]);
|
||||||
|
EXPECT_LONGS_EQUAL(PoseKey(6), actRekey->keys()[1]);
|
||||||
|
EXPECT_LONGS_EQUAL(PoseKey(7), actRekey->keys()[2]);
|
||||||
|
EXPECT_LONGS_EQUAL(PoseKey(8), actRekey->keys()[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
Loading…
Reference in New Issue