ltbams 1.0.12__py3-none-any.whl → 1.0.13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. ams/_version.py +3 -3
  2. ams/core/matprocessor.py +170 -104
  3. ams/io/matpower.py +4 -0
  4. ams/io/psse.py +2 -0
  5. ams/opt/exprcalc.py +11 -0
  6. ams/routines/grbopt.py +2 -0
  7. ams/routines/pypower.py +8 -0
  8. ams/routines/routine.py +118 -1
  9. ams/shared.py +30 -2
  10. ams/system.py +10 -0
  11. docs/source/index.rst +4 -3
  12. docs/source/release-notes.rst +8 -0
  13. {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/METADATA +4 -2
  14. {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/RECORD +17 -45
  15. {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/top_level.txt +0 -1
  16. tests/__init__.py +0 -0
  17. tests/test_1st_system.py +0 -64
  18. tests/test_addressing.py +0 -40
  19. tests/test_case.py +0 -301
  20. tests/test_cli.py +0 -34
  21. tests/test_export_csv.py +0 -89
  22. tests/test_group.py +0 -83
  23. tests/test_interface.py +0 -238
  24. tests/test_io.py +0 -190
  25. tests/test_jumper.py +0 -27
  26. tests/test_known_good.py +0 -267
  27. tests/test_matp.py +0 -437
  28. tests/test_model.py +0 -54
  29. tests/test_omodel.py +0 -119
  30. tests/test_paths.py +0 -89
  31. tests/test_report.py +0 -251
  32. tests/test_repr.py +0 -21
  33. tests/test_routine.py +0 -178
  34. tests/test_rtn_acopf.py +0 -75
  35. tests/test_rtn_dcopf.py +0 -121
  36. tests/test_rtn_dcopf2.py +0 -103
  37. tests/test_rtn_ed.py +0 -279
  38. tests/test_rtn_opf.py +0 -142
  39. tests/test_rtn_pflow.py +0 -147
  40. tests/test_rtn_pypower.py +0 -315
  41. tests/test_rtn_rted.py +0 -273
  42. tests/test_rtn_uc.py +0 -248
  43. tests/test_service.py +0 -73
  44. {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/WHEEL +0 -0
  45. {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/entry_points.txt +0 -0
tests/test_routine.py DELETED
@@ -1,178 +0,0 @@
1
- import unittest
2
- import numpy as np
3
-
4
-
5
- import ams
6
- from ams.shared import pd
7
-
8
-
9
- class TestRoutineMethods(unittest.TestCase):
10
- """
11
- Test methods of `Routine`.
12
- """
13
-
14
- def setUp(self) -> None:
15
- self.ss = ams.load(ams.get_case("ieee39/ieee39_uced.xlsx"),
16
- default_config=True,
17
- no_output=True,
18
- )
19
-
20
- def test_data_check(self):
21
- """
22
- Test `Routine._data_check()` method.
23
- """
24
-
25
- self.assertTrue(self.ss.DCOPF._data_check())
26
- self.assertFalse(self.ss.RTEDES._data_check())
27
-
28
- def test_get_off_constrs(self):
29
- """
30
- Test `Routine._get_off_constrs()` method.
31
- """
32
-
33
- self.assertIsInstance(self.ss.DCOPF._get_off_constrs(), list)
34
-
35
- def test_routine_set(self):
36
- """
37
- Test `Routine.set()` method.
38
- """
39
-
40
- self.ss.DCOPF.set('c2', 'GCost_1', 'v', 10)
41
- np.testing.assert_equal(self.ss.GCost.get('c2', 'GCost_1', 'v'), 10)
42
-
43
- def test_routine_get(self):
44
- """
45
- Test `Routine.get()` method.
46
- """
47
- # --- single period routine ---
48
- # get an rparam value
49
- np.testing.assert_equal(self.ss.DCOPF.get('ug', 'PV_30'), 1)
50
-
51
- # get an unpacked var value
52
- self.ss.DCOPF.run(solver='CLARABEL')
53
- self.assertEqual(self.ss.DCOPF.exit_code, 0, "Exit code is not 0.")
54
- np.testing.assert_equal(self.ss.DCOPF.get('pg', 'PV_30', 'v'),
55
- self.ss.StaticGen.get('p', 'PV_30', 'v'))
56
-
57
- # test input type
58
- self.assertIsInstance(self.ss.DCOPF.get('pg', pd.Series(['PV_30']), 'v'), np.ndarray)
59
-
60
- # test return type
61
- self.assertIsInstance(self.ss.DCOPF.get('pg', 'PV_30', 'v'), float)
62
- self.assertIsInstance(self.ss.DCOPF.get('pg', ['PV_30'], 'v'), np.ndarray)
63
-
64
- # --- multi period routine ---
65
- self.ss.ED.run(solver='CLARABEL')
66
- self.assertEqual(self.ss.ED.exit_code, 0, "Exit code is not 0.")
67
- np.testing.assert_equal(self.ss.ED.get('pg', 'PV_30', 'v').ndim, 1)
68
- np.testing.assert_equal(self.ss.ED.get('pg', ['PV_30'], 'v').ndim, 2)
69
-
70
- def test_rouine_init(self):
71
- """
72
- Test `Routine.init()` method.
73
- """
74
-
75
- self.assertTrue(self.ss.DCOPF.init(), "DCOPF initialization failed!")
76
-
77
- def test_generate_symbols(self):
78
- """
79
- Test symbol generation.
80
- """
81
-
82
- self.ss.DCOPF.syms.generate_symbols()
83
- self.assertTrue(self.ss.DCOPF._syms, "Symbol generation failed!")
84
-
85
- def test_value_method(self):
86
- """
87
- Test Contraint and Objective values.
88
- """
89
-
90
- self.ss.DCOPF.run(solver='CLARABEL')
91
- self.assertTrue(self.ss.DCOPF.converged, "DCOPF did not converge!")
92
-
93
- # --- constraint values ---
94
- for constr in self.ss.DCOPF.constrs.values():
95
- np.testing.assert_almost_equal(constr.v, constr.e, decimal=6)
96
-
97
- # --- objective value ---
98
- self.assertAlmostEqual(self.ss.DCOPF.obj.v, self.ss.DCOPF.obj.e, places=6)
99
-
100
-
101
- class TestSetOptzValueACOPF(unittest.TestCase):
102
- """
103
- Test value settings of `OptzBase` series in `ACOPF`.
104
- """
105
-
106
- def setUp(self) -> None:
107
- self.ss = ams.load(ams.get_case("5bus/pjm5bus_demo.json"),
108
- setup=True,
109
- default_config=True,
110
- no_output=True,
111
- )
112
-
113
- def test_vset_before_init(self):
114
- """
115
- Test value setting before routine initialization.
116
- """
117
- # set values to `Var` before initialization is not doable
118
- v_ext = np.ones(self.ss.ACOPF.pg.n)
119
- self.ss.ACOPF.pg.v = v_ext
120
- self.assertIsNone(self.ss.ACOPF.pg.v)
121
- # set values to `Constraint` is not allowed
122
- self.assertRaises(AttributeError, lambda: setattr(self.ss.ACOPF.plfub, 'v', 1))
123
- # set values to `Objective` is not allowed
124
- self.assertRaises(AttributeError, lambda: setattr(self.ss.ACOPF.obj, 'v', 1))
125
-
126
- def test_vset_after_init(self):
127
- """
128
- Test value setting after routine initialization.
129
- """
130
- self.ss.ACOPF.init()
131
- # set values to `Var` after initialization is allowed
132
- v_ext = np.ones(self.ss.ACOPF.pg.n)
133
- self.ss.ACOPF.pg.v = v_ext
134
- np.testing.assert_equal(self.ss.ACOPF.pg.v, v_ext)
135
- # set values to `Constraint` is not allowed
136
- self.assertRaises(AttributeError, lambda: setattr(self.ss.ACOPF.plfub, 'v', 1))
137
- # set values to `Objective` is not allowed
138
- self.assertRaises(AttributeError, lambda: setattr(self.ss.ACOPF.obj, 'v', 1))
139
-
140
-
141
- class TestSetOptzValueDCOPF(unittest.TestCase):
142
- """
143
- Test value settings of `OptzBase` series in `DCOPF`.
144
- """
145
-
146
- def setUp(self) -> None:
147
- self.ss = ams.load(ams.get_case("5bus/pjm5bus_demo.json"),
148
- setup=True,
149
- default_config=True,
150
- no_output=True,
151
- )
152
-
153
- def test_vset_before_init(self):
154
- """
155
- Test value setting before routine initialization.
156
- """
157
- # set values to `Var` before initialization is not doable
158
- v_ext = np.ones(self.ss.DCOPF.pg.n)
159
- self.ss.DCOPF.pg.v = v_ext
160
- self.assertIsNone(self.ss.DCOPF.pg.v)
161
- # set values to `Constraint` is not allowed
162
- self.assertRaises(AttributeError, lambda: setattr(self.ss.DCOPF.plfub, 'v', 1))
163
- # set values to `Objective` is not allowed
164
- self.assertRaises(AttributeError, lambda: setattr(self.ss.DCOPF.obj, 'v', 1))
165
-
166
- def test_vset_after_init(self):
167
- """
168
- Test value setting after routine initialization.
169
- """
170
- self.ss.DCOPF.init()
171
- # set values to `Var` after initialization is allowed
172
- v_ext = np.ones(self.ss.DCOPF.pg.n)
173
- self.ss.DCOPF.pg.v = v_ext
174
- np.testing.assert_equal(self.ss.DCOPF.pg.v, v_ext)
175
- # set values to `Constraint` is not allowed
176
- self.assertRaises(AttributeError, lambda: setattr(self.ss.DCOPF.plfub, 'v', 1))
177
- # set values to `Objective` is not allowed
178
- self.assertRaises(AttributeError, lambda: setattr(self.ss.DCOPF.obj, 'v', 1))
tests/test_rtn_acopf.py DELETED
@@ -1,75 +0,0 @@
1
- import unittest
2
-
3
- import ams
4
-
5
-
6
- class TestACOPF(unittest.TestCase):
7
- """
8
- Test routine `ACOPF`.
9
- """
10
-
11
- def setUp(self) -> None:
12
- self.ss = ams.load(ams.get_case('matpower/case14.m'),
13
- setup=True, no_output=True, default_config=True)
14
-
15
- def test_init(self):
16
- """
17
- Test initialization.
18
- """
19
- self.ss.ACOPF.init()
20
- self.assertTrue(self.ss.ACOPF.initialized, "ACOPF initialization failed!")
21
-
22
- def test_trip_gen(self):
23
- """
24
- Test generator tripping.
25
- """
26
- stg = 2
27
- self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=0)
28
-
29
- self.ss.ACOPF.update()
30
- self.ss.ACOPF.run()
31
- self.assertTrue(self.ss.ACOPF.converged, "ACOPF did not converge under generator trip!")
32
- self.assertAlmostEqual(self.ss.ACOPF.get(src='pg', attr='v', idx=stg),
33
- 0, places=6,
34
- msg="Generator trip does not take effect!")
35
-
36
- self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=1)
37
-
38
- def test_trip_line(self):
39
- """
40
- Test line tripping.
41
- """
42
- self.ss.Line.set(src='u', attr='v', idx='Line_3', value=0)
43
-
44
- self.ss.ACOPF.update()
45
- self.ss.ACOPF.run()
46
- self.assertTrue(self.ss.ACOPF.converged, "ACOPF did not converge under line trip!")
47
- self.assertAlmostEqual(self.ss.ACOPF.get(src='plf', attr='v', idx='Line_3'),
48
- 0, places=6,
49
- msg="Line trip does not take effect!")
50
-
51
- self.ss.Line.alter(src='u', idx='Line_3', value=1)
52
-
53
- def test_set_load(self):
54
- """
55
- Test setting and tripping load.
56
- """
57
- # --- run ACOPF ---
58
- self.ss.ACOPF.run()
59
- pgs = self.ss.ACOPF.pg.v.sum()
60
-
61
- # --- set load ---
62
- self.ss.PQ.set(src='p0', attr='v', idx='PQ_1', value=0.1)
63
- self.ss.ACOPF.update()
64
-
65
- self.ss.ACOPF.run()
66
- pgs_pqt = self.ss.ACOPF.pg.v.sum()
67
- self.assertLess(pgs_pqt, pgs, "Load set does not take effect!")
68
-
69
- # --- trip load ---
70
- self.ss.PQ.set(src='p0', attr='v', idx='PQ_1', value=0)
71
- self.ss.ACOPF.update()
72
-
73
- self.ss.ACOPF.run()
74
- pgs_pqt2 = self.ss.ACOPF.pg.v.sum()
75
- self.assertLess(pgs_pqt2, pgs_pqt, "Load trip does not take effect!")
tests/test_rtn_dcopf.py DELETED
@@ -1,121 +0,0 @@
1
- import os
2
-
3
- import unittest
4
- import numpy as np
5
-
6
- import ams
7
-
8
-
9
- class TestDCOPF(unittest.TestCase):
10
- """
11
- Test routine `DCOPF`.
12
- """
13
-
14
- def setUp(self) -> None:
15
- self.ss = ams.load(ams.get_case("5bus/pjm5bus_demo.json"),
16
- setup=True, default_config=True, no_output=True)
17
- # decrease load first
18
- self.ss.PQ.set(src='p0', attr='v', idx=['PQ_1', 'PQ_2'], value=[0.3, 0.3])
19
-
20
- def test_init(self):
21
- """
22
- Test initialization.
23
- """
24
- self.ss.DCOPF.init()
25
- self.assertTrue(self.ss.DCOPF.initialized, "DCOPF initialization failed!")
26
-
27
- def test_trip_gen(self):
28
- """
29
- Test generator tripping.
30
- """
31
- stg = 'PV_1'
32
- self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=0)
33
-
34
- self.ss.DCOPF.update()
35
- self.ss.DCOPF.run(solver='CLARABEL')
36
- self.assertTrue(self.ss.DCOPF.converged, "DCOPF did not converge under generator trip!")
37
- self.assertAlmostEqual(self.ss.DCOPF.get(src='pg', attr='v', idx=stg),
38
- 0, places=6,
39
- msg="Generator trip does not take effect!")
40
-
41
- self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=1) # reset
42
-
43
- def test_trip_line(self):
44
- """
45
- Test line tripping.
46
- """
47
- self.ss.Line.set(src='u', attr='v', idx='Line_3', value=0)
48
-
49
- self.ss.DCOPF.update()
50
- self.ss.DCOPF.run(solver='CLARABEL')
51
- self.assertTrue(self.ss.DCOPF.converged, "DCOPF did not converge under line trip!")
52
- self.assertAlmostEqual(self.ss.DCOPF.get(src='plf', attr='v', idx='Line_3'),
53
- 0, places=6,
54
- msg="Line trip does not take effect!")
55
-
56
- self.ss.Line.alter(src='u', idx='Line_3', value=1) # reset
57
-
58
- def test_set_load(self):
59
- """
60
- Test setting and tripping load.
61
- """
62
- # --- run DCOPF ---
63
- self.ss.DCOPF.run(solver='CLARABEL')
64
- pgs = self.ss.DCOPF.pg.v.sum()
65
-
66
- # --- set load ---
67
- self.ss.PQ.set(src='p0', attr='v', idx='PQ_1', value=0.1)
68
- self.ss.DCOPF.update()
69
-
70
- self.ss.DCOPF.run(solver='CLARABEL')
71
- pgs_pqt = self.ss.DCOPF.pg.v.sum()
72
- self.assertLess(pgs_pqt, pgs, "Load set does not take effect!")
73
-
74
- # --- trip load ---
75
- self.ss.PQ.set(src='u', attr='v', idx='PQ_2', value=0)
76
- self.ss.DCOPF.update()
77
-
78
- self.ss.DCOPF.run(solver='CLARABEL')
79
- pgs_pqt2 = self.ss.DCOPF.pg.v.sum()
80
- self.assertLess(pgs_pqt2, pgs_pqt, "Load trip does not take effect!")
81
-
82
- def test_dc2ac(self):
83
- """
84
- Test `DCOPF.dc2ac()` method.
85
- """
86
- self.ss.DCOPF.run(solver='CLARABEL')
87
- self.ss.DCOPF.dc2ac()
88
- self.assertTrue(self.ss.DCOPF.converted, "AC conversion failed!")
89
- self.assertTrue(self.ss.DCOPF.exec_time > 0, "Execution time is not greater than 0.")
90
-
91
- stg_idx = self.ss.StaticGen.get_all_idxes()
92
- pg_dcopf = self.ss.DCOPF.get(src='pg', attr='v', idx=stg_idx)
93
- pg_acopf = self.ss.ACOPF.get(src='pg', attr='v', idx=stg_idx)
94
- np.testing.assert_almost_equal(pg_dcopf, pg_acopf, decimal=3)
95
-
96
- bus_idx = self.ss.Bus.get_all_idxes()
97
- v_dcopf = self.ss.DCOPF.get(src='vBus', attr='v', idx=bus_idx)
98
- v_acopf = self.ss.ACOPF.get(src='vBus', attr='v', idx=bus_idx)
99
- np.testing.assert_almost_equal(v_dcopf, v_acopf, decimal=3)
100
-
101
- a_dcopf = self.ss.DCOPF.get(src='aBus', attr='v', idx=bus_idx)
102
- a_acopf = self.ss.ACOPF.get(src='aBus', attr='v', idx=bus_idx)
103
- np.testing.assert_almost_equal(a_dcopf, a_acopf, decimal=3)
104
-
105
- def test_export_csv(self):
106
- """
107
- Test `Routine.export_csv()` method.
108
- """
109
- self.ss.DCOPF.run(solver='CLARABEL')
110
-
111
- # test when path is none
112
- out = self.ss.DCOPF.export_csv()
113
- self.assertTrue(os.path.exists(out), "CSV export failed!")
114
-
115
- # test when path is not none
116
- out2 = self.ss.DCOPF.export_csv(path='test_dcopf.csv')
117
- self.assertTrue(os.path.exists(out2), "CSV export with path failed!")
118
-
119
- # Clean up
120
- os.remove(out)
121
- os.remove(out2)
tests/test_rtn_dcopf2.py DELETED
@@ -1,103 +0,0 @@
1
- import unittest
2
- import numpy as np
3
-
4
- import ams
5
-
6
-
7
- class TestDCOPF2(unittest.TestCase):
8
- """
9
- Test routine `DCOPF2`.
10
- """
11
-
12
- def setUp(self) -> None:
13
- self.ss = ams.load(ams.get_case("5bus/pjm5bus_demo.json"),
14
- setup=True, default_config=True, no_output=True)
15
- # decrease load first
16
- self.ss.PQ.set(src='p0', attr='v', idx=['PQ_1', 'PQ_2'], value=[0.3, 0.3])
17
- # build PTDF
18
- self.ss.mats.build_ptdf()
19
-
20
- def test_init(self):
21
- """
22
- Test initialization.
23
- """
24
- self.ss.DCOPF2.init()
25
- self.assertTrue(self.ss.DCOPF2.initialized, "DCOPF2 initialization failed!")
26
-
27
- def test_trip_gen(self):
28
- """
29
- Test generator tripping.
30
- """
31
- stg = 'PV_1'
32
- self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=0)
33
-
34
- self.ss.DCOPF2.update()
35
- self.ss.DCOPF2.run(solver='CLARABEL')
36
- self.assertTrue(self.ss.DCOPF2.converged, "DCOPF2 did not converge under generator trip!")
37
- self.assertAlmostEqual(self.ss.DCOPF2.get(src='pg', attr='v', idx=stg),
38
- 0, places=6,
39
- msg="Generator trip does not take effect!")
40
-
41
- self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=1) # reset
42
-
43
- def test_trip_line(self):
44
- """
45
- Test line tripping.
46
- """
47
- self.ss.Line.set(src='u', attr='v', idx='Line_3', value=0)
48
-
49
- self.ss.DCOPF2.update()
50
- self.ss.DCOPF2.run(solver='CLARABEL')
51
- self.assertTrue(self.ss.DCOPF2.converged, "DCOPF2 did not converge under line trip!")
52
- self.assertAlmostEqual(self.ss.DCOPF2.get(src='plf', attr='v', idx='Line_3'),
53
- 0, places=6,
54
- msg="Line trip does not take effect!")
55
-
56
- self.ss.Line.alter(src='u', idx='Line_3', value=1) # reset
57
-
58
- def test_set_load(self):
59
- """
60
- Test setting and tripping load.
61
- """
62
- # --- run DCOPF2 ---
63
- self.ss.DCOPF2.run(solver='CLARABEL')
64
- pgs = self.ss.DCOPF2.pg.v.sum()
65
-
66
- # --- set load ---
67
- self.ss.PQ.set(src='p0', attr='v', idx='PQ_1', value=0.1)
68
- self.ss.DCOPF2.update()
69
-
70
- self.ss.DCOPF2.run(solver='CLARABEL')
71
- pgs_pqt = self.ss.DCOPF2.pg.v.sum()
72
- self.assertLess(pgs_pqt, pgs, "Load set does not take effect!")
73
-
74
- # --- trip load ---
75
- self.ss.PQ.set(src='u', attr='v', idx='PQ_2', value=0)
76
- self.ss.DCOPF2.update()
77
-
78
- self.ss.DCOPF2.run(solver='CLARABEL')
79
- pgs_pqt2 = self.ss.DCOPF2.pg.v.sum()
80
- self.assertLess(pgs_pqt2, pgs_pqt, "Load trip does not take effect!")
81
-
82
- def test_dc2ac(self):
83
- """
84
- Test `DCOPF2.dc2ac()` method.
85
- """
86
- self.ss.DCOPF2.run(solver='CLARABEL')
87
- self.ss.DCOPF2.dc2ac()
88
- self.assertTrue(self.ss.DCOPF2.converted, "AC conversion failed!")
89
- self.assertTrue(self.ss.DCOPF2.exec_time > 0, "Execution time is not greater than 0.")
90
-
91
- stg_idx = self.ss.StaticGen.get_all_idxes()
92
- pg_dcopf = self.ss.DCOPF2.get(src='pg', attr='v', idx=stg_idx)
93
- pg_acopf = self.ss.ACOPF.get(src='pg', attr='v', idx=stg_idx)
94
- np.testing.assert_almost_equal(pg_dcopf, pg_acopf, decimal=3)
95
-
96
- bus_idx = self.ss.Bus.get_all_idxes()
97
- v_dcopf = self.ss.DCOPF2.get(src='vBus', attr='v', idx=bus_idx)
98
- v_acopf = self.ss.ACOPF.get(src='vBus', attr='v', idx=bus_idx)
99
- np.testing.assert_almost_equal(v_dcopf, v_acopf, decimal=3)
100
-
101
- a_dcopf = self.ss.DCOPF2.get(src='aBus', attr='v', idx=bus_idx)
102
- a_acopf = self.ss.ACOPF.get(src='aBus', attr='v', idx=bus_idx)
103
- np.testing.assert_almost_equal(a_dcopf, a_acopf, decimal=3)