@@ -61,7 +61,6 @@ impl optimizer::Optimizer for LevenbergMarquardtOptimizer {
61
61
LinearSolverType :: SparseCholesky => Box :: new ( linear:: SparseCholeskySolver :: new ( ) ) ,
62
62
LinearSolverType :: SparseQR => Box :: new ( linear:: SparseQRSolver :: new ( ) ) ,
63
63
} ;
64
- let mut step_succesful = false ;
65
64
66
65
// On the first iteration, we'll generate a diagonal matrix of the jacobian.
67
66
// Its shape will be (total_variable_dimension, total_variable_dimension).
@@ -114,7 +113,7 @@ impl optimizer::Optimizer for LevenbergMarquardtOptimizer {
114
113
log:: debug!( "solve ax=b failed, current error is nan" ) ;
115
114
return None ;
116
115
}
117
- if i > 0 && step_succesful {
116
+ if i > 0 {
118
117
if ( last_err - current_error) . abs ( ) < opt_option. min_abs_error_decrease_threshold {
119
118
trace ! ( "absolute error decrease low" ) ;
120
119
break ;
@@ -144,8 +143,8 @@ impl optimizer::Optimizer for LevenbergMarquardtOptimizer {
144
143
// Regularize the diagonal of jtj between the min and max diagonal values.
145
144
let mut jtj_regularized = jtj. clone ( ) ;
146
145
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 ) ;
149
148
}
150
149
151
150
let start = Instant :: now ( ) ;
@@ -184,12 +183,10 @@ impl optimizer::Optimizer for LevenbergMarquardtOptimizer {
184
183
// Increase the trust region by reducing u
185
184
let tmp = 2.0 * rho - 1.0 ;
186
185
u *= ( 1.0_f64 / 3.0 ) . max ( 1.0 - tmp * tmp * tmp) ;
187
- step_succesful = true ;
188
186
} else {
189
187
// If there's too much divergence, reduce the trust region and try again with the same parameters.
190
188
u *= 2.0 ;
191
189
println ! ( "u {}" , u) ;
192
- step_succesful = false ;
193
190
}
194
191
} else {
195
192
log:: debug!( "solve ax=b failed" ) ;
0 commit comments