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.
- easyRun/NOTcountingFolds.py +6 -5
- easyRun/countFolds.py +1 -1
- easyRun/generateAllModules.py +14 -0
- easyRun/meanders.py +1 -1
- mapFolding/__init__.py +1 -0
- mapFolding/_theSSOT.py +3 -2
- mapFolding/_theTypes.py +3 -0
- mapFolding/algorithms/A086345.py +75 -0
- mapFolding/algorithms/oeisIDbyFormula.py +2 -2
- mapFolding/algorithms/symmetricFolds.py +36 -0
- mapFolding/basecamp.py +80 -149
- mapFolding/dataBaskets.py +123 -5
- mapFolding/filesystemToolkit.py +4 -32
- mapFolding/oeis.py +5 -12
- mapFolding/reference/A086345Wu.py +25 -0
- mapFolding/reference/matrixMeandersAnalysis/signatures.py +3 -0
- mapFolding/someAssemblyRequired/A007822/A007822rawMaterials.py +10 -45
- mapFolding/someAssemblyRequired/A007822/_asynchronousAnnex.py +51 -0
- mapFolding/someAssemblyRequired/A007822/makeA007822AsynchronousModules.py +36 -195
- mapFolding/someAssemblyRequired/A007822/makeA007822Modules.py +42 -44
- mapFolding/someAssemblyRequired/RecipeJob.py +78 -18
- mapFolding/someAssemblyRequired/__init__.py +3 -8
- mapFolding/someAssemblyRequired/_toolkitContainers.py +32 -3
- mapFolding/someAssemblyRequired/infoBooth.py +40 -23
- mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +74 -153
- mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +56 -88
- mapFolding/someAssemblyRequired/makingModules_count.py +10 -12
- mapFolding/someAssemblyRequired/makingModules_doTheNeedful.py +6 -68
- mapFolding/someAssemblyRequired/{mapFolding → mapFoldingModules}/makeMapFoldingModules.py +24 -30
- mapFolding/someAssemblyRequired/meanders/makeMeandersModules.py +8 -6
- mapFolding/someAssemblyRequired/toolkitMakeModules.py +2 -2
- mapFolding/someAssemblyRequired/toolkitNumba.py +1 -1
- mapFolding/someAssemblyRequired/transformationTools.py +10 -12
- mapFolding/syntheticModules/A007822/algorithm.py +45 -50
- mapFolding/syntheticModules/A007822/asynchronous.py +91 -34
- mapFolding/syntheticModules/A007822/initializeState.py +15 -21
- mapFolding/syntheticModules/A007822/theorem2.py +16 -22
- mapFolding/syntheticModules/A007822/theorem2Numba.py +20 -26
- mapFolding/syntheticModules/A007822/theorem2Trimmed.py +17 -23
- mapFolding/syntheticModules/countParallelNumba.py +3 -7
- mapFolding/syntheticModules/daoOfMapFoldingNumba.py +1 -2
- mapFolding/syntheticModules/meanders/bigInt.py +9 -9
- mapFolding/syntheticModules/theorem2Numba.py +28 -9
- mapFolding/syntheticModules/theorem2Trimmed.py +1 -1
- mapFolding/tests/test_computations.py +1 -1
- {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/METADATA +4 -1
- {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/RECORD +52 -61
- mapFolding/_dataPacking.py +0 -68
- mapFolding/reference/meandersDumpingGround/A005316intOptimized.py +0 -122
- mapFolding/reference/meandersDumpingGround/A005316optimized128bit.py +0 -79
- mapFolding/reference/meandersDumpingGround/matrixMeandersBaseline.py +0 -65
- mapFolding/reference/meandersDumpingGround/matrixMeandersBaselineAnnex.py +0 -84
- mapFolding/reference/meandersDumpingGround/matrixMeandersSimpleQueue.py +0 -90
- mapFolding/syntheticModules/A007822/algorithmNumba.py +0 -94
- mapFolding/syntheticModules/A007822/asynchronousAnnex.py +0 -66
- mapFolding/syntheticModules/A007822/asynchronousAnnexNumba.py +0 -70
- mapFolding/syntheticModules/A007822/asynchronousNumba.py +0 -79
- mapFolding/syntheticModules/A007822/asynchronousTheorem2.py +0 -65
- mapFolding/syntheticModules/A007822/asynchronousTrimmed.py +0 -56
- mapFolding/syntheticModules/dataPacking.py +0 -26
- mapFolding/syntheticModules/dataPackingA007822.py +0 -92
- /mapFolding/someAssemblyRequired/{mapFolding → mapFoldingModules}/__init__.py +0 -0
- {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/WHEEL +0 -0
- {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/entry_points.txt +0 -0
- {mapfolding-0.16.2.dist-info → mapfolding-0.16.4.dist-info}/licenses/LICENSE +0 -0
- {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
|