Skip to content

Commit

Permalink
pymoo runs and is starting to make more sense. need to check that par…
Browse files Browse the repository at this point in the history
…ameters have effect for all parameters
  • Loading branch information
calbaker committed Jan 31, 2025
1 parent e695acc commit ecfc18c
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 61 deletions.
124 changes: 65 additions & 59 deletions cal_and_val/thermal/cal_hev.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand All @@ -391,65 +392,70 @@ 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

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()
Expand Down
4 changes: 2 additions & 2 deletions python/fastsim/pymoo_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down Expand Up @@ -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)
]


Expand Down

0 comments on commit ecfc18c

Please sign in to comment.