ltbams 0.9.12rc1__tar.gz → 0.9.13__tar.gz

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 (205) hide show
  1. {ltbams-0.9.12rc1/ltbams.egg-info → ltbams-0.9.13}/PKG-INFO +28 -9
  2. {ltbams-0.9.12rc1 → ltbams-0.9.13}/README.md +27 -8
  3. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/__init__.py +2 -1
  4. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/_version.py +3 -3
  5. ltbams-0.9.13/ams/cases/5bus/pjm5bus_demo.xlsx +0 -0
  6. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/documenter.py +74 -6
  7. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/matprocessor.py +4 -2
  8. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/param.py +1 -1
  9. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/service.py +44 -24
  10. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/symprocessor.py +11 -3
  11. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/interface.py +105 -13
  12. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/main.py +4 -2
  13. ltbams-0.9.13/ams/opt/__init__.py +12 -0
  14. ltbams-0.9.13/ams/opt/constraint.py +172 -0
  15. ltbams-0.9.13/ams/opt/exprcalc.py +139 -0
  16. ltbams-0.9.13/ams/opt/expression.py +200 -0
  17. ltbams-0.9.13/ams/opt/objective.py +174 -0
  18. ltbams-0.9.13/ams/opt/omodel.py +432 -0
  19. ltbams-0.9.13/ams/opt/optbase.py +155 -0
  20. ltbams-0.9.13/ams/opt/param.py +156 -0
  21. ltbams-0.9.13/ams/opt/var.py +245 -0
  22. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/opf.py +1 -1
  23. ltbams-0.9.13/ams/report.py +356 -0
  24. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/__init__.py +2 -0
  25. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/acopf.py +9 -12
  26. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/dcopf.py +67 -207
  27. ltbams-0.9.13/ams/routines/dcpf.py +209 -0
  28. ltbams-0.9.12rc1/ams/routines/dcpf.py → ltbams-0.9.13/ams/routines/dcpf0.py +11 -3
  29. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/dopf.py +1 -1
  30. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/ed.py +10 -8
  31. ltbams-0.9.13/ams/routines/pflow.py +255 -0
  32. ltbams-0.9.12rc1/ams/routines/pflow.py → ltbams-0.9.13/ams/routines/pflow0.py +7 -5
  33. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/routine.py +80 -32
  34. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/rted.py +22 -19
  35. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/uc.py +10 -7
  36. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/shared.py +6 -4
  37. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/system.py +13 -4
  38. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/examples/index.rst +2 -1
  39. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/release-notes.rst +79 -46
  40. {ltbams-0.9.12rc1 → ltbams-0.9.13/ltbams.egg-info}/PKG-INFO +28 -9
  41. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/SOURCES.txt +12 -1
  42. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_1st_system.py +1 -1
  43. ltbams-0.9.13/tests/test_cli.py +34 -0
  44. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_export_csv.py +8 -4
  45. ltbams-0.9.12rc1/tests/test_interop.py → ltbams-0.9.13/tests/test_interface.py +40 -3
  46. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_known_good.py +4 -2
  47. ltbams-0.9.13/tests/test_omodel.py +119 -0
  48. ltbams-0.9.13/tests/test_report.py +245 -0
  49. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_dcopf.py +24 -0
  50. ltbams-0.9.13/tests/test_rtn_dcpf.py +77 -0
  51. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_ed.py +99 -8
  52. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_rted.py +112 -15
  53. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_uc.py +86 -3
  54. ltbams-0.9.12rc1/ams/cases/5bus/pjm5bus_demo.xlsx +0 -0
  55. ltbams-0.9.12rc1/ams/opt/__init__.py +0 -5
  56. ltbams-0.9.12rc1/ams/opt/omodel.py +0 -1223
  57. ltbams-0.9.12rc1/ams/report.py +0 -200
  58. ltbams-0.9.12rc1/tests/test_cli.py +0 -13
  59. ltbams-0.9.12rc1/tests/test_report.py +0 -76
  60. {ltbams-0.9.12rc1 → ltbams-0.9.13}/CONTRIBUTING.rst +0 -0
  61. {ltbams-0.9.12rc1 → ltbams-0.9.13}/LICENSE +0 -0
  62. {ltbams-0.9.12rc1 → ltbams-0.9.13}/MANIFEST.in +0 -0
  63. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/__main__.py +0 -0
  64. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/benchmarks.py +0 -0
  65. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_jumper.xlsx +0 -0
  66. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_uced.json +0 -0
  67. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_uced.xlsx +0 -0
  68. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_uced_esd1.xlsx +0 -0
  69. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_uced_ev.xlsx +0 -0
  70. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee123/ieee123.xlsx +0 -0
  71. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee123/ieee123_regcv1.xlsx +0 -0
  72. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee14/ieee14.json +0 -0
  73. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee14/ieee14.raw +0 -0
  74. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee14/ieee14_uced.xlsx +0 -0
  75. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39.xlsx +0 -0
  76. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39_uced.xlsx +0 -0
  77. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39_uced_esd1.xlsx +0 -0
  78. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39_uced_pvd1.xlsx +0 -0
  79. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39_uced_vis.xlsx +0 -0
  80. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/benchmark.json +0 -0
  81. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case118.m +0 -0
  82. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case14.m +0 -0
  83. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case300.m +0 -0
  84. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case39.m +0 -0
  85. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case5.m +0 -0
  86. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case_ACTIVSg2000.m +0 -0
  87. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/npcc/npcc.m +0 -0
  88. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/npcc/npcc_uced.xlsx +0 -0
  89. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/pglib/pglib_opf_case39_epri__api.m +0 -0
  90. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/wecc/wecc.m +0 -0
  91. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/wecc/wecc_uced.xlsx +0 -0
  92. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cli.py +0 -0
  93. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/__init__.py +0 -0
  94. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/model.py +0 -0
  95. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/var.py +0 -0
  96. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/extension/__init__.py +0 -0
  97. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/extension/eva.py +0 -0
  98. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/__init__.py +0 -0
  99. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/json.py +0 -0
  100. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/matpower.py +0 -0
  101. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/psse.py +0 -0
  102. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/pypower.py +0 -0
  103. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/xlsx.py +0 -0
  104. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/__init__.py +0 -0
  105. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/area.py +0 -0
  106. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/bus.py +0 -0
  107. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/cost.py +0 -0
  108. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/distributed/__init__.py +0 -0
  109. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/distributed/esd1.py +0 -0
  110. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/distributed/ev.py +0 -0
  111. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/distributed/pvd1.py +0 -0
  112. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/group.py +0 -0
  113. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/info.py +0 -0
  114. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/line.py +0 -0
  115. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/region.py +0 -0
  116. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/renewable/__init__.py +0 -0
  117. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/renewable/regc.py +0 -0
  118. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/reserve.py +0 -0
  119. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/shunt.py +0 -0
  120. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/static/__init__.py +0 -0
  121. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/static/gen.py +0 -0
  122. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/static/pq.py +0 -0
  123. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/timeslot.py +0 -0
  124. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/__init__.py +0 -0
  125. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/_compat.py +0 -0
  126. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/__init__.py +0 -0
  127. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/pips.py +0 -0
  128. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/ppoption.py +0 -0
  129. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/ppver.py +0 -0
  130. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/solver.py +0 -0
  131. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/eps.py +0 -0
  132. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/idx.py +0 -0
  133. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/io.py +0 -0
  134. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/make/__init__.py +0 -0
  135. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/make/matrices.py +0 -0
  136. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/make/pdv.py +0 -0
  137. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/__init__.py +0 -0
  138. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/cpf.py +0 -0
  139. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/cpf_callbacks.py +0 -0
  140. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/opffcns.py +0 -0
  141. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/pflow.py +0 -0
  142. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/toggle.py +0 -0
  143. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/utils.py +0 -0
  144. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/cpf.py +0 -0
  145. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/type.py +0 -0
  146. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/utils/__init__.py +0 -0
  147. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/utils/paths.py +0 -0
  148. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/Makefile +0 -0
  149. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/make.bat +0 -0
  150. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/_templates/autosummary/base.rst +0 -0
  151. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/_templates/autosummary/class.rst +0 -0
  152. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/_templates/autosummary/module.rst +0 -0
  153. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/_templates/autosummary/module_toctree.rst +0 -0
  154. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/api.rst +0 -0
  155. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/conf.py +0 -0
  156. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/genmodelref.py +0 -0
  157. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/genroutineref.py +0 -0
  158. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/copyright.rst +0 -0
  159. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/index.rst +0 -0
  160. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/matpower.rst +0 -0
  161. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/psse.rst +0 -0
  162. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/pypower.rst +0 -0
  163. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/xlsx.png +0 -0
  164. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/xlsx.rst +0 -0
  165. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/index.rst +0 -0
  166. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/install.rst +0 -0
  167. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/overview.rst +0 -0
  168. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/testcase.rst +0 -0
  169. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/verification.rst +0 -0
  170. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/dcopf_time.png +0 -0
  171. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/sponsors/CURENT_Logo_NameOnTrans.png +0 -0
  172. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/sponsors/CURENT_Logo_Transparent.png +0 -0
  173. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/sponsors/CURENT_Logo_Transparent_Name.png +0 -0
  174. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/sponsors/doe.png +0 -0
  175. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/index.rst +0 -0
  176. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/example.rst +0 -0
  177. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/index.rst +0 -0
  178. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/model.rst +0 -0
  179. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/routine.rst +0 -0
  180. {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/system.rst +0 -0
  181. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/dependency_links.txt +0 -0
  182. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/entry_points.txt +0 -0
  183. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/requires.txt +0 -0
  184. {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/top_level.txt +0 -0
  185. {ltbams-0.9.12rc1 → ltbams-0.9.13}/pyproject.toml +0 -0
  186. {ltbams-0.9.12rc1 → ltbams-0.9.13}/requirements-extra.txt +0 -0
  187. {ltbams-0.9.12rc1 → ltbams-0.9.13}/requirements.txt +0 -0
  188. {ltbams-0.9.12rc1 → ltbams-0.9.13}/setup.cfg +0 -0
  189. {ltbams-0.9.12rc1 → ltbams-0.9.13}/setup.py +0 -0
  190. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/__init__.py +0 -0
  191. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_addressing.py +0 -0
  192. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_andes_mats.py +0 -0
  193. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_benchmarks.py +0 -0
  194. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_case.py +0 -0
  195. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_group.py +0 -0
  196. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_io.py +0 -0
  197. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_jumper.py +0 -0
  198. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_matp.py +0 -0
  199. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_model.py +0 -0
  200. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_paths.py +0 -0
  201. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_repr.py +0 -0
  202. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_routine.py +0 -0
  203. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_pflow.py +0 -0
  204. {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_service.py +0 -0
  205. {ltbams-0.9.12rc1 → ltbams-0.9.13}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ltbams
3
- Version: 0.9.12rc1
3
+ Version: 0.9.13
4
4
  Summary: Python software for scheduling modeling and co-simulation with dynanics.
5
5
  Home-page: https://github.com/CURENT/ams
6
6
  Author: Jinning Wang
@@ -35,11 +35,12 @@ License-File: LICENSE
35
35
 
36
36
  # LTB AMS
37
37
 
38
- Python Software for Power System Scheduling Modeling and Co-Simulation with Dynanic, serving as the market simulator for the [CURENT Largescale Testbed][LTB Repository].
38
+ Python Software for Power System Scheduling Modeling and Co-Simulation with Dynamics, serving as the market simulator for the [CURENT Largescale Testbed][LTB Repository].
39
39
 
40
40
  [![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-blue.svg)](https://github.com/CURENT/ams/blob/master/LICENSE)
41
41
  ![platforms](https://anaconda.org/conda-forge/ltbams/badges/platforms.svg)
42
42
  [![Python Versions](https://img.shields.io/badge/Python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)](https://www.python.org/)
43
+ [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active)
43
44
  ![Repo Size](https://img.shields.io/github/repo-size/CURENT/ams)
44
45
  [![GitHub last commit (master)](https://img.shields.io/github/last-commit/CURENT/ams/master?label=last%20commit%20to%20master)](https://github.com/CURENT/ams/commits/master/)
45
46
  [![GitHub last commit (develop)](https://img.shields.io/github/last-commit/CURENT/ams/develop?label=last%20commit%20to%20develop)](https://github.com/CURENT/ams/commits/develop/)
@@ -63,7 +64,16 @@ Python Software for Power System Scheduling Modeling and Co-Simulation with Dyna
63
64
 
64
65
  # Why AMS
65
66
 
66
- With the built-in interface with dynamic simulation engine, ANDES, AMS enables Dynamics Interfaced Stability Constrained Production Cost and Market Operation Modeling.
67
+ With the built-in interface with ANDES, AMS enables **Dynamics Incorporated**
68
+ **Stability-Constrained Scheduling**.
69
+
70
+ This package can be helpful for power system engineers, researchers, and students
71
+ who need to conduct scheduling studies and transient stability studies at given
72
+ operating points.
73
+
74
+ AMS is a **Modeling Framework** that provides a descriptive way to formulate
75
+ scheduling problems. The optimization problems are then handled by **CVXPY**
76
+ and solved with third-party solvers.
67
77
 
68
78
  AMS produces credible scheduling results and competitive performance.
69
79
  The following results show the comparison of DCOPF between AMS and other tools.
@@ -94,9 +104,10 @@ Use the following resources to get involved.
94
104
  # Installation
95
105
 
96
106
  ***NOTE:***
97
- - Version **0.9.9** has known issues. Please avoid using this version
107
+ - Version **0.9.9** has known issues and has been yanked from PyPI
98
108
  - `kvxopt` is recommended to install via `conda` as sometimes ``pip`` struggles to set the correct path for compiled libraries
99
109
  - `cvxpy` versions **below 1.5** are incompatible with `numpy` versions **2.0 and above**
110
+ - If solver `SCIP` run into import error, try to reinstall its Python interface by running `pip install pyscipopt --no-binary scip --force`
100
111
 
101
112
  AMS is released as ``ltbams`` on PyPI and conda-forge.
102
113
  Install from PyPI using pip:
@@ -119,15 +130,23 @@ pip install git+https://github.com/CURENT/ams.git
119
130
 
120
131
  # Example Usage
121
132
 
122
- Using AMS to run a Real-Time Economic Dispatch (RTED) simulation:
123
-
124
133
  ```python
125
134
  import ams
135
+ import andes
136
+
137
+ ss = ams.load(ams.get_case('ieee14/ieee14_uced.xlsx'))
138
+
139
+ # solve RTED
140
+ ss.RTED.run(solver='CLARABEL')
126
141
 
127
- ss = ams.load(ams.get_case('ieee14_uced.xlsx'))
128
- ss.RTED.run()
142
+ ss.RTED.pg.v
143
+ >>> array([1.8743862, 0.3226138, 0.01 , 0.02 , 0.01 ])
129
144
 
130
- print(ss.RTED.pg.v)
145
+ # convert to ANDES case
146
+ sa = ss.to_andes(addfile=andes.get_case('ieee14/ieee14_full.xlsx'),
147
+ setup=True, verify=False)
148
+ sa
149
+ >>> <andes.system.System at 0x14bd98190>
131
150
  ```
132
151
 
133
152
  # Sponsors and Contributors
@@ -1,10 +1,11 @@
1
1
  # LTB AMS
2
2
 
3
- Python Software for Power System Scheduling Modeling and Co-Simulation with Dynanic, serving as the market simulator for the [CURENT Largescale Testbed][LTB Repository].
3
+ Python Software for Power System Scheduling Modeling and Co-Simulation with Dynamics, serving as the market simulator for the [CURENT Largescale Testbed][LTB Repository].
4
4
 
5
5
  [![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-blue.svg)](https://github.com/CURENT/ams/blob/master/LICENSE)
6
6
  ![platforms](https://anaconda.org/conda-forge/ltbams/badges/platforms.svg)
7
7
  [![Python Versions](https://img.shields.io/badge/Python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)](https://www.python.org/)
8
+ [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active)
8
9
  ![Repo Size](https://img.shields.io/github/repo-size/CURENT/ams)
9
10
  [![GitHub last commit (master)](https://img.shields.io/github/last-commit/CURENT/ams/master?label=last%20commit%20to%20master)](https://github.com/CURENT/ams/commits/master/)
10
11
  [![GitHub last commit (develop)](https://img.shields.io/github/last-commit/CURENT/ams/develop?label=last%20commit%20to%20develop)](https://github.com/CURENT/ams/commits/develop/)
@@ -28,7 +29,16 @@ Python Software for Power System Scheduling Modeling and Co-Simulation with Dyna
28
29
 
29
30
  # Why AMS
30
31
 
31
- With the built-in interface with dynamic simulation engine, ANDES, AMS enables Dynamics Interfaced Stability Constrained Production Cost and Market Operation Modeling.
32
+ With the built-in interface with ANDES, AMS enables **Dynamics Incorporated**
33
+ **Stability-Constrained Scheduling**.
34
+
35
+ This package can be helpful for power system engineers, researchers, and students
36
+ who need to conduct scheduling studies and transient stability studies at given
37
+ operating points.
38
+
39
+ AMS is a **Modeling Framework** that provides a descriptive way to formulate
40
+ scheduling problems. The optimization problems are then handled by **CVXPY**
41
+ and solved with third-party solvers.
32
42
 
33
43
  AMS produces credible scheduling results and competitive performance.
34
44
  The following results show the comparison of DCOPF between AMS and other tools.
@@ -59,9 +69,10 @@ Use the following resources to get involved.
59
69
  # Installation
60
70
 
61
71
  ***NOTE:***
62
- - Version **0.9.9** has known issues. Please avoid using this version
72
+ - Version **0.9.9** has known issues and has been yanked from PyPI
63
73
  - `kvxopt` is recommended to install via `conda` as sometimes ``pip`` struggles to set the correct path for compiled libraries
64
74
  - `cvxpy` versions **below 1.5** are incompatible with `numpy` versions **2.0 and above**
75
+ - If solver `SCIP` run into import error, try to reinstall its Python interface by running `pip install pyscipopt --no-binary scip --force`
65
76
 
66
77
  AMS is released as ``ltbams`` on PyPI and conda-forge.
67
78
  Install from PyPI using pip:
@@ -84,15 +95,23 @@ pip install git+https://github.com/CURENT/ams.git
84
95
 
85
96
  # Example Usage
86
97
 
87
- Using AMS to run a Real-Time Economic Dispatch (RTED) simulation:
88
-
89
98
  ```python
90
99
  import ams
100
+ import andes
101
+
102
+ ss = ams.load(ams.get_case('ieee14/ieee14_uced.xlsx'))
103
+
104
+ # solve RTED
105
+ ss.RTED.run(solver='CLARABEL')
91
106
 
92
- ss = ams.load(ams.get_case('ieee14_uced.xlsx'))
93
- ss.RTED.run()
107
+ ss.RTED.pg.v
108
+ >>> array([1.8743862, 0.3226138, 0.01 , 0.02 , 0.01 ])
94
109
 
95
- print(ss.RTED.pg.v)
110
+ # convert to ANDES case
111
+ sa = ss.to_andes(addfile=andes.get_case('ieee14/ieee14_full.xlsx'),
112
+ setup=True, verify=False)
113
+ sa
114
+ >>> <andes.system.System at 0x14bd98190>
96
115
  ```
97
116
 
98
117
  # Sponsors and Contributors
@@ -1,6 +1,7 @@
1
1
  from . import _version
2
2
  __version__ = _version.get_versions()['version']
3
3
 
4
+ from ams import opt # NOQA
4
5
  from ams import benchmarks # NOQA
5
6
 
6
7
  from ams.main import config_logger, load, run # NOQA
@@ -10,4 +11,4 @@ from ams.shared import ppc2df # NOQA
10
11
 
11
12
  __author__ = 'Jining Wang'
12
13
 
13
- __all__ = ['System', 'get_case', 'System']
14
+ __all__ = ['System', 'get_case']
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-11-14T17:13:01-0500",
11
+ "date": "2024-12-05T16:49:45-0500",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "45fb4203850186bec30f88e946f06a972e8de216",
15
- "version": "0.9.12rc1"
14
+ "full-revisionid": "db9279e8765429827062032b803c756025c018b2",
15
+ "version": "0.9.13"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -223,9 +223,10 @@ class RDocumenter:
223
223
  # add tables
224
224
  self.parent.syms.generate_symbols()
225
225
  out += self._obj_doc(max_width=max_width, export=export)
226
- out += self._constr_doc(max_width=max_width, export=export)
227
226
  out += self._expr_doc(max_width=max_width, export=export)
227
+ out += self._constr_doc(max_width=max_width, export=export)
228
228
  out += self._var_doc(max_width=max_width, export=export)
229
+ out += self._exprc_doc(max_width=max_width, export=export)
229
230
  out += self._service_doc(max_width=max_width, export=export)
230
231
  out += self._param_doc(max_width=max_width, export=export)
231
232
  out += self.config.doc(max_width=max_width, export=export)
@@ -316,17 +317,26 @@ class RDocumenter:
316
317
  rest_dict=rest_dict)
317
318
 
318
319
  def _expr_doc(self, max_width=78, export='plain'):
319
- # expression documentation
320
+ # Expression documentation
320
321
  if len(self.parent.exprs) == 0:
321
322
  return ''
322
323
 
323
324
  # prepare temporary lists
324
- names, var_names, info = list(), list(), list()
325
+ names, info = list(), list()
326
+ units, sources, units_rest = list(), list(), list()
325
327
 
326
328
  for p in self.parent.exprs.values():
327
329
  names.append(p.name)
328
- var_names.append(p.var)
329
330
  info.append(p.info if p.info else '')
331
+ units.append(p.unit if p.unit else '')
332
+ units_rest.append(f'*{p.unit}*' if p.unit else '')
333
+
334
+ slist = []
335
+ if p.owner is not None and p.src is not None:
336
+ slist.append(f'{p.owner.class_name}.{p.src}')
337
+ elif p.owner is not None and p.src is None:
338
+ slist.append(f'{p.owner.class_name}')
339
+ sources.append(','.join(slist))
330
340
 
331
341
  # expressions based on output format
332
342
  expressions = []
@@ -342,13 +352,67 @@ class RDocumenter:
342
352
  expressions = math_wrap(expressions, export=export)
343
353
 
344
354
  plain_dict = OrderedDict([('Name', names),
345
- ('Variable', var_names),
346
355
  ('Description', info),
356
+ ('Unit', units),
357
+ ])
358
+ rest_dict = OrderedDict([('Name', names),
359
+ ('Description', info),
360
+ ('Expression', expressions),
361
+ ('Unit', units_rest),
362
+ ('Source', sources),
363
+ ])
364
+
365
+ # convert to rows and export as table
366
+ return make_doc_table(title=title,
367
+ max_width=max_width,
368
+ export=export,
369
+ plain_dict=plain_dict,
370
+ rest_dict=rest_dict)
371
+
372
+ def _exprc_doc(self, max_width=78, export='plain'):
373
+ # ExpressionCalc documentation
374
+ if len(self.parent.exprcs) == 0:
375
+ return ''
376
+
377
+ # prepare temporary lists
378
+ names, info = list(), list()
379
+ units, sources, units_rest = list(), list(), list()
380
+
381
+ for p in self.parent.exprcs.values():
382
+ names.append(p.name)
383
+ info.append(p.info if p.info else '')
384
+ units.append(p.unit if p.unit else '')
385
+ units_rest.append(f'*{p.unit}*' if p.unit else '')
386
+
387
+ slist = []
388
+ if p.owner is not None and p.src is not None:
389
+ slist.append(f'{p.owner.class_name}.{p.src}')
390
+ elif p.owner is not None and p.src is None:
391
+ slist.append(f'{p.owner.class_name}')
392
+ sources.append(','.join(slist))
393
+
394
+ # expressions based on output format
395
+ expressions = []
396
+ if export == 'rest':
397
+ for p in self.parent.exprcs.values():
398
+ expr = _tex_pre(self, p, self.parent.syms.tex_map)
399
+ logger.debug(f'{p.name} math: {expr}')
400
+ expressions.append(expr)
401
+
402
+ title = 'ExpressionCalcs\n----------------------------------'
403
+ else:
404
+ title = 'ExpressionCalcs'
405
+ expressions = math_wrap(expressions, export=export)
406
+
407
+ plain_dict = OrderedDict([('Name', names),
408
+ ('Description', info),
409
+ ('Unit', units),
347
410
  ])
348
411
  rest_dict = OrderedDict([('Name', names),
349
- ('Variable', var_names),
350
412
  ('Description', info),
351
413
  ('Expression', expressions),
414
+ ('Unit', units_rest),
415
+ ('Source', sources),
352
416
  ])
353
417
 
354
418
  # convert to rows and export as table
@@ -423,6 +487,8 @@ class RDocumenter:
423
487
  slist = []
424
488
  if p.owner is not None and p.src is not None:
425
489
  slist.append(f'{p.owner.class_name}.{p.src}')
490
+ elif p.owner is not None and p.src is None:
491
+ slist.append(f'{p.owner.class_name}')
426
492
  sources.append(','.join(slist))
427
493
 
428
494
  # symbols based on output format
@@ -490,6 +556,8 @@ class RDocumenter:
490
556
  slist = []
491
557
  if p.owner is not None and p.src is not None:
492
558
  slist.append(f'{p.owner.class_name}.{p.src}')
559
+ elif p.owner is not None and p.src is None:
560
+ slist.append(f'{p.owner.class_name}')
493
561
  sources.append(','.join(slist))
494
562
 
495
563
  # symbols based on output format
@@ -13,7 +13,7 @@ from andes.thirdparty.npfunc import safe_div
13
13
  from andes.shared import tqdm, tqdm_nb
14
14
  from andes.utils.misc import elapsed, is_notebook
15
15
 
16
- from ams.opt.omodel import Param
16
+ from ams.opt import Param
17
17
  from ams.shared import pd, sps
18
18
 
19
19
  logger = logging.getLogger(__name__)
@@ -140,7 +140,9 @@ class MParam(Param):
140
140
 
141
141
  class MatProcessor:
142
142
  """
143
- Class for matrix processing in AMS system.
143
+ Class for matrices processing in AMS system.
144
+ The connectivity matrices `Cft`, `Cg`, `Cl`, and `Csh` ***have taken*** the
145
+ devices connectivity into account.
144
146
 
145
147
  The MParams' row names and col names are assigned in `System.setup()`.
146
148
  """
@@ -10,7 +10,7 @@ from typing import Optional, Iterable
10
10
  import numpy as np
11
11
  from scipy.sparse import issparse
12
12
 
13
- from ams.opt.omodel import Param
13
+ from ams.opt import Param
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
@@ -10,7 +10,7 @@ import scipy.sparse as spr
10
10
 
11
11
  from andes.core.service import BaseService
12
12
 
13
- from ams.opt.omodel import Param
13
+ from ams.opt import Param
14
14
 
15
15
 
16
16
  logger = logging.getLogger(__name__)
@@ -33,8 +33,6 @@ class RBaseService(BaseService, Param):
33
33
  Description.
34
34
  vtype : Type, optional
35
35
  Variable type.
36
- model : str, optional
37
- Model name.
38
36
  no_parse: bool, optional
39
37
  True to skip parsing the service.
40
38
  sparse: bool, optional
@@ -106,8 +104,8 @@ class ValueService(RBaseService):
106
104
  Description.
107
105
  vtype : Type, optional
108
106
  Variable type.
109
- model : str, optional
110
- Model name.
107
+ no_parse: bool, optional
108
+ True to skip parsing the service.
111
109
  sparse: bool, optional
112
110
  True to return output as scipy csr_matrix.
113
111
  """
@@ -155,8 +153,8 @@ class ROperationService(RBaseService):
155
153
  Description.
156
154
  vtype : Type, optional
157
155
  Variable type.
158
- model : str, optional
159
- Model name.
156
+ no_parse: bool, optional
157
+ True to skip parsing the service.
160
158
  sparse: bool, optional
161
159
  True to return output as scipy csr_matrix.
162
160
  """
@@ -194,6 +192,8 @@ class LoadScale(ROperationService):
194
192
  Unit.
195
193
  info : str, optional
196
194
  Description.
195
+ no_parse: bool, optional
196
+ True to skip parsing the service.
197
197
  sparse: bool, optional
198
198
  True to return output as scipy csr_matrix.
199
199
  """
@@ -236,7 +236,7 @@ class NumOp(ROperationService):
236
236
 
237
237
  Note that the scalar output is converted to a 1D array.
238
238
 
239
- The optional kwargs are passed to the input function.
239
+ The `rargs` are passed to the input function.
240
240
 
241
241
  Parameters
242
242
  ----------
@@ -397,8 +397,6 @@ class NumOpDual(NumOp):
397
397
  Description.
398
398
  vtype : Type, optional
399
399
  Variable type.
400
- model : str, optional
401
- Model name.
402
400
  rfun : Callable, optional
403
401
  Function to apply to the output of ``fun``.
404
402
  rargs : dict, optional
@@ -407,6 +405,8 @@ class NumOpDual(NumOp):
407
405
  Expand the dimensions of the output array along a specified axis.
408
406
  array_out : bool, optional
409
407
  Whether to force the output to be an array.
408
+ no_parse: bool, optional
409
+ True to skip parsing the service.
410
410
  sparse: bool, optional
411
411
  True to return output as scipy csr_matrix.
412
412
  """
@@ -467,6 +467,10 @@ class MinDur(NumOpDual):
467
467
  Unit.
468
468
  info : str, optional
469
469
  Description.
470
+ vtype : Type, optional
471
+ Variable type.
472
+ no_parse: bool, optional
473
+ True to skip parsing the service.
470
474
  sparse: bool, optional
471
475
  True to return output as scipy csr_matrix.
472
476
  """
@@ -537,8 +541,12 @@ class NumHstack(NumOp):
537
541
  Description.
538
542
  vtype : Type, optional
539
543
  Variable type.
540
- model : str, optional
541
- Model name.
544
+ rfun : Callable, optional
545
+ Function to apply to the output of ``fun``.
546
+ rargs : dict, optional
547
+ Keyword arguments to pass to ``rfun``.
548
+ no_parse: bool, optional
549
+ True to skip parsing the service.
542
550
  sparse: bool, optional
543
551
  True to return output as scipy csr_matrix.
544
552
  """
@@ -624,8 +632,12 @@ class ZonalSum(NumOp):
624
632
  Description.
625
633
  vtype : Type
626
634
  Variable type.
627
- model : str
628
- Model name.
635
+ rfun : Callable, optional
636
+ Function to apply to the output of ``fun``.
637
+ rargs : dict, optional
638
+ Keyword arguments to pass to ``rfun``.
639
+ no_parse: bool, optional
640
+ True to skip parsing the service.
629
641
  sparse: bool, optional
630
642
  True to return output as scipy csr_matrix.
631
643
  """
@@ -676,7 +688,7 @@ class VarSelect(NumOp):
676
688
  A numerical matrix to select a subset of a 2D variable,
677
689
  ``u.v[:, idx]``.
678
690
 
679
- For example, if nned to select Energy Storage output
691
+ For example, if need to select Energy Storage output
680
692
  power from StaticGen `pg`, following definition can be used:
681
693
  ```python
682
694
  class RTED:
@@ -709,6 +721,8 @@ class VarSelect(NumOp):
709
721
  Keyword arguments to pass to ``rfun``.
710
722
  array_out : bool, optional
711
723
  Whether to force the output to be an array.
724
+ no_parse: bool, optional
725
+ True to skip parsing the service.
712
726
  sparse: bool, optional
713
727
  True to return output as scipy csr_matrix.
714
728
  """
@@ -790,7 +804,7 @@ class VarReduction(NumOp):
790
804
  u : Callable
791
805
  The input matrix variable.
792
806
  fun : Callable
793
- The reduction function that takes a shape parameter (1D shape) as input.
807
+ The reduction function that takes a shape argument (1D shape) as input.
794
808
  name : str, optional
795
809
  The name of the instance.
796
810
  tex_name : str, optional
@@ -801,8 +815,12 @@ class VarReduction(NumOp):
801
815
  A description of the operation.
802
816
  vtype : Type, optional
803
817
  The variable type.
804
- model : str, optional
805
- The model name associated with the operation.
818
+ rfun : Callable, optional
819
+ Function to apply to the output of ``fun``.
820
+ rargs : dict, optional
821
+ Keyword arguments to pass to ``rfun``.
822
+ no_parse: bool, optional
823
+ True to skip parsing the service.
806
824
  sparse: bool, optional
807
825
  True to return output as scipy csr_matrix.
808
826
  """
@@ -818,13 +836,11 @@ class VarReduction(NumOp):
818
836
  rfun: Callable = None,
819
837
  rargs: dict = None,
820
838
  no_parse: bool = False,
821
- sparse: bool = False,
822
- **kwargs):
839
+ sparse: bool = False,):
823
840
  super().__init__(name=name, tex_name=tex_name, unit=unit,
824
841
  info=info, vtype=vtype,
825
842
  u=u, fun=None, rfun=rfun, rargs=rargs,
826
- no_parse=no_parse, sparse=sparse,
827
- **kwargs)
843
+ no_parse=no_parse, sparse=sparse,)
828
844
  self.fun = fun
829
845
 
830
846
  @property
@@ -859,8 +875,12 @@ class RampSub(NumOp):
859
875
  Description.
860
876
  vtype : Type
861
877
  Variable type.
862
- model : str
863
- Model name.
878
+ rfun : Callable, optional
879
+ Function to apply to the output of ``fun``.
880
+ rargs : dict, optional
881
+ Keyword arguments to pass to ``rfun``.
882
+ no_parse: bool, optional
883
+ True to skip parsing the service.
864
884
  sparse: bool, optional
865
885
  True to return output as scipy csr_matrix.
866
886
  """
@@ -89,6 +89,9 @@ class SymProcessor:
89
89
  (r'(== 0|<= 0)$', ''), # remove the comparison operator
90
90
  (r'cp\.(Minimize|Maximize)', r'float'), # remove cp.Minimize/Maximize
91
91
  (r'\bcp.\b', 'np.'),
92
+ (r'\bexp\b', 'np.exp'),
93
+ (r'\blog\b', 'np.log'),
94
+ (r'\bconj\b', 'np.conj'),
92
95
  ])
93
96
 
94
97
  self.status = {
@@ -124,9 +127,7 @@ class SymProcessor:
124
127
 
125
128
  # Vars
126
129
  for vname, var in self.parent.vars.items():
127
- tmp = sp.symbols(f'{var.name}')
128
- # tmp = sp.symbols(var.name)
129
- self.inputs_dict[vname] = tmp
130
+ self.inputs_dict[vname] = sp.symbols(f'{vname}')
130
131
  self.sub_map[rf"\b{vname}\b"] = f"self.om.{vname}"
131
132
  self.tex_map[rf"\b{vname}\b"] = rf'{var.tex_name}'
132
133
  self.val_map[rf"\b{vname}\b"] = f"rtn.{vname}.v"
@@ -163,6 +164,13 @@ class SymProcessor:
163
164
  if not service.no_parse:
164
165
  self.val_map[rf"\b{sname}\b"] = f"rtn.{sname}.v"
165
166
 
167
+ # Expressions
168
+ for ename, expr in self.parent.exprs.items():
169
+ self.inputs_dict[ename] = sp.symbols(f'{ename}')
170
+ self.sub_map[rf"\b{ename}\b"] = f"self.om.{ename}"
171
+ self.val_map[rf"\b{ename}\b"] = f"rtn.{ename}.v"
172
+ self.tex_map[rf"\b{ename}\b"] = f'{expr.tex_name}'
173
+
166
174
  # Constraints
167
175
  # NOTE: constraints are included in sub_map for ExpressionCalc
168
176
  # thus, they don't have the suffix `.v`