mapFolding 0.13.1__py3-none-any.whl → 0.14.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. mapFolding/_oeisFormulas/A000136.py +4 -0
  2. mapFolding/_oeisFormulas/A000560.py +4 -0
  3. mapFolding/_oeisFormulas/A000682.py +17 -0
  4. mapFolding/_oeisFormulas/A005315.py +4 -0
  5. mapFolding/_oeisFormulas/A005316.py +10 -0
  6. mapFolding/_oeisFormulas/A223094.py +7 -0
  7. mapFolding/_oeisFormulas/A259702.py +4 -0
  8. mapFolding/_oeisFormulas/A301620.py +6 -0
  9. mapFolding/_oeisFormulas/Z0Z_aOFn.py +19 -0
  10. mapFolding/_oeisFormulas/Z0Z_oeisMeanders.py +53 -0
  11. mapFolding/_oeisFormulas/__init__.py +1 -0
  12. mapFolding/_oeisFormulas/matrixMeanders.py +65 -0
  13. mapFolding/_oeisFormulas/matrixMeandersAnnex.py +84 -0
  14. mapFolding/_theSSOT.py +68 -26
  15. mapFolding/basecamp.py +2 -2
  16. mapFolding/beDRY.py +1 -1
  17. mapFolding/oeis.py +56 -167
  18. mapFolding/reference/A005316JavaPort.py +134 -0
  19. mapFolding/reference/A005316imperative.py +101 -0
  20. mapFolding/reference/A005316intOptimized.py +122 -0
  21. mapFolding/reference/A005316optimized128bit.py +79 -0
  22. mapFolding/reference/A005316primitiveOptimized.py +97 -0
  23. mapFolding/reference/A005316redis.py +118 -0
  24. mapFolding/reference/A005316write2disk.py +169 -0
  25. mapFolding/reference/irvineJavaPort.py +4 -8
  26. mapFolding/reference/matrixMeandersBaseline.py +65 -0
  27. mapFolding/reference/matrixMeandersBaselineAnnex.py +84 -0
  28. mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +45 -17
  29. mapFolding/tests/conftest.py +13 -13
  30. mapFolding/tests/test_computations.py +4 -4
  31. mapFolding/tests/test_oeis.py +7 -14
  32. mapfolding-0.14.0.dist-info/METADATA +78 -0
  33. {mapfolding-0.13.1.dist-info → mapfolding-0.14.0.dist-info}/RECORD +37 -15
  34. mapfolding-0.13.1.dist-info/METADATA +0 -154
  35. {mapfolding-0.13.1.dist-info → mapfolding-0.14.0.dist-info}/WHEEL +0 -0
  36. {mapfolding-0.13.1.dist-info → mapfolding-0.14.0.dist-info}/entry_points.txt +0 -0
  37. {mapfolding-0.13.1.dist-info → mapfolding-0.14.0.dist-info}/licenses/LICENSE +0 -0
  38. {mapfolding-0.13.1.dist-info → mapfolding-0.14.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,84 @@
1
+ from typing import NamedTuple
2
+ import sys
3
+
4
+ class limitLocators(NamedTuple):
5
+ curveLocationsMAXIMUM: int
6
+ bifurcationEvenLocator: int
7
+ bifurcationOddLocator: int
8
+
9
+ curveMaximum: dict[int, limitLocators] = {
10
+ 0: limitLocators(16, 0x2a, 0x15),
11
+ 1: limitLocators(64, 0xaa, 0x55),
12
+ 2: limitLocators(256, 0x2aa, 0x155),
13
+ 3: limitLocators(1024, 0xaaa, 0x555),
14
+ 4: limitLocators(4096, 0x2aaa, 0x1555),
15
+ 5: limitLocators(16384, 0xaaaa, 0x5555),
16
+ 6: limitLocators(65536, 0x2aaaa, 0x15555),
17
+ 7: limitLocators(262144, 0xaaaaa, 0x55555),
18
+ 8: limitLocators(1048576, 0x2aaaaa, 0x155555),
19
+ 9: limitLocators(4194304, 0xaaaaaa, 0x555555),
20
+ 10: limitLocators(16777216, 0x2aaaaaa, 0x1555555),
21
+ 11: limitLocators(67108864, 0xaaaaaaa, 0x5555555),
22
+ 12: limitLocators(268435456, 0x2aaaaaaa, 0x15555555),
23
+ 13: limitLocators(1073741824, 0xaaaaaaaa, 0x55555555),
24
+ 14: limitLocators(4294967296, 0x2aaaaaaaa, 0x155555555),
25
+ 15: limitLocators(17179869184, 0xaaaaaaaaa, 0x555555555),
26
+ 16: limitLocators(68719476736, 0x2aaaaaaaaa, 0x1555555555),
27
+ 17: limitLocators(274877906944, 0xaaaaaaaaaa, 0x5555555555),
28
+ 18: limitLocators(1099511627776, 0x2aaaaaaaaaa, 0x15555555555),
29
+ 19: limitLocators(4398046511104, 0xaaaaaaaaaaa, 0x55555555555),
30
+ 20: limitLocators(17592186044416, 0x2aaaaaaaaaaa, 0x155555555555),
31
+ 21: limitLocators(70368744177664, 0xaaaaaaaaaaaa, 0x555555555555),
32
+ 22: limitLocators(281474976710656, 0x2aaaaaaaaaaaa, 0x1555555555555),
33
+ 23: limitLocators(1125899906842624, 0xaaaaaaaaaaaaa, 0x5555555555555),
34
+ 24: limitLocators(4503599627370496, 0x2aaaaaaaaaaaaa, 0x15555555555555),
35
+ 25: limitLocators(18014398509481984, 0xaaaaaaaaaaaaaa, 0x55555555555555),
36
+ 26: limitLocators(72057594037927936, 0x2aaaaaaaaaaaaaa, 0x155555555555555),
37
+ 27: limitLocators(288230376151711744, 0xaaaaaaaaaaaaaaa, 0x555555555555555),
38
+ 28: limitLocators(1152921504606846976, 0x2aaaaaaaaaaaaaaa, 0x1555555555555555),
39
+ 29: limitLocators(4611686018427387904, 0xaaaaaaaaaaaaaaaa, 0x5555555555555555),
40
+ 30: limitLocators(18446744073709551616, 0x2aaaaaaaaaaaaaaaa, 0x15555555555555555),
41
+ 31: limitLocators(73786976294838206464, 0xaaaaaaaaaaaaaaaaa, 0x55555555555555555),
42
+ 32: limitLocators(295147905179352825856, 0x2aaaaaaaaaaaaaaaaa, 0x155555555555555555),
43
+ 33: limitLocators(1180591620717411303424, 0xaaaaaaaaaaaaaaaaaa, 0x555555555555555555),
44
+ 34: limitLocators(4722366482869645213696, 0x2aaaaaaaaaaaaaaaaaa, 0x1555555555555555555),
45
+ 35: limitLocators(18889465931478580854784, 0xaaaaaaaaaaaaaaaaaaa, 0x5555555555555555555),
46
+ 36: limitLocators(75557863725914323419136, 0x2aaaaaaaaaaaaaaaaaaa, 0x15555555555555555555),
47
+ 37: limitLocators(302231454903657293676544, 0xaaaaaaaaaaaaaaaaaaaa, 0x55555555555555555555),
48
+ 38: limitLocators(1208925819614629174706176, 0x2aaaaaaaaaaaaaaaaaaaa, 0x155555555555555555555),
49
+ 39: limitLocators(4835703278458516698824704, 0xaaaaaaaaaaaaaaaaaaaaa, 0x555555555555555555555),
50
+ 40: limitLocators(19342813113834066795298816, 0x2aaaaaaaaaaaaaaaaaaaaa, 0x1555555555555555555555),
51
+ 41: limitLocators(77371252455336267181195264, 0xaaaaaaaaaaaaaaaaaaaaaa, 0x5555555555555555555555),
52
+ 42: limitLocators(309485009821345068724781056, 0x2aaaaaaaaaaaaaaaaaaaaaa, 0x15555555555555555555555),
53
+ 43: limitLocators(1237940039285380274899124224, 0xaaaaaaaaaaaaaaaaaaaaaaa, 0x55555555555555555555555),
54
+ 44: limitLocators(4951760157141521099596496896, 0x2aaaaaaaaaaaaaaaaaaaaaaa, 0x155555555555555555555555),
55
+ 45: limitLocators(19807040628566084398385987584, 0xaaaaaaaaaaaaaaaaaaaaaaaa, 0x555555555555555555555555),
56
+ 46: limitLocators(79228162514264337593543950336, 0x2aaaaaaaaaaaaaaaaaaaaaaaa, 0x1555555555555555555555555),
57
+ 47: limitLocators(316912650057057350374175801344, 0xaaaaaaaaaaaaaaaaaaaaaaaaa, 0x5555555555555555555555555),
58
+ 48: limitLocators(1267650600228229401496703205376, 0x2aaaaaaaaaaaaaaaaaaaaaaaaa, 0x15555555555555555555555555),
59
+ 49: limitLocators(5070602400912917605986812821504, 0xaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x55555555555555555555555555),
60
+ 50: limitLocators(20282409603651670423947251286016, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaa, 0x155555555555555555555555555),
61
+ 51: limitLocators(81129638414606681695789005144064, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x555555555555555555555555555),
62
+ 52: limitLocators(324518553658426726783156020576256, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x1555555555555555555555555555),
63
+ 53: limitLocators(1298074214633706907132624082305024, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x5555555555555555555555555555),
64
+ 54: limitLocators(5192296858534827628530496329220096, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x15555555555555555555555555555),
65
+ 55: limitLocators(20769187434139310514121985316880384, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x55555555555555555555555555555),
66
+ 56: limitLocators(83076749736557242056487941267521536, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x155555555555555555555555555555),
67
+ 57: limitLocators(332306998946228968225951765070086144, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x555555555555555555555555555555),
68
+ 58: limitLocators(1329227995784915872903807060280344576, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x1555555555555555555555555555555),
69
+ 59: limitLocators(5316911983139663491615228241121378304, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x5555555555555555555555555555555),
70
+ 60: limitLocators(21267647932558653966460912964485513216, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x15555555555555555555555555555555),
71
+ 61: limitLocators(85070591730234615865843651857942052864, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x55555555555555555555555555555555),
72
+ }
73
+
74
+ def makeCurveMaximum() -> None:
75
+ sys.stdout.write("curveMaximum: dict[int, limitLocators] = {\n")
76
+ for n in range(62):
77
+ curveLocationsMAXIMUM = 1 << (2 * n + 4)
78
+ bifurcationOddLocator = int('01' * ((curveLocationsMAXIMUM.bit_length() + 1) // 2), 2)
79
+ sys.stdout.write(f"{n}: limitLocators({curveLocationsMAXIMUM}, {hex(bifurcationOddLocator << 1)}, {hex(bifurcationOddLocator)}),\n")
80
+ sys.stdout.write("}\n")
81
+
82
+ if __name__ == '__main__':
83
+ makeCurveMaximum()
84
+
@@ -8,22 +8,25 @@ from astToolkit import (
8
8
  NodeTourist, Then)
9
9
  from astToolkit.transformationTools import removeUnusedParameters, write_astModule
10
10
  from hunterMakesPy import autoDecodingRLE, raiseIfNone
11
- from mapFolding import getPathFilenameFoldsTotal, MapFoldingState
11
+ from mapFolding import DatatypeLeavesTotal, getPathFilenameFoldsTotal, MapFoldingState
12
12
  from mapFolding.someAssemblyRequired import IfThis
13
13
  from mapFolding.someAssemblyRequired.RecipeJob import RecipeJobTheorem2
14
14
  from mapFolding.syntheticModules.initializeCount import initializeGroupsOfFolds
15
15
  from pathlib import Path, PurePosixPath
16
- from typing import cast, NamedTuple
16
+ from typing import cast, NamedTuple, TYPE_CHECKING
17
17
  import ast
18
18
  import subprocess
19
19
  import sys
20
20
 
21
+ if TYPE_CHECKING:
22
+ from io import TextIOBase
23
+
21
24
  class DatatypeConfiguration(NamedTuple):
22
25
  """Configuration for mapping framework datatypes to compiled datatypes.
23
26
 
24
27
  This configuration class defines how abstract datatypes used in the map folding framework should be replaced with compiled
25
- datatypes during code generation. Each configuration specifies the source module, target type name, and optional import
26
- alias for the transformation.
28
+ datatypes during code generation. Each configuration specifies the source module, target type name, and optional import alias
29
+ for the transformation.
27
30
 
28
31
  Attributes
29
32
  ----------
@@ -45,16 +48,17 @@ class DatatypeConfiguration(NamedTuple):
45
48
  # TODO replace with dynamic system. Probably use `Final` in the dataclass.
46
49
  listIdentifiersStaticValuesHARDCODED: list[str] = ['dimensionsTotal', 'leavesTotal']
47
50
 
51
+ # TODO Dynamically calculate the bitwidth of each datatype.
48
52
  listDatatypeConfigurations: list[DatatypeConfiguration] = [
49
- DatatypeConfiguration(datatypeIdentifier='DatatypeLeavesTotal', typeModule='numpy', typeIdentifier='uint16', type_asname='DatatypeLeavesTotal'),
50
- DatatypeConfiguration(datatypeIdentifier='DatatypeElephino', typeModule='numpy', typeIdentifier='uint16', type_asname='DatatypeElephino'),
53
+ DatatypeConfiguration(datatypeIdentifier='DatatypeLeavesTotal', typeModule='numpy', typeIdentifier='uint8', type_asname='DatatypeLeavesTotal'),
54
+ DatatypeConfiguration(datatypeIdentifier='DatatypeElephino', typeModule='numpy', typeIdentifier='uint8', type_asname='DatatypeElephino'),
51
55
  DatatypeConfiguration(datatypeIdentifier='DatatypeFoldsTotal', typeModule='numpy', typeIdentifier='int64', type_asname='DatatypeFoldsTotal'),
52
56
  ]
53
57
 
54
58
  listNumPy_dtype: list[DatatypeConfiguration] = [
55
- DatatypeConfiguration(datatypeIdentifier='Array1DLeavesTotal', typeModule='numpy', typeIdentifier='uint16', type_asname='Array1DLeavesTotal'),
56
- DatatypeConfiguration(datatypeIdentifier='Array1DElephino', typeModule='numpy', typeIdentifier='uint16', type_asname='Array1DElephino'),
57
- DatatypeConfiguration(datatypeIdentifier='Array3D', typeModule='numpy', typeIdentifier='uint16', type_asname='Array3D'),
59
+ DatatypeConfiguration(datatypeIdentifier='Array1DLeavesTotal', typeModule='numpy', typeIdentifier='uint8', type_asname='Array1DLeavesTotal'),
60
+ DatatypeConfiguration(datatypeIdentifier='Array1DElephino', typeModule='numpy', typeIdentifier='uint8', type_asname='Array1DElephino'),
61
+ DatatypeConfiguration(datatypeIdentifier='Array3D', typeModule='numpy', typeIdentifier='uint8', type_asname='Array3D'),
58
62
  ]
59
63
 
60
64
  def _addWriteFoldsTotal(ingredientsFunction: IngredientsFunction, job: RecipeJobTheorem2) -> IngredientsFunction:
@@ -145,9 +149,8 @@ def _move_arg2body(identifier: str, job: RecipeJobTheorem2) -> ast.AnnAssign | a
145
149
  def makeJob(job: RecipeJobTheorem2) -> None:
146
150
  """Generate an optimized module for map folding calculations.
147
151
 
148
- This function orchestrates the complete code transformation assembly line to convert
149
- a generic map folding algorithm into a highly optimized, specialized computation
150
- module.
152
+ This function orchestrates the complete code transformation assembly line to convert a generic map folding algorithm into a
153
+ highly optimized, specialized computation module.
151
154
 
152
155
  Parameters
153
156
  ----------
@@ -179,18 +182,43 @@ def makeJob(job: RecipeJobTheorem2) -> None:
179
182
  ingredientsCount, ingredientsModule = _datatypeDefinitions(ingredientsCount, ingredientsModule)
180
183
 
181
184
  ingredientsModule.appendIngredientsFunction(ingredientsCount)
182
- write_astModule(ingredientsModule, pathFilename=job.pathFilenameModule, packageName=job.packageIdentifier)
183
185
 
184
186
  if sys.platform == 'linux':
185
187
  buildCommand: list[str] = ['codon', 'build', '--exe', '--release',
186
188
  '--fast-math', '--enable-unsafe-fp-math', '--disable-exceptions',
187
- str(job.pathFilenameModule)]
188
- subprocess.run(buildCommand, check=False)
189
+ '--mcpu=native',
190
+ '-o', str(job.pathFilenameModule.with_suffix('')),
191
+ '-']
192
+ streamText = subprocess.Popen(buildCommand, stdin=subprocess.PIPE, text=True)
193
+ if streamText.stdin is not None:
194
+ write_astModule(ingredientsModule, pathFilename=cast('TextIOBase', streamText.stdin), packageName=job.packageIdentifier)
195
+ streamText.stdin.close()
196
+ streamText.wait()
189
197
  subprocess.run(['/usr/bin/strip', str(job.pathFilenameModule.with_suffix(''))], check=False)
198
+ sys.stdout.write(f"sudo systemd-run --unit={job.moduleIdentifier} --nice=-10 --property=CPUAffinity=0 {job.pathFilenameModule.with_suffix('')}\n")
199
+ else:
200
+ write_astModule(ingredientsModule, pathFilename=job.pathFilenameModule, packageName=job.packageIdentifier)
190
201
 
191
- if __name__ == '__main__':
192
- state = initializeGroupsOfFolds(MapFoldingState((2,4)))
202
+ def fromMapShape(mapShape: tuple[DatatypeLeavesTotal, ...]) -> None:
203
+ """Create a binary executable for a map-folding job from map dimensions.
204
+
205
+ This function initializes a map folding computation state from the given map shape, sets up the necessary file paths, and
206
+ generates an optimized executable for the specific map configuration.
207
+
208
+ Parameters
209
+ ----------
210
+ mapShape : tuple[DatatypeLeavesTotal, ...]
211
+ Dimensions of the map as a tuple where each element represents the size
212
+ along one axis.
213
+
214
+ """
215
+ state = initializeGroupsOfFolds(MapFoldingState(mapShape))
193
216
  pathModule = PurePosixPath(Path.home(), 'mapFolding', 'jobs')
194
217
  pathFilenameFoldsTotal = PurePosixPath(getPathFilenameFoldsTotal(state.mapShape, pathModule))
195
218
  aJob = RecipeJobTheorem2(state, pathModule=pathModule, pathFilenameFoldsTotal=pathFilenameFoldsTotal)
196
219
  makeJob(aJob)
220
+
221
+ if __name__ == '__main__':
222
+ mapShape = (2, 21)
223
+ fromMapShape(mapShape)
224
+
@@ -24,8 +24,8 @@ research domain.
24
24
  """
25
25
 
26
26
  from collections.abc import Callable, Generator, Sequence
27
- from mapFolding import getLeavesTotal, makeDataContainer, oeis, packageSettings, validateListDimensions
28
- from mapFolding.oeis import oeisIDsImplemented, settingsOEIS
27
+ from mapFolding import _theSSOT, getLeavesTotal, makeDataContainer, packageSettings, validateListDimensions
28
+ from mapFolding.oeis import dictionaryOEIS, oeisIDsImplemented
29
29
  from pathlib import Path
30
30
  from typing import Any
31
31
  import numpy
@@ -149,10 +149,10 @@ def pathCacheTesting(path_tmpTesting: Path) -> Generator[Path, Any, None]:
149
149
  Context manager that provides the temporary cache path and restores original.
150
150
 
151
151
  """
152
- pathCacheOriginal = oeis.pathCache
153
- oeis.pathCache = path_tmpTesting
152
+ pathCacheOriginal = _theSSOT.pathCache
153
+ _theSSOT.pathCache = path_tmpTesting
154
154
  yield path_tmpTesting
155
- oeis.pathCache = pathCacheOriginal
155
+ _theSSOT.pathCache = pathCacheOriginal
156
156
 
157
157
  @pytest.fixture
158
158
  def pathFilenameFoldsTotalTesting(path_tmpTesting: Path) -> Path:
@@ -212,10 +212,10 @@ def oneTestCuzTestsOverwritingTests(oeisID_1random: str) -> tuple[int, ...]:
212
212
 
213
213
  """
214
214
  while True:
215
- n = random.choice(settingsOEIS[oeisID_1random]['valuesTestValidation'])
215
+ n = random.choice(dictionaryOEIS[oeisID_1random]['valuesTestValidation'])
216
216
  if n < 2:
217
217
  continue
218
- listDimensionsCandidate = list(settingsOEIS[oeisID_1random]['getMapShape'](n))
218
+ listDimensionsCandidate = list(dictionaryOEIS[oeisID_1random]['getMapShape'](n))
219
219
 
220
220
  try:
221
221
  return validateListDimensions(listDimensionsCandidate)
@@ -238,10 +238,10 @@ def mapShapeTestCountFolds(oeisID: str) -> tuple[int, ...]:
238
238
 
239
239
  """
240
240
  while True:
241
- n = random.choice(settingsOEIS[oeisID]['valuesTestValidation'])
241
+ n = random.choice(dictionaryOEIS[oeisID]['valuesTestValidation'])
242
242
  if n < 2:
243
243
  continue
244
- listDimensionsCandidate = list(settingsOEIS[oeisID]['getMapShape'](n))
244
+ listDimensionsCandidate = list(dictionaryOEIS[oeisID]['getMapShape'](n))
245
245
 
246
246
  try:
247
247
  return validateListDimensions(listDimensionsCandidate)
@@ -266,10 +266,10 @@ def mapShapeTestFunctionality(oeisID_1random: str) -> tuple[int, ...]:
266
266
 
267
267
  """
268
268
  while True:
269
- n = random.choice(settingsOEIS[oeisID_1random]['valuesTestValidation'])
269
+ n = random.choice(dictionaryOEIS[oeisID_1random]['valuesTestValidation'])
270
270
  if n < 2:
271
271
  continue
272
- listDimensionsCandidate = list(settingsOEIS[oeisID_1random]['getMapShape'](n))
272
+ listDimensionsCandidate = list(dictionaryOEIS[oeisID_1random]['getMapShape'](n))
273
273
 
274
274
  try:
275
275
  return validateListDimensions(listDimensionsCandidate)
@@ -291,8 +291,8 @@ def mapShapeTestParallelization(oeisID: str) -> tuple[int, ...]:
291
291
  Map dimensions suitable for testing parallelization features.
292
292
 
293
293
  """
294
- n = random.choice(settingsOEIS[oeisID]['valuesTestParallelization'])
295
- return settingsOEIS[oeisID]['getMapShape'](n)
294
+ n = random.choice(dictionaryOEIS[oeisID]['valuesTestParallelization'])
295
+ return dictionaryOEIS[oeisID]['getMapShape'](n)
296
296
 
297
297
  @pytest.fixture
298
298
  def mockBenchmarkTimer() -> Generator[unittest.mock.MagicMock | unittest.mock.AsyncMock, Any, None]:
@@ -27,9 +27,9 @@ which is useful if you're working with the code synthesis features of the packag
27
27
 
28
28
  from mapFolding import countFolds, getFoldsTotalKnown, oeisIDfor_n
29
29
  from mapFolding.dataBaskets import MapFoldingState
30
- from mapFolding.oeis import settingsOEIS
31
- from mapFolding.someAssemblyRequired.RecipeJob import RecipeJobTheorem2
30
+ from mapFolding.oeis import dictionaryOEIS
32
31
  from mapFolding.someAssemblyRequired.makeAllModules import parametersNumbaLight
32
+ from mapFolding.someAssemblyRequired.RecipeJob import RecipeJobTheorem2
33
33
  from mapFolding.syntheticModules.initializeCount import initializeGroupsOfFolds
34
34
  from mapFolding.tests.conftest import registrarRecordsTemporaryFilesystemObject, standardizedEqualToCallableReturn
35
35
  from pathlib import Path, PurePosixPath
@@ -83,8 +83,8 @@ def test_aOFn_calculate_value(oeisID: str) -> None:
83
83
  The OEIS sequence identifier to test calculations for.
84
84
 
85
85
  """
86
- for n in settingsOEIS[oeisID]['valuesTestValidation']:
87
- standardizedEqualToCallableReturn(settingsOEIS[oeisID]['valuesKnown'][n], oeisIDfor_n, oeisID, n)
86
+ for n in dictionaryOEIS[oeisID]['valuesTestValidation']:
87
+ standardizedEqualToCallableReturn(dictionaryOEIS[oeisID]['valuesKnown'][n], oeisIDfor_n, oeisID, n)
88
88
 
89
89
  @pytest.mark.parametrize('pathFilename_tmpTesting', ['.py'], indirect=True)
90
90
  def test_writeJobNumba(oneTestCuzTestsOverwritingTests: tuple[int, ...], pathFilename_tmpTesting: Path) -> None:
@@ -26,7 +26,7 @@ which is crucial for maintaining package reliability in production environments.
26
26
 
27
27
  from contextlib import redirect_stdout
28
28
  from mapFolding.oeis import (
29
- clearOEIScache, getOEISids, OEIS_for_n, oeisIDfor_n, oeisIDsImplemented, settingsOEIS, validateOEISid)
29
+ _standardizeOEISid, clearOEIScache, dictionaryOEIS, getOEISids, OEIS_for_n, oeisIDfor_n, oeisIDsImplemented)
30
30
  from mapFolding.tests.conftest import standardizedEqualToCallableReturn, standardizedSystemExit
31
31
  from typing import Any
32
32
  import io
@@ -35,20 +35,13 @@ import random
35
35
  import re as regex
36
36
  import unittest.mock
37
37
 
38
- @pytest.mark.parametrize("badID", ["A999999", " A999999 ", "A999999extra"])
39
- def test__validateOEISid_invalid_id(badID: str) -> None:
40
- standardizedEqualToCallableReturn(KeyError, validateOEISid, badID)
41
-
42
- def test__validateOEISid_partially_valid(oeisID_1random: str) -> None:
43
- standardizedEqualToCallableReturn(KeyError, validateOEISid, f"{oeisID_1random}extra")
44
-
45
38
  def test__validateOEISid_valid_id(oeisID: str) -> None:
46
- standardizedEqualToCallableReturn(oeisID, validateOEISid, oeisID)
39
+ standardizedEqualToCallableReturn(oeisID, _standardizeOEISid, oeisID)
47
40
 
48
41
  def test__validateOEISid_valid_id_case_insensitive(oeisID: str) -> None:
49
- standardizedEqualToCallableReturn(oeisID.upper(), validateOEISid, oeisID.lower())
50
- standardizedEqualToCallableReturn(oeisID.upper(), validateOEISid, oeisID.upper())
51
- standardizedEqualToCallableReturn(oeisID.upper(), validateOEISid, oeisID.swapcase())
42
+ standardizedEqualToCallableReturn(oeisID.upper(), _standardizeOEISid, oeisID.lower())
43
+ standardizedEqualToCallableReturn(oeisID.upper(), _standardizeOEISid, oeisID.upper())
44
+ standardizedEqualToCallableReturn(oeisID.upper(), _standardizeOEISid, oeisID.swapcase())
52
45
 
53
46
  parameters_test_aOFn_invalid_n = [
54
47
  (-random.randint(1, 100), "randomNegative"), # noqa: S311
@@ -75,7 +68,7 @@ def test_clearOEIScache(mock_unlink: unittest.mock.MagicMock, mock_exists: unitt
75
68
 
76
69
  if cacheExists:
77
70
  # Each OEIS ID has two cache files
78
- expected_calls = len(settingsOEIS) * 2
71
+ expected_calls = len(dictionaryOEIS) * 2
79
72
  assert mock_unlink.call_count == expected_calls
80
73
  mock_unlink.assert_has_calls([unittest.mock.call(missing_ok=True)] * expected_calls)
81
74
  else:
@@ -94,7 +87,7 @@ def testHelpText() -> None:
94
87
  # Verify content
95
88
  for oeisID in oeisIDsImplemented:
96
89
  assert oeisID in helpText
97
- assert settingsOEIS[oeisID]['description'] in helpText
90
+ assert dictionaryOEIS[oeisID]['description'] in helpText
98
91
 
99
92
  # Extract and verify examples
100
93
 
@@ -0,0 +1,78 @@
1
+ Metadata-Version: 2.4
2
+ Name: mapFolding
3
+ Version: 0.14.0
4
+ Summary: Map folding, meanders, stamp folding, semi-meanders. Experiment with algorithm transformations and code optimization.
5
+ Author-email: Hunter Hogan <HunterHogan@pm.me>
6
+ License: CC-BY-NC-4.0
7
+ Project-URL: Donate, https://www.patreon.com/integrated
8
+ Project-URL: Homepage, https://github.com/hunterhogan/mapFolding
9
+ Project-URL: Issues, https://github.com/hunterhogan/mapFolding/issues
10
+ Project-URL: Repository, https://github.com/hunterhogan/mapFolding.git
11
+ Keywords: A000136,A000560,A000682,A001415,A001416,A001417,A001418,A005315,A005316,A195646,A223094,A259702,A301620,abstract syntax tree,algorithmic combinatorics,algorithmic optimization,arch configurations,AST manipulation,automated code generation,bit-packed arrays,bitwise state machines,cache-efficient algorithms,closed meandric numbers,code generation,code optimization,code synthesis,code transformation,codon optimization,combinatorial computing,combinatorial enumeration,combinatorial geometry,combinatorial mathematics,combinatorial problem solver,combinatorics,computational combinatorics,computational geometry,crossing patterns,curve crossings,dataclass transformation,discrete mathematics,dynamic compilation,enumerative combinatorics,folding pattern enumeration,folding problems,GPU acceleration,high-performance computing,integer sequences,JIT compilation,just-in-time compilation,kernel optimization,labeled stamp folding,low-level computation,map folding,mapFolding,mathematical algorithms,mathematical modeling,mathematical optimization,mathematical patterns,mathematical software,mathematical tool,mathematical visualization,meander enumeration,meanders,meandric systems,memory-efficient enumeration,metaprogramming,Numba optimization,numerical algorithms,numerical computation,OEIS,open meandric systems,paper folding mathematics,parallel computing,pattern recognition,performance optimization,permutation patterns,permutations,post-setup optimization,pyproject,Python optimization,scientific computing,semi-meanders,sequence analysis,sequence calculator,sequence enumeration,sequence explorer,sequence generation,source code analysis,stamp folding,symbolic computation,topological combinatorics,topological patterns,typed Python
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Education
16
+ Classifier: Intended Audience :: Science/Research
17
+ Classifier: Natural Language :: English
18
+ Classifier: Operating System :: MacOS
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Operating System :: POSIX :: Linux
21
+ Classifier: Programming Language :: Python
22
+ Classifier: Programming Language :: Python :: 3
23
+ Classifier: Programming Language :: Python :: 3 :: Only
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: Implementation :: CPython
27
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
28
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
29
+ Classifier: Topic :: Software Development :: Code Generators
30
+ Classifier: Topic :: Software Development :: Compilers
31
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
32
+ Classifier: Topic :: Software Development :: Pre-processors
33
+ Classifier: Typing :: Typed
34
+ Requires-Python: >=3.12
35
+ Description-Content-Type: text/markdown
36
+ License-File: LICENSE
37
+ Requires-Dist: astToolkit>=0.7.1
38
+ Requires-Dist: cytoolz
39
+ Requires-Dist: hunterMakesPy
40
+ Requires-Dist: numba
41
+ Requires-Dist: numpy
42
+ Requires-Dist: platformdirs
43
+ Provides-Extra: development
44
+ Requires-Dist: mypy; extra == "development"
45
+ Requires-Dist: pyupgrade; extra == "development"
46
+ Requires-Dist: setuptools-scm; extra == "development"
47
+ Provides-Extra: numba
48
+ Requires-Dist: numba; extra == "numba"
49
+ Requires-Dist: numba_progress; extra == "numba"
50
+ Provides-Extra: testing
51
+ Requires-Dist: numba; extra == "testing"
52
+ Requires-Dist: pytest-cov; extra == "testing"
53
+ Requires-Dist: pytest-env; extra == "testing"
54
+ Requires-Dist: pytest-xdist; extra == "testing"
55
+ Requires-Dist: pytest; extra == "testing"
56
+ Dynamic: license-file
57
+
58
+ # mapFolding
59
+
60
+ [![pip install mapFolding](https://img.shields.io/badge/pip%20install-mapFolding-gray.svg?colorB=3b434b)](https://pypi.org/project/mapFolding/)
61
+
62
+ Map folding, meanders, stamp folding, semi-meanders. Experiment with algorithm transformations and code optimization.
63
+
64
+ Command line:
65
+
66
+ - getOEISids
67
+ - OEIS_for_n
68
+
69
+ The package is focused on mapFolding and stamp folding. But "mapFolding/_oeisFormulas" has some infrastructure for meanders and semi-meanders.
70
+
71
+ There are innovations and insights in the mapFolding stuff.
72
+
73
+ ## My recovery
74
+
75
+ [![Static Badge](https://img.shields.io/badge/2011_August-Homeless_since-blue?style=flat)](https://HunterThinks.com/support)
76
+ [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UC3Gx7kz61009NbhpRtPP7tw)](https://www.youtube.com/@HunterHogan)
77
+
78
+ [![CC-BY-NC-4.0](https://github.com/hunterhogan/mapFolding/blob/main/CC-BY-NC-4.0.png)](https://creativecommons.org/licenses/by-nc/4.0/)
@@ -1,20 +1,42 @@
1
1
  mapFolding/__init__.py,sha256=dl3HR2zoipFo0UstEJn3iWTkXlA_XeCQw_zfw2fk4qE,3643
2
- mapFolding/_theSSOT.py,sha256=dloMAsIOhUnIE7-SFJbQYyl6IYo7CdCAyBZPqMuckko,3380
2
+ mapFolding/_theSSOT.py,sha256=3tpmiDAgrN9uZ8IuBx-xbtiRjxP9B9_PjEwK0L5Mxm4,4683
3
3
  mapFolding/_theTypes.py,sha256=rT8UTm-I_haMQlUGaJ4yvqIMt6FUOvWH-VUYNud6UN4,5495
4
- mapFolding/basecamp.py,sha256=K-h8rBb-lREOe8DAdWLx5Uqbl5eaPjj8lRLk5HIVw40,9454
5
- mapFolding/beDRY.py,sha256=Iikg3U4zQjx6JOKL62R7Tb0CpOm3JkPSIewAByco9GA,14777
4
+ mapFolding/basecamp.py,sha256=eG9wz5hPgPIuLLQf9xKizuvTAKyZjFQt1_rbaQJJYO4,9458
5
+ mapFolding/beDRY.py,sha256=JjKrJ97vNg67RIoWfOEKZGGbL55kE3p9B6wrJ1TK-8E,14760
6
6
  mapFolding/daoOfMapFolding.py,sha256=ncTIiBfTsM8SNVx9qefZ0bBcBtviWLSk4iPv3Z9nGiE,5442
7
7
  mapFolding/dataBaskets.py,sha256=zTpRoGDEysq7ekmgiKCtCV6NOBGzfgs_XMjVngvg3ic,14566
8
8
  mapFolding/filesystemToolkit.py,sha256=Ex5tyugRQurXIgUNVtkQYfWMq8fM4e-izX01MBXU5_8,11006
9
- mapFolding/oeis.py,sha256=jJjTsngcUNTY0M8et1InbnpP2csglQilFidyVCCm0Ts,23031
9
+ mapFolding/oeis.py,sha256=_M5Ha0io90apjtm4r1Dd5c38FeirnTymxCtqTFE3h2c,19416
10
10
  mapFolding/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ mapFolding/_oeisFormulas/A000136.py,sha256=G_vqOdb6s_YBbrCkHKjQDnlYfOZ4suXRtie6bRI7hhE,105
12
+ mapFolding/_oeisFormulas/A000560.py,sha256=sN5-BAjL0oDk7YXZ2kx7ffBDX-gC28mmOj4CxHkM36c,113
13
+ mapFolding/_oeisFormulas/A000682.py,sha256=_Jmy9-0I1evJS2CybtvXalUiCD3X_pu5aMb3i8u1fTk,551
14
+ mapFolding/_oeisFormulas/A005315.py,sha256=g1P52zUuWCLFbTb_i6U75sVzXfUGaCM3rJonXNRgVr4,109
15
+ mapFolding/_oeisFormulas/A005316.py,sha256=3B4_2TT_ip3CcYngEaFS-rTNDx-x2TZ0r_J0f8IMJbQ,234
16
+ mapFolding/_oeisFormulas/A223094.py,sha256=z7t6RcRQlhXdbYImIER15KwG1_W7iV4MNIRDx9Q_Efs,284
17
+ mapFolding/_oeisFormulas/A259702.py,sha256=9hUs8jzwOnJGmBsueS1yGsLjau4YVa0Yd9lYMG8UFso,123
18
+ mapFolding/_oeisFormulas/A301620.py,sha256=pY0OJsCLhIEDHQUKpeSMTZ2SUFvcqt83uCOPE_lZCsw,225
19
+ mapFolding/_oeisFormulas/Z0Z_aOFn.py,sha256=PjSUpcpNh_YXvc4lrC3xzpx6rz0yWbOuYEHugsssmns,572
20
+ mapFolding/_oeisFormulas/Z0Z_oeisMeanders.py,sha256=IDwGgieBJffmC3bAFaCqgIxPC9ZyRmqSxsWJ3VKyY2U,1746
21
+ mapFolding/_oeisFormulas/__init__.py,sha256=n83beVb7HHplXYAM5HveaIAuR7KrJG99OaNHJGMb_uc,44
22
+ mapFolding/_oeisFormulas/matrixMeanders.py,sha256=0QEzcOTvaOb0-6MiKUe1Uxoi-ESVIG5rlZxUA1e_l_s,2965
23
+ mapFolding/_oeisFormulas/matrixMeandersAnnex.py,sha256=sl0UWwivpnbzIfi6E5cD0vSpHlSUu-Htw4yb4aN-Eg4,5809
24
+ mapFolding/reference/A005316JavaPort.py,sha256=6qqTzbD3PTwYGtqaywEURGXtNFx1lp8ofEwpQeEvAHc,4899
25
+ mapFolding/reference/A005316imperative.py,sha256=hhjUxELOktNBmHrwIoxVA-mcFsOWgg01p780OBeqL04,3816
26
+ mapFolding/reference/A005316intOptimized.py,sha256=oO9ktdYeFwtosVp5KliwH8JmCSxfjapjBM1iMECuDAc,4121
27
+ mapFolding/reference/A005316optimized128bit.py,sha256=G48By4Z0iWFeGPEzac2X0uv6Fp42SqMALJoEunqHUS0,3380
28
+ mapFolding/reference/A005316primitiveOptimized.py,sha256=z9mtfKGlVXLplSwg51Qpmu6njZndCufFIxnPTCOVN2U,4064
29
+ mapFolding/reference/A005316redis.py,sha256=NobSrzm1NuDLKk_v1diSZz6viT_2Q7bO5WU3rJ9q0jk,4292
30
+ mapFolding/reference/A005316write2disk.py,sha256=_XT_3jbOOroCOmXyITKJVs7ZFtpkVI_xCt-051405Rg,5597
11
31
  mapFolding/reference/__init__.py,sha256=GKcSgYE49NcTISx-JZbELXyq-eRkMeTL5g4DXInWFw0,2206
12
32
  mapFolding/reference/flattened.py,sha256=0eHgLFIeIeVUsI5zF5oSy5iWYrjOMzxr7KjDxiTe01k,16078
13
33
  mapFolding/reference/hunterNumba.py,sha256=iLfyqwGdAh6c5GbapnKsWhAsNsR3O-fyGGHAdohluLw,7258
14
- mapFolding/reference/irvineJavaPort.py,sha256=UEfIX4QbPLl5jnyfYIyX5YRR3_rYvPUikK8jLehsFko,4076
34
+ mapFolding/reference/irvineJavaPort.py,sha256=XnsL4g33LRrYwAhcrAVt-ujsP6QD6fbyCsGYzcm9g_k,3724
15
35
  mapFolding/reference/jaxCount.py,sha256=TuDNKOnyhQfuixKmIxO9Algv7dvy7KMGhgsV3h96FGE,14853
16
36
  mapFolding/reference/lunnonNumpy.py,sha256=mMgrgbrBpe4nmo72ThEI-MGH0OwEHmfMPczSXHp2qKo,4357
17
37
  mapFolding/reference/lunnonWhile.py,sha256=ZL8GAQtPs5nJZSgoDl5USrLSS_zs03y98y1Z9E4jOmQ,3799
38
+ mapFolding/reference/matrixMeandersBaseline.py,sha256=0QEzcOTvaOb0-6MiKUe1Uxoi-ESVIG5rlZxUA1e_l_s,2965
39
+ mapFolding/reference/matrixMeandersBaselineAnnex.py,sha256=sl0UWwivpnbzIfi6E5cD0vSpHlSUu-Htw4yb4aN-Eg4,5809
18
40
  mapFolding/reference/rotatedEntryPoint.py,sha256=5ughpKUT2JQhoAKgoDUdYNjgWQYPGV8v-7dWEAdDmfE,10274
19
41
  mapFolding/reference/total_countPlus1vsPlusN.py,sha256=yJZAVLVdoXqHag2_N6_6CT-Q6HXBgRro-eny93-Rlpw,9307
20
42
  mapFolding/reference/jobsCompleted/__init__.py,sha256=TU93ZGUW1xEkT6d9mQFn_rp5DvRy0ZslEB2Q6MF5ZDc,2596
@@ -28,7 +50,7 @@ mapFolding/someAssemblyRequired/getLLVMforNoReason.py,sha256=tY0-2K0BFkwLAAjSrFJ
28
50
  mapFolding/someAssemblyRequired/infoBooth.py,sha256=GWiqnHbqk7te_pvVuk4G_gbFa_W2aeSx19w4pakvqfM,2300
29
51
  mapFolding/someAssemblyRequired/makeAllModules.py,sha256=o22qQ35N9M3N3kra16IayOpXMI1bkwVNQ5c04_rxMGw,44295
30
52
  mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py,sha256=ZSplXKPwRAbvMA2bvEGcXFdgvuYGBk3Ncxajzk-Zy0A,17170
31
- mapFolding/someAssemblyRequired/makeJobTheorem2codon.py,sha256=06FfCgHJDmNFv8li0v0O82Te8FvlFIOCm4OEMZ1EiRM,10160
53
+ mapFolding/someAssemblyRequired/makeJobTheorem2codon.py,sha256=Py6WubBaBz__MdpSTTmdtV9VjMciIx8DWiS_h25OVEI,11300
32
54
  mapFolding/someAssemblyRequired/toolkitNumba.py,sha256=nCCVsGidAlcKRVAvA__hu4bXtat3B-cO9YloKtqOAc4,14919
33
55
  mapFolding/someAssemblyRequired/transformationTools.py,sha256=nPGZsvb5GquaCCxdDh_XzNIZYSiVJpWKd7wfhfRvxnk,11512
34
56
  mapFolding/syntheticModules/__init__.py,sha256=evVFqhCGa-WZKDiLcnQWjs-Bj34eRnfSLqz_d7dFYZY,83
@@ -40,15 +62,15 @@ mapFolding/syntheticModules/theorem2.py,sha256=9jrbZNNX4BWYZW1S0JjvRY2k7RU7I1RNU
40
62
  mapFolding/syntheticModules/theorem2Numba.py,sha256=-cKjNyxgUMFhEyFVs0VJ7hw4LfrV0WSNK5tPYbQ1oNU,3369
41
63
  mapFolding/syntheticModules/theorem2Trimmed.py,sha256=DHW3NxBdtABQYBKm2WRvfQ5kzc2_UwGI2h4ePuYEJoM,2685
42
64
  mapFolding/tests/__init__.py,sha256=QVCHSMFVvTxV3mAyYOLkMFAFyBJ514zdoVnDmpBJnTo,1336
43
- mapFolding/tests/conftest.py,sha256=f0JB_e5zbpusGLWVJbtYKug9oRm0M8c-GFAp9mhhs9Q,14590
44
- mapFolding/tests/test_computations.py,sha256=7avZjmYjsgJAcTEzQFj3Td1N9q75ANdCRnNvOesFjiw,6535
65
+ mapFolding/tests/conftest.py,sha256=VZ9l0Vd2d-hdp6cVBmsTkYA7FZIH0cEgdeJx844oe3A,14624
66
+ mapFolding/tests/test_computations.py,sha256=OjX7zECx2Hr6RsIi0hZZSzaiQJa7GBRLUpiASofNp-A,6541
45
67
  mapFolding/tests/test_filesystem.py,sha256=0rYQ62f4e3HOoymXrxDWbqNEBJQ7DGN8RUOMI84tE2Q,3892
46
- mapFolding/tests/test_oeis.py,sha256=Sn3jpg6YQJMtAAc1W8Ic2PTbTwSckzBdJnkN1rz_O6w,5834
68
+ mapFolding/tests/test_oeis.py,sha256=ejqaOMB61c1oUEBblPPBG9hFFXffpKuIS0CJMe7Rd1o,5497
47
69
  mapFolding/tests/test_other.py,sha256=ScBiJ78LnyAaW-RhxcouX6Xw10wgpSdqfvT4LO3WjnQ,4766
48
70
  mapFolding/tests/test_tasks.py,sha256=_pr9JRWjjNKA7sww70XvkJJdGPruBVzubM63RmD_Du0,4013
49
- mapfolding-0.13.1.dist-info/licenses/LICENSE,sha256=NxH5Y8BdC-gNU-WSMwim3uMbID2iNDXJz7fHtuTdXhk,19346
50
- mapfolding-0.13.1.dist-info/METADATA,sha256=mBuToDW06Q7w6hF6KNus2yvB9FQ-V7Lsd958OEXcYrk,8040
51
- mapfolding-0.13.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
- mapfolding-0.13.1.dist-info/entry_points.txt,sha256=F3OUeZR1XDTpoH7k3wXuRb3KF_kXTTeYhu5AGK1SiOQ,146
53
- mapfolding-0.13.1.dist-info/top_level.txt,sha256=aG3bjFBoxxuaV3Iu1wZAd241Ubs3cdaJtKYBQBDIjsg,11
54
- mapfolding-0.13.1.dist-info/RECORD,,
71
+ mapfolding-0.14.0.dist-info/licenses/LICENSE,sha256=NxH5Y8BdC-gNU-WSMwim3uMbID2iNDXJz7fHtuTdXhk,19346
72
+ mapfolding-0.14.0.dist-info/METADATA,sha256=Y9pEjwsX2B8QeCarplVsfNroHV1PbngK9qej7DcuH40,5122
73
+ mapfolding-0.14.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
74
+ mapfolding-0.14.0.dist-info/entry_points.txt,sha256=F3OUeZR1XDTpoH7k3wXuRb3KF_kXTTeYhu5AGK1SiOQ,146
75
+ mapfolding-0.14.0.dist-info/top_level.txt,sha256=aG3bjFBoxxuaV3Iu1wZAd241Ubs3cdaJtKYBQBDIjsg,11
76
+ mapfolding-0.14.0.dist-info/RECORD,,