mapFolding 0.4.1__py3-none-any.whl → 0.4.3__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 +2 -1
- mapFolding/basecamp.py +1 -1
- mapFolding/beDRY.py +120 -113
- mapFolding/oeis.py +18 -17
- mapFolding/someAssemblyRequired/synthesizeNumba.py +41 -48
- mapFolding/someAssemblyRequired/synthesizeNumbaGeneralized.py +83 -12
- mapFolding/someAssemblyRequired/synthesizeNumbaJob.py +12 -23
- mapFolding/someAssemblyRequired/synthesizeNumbaModules.py +82 -30
- mapFolding/syntheticModules/numbaCount.py +158 -0
- mapFolding/syntheticModules/numba_doTheNeedful.py +5 -12
- mapFolding/theDao.py +76 -73
- mapFolding/theSSOT.py +50 -189
- mapFolding/theSSOTdatatypes.py +168 -0
- {mapFolding-0.4.1.dist-info → mapFolding-0.4.3.dist-info}/METADATA +1 -1
- mapFolding-0.4.3.dist-info/RECORD +40 -0
- tests/conftest.py +30 -31
- tests/test_computations.py +27 -63
- tests/test_oeis.py +7 -10
- mapFolding/syntheticModules/numba_countInitialize.py +0 -52
- mapFolding/syntheticModules/numba_countParallel.py +0 -65
- mapFolding/syntheticModules/numba_countSequential.py +0 -67
- mapFolding/theSSOTnumba.py +0 -132
- mapFolding-0.4.1.dist-info/RECORD +0 -42
- {mapFolding-0.4.1.dist-info → mapFolding-0.4.3.dist-info}/LICENSE +0 -0
- {mapFolding-0.4.1.dist-info → mapFolding-0.4.3.dist-info}/WHEEL +0 -0
- {mapFolding-0.4.1.dist-info → mapFolding-0.4.3.dist-info}/entry_points.txt +0 -0
- {mapFolding-0.4.1.dist-info → mapFolding-0.4.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
from mapFolding import indexMy, indexTrack
|
|
2
|
+
from numba import jit, int64, prange, uint16
|
|
3
|
+
from numpy import ndarray, dtype, integer
|
|
4
|
+
from typing import Tuple, Any
|
|
5
|
+
|
|
6
|
+
@jit((uint16[:, :, ::1], uint16[::1], uint16[::1], uint16[:, ::1]), _nrt=True, boundscheck=False, cache=True, error_model='numpy', fastmath=True, forceinline=True, inline='always', looplift=False, no_cfunc_wrapper=False, no_cpython_wrapper=False, nopython=True, parallel=False)
|
|
7
|
+
def countInitialize(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
8
|
+
while my[indexMy.leaf1ndex.value] > 0:
|
|
9
|
+
if my[indexMy.leaf1ndex.value] <= 1 or track[indexTrack.leafBelow.value, 0] == 1:
|
|
10
|
+
my[indexMy.dimensionsUnconstrained.value] = my[indexMy.dimensionsTotal.value]
|
|
11
|
+
my[indexMy.gap1ndexCeiling.value] = track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value] - 1]
|
|
12
|
+
my[indexMy.indexDimension.value] = 0
|
|
13
|
+
while my[indexMy.indexDimension.value] < my[indexMy.dimensionsTotal.value]:
|
|
14
|
+
if connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], my[indexMy.leaf1ndex.value]] == my[indexMy.leaf1ndex.value]:
|
|
15
|
+
my[indexMy.dimensionsUnconstrained.value] -= 1
|
|
16
|
+
else:
|
|
17
|
+
my[indexMy.leafConnectee.value] = connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], my[indexMy.leaf1ndex.value]]
|
|
18
|
+
while my[indexMy.leafConnectee.value] != my[indexMy.leaf1ndex.value]:
|
|
19
|
+
gapsWhere[my[indexMy.gap1ndexCeiling.value]] = my[indexMy.leafConnectee.value]
|
|
20
|
+
if track[indexTrack.countDimensionsGapped.value, my[indexMy.leafConnectee.value]] == 0:
|
|
21
|
+
my[indexMy.gap1ndexCeiling.value] += 1
|
|
22
|
+
track[indexTrack.countDimensionsGapped.value, my[indexMy.leafConnectee.value]] += 1
|
|
23
|
+
my[indexMy.leafConnectee.value] = connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], track[indexTrack.leafBelow.value, my[indexMy.leafConnectee.value]]]
|
|
24
|
+
my[indexMy.indexDimension.value] += 1
|
|
25
|
+
if not my[indexMy.dimensionsUnconstrained.value]:
|
|
26
|
+
my[indexMy.indexLeaf.value] = 0
|
|
27
|
+
while my[indexMy.indexLeaf.value] < my[indexMy.leaf1ndex.value]:
|
|
28
|
+
gapsWhere[my[indexMy.gap1ndexCeiling.value]] = my[indexMy.indexLeaf.value]
|
|
29
|
+
my[indexMy.gap1ndexCeiling.value] += 1
|
|
30
|
+
my[indexMy.indexLeaf.value] += 1
|
|
31
|
+
my[indexMy.indexMiniGap.value] = my[indexMy.gap1ndex.value]
|
|
32
|
+
while my[indexMy.indexMiniGap.value] < my[indexMy.gap1ndexCeiling.value]:
|
|
33
|
+
gapsWhere[my[indexMy.gap1ndex.value]] = gapsWhere[my[indexMy.indexMiniGap.value]]
|
|
34
|
+
if track[indexTrack.countDimensionsGapped.value, gapsWhere[my[indexMy.indexMiniGap.value]]] == my[indexMy.dimensionsUnconstrained.value]:
|
|
35
|
+
my[indexMy.gap1ndex.value] += 1
|
|
36
|
+
track[indexTrack.countDimensionsGapped.value, gapsWhere[my[indexMy.indexMiniGap.value]]] = 0
|
|
37
|
+
my[indexMy.indexMiniGap.value] += 1
|
|
38
|
+
if my[indexMy.leaf1ndex.value] > 0:
|
|
39
|
+
my[indexMy.gap1ndex.value] -= 1
|
|
40
|
+
track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]] = gapsWhere[my[indexMy.gap1ndex.value]]
|
|
41
|
+
track[indexTrack.leafBelow.value, my[indexMy.leaf1ndex.value]] = track[indexTrack.leafBelow.value, track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]]]
|
|
42
|
+
track[indexTrack.leafBelow.value, track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]]] = my[indexMy.leaf1ndex.value]
|
|
43
|
+
track[indexTrack.leafAbove.value, track[indexTrack.leafBelow.value, my[indexMy.leaf1ndex.value]]] = my[indexMy.leaf1ndex.value]
|
|
44
|
+
track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value]] = my[indexMy.gap1ndex.value]
|
|
45
|
+
my[indexMy.leaf1ndex.value] += 1
|
|
46
|
+
if my[indexMy.gap1ndex.value] > 0:
|
|
47
|
+
return
|
|
48
|
+
|
|
49
|
+
@jit((uint16[:, :, ::1], int64[::1], uint16[::1], uint16[::1], uint16[:, ::1]), _nrt=True, boundscheck=False, cache=True, error_model='numpy', fastmath=True, forceinline=True, inline='always', looplift=False, no_cfunc_wrapper=True, no_cpython_wrapper=True, nopython=True, parallel=True)
|
|
50
|
+
def countParallel(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], foldGroups: ndarray[Tuple[int], dtype[integer[Any]]], gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
51
|
+
gapsWherePARALLEL = gapsWhere.copy()
|
|
52
|
+
myPARALLEL = my.copy()
|
|
53
|
+
trackPARALLEL = track.copy()
|
|
54
|
+
taskDivisionsPrange = myPARALLEL[indexMy.taskDivisions.value]
|
|
55
|
+
for indexSherpa in prange(taskDivisionsPrange):
|
|
56
|
+
groupsOfFolds: int = 0
|
|
57
|
+
gapsWhere = gapsWherePARALLEL.copy()
|
|
58
|
+
my = myPARALLEL.copy()
|
|
59
|
+
track = trackPARALLEL.copy()
|
|
60
|
+
my[indexMy.taskIndex.value] = indexSherpa
|
|
61
|
+
while my[indexMy.leaf1ndex.value] > 0:
|
|
62
|
+
if my[indexMy.leaf1ndex.value] <= 1 or track[indexTrack.leafBelow.value, 0] == 1:
|
|
63
|
+
if my[indexMy.leaf1ndex.value] > foldGroups[-1]:
|
|
64
|
+
groupsOfFolds += 1
|
|
65
|
+
else:
|
|
66
|
+
my[indexMy.dimensionsUnconstrained.value] = my[indexMy.dimensionsTotal.value]
|
|
67
|
+
my[indexMy.gap1ndexCeiling.value] = track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value] - 1]
|
|
68
|
+
my[indexMy.indexDimension.value] = 0
|
|
69
|
+
while my[indexMy.indexDimension.value] < my[indexMy.dimensionsTotal.value]:
|
|
70
|
+
if connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], my[indexMy.leaf1ndex.value]] == my[indexMy.leaf1ndex.value]:
|
|
71
|
+
my[indexMy.dimensionsUnconstrained.value] -= 1
|
|
72
|
+
else:
|
|
73
|
+
my[indexMy.leafConnectee.value] = connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], my[indexMy.leaf1ndex.value]]
|
|
74
|
+
while my[indexMy.leafConnectee.value] != my[indexMy.leaf1ndex.value]:
|
|
75
|
+
if my[indexMy.leaf1ndex.value] != my[indexMy.taskDivisions.value] or my[indexMy.leafConnectee.value] % my[indexMy.taskDivisions.value] == my[indexMy.taskIndex.value]:
|
|
76
|
+
gapsWhere[my[indexMy.gap1ndexCeiling.value]] = my[indexMy.leafConnectee.value]
|
|
77
|
+
if track[indexTrack.countDimensionsGapped.value, my[indexMy.leafConnectee.value]] == 0:
|
|
78
|
+
my[indexMy.gap1ndexCeiling.value] += 1
|
|
79
|
+
track[indexTrack.countDimensionsGapped.value, my[indexMy.leafConnectee.value]] += 1
|
|
80
|
+
my[indexMy.leafConnectee.value] = connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], track[indexTrack.leafBelow.value, my[indexMy.leafConnectee.value]]]
|
|
81
|
+
my[indexMy.indexDimension.value] += 1
|
|
82
|
+
my[indexMy.indexMiniGap.value] = my[indexMy.gap1ndex.value]
|
|
83
|
+
while my[indexMy.indexMiniGap.value] < my[indexMy.gap1ndexCeiling.value]:
|
|
84
|
+
gapsWhere[my[indexMy.gap1ndex.value]] = gapsWhere[my[indexMy.indexMiniGap.value]]
|
|
85
|
+
if track[indexTrack.countDimensionsGapped.value, gapsWhere[my[indexMy.indexMiniGap.value]]] == my[indexMy.dimensionsUnconstrained.value]:
|
|
86
|
+
my[indexMy.gap1ndex.value] += 1
|
|
87
|
+
track[indexTrack.countDimensionsGapped.value, gapsWhere[my[indexMy.indexMiniGap.value]]] = 0
|
|
88
|
+
my[indexMy.indexMiniGap.value] += 1
|
|
89
|
+
while my[indexMy.leaf1ndex.value] > 0 and my[indexMy.gap1ndex.value] == track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value] - 1]:
|
|
90
|
+
my[indexMy.leaf1ndex.value] -= 1
|
|
91
|
+
track[indexTrack.leafBelow.value, track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]]] = track[indexTrack.leafBelow.value, my[indexMy.leaf1ndex.value]]
|
|
92
|
+
track[indexTrack.leafAbove.value, track[indexTrack.leafBelow.value, my[indexMy.leaf1ndex.value]]] = track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]]
|
|
93
|
+
if my[indexMy.leaf1ndex.value] > 0:
|
|
94
|
+
my[indexMy.gap1ndex.value] -= 1
|
|
95
|
+
track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]] = gapsWhere[my[indexMy.gap1ndex.value]]
|
|
96
|
+
track[indexTrack.leafBelow.value, my[indexMy.leaf1ndex.value]] = track[indexTrack.leafBelow.value, track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]]]
|
|
97
|
+
track[indexTrack.leafBelow.value, track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]]] = my[indexMy.leaf1ndex.value]
|
|
98
|
+
track[indexTrack.leafAbove.value, track[indexTrack.leafBelow.value, my[indexMy.leaf1ndex.value]]] = my[indexMy.leaf1ndex.value]
|
|
99
|
+
track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value]] = my[indexMy.gap1ndex.value]
|
|
100
|
+
my[indexMy.leaf1ndex.value] += 1
|
|
101
|
+
foldGroups[my[indexMy.taskIndex.value]] = groupsOfFolds
|
|
102
|
+
|
|
103
|
+
@jit((uint16[:, :, ::1], int64[::1], uint16[::1], uint16[::1], uint16[:, ::1]), _nrt=True, boundscheck=False, cache=True, error_model='numpy', fastmath=True, forceinline=True, inline='always', looplift=False, no_cfunc_wrapper=True, no_cpython_wrapper=True, nopython=True, parallel=False)
|
|
104
|
+
def countSequential(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], foldGroups: ndarray[Tuple[int], dtype[integer[Any]]], gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
105
|
+
leafBelow = track[indexTrack.leafBelow.value]
|
|
106
|
+
gapRangeStart = track[indexTrack.gapRangeStart.value]
|
|
107
|
+
countDimensionsGapped = track[indexTrack.countDimensionsGapped.value]
|
|
108
|
+
leafAbove = track[indexTrack.leafAbove.value]
|
|
109
|
+
leaf1ndex = my[indexMy.leaf1ndex.value]
|
|
110
|
+
dimensionsUnconstrained = my[indexMy.dimensionsUnconstrained.value]
|
|
111
|
+
dimensionsTotal = my[indexMy.dimensionsTotal.value]
|
|
112
|
+
gap1ndexCeiling = my[indexMy.gap1ndexCeiling.value]
|
|
113
|
+
indexDimension = my[indexMy.indexDimension.value]
|
|
114
|
+
leafConnectee = my[indexMy.leafConnectee.value]
|
|
115
|
+
indexMiniGap = my[indexMy.indexMiniGap.value]
|
|
116
|
+
gap1ndex = my[indexMy.gap1ndex.value]
|
|
117
|
+
taskIndex = my[indexMy.taskIndex.value]
|
|
118
|
+
groupsOfFolds: int = 0
|
|
119
|
+
while leaf1ndex > 0:
|
|
120
|
+
if leaf1ndex <= 1 or leafBelow[0] == 1:
|
|
121
|
+
if leaf1ndex > foldGroups[-1]:
|
|
122
|
+
groupsOfFolds += 1
|
|
123
|
+
else:
|
|
124
|
+
dimensionsUnconstrained = dimensionsTotal
|
|
125
|
+
gap1ndexCeiling = gapRangeStart[leaf1ndex - 1]
|
|
126
|
+
indexDimension = 0
|
|
127
|
+
while indexDimension < dimensionsTotal:
|
|
128
|
+
leafConnectee = connectionGraph[indexDimension, leaf1ndex, leaf1ndex]
|
|
129
|
+
if leafConnectee == leaf1ndex:
|
|
130
|
+
dimensionsUnconstrained -= 1
|
|
131
|
+
else:
|
|
132
|
+
while leafConnectee != leaf1ndex:
|
|
133
|
+
gapsWhere[gap1ndexCeiling] = leafConnectee
|
|
134
|
+
if countDimensionsGapped[leafConnectee] == 0:
|
|
135
|
+
gap1ndexCeiling += 1
|
|
136
|
+
countDimensionsGapped[leafConnectee] += 1
|
|
137
|
+
leafConnectee = connectionGraph[indexDimension, leaf1ndex, leafBelow[leafConnectee]]
|
|
138
|
+
indexDimension += 1
|
|
139
|
+
indexMiniGap = gap1ndex
|
|
140
|
+
while indexMiniGap < gap1ndexCeiling:
|
|
141
|
+
gapsWhere[gap1ndex] = gapsWhere[indexMiniGap]
|
|
142
|
+
if countDimensionsGapped[gapsWhere[indexMiniGap]] == dimensionsUnconstrained:
|
|
143
|
+
gap1ndex += 1
|
|
144
|
+
countDimensionsGapped[gapsWhere[indexMiniGap]] = 0
|
|
145
|
+
indexMiniGap += 1
|
|
146
|
+
while leaf1ndex > 0 and gap1ndex == gapRangeStart[leaf1ndex - 1]:
|
|
147
|
+
leaf1ndex -= 1
|
|
148
|
+
leafBelow[leafAbove[leaf1ndex]] = leafBelow[leaf1ndex]
|
|
149
|
+
leafAbove[leafBelow[leaf1ndex]] = leafAbove[leaf1ndex]
|
|
150
|
+
if leaf1ndex > 0:
|
|
151
|
+
gap1ndex -= 1
|
|
152
|
+
leafAbove[leaf1ndex] = gapsWhere[gap1ndex]
|
|
153
|
+
leafBelow[leaf1ndex] = leafBelow[leafAbove[leaf1ndex]]
|
|
154
|
+
leafBelow[leafAbove[leaf1ndex]] = leaf1ndex
|
|
155
|
+
leafAbove[leafBelow[leaf1ndex]] = leaf1ndex
|
|
156
|
+
gapRangeStart[leaf1ndex] = gap1ndex
|
|
157
|
+
leaf1ndex += 1
|
|
158
|
+
foldGroups[taskIndex] = groupsOfFolds
|
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
from mapFolding.syntheticModules.numba_countInitialize import countInitialize
|
|
2
|
-
from mapFolding.syntheticModules.numba_countParallel import countParallel
|
|
3
|
-
from mapFolding.syntheticModules.numba_countSequential import countSequential
|
|
4
1
|
from mapFolding import indexMy
|
|
5
|
-
from
|
|
6
|
-
from numba import
|
|
7
|
-
from
|
|
8
|
-
from
|
|
9
|
-
from numpy import integer
|
|
10
|
-
from numpy import dtype
|
|
11
|
-
from typing import Tuple
|
|
12
|
-
from typing import Any
|
|
2
|
+
from mapFolding.syntheticModules.numbaCount import countParallel, countSequential, countInitialize
|
|
3
|
+
from numba import jit, int64, uint16
|
|
4
|
+
from numpy import ndarray, dtype, integer
|
|
5
|
+
from typing import Tuple, Any
|
|
13
6
|
|
|
14
|
-
@jit((
|
|
7
|
+
@jit((uint16[:, :, ::1], int64[::1], uint16[::1], uint16[::1], uint16[::1], uint16[:, ::1]), _nrt=True, boundscheck=False, cache=True, error_model='numpy', fastmath=True, forceinline=True, inline='always', looplift=False, no_cfunc_wrapper=False, no_cpython_wrapper=False, nopython=True, parallel=False)
|
|
15
8
|
def doTheNeedful(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], foldGroups: ndarray[Tuple[int], dtype[integer[Any]]], gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], mapShape: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
16
9
|
countInitialize(connectionGraph, gapsWhere, my, track)
|
|
17
10
|
if my[indexMy.taskDivisions.value] > 0:
|
mapFolding/theDao.py
CHANGED
|
@@ -3,17 +3,17 @@ from numba import prange
|
|
|
3
3
|
from numpy import dtype, integer, ndarray
|
|
4
4
|
from typing import Any, Tuple
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
my[indexMy.
|
|
6
|
+
# `.value` is not necessary for this module or most modules. But, this module is transformed into Numba "jitted" functions, and Numba won't use `Enum` for an ndarray index without `.value`.
|
|
7
|
+
def activeLeafConnectedToItself(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
8
|
+
return my[indexMy.leafConnectee.value] == my[indexMy.leaf1ndex.value]
|
|
9
9
|
|
|
10
|
-
def
|
|
11
|
-
return my[indexMy.leaf1ndex.value]
|
|
10
|
+
def activeLeafGreaterThan0(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
11
|
+
return my[indexMy.leaf1ndex.value] > 0
|
|
12
12
|
|
|
13
|
-
def
|
|
13
|
+
def activeLeafGreaterThanLeavesTotal(foldGroups: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
14
14
|
return my[indexMy.leaf1ndex.value] > foldGroups[-1]
|
|
15
15
|
|
|
16
|
-
def
|
|
16
|
+
def activeLeafIsTheFirstLeaf(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
17
17
|
return my[indexMy.leaf1ndex.value] <= 1
|
|
18
18
|
|
|
19
19
|
def allDimensionsAreUnconstrained(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
@@ -24,44 +24,47 @@ def backtrack(my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple
|
|
|
24
24
|
track[indexTrack.leafBelow.value, track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]]] = track[indexTrack.leafBelow.value, my[indexMy.leaf1ndex.value]]
|
|
25
25
|
track[indexTrack.leafAbove.value, track[indexTrack.leafBelow.value, my[indexMy.leaf1ndex.value]]] = track[indexTrack.leafAbove.value, my[indexMy.leaf1ndex.value]]
|
|
26
26
|
|
|
27
|
-
def backtrackCondition(my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> Any:
|
|
28
|
-
return my[indexMy.leaf1ndex.value] and my[indexMy.gap1ndex.value] == track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value] - 1]
|
|
29
|
-
|
|
30
|
-
def gap1ndexCeilingIncrement(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
31
|
-
my[indexMy.gap1ndexCeiling.value] += 1
|
|
32
|
-
|
|
33
27
|
def countGaps(gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
34
28
|
gapsWhere[my[indexMy.gap1ndexCeiling.value]] = my[indexMy.leafConnectee.value]
|
|
35
29
|
if track[indexTrack.countDimensionsGapped.value, my[indexMy.leafConnectee.value]] == 0:
|
|
36
|
-
|
|
30
|
+
incrementGap1ndexCeiling(my=my)
|
|
37
31
|
track[indexTrack.countDimensionsGapped.value, my[indexMy.leafConnectee.value]] += 1
|
|
38
32
|
|
|
33
|
+
def decrementDimensionsUnconstrained(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
34
|
+
my[indexMy.dimensionsUnconstrained.value] -= 1
|
|
35
|
+
|
|
39
36
|
def dimensionsUnconstrainedCondition(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
40
37
|
return connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], my[indexMy.leaf1ndex.value]] == my[indexMy.leaf1ndex.value]
|
|
41
38
|
|
|
42
|
-
def dimensionsUnconstrainedDecrement(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
43
|
-
my[indexMy.dimensionsUnconstrained.value] -= 1
|
|
44
|
-
|
|
45
39
|
def filterCommonGaps(gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
46
40
|
gapsWhere[my[indexMy.gap1ndex.value]] = gapsWhere[my[indexMy.indexMiniGap.value]]
|
|
47
41
|
if track[indexTrack.countDimensionsGapped.value, gapsWhere[my[indexMy.indexMiniGap.value]]] == my[indexMy.dimensionsUnconstrained.value]:
|
|
48
|
-
|
|
42
|
+
incrementActiveGap(my=my)
|
|
49
43
|
track[indexTrack.countDimensionsGapped.value, gapsWhere[my[indexMy.indexMiniGap.value]]] = 0
|
|
50
44
|
|
|
51
|
-
def
|
|
52
|
-
my[indexMy.
|
|
53
|
-
my[indexMy.gap1ndexCeiling.value] = track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value] - 1]
|
|
54
|
-
my[indexMy.indexDimension.value] = 0
|
|
45
|
+
def incrementActiveGap(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
46
|
+
my[indexMy.gap1ndex.value] += 1
|
|
55
47
|
|
|
56
|
-
def
|
|
48
|
+
def incrementGap1ndexCeiling(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
49
|
+
my[indexMy.gap1ndexCeiling.value] += 1
|
|
50
|
+
|
|
51
|
+
def incrementIndexDimension(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
57
52
|
my[indexMy.indexDimension.value] += 1
|
|
58
53
|
|
|
59
|
-
def
|
|
54
|
+
def incrementIndexMiniGap(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
60
55
|
my[indexMy.indexMiniGap.value] += 1
|
|
61
56
|
|
|
62
|
-
def
|
|
57
|
+
def initializeIndexMiniGap(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
63
58
|
my[indexMy.indexMiniGap.value] = my[indexMy.gap1ndex.value]
|
|
64
59
|
|
|
60
|
+
def initializeLeafConnectee(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
61
|
+
my[indexMy.leafConnectee.value] = connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], my[indexMy.leaf1ndex.value]]
|
|
62
|
+
|
|
63
|
+
def initializeVariablesToFindGaps(my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
64
|
+
my[indexMy.dimensionsUnconstrained.value] = my[indexMy.dimensionsTotal.value]
|
|
65
|
+
my[indexMy.gap1ndexCeiling.value] = track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value] - 1]
|
|
66
|
+
my[indexMy.indexDimension.value] = 0
|
|
67
|
+
|
|
65
68
|
def insertUnconstrainedLeaf(gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
66
69
|
my[indexMy.indexLeaf.value] = 0
|
|
67
70
|
while my[indexMy.indexLeaf.value] < my[indexMy.leaf1ndex.value]:
|
|
@@ -69,23 +72,20 @@ def insertUnconstrainedLeaf(gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]],
|
|
|
69
72
|
my[indexMy.gap1ndexCeiling.value] += 1
|
|
70
73
|
my[indexMy.indexLeaf.value] += 1
|
|
71
74
|
|
|
72
|
-
def
|
|
75
|
+
def leafBelowSentinelIs1(track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> Any:
|
|
73
76
|
return track[indexTrack.leafBelow.value, 0] == 1
|
|
74
77
|
|
|
75
|
-
def leafConnecteeInitialization(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]]) -> None:
|
|
76
|
-
my[indexMy.leafConnectee.value] = connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], my[indexMy.leaf1ndex.value]]
|
|
77
|
-
|
|
78
|
-
def leafConnecteeUpdate(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
79
|
-
my[indexMy.leafConnectee.value] = connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], track[indexTrack.leafBelow.value, my[indexMy.leafConnectee.value]]]
|
|
80
|
-
|
|
81
78
|
def loopingLeavesConnectedToActiveLeaf(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
82
79
|
return my[indexMy.leafConnectee.value] != my[indexMy.leaf1ndex.value]
|
|
83
80
|
|
|
81
|
+
def loopingToActiveGapCeiling(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
82
|
+
return my[indexMy.indexMiniGap.value] < my[indexMy.gap1ndexCeiling.value]
|
|
83
|
+
|
|
84
84
|
def loopUpToDimensionsTotal(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
85
85
|
return my[indexMy.indexDimension.value] < my[indexMy.dimensionsTotal.value]
|
|
86
86
|
|
|
87
|
-
def
|
|
88
|
-
return my[indexMy.
|
|
87
|
+
def noGapsHere(my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> Any:
|
|
88
|
+
return my[indexMy.leaf1ndex.value] > 0 and my[indexMy.gap1ndex.value] == track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value] - 1]
|
|
89
89
|
|
|
90
90
|
def placeLeaf(gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
91
91
|
my[indexMy.gap1ndex.value] -= 1
|
|
@@ -96,37 +96,40 @@ def placeLeaf(gapsWhere: ndarray[Tuple[int], dtype[integer[Any]]], my: ndarray[T
|
|
|
96
96
|
track[indexTrack.gapRangeStart.value, my[indexMy.leaf1ndex.value]] = my[indexMy.gap1ndex.value]
|
|
97
97
|
my[indexMy.leaf1ndex.value] += 1
|
|
98
98
|
|
|
99
|
-
def
|
|
100
|
-
return my[indexMy.leaf1ndex.value]
|
|
99
|
+
def thereIsAnActiveLeaf(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
100
|
+
return my[indexMy.leaf1ndex.value] > 0
|
|
101
101
|
|
|
102
|
-
def
|
|
102
|
+
def thisIsMyTaskIndex(my: ndarray[Tuple[int], dtype[integer[Any]]]) -> Any:
|
|
103
103
|
return my[indexMy.leaf1ndex.value] != my[indexMy.taskDivisions.value] or my[indexMy.leafConnectee.value] % my[indexMy.taskDivisions.value] == my[indexMy.taskIndex.value]
|
|
104
104
|
|
|
105
|
+
def updateLeafConnectee(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]], my: ndarray[Tuple[int], dtype[integer[Any]]], track: ndarray[Tuple[int, int], dtype[integer[Any]]]) -> None:
|
|
106
|
+
my[indexMy.leafConnectee.value] = connectionGraph[my[indexMy.indexDimension.value], my[indexMy.leaf1ndex.value], track[indexTrack.leafBelow.value, my[indexMy.leafConnectee.value]]]
|
|
107
|
+
|
|
105
108
|
def countInitialize(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[Any]]]
|
|
106
109
|
, gapsWhere: ndarray[Tuple[int] , dtype[integer[Any]]]
|
|
107
110
|
, my: ndarray[Tuple[int] , dtype[integer[Any]]]
|
|
108
111
|
, track: ndarray[Tuple[int, int] , dtype[integer[Any]]]
|
|
109
112
|
) -> None:
|
|
110
113
|
|
|
111
|
-
while
|
|
112
|
-
if
|
|
113
|
-
|
|
114
|
+
while activeLeafGreaterThan0(my=my):
|
|
115
|
+
if activeLeafIsTheFirstLeaf(my=my) or leafBelowSentinelIs1(track=track):
|
|
116
|
+
initializeVariablesToFindGaps(my=my, track=track)
|
|
114
117
|
while loopUpToDimensionsTotal(my=my):
|
|
115
118
|
if dimensionsUnconstrainedCondition(connectionGraph=connectionGraph, my=my):
|
|
116
|
-
|
|
119
|
+
decrementDimensionsUnconstrained(my=my)
|
|
117
120
|
else:
|
|
118
|
-
|
|
121
|
+
initializeLeafConnectee(connectionGraph=connectionGraph, my=my)
|
|
119
122
|
while loopingLeavesConnectedToActiveLeaf(my=my):
|
|
120
123
|
countGaps(gapsWhere=gapsWhere, my=my, track=track)
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
updateLeafConnectee(connectionGraph=connectionGraph, my=my, track=track)
|
|
125
|
+
incrementIndexDimension(my=my)
|
|
123
126
|
if allDimensionsAreUnconstrained(my=my):
|
|
124
127
|
insertUnconstrainedLeaf(gapsWhere=gapsWhere, my=my)
|
|
125
|
-
|
|
128
|
+
initializeIndexMiniGap(my=my)
|
|
126
129
|
while loopingToActiveGapCeiling(my=my):
|
|
127
130
|
filterCommonGaps(gapsWhere=gapsWhere, my=my, track=track)
|
|
128
|
-
|
|
129
|
-
if
|
|
131
|
+
incrementIndexMiniGap(my=my)
|
|
132
|
+
if thereIsAnActiveLeaf(my=my):
|
|
130
133
|
placeLeaf(gapsWhere=gapsWhere, my=my, track=track)
|
|
131
134
|
if my[indexMy.gap1ndex.value] > 0:
|
|
132
135
|
return
|
|
@@ -153,29 +156,29 @@ def countParallel(connectionGraph: ndarray[Tuple[int, int, int], dtype[integer[A
|
|
|
153
156
|
|
|
154
157
|
my[indexMy.taskIndex.value] = indexSherpa
|
|
155
158
|
|
|
156
|
-
while
|
|
157
|
-
if
|
|
158
|
-
if
|
|
159
|
+
while activeLeafGreaterThan0(my=my):
|
|
160
|
+
if activeLeafIsTheFirstLeaf(my=my) or leafBelowSentinelIs1(track=track):
|
|
161
|
+
if activeLeafGreaterThanLeavesTotal(foldGroups=foldGroups, my=my):
|
|
159
162
|
groupsOfFolds += 1
|
|
160
163
|
else:
|
|
161
|
-
|
|
164
|
+
initializeVariablesToFindGaps(my=my, track=track)
|
|
162
165
|
while loopUpToDimensionsTotal(my=my):
|
|
163
166
|
if dimensionsUnconstrainedCondition(connectionGraph=connectionGraph, my=my):
|
|
164
|
-
|
|
167
|
+
decrementDimensionsUnconstrained(my=my)
|
|
165
168
|
else:
|
|
166
|
-
|
|
169
|
+
initializeLeafConnectee(connectionGraph=connectionGraph, my=my)
|
|
167
170
|
while loopingLeavesConnectedToActiveLeaf(my=my):
|
|
168
|
-
if
|
|
171
|
+
if thisIsMyTaskIndex(my=my):
|
|
169
172
|
countGaps(gapsWhere=gapsWhere, my=my, track=track)
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
+
updateLeafConnectee(connectionGraph=connectionGraph, my=my, track=track)
|
|
174
|
+
incrementIndexDimension(my=my)
|
|
175
|
+
initializeIndexMiniGap(my=my)
|
|
173
176
|
while loopingToActiveGapCeiling(my=my):
|
|
174
177
|
filterCommonGaps(gapsWhere=gapsWhere, my=my, track=track)
|
|
175
|
-
|
|
176
|
-
while
|
|
178
|
+
incrementIndexMiniGap(my=my)
|
|
179
|
+
while noGapsHere(my=my, track=track):
|
|
177
180
|
backtrack(my=my, track=track)
|
|
178
|
-
if
|
|
181
|
+
if thereIsAnActiveLeaf(my=my):
|
|
179
182
|
placeLeaf(gapsWhere=gapsWhere, my=my, track=track)
|
|
180
183
|
foldGroups[my[indexMy.taskIndex.value]] = groupsOfFolds
|
|
181
184
|
|
|
@@ -188,28 +191,28 @@ def countSequential( connectionGraph: ndarray[Tuple[int, int, int], dtype[intege
|
|
|
188
191
|
|
|
189
192
|
groupsOfFolds: int = 0
|
|
190
193
|
|
|
191
|
-
while
|
|
192
|
-
if
|
|
193
|
-
if
|
|
194
|
+
while activeLeafGreaterThan0(my=my):
|
|
195
|
+
if activeLeafIsTheFirstLeaf(my=my) or leafBelowSentinelIs1(track=track):
|
|
196
|
+
if activeLeafGreaterThanLeavesTotal(foldGroups=foldGroups, my=my):
|
|
194
197
|
groupsOfFolds += 1
|
|
195
198
|
else:
|
|
196
|
-
|
|
199
|
+
initializeVariablesToFindGaps(my=my, track=track)
|
|
197
200
|
while loopUpToDimensionsTotal(my=my):
|
|
198
|
-
|
|
199
|
-
|
|
201
|
+
initializeLeafConnectee(connectionGraph=connectionGraph, my=my)
|
|
202
|
+
if activeLeafConnectedToItself(my=my):
|
|
203
|
+
decrementDimensionsUnconstrained(my=my)
|
|
200
204
|
else:
|
|
201
|
-
leafConnecteeInitialization(connectionGraph=connectionGraph, my=my)
|
|
202
205
|
while loopingLeavesConnectedToActiveLeaf(my=my):
|
|
203
206
|
countGaps(gapsWhere=gapsWhere, my=my, track=track)
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
+
updateLeafConnectee(connectionGraph=connectionGraph, my=my, track=track)
|
|
208
|
+
incrementIndexDimension(my=my)
|
|
209
|
+
initializeIndexMiniGap(my=my)
|
|
207
210
|
while loopingToActiveGapCeiling(my=my):
|
|
208
211
|
filterCommonGaps(gapsWhere=gapsWhere, my=my, track=track)
|
|
209
|
-
|
|
210
|
-
while
|
|
212
|
+
incrementIndexMiniGap(my=my)
|
|
213
|
+
while noGapsHere(my=my, track=track):
|
|
211
214
|
backtrack(my=my, track=track)
|
|
212
|
-
if
|
|
215
|
+
if thereIsAnActiveLeaf(my=my):
|
|
213
216
|
placeLeaf(gapsWhere=gapsWhere, my=my, track=track)
|
|
214
217
|
foldGroups[my[indexMy.taskIndex.value]] = groupsOfFolds
|
|
215
218
|
|