mapFolding 0.15.2__tar.gz → 0.15.3__tar.gz

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 (98) hide show
  1. {mapfolding-0.15.2 → mapfolding-0.15.3}/PKG-INFO +2 -1
  2. mapfolding-0.15.3/mapFolding/_oeisFormulas/A000682.py +85 -0
  3. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/Z0Z_aOFn.py +8 -7
  4. mapfolding-0.15.3/mapFolding/_oeisFormulas/Z0Z_notes.py +16 -0
  5. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/Z0Z_oeisMeanders.py +24 -2
  6. mapfolding-0.15.3/mapFolding/_oeisFormulas/Z0Z_symmetry.py +131 -0
  7. mapfolding-0.15.3/mapFolding/_oeisFormulas/matrixMeanders.py +134 -0
  8. mapfolding-0.15.3/mapFolding/_oeisFormulas/matrixMeanders64.py +152 -0
  9. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/matrixMeandersAnnex.py +1 -1
  10. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_theSSOT.py +1 -1
  11. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_theTypes.py +1 -1
  12. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/basecamp.py +50 -64
  13. mapfolding-0.15.2/mapFolding/_oeisFormulas/matrixMeanders.py → mapfolding-0.15.3/mapFolding/reference/matrixMeandersBaselineV2.py +28 -21
  14. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/A007822rawMaterials.py +1 -1
  15. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/makeJobTheorem2codon.py +5 -4
  16. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/algorithmA007822.py +1 -1
  17. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/algorithmA007822Numba.py +1 -1
  18. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/dataPacking.py +2 -4
  19. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/dataPackingA007822.py +2 -4
  20. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/initializeStateA007822.py +1 -1
  21. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/theorem2A007822.py +1 -1
  22. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/theorem2A007822Numba.py +1 -1
  23. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/theorem2A007822Trimmed.py +1 -1
  24. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/tests/conftest.py +2 -1
  25. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/tests/test_computations.py +48 -41
  26. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding.egg-info/PKG-INFO +2 -1
  27. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding.egg-info/SOURCES.txt +4 -0
  28. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding.egg-info/requires.txt +3 -0
  29. {mapfolding-0.15.2 → mapfolding-0.15.3}/pyproject.toml +2 -1
  30. mapfolding-0.15.2/mapFolding/_oeisFormulas/A000682.py +0 -17
  31. {mapfolding-0.15.2 → mapfolding-0.15.3}/LICENSE +0 -0
  32. {mapfolding-0.15.2 → mapfolding-0.15.3}/README.md +0 -0
  33. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/__init__.py +0 -0
  34. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A000136.py +0 -0
  35. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A000560.py +0 -0
  36. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A001010.py +0 -0
  37. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A001011.py +0 -0
  38. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A005315.py +0 -0
  39. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A005316.py +0 -0
  40. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A223094.py +0 -0
  41. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A259702.py +0 -0
  42. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/A301620.py +0 -0
  43. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/_oeisFormulas/__init__.py +0 -0
  44. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/beDRY.py +0 -0
  45. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/daoOfMapFolding.py +0 -0
  46. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/dataBaskets.py +0 -0
  47. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/filesystemToolkit.py +0 -0
  48. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/oeis.py +0 -0
  49. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/py.typed +0 -0
  50. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/A005316JavaPort.py +0 -0
  51. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/A005316imperative.py +0 -0
  52. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/A005316intOptimized.py +0 -0
  53. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/A005316optimized128bit.py +0 -0
  54. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/A005316primitiveOptimized.py +0 -0
  55. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/A005316redis.py +0 -0
  56. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/A005316write2disk.py +0 -0
  57. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/__init__.py +0 -0
  58. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/flattened.py +0 -0
  59. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/hunterNumba.py +0 -0
  60. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/irvineJavaPort.py +0 -0
  61. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/jaxCount.py +0 -0
  62. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/jobsCompleted/[2x19]/p2x19.py +0 -0
  63. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/jobsCompleted/__init__.py +0 -0
  64. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/jobsCompleted/p2x19/p2x19.py +0 -0
  65. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/lunnonNumpy.py +0 -0
  66. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/lunnonWhile.py +0 -0
  67. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/matrixMeandersBaseline.py +0 -0
  68. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/matrixMeandersBaselineAnnex.py +0 -0
  69. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/matrixMeandersSimpleQueue.py +0 -0
  70. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/matrixMeandersSlicePop.py +0 -0
  71. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/rotatedEntryPoint.py +0 -0
  72. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/reference/total_countPlus1vsPlusN.py +0 -0
  73. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/RecipeJob.py +0 -0
  74. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/__init__.py +0 -0
  75. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/_toolIfThis.py +0 -0
  76. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/_toolkitContainers.py +0 -0
  77. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/getLLVMforNoReason.py +0 -0
  78. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/infoBooth.py +0 -0
  79. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/makeAllModules.py +0 -0
  80. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/makeJobTheorem2Numba.py +0 -0
  81. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/toolkitNumba.py +0 -0
  82. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/someAssemblyRequired/transformationTools.py +0 -0
  83. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/__init__.py +0 -0
  84. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/countParallelNumba.py +0 -0
  85. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/daoOfMapFoldingNumba.py +0 -0
  86. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/initializeState.py +0 -0
  87. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/theorem2.py +0 -0
  88. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/theorem2Numba.py +0 -0
  89. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/syntheticModules/theorem2Trimmed.py +0 -0
  90. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/tests/__init__.py +0 -0
  91. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/tests/test_filesystem.py +0 -0
  92. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/tests/test_oeis.py +0 -0
  93. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/tests/test_other.py +0 -0
  94. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding/tests/test_tasks.py +0 -0
  95. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding.egg-info/dependency_links.txt +0 -0
  96. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding.egg-info/entry_points.txt +0 -0
  97. {mapfolding-0.15.2 → mapfolding-0.15.3}/mapFolding.egg-info/top_level.txt +0 -0
  98. {mapfolding-0.15.2 → mapfolding-0.15.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapFolding
3
- Version: 0.15.2
3
+ Version: 0.15.3
4
4
  Summary: Map folding, meanders, stamp folding, semi-meanders. Experiment with algorithm transformations and code optimization.
5
5
  Author-email: Hunter Hogan <HunterHogan@pm.me>
6
6
  License: CC-BY-NC-4.0
@@ -39,6 +39,7 @@ Requires-Dist: hunterMakesPy
39
39
  Requires-Dist: numpy
40
40
  Requires-Dist: platformdirs
41
41
  Provides-Extra: development
42
+ Requires-Dist: memray; sys_platform == "linux" and extra == "development"
42
43
  Requires-Dist: mypy; extra == "development"
43
44
  Requires-Dist: pyupgrade; extra == "development"
44
45
  Requires-Dist: py-spy; extra == "development"
@@ -0,0 +1,85 @@
1
+ """Semi-meanders.
2
+
3
+ n = 3 `startingCurveLocations` keys = 3
4
+ n = 4 `startingCurveLocations` keys = 4
5
+ n = 5 `startingCurveLocations` keys = 4
6
+ n = 6 `startingCurveLocations` keys = 5
7
+ n = 7 `startingCurveLocations` keys = 5
8
+ n = 8 `startingCurveLocations` keys = 6
9
+ n = 9 `startingCurveLocations` keys = 6
10
+ n = 10 `startingCurveLocations` keys = 7
11
+ n = 11 `startingCurveLocations` keys = 7
12
+ n = 12 `startingCurveLocations` keys = 8
13
+ n = 13 `startingCurveLocations` keys = 8
14
+ n = 14 `startingCurveLocations` keys = 9
15
+ n = 15 `startingCurveLocations` keys = 9
16
+ n = 16 `startingCurveLocations` keys = 10
17
+ n = 17 `startingCurveLocations` keys = 10
18
+ n = 18 `startingCurveLocations` keys = 11
19
+ n = 19 `startingCurveLocations` keys = 11
20
+ n = 20 `startingCurveLocations` keys = 12
21
+ n = 21 `startingCurveLocations` keys = 12
22
+ n = 22 `startingCurveLocations` keys = 13
23
+ n = 23 `startingCurveLocations` keys = 13
24
+ n = 24 `startingCurveLocations` keys = 14
25
+ n = 25 `startingCurveLocations` keys = 14
26
+ n = 26 `startingCurveLocations` keys = 15
27
+ n = 27 `startingCurveLocations` keys = 15
28
+ n = 28 `startingCurveLocations` keys = 16
29
+ n = 29 `startingCurveLocations` keys = 16
30
+ n = 30 `startingCurveLocations` keys = 17
31
+ n = 31 `startingCurveLocations` keys = 17
32
+ n = 32 `startingCurveLocations` keys = 18
33
+ n = 33 `startingCurveLocations` keys = 18
34
+ n = 34 `startingCurveLocations` keys = 19
35
+ n = 35 `startingCurveLocations` keys = 19
36
+ n = 36 `startingCurveLocations` keys = 20
37
+ n = 37 `startingCurveLocations` keys = 20
38
+ n = 38 `startingCurveLocations` keys = 21
39
+ n = 39 `startingCurveLocations` keys = 21
40
+ n = 40 `startingCurveLocations` keys = 22
41
+ n = 41 `startingCurveLocations` keys = 22
42
+ n = 42 `startingCurveLocations` keys = 23
43
+ n = 43 `startingCurveLocations` keys = 23
44
+ n = 44 `startingCurveLocations` keys = 24
45
+ n = 45 `startingCurveLocations` keys = 24
46
+ n = 46 `startingCurveLocations` keys = 25
47
+ n = 47 `startingCurveLocations` keys = 25
48
+ n = 48 `startingCurveLocations` keys = 26
49
+ n = 49 `startingCurveLocations` keys = 26
50
+ n = 50 `startingCurveLocations` keys = 27
51
+ n = 51 `startingCurveLocations` keys = 27
52
+ n = 52 `startingCurveLocations` keys = 28
53
+ n = 53 `startingCurveLocations` keys = 28
54
+ n = 54 `startingCurveLocations` keys = 29
55
+ n = 55 `startingCurveLocations` keys = 29
56
+ n = 56 `startingCurveLocations` keys = 30
57
+ n = 57 `startingCurveLocations` keys = 30
58
+ n = 58 `startingCurveLocations` keys = 31
59
+ n = 59 `startingCurveLocations` keys = 31
60
+ n = 60 `startingCurveLocations` keys = 32
61
+ n = 61 `startingCurveLocations` keys = 32
62
+ """
63
+
64
+ # TODO figure out how to call the correct module
65
+ # In other situations, I use a so-called dispatcher amd that has helped make code transformation easier, too.
66
+ from mapFolding._oeisFormulas.matrixMeanders import count # noqa: ERA001
67
+ from mapFolding._oeisFormulas.matrixMeanders64 import count as count64
68
+
69
+ def initializeA000682(n: int) -> dict[int, int]:
70
+ curveLocationsMAXIMUM = 1 << (2 * n + 4)
71
+
72
+ curveSeed: int = 5 - (n & 0b1) * 4
73
+ listCurveLocations = [(curveSeed << 1) | curveSeed]
74
+
75
+ while listCurveLocations[-1] < curveLocationsMAXIMUM:
76
+ curveSeed = (curveSeed << 4) | 0b101
77
+ listCurveLocations.append((curveSeed << 1) | curveSeed)
78
+
79
+ return dict.fromkeys(listCurveLocations, 1)
80
+
81
+ def A000682(n: int) -> int:
82
+ # count64(n - 1, initializeA000682(n - 1))
83
+ # print()
84
+ return count(n - 1, initializeA000682(n - 1))
85
+ # return count64(n - 1, initializeA000682(n - 1))
@@ -1,3 +1,4 @@
1
+ # pyright: reportUnusedImport=false
1
2
  from mapFolding._oeisFormulas.A000136 import A000136
2
3
  from mapFolding._oeisFormulas.A000682 import A000682
3
4
  from mapFolding._oeisFormulas.A001010 import A001010
@@ -11,23 +12,23 @@ import time
11
12
  if __name__ == '__main__':
12
13
  def _write() -> None:
13
14
  sys.stdout.write(
14
- f"{(match:=foldsTotal == dictionaryOEISMeanders[oeisID]['valuesKnown'][n])}\t"
15
- f"\033[{(not match)*91}m"
15
+ f"{(booleanColor:=(foldsTotal == dictionaryOEISMeanders[oeisID]['valuesKnown'][n]))}\t" # pyright: ignore[reportIndexIssue, reportUnknownVariableType]
16
+ f"\033[{(not booleanColor)*91}m"
16
17
  f"{n}\t"
17
- f"{foldsTotal=}\t"
18
- f"{dictionaryOEISMeanders[oeisID]['valuesKnown'][n]=}\t"
18
+ f"{foldsTotal}\t"
19
+ # f"{dictionaryOEISMeanders[oeisID]['valuesKnown'][n]=}\t"
19
20
  f"{time.perf_counter() - timeStart:.2f}\t"
20
21
  # f"{description}\t"
21
22
  "\033[0m\n"
22
23
  )
24
+ oeisID = 'A001010'
23
25
  oeisID = 'A000136'
24
26
  oeisID = 'A000682'
25
- oeisID = 'A001010'
26
- for n in range(2, 13):
27
+ for n in range(3,17):
27
28
 
28
29
  # sys.stdout.write(f"{n = }\n")
29
30
 
30
31
  timeStart = time.perf_counter()
31
- foldsTotal = eval(oeisID)(n)
32
+ foldsTotal = eval(oeisID)(n) # noqa: S307
32
33
  # sys.stdout.write(f"{n} {foldsTotal} {time.perf_counter() - timeStart:.2f}\n")
33
34
  _write()
@@ -0,0 +1,16 @@
1
+ """Half-formed thoughts.
2
+
3
+ I have unintentionally made `bridges -= 1` almost meaningless.
4
+
5
+ Unlike multidimensional map folding, the computation of curveLocations_sub_i for bridges=p does not need to happen during the
6
+ series of computation for bridges=p. Each curveLocations_sub_i produces between no curveLocations, curveLocations_sub_q,
7
+ curveLocations_sub_r, curveLocations_sub_s, and curveLocations_sub_t, which are recorded as keys in dictionaryCurveLocations.
8
+
9
+ `while bridges > 0: bridges -= 1` tacitly attaches metadata to each key in dictionaryCurveLocations: specifically the value of
10
+ `bridges`. The computation is not complete until the `bridges` value of each key reaches 0.
11
+
12
+ Therefore, it is hypothetically possible to use one dictionary and to explicitly track the `bridges` value for each key. In
13
+ that scenario, the dictionary is effectively a list of jobs. And instead of being at the mercy of the amount of resources
14
+ needed by each decrement, bridges -= 1, we can use well-researched techniques to manage resources and the order of
15
+ execution.
16
+ """
@@ -8,6 +8,7 @@ from mapFolding._oeisFormulas.A223094 import A223094
8
8
  from mapFolding._oeisFormulas.A259702 import A259702
9
9
  from mapFolding._oeisFormulas.A301620 import A301620
10
10
  from mapFolding.oeis import getOEISidInformation, getOEISidValues
11
+ from typing import TypedDict
11
12
  import sys
12
13
 
13
14
  oeisIDsMeanders: list[str] = [
@@ -22,11 +23,32 @@ oeisIDsMeanders: list[str] = [
22
23
  'A301620',
23
24
  ]
24
25
 
25
- dictionaryOEISMeanders: dict[str, dict[str, dict[int, int] | str | int]] = {
26
+ # ruff: noqa: ERA001
27
+ class MetadataOEISidMeanders(TypedDict):
28
+ """Settings for an implemented OEIS sequence."""
29
+
30
+ description: str
31
+ """The OEIS.org description of the integer sequence."""
32
+ # getMapShape: Callable[[int], tuple[int, ...]]
33
+ """Function to convert the OEIS sequence index, 'n', to its `mapShape` tuple."""
34
+ offset: int
35
+ """The starting index, 'n', of the sequence, typically 0 or 1."""
36
+ # valuesBenchmark: list[int]
37
+ """List of index values, 'n', to use when benchmarking the algorithm performance."""
38
+ valuesKnown: dict[int, int]
39
+ """Dictionary of sequence indices, 'n', to their known values, `foldsTotal`."""
40
+ # valuesTestParallelization: list[int]
41
+ """List of index values, 'n', to use when testing parallelization performance."""
42
+ # valuesTestValidation: list[int]
43
+ """List of index values, 'n', to use when testing validation performance."""
44
+ # valueUnknown: int
45
+ """The smallest value of 'n' for for which `foldsTotal` is unknown."""
46
+
47
+ dictionaryOEISMeanders: dict[str, MetadataOEISidMeanders] = {
26
48
  oeisID: {
27
- 'valuesKnown': getOEISidValues(oeisID),
28
49
  'description': getOEISidInformation(oeisID)[0],
29
50
  'offset': getOEISidInformation(oeisID)[1],
51
+ 'valuesKnown': getOEISidValues(oeisID),
30
52
  }
31
53
  for oeisID in oeisIDsMeanders
32
54
  }
@@ -0,0 +1,131 @@
1
+ from mapFolding._oeisFormulas.A000682 import A000682
2
+
3
+ """
4
+
5
+ How to A000682:
6
+ - Start A000682 for n.
7
+ - Find A000560(n-1) in dictionaryCurveLocationsKnown or dictionaryCurveLocationsDiscovered.
8
+ - STOP computing.
9
+ - Double the total.
10
+ That is A000682.
11
+
12
+
13
+ How to A259703:
14
+ - Start A000682 for n.
15
+ - Find n-1 keys in dictionaryCurveLocationsKnown or dictionaryCurveLocationsDiscovered.
16
+ - Descending sort.
17
+ That is a A259703 row.
18
+
19
+ https://oeis.org/A259703
20
+
21
+ SYMMETRY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
22
+
23
+ 1;
24
+ 1, 1;
25
+ 2, 1, 1;
26
+ 5, 2, 2, 1;
27
+ 12, 5, 4, 2, 1;
28
+ 33, 13, 12, 4, 3, 1;
29
+ 87, 35, 30, 12, 6, 3, 1;
30
+ 252, 98, 90, 32, 21, 6, 4, 1;
31
+ 703, 278, 243, 94, 54, 21, 8, 4, 1;
32
+ 2105, 812, 745, 270, 175, 57, 32, 8, 5, 1;
33
+ 6099, 2385, 2108, 808, 485, 181, 84, 32, 10, 5, 1;
34
+
35
+
36
+ n+1
37
+ Row sums are A000682. First column is A000560.
38
+ Row sums are A000682. First column is A000560.
39
+ Row sums are A000682. First column is A000560.
40
+ Row sums are A000682. First column is A000560.
41
+ Row sums are A000682. First column is A000560.
42
+ Row sums are A000682. First column is A000560.
43
+ Row sums are A000682. First column is A000560.
44
+ Row sums are A000682. First column is A000560.
45
+
46
+ n/a;
47
+ 1= 1;
48
+ 2= 1+ 1;
49
+ 5= 2+ 2+ 1;
50
+ 12= 5+ 4+ 2+ 1;
51
+ 33= 13+ 12+ 4+ 3+ 1;
52
+ 87= 35+ 30+ 12+ 6+ 3+ 1;
53
+ 252= 98+ 90+ 32+ 21+ 6+ 4+ 1;
54
+ 703= 278+ 243+ 94+ 54+ 21+ 8+ 4+ 1;
55
+ 2105= 812+ 745+ 270+ 175+ 57+ 32+ 8+ 5+ 1;
56
+ 6099= 2385+ 2108+ 808+ 485+ 181+ 84+ 32+ 10+ 5+ 1;
57
+
58
+ print(1== 1)
59
+ print(2== 1+ 1)
60
+ print(5== 2+ 2+ 1)
61
+ print(12== 5+ 4+ 2+ 1)
62
+ print(33== 13+ 12+ 4+ 3+ 1)
63
+ print(87== 35+ 30+ 12+ 6+ 3+ 1)
64
+ print(252== 98+ 90+ 32+ 21+ 6+ 4+ 1)
65
+ print(703== 278+ 243+ 94+ 54+ 21+ 8+ 4+ 1)
66
+ print(2105== 812+ 745+ 270+ 175+ 57+ 32+ 8+ 5+ 1)
67
+ print(6099== 2385+ 2108+ 808+ 485+ 181+ 84+ 32+ 10+ 5+ 1)
68
+
69
+
70
+ """
71
+
72
+ listA259703rowTerms = [1, 1]
73
+ n = len(listA259703rowTerms) + 1
74
+ rowSum = sum(listA259703rowTerms)
75
+ A000682for_n = A000682(n)
76
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
77
+
78
+ listA259703rowTerms = [2, 1, 1]
79
+ n = len(listA259703rowTerms) + 1
80
+ rowSum = sum(listA259703rowTerms)
81
+ A000682for_n = A000682(n)
82
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
83
+
84
+ listA259703rowTerms = [5, 2, 2, 1]
85
+ n = len(listA259703rowTerms) + 1
86
+ rowSum = sum(listA259703rowTerms)
87
+ A000682for_n = A000682(n)
88
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
89
+
90
+ listA259703rowTerms = [12, 5, 4, 2, 1]
91
+ n = len(listA259703rowTerms) + 1
92
+ rowSum = sum(listA259703rowTerms)
93
+ A000682for_n = A000682(n)
94
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
95
+
96
+ listA259703rowTerms = [33, 13, 12, 4, 3, 1]
97
+ n = len(listA259703rowTerms) + 1
98
+ rowSum = sum(listA259703rowTerms)
99
+ A000682for_n = A000682(n)
100
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
101
+
102
+ listA259703rowTerms = [87, 35, 30, 12, 6, 3, 1]
103
+ n = len(listA259703rowTerms) + 1
104
+ rowSum = sum(listA259703rowTerms)
105
+ A000682for_n = A000682(n)
106
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
107
+
108
+ listA259703rowTerms = [252, 98, 90, 32, 21, 6, 4, 1]
109
+ n = len(listA259703rowTerms) + 1
110
+ rowSum = sum(listA259703rowTerms)
111
+ A000682for_n = A000682(n)
112
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
113
+
114
+ listA259703rowTerms = [703, 278, 243, 94, 54, 21, 8, 4, 1]
115
+ n = len(listA259703rowTerms) + 1
116
+ rowSum = sum(listA259703rowTerms)
117
+ A000682for_n = A000682(n)
118
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
119
+
120
+ listA259703rowTerms = [2105, 812, 745, 270, 175, 57, 32, 8, 5, 1]
121
+ n = len(listA259703rowTerms) + 1
122
+ rowSum = sum(listA259703rowTerms)
123
+ A000682for_n = A000682(n)
124
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
125
+
126
+ listA259703rowTerms = [6099, 2385, 2108, 808, 485, 181, 84, 32, 10, 5, 1]
127
+ n = len(listA259703rowTerms) + 1
128
+ rowSum = sum(listA259703rowTerms)
129
+ A000682for_n = A000682(n)
130
+ print(rowSum == A000682for_n, f"{n = }, {A000682for_n = }, {rowSum = }")
131
+
@@ -0,0 +1,134 @@
1
+ def count(bridges: int, startingCurveLocations: dict[int, int]) -> int:
2
+ listCurveMaximums: list[tuple[int, int, int]] = [
3
+ (0x15, 0x2a, 0x10),
4
+ (0x55, 0xaa, 0x40),
5
+ (0x155, 0x2aa, 0x100),
6
+ (0x555, 0xaaa, 0x400),
7
+ (0x1555, 0x2aaa, 0x1000),
8
+ (0x5555, 0xaaaa, 0x4000),
9
+ (0x15555, 0x2aaaa, 0x10000),
10
+ (0x55555, 0xaaaaa, 0x40000),
11
+ (0x155555, 0x2aaaaa, 0x100000),
12
+ (0x555555, 0xaaaaaa, 0x400000),
13
+ (0x1555555, 0x2aaaaaa, 0x1000000),
14
+ (0x5555555, 0xaaaaaaa, 0x4000000),
15
+ (0x15555555, 0x2aaaaaaa, 0x10000000),
16
+ (0x55555555, 0xaaaaaaaa, 0x40000000), # `bridges = 13`, 0xaaaaaaaa.bit_length() = 32
17
+ (0x155555555, 0x2aaaaaaaa, 0x100000000),
18
+ (0x555555555, 0xaaaaaaaaa, 0x400000000),
19
+ (0x1555555555, 0x2aaaaaaaaa, 0x1000000000),
20
+ (0x5555555555, 0xaaaaaaaaaa, 0x4000000000),
21
+ (0x15555555555, 0x2aaaaaaaaaa, 0x10000000000),
22
+ (0x55555555555, 0xaaaaaaaaaaa, 0x40000000000),
23
+ (0x155555555555, 0x2aaaaaaaaaaa, 0x100000000000),
24
+ (0x555555555555, 0xaaaaaaaaaaaa, 0x400000000000),
25
+ (0x1555555555555, 0x2aaaaaaaaaaaa, 0x1000000000000),
26
+ (0x5555555555555, 0xaaaaaaaaaaaaa, 0x4000000000000),
27
+ (0x15555555555555, 0x2aaaaaaaaaaaaa, 0x10000000000000),
28
+ (0x55555555555555, 0xaaaaaaaaaaaaaa, 0x40000000000000),
29
+ (0x155555555555555, 0x2aaaaaaaaaaaaaa, 0x100000000000000),
30
+ (0x555555555555555, 0xaaaaaaaaaaaaaaa, 0x400000000000000),
31
+ (0x1555555555555555, 0x2aaaaaaaaaaaaaaa, 0x1000000000000000),
32
+ (0x5555555555555555, 0xaaaaaaaaaaaaaaaa, 0x4000000000000000), # 0x5000000000000000.bit_length() = 63; 0xaaaaaaaaaaaaaaaa.bit_length() = 64; 0x5555555555555555.bit_length() = 63
33
+ (0x15555555555555555, 0x2aaaaaaaaaaaaaaaa, 0x10000000000000000),
34
+ (0x55555555555555555, 0xaaaaaaaaaaaaaaaaa, 0x40000000000000000),
35
+ (0x155555555555555555, 0x2aaaaaaaaaaaaaaaaa, 0x100000000000000000),
36
+ (0x555555555555555555, 0xaaaaaaaaaaaaaaaaaa, 0x400000000000000000),
37
+ (0x1555555555555555555, 0x2aaaaaaaaaaaaaaaaaa, 0x1000000000000000000),
38
+ (0x5555555555555555555, 0xaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000),
39
+ (0x15555555555555555555, 0x2aaaaaaaaaaaaaaaaaaa, 0x10000000000000000000),
40
+ (0x55555555555555555555, 0xaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000),
41
+ (0x155555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000),
42
+ (0x555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000),
43
+ (0x1555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000),
44
+ (0x5555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000),
45
+ (0x15555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000),
46
+ (0x55555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000),
47
+ (0x155555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000),
48
+ (0x555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000),
49
+ (0x1555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000),
50
+ (0x5555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000),
51
+ (0x15555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000),
52
+ (0x55555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000),
53
+ (0x155555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000000),
54
+ (0x555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000000),
55
+ (0x1555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000000),
56
+ (0x5555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000000),
57
+ (0x15555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000000),
58
+ (0x55555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000000),
59
+ (0x155555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x100000000000000000000000000000),
60
+ (0x555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x400000000000000000000000000000),
61
+ (0x1555555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x1000000000000000000000000000000),
62
+ (0x5555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x4000000000000000000000000000000),
63
+ (0x15555555555555555555555555555555, 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x10000000000000000000000000000000),
64
+ (0x55555555555555555555555555555555, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0x40000000000000000000000000000000),
65
+ ]
66
+ """`bridges = 29`
67
+ 0x5000000000000000.bit_length() = 63;
68
+ 0xaaaaaaaaaaaaaaaa.bit_length() = 64;
69
+ 0x5555555555555555.bit_length() = 63"""
70
+
71
+ listCurveMaximums = listCurveMaximums[0:bridges]
72
+
73
+ dictionaryCurveLocations: dict[int, int] = {}
74
+ while bridges > 0:
75
+ bridges -= 1
76
+
77
+ bifurcationAlphaLocator, bifurcationZuluLocator, curveLocationsMAXIMUM = listCurveMaximums[bridges]
78
+
79
+ for curveLocations, distinctCrossings in startingCurveLocations.items():
80
+ bifurcationAlpha = (curveLocations & bifurcationAlphaLocator)
81
+ bifurcationZulu = (curveLocations & bifurcationZuluLocator) >> 1
82
+
83
+ bifurcationAlphaHasCurves = bifurcationAlpha != 1
84
+ bifurcationZuluHasCurves = bifurcationZulu != 1
85
+
86
+ # Z0Z_simpleBridges
87
+ curveLocationAnalysis = ((bifurcationAlpha | (bifurcationZulu << 1)) << 2) | 3
88
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
89
+ dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
90
+
91
+ # bifurcationAlphaCurves
92
+ if bifurcationAlphaHasCurves:
93
+ curveLocationAnalysis = (bifurcationAlpha >> 2) | (bifurcationZulu << 3) | ((bifurcationAlphaIsEven := 1 - (bifurcationAlpha & 0b1)) << 1)
94
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
95
+ dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
96
+
97
+ # bifurcationZuluCurves
98
+ if bifurcationZuluHasCurves:
99
+ curveLocationAnalysis = (bifurcationZulu >> 1) | (bifurcationAlpha << 2) | (bifurcationZuluIsEven := 1 - (bifurcationZulu & 1))
100
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
101
+ dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
102
+
103
+ # Z0Z_alignedBridges
104
+ if bifurcationZuluHasCurves and bifurcationAlphaHasCurves:
105
+ # One Truth-check to select a code path
106
+ bifurcationsCanBePairedTogether = (bifurcationZuluIsEven << 1) | bifurcationAlphaIsEven # pyright: ignore[reportPossiblyUnboundVariable]
107
+
108
+ if bifurcationsCanBePairedTogether != 0: # Case 0 (False, False)
109
+ XOrHere2makePair = 0b1
110
+ findUnpaired_0b1 = 0
111
+
112
+ if bifurcationsCanBePairedTogether == 1: # Case 1: (False, True)
113
+ while findUnpaired_0b1 >= 0:
114
+ XOrHere2makePair <<= 2
115
+ findUnpaired_0b1 += 1 if (bifurcationAlpha & XOrHere2makePair) == 0 else -1
116
+ bifurcationAlpha ^= XOrHere2makePair
117
+ elif bifurcationsCanBePairedTogether == 2: # Case 2: (True, False)
118
+ while findUnpaired_0b1 >= 0:
119
+ XOrHere2makePair <<= 2
120
+ findUnpaired_0b1 += 1 if (bifurcationZulu & XOrHere2makePair) == 0 else -1
121
+ bifurcationZulu ^= XOrHere2makePair
122
+
123
+ # Cases 1, 2, and 3 all compute curveLocationAnalysis
124
+ # TODO https://github.com/hunterhogan/mapFolding/issues/19
125
+ curveLocationAnalysis = ((bifurcationZulu >> 2) << 1) | (bifurcationAlpha >> 2)
126
+ if curveLocationAnalysis < curveLocationsMAXIMUM:
127
+ dictionaryCurveLocations[curveLocationAnalysis] = dictionaryCurveLocations.get(curveLocationAnalysis, 0) + distinctCrossings
128
+
129
+ startingCurveLocations.clear()
130
+ startingCurveLocations, dictionaryCurveLocations = dictionaryCurveLocations, startingCurveLocations
131
+
132
+ # print(sum(startingCurveLocations.values()))
133
+ return sum(startingCurveLocations.values())
134
+
@@ -0,0 +1,152 @@
1
+ # ruff: noqa
2
+ import numpy
3
+
4
+ indexDistinctCrossings = int(0) # noqa: RUF046, UP018
5
+ indexBifurcationAlpha = int(1) # noqa: RUF046, UP018
6
+ indexBifurcationZulu = int(2) # noqa: RUF046, UP018
7
+ indexCurveLocations = int(3) # noqa: RUF046, UP018
8
+
9
+ def make1array(listArrays: list[numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]]]) -> numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]]:
10
+ arrayCurveLocations: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = numpy.fromiter({element for stupidSystem in listArrays for element in stupidSystem[:, 1]}, dtype=numpy.uint64)
11
+
12
+ arrayOut = numpy.column_stack((
13
+ numpy.zeros(len(arrayCurveLocations), dtype=numpy.uint64)
14
+ , arrayCurveLocations & numpy.uint64(0x5555555555555555)
15
+ , (arrayCurveLocations & numpy.uint64(0xaaaaaaaaaaaaaaaa)) >> numpy.uint64(1)
16
+ , arrayCurveLocations
17
+ ))
18
+
19
+ for arrayCurveLocations in listArrays:
20
+ arrayOut[:, indexDistinctCrossings] += numpy.sum(arrayCurveLocations[:, 0] * (arrayCurveLocations[:, -1][:, numpy.newaxis] == arrayOut[:, indexCurveLocations]).T, axis=1)
21
+
22
+ return arrayOut # The next `arrayBifurcations`
23
+
24
+ def convertDictionaryToNumPy(dictionaryIn: dict[int, int]) -> numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]]:
25
+ arrayKeys: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = numpy.fromiter(dictionaryIn.keys(), dtype=numpy.uint64)
26
+
27
+ return numpy.column_stack((
28
+ numpy.fromiter(dictionaryIn.values(), dtype=numpy.uint64)
29
+ , arrayKeys & numpy.uint64(0x5555555555555555)
30
+ , (arrayKeys & numpy.uint64(0xaaaaaaaaaaaaaaaa)) >> numpy.uint64(1)
31
+ , arrayKeys
32
+ ))
33
+
34
+ def count(bridges: int, startingCurveLocations: dict[int, int]) -> int:
35
+ arrayBifurcations: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = convertDictionaryToNumPy(startingCurveLocations)
36
+
37
+ while bridges > 0:
38
+ bridges -= 1
39
+
40
+ listArrayCurveLocationsAnalyzed: list[numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]]] = []
41
+
42
+ # Selector-adjacent
43
+ curveLocationsMAXIMUM: numpy.uint64 = numpy.uint64(1) << numpy.uint64(2 * bridges + 4)
44
+ # Selectors, general
45
+ selectBifurcationAlphaCurves: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = arrayBifurcations[:, indexBifurcationAlpha] > numpy.uint64(1)
46
+ selectBifurcationAlphaEven: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = (arrayBifurcations[:, indexBifurcationAlpha] & numpy.uint64(1)) == numpy.uint64(0)
47
+ selectBifurcationZuluCurves: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = arrayBifurcations[:, indexBifurcationZulu] > numpy.uint64(1)
48
+ selectBifurcationZuluEven: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = (arrayBifurcations[:, indexBifurcationZulu] & numpy.uint64(1)) == numpy.uint64(0)
49
+
50
+ # BridgesSimple
51
+ selector: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = arrayBifurcations[:, indexDistinctCrossings] >= numpy.uint64(0) # This had better always be `True`.
52
+ curveLocations: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = (((arrayBifurcations[selector, indexBifurcationAlpha] | (arrayBifurcations[selector, indexBifurcationZulu] << numpy.uint64(1))) << numpy.uint64(2)) | numpy.uint64(3))
53
+ listArrayCurveLocationsAnalyzed.append(numpy.column_stack((arrayBifurcations[selector, indexDistinctCrossings][curveLocations < curveLocationsMAXIMUM], curveLocations[curveLocations < curveLocationsMAXIMUM])))
54
+
55
+ # BifurcationAlphaCurves
56
+ selector = selectBifurcationAlphaCurves
57
+ curveLocations: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = numpy.bitwise_or.reduce((
58
+ arrayBifurcations[selector, indexBifurcationAlpha] >> numpy.uint64(2)
59
+ , arrayBifurcations[selector, indexBifurcationZulu] << numpy.uint64(3)
60
+ , (numpy.uint64(1) - (arrayBifurcations[selector, indexBifurcationAlpha] & numpy.uint64(1))) << numpy.uint64(1)
61
+ ))
62
+ listArrayCurveLocationsAnalyzed.append(numpy.column_stack((arrayBifurcations[selector, indexDistinctCrossings][curveLocations < curveLocationsMAXIMUM], curveLocations[curveLocations < curveLocationsMAXIMUM])))
63
+
64
+ # BifurcationZuluCurves
65
+ selector = selectBifurcationZuluCurves
66
+ curveLocations: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = numpy.bitwise_or.reduce((
67
+ arrayBifurcations[selector, indexBifurcationZulu] >> numpy.uint64(1)
68
+ , arrayBifurcations[selector, indexBifurcationAlpha] << numpy.uint64(2)
69
+ , (1 - (arrayBifurcations[selector, indexBifurcationZulu] & numpy.uint64(1)))
70
+ ))
71
+ listArrayCurveLocationsAnalyzed.append(numpy.column_stack((arrayBifurcations[selector, indexDistinctCrossings][curveLocations < curveLocationsMAXIMUM], curveLocations[curveLocations < curveLocationsMAXIMUM])))
72
+
73
+ # Z0Z_bridgesBifurcationAlphaToRepair
74
+ selector: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.logical_and.reduce((
75
+ selectBifurcationAlphaCurves, selectBifurcationZuluCurves, selectBifurcationAlphaEven, ~selectBifurcationZuluEven
76
+ ))
77
+
78
+ # Initialize
79
+ Z0Z_selectBridgesBifurcationAlphaToModify = selector.copy()
80
+ XOrHere2makePair = numpy.uint64(1)
81
+ selectToModifyByXOR: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.array([])
82
+ selectorUnified: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.array([])
83
+
84
+ while Z0Z_selectBridgesBifurcationAlphaToModify.any():
85
+ XOrHere2makePair <<= numpy.uint64(2)
86
+
87
+ selectToModifyByXOR: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = (arrayBifurcations[:, indexBifurcationAlpha] & XOrHere2makePair) == numpy.uint64(0)
88
+ selectorUnified: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.logical_and.reduce((Z0Z_selectBridgesBifurcationAlphaToModify, selectToModifyByXOR))
89
+
90
+ # Modify in place
91
+ arrayBifurcations[selectorUnified, indexBifurcationAlpha] ^= XOrHere2makePair
92
+
93
+ # Remove the modified elements
94
+ Z0Z_selectBridgesBifurcationAlphaToModify: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.logical_and.reduce((Z0Z_selectBridgesBifurcationAlphaToModify, ~selectorUnified))
95
+
96
+ curveLocations: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = (
97
+ ((arrayBifurcations[selector, indexBifurcationZulu] >> numpy.uint64(2)) << numpy.uint64(1))
98
+ | (arrayBifurcations[selector, indexBifurcationAlpha] >> numpy.uint64(2))
99
+ )
100
+
101
+ listArrayCurveLocationsAnalyzed.append(numpy.column_stack((arrayBifurcations[selector, indexDistinctCrossings][curveLocations < curveLocationsMAXIMUM], curveLocations[curveLocations < curveLocationsMAXIMUM])))
102
+
103
+ # Z0Z_bridgesBifurcationZuluToRepair
104
+ selector: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.logical_and.reduce((
105
+ selectBifurcationAlphaCurves, selectBifurcationZuluCurves, ~selectBifurcationAlphaEven, selectBifurcationZuluEven
106
+ ))
107
+
108
+ # Initialize
109
+ Z0Z_selectBridgesBifurcationZuluToModify: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = selector.copy()
110
+ XOrHere2makePair: numpy.uint64 = numpy.uint64(1)
111
+ selectToModifyByXOR: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.array([])
112
+ selectorUnified: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.array([])
113
+
114
+ while Z0Z_selectBridgesBifurcationZuluToModify.any():
115
+ XOrHere2makePair <<= numpy.uint64(2)
116
+
117
+ # New condition
118
+ selectUnpaired_0b1: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = (arrayBifurcations[:, indexBifurcationZulu] & XOrHere2makePair) == numpy.uint64(0)
119
+ selectorUnified: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.logical_and.reduce((Z0Z_selectBridgesBifurcationZuluToModify, selectUnpaired_0b1))
120
+
121
+ # Modify in place
122
+ arrayBifurcations[selectorUnified, indexBifurcationZulu] ^= XOrHere2makePair
123
+
124
+ # Remove the modified elements from the selector
125
+ Z0Z_selectBridgesBifurcationZuluToModify: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.logical_and.reduce((Z0Z_selectBridgesBifurcationZuluToModify, ~selectorUnified))
126
+
127
+ curveLocations: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = (
128
+ ((arrayBifurcations[selector, indexBifurcationZulu] >> numpy.uint64(2)) << numpy.uint64(1))
129
+ | (arrayBifurcations[selector, indexBifurcationAlpha] >> numpy.uint64(2))
130
+ )
131
+
132
+ listArrayCurveLocationsAnalyzed.append(numpy.column_stack((arrayBifurcations[selector, indexDistinctCrossings][curveLocations < curveLocationsMAXIMUM], curveLocations[curveLocations < curveLocationsMAXIMUM])))
133
+
134
+ # Z0Z_bridgesAligned
135
+ selector: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.bool_]] = numpy.logical_and.reduce((
136
+ selectBifurcationAlphaCurves, selectBifurcationZuluCurves, selectBifurcationAlphaEven, selectBifurcationZuluEven
137
+ ))
138
+
139
+ curveLocations: numpy.ndarray[tuple[int, ...], numpy.dtype[numpy.uint64]] = (
140
+ ((arrayBifurcations[selector, indexBifurcationZulu] >> numpy.uint64(2)) << numpy.uint64(1))
141
+ | (arrayBifurcations[selector, indexBifurcationAlpha] >> numpy.uint64(2))
142
+ )
143
+
144
+ listArrayCurveLocationsAnalyzed.append(numpy.column_stack((arrayBifurcations[selector, indexDistinctCrossings][curveLocations < curveLocationsMAXIMUM], curveLocations[curveLocations < curveLocationsMAXIMUM])))
145
+
146
+ arrayBifurcations = make1array(listArrayCurveLocationsAnalyzed)
147
+
148
+ listArrayCurveLocationsAnalyzed.clear()
149
+
150
+ print(int(sum(arrayBifurcations[:, 0])))
151
+ return int(sum(arrayBifurcations[:, 0]))
152
+
@@ -35,7 +35,7 @@ curveMaximum: dict[int, limitLocators] = {
35
35
  25: limitLocators(0x55555555555555, 0xaaaaaaaaaaaaaa, 0x40000000000000),
36
36
  26: limitLocators(0x155555555555555, 0x2aaaaaaaaaaaaaa, 0x100000000000000),
37
37
  27: limitLocators(0x555555555555555, 0xaaaaaaaaaaaaaaa, 0x400000000000000),
38
- 28: limitLocators(0x1555555555555555, 0x2aaaaaaaaaaaaaaa, 0x1000000000000000), # 0x2aaaaaaaaaaaaaaa.bit_length() = 62
38
+ 28: limitLocators(0x1555555555555555, 0x2aaaaaaaaaaaaaaa, 0x1000000000000000),
39
39
  29: limitLocators(0x5555555555555555, 0xaaaaaaaaaaaaaaaa, 0x4000000000000000),
40
40
  30: limitLocators(0x15555555555555555, 0x2aaaaaaaaaaaaaaaa, 0x10000000000000000),
41
41
  31: limitLocators(0x55555555555555555, 0xaaaaaaaaaaaaaaaaa, 0x40000000000000000),
@@ -115,7 +115,7 @@ settingsOEISManuallySelected: dict[str, MetadataOEISidManuallySet] = {
115
115
  'getMapShape': lambda n: (1, 2 * n),
116
116
  'valuesBenchmark': [7],
117
117
  'valuesTestParallelization': [*range(2, 4)],
118
- 'valuesTestValidation': [random.randint(2, 4)], # noqa: S311
118
+ 'valuesTestValidation': [random.randint(2, 8)], # noqa: S311
119
119
  },
120
120
  }
121
121
 
@@ -36,7 +36,7 @@ NumPyFoldsTotal: TypeAlias = numpy_uint64 # noqa: UP040 The TypeAlias may be us
36
36
 
37
37
  Note well
38
38
  ---------
39
- If your elements might exceed 1.8 x 10^19, then you should take extra steps to ensure the integrity of the data in NumPy or use a
39
+ If your element values might exceed 1.8 x 10^19, then you should take extra steps to ensure the integrity of the data in NumPy or use a
40
40
  different data structure."""
41
41
 
42
42
  Array3DLeavesTotal: TypeAlias = ndarray[tuple[int, int, int], dtype[NumPyLeavesTotal]] # noqa: UP040 The TypeAlias may be used to construct ("cast") a value to the type. And the identifier may be changed to a different type.