16 releases

Uses new Rust 2024

0.5.0 Dec 13, 2025
0.4.0 Jan 7, 2025
0.3.0 Feb 26, 2024
0.2.2 Feb 26, 2024
0.1.2 Jan 24, 2023

#281 in Algorithms

Download history 99/week @ 2025-09-23 335/week @ 2025-09-30 46/week @ 2025-10-07 160/week @ 2025-10-14 58/week @ 2025-10-21 373/week @ 2025-10-28 94/week @ 2025-11-04 706/week @ 2025-11-11 147/week @ 2025-11-18 453/week @ 2025-11-25 179/week @ 2025-12-02 273/week @ 2025-12-09 79/week @ 2025-12-16 11/week @ 2025-12-23 371/week @ 2025-12-30 130/week @ 2026-01-06

644 downloads per month
Used in light-curve-feature

MIT/Apache

130KB
2.5K SLoC

Rust 2K SLoC // 0.0% comments C++ 255 SLoC // 0.0% comments

ceres-solver-rs

Rust bindings for Ceres Solver

Test pre-commit.ci status docs.rs Crates.io

cargo add ceres-solver --features=source

Ceres Solver is a C++ library for large optimization problems. It can be used to solve Non-linear Least Squares problems with constraints and general optimization problems. Here we provide a Rust binding for this library.

The bindings require Ceres Solver version 2.2, but the bindings may work with older or new versions. Please submit an issue if you need a support of other versions.

This project consists of three crates:

  • ceres-solver is a safe Rust bindings
  • ceres-solver-sys is an unsafe Rust bindings written with the usage of cxx
  • ceres-solver-src is an optional no-code crate to build and distribute a minimal static Ceres Solver library

To build Ceres Solver statically and link it to your project, use source Cargo feature, which would add ceres-solver-src dependency into your project.

Status of the binding support

Current implementation of the binding is not complete. The following list shows the status of the binding support:

  • Non-linear Least squares
    • Problem - basic class for NLLS, supports adding residual blocks, setting boundary conditions, marking parameter blocks to be constant/variable, and solving the problem
    • CostFunction - user provides both residual and Jacobian
    • SizedCostFunction - same but with the residual vector shape is known at compile time
    • AutoDiffCostFunction - user provides residual and Jacobian is computed by automatic differentiation
    • DynamicAutoDiffCostFunction - same but with the residual vector shape is unknown at compile time
    • NumericDiffCostFunction - user provides residual and Jacobian is computed by numerical differentiation
    • CostFunctionToFunctor and DynamicCostFunctionToFunctor - adapter to use CostFunction as a mix of all other cost functions
    • ConditionedCostFunction - adapter to use CostFunction with different conditioning
    • GradientChecker - helper class to check the correctness of the Jacobian
    • NormalPrior - changes a cost function to use a covariance matrix instead of a simple scalar product
    • LossFunction - a function applied to the squared norm of the residual vector, both custom and Ceres stack loss functions are supported
    • Manifold, AutoDiffManifold
    • EvaluationCallback
  • Solver - Solver class itself is not implemented, but the following nested classes are supported:
    • Solver::Options
      • Minimizer options
      • Line search options
      • Trust region options
      • Linear solver options
      • Preconditioner options
      • Sparse and dense linear algebra library selection
      • Setting of the number of threads
      • Bundle adjustment options
      • Logging options
      • Validation of the options
      • Callbacks
    • Solver::Summary
      • Brief and full reports
      • Cost function evaluation statistics
      • Time statistics
  • Jets
  • Covariance estimation
  • General unconstrained minimization

Please don't hesitate to create an issue to request prioritization of any functionality you need.

Dependencies

~1.2–4MB
~70K SLoC