Ceres Solver is a production-grade C++ library for solving large-scale non-linear least squares problems, widely used in computer vision (bundle adjustment, SLAM) and robotics. It provides a flexible API where users define cost functions (analytical, automatic, or numerical differentiation), residual blocks, and parameter manifolds (Euclidean, quaternion, sphere, etc.), then solve via trust-region or line-search methods backed by a variety of sparse/dense linear solvers (Eigen, SuiteSparse, CUDA, Apple Accelerate). The architecture is modular: a core minimizer orchestrates strategy objects (Levenberg-Marquardt, Dogleg, BFGS), while evaluators and Jacobian writers support block-sparse and dynamic sparsity. The library also includes utilities like thread pools, concurrent queues, and graph algorithms for visibility-based preconditioning. Despite a complex build matrix with optional backends, the code is well-structured, heavily tested, and actively maintained.
bae is a PyTorch library for exact second-order optimization, specializing in Bundle Adjustment (BA) and Pose Graph Optimization (PGO) for robotics and 3D vision. It provides a sparse autograd system that automatically computes sparse block Jacobians by tracing operations on tracked parameters, enabling efficient Levenberg-Marquardt and Schur complement optimizers. The library includes CUDA-accelerated sparse matrix operations via cuSPARSE and Warp, ambient gradient implementations for SE(3) operations that are torch.compile compatible, and utilities for loading BAL and PGO datasets. It is designed as a research library with clean abstractions for defining residual graphs and optimizing over Lie groups. The architecture separates autograd tracing (bae/autograd), optimization algorithms (bae/optim), sparse matrix utilities (bae/sparse), and supporting utilities (bae/utils). The sparse autograd system uses a custom Tensor subclass (TrackingTensor) that records index, map, and cat operations via __torch_function__, then computes sparse BSR Jacobians via a backward traversal. The LM and Schur optimizers support trust region and adaptive strategies, with PCG as the default linear solver. The library also provides monkeypatches for PyPose LieTensor to enable torch.compile full-graph capture, and ambient (plain PyTorch) implementations of SE(3) operations for gradient compatibility.