38 #include "gtest/gtest.h"
59 vertices = std::make_shared<VertexSet>();
60 edges = std::make_shared<OptimizationEdgeSet>();
64 v1 = std::make_shared<pFVectorVertex>(1);
65 v1->values().setOnes();
66 v2 = std::make_shared<pFVectorVertex>(Eigen::Vector2d(1, 1));
94 values[0] = 4 *
vertices[0]->getData()[0];
113 values[0] =
vertices[0]->getData()[0] - 5;
114 values[1] =
vertices[1]->getData()[0] + 3;
115 values[2] =
vertices[1]->getData()[1];
130 p1->setFixed(1,
true);
131 VectorVertex::Ptr p2 = std::make_shared<VectorVertex>(Eigen::Vector3d(4, 5, 3));
137 VertexSet::Ptr vertices = VertexSet::Ptr(
new VertexSet({p1, p2, p3}));
139 std::vector<VertexInterface*>& active_vertices = vertices->getActiveVertices();
141 EXPECT_EQ(active_vertices.size(), 2);
142 EXPECT_EQ(active_vertices[0], p1.get());
143 EXPECT_EQ(active_vertices[1], p3.get());
154 VertexSet::Ptr vertices = VertexSet::Ptr(
new VertexSet({p1, p2}));
156 EXPECT_EQ(vertices->getParameterDimension(), 3);
158 Eigen::Vector3d inc(5, -1, 7);
159 vertices->applyIncrementNonFixed(inc);
161 EXPECT_DOUBLE_EQ(p1->values()[0], 6);
162 EXPECT_DOUBLE_EQ(p2->values()[0], 0);
163 EXPECT_DOUBLE_EQ(p2->values()[1], 8);
171 p1->setFixed(0,
true);
173 p2->setFixed(1,
true);
176 VertexSet::Ptr vertices = VertexSet::Ptr(
new VertexSet({p1, p2}));
178 EXPECT_EQ(vertices->getParameterDimension(), 1);
182 vertices->applyIncrementNonFixed(inc);
184 EXPECT_DOUBLE_EQ(p1->values()[0], 1);
185 EXPECT_DOUBLE_EQ(p2->values()[0], 0);
186 EXPECT_DOUBLE_EQ(p2->values()[1], 1);
194 p1->setFixed(0,
true);
196 p2->setFixed(0,
true);
199 VertexSet::Ptr vertices = VertexSet::Ptr(
new VertexSet({p1, p2}));
201 EXPECT_EQ(vertices->getParameterDimension(), 1);
205 vertices->applyIncrementNonFixed(inc);
207 EXPECT_DOUBLE_EQ(p1->values()[0], 1);
208 EXPECT_DOUBLE_EQ(p2->values()[0], 1);
209 EXPECT_DOUBLE_EQ(p2->values()[1], 0);
214 vertices->addVertex(v1);
217 BaseEdge::Ptr edge1(
new Edge1T(edge1_fun,
false, *v1, *v2));
218 BaseEdge::Ptr edge2(
new Edge2T(edge2_fun,
false, *v2));
219 edges->addEdges({edge1, edge2}, {}, {}, {}, {});
221 EXPECT_FALSE(graph.checkGraphConsistency());
223 vertices->addVertex(v2);
225 EXPECT_TRUE(graph.checkGraphConsistency());
230 vertices->addVertex(v1);
231 vertices->addVertex(v2);
234 BaseEdge::Ptr edge1(
new Edge1T(edge1_fun,
false, *v1, *v2));
236 Eigen::MatrixXd jac1_v1(edge1->getDimension(), v1->getDimensionUnfixed());
237 edge1->computeJacobian(0, jac1_v1);
238 EXPECT_NEAR(jac1_v1(0, 0), 1, 1e-6);
240 Eigen::MatrixXd jac1_v2(edge1->getDimension(), v2->getDimensionUnfixed());
241 edge1->computeJacobian(1, jac1_v2);
242 EXPECT_NEAR(jac1_v2(0, 0), 2, 1e-6);
243 EXPECT_NEAR(jac1_v2(0, 1), 3, 1e-6);
248 vertices->addVertex(v1);
249 vertices->addVertex(v2);
252 BaseEdge::Ptr edge3(
new Edge3T(edge3_fun,
false, *v1, *v2));
254 Eigen::MatrixXd jac3_v1(edge3->getDimension(), v1->getDimensionUnfixed());
255 edge3->computeJacobian(0, jac3_v1);
257 Eigen::MatrixXd jac3_v1_sol(2, 1);
261 Eigen::MatrixXd jac3_v2(edge3->getDimension(), v2->getDimensionUnfixed());
262 edge3->computeJacobian(1, jac3_v2);
264 Eigen::MatrixXd jac3_v2_sol(2, 2);
265 jac3_v2_sol << 4, 6, 1, 2;
271 vertices->addVertex(v1);
272 vertices->addVertex(v2);
275 BaseEdge::Ptr edge1(
new Edge1T(edge1_fun,
false, *v1, *v2));
277 Eigen::MatrixXd hes_v1_v1(v1->getDimensionUnfixed(), v1->getDimensionUnfixed());
279 edge1->computeHessianInc(0, 0, hes_v1_v1);
280 EXPECT_TRUE(hes_v1_v1.isZero(1e-3)) <<
"hes_v1_v1: " << hes_v1_v1;
282 Eigen::MatrixXd hes_v1_v2(v1->getDimensionUnfixed(), v2->getDimensionUnfixed());
284 edge1->computeHessianInc(0, 1, hes_v1_v2);
285 EXPECT_TRUE(hes_v1_v2.isZero(1e-3)) <<
"hes_v1_v2: " << hes_v1_v2;
287 Eigen::MatrixXd hes_v2_v1(v2->getDimensionUnfixed(), v1->getDimensionUnfixed());
289 edge1->computeHessianInc(1, 0, hes_v2_v1);
290 EXPECT_TRUE(hes_v2_v1.isZero(1e-3)) <<
"hes_v2_v1: " << hes_v2_v1;
292 Eigen::MatrixXd hes_v2_v2(v2->getDimensionUnfixed(), v2->getDimensionUnfixed());
294 edge1->computeHessianInc(1, 1, hes_v2_v2);
295 EXPECT_TRUE(hes_v2_v2.isZero(1e-3)) <<
"hes_v2_v2: " << hes_v2_v2;
300 vertices->addVertex(v1);
301 vertices->addVertex(v2);
304 BaseEdge::Ptr edge3(
new Edge3T(edge3_fun,
false, *v1, *v2));
306 Eigen::MatrixXd hes_v1_v1(v1->getDimensionUnfixed(), v1->getDimensionUnfixed());
308 edge3->computeHessianInc(0, 0, hes_v1_v1);
309 Eigen::MatrixXd hes_v1_v1_sol(v1->getDimensionUnfixed(), v1->getDimensionUnfixed());
313 Eigen::MatrixXd hes_v1_v2(v1->getDimensionUnfixed(), v2->getDimensionUnfixed());
315 edge3->computeHessianInc(0, 1, hes_v1_v2);
316 Eigen::MatrixXd hes_v1_v2_sol(v1->getDimensionUnfixed(), v2->getDimensionUnfixed());
317 hes_v1_v2_sol << 1, 2;
320 Eigen::MatrixXd hes_v2_v1(v2->getDimensionUnfixed(), v1->getDimensionUnfixed());
322 edge3->computeHessianInc(1, 0, hes_v2_v1);
323 Eigen::MatrixXd hes_v2_v1_sol(v2->getDimensionUnfixed(), v1->getDimensionUnfixed());
324 hes_v2_v1_sol << 1, 2;
327 Eigen::MatrixXd hes_v2_v2(v2->getDimensionUnfixed(), v2->getDimensionUnfixed());
329 edge3->computeHessianInc(1, 1, hes_v2_v2);
330 Eigen::MatrixXd hes_v2_v2_sol(v2->getDimensionUnfixed(), v2->getDimensionUnfixed());
331 hes_v2_v2_sol << 4, 0, 0, 6;