mapFolding 0.16.2__py3-none-any.whl → 0.17.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.
- easyRun/A000682.py +2 -2
- easyRun/NOTcountingFolds.py +16 -8
- easyRun/countFolds.py +9 -2
- easyRun/generateAllModules.py +14 -0
- easyRun/meanders.py +4 -4
- mapFolding/__init__.py +1 -0
- mapFolding/_theSSOT.py +3 -2
- mapFolding/_theTypes.py +3 -0
- mapFolding/algorithms/A000136constraintPropagation.py +95 -0
- mapFolding/algorithms/A000136elimination.py +163 -0
- mapFolding/algorithms/A000136eliminationParallel.py +77 -0
- mapFolding/algorithms/A086345.py +75 -0
- mapFolding/algorithms/matrixMeanders.py +59 -18
- mapFolding/algorithms/matrixMeandersNumPyndas.py +841 -0
- mapFolding/algorithms/oeisIDbyFormula.py +2 -2
- mapFolding/algorithms/symmetricFolds.py +35 -0
- mapFolding/basecamp.py +100 -153
- mapFolding/dataBaskets.py +142 -65
- mapFolding/filesystemToolkit.py +4 -32
- mapFolding/oeis.py +5 -12
- mapFolding/reference/A086345Wu.py +25 -0
- mapFolding/reference/irvineJavaPort.py +3 -3
- mapFolding/reference/matrixMeandersAnalysis/signatures.py +3 -0
- mapFolding/reference/meandersDumpingGround/matrixMeandersNumPyV1finalForm.py +1 -1
- mapFolding/someAssemblyRequired/A007822/A007822rawMaterials.py +10 -45
- mapFolding/someAssemblyRequired/A007822/_asynchronousAnnex.py +51 -0
- mapFolding/someAssemblyRequired/A007822/makeA007822AsynchronousModules.py +39 -196
- mapFolding/someAssemblyRequired/A007822/makeA007822Modules.py +57 -43
- mapFolding/someAssemblyRequired/RecipeJob.py +84 -34
- mapFolding/someAssemblyRequired/__init__.py +4 -8
- mapFolding/someAssemblyRequired/_toolkitContainers.py +38 -7
- mapFolding/someAssemblyRequired/infoBooth.py +41 -23
- mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +140 -164
- mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +63 -96
- mapFolding/someAssemblyRequired/makingModules_count.py +26 -30
- mapFolding/someAssemblyRequired/makingModules_doTheNeedful.py +10 -72
- mapFolding/someAssemblyRequired/{mapFolding → mapFoldingModules}/makeMapFoldingModules.py +30 -35
- mapFolding/someAssemblyRequired/meanders/makeMeandersModules.py +13 -11
- mapFolding/someAssemblyRequired/toolkitMakeModules.py +5 -31
- mapFolding/someAssemblyRequired/toolkitNumba.py +3 -2
- mapFolding/someAssemblyRequired/transformationTools.py +12 -15
- mapFolding/syntheticModules/A007822/algorithm.py +45 -50
- mapFolding/syntheticModules/A007822/asynchronous.py +92 -36
- mapFolding/syntheticModules/A007822/initializeState.py +19 -23
- mapFolding/syntheticModules/A007822/theorem2.py +20 -24
- mapFolding/syntheticModules/A007822/theorem2Numba.py +23 -25
- mapFolding/syntheticModules/A007822/theorem2Trimmed.py +19 -23
- mapFolding/syntheticModules/countParallelNumba.py +1 -2
- mapFolding/syntheticModules/daoOfMapFoldingNumba.py +5 -4
- mapFolding/syntheticModules/initializeState.py +1 -1
- mapFolding/syntheticModules/meanders/bigInt.py +59 -22
- mapFolding/syntheticModules/theorem2.py +1 -1
- mapFolding/syntheticModules/theorem2Numba.py +30 -9
- mapFolding/syntheticModules/theorem2Trimmed.py +2 -2
- mapFolding/tests/test_computations.py +29 -3
- {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/METADATA +11 -8
- mapfolding-0.17.0.dist-info/RECORD +107 -0
- mapFolding/_dataPacking.py +0 -68
- mapFolding/algorithms/matrixMeandersBeDry.py +0 -182
- mapFolding/algorithms/matrixMeandersNumPy.py +0 -333
- mapFolding/algorithms/matrixMeandersPandas.py +0 -334
- 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-0.16.2.dist-info/RECORD +0 -115
- /mapFolding/someAssemblyRequired/{mapFolding → mapFoldingModules}/__init__.py +0 -0
- {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/WHEEL +0 -0
- {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/entry_points.txt +0 -0
- {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/licenses/LICENSE +0 -0
- {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/top_level.txt +0 -0
|
@@ -1,58 +1,114 @@
|
|
|
1
|
-
from
|
|
2
|
-
from mapFolding
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
from copy import deepcopy
|
|
2
|
+
from mapFolding import DatatypeFoldsTotal
|
|
3
|
+
from mapFolding.dataBaskets import SymmetricFoldsState
|
|
4
|
+
from queue import Queue
|
|
5
|
+
from threading import Lock, Thread
|
|
6
|
+
|
|
7
|
+
listThreads: list[Thread] = []
|
|
8
|
+
queueFutures: Queue[SymmetricFoldsState] = Queue()
|
|
9
|
+
symmetricFoldsTotal: int = 0
|
|
10
|
+
LOCKsymmetricFoldsTotal = Lock()
|
|
11
|
+
STOPsignal = object()
|
|
12
|
+
|
|
13
|
+
def initializeConcurrencyManager(maxWorkers: int, symmetricFolds: int=0) -> None:
|
|
14
|
+
global listThreads, symmetricFoldsTotal, queueFutures
|
|
15
|
+
listThreads = []
|
|
16
|
+
queueFutures = Queue()
|
|
17
|
+
symmetricFoldsTotal = symmetricFolds
|
|
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 symmetricFoldsTotal
|
|
27
|
+
while True:
|
|
28
|
+
state = queueFutures.get()
|
|
29
|
+
if state is STOPsignal:
|
|
30
|
+
break
|
|
31
|
+
state = _filterAsymmetricFolds(state)
|
|
32
|
+
with LOCKsymmetricFoldsTotal:
|
|
33
|
+
symmetricFoldsTotal += state.symmetricFolds
|
|
34
|
+
|
|
35
|
+
def filterAsymmetricFolds(state: SymmetricFoldsState) -> None:
|
|
36
|
+
queueFutures.put_nowait(deepcopy(state))
|
|
37
|
+
|
|
38
|
+
def getSymmetricFoldsTotal() -> DatatypeFoldsTotal:
|
|
39
|
+
for _thread in listThreads:
|
|
40
|
+
queueFutures.put(STOPsignal)
|
|
41
|
+
for thread in listThreads:
|
|
42
|
+
thread.join()
|
|
43
|
+
return symmetricFoldsTotal
|
|
44
|
+
|
|
45
|
+
def _filterAsymmetricFolds(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
46
|
+
state.indexLeaf = 1
|
|
47
|
+
state.leafComparison[0] = 1
|
|
48
|
+
state.leafConnectee = 1
|
|
49
|
+
while state.leafConnectee < state.leavesTotal + 1:
|
|
50
|
+
state.indexMiniGap = state.leafBelow[state.indexLeaf]
|
|
51
|
+
state.leafComparison[state.leafConnectee] = (state.indexMiniGap - state.indexLeaf + state.leavesTotal) % state.leavesTotal
|
|
52
|
+
state.indexLeaf = state.indexMiniGap
|
|
53
|
+
state.leafConnectee += 1
|
|
54
|
+
for listTuples in state.indices:
|
|
55
|
+
state.leafConnectee = 1
|
|
56
|
+
for indexLeft, indexRight in listTuples:
|
|
57
|
+
if state.leafComparison[indexLeft] != state.leafComparison[indexRight]:
|
|
58
|
+
state.leafConnectee = 0
|
|
59
|
+
break
|
|
60
|
+
state.symmetricFolds += state.leafConnectee
|
|
61
|
+
return state
|
|
62
|
+
|
|
63
|
+
def activeLeafGreaterThan0(state: SymmetricFoldsState) -> bool:
|
|
8
64
|
return state.leaf1ndex > 0
|
|
9
65
|
|
|
10
|
-
def activeLeafGreaterThanLeavesTotal(state:
|
|
66
|
+
def activeLeafGreaterThanLeavesTotal(state: SymmetricFoldsState) -> bool:
|
|
11
67
|
return state.leaf1ndex > state.leavesTotal
|
|
12
68
|
|
|
13
|
-
def activeLeafIsTheFirstLeaf(state:
|
|
69
|
+
def activeLeafIsTheFirstLeaf(state: SymmetricFoldsState) -> bool:
|
|
14
70
|
return state.leaf1ndex <= 1
|
|
15
71
|
|
|
16
|
-
def activeLeafIsUnconstrainedInAllDimensions(state:
|
|
72
|
+
def activeLeafIsUnconstrainedInAllDimensions(state: SymmetricFoldsState) -> bool:
|
|
17
73
|
return not state.dimensionsUnconstrained
|
|
18
74
|
|
|
19
|
-
def activeLeafUnconstrainedInThisDimension(state:
|
|
75
|
+
def activeLeafUnconstrainedInThisDimension(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
20
76
|
state.dimensionsUnconstrained -= 1
|
|
21
77
|
return state
|
|
22
78
|
|
|
23
|
-
def filterCommonGaps(state:
|
|
79
|
+
def filterCommonGaps(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
24
80
|
state.gapsWhere[state.gap1ndex] = state.gapsWhere[state.indexMiniGap]
|
|
25
81
|
if state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] == state.dimensionsUnconstrained:
|
|
26
82
|
state = incrementActiveGap(state)
|
|
27
83
|
state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] = 0
|
|
28
84
|
return state
|
|
29
85
|
|
|
30
|
-
def gapAvailable(state:
|
|
86
|
+
def gapAvailable(state: SymmetricFoldsState) -> bool:
|
|
31
87
|
return state.leaf1ndex > 0
|
|
32
88
|
|
|
33
|
-
def incrementActiveGap(state:
|
|
89
|
+
def incrementActiveGap(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
34
90
|
state.gap1ndex += 1
|
|
35
91
|
return state
|
|
36
92
|
|
|
37
|
-
def incrementGap1ndexCeiling(state:
|
|
93
|
+
def incrementGap1ndexCeiling(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
38
94
|
state.gap1ndexCeiling += 1
|
|
39
95
|
return state
|
|
40
96
|
|
|
41
|
-
def incrementIndexMiniGap(state:
|
|
97
|
+
def incrementIndexMiniGap(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
42
98
|
state.indexMiniGap += 1
|
|
43
99
|
return state
|
|
44
100
|
|
|
45
|
-
def initializeIndexMiniGap(state:
|
|
101
|
+
def initializeIndexMiniGap(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
46
102
|
state.indexMiniGap = state.gap1ndex
|
|
47
103
|
return state
|
|
48
104
|
|
|
49
|
-
def initializeVariablesToFindGaps(state:
|
|
105
|
+
def initializeVariablesToFindGaps(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
50
106
|
state.dimensionsUnconstrained = state.dimensionsTotal
|
|
51
107
|
state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
|
|
52
108
|
state.indexDimension = 0
|
|
53
109
|
return state
|
|
54
110
|
|
|
55
|
-
def insertActiveLeaf(state:
|
|
111
|
+
def insertActiveLeaf(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
56
112
|
state.indexLeaf = 0
|
|
57
113
|
while state.indexLeaf < state.leaf1ndex:
|
|
58
114
|
state.gapsWhere[state.gap1ndexCeiling] = state.indexLeaf
|
|
@@ -60,7 +116,7 @@ def insertActiveLeaf(state: MapFoldingState) -> MapFoldingState:
|
|
|
60
116
|
state.indexLeaf += 1
|
|
61
117
|
return state
|
|
62
118
|
|
|
63
|
-
def insertActiveLeafAtGap(state:
|
|
119
|
+
def insertActiveLeafAtGap(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
64
120
|
state.gap1ndex -= 1
|
|
65
121
|
state.leafAbove[state.leaf1ndex] = state.gapsWhere[state.gap1ndex]
|
|
66
122
|
state.leafBelow[state.leaf1ndex] = state.leafBelow[state.leafAbove[state.leaf1ndex]]
|
|
@@ -70,54 +126,54 @@ def insertActiveLeafAtGap(state: MapFoldingState) -> MapFoldingState:
|
|
|
70
126
|
state.leaf1ndex += 1
|
|
71
127
|
return state
|
|
72
128
|
|
|
73
|
-
def leafBelowSentinelIs1(state:
|
|
129
|
+
def leafBelowSentinelIs1(state: SymmetricFoldsState) -> bool:
|
|
74
130
|
return state.leafBelow[0] == 1
|
|
75
131
|
|
|
76
|
-
def leafConnecteeIsActiveLeaf(state:
|
|
132
|
+
def leafConnecteeIsActiveLeaf(state: SymmetricFoldsState) -> bool:
|
|
77
133
|
return state.leafConnectee == state.leaf1ndex
|
|
78
134
|
|
|
79
|
-
def lookForGaps(state:
|
|
135
|
+
def lookForGaps(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
80
136
|
state.gapsWhere[state.gap1ndexCeiling] = state.leafConnectee
|
|
81
137
|
if state.countDimensionsGapped[state.leafConnectee] == 0:
|
|
82
138
|
state = incrementGap1ndexCeiling(state)
|
|
83
139
|
state.countDimensionsGapped[state.leafConnectee] += 1
|
|
84
140
|
return state
|
|
85
141
|
|
|
86
|
-
def lookupLeafConnecteeInConnectionGraph(state:
|
|
142
|
+
def lookupLeafConnecteeInConnectionGraph(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
87
143
|
state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leaf1ndex]
|
|
88
144
|
return state
|
|
89
145
|
|
|
90
|
-
def loopingLeavesConnectedToActiveLeaf(state:
|
|
146
|
+
def loopingLeavesConnectedToActiveLeaf(state: SymmetricFoldsState) -> bool:
|
|
91
147
|
return state.leafConnectee != state.leaf1ndex
|
|
92
148
|
|
|
93
|
-
def loopingThroughTheDimensions(state:
|
|
149
|
+
def loopingThroughTheDimensions(state: SymmetricFoldsState) -> bool:
|
|
94
150
|
return state.indexDimension < state.dimensionsTotal
|
|
95
151
|
|
|
96
|
-
def loopingToActiveGapCeiling(state:
|
|
152
|
+
def loopingToActiveGapCeiling(state: SymmetricFoldsState) -> bool:
|
|
97
153
|
return state.indexMiniGap < state.gap1ndexCeiling
|
|
98
154
|
|
|
99
|
-
def noGapsHere(state:
|
|
155
|
+
def noGapsHere(state: SymmetricFoldsState) -> bool:
|
|
100
156
|
return state.leaf1ndex > 0 and state.gap1ndex == state.gapRangeStart[state.leaf1ndex - 1]
|
|
101
157
|
|
|
102
|
-
def tryAnotherLeafConnectee(state:
|
|
158
|
+
def tryAnotherLeafConnectee(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
103
159
|
state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leafBelow[state.leafConnectee]]
|
|
104
160
|
return state
|
|
105
161
|
|
|
106
|
-
def tryNextDimension(state:
|
|
162
|
+
def tryNextDimension(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
107
163
|
state.indexDimension += 1
|
|
108
164
|
return state
|
|
109
165
|
|
|
110
|
-
def undoLastLeafPlacement(state:
|
|
166
|
+
def undoLastLeafPlacement(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
111
167
|
state.leaf1ndex -= 1
|
|
112
168
|
state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leafBelow[state.leaf1ndex]
|
|
113
169
|
state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leafAbove[state.leaf1ndex]
|
|
114
170
|
return state
|
|
115
171
|
|
|
116
|
-
def count(state:
|
|
172
|
+
def count(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
117
173
|
while activeLeafGreaterThan0(state):
|
|
118
174
|
if activeLeafIsTheFirstLeaf(state) or leafBelowSentinelIs1(state):
|
|
119
175
|
if activeLeafGreaterThanLeavesTotal(state):
|
|
120
|
-
filterAsymmetricFolds(state
|
|
176
|
+
filterAsymmetricFolds(state)
|
|
121
177
|
else:
|
|
122
178
|
state = initializeVariablesToFindGaps(state)
|
|
123
179
|
while loopingThroughTheDimensions(state):
|
|
@@ -140,11 +196,11 @@ def count(state: MapFoldingState) -> MapFoldingState:
|
|
|
140
196
|
if gapAvailable(state):
|
|
141
197
|
state = insertActiveLeafAtGap(state)
|
|
142
198
|
else:
|
|
143
|
-
state.
|
|
144
|
-
state.
|
|
199
|
+
state.symmetricFolds = getSymmetricFoldsTotal()
|
|
200
|
+
state.symmetricFolds = (state.symmetricFolds + 1) // 2
|
|
145
201
|
return state
|
|
146
202
|
|
|
147
|
-
def doTheNeedful(state:
|
|
203
|
+
def doTheNeedful(state: SymmetricFoldsState, maxWorkers: int) -> SymmetricFoldsState:
|
|
148
204
|
initializeConcurrencyManager(maxWorkers)
|
|
149
205
|
state = count(state)
|
|
150
206
|
return state
|
|
@@ -1,28 +1,24 @@
|
|
|
1
|
-
from mapFolding.dataBaskets import
|
|
1
|
+
from mapFolding.dataBaskets import SymmetricFoldsState
|
|
2
2
|
|
|
3
|
-
def transitionOnGroupsOfFolds(state:
|
|
4
|
-
while state.
|
|
3
|
+
def transitionOnGroupsOfFolds(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
4
|
+
while state.symmetricFolds == 0:
|
|
5
5
|
if state.leaf1ndex <= 1 or state.leafBelow[0] == 1:
|
|
6
6
|
if state.leaf1ndex > state.leavesTotal:
|
|
7
|
-
state.indexLeaf =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
state.
|
|
12
|
-
state.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
state.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if state.leafComparison[(state.indexMiniGap + leafConnectee) % (state.leavesTotal + 1)] != state.leafComparison[(state.indexMiniGap + state.leavesTotal - 1 - leafConnectee) % (state.leavesTotal + 1)]:
|
|
21
|
-
ImaSymmetricFold = False
|
|
7
|
+
state.indexLeaf = 1
|
|
8
|
+
state.leafComparison[0] = 1
|
|
9
|
+
state.leafConnectee = 1
|
|
10
|
+
while state.leafConnectee < state.leavesTotal + 1:
|
|
11
|
+
state.indexMiniGap = state.leafBelow[state.indexLeaf]
|
|
12
|
+
state.leafComparison[state.leafConnectee] = (state.indexMiniGap - state.indexLeaf + state.leavesTotal) % state.leavesTotal
|
|
13
|
+
state.indexLeaf = state.indexMiniGap
|
|
14
|
+
state.leafConnectee += 1
|
|
15
|
+
for listTuples in state.indices:
|
|
16
|
+
state.leafConnectee = 1
|
|
17
|
+
for indexLeft, indexRight in listTuples:
|
|
18
|
+
if state.leafComparison[indexLeft] != state.leafComparison[indexRight]:
|
|
19
|
+
state.leafConnectee = 0
|
|
22
20
|
break
|
|
23
|
-
|
|
24
|
-
state.groupsOfFolds += ImaSymmetricFold
|
|
25
|
-
state.indexMiniGap += 1
|
|
21
|
+
state.symmetricFolds += state.leafConnectee
|
|
26
22
|
else:
|
|
27
23
|
state.dimensionsUnconstrained = state.dimensionsTotal
|
|
28
24
|
state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
|
|
@@ -64,5 +60,5 @@ def transitionOnGroupsOfFolds(state: MapFoldingState) -> MapFoldingState:
|
|
|
64
60
|
state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leaf1ndex
|
|
65
61
|
state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
|
|
66
62
|
state.leaf1ndex += 1
|
|
67
|
-
state.
|
|
68
|
-
return state
|
|
63
|
+
state.symmetricFolds = (state.symmetricFolds + 1) // 2
|
|
64
|
+
return state
|
|
@@ -1,29 +1,25 @@
|
|
|
1
|
-
from mapFolding.dataBaskets import
|
|
1
|
+
from mapFolding.dataBaskets import SymmetricFoldsState
|
|
2
2
|
from mapFolding.syntheticModules.A007822.initializeState import transitionOnGroupsOfFolds
|
|
3
3
|
|
|
4
|
-
def count(state:
|
|
4
|
+
def count(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
5
5
|
while state.leaf1ndex > 4:
|
|
6
6
|
if state.leafBelow[0] == 1:
|
|
7
7
|
if state.leaf1ndex > state.leavesTotal:
|
|
8
|
-
state.indexLeaf =
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
state.
|
|
13
|
-
state.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
state.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if state.leafComparison[(state.indexMiniGap + leafConnectee) % (state.leavesTotal + 1)] != state.leafComparison[(state.indexMiniGap + state.leavesTotal - 1 - leafConnectee) % (state.leavesTotal + 1)]:
|
|
22
|
-
ImaSymmetricFold = False
|
|
8
|
+
state.indexLeaf = 1
|
|
9
|
+
state.leafComparison[0] = 1
|
|
10
|
+
state.leafConnectee = 1
|
|
11
|
+
while state.leafConnectee < state.leavesTotal + 1:
|
|
12
|
+
state.indexMiniGap = state.leafBelow[state.indexLeaf]
|
|
13
|
+
state.leafComparison[state.leafConnectee] = (state.indexMiniGap - state.indexLeaf + state.leavesTotal) % state.leavesTotal
|
|
14
|
+
state.indexLeaf = state.indexMiniGap
|
|
15
|
+
state.leafConnectee += 1
|
|
16
|
+
for listTuples in state.indices:
|
|
17
|
+
state.leafConnectee = 1
|
|
18
|
+
for indexLeft, indexRight in listTuples:
|
|
19
|
+
if state.leafComparison[indexLeft] != state.leafComparison[indexRight]:
|
|
20
|
+
state.leafConnectee = 0
|
|
23
21
|
break
|
|
24
|
-
|
|
25
|
-
state.groupsOfFolds += ImaSymmetricFold
|
|
26
|
-
state.indexMiniGap += 1
|
|
22
|
+
state.symmetricFolds += state.leafConnectee
|
|
27
23
|
else:
|
|
28
24
|
state.dimensionsUnconstrained = state.dimensionsTotal
|
|
29
25
|
state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
|
|
@@ -65,11 +61,11 @@ def count(state: MapFoldingState) -> MapFoldingState:
|
|
|
65
61
|
state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
|
|
66
62
|
state.leaf1ndex += 1
|
|
67
63
|
else:
|
|
68
|
-
state.
|
|
69
|
-
state.
|
|
64
|
+
state.symmetricFolds *= 2
|
|
65
|
+
state.symmetricFolds = (state.symmetricFolds + 1) // 2
|
|
70
66
|
return state
|
|
71
67
|
|
|
72
|
-
def doTheNeedful(state:
|
|
68
|
+
def doTheNeedful(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
73
69
|
state = transitionOnGroupsOfFolds(state)
|
|
74
70
|
state = count(state)
|
|
75
|
-
return state
|
|
71
|
+
return state
|
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
from mapFolding.dataBaskets import (
|
|
2
2
|
Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal,
|
|
3
|
-
|
|
3
|
+
SymmetricFoldsState)
|
|
4
4
|
from mapFolding.syntheticModules.A007822.initializeState import transitionOnGroupsOfFolds
|
|
5
5
|
from numba import jit
|
|
6
|
+
from numba.typed import List
|
|
6
7
|
|
|
7
8
|
@jit(cache=True, error_model='numpy', fastmath=True, forceinline=True)
|
|
8
|
-
def count(
|
|
9
|
+
def count(symmetricFolds: 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, indices: list[list[tuple[int, int]]], leavesTotal: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeLeavesTotal, list[list[tuple[int, int]]], DatatypeLeavesTotal]:
|
|
9
10
|
while leaf1ndex > 4:
|
|
10
11
|
if leafBelow[0] == 1:
|
|
11
12
|
if leaf1ndex > leavesTotal:
|
|
12
|
-
indexLeaf =
|
|
13
|
-
|
|
13
|
+
indexLeaf = 1
|
|
14
|
+
leafComparison[0] = 1
|
|
15
|
+
leafConnectee = 1
|
|
14
16
|
while leafConnectee < leavesTotal + 1:
|
|
15
|
-
|
|
16
|
-
leafComparison[leafConnectee] = (
|
|
17
|
-
indexLeaf =
|
|
17
|
+
indexMiniGap = leafBelow[indexLeaf]
|
|
18
|
+
leafComparison[leafConnectee] = (indexMiniGap - indexLeaf + leavesTotal) % leavesTotal
|
|
19
|
+
indexLeaf = indexMiniGap
|
|
18
20
|
leafConnectee += 1
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
while leafConnectee < indexInMiddle:
|
|
25
|
-
if leafComparison[(indexMiniGap + leafConnectee) % (leavesTotal + 1)] != leafComparison[(indexMiniGap + leavesTotal - 1 - leafConnectee) % (leavesTotal + 1)]:
|
|
26
|
-
ImaSymmetricFold = False
|
|
21
|
+
for listTuples in indices:
|
|
22
|
+
leafConnectee = 1
|
|
23
|
+
for indexLeft, indexRight in listTuples:
|
|
24
|
+
if leafComparison[indexLeft] != leafComparison[indexRight]:
|
|
25
|
+
leafConnectee = 0
|
|
27
26
|
break
|
|
28
|
-
|
|
29
|
-
groupsOfFolds += ImaSymmetricFold
|
|
30
|
-
indexMiniGap += 1
|
|
27
|
+
symmetricFolds += leafConnectee
|
|
31
28
|
else:
|
|
32
29
|
dimensionsUnconstrained = dimensionsTotal
|
|
33
30
|
gap1ndexCeiling = gapRangeStart[leaf1ndex - 1]
|
|
@@ -63,14 +60,14 @@ def count(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1nde
|
|
|
63
60
|
gapRangeStart[leaf1ndex] = gap1ndex
|
|
64
61
|
leaf1ndex += 1
|
|
65
62
|
else:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
return (
|
|
63
|
+
symmetricFolds *= 2
|
|
64
|
+
symmetricFolds = (symmetricFolds + 1) // 2
|
|
65
|
+
return (symmetricFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, indices, leavesTotal)
|
|
69
66
|
|
|
70
|
-
def doTheNeedful(state:
|
|
67
|
+
def doTheNeedful(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
71
68
|
state = transitionOnGroupsOfFolds(state)
|
|
72
69
|
mapShape: tuple[DatatypeLeavesTotal, ...] = state.mapShape
|
|
73
|
-
|
|
70
|
+
symmetricFolds: DatatypeFoldsTotal = state.symmetricFolds
|
|
74
71
|
gap1ndex: DatatypeElephino = state.gap1ndex
|
|
75
72
|
gap1ndexCeiling: DatatypeElephino = state.gap1ndexCeiling
|
|
76
73
|
indexDimension: DatatypeLeavesTotal = state.indexDimension
|
|
@@ -87,7 +84,8 @@ def doTheNeedful(state: MapFoldingState) -> MapFoldingState:
|
|
|
87
84
|
leafComparison: Array1DLeavesTotal = state.leafComparison
|
|
88
85
|
connectionGraph: Array3DLeavesTotal = state.connectionGraph
|
|
89
86
|
dimensionsTotal: DatatypeLeavesTotal = state.dimensionsTotal
|
|
87
|
+
indices: list[list[tuple[int, int]]] = List(state.indices)
|
|
90
88
|
leavesTotal: DatatypeLeavesTotal = state.leavesTotal
|
|
91
|
-
|
|
92
|
-
state =
|
|
89
|
+
symmetricFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, indices, leavesTotal = count(symmetricFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, indices, leavesTotal)
|
|
90
|
+
state = SymmetricFoldsState(mapShape=mapShape, symmetricFolds=symmetricFolds, 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)
|
|
93
91
|
return state
|
|
@@ -1,29 +1,25 @@
|
|
|
1
|
-
from mapFolding.dataBaskets import
|
|
1
|
+
from mapFolding.dataBaskets import SymmetricFoldsState
|
|
2
2
|
from mapFolding.syntheticModules.A007822.initializeState import transitionOnGroupsOfFolds
|
|
3
3
|
|
|
4
|
-
def count(state:
|
|
4
|
+
def count(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
5
5
|
while state.leaf1ndex > 4:
|
|
6
6
|
if state.leafBelow[0] == 1:
|
|
7
7
|
if state.leaf1ndex > state.leavesTotal:
|
|
8
|
-
state.indexLeaf =
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
state.
|
|
13
|
-
state.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
state.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if state.leafComparison[(state.indexMiniGap + leafConnectee) % (state.leavesTotal + 1)] != state.leafComparison[(state.indexMiniGap + state.leavesTotal - 1 - leafConnectee) % (state.leavesTotal + 1)]:
|
|
22
|
-
ImaSymmetricFold = False
|
|
8
|
+
state.indexLeaf = 1
|
|
9
|
+
state.leafComparison[0] = 1
|
|
10
|
+
state.leafConnectee = 1
|
|
11
|
+
while state.leafConnectee < state.leavesTotal + 1:
|
|
12
|
+
state.indexMiniGap = state.leafBelow[state.indexLeaf]
|
|
13
|
+
state.leafComparison[state.leafConnectee] = (state.indexMiniGap - state.indexLeaf + state.leavesTotal) % state.leavesTotal
|
|
14
|
+
state.indexLeaf = state.indexMiniGap
|
|
15
|
+
state.leafConnectee += 1
|
|
16
|
+
for listTuples in state.indices:
|
|
17
|
+
state.leafConnectee = 1
|
|
18
|
+
for indexLeft, indexRight in listTuples:
|
|
19
|
+
if state.leafComparison[indexLeft] != state.leafComparison[indexRight]:
|
|
20
|
+
state.leafConnectee = 0
|
|
23
21
|
break
|
|
24
|
-
|
|
25
|
-
state.groupsOfFolds += ImaSymmetricFold
|
|
26
|
-
state.indexMiniGap += 1
|
|
22
|
+
state.symmetricFolds += state.leafConnectee
|
|
27
23
|
else:
|
|
28
24
|
state.dimensionsUnconstrained = state.dimensionsTotal
|
|
29
25
|
state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
|
|
@@ -59,11 +55,11 @@ def count(state: MapFoldingState) -> MapFoldingState:
|
|
|
59
55
|
state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
|
|
60
56
|
state.leaf1ndex += 1
|
|
61
57
|
else:
|
|
62
|
-
state.
|
|
63
|
-
state.
|
|
58
|
+
state.symmetricFolds *= 2
|
|
59
|
+
state.symmetricFolds = (state.symmetricFolds + 1) // 2
|
|
64
60
|
return state
|
|
65
61
|
|
|
66
|
-
def doTheNeedful(state:
|
|
62
|
+
def doTheNeedful(state: SymmetricFoldsState) -> SymmetricFoldsState:
|
|
67
63
|
state = transitionOnGroupsOfFolds(state)
|
|
68
64
|
state = count(state)
|
|
69
65
|
return state
|
|
@@ -75,14 +75,13 @@ def unRepackParallelMapFoldingState(state: ParallelMapFoldingState) -> ParallelM
|
|
|
75
75
|
gapsWhere: Array1DLeavesTotal = state.gapsWhere
|
|
76
76
|
leafAbove: Array1DLeavesTotal = state.leafAbove
|
|
77
77
|
leafBelow: Array1DLeavesTotal = state.leafBelow
|
|
78
|
-
leafComparison: Array1DLeavesTotal = state.leafComparison
|
|
79
78
|
connectionGraph: Array3DLeavesTotal = state.connectionGraph
|
|
80
79
|
dimensionsTotal: DatatypeLeavesTotal = state.dimensionsTotal
|
|
81
80
|
leavesTotal: DatatypeLeavesTotal = state.leavesTotal
|
|
82
81
|
taskDivisions: DatatypeLeavesTotal = state.taskDivisions
|
|
83
82
|
taskIndex: DatatypeLeavesTotal = state.taskIndex
|
|
84
83
|
groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal, taskDivisions, taskIndex = count(groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal, taskDivisions, taskIndex)
|
|
85
|
-
state = ParallelMapFoldingState(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,
|
|
84
|
+
state = ParallelMapFoldingState(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, taskDivisions=taskDivisions, taskIndex=taskIndex)
|
|
86
85
|
return state
|
|
87
86
|
|
|
88
87
|
def doTheNeedful(state: ParallelMapFoldingState, concurrencyLimit: int) -> tuple[int, list[ParallelMapFoldingState]]:
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
from mapFolding.dataBaskets import
|
|
1
|
+
from mapFolding.dataBaskets import (
|
|
2
|
+
Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal,
|
|
3
|
+
MapFoldingState)
|
|
2
4
|
from numba import jit
|
|
3
5
|
|
|
4
6
|
@jit(cache=True, error_model='numpy', fastmath=True, forceinline=True)
|
|
@@ -66,10 +68,9 @@ def doTheNeedful(state: MapFoldingState) -> MapFoldingState:
|
|
|
66
68
|
gapsWhere: Array1DLeavesTotal = state.gapsWhere
|
|
67
69
|
leafAbove: Array1DLeavesTotal = state.leafAbove
|
|
68
70
|
leafBelow: Array1DLeavesTotal = state.leafBelow
|
|
69
|
-
leafComparison: Array1DLeavesTotal = state.leafComparison
|
|
70
71
|
connectionGraph: Array3DLeavesTotal = state.connectionGraph
|
|
71
72
|
dimensionsTotal: DatatypeLeavesTotal = state.dimensionsTotal
|
|
72
73
|
leavesTotal: DatatypeLeavesTotal = state.leavesTotal
|
|
73
74
|
groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal = count(groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, connectionGraph, dimensionsTotal, leavesTotal)
|
|
74
|
-
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
|
|
75
|
-
return state
|
|
75
|
+
state = MapFoldingState(mapShape=mapShape, groupsOfFolds=groupsOfFolds, gap1ndex=gap1ndex, gap1ndexCeiling=gap1ndexCeiling, indexDimension=indexDimension, indexLeaf=indexLeaf, indexMiniGap=indexMiniGap, leaf1ndex=leaf1ndex, leafConnectee=leafConnectee, dimensionsUnconstrained=dimensionsUnconstrained, countDimensionsGapped=countDimensionsGapped, gapRangeStart=gapRangeStart, gapsWhere=gapsWhere, leafAbove=leafAbove, leafBelow=leafBelow)
|
|
76
|
+
return state
|