Skip to content

Commit 717eb7e

Browse files
committed
relinearization test
1 parent 80d9a5a commit 717eb7e

File tree

1 file changed

+54
-6
lines changed

1 file changed

+54
-6
lines changed

gtsam/hybrid/tests/testHybridNonlinearFactorGraph.cpp

+54-6
Original file line numberDiff line numberDiff line change
@@ -857,10 +857,10 @@ namespace test_relinearization {
857857
*/
858858
static HybridNonlinearFactorGraph CreateFactorGraph(
859859
const std::vector<double> &means, const std::vector<double> &sigmas,
860-
DiscreteKey &m1, double x0_measurement) {
860+
DiscreteKey &m1, double x0_measurement, double measurement_noise = 1e-3) {
861861
auto model0 = noiseModel::Isotropic::Sigma(1, sigmas[0]);
862862
auto model1 = noiseModel::Isotropic::Sigma(1, sigmas[1]);
863-
auto prior_noise = noiseModel::Isotropic::Sigma(1, 1e-3);
863+
auto prior_noise = noiseModel::Isotropic::Sigma(1, measurement_noise);
864864

865865
auto f0 =
866866
std::make_shared<BetweenFactor<double>>(X(0), X(1), means[0], model0);
@@ -871,7 +871,7 @@ static HybridNonlinearFactorGraph CreateFactorGraph(
871871
std::vector<NonlinearFactorValuePair> factors{
872872
{f0, ComputeLogNormalizer(model0)}, {f1, ComputeLogNormalizer(model1)}};
873873

874-
HybridNonlinearFactor mixtureFactor({X(0), X(1)}, {m1}, factors);
874+
HybridNonlinearFactor mixtureFactor({X(0), X(1)}, m1, factors);
875875

876876
HybridNonlinearFactorGraph hfg;
877877
hfg.push_back(mixtureFactor);
@@ -968,7 +968,7 @@ TEST(HybridNonlinearFactorGraph, DifferentMeans) {
968968
* |
969969
* M1
970970
*/
971-
TEST_DISABLED(HybridNonlinearFactorGraph, DifferentCovariances) {
971+
TEST(HybridNonlinearFactorGraph, DifferentCovariances) {
972972
using namespace test_relinearization;
973973

974974
DiscreteKey m1(M(1), 2);
@@ -982,8 +982,10 @@ TEST_DISABLED(HybridNonlinearFactorGraph, DifferentCovariances) {
982982

983983
// Create FG with HybridNonlinearFactor and prior on X1
984984
HybridNonlinearFactorGraph hfg = CreateFactorGraph(means, sigmas, m1, x0);
985-
// Linearize and eliminate
986-
auto hbn = hfg.linearize(values)->eliminateSequential();
985+
// Linearize
986+
auto hgfg = hfg.linearize(values);
987+
// and eliminate
988+
auto hbn = hgfg->eliminateSequential();
987989

988990
VectorValues cv;
989991
cv.insert(X(0), Vector1(0.0));
@@ -1005,6 +1007,52 @@ TEST_DISABLED(HybridNonlinearFactorGraph, DifferentCovariances) {
10051007
EXPECT(assert_equal(expected_m1, actual_m1));
10061008
}
10071009

1010+
TEST(HybridNonlinearFactorGraph, Relinearization) {
1011+
using namespace test_relinearization;
1012+
1013+
DiscreteKey m1(M(1), 2);
1014+
1015+
Values values;
1016+
double x0 = 0.0, x1 = 0.8;
1017+
values.insert(X(0), x0);
1018+
values.insert(X(1), x1);
1019+
1020+
std::vector<double> means = {0.0, 1.0}, sigmas = {1e-2, 1e-2};
1021+
1022+
double prior_sigma = 1e-2;
1023+
// Create FG with HybridNonlinearFactor and prior on X1
1024+
HybridNonlinearFactorGraph hfg =
1025+
CreateFactorGraph(means, sigmas, m1, 0.0, prior_sigma);
1026+
hfg.push_back(PriorFactor<double>(
1027+
X(1), 1.2, noiseModel::Isotropic::Sigma(1, prior_sigma)));
1028+
1029+
// Linearize
1030+
auto hgfg = hfg.linearize(values);
1031+
// and eliminate
1032+
auto hbn = hgfg->eliminateSequential();
1033+
1034+
HybridValues delta = hbn->optimize();
1035+
values = values.retract(delta.continuous());
1036+
1037+
Values expected_first_result;
1038+
expected_first_result.insert(X(0), 0.0666666666667);
1039+
expected_first_result.insert(X(1), 1.13333333333);
1040+
EXPECT(assert_equal(expected_first_result, values));
1041+
1042+
// Re-linearize
1043+
hgfg = hfg.linearize(values);
1044+
// and eliminate
1045+
hbn = hgfg->eliminateSequential();
1046+
delta = hbn->optimize();
1047+
HybridValues result(delta.continuous(), delta.discrete(),
1048+
values.retract(delta.continuous()));
1049+
1050+
HybridValues expected_result(
1051+
VectorValues{{X(0), Vector1(0)}, {X(1), Vector1(0)}},
1052+
DiscreteValues{{M(1), 1}}, expected_first_result);
1053+
EXPECT(assert_equal(expected_result, result));
1054+
}
1055+
10081056
/* *************************************************************************
10091057
*/
10101058
int main() {

0 commit comments

Comments
 (0)