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