mapFolding 0.14.1__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.
- mapFolding/_A007822.py +181 -0
- mapFolding/__init__.py +1 -1
- mapFolding/_oeisFormulas/A000682.py +2 -2
- mapFolding/_oeisFormulas/Z0Z_aOFn.py +7 -4
- mapFolding/_oeisFormulas/Z0Z_oeisMeanders.py +2 -0
- mapFolding/_oeisFormulas/matrixMeanders.py +122 -75
- mapFolding/_oeisFormulas/matrixMeandersAnnex.py +66 -66
- mapFolding/_theSSOT.py +9 -3
- mapFolding/_theTypes.py +34 -130
- mapFolding/basecamp.py +1 -1
- mapFolding/beDRY.py +5 -21
- mapFolding/dataBaskets.py +8 -3
- mapFolding/oeis.py +13 -15
- mapFolding/reference/A005316optimized128bit.py +19 -19
- mapFolding/reference/A005316primitiveOptimized.py +25 -25
- mapFolding/reference/A005316redis.py +19 -19
- mapFolding/reference/A005316write2disk.py +19 -19
- mapFolding/reference/matrixMeandersBaseline.py +20 -20
- mapFolding/reference/matrixMeandersBaselineAnnex.py +4 -4
- mapFolding/reference/matrixMeandersSimpleQueue.py +90 -0
- mapFolding/reference/matrixMeandersSlicePop.py +104 -0
- mapFolding/someAssemblyRequired/_toolkitContainers.py +1 -1
- mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +1 -1
- mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +1 -1
- mapFolding/syntheticModules/countParallel.py +7 -4
- mapFolding/syntheticModules/daoOfMapFolding.py +6 -4
- mapFolding/syntheticModules/dataPacking.py +5 -3
- mapFolding/syntheticModules/theorem2Numba.py +4 -3
- {mapfolding-0.14.1.dist-info → mapfolding-0.15.0.dist-info}/METADATA +2 -2
- {mapfolding-0.14.1.dist-info → mapfolding-0.15.0.dist-info}/RECORD +34 -31
- {mapfolding-0.14.1.dist-info → mapfolding-0.15.0.dist-info}/WHEEL +0 -0
- {mapfolding-0.14.1.dist-info → mapfolding-0.15.0.dist-info}/entry_points.txt +0 -0
- {mapfolding-0.14.1.dist-info → mapfolding-0.15.0.dist-info}/licenses/LICENSE +0 -0
- {mapfolding-0.14.1.dist-info → mapfolding-0.15.0.dist-info}/top_level.txt +0 -0
mapFolding/_A007822.py
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
from mapFolding import Array1DLeavesTotal, makeDataContainer, NumPyLeavesTotal
|
|
2
|
+
from mapFolding.dataBaskets import MapFoldingState
|
|
3
|
+
from mapFolding.oeis import dictionaryOEIS
|
|
4
|
+
import numpy
|
|
5
|
+
import sys
|
|
6
|
+
import time
|
|
7
|
+
|
|
8
|
+
def activeLeafGreaterThan0(state: MapFoldingState) -> bool:
|
|
9
|
+
return state.leaf1ndex > 0
|
|
10
|
+
|
|
11
|
+
def activeLeafGreaterThanLeavesTotal(state: MapFoldingState) -> bool:
|
|
12
|
+
return state.leaf1ndex > state.leavesTotal
|
|
13
|
+
|
|
14
|
+
def activeLeafIsTheFirstLeaf(state: MapFoldingState) -> bool:
|
|
15
|
+
return state.leaf1ndex <= 1
|
|
16
|
+
|
|
17
|
+
def activeLeafIsUnconstrainedInAllDimensions(state: MapFoldingState) -> bool:
|
|
18
|
+
return not state.dimensionsUnconstrained
|
|
19
|
+
|
|
20
|
+
def activeLeafUnconstrainedInThisDimension(state: MapFoldingState) -> MapFoldingState:
|
|
21
|
+
state.dimensionsUnconstrained -= 1
|
|
22
|
+
return state
|
|
23
|
+
|
|
24
|
+
def filterCommonGaps(state: MapFoldingState) -> MapFoldingState:
|
|
25
|
+
state.gapsWhere[state.gap1ndex] = state.gapsWhere[state.indexMiniGap]
|
|
26
|
+
if state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] == state.dimensionsUnconstrained:
|
|
27
|
+
state = incrementActiveGap(state)
|
|
28
|
+
state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] = 0
|
|
29
|
+
return state
|
|
30
|
+
|
|
31
|
+
def gapAvailable(state: MapFoldingState) -> bool:
|
|
32
|
+
return state.leaf1ndex > 0
|
|
33
|
+
|
|
34
|
+
def incrementActiveGap(state: MapFoldingState) -> MapFoldingState:
|
|
35
|
+
state.gap1ndex += 1
|
|
36
|
+
return state
|
|
37
|
+
|
|
38
|
+
def incrementGap1ndexCeiling(state: MapFoldingState) -> MapFoldingState:
|
|
39
|
+
state.gap1ndexCeiling += 1
|
|
40
|
+
return state
|
|
41
|
+
|
|
42
|
+
def incrementIndexMiniGap(state: MapFoldingState) -> MapFoldingState:
|
|
43
|
+
state.indexMiniGap += 1
|
|
44
|
+
return state
|
|
45
|
+
|
|
46
|
+
def initializeIndexMiniGap(state: MapFoldingState) -> MapFoldingState:
|
|
47
|
+
state.indexMiniGap = state.gap1ndex
|
|
48
|
+
return state
|
|
49
|
+
|
|
50
|
+
def initializeVariablesToFindGaps(state: MapFoldingState) -> MapFoldingState:
|
|
51
|
+
state.dimensionsUnconstrained = state.dimensionsTotal
|
|
52
|
+
state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
|
|
53
|
+
state.indexDimension = 0
|
|
54
|
+
return state
|
|
55
|
+
|
|
56
|
+
def insertActiveLeaf(state: MapFoldingState) -> MapFoldingState:
|
|
57
|
+
state.indexLeaf = 0
|
|
58
|
+
while state.indexLeaf < state.leaf1ndex:
|
|
59
|
+
state.gapsWhere[state.gap1ndexCeiling] = state.indexLeaf
|
|
60
|
+
state.gap1ndexCeiling += 1
|
|
61
|
+
state.indexLeaf += 1
|
|
62
|
+
return state
|
|
63
|
+
|
|
64
|
+
def insertActiveLeafAtGap(state: MapFoldingState) -> MapFoldingState:
|
|
65
|
+
state.gap1ndex -= 1
|
|
66
|
+
state.leafAbove[state.leaf1ndex] = state.gapsWhere[state.gap1ndex]
|
|
67
|
+
state.leafBelow[state.leaf1ndex] = state.leafBelow[state.leafAbove[state.leaf1ndex]]
|
|
68
|
+
state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leaf1ndex
|
|
69
|
+
state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leaf1ndex
|
|
70
|
+
state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
|
|
71
|
+
state.leaf1ndex += 1
|
|
72
|
+
return state
|
|
73
|
+
|
|
74
|
+
def leafBelowSentinelIs1(state: MapFoldingState) -> bool:
|
|
75
|
+
return state.leafBelow[0] == 1
|
|
76
|
+
|
|
77
|
+
def leafConnecteeIsActiveLeaf(state: MapFoldingState) -> bool:
|
|
78
|
+
return state.leafConnectee == state.leaf1ndex
|
|
79
|
+
|
|
80
|
+
def lookForGaps(state: MapFoldingState) -> MapFoldingState:
|
|
81
|
+
state.gapsWhere[state.gap1ndexCeiling] = state.leafConnectee
|
|
82
|
+
if state.countDimensionsGapped[state.leafConnectee] == 0:
|
|
83
|
+
state = incrementGap1ndexCeiling(state)
|
|
84
|
+
state.countDimensionsGapped[state.leafConnectee] += 1
|
|
85
|
+
return state
|
|
86
|
+
|
|
87
|
+
def lookupLeafConnecteeInConnectionGraph(state: MapFoldingState) -> MapFoldingState:
|
|
88
|
+
state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leaf1ndex]
|
|
89
|
+
return state
|
|
90
|
+
|
|
91
|
+
def loopingLeavesConnectedToActiveLeaf(state: MapFoldingState) -> bool:
|
|
92
|
+
return state.leafConnectee != state.leaf1ndex
|
|
93
|
+
|
|
94
|
+
def loopingThroughTheDimensions(state: MapFoldingState) -> bool:
|
|
95
|
+
return state.indexDimension < state.dimensionsTotal
|
|
96
|
+
|
|
97
|
+
def loopingToActiveGapCeiling(state: MapFoldingState) -> bool:
|
|
98
|
+
return state.indexMiniGap < state.gap1ndexCeiling
|
|
99
|
+
|
|
100
|
+
def noGapsHere(state: MapFoldingState) -> bool:
|
|
101
|
+
return (state.leaf1ndex > 0) and (state.gap1ndex == state.gapRangeStart[state.leaf1ndex - 1])
|
|
102
|
+
|
|
103
|
+
def tryAnotherLeafConnectee(state: MapFoldingState) -> MapFoldingState:
|
|
104
|
+
state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leafBelow[state.leafConnectee]]
|
|
105
|
+
return state
|
|
106
|
+
|
|
107
|
+
def tryNextDimension(state: MapFoldingState) -> MapFoldingState:
|
|
108
|
+
state.indexDimension += 1
|
|
109
|
+
return state
|
|
110
|
+
|
|
111
|
+
def undoLastLeafPlacement(state: MapFoldingState) -> MapFoldingState:
|
|
112
|
+
state.leaf1ndex -= 1
|
|
113
|
+
state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leafBelow[state.leaf1ndex]
|
|
114
|
+
state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leafAbove[state.leaf1ndex]
|
|
115
|
+
return state
|
|
116
|
+
|
|
117
|
+
def filterAsymmetricFolds(state: MapFoldingState) -> MapFoldingState:
|
|
118
|
+
lengthLeafBelow = len(state.leafBelow)
|
|
119
|
+
|
|
120
|
+
indexLeaf: int = 0
|
|
121
|
+
for leafConnectee in range(lengthLeafBelow):
|
|
122
|
+
leafNumber = int(state.leafBelow[indexLeaf])
|
|
123
|
+
state.leafComparison[leafConnectee] = (leafNumber - indexLeaf + lengthLeafBelow - 1) % (lengthLeafBelow - 1)
|
|
124
|
+
indexLeaf = leafNumber
|
|
125
|
+
|
|
126
|
+
indexInMiddle = (lengthLeafBelow - 1) // 2
|
|
127
|
+
for delta in range(lengthLeafBelow):
|
|
128
|
+
ImaSymmetricFold = True
|
|
129
|
+
for leafConnectee in range(indexInMiddle):
|
|
130
|
+
if state.leafComparison[(delta + leafConnectee) % lengthLeafBelow] != state.leafComparison[(delta + lengthLeafBelow - 2 - leafConnectee) % lengthLeafBelow]:
|
|
131
|
+
ImaSymmetricFold = False
|
|
132
|
+
break
|
|
133
|
+
if ImaSymmetricFold:
|
|
134
|
+
state.groupsOfFolds += 1
|
|
135
|
+
|
|
136
|
+
return state
|
|
137
|
+
|
|
138
|
+
def count(state: MapFoldingState) -> MapFoldingState:
|
|
139
|
+
while activeLeafGreaterThan0(state):
|
|
140
|
+
if activeLeafIsTheFirstLeaf(state) or leafBelowSentinelIs1(state):
|
|
141
|
+
if activeLeafGreaterThanLeavesTotal(state):
|
|
142
|
+
state = filterAsymmetricFolds(state)
|
|
143
|
+
else:
|
|
144
|
+
state = initializeVariablesToFindGaps(state)
|
|
145
|
+
while loopingThroughTheDimensions(state):
|
|
146
|
+
state = lookupLeafConnecteeInConnectionGraph(state)
|
|
147
|
+
if leafConnecteeIsActiveLeaf(state):
|
|
148
|
+
state = activeLeafUnconstrainedInThisDimension(state)
|
|
149
|
+
else:
|
|
150
|
+
while loopingLeavesConnectedToActiveLeaf(state):
|
|
151
|
+
state = lookForGaps(state)
|
|
152
|
+
state = tryAnotherLeafConnectee(state)
|
|
153
|
+
state = tryNextDimension(state)
|
|
154
|
+
if activeLeafIsUnconstrainedInAllDimensions(state):
|
|
155
|
+
state = insertActiveLeaf(state)
|
|
156
|
+
state = initializeIndexMiniGap(state)
|
|
157
|
+
while loopingToActiveGapCeiling(state):
|
|
158
|
+
state = filterCommonGaps(state)
|
|
159
|
+
state = incrementIndexMiniGap(state)
|
|
160
|
+
while noGapsHere(state):
|
|
161
|
+
state = undoLastLeafPlacement(state)
|
|
162
|
+
if gapAvailable(state):
|
|
163
|
+
state = insertActiveLeafAtGap(state)
|
|
164
|
+
return state
|
|
165
|
+
|
|
166
|
+
def doTheNeedful(state: MapFoldingState) -> MapFoldingState:
|
|
167
|
+
state = count(state)
|
|
168
|
+
state.groupsOfFolds = (state.groupsOfFolds + 1) // 2
|
|
169
|
+
return state
|
|
170
|
+
|
|
171
|
+
def Z0Z_flowNeedsFixing(mapShape: tuple[int, ...]) -> int:
|
|
172
|
+
return doTheNeedful(MapFoldingState(mapShape)).groupsOfFolds
|
|
173
|
+
|
|
174
|
+
if __name__ == '__main__':
|
|
175
|
+
for n in range(3, 7):
|
|
176
|
+
mapShape = dictionaryOEIS['A007822']['getMapShape'](n)
|
|
177
|
+
|
|
178
|
+
state = MapFoldingState(mapShape)
|
|
179
|
+
timeStart = time.perf_counter()
|
|
180
|
+
foldsTotal = doTheNeedful(state).groupsOfFolds
|
|
181
|
+
sys.stdout.write(f"{foldsTotal == dictionaryOEIS['A007822']['valuesKnown'][n]} {n} {foldsTotal = } {time.perf_counter() - timeStart:.2f}\n")
|
mapFolding/__init__.py
CHANGED
|
@@ -46,7 +46,7 @@ from mapFolding._theTypes import (
|
|
|
46
46
|
Array1DElephino as Array1DElephino,
|
|
47
47
|
Array1DFoldsTotal as Array1DFoldsTotal,
|
|
48
48
|
Array1DLeavesTotal as Array1DLeavesTotal,
|
|
49
|
-
|
|
49
|
+
Array3DLeavesTotal as Array3DLeavesTotal,
|
|
50
50
|
DatatypeElephino as DatatypeElephino,
|
|
51
51
|
DatatypeFoldsTotal as DatatypeFoldsTotal,
|
|
52
52
|
DatatypeLeavesTotal as DatatypeLeavesTotal,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from mapFolding._oeisFormulas.matrixMeanders import count
|
|
1
|
+
from mapFolding._oeisFormulas.matrixMeanders import count
|
|
2
2
|
|
|
3
3
|
def initializeA000682(n: int) -> dict[int, int]:
|
|
4
|
-
curveLocationsMAXIMUM =
|
|
4
|
+
curveLocationsMAXIMUM = 1 << (2 * n + 4)
|
|
5
5
|
|
|
6
6
|
curveSeed: int = 5 - (n & 0b1) * 4
|
|
7
7
|
listCurveLocations = [(curveSeed << 1) | curveSeed]
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
from mapFolding._oeisFormulas.A000136 import A000136
|
|
2
|
+
from mapFolding._oeisFormulas.A000682 import A000682
|
|
3
|
+
from mapFolding._oeisFormulas.Z0Z_oeisMeanders import dictionaryOEISMeanders
|
|
2
4
|
from mapFolding.oeis import dictionaryOEIS
|
|
3
5
|
import sys
|
|
4
6
|
import time
|
|
@@ -7,12 +9,13 @@ import time
|
|
|
7
9
|
|
|
8
10
|
if __name__ == '__main__':
|
|
9
11
|
oeisID = 'A000136'
|
|
10
|
-
|
|
12
|
+
oeisID = 'A000682'
|
|
13
|
+
for n in range(3, 13):
|
|
11
14
|
|
|
12
|
-
#
|
|
15
|
+
# sys.stdout.write(f"{n = }\n")
|
|
13
16
|
|
|
14
17
|
timeStart = time.perf_counter()
|
|
15
|
-
foldsTotal =
|
|
18
|
+
foldsTotal = eval(oeisID)(n)
|
|
16
19
|
# sys.stdout.write(f"{n} {foldsTotal} {time.perf_counter() - timeStart:.2f}\n")
|
|
17
|
-
sys.stdout.write(f"{foldsTotal ==
|
|
20
|
+
sys.stdout.write(f"{foldsTotal == dictionaryOEISMeanders[oeisID]['valuesKnown'][n]} {n} {foldsTotal} {time.perf_counter() - timeStart:.2f}\n") # pyright: ignore[reportIndexIssue]
|
|
18
21
|
|
|
@@ -1,79 +1,126 @@
|
|
|
1
|
-
from mapFolding._oeisFormulas.matrixMeandersAnnex import curveMaximum as curveMaximum
|
|
2
|
-
from typing import NamedTuple
|
|
3
|
-
|
|
4
|
-
class BifurcatedCurves(NamedTuple):
|
|
5
|
-
bifurcationEven: int
|
|
6
|
-
bifurcationOdd: int
|
|
7
|
-
distinctCrossings: int
|
|
8
|
-
curveLocationsMAXIMUM: int
|
|
9
|
-
|
|
10
|
-
dictionaryCurveLocations: dict[int, list[int]] = {}
|
|
11
|
-
|
|
12
|
-
def getCurveLocations(bridges: int) -> list[BifurcatedCurves]:
|
|
13
|
-
global dictionaryCurveLocations # noqa: PLW0603
|
|
14
|
-
curveLocationsMAXIMUM, bifurcationEvenLocator, bifurcationOddLocator = curveMaximum[bridges]
|
|
15
|
-
listBifurcatedCurves: list[BifurcatedCurves] = []
|
|
16
|
-
# TODO This is ready for concurrency and/or vectorization.
|
|
17
|
-
for curveLocations, listDistinctCrossings in dictionaryCurveLocations.items():
|
|
18
|
-
bifurcationEven = (curveLocations & bifurcationEvenLocator) >> 1
|
|
19
|
-
bifurcationOdd = (curveLocations & bifurcationOddLocator)
|
|
20
|
-
distinctCrossings = sum(listDistinctCrossings)
|
|
21
|
-
listBifurcatedCurves.append(BifurcatedCurves(bifurcationEven, bifurcationOdd, distinctCrossings, curveLocationsMAXIMUM))
|
|
22
|
-
dictionaryCurveLocations = {}
|
|
23
|
-
return listBifurcatedCurves
|
|
24
|
-
|
|
25
|
-
def recordAnalysis(curveLocationAnalysis: int, curveLocationsMAXIMUM: int, distinctCrossings: int) -> None:
|
|
26
|
-
if curveLocationAnalysis < curveLocationsMAXIMUM:
|
|
27
|
-
dictionaryCurveLocations.setdefault(curveLocationAnalysis, []).append(distinctCrossings)
|
|
28
|
-
|
|
29
|
-
def analyzeCurve(bifurcationEven: int, bifurcationOdd: int, distinctCrossings: int, curveLocationsMAXIMUM: int) -> None:
|
|
30
|
-
bifurcationEvenFinalZero = (bifurcationEven & 0b1) == 0
|
|
31
|
-
bifurcationEvenHasCurves = bifurcationEven != 1
|
|
32
|
-
bifurcationOddFinalZero = (bifurcationOdd & 0b1) == 0
|
|
33
|
-
bifurcationOddHasCurves = bifurcationOdd != 1
|
|
34
|
-
|
|
35
|
-
if bifurcationEvenHasCurves:
|
|
36
|
-
curveLocationAnalysis = (bifurcationEven >> 1) | (bifurcationOdd << 2) | bifurcationEvenFinalZero
|
|
37
|
-
recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
|
|
38
|
-
|
|
39
|
-
if bifurcationOddHasCurves:
|
|
40
|
-
curveLocationAnalysis = (bifurcationOdd >> 2) | (bifurcationEven << 3) | (bifurcationOddFinalZero << 1)
|
|
41
|
-
recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
|
|
42
|
-
|
|
43
|
-
curveLocationAnalysis = ((bifurcationOdd | (bifurcationEven << 1)) << 2) | 3
|
|
44
|
-
recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
|
|
45
|
-
|
|
46
|
-
if bifurcationEvenHasCurves and bifurcationOddHasCurves and (bifurcationEvenFinalZero or bifurcationOddFinalZero):
|
|
47
|
-
XOrHere2makePair = 0b1
|
|
48
|
-
findUnpairedBinary1 = 0
|
|
49
|
-
|
|
50
|
-
if bifurcationEvenFinalZero and not bifurcationOddFinalZero:
|
|
51
|
-
while findUnpairedBinary1 >= 0:
|
|
52
|
-
XOrHere2makePair <<= 2
|
|
53
|
-
findUnpairedBinary1 += 1 if (bifurcationEven & XOrHere2makePair) == 0 else -1
|
|
54
|
-
bifurcationEven ^= XOrHere2makePair
|
|
55
|
-
|
|
56
|
-
elif bifurcationOddFinalZero and not bifurcationEvenFinalZero:
|
|
57
|
-
while findUnpairedBinary1 >= 0:
|
|
58
|
-
XOrHere2makePair <<= 2
|
|
59
|
-
findUnpairedBinary1 += 1 if (bifurcationOdd & XOrHere2makePair) == 0 else -1
|
|
60
|
-
bifurcationOdd ^= XOrHere2makePair
|
|
61
|
-
|
|
62
|
-
curveLocationAnalysis = ((bifurcationEven >> 2) << 1) | (bifurcationOdd >> 2)
|
|
63
|
-
recordAnalysis(curveLocationAnalysis, curveLocationsMAXIMUM, distinctCrossings)
|
|
64
|
-
|
|
65
|
-
def initializeCurveLocations(startingCurveLocations: dict[int, int]) -> None:
|
|
66
|
-
global dictionaryCurveLocations # noqa: PLW0603
|
|
67
|
-
dictionaryCurveLocations = {curve: [distinctCrossings] for curve, distinctCrossings in startingCurveLocations.items()}
|
|
68
|
-
|
|
69
1
|
def count(bridges: int, startingCurveLocations: dict[int, int]) -> int:
|
|
70
|
-
|
|
71
|
-
|
|
2
|
+
listCurveMaximums: list[tuple[int, int, int]] = [
|
|
3
|
+
(0x15, 0x2a, 0x10),
|
|
4
|
+
(0x55, 0xaa, 0x40),
|
|
5
|
+
(0x155, 0x2aa, 0x100),
|
|
6
|
+
(0x555, 0xaaa, 0x400),
|
|
7
|
+
(0x1555, 0x2aaa, 0x1000),
|
|
8
|
+
(0x5555, 0xaaaa, 0x4000),
|
|
9
|
+
(0x15555, 0x2aaaa, 0x10000),
|
|
10
|
+
(0x55555, 0xaaaaa, 0x40000),
|
|
11
|
+
(0x155555, 0x2aaaaa, 0x100000),
|
|
12
|
+
(0x555555, 0xaaaaaa, 0x400000),
|
|
13
|
+
(0x1555555, 0x2aaaaaa, 0x1000000),
|
|
14
|
+
(0x5555555, 0xaaaaaaa, 0x4000000),
|
|
15
|
+
(0x15555555, 0x2aaaaaaa, 0x10000000),
|
|
16
|
+
(0x55555555, 0xaaaaaaaa, 0x40000000),
|
|
17
|
+
(0x155555555, 0x2aaaaaaaa, 0x100000000),
|
|
18
|
+
(0x555555555, 0xaaaaaaaaa, 0x400000000),
|
|
19
|
+
(0x1555555555, 0x2aaaaaaaaa, 0x1000000000),
|
|
20
|
+
(0x5555555555, 0xaaaaaaaaaa, 0x4000000000),
|
|
21
|
+
(0x15555555555, 0x2aaaaaaaaaa, 0x10000000000),
|
|
22
|
+
(0x55555555555, 0xaaaaaaaaaaa, 0x40000000000),
|
|
23
|
+
(0x155555555555, 0x2aaaaaaaaaaa, 0x100000000000),
|
|
24
|
+
(0x555555555555, 0xaaaaaaaaaaaa, 0x400000000000),
|
|
25
|
+
(0x1555555555555, 0x2aaaaaaaaaaaa, 0x1000000000000),
|
|
26
|
+
(0x5555555555555, 0xaaaaaaaaaaaaa, 0x4000000000000),
|
|
27
|
+
(0x15555555555555, 0x2aaaaaaaaaaaaa, 0x10000000000000),
|
|
28
|
+
(0x55555555555555, 0xaaaaaaaaaaaaaa, 0x40000000000000),
|
|
29
|
+
(0x155555555555555, 0x2aaaaaaaaaaaaaa, 0x100000000000000),
|
|
30
|
+
(0x555555555555555, 0xaaaaaaaaaaaaaaa, 0x400000000000000),
|
|
31
|
+
(0x1555555555555555, 0x2aaaaaaaaaaaaaaa, 0x1000000000000000),
|
|
32
|
+
(0x5555555555555555, 0xaaaaaaaaaaaaaaaa, 0x4000000000000000),
|
|
33
|
+
(0x15555555555555555, 0x2aaaaaaaaaaaaaaaa, 0x10000000000000000),
|
|
34
|
+
(0x55555555555555555, 0xaaaaaaaaaaaaaaaaa, 0x40000000000000000),
|
|
35
|
+
(0x155555555555555555, 0x2aaaaaaaaaaaaaaaaa, 0x100000000000000000),
|
|
36
|
+
(0x555555555555555555, 0xaaaaaaaaaaaaaaaaaa, 0x400000000000000000),
|
|
37
|
+
(0x1555555555555555555, 0x2aaaaaaaaaaaaaaaaaa, 0x1000000000000000000),
|
|
38
|
+
(0x5555555555555555555, 0xaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000),
|
|
39
|
+
(0x15555555555555555555, 0x2aaaaaaaaaaaaaaaaaaa, 0x10000000000000000000),
|
|
40
|
+
(0x55555555555555555555, 0xaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000),
|
|
41
|
+
(0x155555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000),
|
|
42
|
+
(0x555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000),
|
|
43
|
+
(0x1555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000),
|
|
44
|
+
(0x5555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000),
|
|
45
|
+
(0x15555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000),
|
|
46
|
+
(0x55555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000),
|
|
47
|
+
(0x155555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000),
|
|
48
|
+
(0x555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000),
|
|
49
|
+
(0x1555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000),
|
|
50
|
+
(0x5555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000),
|
|
51
|
+
(0x15555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000),
|
|
52
|
+
(0x55555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000),
|
|
53
|
+
(0x155555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000000),
|
|
54
|
+
(0x555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000000),
|
|
55
|
+
(0x1555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000000),
|
|
56
|
+
(0x5555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000000),
|
|
57
|
+
(0x15555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000000),
|
|
58
|
+
(0x55555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000000),
|
|
59
|
+
(0x155555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000000000),
|
|
60
|
+
(0x555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000000000),
|
|
61
|
+
(0x1555555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000000000),
|
|
62
|
+
(0x5555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000000000),
|
|
63
|
+
(0x15555555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000000000),
|
|
64
|
+
(0x55555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000000000),
|
|
65
|
+
]
|
|
66
|
+
listCurveMaximums = listCurveMaximums[0:bridges]
|
|
67
|
+
|
|
68
|
+
dictionaryCurveLocations: dict[int, int] = {}
|
|
72
69
|
while bridges > 0:
|
|
73
70
|
bridges -= 1
|
|
74
71
|
|
|
75
|
-
|
|
76
|
-
for
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
bifurcationAlphaLocator, bifurcationZuluLocator, curveLocationsMAXIMUM = listCurveMaximums[bridges]
|
|
73
|
+
for curveLocations, distinctCrossings in startingCurveLocations.items():
|
|
74
|
+
bifurcationAlpha = (curveLocations & bifurcationAlphaLocator)
|
|
75
|
+
bifurcationZulu = (curveLocations & bifurcationZuluLocator) >> 1
|
|
76
|
+
|
|
77
|
+
bifurcationAlphaHasCurves = bifurcationAlpha != 1
|
|
78
|
+
bifurcationZuluHasCurves = bifurcationZulu != 1
|
|
79
|
+
|
|
80
|
+
# Curve location analysis
|
|
81
|
+
curveLocationAnalysis = ((bifurcationAlpha | (bifurcationZulu << 1)) << 2) | 3
|
|
82
|
+
if curveLocationAnalysis < curveLocationsMAXIMUM:
|
|
83
|
+
dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
|
|
84
|
+
|
|
85
|
+
# Curve location analysis, conditional
|
|
86
|
+
if bifurcationZuluHasCurves:
|
|
87
|
+
curveLocationAnalysis = (bifurcationZulu >> 1) | (bifurcationAlpha << 2) | (bifurcationZuluIsEven := not (bifurcationZulu & 1))
|
|
88
|
+
if curveLocationAnalysis < curveLocationsMAXIMUM:
|
|
89
|
+
dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
|
|
90
|
+
|
|
91
|
+
# Curve location analysis, conditional
|
|
92
|
+
if bifurcationAlphaHasCurves:
|
|
93
|
+
curveLocationAnalysis = (bifurcationAlphaShiftRight2 := bifurcationAlpha >> 2) | (bifurcationZulu << 3) | ((bifurcationAlphaIsEven := 1 - (bifurcationAlpha & 0b1)) << 1)
|
|
94
|
+
if curveLocationAnalysis < curveLocationsMAXIMUM:
|
|
95
|
+
dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
|
|
96
|
+
|
|
97
|
+
# Curve location analysis, uber-conditional
|
|
98
|
+
if bifurcationZuluHasCurves and bifurcationAlphaHasCurves:
|
|
99
|
+
# One Truth-check to select a code path
|
|
100
|
+
finalZeroCombination = (bifurcationZuluIsEven << 1) | bifurcationAlphaIsEven # pyright: ignore[reportPossiblyUnboundVariable]
|
|
101
|
+
|
|
102
|
+
if finalZeroCombination != 0: # Case 0 (False, False)
|
|
103
|
+
XOrHere2makePair = 0b1
|
|
104
|
+
findUnpairedBinary1 = 0
|
|
105
|
+
|
|
106
|
+
if finalZeroCombination == 1: # Case 1: (False, True)
|
|
107
|
+
while findUnpairedBinary1 >= 0:
|
|
108
|
+
XOrHere2makePair <<= 2
|
|
109
|
+
findUnpairedBinary1 += 1 if (bifurcationAlpha & XOrHere2makePair) == 0 else -1
|
|
110
|
+
bifurcationAlphaShiftRight2 = (bifurcationAlpha ^ XOrHere2makePair) >> 2
|
|
111
|
+
elif finalZeroCombination == 2: # Case 2: (True, False)
|
|
112
|
+
while findUnpairedBinary1 >= 0:
|
|
113
|
+
XOrHere2makePair <<= 2
|
|
114
|
+
findUnpairedBinary1 += 1 if (bifurcationZulu & XOrHere2makePair) == 0 else -1
|
|
115
|
+
bifurcationZulu ^= XOrHere2makePair
|
|
116
|
+
|
|
117
|
+
# Cases 1, 2, and 3 all compute curveLocationAnalysis
|
|
118
|
+
# TODO https://github.com/hunterhogan/mapFolding/issues/19
|
|
119
|
+
curveLocationAnalysis = ((bifurcationZulu >> 2) << 1) | bifurcationAlphaShiftRight2 # pyright: ignore[reportPossiblyUnboundVariable]
|
|
120
|
+
if curveLocationAnalysis < curveLocationsMAXIMUM:
|
|
121
|
+
dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
|
|
122
|
+
|
|
123
|
+
startingCurveLocations = dictionaryCurveLocations.copy()
|
|
124
|
+
dictionaryCurveLocations = {}
|
|
125
|
+
|
|
126
|
+
return sum(startingCurveLocations.values())
|
|
@@ -2,81 +2,81 @@ from typing import NamedTuple
|
|
|
2
2
|
import sys
|
|
3
3
|
|
|
4
4
|
class limitLocators(NamedTuple):
|
|
5
|
+
bifurcationAlphaLocator: int
|
|
6
|
+
bifurcationZuluLocator: int
|
|
5
7
|
curveLocationsMAXIMUM: int
|
|
6
|
-
bifurcationEvenLocator: int
|
|
7
|
-
bifurcationOddLocator: int
|
|
8
8
|
|
|
9
9
|
curveMaximum: dict[int, limitLocators] = {
|
|
10
|
-
0: limitLocators(
|
|
11
|
-
1: limitLocators(
|
|
12
|
-
2: limitLocators(
|
|
13
|
-
3: limitLocators(
|
|
14
|
-
4: limitLocators(
|
|
15
|
-
5: limitLocators(
|
|
16
|
-
6: limitLocators(
|
|
17
|
-
7: limitLocators(
|
|
18
|
-
8: limitLocators(
|
|
19
|
-
9: limitLocators(
|
|
20
|
-
10: limitLocators(
|
|
21
|
-
11: limitLocators(
|
|
22
|
-
12: limitLocators(
|
|
23
|
-
13: limitLocators(
|
|
24
|
-
14: limitLocators(
|
|
25
|
-
15: limitLocators(
|
|
26
|
-
16: limitLocators(
|
|
27
|
-
17: limitLocators(
|
|
28
|
-
18: limitLocators(
|
|
29
|
-
19: limitLocators(
|
|
30
|
-
20: limitLocators(
|
|
31
|
-
21: limitLocators(
|
|
32
|
-
22: limitLocators(
|
|
33
|
-
23: limitLocators(
|
|
34
|
-
24: limitLocators(
|
|
35
|
-
25: limitLocators(
|
|
36
|
-
26: limitLocators(
|
|
37
|
-
27: limitLocators(
|
|
38
|
-
28: limitLocators(
|
|
39
|
-
29: limitLocators(
|
|
40
|
-
30: limitLocators(
|
|
41
|
-
31: limitLocators(
|
|
42
|
-
32: limitLocators(
|
|
43
|
-
33: limitLocators(
|
|
44
|
-
34: limitLocators(
|
|
45
|
-
35: limitLocators(
|
|
46
|
-
36: limitLocators(
|
|
47
|
-
37: limitLocators(
|
|
48
|
-
38: limitLocators(
|
|
49
|
-
39: limitLocators(
|
|
50
|
-
40: limitLocators(
|
|
51
|
-
41: limitLocators(
|
|
52
|
-
42: limitLocators(
|
|
53
|
-
43: limitLocators(
|
|
54
|
-
44: limitLocators(
|
|
55
|
-
45: limitLocators(
|
|
56
|
-
46: limitLocators(
|
|
57
|
-
47: limitLocators(
|
|
58
|
-
48: limitLocators(
|
|
59
|
-
49: limitLocators(
|
|
60
|
-
50: limitLocators(
|
|
61
|
-
51: limitLocators(
|
|
62
|
-
52: limitLocators(
|
|
63
|
-
53: limitLocators(
|
|
64
|
-
54: limitLocators(
|
|
65
|
-
55: limitLocators(
|
|
66
|
-
56: limitLocators(
|
|
67
|
-
57: limitLocators(
|
|
68
|
-
58: limitLocators(
|
|
69
|
-
59: limitLocators(
|
|
70
|
-
60: limitLocators(
|
|
71
|
-
61: limitLocators(
|
|
10
|
+
0: limitLocators(0x15, 0x2a, 0x10),
|
|
11
|
+
1: limitLocators(0x55, 0xaa, 0x40),
|
|
12
|
+
2: limitLocators(0x155, 0x2aa, 0x100),
|
|
13
|
+
3: limitLocators(0x555, 0xaaa, 0x400),
|
|
14
|
+
4: limitLocators(0x1555, 0x2aaa, 0x1000),
|
|
15
|
+
5: limitLocators(0x5555, 0xaaaa, 0x4000),
|
|
16
|
+
6: limitLocators(0x15555, 0x2aaaa, 0x10000),
|
|
17
|
+
7: limitLocators(0x55555, 0xaaaaa, 0x40000),
|
|
18
|
+
8: limitLocators(0x155555, 0x2aaaaa, 0x100000),
|
|
19
|
+
9: limitLocators(0x555555, 0xaaaaaa, 0x400000),
|
|
20
|
+
10: limitLocators(0x1555555, 0x2aaaaaa, 0x1000000),
|
|
21
|
+
11: limitLocators(0x5555555, 0xaaaaaaa, 0x4000000),
|
|
22
|
+
12: limitLocators(0x15555555, 0x2aaaaaaa, 0x10000000),
|
|
23
|
+
13: limitLocators(0x55555555, 0xaaaaaaaa, 0x40000000),
|
|
24
|
+
14: limitLocators(0x155555555, 0x2aaaaaaaa, 0x100000000),
|
|
25
|
+
15: limitLocators(0x555555555, 0xaaaaaaaaa, 0x400000000),
|
|
26
|
+
16: limitLocators(0x1555555555, 0x2aaaaaaaaa, 0x1000000000),
|
|
27
|
+
17: limitLocators(0x5555555555, 0xaaaaaaaaaa, 0x4000000000),
|
|
28
|
+
18: limitLocators(0x15555555555, 0x2aaaaaaaaaa, 0x10000000000),
|
|
29
|
+
19: limitLocators(0x55555555555, 0xaaaaaaaaaaa, 0x40000000000),
|
|
30
|
+
20: limitLocators(0x155555555555, 0x2aaaaaaaaaaa, 0x100000000000),
|
|
31
|
+
21: limitLocators(0x555555555555, 0xaaaaaaaaaaaa, 0x400000000000),
|
|
32
|
+
22: limitLocators(0x1555555555555, 0x2aaaaaaaaaaaa, 0x1000000000000),
|
|
33
|
+
23: limitLocators(0x5555555555555, 0xaaaaaaaaaaaaa, 0x4000000000000),
|
|
34
|
+
24: limitLocators(0x15555555555555, 0x2aaaaaaaaaaaaa, 0x10000000000000),
|
|
35
|
+
25: limitLocators(0x55555555555555, 0xaaaaaaaaaaaaaa, 0x40000000000000),
|
|
36
|
+
26: limitLocators(0x155555555555555, 0x2aaaaaaaaaaaaaa, 0x100000000000000),
|
|
37
|
+
27: limitLocators(0x555555555555555, 0xaaaaaaaaaaaaaaa, 0x400000000000000),
|
|
38
|
+
28: limitLocators(0x1555555555555555, 0x2aaaaaaaaaaaaaaa, 0x1000000000000000), # 0x2aaaaaaaaaaaaaaa.bit_length() = 62
|
|
39
|
+
29: limitLocators(0x5555555555555555, 0xaaaaaaaaaaaaaaaa, 0x4000000000000000),
|
|
40
|
+
30: limitLocators(0x15555555555555555, 0x2aaaaaaaaaaaaaaaa, 0x10000000000000000),
|
|
41
|
+
31: limitLocators(0x55555555555555555, 0xaaaaaaaaaaaaaaaaa, 0x40000000000000000),
|
|
42
|
+
32: limitLocators(0x155555555555555555, 0x2aaaaaaaaaaaaaaaaa, 0x100000000000000000),
|
|
43
|
+
33: limitLocators(0x555555555555555555, 0xaaaaaaaaaaaaaaaaaa, 0x400000000000000000),
|
|
44
|
+
34: limitLocators(0x1555555555555555555, 0x2aaaaaaaaaaaaaaaaaa, 0x1000000000000000000),
|
|
45
|
+
35: limitLocators(0x5555555555555555555, 0xaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000),
|
|
46
|
+
36: limitLocators(0x15555555555555555555, 0x2aaaaaaaaaaaaaaaaaaa, 0x10000000000000000000),
|
|
47
|
+
37: limitLocators(0x55555555555555555555, 0xaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000),
|
|
48
|
+
38: limitLocators(0x155555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000),
|
|
49
|
+
39: limitLocators(0x555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000),
|
|
50
|
+
40: limitLocators(0x1555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000),
|
|
51
|
+
41: limitLocators(0x5555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000),
|
|
52
|
+
42: limitLocators(0x15555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000),
|
|
53
|
+
43: limitLocators(0x55555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000),
|
|
54
|
+
44: limitLocators(0x155555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000),
|
|
55
|
+
45: limitLocators(0x555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000),
|
|
56
|
+
46: limitLocators(0x1555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000),
|
|
57
|
+
47: limitLocators(0x5555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000),
|
|
58
|
+
48: limitLocators(0x15555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000),
|
|
59
|
+
49: limitLocators(0x55555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000),
|
|
60
|
+
50: limitLocators(0x155555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000000),
|
|
61
|
+
51: limitLocators(0x555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000000),
|
|
62
|
+
52: limitLocators(0x1555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000000),
|
|
63
|
+
53: limitLocators(0x5555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000000),
|
|
64
|
+
54: limitLocators(0x15555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000000),
|
|
65
|
+
55: limitLocators(0x55555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000000),
|
|
66
|
+
56: limitLocators(0x155555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000000000),
|
|
67
|
+
57: limitLocators(0x555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000000000),
|
|
68
|
+
58: limitLocators(0x1555555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000000000),
|
|
69
|
+
59: limitLocators(0x5555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000000000),
|
|
70
|
+
60: limitLocators(0x15555555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000000000),
|
|
71
|
+
61: limitLocators(0x55555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000000000),
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
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
|
-
|
|
79
|
-
sys.stdout.write(f"{n}: limitLocators({
|
|
78
|
+
bifurcationAlphaLocator = int('01' * ((curveLocationsMAXIMUM.bit_length() + 1) // 2), 2)
|
|
79
|
+
sys.stdout.write(f"{n}: limitLocators({hex(bifurcationAlphaLocator)}, {hex(bifurcationAlphaLocator << 1)}, {hex(curveLocationsMAXIMUM)}),\n")
|
|
80
80
|
sys.stdout.write("}\n")
|
|
81
81
|
|
|
82
82
|
if __name__ == '__main__':
|
mapFolding/_theSSOT.py
CHANGED
|
@@ -76,19 +76,19 @@ concurrencyPackage = concurrencyPackageHARDCODED
|
|
|
76
76
|
# TODO I made a `TypedDict` before I knew how to make dataclasses and classes. Think about other data structures.
|
|
77
77
|
settingsOEISManuallySelected: dict[str, MetadataOEISidManuallySet] = {
|
|
78
78
|
'A000136': {
|
|
79
|
-
'getMapShape': lambda n:
|
|
79
|
+
'getMapShape': lambda n: (1, n),
|
|
80
80
|
'valuesBenchmark': [14],
|
|
81
81
|
'valuesTestParallelization': [*range(3, 7)],
|
|
82
82
|
'valuesTestValidation': [random.randint(2, 9)], # noqa: S311
|
|
83
83
|
},
|
|
84
84
|
'A001415': {
|
|
85
|
-
'getMapShape': lambda n:
|
|
85
|
+
'getMapShape': lambda n: (2, n),
|
|
86
86
|
'valuesBenchmark': [14],
|
|
87
87
|
'valuesTestParallelization': [*range(3, 7)],
|
|
88
88
|
'valuesTestValidation': [random.randint(2, 9)], # noqa: S311
|
|
89
89
|
},
|
|
90
90
|
'A001416': {
|
|
91
|
-
'getMapShape': lambda n:
|
|
91
|
+
'getMapShape': lambda n: (3, n),
|
|
92
92
|
'valuesBenchmark': [9],
|
|
93
93
|
'valuesTestParallelization': [*range(3, 5)],
|
|
94
94
|
'valuesTestValidation': [random.randint(2, 6)], # noqa: S311
|
|
@@ -111,6 +111,12 @@ settingsOEISManuallySelected: dict[str, MetadataOEISidManuallySet] = {
|
|
|
111
111
|
'valuesTestParallelization': [*range(2, 4)],
|
|
112
112
|
'valuesTestValidation': [random.randint(2, 4)], # noqa: S311
|
|
113
113
|
},
|
|
114
|
+
'A007822': {
|
|
115
|
+
'getMapShape': lambda n: (1, 2 * n),
|
|
116
|
+
'valuesBenchmark': [7],
|
|
117
|
+
'valuesTestParallelization': [*range(2, 4)],
|
|
118
|
+
'valuesTestValidation': [random.randint(2, 4)], # noqa: S311
|
|
119
|
+
},
|
|
114
120
|
}
|
|
115
121
|
|
|
116
122
|
packageSettings = mapFoldingPackageSettings(
|