ltbams 1.0.13__py3-none-any.whl → 1.0.15__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.
- ams/_version.py +3 -3
- ams/cli.py +2 -7
- ams/core/common.py +7 -3
- ams/core/documenter.py +2 -1
- ams/core/matprocessor.py +4 -4
- ams/core/model.py +14 -6
- ams/core/param.py +5 -3
- ams/core/symprocessor.py +8 -2
- ams/core/var.py +1 -1
- ams/extension/eva.py +11 -7
- ams/interface.py +7 -7
- ams/io/json.py +20 -16
- ams/io/matpower.py +6 -6
- ams/io/psse.py +2 -1
- ams/io/xlsx.py +21 -16
- ams/main.py +53 -45
- ams/models/distributed/esd1.py +4 -7
- ams/models/distributed/ev.py +10 -6
- ams/models/distributed/pvd1.py +4 -7
- ams/models/group.py +17 -18
- ams/models/renewable/regc.py +14 -22
- ams/models/timeslot.py +46 -1
- ams/models/zone.py +2 -4
- ams/opt/exprcalc.py +5 -3
- ams/opt/optzbase.py +4 -3
- ams/report.py +2 -7
- ams/routines/dcopf.py +7 -4
- ams/routines/dcopf2.py +46 -21
- ams/routines/dcpf.py +5 -0
- ams/routines/dopf.py +2 -2
- ams/routines/ed.py +5 -5
- ams/routines/pflow.py +1 -1
- ams/routines/routine.py +20 -4
- ams/routines/rted.py +5 -5
- ams/routines/uc.py +2 -2
- ams/shared.py +69 -0
- ams/system.py +93 -18
- ams/utils/paths.py +6 -10
- docs/source/examples/index.rst +1 -0
- docs/source/genroutineref.py +24 -0
- docs/source/release-notes.rst +15 -0
- {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/METADATA +19 -22
- {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/RECORD +46 -46
- {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/WHEEL +0 -0
- {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/entry_points.txt +0 -0
- {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/top_level.txt +0 -0
ams/shared.py
CHANGED
@@ -15,6 +15,7 @@ from andes.utils.lazyimport import LazyImport
|
|
15
15
|
|
16
16
|
from andes.system import System as adSystem
|
17
17
|
|
18
|
+
from ._version import get_versions
|
18
19
|
|
19
20
|
logger = logging.getLogger(__name__)
|
20
21
|
|
@@ -46,6 +47,15 @@ _max_length = 80 # NOQA
|
|
46
47
|
copyright_msg = "Copyright (C) 2023-2025 Jinning Wang"
|
47
48
|
nowarranty_msg = "AMS comes with ABSOLUTELY NO WARRANTY"
|
48
49
|
report_time = strftime("%m/%d/%Y %I:%M:%S %p")
|
50
|
+
version_msg = f"AMS {get_versions()['version']}"
|
51
|
+
|
52
|
+
summary_row = {'field': 'Info',
|
53
|
+
'comment': version_msg,
|
54
|
+
'comment2': report_time,
|
55
|
+
'comment3': nowarranty_msg,
|
56
|
+
'comment4': copyright_msg}
|
57
|
+
|
58
|
+
summary_name = "Summary" # ensure model Summary's name is consistent
|
49
59
|
|
50
60
|
# NOTE: copied from CVXPY documentation, last checked on 2024/10/30, v1.5
|
51
61
|
mip_solvers = ['CBC', 'COPT', 'GLPK_MI', 'CPLEX', 'GUROBI',
|
@@ -162,3 +172,62 @@ def _update_pbar(pbar, current, total):
|
|
162
172
|
if pbar.n < pbar.total: # Check if it's not already at total
|
163
173
|
pbar.update(pbar.total - pbar.n) # Update remaining
|
164
174
|
pbar.close()
|
175
|
+
|
176
|
+
|
177
|
+
def ams_params_not_in_andes(mdl_name, am_params):
|
178
|
+
"""
|
179
|
+
Helper function to return parameters not in the ANDES model.
|
180
|
+
If the model is not in the ANDES system, it returns an empty list.
|
181
|
+
|
182
|
+
Parameters
|
183
|
+
----------
|
184
|
+
mdl_name : str
|
185
|
+
The name of the model.
|
186
|
+
am_params : list
|
187
|
+
A list of parameters from the AMS model.
|
188
|
+
|
189
|
+
Returns
|
190
|
+
-------
|
191
|
+
list
|
192
|
+
A list of parameters that are not in the ANDES model.
|
193
|
+
"""
|
194
|
+
if mdl_name not in ad_models:
|
195
|
+
return []
|
196
|
+
ad_params = list(empty_adsys.models[mdl_name].params.keys())
|
197
|
+
return list(set(am_params) - set(ad_params))
|
198
|
+
|
199
|
+
|
200
|
+
def model2df(instance, skip_empty, to_andes):
|
201
|
+
"""
|
202
|
+
Prepare a DataFrame from the model instance for output.
|
203
|
+
|
204
|
+
Parameters
|
205
|
+
----------
|
206
|
+
instance : ams.model.Model
|
207
|
+
The model instance to prepare.
|
208
|
+
skip_empty : bool
|
209
|
+
Whether to skip empty models.
|
210
|
+
to_andes : bool
|
211
|
+
Whether to prepare the DataFrame for ANDES.
|
212
|
+
|
213
|
+
Returns
|
214
|
+
-------
|
215
|
+
pd.DataFrame
|
216
|
+
The prepared DataFrame.
|
217
|
+
"""
|
218
|
+
name = instance.class_name
|
219
|
+
|
220
|
+
if skip_empty and instance.n == 0:
|
221
|
+
return None
|
222
|
+
|
223
|
+
if name not in ad_models and to_andes:
|
224
|
+
return None
|
225
|
+
|
226
|
+
instance.cache.refresh("df_in")
|
227
|
+
df = instance.cache.df_in
|
228
|
+
|
229
|
+
if to_andes:
|
230
|
+
skipped_params = ams_params_not_in_andes(name, df.columns.tolist())
|
231
|
+
df = df.drop(skipped_params, axis=1, errors='ignore')
|
232
|
+
|
233
|
+
return df
|
ams/system.py
CHANGED
@@ -51,9 +51,9 @@ def disable_methods(methods):
|
|
51
51
|
|
52
52
|
class System(adSystem):
|
53
53
|
"""
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
Base system class, revised from `andes.system.System`.
|
55
|
+
This class encapsulates data, models, and routines for scheduling
|
56
|
+
modeling and analysis in power systems.
|
57
57
|
|
58
58
|
Parameters
|
59
59
|
----------
|
@@ -400,7 +400,7 @@ class System(adSystem):
|
|
400
400
|
"""
|
401
401
|
Add a device instance for an existing model.
|
402
402
|
|
403
|
-
Revised from ``andes.system.System.add
|
403
|
+
Revised from ``andes.system.System.add``.
|
404
404
|
"""
|
405
405
|
if model not in self.models and (model not in self.model_aliases):
|
406
406
|
if model in ad_dyn_models:
|
@@ -652,9 +652,10 @@ class System(adSystem):
|
|
652
652
|
|
653
653
|
Notes
|
654
654
|
-----
|
655
|
-
|
656
|
-
|
657
|
-
|
655
|
+
- Power flow models in the addfile will be skipped and only dynamic models
|
656
|
+
will be used.
|
657
|
+
- The addfile format is guessed based on the file extension.
|
658
|
+
- Index in the addfile is automatically adjusted when necessary.
|
658
659
|
"""
|
659
660
|
return to_andes(system=self, addfile=addfile,
|
660
661
|
setup=setup, no_output=no_output,
|
@@ -745,7 +746,13 @@ class System(adSystem):
|
|
745
746
|
"""
|
746
747
|
return system2mpc(self)
|
747
748
|
|
748
|
-
def to_m(
|
749
|
+
def to_m(
|
750
|
+
self,
|
751
|
+
outfile: str,
|
752
|
+
overwrite: Optional[bool] = None,
|
753
|
+
skip_empty: bool = True,
|
754
|
+
to_andes: bool = False
|
755
|
+
) -> bool:
|
749
756
|
"""
|
750
757
|
Export an AMS system to a MATPOWER M-file.
|
751
758
|
Wrapper method for `ams.io.matpower.write`.
|
@@ -776,9 +783,16 @@ class System(adSystem):
|
|
776
783
|
"""
|
777
784
|
return write_m(self, outfile=outfile, overwrite=overwrite)
|
778
785
|
|
779
|
-
def to_xlsx(
|
786
|
+
def to_xlsx(
|
787
|
+
self,
|
788
|
+
outfile: str,
|
789
|
+
overwrite: Optional[bool] = None,
|
790
|
+
skip_empty: bool = True,
|
791
|
+
add_book: Optional[str] = None,
|
792
|
+
to_andes: bool = False
|
793
|
+
) -> bool:
|
780
794
|
"""
|
781
|
-
Export
|
795
|
+
Export the AMS system to an Excel (XLSX) file.
|
782
796
|
Wrapper method for `ams.io.xlsx.write`.
|
783
797
|
|
784
798
|
Parameters
|
@@ -787,14 +801,40 @@ class System(adSystem):
|
|
787
801
|
The output file name.
|
788
802
|
overwrite : bool, optional
|
789
803
|
If True, overwrite the existing file. Default is None.
|
804
|
+
skip_empty : bool, optional
|
805
|
+
If True, skip output of empty models (n = 0). Default is True.
|
806
|
+
add_book : str, optional
|
807
|
+
An optional workbook to be added to the output spreadsheet.
|
808
|
+
If None, no additional workbook is added. Default is None.
|
809
|
+
to_andes : bool, optional
|
810
|
+
If True, write to an ANDES system, where non-ANDES models are skipped.
|
811
|
+
|
812
|
+
Returns
|
813
|
+
-------
|
814
|
+
bool
|
815
|
+
True if the file is written successfully, False otherwise.
|
816
|
+
|
817
|
+
Notes
|
818
|
+
-----
|
819
|
+
- Only models with n > 0 are exported if `skip_empty` is True.
|
820
|
+
- If `to_andes` is True, only ANDES-compatible models are exported.
|
821
|
+
- The `add_book` parameter allows merging another workbook into the output.
|
790
822
|
|
791
823
|
.. versionadded:: 1.0.10
|
792
824
|
"""
|
793
|
-
return write_xlsx(self, outfile=outfile,
|
825
|
+
return write_xlsx(self, outfile=outfile,
|
826
|
+
skip_empty=skip_empty, overwrite=overwrite,
|
827
|
+
add_book=add_book, to_andes=to_andes)
|
794
828
|
|
795
|
-
def to_json(
|
829
|
+
def to_json(
|
830
|
+
self,
|
831
|
+
outfile: str,
|
832
|
+
overwrite: Optional[bool] = None,
|
833
|
+
skip_empty: bool = True,
|
834
|
+
to_andes: bool = False
|
835
|
+
) -> bool:
|
796
836
|
"""
|
797
|
-
Export
|
837
|
+
Export the AMS system to a JSON file.
|
798
838
|
Wrapper method for `ams.io.json.write`.
|
799
839
|
|
800
840
|
Parameters
|
@@ -803,24 +843,59 @@ class System(adSystem):
|
|
803
843
|
The output file name.
|
804
844
|
overwrite : bool, optional
|
805
845
|
If True, overwrite the existing file. Default is None.
|
846
|
+
skip_empty : bool, optional
|
847
|
+
If True, skip output of empty models (n = 0). Default is True.
|
848
|
+
to_andes : bool, optional
|
849
|
+
If True, write to an ANDES system, where non-ANDES models are skipped.
|
850
|
+
|
851
|
+
Returns
|
852
|
+
-------
|
853
|
+
bool
|
854
|
+
True if the file is written successfully, False otherwise.
|
855
|
+
|
856
|
+
Notes
|
857
|
+
-----
|
858
|
+
- Only models with n > 0 are exported if `skip_empty` is True.
|
859
|
+
- If `to_andes` is True, only ANDES-compatible models are exported.
|
806
860
|
|
807
861
|
.. versionadded:: 1.0.10
|
808
862
|
"""
|
809
|
-
return write_json(self, outfile=outfile,
|
863
|
+
return write_json(self, outfile=outfile,
|
864
|
+
skip_empty=skip_empty, overwrite=overwrite,
|
865
|
+
to_andes=to_andes)
|
810
866
|
|
811
|
-
def to_raw(
|
867
|
+
def to_raw(
|
868
|
+
self,
|
869
|
+
outfile: str,
|
870
|
+
overwrite: Optional[bool] = None,
|
871
|
+
skip_empty: bool = True,
|
872
|
+
to_andes: bool = False
|
873
|
+
) -> bool:
|
812
874
|
"""
|
813
|
-
Export
|
875
|
+
Export the AMS system to a PSS/E RAW v33 file.
|
814
876
|
Wrapper method for `ams.io.psse.write_raw`.
|
815
877
|
|
816
|
-
This method has not been fully benchmarked yet!
|
817
|
-
|
818
878
|
Parameters
|
819
879
|
----------
|
820
880
|
outfile : str
|
821
881
|
The output file name.
|
822
882
|
overwrite : bool, optional
|
823
883
|
If True, overwrite the existing file. Default is None.
|
884
|
+
skip_empty : bool, optional
|
885
|
+
If True, skip output of empty models (n = 0). Default is True.
|
886
|
+
to_andes : bool, optional
|
887
|
+
If True, write only ANDES-compatible models.
|
888
|
+
|
889
|
+
Returns
|
890
|
+
-------
|
891
|
+
bool
|
892
|
+
True if the file is written successfully, False otherwise.
|
893
|
+
|
894
|
+
Notes
|
895
|
+
-----
|
896
|
+
- Only models with n > 0 are exported if `skip_empty` is True.
|
897
|
+
- If `to_andes` is True, only ANDES-compatible models are exported.
|
898
|
+
- This method has not been fully benchmarked yet.
|
824
899
|
|
825
900
|
.. versionadded:: 1.0.10
|
826
901
|
"""
|
ams/utils/paths.py
CHANGED
@@ -271,21 +271,17 @@ def get_export_path(system, fname, path=None, fmt='csv'):
|
|
271
271
|
fname : str
|
272
272
|
The descriptive file name, e.g., 'PTDF', or 'DCOPF'.
|
273
273
|
path : str, optional
|
274
|
-
The desired output path.
|
275
|
-
|
276
|
-
|
277
|
-
as the base, and the `fmt` argument will determine the final extension.
|
278
|
-
- If None, the current working directory will be used, and the filename will
|
279
|
-
be generated.
|
274
|
+
The desired output path. For a directory, the file name will be generated;
|
275
|
+
For a full file path, the base name will be used with the specified format;
|
276
|
+
For None, the current working directory will be used.
|
280
277
|
fmt : str, optional
|
281
278
|
The file format to export, e.g., 'csv', 'json'. Default is 'csv'.
|
282
279
|
|
283
280
|
Returns
|
284
281
|
-------
|
285
|
-
tuple
|
286
|
-
|
287
|
-
|
288
|
-
- The **export file name** (e.g., 'data_Routine.csv'), including the format extension.
|
282
|
+
tuple : (str, str)
|
283
|
+
- The absolute export path (e.g., '/home/user/project/data_Routine.csv').
|
284
|
+
- The export file name (e.g., 'data_Routine.csv'), including the format extension.
|
289
285
|
"""
|
290
286
|
# Determine the base name from system.files.fullname or default to "Untitled"
|
291
287
|
if system.files.fullname is None:
|
docs/source/examples/index.rst
CHANGED
docs/source/genroutineref.py
CHANGED
@@ -20,6 +20,30 @@ Routine reference
|
|
20
20
|
Use the left navigation pane to locate the group and model
|
21
21
|
and view details.
|
22
22
|
|
23
|
+
Typical acronyms used in AMS include:
|
24
|
+
|
25
|
+
+------------+---------------------------+
|
26
|
+
| Acronym | Meaning |
|
27
|
+
+============+===========================+
|
28
|
+
| AC- | Alternating Current |
|
29
|
+
+------------+---------------------------+
|
30
|
+
| DC- | Direct Current |
|
31
|
+
+------------+---------------------------+
|
32
|
+
| RT- | Real-Time |
|
33
|
+
+------------+---------------------------+
|
34
|
+
| -DG | Distributed Generation |
|
35
|
+
+------------+---------------------------+
|
36
|
+
| -ES | Energy Storage |
|
37
|
+
+------------+---------------------------+
|
38
|
+
| -OPF | Optimal Power Flow |
|
39
|
+
+------------+---------------------------+
|
40
|
+
| -ED | Economic Dispatch |
|
41
|
+
+------------+---------------------------+
|
42
|
+
| -UC | Unit Commitment |
|
43
|
+
+------------+---------------------------+
|
44
|
+
| LMP | Locational Marginal Price |
|
45
|
+
+------------+---------------------------+
|
46
|
+
|
23
47
|
"""
|
24
48
|
|
25
49
|
out += ss.supported_routines(export='rest')
|
docs/source/release-notes.rst
CHANGED
@@ -9,6 +9,21 @@ The APIs before v3.0.0 are in beta and may change without prior notice.
|
|
9
9
|
v1.0
|
10
10
|
==========
|
11
11
|
|
12
|
+
v1.0.15 (2025-09-28)
|
13
|
+
----------------------
|
14
|
+
|
15
|
+
- Fix ``DCOPF2.pb`` to use PTDF-based formulation
|
16
|
+
- Add a demo to compare ``DCOPF2`` and ``DCOPF``, see
|
17
|
+
``examples/demonstration/demo_dcopf.ipynb``
|
18
|
+
- In DC type routines, set `vBus` value as 1 for placeholder
|
19
|
+
- Include Summary and Objective value in exported JSON
|
20
|
+
|
21
|
+
v1.0.14 (2025-08-29)
|
22
|
+
----------------------
|
23
|
+
|
24
|
+
- Add supported Python versions in README
|
25
|
+
|
26
|
+
|
12
27
|
v1.0.13 (2025-08-18)
|
13
28
|
----------------------
|
14
29
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ltbams
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.15
|
4
4
|
Summary: Python software for scheduling modeling and co-simulation with dynamics.
|
5
5
|
Home-page: https://github.com/CURENT/ams
|
6
6
|
Author: Jinning Wang
|
@@ -51,12 +51,13 @@ Dynamic: home-page
|
|
51
51
|
|
52
52
|
# LTB AMS
|
53
53
|
|
54
|
+
<img src="docs/source/images/sponsors/CURENT_Logo_NameOnTrans.png" alt="CURENT ERC Logo" width="300" height="auto">
|
55
|
+
|
54
56
|
Python Software for Power System Scheduling Modeling and Co-Simulation with Dynamics, serving as the market simulator for the [CURENT Largescale Testbed][LTB Repository].
|
55
57
|
|
56
58
|

|
57
59
|
[](https://ieeexplore.ieee.org/document/10836855)
|
58
|
-
|
59
|
-
<img src="docs/source/images/sponsors/CURENT_Logo_NameOnTrans.png" alt="CURENT ERC Logo" width="300" height="auto">
|
60
|
+
[](https://github.com/pyOpenSci/software-review/issues/174)
|
60
61
|
|
61
62
|
| Badges | | |
|
62
63
|
|---|---|---|
|
@@ -66,16 +67,16 @@ Python Software for Power System Scheduling Modeling and Co-Simulation with Dyna
|
|
66
67
|
| Tag | [](https://github.com/CURENT/ams/tags) |  |
|
67
68
|
| Documentation | [](https://ltb.readthedocs.io/projects/ams/en/stable/?badge=stable) | [](https://ltb.readthedocs.io/projects/ams/en/develop/?badge=develop) |
|
68
69
|
| Download | [](https://pypi.org/project/ltbams/) | [](https://anaconda.org/conda-forge/ltbams) |
|
69
|
-
|
|
70
|
-
|
|
70
|
+
| Quality |  | [](https://codebeat.co/projects/github-com-curent-ams-master) |
|
71
|
+
| Coverage |  |  |
|
71
72
|
| Last Commit |  |  |
|
72
|
-
| CI | [](https://github.com/CURENT/ams/actions/workflows/compatibility.yml) | [](https://github.com/CURENT/ams/actions/workflows/publish-pypi.yml) |
|
73
|
+
| CI | [](https://github.com/CURENT/ams/actions/workflows/compatibility.yml) | [](https://dev.azure.com/curentltb/ams/_build/latest?definitionId=2&branchName=master) |
|
74
|
+
| CD | [](https://github.com/CURENT/ams/actions/workflows/publish-pypi.yml) | [](https://dev.azure.com/conda-forge/feedstock-builds/_build/latest?definitionId=21708&branchName=main) |
|
74
75
|
| Structure | [](https://mango-dune-07a8b7110.1.azurestaticapps.net/?repo=CURENT%2Fams) | [](https://deepwiki.com/CURENT/ams) |
|
75
76
|
| Dependency | [](https://libraries.io/pypi/ltbams) | |
|
76
77
|
| Try on Binder | [](https://mybinder.org/v2/gh/curent/ams/master) | |
|
77
78
|
|
78
|
-
|
79
|
+
## Why AMS
|
79
80
|
|
80
81
|
AMS facilitates **Dynamics Incorporated Scheduling** and **Scheduling-Dynamics Co-Simulation**
|
81
82
|
through an integrated interface with ANDES.
|
@@ -150,9 +151,9 @@ Use the following resources to get involved.
|
|
150
151
|
- Read release notes highlighted [here][release notes]
|
151
152
|
- Try in Jupyter Notebook on [Binder][Binder]
|
152
153
|
- Check out the source code used for [benchmark][benchmark]
|
153
|
-
- Check out and
|
154
|
+
- Check out and cite our [paper][paper]
|
154
155
|
|
155
|
-
|
156
|
+
## Installation
|
156
157
|
|
157
158
|
AMS is released as ``ltbams`` on PyPI and conda-forge.
|
158
159
|
Install from PyPI using pip:
|
@@ -191,11 +192,11 @@ pip install git+https://github.com/CURENT/ams.git
|
|
191
192
|
- `cvxpy` is distributed with the open source solvers CLARABEL, OSQP, and SCS, but MIP-capable solvers need separate installation
|
192
193
|
- `cvxpy` versions **below 1.5** are incompatible with `numpy` versions **2.0 and above**
|
193
194
|
- If the solver `SCIP` encounters an import error caused by a missing `libscip.9.1.dylib`, try reinstalling its Python interface by running `pip install pyscipopt --no-binary scip --force`
|
194
|
-
- `kvxopt
|
195
|
+
- For the ImportError related to `kvxopt`, it is recommended to reinstall it via `conda` as sometimes ``pip`` struggles to set the correct path for compiled libraries. More details can be found in this closed issue [Bug with dependency kvxopt 1.3.2.0](https://github.com/CURENT/andes/issues/508)
|
195
196
|
- Versions **1.0.0** and **1.0.1** are only available on PyPI
|
196
197
|
- Version **0.9.9** has known issues and has been yanked from PyPI
|
197
198
|
|
198
|
-
|
199
|
+
## Example Usage
|
199
200
|
|
200
201
|
```python
|
201
202
|
import ams
|
@@ -216,12 +217,15 @@ sa
|
|
216
217
|
>>> <andes.system.System at 0x14bd98190>
|
217
218
|
```
|
218
219
|
|
219
|
-
|
220
|
+
Here, RTED stands for Real-Time Economic Dispatch.
|
221
|
+
For a full list of acronyms used in the library, please consult the [Documentation - Routine Reference](https://ltb.readthedocs.io/projects/ams/en/stable/routineref.html#routine-reference).
|
222
|
+
|
223
|
+
## Citing AMS
|
220
224
|
If you use AMS for research or consulting, please cite the following paper in your publication that uses AMS:
|
221
225
|
|
222
226
|
> J. Wang et al., "Dynamics-Incorporated Modeling Framework for Stability Constrained Scheduling Under High-Penetration of Renewable Energy," in IEEE Transactions on Sustainable Energy, vol. 16, no. 3, pp. 1673-1685, July 2025, doi: 10.1109/TSTE.2025.3528027.
|
223
227
|
|
224
|
-
|
228
|
+
## Sponsors and Contributors
|
225
229
|
AMS is the scheduling simulation engine for the CURENT Largescale Testbed (LTB).
|
226
230
|
More information about CURENT LTB can be found at the [LTB Repository][LTB Repository].
|
227
231
|
|
@@ -232,16 +236,9 @@ This work was supported in part by the Advanced Grid Research and Development Pr
|
|
232
236
|
|
233
237
|
See [GitHub contributors][GitHub contributors] for the contributor list.
|
234
238
|
|
235
|
-
|
239
|
+
## License
|
236
240
|
AMS is licensed under the [GPL v3 License](./LICENSE).
|
237
241
|
|
238
|
-
# Related Projects
|
239
|
-
- [Popular Open Source Libraries for Power System Analysis](https://github.com/ps-wiki/best-of-ps)
|
240
|
-
- [G-PST Tools Portal](https://g-pst.github.io/tools/): An open tools portal with a classification approach
|
241
|
-
- [Open Source Software (OSS) for Electricity Market Research, Teaching, and Training](https://www2.econ.iastate.edu/tesfatsi/ElectricOSS.htm)
|
242
|
-
|
243
|
-
Some commercial solvers provide academic licenses, such as COPT, GUROBI, CPLEX, and MOSEK.
|
244
|
-
|
245
242
|
* * *
|
246
243
|
|
247
244
|
[GitHub releases]: https://github.com/CURENT/ams/releases
|
@@ -1,12 +1,12 @@
|
|
1
1
|
ams/__init__.py,sha256=q-9-f0YCg6aaTW19VCkY6VosfvRA2ObI9mF1f_3016Y,313
|
2
2
|
ams/__main__.py,sha256=EB4GfGiKgvnQ_psNr0QwPoziYvjmGvQ2yVsBwQtfrLw,170
|
3
|
-
ams/_version.py,sha256=
|
4
|
-
ams/cli.py,sha256=
|
5
|
-
ams/interface.py,sha256
|
6
|
-
ams/main.py,sha256=
|
7
|
-
ams/report.py,sha256=
|
8
|
-
ams/shared.py,sha256=
|
9
|
-
ams/system.py,sha256=
|
3
|
+
ams/_version.py,sha256=Y9hMQAuHXt_45lOoYtSA44yQCwKbKuDs8CYDfeESO-k,498
|
4
|
+
ams/cli.py,sha256=OuQc4xotv0dCgEIEaw-ZFEfDZvt1w9QQ9yjeaJiDe_s,6067
|
5
|
+
ams/interface.py,sha256=wYqoh_rK4vHidJjWnE5VZHzonm4D-uCzZt0Z9oFBKVo,45233
|
6
|
+
ams/main.py,sha256=OFbEtXEIuv-zSFccyN_1Mrg8XEn4TZTHXa3Ly-zbxmo,23559
|
7
|
+
ams/report.py,sha256=iqa--JZwDldjmOaMhDdg8yYkuNL5ITeMxQak0OTPtos,10860
|
8
|
+
ams/shared.py,sha256=sr5xMTP-7FWHsSCRz_dLMUN2OsmszlPcdYzR3orol0c,6613
|
9
|
+
ams/system.py,sha256=hGokwNl5pgzVs07jnONteD5ipqoKukZetHi4dq2pIO0,34534
|
10
10
|
ams/cases/5bus/pjm5bus_demo.json,sha256=IpxO2vzB9-9Kg9xjOXREKeXEz9wjFE7cuQbcUu8VORA,23152
|
11
11
|
ams/cases/5bus/pjm5bus_demo.xlsx,sha256=OWIUprkg8_aQ_bTCaEFMl7Bhfa1R20zxAHXRQtXBix0,32607
|
12
12
|
ams/cases/5bus/pjm5bus_ev.xlsx,sha256=vR8dJv5jIxib1pgcMonhzvraoqZVJWhBSJdVXDL0qsI,19498
|
@@ -36,81 +36,81 @@ ams/cases/pglib/pglib_opf_case39_epri__api.m,sha256=DKUNon8FgIYKJWOK5ZyQ0fLP0zow
|
|
36
36
|
ams/cases/wecc/wecc.m,sha256=8Wqal6H5r1wNxLLQBCXo2V3v3JZY5IJDEkyrEGCrCWE,30498
|
37
37
|
ams/cases/wecc/wecc_uced.xlsx,sha256=R3tZgxEqz_ctKcjA1wwFecxn-QZXutvf7NzgnCg_078,94767
|
38
38
|
ams/core/__init__.py,sha256=lIvrAvYf2yrHWqYi0rVuJgJt8KNA8nTmN2iuZ125z9Q,123
|
39
|
-
ams/core/common.py,sha256=
|
40
|
-
ams/core/documenter.py,sha256=
|
41
|
-
ams/core/matprocessor.py,sha256=
|
42
|
-
ams/core/model.py,sha256=
|
43
|
-
ams/core/param.py,sha256=
|
39
|
+
ams/core/common.py,sha256=UrgM3W2zjzGKZsI0vA7ozqA2RwjTu1idQAo_nzqQgjk,840
|
40
|
+
ams/core/documenter.py,sha256=Q8u_AN1ljyQIKdbPsmcscCc8iUwpz4fTRVXZieJZByI,25814
|
41
|
+
ams/core/matprocessor.py,sha256=ooYQEq6YCfLb2bpVdK8cjBOG1wmDgSEeUkkG1xOA9Qo,27952
|
42
|
+
ams/core/model.py,sha256=wS8LN3F6wCy3aATnxrbvN6RwvG3mKfAlfBwvOuBdEx0,10990
|
43
|
+
ams/core/param.py,sha256=uNNjlBkaC8HXiLPsceDS5AIc9U2gNo7pHKquni0LRfE,11183
|
44
44
|
ams/core/service.py,sha256=Q4aeaYFWycIEH7I8DSO8Itah2CJxc3oAW46dtKCQEyA,28041
|
45
|
-
ams/core/symprocessor.py,sha256=
|
46
|
-
ams/core/var.py,sha256=
|
45
|
+
ams/core/symprocessor.py,sha256=QlVfKdFYsXwcNChltfmosXW2HRCqsOpgi0rZhbtdYYI,8547
|
46
|
+
ams/core/var.py,sha256=cwvFKz3LmjGH--nkaGo2lron8q7UViyBd3YrAkhuR7s,1575
|
47
47
|
ams/extension/__init__.py,sha256=5IFTNirDL0uDaUsg05_oociVT9VCy2rhPx1ad4LGveM,65
|
48
|
-
ams/extension/eva.py,sha256=
|
48
|
+
ams/extension/eva.py,sha256=CoijRlJ7-4hyCdT8028aoI5BOZQi3HaSYoXlOatboVY,16449
|
49
49
|
ams/io/__init__.py,sha256=GIfF7X44olHaySL8EzOBU1eXUnunr1owzzdPfPvvHZU,3802
|
50
|
-
ams/io/json.py,sha256=
|
51
|
-
ams/io/matpower.py,sha256=
|
52
|
-
ams/io/psse.py,sha256=
|
50
|
+
ams/io/json.py,sha256=PhbF1kUhl7UXR2OtTAx-fdb3mZ2ujyYpn-vJqUe5Gdg,2508
|
51
|
+
ams/io/matpower.py,sha256=g-qOtKGvnJJuHDqcyiGGGCY_BeuSbnQpmflolMV_wo8,27575
|
52
|
+
ams/io/psse.py,sha256=IqE8EDAZrm2FrjYmLpcV7231Dw-1gD-4f1Xndx0nmGo,13724
|
53
53
|
ams/io/pypower.py,sha256=Fe0sxzC5DZegtYksTixadXk_LcfJ1GNetWu9EuHCkG8,2790
|
54
|
-
ams/io/xlsx.py,sha256=
|
54
|
+
ams/io/xlsx.py,sha256=xvo3eMwavFRWzppVI1HR0za9vI0w05WJaVctA8erEr4,2443
|
55
55
|
ams/models/__init__.py,sha256=EGkViLkVX_We9FAGuEkgfleMNmPw_vGp2Nq1OQimL7U,691
|
56
56
|
ams/models/area.py,sha256=AKYU6aJQKsVWRZdvMO7yic-8wZ1GumSTQXgDg5L0THw,899
|
57
57
|
ams/models/bus.py,sha256=U0vSegkm-9fqPQS9KMJQU6gpIMX_1GK5O_dvRc8-0P0,1585
|
58
58
|
ams/models/cost.py,sha256=rmGNj9ztMbqA-OIJj8fNNBh8bdYJSY9hk10vffgxc6k,5916
|
59
|
-
ams/models/group.py,sha256=
|
59
|
+
ams/models/group.py,sha256=3jzytOxnb9kqYqKfVD02ZhgaswbJ0lih_0_WMl2DGfw,5897
|
60
60
|
ams/models/info.py,sha256=Oh0Xo5J4ZHBsNIkMOzIwv_DegsX1inyuv3Q5CpCfyQw,788
|
61
61
|
ams/models/line.py,sha256=ju5h1BcW4kgVWm_lgl8zWhSYqlsUjbdoUwzz2t0Vx1s,2770
|
62
62
|
ams/models/reserve.py,sha256=3BjWCyKrPL4CwTvmzRxk25H8Nkxh-Rz0Ne17I9Y2TUA,2816
|
63
63
|
ams/models/shunt.py,sha256=h5QV33EcCd86XRR0sMIzcO0PTeTirkWaxi8imPKzOi0,337
|
64
|
-
ams/models/timeslot.py,sha256=
|
65
|
-
ams/models/zone.py,sha256
|
64
|
+
ams/models/timeslot.py,sha256=z_LDZZOjYFG_R_1jwBWSsLKsD-OoauWo027Z2J_JIMQ,3639
|
65
|
+
ams/models/zone.py,sha256=-oOmPiMa8I7TzgheKEZOImXWv273ri6TURhmzy_ygkE,1089
|
66
66
|
ams/models/distributed/__init__.py,sha256=3uiMHT2YRq79DXIB1jni6wP7dNoQMjU1bMTUpr4P6Rc,161
|
67
|
-
ams/models/distributed/esd1.py,sha256=
|
68
|
-
ams/models/distributed/ev.py,sha256=
|
69
|
-
ams/models/distributed/pvd1.py,sha256=
|
67
|
+
ams/models/distributed/esd1.py,sha256=Ojqp_dJOJqa65u8kZ-oreA5cxruX2kXZ5AeNAAeYV7g,2136
|
68
|
+
ams/models/distributed/ev.py,sha256=DO5cIqAX09lMKfrlsK-W_6gypI6hWpXHObQ0JZ6g9OE,2096
|
69
|
+
ams/models/distributed/pvd1.py,sha256=RGxpkb5lWfoxafSyc_Tc8GcxBf0lF9Zl1RbN3WSE7MQ,1966
|
70
70
|
ams/models/renewable/__init__.py,sha256=7dZyRXbvBAHbLJeJssJ1hsOHj9Bgeg77kB5gcX_mBtg,118
|
71
|
-
ams/models/renewable/regc.py,sha256=
|
71
|
+
ams/models/renewable/regc.py,sha256=A4CYMVeKPZsqD6tTMz0GmPYiuZjfKGYx8f2eCX_D0lg,3483
|
72
72
|
ams/models/static/__init__.py,sha256=lh5yR5Xb2unS4ndng-cLU1TAeoidu2s6VAVFLc3HUDU,96
|
73
73
|
ams/models/static/gen.py,sha256=QXklOYlnU7QHWy-WFJwhxuNItUPqFsLJIjAO4sGMUbg,7087
|
74
74
|
ams/models/static/pq.py,sha256=SCwAqhqvKy_PFHp6VYO_zgv3v6gI5pK3KvT3RNX-nvA,2782
|
75
75
|
ams/opt/__init__.py,sha256=INsl8yxtOzTKqV9pzVxlL6RSGDRaUDwxpZMY1QROrF4,459
|
76
76
|
ams/opt/constraint.py,sha256=ERT9zwjQyGkvDo465Yd0wBexlIhjVmw0MyWq4BWnWoI,5534
|
77
|
-
ams/opt/exprcalc.py,sha256=
|
77
|
+
ams/opt/exprcalc.py,sha256=Dkopx7U5VnfeqN6VDAx1iqaF60dRxvHpNErnhZN1rm4,4422
|
78
78
|
ams/opt/expression.py,sha256=WrWnYliB61uHA_wQjtYgtAXdpgSN1pNqQmWvzHWSsdE,5569
|
79
79
|
ams/opt/objective.py,sha256=W0dQfW5dHNdWEc2DQtWYNGMuhMY6Pu-HTD0n7-izDZA,5519
|
80
80
|
ams/opt/omodel.py,sha256=hEtfKoSNssSxHgUDdep79pifNTsywytDTjgGgne7nKM,12750
|
81
|
-
ams/opt/optzbase.py,sha256=
|
81
|
+
ams/opt/optzbase.py,sha256=wp5Logvti1psRnuzRKDV36HN_EQw-cEbk3BsORDx1_0,5623
|
82
82
|
ams/opt/param.py,sha256=G0KkWo1SqLiecZ7gLPzsbG5_WBORSVZ2GJ20ekdYJoQ,5121
|
83
83
|
ams/opt/var.py,sha256=cpDiELo37E7IoTDlVn_NbkuFNQ88oey23YOF6Gpg6zM,7707
|
84
84
|
ams/routines/__init__.py,sha256=V_IyEb5qLBrZ4zc_eVe-Rc0G_j-u881tvEzcEejhNv8,647
|
85
85
|
ams/routines/acopf.py,sha256=dLVTh84KiBvLyG2auNsIfcufsl6N-9FcXWjpdYrQfYQ,208
|
86
|
-
ams/routines/dcopf.py,sha256=
|
87
|
-
ams/routines/dcopf2.py,sha256=
|
88
|
-
ams/routines/dcpf.py,sha256=
|
89
|
-
ams/routines/dopf.py,sha256=
|
90
|
-
ams/routines/ed.py,sha256
|
86
|
+
ams/routines/dcopf.py,sha256=QagOUPWgBIh9zhh2LQp7aZw0kx3n-JKtClVh7X3M-yI,11874
|
87
|
+
ams/routines/dcopf2.py,sha256=GNXyydfVKRYx4gW_5mdWhnA2eDDYFSUGK-AuJnEC-fI,4899
|
88
|
+
ams/routines/dcpf.py,sha256=qZ2MSOmn53lz2Q54Cy_tIZ3TSKYJuN1YQsQez1XRukQ,8384
|
89
|
+
ams/routines/dopf.py,sha256=IRvkwYF80sYAPI0iUS5L6c2jChFT3vl8tELf7LA6V7Q,6275
|
90
|
+
ams/routines/ed.py,sha256=-OpoWiTEMDC5dHcumJikKPsp7DoyfxQ0sRXjKhWQ6vE,11870
|
91
91
|
ams/routines/grbopt.py,sha256=hEDy7L-lSd7QxSN_GAyDLaLkhIpxl6csXz6ntdKT_fw,5510
|
92
|
-
ams/routines/pflow.py,sha256=
|
92
|
+
ams/routines/pflow.py,sha256=vFnf61cYv7gWJSGqcQrMOaw-aOODd2eJMLpQ4aM1PQM,9438
|
93
93
|
ams/routines/pypower.py,sha256=VnqMQZkBIvDe3tDbTJcxYz04idon5XvmGlf7OSs8kOI,27334
|
94
|
-
ams/routines/routine.py,sha256=
|
95
|
-
ams/routines/rted.py,sha256
|
94
|
+
ams/routines/routine.py,sha256=eDscTniBpFh9SZ8pTV1pmi-b_6JwL5OYOgiXmPUUNxE,39981
|
95
|
+
ams/routines/rted.py,sha256=-5UOeEGx3ZOrF0FG0M0OUPP2tIfajQmKyZHTQ3c6kaE,22058
|
96
96
|
ams/routines/type.py,sha256=lvTWSnCYIbRJXIm3HX6jA0Hv-WWYusTOUPfoW8DITlU,3877
|
97
|
-
ams/routines/uc.py,sha256=
|
97
|
+
ams/routines/uc.py,sha256=L9LpwjoqKoUzIwYq-G-r1zRTMGfbaSWSwT8GZuf_nB0,15650
|
98
98
|
ams/utils/__init__.py,sha256=2hAQmWRgmnE-bCGT9cJoW9FkPDMGRiGkbBcUgj-bgjI,122
|
99
99
|
ams/utils/misc.py,sha256=Y6tPKpUKJa7bL9alroJuG2UNW9vdQjnfAmKb2EbIls8,2027
|
100
|
-
ams/utils/paths.py,sha256=
|
100
|
+
ams/utils/paths.py,sha256=Zx0PMqHjd_uuZI2pPu-Jec98FMNE2rCaaXJCHlZ22qs,9295
|
101
101
|
docs/Makefile,sha256=UKXBFAbKGPt1Xw9J84343v0Mh8ylAZ-tE0uCd74DrQU,725
|
102
102
|
docs/make.bat,sha256=9UgKGb4SdP006622fJiFxeFT1BeycYAs6hDbV1xwPy8,804
|
103
103
|
docs/source/api.rst,sha256=BRzdDFDzDwVL7Jr_Xj-O5Icgx0gt5hNNd1OjvPl7ap0,1490
|
104
104
|
docs/source/conf.py,sha256=UyoWogZTUNSJU7pQS_JaR28nKddW94zr01LYoIciZZw,6688
|
105
105
|
docs/source/genmodelref.py,sha256=IhmF7bDw8BXPvLD8V3WjQNrfc-H07r5iS-_4DHbbp-8,1420
|
106
|
-
docs/source/genroutineref.py,sha256=
|
106
|
+
docs/source/genroutineref.py,sha256=0Fac6ZPY0TVfRvunq-FY6iax-_N6EEcoeVXVZmkfV4k,2006
|
107
107
|
docs/source/index.rst,sha256=oAdRBWTLCX8nEMVatfDFkn0dtvinOK7vg4QUekT4jns,2738
|
108
|
-
docs/source/release-notes.rst,sha256=
|
108
|
+
docs/source/release-notes.rst,sha256=tsSEDXGQGi9kH8-gnGb-SslytqfRFRto6iEJDgWyrXI,14709
|
109
109
|
docs/source/_templates/autosummary/base.rst,sha256=zl3U4baR4a6YjsHyT-x9zCOrHwKZOVUdWn1NPX2u3bc,106
|
110
110
|
docs/source/_templates/autosummary/class.rst,sha256=Hv_igCsLsUpM62_zN0nqj6FSfKnS5xLyu8ZldMbfOAk,668
|
111
111
|
docs/source/_templates/autosummary/module.rst,sha256=YdbpCudOrEU-JbuSlzGvcOI2hn_KrCM6FW5HcGqkaEE,1113
|
112
112
|
docs/source/_templates/autosummary/module_toctree.rst,sha256=sg30OdqFDLyo8Y3hl9V-s2BXb1bzcjjqqWaWi-C3qFM,1126
|
113
|
-
docs/source/examples/index.rst,sha256=
|
113
|
+
docs/source/examples/index.rst,sha256=8nnW6jISleIz3IBWmqWtQcaOEdgMonY1UfWYs3NjTnM,830
|
114
114
|
docs/source/getting_started/copyright.rst,sha256=d3S7FjrbysVqQd3pEBadrrkcQOZ7sYYeDTCOS4goPC8,715
|
115
115
|
docs/source/getting_started/index.rst,sha256=mcp1NdUwbPoNzpn7Owf5Qzfd6J_--ToU52PjmrbwjBY,1512
|
116
116
|
docs/source/getting_started/install.rst,sha256=pCL5GDNxwkWnrPaO48i9c0bBPT_dYAWvD2CQ7Oi2P_0,7400
|
@@ -135,8 +135,8 @@ docs/source/modeling/index.rst,sha256=TasRAJSglc5KAZaGAj9TLMktOO2TtzZsqG5WvvZXB_
|
|
135
135
|
docs/source/modeling/model.rst,sha256=j7OSvoXnDht6rGpgwPiJklsCWrebfx4DxIN-G8r6iFo,7086
|
136
136
|
docs/source/modeling/routine.rst,sha256=BkUE3y5L1lA7LP9Nyzc4zzY-tF3t4k7egBE188kybHY,4286
|
137
137
|
docs/source/modeling/system.rst,sha256=NMOPNMOKG1_dRyNPPx-MiCKbbpadxWJxGyU6geRUsvQ,1374
|
138
|
-
ltbams-1.0.
|
139
|
-
ltbams-1.0.
|
140
|
-
ltbams-1.0.
|
141
|
-
ltbams-1.0.
|
142
|
-
ltbams-1.0.
|
138
|
+
ltbams-1.0.15.dist-info/METADATA,sha256=K6aLQwj_aKgX8n92MvowKSeKLlI72bAjR8rX-QOES0E,14333
|
139
|
+
ltbams-1.0.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
140
|
+
ltbams-1.0.15.dist-info/entry_points.txt,sha256=FA56FlhO_yVNeEf810SrorVQb7_Xsmo3_EW-W-ijUfA,37
|
141
|
+
ltbams-1.0.15.dist-info/top_level.txt,sha256=5QQ_oDY9sa52MVmqCjqjUq07BssHOKmDSaQ8EZi6DOw,9
|
142
|
+
ltbams-1.0.15.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|