Templating still used in cpp file for generic-ness, but not exposed
anymore
std::tuple has the same performance as Eigen::Triplet, but boost::tuple
is slower. Sparse matrix indices are int instead of size_t for
efficiency (e.g. A(i, j) = s -> i/j are int's instead of size_t's)
compiles and passes tests, but some potentially code-breaking changes in:
Marginals.h - order of arguments had to change since `factorization` has a default value
EliminatableFactorGraph.h - marginalMultifrontalBayesNet and marginalMultifrontalBayesTree no longer accept `boost::none` as a placeholder to specify later arguments
Notes:
EliminateableFactorGraph.h - `orderingType` is no longer needed in function overloads that specify ordering, but I left it for the time being to avoid potential code breaking
This should make merging in develop easier, and it also helps me understand what changed.
I mostly avoided conflicts by keeping Duy's versions of:
Conflicts:
gtsam/3rdparty/metis-5.1.0/CMakeLists.txt
gtsam/linear/JacobianFactor-inl.h
gtsam/linear/NoiseModel.cpp
gtsam/nonlinear/NonlinearFactor.h
and a number of other files. In particular, I did not upgrade Eigen or remove metis.
The following unit tests fail in this branch:
The following tests FAILED:
2 - testWrap (Failed)
85 - testGeneralSFMFactor (SEGFAULT)
142 - testIMUSystem (Failed)
178 - testTSAMFactors (Failed)
Instead of turning Hessian factors into Jacobian factors -- so that they can be eliminated with constrained Jacobian factors using the special QR in Constrained's noise model -- we combine all Hessian factors, eliminate the variable first to have a conditional and a new factor 1, then combine the constrained Jacobians with this conditional (also a Jacobian) to eliminate again, producing the final conditional, and a new factor 2. The two new factors are then combined into a new Hessian factor to be returned.
Currently, when eliminating a constrained variable, EliminatePreferCholesky converts every other factors to JacobianFactor before doing the special QR factorization for constrained variables. Unfortunately, after a constrained nonlinear graph is linearized, new hessian factors from constraints, multiplied with the dual variable (-lambda*\hessian{c} terms in the Lagrangian objective function), might become negative definite, thus cannot be converted to JacobianFactors.
Following EliminateCholesky, this version of EliminatePreferCholesky for constrained var gathers all unconstrained factors into a big joint HessianFactor before converting it into a JacobianFactor to be eliminiated by QR together with the other constrained factors.
Of course, this might not solve the non-positive-definite problem entirely, because (1) the original hessian factors might be non-positive definite and (2) large strange value of lambdas might cause the joint factor non-positive definite [is this true?]. But at least, this will help in typical cases.