@@ -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 ;
0 commit comments