mapFolding 0.17.1__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 +7 -11
- easyRun/countFolds.py +11 -10
- easyRun/meanders.py +6 -8
- mapFolding/__init__.py +24 -36
- 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 -67
- mapFolding/algorithms/matrixMeandersNumPyndas.py +18 -18
- mapFolding/algorithms/oeisIDbyFormula.py +4 -4
- mapFolding/algorithms/zCuzDocStoopidoeisIDbyFormula.py +3 -3
- mapFolding/basecamp.py +11 -80
- mapFolding/beDRY.py +107 -111
- mapFolding/dataBaskets.py +0 -56
- 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 +1 -1
- 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 +134 -80
- 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.1.dist-info → mapfolding-0.18.0.dist-info}/METADATA +11 -8
- mapfolding-0.18.0.dist-info/RECORD +305 -0
- {mapfolding-0.17.1.dist-info → mapfolding-0.18.0.dist-info}/WHEEL +1 -1
- easyRun/eliminateFolds.py +0 -60
- mapFolding/algorithms/constraintPropagation.py +0 -184
- mapFolding/algorithms/elimination.py +0 -131
- mapFolding/algorithms/eliminationCount.py +0 -26
- mapFolding/algorithms/eliminationPinned.py +0 -35
- mapFolding/algorithms/iff.py +0 -206
- mapFolding/algorithms/patternFinder.py +0 -280
- mapFolding/algorithms/pinning2Dn.py +0 -345
- mapFolding/algorithms/pinning2DnAnnex.py +0 -43
- mapFolding/tests/verify.py +0 -323
- mapfolding-0.17.1.dist-info/RECORD +0 -112
- {mapfolding-0.17.1.dist-info → mapfolding-0.18.0.dist-info}/entry_points.txt +0 -0
- {mapfolding-0.17.1.dist-info → mapfolding-0.18.0.dist-info}/licenses/LICENSE +0 -0
- {mapfolding-0.17.1.dist-info → mapfolding-0.18.0.dist-info}/top_level.txt +0 -0
|
@@ -25,50 +25,65 @@ 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
|
|
33
33
|
from mapFolding.syntheticModules.initializeState import transitionOnGroupsOfFolds
|
|
34
|
-
from mapFolding.tests.conftest import
|
|
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
|
-
|
|
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:
|
|
47
58
|
"""Test A007822 flow options.
|
|
48
59
|
|
|
49
60
|
Parameters
|
|
50
61
|
----------
|
|
62
|
+
oeisIdentifier : str
|
|
63
|
+
OEIS identifier to validate.
|
|
64
|
+
sequenceIndex : int
|
|
65
|
+
Sequence index to validate.
|
|
51
66
|
flow : str
|
|
52
|
-
|
|
67
|
+
Computation flow to validate.
|
|
68
|
+
processorLimit : float
|
|
69
|
+
CPU limit for the computation.
|
|
53
70
|
|
|
54
71
|
"""
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
@pytest.mark.parametrize('flow', ['daoOfMapFolding', 'numba', 'theorem2', 'theorem2Numba', 'theorem2Trimmed'])
|
|
71
|
-
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:
|
|
72
87
|
"""Validate that different computational flows produce valid results.
|
|
73
88
|
|
|
74
89
|
(AI generated docstring)
|
|
@@ -82,31 +97,32 @@ def test_countFolds(mapShapeTestCountFolds: tuple[int, ...], flow: str) -> None:
|
|
|
82
97
|
|
|
83
98
|
Parameters
|
|
84
99
|
----------
|
|
85
|
-
|
|
86
|
-
|
|
100
|
+
oeisIdentifier : str
|
|
101
|
+
OEIS identifier to validate.
|
|
102
|
+
sequenceIndex : int
|
|
103
|
+
Sequence index to validate.
|
|
87
104
|
flow : str
|
|
88
|
-
|
|
105
|
+
Computation flow to validate.
|
|
106
|
+
processorLimit : float | None
|
|
107
|
+
CPU limit for the computation.
|
|
89
108
|
|
|
90
109
|
"""
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
@pytest.mark.parametrize('flow', ['matrixMeanders', 'matrixNumPy', 'matrixPandas'])
|
|
109
|
-
def test_meanders(oeisIDmeanders: str, flow: str) -> None:
|
|
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:
|
|
110
126
|
"""Verify Meanders OEIS sequence value calculations against known reference values.
|
|
111
127
|
|
|
112
128
|
Tests the functions in `mapFolding.algorithms.oeisIDbyFormula` by comparing their
|
|
@@ -114,18 +130,39 @@ def test_meanders(oeisIDmeanders: str, flow: str) -> None:
|
|
|
114
130
|
|
|
115
131
|
Parameters
|
|
116
132
|
----------
|
|
117
|
-
|
|
118
|
-
|
|
133
|
+
oeisIdentifier : str
|
|
134
|
+
OEIS identifier to validate.
|
|
135
|
+
sequenceIndex : int
|
|
136
|
+
Sequence index to validate.
|
|
137
|
+
flow : str
|
|
138
|
+
Computation flow to validate.
|
|
119
139
|
|
|
120
140
|
"""
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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:
|
|
129
166
|
"""Verify Meanders OEIS sequence value calculations against known reference values.
|
|
130
167
|
|
|
131
168
|
Tests the functions in `mapFolding.algorithms.oeisIDbyFormula` by comparing their
|
|
@@ -133,18 +170,28 @@ def test_NOTcountingFolds(oeisIDother: str) -> None:
|
|
|
133
170
|
|
|
134
171
|
Parameters
|
|
135
172
|
----------
|
|
136
|
-
|
|
137
|
-
|
|
173
|
+
oeisIdentifier : str
|
|
174
|
+
OEIS identifier to validate.
|
|
175
|
+
sequenceIndex : int
|
|
176
|
+
Sequence index to validate.
|
|
138
177
|
|
|
139
178
|
"""
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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:
|
|
148
195
|
"""Verify OEIS sequence value calculations against known reference values.
|
|
149
196
|
|
|
150
197
|
Tests the `oeisIDfor_n` function by comparing its calculated output against
|
|
@@ -157,12 +204,19 @@ def test_oeisIDfor_n(oeisIDmapFolding: str) -> None:
|
|
|
157
204
|
|
|
158
205
|
Parameters
|
|
159
206
|
----------
|
|
160
|
-
|
|
161
|
-
|
|
207
|
+
oeisIdentifier : str
|
|
208
|
+
OEIS identifier to validate.
|
|
209
|
+
sequenceIndex : int
|
|
210
|
+
Sequence index to validate.
|
|
162
211
|
|
|
163
212
|
"""
|
|
164
|
-
|
|
165
|
-
|
|
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)
|
|
166
220
|
|
|
167
221
|
@pytest.mark.parametrize('pathFilename_tmpTesting', ['.py'], indirect=True)
|
|
168
222
|
def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFilename_tmpTesting: Path) -> None:
|
|
@@ -188,11 +242,11 @@ def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFil
|
|
|
188
242
|
"""
|
|
189
243
|
from mapFolding.someAssemblyRequired.makeJobTheorem2Numba import makeJobNumba # noqa: PLC0415
|
|
190
244
|
from mapFolding.someAssemblyRequired.toolkitNumba import SpicesJobNumba # noqa: PLC0415
|
|
191
|
-
mapShape = oneTestCuzTestsOverwritingTests
|
|
192
|
-
state = transitionOnGroupsOfFolds(MapFoldingState(mapShape))
|
|
245
|
+
mapShape: tuple[int, ...] = oneTestCuzTestsOverwritingTests
|
|
246
|
+
state: MapFoldingState = transitionOnGroupsOfFolds(MapFoldingState(mapShape))
|
|
193
247
|
|
|
194
|
-
pathFilenameModule = pathFilename_tmpTesting.absolute()
|
|
195
|
-
pathFilenameFoldsTotal = pathFilenameModule.with_suffix('.foldsTotalTesting')
|
|
248
|
+
pathFilenameModule: Path = pathFilename_tmpTesting.absolute()
|
|
249
|
+
pathFilenameFoldsTotal: Path = pathFilenameModule.with_suffix('.foldsTotalTesting')
|
|
196
250
|
registrarRecordsTemporaryFilesystemObject(pathFilenameFoldsTotal)
|
|
197
251
|
|
|
198
252
|
jobTest = RecipeJobTheorem2(state
|
|
@@ -202,14 +256,14 @@ def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFil
|
|
|
202
256
|
spices = SpicesJobNumba(useNumbaProgressBar=False, parametersNumba=parametersNumbaLight)
|
|
203
257
|
makeJobNumba(jobTest, spices)
|
|
204
258
|
|
|
205
|
-
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)
|
|
206
260
|
if Don_Lapre_Road_to_Self_Improvement is None:
|
|
207
|
-
message = f"Failed to create module specification from {pathFilenameModule}"
|
|
261
|
+
message: str = f"Failed to create module specification from {pathFilenameModule}"
|
|
208
262
|
raise ImportError(message)
|
|
209
263
|
if Don_Lapre_Road_to_Self_Improvement.loader is None:
|
|
210
264
|
message = f"Failed to get loader for module {pathFilenameModule}"
|
|
211
265
|
raise ImportError(message)
|
|
212
|
-
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)
|
|
213
267
|
|
|
214
268
|
module.__name__ = "__main__"
|
|
215
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
|
+
)
|