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));
87 return vertices[0]->getData()[0] + 2 * vertices[1]->getData()[0] + 3 * vertices[1]->getData()[1];
94 values[0] = 4 * vertices[0]->getData()[0];
95 values[1] = 5 * vertices[0]->getData()[0] + 6 * vertices[0]->getData()[1];
103 values[0] = vertices[0]->getData()[0] * vertices[0]->getData()[0] + 2 * vertices[1]->getData()[0] * vertices[1]->getData()[0] +
104 3 * vertices[1]->getData()[1] * vertices[1]->getData()[1];
106 values[1] = vertices[0]->getData()[0] * vertices[1]->getData()[0] + 2 * vertices[0]->getData()[0] * vertices[1]->getData()[1];
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));
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());
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);
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);
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);
219 edges->addEdges({edge1, edge2}, {}, {}, {}, {});
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);
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;
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;
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;
EdgeGenericVectorFun< 2, pFVectorVertex > Edge2T
hyper-graph representation
std::shared_ptr< PartiallyFixedVectorVertex > Ptr
TEST_F(TestHyperGraph, vertex_set_active_vertices)
bool checkGraphConsistency()
Return number of objective edges.
static void edge4_fun(const Edge4T::VertexContainer &vertices, Eigen::Ref< Edge4T::ErrorVector > values)
EdgeGenericVectorFun< 2, pFVectorVertex, pFVectorVertex > Edge3T
OptimizationEdgeSet::Ptr edges
Generic interface class for vertices.
static void edge2_fun(const Edge2T::VertexContainer &vertices, Eigen::Ref< Edge2T::ErrorVector > values)
EdgeGenericScalarFun< pFVectorVertex, pFVectorVertex > Edge1T
Vector based vertex with support for partially fixed components.
virtual ~TestHyperGraph()
void setVertexSet(VertexSetInterface::Ptr vertices)
std::array< VertexInterface *, numVerticesCompileTime > VertexContainer
Typedef to represent the vertex container.
Generic edge for functions .
constexpr const double CORBO_INF_DBL
Representation for infinity (double version)
Generic edge for functions .
A matrix or vector expression mapping an existing expression.
static double edge1_fun(const Edge1T::VertexContainer &vertices)
Vertex implementation that stores an Eigen::VectorXd (dynamic dimension)
#define EXPECT_EQ_MATRIX(A, B, tol)
The matrix class, also used for vectors and row-vectors.
void setEdgeSet(OptimizationEdgeSet::Ptr edges)
Generic interface class for edges.
static void edge3_fun(const Edge1T::VertexContainer &vertices, Eigen::Ref< Edge2T::ErrorVector > values)