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.
- {ltbams-0.9.12rc1/ltbams.egg-info → ltbams-0.9.13}/PKG-INFO +28 -9
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/README.md +27 -8
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/__init__.py +2 -1
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/_version.py +3 -3
- ltbams-0.9.13/ams/cases/5bus/pjm5bus_demo.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/documenter.py +74 -6
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/matprocessor.py +4 -2
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/param.py +1 -1
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/service.py +44 -24
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/symprocessor.py +11 -3
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/interface.py +105 -13
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/main.py +4 -2
- ltbams-0.9.13/ams/opt/__init__.py +12 -0
- ltbams-0.9.13/ams/opt/constraint.py +172 -0
- ltbams-0.9.13/ams/opt/exprcalc.py +139 -0
- ltbams-0.9.13/ams/opt/expression.py +200 -0
- ltbams-0.9.13/ams/opt/objective.py +174 -0
- ltbams-0.9.13/ams/opt/omodel.py +432 -0
- ltbams-0.9.13/ams/opt/optbase.py +155 -0
- ltbams-0.9.13/ams/opt/param.py +156 -0
- ltbams-0.9.13/ams/opt/var.py +245 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/opf.py +1 -1
- ltbams-0.9.13/ams/report.py +356 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/__init__.py +2 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/acopf.py +9 -12
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/dcopf.py +67 -207
- ltbams-0.9.13/ams/routines/dcpf.py +209 -0
- ltbams-0.9.12rc1/ams/routines/dcpf.py → ltbams-0.9.13/ams/routines/dcpf0.py +11 -3
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/dopf.py +1 -1
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/ed.py +10 -8
- ltbams-0.9.13/ams/routines/pflow.py +255 -0
- ltbams-0.9.12rc1/ams/routines/pflow.py → ltbams-0.9.13/ams/routines/pflow0.py +7 -5
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/routine.py +80 -32
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/rted.py +22 -19
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/uc.py +10 -7
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/shared.py +6 -4
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/system.py +13 -4
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/examples/index.rst +2 -1
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/release-notes.rst +79 -46
- {ltbams-0.9.12rc1 → ltbams-0.9.13/ltbams.egg-info}/PKG-INFO +28 -9
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/SOURCES.txt +12 -1
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_1st_system.py +1 -1
- ltbams-0.9.13/tests/test_cli.py +34 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_export_csv.py +8 -4
- ltbams-0.9.12rc1/tests/test_interop.py → ltbams-0.9.13/tests/test_interface.py +40 -3
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_known_good.py +4 -2
- ltbams-0.9.13/tests/test_omodel.py +119 -0
- ltbams-0.9.13/tests/test_report.py +245 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_dcopf.py +24 -0
- ltbams-0.9.13/tests/test_rtn_dcpf.py +77 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_ed.py +99 -8
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_rted.py +112 -15
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_uc.py +86 -3
- ltbams-0.9.12rc1/ams/cases/5bus/pjm5bus_demo.xlsx +0 -0
- ltbams-0.9.12rc1/ams/opt/__init__.py +0 -5
- ltbams-0.9.12rc1/ams/opt/omodel.py +0 -1223
- ltbams-0.9.12rc1/ams/report.py +0 -200
- ltbams-0.9.12rc1/tests/test_cli.py +0 -13
- ltbams-0.9.12rc1/tests/test_report.py +0 -76
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/CONTRIBUTING.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/LICENSE +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/MANIFEST.in +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/__main__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/benchmarks.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_jumper.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_uced.json +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_uced.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_uced_esd1.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/5bus/pjm5bus_uced_ev.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee123/ieee123.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee123/ieee123_regcv1.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee14/ieee14.json +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee14/ieee14.raw +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee14/ieee14_uced.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39_uced.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39_uced_esd1.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39_uced_pvd1.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/ieee39/ieee39_uced_vis.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/benchmark.json +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case118.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case14.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case300.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case39.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case5.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/matpower/case_ACTIVSg2000.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/npcc/npcc.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/npcc/npcc_uced.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/pglib/pglib_opf_case39_epri__api.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/wecc/wecc.m +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cases/wecc/wecc_uced.xlsx +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/cli.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/model.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/core/var.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/extension/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/extension/eva.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/json.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/matpower.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/psse.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/pypower.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/io/xlsx.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/area.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/bus.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/cost.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/distributed/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/distributed/esd1.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/distributed/ev.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/distributed/pvd1.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/group.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/info.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/line.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/region.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/renewable/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/renewable/regc.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/reserve.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/shunt.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/static/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/static/gen.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/static/pq.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/models/timeslot.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/_compat.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/pips.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/ppoption.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/ppver.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/core/solver.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/eps.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/idx.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/io.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/make/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/make/matrices.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/make/pdv.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/cpf.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/cpf_callbacks.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/opffcns.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/routines/pflow.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/toggle.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/pypower/utils.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/cpf.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/routines/type.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/utils/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ams/utils/paths.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/Makefile +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/make.bat +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/_templates/autosummary/base.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/_templates/autosummary/class.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/_templates/autosummary/module.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/_templates/autosummary/module_toctree.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/api.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/conf.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/genmodelref.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/genroutineref.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/copyright.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/index.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/matpower.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/psse.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/pypower.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/xlsx.png +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/formats/xlsx.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/index.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/install.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/overview.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/testcase.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/getting_started/verification.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/dcopf_time.png +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/sponsors/CURENT_Logo_NameOnTrans.png +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/sponsors/CURENT_Logo_Transparent.png +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/sponsors/CURENT_Logo_Transparent_Name.png +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/images/sponsors/doe.png +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/index.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/example.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/index.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/model.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/routine.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/docs/source/modeling/system.rst +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/dependency_links.txt +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/entry_points.txt +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/requires.txt +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/ltbams.egg-info/top_level.txt +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/pyproject.toml +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/requirements-extra.txt +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/requirements.txt +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/setup.cfg +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/setup.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/__init__.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_addressing.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_andes_mats.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_benchmarks.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_case.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_group.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_io.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_jumper.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_matp.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_model.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_paths.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_repr.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_routine.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_rtn_pflow.py +0 -0
- {ltbams-0.9.12rc1 → ltbams-0.9.13}/tests/test_service.py +0 -0
- {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.
|
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
|
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
|
[](https://github.com/CURENT/ams/blob/master/LICENSE)
|
41
41
|

|
42
42
|
[](https://www.python.org/)
|
43
|
+
[](https://www.repostatus.org/#active)
|
43
44
|

|
44
45
|
[](https://github.com/CURENT/ams/commits/master/)
|
45
46
|
[](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
|
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
|
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
|
128
|
-
|
142
|
+
ss.RTED.pg.v
|
143
|
+
>>> array([1.8743862, 0.3226138, 0.01 , 0.02 , 0.01 ])
|
129
144
|
|
130
|
-
|
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
|
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
|
[](https://github.com/CURENT/ams/blob/master/LICENSE)
|
6
6
|

|
7
7
|
[](https://www.python.org/)
|
8
|
+
[](https://www.repostatus.org/#active)
|
8
9
|

|
9
10
|
[](https://github.com/CURENT/ams/commits/master/)
|
10
11
|
[](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
|
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
|
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
|
93
|
-
|
107
|
+
ss.RTED.pg.v
|
108
|
+
>>> array([1.8743862, 0.3226138, 0.01 , 0.02 , 0.01 ])
|
94
109
|
|
95
|
-
|
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'
|
14
|
+
__all__ = ['System', 'get_case']
|
@@ -8,11 +8,11 @@ import json
|
|
8
8
|
|
9
9
|
version_json = '''
|
10
10
|
{
|
11
|
-
"date": "2024-
|
11
|
+
"date": "2024-12-05T16:49:45-0500",
|
12
12
|
"dirty": false,
|
13
13
|
"error": null,
|
14
|
-
"full-revisionid": "
|
15
|
-
"version": "0.9.
|
14
|
+
"full-revisionid": "db9279e8765429827062032b803c756025c018b2",
|
15
|
+
"version": "0.9.13"
|
16
16
|
}
|
17
17
|
''' # END VERSION_JSON
|
18
18
|
|
Binary file
|
@@ -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
|
-
#
|
320
|
+
# Expression documentation
|
320
321
|
if len(self.parent.exprs) == 0:
|
321
322
|
return ''
|
322
323
|
|
323
324
|
# prepare temporary lists
|
324
|
-
names,
|
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
|
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
|
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 @@ import scipy.sparse as spr
|
|
10
10
|
|
11
11
|
from andes.core.service import BaseService
|
12
12
|
|
13
|
-
from ams.opt
|
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
|
-
|
110
|
-
|
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
|
-
|
159
|
-
|
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
|
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
|
-
|
541
|
-
|
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
|
-
|
628
|
-
|
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
|
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
|
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
|
-
|
805
|
-
|
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
|
-
|
863
|
-
|
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
|
-
|
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`
|