mapFolding 0.11.1__py3-none-any.whl → 0.11.2__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 (33) hide show
  1. mapFolding/__init__.py +18 -58
  2. mapFolding/basecamp.py +13 -10
  3. mapFolding/beDRY.py +113 -2
  4. mapFolding/dataBaskets.py +24 -2
  5. mapFolding/{toolboxFilesystem.py → filesystemToolkit.py} +3 -3
  6. mapFolding/infoBooth.py +96 -0
  7. mapFolding/oeis.py +3 -2
  8. mapFolding/someAssemblyRequired/RecipeJob.py +3 -4
  9. mapFolding/someAssemblyRequired/Z0Z_makeSomeModules.py +182 -17
  10. mapFolding/someAssemblyRequired/__init__.py +3 -3
  11. mapFolding/someAssemblyRequired/_toolIfThis.py +5 -5
  12. mapFolding/someAssemblyRequired/{_toolboxContainers.py → _toolkitContainers.py} +6 -7
  13. mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +8 -7
  14. mapFolding/someAssemblyRequired/synthesizeNumbaJob.py +3 -2
  15. mapFolding/someAssemblyRequired/transformationTools.py +11 -10
  16. mapFolding/syntheticModules/countParallel.py +98 -0
  17. mapFolding/syntheticModules/dataPacking.py +1 -1
  18. mapFolding/syntheticModules/numbaCount.py +189 -188
  19. mapFolding/theDao.py +1 -1
  20. mapFolding/theSSOT.py +4 -243
  21. {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/METADATA +16 -8
  22. mapfolding-0.11.2.dist-info/RECORD +56 -0
  23. {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/WHEEL +1 -1
  24. tests/conftest.py +7 -9
  25. tests/test_computations.py +1 -1
  26. tests/test_filesystem.py +1 -2
  27. tests/test_other.py +1 -1
  28. tests/test_tasks.py +1 -3
  29. mapfolding-0.11.1.dist-info/RECORD +0 -54
  30. /mapFolding/someAssemblyRequired/{toolboxNumba.py → toolkitNumba.py} +0 -0
  31. {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/entry_points.txt +0 -0
  32. {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/licenses/LICENSE +0 -0
  33. {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/top_level.txt +0 -0
mapFolding/theSSOT.py CHANGED
@@ -1,47 +1,16 @@
1
- """
2
- Single Source of Truth module for configuration, types, and computational state management.
3
-
4
- This module defines the core data structures, type definitions, and configuration settings used throughout the
5
- mapFolding package. It implements the Single Source of Truth (SSOT) principle to ensure consistency across the package's
6
- components.
7
-
8
- Key features:
9
- 1. The `ComputationState` dataclass, which encapsulates the state of the folding computation.
10
- 2. Unified type definitions for integers and arrays used in the computation.
11
- 3. Configuration settings for synthetic module generation and dispatching.
12
- 4. Path resolution and management for package resources and job output.
13
- 5. Dynamic dispatch functionality for algorithm implementations.
14
-
15
- The module differentiates between "the" identifiers (package defaults) and other identifiers to avoid namespace
16
- collisions when transforming algorithms.
17
- """
18
-
19
- from collections.abc import Callable
20
1
  from importlib import import_module as importlib_import_module
21
2
  from inspect import getfile as inspect_getfile
22
3
  from pathlib import Path
23
4
  from tomli import load as tomli_load
24
- from types import ModuleType
25
5
  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
- )
6
+
7
+ packageNamePACKAGING_HARDCODED = "mapFolding"
39
8
 
40
9
  # Evaluate When Packaging https://github.com/hunterhogan/mapFolding/issues/18
41
10
  try:
42
11
  packageNamePACKAGING: str = tomli_load(Path("../pyproject.toml").open('rb'))["project"]["name"]
43
12
  except Exception:
44
- packageNamePACKAGING = "mapFolding"
13
+ packageNamePACKAGING = packageNamePACKAGING_HARDCODED
45
14
 
46
15
  # Evaluate When Installing https://github.com/hunterhogan/mapFolding/issues/18
47
16
  def getPathPackageINSTALLING() -> Path:
@@ -50,219 +19,11 @@ def getPathPackageINSTALLING() -> Path:
50
19
  pathPackage = pathPackage.parent
51
20
  return pathPackage
52
21
 
53
- # I believe these values should be dynamically determined, so I have conspicuously marked them "HARDCODED"
54
- # and created downstream logic that assumes the values were dynamically determined.
55
- # Figure out dynamic flow control to synthesized modules https://github.com/hunterhogan/mapFolding/issues/4
56
- logicalPathModuleDispatcherHARDCODED: str = 'mapFolding.syntheticModules.numbaCount'
57
- callableDispatcherHARDCODED: str = 'doTheNeedful'
58
- concurrencyPackageHARDCODED = 'multiprocessing'
59
- # from mapFolding.someAssemblyRequired.toolboxNumba.theNumbaFlow
60
-
61
22
  # PackageSettings in theSSOT.py and immutability https://github.com/hunterhogan/mapFolding/issues/11
62
23
  @dataclasses.dataclass
63
24
  class PackageSettings:
64
- """
65
- Centralized configuration settings for the mapFolding package.
66
-
67
- This class implements the Single Source of Truth (SSOT) principle for package configuration, providing a consistent
68
- interface for accessing package settings, paths, and dispatch functions. The primary instance of this class, named
69
- `The`, is imported and used throughout the package to retrieve configuration values.
70
- """
71
-
72
- logicalPathModuleDispatcher: str | None = None
73
- """Logical import path to the module containing the dispatcher function."""
74
-
75
- callableDispatcher: str | None = None
76
- """Name of the function within the dispatcher module that will be called."""
77
-
78
- concurrencyPackage: str | None = None
79
- """Package to use for concurrent execution (e.g., 'multiprocessing', 'numba')."""
80
-
81
- # "Evaluate When Packaging" and "Evaluate When Installing" https://github.com/hunterhogan/mapFolding/issues/18
82
- dataclassIdentifier: str = dataclasses.field(default='ComputationState', metadata={'evaluateWhen': 'packaging'})
83
- """Name of the dataclass used to track computation state."""
84
-
85
- dataclassInstance: str = dataclasses.field(default='state', metadata={'evaluateWhen': 'packaging'})
86
- """Default variable name for instances of the computation state dataclass."""
87
-
88
- dataclassInstanceTaskDistributionSuffix: str = dataclasses.field(default='Parallel', metadata={'evaluateWhen': 'packaging'})
89
- """Suffix added to dataclassInstance for parallel task distribution."""
90
-
91
- dataclassModule: str = dataclasses.field(default='theSSOT', metadata={'evaluateWhen': 'packaging'})
92
- """Module containing the computation state dataclass definition."""
93
-
94
- datatypePackage: str = dataclasses.field(default='numpy', metadata={'evaluateWhen': 'packaging'})
95
- """Package providing the numeric data types used in computation."""
96
-
97
25
  fileExtension: str = dataclasses.field(default='.py', metadata={'evaluateWhen': 'installing'})
98
- """Default file extension for generated code files."""
99
-
100
26
  packageName: str = dataclasses.field(default = packageNamePACKAGING, metadata={'evaluateWhen': 'packaging'})
101
- """Name of this package, used for import paths and configuration."""
102
-
103
27
  pathPackage: Path = dataclasses.field(default_factory=getPathPackageINSTALLING, metadata={'evaluateWhen': 'installing'})
104
- """Absolute path to the installed package directory."""
105
-
106
- sourceAlgorithm: str = dataclasses.field(default='theDao', metadata={'evaluateWhen': 'packaging'})
107
- """Module containing the reference implementation of the algorithm."""
108
-
109
- sourceCallableDispatcher: str = dataclasses.field(default='doTheNeedful', metadata={'evaluateWhen': 'packaging'})
110
- """Name of the function that dispatches computation in the source algorithm."""
111
-
112
- sourceCallableInitialize: str = dataclasses.field(default='countInitialize', metadata={'evaluateWhen': 'packaging'})
113
- """Name of the function that initializes computation in the source algorithm."""
114
-
115
- sourceCallableParallel: str = dataclasses.field(default='countParallel', metadata={'evaluateWhen': 'packaging'})
116
- """Name of the function that performs parallel computation in the source algorithm."""
117
-
118
- sourceCallableSequential: str = dataclasses.field(default='countSequential', metadata={'evaluateWhen': 'packaging'})
119
- """Name of the function that performs sequential computation in the source algorithm."""
120
-
121
- sourceConcurrencyManagerIdentifier: str = dataclasses.field(default='submit', metadata={'evaluateWhen': 'packaging'})
122
- """Method name used to submit tasks to the concurrency manager."""
123
-
124
- sourceConcurrencyManagerNamespace: str = dataclasses.field(default='concurrencyManager', metadata={'evaluateWhen': 'packaging'})
125
- """Variable name used for the concurrency manager instance."""
126
-
127
- sourceConcurrencyPackage: str = dataclasses.field(default='multiprocessing', metadata={'evaluateWhen': 'packaging'})
128
- """Default package used for concurrency in the source algorithm."""
129
-
130
- dataclassInstanceTaskDistribution: str = dataclasses.field(default=None, metadata={'evaluateWhen': 'packaging'}) # pyright: ignore[reportAssignmentType]
131
- """Variable name for the parallel distribution instance of the computation state."""
132
-
133
- logicalPathModuleDataclass: str = dataclasses.field(default=None, metadata={'evaluateWhen': 'packaging'}) # pyright: ignore[reportAssignmentType]
134
- """Fully qualified import path to the module containing the computation state dataclass."""
135
-
136
- logicalPathModuleSourceAlgorithm: str = dataclasses.field(default=None, metadata={'evaluateWhen': 'packaging'}) # pyright: ignore[reportAssignmentType]
137
- """Fully qualified import path to the module containing the source algorithm."""
138
-
139
- @property
140
- def dispatcher(self) -> Callable[['ComputationState'], 'ComputationState']:
141
- """ _The_ callable that connects `countFolds` to the logic that does the work."""
142
- logicalPath: str = self.logicalPathModuleDispatcher or self.logicalPathModuleSourceAlgorithm
143
- identifier: str = self.callableDispatcher or self.sourceCallableDispatcher
144
- moduleImported: ModuleType = importlib_import_module(logicalPath)
145
- return getattr(moduleImported, identifier)
146
-
147
- def __post_init__(self) -> None:
148
- if self.dataclassInstanceTaskDistribution is None: # pyright: ignore[reportUnnecessaryComparison]
149
- self.dataclassInstanceTaskDistribution = self.dataclassInstance + self.dataclassInstanceTaskDistributionSuffix
150
-
151
- if self.logicalPathModuleDataclass is None: # pyright: ignore[reportUnnecessaryComparison]
152
- self.logicalPathModuleDataclass = '.'.join([self.packageName, self.dataclassModule])
153
- if self.logicalPathModuleSourceAlgorithm is None: # pyright: ignore[reportUnnecessaryComparison]
154
- self.logicalPathModuleSourceAlgorithm = '.'.join([self.packageName, self.sourceAlgorithm])
155
-
156
- The = PackageSettings(logicalPathModuleDispatcher=logicalPathModuleDispatcherHARDCODED, callableDispatcher=callableDispatcherHARDCODED, concurrencyPackage=concurrencyPackageHARDCODED)
157
-
158
- @dataclasses.dataclass
159
- class ComputationState:
160
- """
161
- Represents the complete state of a map folding computation.
162
-
163
- This dataclass encapsulates all the information required to compute the number of possible ways to fold a map,
164
- including the map dimensions, leaf connections, computation progress, and fold counting. It serves as the central
165
- data structure that flows through the entire computational algorithm.
166
-
167
- Fields are categorized into:
168
- 1. Input parameters (`mapShape`, `leavesTotal`, etc.).
169
- 2. Core computational structures (`connectionGraph`, etc.).
170
- 3. Tracking variables for the folding algorithm state.
171
- 4. Result accumulation fields (`foldsTotal`, `groupsOfFolds`).
172
- """
173
- # NOTE Python is anti-DRY, again, `DatatypeLeavesTotal` metadata needs to match the type
174
- mapShape: tuple[DatatypeLeavesTotal, ...] = dataclasses.field(init=True, metadata={'elementConstructor': 'DatatypeLeavesTotal'})
175
- """Dimensions of the map to be folded, as a tuple of integers."""
176
-
177
- leavesTotal: DatatypeLeavesTotal
178
- """Total number of leaves (unit squares) in the map, equal to the product of all dimensions."""
179
-
180
- taskDivisions: DatatypeLeavesTotal
181
- """Number of parallel tasks to divide the computation into. Zero means sequential computation."""
182
-
183
- concurrencyLimit: DatatypeElephino
184
- """Maximum number of concurrent processes to use during computation."""
185
-
186
- connectionGraph: Array3D = dataclasses.field(init=False, metadata={'dtype': Array3D.__args__[1].__args__[0]}) # pyright: ignore[reportUnknownMemberType, reportAttributeAccessIssue]
187
- """3D array encoding the connections between leaves in all dimensions."""
188
-
189
- dimensionsTotal: DatatypeLeavesTotal = dataclasses.field(init=False)
190
- """Total number of dimensions in the map shape."""
191
-
192
- # I am using `dataclasses.field` metadata and `typeAlias.__args__[1].__args__[0]` to make the code more DRY. https://github.com/hunterhogan/mapFolding/issues/9
193
- countDimensionsGapped: Array1DLeavesTotal = dataclasses.field(default=None, init=True, metadata={'dtype': Array1DLeavesTotal.__args__[1].__args__[0]}) # pyright: ignore[reportAssignmentType, reportAttributeAccessIssue, reportUnknownMemberType]
194
- """Tracks how many dimensions are gapped for each leaf."""
195
-
196
- dimensionsUnconstrained: DatatypeLeavesTotal = dataclasses.field(default=None, init=True) # pyright: ignore[reportAssignmentType, reportAttributeAccessIssue, reportUnknownMemberType]
197
- """Number of dimensions that are not constrained in the current folding state."""
198
-
199
- gapRangeStart: Array1DElephino = dataclasses.field(default=None, init=True, metadata={'dtype': Array1DElephino.__args__[1].__args__[0]}) # pyright: ignore[reportAssignmentType, reportAttributeAccessIssue, reportUnknownMemberType]
200
- """Starting index for the gap range for each leaf."""
201
-
202
- gapsWhere: Array1DLeavesTotal = dataclasses.field(default=None, init=True, metadata={'dtype': Array1DLeavesTotal.__args__[1].__args__[0]}) # pyright: ignore[reportAssignmentType, reportAttributeAccessIssue, reportUnknownMemberType]
203
- """Tracks where gaps occur in the folding pattern."""
204
-
205
- leafAbove: Array1DLeavesTotal = dataclasses.field(default=None, init=True, metadata={'dtype': Array1DLeavesTotal.__args__[1].__args__[0]}) # pyright: ignore[reportAssignmentType, reportAttributeAccessIssue, reportUnknownMemberType]
206
- """For each leaf, stores the index of the leaf above it in the folding pattern."""
207
-
208
- leafBelow: Array1DLeavesTotal = dataclasses.field(default=None, init=True, metadata={'dtype': Array1DLeavesTotal.__args__[1].__args__[0]}) # pyright: ignore[reportAssignmentType, reportAttributeAccessIssue, reportUnknownMemberType]
209
- """For each leaf, stores the index of the leaf below it in the folding pattern."""
210
-
211
- foldGroups: Array1DFoldsTotal = dataclasses.field(default=None, init=True, metadata={'dtype': Array1DFoldsTotal.__args__[1].__args__[0]}) # pyright: ignore[reportAssignmentType, reportAttributeAccessIssue, reportUnknownMemberType]
212
- """Accumulator for fold groups across parallel tasks."""
213
-
214
- foldsTotal: DatatypeFoldsTotal = DatatypeFoldsTotal(0)
215
- """The final computed total number of distinct folding patterns."""
216
-
217
- gap1ndex: DatatypeElephino = DatatypeElephino(0)
218
- """Current index into gaps array during algorithm execution."""
219
-
220
- gap1ndexCeiling: DatatypeElephino = DatatypeElephino(0)
221
- """Upper limit for gap index during the current algorithm phase."""
222
-
223
- groupsOfFolds: DatatypeFoldsTotal = dataclasses.field(default=DatatypeFoldsTotal(0), metadata={'theCountingIdentifier': True})
224
- """Accumulator for the number of fold groups found during computation."""
225
-
226
- indexDimension: DatatypeLeavesTotal = DatatypeLeavesTotal(0)
227
- """Current dimension being processed during algorithm execution."""
228
-
229
- indexLeaf: DatatypeLeavesTotal = DatatypeLeavesTotal(0)
230
- """Current leaf index during iteration."""
231
-
232
- indexMiniGap: DatatypeElephino = DatatypeElephino(0)
233
- """Index used when filtering common gaps."""
234
-
235
- leaf1ndex: DatatypeLeavesTotal = DatatypeLeavesTotal(1)
236
- """Active leaf being processed in the folding algorithm. Starts at 1, not 0."""
237
-
238
- leafConnectee: DatatypeLeavesTotal = DatatypeLeavesTotal(0)
239
- """Leaf that is being connected to the active leaf."""
240
-
241
- taskIndex: DatatypeLeavesTotal = DatatypeLeavesTotal(0)
242
- """Index of the current parallel task when using task divisions."""
243
-
244
- def __post_init__(self) -> None:
245
- from mapFolding.beDRY import getConnectionGraph, makeDataContainer
246
- self.dimensionsTotal = DatatypeLeavesTotal(len(self.mapShape))
247
- leavesTotalAsInt = int(self.leavesTotal)
248
- self.connectionGraph = getConnectionGraph(self.mapShape, leavesTotalAsInt, self.__dataclass_fields__['connectionGraph'].metadata['dtype'])
249
-
250
- if self.dimensionsUnconstrained is None: self.dimensionsUnconstrained = DatatypeLeavesTotal(int(self.dimensionsTotal)) # pyright: ignore[reportUnnecessaryComparison]
251
-
252
- if self.foldGroups is None: # pyright: ignore[reportUnnecessaryComparison]
253
- self.foldGroups = makeDataContainer(max(2, int(self.taskDivisions) + 1), self.__dataclass_fields__['foldGroups'].metadata['dtype'])
254
- self.foldGroups[-1] = self.leavesTotal
255
-
256
- # Dataclasses, Default factories, and arguments in `ComputationState` https://github.com/hunterhogan/mapFolding/issues/12
257
- if self.gapsWhere is None: self.gapsWhere = makeDataContainer(leavesTotalAsInt * leavesTotalAsInt + 1, self.__dataclass_fields__['gapsWhere'].metadata['dtype']) # pyright: ignore[reportUnnecessaryComparison]
258
-
259
- if self.countDimensionsGapped is None: self.countDimensionsGapped = makeDataContainer(leavesTotalAsInt + 1, self.__dataclass_fields__['countDimensionsGapped'].metadata['dtype']) # pyright: ignore[reportUnnecessaryComparison]
260
- if self.gapRangeStart is None: self.gapRangeStart = makeDataContainer(leavesTotalAsInt + 1, self.__dataclass_fields__['gapRangeStart'].metadata['dtype']) # pyright: ignore[reportUnnecessaryComparison]
261
- if self.leafAbove is None: self.leafAbove = makeDataContainer(leavesTotalAsInt + 1, self.__dataclass_fields__['leafAbove'].metadata['dtype']) # pyright: ignore[reportUnnecessaryComparison]
262
- if self.leafBelow is None: self.leafBelow = makeDataContainer(leavesTotalAsInt + 1, self.__dataclass_fields__['leafBelow'].metadata['dtype']) # pyright: ignore[reportUnnecessaryComparison]
263
-
264
- # Automatic, or not, calculation in dataclass `ComputationState` https://github.com/hunterhogan/mapFolding/issues/14
265
- def getFoldsTotal(self) -> None:
266
- self.foldsTotal = DatatypeFoldsTotal(self.foldGroups[0:-1].sum() * self.leavesTotal)
267
28
 
268
- class raiseIfNoneGitHubIssueNumber3(Exception): pass
29
+ packageSettings = PackageSettings()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapFolding
3
- Version: 0.11.1
3
+ Version: 0.11.2
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
@@ -67,12 +67,6 @@ Dynamic: license-file
67
67
  - You're interested in solving mathematical puzzles through code
68
68
  - You're learning about Numba and advanced Python optimization
69
69
 
70
- **This package is NOT for you if:**
71
-
72
- - You're looking for a general-purpose folding simulation tool
73
- - You need commercial-ready mapping software
74
- - You want simple visualization of folding patterns
75
-
76
70
  ## What Does This Package Actually Do?
77
71
 
78
72
  `mapFolding` solves a specific mathematical problem: counting the number of distinct ways to fold a rectangular map. While this may sound niche, it's a fascinating computational challenge that demonstrates:
@@ -87,7 +81,7 @@ The package has achieved new computational records, including first-ever calcula
87
81
  ```python
88
82
  # Compute the number of ways to fold a 5×5 grid:
89
83
  from mapFolding import oeisIDfor_n
90
- foldsTotal = oeisIDfor_n('A001418', 5) # Returns 186,086,600
84
+ foldsTotal = oeisIDfor_n('A001418', 5)
91
85
  ```
92
86
 
93
87
  ## Key Benefits for Computational Enthusiasts
@@ -178,4 +172,18 @@ If you've read this far and are intrigued by computational puzzles, algorithm op
178
172
 
179
173
  Whether you use it to solve map folding problems or to study its optimization techniques, `mapFolding` offers a unique window into advanced Python programming approaches.
180
174
 
175
+ ## My recovery
176
+
177
+ [![Static Badge](https://img.shields.io/badge/2011_August-Homeless_since-blue?style=flat)](https://HunterThinks.com/support)
178
+ [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UC3Gx7kz61009NbhpRtPP7tw)](https://www.youtube.com/@HunterHogan)
179
+
180
+ ## How to code
181
+
182
+ Coding One Step at a Time:
183
+
184
+ 0. WRITE CODE.
185
+ 1. Don't write stupid code that's hard to revise.
186
+ 2. Write good code.
187
+ 3. When revising, write better code.
188
+
181
189
  [![CC-BY-NC-4.0](https://github.com/hunterhogan/mapFolding/blob/main/CC-BY-NC-4.0.svg)](https://creativecommons.org/licenses/by-nc/4.0/)
@@ -0,0 +1,56 @@
1
+ mapFolding/__init__.py,sha256=COcJ0Fmrh_d2cDpDjsjEJTAI7kFOxuf2Sw3n5ozADD0,2288
2
+ mapFolding/basecamp.py,sha256=77Bg9W2rRAuYxBKKVvKBw5Ea1HYrPetroSwj4kPT7Wg,8253
3
+ mapFolding/beDRY.py,sha256=J4JFNvJdTz1J1P578DdniOOo5fewpxb5WERuNu19n24,22920
4
+ mapFolding/daoOfMapFolding.py,sha256=ncTIiBfTsM8SNVx9qefZ0bBcBtviWLSk4iPv3Z9nGiE,5442
5
+ mapFolding/dataBaskets.py,sha256=crfmmYJGeJ7QLCzuYi4rtVOtzCDRoOiTNfPfHbc6Foo,5620
6
+ mapFolding/datatypes.py,sha256=-TdXqAlEWEwUP_VUb9-X5pvaBBedbZOQbBuu5j1ZoTA,962
7
+ mapFolding/filesystemToolkit.py,sha256=O9VQ0tSXlrGUhU3qN7uWxOTAZfuQb3fcRkTrfRZrGXo,9854
8
+ mapFolding/infoBooth.py,sha256=IPEzgb90p30i2mmPsdZ1VHYGmf-xPg_bpoKJDdDEn-k,5586
9
+ mapFolding/oeis.py,sha256=5vNuZSq--Q-rFXtDvLMuoNhh5yLqFZugvXNxy4fs02U,17064
10
+ mapFolding/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ mapFolding/theDao.py,sha256=P-a4xIGwI_40fMWp_ypHRWa6JIFchK59tdTrXiYqTHk,10017
12
+ mapFolding/theSSOT.py,sha256=BVqgXki5qY-d1Kf-AnO2-KeMbMZx805Y0hh8qM7BcxE,1297
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=niqbnxgtHk-eR-ph7FBw2S74uEQmx6Xmsh8CPx09q4o,10130
26
+ mapFolding/someAssemblyRequired/Z0Z_makeSomeModules.py,sha256=8OauVDHmS05kYSMgBgvtxlq85nhXhFEtsFN2j1HLhZA,29786
27
+ mapFolding/someAssemblyRequired/__init__.py,sha256=l9KaHEuPwL5WKWHhvaF8LiJshyYcu-3LZTVvWTX804U,3591
28
+ mapFolding/someAssemblyRequired/_toolIfThis.py,sha256=0S0t-BEuFPLw0LDvFIRF3-5yvjgJxkBRTrbOgjSlwrk,3165
29
+ mapFolding/someAssemblyRequired/_toolkitContainers.py,sha256=SSS5kieMgm-vSHRGfUOvxcAWaWGytN9uzaBb0AvF-SM,16086
30
+ mapFolding/someAssemblyRequired/getLLVMforNoReason.py,sha256=9RPU6vK_eUg64GtVFI_nZnvUryXw8gfHJs9NyDYHIvg,2745
31
+ mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py,sha256=zWPmosEMt94zl00hDMZ-1t1pkROg8yYAktw_aKvAPjA,13978
32
+ mapFolding/someAssemblyRequired/synthesizeNumbaJob.py,sha256=64TZh-AfaToTU-UM_0_pz5DzsvxcnVuUl6j9C1S3zGM,15740
33
+ mapFolding/someAssemblyRequired/toolkitNumba.py,sha256=LZdosArlkNzFUwy8BMhswivW5xfhREAPyx2ApNOuse8,8961
34
+ mapFolding/someAssemblyRequired/transformationTools.py,sha256=hNfYXQQMPsNab_oHdx4G3E5cXYp5-vZaG4LTWtnuwFk,19073
35
+ mapFolding/syntheticModules/__init__.py,sha256=evVFqhCGa-WZKDiLcnQWjs-Bj34eRnfSLqz_d7dFYZY,83
36
+ mapFolding/syntheticModules/countParallel.py,sha256=OK_IB9w4yy9MMAiGvkei5ezPm_00v2nYjPrQZ_IlELg,7733
37
+ mapFolding/syntheticModules/daoOfMapFolding.py,sha256=cfWPABtXyCxJ0BwPI7rhfLh_2UYV_XKAL8lJ4GLNXaQ,5896
38
+ mapFolding/syntheticModules/dataPacking.py,sha256=m_eOZ7sMXIQ9jY5EvC3qgitQTY60n6rksy0ACMJOIC8,2292
39
+ mapFolding/syntheticModules/initializeCount.py,sha256=nWSlJMMfIM3DvZxMn6ISQusUJqRYAjKQyLF5hwLEdBQ,3119
40
+ mapFolding/syntheticModules/numbaCount.py,sha256=HOuCGqykFvYwa-WPkj1qGsZOzJV3ZYxeoZZmIUFY_Wo,13503
41
+ mapFolding/syntheticModules/theorem2.py,sha256=9jrbZNNX4BWYZW1S0JjvRY2k7RU7I1RNUMV7JdCt1ZY,3017
42
+ mapFolding/syntheticModules/theorem2Numba.py,sha256=-cKjNyxgUMFhEyFVs0VJ7hw4LfrV0WSNK5tPYbQ1oNU,3369
43
+ mapFolding/syntheticModules/theorem2Trimmed.py,sha256=DHW3NxBdtABQYBKm2WRvfQ5kzc2_UwGI2h4ePuYEJoM,2685
44
+ mapfolding-0.11.2.dist-info/licenses/LICENSE,sha256=NxH5Y8BdC-gNU-WSMwim3uMbID2iNDXJz7fHtuTdXhk,19346
45
+ tests/__init__.py,sha256=5VhHf0JJ2_DSh58zJ0rR5UkpoCon-0IkdljspTCzZ04,1950
46
+ tests/conftest.py,sha256=7zoNA5PLIwm8VY2dLVaZqVDwWG1HQ29IuHTQoAScRF0,14138
47
+ tests/test_computations.py,sha256=ADlT9VDYHyi_QV7XIt2qrHPZkn6O8N7dZ3w4aRZDgFE,6524
48
+ tests/test_filesystem.py,sha256=imlcetleJc4G9pDZTgS1j8UAs7ADbRxXVuNPecJAvqc,2964
49
+ tests/test_oeis.py,sha256=uxvwmgbnylSDdsVJfuAT0LuYLbIVFwSgdLxHm-xUGBM,5043
50
+ tests/test_other.py,sha256=DT7YE82YCHrSjdxhpY4UJnXmZvDm1b4e1QpZV3LyzcM,3747
51
+ tests/test_tasks.py,sha256=-Y6BILdUpWhfxccqiTFt1h_eBfgK8-BLluGOZdaIq8k,2778
52
+ mapfolding-0.11.2.dist-info/METADATA,sha256=VEQE8TJb3nCVzn9JJI6U_0rgQtrmfdHf7YupwPTexcE,7796
53
+ mapfolding-0.11.2.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
54
+ mapfolding-0.11.2.dist-info/entry_points.txt,sha256=F3OUeZR1XDTpoH7k3wXuRb3KF_kXTTeYhu5AGK1SiOQ,146
55
+ mapfolding-0.11.2.dist-info/top_level.txt,sha256=1gP2vFaqPwHujGwb3UjtMlLEGN-943VSYFR7V4gDqW8,17
56
+ mapfolding-0.11.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
tests/conftest.py CHANGED
@@ -56,8 +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 The
60
- from mapFolding.beDRY import getLeavesTotal, validateListDimensions, makeDataContainer
59
+ from mapFolding import getLeavesTotal, validateListDimensions, makeDataContainer, The
61
60
  from mapFolding.oeis import oeisIDsImplemented, settingsOEIS
62
61
  from mapFolding.someAssemblyRequired import importLogicalPath2Callable, RecipeSynthesizeFlow
63
62
  from pathlib import Path, PurePosixPath
@@ -246,27 +245,26 @@ def useThisDispatcher() -> Generator[Callable[..., None], Any, None]:
246
245
  Returns
247
246
  A context manager for patching the dispatcher
248
247
  """
249
- import mapFolding.theSSOT as theSSOT
250
- from mapFolding.theSSOT import The
248
+ import mapFolding.infoBooth as infoBooth
251
249
 
252
250
  # Store original property method
253
- original_dispatcher_property = theSSOT.PackageSettings.dispatcher
251
+ original_dispatcher_property = infoBooth.PackageInformation.dispatcher
254
252
 
255
253
  def patchDispatcher(callableTarget: Callable[..., Any]) -> None:
256
254
  """Patch the dispatcher property to return the target callable."""
257
255
  # Create a new property that returns the target callable
258
- def patched_dispatcher(self: theSSOT.PackageSettings) -> Callable[..., Any]:
256
+ def patched_dispatcher(self: infoBooth.PackageInformation) -> Callable[..., Any]:
259
257
  def wrapper(state: Any) -> Any:
260
258
  return callableTarget(state)
261
259
  return wrapper
262
260
 
263
261
  # Replace the property with our patched version
264
- theSSOT.PackageSettings.dispatcher = property(patched_dispatcher) # type: ignore
262
+ infoBooth.PackageInformation.dispatcher = property(patched_dispatcher) # type: ignore
265
263
 
266
264
  yield patchDispatcher
267
265
 
268
266
  # Restore the original property
269
- theSSOT.PackageSettings.dispatcher = original_dispatcher_property # type: ignore
267
+ infoBooth.PackageInformation.dispatcher = original_dispatcher_property # type: ignore
270
268
 
271
269
  def getAlgorithmDispatcher() -> Callable[..., Any]:
272
270
  moduleImported: ModuleType = importlib.import_module(The.logicalPathModuleSourceAlgorithm)
@@ -282,7 +280,7 @@ def useAlgorithmSourceDispatcher(useThisDispatcher: Callable[..., Any]) -> Gener
282
280
  @pytest.fixture
283
281
  def syntheticDispatcherFixture(useThisDispatcher: Callable[..., Any], pathTmpTesting: Path) -> Callable[..., Any]:
284
282
  """Generate synthetic Numba-optimized dispatcher module and patch the dispatcher"""
285
- from mapFolding.someAssemblyRequired.toolboxNumba import makeNumbaFlow
283
+ from mapFolding.someAssemblyRequired.toolkitNumba import makeNumbaFlow
286
284
 
287
285
  TESTINGrecipeFlow = RecipeSynthesizeFlow(
288
286
  pathPackage=PurePosixPath(pathTmpTesting.absolute()),
@@ -121,7 +121,7 @@ def test_syntheticSequential(syntheticDispatcherFixture: None, mapShapeTestCount
121
121
 
122
122
  @pytest.mark.parametrize('pathFilenameTmpTesting', ['.py'], indirect=True)
123
123
  def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFilenameTmpTesting: Path) -> None:
124
- from mapFolding.someAssemblyRequired.toolboxNumba import SpicesJobNumba
124
+ from mapFolding.someAssemblyRequired.toolkitNumba import SpicesJobNumba
125
125
  from mapFolding.someAssemblyRequired.synthesizeNumbaJob import makeJobNumba
126
126
  state = makeInitializedComputationState(oneTestCuzTestsOverwritingTests)
127
127
 
tests/test_filesystem.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from contextlib import redirect_stdout
2
- from mapFolding import validateListDimensions, getPathRootJobDEFAULT, getPathFilenameFoldsTotal, saveFoldsTotal
3
- from mapFolding.toolboxFilesystem import getFilenameFoldsTotal
2
+ from mapFolding import validateListDimensions, getPathRootJobDEFAULT, getPathFilenameFoldsTotal, saveFoldsTotal, getFilenameFoldsTotal
4
3
  from pathlib import Path
5
4
  import io
6
5
  import pytest
tests/test_other.py CHANGED
@@ -1,5 +1,5 @@
1
1
  from collections.abc import Callable
2
- from mapFolding.beDRY import getLeavesTotal, setProcessorLimit, validateListDimensions
2
+ from mapFolding import getLeavesTotal, setProcessorLimit, validateListDimensions
3
3
  from tests.conftest import standardizedEqualToCallableReturn
4
4
  from typing import Any, Literal
5
5
  from Z0Z_tools import intInnit
tests/test_tasks.py CHANGED
@@ -1,7 +1,5 @@
1
1
  from collections.abc import Callable
2
- from mapFolding import countFolds
3
- from mapFolding.beDRY import getTaskDivisions, setProcessorLimit, validateListDimensions, getLeavesTotal
4
- from mapFolding.oeis import getFoldsTotalKnown
2
+ from mapFolding import countFolds, getTaskDivisions, setProcessorLimit, validateListDimensions, getLeavesTotal, getFoldsTotalKnown
5
3
  from tests.conftest import standardizedEqualToCallableReturn
6
4
  from typing import Literal
7
5
  from Z0Z_tools.pytestForYourUse import PytestFor_defineConcurrencyLimit
@@ -1,54 +0,0 @@
1
- mapFolding/__init__.py,sha256=P2guQYFN19PSAl8yd9NQjIapMvZnZlasPOvKJ1KUGvA,4883
2
- mapFolding/basecamp.py,sha256=hs7hlTmbX7KTjI_eIRVU4xn7HR4l448SIpHk1cKDwRk,8071
3
- mapFolding/beDRY.py,sha256=JQ7T9v4aKzweGjvpzyghyq4N9l3Wf9HZco_K_DWoiW0,15368
4
- mapFolding/daoOfMapFolding.py,sha256=ncTIiBfTsM8SNVx9qefZ0bBcBtviWLSk4iPv3Z9nGiE,5442
5
- mapFolding/dataBaskets.py,sha256=80ALoRqaOfNEgz8QTdDJPsyVBnm8MkWLtRHD3DPPoRw,5073
6
- mapFolding/datatypes.py,sha256=-TdXqAlEWEwUP_VUb9-X5pvaBBedbZOQbBuu5j1ZoTA,962
7
- mapFolding/oeis.py,sha256=zHk5Mygd7qpDj1NYXsvY_l3e8jg3tHDQ1Cpt6NrWiuc,17019
8
- mapFolding/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- mapFolding/theDao.py,sha256=kc3rzTX3yts0PxgPCXFbgWvaqsBexsiU5ib2pzpvID0,10019
10
- mapFolding/theSSOT.py,sha256=rbv8esQeBG6uLWpFZu_ncMA4zIuQG3lj4FZNzC_6JGI,16138
11
- mapFolding/toolboxFilesystem.py,sha256=kVZoU-NBvfYSvI4R8mEpMXRUZee-1JV0fjtMFWPhk8Y,9818
12
- mapFolding/reference/__init__.py,sha256=GKcSgYE49NcTISx-JZbELXyq-eRkMeTL5g4DXInWFw0,2206
13
- mapFolding/reference/flattened.py,sha256=QK1xG9SllqCoi68e86Hyl9d9ATUAAFNpTQI-3zmcp5I,16072
14
- mapFolding/reference/hunterNumba.py,sha256=iLfyqwGdAh6c5GbapnKsWhAsNsR3O-fyGGHAdohluLw,7258
15
- mapFolding/reference/irvineJavaPort.py,sha256=UEfIX4QbPLl5jnyfYIyX5YRR3_rYvPUikK8jLehsFko,4076
16
- mapFolding/reference/jaxCount.py,sha256=TuDNKOnyhQfuixKmIxO9Algv7dvy7KMGhgsV3h96FGE,14853
17
- mapFolding/reference/lunnonNumpy.py,sha256=mMgrgbrBpe4nmo72ThEI-MGH0OwEHmfMPczSXHp2qKo,4357
18
- mapFolding/reference/lunnonWhile.py,sha256=ZL8GAQtPs5nJZSgoDl5USrLSS_zs03y98y1Z9E4jOmQ,3799
19
- mapFolding/reference/rotatedEntryPoint.py,sha256=5ughpKUT2JQhoAKgoDUdYNjgWQYPGV8v-7dWEAdDmfE,10274
20
- mapFolding/reference/total_countPlus1vsPlusN.py,sha256=yJZAVLVdoXqHag2_N6_6CT-Q6HXBgRro-eny93-Rlpw,9307
21
- mapFolding/reference/jobsCompleted/__init__.py,sha256=TU93ZGUW1xEkT6d9mQFn_rp5DvRy0ZslEB2Q6MF5ZDc,2596
22
- mapFolding/reference/jobsCompleted/[2x19]/p2x19.py,sha256=_tvYtfzMWVo2VtUbIAieoscb4N8FFflgTdW4-ljBUuA,19626
23
- mapFolding/reference/jobsCompleted/p2x19/p2x19.py,sha256=eZEw4Me4ocTt6VXoK2-Sbd5SowZtxRIbN9dZmc7OCVg,6395
24
- mapFolding/someAssemblyRequired/RecipeJob.py,sha256=6RD4F4Yde7K-Rz0F4IokQ62BVzRSx4vCCYY4H-Dfug4,10190
25
- mapFolding/someAssemblyRequired/Z0Z_makeSomeModules.py,sha256=Ss9YlFAAodsydiYWz9TrcTneeYn_IUR2iQfEPjFf3IY,15805
26
- mapFolding/someAssemblyRequired/__init__.py,sha256=p2mbSsdEefBu0Hnwuis91cnSr0i49ZV9_bhfncGLxls,3571
27
- mapFolding/someAssemblyRequired/_toolIfThis.py,sha256=Ey6byfbpzRmgrnuOVIA9M068Lo7S1Jk6wzNgBMPci3A,3140
28
- mapFolding/someAssemblyRequired/_toolboxContainers.py,sha256=DZDFfCcRsCY0wFlkoZ9l8Ozw7bsT5OA3qMcG2KnABGI,16003
29
- mapFolding/someAssemblyRequired/getLLVMforNoReason.py,sha256=9RPU6vK_eUg64GtVFI_nZnvUryXw8gfHJs9NyDYHIvg,2745
30
- mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py,sha256=zZFfHhNG0VWaCigeHID-eAWQBRbYmo_59JycdstxJTc,13784
31
- mapFolding/someAssemblyRequired/synthesizeNumbaJob.py,sha256=4ZwOQA4FWrILYe5eiawTZgeTiJ7RRUUCpI0Th5Mezso,15668
32
- mapFolding/someAssemblyRequired/toolboxNumba.py,sha256=LZdosArlkNzFUwy8BMhswivW5xfhREAPyx2ApNOuse8,8961
33
- mapFolding/someAssemblyRequired/transformationTools.py,sha256=o4gORDvDuTnTPofeDLwfZItW5MFJljNcHagVprJeBU4,18966
34
- mapFolding/syntheticModules/__init__.py,sha256=evVFqhCGa-WZKDiLcnQWjs-Bj34eRnfSLqz_d7dFYZY,83
35
- mapFolding/syntheticModules/daoOfMapFolding.py,sha256=cfWPABtXyCxJ0BwPI7rhfLh_2UYV_XKAL8lJ4GLNXaQ,5896
36
- mapFolding/syntheticModules/dataPacking.py,sha256=J4WLJzQTOAm2d8itzWWSixTUcCGQl4KuEfqrzkb2tJQ,2294
37
- mapFolding/syntheticModules/initializeCount.py,sha256=nWSlJMMfIM3DvZxMn6ISQusUJqRYAjKQyLF5hwLEdBQ,3119
38
- mapFolding/syntheticModules/numbaCount.py,sha256=zM-bp07c9tEDdvidwzZ_bJTd0JC0VUkYEEiHG--P1tQ,15525
39
- mapFolding/syntheticModules/theorem2.py,sha256=9jrbZNNX4BWYZW1S0JjvRY2k7RU7I1RNUMV7JdCt1ZY,3017
40
- mapFolding/syntheticModules/theorem2Numba.py,sha256=-cKjNyxgUMFhEyFVs0VJ7hw4LfrV0WSNK5tPYbQ1oNU,3369
41
- mapFolding/syntheticModules/theorem2Trimmed.py,sha256=DHW3NxBdtABQYBKm2WRvfQ5kzc2_UwGI2h4ePuYEJoM,2685
42
- mapfolding-0.11.1.dist-info/licenses/LICENSE,sha256=NxH5Y8BdC-gNU-WSMwim3uMbID2iNDXJz7fHtuTdXhk,19346
43
- tests/__init__.py,sha256=5VhHf0JJ2_DSh58zJ0rR5UkpoCon-0IkdljspTCzZ04,1950
44
- tests/conftest.py,sha256=x8zMZQyTss3sn0GwHm_TSRwD9_LVlR8l_qF8r43Vxl4,14178
45
- tests/test_computations.py,sha256=5sg1PpSp6aeOrXZeO5NwWK5ipPAe49wVKC2J7yT5MFg,6524
46
- tests/test_filesystem.py,sha256=T2DkjBoI3lW6tCxd5BilPmUFrVukNKLjOOZVZxLM560,3004
47
- tests/test_oeis.py,sha256=uxvwmgbnylSDdsVJfuAT0LuYLbIVFwSgdLxHm-xUGBM,5043
48
- tests/test_other.py,sha256=UMlK4JPInalpOZuPvTnUrgXWCJOxAw-OsPs6CxMR254,3753
49
- tests/test_tasks.py,sha256=tOQc4uomKXGwWnENfbcThaVa1XofwXNCkGZbg4yS6VI,2833
50
- mapfolding-0.11.1.dist-info/METADATA,sha256=z1Z2MfDiXFSxbortwiHbjCex9X3zD9RvC7qWYs4l50g,7560
51
- mapfolding-0.11.1.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
52
- mapfolding-0.11.1.dist-info/entry_points.txt,sha256=F3OUeZR1XDTpoH7k3wXuRb3KF_kXTTeYhu5AGK1SiOQ,146
53
- mapfolding-0.11.1.dist-info/top_level.txt,sha256=1gP2vFaqPwHujGwb3UjtMlLEGN-943VSYFR7V4gDqW8,17
54
- mapfolding-0.11.1.dist-info/RECORD,,