mapFolding 0.17.0__py3-none-any.whl → 0.18.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- easyRun/NOTcountingFolds.py +16 -10
- easyRun/__init__.py +1 -0
- easyRun/countFolds.py +17 -9
- easyRun/meanders.py +6 -8
- mapFolding/__init__.py +24 -35
- mapFolding/_e/Z0Z_analysisPython/SORTZ0Z_hypothesis.py +189 -0
- mapFolding/_e/Z0Z_analysisPython/SORTZ0Z_p2d6.py +143 -0
- mapFolding/_e/Z0Z_analysisPython/__init__.py +4 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/__init__.py +0 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200.py +369 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/2001.py +694 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/270/211.py +514 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/270/2111.py +480 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/272/214.py +511 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/272/2141.py +515 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/272/214/344/270/211.py +485 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/272/214/344/270/2111.py +442 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/211.py +313 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/2111.py +343 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/272/214.py +400 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/272/2141.py +497 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/272/214/344/270/211.py +463 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/272/214/344/270/2111.py +441 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266.py +35 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/2661.py +35 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200.py +382 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/2001.py +630 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/270/211.py +488 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/270/2111.py +475 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/272/214.py +473 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/272/2141.py +500 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211.py +465 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111.py +439 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/211.py +599 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/2111.py +536 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/272/214.py +506 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/272/2141.py +533 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/272/214/344/270/211.py +489 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/272/214/344/270/2111.py +474 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200.py +1186 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/2001.py +2158 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/2001Negative.py +2158 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200Negative.py +1186 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/270/211.py +1397 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/270/2111.py +1291 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/270/2111Negative.py +1291 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/270/211Negative.py +1397 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214.py +1240 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/2141.py +1420 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/2141Negative.py +1420 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214Negative.py +1240 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214/344/270/211.py +1366 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214/344/270/2111.py +1274 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214/344/270/2111Negative.py +1274 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214/344/270/211Negative.py +1366 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/211.py +1186 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/2111.py +1186 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/2111Negative.py +1186 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/211Negative.py +1186 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214.py +1102 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/2141.py +1422 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/2141Negative.py +1422 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214Negative.py +1102 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214/344/270/211.py +1240 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214/344/270/2111.py +1228 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214/344/270/2111Negative.py +1228 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214/344/270/211Negative.py +1240 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266.py +32 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/2661.py +1162 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/2661Negative.py +1162 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266Negative.py +32 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200.py +1186 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/2001.py +1926 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/2001Negative.py +1926 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200Negative.py +1186 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/270/211.py +1291 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/270/2111.py +1176 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/270/2111Negative.py +1176 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/270/211Negative.py +1291 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214.py +1228 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/2141.py +1324 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/2141Negative.py +1324 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214Negative.py +1228 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211.py +1274 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111.py +1038 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111Negative.py +1038 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211Negative.py +1274 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/211.py +2158 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/2111.py +1926 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/2111Negative.py +1926 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/211Negative.py +2158 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214.py +1422 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/2141.py +1364 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/2141Negative.py +1364 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214Negative.py +1422 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214/344/270/211.py +1420 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214/344/270/2111.py +1324 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214/344/270/2111Negative.py +1324 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214/344/270/211Negative.py +1420 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200.py +3133 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/2001.py +6039 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/2001Negative.py +6039 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200Negative.py +3133 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/270/211.py +3527 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/270/2111.py +2300 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/270/2111Negative.py +2300 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/270/211Negative.py +3527 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214.py +3597 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/2141.py +3317 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/2141Negative.py +3317 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214Negative.py +3597 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214/344/270/211.py +3161 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214/344/270/2111.py +2877 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214/344/270/2111Negative.py +2877 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214/344/270/211Negative.py +3161 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/211.py +2981 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/2111.py +3055 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/2111Negative.py +3055 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/211Negative.py +2981 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214.py +3221 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/2141.py +3988 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/2141Negative.py +3988 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214Negative.py +3221 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214/344/270/211.py +3652 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214/344/270/2111.py +2863 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214/344/270/2111Negative.py +2863 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214/344/270/211Negative.py +3652 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200.py +2485 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/2001.py +4566 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/2001Negative.py +4566 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200Negative.py +2485 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/270/211.py +3006 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/270/2111.py +2485 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/270/2111Negative.py +2485 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/270/211Negative.py +3006 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214.py +3304 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/2141.py +3015 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/2141Negative.py +3015 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214Negative.py +3304 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211.py +2939 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111.py +2589 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111Negative.py +2589 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211Negative.py +2939 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/211.py +3899 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/2111.py +2996 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/2111Negative.py +2996 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/211Negative.py +3899 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214.py +3223 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/2141.py +3020 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/2141Negative.py +3020 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214Negative.py +3223 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214/344/270/211.py +3250 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214/344/270/2111.py +2667 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214/344/270/2111Negative.py +2667 -0
- mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214/344/270/211Negative.py +3250 -0
- mapFolding/_e/Z0Z_analysisPython/measure.py +162 -0
- mapFolding/_e/Z0Z_analysisPython/positionAnalysis.py +403 -0
- mapFolding/_e/Z0Z_analysisPython/positionAnalysisPileRanges2d6.py +110 -0
- mapFolding/_e/Z0Z_analysisPython/theExcluderBeast.py +640 -0
- mapFolding/_e/Z0Z_analysisPython/toolkit.py +166 -0
- mapFolding/_e/Z0Z_analysisPython/toolkitCSVsequences.py +188 -0
- mapFolding/_e/Z0Z_analysisPython/workBenchPatternFinder.py +284 -0
- mapFolding/_e/Z0Z_notes/__init__.py +0 -0
- mapFolding/_e/Z0Z_notes/knowledgeDump.py +214 -0
- mapFolding/_e/__init__.py +45 -0
- mapFolding/_e/_beDRY.py +547 -0
- mapFolding/_e/_dataDynamic.py +1164 -0
- mapFolding/_e/_measure.py +579 -0
- mapFolding/_e/_semiotics.py +363 -0
- mapFolding/_e/_theTypes.py +31 -0
- mapFolding/_e/algorithms/__init__.py +1 -0
- mapFolding/_e/algorithms/constraintPropagation.py +158 -0
- mapFolding/_e/algorithms/elimination.py +118 -0
- mapFolding/_e/algorithms/eliminationCrease.py +66 -0
- mapFolding/_e/algorithms/iff.py +584 -0
- mapFolding/_e/basecamp.py +89 -0
- mapFolding/_e/dataBaskets.py +123 -0
- mapFolding/_e/dataRaw/__init__.py +0 -0
- mapFolding/_e/easyRun/__init__.py +0 -0
- mapFolding/_e/easyRun/eliminateFolds.py +72 -0
- mapFolding/_e/easyRun/pinning.py +62 -0
- mapFolding/_e/filters.py +384 -0
- mapFolding/_e/pin2/344/270/212nDimensions.py +882 -0
- mapFolding/_e/pin2/344/270/212nDimensionsAnnex.py +551 -0
- mapFolding/_e/pin2/344/270/212nDimensionsByCrease.py +190 -0
- mapFolding/_e/pin2/344/270/212nDimensionsByDomain.py +459 -0
- mapFolding/_e/pinIt.py +436 -0
- mapFolding/_semiotics.py +42 -0
- mapFolding/_theSSOT.py +11 -56
- mapFolding/_theTypes.py +52 -68
- mapFolding/algorithms/A086345.py +8 -3
- mapFolding/algorithms/__init__.py +1 -1
- mapFolding/algorithms/matrixMeandersNumPyndas.py +18 -18
- mapFolding/algorithms/oeisIDbyFormula.py +4 -4
- mapFolding/algorithms/zCuzDocStoopidoeisIDbyFormula.py +3 -3
- mapFolding/basecamp.py +13 -28
- mapFolding/beDRY.py +108 -99
- mapFolding/filesystemToolkit.py +15 -11
- mapFolding/oeis.py +17 -16
- mapFolding/reference/matrixMeandersAnalysis/prefixNotationNotes.py +2 -2
- mapFolding/reference/meandersDumpingGround/matrixMeandersBaselineV2.py +0 -1
- mapFolding/reference/meandersDumpingGround/matrixMeandersNumPyV1finalForm.py +8 -10
- mapFolding/someAssemblyRequired/RecipeJob.py +5 -5
- mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +5 -2
- mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +9 -11
- mapFolding/someAssemblyRequired/mapFoldingModules/makeMapFoldingModules.py +2 -1
- mapFolding/someAssemblyRequired/transformationTools.py +2 -2
- mapFolding/tests/Z0Z_test_e_excluder.py +155 -0
- mapFolding/tests/conftest.py +193 -314
- mapFolding/tests/dataSamples/A001417.py +455 -0
- mapFolding/tests/dataSamples/__init__.py +1 -0
- mapFolding/tests/dataSamples/measurementData.py +1818 -0
- mapFolding/tests/dataSamples/p2DnDomain3_2_/351/246/226/344/270/200_/351/246/226/351/233/266/344/270/200.py +17 -0
- mapFolding/tests/dataSamples/p2DnDomain3_/351/246/226/344/270/200.py +17 -0
- mapFolding/tests/dataSamples/p2DnDomain5_4.py +17 -0
- mapFolding/tests/dataSamples/p2DnDomain6_5.py +17 -0
- mapFolding/tests/dataSamples/p2DnDomain6_7_5_4.py +17 -0
- mapFolding/tests/dataSamples/p2DnDomain7_6.py +17 -0
- mapFolding/tests/dataSamples/p2DnDomain/351/246/226/344/272/214_/351/246/226/351/233/266/344/270/200/344/272/214.py +17 -0
- mapFolding/tests/dataSamples/p2DnDomain/351/246/226/344/272/214_/351/246/226/351/233/266/344/272/214_/351/246/226/351/233/266/344/270/200/344/272/214_/351/246/226/344/270/200/344/272/214.py +17 -0
- mapFolding/tests/dataSamples/p2DnDomain/351/246/226/351/233/266/344/270/200/344/272/214_/351/246/226/344/270/200/344/272/214.py +15 -0
- mapFolding/tests/dataSamples/p2DnDomain/351/246/226/351/233/266/344/272/214_/351/246/226/344/272/214.py +15 -0
- mapFolding/tests/dataSamples/semioticsData.py +135 -0
- mapFolding/tests/test_computations.py +133 -88
- mapFolding/tests/test_e_computations.py +42 -0
- mapFolding/tests/test_e_dataDynamic.py +189 -0
- mapFolding/tests/test_e_measurements.py +257 -0
- mapFolding/tests/test_e_pinning.py +61 -0
- mapFolding/tests/test_e_semiotics.py +128 -0
- mapFolding/tests/test_filesystem.py +39 -17
- mapFolding/tests/{test_other.py → test_parameterValidation.py} +3 -3
- mapFolding/tests/{test_tasks.py → test_taskDivisions.py} +42 -23
- mapFolding/zCuzDocStoopid/makeDocstrings.py +3 -2
- {mapfolding-0.17.0.dist-info → mapfolding-0.18.0.dist-info}/METADATA +15 -9
- mapfolding-0.18.0.dist-info/RECORD +305 -0
- {mapfolding-0.17.0.dist-info → mapfolding-0.18.0.dist-info}/WHEEL +1 -1
- easyRun/A000682.py +0 -25
- easyRun/A005316.py +0 -20
- mapFolding/algorithms/A000136constraintPropagation.py +0 -95
- mapFolding/algorithms/A000136elimination.py +0 -163
- mapFolding/algorithms/A000136eliminationParallel.py +0 -77
- mapfolding-0.17.0.dist-info/RECORD +0 -107
- {mapfolding-0.17.0.dist-info → mapfolding-0.18.0.dist-info}/entry_points.txt +0 -0
- {mapfolding-0.17.0.dist-info → mapfolding-0.18.0.dist-info}/licenses/LICENSE +0 -0
- {mapfolding-0.17.0.dist-info → mapfolding-0.18.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"""Tests for mapFolding._e._measure module.
|
|
2
|
+
|
|
3
|
+
Tests verify each function against pre-computed verification data stored in
|
|
4
|
+
dataSamples/measurementData.py. The verification data was independently validated
|
|
5
|
+
using pure Python implementations without gmpy2 dependencies.
|
|
6
|
+
|
|
7
|
+
Each function is tested across its valid input range (0-256 inclusive for most,
|
|
8
|
+
2-256 for leafInSubHyperplane, 5-256 for ptount) and also tested for proper
|
|
9
|
+
exception handling on invalid inputs.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from mapFolding._e import (
|
|
13
|
+
dimensionNearestTail, dimensionNearest首, dimensionSecondNearest首, dimensionThirdNearest首,
|
|
14
|
+
howManyDimensionsHaveOddParity, leafInSubHyperplane, ptount)
|
|
15
|
+
from mapFolding.tests.conftest import standardizedEqualToCallableReturn
|
|
16
|
+
from mapFolding.tests.dataSamples.measurementData import (
|
|
17
|
+
dataDimensionNearest, dataDimensionSecondNearest, dataDimensionThirdNearest, dataHowMany0coordinatesAtTail,
|
|
18
|
+
dataHowManyDimensionsHaveOddParity, dataLeafInSubHyperplane, dataPtount)
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
@pytest.fixture
|
|
22
|
+
def dataMeasurementDimensionNearest() -> dict[int, int]:
|
|
23
|
+
"""Provide verification data for dimensionNearest首."""
|
|
24
|
+
return dataDimensionNearest
|
|
25
|
+
|
|
26
|
+
@pytest.fixture
|
|
27
|
+
def dataMeasurementDimensionSecondNearest() -> dict[int, int | None]:
|
|
28
|
+
"""Provide verification data for dimensionSecondNearest首."""
|
|
29
|
+
return dataDimensionSecondNearest
|
|
30
|
+
|
|
31
|
+
@pytest.fixture
|
|
32
|
+
def dataMeasurementDimensionThirdNearest() -> dict[int, int | None]:
|
|
33
|
+
"""Provide verification data for dimensionThirdNearest首."""
|
|
34
|
+
return dataDimensionThirdNearest
|
|
35
|
+
|
|
36
|
+
@pytest.fixture
|
|
37
|
+
def dataMeasurementLeafInSubHyperplane() -> dict[int, int]:
|
|
38
|
+
"""Provide verification data for leafInSubHyperplane."""
|
|
39
|
+
return dataLeafInSubHyperplane
|
|
40
|
+
|
|
41
|
+
@pytest.fixture
|
|
42
|
+
def dataMeasurementHowMany0coordinatesAtTail() -> dict[int, int]:
|
|
43
|
+
"""Provide verification data for howMany0coordinatesAtTail."""
|
|
44
|
+
return dataHowMany0coordinatesAtTail
|
|
45
|
+
|
|
46
|
+
@pytest.fixture
|
|
47
|
+
def dataMeasurementHowManyDimensionsHaveOddParity() -> dict[int, int]:
|
|
48
|
+
"""Provide verification data for howManyDimensionsHaveOddParity."""
|
|
49
|
+
return dataHowManyDimensionsHaveOddParity
|
|
50
|
+
|
|
51
|
+
@pytest.fixture
|
|
52
|
+
def dataMeasurementPtount() -> dict[int, int]:
|
|
53
|
+
"""Provide verification data for ptount."""
|
|
54
|
+
return dataPtount
|
|
55
|
+
|
|
56
|
+
class TestDimensionNearest:
|
|
57
|
+
"""Tests for dimensionNearest首: finds 0-indexed position of MSB."""
|
|
58
|
+
|
|
59
|
+
@pytest.mark.parametrize(
|
|
60
|
+
"inputValue,expectedResult",
|
|
61
|
+
[
|
|
62
|
+
(inputValue, expectedResult)
|
|
63
|
+
for inputValue, expectedResult in dataDimensionNearest.items()
|
|
64
|
+
],
|
|
65
|
+
ids=[f"n={inputValue}" for inputValue in dataDimensionNearest],
|
|
66
|
+
)
|
|
67
|
+
def test_dimensionNearest_validInputs(
|
|
68
|
+
self,
|
|
69
|
+
inputValue: int,
|
|
70
|
+
expectedResult: int,
|
|
71
|
+
) -> None:
|
|
72
|
+
standardizedEqualToCallableReturn(expectedResult, dimensionNearest首, inputValue)
|
|
73
|
+
|
|
74
|
+
@pytest.mark.parametrize(
|
|
75
|
+
"invalidInput",
|
|
76
|
+
[-1, -7, -13, -256],
|
|
77
|
+
ids=["n=-1", "n=-7", "n=-13", "n=-256"],
|
|
78
|
+
)
|
|
79
|
+
def test_dimensionNearest_negativeInputsRaiseValueError(
|
|
80
|
+
self,
|
|
81
|
+
invalidInput: int,
|
|
82
|
+
) -> None:
|
|
83
|
+
standardizedEqualToCallableReturn(ValueError, dimensionNearest首, invalidInput)
|
|
84
|
+
|
|
85
|
+
class TestDimensionSecondNearest:
|
|
86
|
+
"""Tests for dimensionSecondNearest首: finds 0-indexed position of second MSB."""
|
|
87
|
+
|
|
88
|
+
@pytest.mark.parametrize(
|
|
89
|
+
"inputValue,expectedResult",
|
|
90
|
+
[
|
|
91
|
+
(inputValue, expectedResult)
|
|
92
|
+
for inputValue, expectedResult in dataDimensionSecondNearest.items()
|
|
93
|
+
],
|
|
94
|
+
ids=[f"n={inputValue}" for inputValue in dataDimensionSecondNearest],
|
|
95
|
+
)
|
|
96
|
+
def test_dimensionSecondNearest_validInputs(
|
|
97
|
+
self,
|
|
98
|
+
inputValue: int,
|
|
99
|
+
expectedResult: int | None,
|
|
100
|
+
) -> None:
|
|
101
|
+
standardizedEqualToCallableReturn(expectedResult, dimensionSecondNearest首, inputValue)
|
|
102
|
+
|
|
103
|
+
@pytest.mark.parametrize(
|
|
104
|
+
"invalidInput",
|
|
105
|
+
[-1, -5, -11, -128],
|
|
106
|
+
ids=["n=-1", "n=-5", "n=-11", "n=-128"],
|
|
107
|
+
)
|
|
108
|
+
def test_dimensionSecondNearest_negativeInputsRaiseValueError(
|
|
109
|
+
self,
|
|
110
|
+
invalidInput: int,
|
|
111
|
+
) -> None:
|
|
112
|
+
standardizedEqualToCallableReturn(ValueError, dimensionSecondNearest首, invalidInput)
|
|
113
|
+
|
|
114
|
+
class TestDimensionThirdNearest:
|
|
115
|
+
"""Tests for dimensionThirdNearest首: finds 0-indexed position of third MSB."""
|
|
116
|
+
|
|
117
|
+
@pytest.mark.parametrize(
|
|
118
|
+
"inputValue,expectedResult",
|
|
119
|
+
[
|
|
120
|
+
(inputValue, expectedResult)
|
|
121
|
+
for inputValue, expectedResult in dataDimensionThirdNearest.items()
|
|
122
|
+
],
|
|
123
|
+
ids=[f"n={inputValue}" for inputValue in dataDimensionThirdNearest],
|
|
124
|
+
)
|
|
125
|
+
def test_dimensionThirdNearest_validInputs(
|
|
126
|
+
self,
|
|
127
|
+
inputValue: int,
|
|
128
|
+
expectedResult: int | None,
|
|
129
|
+
) -> None:
|
|
130
|
+
standardizedEqualToCallableReturn(expectedResult, dimensionThirdNearest首, inputValue)
|
|
131
|
+
|
|
132
|
+
@pytest.mark.parametrize(
|
|
133
|
+
"invalidInput",
|
|
134
|
+
[-1, -3, -17, -64],
|
|
135
|
+
ids=["n=-1", "n=-3", "n=-17", "n=-64"],
|
|
136
|
+
)
|
|
137
|
+
def test_dimensionThirdNearest_negativeInputsRaiseValueError(
|
|
138
|
+
self,
|
|
139
|
+
invalidInput: int,
|
|
140
|
+
) -> None:
|
|
141
|
+
standardizedEqualToCallableReturn(ValueError, dimensionThirdNearest首, invalidInput)
|
|
142
|
+
|
|
143
|
+
class TestLeafInSubHyperplane:
|
|
144
|
+
"""Tests for leafInSubHyperplane: projects hyperplane leaf onto sub-hyperplane."""
|
|
145
|
+
|
|
146
|
+
@pytest.mark.parametrize(
|
|
147
|
+
"inputValue,expectedResult",
|
|
148
|
+
[
|
|
149
|
+
(inputValue, expectedResult)
|
|
150
|
+
for inputValue, expectedResult in dataLeafInSubHyperplane.items()
|
|
151
|
+
],
|
|
152
|
+
ids=[f"n={inputValue}" for inputValue in dataLeafInSubHyperplane],
|
|
153
|
+
)
|
|
154
|
+
def test_leafInSubHyperplane_validInputs(
|
|
155
|
+
self,
|
|
156
|
+
inputValue: int,
|
|
157
|
+
expectedResult: int,
|
|
158
|
+
) -> None:
|
|
159
|
+
standardizedEqualToCallableReturn(expectedResult, leafInSubHyperplane, inputValue)
|
|
160
|
+
|
|
161
|
+
@pytest.mark.parametrize(
|
|
162
|
+
"invalidInput",
|
|
163
|
+
[0, -1, -7, -19],
|
|
164
|
+
ids=["n=0", "n=-1", "n=-7", "n=-19"],
|
|
165
|
+
)
|
|
166
|
+
def test_leafInSubHyperplane_invalidInputsRaiseValueError(
|
|
167
|
+
self,
|
|
168
|
+
invalidInput: int,
|
|
169
|
+
) -> None:
|
|
170
|
+
standardizedEqualToCallableReturn(ValueError, leafInSubHyperplane, invalidInput)
|
|
171
|
+
|
|
172
|
+
class TestHowMany0coordinatesAtTail:
|
|
173
|
+
"""Tests for howMany0coordinatesAtTail: counts trailing zeros (CTZ)."""
|
|
174
|
+
|
|
175
|
+
@pytest.mark.parametrize(
|
|
176
|
+
"inputValue,expectedResult",
|
|
177
|
+
[
|
|
178
|
+
(inputValue, expectedResult)
|
|
179
|
+
for inputValue, expectedResult in dataHowMany0coordinatesAtTail.items()
|
|
180
|
+
],
|
|
181
|
+
ids=[f"n={inputValue}" for inputValue in dataHowMany0coordinatesAtTail],
|
|
182
|
+
)
|
|
183
|
+
def test_howMany0coordinatesAtTail_validInputs(
|
|
184
|
+
self,
|
|
185
|
+
inputValue: int,
|
|
186
|
+
expectedResult: int,
|
|
187
|
+
) -> None:
|
|
188
|
+
standardizedEqualToCallableReturn(expectedResult, dimensionNearestTail, inputValue)
|
|
189
|
+
|
|
190
|
+
@pytest.mark.parametrize(
|
|
191
|
+
"invalidInput",
|
|
192
|
+
[-1, -2, -8, -37],
|
|
193
|
+
ids=["n=-1", "n=-2", "n=-8", "n=-37"],
|
|
194
|
+
)
|
|
195
|
+
def test_howMany0coordinatesAtTail_negativeInputsRaiseValueError(
|
|
196
|
+
self,
|
|
197
|
+
invalidInput: int,
|
|
198
|
+
) -> None:
|
|
199
|
+
standardizedEqualToCallableReturn(ValueError, dimensionNearestTail, invalidInput)
|
|
200
|
+
|
|
201
|
+
class TestHowManyDimensionsHaveOddParity:
|
|
202
|
+
"""Tests for howManyDimensionsHaveOddParity: bit_count - 1, minimum 0."""
|
|
203
|
+
|
|
204
|
+
@pytest.mark.parametrize(
|
|
205
|
+
"inputValue,expectedResult",
|
|
206
|
+
[
|
|
207
|
+
(inputValue, expectedResult)
|
|
208
|
+
for inputValue, expectedResult in dataHowManyDimensionsHaveOddParity.items()
|
|
209
|
+
],
|
|
210
|
+
ids=[f"n={inputValue}" for inputValue in dataHowManyDimensionsHaveOddParity],
|
|
211
|
+
)
|
|
212
|
+
def test_howManyDimensionsHaveOddParity_validInputs(
|
|
213
|
+
self,
|
|
214
|
+
inputValue: int,
|
|
215
|
+
expectedResult: int,
|
|
216
|
+
) -> None:
|
|
217
|
+
standardizedEqualToCallableReturn(expectedResult, howManyDimensionsHaveOddParity, inputValue)
|
|
218
|
+
|
|
219
|
+
@pytest.mark.parametrize(
|
|
220
|
+
"invalidInput",
|
|
221
|
+
[-1, -5, -23, -89],
|
|
222
|
+
ids=["n=-1", "n=-5", "n=-23", "n=-89"],
|
|
223
|
+
)
|
|
224
|
+
def test_howManyDimensionsHaveOddParity_negativeInputsRaiseValueError(
|
|
225
|
+
self,
|
|
226
|
+
invalidInput: int,
|
|
227
|
+
) -> None:
|
|
228
|
+
standardizedEqualToCallableReturn(ValueError, howManyDimensionsHaveOddParity, invalidInput)
|
|
229
|
+
|
|
230
|
+
class TestPtount:
|
|
231
|
+
"""Tests for ptount: measures distance from power of two's bit count after subtracting 3."""
|
|
232
|
+
|
|
233
|
+
@pytest.mark.parametrize(
|
|
234
|
+
"inputValue,expectedResult",
|
|
235
|
+
[
|
|
236
|
+
(inputValue, expectedResult)
|
|
237
|
+
for inputValue, expectedResult in dataPtount.items()
|
|
238
|
+
],
|
|
239
|
+
ids=[f"n={inputValue}" for inputValue in dataPtount],
|
|
240
|
+
)
|
|
241
|
+
def test_ptount_validInputs(
|
|
242
|
+
self,
|
|
243
|
+
inputValue: int,
|
|
244
|
+
expectedResult: int,
|
|
245
|
+
) -> None:
|
|
246
|
+
standardizedEqualToCallableReturn(expectedResult, ptount, inputValue)
|
|
247
|
+
|
|
248
|
+
@pytest.mark.parametrize(
|
|
249
|
+
"invalidInput",
|
|
250
|
+
[0, 1, 2, -1, -7, -41],
|
|
251
|
+
ids=["n=0", "n=1", "n=2", "n=-1", "n=-7", "n=-41"],
|
|
252
|
+
)
|
|
253
|
+
def test_ptount_invalidInputsRaiseValueError(
|
|
254
|
+
self,
|
|
255
|
+
invalidInput: int,
|
|
256
|
+
) -> None:
|
|
257
|
+
standardizedEqualToCallableReturn(ValueError, ptount, invalidInput)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from collections.abc import Callable
|
|
2
|
+
from gmpy2 import xmpz
|
|
3
|
+
from mapFolding._e.dataBaskets import EliminationState
|
|
4
|
+
from mapFolding._e.filters import extractPinnedLeaves
|
|
5
|
+
from mapFolding._e.pin2上nDimensions import (
|
|
6
|
+
pinLeavesDimension一, pinLeavesDimension二, pinLeavesDimension首二, pinPilesAtEnds)
|
|
7
|
+
from numpy.typing import NDArray
|
|
8
|
+
import numpy
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
@pytest.mark.parametrize("dimensionsTotal", [5, 6], ids=lambda dimensionsTotal: f"2d{dimensionsTotal}")
|
|
12
|
+
@pytest.mark.parametrize("pinningFunction", [pinPilesAtEnds, pinLeavesDimension一, pinLeavesDimension二, pinLeavesDimension首二], ids=lambda pinningFunction: pinningFunction.__name__)
|
|
13
|
+
def test_pinningFunctions(loadArrayFoldings: Callable[[int], NDArray[numpy.uint8]], pinningFunction: Callable[[EliminationState], EliminationState], dimensionsTotal: int) -> None:
|
|
14
|
+
mapShape: tuple[int, ...] = (2,) * dimensionsTotal
|
|
15
|
+
state: EliminationState = EliminationState(mapShape=mapShape)
|
|
16
|
+
arrayFoldings: NDArray[numpy.uint8] = loadArrayFoldings(dimensionsTotal)
|
|
17
|
+
|
|
18
|
+
state = pinningFunction(state)
|
|
19
|
+
functionName: str = getattr(pinningFunction, "__name__", pinningFunction.__class__.__name__)
|
|
20
|
+
|
|
21
|
+
rowsTotal: int = int(arrayFoldings.shape[0])
|
|
22
|
+
listRowMasks: list[numpy.ndarray] = []
|
|
23
|
+
|
|
24
|
+
for permutationSpace in state.listPermutationSpace:
|
|
25
|
+
maskRowsMatchThisDictionary: numpy.ndarray = numpy.ones(rowsTotal, dtype=bool)
|
|
26
|
+
for pile, leafOrPileRangeOfLeaves in extractPinnedLeaves(permutationSpace).items():
|
|
27
|
+
if isinstance(leafOrPileRangeOfLeaves, int):
|
|
28
|
+
maskRowsMatchThisDictionary = maskRowsMatchThisDictionary & (arrayFoldings[:, pile] == leafOrPileRangeOfLeaves)
|
|
29
|
+
continue
|
|
30
|
+
if isinstance(leafOrPileRangeOfLeaves, xmpz):
|
|
31
|
+
allowedLeaves: numpy.ndarray = numpy.fromiter(
|
|
32
|
+
(bool(leafOrPileRangeOfLeaves[leaf]) for leaf in range(state.leavesTotal)),
|
|
33
|
+
dtype=bool,
|
|
34
|
+
count=state.leavesTotal,
|
|
35
|
+
)
|
|
36
|
+
maskRowsMatchThisDictionary = maskRowsMatchThisDictionary & allowedLeaves[arrayFoldings[:, pile]]
|
|
37
|
+
listRowMasks.append(maskRowsMatchThisDictionary)
|
|
38
|
+
|
|
39
|
+
masksStacked: numpy.ndarray = numpy.column_stack(listRowMasks)
|
|
40
|
+
coverageCountPerRow: numpy.ndarray = masksStacked.sum(axis=1)
|
|
41
|
+
indicesOverlappedRows: numpy.ndarray = numpy.nonzero(coverageCountPerRow >= 2)[0]
|
|
42
|
+
|
|
43
|
+
countOverlappingDictionaries: int = 0
|
|
44
|
+
if indicesOverlappedRows.size > 0:
|
|
45
|
+
for maskRowsMatchThisDictionary in listRowMasks:
|
|
46
|
+
if bool(maskRowsMatchThisDictionary[indicesOverlappedRows].any()):
|
|
47
|
+
countOverlappingDictionaries += 1
|
|
48
|
+
|
|
49
|
+
maskUnion: numpy.ndarray = numpy.logical_or.reduce(listRowMasks)
|
|
50
|
+
rowsCovered: int = int(maskUnion.sum())
|
|
51
|
+
|
|
52
|
+
assert rowsCovered == rowsTotal, (
|
|
53
|
+
f"{functionName} expected rowsCovered == rowsTotal for {mapShape = }, "
|
|
54
|
+
f"got rowsCovered={rowsCovered}, rowsTotal={rowsTotal}."
|
|
55
|
+
)
|
|
56
|
+
assert countOverlappingDictionaries == 0, (
|
|
57
|
+
f"{functionName} expected no overlapping dictionaries for {mapShape = }, "
|
|
58
|
+
f"got countOverlappingDictionaries={countOverlappingDictionaries}."
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""Tests for mapFolding/_semiotics.py and mapFolding/_e/_semiotics.py."""
|
|
2
|
+
|
|
3
|
+
from mapFolding import decreasing, inclusive
|
|
4
|
+
from mapFolding._e import (
|
|
5
|
+
leafOrigin, pileOrigin, 一, 七, 三, 九, 二, 五, 八, 六, 四, 零, 首一, 首一三, 首一二, 首一二三, 首三, 首二, 首二三, 首零, 首零一, 首零一三, 首零一二, 首零一二三, 首零三,
|
|
6
|
+
首零二, 首零二三)
|
|
7
|
+
from mapFolding.tests.dataSamples.semioticsData import (
|
|
8
|
+
expectedDecreasing, expectedInclusive, expectedLeafOrigin, expectedPileOrigin, expected一, expected七, expected三,
|
|
9
|
+
expected九, expected二, expected五, expected八, expected六, expected四, expected零, expected首一, expected首一三, expected首一二,
|
|
10
|
+
expected首一二三, expected首三, expected首二, expected首二三, expected首零, expected首零一, expected首零一三, expected首零一二, expected首零一二三,
|
|
11
|
+
expected首零三, expected首零二, expected首零二三)
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
class TestSemioticsConstants:
|
|
15
|
+
"""Tests for constant values in mapFolding/_semiotics.py."""
|
|
16
|
+
|
|
17
|
+
@pytest.mark.parametrize("actual, expected", [
|
|
18
|
+
(decreasing, expectedDecreasing),
|
|
19
|
+
(inclusive, expectedInclusive),
|
|
20
|
+
])
|
|
21
|
+
def test_semanticReplacements(self, actual: int, expected: int) -> None:
|
|
22
|
+
assert actual == expected, f"Expected {expected}, got {actual}"
|
|
23
|
+
|
|
24
|
+
class TestDimensionIndexConstants:
|
|
25
|
+
"""Tests for dimension index constants (powers of 2) in mapFolding/_e/_semiotics.py."""
|
|
26
|
+
|
|
27
|
+
@pytest.mark.parametrize("actual, expected, identifier", [
|
|
28
|
+
(零, expected零, "零"),
|
|
29
|
+
(一, expected一, "一"),
|
|
30
|
+
(二, expected二, "二"),
|
|
31
|
+
(三, expected三, "三"),
|
|
32
|
+
(四, expected四, "四"),
|
|
33
|
+
(五, expected五, "五"),
|
|
34
|
+
(六, expected六, "六"),
|
|
35
|
+
(七, expected七, "七"),
|
|
36
|
+
(八, expected八, "八"),
|
|
37
|
+
(九, expected九, "九"),
|
|
38
|
+
])
|
|
39
|
+
def test_dimensionIndexPowersOfTwo(self, actual: int, expected: int, identifier: str) -> None:
|
|
40
|
+
assert actual == expected, f"Expected {identifier} = {expected}, got {actual}"
|
|
41
|
+
|
|
42
|
+
class TestOriginConstants:
|
|
43
|
+
"""Tests for origin constants in mapFolding/_e/_semiotics.py."""
|
|
44
|
+
|
|
45
|
+
@pytest.mark.parametrize("actual, expected, identifier", [
|
|
46
|
+
(leafOrigin, expectedLeafOrigin, "leafOrigin"),
|
|
47
|
+
(pileOrigin, expectedPileOrigin, "pileOrigin"),
|
|
48
|
+
])
|
|
49
|
+
def test_originConstants(self, actual: int, expected: int, identifier: str) -> None:
|
|
50
|
+
assert actual == expected, f"Expected {identifier} = {expected}, got {actual}"
|
|
51
|
+
|
|
52
|
+
class TestDimensionCoordinateFunctions:
|
|
53
|
+
"""Tests for cached functions that encode dimension coordinates."""
|
|
54
|
+
|
|
55
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首零)
|
|
56
|
+
def test_shouLing(self, dimensionsTotal: int, expected: int) -> None:
|
|
57
|
+
actual: int = 首零(dimensionsTotal)
|
|
58
|
+
assert actual == expected, f"首零({dimensionsTotal}): expected {expected}, got {actual}"
|
|
59
|
+
|
|
60
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首零一)
|
|
61
|
+
def test_shouLingYi(self, dimensionsTotal: int, expected: int) -> None:
|
|
62
|
+
actual: int = 首零一(dimensionsTotal)
|
|
63
|
+
assert actual == expected, f"首零一({dimensionsTotal}): expected {expected}, got {actual}"
|
|
64
|
+
|
|
65
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首零一二)
|
|
66
|
+
def test_shouLingYiEr(self, dimensionsTotal: int, expected: int) -> None:
|
|
67
|
+
actual: int = 首零一二(dimensionsTotal)
|
|
68
|
+
assert actual == expected, f"首零一二({dimensionsTotal}): expected {expected}, got {actual}"
|
|
69
|
+
|
|
70
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首零二)
|
|
71
|
+
def test_shouLingEr(self, dimensionsTotal: int, expected: int) -> None:
|
|
72
|
+
actual = 首零二(dimensionsTotal)
|
|
73
|
+
assert actual == expected, f"首零二({dimensionsTotal}): expected {expected}, got {actual}"
|
|
74
|
+
|
|
75
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首一)
|
|
76
|
+
def test_shouYi(self, dimensionsTotal: int, expected: int) -> None:
|
|
77
|
+
actual = 首一(dimensionsTotal)
|
|
78
|
+
assert actual == expected, f"首一({dimensionsTotal}): expected {expected}, got {actual}"
|
|
79
|
+
|
|
80
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首一二)
|
|
81
|
+
def test_shouYiEr(self, dimensionsTotal: int, expected: int) -> None:
|
|
82
|
+
actual = 首一二(dimensionsTotal)
|
|
83
|
+
assert actual == expected, f"首一二({dimensionsTotal}): expected {expected}, got {actual}"
|
|
84
|
+
|
|
85
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首二)
|
|
86
|
+
def test_shouEr(self, dimensionsTotal: int, expected: int) -> None:
|
|
87
|
+
actual = 首二(dimensionsTotal)
|
|
88
|
+
assert actual == expected, f"首二({dimensionsTotal}): expected {expected}, got {actual}"
|
|
89
|
+
|
|
90
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首三)
|
|
91
|
+
def test_shouSan(self, dimensionsTotal: int, expected: int) -> None:
|
|
92
|
+
actual = 首三(dimensionsTotal)
|
|
93
|
+
assert actual == expected, f"首三({dimensionsTotal}): expected {expected}, got {actual}"
|
|
94
|
+
|
|
95
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首零一二三)
|
|
96
|
+
def test_shouLingYiErSan(self, dimensionsTotal: int, expected: int) -> None:
|
|
97
|
+
actual = 首零一二三(dimensionsTotal)
|
|
98
|
+
assert actual == expected, f"首零一二三({dimensionsTotal}): expected {expected}, got {actual}"
|
|
99
|
+
|
|
100
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首零一三)
|
|
101
|
+
def test_shouLingYiSan(self, dimensionsTotal: int, expected: int) -> None:
|
|
102
|
+
actual = 首零一三(dimensionsTotal)
|
|
103
|
+
assert actual == expected, f"首零一三({dimensionsTotal}): expected {expected}, got {actual}"
|
|
104
|
+
|
|
105
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首零二三)
|
|
106
|
+
def test_shouLingErSan(self, dimensionsTotal: int, expected: int) -> None:
|
|
107
|
+
actual = 首零二三(dimensionsTotal)
|
|
108
|
+
assert actual == expected, f"首零二三({dimensionsTotal}): expected {expected}, got {actual}"
|
|
109
|
+
|
|
110
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首零三)
|
|
111
|
+
def test_shouLingSan(self, dimensionsTotal: int, expected: int) -> None:
|
|
112
|
+
actual = 首零三(dimensionsTotal)
|
|
113
|
+
assert actual == expected, f"首零三({dimensionsTotal}): expected {expected}, got {actual}"
|
|
114
|
+
|
|
115
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首一二三)
|
|
116
|
+
def test_shouYiErSan(self, dimensionsTotal: int, expected: int) -> None:
|
|
117
|
+
actual = 首一二三(dimensionsTotal)
|
|
118
|
+
assert actual == expected, f"首一二三({dimensionsTotal}): expected {expected}, got {actual}"
|
|
119
|
+
|
|
120
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首一三)
|
|
121
|
+
def test_shouYiSan(self, dimensionsTotal: int, expected: int) -> None:
|
|
122
|
+
actual = 首一三(dimensionsTotal)
|
|
123
|
+
assert actual == expected, f"首一三({dimensionsTotal}): expected {expected}, got {actual}"
|
|
124
|
+
|
|
125
|
+
@pytest.mark.parametrize("dimensionsTotal, expected", expected首二三)
|
|
126
|
+
def test_shouErSan(self, dimensionsTotal: int, expected: int) -> None:
|
|
127
|
+
actual = 首二三(dimensionsTotal)
|
|
128
|
+
assert actual == expected, f"首二三({dimensionsTotal}): expected {expected}, got {actual}"
|
|
@@ -21,20 +21,21 @@ stores computational results or adding new file formats.
|
|
|
21
21
|
|
|
22
22
|
from contextlib import redirect_stdout
|
|
23
23
|
from mapFolding import (
|
|
24
|
-
getFilenameFoldsTotal, getPathFilenameFoldsTotal, getPathRootJobDEFAULT, saveFoldsTotal,
|
|
24
|
+
dictionaryOEISMapFolding, getFilenameFoldsTotal, getPathFilenameFoldsTotal, getPathRootJobDEFAULT, saveFoldsTotal,
|
|
25
|
+
validateListDimensions)
|
|
25
26
|
from pathlib import Path
|
|
26
27
|
import io
|
|
27
28
|
import pytest
|
|
28
29
|
import unittest.mock
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
pathFilename = path_tmpTesting / "foldsTotal.txt"
|
|
31
|
+
@pytest.mark.parametrize("foldsTotal", [pytest.param(123, id="foldsTotal-123")])
|
|
32
|
+
def test_saveFoldsTotal_fallback(path_tmpTesting: Path, foldsTotal: int) -> None:
|
|
33
|
+
pathFilename: Path = path_tmpTesting / "foldsTotal.txt"
|
|
33
34
|
with unittest.mock.patch("pathlib.Path.write_text", side_effect=OSError("Simulated write failure")), unittest.mock.patch("os.getcwd", return_value=str(path_tmpTesting)):
|
|
34
|
-
capturedOutput = io.StringIO()
|
|
35
|
+
capturedOutput: io.StringIO = io.StringIO()
|
|
35
36
|
with redirect_stdout(capturedOutput):
|
|
36
37
|
saveFoldsTotal(pathFilename, foldsTotal)
|
|
37
|
-
fallbackFiles = list(path_tmpTesting.glob("foldsTotalYO_*.txt"))
|
|
38
|
+
fallbackFiles: list[Path] = list(path_tmpTesting.glob("foldsTotalYO_*.txt"))
|
|
38
39
|
assert len(fallbackFiles) == 1, "Fallback file was not created upon write failure."
|
|
39
40
|
|
|
40
41
|
@pytest.mark.parametrize("listDimensions, expectedFilename", [
|
|
@@ -43,27 +44,48 @@ def test_saveFoldsTotal_fallback(path_tmpTesting: Path) -> None:
|
|
|
43
44
|
])
|
|
44
45
|
def test_getFilenameFoldsTotal(listDimensions: list[int], expectedFilename: str) -> None:
|
|
45
46
|
"""Test that getFilenameFoldsTotal generates correct filenames with dimensions sorted."""
|
|
46
|
-
mapShape = validateListDimensions(listDimensions)
|
|
47
|
-
filenameActual = getFilenameFoldsTotal(mapShape)
|
|
47
|
+
mapShape: tuple[int, ...] = validateListDimensions(listDimensions)
|
|
48
|
+
filenameActual: str = getFilenameFoldsTotal(mapShape)
|
|
48
49
|
assert filenameActual == expectedFilename, f"Expected filename {expectedFilename} but got {filenameActual}"
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
@pytest.mark.parametrize(
|
|
52
|
+
"mapShape",
|
|
53
|
+
[
|
|
54
|
+
pytest.param(dictionaryOEISMapFolding["A000136"]["getMapShape"](3), id="A000136::n3"),
|
|
55
|
+
pytest.param(dictionaryOEISMapFolding["A001415"]["getMapShape"](3), id="A001415::n3"),
|
|
56
|
+
],
|
|
57
|
+
)
|
|
58
|
+
def test_getPathFilenameFoldsTotal_defaultPath(mapShape: tuple[int, ...]) -> None:
|
|
51
59
|
"""Test getPathFilenameFoldsTotal with default path."""
|
|
52
|
-
pathFilenameFoldsTotal = getPathFilenameFoldsTotal(
|
|
60
|
+
pathFilenameFoldsTotal: Path = getPathFilenameFoldsTotal(mapShape)
|
|
53
61
|
assert pathFilenameFoldsTotal.is_absolute(), "Path should be absolute"
|
|
54
|
-
assert pathFilenameFoldsTotal.name == getFilenameFoldsTotal(
|
|
62
|
+
assert pathFilenameFoldsTotal.name == getFilenameFoldsTotal(mapShape), "Filename should match getFilenameFoldsTotal output"
|
|
55
63
|
assert pathFilenameFoldsTotal.parent == getPathRootJobDEFAULT(), "Parent directory should match default job root"
|
|
56
64
|
|
|
57
|
-
|
|
65
|
+
@pytest.mark.parametrize(
|
|
66
|
+
"mapShape",
|
|
67
|
+
[
|
|
68
|
+
pytest.param(dictionaryOEISMapFolding["A000136"]["getMapShape"](3), id="A000136::n3"),
|
|
69
|
+
pytest.param(dictionaryOEISMapFolding["A001415"]["getMapShape"](3), id="A001415::n3"),
|
|
70
|
+
],
|
|
71
|
+
)
|
|
72
|
+
def test_getPathFilenameFoldsTotal_relativeFilename(mapShape: tuple[int, ...]) -> None:
|
|
58
73
|
"""Test getPathFilenameFoldsTotal with relative filename."""
|
|
59
|
-
relativeFilename = Path("custom/path/test.foldsTotal")
|
|
60
|
-
pathFilenameFoldsTotal = getPathFilenameFoldsTotal(
|
|
74
|
+
relativeFilename: Path = Path("custom/path/test.foldsTotal")
|
|
75
|
+
pathFilenameFoldsTotal: Path = getPathFilenameFoldsTotal(mapShape, relativeFilename)
|
|
61
76
|
assert pathFilenameFoldsTotal.is_absolute(), "Path should be absolute"
|
|
62
77
|
assert pathFilenameFoldsTotal == getPathRootJobDEFAULT() / relativeFilename, "Relative path should be appended to default job root"
|
|
63
78
|
|
|
64
|
-
|
|
79
|
+
@pytest.mark.parametrize(
|
|
80
|
+
"mapShape",
|
|
81
|
+
[
|
|
82
|
+
pytest.param(dictionaryOEISMapFolding["A000136"]["getMapShape"](3), id="A000136::n3"),
|
|
83
|
+
pytest.param(dictionaryOEISMapFolding["A001415"]["getMapShape"](3), id="A001415::n3"),
|
|
84
|
+
],
|
|
85
|
+
)
|
|
86
|
+
def test_getPathFilenameFoldsTotal_createsDirs(path_tmpTesting: Path, mapShape: tuple[int, ...]) -> None:
|
|
65
87
|
"""Test that getPathFilenameFoldsTotal creates necessary directories."""
|
|
66
|
-
nestedPath = path_tmpTesting / "deep/nested/structure"
|
|
67
|
-
pathFilenameFoldsTotal = getPathFilenameFoldsTotal(
|
|
88
|
+
nestedPath: Path = path_tmpTesting / "deep/nested/structure"
|
|
89
|
+
pathFilenameFoldsTotal: Path = getPathFilenameFoldsTotal(mapShape, nestedPath)
|
|
68
90
|
assert pathFilenameFoldsTotal.parent.exists(), "Parent directories should be created"
|
|
69
91
|
assert pathFilenameFoldsTotal.parent.is_dir(), "Created path should be a directory"
|
|
@@ -26,9 +26,9 @@ dependencies while maintaining clear separation of concerns.
|
|
|
26
26
|
"""
|
|
27
27
|
|
|
28
28
|
from collections.abc import Callable
|
|
29
|
-
from hunterMakesPy import intInnit
|
|
29
|
+
from hunterMakesPy.parseParameters import intInnit
|
|
30
30
|
from hunterMakesPy.pytestForYourUse import PytestFor_intInnit, PytestFor_oopsieKwargsie
|
|
31
|
-
from mapFolding import
|
|
31
|
+
from mapFolding import defineProcessorLimit, getLeavesTotal, validateListDimensions
|
|
32
32
|
from mapFolding.tests.conftest import standardizedEqualToCallableReturn
|
|
33
33
|
from typing import Any, Literal
|
|
34
34
|
import multiprocessing
|
|
@@ -100,4 +100,4 @@ def testOopsieKwargsie(nameOfTest: str, callablePytest: Callable[[], None]) -> N
|
|
|
100
100
|
])
|
|
101
101
|
def test_setCPUlimitNumba(CPUlimit: Literal[4, -2, 0, 1] | None | float | bool, expectedLimit: Any | int) -> None:
|
|
102
102
|
numba.set_num_threads(multiprocessing.cpu_count())
|
|
103
|
-
standardizedEqualToCallableReturn(expectedLimit,
|
|
103
|
+
standardizedEqualToCallableReturn(expectedLimit, defineProcessorLimit, CPUlimit, 'numba')
|
|
@@ -21,37 +21,51 @@ For users working with large-scale computations: these tests demonstrate how to
|
|
|
21
21
|
configure and validate parallel processing setups. The concurrency limit tests
|
|
22
22
|
show how to balance performance with system resource constraints.
|
|
23
23
|
|
|
24
|
-
The multiprocessing configuration (spawn method) is essential for cross-platform
|
|
25
|
-
compatibility and proper resource isolation between test processes.
|
|
26
24
|
"""
|
|
27
25
|
|
|
28
26
|
from collections.abc import Callable
|
|
29
27
|
from hunterMakesPy.pytestForYourUse import PytestFor_defineConcurrencyLimit
|
|
30
28
|
from mapFolding import (
|
|
31
|
-
|
|
29
|
+
defineProcessorLimit, dictionaryOEISMapFolding, getFoldsTotalKnown, getLeavesTotal, getTaskDivisions,
|
|
30
|
+
validateListDimensions)
|
|
31
|
+
from mapFolding.basecamp import countFolds
|
|
32
32
|
from mapFolding.tests.conftest import standardizedEqualToCallableReturn
|
|
33
33
|
from typing import Literal
|
|
34
|
-
import multiprocessing
|
|
35
34
|
import pytest
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
@pytest.mark.parametrize(
|
|
37
|
+
"mapShape",
|
|
38
|
+
[
|
|
39
|
+
pytest.param(dictionaryOEISMapFolding["A000136"]["getMapShape"](3), id="A000136::n3"),
|
|
40
|
+
pytest.param(dictionaryOEISMapFolding["A001415"]["getMapShape"](3), id="A001415::n3"),
|
|
41
|
+
],
|
|
42
|
+
)
|
|
43
|
+
def test_countFoldsComputationDivisionsInvalid(mapShape: tuple[int, ...]) -> None:
|
|
44
|
+
standardizedEqualToCallableReturn(ValueError, countFolds, mapShape, None, {"wrong": "value"})
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
@pytest.mark.parametrize(
|
|
47
|
+
"mapShapeList",
|
|
48
|
+
[
|
|
49
|
+
pytest.param(list(dictionaryOEISMapFolding["A001417"]["getMapShape"](5)), id="A001417::n5"),
|
|
50
|
+
],
|
|
51
|
+
)
|
|
52
|
+
def test_countFoldsComputationDivisionsMaximum(mapShapeList: list[int]) -> None:
|
|
53
|
+
standardizedEqualToCallableReturn(getFoldsTotalKnown(tuple(mapShapeList)), countFolds, mapShapeList, None, 'maximum', None)
|
|
47
54
|
|
|
48
55
|
@pytest.mark.parametrize("nameOfTest,callablePytest", PytestFor_defineConcurrencyLimit())
|
|
49
56
|
def test_defineConcurrencyLimit(nameOfTest: str, callablePytest: Callable[[], None]) -> None:
|
|
50
57
|
callablePytest()
|
|
51
58
|
|
|
59
|
+
@pytest.mark.parametrize(
|
|
60
|
+
"mapShape",
|
|
61
|
+
[
|
|
62
|
+
pytest.param(dictionaryOEISMapFolding["A000136"]["getMapShape"](3), id="A000136::n3"),
|
|
63
|
+
pytest.param(dictionaryOEISMapFolding["A001415"]["getMapShape"](3), id="A001415::n3"),
|
|
64
|
+
],
|
|
65
|
+
)
|
|
52
66
|
@pytest.mark.parametrize("CPUlimitParameter", [{"invalid": True}, ["weird"]])
|
|
53
|
-
def test_countFolds_cpuLimitOopsie(
|
|
54
|
-
standardizedEqualToCallableReturn(ValueError, countFolds,
|
|
67
|
+
def test_countFolds_cpuLimitOopsie(mapShape: tuple[int, ...], CPUlimitParameter: dict[str, bool] | list[str]) -> None:
|
|
68
|
+
standardizedEqualToCallableReturn(ValueError, countFolds, mapShape, None, 'cpu', CPUlimitParameter)
|
|
55
69
|
|
|
56
70
|
@pytest.mark.parametrize("computationDivisions, concurrencyLimit, listDimensions, expectedTaskDivisions", [
|
|
57
71
|
(None, 4, [9, 11], 0),
|
|
@@ -60,12 +74,14 @@ def test_countFolds_cpuLimitOopsie(mapShapeTestFunctionality: tuple[int, ...], C
|
|
|
60
74
|
(["invalid"], 4, [19, 23], ValueError),
|
|
61
75
|
(20, 4, [3,5], ValueError)
|
|
62
76
|
])
|
|
63
|
-
def test_getTaskDivisions(
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
77
|
+
def test_getTaskDivisions(
|
|
78
|
+
computationDivisions: Literal['maximum', 'cpu', 20] | None | list[str],
|
|
79
|
+
concurrencyLimit: Literal[4],
|
|
80
|
+
listDimensions: list[int],
|
|
81
|
+
expectedTaskDivisions: int | type[ValueError]
|
|
82
|
+
) -> None:
|
|
83
|
+
mapShape: tuple[int, ...] = validateListDimensions(listDimensions)
|
|
84
|
+
leavesTotal: int = getLeavesTotal(mapShape)
|
|
69
85
|
standardizedEqualToCallableReturn(expectedTaskDivisions, getTaskDivisions, computationDivisions, concurrencyLimit, leavesTotal)
|
|
70
86
|
|
|
71
87
|
@pytest.mark.parametrize("expected,parameter", [
|
|
@@ -74,6 +90,9 @@ def test_getTaskDivisions(computationDivisions: Literal['maximum', 'cpu', 20] |
|
|
|
74
90
|
(ValueError, {2}), # set
|
|
75
91
|
(ValueError, {"cores": 2}), # dict
|
|
76
92
|
])
|
|
77
|
-
def test_setCPUlimitMalformedParameter(
|
|
93
|
+
def test_setCPUlimitMalformedParameter(
|
|
94
|
+
expected: type[ValueError] | Literal[2],
|
|
95
|
+
parameter: list[int] | tuple[int, ...] | set[int] | dict[str, int] | Literal['2']
|
|
96
|
+
) -> None:
|
|
78
97
|
"""Test that invalid CPUlimit types are properly handled."""
|
|
79
|
-
standardizedEqualToCallableReturn(expected,
|
|
98
|
+
standardizedEqualToCallableReturn(expected, defineProcessorLimit, parameter)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"""Make docstrings."""
|
|
2
2
|
from astToolkit import Grab, IfThis, Make, NodeChanger, parsePathFilename2astModule, Then
|
|
3
3
|
from astToolkit.transformationTools import makeDictionaryFunctionDef
|
|
4
|
-
from hunterMakesPy import raiseIfNone
|
|
4
|
+
from hunterMakesPy import raiseIfNone
|
|
5
|
+
from hunterMakesPy.filesystemToolkit import writeStringToHere
|
|
5
6
|
from mapFolding import dictionaryOEIS, dictionaryOEISMapFolding, packageSettings
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
import ast
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
#------------------ General Settings ----------------------------------------------------------------------------------
|
|
10
11
|
sourcePrefix: str = 'zCuzDocStoopid'
|
|
11
12
|
|
|
12
13
|
moduleWarning = "NOTE: This is a generated file; edit the source file."
|