12 #include <gtest/gtest.h> 18 #if EIGEN_VERSION_AT_LEAST(3,1,0) // Requires Eigen>=3.1 22 MySimpleUnaryEdge(vector<double> &parent,
size_t nodeid,
double observation,
double information) :
24 m_observation(observation),
25 m_information(information)
27 this->node_id = nodeid;
32 return m_parent[node_id] - m_observation;
44 vector<double> &m_parent;
45 double m_observation, m_information;
50 MySimpleBinaryEdge(vector<double> &parent,
size_t nodeid_i,
size_t nodeid_j,
double information) :
52 m_information(information)
54 this->node_id_i = nodeid_i;
55 this->node_id_j = nodeid_j;
60 return m_parent[node_id_i] - m_parent[node_id_j];
66 void evalJacobian(
double &dr_dx_i,
double &dr_dx_j )
const MRPT_OVERRIDE 73 vector<double> &m_parent;
80 vector<double> my_map(N, .0);
87 std::deque<MySimpleUnaryEdge> edges1;
89 edges1.push_back(MySimpleUnaryEdge(my_map, 0, 1.0, 4.0));
90 edges1.push_back(MySimpleUnaryEdge(my_map, 1, 5.0, 4.0));
91 edges1.push_back(MySimpleUnaryEdge(my_map, 2, 3.0, 4.0));
92 edges1.push_back(MySimpleUnaryEdge(my_map, 3, 2.0, 16.0));
94 for (
const auto &e:edges1)
100 my_map.assign(N, .0);
102 Eigen::VectorXd x_incr, x_var;
105 EXPECT_NEAR(x_incr[0], 1.0, 1e-9);
106 EXPECT_NEAR(x_incr[1], 5.0, 1e-9);
107 EXPECT_NEAR(x_incr[2], 3.0, 1e-9);
108 EXPECT_NEAR(x_incr[3], 2.0, 1e-9);
110 EXPECT_NEAR(x_var[0], 1.0 / 4.0, 1e-9);
111 EXPECT_NEAR(x_var[1], 1.0 / 4.0, 1e-9);
112 EXPECT_NEAR(x_var[2], 1.0 / 4.0, 1e-9);
113 EXPECT_NEAR(x_var[3], 1.0 / 16.0, 1e-9);
119 my_map.assign(N, .0);
122 edges1.push_back(MySimpleUnaryEdge(my_map, 0, 4.0, 2.0));
125 Eigen::VectorXd x_incr, x_var;
128 EXPECT_NEAR(x_incr[0], 2.0, 1e-9);
129 EXPECT_NEAR(x_incr[1], 5.0, 1e-9);
130 EXPECT_NEAR(x_incr[2], 3.0, 1e-9);
131 EXPECT_NEAR(x_incr[3], 2.0, 1e-9);
133 EXPECT_NEAR(x_var[0], 1.0/(4.0 + 2.0), 1e-9);
134 EXPECT_NEAR(x_var[1], 1.0 / 4.0, 1e-9);
135 EXPECT_NEAR(x_var[2], 1.0 / 4.0, 1e-9);
136 EXPECT_NEAR(x_var[3], 1.0 / 16.0, 1e-9);
143 vector<double> my_map(N, .0);
151 MySimpleUnaryEdge edge_val0(my_map, 0, 1.0 , 1.0 );
154 MySimpleBinaryEdge edge_01(my_map, 0, 1, .1);
156 MySimpleBinaryEdge edge_12(my_map, 1, 2, .1);
158 MySimpleBinaryEdge edge_23(my_map, 2, 3, .1);
160 MySimpleBinaryEdge edge_30(my_map, 3, 0, .1);
166 my_map.assign(N, .0);
168 Eigen::VectorXd x_incr, x_var;
171 EXPECT_NEAR(x_incr[0], 1.0, 1e-6);
172 EXPECT_NEAR(x_incr[1], 1.0, 1e-6);
173 EXPECT_NEAR(x_incr[2], 1.0, 1e-6);
174 EXPECT_NEAR(x_incr[3], 1.0, 1e-6);
176 EXPECT_NEAR(x_var[0], 1.0 , 1e-6);
178 EXPECT_GT(x_var[1], x_var[0]);
179 EXPECT_GT(x_var[3], x_var[0]);
181 EXPECT_GT(x_var[2], x_var[1]);
182 EXPECT_GT(x_var[2], x_var[3]);
void initialize(const size_t nodeCount)
Initialize the GMRF internal state and copy the prior factors.
Simple, scalar (1-dim) constraint (edge) for a GMRF.
#define MRPT_OVERRIDE
C++11 "override" for virtuals:
Abstract graph and tree data structures, plus generic graph algorithms.
void enableProfiler(bool enable=true)
TEST(Compress, DataBlockGZ)
void addConstraint(const UnaryFactorVirtualBase &listOfConstraints)
Insert constraints into the GMRF problem.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void updateEstimation(Eigen::VectorXd &solved_x_inc, Eigen::VectorXd *solved_variances=NULL)
Simple, scalar (1-dim) constraint (edge) for a GMRF.
Sparse solver for GMRF (Gaussian Markov Random Fields) graphical models.