Skip to content

Commit af424ec

Browse files
authored
Fix lm (#39)
* fix * bump version
1 parent 7141a7f commit af424ec

File tree

2 files changed

+4
-7
lines changed

2 files changed

+4
-7
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "tiny-solver"
3-
version = "0.14.0"
3+
version = "0.14.1"
44
edition = "2021"
55
authors = ["Powei Lin <[email protected]>"]
66
readme = "README.md"

src/optimizer/levenberg_marquardt_optimizer.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ impl optimizer::Optimizer for LevenbergMarquardtOptimizer {
6161
LinearSolverType::SparseCholesky => Box::new(linear::SparseCholeskySolver::new()),
6262
LinearSolverType::SparseQR => Box::new(linear::SparseQRSolver::new()),
6363
};
64-
let mut step_succesful = false;
6564

6665
// On the first iteration, we'll generate a diagonal matrix of the jacobian.
6766
// Its shape will be (total_variable_dimension, total_variable_dimension).
@@ -114,7 +113,7 @@ impl optimizer::Optimizer for LevenbergMarquardtOptimizer {
114113
log::debug!("solve ax=b failed, current error is nan");
115114
return None;
116115
}
117-
if i > 0 && step_succesful {
116+
if i > 0 {
118117
if (last_err - current_error).abs() < opt_option.min_abs_error_decrease_threshold {
119118
trace!("absolute error decrease low");
120119
break;
@@ -144,8 +143,8 @@ impl optimizer::Optimizer for LevenbergMarquardtOptimizer {
144143
// Regularize the diagonal of jtj between the min and max diagonal values.
145144
let mut jtj_regularized = jtj.clone();
146145
for i in 0..total_variable_dimension {
147-
jtj_regularized[(i, i)] =
148-
(jtj[(i, i)].max(self.min_diagonal)).min(self.max_diagonal);
146+
jtj_regularized[(i, i)] +=
147+
u * (jtj[(i, i)].max(self.min_diagonal)).min(self.max_diagonal);
149148
}
150149

151150
let start = Instant::now();
@@ -184,12 +183,10 @@ impl optimizer::Optimizer for LevenbergMarquardtOptimizer {
184183
// Increase the trust region by reducing u
185184
let tmp = 2.0 * rho - 1.0;
186185
u *= (1.0_f64 / 3.0).max(1.0 - tmp * tmp * tmp);
187-
step_succesful = true;
188186
} else {
189187
// If there's too much divergence, reduce the trust region and try again with the same parameters.
190188
u *= 2.0;
191189
println!("u {}", u);
192-
step_succesful = false;
193190
}
194191
} else {
195192
log::debug!("solve ax=b failed");

0 commit comments

Comments
 (0)