Store ProductManifold instances in a tuple

Since the number of manifolds used to initialize ProductManifold and
their types are known at compile-time, it is possible to avoid storing
pointers to the base class as required by a homogeneous, currently
dynamically sized container. Instead, we can use std::tuple<> as a
heterogenous container with the number of elements fixed at compile-time
that allows us to store the concrete manifold realizations.

The advantage of this approach is that we can bypass the vtable when
iterating over each manifold within ProductManifold. The indirection is
invoked only once while accessing the ProductManifoldImpl members.
Additionally, potential dynamic memory allocations by a std::vector can
be completely avoided. This makes the ProductManifold implementation
more efficient both in memory and runtime.

Change-Id: Ic71b0c175ab726f8992e9703f7666bca477baf19
This commit is contained in:
Sergiu Deitsch
2022-02-21 22:43:32 +01:00
committed by Alex Stewart
parent 9f32c42ba6
commit 7743d2e73c
7 changed files with 492 additions and 230 deletions
+2 -1
View File
@@ -306,7 +306,8 @@ void BuildProblem(BALProblem* bal_problem, Problem* problem) {
if (CERES_GET_FLAG(FLAGS_use_quaternions) &&
CERES_GET_FLAG(FLAGS_use_manifolds)) {
Manifold* camera_manifold =
new ProductManifold(new QuaternionManifold, new EuclideanManifold<6>);
new ProductManifold<QuaternionManifold, EuclideanManifold<6>>{
QuaternionManifold{}, EuclideanManifold<6>{}};
for (int i = 0; i < bal_problem->num_cameras(); ++i) {
problem->SetManifold(cameras + camera_block_size * i, camera_manifold);
}