@@ -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