mapFolding 0.6.0__py3-none-any.whl → 0.7.1__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/__init__.py +6 -104
- mapFolding/basecamp.py +12 -8
- mapFolding/beDRY.py +103 -286
- mapFolding/filesystem.py +95 -0
- mapFolding/noHomeYet.py +20 -0
- mapFolding/oeis.py +46 -39
- mapFolding/reference/flattened.py +377 -0
- mapFolding/reference/hunterNumba.py +132 -0
- mapFolding/reference/irvineJavaPort.py +120 -0
- mapFolding/reference/jax.py +208 -0
- mapFolding/reference/lunnan.py +153 -0
- mapFolding/reference/lunnanNumpy.py +123 -0
- mapFolding/reference/lunnanWhile.py +121 -0
- mapFolding/reference/rotatedEntryPoint.py +240 -0
- mapFolding/reference/total_countPlus1vsPlusN.py +211 -0
- mapFolding/someAssemblyRequired/Z0Z_workbench.py +33 -0
- mapFolding/someAssemblyRequired/__init__.py +16 -0
- mapFolding/someAssemblyRequired/getLLVMforNoReason.py +21 -0
- mapFolding/someAssemblyRequired/ingredientsNumba.py +100 -0
- mapFolding/someAssemblyRequired/synthesizeCountingFunctions.py +7 -0
- mapFolding/someAssemblyRequired/synthesizeDataConverters.py +135 -0
- mapFolding/someAssemblyRequired/synthesizeNumba.py +91 -0
- mapFolding/someAssemblyRequired/synthesizeNumbaJob.py +417 -0
- mapFolding/someAssemblyRequired/synthesizeNumbaModules.py +91 -0
- mapFolding/someAssemblyRequired/transformationTools.py +425 -0
- mapFolding/someAssemblyRequired/whatWillBe.py +357 -0
- mapFolding/syntheticModules/__init__.py +0 -0
- mapFolding/syntheticModules/dataNamespaceFlattened.py +30 -0
- mapFolding/syntheticModules/multiprocessingCount_doTheNeedful.py +216 -0
- mapFolding/syntheticModules/numbaCount.py +90 -0
- mapFolding/syntheticModules/numbaCountExample.py +158 -0
- mapFolding/syntheticModules/numbaCountSequential.py +111 -0
- mapFolding/syntheticModules/numbaCount_doTheNeedful.py +13 -0
- mapFolding/syntheticModules/numba_doTheNeedful.py +12 -0
- mapFolding/syntheticModules/numba_doTheNeedfulExample.py +13 -0
- mapFolding/theDao.py +216 -229
- mapFolding/theSSOT.py +269 -101
- {mapfolding-0.6.0.dist-info → mapfolding-0.7.1.dist-info}/METADATA +7 -6
- mapfolding-0.7.1.dist-info/RECORD +51 -0
- {mapfolding-0.6.0.dist-info → mapfolding-0.7.1.dist-info}/WHEEL +1 -1
- {mapfolding-0.6.0.dist-info → mapfolding-0.7.1.dist-info}/top_level.txt +1 -0
- tests/__init__.py +0 -0
- tests/conftest.py +278 -0
- tests/test_computations.py +53 -0
- tests/test_filesystem.py +52 -0
- tests/test_oeis.py +128 -0
- tests/test_other.py +84 -0
- tests/test_tasks.py +56 -0
- mapFolding/theConfiguration.py +0 -58
- mapFolding/theSSOTdatatypes.py +0 -155
- mapFolding/theWrongWay.py +0 -7
- mapfolding-0.6.0.dist-info/RECORD +0 -16
- {mapfolding-0.6.0.dist-info → mapfolding-0.7.1.dist-info}/LICENSE +0 -0
- {mapfolding-0.6.0.dist-info → mapfolding-0.7.1.dist-info}/entry_points.txt +0 -0
mapFolding/theDao.py
CHANGED
|
@@ -1,232 +1,219 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return
|
|
38
|
-
|
|
39
|
-
def
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
def countSequential( connectionGraph: ndarray[tuple[int, int, int], dtype[integer[Any]]]
|
|
186
|
-
, foldGroups: ndarray[tuple[int] , dtype[integer[Any]]]
|
|
187
|
-
, gapsWhere: ndarray[tuple[int] , dtype[integer[Any]]]
|
|
188
|
-
, my: ndarray[tuple[int] , dtype[integer[Any]]]
|
|
189
|
-
, track: ndarray[tuple[int, int] , dtype[integer[Any]]]
|
|
190
|
-
) -> None:
|
|
191
|
-
|
|
192
|
-
groupsOfFolds: int = 0
|
|
193
|
-
|
|
194
|
-
while activeLeafGreaterThan0(my=my):
|
|
195
|
-
if activeLeafIsTheFirstLeaf(my=my) or leafBelowSentinelIs1(track=track):
|
|
196
|
-
if activeLeafGreaterThanLeavesTotal(foldGroups=foldGroups, my=my):
|
|
197
|
-
groupsOfFolds += 1
|
|
1
|
+
from concurrent.futures import ProcessPoolExecutor
|
|
2
|
+
from mapFolding.theSSOT import ComputationState
|
|
3
|
+
import concurrent.futures
|
|
4
|
+
import copy
|
|
5
|
+
import multiprocessing
|
|
6
|
+
|
|
7
|
+
# When to use multiprocessing.set_start_method https://github.com/hunterhogan/mapFolding/issues/6
|
|
8
|
+
if __name__ == '__main__':
|
|
9
|
+
multiprocessing.set_start_method('spawn')
|
|
10
|
+
|
|
11
|
+
def activeLeafConnectedToItself(state: ComputationState) -> bool:
|
|
12
|
+
return state.leafConnectee == state.leaf1ndex
|
|
13
|
+
|
|
14
|
+
def activeLeafGreaterThan0(state: ComputationState) -> bool:
|
|
15
|
+
return state.leaf1ndex > 0
|
|
16
|
+
|
|
17
|
+
def activeLeafGreaterThanLeavesTotal(state: ComputationState) -> bool:
|
|
18
|
+
return state.leaf1ndex > state.leavesTotal
|
|
19
|
+
|
|
20
|
+
def activeLeafIsTheFirstLeaf(state: ComputationState) -> bool:
|
|
21
|
+
return state.leaf1ndex <= 1
|
|
22
|
+
|
|
23
|
+
def allDimensionsAreUnconstrained(state: ComputationState) -> bool:
|
|
24
|
+
return not state.dimensionsUnconstrained
|
|
25
|
+
|
|
26
|
+
def backtrack(state: ComputationState) -> ComputationState:
|
|
27
|
+
state.leaf1ndex -= 1
|
|
28
|
+
state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leafBelow[state.leaf1ndex]
|
|
29
|
+
state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leafAbove[state.leaf1ndex]
|
|
30
|
+
return state
|
|
31
|
+
|
|
32
|
+
def countGaps(state: ComputationState) -> ComputationState:
|
|
33
|
+
state.gapsWhere[state.gap1ndexCeiling] = state.leafConnectee
|
|
34
|
+
if state.countDimensionsGapped[state.leafConnectee] == 0:
|
|
35
|
+
state = incrementGap1ndexCeiling(state)
|
|
36
|
+
state.countDimensionsGapped[state.leafConnectee] += 1
|
|
37
|
+
return state
|
|
38
|
+
|
|
39
|
+
def decrementDimensionsUnconstrained(state: ComputationState) -> ComputationState:
|
|
40
|
+
state.dimensionsUnconstrained -= 1
|
|
41
|
+
return state
|
|
42
|
+
|
|
43
|
+
def dimensionsUnconstrainedCondition(state: ComputationState) -> bool:
|
|
44
|
+
return state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leaf1ndex] == state.leaf1ndex
|
|
45
|
+
|
|
46
|
+
def filterCommonGaps(state: ComputationState) -> ComputationState:
|
|
47
|
+
state.gapsWhere[state.gap1ndex] = state.gapsWhere[state.indexMiniGap]
|
|
48
|
+
if state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] == state.dimensionsUnconstrained:
|
|
49
|
+
state = incrementActiveGap(state)
|
|
50
|
+
state.countDimensionsGapped[state.gapsWhere[state.indexMiniGap]] = 0
|
|
51
|
+
return state
|
|
52
|
+
|
|
53
|
+
def incrementActiveGap(state: ComputationState) -> ComputationState:
|
|
54
|
+
state.gap1ndex += 1
|
|
55
|
+
return state
|
|
56
|
+
|
|
57
|
+
def incrementGap1ndexCeiling(state: ComputationState) -> ComputationState:
|
|
58
|
+
state.gap1ndexCeiling += 1
|
|
59
|
+
return state
|
|
60
|
+
|
|
61
|
+
def incrementIndexDimension(state: ComputationState) -> ComputationState:
|
|
62
|
+
state.indexDimension += 1
|
|
63
|
+
return state
|
|
64
|
+
|
|
65
|
+
def incrementIndexMiniGap(state: ComputationState) -> ComputationState:
|
|
66
|
+
state.indexMiniGap += 1
|
|
67
|
+
return state
|
|
68
|
+
|
|
69
|
+
def initializeIndexMiniGap(state: ComputationState) -> ComputationState:
|
|
70
|
+
state.indexMiniGap = state.gap1ndex
|
|
71
|
+
return state
|
|
72
|
+
|
|
73
|
+
def initializeLeafConnectee(state: ComputationState) -> ComputationState:
|
|
74
|
+
state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leaf1ndex]
|
|
75
|
+
return state
|
|
76
|
+
|
|
77
|
+
def initializeVariablesToFindGaps(state: ComputationState) -> ComputationState:
|
|
78
|
+
state.dimensionsUnconstrained = state.dimensionsTotal
|
|
79
|
+
state.gap1ndexCeiling = state.gapRangeStart[state.leaf1ndex - 1]
|
|
80
|
+
state.indexDimension = 0
|
|
81
|
+
return state
|
|
82
|
+
|
|
83
|
+
def insertUnconstrainedLeaf(state: ComputationState) -> ComputationState:
|
|
84
|
+
indexLeaf = 0
|
|
85
|
+
while indexLeaf < state.leaf1ndex:
|
|
86
|
+
state.gapsWhere[state.gap1ndexCeiling] = indexLeaf
|
|
87
|
+
state.gap1ndexCeiling += 1
|
|
88
|
+
indexLeaf += 1
|
|
89
|
+
return state
|
|
90
|
+
|
|
91
|
+
def leafBelowSentinelIs1(state: ComputationState) -> bool:
|
|
92
|
+
return state.leafBelow[0] == 1
|
|
93
|
+
|
|
94
|
+
def loopingLeavesConnectedToActiveLeaf(state: ComputationState) -> bool:
|
|
95
|
+
return state.leafConnectee != state.leaf1ndex
|
|
96
|
+
|
|
97
|
+
def loopingToActiveGapCeiling(state: ComputationState) -> bool:
|
|
98
|
+
return state.indexMiniGap < state.gap1ndexCeiling
|
|
99
|
+
|
|
100
|
+
def loopUpToDimensionsTotal(state: ComputationState) -> bool:
|
|
101
|
+
return state.indexDimension < state.dimensionsTotal
|
|
102
|
+
|
|
103
|
+
def noGapsHere(state: ComputationState) -> bool:
|
|
104
|
+
return (state.leaf1ndex > 0) and (state.gap1ndex == state.gapRangeStart[state.leaf1ndex - 1])
|
|
105
|
+
|
|
106
|
+
def placeLeaf(state: ComputationState) -> ComputationState:
|
|
107
|
+
state.gap1ndex -= 1
|
|
108
|
+
state.leafAbove[state.leaf1ndex] = state.gapsWhere[state.gap1ndex]
|
|
109
|
+
state.leafBelow[state.leaf1ndex] = state.leafBelow[state.leafAbove[state.leaf1ndex]]
|
|
110
|
+
state.leafBelow[state.leafAbove[state.leaf1ndex]] = state.leaf1ndex
|
|
111
|
+
state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leaf1ndex
|
|
112
|
+
state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
|
|
113
|
+
state.leaf1ndex += 1
|
|
114
|
+
return state
|
|
115
|
+
|
|
116
|
+
def thereIsAnActiveLeaf(state: ComputationState) -> bool:
|
|
117
|
+
return state.leaf1ndex > 0
|
|
118
|
+
|
|
119
|
+
def thisIsMyTaskIndex(state: ComputationState) -> bool:
|
|
120
|
+
return (state.leaf1ndex != state.taskDivisions) or (state.leafConnectee % state.taskDivisions == state.taskIndex)
|
|
121
|
+
|
|
122
|
+
def updateLeafConnectee(state: ComputationState) -> ComputationState:
|
|
123
|
+
state.leafConnectee = state.connectionGraph[state.indexDimension, state.leaf1ndex, state.leafBelow[state.leafConnectee]]
|
|
124
|
+
return state
|
|
125
|
+
|
|
126
|
+
def countInitialize(state: ComputationState) -> ComputationState:
|
|
127
|
+
while activeLeafGreaterThan0(state):
|
|
128
|
+
if activeLeafIsTheFirstLeaf(state) or leafBelowSentinelIs1(state):
|
|
129
|
+
state = initializeVariablesToFindGaps(state)
|
|
130
|
+
while loopUpToDimensionsTotal(state):
|
|
131
|
+
state = initializeLeafConnectee(state)
|
|
132
|
+
if activeLeafConnectedToItself(state):
|
|
133
|
+
state = decrementDimensionsUnconstrained(state)
|
|
134
|
+
else:
|
|
135
|
+
while loopingLeavesConnectedToActiveLeaf(state):
|
|
136
|
+
state = countGaps(state)
|
|
137
|
+
state = updateLeafConnectee(state)
|
|
138
|
+
state = incrementIndexDimension(state)
|
|
139
|
+
if allDimensionsAreUnconstrained(state):
|
|
140
|
+
state = insertUnconstrainedLeaf(state)
|
|
141
|
+
state = initializeIndexMiniGap(state)
|
|
142
|
+
while loopingToActiveGapCeiling(state):
|
|
143
|
+
state = filterCommonGaps(state)
|
|
144
|
+
state = incrementIndexMiniGap(state)
|
|
145
|
+
if thereIsAnActiveLeaf(state):
|
|
146
|
+
state = placeLeaf(state)
|
|
147
|
+
if state.gap1ndex > 0:
|
|
148
|
+
break
|
|
149
|
+
return state
|
|
150
|
+
|
|
151
|
+
def countParallel(state: ComputationState) -> ComputationState:
|
|
152
|
+
while activeLeafGreaterThan0(state):
|
|
153
|
+
if activeLeafIsTheFirstLeaf(state) or leafBelowSentinelIs1(state):
|
|
154
|
+
if activeLeafGreaterThanLeavesTotal(state):
|
|
155
|
+
state.groupsOfFolds += 1
|
|
156
|
+
else:
|
|
157
|
+
state = initializeVariablesToFindGaps(state)
|
|
158
|
+
while loopUpToDimensionsTotal(state):
|
|
159
|
+
if dimensionsUnconstrainedCondition(state):
|
|
160
|
+
state = decrementDimensionsUnconstrained(state)
|
|
161
|
+
else:
|
|
162
|
+
state = initializeLeafConnectee(state)
|
|
163
|
+
while loopingLeavesConnectedToActiveLeaf(state):
|
|
164
|
+
if thisIsMyTaskIndex(state):
|
|
165
|
+
state = countGaps(state)
|
|
166
|
+
state = updateLeafConnectee(state)
|
|
167
|
+
state = incrementIndexDimension(state)
|
|
168
|
+
state = initializeIndexMiniGap(state)
|
|
169
|
+
while loopingToActiveGapCeiling(state):
|
|
170
|
+
state = filterCommonGaps(state)
|
|
171
|
+
state = incrementIndexMiniGap(state)
|
|
172
|
+
while noGapsHere(state):
|
|
173
|
+
state = backtrack(state)
|
|
174
|
+
if thereIsAnActiveLeaf(state):
|
|
175
|
+
state = placeLeaf(state)
|
|
176
|
+
state.foldGroups[state.taskIndex] = state.groupsOfFolds
|
|
177
|
+
return state
|
|
178
|
+
|
|
179
|
+
def countSequential(state: ComputationState) -> ComputationState:
|
|
180
|
+
while activeLeafGreaterThan0(state):
|
|
181
|
+
if activeLeafIsTheFirstLeaf(state) or leafBelowSentinelIs1(state):
|
|
182
|
+
if activeLeafGreaterThanLeavesTotal(state):
|
|
183
|
+
state.groupsOfFolds += 1
|
|
198
184
|
else:
|
|
199
|
-
initializeVariablesToFindGaps(
|
|
200
|
-
while loopUpToDimensionsTotal(
|
|
201
|
-
initializeLeafConnectee(
|
|
202
|
-
if activeLeafConnectedToItself(
|
|
203
|
-
decrementDimensionsUnconstrained(
|
|
185
|
+
state = initializeVariablesToFindGaps(state)
|
|
186
|
+
while loopUpToDimensionsTotal(state):
|
|
187
|
+
state = initializeLeafConnectee(state)
|
|
188
|
+
if activeLeafConnectedToItself(state):
|
|
189
|
+
state = decrementDimensionsUnconstrained(state)
|
|
204
190
|
else:
|
|
205
|
-
while loopingLeavesConnectedToActiveLeaf(
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
incrementIndexDimension(
|
|
209
|
-
initializeIndexMiniGap(
|
|
210
|
-
while loopingToActiveGapCeiling(
|
|
211
|
-
|
|
212
|
-
incrementIndexMiniGap(
|
|
213
|
-
while noGapsHere(
|
|
214
|
-
backtrack(
|
|
215
|
-
if thereIsAnActiveLeaf(
|
|
216
|
-
|
|
217
|
-
foldGroups[
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
191
|
+
while loopingLeavesConnectedToActiveLeaf(state):
|
|
192
|
+
state = countGaps(state)
|
|
193
|
+
state = updateLeafConnectee(state)
|
|
194
|
+
state = incrementIndexDimension(state)
|
|
195
|
+
state = initializeIndexMiniGap(state)
|
|
196
|
+
while loopingToActiveGapCeiling(state):
|
|
197
|
+
state = filterCommonGaps(state)
|
|
198
|
+
state = incrementIndexMiniGap(state)
|
|
199
|
+
while noGapsHere(state):
|
|
200
|
+
state = backtrack(state)
|
|
201
|
+
if thereIsAnActiveLeaf(state):
|
|
202
|
+
state = placeLeaf(state)
|
|
203
|
+
state.foldGroups[state.taskIndex] = state.groupsOfFolds
|
|
204
|
+
return state
|
|
205
|
+
|
|
206
|
+
def doTheNeedful(state: ComputationState) -> ComputationState:
|
|
207
|
+
state = countInitialize(state)
|
|
208
|
+
if state.taskDivisions > 0:
|
|
209
|
+
dictionaryConcurrency: dict[int, concurrent.futures.Future[ComputationState]] = {}
|
|
210
|
+
with ProcessPoolExecutor(state.concurrencyLimit) as concurrencyManager:
|
|
211
|
+
for indexSherpa in range(state.taskDivisions):
|
|
212
|
+
stateParallel = copy.deepcopy(state)
|
|
213
|
+
stateParallel.taskIndex = indexSherpa
|
|
214
|
+
dictionaryConcurrency[indexSherpa] = concurrencyManager.submit(countParallel, stateParallel)
|
|
215
|
+
for indexSherpa in range(state.taskDivisions):
|
|
216
|
+
state.foldGroups[indexSherpa] = dictionaryConcurrency[indexSherpa].result().foldGroups[indexSherpa]
|
|
217
|
+
return state
|
|
231
218
|
else:
|
|
232
|
-
countSequential(
|
|
219
|
+
return countSequential(state)
|