@@ -1075,11 +1075,12 @@ ModelRun SVDSolver::iteration_upgrd(RunManagerAbstract &run_manager, Termination
10751075 num_lamb_runs++;
10761076 run_manager.update_run (run_id, base_model_pars, base_run.get_obs ());
10771077 // Marquardt Lambda Update Vector
1078- vector<double > lambda_vec = base_lambda_vec ;
1078+ vector<double > lambda_vec = pest_scenario. get_pestpp_options (). get_base_lambda_vec () ;
10791079
10801080 std::sort (lambda_vec.begin (), lambda_vec.end ());
10811081 auto iter = std::unique (lambda_vec.begin (), lambda_vec.end ());
10821082 lambda_vec.resize (std::distance (lambda_vec.begin (), iter));
1083+
10831084 int i_update_vec = 0 ;
10841085 stringstream message;
10851086 stringstream prf_message;
@@ -1137,7 +1138,7 @@ ModelRun SVDSolver::iteration_upgrd(RunManagerAbstract &run_manager, Termination
11371138 Parameters del_numeric_pars = new_numeric_pars - base_numeric_pars;
11381139 for (double i_scale : lambda_scale_vec)
11391140 {
1140- if (i_scale >= 1.0 )
1141+ if (i_scale == 1.0 ) // skip scale == 1 as we run the normal length anyway
11411142 continue ;
11421143 Parameters scaled_pars = base_numeric_pars + del_numeric_pars * i_scale;
11431144
@@ -1169,7 +1170,11 @@ ModelRun SVDSolver::iteration_upgrd(RunManagerAbstract &run_manager, Termination
11691170 }
11701171 file_manager.close_file (" fpr" );
11711172 RestartController::write_upgrade_runs_built (fout_restart);
1173+
11721174 }
1175+
1176+
1177+
11731178 // instance of a Mat for the jco
11741179 Mat j;
11751180 LinearAnalysis la (j, pest_scenario, file_manager, *performance_log, parcov, rand_gen_ptr);
@@ -1338,6 +1343,45 @@ ModelRun SVDSolver::iteration_upgrd(RunManagerAbstract &run_manager, Termination
13381343 throw runtime_error (" all upgrade runs failed." );
13391344 }
13401345
1346+ // Check if best_lambda is at the edge of lambda_vec
1347+
1348+ // regrab lambda_vec
1349+ vector<double > lambda_vec = pest_scenario.get_pestpp_options ().get_base_lambda_vec ();
1350+ std::sort (lambda_vec.begin (), lambda_vec.end ());
1351+ auto iter = std::unique (lambda_vec.begin (), lambda_vec.end ());
1352+ lambda_vec.resize (std::distance (lambda_vec.begin (), iter));
1353+
1354+ auto last_lambda = lambda_vec.back ();
1355+ auto first_lambda = lambda_vec.front ();
1356+ file_manager.rec_ofstream () << " Checking to see if best lambda is at the edge" << std::endl;
1357+ double lambda_spacing_factor = 10.0 ; // doing powers of 10 for now
1358+ bool extended = false ;
1359+
1360+ if (best_lambda == last_lambda)
1361+ {
1362+ // Add a new larger lambda
1363+ double new_lambda = last_lambda * lambda_spacing_factor;
1364+ if (std::find (lambda_vec.begin (), lambda_vec.end (), new_lambda) == lambda_vec.end ())
1365+ {
1366+ lambda_vec.push_back (new_lambda);
1367+ extended = true ;
1368+ file_manager.rec_ofstream () << " *** Extending lambda_vec: added larger lambda " << new_lambda << std::endl;
1369+ }
1370+ }
1371+ else if (best_lambda == first_lambda)
1372+ {
1373+ // Add a new smaller lambda
1374+ double new_lambda = first_lambda / lambda_spacing_factor;
1375+ if (std::find (lambda_vec.begin (), lambda_vec.end (), new_lambda) == lambda_vec.end ())
1376+ {
1377+ lambda_vec.push_back (new_lambda);
1378+ extended = true ;
1379+ file_manager.rec_ofstream () << " *** Extending lambda_vec: added smaller lambda " << new_lambda << std::endl;
1380+ }
1381+ }
1382+ std::sort (lambda_vec.begin (), lambda_vec.end ());
1383+ pest_scenario.get_pestpp_options_ptr ()->set_base_lambda_vec (lambda_vec);
1384+
13411385 return best_upgrade_run;
13421386}
13431387
0 commit comments