mapFolding 0.3.12__py3-none-any.whl → 0.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. mapFolding/__init__.py +40 -38
  2. mapFolding/basecamp.py +50 -50
  3. mapFolding/beDRY.py +336 -336
  4. mapFolding/oeis.py +262 -262
  5. mapFolding/reference/flattened.py +294 -293
  6. mapFolding/reference/hunterNumba.py +126 -126
  7. mapFolding/reference/irvineJavaPort.py +99 -99
  8. mapFolding/reference/jax.py +153 -153
  9. mapFolding/reference/lunnan.py +148 -148
  10. mapFolding/reference/lunnanNumpy.py +115 -115
  11. mapFolding/reference/lunnanWhile.py +114 -114
  12. mapFolding/reference/rotatedEntryPoint.py +183 -183
  13. mapFolding/reference/total_countPlus1vsPlusN.py +203 -203
  14. mapFolding/someAssemblyRequired/__init__.py +5 -1
  15. mapFolding/someAssemblyRequired/getLLVMforNoReason.py +12 -12
  16. mapFolding/someAssemblyRequired/makeJob.py +46 -52
  17. mapFolding/someAssemblyRequired/synthesizeModuleJAX.py +17 -17
  18. mapFolding/someAssemblyRequired/synthesizeNumba.py +343 -633
  19. mapFolding/someAssemblyRequired/synthesizeNumbaGeneralized.py +325 -0
  20. mapFolding/someAssemblyRequired/synthesizeNumbaJob.py +173 -0
  21. mapFolding/someAssemblyRequired/synthesizeNumbaModules.py +77 -0
  22. mapFolding/syntheticModules/__init__.py +0 -0
  23. mapFolding/syntheticModules/numba_countInitialize.py +4 -4
  24. mapFolding/syntheticModules/numba_countParallel.py +4 -4
  25. mapFolding/syntheticModules/numba_countSequential.py +4 -4
  26. mapFolding/syntheticModules/numba_doTheNeedful.py +7 -7
  27. mapFolding/theDao.py +165 -165
  28. mapFolding/theSSOT.py +177 -173
  29. mapFolding/theSSOTnumba.py +90 -74
  30. mapFolding-0.4.1.dist-info/METADATA +154 -0
  31. mapFolding-0.4.1.dist-info/RECORD +42 -0
  32. tests/conftest.py +253 -129
  33. tests/test_computations.py +79 -0
  34. tests/test_oeis.py +76 -85
  35. tests/test_other.py +136 -224
  36. tests/test_tasks.py +19 -23
  37. tests/test_types.py +2 -2
  38. mapFolding/someAssemblyRequired/synthesizeNumbaHardcoding.py +0 -188
  39. mapFolding-0.3.12.dist-info/METADATA +0 -155
  40. mapFolding-0.3.12.dist-info/RECORD +0 -40
  41. tests/conftest_tmpRegistry.py +0 -62
  42. tests/conftest_uniformTests.py +0 -53
  43. {mapFolding-0.3.12.dist-info → mapFolding-0.4.1.dist-info}/LICENSE +0 -0
  44. {mapFolding-0.3.12.dist-info → mapFolding-0.4.1.dist-info}/WHEEL +0 -0
  45. {mapFolding-0.3.12.dist-info → mapFolding-0.4.1.dist-info}/entry_points.txt +0 -0
  46. {mapFolding-0.3.12.dist-info → mapFolding-0.4.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,79 @@
1
+ from pathlib import Path
2
+ from tests.conftest import *
3
+ import importlib.util
4
+ import pytest
5
+
6
+ def test_algorithmSourceParallel(listDimensionsTestParallelization: List[int], foldsTotalKnown: Dict[Tuple[int, ...], int], useAlgorithmSourceDispatcher: None) -> None:
7
+ standardizedEqualTo(foldsTotalKnown[tuple(listDimensionsTestParallelization)], countFolds, listDimensionsTestParallelization, None, 'maximum')
8
+
9
+ def test_algorithmSourceSequential(listDimensionsTestCountFolds: List[int], foldsTotalKnown: Dict[Tuple[int, ...], int], useAlgorithmSourceDispatcher: None) -> None:
10
+ standardizedEqualTo(foldsTotalKnown[tuple(listDimensionsTestCountFolds)], countFolds, listDimensionsTestCountFolds)
11
+
12
+ def test_aOFn_calculate_value(oeisID: str) -> None:
13
+ for n in settingsOEIS[oeisID]['valuesTestValidation']:
14
+ standardizedEqualTo(settingsOEIS[oeisID]['valuesKnown'][n], oeisIDfor_n, oeisID, n)
15
+
16
+ # Python doesn't want me to test this
17
+ # @pytest.mark.parametrize('pathFilenameTmpTesting', ['.py'], indirect=True)
18
+ # def test_writeJobNumba(listDimensionsTestCountFolds: List[int], foldsTotalKnown: Dict[Tuple[int, ...], int], pathFilenameTmpTesting: Path) -> None:
19
+ # from mapFolding.syntheticModules import numba_countSequential
20
+ # algorithmSourceHARDCODED: ModuleType = numba_countSequential
21
+ # algorithmSource = algorithmSourceHARDCODED
22
+ # pathFilenameModule = writeJobNumba(listDimensionsTestCountFolds, algorithmSource, pathFilenameWriteJob=pathFilenameTmpTesting.absolute())
23
+
24
+ # Don_Lapre_Road_to_Self_Improvement = importlib.util.spec_from_file_location("__main__", pathFilenameModule)
25
+ # if Don_Lapre_Road_to_Self_Improvement is None:
26
+ # raise ImportError(f"Failed to create module specification from {pathFilenameModule}")
27
+ # if Don_Lapre_Road_to_Self_Improvement.loader is None:
28
+ # raise ImportError(f"Failed to get loader for module {pathFilenameModule}")
29
+ # module = importlib.util.module_from_spec(Don_Lapre_Road_to_Self_Improvement)
30
+
31
+ # module.__name__ = "__main__"
32
+ # Don_Lapre_Road_to_Self_Improvement.loader.exec_module(module)
33
+
34
+ # pathFilenameFoldsTotal = getPathFilenameFoldsTotal(listDimensionsTestCountFolds)
35
+ # standardizedEqualTo(str(foldsTotalKnown[tuple(listDimensionsTestCountFolds)]), pathFilenameFoldsTotal.read_text().strip)
36
+
37
+ # def test_makeFlowNumbaOptimized(pathTmpTesting: Path, useThisDispatcher):
38
+ # def test_makeFlowNumbaOptimized(useThisDispatcher):
39
+ # """To get this to work:
40
+ # walk_up=True doesn't work on 3.10, so that has to go
41
+ # the _logical_ import must be in the logical path of the package
42
+ # fuck python
43
+ # """
44
+ # listCallablesInlineHARDCODED: List[str] = ['countInitialize', 'countParallel', 'countSequential']
45
+ # listCallablesInline = listCallablesInlineHARDCODED
46
+ # callableDispatcher = True
47
+ # algorithmSource = None
48
+ # relativePathWrite = None
49
+ # # relativePathWrite = pathTmpTesting.absolute().relative_to(getPathPackage(), walk_up=True)
50
+ # formatFilenameWrite = "pytest_{callableTarget}"
51
+ # listSynthesizedModules: List[youOughtaKnow] = makeFlowNumbaOptimized(listCallablesInline, callableDispatcher, algorithmSource, relativePathWrite, formatFilenameWrite)
52
+ # for stuff in listSynthesizedModules:
53
+ # registrarRecordsTmpObject(stuff.pathFilenameForMe)
54
+ # if stuff.callableSynthesized not in listCallablesInline:
55
+ # dispatcherSynthetic: youOughtaKnow = stuff
56
+ # if not dispatcherSynthetic: raise FREAKOUT
57
+ # # dispatcherSynthetic: youOughtaKnow = next(filter(lambda x: x.callableSynthesized not in listCallablesInline, listSynthesizedModules))
58
+
59
+ # # Import the synthetic dispatcher module to get the callable
60
+ # dispatcherSpec = importlib.util.spec_from_file_location(
61
+ # dispatcherSynthetic.callableSynthesized,
62
+ # dispatcherSynthetic.pathFilenameForMe
63
+ # )
64
+ # if dispatcherSpec is None:
65
+ # raise ImportError(f"Failed to create module specification from {dispatcherSynthetic.pathFilenameForMe}")
66
+ # if dispatcherSpec.loader is None:
67
+ # raise ImportError(f"Failed to get loader for module {dispatcherSynthetic.pathFilenameForMe}")
68
+
69
+ # dispatcherModule = importlib.util.module_from_spec(dispatcherSpec)
70
+ # dispatcherSpec.loader.exec_module(dispatcherModule)
71
+ # callableDispatcherSynthetic = getattr(dispatcherModule, dispatcherSynthetic.callableSynthesized)
72
+
73
+ # useThisDispatcher(callableDispatcherSynthetic)
74
+
75
+ # def test_syntheticSequential(listDimensionsTestCountFolds: List[int], foldsTotalKnown: Dict[Tuple[int, ...], int]):
76
+ # standardizedEqualTo(foldsTotalKnown[tuple(listDimensionsTestCountFolds)], countFolds, listDimensionsTestCountFolds)
77
+
78
+ # def test_syntheticParallel(listDimensionsTestParallelization: List[int], foldsTotalKnown: Dict[Tuple[int, ...], int]):
79
+ # standardizedEqualTo(foldsTotalKnown[tuple(listDimensionsTestParallelization)], countFolds, listDimensionsTestParallelization, None, 'maximum')
tests/test_oeis.py CHANGED
@@ -2,7 +2,6 @@ from contextlib import redirect_stdout
2
2
  from datetime import datetime, timedelta
3
3
  from mapFolding.oeis import _getFilenameOEISbFile, _getOEISidValues, _parseBFileOEIS, _validateOEISid, _getOEISidInformation
4
4
  from tests.conftest import *
5
- from typing import NoReturn
6
5
  from urllib.error import URLError
7
6
  import io
8
7
  import os
@@ -15,127 +14,119 @@ import unittest.mock
15
14
  import urllib
16
15
  import urllib.request
17
16
 
18
- def test_algorithmSourceSequential(oeisID: str, useAlgorithmDirectly: None) -> None:
19
- for n in settingsOEIS[oeisID]['valuesTestValidation']:
20
- standardizedEqualTo(settingsOEIS[oeisID]['valuesKnown'][n], oeisIDfor_n, oeisID, n)
21
-
22
- def test_aOFn_calculate_value(oeisID: str) -> None:
23
- for n in settingsOEIS[oeisID]['valuesTestValidation']:
24
- standardizedEqualTo(settingsOEIS[oeisID]['valuesKnown'][n], oeisIDfor_n, oeisID, n)
25
-
26
17
  @pytest.mark.parametrize("badID", ["A999999", " A999999 ", "A999999extra"])
27
18
  def test__validateOEISid_invalid_id(badID: str) -> None:
28
- standardizedEqualTo(KeyError, _validateOEISid, badID)
19
+ standardizedEqualTo(KeyError, _validateOEISid, badID)
29
20
 
30
21
  def test__validateOEISid_partially_valid(oeisID_1random: str) -> None:
31
- standardizedEqualTo(KeyError, _validateOEISid, f"{oeisID_1random}extra")
22
+ standardizedEqualTo(KeyError, _validateOEISid, f"{oeisID_1random}extra")
32
23
 
33
24
  def test__validateOEISid_valid_id(oeisID: str) -> None:
34
- standardizedEqualTo(oeisID, _validateOEISid, oeisID)
25
+ standardizedEqualTo(oeisID, _validateOEISid, oeisID)
35
26
 
36
27
  def test__validateOEISid_valid_id_case_insensitive(oeisID: str) -> None:
37
- standardizedEqualTo(oeisID.upper(), _validateOEISid, oeisID.lower())
38
- standardizedEqualTo(oeisID.upper(), _validateOEISid, oeisID.upper())
39
- standardizedEqualTo(oeisID.upper(), _validateOEISid, oeisID.swapcase())
28
+ standardizedEqualTo(oeisID.upper(), _validateOEISid, oeisID.lower())
29
+ standardizedEqualTo(oeisID.upper(), _validateOEISid, oeisID.upper())
30
+ standardizedEqualTo(oeisID.upper(), _validateOEISid, oeisID.swapcase())
40
31
 
41
32
  parameters_test_aOFn_invalid_n = [
42
- # (2, "ok"), # test the test template
43
- (-random.randint(1, 100), "randomNegative"),
44
- ("foo", "string"),
45
- (1.5, "float")
33
+ # (2, "ok"), # test the test template
34
+ (-random.randint(1, 100), "randomNegative"),
35
+ ("foo", "string"),
36
+ (1.5, "float")
46
37
  ]
47
38
  badValues, badValuesIDs = zip(*parameters_test_aOFn_invalid_n)
48
39
  @pytest.mark.parametrize("badN", badValues, ids=badValuesIDs)
49
40
  def test_aOFn_invalid_n(oeisID_1random: str, badN: Any) -> None:
50
- """Check that negative or non-integer n raises ValueError."""
51
- standardizedEqualTo(ValueError, oeisIDfor_n, oeisID_1random, badN)
41
+ """Check that negative or non-integer n raises ValueError."""
42
+ standardizedEqualTo(ValueError, oeisIDfor_n, oeisID_1random, badN)
52
43
 
53
44
  def test_aOFn_zeroDim_A001418() -> None:
54
- standardizedEqualTo(ArithmeticError, oeisIDfor_n, 'A001418', 0)
45
+ standardizedEqualTo(ArithmeticError, oeisIDfor_n, 'A001418', 0)
55
46
 
56
47
  # ===== OEIS Cache Tests =====
57
48
  @pytest.mark.parametrize("cacheExists", [True, False])
58
49
  @unittest.mock.patch('pathlib.Path.exists')
59
50
  @unittest.mock.patch('pathlib.Path.unlink')
60
51
  def test_clearOEIScache(mock_unlink: unittest.mock.MagicMock, mock_exists: unittest.mock.MagicMock, cacheExists: bool) -> None:
61
- """Test OEIS cache clearing with both existing and non-existing cache."""
62
- mock_exists.return_value = cacheExists
63
- clearOEIScache()
64
-
65
- if cacheExists:
66
- # Each OEIS ID has two cache files
67
- expected_calls = len(settingsOEIS) * 2
68
- assert mock_unlink.call_count == expected_calls
69
- mock_unlink.assert_has_calls([unittest.mock.call(missing_ok=True)] * expected_calls)
70
- else:
71
- mock_exists.assert_called_once()
72
- mock_unlink.assert_not_called()
52
+ """Test OEIS cache clearing with both existing and non-existing cache."""
53
+ mock_exists.return_value = cacheExists
54
+ clearOEIScache()
55
+
56
+ if cacheExists:
57
+ # Each OEIS ID has two cache files
58
+ expected_calls = len(settingsOEIS) * 2
59
+ assert mock_unlink.call_count == expected_calls
60
+ mock_unlink.assert_has_calls([unittest.mock.call(missing_ok=True)] * expected_calls)
61
+ else:
62
+ mock_exists.assert_called_once()
63
+ mock_unlink.assert_not_called()
73
64
 
74
65
  def testNetworkError(monkeypatch: pytest.MonkeyPatch, pathCacheTesting: pathlib.Path) -> None:
75
- """Test network error handling."""
76
- def mockUrlopen(*args: Any, **kwargs: Any) -> NoReturn:
77
- raise URLError("Network error")
66
+ """Test network error handling."""
67
+ def mockUrlopen(*args: Any, **kwargs: Any) -> NoReturn:
68
+ raise URLError("Network error")
78
69
 
79
- monkeypatch.setattr(urllib.request, 'urlopen', mockUrlopen)
80
- standardizedEqualTo(URLError, _getOEISidValues, next(iter(settingsOEIS)))
70
+ monkeypatch.setattr(urllib.request, 'urlopen', mockUrlopen)
71
+ standardizedEqualTo(URLError, _getOEISidValues, next(iter(settingsOEIS)))
81
72
 
82
73
  # ===== Command Line Interface Tests =====
83
74
  def testHelpText() -> None:
84
- """Test that help text is complete and examples are valid."""
85
- outputStream = io.StringIO()
86
- with redirect_stdout(outputStream):
87
- getOEISids()
75
+ """Test that help text is complete and examples are valid."""
76
+ outputStream = io.StringIO()
77
+ with redirect_stdout(outputStream):
78
+ getOEISids()
88
79
 
89
- helpText = outputStream.getvalue()
80
+ helpText = outputStream.getvalue()
90
81
 
91
- # Verify content
92
- for oeisID in oeisIDsImplemented:
93
- assert oeisID in helpText
94
- assert settingsOEIS[oeisID]['description'] in helpText
82
+ # Verify content
83
+ for oeisID in oeisIDsImplemented:
84
+ assert oeisID in helpText
85
+ assert settingsOEIS[oeisID]['description'] in helpText
95
86
 
96
- # Extract and verify examples
87
+ # Extract and verify examples
97
88
 
98
- cliMatch = regex.search(r'OEIS_for_n (\w+) (\d+)', helpText)
99
- pythonMatch = regex.search(r"oeisIDfor_n\('(\w+)', (\d+)\)", helpText)
89
+ cliMatch = regex.search(r'OEIS_for_n (\w+) (\d+)', helpText)
90
+ pythonMatch = regex.search(r"oeisIDfor_n\('(\w+)', (\d+)\)", helpText)
100
91
 
101
- assert cliMatch and pythonMatch, "Help text missing examples"
102
- oeisID, n = pythonMatch.groups()
103
- n = int(n)
92
+ assert cliMatch and pythonMatch, "Help text missing examples"
93
+ oeisID, n = pythonMatch.groups()
94
+ n = int(n)
104
95
 
105
- # Verify CLI and Python examples use same values
106
- assert cliMatch.groups() == (oeisID, str(n)), "CLI and Python examples inconsistent"
96
+ # Verify CLI and Python examples use same values
97
+ assert cliMatch.groups() == (oeisID, str(n)), "CLI and Python examples inconsistent"
107
98
 
108
- # Verify the example works
109
- expectedValue = oeisIDfor_n(oeisID, n)
99
+ # Verify the example works
100
+ expectedValue = oeisIDfor_n(oeisID, n)
110
101
 
111
- # Test CLI execution of the example
112
- with unittest.mock.patch('sys.argv', ['OEIS_for_n', oeisID, str(n)]):
113
- outputStream = io.StringIO()
114
- with redirect_stdout(outputStream):
115
- OEIS_for_n()
116
- standardizedEqualTo(expectedValue, lambda: int(outputStream.getvalue().strip().split()[0]))
102
+ # Test CLI execution of the example
103
+ with unittest.mock.patch('sys.argv', ['OEIS_for_n', oeisID, str(n)]):
104
+ outputStream = io.StringIO()
105
+ with redirect_stdout(outputStream):
106
+ OEIS_for_n()
107
+ standardizedEqualTo(expectedValue, lambda: int(outputStream.getvalue().strip().split()[0]))
117
108
 
118
109
  def testCLI_InvalidInputs() -> None:
119
- """Test CLI error handling."""
120
- testCases = [
121
- (['OEIS_for_n'], "missing arguments"),
122
- (['OEIS_for_n', 'A999999', '1'], "invalid OEIS ID"),
123
- (['OEIS_for_n', 'A001415', '-1'], "negative n"),
124
- (['OEIS_for_n', 'A001415', 'abc'], "non-integer n"),
125
- ]
126
-
127
- for arguments, testID in testCases:
128
- with unittest.mock.patch('sys.argv', arguments):
129
- standardizedSystemExit("error", OEIS_for_n)
110
+ """Test CLI error handling."""
111
+ testCases = [
112
+ (['OEIS_for_n'], "missing arguments"),
113
+ (['OEIS_for_n', 'A999999', '1'], "invalid OEIS ID"),
114
+ (['OEIS_for_n', 'A001415', '-1'], "negative n"),
115
+ (['OEIS_for_n', 'A001415', 'abc'], "non-integer n"),
116
+ ]
117
+
118
+ for arguments, testID in testCases:
119
+ with unittest.mock.patch('sys.argv', arguments):
120
+ standardizedSystemExit("error", OEIS_for_n)
130
121
 
131
122
  def testCLI_HelpFlag() -> None:
132
- """Verify --help output contains required information."""
133
- with unittest.mock.patch('sys.argv', ['OEIS_for_n', '--help']):
134
- outputStream = io.StringIO()
135
- with redirect_stdout(outputStream):
136
- standardizedSystemExit("nonError", OEIS_for_n)
137
-
138
- helpOutput = outputStream.getvalue()
139
- assert "Available OEIS sequences:" in helpOutput
140
- assert "Usage examples:" in helpOutput
141
- assert all(oeisID in helpOutput for oeisID in oeisIDsImplemented)
123
+ """Verify --help output contains required information."""
124
+ with unittest.mock.patch('sys.argv', ['OEIS_for_n', '--help']):
125
+ outputStream = io.StringIO()
126
+ with redirect_stdout(outputStream):
127
+ standardizedSystemExit("nonError", OEIS_for_n)
128
+
129
+ helpOutput = outputStream.getvalue()
130
+ assert "Available OEIS sequences:" in helpOutput
131
+ assert "Usage examples:" in helpOutput
132
+ assert all(oeisID in helpOutput for oeisID in oeisIDsImplemented)