mapFolding 0.17.0__py3-none-any.whl → 0.18.0__py3-none-any.whl

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