mapFolding 0.16.2__py3-none-any.whl → 0.16.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. easyRun/NOTcountingFolds.py +6 -5
  2. easyRun/countFolds.py +1 -1
  3. easyRun/generateAllModules.py +14 -0
  4. easyRun/meanders.py +1 -1
  5. mapFolding/__init__.py +1 -0
  6. mapFolding/_theSSOT.py +3 -2
  7. mapFolding/_theTypes.py +3 -0
  8. mapFolding/algorithms/A086345.py +75 -0
  9. mapFolding/algorithms/oeisIDbyFormula.py +2 -2
  10. mapFolding/algorithms/symmetricFolds.py +36 -0
  11. mapFolding/basecamp.py +80 -149
  12. mapFolding/dataBaskets.py +123 -5
  13. mapFolding/filesystemToolkit.py +4 -32
  14. mapFolding/oeis.py +5 -12
  15. mapFolding/reference/A086345Wu.py +25 -0
  16. mapFolding/reference/matrixMeandersAnalysis/signatures.py +3 -0
  17. mapFolding/someAssemblyRequired/A007822/A007822rawMaterials.py +10 -45
  18. mapFolding/someAssemblyRequired/A007822/_asynchronousAnnex.py +51 -0
  19. mapFolding/someAssemblyRequired/A007822/makeA007822AsynchronousModules.py +36 -195
  20. mapFolding/someAssemblyRequired/A007822/makeA007822Modules.py +42 -44
  21. mapFolding/someAssemblyRequired/RecipeJob.py +78 -18
  22. mapFolding/someAssemblyRequired/__init__.py +3 -8
  23. mapFolding/someAssemblyRequired/_toolkitContainers.py +32 -3
  24. mapFolding/someAssemblyRequired/infoBooth.py +40 -23
  25. mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +74 -153
  26. mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +56 -88
  27. mapFolding/someAssemblyRequired/makingModules_count.py +10 -12
  28. mapFolding/someAssemblyRequired/makingModules_doTheNeedful.py +6 -68
  29. mapFolding/someAssemblyRequired/{mapFolding → mapFoldingModules}/makeMapFoldingModules.py +24 -30
  30. mapFolding/someAssemblyRequired/meanders/makeMeandersModules.py +8 -6
  31. mapFolding/someAssemblyRequired/toolkitMakeModules.py +2 -2
  32. mapFolding/someAssemblyRequired/toolkitNumba.py +1 -1
  33. mapFolding/someAssemblyRequired/transformationTools.py +10 -12
  34. mapFolding/syntheticModules/A007822/algorithm.py +45 -50
  35. mapFolding/syntheticModules/A007822/asynchronous.py +91 -34
  36. mapFolding/syntheticModules/A007822/initializeState.py +15 -21
  37. mapFolding/syntheticModules/A007822/theorem2.py +16 -22
  38. mapFolding/syntheticModules/A007822/theorem2Numba.py +20 -26
  39. mapFolding/syntheticModules/A007822/theorem2Trimmed.py +17 -23
  40. mapFolding/syntheticModules/countParallelNumba.py +3 -7
  41. mapFolding/syntheticModules/daoOfMapFoldingNumba.py +1 -2
  42. mapFolding/syntheticModules/meanders/bigInt.py +9 -9
  43. mapFolding/syntheticModules/theorem2Numba.py +28 -9
  44. mapFolding/syntheticModules/theorem2Trimmed.py +1 -1
  45. mapFolding/tests/test_computations.py +1 -1
  46. {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/METADATA +4 -1
  47. {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/RECORD +52 -61
  48. mapFolding/_dataPacking.py +0 -68
  49. mapFolding/reference/meandersDumpingGround/A005316intOptimized.py +0 -122
  50. mapFolding/reference/meandersDumpingGround/A005316optimized128bit.py +0 -79
  51. mapFolding/reference/meandersDumpingGround/matrixMeandersBaseline.py +0 -65
  52. mapFolding/reference/meandersDumpingGround/matrixMeandersBaselineAnnex.py +0 -84
  53. mapFolding/reference/meandersDumpingGround/matrixMeandersSimpleQueue.py +0 -90
  54. mapFolding/syntheticModules/A007822/algorithmNumba.py +0 -94
  55. mapFolding/syntheticModules/A007822/asynchronousAnnex.py +0 -66
  56. mapFolding/syntheticModules/A007822/asynchronousAnnexNumba.py +0 -70
  57. mapFolding/syntheticModules/A007822/asynchronousNumba.py +0 -79
  58. mapFolding/syntheticModules/A007822/asynchronousTheorem2.py +0 -65
  59. mapFolding/syntheticModules/A007822/asynchronousTrimmed.py +0 -56
  60. mapFolding/syntheticModules/dataPacking.py +0 -26
  61. mapFolding/syntheticModules/dataPackingA007822.py +0 -92
  62. /mapFolding/someAssemblyRequired/{mapFolding → mapFoldingModules}/__init__.py +0 -0
  63. {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/WHEEL +0 -0
  64. {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/entry_points.txt +0 -0
  65. {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/licenses/LICENSE +0 -0
  66. {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/top_level.txt +0 -0
@@ -1,122 +0,0 @@
1
- from collections.abc import Iterable
2
- from hunterMakesPy import raiseIfNone
3
-
4
- class BasicMeanderProblem:
5
-
6
- def __init__(self, remainingBridges: int) -> None:
7
- self.remainingBridges = remainingBridges
8
- self.archStateLimit = 1 << (2 + (2 * (remainingBridges + 1)))
9
- self.bridgesTotalIsOdd = (remainingBridges & 1) == 1
10
-
11
- def initializeA005316(self) -> list[int]:
12
- if self.bridgesTotalIsOdd:
13
- bitPattern = (1 << 2) | 1
14
- bitPattern <<= 2
15
- return [bitPattern | 1 << 1]
16
- else:
17
- bitPattern = (1 << 2) | 1
18
- return [bitPattern | bitPattern << 1]
19
-
20
- def initializeA000682(self) -> list[int]:
21
- initialStatesList: list[int] = []
22
- bitPattern = 1 if self.bridgesTotalIsOdd else ((1 << 2) | 1)
23
-
24
- packedState = bitPattern | bitPattern << 1
25
- while packedState < self.archStateLimit:
26
- initialStatesList.append(packedState)
27
- bitPattern = ((bitPattern << 2) | 1) << 2 | 1
28
- packedState = bitPattern | bitPattern << 1
29
-
30
- return initialStatesList
31
-
32
- def enumerate(self, packedState: int) -> list[int]: # noqa: C901
33
- bitMask = 0x5555555555555555
34
- bitWidth = 64
35
- while bitMask < packedState:
36
- bitMask |= bitMask << bitWidth
37
- bitWidth += bitWidth
38
- lower: int = packedState & bitMask
39
- upper: int = (packedState - lower) >> 1
40
- nextStatesList: list[int] = []
41
-
42
- if lower != 1:
43
- nextState: int = (lower >> 2 | (((upper << 2) ^ (1 if (lower & 1) == 0 else 0)) << 1))
44
- if nextState < self.archStateLimit:
45
- nextStatesList.append(nextState)
46
-
47
- if upper != 1:
48
- nextState = (((lower << 2) ^ (1 if (upper & 1) == 0 else 0)) | (upper >> 2) << 1)
49
- if nextState < self.archStateLimit:
50
- nextStatesList.append(nextState)
51
-
52
- nextState = ((lower << 2) | 1 | ((upper << 2) | 1) << 1)
53
- if nextState < self.archStateLimit:
54
- nextStatesList.append(nextState)
55
-
56
- if lower != 1 and upper != 1 and ((lower & 1) == 0 or (upper & 1) == 0):
57
- if (lower & 1) == 0 and (upper & 1) == 1:
58
- archBalance = 0
59
- bitPosition = 1
60
- while archBalance >= 0:
61
- bitPosition <<= 2
62
- archBalance += 1 if (lower & bitPosition) == 0 else -1
63
- lower ^= bitPosition
64
- if (upper & 1) == 0 and (lower & 1) == 1:
65
- archBalance = 0
66
- bitPosition = 1
67
- while archBalance >= 0:
68
- bitPosition <<= 2
69
- archBalance += 1 if (upper & bitPosition) == 0 else -1
70
- upper ^= bitPosition
71
- nextState = (lower >> 2 | (upper >> 2) << 1)
72
- if nextState < self.archStateLimit:
73
- nextStatesList.append(nextState)
74
-
75
- return nextStatesList
76
-
77
- class SimpleProcessor:
78
-
79
- def __init__(self) -> None:
80
- self.createStateMachine: type | None = None
81
- self.totalTransitions = 0
82
-
83
- def setCreateStateMachine(self, stateMachineCreator: type) -> None:
84
- self.createStateMachine = stateMachineCreator
85
-
86
- def process(self, bridgesCount: int, initialStates: Iterable[int]) -> int:
87
- stateCounts: list[tuple[int, int]] = [(state, 1) for state in initialStates]
88
-
89
- self.createStateMachine = raiseIfNone(self.createStateMachine, "State machine creator must be set before processing.")
90
- bridgesRemaining: int = bridgesCount
91
- while bridgesRemaining > 0:
92
- bridgesRemaining -= 1
93
- stateCounts = self._accumulate(self.createStateMachine(bridgesRemaining), stateCounts)
94
-
95
- return sum(count for state, count in stateCounts)
96
-
97
- def _accumulate(self, layer: BasicMeanderProblem, previousCounts: list[tuple[int, int]]) -> list[tuple[int, int]]:
98
- stateCountsDict: dict[int, int] = {}
99
- transitions: int = 0
100
-
101
- for state, count in previousCounts:
102
- for nextState in layer.enumerate(state):
103
- if nextState in stateCountsDict:
104
- stateCountsDict[nextState] += count
105
- else:
106
- stateCountsDict[nextState] = count
107
- transitions += 1
108
-
109
- self.totalTransitions += transitions
110
- return list(stateCountsDict.items())
111
-
112
- def A005316(n: int) -> int:
113
- processor = SimpleProcessor()
114
- processor.setCreateStateMachine(BasicMeanderProblem)
115
- meanderProblem = BasicMeanderProblem(n)
116
- return processor.process(n, meanderProblem.initializeA005316())
117
-
118
- def A000682(n: int) -> int:
119
- processor = SimpleProcessor()
120
- processor.setCreateStateMachine(BasicMeanderProblem)
121
- meanderProblem = BasicMeanderProblem(n-1)
122
- return processor.process(n-1, meanderProblem.initializeA000682())
@@ -1,79 +0,0 @@
1
- def count(bridges: int, dictionaryCurveLocationsKnown: dict[int, int]) -> int:
2
- while bridges > 0:
3
- bridges -= 1
4
- curveLocationsMAXIMUM = 1 << (2 * bridges + 4)
5
- dictionaryCurveLocationsDiscovered: dict[int, int] = {}
6
-
7
- for curveLocations, distinctCrossings in dictionaryCurveLocationsKnown.items():
8
- bifurcationAlpha = curveLocations & 0x5555555555555555555555555555555555555555555555555555555555555555
9
- bifurcationZulu = (curveLocations ^ bifurcationAlpha) >> 1
10
-
11
- bifurcationAlphaHasCurves = bifurcationAlpha != 1
12
- bifurcationZuluHasCurves = bifurcationZulu != 1
13
- bifurcationAlphaFinalZero = not bifurcationAlpha & 1
14
- bifurcationZuluFinalZero = not bifurcationZulu & 1
15
-
16
- if bifurcationAlphaHasCurves:
17
- curveLocationAnalysis = (bifurcationAlpha >> 2) | (bifurcationZulu << 3) | (bifurcationAlphaFinalZero << 1)
18
- if curveLocationAnalysis < curveLocationsMAXIMUM:
19
- dictionaryCurveLocationsDiscovered[curveLocationAnalysis] = dictionaryCurveLocationsDiscovered.get(curveLocationAnalysis, 0) + distinctCrossings
20
-
21
- if bifurcationZuluHasCurves:
22
- curveLocationAnalysis = (bifurcationZulu >> 1) | (bifurcationAlpha << 2) | bifurcationZuluFinalZero
23
- if curveLocationAnalysis < curveLocationsMAXIMUM:
24
- dictionaryCurveLocationsDiscovered[curveLocationAnalysis] = dictionaryCurveLocationsDiscovered.get(curveLocationAnalysis, 0) + distinctCrossings
25
-
26
- curveLocationAnalysis = ((bifurcationAlpha | (bifurcationZulu << 1)) << 2) | 3
27
- if curveLocationAnalysis < curveLocationsMAXIMUM:
28
- dictionaryCurveLocationsDiscovered[curveLocationAnalysis] = dictionaryCurveLocationsDiscovered.get(curveLocationAnalysis, 0) + distinctCrossings
29
-
30
- if bifurcationAlphaHasCurves and bifurcationZuluHasCurves and (bifurcationAlphaFinalZero or bifurcationZuluFinalZero):
31
- XOrHere2makePair = 0b1
32
- findUnpairedBinary1 = 0
33
- if bifurcationAlphaFinalZero and not bifurcationZuluFinalZero:
34
- while findUnpairedBinary1 >= 0:
35
- XOrHere2makePair <<= 2
36
- findUnpairedBinary1 += 1 if (bifurcationAlpha & XOrHere2makePair) == 0 else -1
37
- bifurcationAlpha ^= XOrHere2makePair
38
-
39
- elif bifurcationZuluFinalZero and not bifurcationAlphaFinalZero:
40
- while findUnpairedBinary1 >= 0:
41
- XOrHere2makePair <<= 2
42
- findUnpairedBinary1 += 1 if (bifurcationZulu & XOrHere2makePair) == 0 else -1
43
- bifurcationZulu ^= XOrHere2makePair
44
-
45
- curveLocationAnalysis = (bifurcationAlpha >> 2) | ((bifurcationZulu >> 2) << 1)
46
- if curveLocationAnalysis < curveLocationsMAXIMUM:
47
- dictionaryCurveLocationsDiscovered[curveLocationAnalysis] = dictionaryCurveLocationsDiscovered.get(curveLocationAnalysis, 0) + distinctCrossings
48
-
49
- dictionaryCurveLocationsKnown = dictionaryCurveLocationsDiscovered
50
-
51
- return sum(dictionaryCurveLocationsKnown.values())
52
-
53
- def initializeA005316(n: int) -> dict[int, int]:
54
- if n & 1:
55
- return {22: 1}
56
- else:
57
- return {15: 1}
58
-
59
- def initializeA000682(n: int) -> dict[int, int]:
60
- stateToCount: dict[int, int] = {}
61
-
62
- curveLocationsMAXIMUM = 1 << (2 * n + 4)
63
-
64
- bitPattern = 5 - (n & 1) * 4
65
-
66
- packedState = bitPattern | (bitPattern << 1)
67
- while packedState < curveLocationsMAXIMUM:
68
- stateToCount[packedState] = 1
69
- bitPattern = ((bitPattern << 4) | 0b0101)
70
- packedState = bitPattern | (bitPattern << 1)
71
-
72
- return stateToCount
73
-
74
- def A005316(n: int) -> int:
75
- return count(n, initializeA005316(n))
76
-
77
- def A000682(n: int) -> int:
78
- return count(n - 1, initializeA000682(n - 1))
79
-
@@ -1,65 +0,0 @@
1
- from mapFolding._oeisFormulas.matrixMeandersAnnex import curveMaximum as curveMaximum
2
-
3
- dictionaryCurveLocations: dict[int, int] = {}
4
-
5
- def getCurveLocations() -> dict[int, int]:
6
- global dictionaryCurveLocations # noqa: PLW0603
7
- sherpa = dictionaryCurveLocations.copy()
8
- dictionaryCurveLocations = {}
9
- return sherpa
10
-
11
- def recordAnalysis(curveLocationAnalysis: int, curveLocationsMAXIMUM: int, distinctCrossings: int) -> None:
12
- if curveLocationAnalysis < curveLocationsMAXIMUM:
13
- dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
14
-
15
- def initializeCurveLocations(startingCurveLocations: dict[int, int]) -> None:
16
- global dictionaryCurveLocations # noqa: PLW0603
17
- dictionaryCurveLocations = startingCurveLocations.copy()
18
-
19
- def count(bridges: int, startingCurveLocations: dict[int, int]) -> int:
20
- initializeCurveLocations(startingCurveLocations)
21
-
22
- while bridges > 0:
23
- bridges -= 1
24
- curveLocationsMAXIMUM, bifurcationZuluLocator, bifurcationAlphaLocator = curveMaximum[bridges]
25
-
26
- for curveLocations, distinctCrossings in getCurveLocations().items():
27
- bifurcationZulu = (curveLocations & bifurcationZuluLocator) >> 1
28
- bifurcationAlpha = curveLocations & bifurcationAlphaLocator
29
-
30
- bifurcationZuluFinalZero = (bifurcationZulu & 0b1) == 0
31
- bifurcationZuluHasCurves = bifurcationZulu != 1
32
- bifurcationAlphaFinalZero = (bifurcationAlpha & 0b1) == 0
33
- bifurcationAlphaHasCurves = bifurcationAlpha != 1
34
-
35
- if bifurcationZuluHasCurves:
36
- curveLocationAnalysis = (bifurcationZulu >> 1) | (bifurcationAlpha << 2) | bifurcationZuluFinalZero
37
- recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
38
-
39
- if bifurcationAlphaHasCurves:
40
- curveLocationAnalysis = (bifurcationAlpha >> 2) | (bifurcationZulu << 3) | (bifurcationAlphaFinalZero << 1)
41
- recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
42
-
43
- curveLocationAnalysis = ((bifurcationAlpha | (bifurcationZulu << 1)) << 2) | 3
44
- recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
45
-
46
- if bifurcationZuluHasCurves and bifurcationAlphaHasCurves and (bifurcationZuluFinalZero or bifurcationAlphaFinalZero):
47
- XOrHere2makePair = 0b1
48
- findUnpairedBinary1 = 0
49
-
50
- if bifurcationZuluFinalZero and not bifurcationAlphaFinalZero:
51
- while findUnpairedBinary1 >= 0:
52
- XOrHere2makePair <<= 2
53
- findUnpairedBinary1 += 1 if (bifurcationZulu & XOrHere2makePair) == 0 else -1
54
- bifurcationZulu ^= XOrHere2makePair
55
-
56
- elif bifurcationAlphaFinalZero and not bifurcationZuluFinalZero:
57
- while findUnpairedBinary1 >= 0:
58
- XOrHere2makePair <<= 2
59
- findUnpairedBinary1 += 1 if (bifurcationAlpha & XOrHere2makePair) == 0 else -1
60
- bifurcationAlpha ^= XOrHere2makePair
61
-
62
- curveLocationAnalysis = ((bifurcationZulu >> 2) << 1) | (bifurcationAlpha >> 2)
63
- recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
64
-
65
- return sum(getCurveLocations().values())
@@ -1,84 +0,0 @@
1
- from typing import NamedTuple
2
- import sys
3
-
4
- class limitLocators(NamedTuple):
5
- curveLocationsMAXIMUM: int
6
- bifurcationZuluLocator: int
7
- bifurcationAlphaLocator: 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
- bifurcationAlphaLocator = int('01' * ((curveLocationsMAXIMUM.bit_length() + 1) // 2), 2)
79
- sys.stdout.write(f"{n}: limitLocators({curveLocationsMAXIMUM}, {hex(bifurcationAlphaLocator << 1)}, {hex(bifurcationAlphaLocator)}),\n")
80
- sys.stdout.write("}\n")
81
-
82
- if __name__ == '__main__':
83
- makeCurveMaximum()
84
-
@@ -1,90 +0,0 @@
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
@@ -1,94 +0,0 @@
1
- from mapFolding.dataBaskets import Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal, MapFoldingState
2
- from numba import jit
3
-
4
- @jit(cache=True, error_model='numpy', fastmath=True, forceinline=True)
5
- def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexLeaf: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, leafComparison: Array1DLeavesTotal, connectionGraph: Array3DLeavesTotal, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal]:
6
- while leaf1ndex > 0:
7
- if leaf1ndex <= 1 or leafBelow[0] == 1:
8
- if leaf1ndex > leavesTotal:
9
- indexLeaf = 0
10
- leafConnectee = 0
11
- while leafConnectee < leavesTotal + 1:
12
- leafNumber = int(leafBelow[indexLeaf])
13
- leafComparison[leafConnectee] = (leafNumber - indexLeaf + leavesTotal) % leavesTotal
14
- indexLeaf = leafNumber
15
- leafConnectee += 1
16
- indexInMiddle = leavesTotal // 2
17
- indexMiniGap = 0
18
- while indexMiniGap < leavesTotal + 1:
19
- ImaSymmetricFold = True
20
- leafConnectee = 0
21
- while leafConnectee < indexInMiddle:
22
- if leafComparison[(indexMiniGap + leafConnectee) % (leavesTotal + 1)] != leafComparison[(indexMiniGap + leavesTotal - 1 - leafConnectee) % (leavesTotal + 1)]:
23
- ImaSymmetricFold = False
24
- break
25
- leafConnectee += 1
26
- groupsOfFolds += ImaSymmetricFold
27
- indexMiniGap += 1
28
- else:
29
- dimensionsUnconstrained = dimensionsTotal
30
- gap1ndexCeiling = gapRangeStart[leaf1ndex - 1]
31
- indexDimension = 0
32
- while indexDimension < dimensionsTotal:
33
- leafConnectee = connectionGraph[indexDimension, leaf1ndex, leaf1ndex]
34
- if leafConnectee == leaf1ndex:
35
- dimensionsUnconstrained -= 1
36
- else:
37
- while leafConnectee != leaf1ndex:
38
- gapsWhere[gap1ndexCeiling] = leafConnectee
39
- if countDimensionsGapped[leafConnectee] == 0:
40
- gap1ndexCeiling += 1
41
- countDimensionsGapped[leafConnectee] += 1
42
- leafConnectee = connectionGraph[indexDimension, leaf1ndex, leafBelow[leafConnectee]]
43
- indexDimension += 1
44
- if not dimensionsUnconstrained:
45
- indexLeaf = 0
46
- while indexLeaf < leaf1ndex:
47
- gapsWhere[gap1ndexCeiling] = indexLeaf
48
- gap1ndexCeiling += 1
49
- indexLeaf += 1
50
- indexMiniGap = gap1ndex
51
- while indexMiniGap < gap1ndexCeiling:
52
- gapsWhere[gap1ndex] = gapsWhere[indexMiniGap]
53
- if countDimensionsGapped[gapsWhere[indexMiniGap]] == dimensionsUnconstrained:
54
- gap1ndex += 1
55
- countDimensionsGapped[gapsWhere[indexMiniGap]] = 0
56
- indexMiniGap += 1
57
- while leaf1ndex > 0 and gap1ndex == gapRangeStart[leaf1ndex - 1]:
58
- leaf1ndex -= 1
59
- leafBelow[leafAbove[leaf1ndex]] = leafBelow[leaf1ndex]
60
- leafAbove[leafBelow[leaf1ndex]] = leafAbove[leaf1ndex]
61
- if leaf1ndex > 0:
62
- gap1ndex -= 1
63
- leafAbove[leaf1ndex] = gapsWhere[gap1ndex]
64
- leafBelow[leaf1ndex] = leafBelow[leafAbove[leaf1ndex]]
65
- leafBelow[leafAbove[leaf1ndex]] = leaf1ndex
66
- leafAbove[leafBelow[leaf1ndex]] = leaf1ndex
67
- gapRangeStart[leaf1ndex] = gap1ndex
68
- leaf1ndex += 1
69
- groupsOfFolds = (groupsOfFolds + 1) // 2
70
- return (groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, leavesTotal)
71
-
72
- def doTheNeedful(state: MapFoldingState) -> MapFoldingState:
73
- mapShape: tuple[DatatypeLeavesTotal, ...] = state.mapShape
74
- groupsOfFolds: DatatypeFoldsTotal = state.groupsOfFolds
75
- gap1ndex: DatatypeElephino = state.gap1ndex
76
- gap1ndexCeiling: DatatypeElephino = state.gap1ndexCeiling
77
- indexDimension: DatatypeLeavesTotal = state.indexDimension
78
- indexLeaf: DatatypeLeavesTotal = state.indexLeaf
79
- indexMiniGap: DatatypeElephino = state.indexMiniGap
80
- leaf1ndex: DatatypeLeavesTotal = state.leaf1ndex
81
- leafConnectee: DatatypeLeavesTotal = state.leafConnectee
82
- dimensionsUnconstrained: DatatypeLeavesTotal = state.dimensionsUnconstrained
83
- countDimensionsGapped: Array1DLeavesTotal = state.countDimensionsGapped
84
- gapRangeStart: Array1DElephino = state.gapRangeStart
85
- gapsWhere: Array1DLeavesTotal = state.gapsWhere
86
- leafAbove: Array1DLeavesTotal = state.leafAbove
87
- leafBelow: Array1DLeavesTotal = state.leafBelow
88
- leafComparison: Array1DLeavesTotal = state.leafComparison
89
- connectionGraph: Array3DLeavesTotal = state.connectionGraph
90
- dimensionsTotal: DatatypeLeavesTotal = state.dimensionsTotal
91
- leavesTotal: DatatypeLeavesTotal = state.leavesTotal
92
- groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, leavesTotal = count(groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, leavesTotal)
93
- 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, leafComparison=leafComparison)
94
- return state
@@ -1,66 +0,0 @@
1
- from concurrent.futures import Future as ConcurrentFuture, ThreadPoolExecutor
2
- from hunterMakesPy import raiseIfNone
3
- from mapFolding import Array1DLeavesTotal
4
- from queue import Empty, Queue
5
- from threading import Thread
6
- import numpy
7
-
8
- concurrencyManager = None
9
- groupsOfFoldsTotal: int = 0
10
- processingThread = None
11
- queueFutures: Queue[ConcurrentFuture[int]] = Queue()
12
-
13
- def initializeConcurrencyManager(maxWorkers: int | None=None, groupsOfFolds: int=0) -> None:
14
- global concurrencyManager, queueFutures, groupsOfFoldsTotal, processingThread
15
- concurrencyManager = ThreadPoolExecutor(max_workers=maxWorkers)
16
- queueFutures = Queue()
17
- groupsOfFoldsTotal = groupsOfFolds
18
- processingThread = Thread(target=_processCompletedFutures)
19
- processingThread.start()
20
-
21
- def _processCompletedFutures() -> None:
22
- global queueFutures, groupsOfFoldsTotal
23
- while True:
24
- try:
25
- claimTicket: ConcurrentFuture[int] = queueFutures.get(timeout=1)
26
- if claimTicket is None:
27
- break
28
- groupsOfFoldsTotal += claimTicket.result()
29
- except Empty:
30
- continue
31
-
32
- def _filterAsymmetricFolds(leafBelow: Array1DLeavesTotal) -> int:
33
- groupsOfFolds = 0
34
- leafComparison: Array1DLeavesTotal = numpy.zeros_like(leafBelow)
35
- leavesTotal = leafBelow.size - 1
36
- indexLeaf = 0
37
- leafConnectee = 0
38
- while leafConnectee < leavesTotal + 1:
39
- leafNumber = int(leafBelow[indexLeaf])
40
- leafComparison[leafConnectee] = (leafNumber - indexLeaf + leavesTotal) % leavesTotal
41
- indexLeaf = leafNumber
42
- leafConnectee += 1
43
- indexInMiddle = leavesTotal // 2
44
- indexDistance = 0
45
- while indexDistance < leavesTotal + 1:
46
- ImaSymmetricFold = True
47
- leafConnectee = 0
48
- while leafConnectee < indexInMiddle:
49
- if leafComparison[(indexDistance + leafConnectee) % (leavesTotal + 1)] != leafComparison[(indexDistance + leavesTotal - 1 - leafConnectee) % (leavesTotal + 1)]:
50
- ImaSymmetricFold = False
51
- break
52
- leafConnectee += 1
53
- groupsOfFolds += ImaSymmetricFold
54
- indexDistance += 1
55
- return groupsOfFolds
56
-
57
- def filterAsymmetricFolds(leafBelow: Array1DLeavesTotal) -> None:
58
- global concurrencyManager, queueFutures
59
- queueFutures.put_nowait(raiseIfNone(concurrencyManager).submit(_filterAsymmetricFolds, leafBelow.copy()))
60
-
61
- def getSymmetricFoldsTotal() -> int:
62
- global concurrencyManager, queueFutures, processingThread
63
- raiseIfNone(concurrencyManager).shutdown(wait=True)
64
- queueFutures.put(None)
65
- raiseIfNone(processingThread).join()
66
- return groupsOfFoldsTotal
@@ -1,70 +0,0 @@
1
- from mapFolding import Array1DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal
2
- from queue import Queue
3
- from threading import Lock, Thread
4
- import numba
5
- import numpy
6
-
7
- listThreads: list[Thread] = []
8
- queueFutures: Queue[Array1DLeavesTotal] = Queue()
9
- groupsOfFoldsTotal: int = 0
10
- groupsOfFoldsTotalLock = Lock()
11
- sentinelStop = object()
12
-
13
- def initializeConcurrencyManager(maxWorkers: int, groupsOfFolds: int=0) -> None:
14
- global listThreads, groupsOfFoldsTotal, queueFutures # noqa: PLW0603
15
- listThreads = []
16
- queueFutures = Queue()
17
- groupsOfFoldsTotal = groupsOfFolds
18
- indexThread = 0
19
- while indexThread < maxWorkers:
20
- thread = Thread(target=_threadDoesSomething, name=f"thread{indexThread}", daemon=True)
21
- thread.start()
22
- listThreads.append(thread)
23
- indexThread += 1
24
-
25
- def _threadDoesSomething() -> None:
26
- global groupsOfFoldsTotal # noqa: PLW0603
27
- while True:
28
- leafBelow = queueFutures.get()
29
- if leafBelow is sentinelStop: # pyright: ignore[reportUnnecessaryComparison]
30
- break
31
- symmetricFolds = _filterAsymmetricFolds(leafBelow)
32
- with groupsOfFoldsTotalLock:
33
- groupsOfFoldsTotal += symmetricFolds
34
-
35
- @numba.jit(cache=True, error_model='numpy', fastmath=True)
36
- def _filterAsymmetricFolds(leafBelow: Array1DLeavesTotal) -> int:
37
- groupsOfFolds = 0
38
- leafComparison: Array1DLeavesTotal = numpy.zeros_like(leafBelow)
39
- leavesTotal = leafBelow.size - 1
40
- indexLeaf = 0
41
- leafConnectee = 0
42
- while leafConnectee < leavesTotal + 1:
43
- leafNumber = int(leafBelow[indexLeaf])
44
- leafComparison[leafConnectee] = (leafNumber - indexLeaf + leavesTotal) % leavesTotal
45
- indexLeaf = leafNumber
46
- leafConnectee += 1
47
- indexInMiddle = leavesTotal // 2
48
- indexDistance = 0
49
- while indexDistance < leavesTotal + 1:
50
- ImaSymmetricFold = True
51
- leafConnectee = 0
52
- while leafConnectee < indexInMiddle:
53
- if leafComparison[(indexDistance + leafConnectee) % (leavesTotal + 1)] != leafComparison[(indexDistance + leavesTotal - 1 - leafConnectee) % (leavesTotal + 1)]:
54
- ImaSymmetricFold = False
55
- break
56
- leafConnectee += 1
57
- groupsOfFolds += ImaSymmetricFold
58
- indexDistance += 1
59
- return groupsOfFolds
60
-
61
- def filterAsymmetricFolds(leafBelow: Array1DLeavesTotal) -> None:
62
- queueFutures.put_nowait(leafBelow.copy())
63
-
64
- def getSymmetricFoldsTotal() -> DatatypeFoldsTotal:
65
- global listThreads # noqa: PLW0602
66
- for _thread in listThreads:
67
- queueFutures.put(sentinelStop) # pyright: ignore[reportArgumentType]
68
- for thread in listThreads:
69
- thread.join()
70
- return groupsOfFoldsTotal