fmdtools 2.3.3__tar.gz → 2.5.0__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 (135) hide show
  1. {fmdtools-2.3.3 → fmdtools-2.5.0}/LICENSE +1 -1
  2. {fmdtools-2.3.3/fmdtools.egg-info → fmdtools-2.5.0}/PKG-INFO +22 -20
  3. {fmdtools-2.3.3 → fmdtools-2.5.0}/README.md +17 -15
  4. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airport_taxiway/model_asset.py +4 -1
  5. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airport_taxiway/model_main.py +2 -0
  6. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/__init__.py +2 -1
  7. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/aircraftarchitecture.py +2 -1
  8. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/arch/controlflight.py +9 -0
  9. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/contingency_management/model_aircraft.py +7 -7
  10. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/contingency_management/model_environment.py +15 -12
  11. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/contingency_management/model_flightplanner.py +13 -8
  12. fmdtools-2.5.0/examples/airspacelib/water_rescue/__init__.py +23 -0
  13. fmdtools-2.5.0/examples/airspacelib/water_rescue/model_drone.py +138 -0
  14. fmdtools-2.5.0/examples/airspacelib/water_rescue/model_environment.py +170 -0
  15. fmdtools-2.5.0/examples/airspacelib/water_rescue/model_main.py +33 -0
  16. fmdtools-2.5.0/examples/airspacelib/water_rescue/model_responder.py +307 -0
  17. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/cooling_tank/model_main.py +2 -2
  18. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/cooling_tank/test_tank.py +1 -0
  19. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/multirotor_drone/model_hierarchical.py +6 -0
  20. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/multirotor_drone/model_rural.py +2 -2
  21. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/multirotor_drone/model_urban.py +2 -2
  22. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/multirotor_drone/script_opt_model_rural.py +3 -0
  23. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/model_main.py +14 -15
  24. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/script_jointfaults.py +1 -1
  25. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/test_pump_stochastic.py +1 -1
  26. {fmdtools-2.3.3 → fmdtools-2.5.0/fmdtools.egg-info}/PKG-INFO +22 -20
  27. {fmdtools-2.3.3 → fmdtools-2.5.0}/fmdtools.egg-info/SOURCES.txt +8 -1
  28. {fmdtools-2.3.3 → fmdtools-2.5.0}/fmdtools.egg-info/requires.txt +1 -1
  29. {fmdtools-2.3.3 → fmdtools-2.5.0}/pyproject.toml +4 -4
  30. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/__init__.py +1 -1
  31. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/graph/style.py +5 -3
  32. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/tabulate.py +1 -1
  33. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/__init__.py +1 -0
  34. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/architecture/action.py +34 -12
  35. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/architecture/base.py +78 -72
  36. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/architecture/function.py +33 -0
  37. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/architecture/geom.py +80 -77
  38. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/base.py +102 -1
  39. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/block/action.py +4 -5
  40. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/block/base.py +18 -51
  41. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/block/function.py +18 -0
  42. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/container/base.py +153 -47
  43. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/container/mode.py +22 -14
  44. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/container/parameter.py +30 -24
  45. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/container/rand.py +56 -30
  46. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/container/state.py +0 -5
  47. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/container/time.py +11 -1
  48. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/environment.py +42 -57
  49. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/flow/base.py +7 -15
  50. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/flow/commsflow.py +28 -8
  51. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/flow/multiflow.py +65 -23
  52. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/object/base.py +189 -1
  53. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/object/coords.py +143 -15
  54. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/object/geom.py +193 -153
  55. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/object/timer.py +8 -13
  56. fmdtools-2.5.0/src/fmdtools/define/pathplan.py +1425 -0
  57. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/sim/propagate.py +6 -3
  58. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/sim/sample.py +6 -13
  59. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/sim/scenario.py +13 -13
  60. {fmdtools-2.3.3 → fmdtools-2.5.0}/tests/common.py +14 -4
  61. {fmdtools-2.3.3 → fmdtools-2.5.0}/tests/test_hierarchical.py +1 -0
  62. fmdtools-2.5.0/tests/test_pathplan.py +788 -0
  63. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/__init__.py +0 -0
  64. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airport_taxiway/model_atc.py +0 -0
  65. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airport_taxiway/model_common.py +0 -0
  66. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airport_taxiway/test_asset.py +0 -0
  67. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airport_taxiway/test_model.py +0 -0
  68. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/__init__.py +0 -0
  69. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/aircraft.py +0 -0
  70. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/arch/__init__.py +0 -0
  71. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/arch/aviate.py +0 -0
  72. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/arch/flows.py +0 -0
  73. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/arch/holdpayload.py +0 -0
  74. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/arch/perceiveenvironment.py +0 -0
  75. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/arch/storeee.py +0 -0
  76. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/parameter.py +0 -0
  77. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/base/state.py +0 -0
  78. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/contingency_management/__init__.py +0 -0
  79. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/wildfire_response/__init__.py +0 -0
  80. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/wildfire_response/model_aircraft.py +0 -0
  81. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/wildfire_response/model_environment.py +0 -0
  82. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/airspacelib/wildfire_response/model_main.py +0 -0
  83. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/cooling_tank/__init__.py +0 -0
  84. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/cooling_tank/model_optimization.py +0 -0
  85. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/electric_power_system/__init__.py +0 -0
  86. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/electric_power_system/model_main.py +0 -0
  87. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/electric_power_system/test_model.py +0 -0
  88. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/human_hazard_mitigation/__init__.py +0 -0
  89. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/human_hazard_mitigation/model_main.py +0 -0
  90. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/multirotor_drone/__init__.py +0 -0
  91. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/multirotor_drone/model_dynamic.py +0 -0
  92. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/multirotor_drone/model_static.py +0 -0
  93. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/multirotor_drone/test_multirotor.py +0 -0
  94. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/__init__.py +0 -0
  95. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/model_degradation.py +0 -0
  96. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/model_human.py +0 -0
  97. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/model_troupe.py +0 -0
  98. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/script_ea_analysis.py +0 -0
  99. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/script_mode_space.py +0 -0
  100. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/script_search_rover.py +0 -0
  101. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/navigating_rover/test_rover.py +0 -0
  102. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/state_communication/__init__.py +0 -0
  103. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/state_communication/model_main.py +0 -0
  104. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/state_communication/test_multiflow.py +0 -0
  105. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/__init__.py +0 -0
  106. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/model_indiv.py +0 -0
  107. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/model_main.py +0 -0
  108. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/model_stochastic.py +0 -0
  109. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/script_parallelism.py +0 -0
  110. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/test_pump.py +0 -0
  111. {fmdtools-2.3.3 → fmdtools-2.5.0}/examples/water_pump/test_pump_example.py +0 -0
  112. {fmdtools-2.3.3 → fmdtools-2.5.0}/fmdtools.egg-info/dependency_links.txt +0 -0
  113. {fmdtools-2.3.3 → fmdtools-2.5.0}/fmdtools.egg-info/top_level.txt +0 -0
  114. {fmdtools-2.3.3 → fmdtools-2.5.0}/setup.cfg +0 -0
  115. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/__init__.py +0 -0
  116. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/common.py +0 -0
  117. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/graph/__init__.py +0 -0
  118. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/graph/base.py +0 -0
  119. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/graph/label.py +0 -0
  120. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/graph/model.py +0 -0
  121. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/history.py +0 -0
  122. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/phases.py +0 -0
  123. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/analyze/result.py +0 -0
  124. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/architecture/__init__.py +0 -0
  125. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/architecture/component.py +0 -0
  126. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/block/__init__.py +0 -0
  127. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/block/component.py +0 -0
  128. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/container/__init__.py +0 -0
  129. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/flow/__init__.py +0 -0
  130. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/define/object/__init__.py +0 -0
  131. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/sim/__init__.py +0 -0
  132. {fmdtools-2.3.3 → fmdtools-2.5.0}/src/fmdtools/sim/search.py +0 -0
  133. {fmdtools-2.3.3 → fmdtools-2.5.0}/tests/__init__.py +0 -0
  134. {fmdtools-2.3.3 → fmdtools-2.5.0}/tests/test_graph.py +0 -0
  135. {fmdtools-2.3.3 → fmdtools-2.5.0}/tests/test_packages.py +0 -0
@@ -1,4 +1,4 @@
1
- fmdtools version 2.3.3
1
+ fmdtools version 2.5.0
2
2
  ---------------------------
3
3
  Apache License
4
4
  Version 2.0, January 2004
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmdtools
3
- Version: 2.3.3
3
+ Version: 2.5.0
4
4
  Summary: System resilience modelling, simulation, and assessment in Python
5
5
  Author: fmdtools Developers
6
6
  Maintainer-email: Daniel Hulse <daniel.e.hulse@nasa.gov>
7
- License: fmdtools version 2.3.3
7
+ License: fmdtools version 2.5.0
8
8
  ---------------------------
9
9
  Apache License
10
10
  Version 2.0, January 2004
@@ -236,13 +236,13 @@ Project-URL: Documentation, https://nasa.github.io/fmdtools/
236
236
  Project-URL: source-code, https://github.com/nasa/fmdtools
237
237
  Classifier: Development Status :: 5 - Production/Stable
238
238
  Classifier: Intended Audience :: Science/Research
239
- Classifier: Programming Language :: Python :: 3.11
240
239
  Classifier: Programming Language :: Python :: 3.12
241
240
  Classifier: Programming Language :: Python :: 3.13
241
+ Classifier: Programming Language :: Python :: 3.14
242
242
  Classifier: License :: OSI Approved :: Apache Software License
243
243
  Classifier: Operating System :: OS Independent
244
244
  Classifier: Topic :: Scientific/Engineering
245
- Requires-Python: >=3.11
245
+ Requires-Python: >=3.12
246
246
  Description-Content-Type: text/markdown
247
247
  License-File: LICENSE
248
248
  Requires-Dist: scipy
@@ -250,7 +250,7 @@ Requires-Dist: tqdm
250
250
  Requires-Dist: networkx
251
251
  Requires-Dist: numpy>=2.0
252
252
  Requires-Dist: matplotlib>=3.7.0
253
- Requires-Dist: pandas[all]>=2.2.0
253
+ Requires-Dist: pandas[output-formatting,plot]>=2.2.0
254
254
  Requires-Dist: ordered-set
255
255
  Requires-Dist: dill
256
256
  Requires-Dist: recordclass==0.24
@@ -273,15 +273,15 @@ Dynamic: license-file
273
273
 
274
274
  # Overview
275
275
 
276
- ![Python Version](https://img.shields.io/badge/Python-3.13-blue)
276
+ ![Python Version](https://img.shields.io/badge/Python-3.14-blue)
277
277
  [![PyPI](https://img.shields.io/pypi/v/fmdtools)](https://pypi.org/project/fmdtools/)
278
278
  [![Total Downloads](https://static.pepy.tech/badge/fmdtools)](https://pepy.tech/project/fmdtools)
279
279
  [![Downloads/Month](https://static.pepy.tech/badge/fmdtools/month)](https://pepy.tech/project/fmdtools)
280
280
  [![GitHub release (latest by date)](https://img.shields.io/github/v/release/nasa/fmdtools?label=GitHub%20Release)](https://github.com/nasa/fmdtools/releases)
281
281
  [![GitHub Tag](https://img.shields.io/github/v/tag/nasa/fmdtools)](https://github.com/nasa/fmdtools/tags)
282
282
  [![CodeFactor](https://www.codefactor.io/repository/github/nasa/fmdtools/badge)](https://www.codefactor.io/repository/github/nasa/fmdtools)
283
- [![Tests Status](./tests/reports/full-py313/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/full-py313/junit/report.html)
284
- [![Tests Coverage](./tests/reports/full-py313/coverage-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/full-py313/coverage_html/index.html)
283
+ [![Tests Status](./tests/reports/full-py314/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/full-py314/junit/report.html)
284
+ [![Tests Coverage](./tests/reports/full-py314/coverage-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/full-py314/coverage_html/index.html)
285
285
  [![GitHub License](https://img.shields.io/badge/License-Apache%202.0-green)](https://github.com/nasa/fmdtools/blob/main/LICENSE)
286
286
  [![NASA Software Classification](https://img.shields.io/badge/Software_Class-E-blue)](https://nodis3.gsfc.nasa.gov/displayDir.cfm?Internal_ID=N_PR_7150_002D_&page_name=AppendixD)
287
287
 
@@ -326,15 +326,16 @@ The fmdtools documentation repository is also home to the Functional Reasoning D
326
326
 
327
327
  ### Python version compatibility
328
328
 
329
- The fmdtools library is developed in Python 3.13 but is tested to maintain compatibility over three versions of Python. See current doctest reports below:
329
+ The fmdtools library is developed in Python 3.14 but is tested to maintain compatibility over three versions of Python. See current doctest reports below:
330
330
 
331
331
  | Python Version | Doctests |
332
332
  | -------- | ------- |
333
- | 3.11 | [![Python 3.11 Tests](./tests/reports/doctests-py311/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py311/junit/report.html) |
334
- | 3.12 | [![Python 3.12 Tests](./tests/reports/doctests-py312/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py312/junit/report.html) |
335
- | 3.13 | [![Python 3.13 Tests](./tests/reports/doctests-py313/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py313/junit/report.html) |
333
+ | 3.12 | [![Python 3.12 Tests](./tests/reports/doctests-py312/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py312/junit/report.html) |
334
+ | 3.13 | [![Python 3.13 Tests](./tests/reports/doctests-py313/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py313/junit/report.html) |
335
+ | 3.14 | [![Python 3.14 Tests](./tests/reports/doctests-py314/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py314/junit/report.html) |
336
336
 
337
- Further (functional and integration) tests are performed in the Python 3.13 to ensure that examples run as desired. Thus, it is generally recommended to use Python 3.13 with this version to keep pace with development, especially when running examples.
337
+ Further (functional and integration) tests are performed in the Python 3.14 to ensure that examples run as desired. Thus, it is generally recommended to use Python 3.14
338
+ with this version to keep pace with development, especially when running examples.
338
339
 
339
340
  ### Set up python tooling environment
340
341
 
@@ -342,11 +343,13 @@ The fmdtools library was developed to run in a python development environments.
342
343
 
343
344
  If you do not have an existing python environment, first [download and install anaconda](https://docs.anaconda.com/free/anaconda/install/index.html) or [uv](https://docs.astral.sh/uv/).
344
345
 
345
- After the base installation, set up a new `Python 3.13` environment for fmdtools and install these external external packages in it:
346
+ From there, it can be helpful to install an IDE like [VSCode](https://code.visualstudio.com/) or [Spyder](https://www.spyder-ide.org/).
347
+
348
+ After the base installation, set up a new `Python 3.14` environment for fmdtools and install these external external packages in it, making sure to configure them correctly with your IDE of choice:
346
349
 
347
350
  ```
348
351
  spyder-kernels
349
- # used for: working with external IDEs
352
+ # used for: working with external IDEs - make sure to use the version Spyder asks for
350
353
  # license: ()
351
354
  # install from: (comes with anaconda) or `uv pip install spyder-kernels`
352
355
  jupyter notebook
@@ -359,7 +362,6 @@ graphviz
359
362
  # install from: https://anaconda.org/anaconda/graphviz or https://graphviz.org/download/
360
363
  ```
361
364
 
362
- From there, it can be helpful to install an IDE like [VSCode](https://code.visualstudio.com/) or [Spyder](https://www.spyder-ide.org/).
363
365
 
364
366
  Note: On Windows, some versions `fmdtools` dependencies may require a compiler such as that provided with [Microsoft Studio Build tools](https://visualstudio.microsoft.com/downloads/?q=build+tools) to build, so it (while not required) may be helpful to install it also.
365
367
 
@@ -392,13 +394,13 @@ More guidance on development installations is provided in [How to Contribute](ht
392
394
  Note that this version reflects the latest version on the ``main`` git branch along with any local changes. To use a particular version of ``fmdtools`` in the context of a development install you can checkout the tag corresponding to the version you want, e.g.:
393
395
 
394
396
  ```
395
- git checkout v2.3.3
397
+ git checkout v2.5.0
396
398
  ```
397
399
 
398
400
 
399
401
  #### Dependencies
400
402
 
401
- fmdtools requires `Python 3.13` and depends directly on the packages below (see requirements.txt). Note that the use of these dependencies is governed by their respective licenses, which may be obtained at the provided links.
403
+ fmdtools requires `Python 3.14` and depends directly on the packages below (see pyproject.toml). Note that the use of these dependencies is governed by their respective licenses, which may be obtained at the provided links.
402
404
 
403
405
  ```
404
406
  scipy
@@ -529,8 +531,8 @@ To cite a particular version of the fmdtools, you may use:
529
531
  author = {{NASA}},
530
532
  title = {fmdtools},
531
533
  url = {https://github.com/nasa/fmdtools},
532
- version = {2.3.3},
533
- date = {2025-4-10},
534
+ version = {2.5.0},
535
+ date = {2026-8-13},
534
536
  }
535
537
  ```
536
538
 
@@ -2,15 +2,15 @@
2
2
 
3
3
  # Overview
4
4
 
5
- ![Python Version](https://img.shields.io/badge/Python-3.13-blue)
5
+ ![Python Version](https://img.shields.io/badge/Python-3.14-blue)
6
6
  [![PyPI](https://img.shields.io/pypi/v/fmdtools)](https://pypi.org/project/fmdtools/)
7
7
  [![Total Downloads](https://static.pepy.tech/badge/fmdtools)](https://pepy.tech/project/fmdtools)
8
8
  [![Downloads/Month](https://static.pepy.tech/badge/fmdtools/month)](https://pepy.tech/project/fmdtools)
9
9
  [![GitHub release (latest by date)](https://img.shields.io/github/v/release/nasa/fmdtools?label=GitHub%20Release)](https://github.com/nasa/fmdtools/releases)
10
10
  [![GitHub Tag](https://img.shields.io/github/v/tag/nasa/fmdtools)](https://github.com/nasa/fmdtools/tags)
11
11
  [![CodeFactor](https://www.codefactor.io/repository/github/nasa/fmdtools/badge)](https://www.codefactor.io/repository/github/nasa/fmdtools)
12
- [![Tests Status](./tests/reports/full-py313/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/full-py313/junit/report.html)
13
- [![Tests Coverage](./tests/reports/full-py313/coverage-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/full-py313/coverage_html/index.html)
12
+ [![Tests Status](./tests/reports/full-py314/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/full-py314/junit/report.html)
13
+ [![Tests Coverage](./tests/reports/full-py314/coverage-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/full-py314/coverage_html/index.html)
14
14
  [![GitHub License](https://img.shields.io/badge/License-Apache%202.0-green)](https://github.com/nasa/fmdtools/blob/main/LICENSE)
15
15
  [![NASA Software Classification](https://img.shields.io/badge/Software_Class-E-blue)](https://nodis3.gsfc.nasa.gov/displayDir.cfm?Internal_ID=N_PR_7150_002D_&page_name=AppendixD)
16
16
 
@@ -55,15 +55,16 @@ The fmdtools documentation repository is also home to the Functional Reasoning D
55
55
 
56
56
  ### Python version compatibility
57
57
 
58
- The fmdtools library is developed in Python 3.13 but is tested to maintain compatibility over three versions of Python. See current doctest reports below:
58
+ The fmdtools library is developed in Python 3.14 but is tested to maintain compatibility over three versions of Python. See current doctest reports below:
59
59
 
60
60
  | Python Version | Doctests |
61
61
  | -------- | ------- |
62
- | 3.11 | [![Python 3.11 Tests](./tests/reports/doctests-py311/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py311/junit/report.html) |
63
- | 3.12 | [![Python 3.12 Tests](./tests/reports/doctests-py312/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py312/junit/report.html) |
64
- | 3.13 | [![Python 3.13 Tests](./tests/reports/doctests-py313/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py313/junit/report.html) |
62
+ | 3.12 | [![Python 3.12 Tests](./tests/reports/doctests-py312/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py312/junit/report.html) |
63
+ | 3.13 | [![Python 3.13 Tests](./tests/reports/doctests-py313/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py313/junit/report.html) |
64
+ | 3.14 | [![Python 3.14 Tests](./tests/reports/doctests-py314/tests-badge.svg)](https://htmlpreview.github.io/?https://github.com/nasa/fmdtools/blob/main/tests/reports/doctests-py314/junit/report.html) |
65
65
 
66
- Further (functional and integration) tests are performed in the Python 3.13 to ensure that examples run as desired. Thus, it is generally recommended to use Python 3.13 with this version to keep pace with development, especially when running examples.
66
+ Further (functional and integration) tests are performed in the Python 3.14 to ensure that examples run as desired. Thus, it is generally recommended to use Python 3.14
67
+ with this version to keep pace with development, especially when running examples.
67
68
 
68
69
  ### Set up python tooling environment
69
70
 
@@ -71,11 +72,13 @@ The fmdtools library was developed to run in a python development environments.
71
72
 
72
73
  If you do not have an existing python environment, first [download and install anaconda](https://docs.anaconda.com/free/anaconda/install/index.html) or [uv](https://docs.astral.sh/uv/).
73
74
 
74
- After the base installation, set up a new `Python 3.13` environment for fmdtools and install these external external packages in it:
75
+ From there, it can be helpful to install an IDE like [VSCode](https://code.visualstudio.com/) or [Spyder](https://www.spyder-ide.org/).
76
+
77
+ After the base installation, set up a new `Python 3.14` environment for fmdtools and install these external external packages in it, making sure to configure them correctly with your IDE of choice:
75
78
 
76
79
  ```
77
80
  spyder-kernels
78
- # used for: working with external IDEs
81
+ # used for: working with external IDEs - make sure to use the version Spyder asks for
79
82
  # license: ()
80
83
  # install from: (comes with anaconda) or `uv pip install spyder-kernels`
81
84
  jupyter notebook
@@ -88,7 +91,6 @@ graphviz
88
91
  # install from: https://anaconda.org/anaconda/graphviz or https://graphviz.org/download/
89
92
  ```
90
93
 
91
- From there, it can be helpful to install an IDE like [VSCode](https://code.visualstudio.com/) or [Spyder](https://www.spyder-ide.org/).
92
94
 
93
95
  Note: On Windows, some versions `fmdtools` dependencies may require a compiler such as that provided with [Microsoft Studio Build tools](https://visualstudio.microsoft.com/downloads/?q=build+tools) to build, so it (while not required) may be helpful to install it also.
94
96
 
@@ -121,13 +123,13 @@ More guidance on development installations is provided in [How to Contribute](ht
121
123
  Note that this version reflects the latest version on the ``main`` git branch along with any local changes. To use a particular version of ``fmdtools`` in the context of a development install you can checkout the tag corresponding to the version you want, e.g.:
122
124
 
123
125
  ```
124
- git checkout v2.3.3
126
+ git checkout v2.5.0
125
127
  ```
126
128
 
127
129
 
128
130
  #### Dependencies
129
131
 
130
- fmdtools requires `Python 3.13` and depends directly on the packages below (see requirements.txt). Note that the use of these dependencies is governed by their respective licenses, which may be obtained at the provided links.
132
+ fmdtools requires `Python 3.14` and depends directly on the packages below (see pyproject.toml). Note that the use of these dependencies is governed by their respective licenses, which may be obtained at the provided links.
131
133
 
132
134
  ```
133
135
  scipy
@@ -258,8 +260,8 @@ To cite a particular version of the fmdtools, you may use:
258
260
  author = {{NASA}},
259
261
  title = {fmdtools},
260
262
  url = {https://github.com/nasa/fmdtools},
261
- version = {2.3.3},
262
- date = {2025-4-10},
263
+ version = {2.5.0},
264
+ date = {2026-8-13},
263
265
  }
264
266
  ```
265
267
 
@@ -72,7 +72,10 @@ class Asset(Function):
72
72
  self.perc_requests.s.put(asset_req="land")
73
73
  atc_requests.s.assign(self.perc_requests.s, as_copy=True)
74
74
 
75
- self.perc_requests.update("asset_req", to_update="atc", to_get="local",)
75
+ try:
76
+ self.perc_requests.update("asset_req", to_update="atc", to_get="local",)
77
+ except:
78
+ pass
76
79
 
77
80
  self.perc_location = self.location.create_local("percieved", s=self.location.s)
78
81
 
@@ -131,6 +131,8 @@ if __name__ == "__main__":
131
131
  from fmdtools.define.flow.commsflow import CommsFlowGraph
132
132
 
133
133
  mdl = taxiway_model()
134
+ # mdl.flows['requests'].copy()
135
+ mdl.copy()
134
136
 
135
137
 
136
138
  endresults, mdlhist = prop.one_fault(mdl, "ma3", "lost_sight",
@@ -18,5 +18,6 @@ specific language governing permissions and limitations under the License.
18
18
  import fmdtools_examples.airspacelib.base as base
19
19
  import fmdtools_examples.airspacelib.contingency_management as contingency_management
20
20
  import fmdtools_examples.airspacelib.wildfire_response as wildfire_response
21
+ import fmdtools_examples.airspacelib.water_rescue as water_rescue
21
22
 
22
- __all__ = ['base', 'contingency_management', 'wildfire_response']
23
+ __all__ = ['base', 'contingency_management', 'wildfire_response', 'water_rescue']
@@ -32,7 +32,8 @@ from fmdtools_examples.airspacelib.base.arch.holdpayload import HoldPayload
32
32
 
33
33
  class AircraftArchParameter(Parameter):
34
34
  """Overall Parameter Defining the AircraftArchitecture."""
35
-
35
+ startpt: tuple = (0.0, 0.0)
36
+ endpt: tuple = (25.0, 25.0)
36
37
  flightplan: tuple = ((0.0, 0.0), (25.0, 25.0))
37
38
  height: float = 25.0
38
39
 
@@ -20,6 +20,7 @@ specific language governing permissions and limitations under the License.
20
20
  from fmdtools.define.block.function import Function
21
21
  from fmdtools.define.container.state import State
22
22
  from fmdtools.define.container.mode import Mode
23
+ from fmdtools.define.pathplan import PathPlannerBase
23
24
 
24
25
  from fmdtools_examples.airspacelib.base.arch.flows import Trajectories, Force, Electricity
25
26
  from fmdtools_examples.airspacelib.base.arch.flows import AircraftEnvironment
@@ -120,6 +121,8 @@ class ControlFlight(Function):
120
121
  """Add the desired trajectory local flow to the Function."""
121
122
  self.perc_traj = self.trajectories.create_local("perc_traj")
122
123
  self.des_traj = self.trajectories.create_local("des_traj")
124
+ # self.planner = PathPlannerBase()
125
+ # self.planner.init_environment(self.environment)
123
126
 
124
127
  def static_behavior(self):
125
128
  """
@@ -197,6 +200,12 @@ class ControlFlight(Function):
197
200
  newgoal = self.des_traj.s.get_loc()
198
201
  self.des_traj.s.assign(newgoal, 'goal_x', 'goal_y', 'goal_z')
199
202
 
203
+ # def run_planner(self, start, goal, algorithm, **kwargs):
204
+ # path = self.planner.compute_path(start, goal, planner=algorithm, **kwargs)
205
+ # self.s.flightplan = self.planner.s.flightplan
206
+ # self.s.pt = self.planner.s.pt
207
+ # return path
208
+
200
209
 
201
210
  if __name__ == "__main__":
202
211
  import doctest
@@ -201,13 +201,13 @@ class ContingencyAviate(Aviate):
201
201
  if dist <= 0.1:
202
202
  self.m.add_fault('crash')
203
203
  self.m.set_mode('falling')
204
- self.environment.ga.points['self'].s.buffer_speed = 0.0
205
- self.environment.ga.points[name].s.buffer_speed = 0.0
204
+ self.environment.ga.geoms['self'].s.buffer_speed = 0.0
205
+ self.environment.ga.geoms[name].s.buffer_speed = 0.0
206
206
  super().static_behavior()
207
207
 
208
208
  def dynamic_behavior(self):
209
209
  super().dynamic_behavior()
210
- self.environment.ga.points['self'].s.assign(self.trajectories.s, 'x', 'y', 'z')
210
+ self.environment.ga.geoms['self'].s.assign(self.trajectories.s, 'x', 'y', 'z')
211
211
 
212
212
 
213
213
 
@@ -479,7 +479,7 @@ def plot_flightpath(mdl={}, history={}, fig={}, ax={}, with_plans=True, with_loc
479
479
  else:
480
480
  bhist = history
481
481
  geoms = dict()
482
- for pt in mdl.flows['environment'].ga.points:
482
+ for pt in mdl.flows['environment'].ga.geoms:
483
483
  if pt == 'self':
484
484
  geoms[pt] = {'shapes': {'envelope': {'color': 'blue'}}}
485
485
  else:
@@ -625,9 +625,9 @@ if __name__ == "__main__":
625
625
  # 'trajectories.s.z',
626
626
  # time_groups='nominal', time_ticks=2.0, fig=fig, ax=ax)
627
627
 
628
- # fig, ax = hist.plot_trajectories('environment.ga.points.uav.s.x',
629
- # 'environment.ga.points.uav.s.y',
630
- # 'environment.ga.points.uav.s.z',
628
+ # fig, ax = hist.plot_trajectories('environment.ga.geoms.uav.s.x',
629
+ # 'environment.ga.geoms.uav.s.y',
630
+ # 'environment.ga.geoms.uav.s.z',
631
631
  # time_groups='nominal', time_ticks=2.0, fig=fig, ax=ax)
632
632
 
633
633
 
@@ -21,7 +21,7 @@ from fmdtools_examples.airspacelib.base.state import AircraftPosition3
21
21
 
22
22
  from fmdtools.define.object.coords import Coords, CoordsParam
23
23
  from fmdtools.define.architecture.geom import GeomArchitecture
24
- from fmdtools.define.object.geom import GeomPoint, PointParam
24
+ from fmdtools.define.object.geom import GeomPoint, GeomParameter
25
25
  from fmdtools.define.block.function import Function
26
26
 
27
27
  from shapely import distance
@@ -141,7 +141,7 @@ class ThreatState(AircraftPosition3):
141
141
  self.buffer_speed = self.get_vel()
142
142
 
143
143
 
144
- class ThreatParam(PointParam):
144
+ class ThreatParam(GeomParameter):
145
145
  """
146
146
  Parameter defining the exteral threat shape.
147
147
 
@@ -167,6 +167,9 @@ class Threat(GeomPoint):
167
167
  """Update position given known speed."""
168
168
  self.s.update_position(self.s.buffer_speed)
169
169
 
170
+ def get_shapely_args(self):
171
+ return (self.s.x, self.s.y)
172
+
170
173
 
171
174
  class ContingencyThreats(GeomArchitecture):
172
175
  """Overall environment-defining geometries of the drone and external threats."""
@@ -175,40 +178,40 @@ class ContingencyThreats(GeomArchitecture):
175
178
 
176
179
  def init_architecture(self, **kwargs):
177
180
  """Initialize drone and intruders given 'intruders' options."""
178
- self.add_point('self', Threat)
181
+ self.add_geom('self', Threat)
179
182
  if self.p.intruders == "across":
180
183
  s = {'buffer_speed': 3.3, 'x': 100, 'y': 0.0, 'z': 25.0,
181
184
  'goal_x': 0.0, 'goal_y': 100.0, 'goal_z': 25.0}
182
- self.add_point("uav", Threat, s=s)
185
+ self.add_geom("uav", Threat, s=s)
183
186
  elif self.p.intruders == "middle":
184
187
  s = {'buffer_speed': 0.0, 'x': 60, 'y': 60, 'z': 25.0,
185
188
  'goal_x': 60.0, 'goal_y': 60.0, 'goal_z': 25.0}
186
- self.add_point("uav", Threat, s=s)
189
+ self.add_geom("uav", Threat, s=s)
187
190
  elif self.p.intruders == "down":
188
191
  s = {'buffer_speed': 2.5,
189
192
  'x': 60, 'y': 120, 'z': 25.0,
190
193
  'goal_x': 60.0, 'goal_y': 0.0, 'goal_z': 25.0}
191
- self.add_point("uav", Threat, s=s)
194
+ self.add_geom("uav", Threat, s=s)
192
195
  elif self.p.intruders == "down-over":
193
196
  s = {'buffer_speed': 2.5,
194
197
  'x': 40, 'y': 120, 'z': 25.0,
195
198
  'goal_x': 40.0, 'goal_y': 0.0, 'goal_z': 25.0}
196
- self.add_point("uav", Threat, s=s)
199
+ self.add_geom("uav", Threat, s=s)
197
200
  elif self.p.intruders:
198
201
  raise Exception("Invalid option for intruders: "+self.p.intruders)
199
202
 
200
203
 
201
204
  def update_positions(self):
202
205
  """Update positions of the threats."""
203
- for threatname, threat in self.points.items():
206
+ for threatname, threat in self.geoms.items():
204
207
  if threatname != 'self':
205
208
  threat.update_position()
206
209
 
207
210
  def calc_dist_to_threats(self, self_shape='envelope', threat_shape='safety'):
208
211
  """Calculate distancses b/t self_shape for self and threat_shape for threats."""
209
212
  dists = {}
210
- self_envelope = self.points['self'].get_shape(self_shape)
211
- for threatname, threat in self.points.items():
213
+ self_envelope = self.geoms['self'].get_shape(self_shape)
214
+ for threatname, threat in self.geoms.items():
212
215
  if threatname != 'self':
213
216
  threat_envelope = threat.get_shape(threat_shape)
214
217
  dists[threatname] = distance(self_envelope, threat_envelope)
@@ -270,5 +273,5 @@ if __name__ == "__main__":
270
273
  from fmdtools.sim import propagate
271
274
  res, hist = propagate.nominal(cc)
272
275
 
273
- hist.plot_trajectories('environment.ga.points.uav.s.x',
274
- 'environment.ga.points.uav.s.y')
276
+ hist.plot_trajectories('environment.ga.geoms.uav.s.x',
277
+ 'environment.ga.geoms.uav.s.y')
@@ -73,7 +73,7 @@ class DroneFlightGrid(Coords):
73
73
  >>> from fmdtools_examples.airspacelib.contingency_management.model_environment import ContingencyEnvironment
74
74
  >>> env = ContingencyEnvironment()
75
75
  >>> param = DroneFlightGridParam(x_size=120, y_size=120, blocksize=1.0)
76
- >>> grid = DroneFlightGrid(env, p=param)
76
+ >>> grid = DroneFlightGrid(env=env, p=param)
77
77
  >>> start = (10.0, 10.0)
78
78
  >>> goal = (100.0, 100.0)
79
79
  >>> path = grid.a_star_worldcoords(start_xy=start, goal_xy=goal,
@@ -98,10 +98,14 @@ class DroneFlightGrid(Coords):
98
98
  state_grid_costs: tuple = (float, 0.0)
99
99
  state_fuel_costs: tuple = (dict, None)
100
100
  state_edge_weights: tuple = (dict, None)
101
+ attrs = Coords.attrs + ('env',)
101
102
 
102
103
  def init_properties(self, env={}, **kwargs):
103
- self.env_coords = env.c
104
- self.env = env
104
+ if env:
105
+ self.env_coords = env.c
106
+ self.env = env
107
+ else:
108
+ raise Exception("No env provided")
105
109
  for i in range(self.p.y_size):
106
110
  for j in range(self.p.x_size):
107
111
  self.fuel_costs[i, j] = {}
@@ -171,10 +175,10 @@ class DroneFlightGrid(Coords):
171
175
  unsafe_points = set()
172
176
  if obstacle:
173
177
  try:
174
- uav_geom = self.env.ga.geoms()['uav']
178
+ uav_geom = self.env.ga.geoms['uav']
175
179
  except (AttributeError, KeyError):
176
180
  print("No such UAV geometry architecture exists")
177
- uav_geom = self.env.ga.geoms()['uav']
181
+ uav_geom = self.env.ga.geoms['uav']
178
182
  coarse_block = self.env.c.p.blocksize
179
183
  fine_block = self.p.blocksize
180
184
  coarse_unsafe_pts = [pt for pt in self.env_coords.pts if uav_geom.at(pt, 'safety')]
@@ -451,7 +455,8 @@ if __name__ == "__main__":
451
455
  import numpy as np
452
456
  env = ContingencyEnvironment()
453
457
  param = DroneFlightGridParam(x_size=120/2.5, y_size=120/2.5, blocksize=2.5, max_cost=np.inf)
454
- grid = DroneFlightGrid(env, p=param)
458
+ grid = DroneFlightGrid(env=env, p=param)
459
+ grid.copy()
455
460
  start = (45.0, 72.5)
456
461
  goal = (50.0, 60.0)
457
462
  path = grid.a_star_worldcoords(start_xy=start, goal_xy=goal, max_distance=5,
@@ -459,5 +464,5 @@ if __name__ == "__main__":
459
464
  restricted_cost=100.0, fuel_rate= 20, obstacle=True) # *25000.0/25
460
465
  print(path)
461
466
 
462
- # import doctest
463
- # doctest.testmod(verbose=True)
467
+ import doctest
468
+ doctest.testmod(verbose=True)
@@ -0,0 +1,23 @@
1
+ """
2
+ Water rescue model.
3
+
4
+ Copyright © 2024, United States Government, as represented by the Administrator
5
+ of the National Aeronautics and Space Administration. All rights reserved.
6
+
7
+ The "Fault Model Design tools - fmdtools version 2" software is licensed
8
+ under the Apache License, Version 2.0 (the "License"); you may not use this
9
+ file except in compliance with the License. You may obtain a copy of the
10
+ License at http://www.apache.org/licenses/LICENSE/2.0.
11
+
12
+ Unless required by applicable law or agreed to in writing, software distributed
13
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
14
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
15
+ specific language governing permissions and limitations under the License.
16
+ """
17
+
18
+ import fmdtools_examples.airspacelib.water_rescue.model_environment as model_environment
19
+ import fmdtools_examples.airspacelib.water_rescue.model_responder as model_responder
20
+ import fmdtools_examples.airspacelib.water_rescue.model_drone as model_drone
21
+ import fmdtools_examples.airspacelib.water_rescue.model_main as model_main
22
+
23
+ __all__ = ['model_environment', 'model_responder', 'model_drone', 'model_main']