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.
Files changed (248) hide show
  1. easyRun/NOTcountingFolds.py +7 -11
  2. easyRun/countFolds.py +11 -10
  3. easyRun/meanders.py +6 -8
  4. mapFolding/__init__.py +24 -36
  5. mapFolding/_e/Z0Z_analysisPython/SORTZ0Z_hypothesis.py +189 -0
  6. mapFolding/_e/Z0Z_analysisPython/SORTZ0Z_p2d6.py +143 -0
  7. mapFolding/_e/Z0Z_analysisPython/__init__.py +4 -0
  8. mapFolding/_e/Z0Z_analysisPython/exclusionData/__init__.py +0 -0
  9. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200.py +369 -0
  10. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/2001.py +694 -0
  11. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/270/211.py +514 -0
  12. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/270/2111.py +480 -0
  13. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/272/214.py +511 -0
  14. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/272/2141.py +515 -0
  15. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/272/214/344/270/211.py +485 -0
  16. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/200/344/272/214/344/270/2111.py +442 -0
  17. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/211.py +313 -0
  18. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/270/2111.py +343 -0
  19. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/272/214.py +400 -0
  20. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/272/2141.py +497 -0
  21. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/272/214/344/270/211.py +463 -0
  22. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/344/272/214/344/270/2111.py +441 -0
  23. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266.py +35 -0
  24. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/2661.py +35 -0
  25. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200.py +382 -0
  26. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/2001.py +630 -0
  27. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/270/211.py +488 -0
  28. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/270/2111.py +475 -0
  29. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/272/214.py +473 -0
  30. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/272/2141.py +500 -0
  31. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211.py +465 -0
  32. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111.py +439 -0
  33. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/211.py +599 -0
  34. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/270/2111.py +536 -0
  35. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/272/214.py +506 -0
  36. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/272/2141.py +533 -0
  37. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/272/214/344/270/211.py +489 -0
  38. mapFolding/_e/Z0Z_analysisPython/exclusionData/aggregated/351/246/226/351/233/266/344/272/214/344/270/2111.py +474 -0
  39. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200.py +1186 -0
  40. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/2001.py +2158 -0
  41. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/2001Negative.py +2158 -0
  42. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200Negative.py +1186 -0
  43. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/270/211.py +1397 -0
  44. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/270/2111.py +1291 -0
  45. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/270/2111Negative.py +1291 -0
  46. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/270/211Negative.py +1397 -0
  47. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214.py +1240 -0
  48. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/2141.py +1420 -0
  49. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/2141Negative.py +1420 -0
  50. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214Negative.py +1240 -0
  51. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214/344/270/211.py +1366 -0
  52. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214/344/270/2111.py +1274 -0
  53. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214/344/270/2111Negative.py +1274 -0
  54. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/200/344/272/214/344/270/211Negative.py +1366 -0
  55. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/211.py +1186 -0
  56. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/2111.py +1186 -0
  57. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/2111Negative.py +1186 -0
  58. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/270/211Negative.py +1186 -0
  59. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214.py +1102 -0
  60. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/2141.py +1422 -0
  61. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/2141Negative.py +1422 -0
  62. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214Negative.py +1102 -0
  63. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214/344/270/211.py +1240 -0
  64. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214/344/270/2111.py +1228 -0
  65. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214/344/270/2111Negative.py +1228 -0
  66. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/344/272/214/344/270/211Negative.py +1240 -0
  67. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266.py +32 -0
  68. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/2661.py +1162 -0
  69. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/2661Negative.py +1162 -0
  70. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266Negative.py +32 -0
  71. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200.py +1186 -0
  72. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/2001.py +1926 -0
  73. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/2001Negative.py +1926 -0
  74. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200Negative.py +1186 -0
  75. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/270/211.py +1291 -0
  76. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/270/2111.py +1176 -0
  77. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/270/2111Negative.py +1176 -0
  78. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/270/211Negative.py +1291 -0
  79. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214.py +1228 -0
  80. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/2141.py +1324 -0
  81. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/2141Negative.py +1324 -0
  82. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214Negative.py +1228 -0
  83. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211.py +1274 -0
  84. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111.py +1038 -0
  85. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111Negative.py +1038 -0
  86. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211Negative.py +1274 -0
  87. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/211.py +2158 -0
  88. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/2111.py +1926 -0
  89. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/2111Negative.py +1926 -0
  90. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/270/211Negative.py +2158 -0
  91. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214.py +1422 -0
  92. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/2141.py +1364 -0
  93. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/2141Negative.py +1364 -0
  94. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214Negative.py +1422 -0
  95. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214/344/270/211.py +1420 -0
  96. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214/344/270/2111.py +1324 -0
  97. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214/344/270/2111Negative.py +1324 -0
  98. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d5/351/246/226/351/233/266/344/272/214/344/270/211Negative.py +1420 -0
  99. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200.py +3133 -0
  100. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/2001.py +6039 -0
  101. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/2001Negative.py +6039 -0
  102. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200Negative.py +3133 -0
  103. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/270/211.py +3527 -0
  104. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/270/2111.py +2300 -0
  105. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/270/2111Negative.py +2300 -0
  106. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/270/211Negative.py +3527 -0
  107. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214.py +3597 -0
  108. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/2141.py +3317 -0
  109. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/2141Negative.py +3317 -0
  110. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214Negative.py +3597 -0
  111. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214/344/270/211.py +3161 -0
  112. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214/344/270/2111.py +2877 -0
  113. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214/344/270/2111Negative.py +2877 -0
  114. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/200/344/272/214/344/270/211Negative.py +3161 -0
  115. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/211.py +2981 -0
  116. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/2111.py +3055 -0
  117. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/2111Negative.py +3055 -0
  118. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/270/211Negative.py +2981 -0
  119. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214.py +3221 -0
  120. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/2141.py +3988 -0
  121. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/2141Negative.py +3988 -0
  122. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214Negative.py +3221 -0
  123. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214/344/270/211.py +3652 -0
  124. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214/344/270/2111.py +2863 -0
  125. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214/344/270/2111Negative.py +2863 -0
  126. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/344/272/214/344/270/211Negative.py +3652 -0
  127. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200.py +2485 -0
  128. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/2001.py +4566 -0
  129. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/2001Negative.py +4566 -0
  130. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200Negative.py +2485 -0
  131. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/270/211.py +3006 -0
  132. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/270/2111.py +2485 -0
  133. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/270/2111Negative.py +2485 -0
  134. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/270/211Negative.py +3006 -0
  135. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214.py +3304 -0
  136. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/2141.py +3015 -0
  137. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/2141Negative.py +3015 -0
  138. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214Negative.py +3304 -0
  139. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211.py +2939 -0
  140. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111.py +2589 -0
  141. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214/344/270/2111Negative.py +2589 -0
  142. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/200/344/272/214/344/270/211Negative.py +2939 -0
  143. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/211.py +3899 -0
  144. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/2111.py +2996 -0
  145. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/2111Negative.py +2996 -0
  146. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/270/211Negative.py +3899 -0
  147. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214.py +3223 -0
  148. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/2141.py +3020 -0
  149. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/2141Negative.py +3020 -0
  150. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214Negative.py +3223 -0
  151. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214/344/270/211.py +3250 -0
  152. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214/344/270/2111.py +2667 -0
  153. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214/344/270/2111Negative.py +2667 -0
  154. mapFolding/_e/Z0Z_analysisPython/exclusionData/collatedp2d6/351/246/226/351/233/266/344/272/214/344/270/211Negative.py +3250 -0
  155. mapFolding/_e/Z0Z_analysisPython/measure.py +162 -0
  156. mapFolding/_e/Z0Z_analysisPython/positionAnalysis.py +403 -0
  157. mapFolding/_e/Z0Z_analysisPython/positionAnalysisPileRanges2d6.py +110 -0
  158. mapFolding/_e/Z0Z_analysisPython/theExcluderBeast.py +640 -0
  159. mapFolding/_e/Z0Z_analysisPython/toolkit.py +166 -0
  160. mapFolding/_e/Z0Z_analysisPython/toolkitCSVsequences.py +188 -0
  161. mapFolding/_e/Z0Z_analysisPython/workBenchPatternFinder.py +284 -0
  162. mapFolding/_e/Z0Z_notes/__init__.py +0 -0
  163. mapFolding/_e/Z0Z_notes/knowledgeDump.py +214 -0
  164. mapFolding/_e/__init__.py +45 -0
  165. mapFolding/_e/_beDRY.py +547 -0
  166. mapFolding/_e/_dataDynamic.py +1164 -0
  167. mapFolding/_e/_measure.py +579 -0
  168. mapFolding/_e/_semiotics.py +363 -0
  169. mapFolding/_e/_theTypes.py +31 -0
  170. mapFolding/_e/algorithms/__init__.py +1 -0
  171. mapFolding/_e/algorithms/constraintPropagation.py +158 -0
  172. mapFolding/_e/algorithms/elimination.py +118 -0
  173. mapFolding/_e/algorithms/eliminationCrease.py +66 -0
  174. mapFolding/_e/algorithms/iff.py +584 -0
  175. mapFolding/_e/basecamp.py +89 -0
  176. mapFolding/_e/dataBaskets.py +123 -0
  177. mapFolding/_e/dataRaw/__init__.py +0 -0
  178. mapFolding/_e/easyRun/__init__.py +0 -0
  179. mapFolding/_e/easyRun/eliminateFolds.py +72 -0
  180. mapFolding/_e/easyRun/pinning.py +62 -0
  181. mapFolding/_e/filters.py +384 -0
  182. mapFolding/_e/pin2/344/270/212nDimensions.py +882 -0
  183. mapFolding/_e/pin2/344/270/212nDimensionsAnnex.py +551 -0
  184. mapFolding/_e/pin2/344/270/212nDimensionsByCrease.py +190 -0
  185. mapFolding/_e/pin2/344/270/212nDimensionsByDomain.py +459 -0
  186. mapFolding/_e/pinIt.py +436 -0
  187. mapFolding/_semiotics.py +42 -0
  188. mapFolding/_theSSOT.py +11 -56
  189. mapFolding/_theTypes.py +52 -67
  190. mapFolding/algorithms/matrixMeandersNumPyndas.py +18 -18
  191. mapFolding/algorithms/oeisIDbyFormula.py +4 -4
  192. mapFolding/algorithms/zCuzDocStoopidoeisIDbyFormula.py +3 -3
  193. mapFolding/basecamp.py +11 -80
  194. mapFolding/beDRY.py +107 -111
  195. mapFolding/dataBaskets.py +0 -56
  196. mapFolding/filesystemToolkit.py +15 -11
  197. mapFolding/oeis.py +17 -16
  198. mapFolding/reference/matrixMeandersAnalysis/prefixNotationNotes.py +2 -2
  199. mapFolding/reference/meandersDumpingGround/matrixMeandersBaselineV2.py +0 -1
  200. mapFolding/reference/meandersDumpingGround/matrixMeandersNumPyV1finalForm.py +8 -10
  201. mapFolding/someAssemblyRequired/RecipeJob.py +5 -5
  202. mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +5 -2
  203. mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +9 -11
  204. mapFolding/someAssemblyRequired/mapFoldingModules/makeMapFoldingModules.py +2 -1
  205. mapFolding/someAssemblyRequired/transformationTools.py +1 -1
  206. mapFolding/tests/Z0Z_test_e_excluder.py +155 -0
  207. mapFolding/tests/conftest.py +193 -314
  208. mapFolding/tests/dataSamples/A001417.py +455 -0
  209. mapFolding/tests/dataSamples/__init__.py +1 -0
  210. mapFolding/tests/dataSamples/measurementData.py +1818 -0
  211. mapFolding/tests/dataSamples/p2DnDomain3_2_/351/246/226/344/270/200_/351/246/226/351/233/266/344/270/200.py +17 -0
  212. mapFolding/tests/dataSamples/p2DnDomain3_/351/246/226/344/270/200.py +17 -0
  213. mapFolding/tests/dataSamples/p2DnDomain5_4.py +17 -0
  214. mapFolding/tests/dataSamples/p2DnDomain6_5.py +17 -0
  215. mapFolding/tests/dataSamples/p2DnDomain6_7_5_4.py +17 -0
  216. mapFolding/tests/dataSamples/p2DnDomain7_6.py +17 -0
  217. 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
  218. 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
  219. 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
  220. mapFolding/tests/dataSamples/p2DnDomain/351/246/226/351/233/266/344/272/214_/351/246/226/344/272/214.py +15 -0
  221. mapFolding/tests/dataSamples/semioticsData.py +135 -0
  222. mapFolding/tests/test_computations.py +134 -80
  223. mapFolding/tests/test_e_computations.py +42 -0
  224. mapFolding/tests/test_e_dataDynamic.py +189 -0
  225. mapFolding/tests/test_e_measurements.py +257 -0
  226. mapFolding/tests/test_e_pinning.py +61 -0
  227. mapFolding/tests/test_e_semiotics.py +128 -0
  228. mapFolding/tests/test_filesystem.py +39 -17
  229. mapFolding/tests/{test_other.py → test_parameterValidation.py} +3 -3
  230. mapFolding/tests/{test_tasks.py → test_taskDivisions.py} +42 -23
  231. mapFolding/zCuzDocStoopid/makeDocstrings.py +3 -2
  232. {mapfolding-0.17.1.dist-info → mapfolding-0.18.0.dist-info}/METADATA +11 -8
  233. mapfolding-0.18.0.dist-info/RECORD +305 -0
  234. {mapfolding-0.17.1.dist-info → mapfolding-0.18.0.dist-info}/WHEEL +1 -1
  235. easyRun/eliminateFolds.py +0 -60
  236. mapFolding/algorithms/constraintPropagation.py +0 -184
  237. mapFolding/algorithms/elimination.py +0 -131
  238. mapFolding/algorithms/eliminationCount.py +0 -26
  239. mapFolding/algorithms/eliminationPinned.py +0 -35
  240. mapFolding/algorithms/iff.py +0 -206
  241. mapFolding/algorithms/patternFinder.py +0 -280
  242. mapFolding/algorithms/pinning2Dn.py +0 -345
  243. mapFolding/algorithms/pinning2DnAnnex.py +0 -43
  244. mapFolding/tests/verify.py +0 -323
  245. mapfolding-0.17.1.dist-info/RECORD +0 -112
  246. {mapfolding-0.17.1.dist-info → mapfolding-0.18.0.dist-info}/entry_points.txt +0 -0
  247. {mapfolding-0.17.1.dist-info → mapfolding-0.18.0.dist-info}/licenses/LICENSE +0 -0
  248. {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 countFolds, dictionaryOEIS, dictionaryOEISMapFolding, eliminateFolds, getFoldsTotalKnown, oeisIDfor_n
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 mapShapeTestCountFolds, registrarRecordsTemporaryFilesystemObject, standardizedEqualToCallableReturn
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 __name__ == '__main__':
43
- multiprocessing.set_start_method('spawn')
44
-
45
- @pytest.mark.parametrize('flow', ['algorithm', 'asynchronous', 'theorem2', 'theorem2Numba', 'theorem2Trimmed'])
46
- 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:
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
- The computational flow algorithm to validate.
67
+ Computation flow to validate.
68
+ processorLimit : float
69
+ CPU limit for the computation.
53
70
 
54
71
  """
55
- oeisID = 'A007822'
56
- CPUlimit = .5
57
- warnings.filterwarnings('ignore', category=NumbaPendingDeprecationWarning)
58
- oeis_n = 2
59
- for oeis_n in dictionaryOEIS[oeisID]['valuesTestValidation']:
60
- if oeis_n < 2:
61
- continue
62
-
63
- expected = dictionaryOEIS[oeisID]['valuesKnown'][oeis_n]
64
-
65
- standardizedEqualToCallableReturn(
66
- expected
67
- , NOTcountingFolds, oeisID, oeis_n, flow, CPUlimit
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
- mapShapeTestCountFolds : tuple[int, ...]
86
- The map shape dimensions to test fold counting for.
100
+ oeisIdentifier : str
101
+ OEIS identifier to validate.
102
+ sequenceIndex : int
103
+ Sequence index to validate.
87
104
  flow : str
88
- The computational flow algorithm to validate.
105
+ Computation flow to validate.
106
+ processorLimit : float | None
107
+ CPU limit for the computation.
89
108
 
90
109
  """
91
- standardizedEqualToCallableReturn(getFoldsTotalKnown(mapShapeTestCountFolds), countFolds, None, None, None, None, mapShapeTestCountFolds, flow)
92
-
93
- # @pytest.mark.parametrize('flow', ['constraintPropagation', 'elimination'])
94
- # def test_eliminateFolds(mapShapeTestParallelization: tuple[int, ...], flow: str) -> None:
95
- # """Validate `eliminateFolds` and different flows produce valid results.
96
-
97
- # Parameters
98
- # ----------
99
- # mapShapeTestCountFolds : tuple[int, ...]
100
- # The map shape dimensions to test fold counting for.
101
- # flow : str
102
- # The computational flow algorithm to validate.
103
- # """
104
- # pathLikeWriteFoldsTotal: None = None
105
- # CPUlimit: bool | float | int | None = .25
106
- # standardizedEqualToCallableReturn(getFoldsTotalKnown(mapShapeTestParallelization), eliminateFolds, mapShapeTestParallelization, pathLikeWriteFoldsTotal, CPUlimit, flow)
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
- oeisIDMeanders : str
118
- The Meanders OEIS sequence identifier to test calculations for.
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
- dictionary = dictionaryOEISMapFolding if oeisIDmeanders in dictionaryOEISMapFolding else dictionaryOEIS
122
- for n in dictionary[oeisIDmeanders]['valuesTestValidation']:
123
- standardizedEqualToCallableReturn(
124
- dictionary[oeisIDmeanders]['valuesKnown'][n]
125
- , NOTcountingFolds, oeisIDmeanders, n, flow, None
126
- )
127
-
128
- def test_NOTcountingFolds(oeisIDother: str) -> None:
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
- oeisIDMeanders : str
137
- The Meanders OEIS sequence identifier to test calculations for.
173
+ oeisIdentifier : str
174
+ OEIS identifier to validate.
175
+ sequenceIndex : int
176
+ Sequence index to validate.
138
177
 
139
178
  """
140
- dictionary = dictionaryOEISMapFolding if oeisIDother in dictionaryOEISMapFolding else dictionaryOEIS
141
- for n in dictionary[oeisIDother]['valuesTestValidation']:
142
- standardizedEqualToCallableReturn(
143
- dictionary[oeisIDother]['valuesKnown'][n]
144
- , NOTcountingFolds, oeisIDother, n, None, None
145
- )
146
-
147
- def test_oeisIDfor_n(oeisIDmapFolding: str) -> None:
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
- oeisID : str
161
- The OEIS sequence identifier to test calculations for.
207
+ oeisIdentifier : str
208
+ OEIS identifier to validate.
209
+ sequenceIndex : int
210
+ Sequence index to validate.
162
211
 
163
212
  """
164
- for n in dictionaryOEISMapFolding[oeisIDmapFolding]['valuesTestValidation']:
165
- standardizedEqualToCallableReturn(dictionaryOEISMapFolding[oeisIDmapFolding]['valuesKnown'][n], oeisIDfor_n, oeisIDmapFolding, n)
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
+ )