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
@@ -3,7 +3,7 @@
3
3
  from astToolkit import identifierDotAttribute, parseLogicalPath2astModule
4
4
  from astToolkit.containers import IngredientsFunction, IngredientsModule, LedgerOfImports
5
5
  from astToolkit.transformationTools import pythonCode2ast_expr
6
- from hunterMakesPy import autoDecodingRLE
6
+ from hunterMakesPy.dataStructures import autoDecodingRLE
7
7
  # TODO 'The____' identifiers are a vestigial semiotic system. Do I still need to import `asname`? If so, would different
8
8
  # identifiers better integrate into the current semiotics?
9
9
  from mapFolding import (
@@ -84,7 +84,7 @@ class RecipeJobTheorem2:
84
84
  shatteredDataclass: ShatteredDataclass = dataclasses.field(default=None, init=True) # pyright: ignore[reportAssignmentType]
85
85
  """Deconstructed dataclass metadata for code transformation."""
86
86
 
87
- # ------- Source -----------------------------------------
87
+ #-------- Source -----------------------------------------
88
88
  source_astModule: ast.Module = parseLogicalPath2astModule(f'{packageSettings.identifierPackage}.{default['logicalPath']['synthetic']}.theorem2Numba') # noqa: RUF009
89
89
  """Parsed AST of the source module containing the generic algorithm."""
90
90
  identifierCallableSource: str = default['function']['counting']
@@ -102,7 +102,7 @@ class RecipeJobTheorem2:
102
102
  sourcePackageIdentifier: str | None = packageSettings.identifierPackage
103
103
  """Name of the source package."""
104
104
 
105
- # ------- Filesystem, names of physical objects ------------------------------------------
105
+ #-------- Filesystem, names of physical objects ------------------------------------------
106
106
  pathPackage: PurePosixPath | None = None
107
107
  """Override path for the target package."""
108
108
  pathModule: PurePosixPath | None = PurePosixPath(getPathRootJobDEFAULT()) # noqa: RUF009
@@ -112,7 +112,7 @@ class RecipeJobTheorem2:
112
112
  pathFilenameFoldsTotal: PurePosixPath = dataclasses.field(default=None, init=True) # pyright: ignore[reportAssignmentType]
113
113
  """Path for writing fold count results."""
114
114
 
115
- # ------- Logical identifiers, as opposed to physical identifiers ------------------------
115
+ #-------- Logical identifiers, as opposed to physical identifiers ------------------------
116
116
  packageIdentifier: str | None = None
117
117
  """Target package identifier."""
118
118
  logicalPathRoot: identifierDotAttribute | None = None
@@ -128,7 +128,7 @@ class RecipeJobTheorem2:
128
128
  logicalPathModuleDataclass: identifierDotAttribute | None = sourceLogicalPathModuleDataclass
129
129
  """Logical path to target dataclass module."""
130
130
 
131
- # ------- Datatypes ------------------------------------------
131
+ #-------- Datatypes ------------------------------------------
132
132
  type DatatypeFoldsTotal = TheDatatypeFoldsTotal
133
133
  """Type alias for datatype linked to the magnitude of `foldsTotal`."""
134
134
  type DatatypeElephino = TheDatatypeElephino
@@ -10,7 +10,7 @@ progress integration for long-running calculations, and launcher generation for
10
10
 
11
11
  from astToolkit import Be, Make, NodeChanger, NodeTourist, parseLogicalPath2astModule, Then
12
12
  from astToolkit.containers import astModuleToIngredientsFunction, IngredientsFunction, IngredientsModule
13
- from hunterMakesPy import autoDecodingRLE, identifierDotAttribute
13
+ from hunterMakesPy.dataStructures import autoDecodingRLE
14
14
  from mapFolding import (
15
15
  DatatypeLeavesTotal, dictionaryOEIS, getFoldsTotalKnown, getPathFilenameFoldsTotal, packageSettings)
16
16
  from mapFolding.dataBaskets import MapFoldingState, SymmetricFoldsState
@@ -19,9 +19,12 @@ from mapFolding.someAssemblyRequired.RecipeJob import customizeDatatypeViaImport
19
19
  from mapFolding.someAssemblyRequired.toolkitNumba import decorateCallableWithNumba, parametersNumbaLight, SpicesJobNumba
20
20
  from mapFolding.someAssemblyRequired.transformationTools import shatter_dataclassesDOTdataclass
21
21
  from pathlib import PurePosixPath
22
- from typing import cast
22
+ from typing import cast, TYPE_CHECKING
23
23
  import ast
24
24
 
25
+ if TYPE_CHECKING:
26
+ from hunterMakesPy import identifierDotAttribute
27
+
25
28
  # TODO More convergence with `makeJobTheorem2codon`
26
29
 
27
30
  # TODO Dynamically calculate the bitwidth of each datatype. NOTE I've delayed dynamic calculation because I don't know how to
@@ -7,6 +7,7 @@ from astToolkit import (
7
7
  from astToolkit.containers import IngredientsFunction, IngredientsModule
8
8
  from astToolkit.transformationTools import removeUnusedParameters, write_astModule
9
9
  from hunterMakesPy import raiseIfNone
10
+ from io import TextIOBase
10
11
  from mapFolding import DatatypeLeavesTotal, getPathFilenameFoldsTotal, packageSettings
11
12
  from mapFolding.dataBaskets import MapFoldingState
12
13
  from mapFolding.someAssemblyRequired import DatatypeConfiguration, default, IfThis
@@ -14,14 +15,11 @@ from mapFolding.someAssemblyRequired.RecipeJob import (
14
15
  customizeDatatypeViaImport, moveShatteredDataclass_arg2body, RecipeJobTheorem2)
15
16
  from mapFolding.syntheticModules.initializeState import transitionOnGroupsOfFolds
16
17
  from pathlib import Path, PurePosixPath
17
- from typing import cast, TYPE_CHECKING
18
+ from typing import cast
19
+ import ast
18
20
  import subprocess
19
21
  import sys
20
22
 
21
- if TYPE_CHECKING:
22
- from io import TextIOBase
23
- import ast
24
-
25
23
  # TODO Converge with `makeJobTheorem2Numba`.
26
24
 
27
25
  listDatatypeConfigurations: list[DatatypeConfiguration] = [
@@ -73,8 +71,8 @@ def _variableCompatibility(ingredientsFunction: IngredientsFunction, job: Recipe
73
71
  identifier: str = ast_arg.arg
74
72
  annotation: ast.expr = raiseIfNone(ast_arg.annotation)
75
73
 
76
- # ------- `identifier` is target of Augmented Assignment, or --------------
77
- # ------- `identifier` is target of Assignment and value is Constant. -----
74
+ #-------- `identifier` is target of Augmented Assignment, or --------------
75
+ #-------- `identifier` is target of Assignment and value is Constant. -----
78
76
  NodeChanger(
79
77
  IfThis.isAnyOf(
80
78
  Be.AugAssign.targetIs(IfThis.isNestedNameIdentifier(identifier))
@@ -84,23 +82,23 @@ def _variableCompatibility(ingredientsFunction: IngredientsFunction, job: Recipe
84
82
  , doThat=lambda node, annotation=annotation: Grab.valueAttribute(Then.replaceWith(Make.Call(annotation, listParameters=[node.value])))(node)
85
83
  ).visit(ingredientsFunction.astFunctionDef)
86
84
 
87
- # ------- `identifier` - 1. ----------------------------------------------
85
+ #-------- `identifier` - 1. ----------------------------------------------
88
86
  NodeChanger(Be.BinOp.leftIs(IfThis.isNestedNameIdentifier(identifier))
89
87
  , doThat=lambda node, annotation=annotation: Grab.rightAttribute(Then.replaceWith(Make.Call(annotation, listParameters=[node.right])))(node)
90
88
  ).visit(ingredientsFunction.astFunctionDef)
91
89
 
92
- # ------- `identifier` in Comparison. -------------------------------------
90
+ #-------- `identifier` in Comparison. -------------------------------------
93
91
  NodeChanger(Be.Compare.leftIs(IfThis.isNestedNameIdentifier(identifier))
94
92
  , doThat=lambda node, annotation=annotation: Grab.comparatorsAttribute(lambda at, annotation=annotation: Then.replaceWith([Make.Call(annotation, listParameters=[node.comparators[0]])])(at[0]))(node)
95
93
  ).visit(ingredientsFunction.astFunctionDef)
96
94
 
97
- # ------- `identifier` has exactly one index value. -----------------------
95
+ #-------- `identifier` has exactly one index value. -----------------------
98
96
  NodeChanger(IfThis.isAllOf(Be.Subscript.valueIs(IfThis.isNestedNameIdentifier(identifier))
99
97
  , lambda node: not Be.Subscript.sliceIs(Be.Tuple)(node))
100
98
  , doThat=lambda node: Grab.sliceAttribute(Then.replaceWith(Make.Call(Make.Name('int'), listParameters=[node.slice])))(node)
101
99
  ).visit(ingredientsFunction.astFunctionDef)
102
100
 
103
- # ------- `identifier` has multiple index values. -------------------------
101
+ #-------- `identifier` has multiple index values. -------------------------
104
102
  NodeChanger(IfThis.isAllOf(Be.Subscript.valueIs(IfThis.isNestedNameIdentifier(identifier))
105
103
  , Be.Subscript.sliceIs(Be.Tuple))
106
104
  , doThat=lambda node: Grab.sliceAttribute(Grab.eltsAttribute(
@@ -5,7 +5,8 @@ from astToolkit import (
5
5
  from astToolkit.containers import (
6
6
  astModuleToIngredientsFunction, IngredientsFunction, IngredientsModule, LedgerOfImports)
7
7
  from astToolkit.transformationTools import inlineFunctionDef, removeUnusedParameters, write_astModule
8
- from hunterMakesPy import importLogicalPath2Identifier, raiseIfNone
8
+ from hunterMakesPy import raiseIfNone
9
+ from hunterMakesPy.filesystemToolkit import importLogicalPath2Identifier
9
10
  from mapFolding import packageSettings
10
11
  from mapFolding.someAssemblyRequired import default, DeReConstructField2ast, IfThis, ShatteredDataclass
11
12
  from mapFolding.someAssemblyRequired.makingModules_count import (
@@ -28,7 +28,7 @@ through specialized compilation paths essential for computationally intensive ma
28
28
  from astToolkit import Be, extractClassDef, identifierDotAttribute, Make, NodeChanger, parseLogicalPath2astModule, Then
29
29
  from astToolkit.containers import IngredientsFunction
30
30
  from astToolkit.transformationTools import unparseFindReplace
31
- from hunterMakesPy import importLogicalPath2Identifier
31
+ from hunterMakesPy.filesystemToolkit import importLogicalPath2Identifier
32
32
  from mapFolding.someAssemblyRequired import DeReConstructField2ast, IfThis, ShatteredDataclass
33
33
  import ast
34
34
  import dataclasses
@@ -0,0 +1,155 @@
1
+ """Tests for the excluder system and analysis tools.
2
+
3
+ This module tests the functionality of the excluder system, including:
4
+ 1. The logic for excluding leaves based on pinned piles (`_Z0Z_excludeThisLeaf`, `Z0Z_excluder`).
5
+ 2. The generation and analysis of exclusion data (`theExcluderBeast.py`).
6
+ 3. The transformation of indices to fraction/addend representations.
7
+
8
+ The tests use `pytest` fixtures and parametrization to ensure flexibility and coverage.
9
+ """
10
+
11
+ from fractions import Fraction
12
+ from mapFolding._e.dataBaskets import EliminationState
13
+ from mapFolding._e.pin2上nDimensionsAnnex import Z0Z_excluder
14
+ from mapFolding._e.Z0Z_analysisPython import theExcluderBeast
15
+ from mapFolding._e.Z0Z_analysisPython.theExcluderBeast import (
16
+ _getContiguousEndingAtNegativeOne, _getContiguousFromStart, expressIndexAsFractionAddend, FractionAddend,
17
+ writeAggregatedExclusions, writeExclusionDataCollated, writeExclusionDictionaries)
18
+ from pathlib import Path, PurePath
19
+ from typing import Any
20
+ from unittest.mock import MagicMock, patch
21
+ import pandas
22
+ import pytest
23
+
24
+ #======== Logic Tests (Adapted from test_excluder_logic.py) =======
25
+
26
+ @pytest.mark.parametrize("dimensionsTotal, pileLast, permutationSpace, expectedResult", [
27
+ (6, 99, {7: 4, 12: 36}, True),
28
+ ], ids=["2d6_pileLast99_pinned7_4_12_36"])
29
+ def test_Z0Z_excluder(dimensionsTotal: int, pileLast: int, permutationSpace: dict[int, int], expectedResult: bool, monkeypatch: pytest.MonkeyPatch) -> None:
30
+ """Verify Z0Z_excluder correctly identifies invalid states."""
31
+ state = MagicMock(spec=EliminationState)
32
+ state.dimensionsTotal = dimensionsTotal
33
+ state.pileLast = pileLast
34
+ state.permutationSpace = permutationSpace
35
+
36
+ stubLookup: dict[int, dict[int, dict[int, list[int]]]] = {
37
+ 7: {
38
+ 4: {
39
+ 12: [36]
40
+ }
41
+ }
42
+ }
43
+ monkeypatch.setattr("mapFolding._e.pin2上nDimensionsAnnex.dictionary2d6AtPileLeafExcludedByPile", stubLookup)
44
+
45
+ result = Z0Z_excluder(state)
46
+ assert result == expectedResult
47
+
48
+ #======== Transformation Tests =======
49
+
50
+ @pytest.mark.parametrize("index, pilesTotal, denominators, expected", [
51
+ (0, 10, (), (Fraction(0, 1), 0)),
52
+ (5, 10, (2,), (Fraction(1, 2), 0)),
53
+ (-1, 10, (), (Fraction(0, 1), -1)),
54
+ ], ids=["index=0", "index=5", "index=-1"])
55
+ def test_expressIndexAsFractionAddend(index: int, pilesTotal: int, denominators: tuple[int, ...], expected: FractionAddend) -> None:
56
+ """Verify index to fraction/addend conversion."""
57
+ assert expressIndexAsFractionAddend(index, pilesTotal, denominators) == expected
58
+
59
+ #======== Analysis Method Tests =======
60
+
61
+ @pytest.mark.parametrize("indices, expected", [
62
+ ([0, 1, 2, 5], [0, 1, 2]),
63
+ ([1, 2, 3], []),
64
+ ([0], []),
65
+ ], ids=["contiguous-run", "no-zero-start", "single-value"])
66
+ def test_getContiguousFromStart(indices: list[int], expected: list[int]) -> None:
67
+ assert _getContiguousFromStart(indices) == expected
68
+
69
+ @pytest.mark.parametrize("offsets, expected", [
70
+ ([-4, -3, -1], []),
71
+ ([-3, -2, -1], [-3, -2, -1]),
72
+ ([-1], []),
73
+ ], ids=["missing-terminal", "full-run", "single-value"])
74
+ def test_getContiguousEndingAtNegativeOne(offsets: list[int], expected: list[int]) -> None:
75
+ assert _getContiguousEndingAtNegativeOne(offsets) == expected
76
+
77
+ #======== File Generation Tests =======
78
+
79
+ def test_writeExclusionDataCollated_creates_files(path_tmpTesting: Path, monkeypatch: pytest.MonkeyPatch) -> None:
80
+ def stubLeafZero(dimensionsTotal: int) -> int:
81
+ return 0
82
+
83
+ def stubLeafOne(dimensionsTotal: int) -> int:
84
+ return 1
85
+
86
+ monkeypatch.setattr(theExcluderBeast, "functionsHeadDimensions", [stubLeafZero, stubLeafOne])
87
+ monkeypatch.setattr(theExcluderBeast, "dictionaryFunctionsByName", {stubLeafZero.__name__: stubLeafZero, stubLeafOne.__name__: stubLeafOne})
88
+ monkeypatch.setattr(theExcluderBeast, "pathExclusionData", path_tmpTesting)
89
+
90
+ def stubLeafDomains(state: EliminationState) -> dict[int, range]:
91
+ return {0: range(2), 1: range(2)}
92
+
93
+ monkeypatch.setattr(theExcluderBeast, "getDictionaryLeafDomains", stubLeafDomains)
94
+
95
+ def stubDataFrameFoldings(state: EliminationState) -> pandas.DataFrame:
96
+ return pandas.DataFrame({0: [0, 1], 1: [1, 0]})
97
+
98
+ monkeypatch.setattr(theExcluderBeast, "getDataFrameFoldings", stubDataFrameFoldings)
99
+
100
+ pathsCreated: list[PurePath] = writeExclusionDataCollated(listDimensions=[5])
101
+
102
+ assert pathsCreated
103
+ for pathCreated in pathsCreated:
104
+ assert Path(pathCreated).exists()
105
+ assert Path(pathCreated).parent == path_tmpTesting
106
+ assert "leafExcluderData" in Path(pathCreated).read_text(encoding="utf-8")
107
+
108
+ def test_writeAggregatedExclusions_creates_files(path_tmpTesting: Path, monkeypatch: pytest.MonkeyPatch) -> None:
109
+ def stubLeaf(dimensionsTotal: int) -> int:
110
+ return 0
111
+
112
+ monkeypatch.setattr(theExcluderBeast, "functionsHeadDimensions", [stubLeaf])
113
+ monkeypatch.setattr(theExcluderBeast, "pathExclusionData", path_tmpTesting)
114
+
115
+ stub_data: dict[str, dict[str, dict[str, list[tuple[Fraction, int]]]]] = {
116
+ stubLeaf.__name__: {
117
+ stubLeaf.__name__: {
118
+ stubLeaf.__name__: [(Fraction(0, 1), 0), (Fraction(0, 1), 1)]
119
+ }
120
+ }
121
+ }
122
+ def stub_analyze(*args: Any, **kwargs: Any) -> dict[str, dict[str, dict[str, list[tuple[Fraction, int]]]]]:
123
+ return stub_data
124
+
125
+ monkeypatch.setattr(theExcluderBeast, "analyzeContiguousEndAbsolute", stub_analyze)
126
+ monkeypatch.setattr(theExcluderBeast, "analyzeContiguousEndRelative", stub_analyze)
127
+ monkeypatch.setattr(theExcluderBeast, "analyzeContiguousStartAbsolute", stub_analyze)
128
+ monkeypatch.setattr(theExcluderBeast, "analyzeContiguousStartRelative", stub_analyze)
129
+ monkeypatch.setattr(theExcluderBeast, "analyzeNonContiguousIndicesRelative", stub_analyze)
130
+
131
+ listPathFilenames: list[PurePath] = writeAggregatedExclusions(path_tmpTesting)
132
+
133
+ assert listPathFilenames
134
+ for pathCreated in listPathFilenames:
135
+ assert Path(pathCreated).exists()
136
+ assert Path(pathCreated).parent == path_tmpTesting
137
+ assert "dictionaryExclusions" in Path(pathCreated).read_text(encoding="utf-8")
138
+
139
+ def test_writeExclusionDictionaries_createsFile(path_tmpTesting: Path) -> None:
140
+ """Verify writeExclusionDictionaries creates the output file."""
141
+ # This function calls loadAggregatedExclusions which looks for files in pathExclusionData.
142
+ # We need to ensure there are files there or mock loadAggregatedExclusions.
143
+
144
+ with patch("mapFolding._e.Z0Z_analysisPython.theExcluderBeast.pathExclusionData", path_tmpTesting), \
145
+ patch("mapFolding._e.Z0Z_analysisPython.theExcluderBeast.loadAggregatedExclusions", return_value={}):
146
+ # It also calls restructureAggregatedExclusionsForMapShape which needs to work with empty dict
147
+ pathExclusionsFile: Path = path_tmpTesting / "_exclusions.py"
148
+ pathCreated: PurePath = writeExclusionDictionaries(pathExclusionsFile)
149
+
150
+ assert Path(pathCreated).exists()
151
+ assert Path(pathCreated).name == "_exclusions.py"
152
+
153
+ content = Path(pathCreated).read_text(encoding="utf-8")
154
+ assert "dictionary2d5LeafExcludedAtPileByPile" in content
155
+