From af98c12f4483295ff6fa9c637864d30ceefe3ae8 Mon Sep 17 00:00:00 2001 From: ahalev Date: Fri, 20 Dec 2024 19:47:55 -0500 Subject: [PATCH 1/5] add new tests --- tests/envs/test_base.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/envs/test_base.py b/tests/envs/test_base.py index 8eaf76bc..962a256f 100644 --- a/tests/envs/test_base.py +++ b/tests/envs/test_base.py @@ -131,6 +131,24 @@ class ObsKeysWithNetLoadParent(ObsKeysNoNetLoadParent): observation_keys = ['net_load', 'soc', 'load_current', 'export_price_current'] +class ObsKeysDuplicateKeysParent(ObsKeysNoNetLoadParent): + observation_keys = ['net_load', 'soc', 'load_current', 'load_current', 'export_price_current'] + + def test_get_obs_correct_keys_in_modules(self): + env = deepcopy(self.env) + obs = env._get_obs() + + unique_obs_keys = pd.Index(self.observation_keys).drop_duplicates().tolist() + + for module in env.modules.iterlist(): + module_state_dict = module.state_dict(normalized=True) + matching_keys = [obs_key for obs_key in unique_obs_keys if obs_key in module.state_dict().keys()] + matching_values = [module_state_dict[k] for k in matching_keys] + + with self.subTest(module=module.name, keys=matching_keys): + self.assertEqual(obs[np.isin(unique_obs_keys, matching_keys)], matching_values) + + class TestDiscrete(Parent): env_class = DiscreteMicrogridEnv @@ -155,6 +173,17 @@ class TestNetLoadContinuousObsKeysNoNetLoad(ObsKeysNoNetLoadParent): env_class = NetLoadContinuousMicrogridEnv +class TestDiscreteObsDuplicateKeys(ObsKeysDuplicateKeysParent): + env_class = DiscreteMicrogridEnv + + +class TestContinuousObsDuplicateKeys(ObsKeysDuplicateKeysParent): + env_class = ContinuousMicrogridEnv + + +class TestNetLoadContinuousObsDuplicateKeys(ObsKeysDuplicateKeysParent): + env_class = NetLoadContinuousMicrogridEnv + def flatten_nested_dict(nested_dict): def extract_list(l): assert len(l) == 1, 'reduction only works with length 1 lists' From 85e0f2226106c6729bc641ab321e727a98bf5ccf Mon Sep 17 00:00:00 2001 From: ahalev Date: Fri, 20 Dec 2024 19:48:02 -0500 Subject: [PATCH 2/5] whitespace --- tests/envs/test_base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/envs/test_base.py b/tests/envs/test_base.py index 962a256f..cce2ec3d 100644 --- a/tests/envs/test_base.py +++ b/tests/envs/test_base.py @@ -184,6 +184,7 @@ class TestContinuousObsDuplicateKeys(ObsKeysDuplicateKeysParent): class TestNetLoadContinuousObsDuplicateKeys(ObsKeysDuplicateKeysParent): env_class = NetLoadContinuousMicrogridEnv + def flatten_nested_dict(nested_dict): def extract_list(l): assert len(l) == 1, 'reduction only works with length 1 lists' From ff59796dd156a331d1e4e968dc79cbe2a19ceef5 Mon Sep 17 00:00:00 2001 From: ahalev Date: Fri, 20 Dec 2024 19:55:42 -0500 Subject: [PATCH 3/5] add decorator --- tests/envs/test_base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/envs/test_base.py b/tests/envs/test_base.py index cce2ec3d..4b221f39 100644 --- a/tests/envs/test_base.py +++ b/tests/envs/test_base.py @@ -134,6 +134,7 @@ class ObsKeysWithNetLoadParent(ObsKeysNoNetLoadParent): class ObsKeysDuplicateKeysParent(ObsKeysNoNetLoadParent): observation_keys = ['net_load', 'soc', 'load_current', 'load_current', 'export_price_current'] + @pass_if_parent def test_get_obs_correct_keys_in_modules(self): env = deepcopy(self.env) obs = env._get_obs() From fe2613a595dd835a42d17415fbe413c5b990c48e Mon Sep 17 00:00:00 2001 From: ahalev Date: Fri, 20 Dec 2024 20:08:29 -0500 Subject: [PATCH 4/5] add new tests --- tests/envs/test_base.py | 42 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/tests/envs/test_base.py b/tests/envs/test_base.py index 4b221f39..8a801463 100644 --- a/tests/envs/test_base.py +++ b/tests/envs/test_base.py @@ -7,6 +7,7 @@ from tests.helpers.test_case import TestCase from tests.helpers.modular_microgrid import get_modular_microgrid +from pymgrid.modules import BatteryModule from pymgrid.envs import DiscreteMicrogridEnv, ContinuousMicrogridEnv, NetLoadContinuousMicrogridEnv from pymgrid.envs.base import BaseMicrogridEnv @@ -150,6 +151,30 @@ def test_get_obs_correct_keys_in_modules(self): self.assertEqual(obs[np.isin(unique_obs_keys, matching_keys)], matching_values) +class ObsKeysDuplicateModulesParent(Parent): + def setUp(self) -> None: + second_battery = BatteryModule( + min_capacity=0, + max_capacity=1000, + max_charge=500, + max_discharge=500, + efficiency=1.0, + init_soc=0.5, + normalized_action_bounds=(0, 1)) + + microgrid = get_modular_microgrid( + additional_modules=[second_battery], + ) + + self.env = self.env_class.from_microgrid(microgrid, observation_keys=self.observation_keys) + + @pass_if_parent + def test_pre_reset_state_series_invariant_to_observation_keys(self): + env = deepcopy(self.env) + + self.assertEqual(env.state_series().shape, (15, )) + + class TestDiscrete(Parent): env_class = DiscreteMicrogridEnv @@ -186,9 +211,22 @@ class TestNetLoadContinuousObsDuplicateKeys(ObsKeysDuplicateKeysParent): env_class = NetLoadContinuousMicrogridEnv +class TestDiscreteDuplicateModules(ObsKeysDuplicateModulesParent): + env_class = DiscreteMicrogridEnv + + +class TestContinuousDuplicateModules(ObsKeysDuplicateModulesParent): + env_class = ContinuousMicrogridEnv + + +class TestNetLoadContinuousDuplicateModules(ObsKeysDuplicateModulesParent): + env_class = NetLoadContinuousMicrogridEnv + + def flatten_nested_dict(nested_dict): def extract_list(l): - assert len(l) == 1, 'reduction only works with length 1 lists' - return l[0].tolist() + # assert len(l) == 1, 'reduction only works with length 1 lists' + # return l[0].tolist() + return sum([_l.tolist() for _l in l], []) return functools.reduce(lambda x, y: x + extract_list(y), nested_dict.values(), []) From ed5ab2055dd8ea8e36165a455dd8e59c8d2c9679 Mon Sep 17 00:00:00 2001 From: ahalev Date: Fri, 20 Dec 2024 20:12:15 -0500 Subject: [PATCH 5/5] add additional updated tests --- tests/envs/test_base.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/envs/test_base.py b/tests/envs/test_base.py index 8a801463..a3a1382a 100644 --- a/tests/envs/test_base.py +++ b/tests/envs/test_base.py @@ -152,6 +152,8 @@ def test_get_obs_correct_keys_in_modules(self): class ObsKeysDuplicateModulesParent(Parent): + + @pass_if_parent def setUp(self) -> None: second_battery = BatteryModule( min_capacity=0, @@ -174,6 +176,20 @@ def test_pre_reset_state_series_invariant_to_observation_keys(self): self.assertEqual(env.state_series().shape, (15, )) + @pass_if_parent + def test_state_series_values(self): + env = deepcopy(self.env) + + expected_state_series = np.array([10., -60., 50., 1., 1., 0., 0., 0.5, 50., 0.5, 500, 1., 1., 1., 1.]) + self.assertEqual(env.state_series(normalized=False).values, expected_state_series) + + @pass_if_parent + def test_state_series_values_normalized(self): + env = deepcopy(self.env) + + expected_state_series = np.array([1/6., 0., 1., 1., 1., 0., 0., 0.5, 0.5, 0.5, 0.5, 0., 0., 0., 0.]) + self.assertEqual(env.state_series(normalized=True).values, expected_state_series) + class TestDiscrete(Parent): env_class = DiscreteMicrogridEnv