From d6acf643e41a399f4a4e678eeceda2a8a54156cd Mon Sep 17 00:00:00 2001 From: Johannes Terblanche <6612981+Affie@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:04:15 +0200 Subject: [PATCH] Only compute Jacobian in RLM if last step success (#303) Co-authored-by: Johannes Terblanche --- src/plans/nonlinear_least_squares_plan.jl | 2 ++ src/solvers/LevenbergMarquardt.jl | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/plans/nonlinear_least_squares_plan.jl b/src/plans/nonlinear_least_squares_plan.jl index d517ffa058..9d8a3bcbf5 100644 --- a/src/plans/nonlinear_least_squares_plan.jl +++ b/src/plans/nonlinear_least_squares_plan.jl @@ -192,6 +192,7 @@ mutable struct LevenbergMarquardtState{ damping_term_min::Tparams β::Tparams expect_zero_residual::Bool + last_step_successful::Bool function LevenbergMarquardtState( M::AbstractManifold, p::P, @@ -244,6 +245,7 @@ mutable struct LevenbergMarquardtState{ damping_term_min, β, expect_zero_residual, + true, ) end end diff --git a/src/solvers/LevenbergMarquardt.jl b/src/solvers/LevenbergMarquardt.jl index 56674b5b2f..e89fd37d35 100644 --- a/src/solvers/LevenbergMarquardt.jl +++ b/src/solvers/LevenbergMarquardt.jl @@ -264,7 +264,10 @@ function step_solver!( M = get_manifold(dmp) nlso = get_objective(dmp) basis_ox = _maybe_get_basis(M, lms.p, nlso.jacobian_tangent_basis) - get_jacobian!(dmp, lms.jacF, lms.p, basis_ox) + # a new Jacobian is only needed if the last step was successful + if lms.last_step_successful + get_jacobian!(dmp, lms.jacF, lms.p, basis_ox) + end λk = lms.damping_term * norm(lms.residual_values)^2 JJ = transpose(lms.jacF) * lms.jacF + λk * I @@ -292,8 +295,10 @@ function step_solver!( if lms.expect_zero_residual lms.damping_term = max(lms.damping_term_min, lms.damping_term / lms.β) end + lms.last_step_successful = true else lms.damping_term *= lms.β + lms.last_step_successful = false end return lms end