Skip to content

Commit 7056788

Browse files
authored
Merge pull request #347 from mmorphew/master
GLM: Expand lambda_vec when best lambda is the lowest or highest in the vector; allow lambda_scale_vec values higher than 1
2 parents 80b596e + d0d3946 commit 7056788

File tree

2 files changed

+86
-3
lines changed

2 files changed

+86
-3
lines changed

src/libs/pestpp_common/SVDASolver.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ ModelRun SVDASolver::iteration_upgrd(RunManagerAbstract &run_manager, Terminatio
470470
}
471471
}
472472

473-
vector<double> lambda_vec = base_lambda_vec;
473+
vector<double> lambda_vec = pest_scenario.get_pestpp_options().get_base_lambda_vec();
474474
std::sort(lambda_vec.begin(), lambda_vec.end());
475475
auto iter = std::unique(lambda_vec.begin(), lambda_vec.end());
476476
lambda_vec.resize(std::distance(lambda_vec.begin(), iter));
@@ -699,6 +699,45 @@ ModelRun SVDASolver::iteration_upgrd(RunManagerAbstract &run_manager, Terminatio
699699
{
700700
throw runtime_error("all upgrade runs failed");
701701
}
702+
703+
// Check if best_lambda is at the edge of lambda_vec
704+
705+
// regrab lambda_vec
706+
vector<double> lambda_vec = pest_scenario.get_pestpp_options().get_base_lambda_vec();
707+
std::sort(lambda_vec.begin(), lambda_vec.end());
708+
auto iter = std::unique(lambda_vec.begin(), lambda_vec.end());
709+
lambda_vec.resize(std::distance(lambda_vec.begin(), iter));
710+
711+
auto last_lambda = lambda_vec.back();
712+
auto first_lambda = lambda_vec.front();
713+
file_manager.rec_ofstream() << "Checking to see if best lambda is at the edge" << std::endl;
714+
double lambda_spacing_factor = 10.0; // doing powers of 10 for now
715+
bool extended = false;
716+
717+
if (best_lambda == last_lambda)
718+
{
719+
// Add a new larger lambda
720+
double new_lambda = last_lambda * lambda_spacing_factor;
721+
if (std::find(lambda_vec.begin(), lambda_vec.end(), new_lambda) == lambda_vec.end())
722+
{
723+
lambda_vec.push_back(new_lambda);
724+
extended = true;
725+
file_manager.rec_ofstream() << "*** Extending lambda_vec: added larger lambda " << new_lambda << std::endl;
726+
}
727+
}
728+
else if (best_lambda == first_lambda)
729+
{
730+
// Add a new smaller lambda
731+
double new_lambda = first_lambda / lambda_spacing_factor;
732+
if (std::find(lambda_vec.begin(), lambda_vec.end(), new_lambda) == lambda_vec.end())
733+
{
734+
lambda_vec.push_back(new_lambda);
735+
extended = true;
736+
file_manager.rec_ofstream() << "*** Extending lambda_vec: added smaller lambda " << new_lambda << std::endl;
737+
}
738+
}
739+
std::sort(lambda_vec.begin(), lambda_vec.end());
740+
pest_scenario.get_pestpp_options_ptr()->set_base_lambda_vec(lambda_vec);
702741
return best_upgrade_run;
703742
}
704743

src/libs/pestpp_common/SVDSolver.cpp

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)