From ecfc18c68e4f743e622a034d9b2fdc73db6911ee Mon Sep 17 00:00:00 2001 From: Chad Baker Date: Fri, 31 Jan 2025 09:26:10 -0700 Subject: [PATCH] pymoo runs and is starting to make more sense. need to check that parameters have effect for all parameters --- cal_and_val/thermal/cal_hev.py | 124 +++++++++++++++++---------------- python/fastsim/pymoo_api.py | 4 +- 2 files changed, 67 insertions(+), 61 deletions(-) diff --git a/cal_and_val/thermal/cal_hev.py b/cal_and_val/thermal/cal_hev.py index ef67bc4d..6c5fdd50 100644 --- a/cal_and_val/thermal/cal_hev.py +++ b/cal_and_val/thermal/cal_hev.py @@ -1,6 +1,7 @@ """ Calibration script for 2021_Hyundai_Sonata_Hybrid_Blue """ +import pprint from pathlib import Path import numpy as np # noqa: F401 import matplotlib.pyplot as plt # noqa: F401 @@ -358,17 +359,17 @@ def get_exp_pwr_hvac(df): new_em_eff_range, new_fc_eff_max, # new_fc_eff_range, # range is not working - # new_cab_shell_htc, - # new_cab_htc_to_amb_stop, - # new_cab_tm, - # new_cab_length, - # new_speed_soc_disch_buffer_meters_per_second, - # new_speed_soc_disch_buffer_coeff, - # new_speed_soc_fc_on_buffer_meters_per_second, - # new_speed_soc_fc_on_buffer_coeff, - # new_fc_min_time_on_seconds, - # new_frac_pwr_demand_fc_forced_on, - # new_frac_of_most_eff_pwr_to_run_fc, + new_cab_shell_htc, + new_cab_htc_to_amb_stop, + new_cab_tm, + new_cab_length, + new_speed_soc_disch_buffer_meters_per_second, + new_speed_soc_disch_buffer_coeff, + new_speed_soc_fc_on_buffer_meters_per_second, + new_speed_soc_fc_on_buffer_coeff, + new_fc_min_time_on_seconds, + new_frac_pwr_demand_fc_forced_on, + new_frac_of_most_eff_pwr_to_run_fc, # TODO: make sure this has functions for modifying # - battery thermal -- not necessary for HEV because battery temperature has no real effect # - thermal mass @@ -391,21 +392,25 @@ def get_exp_pwr_hvac(df): (0.1, 0.6), (0.32, 0.45), # (0.2, 0.45), # range is not working - # (10, 250), - # (10, 250), - # (100e3, 350e3), - # (1.5, 7), - # (5, 50), - # (0.25, 2.0), - # (5, 50), - # (0.25, 2.0), - # (5, 30), - # (0.3, 0.8), - # (0.1, 1.0), + (10, 250), + (10, 250), + (100e3, 350e3), + (1.5, 7), + (5, 50), + (0.25, 2.0), + (5, 50), + (0.25, 2.0), + (5, 30), + (0.3, 0.8), + (0.1, 1.0), ), verbose=False, ) +print("") +pprint.pp(cal_mod_obj.params_and_bounds()) +print("") + val_mod_obj = deepcopy(cal_mod_obj) val_mod_obj.dfs = dfs_for_val val_mod_obj.models = sds_for_val @@ -413,43 +418,44 @@ def get_exp_pwr_hvac(df): em_eff_fwd_max = fsim.ElectricMachine.from_pydict(veh_dict['pt_type']['HybridElectricVehicle']['em'], skip_init=False).eff_fwd_max em_eff_fwd_range = fsim.ElectricMachine.from_pydict(veh_dict['pt_type']['HybridElectricVehicle']['em'], skip_init=False).eff_fwd_range fc_eff_max = fsim.FuelConverter.from_pydict(veh_dict['pt_type']['HybridElectricVehicle']['fc'], skip_init=False).eff_max -print("Verifying that model responds to input parameter changes by individually perturbing parameters") -baseline_errors = cal_mod_obj.get_errors( - cal_mod_obj.update_params([ - em_eff_fwd_max, - em_eff_fwd_range, - fc_eff_max, - # veh_dict['pt_type']['HybridElectricVehicle']['fc'], - ]) -) -param0_perturb = cal_mod_obj.get_errors( - cal_mod_obj.update_params([ - em_eff_fwd_max + 0.05, - em_eff_fwd_range, - fc_eff_max, - # veh_dict['pt_type']['HybridElectricVehicle']['fc'], - ]) -) -assert np.array(param0_perturb.values()) != np.array(baseline_errors.values()), f"\n{baseline_errors.values()}\n{param0_perturb.values()}" -param1_perturb = cal_mod_obj.get_errors( - cal_mod_obj.update_params([ - em_eff_fwd_max, - em_eff_fwd_range + 0.1, - fc_eff_max, - # veh_dict['pt_type']['HybridElectricVehicle']['fc'], - ]) -) -assert np.array(param1_perturb.values()) != np.array(baseline_errors.values()), f"\n{baseline_errors.values()}\n{param1_perturb.values()}" -param2_perturb = cal_mod_obj.get_errors( - cal_mod_obj.update_params([ - em_eff_fwd_max, - em_eff_fwd_range, - fc_eff_max - 0.15, - # veh_dict['pt_type']['HybridElectricVehicle']['fc'], - ]) -) -assert np.array(param2_perturb.values()) != np.array(baseline_errors.values()), f"\n{baseline_errors.values()}\n{param1_perturb.values()}" -print("Success!") +# TODO: uncomment this and do it for all the parameters +# print("Verifying that model responds to input parameter changes by individually perturbing parameters") +# baseline_errors = cal_mod_obj.get_errors( +# cal_mod_obj.update_params([ +# em_eff_fwd_max, +# em_eff_fwd_range, +# fc_eff_max, +# # veh_dict['pt_type']['HybridElectricVehicle']['fc'], +# ]) +# ) +# param0_perturb = cal_mod_obj.get_errors( +# cal_mod_obj.update_params([ +# em_eff_fwd_max + 0.05, +# em_eff_fwd_range, +# fc_eff_max, +# # veh_dict['pt_type']['HybridElectricVehicle']['fc'], +# ]) +# ) +# assert np.array(param0_perturb.values()) != np.array(baseline_errors.values()), f"\n{baseline_errors.values()}\n{param0_perturb.values()}" +# param1_perturb = cal_mod_obj.get_errors( +# cal_mod_obj.update_params([ +# em_eff_fwd_max, +# em_eff_fwd_range + 0.1, +# fc_eff_max, +# # veh_dict['pt_type']['HybridElectricVehicle']['fc'], +# ]) +# ) +# assert np.array(param1_perturb.values()) != np.array(baseline_errors.values()), f"\n{baseline_errors.values()}\n{param1_perturb.values()}" +# param2_perturb = cal_mod_obj.get_errors( +# cal_mod_obj.update_params([ +# em_eff_fwd_max, +# em_eff_fwd_range, +# fc_eff_max - 0.15, +# # veh_dict['pt_type']['HybridElectricVehicle']['fc'], +# ]) +# ) +# assert np.array(param2_perturb.values()) != np.array(baseline_errors.values()), f"\n{baseline_errors.values()}\n{param1_perturb.values()}" +# print("Success!") if __name__ == "__main__": parser = pymoo_api.get_parser() diff --git a/python/fastsim/pymoo_api.py b/python/fastsim/pymoo_api.py index f9f23194..59db84ee 100644 --- a/python/fastsim/pymoo_api.py +++ b/python/fastsim/pymoo_api.py @@ -203,7 +203,7 @@ def get_errors( sd_dict = sd.to_pydict() walk_success = True if len(sd_dict['veh']['history']['time_seconds']) < np.floor(len(df_exp) / 2): - walk_success = True + walk_success = False if self.verbose: print(f"Time to simulate {key}: {t1 - t0:.3g}") @@ -262,7 +262,7 @@ def get_errors( def params_and_bounds(self): return [ - (param_fn, bound_set) for (param_fn, bound_set) in zip(self.param_fns, self.bounds) + (param_fn.__name__, bound_set) for (param_fn, bound_set) in zip(self.param_fns, self.bounds) ]