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.
- mapFolding/__init__.py +18 -58
- mapFolding/basecamp.py +13 -10
- mapFolding/beDRY.py +113 -2
- mapFolding/dataBaskets.py +24 -2
- mapFolding/{toolboxFilesystem.py → filesystemToolkit.py} +3 -3
- mapFolding/infoBooth.py +96 -0
- mapFolding/oeis.py +3 -2
- mapFolding/someAssemblyRequired/RecipeJob.py +3 -4
- mapFolding/someAssemblyRequired/Z0Z_makeSomeModules.py +182 -17
- mapFolding/someAssemblyRequired/__init__.py +3 -3
- mapFolding/someAssemblyRequired/_toolIfThis.py +5 -5
- mapFolding/someAssemblyRequired/{_toolboxContainers.py → _toolkitContainers.py} +6 -7
- mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +8 -7
- mapFolding/someAssemblyRequired/synthesizeNumbaJob.py +3 -2
- mapFolding/someAssemblyRequired/transformationTools.py +11 -10
- mapFolding/syntheticModules/countParallel.py +98 -0
- mapFolding/syntheticModules/dataPacking.py +1 -1
- mapFolding/syntheticModules/numbaCount.py +189 -188
- mapFolding/theDao.py +1 -1
- mapFolding/theSSOT.py +4 -243
- {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/METADATA +16 -8
- mapfolding-0.11.2.dist-info/RECORD +56 -0
- {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/WHEEL +1 -1
- tests/conftest.py +7 -9
- tests/test_computations.py +1 -1
- tests/test_filesystem.py +1 -2
- tests/test_other.py +1 -1
- tests/test_tasks.py +1 -3
- mapfolding-0.11.1.dist-info/RECORD +0 -54
- /mapFolding/someAssemblyRequired/{toolboxNumba.py → toolkitNumba.py} +0 -0
- {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/entry_points.txt +0 -0
- {mapfolding-0.11.1.dist-info → mapfolding-0.11.2.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
|
|
27
|
-
|
|
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 =
|
|
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
|
-
|
|
29
|
+
packageSettings = PackageSettings()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mapFolding
|
|
3
|
-
Version: 0.11.
|
|
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)
|
|
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
|
+
[](https://HunterThinks.com/support)
|
|
178
|
+
[](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
|
[](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,,
|
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.
|
|
250
|
-
from mapFolding.theSSOT import The
|
|
248
|
+
import mapFolding.infoBooth as infoBooth
|
|
251
249
|
|
|
252
250
|
# Store original property method
|
|
253
|
-
original_dispatcher_property =
|
|
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:
|
|
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
|
-
|
|
262
|
+
infoBooth.PackageInformation.dispatcher = property(patched_dispatcher) # type: ignore
|
|
265
263
|
|
|
266
264
|
yield patchDispatcher
|
|
267
265
|
|
|
268
266
|
# Restore the original property
|
|
269
|
-
|
|
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.
|
|
283
|
+
from mapFolding.someAssemblyRequired.toolkitNumba import makeNumbaFlow
|
|
286
284
|
|
|
287
285
|
TESTINGrecipeFlow = RecipeSynthesizeFlow(
|
|
288
286
|
pathPackage=PurePosixPath(pathTmpTesting.absolute()),
|
tests/test_computations.py
CHANGED
|
@@ -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.
|
|
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
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|