Skip to content

Commit 066f782

Browse files
authored
Merge pull request #691 from BDonnot/bd_dev
Bd dev
2 parents c167806 + b8cc0b3 commit 066f782

File tree

4 files changed

+138
-3
lines changed

4 files changed

+138
-3
lines changed

CHANGELOG.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,11 @@ Native multi agents support:
188188
it... unless you know what you are doing)
189189
- [IMPROVED] `ForecastEnv` is now part of the public API.
190190

191+
[1.10.5] - 2025-03-07
192+
------------------------
193+
- [FIXED] force pandapower < 3 otherwise pandapower backend does not work and
194+
lots of tests are failing.
195+
191196
[1.10.5] - 2025-03-07
192197
------------------------
193198
- [FIXED] force pandapower < 3 otherwise pandapower backend does not work and

grid2op/Backend/pandaPowerBackend.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,6 +1495,9 @@ def _loads_info(self):
14951495
load_theta = self._grid.res_bus.loc[self._grid.load["bus"].values][
14961496
"va_degree"
14971497
].values.astype(dt_float)
1498+
load_disco = ~self._grid.load["in_service"]
1499+
load_v[load_disco] = 0.
1500+
load_theta[load_disco] = 0.
14981501
return load_p, load_q, load_v, load_theta
14991502

15001503
def generators_info(self) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:

grid2op/Environment/baseEnv.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3355,10 +3355,9 @@ def _aux_update_detachment_info(self):
33553355
self._gen_p_detached[:] = self._prev_gen_p
33563356
self._gen_p_detached[~self._gens_detached] = 0.
33573357

3358-
self._storage_p_detached[:] = 0.
3359-
mask_chgt = self._backend_action.storage_power.changed
3360-
self._storage_p_detached[mask_chgt] = self._backend_action.storage_power.values[mask_chgt]
3358+
self._storage_p_detached[:] = self._storage_power
33613359
self._storage_p_detached[~self._storages_detached] = 0.
3360+
self._storage_power[self._storages_detached] = 0.
33623361

33633362
def _aux_run_pf_after_state_properly_set(
33643363
self, action, init_line_status, new_p, except_
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Copyright (c) 2023, RTE (https://www.rte-france.com)
2+
# See AUTHORS.txt
3+
# This Source Code Form is subject to the terms of the Mozilla Public License, version 2.0.
4+
# If a copy of the Mozilla Public License, version 2.0 was not distributed with this file,
5+
# you can obtain one at http://mozilla.org/MPL/2.0/.
6+
# SPDX-License-Identifier: MPL-2.0
7+
# This file is part of LightSim2grid, LightSim2grid implements a c++ backend targeting the Grid2Op platform.
8+
9+
import unittest
10+
import warnings
11+
12+
import grid2op
13+
from grid2op.Action import CompleteAction
14+
15+
16+
class DetachmentBackendOutputTester(unittest.TestCase):
17+
"""issue is still not replicated and these tests pass"""
18+
def setUp(self) -> None:
19+
with warnings.catch_warnings():
20+
warnings.filterwarnings("ignore")
21+
self.env = grid2op.make("educ_case14_storage",
22+
test=True,
23+
allow_detachment=True,
24+
action_class=CompleteAction)
25+
self.env.reset(seed=0, options={"time serie id": 0})
26+
obs = self.env.reset()
27+
return super().setUp()
28+
29+
def tearDown(self) -> None:
30+
self.env.close()
31+
return super().tearDown()
32+
33+
def test_disco_gen(self):
34+
"""test i can disconnect a gen"""
35+
gen_id = 0
36+
obs, reward, done, info = self.env.step(self.env.action_space(
37+
{
38+
"set_bus": {"generators_id": [(gen_id, -1)]}
39+
}
40+
))
41+
assert not done
42+
assert obs.gen_detached[gen_id]
43+
assert obs.gen_p[gen_id] == 0.
44+
assert obs.gen_v[gen_id] == 0.
45+
assert obs.gen_q[gen_id] == 0.
46+
assert obs.gen_theta[gen_id] == 0., f"{obs.gen_theta[gen_id]} vs 0."
47+
assert abs(obs.gen_p_detached[gen_id] - 79.8) <= 1e-5
48+
49+
obs1, _, done, info = self.env.step(self.env.action_space({}))
50+
assert not done
51+
assert obs.gen_detached[gen_id]
52+
assert obs1.gen_p[gen_id] == 0.
53+
assert obs1.gen_v[gen_id] == 0.
54+
assert obs1.gen_q[gen_id] == 0.
55+
assert obs1.gen_theta[gen_id] == 0., f"{obs1.gen_theta[gen_id]} vs 0."
56+
assert abs(obs1.gen_p_detached[gen_id] - 80.5) <= 1e-5
57+
58+
obs2, _, done, info = self.env.step(self.env.action_space({}))
59+
assert not done
60+
assert obs.gen_detached[gen_id]
61+
assert obs2.gen_p[gen_id] == 0.
62+
assert obs2.gen_v[gen_id] == 0.
63+
assert obs2.gen_q[gen_id] == 0.
64+
assert obs2.gen_theta[gen_id] == 0., f"{obs2.gen_theta[gen_id]} vs 0."
65+
assert abs(obs2.gen_p_detached[gen_id] - 80.5) <= 1e-5
66+
67+
def test_disco_load(self):
68+
"""test i can disconnect a load"""
69+
load_id = 0
70+
obs, reward, done, info = self.env.step(self.env.action_space(
71+
{
72+
"set_bus": {"loads_id": [(load_id, -1)]}
73+
}
74+
))
75+
assert not done
76+
assert obs.load_detached[load_id]
77+
assert obs.load_p[load_id] == 0., f"{obs.load_p[load_id]} vs 0."
78+
assert obs.load_q[load_id] == 0., f"{obs.load_q[load_id]} vs 0."
79+
assert obs.load_v[load_id] == 0., f"{obs.load_v[load_id]} vs 0."
80+
assert obs.load_theta[load_id] == 0., f"{obs.load_theta[load_id]} vs 0."
81+
assert abs(obs.load_p_detached[load_id] - 21.9) <= 1e-5
82+
83+
obs1, _, done, info = self.env.step(self.env.action_space({}))
84+
assert not done
85+
assert obs1.load_detached[load_id]
86+
assert obs1.load_p[load_id] == 0., f"{obs1.load_p[load_id]} vs 0."
87+
assert obs1.load_q[load_id] == 0., f"{obs1.load_q[load_id]} vs 0."
88+
assert obs1.load_v[load_id] == 0., f"{obs1.load_v[load_id]} vs 0."
89+
assert obs1.load_theta[load_id] == 0., f"{obs1.load_theta[load_id]} vs 0."
90+
assert abs(obs1.load_p_detached[load_id] - 21.7) <= 1e-5
91+
92+
obs2, _, done, info = self.env.step(self.env.action_space({}))
93+
assert not done
94+
assert obs2.load_detached[load_id]
95+
assert obs2.load_p[load_id] == 0., f"{obs2.load_p[load_id]} vs 0."
96+
assert obs2.load_q[load_id] == 0., f"{obs2.load_q[load_id]} vs 0."
97+
assert obs2.load_v[load_id] == 0., f"{obs2.load_v[load_id]} vs 0."
98+
assert obs2.load_theta[load_id] == 0., f"{obs2.load_theta[load_id]} vs 0."
99+
assert abs(obs2.load_p_detached[load_id] - 21.6) <= 1e-5
100+
101+
def test_disco_storage(self):
102+
"""test i can disconnect a storage unit"""
103+
sto_id = 0
104+
obs, reward, done, info = self.env.step(self.env.action_space(
105+
{
106+
"set_bus": {"storages_id": [(sto_id, -1)]},
107+
"set_storage": [(0, 1.)]
108+
}
109+
))
110+
assert not done
111+
assert obs.storage_detached[sto_id]
112+
assert obs.storage_power[sto_id] == 0., f"{obs.storage_power[sto_id]} vs 0."
113+
assert abs(obs.storage_p_detached[sto_id] - 1.) <= 1e-5, f"{obs.storage_p_detached[sto_id]} vs 1."
114+
115+
obs1, _, done, info = self.env.step(self.env.action_space({}))
116+
assert not done
117+
assert obs1.storage_detached[sto_id]
118+
assert obs1.storage_power[sto_id] == 0., f"{obs1.storage_power[sto_id]} vs 0."
119+
120+
obs2, _, done, info = self.env.step(self.env.action_space({}))
121+
assert not done
122+
assert obs2.storage_detached[sto_id]
123+
assert obs2.storage_power[sto_id] == 0., f"{obs2.storage_power[sto_id]} vs 0."
124+
125+
126+
if __name__ == "__main__":
127+
unittest.main()
128+

0 commit comments

Comments
 (0)