Skip to content

Commit d6acf64

Browse files
authored
Only compute Jacobian in RLM if last step success (#303)
Co-authored-by: Johannes Terblanche <Affie@users.noreply.github.com>
1 parent 81b7328 commit d6acf64

2 files changed

Lines changed: 8 additions & 1 deletion

File tree

‎src/plans/nonlinear_least_squares_plan.jl‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ mutable struct LevenbergMarquardtState{
192192
damping_term_min::Tparams
193193
β::Tparams
194194
expect_zero_residual::Bool
195+
last_step_successful::Bool
195196
function LevenbergMarquardtState(
196197
M::AbstractManifold,
197198
p::P,
@@ -244,6 +245,7 @@ mutable struct LevenbergMarquardtState{
244245
damping_term_min,
245246
β,
246247
expect_zero_residual,
248+
true,
247249
)
248250
end
249251
end

‎src/solvers/LevenbergMarquardt.jl‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,10 @@ function step_solver!(
264264
M = get_manifold(dmp)
265265
nlso = get_objective(dmp)
266266
basis_ox = _maybe_get_basis(M, lms.p, nlso.jacobian_tangent_basis)
267-
get_jacobian!(dmp, lms.jacF, lms.p, basis_ox)
267+
# a new Jacobian is only needed if the last step was successful
268+
if lms.last_step_successful
269+
get_jacobian!(dmp, lms.jacF, lms.p, basis_ox)
270+
end
268271
λk = lms.damping_term * norm(lms.residual_values)^2
269272

270273
JJ = transpose(lms.jacF) * lms.jacF + λk * I
@@ -292,8 +295,10 @@ function step_solver!(
292295
if lms.expect_zero_residual
293296
lms.damping_term = max(lms.damping_term_min, lms.damping_term / lms.β)
294297
end
298+
lms.last_step_successful = true
295299
else
296300
lms.damping_term *= lms.β
301+
lms.last_step_successful = false
297302
end
298303
return lms
299304
end

0 commit comments

Comments
 (0)