mapFolding 0.15.3__py3-none-any.whl → 0.16.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 (92) hide show
  1. mapFolding/__init__.py +22 -20
  2. mapFolding/_theSSOT.py +56 -62
  3. mapFolding/_theTypes.py +66 -4
  4. mapFolding/algorithms/__init__.py +1 -0
  5. mapFolding/{daoOfMapFolding.py → algorithms/daoOfMapFolding.py} +1 -2
  6. mapFolding/algorithms/getBucketsTotal.py +137 -0
  7. mapFolding/algorithms/matrixMeanders.py +519 -0
  8. mapFolding/algorithms/oeisIDbyFormula.py +347 -0
  9. mapFolding/algorithms/zCuzDocStoopidoeisIDbyFormula.py +84 -0
  10. mapFolding/basecamp.py +151 -14
  11. mapFolding/dataBaskets.py +74 -0
  12. mapFolding/oeis.py +43 -56
  13. mapFolding/reference/A000682facts.py +662 -0
  14. mapFolding/reference/A005316facts.py +62 -0
  15. mapFolding/reference/matrixMeandersAnalysis/__init__.py +1 -0
  16. mapFolding/reference/matrixMeandersAnalysis/evenEven.py +144 -0
  17. mapFolding/reference/matrixMeandersAnalysis/oddEven.py +54 -0
  18. mapFolding/{_oeisFormulas/matrixMeanders64.py → reference/meandersDumpingGround/matrixMeanders64retired.py} +37 -29
  19. mapFolding/someAssemblyRequired/A007822/A007822rawMaterials.py +55 -0
  20. mapFolding/someAssemblyRequired/A007822/__init__.py +0 -0
  21. mapFolding/someAssemblyRequired/A007822/makeA007822AsynchronousModules.py +185 -0
  22. mapFolding/someAssemblyRequired/A007822/makeA007822Modules.py +71 -0
  23. mapFolding/someAssemblyRequired/RecipeJob.py +2 -2
  24. mapFolding/someAssemblyRequired/__init__.py +9 -2
  25. mapFolding/someAssemblyRequired/_toolIfThis.py +4 -3
  26. mapFolding/someAssemblyRequired/_toolkitContainers.py +8 -8
  27. mapFolding/someAssemblyRequired/infoBooth.py +27 -30
  28. mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +1 -1
  29. mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +5 -2
  30. mapFolding/someAssemblyRequired/makingModules_count.py +301 -0
  31. mapFolding/someAssemblyRequired/makingModules_doTheNeedful.py +120 -0
  32. mapFolding/someAssemblyRequired/mapFolding/__init__.py +0 -0
  33. mapFolding/someAssemblyRequired/mapFolding/makeMapFoldingModules.py +220 -0
  34. mapFolding/someAssemblyRequired/toolkitMakeModules.py +152 -0
  35. mapFolding/someAssemblyRequired/toolkitNumba.py +1 -1
  36. mapFolding/someAssemblyRequired/transformationTools.py +1 -0
  37. mapFolding/syntheticModules/A007822/__init__.py +1 -0
  38. mapFolding/syntheticModules/A007822/asynchronous.py +148 -0
  39. mapFolding/syntheticModules/A007822/asynchronousAnnex.py +68 -0
  40. mapFolding/syntheticModules/A007822/asynchronousTheorem2.py +53 -0
  41. mapFolding/syntheticModules/A007822/asynchronousTrimmed.py +47 -0
  42. mapFolding/syntheticModules/dataPackingA007822.py +1 -1
  43. mapFolding/tests/conftest.py +28 -9
  44. mapFolding/tests/test_computations.py +32 -10
  45. mapFolding/tests/test_oeis.py +2 -20
  46. mapFolding/trim_memory.py +62 -0
  47. mapFolding/zCuzDocStoopid/__init__.py +1 -0
  48. mapFolding/zCuzDocStoopid/makeDocstrings.py +63 -0
  49. {mapfolding-0.15.3.dist-info → mapfolding-0.16.0.dist-info}/METADATA +9 -2
  50. mapfolding-0.16.0.dist-info/RECORD +100 -0
  51. {mapfolding-0.15.3.dist-info → mapfolding-0.16.0.dist-info}/entry_points.txt +0 -1
  52. mapFolding/_oeisFormulas/A000136.py +0 -4
  53. mapFolding/_oeisFormulas/A000560.py +0 -4
  54. mapFolding/_oeisFormulas/A000682.py +0 -85
  55. mapFolding/_oeisFormulas/A001010.py +0 -19
  56. mapFolding/_oeisFormulas/A001011.py +0 -5
  57. mapFolding/_oeisFormulas/A005315.py +0 -4
  58. mapFolding/_oeisFormulas/A005316.py +0 -10
  59. mapFolding/_oeisFormulas/A223094.py +0 -7
  60. mapFolding/_oeisFormulas/A259702.py +0 -4
  61. mapFolding/_oeisFormulas/A301620.py +0 -6
  62. mapFolding/_oeisFormulas/Z0Z_aOFn.py +0 -34
  63. mapFolding/_oeisFormulas/Z0Z_notes.py +0 -16
  64. mapFolding/_oeisFormulas/Z0Z_oeisMeanders.py +0 -74
  65. mapFolding/_oeisFormulas/Z0Z_symmetry.py +0 -131
  66. mapFolding/_oeisFormulas/__init__.py +0 -1
  67. mapFolding/_oeisFormulas/matrixMeanders.py +0 -134
  68. mapFolding/_oeisFormulas/matrixMeandersAnnex.py +0 -84
  69. mapFolding/someAssemblyRequired/A007822rawMaterials.py +0 -46
  70. mapFolding/someAssemblyRequired/makeAllModules.py +0 -764
  71. mapfolding-0.15.3.dist-info/RECORD +0 -92
  72. /mapFolding/reference/{A005316JavaPort.py → meandersDumpingGround/A005316JavaPort.py} +0 -0
  73. /mapFolding/reference/{A005316imperative.py → meandersDumpingGround/A005316imperative.py} +0 -0
  74. /mapFolding/reference/{A005316intOptimized.py → meandersDumpingGround/A005316intOptimized.py} +0 -0
  75. /mapFolding/reference/{A005316optimized128bit.py → meandersDumpingGround/A005316optimized128bit.py} +0 -0
  76. /mapFolding/reference/{A005316primitiveOptimized.py → meandersDumpingGround/A005316primitiveOptimized.py} +0 -0
  77. /mapFolding/reference/{A005316redis.py → meandersDumpingGround/A005316redis.py} +0 -0
  78. /mapFolding/reference/{A005316write2disk.py → meandersDumpingGround/A005316write2disk.py} +0 -0
  79. /mapFolding/reference/{matrixMeandersBaseline.py → meandersDumpingGround/matrixMeandersBaseline.py} +0 -0
  80. /mapFolding/reference/{matrixMeandersBaselineAnnex.py → meandersDumpingGround/matrixMeandersBaselineAnnex.py} +0 -0
  81. /mapFolding/reference/{matrixMeandersBaselineV2.py → meandersDumpingGround/matrixMeandersBaselineV2.py} +0 -0
  82. /mapFolding/reference/{matrixMeandersSimpleQueue.py → meandersDumpingGround/matrixMeandersSimpleQueue.py} +0 -0
  83. /mapFolding/reference/{matrixMeandersSlicePop.py → meandersDumpingGround/matrixMeandersSlicePop.py} +0 -0
  84. /mapFolding/syntheticModules/{algorithmA007822.py → A007822/algorithm.py} +0 -0
  85. /mapFolding/syntheticModules/{algorithmA007822Numba.py → A007822/algorithmNumba.py} +0 -0
  86. /mapFolding/syntheticModules/{initializeStateA007822.py → A007822/initializeState.py} +0 -0
  87. /mapFolding/syntheticModules/{theorem2A007822.py → A007822/theorem2.py} +0 -0
  88. /mapFolding/syntheticModules/{theorem2A007822Numba.py → A007822/theorem2Numba.py} +0 -0
  89. /mapFolding/syntheticModules/{theorem2A007822Trimmed.py → A007822/theorem2Trimmed.py} +0 -0
  90. {mapfolding-0.15.3.dist-info → mapfolding-0.16.0.dist-info}/WHEEL +0 -0
  91. {mapfolding-0.15.3.dist-info → mapfolding-0.16.0.dist-info}/licenses/LICENSE +0 -0
  92. {mapfolding-0.15.3.dist-info → mapfolding-0.16.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,53 @@
1
+ from mapFolding.dataBaskets import MapFoldingState
2
+ from mapFolding.syntheticModules.A007822.asynchronousAnnex import filterAsymmetricFolds, getAsymmetricFoldsTotal
3
+
4
+ def count(state: MapFoldingState) -> MapFoldingState:
5
+ while state.leaf1ndex > 4:
6
+ if state.leafBelow[0] == 1:
7
+ if state.leaf1ndex > state.leavesTotal:
8
+ filterAsymmetricFolds(state.leafBelow)
9
+ else:
10
+ state.dimensionsUnconstrained = state.dimensionsTotal
11
+ state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
12
+ state.indexDimension = 0
13
+ while state.indexDimension < state.dimensionsTotal:
14
+ state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leaf1ndex]
15
+ if state.leafConnectee == state.leaf1ndex:
16
+ state.dimensionsUnconstrained -= 1
17
+ else:
18
+ while state.leafConnectee != state.leaf1ndex:
19
+ state.gapsWhere[state.gap1ndexCeiling] = state.leafConnectee
20
+ if state.countDimensionsGapped[state.leafConnectee] == 0:
21
+ state.gap1ndexCeiling += 1
22
+ state.countDimensionsGapped[state.leafConnectee] += 1
23
+ state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leafBelow[state.leafConnectee]]
24
+ state.indexDimension += 1
25
+ if not state.dimensionsUnconstrained:
26
+ state.indexLeaf = 0
27
+ while state.indexLeaf < state.leaf1ndex:
28
+ state.gapsWhere[state.gap1ndexCeiling] = state.indexLeaf
29
+ state.gap1ndexCeiling += 1
30
+ state.indexLeaf += 1
31
+ state.indexMiniGap = state.gap1ndex
32
+ while state.indexMiniGap < state.gap1ndexCeiling:
33
+ state.gapsWhere[state.gap1ndex] = state.gapsWhere[state.indexMiniGap]
34
+ if state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] == state.dimensionsUnconstrained:
35
+ state.gap1ndex += 1
36
+ state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] = 0
37
+ state.indexMiniGap += 1
38
+ while state.gap1ndex == state.gapRangeStart[state.leaf1ndex - 1]:
39
+ state.leaf1ndex -= 1
40
+ state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leafBelow[state.leaf1ndex]
41
+ state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leafAbove[state.leaf1ndex]
42
+ state.gap1ndex -= 1
43
+ state.leafAbove[state.leaf1ndex] = state.gapsWhere[state.gap1ndex]
44
+ state.leafBelow[state.leaf1ndex] = state.leafBelow[state.leafAbove[state.leaf1ndex]]
45
+ state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leaf1ndex
46
+ state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leaf1ndex
47
+ state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
48
+ state.leaf1ndex += 1
49
+ else:
50
+ state.groupsOfFolds = getAsymmetricFoldsTotal()
51
+ state.groupsOfFolds *= 2
52
+ state.groupsOfFolds = (state.groupsOfFolds + 1) // 2
53
+ return state
@@ -0,0 +1,47 @@
1
+ from mapFolding.dataBaskets import MapFoldingState
2
+ from mapFolding.syntheticModules.A007822.asynchronousAnnex import filterAsymmetricFolds, getAsymmetricFoldsTotal
3
+
4
+ def count(state: MapFoldingState) -> MapFoldingState:
5
+ while state.leaf1ndex > 4:
6
+ if state.leafBelow[0] == 1:
7
+ if state.leaf1ndex > state.leavesTotal:
8
+ filterAsymmetricFolds(state.leafBelow)
9
+ else:
10
+ state.dimensionsUnconstrained = state.dimensionsTotal
11
+ state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
12
+ state.indexDimension = 0
13
+ while state.indexDimension < state.dimensionsTotal:
14
+ state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leaf1ndex]
15
+ if state.leafConnectee == state.leaf1ndex:
16
+ state.dimensionsUnconstrained -= 1
17
+ else:
18
+ while state.leafConnectee != state.leaf1ndex:
19
+ state.gapsWhere[state.gap1ndexCeiling] = state.leafConnectee
20
+ if state.countDimensionsGapped[state.leafConnectee] == 0:
21
+ state.gap1ndexCeiling += 1
22
+ state.countDimensionsGapped[state.leafConnectee] += 1
23
+ state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leafBelow[state.leafConnectee]]
24
+ state.indexDimension += 1
25
+ state.indexMiniGap = state.gap1ndex
26
+ while state.indexMiniGap < state.gap1ndexCeiling:
27
+ state.gapsWhere[state.gap1ndex] = state.gapsWhere[state.indexMiniGap]
28
+ if state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] == state.dimensionsUnconstrained:
29
+ state.gap1ndex += 1
30
+ state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] = 0
31
+ state.indexMiniGap += 1
32
+ while state.gap1ndex == state.gapRangeStart[state.leaf1ndex - 1]:
33
+ state.leaf1ndex -= 1
34
+ state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leafBelow[state.leaf1ndex]
35
+ state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leafAbove[state.leaf1ndex]
36
+ state.gap1ndex -= 1
37
+ state.leafAbove[state.leaf1ndex] = state.gapsWhere[state.gap1ndex]
38
+ state.leafBelow[state.leaf1ndex] = state.leafBelow[state.leafAbove[state.leaf1ndex]]
39
+ state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leaf1ndex
40
+ state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leaf1ndex
41
+ state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
42
+ state.leaf1ndex += 1
43
+ else:
44
+ state.groupsOfFolds = getAsymmetricFoldsTotal()
45
+ state.groupsOfFolds *= 2
46
+ state.groupsOfFolds = (state.groupsOfFolds + 1) // 2
47
+ return state
@@ -1,5 +1,5 @@
1
1
  from mapFolding.dataBaskets import Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal, MapFoldingState
2
- from mapFolding.syntheticModules.theorem2A007822Numba import count
2
+ from mapFolding.syntheticModules.A007822.theorem2Numba import count
3
3
 
4
4
  def sequential(state: MapFoldingState) -> MapFoldingState:
5
5
  mapShape: tuple[DatatypeLeavesTotal, ...] = state.mapShape
@@ -25,7 +25,7 @@ research domain.
25
25
 
26
26
  from collections.abc import Callable, Generator, Sequence
27
27
  from mapFolding import _theSSOT, getLeavesTotal, makeDataContainer, packageSettings, validateListDimensions
28
- from mapFolding.oeis import dictionaryOEIS, oeisIDsImplemented
28
+ from mapFolding.oeis import dictionaryOEISMapFolding, dictionaryOEISMeanders, oeisIDsImplemented
29
29
  from pathlib import Path
30
30
  from typing import Any
31
31
  import numpy
@@ -212,10 +212,10 @@ def oneTestCuzTestsOverwritingTests(oeisID_1random: str) -> tuple[int, ...]:
212
212
 
213
213
  """
214
214
  while True:
215
- n = random.choice(dictionaryOEIS[oeisID_1random]['valuesTestValidation'])
215
+ n = random.choice(dictionaryOEISMapFolding[oeisID_1random]['valuesTestValidation'])
216
216
  if n < 2:
217
217
  continue
218
- listDimensionsCandidate = list(dictionaryOEIS[oeisID_1random]['getMapShape'](n))
218
+ listDimensionsCandidate = list(dictionaryOEISMapFolding[oeisID_1random]['getMapShape'](n))
219
219
 
220
220
  try:
221
221
  return validateListDimensions(listDimensionsCandidate)
@@ -239,10 +239,10 @@ def mapShapeTestCountFolds(oeisID: str) -> tuple[int, ...]:
239
239
 
240
240
  """
241
241
  while True:
242
- n = random.choice(dictionaryOEIS[oeisID]['valuesTestValidation'])
242
+ n = random.choice(dictionaryOEISMapFolding[oeisID]['valuesTestValidation'])
243
243
  if n < 2:
244
244
  continue
245
- listDimensionsCandidate = list(dictionaryOEIS[oeisID]['getMapShape'](n))
245
+ listDimensionsCandidate = list(dictionaryOEISMapFolding[oeisID]['getMapShape'](n))
246
246
 
247
247
  try:
248
248
  return validateListDimensions(listDimensionsCandidate)
@@ -267,10 +267,10 @@ def mapShapeTestFunctionality(oeisID_1random: str) -> tuple[int, ...]:
267
267
 
268
268
  """
269
269
  while True:
270
- n = random.choice(dictionaryOEIS[oeisID_1random]['valuesTestValidation'])
270
+ n = random.choice(dictionaryOEISMapFolding[oeisID_1random]['valuesTestValidation'])
271
271
  if n < 2:
272
272
  continue
273
- listDimensionsCandidate = list(dictionaryOEIS[oeisID_1random]['getMapShape'](n))
273
+ listDimensionsCandidate = list(dictionaryOEISMapFolding[oeisID_1random]['getMapShape'](n))
274
274
 
275
275
  try:
276
276
  return validateListDimensions(listDimensionsCandidate)
@@ -292,8 +292,8 @@ def mapShapeTestParallelization(oeisID: str) -> tuple[int, ...]:
292
292
  Map dimensions suitable for testing parallelization features.
293
293
 
294
294
  """
295
- n = random.choice(dictionaryOEIS[oeisID]['valuesTestParallelization'])
296
- return dictionaryOEIS[oeisID]['getMapShape'](n)
295
+ n = random.choice(dictionaryOEISMapFolding[oeisID]['valuesTestParallelization'])
296
+ return dictionaryOEISMapFolding[oeisID]['getMapShape'](n)
297
297
 
298
298
  @pytest.fixture
299
299
  def mockBenchmarkTimer() -> Generator[unittest.mock.MagicMock | unittest.mock.AsyncMock, Any, None]:
@@ -350,6 +350,25 @@ def oeisID(request: pytest.FixtureRequest) -> Any:
350
350
  """
351
351
  return request.param
352
352
 
353
+ @pytest.fixture(params=tuple(dictionaryOEISMeanders.keys()))
354
+ def oeisIDMeanders(request: pytest.FixtureRequest) -> Any:
355
+ """Parametrized fixture providing all implemented Meanders OEIS sequence identifiers.
356
+
357
+ (AI generated docstring)
358
+
359
+ Parameters
360
+ ----------
361
+ request : pytest.FixtureRequest
362
+ The pytest request object containing the current parameter value.
363
+
364
+ Returns
365
+ -------
366
+ sequenceIdentifier : Any
367
+ OEIS sequence identifier for testing across all implemented Meanders sequences.
368
+
369
+ """
370
+ return request.param
371
+
353
372
  @pytest.fixture
354
373
  def oeisID_1random() -> str:
355
374
  """Return one random valid OEIS ID.
@@ -25,24 +25,26 @@ The `test_writeJobNumba` function shows how to test dynamically generated code,
25
25
  which is useful if you're working with the code synthesis features of the package.
26
26
  """
27
27
 
28
- from mapFolding import countFolds, getFoldsTotalKnown, oeisIDfor_n
29
- from mapFolding._oeisFormulas.Z0Z_oeisMeanders import dictionaryOEISMeanders
28
+ from mapFolding import countFolds, dictionaryOEISMapFolding, dictionaryOEISMeanders, getFoldsTotalKnown, oeisIDfor_n
29
+ from mapFolding.algorithms import oeisIDbyFormula
30
30
  from mapFolding.dataBaskets import MapFoldingState
31
- from mapFolding.oeis import dictionaryOEIS
32
- from mapFolding.someAssemblyRequired.makeAllModules import parametersNumbaLight
33
31
  from mapFolding.someAssemblyRequired.RecipeJob import RecipeJobTheorem2
32
+ from mapFolding.someAssemblyRequired.toolkitNumba import parametersNumbaLight
34
33
  from mapFolding.syntheticModules.initializeState import transitionOnGroupsOfFolds
35
34
  from mapFolding.tests.conftest import registrarRecordsTemporaryFilesystemObject, standardizedEqualToCallableReturn
36
35
  from pathlib import Path, PurePosixPath
37
- from typing import Literal
36
+ from typing import TYPE_CHECKING
38
37
  import importlib.util
39
38
  import multiprocessing
40
39
  import pytest
41
40
 
41
+ if TYPE_CHECKING:
42
+ from collections.abc import Callable
43
+
42
44
  if __name__ == '__main__':
43
45
  multiprocessing.set_start_method('spawn')
44
46
 
45
- def test_aOFn_calculate_value(oeisID: str) -> None:
47
+ def test_aOFn_calculate_value_mapFolding(oeisID: str) -> None:
46
48
  """Verify OEIS sequence value calculations against known reference values.
47
49
 
48
50
  Tests the `oeisIDfor_n` function by comparing its calculated output against
@@ -59,8 +61,28 @@ def test_aOFn_calculate_value(oeisID: str) -> None:
59
61
  The OEIS sequence identifier to test calculations for.
60
62
 
61
63
  """
62
- for n in dictionaryOEIS[oeisID]['valuesTestValidation']:
63
- standardizedEqualToCallableReturn(dictionaryOEIS[oeisID]['valuesKnown'][n], oeisIDfor_n, oeisID, n)
64
+ for n in dictionaryOEISMapFolding[oeisID]['valuesTestValidation']:
65
+ standardizedEqualToCallableReturn(dictionaryOEISMapFolding[oeisID]['valuesKnown'][n], oeisIDfor_n, oeisID, n)
66
+
67
+ def test_aOFn_calculate_value_meanders(oeisIDMeanders: str) -> None:
68
+ """Verify Meanders OEIS sequence value calculations against known reference values.
69
+
70
+ Tests the functions in `mapFolding.algorithms.oeisIDbyFormula` by comparing their
71
+ calculated output against known correct values from the OEIS database for Meanders IDs.
72
+
73
+ Parameters
74
+ ----------
75
+ oeisIDMeanders : str
76
+ The Meanders OEIS sequence identifier to test calculations for.
77
+
78
+ """
79
+ oeisIDcallable: Callable[[int], int] = getattr(oeisIDbyFormula, oeisIDMeanders)
80
+ for n in dictionaryOEISMeanders[oeisIDMeanders]['valuesTestValidation']:
81
+ standardizedEqualToCallableReturn(
82
+ dictionaryOEISMeanders[oeisIDMeanders]['valuesKnown'][n],
83
+ oeisIDcallable,
84
+ n,
85
+ )
64
86
 
65
87
  @pytest.mark.parametrize('flow', ['daoOfMapFolding', 'numba', 'theorem2', 'theorem2Numba', 'theorem2Trimmed'])
66
88
  def test_flowControl(mapShapeTestCountFolds: tuple[int, ...], flow: str) -> None:
@@ -104,14 +126,14 @@ def test_flowControlByOEISid(oeisID: str, flow: str) -> None:
104
126
  mapShape = None
105
127
 
106
128
  oeis_n = 2
107
- for oeis_n in dictionaryOEIS[oeisID]['valuesTestValidation']:
129
+ for oeis_n in dictionaryOEISMapFolding[oeisID]['valuesTestValidation']:
108
130
  if oeis_n < 2:
109
131
  continue
110
132
 
111
133
  if oeisID in dictionaryOEISMeanders:
112
134
  expected = dictionaryOEISMeanders[oeisID]['valuesKnown'][oeis_n]
113
135
  else:
114
- expected = dictionaryOEIS[oeisID]['valuesKnown'][oeis_n]
136
+ expected = dictionaryOEISMapFolding[oeisID]['valuesKnown'][oeis_n]
115
137
 
116
138
  standardizedEqualToCallableReturn(
117
139
  expected
@@ -26,7 +26,7 @@ which is crucial for maintaining package reliability in production environments.
26
26
 
27
27
  from contextlib import redirect_stdout
28
28
  from mapFolding.oeis import (
29
- _standardizeOEISid, clearOEIScache, dictionaryOEIS, getOEISids, OEIS_for_n, oeisIDfor_n, oeisIDsImplemented)
29
+ _standardizeOEISid, dictionaryOEISMapFolding, getOEISids, OEIS_for_n, oeisIDfor_n, oeisIDsImplemented)
30
30
  from mapFolding.tests.conftest import standardizedEqualToCallableReturn, standardizedSystemExit
31
31
  from typing import Any
32
32
  import io
@@ -57,24 +57,6 @@ def test_aOFn_invalid_n(oeisID_1random: str, badN: Any) -> None:
57
57
  def test_aOFn_zeroDim_A001418() -> None:
58
58
  standardizedEqualToCallableReturn(ArithmeticError, oeisIDfor_n, 'A001418', 0)
59
59
 
60
- # ===== OEIS Cache Tests =====
61
- @pytest.mark.parametrize("cacheExists", [True, False])
62
- @unittest.mock.patch('pathlib.Path.exists')
63
- @unittest.mock.patch('pathlib.Path.unlink')
64
- def test_clearOEIScache(mock_unlink: unittest.mock.MagicMock, mock_exists: unittest.mock.MagicMock, cacheExists: bool) -> None:
65
- """Test OEIS cache clearing with both existing and non-existing cache."""
66
- mock_exists.return_value = cacheExists
67
- clearOEIScache()
68
-
69
- if cacheExists:
70
- # Each OEIS ID has two cache files
71
- expected_calls = len(dictionaryOEIS) * 2
72
- assert mock_unlink.call_count == expected_calls
73
- mock_unlink.assert_has_calls([unittest.mock.call(missing_ok=True)] * expected_calls)
74
- else:
75
- mock_exists.assert_called_once()
76
- mock_unlink.assert_not_called()
77
-
78
60
  # ===== Command Line Interface Tests =====
79
61
  def testHelpText() -> None:
80
62
  """Test that help text is complete and examples are valid."""
@@ -87,7 +69,7 @@ def testHelpText() -> None:
87
69
  # Verify content
88
70
  for oeisID in oeisIDsImplemented:
89
71
  assert oeisID in helpText
90
- assert dictionaryOEIS[oeisID]['description'] in helpText
72
+ assert dictionaryOEISMapFolding[oeisID]['description'] in helpText
91
73
 
92
74
  # Extract and verify examples
93
75
 
@@ -0,0 +1,62 @@
1
+ """Memory management utilities.
2
+
3
+ https://github.com/pandas-dev/pandas/issues/2659#issuecomment-2452943964
4
+ """
5
+ import ctypes
6
+ import ctypes.wintypes
7
+ import gc
8
+ import logging
9
+ import platform
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ def trim_windows_process_memory(pid: int | None = None) -> bool:
14
+ """Cause effects similar to malloc_trim on -nix."""
15
+ # Define SIZE_T based on the platform (32-bit or 64-bit)
16
+ if ctypes.sizeof(ctypes.c_void_p) == 4:
17
+ SIZE_T = ctypes.c_uint32
18
+ else:
19
+ SIZE_T = ctypes.c_uint64
20
+
21
+ # Get a handle to the current process
22
+ if not pid:
23
+ pid = ctypes.windll.kernel32.GetCurrentProcess()
24
+
25
+ # Define argument and return types for SetProcessWorkingSetSizeEx
26
+ ctypes.windll.kernel32.SetProcessWorkingSetSizeEx.argtypes = [
27
+ ctypes.wintypes.HANDLE, # Process handle
28
+ SIZE_T, # Minimum working set size
29
+ SIZE_T, # Maximum working set size
30
+ ctypes.wintypes.DWORD, # Flags
31
+ ]
32
+ ctypes.windll.kernel32.SetProcessWorkingSetSizeEx.restype = ctypes.wintypes.BOOL
33
+
34
+ # Define constants for SetProcessWorkingSetSizeEx
35
+ QUOTA_LIMITS_HARDWS_MIN_DISABLE = 0x00000002
36
+
37
+ # Attempt to set the working set size
38
+ result = ctypes.windll.kernel32.SetProcessWorkingSetSizeEx(pid, SIZE_T(-1), SIZE_T(-1), QUOTA_LIMITS_HARDWS_MIN_DISABLE)
39
+
40
+ if result == 0:
41
+ # Retrieve the error code
42
+ error_code = ctypes.windll.kernel32.GetLastError()
43
+ message = f"SetProcessWorkingSetSizeEx failed with error code: {error_code}"
44
+ logger.error(message)
45
+ return False
46
+ else:
47
+ return True
48
+
49
+
50
+ def trim_ram() -> None:
51
+ """Force python garbage collection.
52
+
53
+ Most importantly, calls malloc_trim/SetProcessWorkingSetSizeEx, which fixes pandas/libc (?) memory leak.
54
+ """
55
+ gc.collect()
56
+ if platform.system() == "Windows":
57
+ trim_windows_process_memory()
58
+ else:
59
+ try:
60
+ ctypes.CDLL("libc.so.6").malloc_trim(0)
61
+ except Exception:
62
+ logger.exception("malloc_trim attempt failed")
@@ -0,0 +1 @@
1
+ """I mean, you must write docstrings after you write the code because you don't know what the code will do until after you write it."""
@@ -0,0 +1,63 @@
1
+ """Make docstrings."""
2
+ from astToolkit import Grab, IfThis, Make, NodeChanger, parsePathFilename2astModule, Then
3
+ from astToolkit.transformationTools import makeDictionaryFunctionDef
4
+ from hunterMakesPy import raiseIfNone, writeStringToHere
5
+ from mapFolding import dictionaryOEISMapFolding, dictionaryOEISMeanders, packageSettings
6
+ from pathlib import Path
7
+ import ast
8
+
9
+ sourcePrefix: str = 'zCuzDocStoopid'
10
+
11
+ pathRoot: Path = packageSettings.pathPackage / "algorithms"
12
+
13
+ pathFilenameSource: Path = next(iter(pathRoot.glob(f"{sourcePrefix}*.py"))).absolute()
14
+ pathFilenameWrite: Path = pathFilenameSource.with_stem(pathFilenameSource.stem.removeprefix(sourcePrefix))
15
+
16
+ astModule: ast.Module = parsePathFilename2astModule(pathFilenameSource)
17
+ dictionaryFunctionDef: dict[str, ast.FunctionDef] = makeDictionaryFunctionDef(astModule)
18
+
19
+ moduleWarning = """
20
+ NOTE: This is a generated file; edit the source file.
21
+ """
22
+
23
+ oeisID = 'Error during transformation' # `ast.FunctionDef.name` of function in `pathFilenameSource`.
24
+ functionOf: str = 'Error during transformation' # The value of `functionOf` is in the docstring of function `oeisID` in `pathFilenameSource`.
25
+
26
+ for oeisID, FunctionDef in dictionaryFunctionDef.items():
27
+ dictionaryOEIS = dictionaryOEISMapFolding if oeisID in dictionaryOEISMapFolding else dictionaryOEISMeanders
28
+ functionOf = raiseIfNone(ast.get_docstring(FunctionDef))
29
+
30
+ ImaDocstring= f"""
31
+ Compute {oeisID}(n) as a function of {functionOf}.
32
+
33
+ *The On-Line Encyclopedia of Integer Sequences* (OEIS) description of {oeisID} is: "{dictionaryOEIS[oeisID]['description']}"
34
+
35
+ The domain of {oeisID} starts at {dictionaryOEIS[oeisID]['offset']}, therefore for values of `n` < {dictionaryOEIS[oeisID]['offset']}, a(n) is undefined. The smallest value of n for which a(n)
36
+ has not yet been computed is {dictionaryOEIS[oeisID]['valueUnknown']}.
37
+
38
+ Parameters
39
+ ----------
40
+ n : int
41
+ Index (n-dex) for a(n) in the sequence of values. "n" (lower case) and "a(n)" are conventions in mathematics.
42
+
43
+ Returns
44
+ -------
45
+ a(n) : int
46
+ {dictionaryOEIS[oeisID]['description']}
47
+
48
+ Would You Like to Know More?
49
+ ----------------------------
50
+ OEIS : webpage
51
+ https://oeis.org/{oeisID}
52
+ """
53
+
54
+ astExprDocstring = Make.Expr(Make.Constant(ImaDocstring))
55
+
56
+ NodeChanger(
57
+ findThis = IfThis.isFunctionDefIdentifier(oeisID)
58
+ , doThat = Grab.bodyAttribute(Grab.index(0, Then.replaceWith(astExprDocstring)))
59
+ ).visit(astModule)
60
+
61
+ ast.fix_missing_locations(astModule)
62
+
63
+ writeStringToHere((ast.unparse(astModule)+"\n"), pathFilenameWrite)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapFolding
3
- Version: 0.15.3
3
+ Version: 0.16.0
4
4
  Summary: Map folding, meanders, stamp folding, semi-meanders. Experiment with algorithm transformations and code optimization.
5
5
  Author-email: Hunter Hogan <HunterHogan@pm.me>
6
6
  License: CC-BY-NC-4.0
@@ -8,7 +8,7 @@ Project-URL: Donate, https://www.patreon.com/integrated
8
8
  Project-URL: Homepage, https://github.com/hunterhogan/mapFolding
9
9
  Project-URL: Issues, https://github.com/hunterhogan/mapFolding/issues
10
10
  Project-URL: Repository, https://github.com/hunterhogan/mapFolding.git
11
- Keywords: A000136,A000560,A000682,A001010,A001011,A001415,A001416,A001417,A001418,A005315,A005316,A007822,A195646,A223094,A259702,A301620,AST manipulation,GPU acceleration,JIT compilation,Numba optimization,OEIS,Python optimization,abstract syntax tree,algorithmic combinatorics,algorithmic optimization,arch configurations,automated code generation,bit-packed arrays,bitwise state machines,cache-efficient algorithms,closed meandric numbers,code generation,code optimization,code synthesis,code transformation,codon optimization,combinatorial computing,combinatorial enumeration,combinatorial geometry,combinatorial mathematics,combinatorial problem solver,combinatorics,computational combinatorics,computational geometry,crossing patterns,curve crossings,dataclass transformation,discrete mathematics,dynamic compilation,enumerative combinatorics,folding pattern enumeration,folding problems,high-performance computing,integer sequences,just-in-time compilation,kernel optimization,labeled stamp folding,low-level computation,map folding,mapFolding,mathematical algorithms,mathematical modeling,mathematical optimization,mathematical patterns,mathematical software,mathematical tool,mathematical visualization,meander enumeration,meanders,meandric systems,memory-efficient enumeration,metaprogramming,numerical algorithms,numerical computation,open meandric systems,paper folding mathematics,parallel computing,pattern recognition,performance optimization,permutation patterns,permutations,post-setup optimization,pyproject,scientific computing,semi-meanders,sequence analysis,sequence calculator,sequence enumeration,sequence explorer,sequence generation,source code analysis,stamp folding,symbolic computation,symmetric foldings,topological combinatorics,topological patterns,typed Python
11
+ Keywords: A000136,A000560,A000682,A001010,A001011,A001415,A001416,A001417,A001418,A005315,A005316,A007822,A178961,A195646,A223094,A259702,A301620,AST manipulation,GPU acceleration,JIT compilation,Numba optimization,OEIS,Python optimization,abstract syntax tree,algorithmic combinatorics,algorithmic optimization,arch configurations,automated code generation,bit-packed arrays,bitwise state machines,cache-efficient algorithms,closed meandric numbers,code generation,code optimization,code synthesis,code transformation,codon optimization,combinatorial computing,combinatorial enumeration,combinatorial geometry,combinatorial mathematics,combinatorial problem solver,combinatorics,computational combinatorics,computational geometry,crossing patterns,curve crossings,dataclass transformation,discrete mathematics,dynamic compilation,enumerative combinatorics,folding pattern enumeration,folding problems,high-performance computing,integer sequences,just-in-time compilation,kernel optimization,labeled stamp folding,low-level computation,map folding,mapFolding,mathematical algorithms,mathematical modeling,mathematical optimization,mathematical patterns,mathematical software,mathematical tool,mathematical visualization,meander enumeration,meanders,meandric systems,memory-efficient enumeration,metaprogramming,numerical algorithms,numerical computation,open meandric systems,paper folding mathematics,parallel computing,pattern recognition,performance optimization,permutation patterns,permutations,post-setup optimization,pyproject,scientific computing,semi-meanders,sequence analysis,sequence calculator,sequence enumeration,sequence explorer,sequence generation,source code analysis,stamp folding,symbolic computation,symmetric foldings,topological combinatorics,topological patterns,typed Python
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
@@ -35,6 +35,7 @@ Requires-Python: >=3.12
35
35
  Description-Content-Type: text/markdown
36
36
  License-File: LICENSE
37
37
  Requires-Dist: astToolkit
38
+ Requires-Dist: autoflake
38
39
  Requires-Dist: hunterMakesPy
39
40
  Requires-Dist: numpy
40
41
  Requires-Dist: platformdirs
@@ -47,8 +48,14 @@ Requires-Dist: setuptools-scm; extra == "development"
47
48
  Provides-Extra: numba
48
49
  Requires-Dist: numba; extra == "numba"
49
50
  Requires-Dist: numba_progress; extra == "numba"
51
+ Provides-Extra: pandas
52
+ Requires-Dist: pandas; extra == "pandas"
53
+ Requires-Dist: pyarrow; extra == "pandas"
54
+ Requires-Dist: pyarrow-stubs; extra == "pandas"
50
55
  Provides-Extra: testing
51
56
  Requires-Dist: numba; extra == "testing"
57
+ Requires-Dist: pandas; extra == "testing"
58
+ Requires-Dist: pyarrow; extra == "testing"
52
59
  Requires-Dist: pytest-cov; extra == "testing"
53
60
  Requires-Dist: pytest-env; extra == "testing"
54
61
  Requires-Dist: pytest-xdist; extra == "testing"
@@ -0,0 +1,100 @@
1
+ mapFolding/__init__.py,sha256=TDo9hax941LW-ea0hyAZsq0NEdhizAXXlNrWj8qX6dE,4012
2
+ mapFolding/_theSSOT.py,sha256=aZsdI_PPWB8S0wrLDs7HqVvL88OIPOti0STrYG776gg,5279
3
+ mapFolding/_theTypes.py,sha256=F2pCHexrlbHTgMpQn58jDhkwAMFUSBp28gQp21n86o0,6559
4
+ mapFolding/basecamp.py,sha256=x13ZipCO0G-6rZSWEqgInWlMDKC5TtH-n_V-wB7lfac,18795
5
+ mapFolding/beDRY.py,sha256=iYATcrYrAWkKaAecjA_awELBtZP5Q3snU4053dIsEwU,13941
6
+ mapFolding/dataBaskets.py,sha256=myijFYlgJuRXYPGpMSQN7Kg7mzLp7LuRgZZqDfQJku8,18088
7
+ mapFolding/filesystemToolkit.py,sha256=Ex5tyugRQurXIgUNVtkQYfWMq8fM4e-izX01MBXU5_8,11006
8
+ mapFolding/oeis.py,sha256=wtvCGXNkSduvf9RGUCJv8qOQoyNH1P8EYHxD_tf6ANU,18652
9
+ mapFolding/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ mapFolding/trim_memory.py,sha256=Do5oPwkMvqbrJ6oS7-7aegB9hVD03S1uLPlWXFrCF2c,2042
11
+ mapFolding/algorithms/__init__.py,sha256=gARPqfySaeSWMfApQ5wSxzy7ZdgLdKYsLqsRSEYWwWI,28
12
+ mapFolding/algorithms/daoOfMapFolding.py,sha256=ncTIiBfTsM8SNVx9qefZ0bBcBtviWLSk4iPv3Z9nGiE,5442
13
+ mapFolding/algorithms/getBucketsTotal.py,sha256=5JCgOb_bC4E5ol45TSs1dQtBWWX04aN3DIkonNU9Nh4,5966
14
+ mapFolding/algorithms/matrixMeanders.py,sha256=DLrzdJzkUiylaIX5yG-xZ7Jq75-St6aFIj_3acs8kQc,21750
15
+ mapFolding/algorithms/oeisIDbyFormula.py,sha256=ia79A1GlNS_7cUFs50B_zBB-F35Kf1Ljviy31XWpqnM,11372
16
+ mapFolding/algorithms/zCuzDocStoopidoeisIDbyFormula.py,sha256=zShTDbRgqBXpMrrdNdQ9ZO9rTV4Fq6X8zSO3YPPiIA4,2068
17
+ mapFolding/reference/A000682facts.py,sha256=AAIdA-YttdbOw6msEH3bgFxPcvKZn075ONOtPIQGjxU,14873
18
+ mapFolding/reference/A005316facts.py,sha256=Bavx1EIZ-uKc5xcp0XNC6lzMheXkapIGE5y-gugwryw,1281
19
+ mapFolding/reference/__init__.py,sha256=GKcSgYE49NcTISx-JZbELXyq-eRkMeTL5g4DXInWFw0,2206
20
+ mapFolding/reference/flattened.py,sha256=0eHgLFIeIeVUsI5zF5oSy5iWYrjOMzxr7KjDxiTe01k,16078
21
+ mapFolding/reference/hunterNumba.py,sha256=iLfyqwGdAh6c5GbapnKsWhAsNsR3O-fyGGHAdohluLw,7258
22
+ mapFolding/reference/irvineJavaPort.py,sha256=XnsL4g33LRrYwAhcrAVt-ujsP6QD6fbyCsGYzcm9g_k,3724
23
+ mapFolding/reference/jaxCount.py,sha256=t8ons45zyWNJQ-nmn1qbhNsTkTnRzf7ATauaYvIlkRI,14853
24
+ mapFolding/reference/lunnonNumpy.py,sha256=mMgrgbrBpe4nmo72ThEI-MGH0OwEHmfMPczSXHp2qKo,4357
25
+ mapFolding/reference/lunnonWhile.py,sha256=ZL8GAQtPs5nJZSgoDl5USrLSS_zs03y98y1Z9E4jOmQ,3799
26
+ mapFolding/reference/rotatedEntryPoint.py,sha256=3IJU7Hc2PDSE71wmSkDs4Z3t0Px9NBSzmCsVrgQuQyU,10274
27
+ mapFolding/reference/total_countPlus1vsPlusN.py,sha256=yJZAVLVdoXqHag2_N6_6CT-Q6HXBgRro-eny93-Rlpw,9307
28
+ mapFolding/reference/jobsCompleted/__init__.py,sha256=TU93ZGUW1xEkT6d9mQFn_rp5DvRy0ZslEB2Q6MF5ZDc,2596
29
+ mapFolding/reference/jobsCompleted/[2x19]/p2x19.py,sha256=_tvYtfzMWVo2VtUbIAieoscb4N8FFflgTdW4-ljBUuA,19626
30
+ mapFolding/reference/jobsCompleted/p2x19/p2x19.py,sha256=eZEw4Me4ocTt6VXoK2-Sbd5SowZtxRIbN9dZmc7OCVg,6395
31
+ mapFolding/reference/matrixMeandersAnalysis/__init__.py,sha256=FQbR63_z3_zd3HMrpUxx3_YIcn9znzA0RIggcMntSC8,35
32
+ mapFolding/reference/matrixMeandersAnalysis/evenEven.py,sha256=KfP9G9AG9Qd0kOG67JyLnauHxGmBqMvGVADxqSAHwTk,5009
33
+ mapFolding/reference/matrixMeandersAnalysis/oddEven.py,sha256=igZLaavoFtQCWAtIepPHohD1dVrLyfg-3rY0m4NFpGc,1759
34
+ mapFolding/reference/meandersDumpingGround/A005316JavaPort.py,sha256=6qqTzbD3PTwYGtqaywEURGXtNFx1lp8ofEwpQeEvAHc,4899
35
+ mapFolding/reference/meandersDumpingGround/A005316imperative.py,sha256=hhjUxELOktNBmHrwIoxVA-mcFsOWgg01p780OBeqL04,3816
36
+ mapFolding/reference/meandersDumpingGround/A005316intOptimized.py,sha256=oO9ktdYeFwtosVp5KliwH8JmCSxfjapjBM1iMECuDAc,4121
37
+ mapFolding/reference/meandersDumpingGround/A005316optimized128bit.py,sha256=6JxmVBIQnN0rH0MQIZtu_wgY1Wbms8hZCWarMe5NLLU,3416
38
+ mapFolding/reference/meandersDumpingGround/A005316primitiveOptimized.py,sha256=iFig6Edv1E774xrlVUFLyscC40DqDhV-oh4hOnG2DLI,4116
39
+ mapFolding/reference/meandersDumpingGround/A005316redis.py,sha256=MPeiobrs3VsNZOOKYBg52oVp0OjVDzLEdsRKfrZ9LrU,4328
40
+ mapFolding/reference/meandersDumpingGround/A005316write2disk.py,sha256=NMVrdhe5KhnXQfaQ5Xr7Pwl5oXYEOM1DrMISDDOCVVw,5633
41
+ mapFolding/reference/meandersDumpingGround/matrixMeanders64retired.py,sha256=oRVgf6zkWRjk7dWR-Px41M_5spdvKy_Pich0qd7oxVA,9270
42
+ mapFolding/reference/meandersDumpingGround/matrixMeandersBaseline.py,sha256=8Z98MMfhTCdoa75HWZz4DO166EiHZCu5eHeFzhgK42s,3003
43
+ mapFolding/reference/meandersDumpingGround/matrixMeandersBaselineAnnex.py,sha256=d2Oh4JZxz53ox_ArhIxpMTOuA7rtE9wnEPojpFcnlfc,5817
44
+ mapFolding/reference/meandersDumpingGround/matrixMeandersBaselineV2.py,sha256=VpRiIGhnk-DbxwsHwCeCwXqcKLSNyHl-iRGLDH9ZGMY,7674
45
+ mapFolding/reference/meandersDumpingGround/matrixMeandersSimpleQueue.py,sha256=pOfaS315OKIBG9GSqSJwUDcEhfnV2XduM9IPqHrBvJg,4083
46
+ mapFolding/reference/meandersDumpingGround/matrixMeandersSlicePop.py,sha256=XyiesSQAH1dRplYx_CdR1FzcXvgmmxzj27V4aIqPp7o,5353
47
+ mapFolding/someAssemblyRequired/RecipeJob.py,sha256=3lMDeb5sU1hkJYwaEMBFtl79xu8WCXca4sjndcQD9Ho,9866
48
+ mapFolding/someAssemblyRequired/__init__.py,sha256=3IF8HFIgFisJBQ1i4sx7Nz2iOqVoAG78jwjNJ9q531U,6272
49
+ mapFolding/someAssemblyRequired/_toolIfThis.py,sha256=QC2cmCea18BZ_WpoWoErYCWhROvmd40_i_nBO7YFRaE,6378
50
+ mapFolding/someAssemblyRequired/_toolkitContainers.py,sha256=RJThCzIBWSk-dUO75QhRJgaJk6xz5Pf4-LBN1wv7hxo,13545
51
+ mapFolding/someAssemblyRequired/getLLVMforNoReason.py,sha256=tY0-2K0BFkwLAAjSrFJLPoG8CevDHOFc3OH3TxXANzg,2806
52
+ mapFolding/someAssemblyRequired/infoBooth.py,sha256=ZWFH37S2jMGRbNlmjhNvoaezIk8abS3DvHhy7qVOaQM,2139
53
+ mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py,sha256=MMB3is5IrKwZbx83OSndvCqtxJgTV1YGLjYpv25K_0g,17197
54
+ mapFolding/someAssemblyRequired/makeJobTheorem2codon.py,sha256=_V5Y5X_Wpwx0XEKdr4FWDsOu8SosH2uMCdaqL9OX4u0,11747
55
+ mapFolding/someAssemblyRequired/makingModules_count.py,sha256=ykTyroYhk2_M20FgDskuX4xEos-ecbZtQ7EytxGA0B0,14489
56
+ mapFolding/someAssemblyRequired/makingModules_doTheNeedful.py,sha256=T5i75G2ZnybITeKLLnyEOJVekNlcM_zFHFdhdjAOO-s,6356
57
+ mapFolding/someAssemblyRequired/toolkitMakeModules.py,sha256=ZzoDENTHbOoSSMq7fbF7jYPlbsgtPcNekSHoTIAB6os,7638
58
+ mapFolding/someAssemblyRequired/toolkitNumba.py,sha256=3ujtBaA27CX8yVApnfNRzFpZd3GvsHv1H1vyTiiJIZk,14905
59
+ mapFolding/someAssemblyRequired/transformationTools.py,sha256=LmyUPy-xADrQVjvWx_ufX_nclVOyJdhpF-htR9-nk7M,11513
60
+ mapFolding/someAssemblyRequired/A007822/A007822rawMaterials.py,sha256=FtDnxoMwbNP9C-fnKYHH6q_2qwhjdPHaVlja3d3pk6c,2955
61
+ mapFolding/someAssemblyRequired/A007822/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
+ mapFolding/someAssemblyRequired/A007822/makeA007822AsynchronousModules.py,sha256=MZD_SgFdIrnG_-mHYYsgsQuhqbbiPkam7iT5XmTcbM0,8389
63
+ mapFolding/someAssemblyRequired/A007822/makeA007822Modules.py,sha256=wIy2qSTp4HDBOLuEQ-81aAuo5LsiWriYNg96BWybqEA,4032
64
+ mapFolding/someAssemblyRequired/mapFolding/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
+ mapFolding/someAssemblyRequired/mapFolding/makeMapFoldingModules.py,sha256=SNU7Dpqu1agOmSX9DG3Kv8357mirzZiSvvKxn8XjtnM,16716
66
+ mapFolding/syntheticModules/__init__.py,sha256=evVFqhCGa-WZKDiLcnQWjs-Bj34eRnfSLqz_d7dFYZY,83
67
+ mapFolding/syntheticModules/countParallelNumba.py,sha256=6sHWzGc6ch3HjKVB8krvaBec_KoHv3gpfN_F5Vl1SP8,7870
68
+ mapFolding/syntheticModules/daoOfMapFoldingNumba.py,sha256=5oMb8pttNKslN6wss9JIQXSnmjgE2q_2-3fIrh1pEW0,6033
69
+ mapFolding/syntheticModules/dataPacking.py,sha256=SzRmDNr2OZP6Xk4krLqxTuWAUtUJxBDXmHEqlBHzNPI,2407
70
+ mapFolding/syntheticModules/dataPackingA007822.py,sha256=VA9rDEQfaSVNpgbMAXUvckSmU-5PBY6jPmEETnqH-vc,2469
71
+ mapFolding/syntheticModules/initializeState.py,sha256=OTiVi1Ywnlwk8tbwSIFjPJa_yBCINoapaCzGXDAJq_k,3121
72
+ mapFolding/syntheticModules/theorem2.py,sha256=QeXkBScihDatBk4iEMOMSntvhyJISb0G8zwZMQe7JFc,3031
73
+ mapFolding/syntheticModules/theorem2Numba.py,sha256=AFe-KI97ilPgPFA22ASAhfUetaTA249K7By_vqu1Crs,3416
74
+ mapFolding/syntheticModules/theorem2Trimmed.py,sha256=geKX3So1SqhENlKeEO2dV6S3rGsxBp-AItB4hRbwbBI,2699
75
+ mapFolding/syntheticModules/A007822/__init__.py,sha256=evVFqhCGa-WZKDiLcnQWjs-Bj34eRnfSLqz_d7dFYZY,83
76
+ mapFolding/syntheticModules/A007822/algorithm.py,sha256=rJHwImwcFGAysYoNME79qmNhoa3ebRgXb7ktKZLtSZ8,7074
77
+ mapFolding/syntheticModules/A007822/algorithmNumba.py,sha256=k7w-TicOkjV05bYPNK5s0kzWrBzS3EfVfQafZxBBa1Q,7222
78
+ mapFolding/syntheticModules/A007822/asynchronous.py,sha256=1L-5aa7Ivs-QM8DDI3I9Ulfi8AkJ3fd2KdNS6g7YBLE,6270
79
+ mapFolding/syntheticModules/A007822/asynchronousAnnex.py,sha256=m4k0Z_tlmWWgdalaW2SldLprqioVJtKf4oXAGSZf_6M,2644
80
+ mapFolding/syntheticModules/A007822/asynchronousTheorem2.py,sha256=wp6igfkIs54zqPudRMjYiue0UZE4QAu4QlHGbTLnj5U,3271
81
+ mapFolding/syntheticModules/A007822/asynchronousTrimmed.py,sha256=2m86hM0qlbyAjEks20e_KzxfVyjjQIB0iQkLPaFqo8M,2939
82
+ mapFolding/syntheticModules/A007822/initializeState.py,sha256=qizwxyNqKSgnF4MyBWU8Nca9IRbTnp-rrUAirF-ZL-E,4344
83
+ mapFolding/syntheticModules/A007822/theorem2.py,sha256=HflJuuOj6b_cF6zEKmLy74Nzv_7jFrqLmjsN05XM4KQ,4254
84
+ mapFolding/syntheticModules/A007822/theorem2Numba.py,sha256=GppP_WntOrcFSIpIk6jP7PlAb4PlskzEBqfKOJaisSA,4637
85
+ mapFolding/syntheticModules/A007822/theorem2Trimmed.py,sha256=ekbKQ_FIZgaQ9m7NrxDimx5dM2PBDIReGBtpv23jpNc,3922
86
+ mapFolding/tests/__init__.py,sha256=QVCHSMFVvTxV3mAyYOLkMFAFyBJ514zdoVnDmpBJnTo,1336
87
+ mapFolding/tests/conftest.py,sha256=fLBZFStVJEIfbt6PQNVyAEdMVyck_lwhEB0eZYgQSwU,15255
88
+ mapFolding/tests/test_computations.py,sha256=m0JJq71oSQ0ol-rE99SDLwN9LWXp7yamfkFA3-fY0x0,8286
89
+ mapFolding/tests/test_filesystem.py,sha256=0rYQ62f4e3HOoymXrxDWbqNEBJQ7DGN8RUOMI84tE2Q,3892
90
+ mapFolding/tests/test_oeis.py,sha256=qwi9z_BnpeGO4QwTHj_WOiP21gf2rUgDdxhc90zWsl8,4754
91
+ mapFolding/tests/test_other.py,sha256=ScBiJ78LnyAaW-RhxcouX6Xw10wgpSdqfvT4LO3WjnQ,4766
92
+ mapFolding/tests/test_tasks.py,sha256=_pr9JRWjjNKA7sww70XvkJJdGPruBVzubM63RmD_Du0,4013
93
+ mapFolding/zCuzDocStoopid/__init__.py,sha256=kgbAVyTTSsRBvIOOpO6TMSnrJ06JP4-aLA5AlhUwxEI,136
94
+ mapFolding/zCuzDocStoopid/makeDocstrings.py,sha256=Bq9QLptQ8vxdivTemKNU90ZINTKixFL5EBHijqaVhxA,2593
95
+ mapfolding-0.16.0.dist-info/licenses/LICENSE,sha256=NxH5Y8BdC-gNU-WSMwim3uMbID2iNDXJz7fHtuTdXhk,19346
96
+ mapfolding-0.16.0.dist-info/METADATA,sha256=pxPw3oi1Fn2htgavXy2whDt43OX8f0S3D0eY6GxEUGg,5506
97
+ mapfolding-0.16.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
98
+ mapfolding-0.16.0.dist-info/entry_points.txt,sha256=-mH9DjW9tDRMPaeoSWKKywG35cR28m12H_jtmrB4eY8,98
99
+ mapfolding-0.16.0.dist-info/top_level.txt,sha256=aG3bjFBoxxuaV3Iu1wZAd241Ubs3cdaJtKYBQBDIjsg,11
100
+ mapfolding-0.16.0.dist-info/RECORD,,
@@ -1,4 +1,3 @@
1
1
  [console_scripts]
2
2
  OEIS_for_n = mapFolding.oeis:OEIS_for_n
3
- clearOEIScache = mapFolding.oeis:clearOEIScache
4
3
  getOEISids = mapFolding.oeis:getOEISids
@@ -1,4 +0,0 @@
1
- from mapFolding._oeisFormulas.A000682 import A000682
2
-
3
- def A000136(n: int) -> int:
4
- return n * A000682(n)
@@ -1,4 +0,0 @@
1
- from mapFolding._oeisFormulas.A000682 import A000682
2
-
3
- def A000560(n: int) -> int:
4
- return A000682(n + 1) // 2