mapFolding 0.14.0__py3-none-any.whl → 0.15.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 (34) hide show
  1. mapFolding/_A007822.py +181 -0
  2. mapFolding/__init__.py +1 -1
  3. mapFolding/_oeisFormulas/A000682.py +2 -2
  4. mapFolding/_oeisFormulas/Z0Z_aOFn.py +7 -5
  5. mapFolding/_oeisFormulas/Z0Z_oeisMeanders.py +2 -0
  6. mapFolding/_oeisFormulas/matrixMeanders.py +122 -61
  7. mapFolding/_oeisFormulas/matrixMeandersAnnex.py +66 -66
  8. mapFolding/_theSSOT.py +9 -3
  9. mapFolding/_theTypes.py +34 -130
  10. mapFolding/basecamp.py +1 -1
  11. mapFolding/beDRY.py +5 -21
  12. mapFolding/dataBaskets.py +8 -3
  13. mapFolding/oeis.py +13 -15
  14. mapFolding/reference/A005316optimized128bit.py +19 -19
  15. mapFolding/reference/A005316primitiveOptimized.py +25 -25
  16. mapFolding/reference/A005316redis.py +19 -19
  17. mapFolding/reference/A005316write2disk.py +19 -19
  18. mapFolding/reference/matrixMeandersBaseline.py +20 -20
  19. mapFolding/reference/matrixMeandersBaselineAnnex.py +4 -4
  20. mapFolding/reference/matrixMeandersSimpleQueue.py +90 -0
  21. mapFolding/reference/matrixMeandersSlicePop.py +104 -0
  22. mapFolding/someAssemblyRequired/_toolkitContainers.py +1 -1
  23. mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +1 -1
  24. mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +1 -1
  25. mapFolding/syntheticModules/countParallel.py +7 -4
  26. mapFolding/syntheticModules/daoOfMapFolding.py +6 -4
  27. mapFolding/syntheticModules/dataPacking.py +5 -3
  28. mapFolding/syntheticModules/theorem2Numba.py +4 -3
  29. {mapfolding-0.14.0.dist-info → mapfolding-0.15.0.dist-info}/METADATA +4 -5
  30. {mapfolding-0.14.0.dist-info → mapfolding-0.15.0.dist-info}/RECORD +34 -31
  31. {mapfolding-0.14.0.dist-info → mapfolding-0.15.0.dist-info}/WHEEL +0 -0
  32. {mapfolding-0.14.0.dist-info → mapfolding-0.15.0.dist-info}/entry_points.txt +0 -0
  33. {mapfolding-0.14.0.dist-info → mapfolding-0.15.0.dist-info}/licenses/LICENSE +0 -0
  34. {mapfolding-0.14.0.dist-info → mapfolding-0.15.0.dist-info}/top_level.txt +0 -0
@@ -86,41 +86,41 @@ def recordAnalysis(bridges: int, curveLocationAnalysis: int, distinctCrossings:
86
86
  bookkeeper.start()
87
87
 
88
88
  def analyzeCurves(bridges: int, curveLocations: int, distinctCrossings: int) -> None:
89
- bifurcationOdd = curveLocations & 0x5555555555555555555555555555555555555555555555555555555555555555
90
- bifurcationEven = (curveLocations ^ bifurcationOdd) >> 1
89
+ bifurcationAlpha = curveLocations & 0x5555555555555555555555555555555555555555555555555555555555555555
90
+ bifurcationZulu = (curveLocations ^ bifurcationAlpha) >> 1
91
91
 
92
- bifurcationOddHasCurves = bifurcationOdd != 1
93
- bifurcationEvenHasCurves = bifurcationEven != 1
94
- bifurcationOddFinalZero = not bifurcationOdd & 1
95
- bifurcationEvenFinalZero = not bifurcationEven & 1
92
+ bifurcationAlphaHasCurves = bifurcationAlpha != 1
93
+ bifurcationZuluHasCurves = bifurcationZulu != 1
94
+ bifurcationAlphaFinalZero = not bifurcationAlpha & 1
95
+ bifurcationZuluFinalZero = not bifurcationZulu & 1
96
96
 
97
- if bifurcationOddHasCurves:
98
- curveLocationAnalysis = (bifurcationOdd >> 2) | (bifurcationEven << 3) | (bifurcationOddFinalZero << 1)
97
+ if bifurcationAlphaHasCurves:
98
+ curveLocationAnalysis = (bifurcationAlpha >> 2) | (bifurcationZulu << 3) | (bifurcationAlphaFinalZero << 1)
99
99
  recordAnalysis(bridges, curveLocationAnalysis, distinctCrossings)
100
100
 
101
- if bifurcationEvenHasCurves:
102
- curveLocationAnalysis = (bifurcationEven >> 1) | (bifurcationOdd << 2) | bifurcationEvenFinalZero
101
+ if bifurcationZuluHasCurves:
102
+ curveLocationAnalysis = (bifurcationZulu >> 1) | (bifurcationAlpha << 2) | bifurcationZuluFinalZero
103
103
  recordAnalysis(bridges, curveLocationAnalysis, distinctCrossings)
104
104
 
105
- curveLocationAnalysis = ((bifurcationOdd | (bifurcationEven << 1)) << 2) | 3
105
+ curveLocationAnalysis = ((bifurcationAlpha | (bifurcationZulu << 1)) << 2) | 3
106
106
  recordAnalysis(bridges, curveLocationAnalysis, distinctCrossings)
107
107
 
108
- if bifurcationOddHasCurves and bifurcationEvenHasCurves and (bifurcationOddFinalZero or bifurcationEvenFinalZero):
108
+ if bifurcationAlphaHasCurves and bifurcationZuluHasCurves and (bifurcationAlphaFinalZero or bifurcationZuluFinalZero):
109
109
  XOrHere2makePair = 0b1
110
110
  findUnpairedBinary1 = 0
111
- if bifurcationOddFinalZero and not bifurcationEvenFinalZero:
111
+ if bifurcationAlphaFinalZero and not bifurcationZuluFinalZero:
112
112
  while findUnpairedBinary1 >= 0:
113
113
  XOrHere2makePair <<= 2
114
- findUnpairedBinary1 += 1 if (bifurcationOdd & XOrHere2makePair) == 0 else -1
115
- bifurcationOdd ^= XOrHere2makePair
114
+ findUnpairedBinary1 += 1 if (bifurcationAlpha & XOrHere2makePair) == 0 else -1
115
+ bifurcationAlpha ^= XOrHere2makePair
116
116
 
117
- elif bifurcationEvenFinalZero and not bifurcationOddFinalZero:
117
+ elif bifurcationZuluFinalZero and not bifurcationAlphaFinalZero:
118
118
  while findUnpairedBinary1 >= 0:
119
119
  XOrHere2makePair <<= 2
120
- findUnpairedBinary1 += 1 if (bifurcationEven & XOrHere2makePair) == 0 else -1
121
- bifurcationEven ^= XOrHere2makePair
120
+ findUnpairedBinary1 += 1 if (bifurcationZulu & XOrHere2makePair) == 0 else -1
121
+ bifurcationZulu ^= XOrHere2makePair
122
122
 
123
- curveLocationAnalysis = (bifurcationOdd >> 2) | ((bifurcationEven >> 2) << 1)
123
+ curveLocationAnalysis = (bifurcationAlpha >> 2) | ((bifurcationZulu >> 2) << 1)
124
124
  recordAnalysis(bridges, curveLocationAnalysis, distinctCrossings)
125
125
 
126
126
  def count(bridges: int, dictionaryCurveLocations: dict[int, int]) -> int:
@@ -21,45 +21,45 @@ def count(bridges: int, startingCurveLocations: dict[int, int]) -> int:
21
21
 
22
22
  while bridges > 0:
23
23
  bridges -= 1
24
- curveLocationsMAXIMUM, bifurcationEvenLocator, bifurcationOddLocator = curveMaximum[bridges]
24
+ curveLocationsMAXIMUM, bifurcationZuluLocator, bifurcationAlphaLocator = curveMaximum[bridges]
25
25
 
26
26
  for curveLocations, distinctCrossings in getCurveLocations().items():
27
- bifurcationEven = (curveLocations & bifurcationEvenLocator) >> 1
28
- bifurcationOdd = curveLocations & bifurcationOddLocator
27
+ bifurcationZulu = (curveLocations & bifurcationZuluLocator) >> 1
28
+ bifurcationAlpha = curveLocations & bifurcationAlphaLocator
29
29
 
30
- bifurcationEvenFinalZero = (bifurcationEven & 0b1) == 0
31
- bifurcationEvenHasCurves = bifurcationEven != 1
32
- bifurcationOddFinalZero = (bifurcationOdd & 0b1) == 0
33
- bifurcationOddHasCurves = bifurcationOdd != 1
30
+ bifurcationZuluFinalZero = (bifurcationZulu & 0b1) == 0
31
+ bifurcationZuluHasCurves = bifurcationZulu != 1
32
+ bifurcationAlphaFinalZero = (bifurcationAlpha & 0b1) == 0
33
+ bifurcationAlphaHasCurves = bifurcationAlpha != 1
34
34
 
35
- if bifurcationEvenHasCurves:
36
- curveLocationAnalysis = (bifurcationEven >> 1) | (bifurcationOdd << 2) | bifurcationEvenFinalZero
35
+ if bifurcationZuluHasCurves:
36
+ curveLocationAnalysis = (bifurcationZulu >> 1) | (bifurcationAlpha << 2) | bifurcationZuluFinalZero
37
37
  recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
38
38
 
39
- if bifurcationOddHasCurves:
40
- curveLocationAnalysis = (bifurcationOdd >> 2) | (bifurcationEven << 3) | (bifurcationOddFinalZero << 1)
39
+ if bifurcationAlphaHasCurves:
40
+ curveLocationAnalysis = (bifurcationAlpha >> 2) | (bifurcationZulu << 3) | (bifurcationAlphaFinalZero << 1)
41
41
  recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
42
42
 
43
- curveLocationAnalysis = ((bifurcationOdd | (bifurcationEven << 1)) << 2) | 3
43
+ curveLocationAnalysis = ((bifurcationAlpha | (bifurcationZulu << 1)) << 2) | 3
44
44
  recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
45
45
 
46
- if bifurcationEvenHasCurves and bifurcationOddHasCurves and (bifurcationEvenFinalZero or bifurcationOddFinalZero):
46
+ if bifurcationZuluHasCurves and bifurcationAlphaHasCurves and (bifurcationZuluFinalZero or bifurcationAlphaFinalZero):
47
47
  XOrHere2makePair = 0b1
48
48
  findUnpairedBinary1 = 0
49
49
 
50
- if bifurcationEvenFinalZero and not bifurcationOddFinalZero:
50
+ if bifurcationZuluFinalZero and not bifurcationAlphaFinalZero:
51
51
  while findUnpairedBinary1 >= 0:
52
52
  XOrHere2makePair <<= 2
53
- findUnpairedBinary1 += 1 if (bifurcationEven & XOrHere2makePair) == 0 else -1
54
- bifurcationEven ^= XOrHere2makePair
53
+ findUnpairedBinary1 += 1 if (bifurcationZulu & XOrHere2makePair) == 0 else -1
54
+ bifurcationZulu ^= XOrHere2makePair
55
55
 
56
- elif bifurcationOddFinalZero and not bifurcationEvenFinalZero:
56
+ elif bifurcationAlphaFinalZero and not bifurcationZuluFinalZero:
57
57
  while findUnpairedBinary1 >= 0:
58
58
  XOrHere2makePair <<= 2
59
- findUnpairedBinary1 += 1 if (bifurcationOdd & XOrHere2makePair) == 0 else -1
60
- bifurcationOdd ^= XOrHere2makePair
59
+ findUnpairedBinary1 += 1 if (bifurcationAlpha & XOrHere2makePair) == 0 else -1
60
+ bifurcationAlpha ^= XOrHere2makePair
61
61
 
62
- curveLocationAnalysis = ((bifurcationEven >> 2) << 1) | (bifurcationOdd >> 2)
62
+ curveLocationAnalysis = ((bifurcationZulu >> 2) << 1) | (bifurcationAlpha >> 2)
63
63
  recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
64
64
 
65
65
  return sum(getCurveLocations().values())
@@ -3,8 +3,8 @@ import sys
3
3
 
4
4
  class limitLocators(NamedTuple):
5
5
  curveLocationsMAXIMUM: int
6
- bifurcationEvenLocator: int
7
- bifurcationOddLocator: int
6
+ bifurcationZuluLocator: int
7
+ bifurcationAlphaLocator: int
8
8
 
9
9
  curveMaximum: dict[int, limitLocators] = {
10
10
  0: limitLocators(16, 0x2a, 0x15),
@@ -75,8 +75,8 @@ def makeCurveMaximum() -> None:
75
75
  sys.stdout.write("curveMaximum: dict[int, limitLocators] = {\n")
76
76
  for n in range(62):
77
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")
78
+ bifurcationAlphaLocator = int('01' * ((curveLocationsMAXIMUM.bit_length() + 1) // 2), 2)
79
+ sys.stdout.write(f"{n}: limitLocators({curveLocationsMAXIMUM}, {hex(bifurcationAlphaLocator << 1)}, {hex(bifurcationAlphaLocator)}),\n")
80
80
  sys.stdout.write("}\n")
81
81
 
82
82
  if __name__ == '__main__':
@@ -0,0 +1,90 @@
1
+ from mapFolding._oeisFormulas.matrixMeandersAnnex import curveMaximum as curveMaximum
2
+ from queue import Empty, SimpleQueue
3
+ from typing import NamedTuple
4
+ import contextlib
5
+
6
+ class BifurcatedCurves(NamedTuple):
7
+ bifurcationZulu: int
8
+ bifurcationAlpha: int
9
+ distinctCrossings: int
10
+ curveLocationsMAXIMUM: int
11
+
12
+ dictionaryCurveLocations: dict[int, int] = {}
13
+ simpleQueueCurveLocations: SimpleQueue[tuple[int, int]] = SimpleQueue()
14
+
15
+ def unpackQueue() -> dict[int, int]:
16
+ with contextlib.suppress(Empty):
17
+ while True:
18
+ curveLocations, distinctCrossings = simpleQueueCurveLocations.get_nowait()
19
+ dictionaryCurveLocations[curveLocations] = dictionaryCurveLocations.get(curveLocations, 0) + distinctCrossings
20
+
21
+ return dictionaryCurveLocations
22
+
23
+ def getCurveLocations(bridges: int) -> list[BifurcatedCurves]:
24
+ global dictionaryCurveLocations # noqa: PLW0603
25
+ dictionaryCurveLocations = unpackQueue()
26
+ curveLocationsMAXIMUM, bifurcationZuluLocator, bifurcationAlphaLocator = curveMaximum[bridges]
27
+ listBifurcatedCurves: list[BifurcatedCurves] = []
28
+ # TODO This is ready for concurrency and/or vectorization.
29
+ for curveLocations, distinctCrossings in dictionaryCurveLocations.items():
30
+ bifurcationZulu = (curveLocations & bifurcationZuluLocator) >> 1
31
+ bifurcationAlpha = (curveLocations & bifurcationAlphaLocator)
32
+ listBifurcatedCurves.append(BifurcatedCurves(bifurcationZulu, bifurcationAlpha, distinctCrossings, curveLocationsMAXIMUM))
33
+ dictionaryCurveLocations = {}
34
+ return listBifurcatedCurves
35
+
36
+ def recordAnalysis(curveLocationAnalysis: int, curveLocationsMAXIMUM: int, distinctCrossings: int) -> None:
37
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
38
+ simpleQueueCurveLocations.put((curveLocationAnalysis, distinctCrossings))
39
+
40
+ def analyzeCurve(bifurcationZulu: int, bifurcationAlpha: int, distinctCrossings: int, curveLocationsMAXIMUM: int) -> None:
41
+ bifurcationZuluFinalZero = (bifurcationZulu & 0b1) == 0
42
+ bifurcationZuluHasCurves = bifurcationZulu != 1
43
+ bifurcationAlphaFinalZero = (bifurcationAlpha & 0b1) == 0
44
+ bifurcationAlphaHasCurves = bifurcationAlpha != 1
45
+
46
+ if bifurcationZuluHasCurves:
47
+ curveLocationAnalysis = (bifurcationZulu >> 1) | (bifurcationAlpha << 2) | bifurcationZuluFinalZero
48
+ recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
49
+
50
+ if bifurcationAlphaHasCurves:
51
+ curveLocationAnalysis = (bifurcationAlpha >> 2) | (bifurcationZulu << 3) | (bifurcationAlphaFinalZero << 1)
52
+ recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
53
+
54
+ curveLocationAnalysis = ((bifurcationAlpha | (bifurcationZulu << 1)) << 2) | 3
55
+ recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
56
+
57
+ if bifurcationZuluHasCurves and bifurcationAlphaHasCurves and (bifurcationZuluFinalZero or bifurcationAlphaFinalZero):
58
+ XOrHere2makePair = 0b1
59
+ findUnpairedBinary1 = 0
60
+
61
+ if bifurcationZuluFinalZero and not bifurcationAlphaFinalZero:
62
+ while findUnpairedBinary1 >= 0:
63
+ XOrHere2makePair <<= 2
64
+ findUnpairedBinary1 += 1 if (bifurcationZulu & XOrHere2makePair) == 0 else -1
65
+ bifurcationZulu ^= XOrHere2makePair
66
+
67
+ elif bifurcationAlphaFinalZero and not bifurcationZuluFinalZero:
68
+ while findUnpairedBinary1 >= 0:
69
+ XOrHere2makePair <<= 2
70
+ findUnpairedBinary1 += 1 if (bifurcationAlpha & XOrHere2makePair) == 0 else -1
71
+ bifurcationAlpha ^= XOrHere2makePair
72
+
73
+ curveLocationAnalysis = ((bifurcationZulu >> 2) << 1) | (bifurcationAlpha >> 2)
74
+ recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
75
+
76
+ def initializeCurveLocations(startingCurveLocations: dict[int, int]) -> None:
77
+ global dictionaryCurveLocations # noqa: PLW0603
78
+ dictionaryCurveLocations = startingCurveLocations.copy()
79
+
80
+ def count(bridges: int, startingCurveLocations: dict[int, int]) -> int:
81
+ initializeCurveLocations(startingCurveLocations)
82
+
83
+ while bridges > 0:
84
+ bridges -= 1
85
+
86
+ # TODO This could be parallelized when `recordAnalysis` is thread-safe
87
+ for bifurcatedCurve in getCurveLocations(bridges):
88
+ analyzeCurve(*bifurcatedCurve)
89
+
90
+ return getCurveLocations(bridges)[0].distinctCrossings
@@ -0,0 +1,104 @@
1
+ def count(bridges: int, startingCurveLocations: dict[int, int]) -> int:
2
+ listCurveMaximums: list[tuple[int, int, int]] = [
3
+ (16, 0x2a, 0x15),
4
+ (64, 0xaa, 0x55),
5
+ (256, 0x2aa, 0x155),
6
+ (1024, 0xaaa, 0x555),
7
+ (4096, 0x2aaa, 0x1555),
8
+ (16384, 0xaaaa, 0x5555),
9
+ (65536, 0x2aaaa, 0x15555),
10
+ (262144, 0xaaaaa, 0x55555),
11
+ (1048576, 0x2aaaaa, 0x155555),
12
+ (4194304, 0xaaaaaa, 0x555555),
13
+ (16777216, 0x2aaaaaa, 0x1555555),
14
+ (67108864, 0xaaaaaaa, 0x5555555),
15
+ (268435456, 0x2aaaaaaa, 0x15555555),
16
+ (1073741824, 0xaaaaaaaa, 0x55555555),
17
+ (4294967296, 0x2aaaaaaaa, 0x155555555),
18
+ (17179869184, 0xaaaaaaaaa, 0x555555555),
19
+ (68719476736, 0x2aaaaaaaaa, 0x1555555555),
20
+ (274877906944, 0xaaaaaaaaaa, 0x5555555555),
21
+ (1099511627776, 0x2aaaaaaaaaa, 0x15555555555),
22
+ (4398046511104, 0xaaaaaaaaaaa, 0x55555555555),
23
+ (17592186044416, 0x2aaaaaaaaaaa, 0x155555555555),
24
+ (70368744177664, 0xaaaaaaaaaaaa, 0x555555555555),
25
+ (281474976710656, 0x2aaaaaaaaaaaa, 0x1555555555555),
26
+ (1125899906842624, 0xaaaaaaaaaaaaa, 0x5555555555555),
27
+ (4503599627370496, 0x2aaaaaaaaaaaaa, 0x15555555555555),
28
+ (18014398509481984, 0xaaaaaaaaaaaaaa, 0x55555555555555),
29
+ (72057594037927936, 0x2aaaaaaaaaaaaaa, 0x155555555555555),
30
+ (288230376151711744, 0xaaaaaaaaaaaaaaa, 0x555555555555555),
31
+ (1152921504606846976, 0x2aaaaaaaaaaaaaaa, 0x1555555555555555), # 0x2aaaaaaaaaaaaaaa.bit_length() = 62
32
+ (4611686018427387904, 0xaaaaaaaaaaaaaaaa, 0x5555555555555555),
33
+ (18446744073709551616, 0x2aaaaaaaaaaaaaaaa, 0x15555555555555555),
34
+ (73786976294838206464, 0xaaaaaaaaaaaaaaaaa, 0x55555555555555555),
35
+ (295147905179352825856, 0x2aaaaaaaaaaaaaaaaa, 0x155555555555555555),
36
+ (1180591620717411303424, 0xaaaaaaaaaaaaaaaaaa, 0x555555555555555555),
37
+ (4722366482869645213696, 0x2aaaaaaaaaaaaaaaaaa, 0x1555555555555555555),
38
+ (18889465931478580854784, 0xaaaaaaaaaaaaaaaaaaa, 0x5555555555555555555),
39
+ (75557863725914323419136, 0x2aaaaaaaaaaaaaaaaaaa, 0x15555555555555555555),
40
+ (302231454903657293676544, 0xaaaaaaaaaaaaaaaaaaaa, 0x55555555555555555555),
41
+ (1208925819614629174706176, 0x2aaaaaaaaaaaaaaaaaaaa, 0x155555555555555555555),
42
+ (4835703278458516698824704, 0xaaaaaaaaaaaaaaaaaaaaa, 0x555555555555555555555),
43
+ (19342813113834066795298816, 0x2aaaaaaaaaaaaaaaaaaaaa, 0x1555555555555555555555),
44
+ (77371252455336267181195264, 0xaaaaaaaaaaaaaaaaaaaaaa, 0x5555555555555555555555),
45
+ (309485009821345068724781056, 0x2aaaaaaaaaaaaaaaaaaaaaa, 0x15555555555555555555555),
46
+ (1237940039285380274899124224, 0xaaaaaaaaaaaaaaaaaaaaaaa, 0x55555555555555555555555),
47
+ (4951760157141521099596496896, 0x2aaaaaaaaaaaaaaaaaaaaaaa, 0x155555555555555555555555),
48
+ (19807040628566084398385987584, 0xaaaaaaaaaaaaaaaaaaaaaaaa, 0x555555555555555555555555),
49
+ ]
50
+
51
+ listCurveMaximums = listCurveMaximums[0:bridges]
52
+ dictionaryCurveLocations: dict[int, int] = {}
53
+
54
+ while bridges > 0:
55
+ bridges -= 1
56
+
57
+ curveLocationsMAXIMUM, bifurcationZuluLocator, bifurcationAlphaLocator = listCurveMaximums.pop()
58
+
59
+ for curveLocations, distinctCrossings in startingCurveLocations.items():
60
+ bifurcationZulu = (curveLocations & bifurcationZuluLocator) >> 1
61
+ bifurcationAlpha = (curveLocations & bifurcationAlphaLocator)
62
+ bifurcationZuluFinalZero = (bifurcationZulu & 0b1) == 0
63
+ bifurcationZuluHasCurves = bifurcationZulu != 1
64
+ bifurcationAlphaFinalZero = (bifurcationAlpha & 0b1) == 0
65
+ bifurcationAlphaHasCurves = bifurcationAlpha != 1
66
+
67
+ if bifurcationZuluHasCurves:
68
+ curveLocationAnalysis = (bifurcationZulu >> 1) | (bifurcationAlpha << 2) | bifurcationZuluFinalZero
69
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
70
+ dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
71
+
72
+ if bifurcationAlphaHasCurves:
73
+ curveLocationAnalysis = (bifurcationAlpha >> 2) | (bifurcationZulu << 3) | (bifurcationAlphaFinalZero << 1)
74
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
75
+ dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
76
+
77
+ curveLocationAnalysis = ((bifurcationAlpha | (bifurcationZulu << 1)) << 2) | 3
78
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
79
+ dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
80
+
81
+ if bifurcationZuluHasCurves and bifurcationAlphaHasCurves and (bifurcationZuluFinalZero or bifurcationAlphaFinalZero):
82
+ XOrHere2makePair = 0b1
83
+ findUnpairedBinary1 = 0
84
+
85
+ if bifurcationZuluFinalZero and not bifurcationAlphaFinalZero:
86
+ while findUnpairedBinary1 >= 0:
87
+ XOrHere2makePair <<= 2
88
+ findUnpairedBinary1 += 1 if (bifurcationZulu & XOrHere2makePair) == 0 else -1
89
+ bifurcationZulu ^= XOrHere2makePair
90
+
91
+ elif bifurcationAlphaFinalZero and not bifurcationZuluFinalZero:
92
+ while findUnpairedBinary1 >= 0:
93
+ XOrHere2makePair <<= 2
94
+ findUnpairedBinary1 += 1 if (bifurcationAlpha & XOrHere2makePair) == 0 else -1
95
+ bifurcationAlpha ^= XOrHere2makePair
96
+
97
+ curveLocationAnalysis = ((bifurcationZulu >> 2) << 1) | (bifurcationAlpha >> 2)
98
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
99
+ dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
100
+
101
+ startingCurveLocations = dictionaryCurveLocations.copy()
102
+ dictionaryCurveLocations = {}
103
+
104
+ return sum(startingCurveLocations.values())
@@ -232,7 +232,7 @@ class DeReConstructField2ast:
232
232
  self.ledger.addImportFrom_asStr(moduleWithLogicalPath, 'dtype')
233
233
  axesSubscript = Make.Subscript(Make.Name('tuple'), Make.Name('uint8'))
234
234
  dtype_asnameName: ast.Name = self.astAnnotation
235
- if dtype_asnameName.id == 'Array3D':
235
+ if dtype_asnameName.id == 'Array3DLeavesTotal':
236
236
  axesSubscript = Make.Subscript(Make.Name('tuple'), Make.Tuple([Make.Name('uint8'), Make.Name('uint8'), Make.Name('uint8')]))
237
237
  ast_expr = Make.Subscript(Make.Name(annotationType), Make.Tuple([axesSubscript, Make.Subscript(Make.Name('dtype'), dtype_asnameName)]))
238
238
  constructor = 'array'
@@ -292,7 +292,7 @@ if __name__ == '__main__':
292
292
  listNumPyTypeConfigs = [
293
293
  DatatypeConfig(fml='Array1DLeavesTotal', Z0Z_module='numpy', Z0Z_type_name='uint8', Z0Z_asname='Array1DLeavesTotal'),
294
294
  DatatypeConfig(fml='Array1DElephino', Z0Z_module='numpy', Z0Z_type_name='uint16', Z0Z_asname='Array1DElephino'),
295
- DatatypeConfig(fml='Array3D', Z0Z_module='numpy', Z0Z_type_name='uint8', Z0Z_asname='Array3D'),
295
+ DatatypeConfig(fml='Array3DLeavesTotal', Z0Z_module='numpy', Z0Z_type_name='uint8', Z0Z_asname='Array3DLeavesTotal'),
296
296
  ]
297
297
 
298
298
  for typeConfig in listNumPyTypeConfigs:
@@ -58,7 +58,7 @@ listDatatypeConfigurations: list[DatatypeConfiguration] = [
58
58
  listNumPy_dtype: list[DatatypeConfiguration] = [
59
59
  DatatypeConfiguration(datatypeIdentifier='Array1DLeavesTotal', typeModule='numpy', typeIdentifier='uint8', type_asname='Array1DLeavesTotal'),
60
60
  DatatypeConfiguration(datatypeIdentifier='Array1DElephino', typeModule='numpy', typeIdentifier='uint8', type_asname='Array1DElephino'),
61
- DatatypeConfiguration(datatypeIdentifier='Array3D', typeModule='numpy', typeIdentifier='uint8', type_asname='Array3D'),
61
+ DatatypeConfiguration(datatypeIdentifier='Array3DLeavesTotal', typeModule='numpy', typeIdentifier='uint8', type_asname='Array3DLeavesTotal'),
62
62
  ]
63
63
 
64
64
  def _addWriteFoldsTotal(ingredientsFunction: IngredientsFunction, job: RecipeJobTheorem2) -> IngredientsFunction:
@@ -1,13 +1,16 @@
1
1
  from concurrent.futures import Future as ConcurrentFuture, ProcessPoolExecutor
2
2
  from copy import deepcopy
3
- from mapFolding.dataBaskets import Array1DElephino, Array1DLeavesTotal, Array3D, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal, ParallelMapFoldingState
3
+ from mapFolding.dataBaskets import (
4
+ Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal,
5
+ ParallelMapFoldingState)
4
6
  from multiprocessing import set_start_method as multiprocessing_set_start_method
5
7
  from numba import jit
8
+
6
9
  if __name__ == '__main__':
7
10
  multiprocessing_set_start_method('spawn')
8
11
 
9
12
  @jit(cache=True, error_model='numpy', fastmath=True, forceinline=True)
10
- def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexLeaf: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, connectionGraph: Array3D, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal, taskDivisions: DatatypeLeavesTotal, taskIndex: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3D, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal]:
13
+ def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexLeaf: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, connectionGraph: Array3DLeavesTotal, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal, taskDivisions: DatatypeLeavesTotal, taskIndex: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal]:
11
14
  while leaf1ndex > 0:
12
15
  if leaf1ndex <= 1 or leafBelow[0] == 1:
13
16
  if leaf1ndex > leavesTotal:
@@ -72,7 +75,7 @@ def unRepackParallelMapFoldingState(state: ParallelMapFoldingState) -> ParallelM
72
75
  gapsWhere: Array1DLeavesTotal = state.gapsWhere
73
76
  leafAbove: Array1DLeavesTotal = state.leafAbove
74
77
  leafBelow: Array1DLeavesTotal = state.leafBelow
75
- connectionGraph: Array3D = state.connectionGraph
78
+ connectionGraph: Array3DLeavesTotal = state.connectionGraph
76
79
  dimensionsTotal: DatatypeLeavesTotal = state.dimensionsTotal
77
80
  leavesTotal: DatatypeLeavesTotal = state.leavesTotal
78
81
  taskDivisions: DatatypeLeavesTotal = state.taskDivisions
@@ -95,4 +98,4 @@ def doTheNeedful(state: ParallelMapFoldingState, concurrencyLimit: int) -> tuple
95
98
  listStatesParallel[indexSherpa] = dictionaryConcurrency[indexSherpa].result()
96
99
  groupsOfFoldsTotal += listStatesParallel[indexSherpa].groupsOfFolds
97
100
  foldsTotal: int = groupsOfFoldsTotal * stateParallel.leavesTotal
98
- return (foldsTotal, listStatesParallel)
101
+ return (foldsTotal, listStatesParallel)
@@ -1,8 +1,10 @@
1
- from mapFolding.dataBaskets import Array1DElephino, Array1DLeavesTotal, Array3D, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal, MapFoldingState
1
+ from mapFolding.dataBaskets import (
2
+ Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal,
3
+ MapFoldingState)
2
4
  from numba import jit
3
5
 
4
6
  @jit(cache=True, error_model='numpy', fastmath=True, forceinline=True)
5
- def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexLeaf: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, connectionGraph: Array3D, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3D, DatatypeLeavesTotal, DatatypeLeavesTotal]:
7
+ def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexLeaf: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, connectionGraph: Array3DLeavesTotal, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal]:
6
8
  while leaf1ndex > 0:
7
9
  if leaf1ndex <= 1 or leafBelow[0] == 1:
8
10
  if leaf1ndex > leavesTotal:
@@ -66,9 +68,9 @@ def doTheNeedful(state: MapFoldingState) -> MapFoldingState:
66
68
  gapsWhere: Array1DLeavesTotal = state.gapsWhere
67
69
  leafAbove: Array1DLeavesTotal = state.leafAbove
68
70
  leafBelow: Array1DLeavesTotal = state.leafBelow
69
- connectionGraph: Array3D = state.connectionGraph
71
+ connectionGraph: Array3DLeavesTotal = state.connectionGraph
70
72
  dimensionsTotal: DatatypeLeavesTotal = state.dimensionsTotal
71
73
  leavesTotal: DatatypeLeavesTotal = state.leavesTotal
72
74
  groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal = count(groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal)
73
75
  state = MapFoldingState(mapShape=mapShape, groupsOfFolds=groupsOfFolds, gap1ndex=gap1ndex, gap1ndexCeiling=gap1ndexCeiling, indexDimension=indexDimension, indexLeaf=indexLeaf, indexMiniGap=indexMiniGap, leaf1ndex=leaf1ndex, leafConnectee=leafConnectee, dimensionsUnconstrained=dimensionsUnconstrained, countDimensionsGapped=countDimensionsGapped, gapRangeStart=gapRangeStart, gapsWhere=gapsWhere, leafAbove=leafAbove, leafBelow=leafBelow)
74
- return state
76
+ return state
@@ -1,4 +1,6 @@
1
- from mapFolding.dataBaskets import Array1DElephino, Array1DLeavesTotal, Array3D, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal, MapFoldingState
1
+ from mapFolding.dataBaskets import (
2
+ Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal,
3
+ MapFoldingState)
2
4
  from mapFolding.syntheticModules.theorem2Numba import count
3
5
 
4
6
  def sequential(state: MapFoldingState) -> MapFoldingState:
@@ -17,9 +19,9 @@ def sequential(state: MapFoldingState) -> MapFoldingState:
17
19
  gapsWhere: Array1DLeavesTotal = state.gapsWhere
18
20
  leafAbove: Array1DLeavesTotal = state.leafAbove
19
21
  leafBelow: Array1DLeavesTotal = state.leafBelow
20
- connectionGraph: Array3D = state.connectionGraph
22
+ connectionGraph: Array3DLeavesTotal = state.connectionGraph
21
23
  dimensionsTotal: DatatypeLeavesTotal = state.dimensionsTotal
22
24
  leavesTotal: DatatypeLeavesTotal = state.leavesTotal
23
25
  groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal = count(groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal)
24
26
  state = MapFoldingState(mapShape=mapShape, groupsOfFolds=groupsOfFolds, gap1ndex=gap1ndex, gap1ndexCeiling=gap1ndexCeiling, indexDimension=indexDimension, indexLeaf=indexLeaf, indexMiniGap=indexMiniGap, leaf1ndex=leaf1ndex, leafConnectee=leafConnectee, dimensionsUnconstrained=dimensionsUnconstrained, countDimensionsGapped=countDimensionsGapped, gapRangeStart=gapRangeStart, gapsWhere=gapsWhere, leafAbove=leafAbove, leafBelow=leafBelow)
25
- return state
27
+ return state
@@ -1,8 +1,9 @@
1
- from mapFolding.dataBaskets import Array1DElephino, Array1DLeavesTotal, Array3D, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal
1
+ from mapFolding.dataBaskets import (
2
+ Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal)
2
3
  from numba import jit
3
4
 
4
5
  @jit(cache=True, error_model='numpy', fastmath=True, forceinline=True)
5
- def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, connectionGraph: Array3D, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3D, DatatypeLeavesTotal, DatatypeLeavesTotal]:
6
+ def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, connectionGraph: Array3DLeavesTotal, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal]:
6
7
  while leaf1ndex > 4:
7
8
  if leafBelow[0] == 1:
8
9
  if leaf1ndex > leavesTotal:
@@ -42,4 +43,4 @@ def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1nde
42
43
  gapRangeStart[leaf1ndex] = gap1ndex
43
44
  leaf1ndex += 1
44
45
  groupsOfFolds *= 2
45
- return (groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal)
46
+ return (groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapFolding
3
- Version: 0.14.0
3
+ Version: 0.15.0
4
4
  Summary: Map folding, meanders, stamp folding, semi-meanders. Experiment with algorithm transformations and code optimization.
5
5
  Author-email: Hunter Hogan <HunterHogan@pm.me>
6
6
  License: CC-BY-NC-4.0
@@ -8,7 +8,7 @@ Project-URL: Donate, https://www.patreon.com/integrated
8
8
  Project-URL: Homepage, https://github.com/hunterhogan/mapFolding
9
9
  Project-URL: Issues, https://github.com/hunterhogan/mapFolding/issues
10
10
  Project-URL: Repository, https://github.com/hunterhogan/mapFolding.git
11
- Keywords: A000136,A000560,A000682,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
11
+ Keywords: A000136,A000560,A000682,A001415,A001416,A001417,A001418,A005315,A005316,A007822,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,symmetric foldings,topological combinatorics,topological patterns,typed Python
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
@@ -34,15 +34,14 @@ Classifier: Typing :: Typed
34
34
  Requires-Python: >=3.12
35
35
  Description-Content-Type: text/markdown
36
36
  License-File: LICENSE
37
- Requires-Dist: astToolkit>=0.7.1
38
- Requires-Dist: cytoolz
37
+ Requires-Dist: astToolkit
39
38
  Requires-Dist: hunterMakesPy
40
- Requires-Dist: numba
41
39
  Requires-Dist: numpy
42
40
  Requires-Dist: platformdirs
43
41
  Provides-Extra: development
44
42
  Requires-Dist: mypy; extra == "development"
45
43
  Requires-Dist: pyupgrade; extra == "development"
44
+ Requires-Dist: py-spy; extra == "development"
46
45
  Requires-Dist: setuptools-scm; extra == "development"
47
46
  Provides-Extra: numba
48
47
  Requires-Dist: numba; extra == "numba"