Skip to content

Commit a459a8c

Browse files
authored
Merge pull request #409 from jtwhite79/hotfix_iesfixed
Hotfix iesfixed
2 parents 5618aba + 3800506 commit a459a8c

File tree

5 files changed

+97
-34
lines changed

5 files changed

+97
-34
lines changed

benchmarks/ies_test_part1.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ def tenpar_fixed_test2():
801801
def tenpar_fixed_test3():
802802
"""tenpar fixed test 2"""
803803
model_d = "ies_10par_xsec"
804-
test_d = os.path.join(model_d, "master_fixed2")
804+
test_d = os.path.join(model_d, "master_fixed3")
805805
template_d = os.path.join(model_d, "template")
806806
pst = pyemu.Pst(os.path.join(template_d,"pest.pst"))
807807
pst.control_data.noptmax = 2
@@ -818,9 +818,9 @@ def tenpar_fixed_test3():
818818
pst.pestpp_options["ies_num_reals"] = 10
819819
pst.pestpp_options.pop("ies_par_en",None)
820820
pst.pestpp_options["ies_par_en"] = "par_fixed.csv"
821-
821+
scale = 10
822822
pst.parameter_data.loc["k_01","partrans"] = "fixed"
823-
pst.parameter_data.loc["k_01","scale"] = 10.0
823+
pst.parameter_data.loc["k_01","scale"] = scale
824824
pst.pestpp_options["ies_lambda_mults"] = 1.0
825825
pst.pestpp_options["lambda_scale_fac"] = 1.0
826826
pst.pestpp_options["ies_save_binary"] = False
@@ -854,15 +854,15 @@ def tenpar_fixed_test3():
854854
#df = df.iloc[:-1, :]
855855
#df.index = pe.index
856856
print(itr,pe.loc[:,"k_01"].values,oe.loc[:,"k_01"].values)
857-
d = pe.loc[:,"k_01"].values - oe.loc[:,"k_01"].values
857+
d = (pe.loc[:,"k_01"].values * scale) - oe.loc[:,"k_01"].values
858858
assert np.abs(d.max()) < 1e-6
859859
if prev is not None:
860860
d = prev - oe.loc[:,"k_01"].values
861861
assert np.abs(d.max()) < 1e-6
862862

863863
prev = oe.loc[:,"k_01"].values
864864

865-
test_d = os.path.join(model_d, "master_fixed2")
865+
test_d = os.path.join(model_d, "master_fixed3")
866866
template_d = os.path.join(model_d, "template")
867867
pst = pyemu.Pst(os.path.join(template_d,"pest.pst"))
868868
pst.control_data.noptmax = 2
@@ -881,7 +881,7 @@ def tenpar_fixed_test3():
881881
pst.pestpp_options["ies_par_en"] = "par_fixed.csv"
882882

883883
pst.parameter_data.loc["k_01","partrans"] = "fixed"
884-
pst.parameter_data.loc["k_01","scale"] = 10.0
884+
pst.parameter_data.loc["k_01","scale"] = scale
885885
pst.pestpp_options["ies_lambda_mults"] = 1.0
886886
pst.pestpp_options["lambda_scale_fac"] = 1.0
887887
pst.pestpp_options["ies_save_binary"] = False
@@ -915,7 +915,7 @@ def tenpar_fixed_test3():
915915
#df = df.iloc[:-1, :]
916916
#df.index = pe.index
917917
print(itr,pe.loc[:,"k_01"].values,oe.loc[:,"k_01"].values)
918-
d = pe.loc[:,"k_01"].values - oe.loc[:,"k_01"].values
918+
d = (pe.loc[:,"k_01"].values*scale)- oe.loc[:,"k_01"].values
919919
assert np.abs(d.max()) < 1e-6
920920
if prev is not None:
921921
d = prev - oe.loc[:,"k_01"].values
@@ -2502,9 +2502,9 @@ def tenpar_ineq_test():
25022502
#shutil.copy2(os.path.join("..", "exe", "windows", "x64", "Debug", "pestpp-ies.exe"),
25032503
# os.path.join("..", "bin", "win","pestpp-ies.exe"))
25042504
#invest()
2505-
tenpar_ineq_test()
2505+
#tenpar_ineq_test()
25062506
#tenpar_restart_similar_test()
2507-
#tenpar_fixed_test()
2507+
tenpar_fixed_test3()
25082508
# tenpar_full_cov_test()
25092509
# eval_freyberg_full_cov_reorder()
25102510
#test_freyberg_full_cov_reorder()

benchmarks/ies_test_part4.py

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3731,13 +3731,11 @@ def tenpar_fixed_restart_test():
37313731
print(diff)
37323732
assert np.abs(diff.values).max() < 1e-6
37333733

3734-
37353734
#oe = pd.read_csv(os.path.join(test_d,"restart_obs.csv"),index_col=0)
37363735
oe = pd.read_csv(os.path.join(test_d,"pest1.1.obs.csv"),index_col=0)
37373736
oe.index = [str(i) for i in oe.index]
37383737
r48_ovals = oe.loc["46",pst.obs_names]
37393738

3740-
37413739
pst.control_data.noptmax = -2
37423740
pst.pestpp_options.pop("ies_restart_obs_en",None)
37433741
pst.pestpp_options.pop("ies_restart_par_en",None)
@@ -3779,6 +3777,7 @@ def tenpar_consistency_test():
37793777
pst.pestpp_options["ies_no_noise"] = False
37803778
pst.pestpp_options["save_binary"] = True
37813779
pst.pestpp_options["ies_save_lambda_en"] = True
3780+
pst.pestpp_options["overdue_giveup_fac"] = 10000
37823781

37833782
par = pst.parameter_data
37843783
par.loc[pst.par_names[0],"partrans"] = "fixed"
@@ -4906,8 +4905,54 @@ def tenpar_ext_run_mgr_test():
49064905
assert df.shape[0] == 25
49074906

49084907

4908+
def tenpar_fixed_transform_test():
4909+
4910+
4911+
model_d = "ies_10par_xsec"
4912+
test_d = os.path.join(model_d, "master_fixed_transform")
4913+
template_d = os.path.join(model_d, "test_template")
4914+
4915+
if not os.path.exists(template_d):
4916+
raise Exception("template_d {0} not found".format(template_d))
4917+
4918+
if os.path.exists(test_d):
4919+
shutil.rmtree(test_d)
4920+
shutil.copytree(template_d,test_d)
4921+
4922+
4923+
pst_name = os.path.join(test_d, "pest.pst")
4924+
pst = pyemu.Pst(pst_name)
4925+
pst.control_data.noptmax = -1
4926+
pst.pestpp_options["ies_num_reals"] = 50 #hard coded later
4927+
par = pst.parameter_data
4928+
par["partrans"] = "none"
4929+
par.loc[pst.par_names[::2],"partrans"] = "fixed"
4930+
par.loc[pst.par_names[::2],"offset"] = 5
4931+
4932+
pst.write(os.path.join(test_d,"pest.pst"))
4933+
4934+
pyemu.os_utils.run("{0} pest.pst".format(exe_path),cwd=test_d)
4935+
pst = pyemu.Pst(pst_name)
4936+
pe0 = pst.ies.paren0.copy()
4937+
shutil.copy2(os.path.join(test_d,"pest.0.par.csv"),os.path.join(test_d,"restart_par.csv"))
4938+
pst.pestpp_options["ies_par_en"] = "restart_par.csv"
4939+
pst.write(os.path.join(test_d,"pest_trans.pst"))
4940+
4941+
pyemu.os_utils.run("{0} pest_trans.pst".format(exe_path),cwd=test_d)
4942+
pst = pyemu.Pst(pst_name)
4943+
pe1 = pst.ies.paren0.copy()
4944+
assert pe0.shape == pe1.shape
4945+
diff = np.abs(pe0.values - pe1.values)
4946+
print(diff)
4947+
print(diff.sum())
4948+
assert diff.sum() < 1e-6
4949+
4950+
4951+
49094952
if __name__ == "__main__":
4910-
tenpar_ext_run_mgr_test()
4953+
tenpar_fixed_transform_test()
4954+
4955+
#tenpar_ext_run_mgr_test()
49114956
#freyberg_pdc_test()
49124957
#tenpar_mean_iter_test()
49134958
#tenpar_reinflate_num_reals_2_test()

benchmarks/mou_tests_2.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2156,7 +2156,27 @@ def zdt1_fixed_scaleoffset_test():
21562156

21572157
print(df.loc[others,:])
21582158
assert np.all(df.loc[others,"val"].values <= 0)
2159+
dv0 = pd.read_csv(os.path.join(t_d,"zdt1.0.dv_pop.csv"),index_col=0)
2160+
assert dv0.shape == pe.shape
2161+
diff = np.abs(dv0.values - pe._df.loc[dv0.index,dv0.columns].values)
2162+
print(diff)
2163+
print(diff.sum())
2164+
assert diff.max() < 1e-10
2165+
pst.control_data.noptmax = 1
2166+
pst.write(os.path.join(t_d,"zdt1.pst"))
21592167

2168+
pyemu.os_utils.run("{0} {1}".format(exe_path,"zdt1.pst"),cwd=t_d)
2169+
dv1 = pd.read_csv(os.path.join(t_d,"zdt1.1.dv_pop.csv"),index_col=0)
2170+
for other in others:
2171+
#print(dv1.loc[:,other])
2172+
assert np.all(dv1.loc[:,other].values > 0)
2173+
#make sure that the values in the fixed columns are also in the initial pe
2174+
min_diff = 1e10
2175+
for val in dv1.loc[:,other].values:
2176+
min_diff = min(min_diff,np.abs((pe.loc[:,others] - val).values).min())
2177+
print(min_diff)
2178+
assert min_diff < 1e-10
2179+
21602180

21612181
def zdt1_fixedtied_stack_test():
21622182
t_d = mou_suite_helper.setup_problem("zdt1",True,True)
@@ -2695,7 +2715,7 @@ def mou_bound_handling_test():
26952715

26962716

26972717
if __name__ == "__main__":
2698-
mou_bound_handling_test()
2718+
#mou_bound_handling_test()
26992719
#basic_pso_test()
27002720
#test_restart_all()
27012721
#chance_consistency_test()
@@ -2709,7 +2729,7 @@ def mou_bound_handling_test():
27092729
#plot_hosaki(m_d=os.path.join("mou_tests","hosaki_empcov_master_risk"))
27102730
#basic_pso_test()
27112731
#zdt1_fixedtied_stack_test()
2712-
#zdt1_fixed_scaleoffset_test()
2732+
zdt1_fixed_scaleoffset_test()
27132733
#shutil.copy2(os.path.join("..","exe","windows","x64","Debug","pestpp-mou.exe"),os.path.join("..","bin","pestpp-mou.exe"))
27142734
#invest()
27152735
#plot()
@@ -2777,4 +2797,4 @@ def mou_bound_handling_test():
27772797

27782798
#pop_sched_test()
27792799
#simplex_invest_1()
2780-
pi_output_test()
2800+
#pi_output_test()

src/libs/pestpp_common/Ensemble.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2229,7 +2229,7 @@ map<int,int> ParameterEnsemble::add_runs(RunManagerAbstract *run_mgr_ptr,const v
22292229
par_transform.active_ctl2model_ip(pars_real);
22302230
else if (tstat == ParameterEnsemble::transStatus::NUM)
22312231
par_transform.numeric2model_ip(pars_real);
2232-
replace_fixed(rname, pars_real);
2232+
replace_fixed(rname, pars_real, true);
22332233
nn = pars_real.get_notnormal_keys();
22342234
if (nn.size() > 0) {
22352235
stringstream ss;
@@ -2433,19 +2433,7 @@ void ParameterEnsemble::prep_par_ensemble_after_read(map<string, int>& header_in
24332433
tied_names.push_back(name);
24342434
}
24352435
}
2436-
// vector<string> problems;
2437-
// for (auto& name : fixed_names)
2438-
// {
2439-
// if ((pi.get_parameter_rec_ptr(name)->scale != 1.0) ||
2440-
// (pi.get_parameter_rec_ptr(name)->offset != 0.0))
2441-
// {
2442-
// problems.push_back(name);
2443-
// }
2444-
// }
2445-
// if (problems.size())
2446-
// {
2447-
// throw_ensemble_error("the following fixed parameters have been passed values but have non-trivial scale/offset, which is not supported",problems);
2448-
// }
2436+
24492437
pfinfo.set_fixed_names(fixed_names);
24502438
fill_fixed(header_info, fixed_names);
24512439
save_fixed(fixed_names);
@@ -3392,8 +3380,7 @@ void ParameterEnsemble::to_csv_by_reals(ofstream &csv, bool write_header)
33923380
{
33933381
par_transform.active_ctl2numeric_ip(pars);
33943382
}
3395-
else if (tstat == transStatus::MODEL)
3396-
{
3383+
else if (tstat == transStatus::MODEL) {
33973384
par_transform.active_ctl2model_ip(pars);
33983385
}
33993386

@@ -3418,13 +3405,22 @@ void ParameterEnsemble::to_csv_by_reals(ofstream &csv, bool write_header)
34183405
}
34193406
}
34203407

3421-
void ParameterEnsemble::replace_fixed(string real_name,Parameters &pars)
3408+
void ParameterEnsemble::replace_fixed(string real_name,Parameters &pars, bool to_model)
34223409
{
34233410

34243411
map<string, double> rmap = pfinfo.get_real_fixed_values(real_name);
3412+
double val, offset, scale;
3413+
34253414
for (auto& r : rmap)
34263415
{
3427-
pars.update_rec(r.first, r.second);
3416+
val = r.second;
3417+
if (!to_model) {
3418+
scale = pest_scenario_ptr->get_ctl_parameter_info_ptr_4_mod()->get_parameter_rec_ptr(r.first)->scale;
3419+
offset = pest_scenario_ptr->get_ctl_parameter_info_ptr_4_mod()->get_parameter_rec_ptr(r.first)->offset;
3420+
val -= offset;
3421+
val /= scale;
3422+
}
3423+
pars.update_rec(r.first, val);
34283424
}
34293425

34303426

@@ -4102,6 +4098,8 @@ map<string, double> FixedParInfo::get_real_fixed_values(const string& rname)
41024098
return map<string, double>();
41034099
}
41044100
map<string, double> rmap;
4101+
double val;
4102+
41054103
for (auto& fi : fixed_info)
41064104
{
41074105
if (fi.second.find(rname) == fi.second.end())

src/libs/pestpp_common/Ensemble.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ class ParameterEnsemble : public Ensemble
208208
transStatus tstat;
209209
void save_fixed(vector<string>& fixed_names);
210210
void fill_fixed(const map<string, int> &header_info, vector<string>& fixed_names);
211-
void replace_fixed(string real_name,Parameters &pars);
211+
void replace_fixed(string real_name,Parameters &pars,bool to_model=false);
212212
void prep_par_ensemble_after_read(map<string,int>& header_info);
213213
FixedParInfo pfinfo;
214214
};

0 commit comments

Comments
 (0)