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
|
@@ -25,8 +25,8 @@ The `test_writeJobNumba` function shows how to test dynamically generated code,
|
|
|
25
25
|
which is useful if you're working with the code synthesis features of the package.
|
|
26
26
|
"""
|
|
27
27
|
|
|
28
|
-
from mapFolding import
|
|
29
|
-
from mapFolding.basecamp import NOTcountingFolds
|
|
28
|
+
from mapFolding import dictionaryOEIS, dictionaryOEISMapFolding, getFoldsTotalKnown, oeisIDfor_n
|
|
29
|
+
from mapFolding.basecamp import countFolds, NOTcountingFolds
|
|
30
30
|
from mapFolding.dataBaskets import MapFoldingState
|
|
31
31
|
from mapFolding.someAssemblyRequired.RecipeJob import RecipeJobTheorem2
|
|
32
32
|
from mapFolding.someAssemblyRequired.toolkitNumba import parametersNumbaLight
|
|
@@ -34,65 +34,56 @@ from mapFolding.syntheticModules.initializeState import transitionOnGroupsOfFold
|
|
|
34
34
|
from mapFolding.tests.conftest import registrarRecordsTemporaryFilesystemObject, standardizedEqualToCallableReturn
|
|
35
35
|
from numba.core.errors import NumbaPendingDeprecationWarning
|
|
36
36
|
from pathlib import Path, PurePosixPath
|
|
37
|
+
from typing import TYPE_CHECKING
|
|
37
38
|
import importlib.util
|
|
38
|
-
import multiprocessing
|
|
39
39
|
import pytest
|
|
40
40
|
import warnings
|
|
41
41
|
|
|
42
|
-
if
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
for oeis_n in dictionaryOEISMapFolding[oeisID]['valuesTestValidation']:
|
|
59
|
-
if oeis_n < 2:
|
|
60
|
-
continue
|
|
61
|
-
|
|
62
|
-
expected = dictionaryOEISMapFolding[oeisID]['valuesKnown'][oeis_n]
|
|
63
|
-
|
|
64
|
-
standardizedEqualToCallableReturn(
|
|
65
|
-
expected
|
|
66
|
-
, NOTcountingFolds, oeisID, oeis_n, flow, CPUlimit
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
@pytest.mark.parametrize('flow', ['algorithm', 'asynchronous', 'theorem2', 'theorem2Numba', 'theorem2Trimmed'])
|
|
70
|
-
def test_A007822(flow: str) -> None:
|
|
42
|
+
if TYPE_CHECKING:
|
|
43
|
+
from importlib.machinery import ModuleSpec
|
|
44
|
+
from mapFolding import MetadataOEISid, MetadataOEISidMapFolding
|
|
45
|
+
from types import ModuleType
|
|
46
|
+
|
|
47
|
+
@pytest.mark.parametrize(
|
|
48
|
+
"oeisIdentifier, sequenceIndex, flow, processorLimit",
|
|
49
|
+
[
|
|
50
|
+
pytest.param("A007822", 4, "algorithm", 0.5, id="algorithm"),
|
|
51
|
+
pytest.param("A007822", 4, "asynchronous", 0.5, id="asynchronous"),
|
|
52
|
+
pytest.param("A007822", 4, "theorem2", 0.5, id="theorem2"),
|
|
53
|
+
pytest.param("A007822", 4, "theorem2Numba", 0.5, id="theorem2Numba"),
|
|
54
|
+
pytest.param("A007822", 4, "theorem2Trimmed", 0.5, id="theorem2Trimmed"),
|
|
55
|
+
],
|
|
56
|
+
)
|
|
57
|
+
def test_A007822(oeisIdentifier: str, sequenceIndex: int, flow: str, processorLimit: float) -> None:
|
|
71
58
|
"""Test A007822 flow options.
|
|
72
59
|
|
|
73
60
|
Parameters
|
|
74
61
|
----------
|
|
62
|
+
oeisIdentifier : str
|
|
63
|
+
OEIS identifier to validate.
|
|
64
|
+
sequenceIndex : int
|
|
65
|
+
Sequence index to validate.
|
|
75
66
|
flow : str
|
|
76
|
-
|
|
67
|
+
Computation flow to validate.
|
|
68
|
+
processorLimit : float
|
|
69
|
+
CPU limit for the computation.
|
|
77
70
|
|
|
78
71
|
"""
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
@pytest.mark.parametrize('flow', ['daoOfMapFolding', 'numba', 'theorem2', 'theorem2Numba', 'theorem2Trimmed'])
|
|
95
|
-
def test_countFolds(mapShapeTestCountFolds: tuple[int, ...], flow: str) -> None:
|
|
72
|
+
warnings.filterwarnings("ignore", category=NumbaPendingDeprecationWarning)
|
|
73
|
+
expected: int = dictionaryOEIS[oeisIdentifier]['valuesKnown'][sequenceIndex]
|
|
74
|
+
standardizedEqualToCallableReturn(expected, NOTcountingFolds, oeisIdentifier, sequenceIndex, flow, processorLimit)
|
|
75
|
+
|
|
76
|
+
@pytest.mark.parametrize(
|
|
77
|
+
"oeisIdentifier, sequenceIndex, flow, processorLimit",
|
|
78
|
+
[
|
|
79
|
+
pytest.param("A000136", 3, "daoOfMapFolding", None, id="A000136::daoOfMapFolding"),
|
|
80
|
+
pytest.param("A001415", 3, "numba", None, id="A001415::numba"),
|
|
81
|
+
pytest.param("A001416", 3, "theorem2Numba", None, id="A001416::theorem2Numba"),
|
|
82
|
+
pytest.param("A001417", 3, "theorem2", None, id="A001417::theorem2"),
|
|
83
|
+
pytest.param("A001418", 3, "theorem2Trimmed", None, id="A001418::theorem2Trimmed"),
|
|
84
|
+
],
|
|
85
|
+
)
|
|
86
|
+
def test_countFolds(oeisIdentifier: str, sequenceIndex: int, flow: str, processorLimit: float | None) -> None:
|
|
96
87
|
"""Validate that different computational flows produce valid results.
|
|
97
88
|
|
|
98
89
|
(AI generated docstring)
|
|
@@ -106,16 +97,32 @@ def test_countFolds(mapShapeTestCountFolds: tuple[int, ...], flow: str) -> None:
|
|
|
106
97
|
|
|
107
98
|
Parameters
|
|
108
99
|
----------
|
|
109
|
-
|
|
110
|
-
|
|
100
|
+
oeisIdentifier : str
|
|
101
|
+
OEIS identifier to validate.
|
|
102
|
+
sequenceIndex : int
|
|
103
|
+
Sequence index to validate.
|
|
111
104
|
flow : str
|
|
112
|
-
|
|
105
|
+
Computation flow to validate.
|
|
106
|
+
processorLimit : float | None
|
|
107
|
+
CPU limit for the computation.
|
|
113
108
|
|
|
114
109
|
"""
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
110
|
+
mapShape: tuple[int, ...] = dictionaryOEISMapFolding[oeisIdentifier]['getMapShape'](sequenceIndex)
|
|
111
|
+
expected: int = dictionaryOEISMapFolding[oeisIdentifier]['valuesKnown'][sequenceIndex]
|
|
112
|
+
standardizedEqualToCallableReturn(expected, countFolds, None, None, None, processorLimit, mapShape, flow)
|
|
113
|
+
|
|
114
|
+
@pytest.mark.parametrize(
|
|
115
|
+
"oeisIdentifier, sequenceIndex, flow",
|
|
116
|
+
[
|
|
117
|
+
pytest.param("A000682", 3, "matrixMeanders", id="A000682::matrixMeanders"),
|
|
118
|
+
pytest.param("A005316", 3, "matrixMeanders", id="A005316::matrixMeanders"),
|
|
119
|
+
pytest.param("A000682", 3, "matrixNumPy", id="A000682::matrixNumPy"),
|
|
120
|
+
pytest.param("A005316", 3, "matrixNumPy", id="A005316::matrixNumPy"),
|
|
121
|
+
pytest.param("A000682", 3, "matrixPandas", id="A000682::matrixPandas"),
|
|
122
|
+
pytest.param("A005316", 3, "matrixPandas", id="A005316::matrixPandas"),
|
|
123
|
+
],
|
|
124
|
+
)
|
|
125
|
+
def test_meanders(oeisIdentifier: str, sequenceIndex: int, flow: str) -> None:
|
|
119
126
|
"""Verify Meanders OEIS sequence value calculations against known reference values.
|
|
120
127
|
|
|
121
128
|
Tests the functions in `mapFolding.algorithms.oeisIDbyFormula` by comparing their
|
|
@@ -123,18 +130,39 @@ def test_meanders(oeisIDmeanders: str, flow: str) -> None:
|
|
|
123
130
|
|
|
124
131
|
Parameters
|
|
125
132
|
----------
|
|
126
|
-
|
|
127
|
-
|
|
133
|
+
oeisIdentifier : str
|
|
134
|
+
OEIS identifier to validate.
|
|
135
|
+
sequenceIndex : int
|
|
136
|
+
Sequence index to validate.
|
|
137
|
+
flow : str
|
|
138
|
+
Computation flow to validate.
|
|
128
139
|
|
|
129
140
|
"""
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
141
|
+
dictionaryCurrent: dict[str, MetadataOEISidMapFolding] | dict[str, MetadataOEISid] = dictionaryOEISMapFolding if oeisIdentifier in dictionaryOEISMapFolding else dictionaryOEIS
|
|
142
|
+
expected: int = dictionaryCurrent[oeisIdentifier]['valuesKnown'][sequenceIndex]
|
|
143
|
+
standardizedEqualToCallableReturn(expected, NOTcountingFolds, oeisIdentifier, sequenceIndex, flow, None)
|
|
144
|
+
|
|
145
|
+
@pytest.mark.parametrize(
|
|
146
|
+
"oeisIdentifier, sequenceIndex",
|
|
147
|
+
[
|
|
148
|
+
pytest.param("A000560", 3, id="A000560::n3"),
|
|
149
|
+
pytest.param("A000682", 3, id="A000682::n3"),
|
|
150
|
+
pytest.param("A001010", 3, id="A001010::n3"),
|
|
151
|
+
pytest.param("A001011", 3, id="A001011::n3"),
|
|
152
|
+
pytest.param("A005315", 3, id="A005315::n3"),
|
|
153
|
+
pytest.param("A005316", 3, id="A005316::n3"),
|
|
154
|
+
pytest.param("A007822", 3, id="A007822::n3"),
|
|
155
|
+
pytest.param("A060206", 3, id="A060206::n3"),
|
|
156
|
+
pytest.param("A077460", 3, id="A077460::n3"),
|
|
157
|
+
pytest.param("A078591", 3, id="A078591::n3"),
|
|
158
|
+
pytest.param("A086345", 3, id="A086345::n3"),
|
|
159
|
+
pytest.param("A178961", 3, id="A178961::n3"),
|
|
160
|
+
pytest.param("A223094", 3, id="A223094::n3"),
|
|
161
|
+
pytest.param("A259702", 3, id="A259702::n3"),
|
|
162
|
+
pytest.param("A301620", 3, id="A301620::n3"),
|
|
163
|
+
],
|
|
164
|
+
)
|
|
165
|
+
def test_NOTcountingFolds(oeisIdentifier: str, sequenceIndex: int) -> None:
|
|
138
166
|
"""Verify Meanders OEIS sequence value calculations against known reference values.
|
|
139
167
|
|
|
140
168
|
Tests the functions in `mapFolding.algorithms.oeisIDbyFormula` by comparing their
|
|
@@ -142,18 +170,28 @@ def test_NOTcountingFolds(oeisIDother: str) -> None:
|
|
|
142
170
|
|
|
143
171
|
Parameters
|
|
144
172
|
----------
|
|
145
|
-
|
|
146
|
-
|
|
173
|
+
oeisIdentifier : str
|
|
174
|
+
OEIS identifier to validate.
|
|
175
|
+
sequenceIndex : int
|
|
176
|
+
Sequence index to validate.
|
|
147
177
|
|
|
148
178
|
"""
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
179
|
+
dictionaryCurrent: dict[str, MetadataOEISidMapFolding] | dict[str, MetadataOEISid] = dictionaryOEISMapFolding if oeisIdentifier in dictionaryOEISMapFolding else dictionaryOEIS
|
|
180
|
+
expected: int = dictionaryCurrent[oeisIdentifier]['valuesKnown'][sequenceIndex]
|
|
181
|
+
standardizedEqualToCallableReturn(expected, NOTcountingFolds, oeisIdentifier, sequenceIndex, None, None)
|
|
182
|
+
|
|
183
|
+
@pytest.mark.parametrize(
|
|
184
|
+
"oeisIdentifier, sequenceIndex",
|
|
185
|
+
[
|
|
186
|
+
pytest.param("A000136", 3, id="A000136::n3"),
|
|
187
|
+
pytest.param("A001415", 3, id="A001415::n3"),
|
|
188
|
+
pytest.param("A001416", 3, id="A001416::n3"),
|
|
189
|
+
pytest.param("A001417", 3, id="A001417::n3"),
|
|
190
|
+
pytest.param("A001418", 3, id="A001418::n3"),
|
|
191
|
+
pytest.param("A195646", 2, id="A195646::n2"),
|
|
192
|
+
],
|
|
193
|
+
)
|
|
194
|
+
def test_oeisIDfor_n(oeisIdentifier: str, sequenceIndex: int) -> None:
|
|
157
195
|
"""Verify OEIS sequence value calculations against known reference values.
|
|
158
196
|
|
|
159
197
|
Tests the `oeisIDfor_n` function by comparing its calculated output against
|
|
@@ -166,12 +204,19 @@ def test_oeisIDfor_n(oeisIDmapFolding: str) -> None:
|
|
|
166
204
|
|
|
167
205
|
Parameters
|
|
168
206
|
----------
|
|
169
|
-
|
|
170
|
-
|
|
207
|
+
oeisIdentifier : str
|
|
208
|
+
OEIS identifier to validate.
|
|
209
|
+
sequenceIndex : int
|
|
210
|
+
Sequence index to validate.
|
|
171
211
|
|
|
172
212
|
"""
|
|
173
|
-
|
|
174
|
-
|
|
213
|
+
expected: int = dictionaryOEISMapFolding[oeisIdentifier]['valuesKnown'][sequenceIndex]
|
|
214
|
+
standardizedEqualToCallableReturn(expected, oeisIDfor_n, oeisIdentifier, sequenceIndex)
|
|
215
|
+
|
|
216
|
+
@pytest.fixture
|
|
217
|
+
def oneTestCuzTestsOverwritingTests() -> tuple[int, ...]: # NOTE TO AI: DO NOT CHANGE THIS IDENTIFIER NAME.
|
|
218
|
+
"""Return one deterministic map shape suitable for code generation tests."""
|
|
219
|
+
return dictionaryOEISMapFolding["A000136"]["getMapShape"](3)
|
|
175
220
|
|
|
176
221
|
@pytest.mark.parametrize('pathFilename_tmpTesting', ['.py'], indirect=True)
|
|
177
222
|
def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFilename_tmpTesting: Path) -> None:
|
|
@@ -197,11 +242,11 @@ def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFil
|
|
|
197
242
|
"""
|
|
198
243
|
from mapFolding.someAssemblyRequired.makeJobTheorem2Numba import makeJobNumba # noqa: PLC0415
|
|
199
244
|
from mapFolding.someAssemblyRequired.toolkitNumba import SpicesJobNumba # noqa: PLC0415
|
|
200
|
-
mapShape = oneTestCuzTestsOverwritingTests
|
|
201
|
-
state = transitionOnGroupsOfFolds(MapFoldingState(mapShape))
|
|
245
|
+
mapShape: tuple[int, ...] = oneTestCuzTestsOverwritingTests
|
|
246
|
+
state: MapFoldingState = transitionOnGroupsOfFolds(MapFoldingState(mapShape))
|
|
202
247
|
|
|
203
|
-
pathFilenameModule = pathFilename_tmpTesting.absolute()
|
|
204
|
-
pathFilenameFoldsTotal = pathFilenameModule.with_suffix('.foldsTotalTesting')
|
|
248
|
+
pathFilenameModule: Path = pathFilename_tmpTesting.absolute()
|
|
249
|
+
pathFilenameFoldsTotal: Path = pathFilenameModule.with_suffix('.foldsTotalTesting')
|
|
205
250
|
registrarRecordsTemporaryFilesystemObject(pathFilenameFoldsTotal)
|
|
206
251
|
|
|
207
252
|
jobTest = RecipeJobTheorem2(state
|
|
@@ -211,14 +256,14 @@ def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFil
|
|
|
211
256
|
spices = SpicesJobNumba(useNumbaProgressBar=False, parametersNumba=parametersNumbaLight)
|
|
212
257
|
makeJobNumba(jobTest, spices)
|
|
213
258
|
|
|
214
|
-
Don_Lapre_Road_to_Self_Improvement = importlib.util.spec_from_file_location("__main__", pathFilenameModule)
|
|
259
|
+
Don_Lapre_Road_to_Self_Improvement: ModuleSpec | None = importlib.util.spec_from_file_location("__main__", pathFilenameModule)
|
|
215
260
|
if Don_Lapre_Road_to_Self_Improvement is None:
|
|
216
|
-
message = f"Failed to create module specification from {pathFilenameModule}"
|
|
261
|
+
message: str = f"Failed to create module specification from {pathFilenameModule}"
|
|
217
262
|
raise ImportError(message)
|
|
218
263
|
if Don_Lapre_Road_to_Self_Improvement.loader is None:
|
|
219
264
|
message = f"Failed to get loader for module {pathFilenameModule}"
|
|
220
265
|
raise ImportError(message)
|
|
221
|
-
module = importlib.util.module_from_spec(Don_Lapre_Road_to_Self_Improvement)
|
|
266
|
+
module: ModuleType = importlib.util.module_from_spec(Don_Lapre_Road_to_Self_Improvement)
|
|
222
267
|
|
|
223
268
|
module.__name__ = "__main__"
|
|
224
269
|
Don_Lapre_Road_to_Self_Improvement.loader.exec_module(module)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from mapFolding import dictionaryOEISMapFolding
|
|
2
|
+
from mapFolding._e.basecamp import eliminateFolds
|
|
3
|
+
from mapFolding.tests.conftest import standardizedEqualToCallableReturn
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
@pytest.mark.parametrize(
|
|
7
|
+
"oeisID, n, flow, CPUlimit",
|
|
8
|
+
[
|
|
9
|
+
pytest.param("A001417", 4, "crease", 0.25),
|
|
10
|
+
|
|
11
|
+
pytest.param("A000136", 5, "constraintPropagation", 0.25),
|
|
12
|
+
pytest.param("A001415", 5, "constraintPropagation", 0.25),
|
|
13
|
+
pytest.param("A001416", 4, "constraintPropagation", 0.25),
|
|
14
|
+
pytest.param("A001417", 4, "constraintPropagation", 0.25),
|
|
15
|
+
pytest.param("A001418", 3, "constraintPropagation", 0.25),
|
|
16
|
+
pytest.param("A195646", 2, "constraintPropagation", 0.25),
|
|
17
|
+
# *[pytest.param(oeisID, metadata["offset"], flow, 1)
|
|
18
|
+
# for oeisID, metadata in dictionaryOEISMapFolding.items()
|
|
19
|
+
# for flow in ["elimination"]]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
],
|
|
23
|
+
)
|
|
24
|
+
def test_eliminateFoldsMapShape(oeisID: str, n: int, flow: str, CPUlimit: float) -> None:
|
|
25
|
+
"""Validate `eliminateFolds` and different flows produce valid results.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
oeisID : str
|
|
30
|
+
OEIS identifier to validate.
|
|
31
|
+
sequenceIndex : int
|
|
32
|
+
Sequence index to validate.
|
|
33
|
+
flow : str
|
|
34
|
+
Computation flow to validate.
|
|
35
|
+
processorLimit : float
|
|
36
|
+
CPU limit for the computation.
|
|
37
|
+
"""
|
|
38
|
+
mapShape: tuple[int, ...] = dictionaryOEISMapFolding[oeisID]["getMapShape"](n)
|
|
39
|
+
state = None
|
|
40
|
+
pathLikeWriteFoldsTotal: None = None
|
|
41
|
+
expected: int = dictionaryOEISMapFolding[oeisID]['valuesKnown'][n]
|
|
42
|
+
standardizedEqualToCallableReturn(expected, eliminateFolds, mapShape, state, pathLikeWriteFoldsTotal, CPUlimit, flow)
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"""Tests for elimination algorithm data functions.
|
|
2
|
+
|
|
3
|
+
These tests verify the correctness of functions in `mapFolding._e._data` that compute
|
|
4
|
+
leaf domains, pile ranges, and addend dictionaries for map folding elimination algorithms.
|
|
5
|
+
|
|
6
|
+
The test data is stored in `tests/dataSamples/A001417.py` and supports multiple `mapShape`
|
|
7
|
+
configurations. Currently, data exists for:
|
|
8
|
+
- (2,)*4 → 16 leaves (2d4)
|
|
9
|
+
- (2,)*5 → 32 leaves (2d5)
|
|
10
|
+
- (2,)*6 → 64 leaves (2d6)
|
|
11
|
+
|
|
12
|
+
When adding new test data for additional `mapShape` values, add the data to `A001417.py`
|
|
13
|
+
and the tests will automatically pick them up via parametrization.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from collections.abc import Callable, Iterable, Sequence
|
|
17
|
+
from mapFolding._e import (
|
|
18
|
+
getDictionaryLeafDomains, getDictionaryPileRanges, getDomainDimension一, getDomainDimension二, getDomainDimension首二,
|
|
19
|
+
getDomain二一零and二一, getDomain二零and二, getDomain首零一二and首一二, getDomain首零二and首二, getLeafDomain, getLeavesCreaseAnte,
|
|
20
|
+
getLeavesCreasePost, getPileRange)
|
|
21
|
+
from mapFolding._e.dataBaskets import EliminationState
|
|
22
|
+
from mapFolding.tests.dataSamples import (
|
|
23
|
+
A001417, p2DnDomain3_2_首一_首零一, p2DnDomain5_4, p2DnDomain6_7_5_4, p2DnDomain7_6, p2DnDomain首二_首零二_首零一二_首一二,
|
|
24
|
+
p2DnDomain首零一二_首一二, p2DnDomain首零二_首二)
|
|
25
|
+
from more_itertools import all_unique, unique_to_each
|
|
26
|
+
from types import ModuleType
|
|
27
|
+
import pytest
|
|
28
|
+
|
|
29
|
+
@pytest.mark.parametrize("mapShape", list(A001417.dictionaryLeafDomainKnown), ids=[f"mapShape={shape}" for shape in A001417.dictionaryLeafDomainKnown])
|
|
30
|
+
def test_getDictionaryLeafDomains(mapShape: tuple[int, ...]) -> None:
|
|
31
|
+
"""Verify getDictionaryLeafDomains against authoritative leaf domain data for all leaves."""
|
|
32
|
+
state = EliminationState(mapShape=mapShape)
|
|
33
|
+
dictionaryLeafDomainsAuthoritativeData = A001417.dictionaryLeafDomainKnown[mapShape]
|
|
34
|
+
|
|
35
|
+
dictionaryLeafDomainsActual = getDictionaryLeafDomains(state)
|
|
36
|
+
|
|
37
|
+
assert len(dictionaryLeafDomainsActual) == state.leavesTotal, (
|
|
38
|
+
f"getDictionaryLeafDomains: dictionary length {len(dictionaryLeafDomainsActual)} != {state.leavesTotal} for {mapShape=}."
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
for leaf in range(state.leavesTotal):
|
|
42
|
+
rangeActual = dictionaryLeafDomainsActual[leaf]
|
|
43
|
+
startAuthoritativeData, stopAuthoritativeData, stepAuthoritativeData = dictionaryLeafDomainsAuthoritativeData[leaf]
|
|
44
|
+
assert rangeActual.start == startAuthoritativeData, (
|
|
45
|
+
f"getDictionaryLeafDomains: range.start mismatch at {leaf=} for {mapShape=}. "
|
|
46
|
+
f"Expected {startAuthoritativeData}, got {rangeActual.start}."
|
|
47
|
+
)
|
|
48
|
+
assert rangeActual.stop == stopAuthoritativeData, (
|
|
49
|
+
f"getDictionaryLeafDomains: range.stop mismatch at {leaf=} for {mapShape=}. "
|
|
50
|
+
f"Expected {stopAuthoritativeData}, got {rangeActual.stop}."
|
|
51
|
+
)
|
|
52
|
+
assert rangeActual.step == stepAuthoritativeData, (
|
|
53
|
+
f"getDictionaryLeafDomains: range.step mismatch at {leaf=} for {mapShape=}. "
|
|
54
|
+
f"Expected {stepAuthoritativeData}, got {rangeActual.step}."
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
@pytest.mark.parametrize("mapShape", list(A001417.dictionaryPileRangesKnown), ids=[f"mapShape={shape}" for shape in A001417.dictionaryPileRangesKnown])
|
|
58
|
+
def test_getDictionaryPileRanges(mapShape: tuple[int, ...]) -> None:
|
|
59
|
+
"""Verify getDictionaryPileRanges against authoritative pile range data for all piles."""
|
|
60
|
+
state = EliminationState(mapShape=mapShape)
|
|
61
|
+
dictionaryPileRangesAuthoritativeData = A001417.dictionaryPileRangesKnown[mapShape]
|
|
62
|
+
|
|
63
|
+
dictionaryPileRangesActual = getDictionaryPileRanges(state)
|
|
64
|
+
|
|
65
|
+
assert len(dictionaryPileRangesActual) == state.leavesTotal, (
|
|
66
|
+
f"getDictionaryPileRanges: dictionary length {len(dictionaryPileRangesActual)} != {state.leavesTotal} for {mapShape=}."
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
for pile in range(state.leavesTotal):
|
|
70
|
+
assert dictionaryPileRangesActual[pile] == dictionaryPileRangesAuthoritativeData[pile], (
|
|
71
|
+
f"getDictionaryPileRanges: mismatch at {pile=} for {mapShape=}. "
|
|
72
|
+
f"Expected {dictionaryPileRangesAuthoritativeData[pile]}, got {dictionaryPileRangesActual[pile]}."
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
@pytest.mark.parametrize("mapShape", list(A001417.dictionaryLeafDomainKnown), ids=[f"mapShape={shape}" for shape in A001417.dictionaryLeafDomainKnown])
|
|
76
|
+
def test_getLeafDomain(mapShape: tuple[int, ...]) -> None:
|
|
77
|
+
"""Verify getLeafDomain against authoritative leaf domain data for all leaves."""
|
|
78
|
+
state = EliminationState(mapShape=mapShape)
|
|
79
|
+
dictionaryLeafDomainsAuthoritativeData = A001417.dictionaryLeafDomainKnown[mapShape]
|
|
80
|
+
|
|
81
|
+
for leaf in range(state.leavesTotal):
|
|
82
|
+
rangeActual = getLeafDomain(state, leaf)
|
|
83
|
+
startAuthoritativeData, stopAuthoritativeData, stepAuthoritativeData = dictionaryLeafDomainsAuthoritativeData[leaf]
|
|
84
|
+
assert rangeActual.start == startAuthoritativeData, (
|
|
85
|
+
f"getLeafDomain: range.start mismatch at {leaf=} for {mapShape=}. "
|
|
86
|
+
f"Expected {startAuthoritativeData}, got {rangeActual.start}."
|
|
87
|
+
)
|
|
88
|
+
assert rangeActual.stop == stopAuthoritativeData, (
|
|
89
|
+
f"getLeafDomain: range.stop mismatch at {leaf=} for {mapShape=}. "
|
|
90
|
+
f"Expected {stopAuthoritativeData}, got {rangeActual.stop}."
|
|
91
|
+
)
|
|
92
|
+
assert rangeActual.step == stepAuthoritativeData, (
|
|
93
|
+
f"getLeafDomain: range.step mismatch at {leaf=} for {mapShape=}. "
|
|
94
|
+
f"Expected {stepAuthoritativeData}, got {rangeActual.step}."
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
@pytest.mark.parametrize("dimensionsTotal", [5, 6], ids=lambda dimensionsTotal: f"2d{dimensionsTotal}")
|
|
98
|
+
@pytest.mark.parametrize("domainFunction,moduleAuthoritativeData", [
|
|
99
|
+
(getDomainDimension一, p2DnDomain3_2_首一_首零一),
|
|
100
|
+
(getDomainDimension二, p2DnDomain6_7_5_4),
|
|
101
|
+
(getDomainDimension首二, p2DnDomain首二_首零二_首零一二_首一二),
|
|
102
|
+
(getDomain二一零and二一, p2DnDomain7_6),
|
|
103
|
+
(getDomain二零and二, p2DnDomain5_4),
|
|
104
|
+
(getDomain首零一二and首一二, p2DnDomain首零一二_首一二),
|
|
105
|
+
(getDomain首零二and首二, p2DnDomain首零二_首二),
|
|
106
|
+
], ids=lambda domainFunction: domainFunction.__name__)
|
|
107
|
+
def test_getLeafDomainsCombined(domainFunction: Callable[[EliminationState], Sequence[tuple[int, ...]]], moduleAuthoritativeData: ModuleType, dimensionsTotal: int) -> None:
|
|
108
|
+
"""Verify combined domain function against authoritative dataset: completeness, uniqueness, correctness."""
|
|
109
|
+
mapShape: tuple[int, ...] = (2,) * dimensionsTotal
|
|
110
|
+
state = EliminationState(mapShape=mapShape)
|
|
111
|
+
tuplesDomainActual: tuple[tuple[int, ...], ...] = tuple(domainFunction(state))
|
|
112
|
+
tuplesDomainAuthoritativeData: tuple[tuple[int, ...], ...] = getattr(moduleAuthoritativeData, f"listDomain2D{dimensionsTotal}")
|
|
113
|
+
|
|
114
|
+
tuplesMissingFromActual, tuplesExtraInActual = unique_to_each(tuplesDomainAuthoritativeData, tuplesDomainActual)
|
|
115
|
+
tuplesMissingFromActual = tuple(tuplesMissingFromActual)
|
|
116
|
+
tuplesExtraInActual = tuple(tuplesExtraInActual)
|
|
117
|
+
hasAllUnique: bool = all_unique(tuplesDomainActual)
|
|
118
|
+
|
|
119
|
+
assert hasAllUnique, (
|
|
120
|
+
f"{domainFunction.__name__}: returned duplicate tuples for {mapShape=}."
|
|
121
|
+
)
|
|
122
|
+
assert len(tuplesMissingFromActual) == 0, (
|
|
123
|
+
f"{domainFunction.__name__}: missing {len(tuplesMissingFromActual)} tuples from authoritative data for {mapShape=}. "
|
|
124
|
+
f"Missing samples: {sorted(tuplesMissingFromActual)[:3]}"
|
|
125
|
+
)
|
|
126
|
+
assert len(tuplesExtraInActual) == 0, (
|
|
127
|
+
f"{domainFunction.__name__}: returned {len(tuplesExtraInActual)} tuples not in authoritative data for {mapShape=}. "
|
|
128
|
+
f"Extra samples: {sorted(tuplesExtraInActual)[:3]}"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
@pytest.mark.parametrize("mapShape", list(A001417.dictionaryPileRangesKnown), ids=[f"mapShape={shape}" for shape in A001417.dictionaryPileRangesKnown])
|
|
132
|
+
def test_getPileRange(mapShape: tuple[int, ...]) -> None:
|
|
133
|
+
"""Verify getPileRange against authoritative pile range data for all piles."""
|
|
134
|
+
state = EliminationState(mapShape=mapShape)
|
|
135
|
+
dictionaryPileRangesAuthoritativeData: dict[int, tuple[int, ...]] = A001417.dictionaryPileRangesKnown[mapShape]
|
|
136
|
+
|
|
137
|
+
for pile in range(state.leavesTotal):
|
|
138
|
+
tupleLeavesPileActual: tuple[int, ...] = tuple(getPileRange(state, pile))
|
|
139
|
+
tupleLeavesPileAuthoritativeData: tuple[int, ...] = dictionaryPileRangesAuthoritativeData[pile]
|
|
140
|
+
|
|
141
|
+
assert tupleLeavesPileActual == tupleLeavesPileAuthoritativeData, (
|
|
142
|
+
f"getPileRange: mismatch at {pile=} for {mapShape=}. "
|
|
143
|
+
f"Expected {tupleLeavesPileAuthoritativeData}, got {tupleLeavesPileActual}."
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
@pytest.mark.parametrize("dimensionsTotal", [5, 6], ids=lambda dimensionsTotal: f"2d{dimensionsTotal}")
|
|
147
|
+
@pytest.mark.parametrize(
|
|
148
|
+
"creaseKind,creaseFunction,dictionaryExpectedByMapShape",
|
|
149
|
+
[
|
|
150
|
+
("increase", getLeavesCreasePost, A001417.dictionaryCreasesIncreaseKnown),
|
|
151
|
+
("decrease", getLeavesCreaseAnte, A001417.dictionaryCreasesDecreaseKnown),
|
|
152
|
+
],
|
|
153
|
+
ids=["increase", "decrease"],
|
|
154
|
+
)
|
|
155
|
+
def test_getLeavesCrease(creaseKind: str, creaseFunction: Callable[[EliminationState, int], Iterable[int]], dictionaryExpectedByMapShape: dict[tuple[int, ...], dict[int, list[int]]], dimensionsTotal: int) -> None:
|
|
156
|
+
mapShape: tuple[int, ...] = (2,) * dimensionsTotal
|
|
157
|
+
state: EliminationState = EliminationState(mapShape=mapShape)
|
|
158
|
+
dictionaryExpectedByLeaf: dict[int, list[int]] = dictionaryExpectedByMapShape[mapShape]
|
|
159
|
+
|
|
160
|
+
for leaf in range(state.leavesTotal):
|
|
161
|
+
listLeavesActual: list[int] = list(creaseFunction(state, leaf))
|
|
162
|
+
listLeavesExpectedSorted: list[int] = dictionaryExpectedByLeaf[leaf]
|
|
163
|
+
|
|
164
|
+
assert sorted(listLeavesActual) == listLeavesExpectedSorted, (
|
|
165
|
+
f"{creaseFunction.__name__} ({creaseKind}): mismatch for {mapShape=}, {leaf=}. "
|
|
166
|
+
f"Expected(sorted)={listLeavesExpectedSorted}, got(sorted)={sorted(listLeavesActual)}."
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
assert all_unique(listLeavesActual), (
|
|
170
|
+
f"{creaseFunction.__name__} ({creaseKind}): duplicates found for {mapShape=}, {leaf=}. "
|
|
171
|
+
f"Actual={listLeavesActual}."
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
for leafPost in listLeavesActual:
|
|
175
|
+
assert 0 <= leafPost < state.leavesTotal, (
|
|
176
|
+
f"{creaseFunction.__name__} ({creaseKind}): out-of-range value for {mapShape=}, {leaf=}. "
|
|
177
|
+
f"Got {leafPost}, expected 0 <= leafPost < {state.leavesTotal}."
|
|
178
|
+
)
|
|
179
|
+
bitFlip: int = leaf ^ leafPost
|
|
180
|
+
assert (bitFlip > 0) and ((bitFlip & (bitFlip - 1)) == 0), (
|
|
181
|
+
f"{creaseFunction.__name__} ({creaseKind}): expected one-bit flip for {mapShape=}, {leaf=}. "
|
|
182
|
+
f"Got {leafPost=}, {bitFlip=} (leaf^leafPost)."
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
listBitFlips: list[int] = [leaf ^ leafPost for leafPost in listLeavesActual]
|
|
186
|
+
assert listBitFlips == sorted(listBitFlips), (
|
|
187
|
+
f"{creaseFunction.__name__} ({creaseKind}): expected bit flips in increasing dimension order for {mapShape=}, {leaf=}. "
|
|
188
|
+
f"Got bit flips {listBitFlips}."
|
|
189
|
+
)
|