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.
Files changed (80) hide show
  1. easyRun/A000682.py +2 -2
  2. easyRun/NOTcountingFolds.py +16 -8
  3. easyRun/countFolds.py +9 -2
  4. easyRun/generateAllModules.py +14 -0
  5. easyRun/meanders.py +4 -4
  6. mapFolding/__init__.py +1 -0
  7. mapFolding/_theSSOT.py +3 -2
  8. mapFolding/_theTypes.py +3 -0
  9. mapFolding/algorithms/A000136constraintPropagation.py +95 -0
  10. mapFolding/algorithms/A000136elimination.py +163 -0
  11. mapFolding/algorithms/A000136eliminationParallel.py +77 -0
  12. mapFolding/algorithms/A086345.py +75 -0
  13. mapFolding/algorithms/matrixMeanders.py +59 -18
  14. mapFolding/algorithms/matrixMeandersNumPyndas.py +841 -0
  15. mapFolding/algorithms/oeisIDbyFormula.py +2 -2
  16. mapFolding/algorithms/symmetricFolds.py +35 -0
  17. mapFolding/basecamp.py +100 -153
  18. mapFolding/dataBaskets.py +142 -65
  19. mapFolding/filesystemToolkit.py +4 -32
  20. mapFolding/oeis.py +5 -12
  21. mapFolding/reference/A086345Wu.py +25 -0
  22. mapFolding/reference/irvineJavaPort.py +3 -3
  23. mapFolding/reference/matrixMeandersAnalysis/signatures.py +3 -0
  24. mapFolding/reference/meandersDumpingGround/matrixMeandersNumPyV1finalForm.py +1 -1
  25. mapFolding/someAssemblyRequired/A007822/A007822rawMaterials.py +10 -45
  26. mapFolding/someAssemblyRequired/A007822/_asynchronousAnnex.py +51 -0
  27. mapFolding/someAssemblyRequired/A007822/makeA007822AsynchronousModules.py +39 -196
  28. mapFolding/someAssemblyRequired/A007822/makeA007822Modules.py +57 -43
  29. mapFolding/someAssemblyRequired/RecipeJob.py +84 -34
  30. mapFolding/someAssemblyRequired/__init__.py +4 -8
  31. mapFolding/someAssemblyRequired/_toolkitContainers.py +38 -7
  32. mapFolding/someAssemblyRequired/infoBooth.py +41 -23
  33. mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +140 -164
  34. mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +63 -96
  35. mapFolding/someAssemblyRequired/makingModules_count.py +26 -30
  36. mapFolding/someAssemblyRequired/makingModules_doTheNeedful.py +10 -72
  37. mapFolding/someAssemblyRequired/{mapFolding → mapFoldingModules}/makeMapFoldingModules.py +30 -35
  38. mapFolding/someAssemblyRequired/meanders/makeMeandersModules.py +13 -11
  39. mapFolding/someAssemblyRequired/toolkitMakeModules.py +5 -31
  40. mapFolding/someAssemblyRequired/toolkitNumba.py +3 -2
  41. mapFolding/someAssemblyRequired/transformationTools.py +12 -15
  42. mapFolding/syntheticModules/A007822/algorithm.py +45 -50
  43. mapFolding/syntheticModules/A007822/asynchronous.py +92 -36
  44. mapFolding/syntheticModules/A007822/initializeState.py +19 -23
  45. mapFolding/syntheticModules/A007822/theorem2.py +20 -24
  46. mapFolding/syntheticModules/A007822/theorem2Numba.py +23 -25
  47. mapFolding/syntheticModules/A007822/theorem2Trimmed.py +19 -23
  48. mapFolding/syntheticModules/countParallelNumba.py +1 -2
  49. mapFolding/syntheticModules/daoOfMapFoldingNumba.py +5 -4
  50. mapFolding/syntheticModules/initializeState.py +1 -1
  51. mapFolding/syntheticModules/meanders/bigInt.py +59 -22
  52. mapFolding/syntheticModules/theorem2.py +1 -1
  53. mapFolding/syntheticModules/theorem2Numba.py +30 -9
  54. mapFolding/syntheticModules/theorem2Trimmed.py +2 -2
  55. mapFolding/tests/test_computations.py +29 -3
  56. {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/METADATA +11 -8
  57. mapfolding-0.17.0.dist-info/RECORD +107 -0
  58. mapFolding/_dataPacking.py +0 -68
  59. mapFolding/algorithms/matrixMeandersBeDry.py +0 -182
  60. mapFolding/algorithms/matrixMeandersNumPy.py +0 -333
  61. mapFolding/algorithms/matrixMeandersPandas.py +0 -334
  62. mapFolding/reference/meandersDumpingGround/A005316intOptimized.py +0 -122
  63. mapFolding/reference/meandersDumpingGround/A005316optimized128bit.py +0 -79
  64. mapFolding/reference/meandersDumpingGround/matrixMeandersBaseline.py +0 -65
  65. mapFolding/reference/meandersDumpingGround/matrixMeandersBaselineAnnex.py +0 -84
  66. mapFolding/reference/meandersDumpingGround/matrixMeandersSimpleQueue.py +0 -90
  67. mapFolding/syntheticModules/A007822/algorithmNumba.py +0 -94
  68. mapFolding/syntheticModules/A007822/asynchronousAnnex.py +0 -66
  69. mapFolding/syntheticModules/A007822/asynchronousAnnexNumba.py +0 -70
  70. mapFolding/syntheticModules/A007822/asynchronousNumba.py +0 -79
  71. mapFolding/syntheticModules/A007822/asynchronousTheorem2.py +0 -65
  72. mapFolding/syntheticModules/A007822/asynchronousTrimmed.py +0 -56
  73. mapFolding/syntheticModules/dataPacking.py +0 -26
  74. mapFolding/syntheticModules/dataPackingA007822.py +0 -92
  75. mapfolding-0.16.2.dist-info/RECORD +0 -115
  76. /mapFolding/someAssemblyRequired/{mapFolding → mapFoldingModules}/__init__.py +0 -0
  77. {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/WHEEL +0 -0
  78. {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/entry_points.txt +0 -0
  79. {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/licenses/LICENSE +0 -0
  80. {mapfolding-0.16.2.dist-info → mapfolding-0.17.0.dist-info}/top_level.txt +0 -0
@@ -1,58 +1,114 @@
1
- from mapFolding.dataBaskets import MapFoldingState
2
- from mapFolding.syntheticModules.A007822.asynchronousAnnex import (
3
- filterAsymmetricFolds, getSymmetricFoldsTotal,
4
- initializeConcurrencyManager)
5
-
6
-
7
- def activeLeafGreaterThan0(state: MapFoldingState) -> bool:
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: MapFoldingState) -> bool:
66
+ def activeLeafGreaterThanLeavesTotal(state: SymmetricFoldsState) -> bool:
11
67
  return state.leaf1ndex > state.leavesTotal
12
68
 
13
- def activeLeafIsTheFirstLeaf(state: MapFoldingState) -> bool:
69
+ def activeLeafIsTheFirstLeaf(state: SymmetricFoldsState) -> bool:
14
70
  return state.leaf1ndex <= 1
15
71
 
16
- def activeLeafIsUnconstrainedInAllDimensions(state: MapFoldingState) -> bool:
72
+ def activeLeafIsUnconstrainedInAllDimensions(state: SymmetricFoldsState) -> bool:
17
73
  return not state.dimensionsUnconstrained
18
74
 
19
- def activeLeafUnconstrainedInThisDimension(state: MapFoldingState) -> MapFoldingState:
75
+ def activeLeafUnconstrainedInThisDimension(state: SymmetricFoldsState) -> SymmetricFoldsState:
20
76
  state.dimensionsUnconstrained -= 1
21
77
  return state
22
78
 
23
- def filterCommonGaps(state: MapFoldingState) -> MapFoldingState:
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: MapFoldingState) -> bool:
86
+ def gapAvailable(state: SymmetricFoldsState) -> bool:
31
87
  return state.leaf1ndex > 0
32
88
 
33
- def incrementActiveGap(state: MapFoldingState) -> MapFoldingState:
89
+ def incrementActiveGap(state: SymmetricFoldsState) -> SymmetricFoldsState:
34
90
  state.gap1ndex += 1
35
91
  return state
36
92
 
37
- def incrementGap1ndexCeiling(state: MapFoldingState) -> MapFoldingState:
93
+ def incrementGap1ndexCeiling(state: SymmetricFoldsState) -> SymmetricFoldsState:
38
94
  state.gap1ndexCeiling += 1
39
95
  return state
40
96
 
41
- def incrementIndexMiniGap(state: MapFoldingState) -> MapFoldingState:
97
+ def incrementIndexMiniGap(state: SymmetricFoldsState) -> SymmetricFoldsState:
42
98
  state.indexMiniGap += 1
43
99
  return state
44
100
 
45
- def initializeIndexMiniGap(state: MapFoldingState) -> MapFoldingState:
101
+ def initializeIndexMiniGap(state: SymmetricFoldsState) -> SymmetricFoldsState:
46
102
  state.indexMiniGap = state.gap1ndex
47
103
  return state
48
104
 
49
- def initializeVariablesToFindGaps(state: MapFoldingState) -> MapFoldingState:
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: MapFoldingState) -> MapFoldingState:
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: MapFoldingState) -> MapFoldingState:
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: MapFoldingState) -> bool:
129
+ def leafBelowSentinelIs1(state: SymmetricFoldsState) -> bool:
74
130
  return state.leafBelow[0] == 1
75
131
 
76
- def leafConnecteeIsActiveLeaf(state: MapFoldingState) -> bool:
132
+ def leafConnecteeIsActiveLeaf(state: SymmetricFoldsState) -> bool:
77
133
  return state.leafConnectee == state.leaf1ndex
78
134
 
79
- def lookForGaps(state: MapFoldingState) -> MapFoldingState:
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: MapFoldingState) -> MapFoldingState:
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: MapFoldingState) -> bool:
146
+ def loopingLeavesConnectedToActiveLeaf(state: SymmetricFoldsState) -> bool:
91
147
  return state.leafConnectee != state.leaf1ndex
92
148
 
93
- def loopingThroughTheDimensions(state: MapFoldingState) -> bool:
149
+ def loopingThroughTheDimensions(state: SymmetricFoldsState) -> bool:
94
150
  return state.indexDimension < state.dimensionsTotal
95
151
 
96
- def loopingToActiveGapCeiling(state: MapFoldingState) -> bool:
152
+ def loopingToActiveGapCeiling(state: SymmetricFoldsState) -> bool:
97
153
  return state.indexMiniGap < state.gap1ndexCeiling
98
154
 
99
- def noGapsHere(state: MapFoldingState) -> bool:
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: MapFoldingState) -> MapFoldingState:
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: MapFoldingState) -> MapFoldingState:
162
+ def tryNextDimension(state: SymmetricFoldsState) -> SymmetricFoldsState:
107
163
  state.indexDimension += 1
108
164
  return state
109
165
 
110
- def undoLastLeafPlacement(state: MapFoldingState) -> MapFoldingState:
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: MapFoldingState) -> MapFoldingState:
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.leafBelow)
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.groupsOfFolds = getSymmetricFoldsTotal()
144
- state.groupsOfFolds = (state.groupsOfFolds + 1) // 2
199
+ state.symmetricFolds = getSymmetricFoldsTotal()
200
+ state.symmetricFolds = (state.symmetricFolds + 1) // 2
145
201
  return state
146
202
 
147
- def doTheNeedful(state: MapFoldingState, maxWorkers: int | None=None) -> MapFoldingState:
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 MapFoldingState
1
+ from mapFolding.dataBaskets import SymmetricFoldsState
2
2
 
3
- def transitionOnGroupsOfFolds(state: MapFoldingState) -> MapFoldingState:
4
- while state.groupsOfFolds == 0:
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 = 0
8
- leafConnectee = 0
9
- while leafConnectee < state.leavesTotal + 1:
10
- leafNumber = int(state.leafBelow[state.indexLeaf])
11
- state.leafComparison[leafConnectee] = (leafNumber - state.indexLeaf + state.leavesTotal) % state.leavesTotal
12
- state.indexLeaf = leafNumber
13
- leafConnectee += 1
14
- indexInMiddle = state.leavesTotal // 2
15
- state.indexMiniGap = 0
16
- while state.indexMiniGap < state.leavesTotal + 1:
17
- ImaSymmetricFold = True
18
- leafConnectee = 0
19
- while leafConnectee < indexInMiddle:
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
- leafConnectee += 1
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.groupsOfFolds = (state.groupsOfFolds + 1) // 2
68
- return state
63
+ state.symmetricFolds = (state.symmetricFolds + 1) // 2
64
+ return state
@@ -1,29 +1,25 @@
1
- from mapFolding.dataBaskets import MapFoldingState
1
+ from mapFolding.dataBaskets import SymmetricFoldsState
2
2
  from mapFolding.syntheticModules.A007822.initializeState import transitionOnGroupsOfFolds
3
3
 
4
- def count(state: MapFoldingState) -> MapFoldingState:
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 = 0
9
- leafConnectee = 0
10
- while leafConnectee < state.leavesTotal + 1:
11
- leafNumber = int(state.leafBelow[state.indexLeaf])
12
- state.leafComparison[leafConnectee] = (leafNumber - state.indexLeaf + state.leavesTotal) % state.leavesTotal
13
- state.indexLeaf = leafNumber
14
- leafConnectee += 1
15
- indexInMiddle = state.leavesTotal // 2
16
- state.indexMiniGap = 0
17
- while state.indexMiniGap < state.leavesTotal + 1:
18
- ImaSymmetricFold = True
19
- leafConnectee = 0
20
- while leafConnectee < indexInMiddle:
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
- leafConnectee += 1
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.groupsOfFolds *= 2
69
- state.groupsOfFolds = (state.groupsOfFolds + 1) // 2
64
+ state.symmetricFolds *= 2
65
+ state.symmetricFolds = (state.symmetricFolds + 1) // 2
70
66
  return state
71
67
 
72
- def doTheNeedful(state: MapFoldingState) -> MapFoldingState:
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
- MapFoldingState)
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(groupsOfFolds: DatatypeFoldsTotal, gap1ndex: DatatypeElephino, gap1ndexCeiling: DatatypeElephino, indexDimension: DatatypeLeavesTotal, indexLeaf: DatatypeLeavesTotal, indexMiniGap: DatatypeElephino, leaf1ndex: DatatypeLeavesTotal, leafConnectee: DatatypeLeavesTotal, dimensionsUnconstrained: DatatypeLeavesTotal, countDimensionsGapped: Array1DLeavesTotal, gapRangeStart: Array1DElephino, gapsWhere: Array1DLeavesTotal, leafAbove: Array1DLeavesTotal, leafBelow: Array1DLeavesTotal, leafComparison: Array1DLeavesTotal, connectionGraph: Array3DLeavesTotal, dimensionsTotal: DatatypeLeavesTotal, leavesTotal: DatatypeLeavesTotal) -> tuple[DatatypeFoldsTotal, DatatypeElephino, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeElephino, DatatypeLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal, Array1DLeavesTotal, Array1DElephino, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeLeavesTotal, DatatypeLeavesTotal]:
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 = 0
13
- leafConnectee = 0
13
+ indexLeaf = 1
14
+ leafComparison[0] = 1
15
+ leafConnectee = 1
14
16
  while leafConnectee < leavesTotal + 1:
15
- leafNumber = int(leafBelow[indexLeaf])
16
- leafComparison[leafConnectee] = (leafNumber - indexLeaf + leavesTotal) % leavesTotal
17
- indexLeaf = leafNumber
17
+ indexMiniGap = leafBelow[indexLeaf]
18
+ leafComparison[leafConnectee] = (indexMiniGap - indexLeaf + leavesTotal) % leavesTotal
19
+ indexLeaf = indexMiniGap
18
20
  leafConnectee += 1
19
- indexInMiddle = leavesTotal // 2
20
- indexMiniGap = 0
21
- while indexMiniGap < leavesTotal + 1:
22
- ImaSymmetricFold = True
23
- leafConnectee = 0
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
- leafConnectee += 1
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
- groupsOfFolds *= 2
67
- groupsOfFolds = (groupsOfFolds + 1) // 2
68
- return (groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, leavesTotal)
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: MapFoldingState) -> MapFoldingState:
67
+ def doTheNeedful(state: SymmetricFoldsState) -> SymmetricFoldsState:
71
68
  state = transitionOnGroupsOfFolds(state)
72
69
  mapShape: tuple[DatatypeLeavesTotal, ...] = state.mapShape
73
- groupsOfFolds: DatatypeFoldsTotal = state.groupsOfFolds
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
- groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, leavesTotal = count(groupsOfFolds, gap1ndex, gap1ndexCeiling, indexDimension, indexLeaf, indexMiniGap, leaf1ndex, leafConnectee, dimensionsUnconstrained, countDimensionsGapped, gapRangeStart, gapsWhere, leafAbove, leafBelow, leafComparison, connectionGraph, dimensionsTotal, leavesTotal)
92
- state = MapFoldingState(mapShape=mapShape, groupsOfFolds=groupsOfFolds, gap1ndex=gap1ndex, gap1ndexCeiling=gap1ndexCeiling, indexDimension=indexDimension, indexLeaf=indexLeaf, indexMiniGap=indexMiniGap, leaf1ndex=leaf1ndex, leafConnectee=leafConnectee, dimensionsUnconstrained=dimensionsUnconstrained, countDimensionsGapped=countDimensionsGapped, gapRangeStart=gapRangeStart, gapsWhere=gapsWhere, leafAbove=leafAbove, leafBelow=leafBelow, leafComparison=leafComparison)
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 MapFoldingState
1
+ from mapFolding.dataBaskets import SymmetricFoldsState
2
2
  from mapFolding.syntheticModules.A007822.initializeState import transitionOnGroupsOfFolds
3
3
 
4
- def count(state: MapFoldingState) -> MapFoldingState:
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 = 0
9
- leafConnectee = 0
10
- while leafConnectee < state.leavesTotal + 1:
11
- leafNumber = int(state.leafBelow[state.indexLeaf])
12
- state.leafComparison[leafConnectee] = (leafNumber - state.indexLeaf + state.leavesTotal) % state.leavesTotal
13
- state.indexLeaf = leafNumber
14
- leafConnectee += 1
15
- indexInMiddle = state.leavesTotal // 2
16
- state.indexMiniGap = 0
17
- while state.indexMiniGap < state.leavesTotal + 1:
18
- ImaSymmetricFold = True
19
- leafConnectee = 0
20
- while leafConnectee < indexInMiddle:
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
- leafConnectee += 1
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.groupsOfFolds *= 2
63
- state.groupsOfFolds = (state.groupsOfFolds + 1) // 2
58
+ state.symmetricFolds *= 2
59
+ state.symmetricFolds = (state.symmetricFolds + 1) // 2
64
60
  return state
65
61
 
66
- def doTheNeedful(state: MapFoldingState) -> MapFoldingState:
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, leafComparison=leafComparison, taskDivisions=taskDivisions, taskIndex=taskIndex)
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 Array1DElephino, Array1DLeavesTotal, Array3DLeavesTotal, DatatypeElephino, DatatypeFoldsTotal, DatatypeLeavesTotal, MapFoldingState
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, leafComparison=leafComparison)
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
@@ -46,4 +46,4 @@ def transitionOnGroupsOfFolds(state: MapFoldingState) -> MapFoldingState:
46
46
  state.leafAbove[state.leafBelow[state.leaf1ndex]] = state.leaf1ndex
47
47
  state.gapRangeStart[state.leaf1ndex] = state.gap1ndex
48
48
  state.leaf1ndex += 1
49
- return state
49
+ return state