Skip to content

Commit f650455

Browse files
committed
fix some issue with pandapower when loads / gens / storages were disconnected
Signed-off-by: DONNOT Benjamin <[email protected]>
2 parents ce15325 + 9c7ccc5 commit f650455

File tree

6 files changed

+143
-4
lines changed

6 files changed

+143
-4
lines changed

.github/workflows/main.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ jobs:
5252
steps:
5353

5454
- name: Checkout sources
55-
uses: actions/checkout@v3
55+
uses: actions/checkout@v4
5656
with:
5757
submodules: true
5858

@@ -134,7 +134,7 @@ jobs:
134134
steps:
135135

136136
- name: Checkout sources
137-
uses: actions/checkout@v3
137+
uses: actions/checkout@v4
138138
with:
139139
submodules: true
140140

@@ -212,7 +212,7 @@ jobs:
212212
steps:
213213

214214
- name: Checkout sources
215-
uses: actions/checkout@v3
215+
uses: actions/checkout@v4
216216
with:
217217
submodules: true
218218

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.4] - 2024-10-15
192197
-------------------------
193198
- [FIXED] new pypi link (no change in code)

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
# -- Project information -----------------------------------------------------
1919

2020
project = 'Grid2Op'
21-
copyright = '2019, RTE France'
21+
copyright = 'Grid2Op a Series of LF Projects, LLC,\nFor website terms of use, trademark policy and other project policies please see https://lfprojects.org.'
2222
author = 'Benjamin Donnot'
2323

2424
# The full version, including alpha/beta/rc tags

docs/final.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@ If you still can't find what you're looking for, try in one of the following pag
66

77
Still trouble finding the information ? Do not hesitate to send a github issue about the documentation at this
88
link: `Documentation issue template <https://github.com/Grid2Op/grid2op/issues/new?assignees=&labels=documentation&template=documentation.md&title=>`_
9+
10+
Copyright © Grid2Op a Series of LF Projects, LLC
11+
For website terms of use, trademark policy and other project policies please see https://lfprojects.org.

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]:
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)