fvs-python 0.2.3__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.
- fvs_python-0.2.3/LICENSE +21 -0
- fvs_python-0.2.3/PKG-INFO +254 -0
- fvs_python-0.2.3/README.md +188 -0
- fvs_python-0.2.3/pyproject.toml +225 -0
- fvs_python-0.2.3/setup.cfg +4 -0
- fvs_python-0.2.3/src/fvs_python.egg-info/PKG-INFO +254 -0
- fvs_python-0.2.3/src/fvs_python.egg-info/SOURCES.txt +170 -0
- fvs_python-0.2.3/src/fvs_python.egg-info/dependency_links.txt +1 -0
- fvs_python-0.2.3/src/fvs_python.egg-info/requires.txt +36 -0
- fvs_python-0.2.3/src/fvs_python.egg-info/top_level.txt +1 -0
- fvs_python-0.2.3/src/pyfvs/__init__.py +107 -0
- fvs_python-0.2.3/src/pyfvs/bark_ratio.py +323 -0
- fvs_python-0.2.3/src/pyfvs/cfg/CFG_README.md +73 -0
- fvs_python-0.2.3/src/pyfvs/cfg/dbh_bounding_table_4_7_1_8.json +103 -0
- fvs_python-0.2.3/src/pyfvs/cfg/ecounit_coefficients_table_4_7_1_5.json +981 -0
- fvs_python-0.2.3/src/pyfvs/cfg/ecounit_coefficients_table_4_7_1_6.json +856 -0
- fvs_python-0.2.3/src/pyfvs/cfg/forest_type_mapping_table_4_7_1_4.json +38 -0
- fvs_python-0.2.3/src/pyfvs/cfg/fortype_coefficients_table_4_7_1_3.json +1183 -0
- fvs_python-0.2.3/src/pyfvs/cfg/functional_forms.yaml +111 -0
- fvs_python-0.2.3/src/pyfvs/cfg/growth_model_parameters.yaml +98 -0
- fvs_python-0.2.3/src/pyfvs/cfg/plant_values_table_4_7_1_7.json +15 -0
- fvs_python-0.2.3/src/pyfvs/cfg/site_index_transformation.yaml +113 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_bark_ratio_coefficients.json +115 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_crown_competition_factor.json +109 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_crown_ratio_coefficients.json +956 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_crown_width_coefficients.json +1664 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_diameter_growth_coefficients.json +300 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_height_diameter_coefficients.json +97 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_large_tree_diameter_growth.json +191 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_large_tree_height_growth.json +229 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_large_tree_height_growth_coefficients.json +1187 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_mortality_model.json +176 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_regeneration_model.json +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_relative_site_index.json +263 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_small_tree_height_growth.json +879 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_species_codes_table.json +728 -0
- fvs_python-0.2.3/src/pyfvs/cfg/sn_stand_density_index.json +398 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ab_american_basswood.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ae_american_elm.yaml +240 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ah_american_hornbeam.yaml +250 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ap_american_plum.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/as_american_sycamore.yaml +253 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ba_black_ash.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bb_basswood.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bc_black_cherry.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bd_sweet_birch.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/be_american_beech.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bg_black_gum.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bj_blue_jay.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bk_sugar_maple.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bn_butternut.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bo_red_maple.yaml +255 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bt_bigtooth_aspen.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/bu_buckeye.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/by_bald_cypress.yaml +255 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ca_american_chestnut.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/cb_cucumber_tree.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ck_virginia_pine.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/co_pond_cypress.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ct_catalpa.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/cw_chestnut_oak.yaml +253 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/dw_dogwood.yaml +250 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/el_american_hornbeam.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/fm_flowering_dogwood.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/fr_fraser_fir.yaml +247 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ga_green_ash.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ha_hawthorn.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/hb_hornbeam.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/hh_dogwood.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/hi_hickory_species.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/hl_holly.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/hm_eastern_hemlock.yaml +246 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/hy_holly.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ju_eastern_juniper.yaml +247 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/lb_loblolly_bay.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/lk_laurel_oak.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ll_longleaf_pine.yaml +265 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/lo_silver_maple.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/lp_loblolly_pine.yaml +268 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/mb_mountain_birch.yaml +250 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/mg_magnolia.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ml_maple_leaf.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ms_maple_species.yaml +247 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/mv_magnolia_vine.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/oh_other_hardwood.yaml +231 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/os_other_softwood.yaml +232 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ot_other_tree.yaml +210 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ov_overcup_oak.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/pc_pond_cypress.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/pd_pitch_pine.yaml +245 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/pi_pine_species.yaml +246 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/po_american_beech.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/pp_pond_pine.yaml +246 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ps_persimmon.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/pu_pond_pine.yaml +249 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/qs_flowering_dogwood.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ra_red_ash.yaml +245 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/rd_redbud.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/rl_red_elm.yaml +240 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/rm_red_maple.yaml +256 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ro_eastern_hemlock.yaml +255 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sa_slash_pine.yaml +265 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sb_sweet_birch.yaml +255 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sd_sand_pine.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sk_swamp_oak.yaml +253 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sm_sugar_maple.yaml +252 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sn_loblolly_pine.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/so_southern_oak.yaml +253 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sp_shortleaf_pine.yaml +267 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sr_spruce_pine.yaml +246 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ss_basswood.yaml +251 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/su_sweetgum.yaml +255 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sv_silver_maple.yaml +255 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/sy_sycamore.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/tm_tamarack.yaml +246 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/to_tulip_oak.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/ts_tulip_tree.yaml +253 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/vp_virginia_pine.yaml +248 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/wa_white_ash.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/we_white_elm.yaml +250 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/wi_willow.yaml +248 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/wk_water_oak.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/wn_walnut.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/wo_white_oak.yaml +256 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/wp_white_pine.yaml +250 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/wt_water_tupelo.yaml +254 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species/yp_yellow_poplar.yaml +261 -0
- fvs_python-0.2.3/src/pyfvs/cfg/species_config.yaml +106 -0
- fvs_python-0.2.3/src/pyfvs/clark_profile.py +323 -0
- fvs_python-0.2.3/src/pyfvs/competition.py +332 -0
- fvs_python-0.2.3/src/pyfvs/config_loader.py +375 -0
- fvs_python-0.2.3/src/pyfvs/crown_competition_factor.py +464 -0
- fvs_python-0.2.3/src/pyfvs/crown_ratio.py +377 -0
- fvs_python-0.2.3/src/pyfvs/crown_width.py +512 -0
- fvs_python-0.2.3/src/pyfvs/data_export.py +356 -0
- fvs_python-0.2.3/src/pyfvs/ecological_unit.py +272 -0
- fvs_python-0.2.3/src/pyfvs/exceptions.py +86 -0
- fvs_python-0.2.3/src/pyfvs/fia_integration.py +876 -0
- fvs_python-0.2.3/src/pyfvs/forest_type.py +253 -0
- fvs_python-0.2.3/src/pyfvs/growth_plots.py +579 -0
- fvs_python-0.2.3/src/pyfvs/harvest.py +603 -0
- fvs_python-0.2.3/src/pyfvs/height_diameter.py +248 -0
- fvs_python-0.2.3/src/pyfvs/large_tree_height_growth.py +822 -0
- fvs_python-0.2.3/src/pyfvs/logging_config.py +213 -0
- fvs_python-0.2.3/src/pyfvs/main.py +99 -0
- fvs_python-0.2.3/src/pyfvs/mortality.py +431 -0
- fvs_python-0.2.3/src/pyfvs/parameters.py +121 -0
- fvs_python-0.2.3/src/pyfvs/simulation_engine.py +386 -0
- fvs_python-0.2.3/src/pyfvs/stand.py +1004 -0
- fvs_python-0.2.3/src/pyfvs/stand_metrics.py +436 -0
- fvs_python-0.2.3/src/pyfvs/stand_output.py +552 -0
- fvs_python-0.2.3/src/pyfvs/tree.py +756 -0
- fvs_python-0.2.3/src/pyfvs/validation.py +190 -0
- fvs_python-0.2.3/src/pyfvs/volume_library.py +761 -0
- fvs_python-0.2.3/tests/test_competition.py +415 -0
- fvs_python-0.2.3/tests/test_configuration.py +359 -0
- fvs_python-0.2.3/tests/test_crown_ratio.py +364 -0
- fvs_python-0.2.3/tests/test_documentation_examples.py +947 -0
- fvs_python-0.2.3/tests/test_fia_integration.py +1166 -0
- fvs_python-0.2.3/tests/test_harvest.py +470 -0
- fvs_python-0.2.3/tests/test_height_diameter.py +401 -0
- fvs_python-0.2.3/tests/test_integration.py +393 -0
- fvs_python-0.2.3/tests/test_manuscript_validation.py +749 -0
- fvs_python-0.2.3/tests/test_model_validation.py +311 -0
- fvs_python-0.2.3/tests/test_mortality.py +346 -0
- fvs_python-0.2.3/tests/test_performance.py +347 -0
- fvs_python-0.2.3/tests/test_stand.py +1232 -0
- fvs_python-0.2.3/tests/test_stand_metrics.py +377 -0
- fvs_python-0.2.3/tests/test_stand_output.py +421 -0
- fvs_python-0.2.3/tests/test_tree.py +345 -0
- fvs_python-0.2.3/tests/test_tree_comprehensive.py +669 -0
- fvs_python-0.2.3/tests/test_validation.py +443 -0
fvs_python-0.2.3/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Chris Mihiar
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fvs-python
|
|
3
|
+
Version: 0.2.3
|
|
4
|
+
Summary: Python implementation of the Forest Vegetation Simulator - Part of the FIA Python Ecosystem
|
|
5
|
+
Author-email: Chris Mihiar <chris.mihiar@gmail.com>
|
|
6
|
+
Maintainer-email: Chris Mihiar <chris.mihiar@gmail.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://fiatools.org/tools/pyfvs/
|
|
9
|
+
Project-URL: Repository, https://github.com/mihiarc/pyfvs
|
|
10
|
+
Project-URL: Documentation, https://mihiarc.github.io/pyfvs/
|
|
11
|
+
Project-URL: Source Code, https://github.com/mihiarc/pyfvs
|
|
12
|
+
Project-URL: Bug Tracker, https://github.com/mihiarc/pyfvs/issues
|
|
13
|
+
Project-URL: Changelog, https://github.com/mihiarc/pyfvs/releases
|
|
14
|
+
Project-URL: FIA Ecosystem, https://fiatools.org
|
|
15
|
+
Keywords: fvs,forest-vegetation-simulator,growth-simulation,yield-tables,forestry,southern-pine,loblolly-pine,longleaf-pine,slash-pine,shortleaf-pine,chapman-richards,individual-tree-growth,stand-projection,timber-volume,fia,fiatools,forest-inventory,usda,forest-service
|
|
16
|
+
Classifier: Development Status :: 4 - Beta
|
|
17
|
+
Classifier: Intended Audience :: Science/Research
|
|
18
|
+
Classifier: Intended Audience :: Developers
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
22
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
23
|
+
Classifier: Operating System :: OS Independent
|
|
24
|
+
Classifier: Natural Language :: English
|
|
25
|
+
Classifier: Environment :: Console
|
|
26
|
+
Classifier: Programming Language :: Python :: 3
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
28
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
29
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
30
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
31
|
+
Requires-Python: >=3.8
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
License-File: LICENSE
|
|
34
|
+
Requires-Dist: numpy>=1.21.0
|
|
35
|
+
Requires-Dist: pandas>=1.3.0
|
|
36
|
+
Requires-Dist: scipy>=1.7.0
|
|
37
|
+
Requires-Dist: matplotlib>=3.4.0
|
|
38
|
+
Requires-Dist: seaborn>=0.11.0
|
|
39
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
40
|
+
Requires-Dist: pydantic>=2.5.0
|
|
41
|
+
Requires-Dist: tomli>=2.0.0; python_version < "3.11"
|
|
42
|
+
Requires-Dist: tomli-w>=1.0.0
|
|
43
|
+
Requires-Dist: tabulate>=0.9.0
|
|
44
|
+
Requires-Dist: openpyxl>=3.0.0
|
|
45
|
+
Requires-Dist: rich>=12.0.0
|
|
46
|
+
Provides-Extra: dev
|
|
47
|
+
Requires-Dist: pytest>=6.0.0; extra == "dev"
|
|
48
|
+
Requires-Dist: pytest-cov>=3.0.0; extra == "dev"
|
|
49
|
+
Requires-Dist: black>=22.0.0; extra == "dev"
|
|
50
|
+
Requires-Dist: flake8>=4.0.0; extra == "dev"
|
|
51
|
+
Requires-Dist: mypy>=0.900; extra == "dev"
|
|
52
|
+
Requires-Dist: pre-commit>=2.15.0; extra == "dev"
|
|
53
|
+
Requires-Dist: mkdocs>=1.6.0; extra == "dev"
|
|
54
|
+
Requires-Dist: mkdocs-material>=9.5.0; extra == "dev"
|
|
55
|
+
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "dev"
|
|
56
|
+
Provides-Extra: test
|
|
57
|
+
Requires-Dist: pytest>=6.0.0; extra == "test"
|
|
58
|
+
Requires-Dist: pytest-cov>=3.0.0; extra == "test"
|
|
59
|
+
Requires-Dist: pytest-xdist>=2.0.0; extra == "test"
|
|
60
|
+
Provides-Extra: docs
|
|
61
|
+
Requires-Dist: mkdocs>=1.6.0; extra == "docs"
|
|
62
|
+
Requires-Dist: mkdocs-material>=9.5.0; extra == "docs"
|
|
63
|
+
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "docs"
|
|
64
|
+
Requires-Dist: pymdown-extensions>=10.7; extra == "docs"
|
|
65
|
+
Dynamic: license-file
|
|
66
|
+
|
|
67
|
+
<div align="center">
|
|
68
|
+
<a href="https://fiatools.org"><img src="https://fiatools.org/logos/pyfvs_logo.png" alt="pyFVS" width="400"></a>
|
|
69
|
+
|
|
70
|
+
<p><strong>Forest growth modeling in Python</strong></p>
|
|
71
|
+
|
|
72
|
+
<p>
|
|
73
|
+
<a href="https://fiatools.org"><img src="https://img.shields.io/badge/FIAtools-Ecosystem-2E7D32" alt="FIAtools Ecosystem"></a>
|
|
74
|
+
<a href="https://pypi.org/project/pyfvs-fia/"><img src="https://img.shields.io/pypi/v/pyfvs-fia?color=006D6D&label=PyPI" alt="PyPI"></a>
|
|
75
|
+
<a href="https://mihiarc.github.io/pyfvs/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-006D6D" alt="Documentation"></a>
|
|
76
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-006D6D" alt="License: MIT"></a>
|
|
77
|
+
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.9+-006D6D" alt="Python 3.9+"></a>
|
|
78
|
+
</p>
|
|
79
|
+
|
|
80
|
+
<p>
|
|
81
|
+
<strong>Part of the <a href="https://fiatools.org">FIAtools Python Ecosystem</a></strong><br>
|
|
82
|
+
<a href="https://fiatools.org/tools/pyfia/">pyFIA</a> ·
|
|
83
|
+
<a href="https://fiatools.org/tools/gridfia/">gridFIA</a> ·
|
|
84
|
+
<a href="https://fiatools.org/tools/pyfvs/">pyFVS</a> ·
|
|
85
|
+
<a href="https://fiatools.org/tools/askfia/">askFIA</a>
|
|
86
|
+
</p>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
A Python implementation of the Forest Vegetation Simulator (FVS) Southern variant. Simulate growth and yield for loblolly, shortleaf, longleaf, and slash pine from age 0 to 50 years.
|
|
92
|
+
|
|
93
|
+
## Supported Species
|
|
94
|
+
|
|
95
|
+
| Code | Species | Scientific Name |
|
|
96
|
+
|------|---------|-----------------|
|
|
97
|
+
| LP | Loblolly Pine | *Pinus taeda* |
|
|
98
|
+
| SP | Shortleaf Pine | *Pinus echinata* |
|
|
99
|
+
| LL | Longleaf Pine | *Pinus palustris* |
|
|
100
|
+
| SA | Slash Pine | *Pinus elliottii* |
|
|
101
|
+
|
|
102
|
+
## Quick Start
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
pip install pyfvs
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
from pyfvs import Stand
|
|
110
|
+
|
|
111
|
+
# Initialize a planted stand
|
|
112
|
+
stand = Stand.initialize_planted(
|
|
113
|
+
species="LP",
|
|
114
|
+
trees_per_acre=500,
|
|
115
|
+
site_index=70
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Simulate 50 years of growth
|
|
119
|
+
stand.grow(years=50)
|
|
120
|
+
|
|
121
|
+
# Get results
|
|
122
|
+
metrics = stand.get_metrics()
|
|
123
|
+
print(f"Final volume: {metrics['volume']:.0f} ft³/acre")
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Growth Models
|
|
127
|
+
|
|
128
|
+
pyFVS implements individual tree growth models from FVS documentation:
|
|
129
|
+
|
|
130
|
+
### Height-Diameter (Curtis-Arney)
|
|
131
|
+
```
|
|
132
|
+
height = 4.5 + p2 × exp(-p3 × DBH^p4)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Large Tree Diameter Growth
|
|
136
|
+
```
|
|
137
|
+
ln(DDS) = β₁ + β₂×ln(DBH) + β₃×DBH² + β₄×ln(CR) + β₅×RH + β₆×SI + ...
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Small Tree Height Growth (Chapman-Richards)
|
|
141
|
+
```
|
|
142
|
+
height = c1 × SI^c2 × (1 - exp(c3 × age))^(c4 × SI^c5)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Architecture
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
Tree Initial State
|
|
149
|
+
│
|
|
150
|
+
▼
|
|
151
|
+
DBH >= 3.0? ──No──► Small Tree Model
|
|
152
|
+
│ │
|
|
153
|
+
Yes ▼
|
|
154
|
+
│ Height Growth
|
|
155
|
+
▼ │
|
|
156
|
+
Large Tree Model ▼
|
|
157
|
+
│ Height-Diameter
|
|
158
|
+
▼ │
|
|
159
|
+
Predict ln(DDS) ▼
|
|
160
|
+
│ Update DBH
|
|
161
|
+
▼ │
|
|
162
|
+
Calculate DBH Growth │
|
|
163
|
+
│ │
|
|
164
|
+
└────────┬───────────┘
|
|
165
|
+
▼
|
|
166
|
+
Update Crown Ratio
|
|
167
|
+
│
|
|
168
|
+
▼
|
|
169
|
+
Crown Competition
|
|
170
|
+
│
|
|
171
|
+
▼
|
|
172
|
+
Updated Tree State
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Configuration
|
|
176
|
+
|
|
177
|
+
Species parameters are stored in YAML configuration files:
|
|
178
|
+
|
|
179
|
+
```yaml
|
|
180
|
+
# cfg/species/lp_loblolly_pine.yaml
|
|
181
|
+
species_code: "LP"
|
|
182
|
+
common_name: "Loblolly Pine"
|
|
183
|
+
height_diameter:
|
|
184
|
+
p2: 243.860648
|
|
185
|
+
p3: 4.28460566
|
|
186
|
+
p4: -0.47130185
|
|
187
|
+
bark_ratio:
|
|
188
|
+
b1: -0.48140
|
|
189
|
+
b2: 0.91413
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Output
|
|
193
|
+
|
|
194
|
+
pyFVS generates yield tables with standard forest metrics:
|
|
195
|
+
|
|
196
|
+
| Age | TPA | QMD | Height | BA | Volume |
|
|
197
|
+
|-----|-----|-----|--------|-----|--------|
|
|
198
|
+
| 0 | 500 | 0.5 | 1.0 | 0.7 | 0 |
|
|
199
|
+
| 10 | 485 | 4.2 | 28.5 | 47.2 | 892 |
|
|
200
|
+
| 20 | 420 | 7.8 | 52.1 | 139.8 | 3,241 |
|
|
201
|
+
| 30 | 310 | 10.4 | 68.3 | 182.5 | 5,128 |
|
|
202
|
+
| ... | ... | ... | ... | ... | ... |
|
|
203
|
+
|
|
204
|
+
## Integration with pyFIA
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
from pyfia import FIA
|
|
208
|
+
from pyfvs import Stand
|
|
209
|
+
|
|
210
|
+
# Get current stand conditions from FIA
|
|
211
|
+
with FIA("database.duckdb") as db:
|
|
212
|
+
db.clip_by_state(37)
|
|
213
|
+
stand_data = db.get_stand_summary(plot_id="123")
|
|
214
|
+
|
|
215
|
+
# Initialize pyFVS with FIA data
|
|
216
|
+
stand = Stand.from_fia_data(stand_data)
|
|
217
|
+
stand.grow(years=30)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## The FIAtools Ecosystem
|
|
221
|
+
|
|
222
|
+
pyFVS is part of the [FIAtools Python ecosystem](https://fiatools.org) - a unified suite of open-source tools for forest inventory analysis:
|
|
223
|
+
|
|
224
|
+
| Tool | Purpose | Key Features |
|
|
225
|
+
|------|---------|--------------|
|
|
226
|
+
| [**pyFIA**](https://fiatools.org) | Survey & plot data | DuckDB backend, 10-100x faster than EVALIDator |
|
|
227
|
+
| [**gridFIA**](https://fiatools.org) | Spatial raster analysis | 327 species at 30m resolution, Zarr storage |
|
|
228
|
+
| [**pyFVS**](https://fiatools.org) | Growth simulation | Chapman-Richards curves, yield projections |
|
|
229
|
+
| [**askFIA**](https://fiatools.org) | AI interface | Natural language queries for forest data |
|
|
230
|
+
|
|
231
|
+
**[Explore the full ecosystem at fiatools.org](https://fiatools.org)**
|
|
232
|
+
|
|
233
|
+
## References
|
|
234
|
+
|
|
235
|
+
- [FVS Southern Variant Documentation](https://www.fs.usda.gov/fmsc/fvs/)
|
|
236
|
+
- Bechtold & Patterson (2005) "The Enhanced Forest Inventory and Analysis Program"
|
|
237
|
+
|
|
238
|
+
## Citation
|
|
239
|
+
|
|
240
|
+
```bibtex
|
|
241
|
+
@software{pyfvs2025,
|
|
242
|
+
title = {pyFVS: Python Implementation of the Forest Vegetation Simulator},
|
|
243
|
+
author = {Mihiar, Christopher},
|
|
244
|
+
year = {2025},
|
|
245
|
+
url = {https://fiatools.org}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
<div align="center">
|
|
252
|
+
<a href="https://fiatools.org"><strong>fiatools.org</strong></a> · Python Ecosystem for Forest Inventory Analysis<br>
|
|
253
|
+
<sub>Built by <a href="https://github.com/mihiarc">Chris Mihiar</a> · USDA Forest Service Southern Research Station</sub>
|
|
254
|
+
</div>
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<a href="https://fiatools.org"><img src="https://fiatools.org/logos/pyfvs_logo.png" alt="pyFVS" width="400"></a>
|
|
3
|
+
|
|
4
|
+
<p><strong>Forest growth modeling in Python</strong></p>
|
|
5
|
+
|
|
6
|
+
<p>
|
|
7
|
+
<a href="https://fiatools.org"><img src="https://img.shields.io/badge/FIAtools-Ecosystem-2E7D32" alt="FIAtools Ecosystem"></a>
|
|
8
|
+
<a href="https://pypi.org/project/pyfvs-fia/"><img src="https://img.shields.io/pypi/v/pyfvs-fia?color=006D6D&label=PyPI" alt="PyPI"></a>
|
|
9
|
+
<a href="https://mihiarc.github.io/pyfvs/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-006D6D" alt="Documentation"></a>
|
|
10
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-006D6D" alt="License: MIT"></a>
|
|
11
|
+
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.9+-006D6D" alt="Python 3.9+"></a>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<p>
|
|
15
|
+
<strong>Part of the <a href="https://fiatools.org">FIAtools Python Ecosystem</a></strong><br>
|
|
16
|
+
<a href="https://fiatools.org/tools/pyfia/">pyFIA</a> ·
|
|
17
|
+
<a href="https://fiatools.org/tools/gridfia/">gridFIA</a> ·
|
|
18
|
+
<a href="https://fiatools.org/tools/pyfvs/">pyFVS</a> ·
|
|
19
|
+
<a href="https://fiatools.org/tools/askfia/">askFIA</a>
|
|
20
|
+
</p>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
A Python implementation of the Forest Vegetation Simulator (FVS) Southern variant. Simulate growth and yield for loblolly, shortleaf, longleaf, and slash pine from age 0 to 50 years.
|
|
26
|
+
|
|
27
|
+
## Supported Species
|
|
28
|
+
|
|
29
|
+
| Code | Species | Scientific Name |
|
|
30
|
+
|------|---------|-----------------|
|
|
31
|
+
| LP | Loblolly Pine | *Pinus taeda* |
|
|
32
|
+
| SP | Shortleaf Pine | *Pinus echinata* |
|
|
33
|
+
| LL | Longleaf Pine | *Pinus palustris* |
|
|
34
|
+
| SA | Slash Pine | *Pinus elliottii* |
|
|
35
|
+
|
|
36
|
+
## Quick Start
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install pyfvs
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
from pyfvs import Stand
|
|
44
|
+
|
|
45
|
+
# Initialize a planted stand
|
|
46
|
+
stand = Stand.initialize_planted(
|
|
47
|
+
species="LP",
|
|
48
|
+
trees_per_acre=500,
|
|
49
|
+
site_index=70
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Simulate 50 years of growth
|
|
53
|
+
stand.grow(years=50)
|
|
54
|
+
|
|
55
|
+
# Get results
|
|
56
|
+
metrics = stand.get_metrics()
|
|
57
|
+
print(f"Final volume: {metrics['volume']:.0f} ft³/acre")
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Growth Models
|
|
61
|
+
|
|
62
|
+
pyFVS implements individual tree growth models from FVS documentation:
|
|
63
|
+
|
|
64
|
+
### Height-Diameter (Curtis-Arney)
|
|
65
|
+
```
|
|
66
|
+
height = 4.5 + p2 × exp(-p3 × DBH^p4)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Large Tree Diameter Growth
|
|
70
|
+
```
|
|
71
|
+
ln(DDS) = β₁ + β₂×ln(DBH) + β₃×DBH² + β₄×ln(CR) + β₅×RH + β₆×SI + ...
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Small Tree Height Growth (Chapman-Richards)
|
|
75
|
+
```
|
|
76
|
+
height = c1 × SI^c2 × (1 - exp(c3 × age))^(c4 × SI^c5)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Architecture
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
Tree Initial State
|
|
83
|
+
│
|
|
84
|
+
▼
|
|
85
|
+
DBH >= 3.0? ──No──► Small Tree Model
|
|
86
|
+
│ │
|
|
87
|
+
Yes ▼
|
|
88
|
+
│ Height Growth
|
|
89
|
+
▼ │
|
|
90
|
+
Large Tree Model ▼
|
|
91
|
+
│ Height-Diameter
|
|
92
|
+
▼ │
|
|
93
|
+
Predict ln(DDS) ▼
|
|
94
|
+
│ Update DBH
|
|
95
|
+
▼ │
|
|
96
|
+
Calculate DBH Growth │
|
|
97
|
+
│ │
|
|
98
|
+
└────────┬───────────┘
|
|
99
|
+
▼
|
|
100
|
+
Update Crown Ratio
|
|
101
|
+
│
|
|
102
|
+
▼
|
|
103
|
+
Crown Competition
|
|
104
|
+
│
|
|
105
|
+
▼
|
|
106
|
+
Updated Tree State
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Configuration
|
|
110
|
+
|
|
111
|
+
Species parameters are stored in YAML configuration files:
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
# cfg/species/lp_loblolly_pine.yaml
|
|
115
|
+
species_code: "LP"
|
|
116
|
+
common_name: "Loblolly Pine"
|
|
117
|
+
height_diameter:
|
|
118
|
+
p2: 243.860648
|
|
119
|
+
p3: 4.28460566
|
|
120
|
+
p4: -0.47130185
|
|
121
|
+
bark_ratio:
|
|
122
|
+
b1: -0.48140
|
|
123
|
+
b2: 0.91413
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Output
|
|
127
|
+
|
|
128
|
+
pyFVS generates yield tables with standard forest metrics:
|
|
129
|
+
|
|
130
|
+
| Age | TPA | QMD | Height | BA | Volume |
|
|
131
|
+
|-----|-----|-----|--------|-----|--------|
|
|
132
|
+
| 0 | 500 | 0.5 | 1.0 | 0.7 | 0 |
|
|
133
|
+
| 10 | 485 | 4.2 | 28.5 | 47.2 | 892 |
|
|
134
|
+
| 20 | 420 | 7.8 | 52.1 | 139.8 | 3,241 |
|
|
135
|
+
| 30 | 310 | 10.4 | 68.3 | 182.5 | 5,128 |
|
|
136
|
+
| ... | ... | ... | ... | ... | ... |
|
|
137
|
+
|
|
138
|
+
## Integration with pyFIA
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from pyfia import FIA
|
|
142
|
+
from pyfvs import Stand
|
|
143
|
+
|
|
144
|
+
# Get current stand conditions from FIA
|
|
145
|
+
with FIA("database.duckdb") as db:
|
|
146
|
+
db.clip_by_state(37)
|
|
147
|
+
stand_data = db.get_stand_summary(plot_id="123")
|
|
148
|
+
|
|
149
|
+
# Initialize pyFVS with FIA data
|
|
150
|
+
stand = Stand.from_fia_data(stand_data)
|
|
151
|
+
stand.grow(years=30)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## The FIAtools Ecosystem
|
|
155
|
+
|
|
156
|
+
pyFVS is part of the [FIAtools Python ecosystem](https://fiatools.org) - a unified suite of open-source tools for forest inventory analysis:
|
|
157
|
+
|
|
158
|
+
| Tool | Purpose | Key Features |
|
|
159
|
+
|------|---------|--------------|
|
|
160
|
+
| [**pyFIA**](https://fiatools.org) | Survey & plot data | DuckDB backend, 10-100x faster than EVALIDator |
|
|
161
|
+
| [**gridFIA**](https://fiatools.org) | Spatial raster analysis | 327 species at 30m resolution, Zarr storage |
|
|
162
|
+
| [**pyFVS**](https://fiatools.org) | Growth simulation | Chapman-Richards curves, yield projections |
|
|
163
|
+
| [**askFIA**](https://fiatools.org) | AI interface | Natural language queries for forest data |
|
|
164
|
+
|
|
165
|
+
**[Explore the full ecosystem at fiatools.org](https://fiatools.org)**
|
|
166
|
+
|
|
167
|
+
## References
|
|
168
|
+
|
|
169
|
+
- [FVS Southern Variant Documentation](https://www.fs.usda.gov/fmsc/fvs/)
|
|
170
|
+
- Bechtold & Patterson (2005) "The Enhanced Forest Inventory and Analysis Program"
|
|
171
|
+
|
|
172
|
+
## Citation
|
|
173
|
+
|
|
174
|
+
```bibtex
|
|
175
|
+
@software{pyfvs2025,
|
|
176
|
+
title = {pyFVS: Python Implementation of the Forest Vegetation Simulator},
|
|
177
|
+
author = {Mihiar, Christopher},
|
|
178
|
+
year = {2025},
|
|
179
|
+
url = {https://fiatools.org}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
<div align="center">
|
|
186
|
+
<a href="https://fiatools.org"><strong>fiatools.org</strong></a> · Python Ecosystem for Forest Inventory Analysis<br>
|
|
187
|
+
<sub>Built by <a href="https://github.com/mihiarc">Chris Mihiar</a> · USDA Forest Service Southern Research Station</sub>
|
|
188
|
+
</div>
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "fvs-python"
|
|
7
|
+
version = "0.2.3"
|
|
8
|
+
description = "Python implementation of the Forest Vegetation Simulator - Part of the FIA Python Ecosystem"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = {text = "MIT"}
|
|
11
|
+
authors = [
|
|
12
|
+
{name = "Chris Mihiar", email = "chris.mihiar@gmail.com"}
|
|
13
|
+
]
|
|
14
|
+
maintainers = [
|
|
15
|
+
{name = "Chris Mihiar", email = "chris.mihiar@gmail.com"}
|
|
16
|
+
]
|
|
17
|
+
keywords = [
|
|
18
|
+
# Core functionality
|
|
19
|
+
"fvs",
|
|
20
|
+
"forest-vegetation-simulator",
|
|
21
|
+
"growth-simulation",
|
|
22
|
+
"yield-tables",
|
|
23
|
+
"forestry",
|
|
24
|
+
# Species & regions
|
|
25
|
+
"southern-pine",
|
|
26
|
+
"loblolly-pine",
|
|
27
|
+
"longleaf-pine",
|
|
28
|
+
"slash-pine",
|
|
29
|
+
"shortleaf-pine",
|
|
30
|
+
# Methods
|
|
31
|
+
"chapman-richards",
|
|
32
|
+
"individual-tree-growth",
|
|
33
|
+
"stand-projection",
|
|
34
|
+
"timber-volume",
|
|
35
|
+
# Ecosystem
|
|
36
|
+
"fia",
|
|
37
|
+
"fiatools",
|
|
38
|
+
"forest-inventory",
|
|
39
|
+
"usda",
|
|
40
|
+
"forest-service",
|
|
41
|
+
]
|
|
42
|
+
classifiers = [
|
|
43
|
+
"Development Status :: 4 - Beta",
|
|
44
|
+
"Intended Audience :: Science/Research",
|
|
45
|
+
"Intended Audience :: Developers",
|
|
46
|
+
"Topic :: Scientific/Engineering",
|
|
47
|
+
"Topic :: Scientific/Engineering :: Bio-Informatics",
|
|
48
|
+
"Topic :: Scientific/Engineering :: Information Analysis",
|
|
49
|
+
"License :: OSI Approved :: MIT License",
|
|
50
|
+
"Operating System :: OS Independent",
|
|
51
|
+
"Natural Language :: English",
|
|
52
|
+
"Environment :: Console",
|
|
53
|
+
"Programming Language :: Python :: 3",
|
|
54
|
+
"Programming Language :: Python :: 3.9",
|
|
55
|
+
"Programming Language :: Python :: 3.10",
|
|
56
|
+
"Programming Language :: Python :: 3.11",
|
|
57
|
+
"Programming Language :: Python :: 3.12",
|
|
58
|
+
]
|
|
59
|
+
requires-python = ">=3.8"
|
|
60
|
+
dependencies = [
|
|
61
|
+
"numpy>=1.21.0",
|
|
62
|
+
"pandas>=1.3.0",
|
|
63
|
+
"scipy>=1.7.0",
|
|
64
|
+
"matplotlib>=3.4.0",
|
|
65
|
+
"seaborn>=0.11.0",
|
|
66
|
+
"pyyaml>=6.0.0",
|
|
67
|
+
"pydantic>=2.5.0",
|
|
68
|
+
"tomli>=2.0.0; python_version<'3.11'",
|
|
69
|
+
"tomli-w>=1.0.0",
|
|
70
|
+
"tabulate>=0.9.0",
|
|
71
|
+
"openpyxl>=3.0.0",
|
|
72
|
+
"rich>=12.0.0",
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
[project.optional-dependencies]
|
|
76
|
+
dev = [
|
|
77
|
+
"pytest>=6.0.0",
|
|
78
|
+
"pytest-cov>=3.0.0",
|
|
79
|
+
"black>=22.0.0",
|
|
80
|
+
"flake8>=4.0.0",
|
|
81
|
+
"mypy>=0.900",
|
|
82
|
+
"pre-commit>=2.15.0",
|
|
83
|
+
"mkdocs>=1.6.0",
|
|
84
|
+
"mkdocs-material>=9.5.0",
|
|
85
|
+
"mkdocstrings[python]>=0.24.0",
|
|
86
|
+
]
|
|
87
|
+
test = [
|
|
88
|
+
"pytest>=6.0.0",
|
|
89
|
+
"pytest-cov>=3.0.0",
|
|
90
|
+
"pytest-xdist>=2.0.0",
|
|
91
|
+
]
|
|
92
|
+
docs = [
|
|
93
|
+
"mkdocs>=1.6.0",
|
|
94
|
+
"mkdocs-material>=9.5.0",
|
|
95
|
+
"mkdocstrings[python]>=0.24.0",
|
|
96
|
+
"pymdown-extensions>=10.7",
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
[project.urls]
|
|
100
|
+
Homepage = "https://fiatools.org/tools/pyfvs/"
|
|
101
|
+
Repository = "https://github.com/mihiarc/pyfvs"
|
|
102
|
+
Documentation = "https://mihiarc.github.io/pyfvs/"
|
|
103
|
+
"Source Code" = "https://github.com/mihiarc/pyfvs"
|
|
104
|
+
"Bug Tracker" = "https://github.com/mihiarc/pyfvs/issues"
|
|
105
|
+
Changelog = "https://github.com/mihiarc/pyfvs/releases"
|
|
106
|
+
"FIA Ecosystem" = "https://fiatools.org"
|
|
107
|
+
|
|
108
|
+
[tool.setuptools]
|
|
109
|
+
package-dir = {"" = "src"}
|
|
110
|
+
|
|
111
|
+
[tool.setuptools.packages.find]
|
|
112
|
+
where = ["src"]
|
|
113
|
+
include = ["pyfvs*"]
|
|
114
|
+
|
|
115
|
+
[tool.setuptools.package-data]
|
|
116
|
+
pyfvs = ["cfg/**/*.yaml", "cfg/**/*.yml", "cfg/**/*.json", "cfg/**/*.md"]
|
|
117
|
+
|
|
118
|
+
# Black configuration
|
|
119
|
+
[tool.black]
|
|
120
|
+
line-length = 88
|
|
121
|
+
target-version = ['py38', 'py39', 'py310', 'py311', 'py312']
|
|
122
|
+
include = '\.pyi?$'
|
|
123
|
+
extend-exclude = '''
|
|
124
|
+
/(
|
|
125
|
+
# directories
|
|
126
|
+
\.eggs
|
|
127
|
+
| \.git
|
|
128
|
+
| \.hg
|
|
129
|
+
| \.mypy_cache
|
|
130
|
+
| \.tox
|
|
131
|
+
| \.venv
|
|
132
|
+
| build
|
|
133
|
+
| dist
|
|
134
|
+
| archive
|
|
135
|
+
)/
|
|
136
|
+
'''
|
|
137
|
+
|
|
138
|
+
# isort configuration
|
|
139
|
+
[tool.isort]
|
|
140
|
+
profile = "black"
|
|
141
|
+
multi_line_output = 3
|
|
142
|
+
line_length = 88
|
|
143
|
+
known_first_party = ["pyfvs"]
|
|
144
|
+
skip_glob = ["archive/*"]
|
|
145
|
+
|
|
146
|
+
# MyPy configuration
|
|
147
|
+
[tool.mypy]
|
|
148
|
+
python_version = "3.8"
|
|
149
|
+
warn_return_any = true
|
|
150
|
+
warn_unused_configs = true
|
|
151
|
+
disallow_untyped_defs = true
|
|
152
|
+
disallow_incomplete_defs = true
|
|
153
|
+
check_untyped_defs = true
|
|
154
|
+
disallow_untyped_decorators = true
|
|
155
|
+
no_implicit_optional = true
|
|
156
|
+
warn_redundant_casts = true
|
|
157
|
+
warn_unused_ignores = true
|
|
158
|
+
warn_no_return = true
|
|
159
|
+
warn_unreachable = true
|
|
160
|
+
strict_equality = true
|
|
161
|
+
|
|
162
|
+
[[tool.mypy.overrides]]
|
|
163
|
+
module = [
|
|
164
|
+
"matplotlib.*",
|
|
165
|
+
"scipy.*",
|
|
166
|
+
"pandas.*",
|
|
167
|
+
"numpy.*",
|
|
168
|
+
]
|
|
169
|
+
ignore_missing_imports = true
|
|
170
|
+
|
|
171
|
+
# Pytest configuration
|
|
172
|
+
[tool.pytest.ini_options]
|
|
173
|
+
minversion = "6.0"
|
|
174
|
+
addopts = [
|
|
175
|
+
"-ra",
|
|
176
|
+
"--strict-markers",
|
|
177
|
+
"--strict-config",
|
|
178
|
+
"--cov=pyfvs",
|
|
179
|
+
"--cov-report=term-missing",
|
|
180
|
+
"--cov-report=html",
|
|
181
|
+
"--cov-report=xml",
|
|
182
|
+
]
|
|
183
|
+
testpaths = ["tests"]
|
|
184
|
+
python_files = ["test_*.py"]
|
|
185
|
+
python_classes = ["Test*"]
|
|
186
|
+
python_functions = ["test_*"]
|
|
187
|
+
markers = [
|
|
188
|
+
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
|
189
|
+
"integration: marks tests as integration tests",
|
|
190
|
+
"unit: marks tests as unit tests",
|
|
191
|
+
]
|
|
192
|
+
|
|
193
|
+
# Coverage configuration
|
|
194
|
+
[tool.coverage.run]
|
|
195
|
+
source = ["src"]
|
|
196
|
+
omit = [
|
|
197
|
+
"*/tests/*",
|
|
198
|
+
"*/archive/*",
|
|
199
|
+
"*/__pycache__/*",
|
|
200
|
+
"*/.*",
|
|
201
|
+
]
|
|
202
|
+
|
|
203
|
+
[tool.coverage.report]
|
|
204
|
+
exclude_lines = [
|
|
205
|
+
"pragma: no cover",
|
|
206
|
+
"def __repr__",
|
|
207
|
+
"if self.debug:",
|
|
208
|
+
"if settings.DEBUG",
|
|
209
|
+
"raise AssertionError",
|
|
210
|
+
"raise NotImplementedError",
|
|
211
|
+
"if 0:",
|
|
212
|
+
"if __name__ == .__main__.:",
|
|
213
|
+
"class .*\\bProtocol\\):",
|
|
214
|
+
"@(abc\\.)?abstractmethod",
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
[dependency-groups]
|
|
218
|
+
dev = [
|
|
219
|
+
"pytest>=8.3.5",
|
|
220
|
+
"pytest-cov>=5.0.0",
|
|
221
|
+
"pytest-xdist>=3.6.1",
|
|
222
|
+
]
|
|
223
|
+
|
|
224
|
+
# Flake8 configuration (in setup.cfg since flake8 doesn't support pyproject.toml yet)
|
|
225
|
+
# See setup.cfg for flake8 configuration
|