mapFolding 0.9.2__py3-none-any.whl → 0.9.4__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 (36) hide show
  1. mapFolding/Z0Z_flowControl.py +117 -0
  2. mapFolding/__init__.py +28 -26
  3. mapFolding/basecamp.py +1 -1
  4. mapFolding/beDRY.py +1 -2
  5. mapFolding/daoOfMapFolding.py +142 -0
  6. mapFolding/dataBaskets.py +49 -0
  7. mapFolding/datatypes.py +21 -0
  8. mapFolding/oeis.py +1 -2
  9. mapFolding/someAssemblyRequired/Z0Z_makeSomeModules.py +226 -0
  10. mapFolding/someAssemblyRequired/__init__.py +12 -2
  11. mapFolding/someAssemblyRequired/_theTypes.py +11 -5
  12. mapFolding/someAssemblyRequired/_tool_Make.py +8 -0
  13. mapFolding/someAssemblyRequired/_tool_Then.py +44 -1
  14. mapFolding/someAssemblyRequired/_toolboxAST.py +57 -0
  15. mapFolding/someAssemblyRequired/_toolboxAntecedents.py +95 -29
  16. mapFolding/someAssemblyRequired/_toolboxContainers.py +59 -53
  17. mapFolding/someAssemblyRequired/_toolboxPython.py +52 -50
  18. mapFolding/someAssemblyRequired/synthesizeNumbaJob.py +10 -9
  19. mapFolding/someAssemblyRequired/toolboxNumba.py +1 -1
  20. mapFolding/someAssemblyRequired/transformationTools.py +40 -58
  21. mapFolding/syntheticModules/dataPacking.py +25 -0
  22. mapFolding/syntheticModules/initializeCount.py +49 -0
  23. mapFolding/syntheticModules/theorem2.py +49 -0
  24. mapFolding/syntheticModules/theorem2Numba.py +51 -0
  25. mapFolding/theSSOT.py +13 -21
  26. {mapfolding-0.9.2.dist-info → mapfolding-0.9.4.dist-info}/METADATA +4 -3
  27. mapfolding-0.9.4.dist-info/RECORD +57 -0
  28. {mapfolding-0.9.2.dist-info → mapfolding-0.9.4.dist-info}/WHEEL +1 -1
  29. tests/__init__.py +2 -2
  30. tests/conftest.py +7 -7
  31. tests/test_computations.py +17 -13
  32. tests/test_tasks.py +2 -2
  33. mapfolding-0.9.2.dist-info/RECORD +0 -47
  34. {mapfolding-0.9.2.dist-info → mapfolding-0.9.4.dist-info}/entry_points.txt +0 -0
  35. {mapfolding-0.9.2.dist-info → mapfolding-0.9.4.dist-info}/licenses/LICENSE +0 -0
  36. {mapfolding-0.9.2.dist-info → mapfolding-0.9.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,49 @@
1
+ from mapFolding.dataBaskets import MapFoldingState
2
+
3
+ def initializeGroupsOfFolds(state: MapFoldingState) -> MapFoldingState:
4
+ while state.groupsOfFolds == 0:
5
+ if state.leaf1ndex <= 1 or state.leafBelow[0] == 1:
6
+ if state.leaf1ndex > state.leavesTotal:
7
+ state.groupsOfFolds += 1
8
+ else:
9
+ state.dimensionsUnconstrained = state.dimensionsTotal
10
+ state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
11
+ state.indexDimension = 0
12
+ while state.indexDimension < state.dimensionsTotal:
13
+ state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leaf1ndex]
14
+ if state.leafConnectee == state.leaf1ndex:
15
+ state.dimensionsUnconstrained -= 1
16
+ else:
17
+ while state.leafConnectee != state.leaf1ndex:
18
+ state.gapsWhere[state.gap1ndexCeiling] = state.leafConnectee
19
+ if state.countDimensionsGapped[state.leafConnectee] == 0:
20
+ state.gap1ndexCeiling += 1
21
+ state.countDimensionsGapped[state.leafConnectee] += 1
22
+ state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leafBelow[state.leafConnectee]]
23
+ state.indexDimension += 1
24
+ if not state.dimensionsUnconstrained:
25
+ state.indexLeaf = 0
26
+ while state.indexLeaf < state.leaf1ndex:
27
+ state.gapsWhere[state.gap1ndexCeiling] = state.indexLeaf
28
+ state.gap1ndexCeiling += 1
29
+ state.indexLeaf += 1
30
+ state.indexMiniGap = state.gap1ndex
31
+ while state.indexMiniGap < state.gap1ndexCeiling:
32
+ state.gapsWhere[state.gap1ndex] = state.gapsWhere[state.indexMiniGap]
33
+ if state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] == state.dimensionsUnconstrained:
34
+ state.gap1ndex += 1
35
+ state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] = 0
36
+ state.indexMiniGap += 1
37
+ while state.leaf1ndex > 0 and state.gap1ndex == state.gapRangeStart[state.leaf1ndex - 1]:
38
+ state.leaf1ndex -= 1
39
+ state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leafBelow[state.leaf1ndex]
40
+ state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leafAbove[state.leaf1ndex]
41
+ if state.leaf1ndex > 0:
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
+ return state
@@ -0,0 +1,49 @@
1
+ from mapFolding.dataBaskets import MapFoldingState
2
+
3
+ def count(state: MapFoldingState) -> MapFoldingState:
4
+ while state.leaf1ndex > 4:
5
+ if state.leafBelow[0] == 1:
6
+ if state.leaf1ndex > state.leavesTotal:
7
+ state.groupsOfFolds += 1
8
+ else:
9
+ state.dimensionsUnconstrained = state.dimensionsTotal
10
+ state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
11
+ state.indexDimension = 0
12
+ while state.indexDimension < state.dimensionsTotal:
13
+ state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leaf1ndex]
14
+ if state.leafConnectee == state.leaf1ndex:
15
+ state.dimensionsUnconstrained -= 1
16
+ else:
17
+ while state.leafConnectee != state.leaf1ndex:
18
+ state.gapsWhere[state.gap1ndexCeiling] = state.leafConnectee
19
+ if state.countDimensionsGapped[state.leafConnectee] == 0:
20
+ state.gap1ndexCeiling += 1
21
+ state.countDimensionsGapped[state.leafConnectee] += 1
22
+ state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leafBelow[state.leafConnectee]]
23
+ state.indexDimension += 1
24
+ if not state.dimensionsUnconstrained:
25
+ state.indexLeaf = 0
26
+ while state.indexLeaf < state.leaf1ndex:
27
+ state.gapsWhere[state.gap1ndexCeiling] = state.indexLeaf
28
+ state.gap1ndexCeiling += 1
29
+ state.indexLeaf += 1
30
+ state.indexMiniGap = state.gap1ndex
31
+ while state.indexMiniGap < state.gap1ndexCeiling:
32
+ state.gapsWhere[state.gap1ndex] = state.gapsWhere[state.indexMiniGap]
33
+ if state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] == state.dimensionsUnconstrained:
34
+ state.gap1ndex += 1
35
+ state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] = 0
36
+ state.indexMiniGap += 1
37
+ while state.gap1ndex == state.gapRangeStart[state.leaf1ndex - 1]:
38
+ state.leaf1ndex -= 1
39
+ state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leafBelow[state.leaf1ndex]
40
+ state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leafAbove[state.leaf1ndex]
41
+ state.gap1ndex -= 1
42
+ state.leafAbove[state.leaf1ndex] = state.gapsWhere[state.gap1ndex]
43
+ state.leafBelow[state.leaf1ndex] = state.leafBelow[state.leafAbove[state.leaf1ndex]]
44
+ state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leaf1ndex
45
+ state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leaf1ndex
46
+ state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
47
+ state.leaf1ndex += 1
48
+ state.groupsOfFolds *= 2
49
+ return state
@@ -0,0 +1,51 @@
1
+ from mapFolding.dataBaskets import Array1DElephino, Array1DLeavesTotal, Array3D, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal
2
+ from numba import jit
3
+
4
+ @jit(cache=True, error_model='numpy', fastmath=True, forceinline=True)
5
+ def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexLeaf: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, connectionGraph: Array3D, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3D, DatatypeLeavesTotal, DatatypeLeavesTotal]:
6
+ while leaf1ndex > 4:
7
+ if leafBelow[0] == 1:
8
+ if leaf1ndex > leavesTotal:
9
+ groupsOfFolds += 1
10
+ else:
11
+ dimensionsUnconstrained = dimensionsTotal
12
+ gap1ndexCeiling = gapRangeStart[leaf1ndex - 1]
13
+ indexDimension = 0
14
+ while indexDimension < dimensionsTotal:
15
+ leafConnectee = connectionGraph[indexDimension, leaf1ndex, leaf1ndex]
16
+ if leafConnectee == leaf1ndex:
17
+ dimensionsUnconstrained -= 1
18
+ else:
19
+ while leafConnectee != leaf1ndex:
20
+ gapsWhere[gap1ndexCeiling] = leafConnectee
21
+ if countDimensionsGapped[leafConnectee] == 0:
22
+ gap1ndexCeiling += 1
23
+ countDimensionsGapped[leafConnectee] += 1
24
+ leafConnectee = connectionGraph[indexDimension, leaf1ndex, leafBelow[leafConnectee]]
25
+ indexDimension += 1
26
+ if not dimensionsUnconstrained:
27
+ indexLeaf = 0
28
+ while indexLeaf < leaf1ndex:
29
+ gapsWhere[gap1ndexCeiling] = indexLeaf
30
+ gap1ndexCeiling += 1
31
+ indexLeaf += 1
32
+ indexMiniGap = gap1ndex
33
+ while indexMiniGap < gap1ndexCeiling:
34
+ gapsWhere[gap1ndex] = gapsWhere[indexMiniGap]
35
+ if countDimensionsGapped[gapsWhere[indexMiniGap]] == dimensionsUnconstrained:
36
+ gap1ndex += 1
37
+ countDimensionsGapped[gapsWhere[indexMiniGap]] = 0
38
+ indexMiniGap += 1
39
+ while gap1ndex == gapRangeStart[leaf1ndex - 1]:
40
+ leaf1ndex -= 1
41
+ leafBelow[leafAbove[leaf1ndex]] = leafBelow[leaf1ndex]
42
+ leafAbove[leafBelow[leaf1ndex]] = leafAbove[leaf1ndex]
43
+ gap1ndex -= 1
44
+ leafAbove[leaf1ndex] = gapsWhere[gap1ndex]
45
+ leafBelow[leaf1ndex] = leafBelow[leafAbove[leaf1ndex]]
46
+ leafBelow[leafAbove[leaf1ndex]] = leaf1ndex
47
+ leafAbove[leafBelow[leaf1ndex]] = leaf1ndex
48
+ gapRangeStart[leaf1ndex] = gap1ndex
49
+ leaf1ndex += 1
50
+ groupsOfFolds *= 2
51
+ return (groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal)
mapFolding/theSSOT.py CHANGED
@@ -19,12 +19,23 @@ collisions when transforming algorithms.
19
19
  from collections.abc import Callable
20
20
  from importlib import import_module as importlib_import_module
21
21
  from inspect import getfile as inspect_getfile
22
- from numpy import dtype, int64 as numpy_int64, integer, ndarray
23
22
  from pathlib import Path
24
23
  from tomli import load as tomli_load
25
24
  from types import ModuleType
26
- from typing import Any, TypeAlias, TypeVar
27
25
  import dataclasses
26
+ from mapFolding.datatypes import (
27
+ Array1DElephino as Array1DElephino,
28
+ Array1DFoldsTotal as Array1DFoldsTotal,
29
+ Array1DLeavesTotal as Array1DLeavesTotal,
30
+ Array3D as Array3D,
31
+ DatatypeElephino as DatatypeElephino,
32
+ DatatypeFoldsTotal as DatatypeFoldsTotal,
33
+ DatatypeLeavesTotal as DatatypeLeavesTotal,
34
+ NumPyElephino as NumPyElephino,
35
+ NumPyFoldsTotal as NumPyFoldsTotal,
36
+ NumPyIntegerType as NumPyIntegerType,
37
+ NumPyLeavesTotal as NumPyLeavesTotal,
38
+ )
28
39
 
29
40
  # Evaluate When Packaging https://github.com/hunterhogan/mapFolding/issues/18
30
41
  try:
@@ -144,25 +155,6 @@ class PackageSettings:
144
155
 
145
156
  The = PackageSettings(logicalPathModuleDispatcher=logicalPathModuleDispatcherHARDCODED, callableDispatcher=callableDispatcherHARDCODED, concurrencyPackage=concurrencyPackageHARDCODED)
146
157
 
147
- # =============================================================================
148
- # Flexible Data Structure System Needs Enhanced Paradigm https://github.com/hunterhogan/mapFolding/issues/9
149
-
150
- NumPyIntegerType = TypeVar('NumPyIntegerType', bound=integer[Any], covariant=True)
151
-
152
- DatatypeLeavesTotal: TypeAlias = int
153
- NumPyLeavesTotal: TypeAlias = numpy_int64
154
-
155
- DatatypeElephino: TypeAlias = int
156
- NumPyElephino: TypeAlias = numpy_int64
157
-
158
- DatatypeFoldsTotal: TypeAlias = int
159
- NumPyFoldsTotal: TypeAlias = numpy_int64
160
-
161
- Array3D: TypeAlias = ndarray[tuple[int, int, int], dtype[NumPyLeavesTotal]]
162
- Array1DLeavesTotal: TypeAlias = ndarray[tuple[int], dtype[NumPyLeavesTotal]]
163
- Array1DElephino: TypeAlias = ndarray[tuple[int], dtype[NumPyElephino]]
164
- Array1DFoldsTotal: TypeAlias = ndarray[tuple[int], dtype[NumPyFoldsTotal]]
165
-
166
158
  @dataclasses.dataclass
167
159
  class ComputationState:
168
160
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapFolding
3
- Version: 0.9.2
3
+ Version: 0.9.4
4
4
  Summary: Map folding algorithm with code transformation framework for optimizing numerical computations
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: Repository, https://github.com/hunterhogan/mapFolding.git
10
10
  Project-URL: Issues, https://github.com/hunterhogan/mapFolding/issues
11
- Keywords: A001415,A001416,A001417,A001418,A195646,algorithmic optimization,AST manipulation,code generation,code transformation,combinatorics,computational geometry,dataclass transformation,folding pattern enumeration,just-in-time compilation,map folding,Numba optimization,OEIS,performance optimization,source code analysis,stamp folding
11
+ Keywords: A000136,A001415,A001416,A001417,A001418,A195646,algorithmic optimization,AST manipulation,code generation,code transformation,combinatorics,computational geometry,dataclass transformation,folding pattern enumeration,just-in-time compilation,map folding,Numba optimization,OEIS,performance optimization,source code analysis,stamp folding
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
@@ -32,6 +32,7 @@ Requires-Python: >=3.10
32
32
  Description-Content-Type: text/markdown
33
33
  License-File: LICENSE
34
34
  Requires-Dist: autoflake
35
+ Requires-Dist: cytoolz
35
36
  Requires-Dist: more_itertools
36
37
  Requires-Dist: numba_progress
37
38
  Requires-Dist: numba
@@ -106,7 +107,7 @@ def countFolds_optimized(shape_param):
106
107
 
107
108
  ### 2. Code Generation Framework
108
109
 
109
- Study and extend a complete Python code transformation pipeline:
110
+ Study and extend a complete Python code transformation assembly line:
110
111
 
111
112
  - AST analysis and manipulation
112
113
  - Dataclass decomposition ("shattering")
@@ -0,0 +1,57 @@
1
+ mapFolding/Z0Z_flowControl.py,sha256=jGeImXadt0F_Fy6F5QtYQpLJP_iRo2Wh4fFjpCm9vCo,4141
2
+ mapFolding/__init__.py,sha256=XbCu7IEPzmIuPRy5iUFKbRbhqTRsie3RemnKVUdACCU,4360
3
+ mapFolding/basecamp.py,sha256=zKqG2lfhaUEicpXjResOrU8zIq3_-3KAFW-DLXATlpc,4749
4
+ mapFolding/beDRY.py,sha256=sTqg_xq3_c4Djer8HRg41ERhDulcl1ZgU4_RMksuv6c,15975
5
+ mapFolding/daoOfMapFolding.py,sha256=ncTIiBfTsM8SNVx9qefZ0bBcBtviWLSk4iPv3Z9nGiE,5442
6
+ mapFolding/dataBaskets.py,sha256=CrSEMfAr63l6zFA2v2YGygwSD8YeLb-3ZCKlpbp3Mho,4325
7
+ mapFolding/datatypes.py,sha256=LbDYemnIVLFqMIHPKWutEWId1iPMw6P7XCDm7Uw4it4,912
8
+ mapFolding/oeis.py,sha256=u9xiBrRXVJSFCC8FgLLuvZAsmX852UyjYqREXiulys8,17106
9
+ mapFolding/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ mapFolding/theDao.py,sha256=kc3rzTX3yts0PxgPCXFbgWvaqsBexsiU5ib2pzpvID0,10019
11
+ mapFolding/theSSOT.py,sha256=rbv8esQeBG6uLWpFZu_ncMA4zIuQG3lj4FZNzC_6JGI,16138
12
+ mapFolding/toolboxFilesystem.py,sha256=kVZoU-NBvfYSvI4R8mEpMXRUZee-1JV0fjtMFWPhk8Y,9818
13
+ mapFolding/reference/__init__.py,sha256=GKcSgYE49NcTISx-JZbELXyq-eRkMeTL5g4DXInWFw0,2206
14
+ mapFolding/reference/flattened.py,sha256=QK1xG9SllqCoi68e86Hyl9d9ATUAAFNpTQI-3zmcp5I,16072
15
+ mapFolding/reference/hunterNumba.py,sha256=iLfyqwGdAh6c5GbapnKsWhAsNsR3O-fyGGHAdohluLw,7258
16
+ mapFolding/reference/irvineJavaPort.py,sha256=UEfIX4QbPLl5jnyfYIyX5YRR3_rYvPUikK8jLehsFko,4076
17
+ mapFolding/reference/jaxCount.py,sha256=TuDNKOnyhQfuixKmIxO9Algv7dvy7KMGhgsV3h96FGE,14853
18
+ mapFolding/reference/lunnonNumpy.py,sha256=mMgrgbrBpe4nmo72ThEI-MGH0OwEHmfMPczSXHp2qKo,4357
19
+ mapFolding/reference/lunnonWhile.py,sha256=ZL8GAQtPs5nJZSgoDl5USrLSS_zs03y98y1Z9E4jOmQ,3799
20
+ mapFolding/reference/rotatedEntryPoint.py,sha256=5ughpKUT2JQhoAKgoDUdYNjgWQYPGV8v-7dWEAdDmfE,10274
21
+ mapFolding/reference/total_countPlus1vsPlusN.py,sha256=yJZAVLVdoXqHag2_N6_6CT-Q6HXBgRro-eny93-Rlpw,9307
22
+ mapFolding/reference/jobsCompleted/__init__.py,sha256=TU93ZGUW1xEkT6d9mQFn_rp5DvRy0ZslEB2Q6MF5ZDc,2596
23
+ mapFolding/reference/jobsCompleted/[2x19]/p2x19.py,sha256=_tvYtfzMWVo2VtUbIAieoscb4N8FFflgTdW4-ljBUuA,19626
24
+ mapFolding/reference/jobsCompleted/p2x19/p2x19.py,sha256=eZEw4Me4ocTt6VXoK2-Sbd5SowZtxRIbN9dZmc7OCVg,6395
25
+ mapFolding/someAssemblyRequired/RecipeJob.py,sha256=JL5Xkmp8ritVMhL1pGhX7eEw5fde3FVD8-9-vZOZwWI,5399
26
+ mapFolding/someAssemblyRequired/Z0Z_makeSomeModules.py,sha256=UCJDQyT6VTauncCd-bNeFfM0HWtNVPJPXLIyK6fzQG8,10697
27
+ mapFolding/someAssemblyRequired/__init__.py,sha256=n3aOCM41eDQnisJCKsVfbDWK-F-jO9lp7wv_Lhn7FHY,4546
28
+ mapFolding/someAssemblyRequired/_theTypes.py,sha256=bCc9HT7v-HT9cMNFewD9HQh0tRDvRyItEHPOluES0tY,4930
29
+ mapFolding/someAssemblyRequired/_tool_Make.py,sha256=Du_MElrYGK8Vk72rGg3xx9aMpBCm0q1DpPcXQ0CeEUg,7651
30
+ mapFolding/someAssemblyRequired/_tool_Then.py,sha256=-aOVg_eZDQn2ZwamYNOMHFQ6QOl5rBobnIzdCJ2gYMY,6181
31
+ mapFolding/someAssemblyRequired/_toolboxAST.py,sha256=Wm0XUqqxKbwu1kIQ1F6iXEP2z25qmr1JsZ2CeWMBtLg,2376
32
+ mapFolding/someAssemblyRequired/_toolboxAntecedents.py,sha256=I6fI96dVPxIn601F-hF-WsSbbmj-MoTG5M6uTpFA2fI,15863
33
+ mapFolding/someAssemblyRequired/_toolboxContainers.py,sha256=jRUIAYi05OPnqRsPopvvxaXjH9kxaymTsn_ozf2hwA8,24207
34
+ mapFolding/someAssemblyRequired/_toolboxPython.py,sha256=1K7IzqzmHNTaPA6qTo73GZYHCIQRYI2Rn8aYJ3VelqY,7873
35
+ mapFolding/someAssemblyRequired/getLLVMforNoReason.py,sha256=9RPU6vK_eUg64GtVFI_nZnvUryXw8gfHJs9NyDYHIvg,2745
36
+ mapFolding/someAssemblyRequired/synthesizeNumbaJob.py,sha256=iqnhda-Fx4z6LOL9qCGwrEnnt2oiAGSYVE47Pav1P80,15570
37
+ mapFolding/someAssemblyRequired/toolboxNumba.py,sha256=f2spS6SSobGdDNlpS2ELO7ejurqbMVITS2QZLIXDivk,10759
38
+ mapFolding/someAssemblyRequired/transformationTools.py,sha256=cQTYg_aR0X7Y7nghr3HDxqA-j-84_NRbLP4CO9vBqDo,35363
39
+ mapFolding/syntheticModules/__init__.py,sha256=evVFqhCGa-WZKDiLcnQWjs-Bj34eRnfSLqz_d7dFYZY,83
40
+ mapFolding/syntheticModules/dataPacking.py,sha256=FmB-6Q0RFZ4c2brVUX0bHHZetowWBmBG3dQCOwjVYv8,2316
41
+ mapFolding/syntheticModules/initializeCount.py,sha256=nWSlJMMfIM3DvZxMn6ISQusUJqRYAjKQyLF5hwLEdBQ,3119
42
+ mapFolding/syntheticModules/numbaCount.py,sha256=zM-bp07c9tEDdvidwzZ_bJTd0JC0VUkYEEiHG--P1tQ,15525
43
+ mapFolding/syntheticModules/theorem2.py,sha256=9jrbZNNX4BWYZW1S0JjvRY2k7RU7I1RNUMV7JdCt1ZY,3017
44
+ mapFolding/syntheticModules/theorem2Numba.py,sha256=UChbeMxCGOUr8i5018Ql9KY-pbMAmcdMdqnkQklH7_k,3711
45
+ mapfolding-0.9.4.dist-info/licenses/LICENSE,sha256=NxH5Y8BdC-gNU-WSMwim3uMbID2iNDXJz7fHtuTdXhk,19346
46
+ tests/__init__.py,sha256=5VhHf0JJ2_DSh58zJ0rR5UkpoCon-0IkdljspTCzZ04,1950
47
+ tests/conftest.py,sha256=x8zMZQyTss3sn0GwHm_TSRwD9_LVlR8l_qF8r43Vxl4,14178
48
+ tests/test_computations.py,sha256=oUl1M_bBBfHQQ4HIMeTcqEuPCXKqPSCC3havKDlr8ww,6505
49
+ tests/test_filesystem.py,sha256=T2DkjBoI3lW6tCxd5BilPmUFrVukNKLjOOZVZxLM560,3004
50
+ tests/test_oeis.py,sha256=uxvwmgbnylSDdsVJfuAT0LuYLbIVFwSgdLxHm-xUGBM,5043
51
+ tests/test_other.py,sha256=UMlK4JPInalpOZuPvTnUrgXWCJOxAw-OsPs6CxMR254,3753
52
+ tests/test_tasks.py,sha256=tOQc4uomKXGwWnENfbcThaVa1XofwXNCkGZbg4yS6VI,2833
53
+ mapfolding-0.9.4.dist-info/METADATA,sha256=b774T-bTm3mOoOrVyNzkNXudrEGvfM2tDUKSbx8Nfck,7502
54
+ mapfolding-0.9.4.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
55
+ mapfolding-0.9.4.dist-info/entry_points.txt,sha256=F3OUeZR1XDTpoH7k3wXuRb3KF_kXTTeYhu5AGK1SiOQ,146
56
+ mapfolding-0.9.4.dist-info/top_level.txt,sha256=1gP2vFaqPwHujGwb3UjtMlLEGN-943VSYFR7V4gDqW8,17
57
+ mapfolding-0.9.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (79.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
tests/__init__.py CHANGED
@@ -14,7 +14,7 @@ own recipe configurations and job implementations.
14
14
  - Ensures consistency across different implementation strategies
15
15
 
16
16
  2. **Code Generation Testing**
17
- - Tests the AST transformation pipeline from source to optimized implementations
17
+ - Tests the AST transformation assembly line from source to optimized implementations
18
18
  - Validates that generated Numba-accelerated modules produce correct results
19
19
  - Ensures robust code generation across different parameter sets
20
20
 
@@ -29,7 +29,7 @@ This suite is designed to make it easy to test your custom recipes and jobs:
29
29
 
30
30
  ### For Custom Recipes (RecipeSynthesizeFlow):
31
31
  Copy and adapt the `syntheticDispatcherFixture` and associated tests from
32
- `test_computations.py` to validate your customized code transformation pipelines.
32
+ `test_computations.py` to validate your customized code transformation assembly lines.
33
33
 
34
34
  ### For Custom Jobs (RecipeJob):
35
35
  Copy and adapt the `test_writeJobNumba` function to test specialized job modules
tests/conftest.py CHANGED
@@ -56,7 +56,7 @@ See the examples in `test_computations.py` for guidance on adapting these fixtur
56
56
  """
57
57
 
58
58
  from collections.abc import Callable, Generator, Sequence
59
- from mapFolding import ComputationState, The
59
+ from mapFolding import The
60
60
  from mapFolding.beDRY import getLeavesTotal, validateListDimensions, makeDataContainer
61
61
  from mapFolding.oeis import oeisIDsImplemented, settingsOEIS
62
62
  from mapFolding.someAssemblyRequired import importLogicalPath2Callable, RecipeSynthesizeFlow
@@ -171,7 +171,7 @@ def oneTestCuzTestsOverwritingTests(oeisID_1random: str) -> tuple[int, ...]:
171
171
  pass
172
172
 
173
173
  @pytest.fixture
174
- def listDimensionsTestCountFolds(oeisID: str) -> tuple[int, ...]:
174
+ def mapShapeTestCountFolds(oeisID: str) -> tuple[int, ...]:
175
175
  """For each `oeisID` from the `pytest.fixture`, returns `listDimensions` from `valuesTestValidation`
176
176
  if `validateListDimensions` approves. Each `listDimensions` is suitable for testing counts."""
177
177
  while True:
@@ -202,10 +202,10 @@ def mapShapeTestFunctionality(oeisID_1random: str) -> tuple[int, ...]:
202
202
  pass
203
203
 
204
204
  @pytest.fixture
205
- def listDimensionsTestParallelization(oeisID: str) -> list[int]:
205
+ def mapShapeTestParallelization(oeisID: str) -> tuple[int, ...]:
206
206
  """For each `oeisID` from the `pytest.fixture`, returns `listDimensions` from `valuesTestParallelization`"""
207
207
  n = random.choice(settingsOEIS[oeisID]['valuesTestParallelization'])
208
- return list(settingsOEIS[oeisID]['getMapShape'](n))
208
+ return settingsOEIS[oeisID]['getMapShape'](n)
209
209
 
210
210
  @pytest.fixture
211
211
  def mockBenchmarkTimer() -> Generator[unittest.mock.MagicMock | unittest.mock.AsyncMock, Any, None]:
@@ -255,8 +255,8 @@ def useThisDispatcher() -> Generator[Callable[..., None], Any, None]:
255
255
  def patchDispatcher(callableTarget: Callable[..., Any]) -> None:
256
256
  """Patch the dispatcher property to return the target callable."""
257
257
  # Create a new property that returns the target callable
258
- def patched_dispatcher(self: theSSOT.PackageSettings) -> Callable[['ComputationState'], 'ComputationState']:
259
- def wrapper(state: 'ComputationState') -> 'ComputationState':
258
+ def patched_dispatcher(self: theSSOT.PackageSettings) -> Callable[..., Any]:
259
+ def wrapper(state: Any) -> Any:
260
260
  return callableTarget(state)
261
261
  return wrapper
262
262
 
@@ -268,7 +268,7 @@ def useThisDispatcher() -> Generator[Callable[..., None], Any, None]:
268
268
  # Restore the original property
269
269
  theSSOT.PackageSettings.dispatcher = original_dispatcher_property # type: ignore
270
270
 
271
- def getAlgorithmDispatcher() -> Callable[[ComputationState], ComputationState]:
271
+ def getAlgorithmDispatcher() -> Callable[..., Any]:
272
272
  moduleImported: ModuleType = importlib.import_module(The.logicalPathModuleSourceAlgorithm)
273
273
  dispatcherCallable = getattr(moduleImported, The.sourceCallableDispatcher)
274
274
  return dispatcherCallable
@@ -85,7 +85,8 @@ All tests leverage standardized utilities like `standardizedEqualToCallableRetur
85
85
  that provide consistent, informative error messages and simplify test validation.
86
86
  """
87
87
 
88
- from mapFolding import countFolds, getFoldsTotalKnown, oeisIDfor_n, validateListDimensions
88
+ from typing import Literal
89
+ from mapFolding import countFolds, getFoldsTotalKnown, oeisIDfor_n
89
90
  from mapFolding.oeis import settingsOEIS
90
91
  from mapFolding.someAssemblyRequired.RecipeJob import RecipeJob
91
92
  from mapFolding.someAssemblyRequired.transformationTools import makeInitializedComputationState
@@ -98,28 +99,31 @@ import pytest
98
99
  if __name__ == '__main__':
99
100
  multiprocessing.set_start_method('spawn')
100
101
 
101
- def test_algorithmSourceParallel(listDimensionsTestParallelization: list[int], useAlgorithmSourceDispatcher: None) -> None:
102
- standardizedEqualToCallableReturn(getFoldsTotalKnown(tuple(listDimensionsTestParallelization)), countFolds, listDimensionsTestParallelization, None, 'maximum', None)
102
+ def test_algorithmSourceParallel(mapShapeTestParallelization: tuple[int, ...], useAlgorithmSourceDispatcher: None) -> None:
103
+ standardizedEqualToCallableReturn(getFoldsTotalKnown(mapShapeTestParallelization), countFolds, mapShapeTestParallelization, None, 'maximum', None)
103
104
 
104
- def test_algorithmSourceSequential(listDimensionsTestCountFolds: tuple[int, ...], useAlgorithmSourceDispatcher: None) -> None:
105
- standardizedEqualToCallableReturn(getFoldsTotalKnown(tuple(listDimensionsTestCountFolds)), countFolds, listDimensionsTestCountFolds)
105
+ @pytest.mark.parametrize('flow', ['daoOfMapFolding', 'theorem2', 'theorem2numba'])
106
+ def test_flowControl(mapShapeTestCountFolds: tuple[int, ...], flow: Literal['daoOfMapFolding'] | Literal['theorem2'] | Literal['theorem2numba']) -> None:
107
+ standardizedEqualToCallableReturn(getFoldsTotalKnown(mapShapeTestCountFolds), countFolds, None, None, None, None, mapShapeTestCountFolds, None, None, flow)
108
+
109
+ def test_algorithmSourceSequential(mapShapeTestCountFolds: tuple[int, ...], useAlgorithmSourceDispatcher: None) -> None:
110
+ standardizedEqualToCallableReturn(getFoldsTotalKnown(mapShapeTestCountFolds), countFolds, mapShapeTestCountFolds)
106
111
 
107
112
  def test_aOFn_calculate_value(oeisID: str) -> None:
108
113
  for n in settingsOEIS[oeisID]['valuesTestValidation']:
109
114
  standardizedEqualToCallableReturn(settingsOEIS[oeisID]['valuesKnown'][n], oeisIDfor_n, oeisID, n)
110
115
 
111
- def test_syntheticParallel(syntheticDispatcherFixture: None, listDimensionsTestParallelization: list[int]) -> None:
112
- standardizedEqualToCallableReturn(getFoldsTotalKnown(tuple(listDimensionsTestParallelization)), countFolds, listDimensionsTestParallelization, None, 'maximum')
116
+ def test_syntheticParallel(syntheticDispatcherFixture: None, mapShapeTestParallelization: tuple[int, ...]) -> None:
117
+ standardizedEqualToCallableReturn(getFoldsTotalKnown(mapShapeTestParallelization), countFolds, mapShapeTestParallelization, None, 'maximum')
113
118
 
114
- def test_syntheticSequential(syntheticDispatcherFixture: None, listDimensionsTestCountFolds: list[int]) -> None:
115
- standardizedEqualToCallableReturn(getFoldsTotalKnown(tuple(listDimensionsTestCountFolds)), countFolds, listDimensionsTestCountFolds)
119
+ def test_syntheticSequential(syntheticDispatcherFixture: None, mapShapeTestCountFolds: tuple[int, ...]) -> None:
120
+ standardizedEqualToCallableReturn(getFoldsTotalKnown(mapShapeTestCountFolds), countFolds, mapShapeTestCountFolds)
116
121
 
117
122
  @pytest.mark.parametrize('pathFilenameTmpTesting', ['.py'], indirect=True)
118
- def test_writeJobNumba(oneTestCuzTestsOverwritingTests: list[int], pathFilenameTmpTesting: Path) -> None:
123
+ def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFilenameTmpTesting: Path) -> None:
119
124
  from mapFolding.someAssemblyRequired.toolboxNumba import SpicesJobNumba
120
125
  from mapFolding.someAssemblyRequired.synthesizeNumbaJob import makeJobNumba
121
- mapShape = validateListDimensions(oneTestCuzTestsOverwritingTests)
122
- state = makeInitializedComputationState(mapShape)
126
+ state = makeInitializedComputationState(oneTestCuzTestsOverwritingTests)
123
127
 
124
128
  pathFilenameModule = pathFilenameTmpTesting.absolute()
125
129
  pathFilenameFoldsTotal = pathFilenameModule.with_suffix('.foldsTotalTesting')
@@ -142,4 +146,4 @@ def test_writeJobNumba(oneTestCuzTestsOverwritingTests: list[int], pathFilenameT
142
146
  module.__name__ = "__main__"
143
147
  Don_Lapre_Road_to_Self_Improvement.loader.exec_module(module)
144
148
 
145
- standardizedEqualToCallableReturn(str(getFoldsTotalKnown(mapShape)), pathFilenameFoldsTotal.read_text().strip)
149
+ standardizedEqualToCallableReturn(str(getFoldsTotalKnown(oneTestCuzTestsOverwritingTests)), pathFilenameFoldsTotal.read_text().strip)
tests/test_tasks.py CHANGED
@@ -15,8 +15,8 @@ if __name__ == '__main__':
15
15
  def test_countFoldsComputationDivisionsInvalid(mapShapeTestFunctionality: tuple[int, ...]) -> None:
16
16
  standardizedEqualToCallableReturn(ValueError, countFolds, mapShapeTestFunctionality, None, {"wrong": "value"})
17
17
 
18
- def test_countFoldsComputationDivisionsMaximum(listDimensionsTestParallelization: list[int]) -> None:
19
- standardizedEqualToCallableReturn(getFoldsTotalKnown(tuple(listDimensionsTestParallelization)), countFolds, listDimensionsTestParallelization, None, 'maximum', None)
18
+ def test_countFoldsComputationDivisionsMaximum(mapShapeTestParallelization: list[int]) -> None:
19
+ standardizedEqualToCallableReturn(getFoldsTotalKnown(tuple(mapShapeTestParallelization)), countFolds, mapShapeTestParallelization, None, 'maximum', None)
20
20
 
21
21
  @pytest.mark.parametrize("nameOfTest,callablePytest", PytestFor_defineConcurrencyLimit())
22
22
  def test_defineConcurrencyLimit(nameOfTest: str, callablePytest: Callable[[], None]) -> None:
@@ -1,47 +0,0 @@
1
- mapFolding/__init__.py,sha256=RwSpDoCykIukgnlZNf8HSmICtuk6xFuoovYvSuqzK_g,4253
2
- mapFolding/basecamp.py,sha256=WQxSTucEuTA_ee7Wlfkd5RIClzEsal5OHaCwcT8g3rU,4747
3
- mapFolding/beDRY.py,sha256=3GDFCzFHEL3uPAEGVxrUj8TX-MGHDObwn9KoMVEMKAc,16074
4
- mapFolding/oeis.py,sha256=TYJKlCBrYSVhTCFret5QS5B_rs_MNEF8yFU0vLuu5OQ,17138
5
- mapFolding/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- mapFolding/theDao.py,sha256=kc3rzTX3yts0PxgPCXFbgWvaqsBexsiU5ib2pzpvID0,10019
7
- mapFolding/theSSOT.py,sha256=ozmfoUPVtbuB_i-m8On80nDGzqBSFHTvNrh6srHMrzY,16596
8
- mapFolding/toolboxFilesystem.py,sha256=kVZoU-NBvfYSvI4R8mEpMXRUZee-1JV0fjtMFWPhk8Y,9818
9
- mapFolding/reference/__init__.py,sha256=GKcSgYE49NcTISx-JZbELXyq-eRkMeTL5g4DXInWFw0,2206
10
- mapFolding/reference/flattened.py,sha256=QK1xG9SllqCoi68e86Hyl9d9ATUAAFNpTQI-3zmcp5I,16072
11
- mapFolding/reference/hunterNumba.py,sha256=iLfyqwGdAh6c5GbapnKsWhAsNsR3O-fyGGHAdohluLw,7258
12
- mapFolding/reference/irvineJavaPort.py,sha256=UEfIX4QbPLl5jnyfYIyX5YRR3_rYvPUikK8jLehsFko,4076
13
- mapFolding/reference/jaxCount.py,sha256=TuDNKOnyhQfuixKmIxO9Algv7dvy7KMGhgsV3h96FGE,14853
14
- mapFolding/reference/lunnonNumpy.py,sha256=mMgrgbrBpe4nmo72ThEI-MGH0OwEHmfMPczSXHp2qKo,4357
15
- mapFolding/reference/lunnonWhile.py,sha256=ZL8GAQtPs5nJZSgoDl5USrLSS_zs03y98y1Z9E4jOmQ,3799
16
- mapFolding/reference/rotatedEntryPoint.py,sha256=5ughpKUT2JQhoAKgoDUdYNjgWQYPGV8v-7dWEAdDmfE,10274
17
- mapFolding/reference/total_countPlus1vsPlusN.py,sha256=yJZAVLVdoXqHag2_N6_6CT-Q6HXBgRro-eny93-Rlpw,9307
18
- mapFolding/reference/jobsCompleted/__init__.py,sha256=TU93ZGUW1xEkT6d9mQFn_rp5DvRy0ZslEB2Q6MF5ZDc,2596
19
- mapFolding/reference/jobsCompleted/[2x19]/p2x19.py,sha256=_tvYtfzMWVo2VtUbIAieoscb4N8FFflgTdW4-ljBUuA,19626
20
- mapFolding/reference/jobsCompleted/p2x19/p2x19.py,sha256=eZEw4Me4ocTt6VXoK2-Sbd5SowZtxRIbN9dZmc7OCVg,6395
21
- mapFolding/someAssemblyRequired/RecipeJob.py,sha256=JL5Xkmp8ritVMhL1pGhX7eEw5fde3FVD8-9-vZOZwWI,5399
22
- mapFolding/someAssemblyRequired/__init__.py,sha256=kMoIH57T68hHArRiW6EBuuC-JNpxTXgmjH2aqN-NjWE,4106
23
- mapFolding/someAssemblyRequired/_theTypes.py,sha256=pkMnYGtIAvIgudcvmbhZwmNnczY3Gk_ZmcS_7vfSZsU,4342
24
- mapFolding/someAssemblyRequired/_tool_Make.py,sha256=0TGZtCUt6uu8h47N833qZ9IIjbn_yhoPFsBDEotQp9A,7222
25
- mapFolding/someAssemblyRequired/_tool_Then.py,sha256=0Xb-MfKJhXjoVBTC7CSjpgCxxilL_WquL4WzKQWMR5A,4464
26
- mapFolding/someAssemblyRequired/_toolboxAntecedents.py,sha256=6m80_ThGF47WWIkYweEdc3LRq96fHklys7IpoFSqN7A,13288
27
- mapFolding/someAssemblyRequired/_toolboxContainers.py,sha256=zXjE70W1XodEGo2H1PofLoDbjtTKaJVlfv5I49jMz3o,23609
28
- mapFolding/someAssemblyRequired/_toolboxPython.py,sha256=TuRC5CD_6tTjjLuvGgPbnqCSvIP3Vp2k2r592Dcpff4,7642
29
- mapFolding/someAssemblyRequired/getLLVMforNoReason.py,sha256=9RPU6vK_eUg64GtVFI_nZnvUryXw8gfHJs9NyDYHIvg,2745
30
- mapFolding/someAssemblyRequired/synthesizeNumbaJob.py,sha256=0i4iBBzHY9Io0XrsmXD814P52C_igvv_Aeur4udR8jI,15571
31
- mapFolding/someAssemblyRequired/toolboxNumba.py,sha256=cHpX8dn1Fr_TWpDgVhYx6ObmEeD6slYeMWeE9laJadI,10754
32
- mapFolding/someAssemblyRequired/transformationTools.py,sha256=goxIq-LGu-lRkdzvCrKYDp9hJyKzL_TtNZnSP6zLbY8,35833
33
- mapFolding/syntheticModules/__init__.py,sha256=evVFqhCGa-WZKDiLcnQWjs-Bj34eRnfSLqz_d7dFYZY,83
34
- mapFolding/syntheticModules/numbaCount.py,sha256=zM-bp07c9tEDdvidwzZ_bJTd0JC0VUkYEEiHG--P1tQ,15525
35
- mapfolding-0.9.2.dist-info/licenses/LICENSE,sha256=NxH5Y8BdC-gNU-WSMwim3uMbID2iNDXJz7fHtuTdXhk,19346
36
- tests/__init__.py,sha256=UIvSWWz_anRXBELKPOdhfRoZ4hArHQTvghHrRquDHHw,1940
37
- tests/conftest.py,sha256=G8vhDSTdTbYZUFBUKLFOUOzDL1Ja6NVZmICCh4biZas,14298
38
- tests/test_computations.py,sha256=MbnK9kRRwH3UI7aVMreNuEbzNVC2hP0Gq2mR-xjuxrI,6205
39
- tests/test_filesystem.py,sha256=T2DkjBoI3lW6tCxd5BilPmUFrVukNKLjOOZVZxLM560,3004
40
- tests/test_oeis.py,sha256=uxvwmgbnylSDdsVJfuAT0LuYLbIVFwSgdLxHm-xUGBM,5043
41
- tests/test_other.py,sha256=UMlK4JPInalpOZuPvTnUrgXWCJOxAw-OsPs6CxMR254,3753
42
- tests/test_tasks.py,sha256=yrExYvFP23TEA3ta0IotMNmi59rwQ3Y9hA3fwvIhxTE,2851
43
- mapfolding-0.9.2.dist-info/METADATA,sha256=Ec4d3Oalth5tiJ-9Cnxap4kp6ehPFVxij_YtkaunuyQ,7466
44
- mapfolding-0.9.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
45
- mapfolding-0.9.2.dist-info/entry_points.txt,sha256=F3OUeZR1XDTpoH7k3wXuRb3KF_kXTTeYhu5AGK1SiOQ,146
46
- mapfolding-0.9.2.dist-info/top_level.txt,sha256=1gP2vFaqPwHujGwb3UjtMlLEGN-943VSYFR7V4gDqW8,17
47
- mapfolding-0.9.2.dist-info/RECORD,,