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.
Files changed (46) hide show
  1. ams/_version.py +3 -3
  2. ams/cli.py +2 -7
  3. ams/core/common.py +7 -3
  4. ams/core/documenter.py +2 -1
  5. ams/core/matprocessor.py +4 -4
  6. ams/core/model.py +14 -6
  7. ams/core/param.py +5 -3
  8. ams/core/symprocessor.py +8 -2
  9. ams/core/var.py +1 -1
  10. ams/extension/eva.py +11 -7
  11. ams/interface.py +7 -7
  12. ams/io/json.py +20 -16
  13. ams/io/matpower.py +6 -6
  14. ams/io/psse.py +2 -1
  15. ams/io/xlsx.py +21 -16
  16. ams/main.py +53 -45
  17. ams/models/distributed/esd1.py +4 -7
  18. ams/models/distributed/ev.py +10 -6
  19. ams/models/distributed/pvd1.py +4 -7
  20. ams/models/group.py +17 -18
  21. ams/models/renewable/regc.py +14 -22
  22. ams/models/timeslot.py +46 -1
  23. ams/models/zone.py +2 -4
  24. ams/opt/exprcalc.py +5 -3
  25. ams/opt/optzbase.py +4 -3
  26. ams/report.py +2 -7
  27. ams/routines/dcopf.py +7 -4
  28. ams/routines/dcopf2.py +46 -21
  29. ams/routines/dcpf.py +5 -0
  30. ams/routines/dopf.py +2 -2
  31. ams/routines/ed.py +5 -5
  32. ams/routines/pflow.py +1 -1
  33. ams/routines/routine.py +20 -4
  34. ams/routines/rted.py +5 -5
  35. ams/routines/uc.py +2 -2
  36. ams/shared.py +69 -0
  37. ams/system.py +93 -18
  38. ams/utils/paths.py +6 -10
  39. docs/source/examples/index.rst +1 -0
  40. docs/source/genroutineref.py +24 -0
  41. docs/source/release-notes.rst +15 -0
  42. {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/METADATA +19 -22
  43. {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/RECORD +46 -46
  44. {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/WHEEL +0 -0
  45. {ltbams-1.0.13.dist-info → ltbams-1.0.15.dist-info}/entry_points.txt +0 -0
  46. {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
- A subclass of ``andes.system.System``, this class encapsulates data, models,
55
- and routines for scheduling modeling and analysis in power systems.
56
- Some methods inherited from the parent class are intentionally disabled.
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
- 1. Power flow models in the addfile will be skipped and only dynamic models will be used.
656
- 2. The addfile format is guessed based on the file extension. Currently only ``xlsx`` is supported.
657
- 3. Index in the addfile is automatically adjusted when necessary.
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(self, outfile: str, overwrite: bool = None):
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(self, outfile: str, overwrite: bool = None):
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 an AMS system to an Excel file.
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, overwrite=overwrite)
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(self, outfile: str, overwrite: bool = None):
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 an AMS system to a JSON file.
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, overwrite=overwrite)
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(self, outfile: str, overwrite: bool = None):
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 an AMS system to a v33 PSS/E RAW file.
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
- - If it's a directory, the file name will be generated.
276
- - If it's a full file path (with extension), the filename part will be used
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
- (str, str): A tuple containing:
287
- - The **absolute export path** (e.g., '/home/user/project/data_Routine.csv').
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:
@@ -30,3 +30,4 @@ folder of the repository
30
30
  ../_examples/demo/demo_debug.ipynb
31
31
  ../_examples/demo/demo_mat.ipynb
32
32
  ../_examples/demo/demo_wrapper_routines.ipynb
33
+ ../_examples/demo/demo_dcopf.ipynb
@@ -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')
@@ -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.13
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
  ![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-blue.svg)
57
59
  [![DOI:10.1109/TSTE.2025.3528027](https://zenodo.org/badge/DOI/10.1109/TSTE.2025.3528027.svg)](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
+ [![pyOpenSci Peer-Reviewed](https://pyopensci.org/badges/peer-reviewed.svg)](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 | [![GitHub Tag](https://img.shields.io/github/v/tag/CURENT/ams)](https://github.com/CURENT/ams/tags) | ![GitHub commits since latest release (branch)](https://img.shields.io/github/commits-since/curent/ams/latest/develop) |
67
68
  | Documentation | [![Read the Docs](https://img.shields.io/readthedocs/ams?label=stable)](https://ltb.readthedocs.io/projects/ams/en/stable/?badge=stable) | [![Read the Docs](https://img.shields.io/readthedocs/ams?label=develop)](https://ltb.readthedocs.io/projects/ams/en/develop/?badge=develop) |
68
69
  | Download | [![PyPI - Downloads](https://img.shields.io/pypi/dm/ltbams)](https://pypi.org/project/ltbams/) | [![Anaconda-Server Badge](https://anaconda.org/conda-forge/ltbams/badges/downloads.svg)](https://anaconda.org/conda-forge/ltbams) |
69
- | Code Quality | ![Codacy Badge](https://app.codacy.com/project/badge/Grade/69456da1b8634f2f984bd769e35f0050) | ![Codacy Badge](https://app.codacy.com/project/badge/Coverage/69456da1b8634f2f984bd769e35f0050) |
70
- | Code Cov | ![codecov](https://codecov.io/gh/CURENT/ams/graph/badge.svg?token=RZI5GLLBQH) | |
70
+ | Quality | ![Codacy Badge](https://app.codacy.com/project/badge/Grade/69456da1b8634f2f984bd769e35f0050) | [![codebeat badge](https://codebeat.co/badges/6c8a53d2-cffd-4787-8c49-d59742a95205)](https://codebeat.co/projects/github-com-curent-ams-master) |
71
+ | Coverage | ![Codacy Badge](https://app.codacy.com/project/badge/Coverage/69456da1b8634f2f984bd769e35f0050) | ![codecov](https://codecov.io/gh/CURENT/ams/graph/badge.svg?token=RZI5GLLBQH) |
71
72
  | Last Commit | ![GitHub last commit (master)](https://img.shields.io/github/last-commit/CURENT/ams/master?label=last%20commit%20to%20master) | ![GitHub last commit (develop)](https://img.shields.io/github/last-commit/CURENT/ams/develop?label=last%20commit%20to%20develop) |
72
- | CI | [![Compatibility](https://github.com/CURENT/ams/actions/workflows/compatibility.yml/badge.svg)](https://github.com/CURENT/ams/actions/workflows/compatibility.yml) | [![Build Status](https://dev.azure.com/curentltb/ams/_apis/build/status%2FCURENT.ams?branchName=scuc)](https://dev.azure.com/curentltb/ams/_build/latest?definitionId=2&branchName=scuc) |
73
- | CD | [![Publish](https://github.com/CURENT/ams/actions/workflows/publish-pypi.yml/badge.svg)](https://github.com/CURENT/ams/actions/workflows/publish-pypi.yml) | |
73
+ | CI | [![Compatibility](https://github.com/CURENT/ams/actions/workflows/compatibility.yml/badge.svg)](https://github.com/CURENT/ams/actions/workflows/compatibility.yml) | [![Build Status](https://dev.azure.com/curentltb/ams/_apis/build/status%2FCURENT.ams?branchName=master)](https://dev.azure.com/curentltb/ams/_build/latest?definitionId=2&branchName=master) |
74
+ | CD | [![Publish](https://github.com/CURENT/ams/actions/workflows/publish-pypi.yml/badge.svg)](https://github.com/CURENT/ams/actions/workflows/publish-pypi.yml) | [![Build Status](https://dev.azure.com/conda-forge/feedstock-builds/_apis/build/status/ltbams-feedstock?branchName=main)](https://dev.azure.com/conda-forge/feedstock-builds/_build/latest?definitionId=21708&branchName=main) |
74
75
  | Structure | [![Structure](https://img.shields.io/badge/code_base-visualize-blue)](https://mango-dune-07a8b7110.1.azurestaticapps.net/?repo=CURENT%2Fams) | [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/CURENT/ams) |
75
76
  | Dependency | [![libraries](https://img.shields.io/librariesio/release/pypi/ltbams)](https://libraries.io/pypi/ltbams) | |
76
77
  | Try on Binder | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/curent/ams/master) | |
77
78
 
78
- # Why AMS
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 and cite our [paper][paper]
154
+ - Check out and cite our [paper][paper]
154
155
 
155
- # Installation
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` is recommended to install via `conda` as sometimes ``pip`` struggles to set the correct path for compiled libraries, more detailes can be found in this closed issue [Bug with dependency kvxopt 1.3.2.0](https://github.com/CURENT/andes/issues/508)
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
- # Example Usage
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
- # Citing AMS
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
- # Sponsors and Contributors
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
- # License
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=cx7xVAwESB33WAGN1aq_ze2Enb6iFPvXPOw8AEV7mrg,498
4
- ams/cli.py,sha256=EyNFXn565gFCppTxpyTZviBdPgUuKtgAPZ4WE6xewRk,6164
5
- ams/interface.py,sha256=-UN7-TiSt7mOS0W7526LuOk4KCIGDZSguRaVmh_KMRM,45240
6
- ams/main.py,sha256=lIqC16TO0pye75Wv8l_6EemNtm15iyMdvu8YQFkdd_4,23599
7
- ams/report.py,sha256=ewcffopOzT5o45eJNmcV8pxeQqPIjKbarGN33-yHGA8,10961
8
- ams/shared.py,sha256=HNkW-fa7l1PSubHPUvG5iaJTKeKXEt-IUCEv1MyrX3Q,4820
9
- ams/system.py,sha256=rKd9xeb6NKTcb74iqMh5zHS4ZrvQXI88zx56ChIoKkc,32118
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=934J7xq5JvC14yKp2Z4hWKUFJFhxzAnxB_8_99CChY0,704
40
- ams/core/documenter.py,sha256=3-jUYrtN8zDZXd8tQZlmZouJluJPH9_xIDbK9ZEEnRU,25762
41
- ams/core/matprocessor.py,sha256=T_WcfTS2qoXa8IxiaYBgSjt56yQm_qUKSsh3Gfq-yIc,27923
42
- ams/core/model.py,sha256=LNZtzyf2A7Tz3pn9IDs35JYaHSkQRqhqZicTpZGSqsc,10926
43
- ams/core/param.py,sha256=LPH48xUHyqWqODD6IsiamUtkJDDSgGCEMAo6vroFoHE,11130
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=qGzztGqe15-nrq1ZdrjslEH-375vjvB3O8fi7nau5Hw,8419
46
- ams/core/var.py,sha256=f48pzir4miBsB5sh6PwUsFe0LdNNEM-d3VufcjbUU0w,1591
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=4_q4ME0WrQIcd205SBTjv0-rMRZZIdQ07QJuEHwLIC8,16340
48
+ ams/extension/eva.py,sha256=CoijRlJ7-4hyCdT8028aoI5BOZQi3HaSYoXlOatboVY,16449
49
49
  ams/io/__init__.py,sha256=GIfF7X44olHaySL8EzOBU1eXUnunr1owzzdPfPvvHZU,3802
50
- ams/io/json.py,sha256=IurwcZDuKczSbRTpcbQZiIi0ARCrMK6kJ0E3wS8ENy8,2585
51
- ams/io/matpower.py,sha256=qxZ6qqFDm1F9mWotLT6walWD-rZaFKyh0-DVtRcjhgY,27601
52
- ams/io/psse.py,sha256=qLKM9pRsNuSVNRHrgy4i6beSLuxu4fcBEU_SIV8owRA,13714
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=7ATW1seyxsGn7d5p5IuSRFHcoCHVVjMu3E7mP1Mc74U,2460
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=qVYhyMJQHIDikcxxY-mAOOVZOE1_Bp9Av4dP6AtQ4hs,5780
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=XfXJukbQXTUawbsYI6BMLbytXNIe5VE2SQ5_t1Lc8_8,2001
65
- ams/models/zone.py,sha256=b9DsXOsD9Dny-lCMAWwRpRpl7rYVa0ev180YwqFTaiA,1076
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=A1qCLzaDtJVI-YoXJd6IRYtP_wp_Ajz2lfjFHvzqHkk,2130
68
- ams/models/distributed/ev.py,sha256=mpEIGyG9jV1bXkRIXOkCck4hl5np3bfBKvs4ysxukdM,1978
69
- ams/models/distributed/pvd1.py,sha256=KAOlXpZgT_w58xaGWjm5ht6ksac6eRhaqBFHK4EPRH8,1960
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=3J9alIGUn_GkibQ3-dKTylAOpNPzd5zpancPc79q9T4,3448
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=7io0vEZu5zqsEnetocasRT1tu7o7g0TXw7iJf2YFIxI,4317
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=KEYRPhfTCw1E5EUmjpDXSF1kdyqzdR9Yg10Z2VNJahw,5615
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=40I5pYUsUiear_DT9iHwRtFPs_yy-wlxQVDnFrlMtg4,11619
87
- ams/routines/dcopf2.py,sha256=sDCP8zqYHDh7s7p9SX6G8QhMfIxCg3VPYJn6r3pRKyo,3620
88
- ams/routines/dcpf.py,sha256=lGZ9LmCL1DsFB-sNxI7NGrq0qd_iBRMDPJmU5022t20,8242
89
- ams/routines/dopf.py,sha256=8D36-FkPORYGaMnwGTqwz8HxAXk5ywo3mk8NlGq327g,6289
90
- ams/routines/ed.py,sha256=9Hf_ZqD6poIxCIBfsTMC0DGoPNEja1ZtVxqhb4ijhgE,11875
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=5_9n10r_PfsVXIRkaBgKxVITumImZ8mvpHnwxX_ECdw,9432
92
+ ams/routines/pflow.py,sha256=vFnf61cYv7gWJSGqcQrMOaw-aOODd2eJMLpQ4aM1PQM,9438
93
93
  ams/routines/pypower.py,sha256=VnqMQZkBIvDe3tDbTJcxYz04idon5XvmGlf7OSs8kOI,27334
94
- ams/routines/routine.py,sha256=PB-97CkdNAiAGMlagihvFTklt2w7ce4FG2NcjW1InoA,39445
95
- ams/routines/rted.py,sha256=GOHRxo0-HS5HhwQg8lv7-2VcGr_M_TdUvvomgJ31fDQ,22070
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=VcuNy2TnBjsewKEGIqeo2EFTyuhpx5QsEvgpAtscDIQ,15648
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=6iTux5UaHzRi6mGHnpbYUp-MoD-IFny4IuRsV8FKDcQ,9481
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=glHhbWUXfZzMDrkque9CBZu8QtdxlxPojInERzAAOwA,1063
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=bzZC_X3PP392jjG0j3hSbBtPUFceMcea0FjTIPljyl8,14308
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=yXR54WHHcBY38-h9LkdTBcNq3HDeT6eSNyrMmafq12E,792
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.13.dist-info/METADATA,sha256=Zlsv1ahEhFMTEJDWhCLAaek_J_nwX7v0i6HTKmZEY0w,14014
139
- ltbams-1.0.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
140
- ltbams-1.0.13.dist-info/entry_points.txt,sha256=FA56FlhO_yVNeEf810SrorVQb7_Xsmo3_EW-W-ijUfA,37
141
- ltbams-1.0.13.dist-info/top_level.txt,sha256=5QQ_oDY9sa52MVmqCjqjUq07BssHOKmDSaQ8EZi6DOw,9
142
- ltbams-1.0.13.dist-info/RECORD,,
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,,