Skip to content

Commit b4f14a7

Browse files
committed
added ies_run_realname
1 parent 002dbc9 commit b4f14a7

File tree

3 files changed

+140
-112
lines changed

3 files changed

+140
-112
lines changed

src/libs/pestpp_common/EnsembleMethodUtils.cpp

Lines changed: 128 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -4930,7 +4930,7 @@ void EnsembleMethod::initialize(int cycle, bool run, bool use_existing)
49304930

49314931
}
49324932
if (localizer.get_how() == Localizer::How::OBSERVATIONS)
4933-
message(1, "localizing by obseravtions");
4933+
message(1, "localizing by observations");
49344934
else
49354935
message(1, "localizing by parameters");
49364936
}
@@ -5319,57 +5319,120 @@ void EnsembleMethod::initialize(int cycle, bool run, bool use_existing)
53195319

53205320
ss.str("");
53215321

5322-
if (pest_scenario.get_control_info().noptmax == -2)
5322+
5323+
5324+
if (subset_size > pe.shape().first)
5325+
{
5326+
use_subset = false;
5327+
}
5328+
else
53235329
{
5330+
if (subset_size < 0)
5331+
{
5332+
message(1, "using subset in lambda testing, percentage of realizations used in subset testing: ", -1. * subset_size);
5333+
}
5334+
else
5335+
{
5336+
message(1, "using subset in lambda testing, number of realizations used in subset testing: ", subset_size);
5337+
}
5338+
string how = pest_scenario.get_pestpp_options().get_ies_subset_how();
5339+
message(1, "subset how: ", how);
5340+
use_subset = true;
5341+
}
5342+
5343+
oe_org_real_names = oe.get_real_names();
5344+
pe_org_real_names = pe.get_real_names();
5345+
5346+
if ((oe.shape().first > 0) && (cycle != NetPackage::NULL_DA_CYCLE))
5347+
{
5348+
message(2, "using previously initialized observation + noise ensemble");
5349+
}
5350+
else
5351+
oe = oe_base; //copy
5352+
5353+
//reorder this for later...
5354+
if (act_obs_names.size() > 0)
5355+
oe_base.reorder(vector<string>(), act_obs_names);
5356+
5357+
pe_base = pe; //copy
5358+
//reorder this for later
5359+
pe_base.reorder(vector<string>(), act_par_names);
5360+
5361+
5362+
//the hard way to restart
5363+
if (obs_restart_csv.size() > 0)
5364+
initialize_restart();
5365+
//we need this for the prior mean shifting
5366+
weights_base = weights;
5367+
5368+
if (pest_scenario.get_control_info().noptmax == -2)
5369+
{
53245370
if (pest_scenario.get_pestpp_options().get_debug_parse_only()) {
53255371
return;
53265372
}
5373+
string rname = ppo->get_ies_run_realname();
5374+
Parameters pars;
5375+
if (!rname.empty())
5376+
{
5377+
map<string,int> rmap = pe.get_real_map();
5378+
if (rmap.find(rname) == rmap.end())
5379+
{
5380+
throw_em_error("'ies_run_realname' argument supplied '"+rname+"' but that realization is not in the parameter ensemble");
5381+
}
5382+
pars.update(pe.get_var_names(),pe.get_real_vector(rname));
5383+
rname = "real"+rname;
5384+
5385+
}
5386+
else
5387+
{
5388+
rname = "mean";
5389+
message(0, "'noptmax'=-2, running mean parameter ensemble values and quitting");
5390+
message(1, "calculating mean parameter values");
5391+
pars.update(pe.get_var_names(), pe.get_mean_stl_var_vector());
53275392

5328-
message(0, "'noptmax'=-2, running mean parameter ensemble values and quitting");
5329-
message(1, "calculating mean parameter values");
5330-
Parameters pars;
5331-
vector<double> mv = pe.get_mean_stl_var_vector();
5332-
if (pe.get_fixed_info().get_map_size() > 0)
5393+
}
5394+
5395+
if (pe.get_fixed_info().get_map_size() > 0)
53335396
{
5334-
ss.str("");
5335-
ss << "WARNING: 'fixed' parameter realizations provided but ctrl " << endl;
5397+
ss.str("");
5398+
ss << "WARNING: 'fixed' parameter realizations provided but ctrl " << endl;
53365399
ss << " file parameter values are being used for 'fixed' parameters" << endl;
53375400
ss << " in the mean parameter value run." << endl;
5338-
message(0,ss.str());
5401+
message(0,ss.str());
53395402
}
53405403

5341-
pars.update(pe.get_var_names(), pe.get_mean_stl_var_vector());
5342-
ParamTransformSeq pts = pe.get_par_transform();
53435404

5344-
ParameterEnsemble _pe(&pest_scenario, &rand_gen);
5345-
_pe.reserve(vector<string>(), pe.get_var_names());
5346-
_pe.set_trans_status(pe.get_trans_status());
5347-
_pe.append("mean", pars);
5348-
ss.str("");
5349-
ss << file_manager.get_base_filename();
5350-
if (cycle != NetPackage::NULL_DA_CYCLE)
5351-
ss << "." << cycle;
5352-
ss << ".mean.par.csv";
5353-
string par_csv = ss.str();
5354-
message(1, "saving mean parameter values to ", par_csv);
5355-
_pe.to_csv(par_csv);
5356-
pe_base = _pe;
5357-
pe_base.reorder(vector<string>(), act_par_names);
5358-
ObservationEnsemble _oe(&pest_scenario, &rand_gen);
5359-
_oe.reserve(vector<string>(), oe_base.get_var_names());
5360-
_oe.append("mean", pest_scenario.get_ctl_observations());
5361-
oe_base = _oe;
5362-
oe_base.reorder(vector<string>(), act_obs_names);
5363-
//initialize the phi handler
5364-
ph = L2PhiHandler(&pest_scenario, &file_manager, &oe_base, &pe_base, &parcov);
5365-
if (ph.get_lt_obs_names().size() > 0)
5366-
{
5367-
message(1, "less_than inequality defined for observations: ", ph.get_lt_obs_names().size());
5368-
}
5369-
if (ph.get_gt_obs_names().size())
5370-
{
5371-
message(1, "greater_than inequality defined for observations: ", ph.get_gt_obs_names().size());
5372-
}
5405+
ParamTransformSeq pts = pe.get_par_transform();
5406+
5407+
ParameterEnsemble _pe(&pest_scenario, &rand_gen);
5408+
_pe.reserve(vector<string>(), pe.get_var_names());
5409+
_pe.set_trans_status(pe.get_trans_status());
5410+
_pe.append(rname, pars);
5411+
ss.str("");
5412+
ss << file_manager.get_base_filename();
5413+
if (cycle != NetPackage::NULL_DA_CYCLE)
5414+
ss << "." << cycle;
5415+
ss << "." << rname << ".par.csv";
5416+
string par_csv = ss.str();
5417+
message(1, "saving "+ rname +" parameter values to ", par_csv);
5418+
_pe.to_csv(par_csv);
5419+
pe_base = _pe;
5420+
pe_base.reorder(vector<string>(), act_par_names);
5421+
ObservationEnsemble _oe(&pest_scenario, &rand_gen);
5422+
_oe.reserve(vector<string>(), oe_base.get_var_names());
5423+
_oe.append(rname, pest_scenario.get_ctl_observations());
5424+
oe_base = _oe;
5425+
oe_base.reorder(vector<string>(), act_obs_names);
5426+
//initialize the phi handler
5427+
ph = L2PhiHandler(&pest_scenario, &file_manager, &oe_base, &pe_base, &parcov);
5428+
if (ph.get_lt_obs_names().size() > 0)
5429+
{
5430+
message(1, "less_than inequality defined for observations: ", ph.get_lt_obs_names().size());
5431+
}
5432+
if (ph.get_gt_obs_names().size())
5433+
{
5434+
message(1, "greater_than inequality defined for observations: ", ph.get_gt_obs_names().size());
5435+
}
53735436
map<string,double> t;
53745437
t = ph.get_lt_obs_bounds();
53755438
if (!t.empty())
@@ -5410,77 +5473,33 @@ void EnsembleMethod::initialize(int cycle, bool run, bool use_existing)
54105473
}
54115474

54125475

5413-
message(1, "running mean parameter values");
5476+
message(1, "running " + rname + " parameter values");
54145477

5415-
vector<int> failed_idxs = run_ensemble(_pe, _oe,vector<int>(),cycle);
5416-
if (failed_idxs.size() != 0)
5417-
{
5418-
message(0, "mean parameter value run failed...bummer");
5419-
throw_em_error("mean parameter value run failed");
5420-
}
5421-
ss.str("");
5422-
ss << file_manager.get_base_filename();
5423-
if (cycle != NetPackage::NULL_DA_CYCLE)
5424-
ss << "." << cycle;
5425-
ss << ".mean.obs.csv";
5426-
string obs_csv = ss.str();
5427-
message(1, "saving results from mean parameter value run to ", obs_csv);
5428-
_oe.to_csv(obs_csv);
5429-
5430-
ph.update(_oe, _pe);
5431-
message(0, "mean parameter phi report:");
5432-
ph.report(true);
5433-
ph.write(0, 1);
5434-
save_real_par_rei(pest_scenario, _pe, _oe, output_file_writer, file_manager, -1, "mean", cycle);
5435-
//transfer_dynamic_state_from_oe_to_initial_pe(_pe, _oe);
5436-
pe = _pe;
5437-
oe = _oe;
5438-
return;
5439-
}
5440-
5441-
if (subset_size > pe.shape().first)
5442-
{
5443-
use_subset = false;
5444-
}
5445-
else
5446-
{
5447-
if (subset_size < 0)
5448-
{
5449-
message(1, "using subset in lambda testing, percentage of realizations used in subset testing: ", -1. * subset_size);
5450-
}
5451-
else
5478+
vector<int> failed_idxs = run_ensemble(_pe, _oe,vector<int>(),cycle);
5479+
if (failed_idxs.size() != 0)
54525480
{
5453-
message(1, "using subset in lambda testing, number of realizations used in subset testing: ", subset_size);
5481+
message(0, rname+" parameter value run failed...bummer");
5482+
throw_em_error(rname+" parameter value run failed");
54545483
}
5455-
string how = pest_scenario.get_pestpp_options().get_ies_subset_how();
5456-
message(1, "subset how: ", how);
5457-
use_subset = true;
5458-
}
5459-
5460-
oe_org_real_names = oe.get_real_names();
5461-
pe_org_real_names = pe.get_real_names();
5462-
5463-
if ((oe.shape().first > 0) && (cycle != NetPackage::NULL_DA_CYCLE))
5464-
{
5465-
message(2, "using previously initialized observation + noise ensemble");
5466-
}
5467-
else
5468-
oe = oe_base; //copy
5469-
5470-
//reorder this for later...
5471-
if (act_obs_names.size() > 0)
5472-
oe_base.reorder(vector<string>(), act_obs_names);
5473-
5474-
pe_base = pe; //copy
5475-
//reorder this for later
5476-
pe_base.reorder(vector<string>(), act_par_names);
5477-
5478-
5479-
//the hard way to restart
5480-
if (obs_restart_csv.size() > 0)
5481-
initialize_restart();
5482-
//we need this for the prior mean shifting
5483-
weights_base = weights;
5484+
ss.str("");
5485+
ss << file_manager.get_base_filename();
5486+
if (cycle != NetPackage::NULL_DA_CYCLE)
5487+
ss << "." << cycle;
5488+
ss << "." << rname << ".obs.csv";
5489+
string obs_csv = ss.str();
5490+
message(1, "saving results from mean parameter value run to ", obs_csv);
5491+
_oe.to_csv(obs_csv);
5492+
5493+
ph.update(_oe, _pe);
5494+
message(0, rname+" parameter phi report:");
5495+
ph.report(true);
5496+
ph.write(0, 1);
5497+
save_real_par_rei(pest_scenario, _pe, _oe, output_file_writer, file_manager, -1, rname, cycle);
5498+
//transfer_dynamic_state_from_oe_to_initial_pe(_pe, _oe);
5499+
pe = _pe;
5500+
oe = _oe;
5501+
return;
5502+
}
54845503

54855504
if (!run)
54865505
return;

src/libs/pestpp_common/pest_data_structs.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,6 +1231,13 @@ bool PestppOptions::assign_ies_value_by_key(const string& key, const string& val
12311231
return true;
12321232
}
12331233

1234+
else if (key == "IES_RUN_REALNAME")
1235+
{
1236+
ies_run_realname = value;
1237+
return true;
1238+
1239+
}
1240+
12341241

12351242

12361243
return false;
@@ -1897,6 +1904,7 @@ void PestppOptions::summary(ostream& os) const
18971904
for (auto v : ies_aal_indicator_pars)
18981905
os << v << ",";
18991906
os << endl;
1907+
os << "ies_run_realname: " << ies_run_realname;
19001908

19011909
os << endl << "pestpp-sen options: " << endl;
19021910
os << "gsa_method: " << gsa_method << endl;
@@ -2083,6 +2091,7 @@ void PestppOptions::set_defaults()
20832091
set_ies_phi_factors_by_real(false);
20842092
set_ies_n_iter_reinflate(vector < int > {0});
20852093
set_ies_reinflate_factor(vector < double > {1.0});
2094+
set_ies_run_realname("");
20862095

20872096
set_ies_updatebyreals(false);
20882097
set_save_dense(false);

src/libs/pestpp_common/pest_data_structs.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,6 @@ class PestppOptions {
497497

498498
bool get_save_dense() const {return save_dense; }
499499
void set_save_dense(bool _flag) {save_dense = _flag;}
500-
501-
502-
503500
int get_ies_num_threads() const { return ies_num_threads; }
504501
void set_ies_num_threads(int _threads) { ies_num_threads = _threads; }
505502

@@ -556,6 +553,8 @@ class PestppOptions {
556553
vector<double> get_ies_reinflate_factor() const {return ies_reinflate_factor;}
557554
void set_ies_aal_indicator_pars(vector<string> pars) { ies_aal_indicator_pars = pars;}
558555
vector<string> get_ies_aal_indicator_pars() const {return ies_aal_indicator_pars;}
556+
void set_ies_run_realname(string name) {ies_run_realname = name;}
557+
string get_ies_run_realname() const {return ies_run_realname;}
559558

560559
string get_gsa_method() const { return gsa_method; }
561560
void set_gsa_method(string _m) { gsa_method = _m; }
@@ -842,6 +841,7 @@ class PestppOptions {
842841
vector<double> ies_reinflate_factor;
843842
bool ies_updatebyreals;
844843
vector<string> ies_aal_indicator_pars;
844+
string ies_run_realname;
845845

846846

847847

0 commit comments

Comments
 (0)