mathjson-solver 1.16.1__tar.gz → 1.17.0__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.
- {mathjson_solver-1.16.1/src/mathjson_solver.egg-info → mathjson_solver-1.17.0}/PKG-INFO +21 -9
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/README.md +20 -7
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/setup.cfg +2 -2
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/setup.py +2 -2
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/src/mathjson_solver/__main__.py +100 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0/src/mathjson_solver.egg-info}/PKG-INFO +21 -9
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/src/mathjson_solver.egg-info/SOURCES.txt +8 -2
- mathjson_solver-1.16.1/tests/test_CumulativeProduct.py → mathjson_solver-1.17.0/tests/test_cumulative.py +11 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_equal.py +5 -0
- mathjson_solver-1.17.0/tests/test_gail_model_nci_validated_no_beta.py +619 -0
- mathjson_solver-1.17.0/tests/test_gail_model_nci_validated_with_beta.py +618 -0
- mathjson_solver-1.17.0/tests/test_nci_discrete_implementation_no_beta.py +480 -0
- mathjson_solver-1.17.0/tests/test_nci_discrete_implementation_with_beta.py +503 -0
- mathjson_solver-1.17.0/tests/test_reduce_simple.py +209 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_simple_cases.py +6 -0
- mathjson_solver-1.17.0/tests/test_state_tuples_reduce.py +152 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/LICENSE +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/pyproject.toml +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/src/mathjson_solver/__init__.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/src/mathjson_solver.egg-info/dependency_links.txt +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/src/mathjson_solver.egg-info/top_level.txt +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_TrapezoidalIntegratel.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_atindex.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_exceptions.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_extract_variables.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_findinterval.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_gail_model.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_interpolate.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_range.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_scalars.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_sets.py +0 -0
- /mathjson_solver-1.16.1/tests/test_Slice.py → /mathjson_solver-1.17.0/tests/test_slice.py +0 -0
- {mathjson_solver-1.16.1 → mathjson_solver-1.17.0}/tests/test_with_pytest.py +0 -0
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mathjson-solver
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.17.0
|
|
4
4
|
Summary: Utilities for MathJSON evaluation
|
|
5
5
|
Home-page: https://github.com/LongenesisLtd/mathjson-solver
|
|
6
6
|
Author: Martins Mednis
|
|
7
7
|
Author-email: mrt@mednis.info
|
|
8
8
|
Project-URL: Bug Tracker, https://github.com/LongenesisLtd/mathjson-solver/issues
|
|
9
9
|
Classifier: Programming Language :: Python :: 3
|
|
10
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
11
10
|
Classifier: Operating System :: OS Independent
|
|
12
11
|
Requires-Python: >=3.6
|
|
13
12
|
Description-Content-Type: text/markdown
|
|
@@ -33,8 +32,6 @@ A reliable Python library for numerically evaluating mathematical expressions in
|
|
|
33
32
|
|
|
34
33
|
**What is MathJSON?** MathJSON represents mathematical expressions as JSON arrays, like `["Add", 1, 2, 3]` for 1+2+3. This format is safe, structured, and easy to generate programmatically.
|
|
35
34
|
|
|
36
|
-
Inspired by [CortexJS Compute Engine](https://cortexjs.io/compute-engine/) though designed as an independent implementation focused on our specific use cases.
|
|
37
|
-
|
|
38
35
|
## Table of Contents
|
|
39
36
|
- [Installation](#installation)
|
|
40
37
|
- [Quick Start](#quick-start)
|
|
@@ -80,21 +77,32 @@ except MathJSONException as e:
|
|
|
80
77
|
# Math error: Problem in Divide. ['Divide', 1, 0]. division by zero
|
|
81
78
|
```
|
|
82
79
|
|
|
80
|
+
**Think Functional:** MathJSON Solver embraces functional programming principles. Instead of writing loops and modifying variables, you compose expressions that transform data. Functions like `Map`, `Reduce`, and `Filter` let you process arrays elegantly, while immutable operations ensure predictable, side-effect-free calculations. Don't worry if you're new to functional programming — the examples will guide you naturally into this powerful paradigm.
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
# Functional approach: transform data with expressions
|
|
84
|
+
solver(["Map", ["Array", 1, 2, 3, 4], ["Multiply"], 2]) # [2, 4, 6, 8]
|
|
85
|
+
solver(["Reduce", ["Array", 1, 2, 3, 4], 0, ["Add", "acc", "item"],
|
|
86
|
+
["Variable", "acc"], ["Variable", "item"], ["Variable", "i"]]) # 10
|
|
87
|
+
```
|
|
88
|
+
|
|
83
89
|
## Supported Operations
|
|
84
90
|
|
|
85
91
|
The library supports a comprehensive set of mathematical operations:
|
|
86
92
|
|
|
87
|
-
* **Arithmetic:** Add, Sum, Subtract, Multiply, Divide, Negate, Power, Square, Root, Sqrt, Abs, Round
|
|
93
|
+
* **Arithmetic:** Add, Sum, Subtract, Multiply, Divide, Negate, Power, Square, Root, Sqrt, Abs, Round, Floor, Ceil
|
|
88
94
|
* **Trigonometry:** Sin, Cos, Tan, Arcsin, Arccos, Arctan
|
|
89
95
|
* **Logarithms:** Log, Log2, Log10, Exp
|
|
90
96
|
* **Comparison:** Equal, StrictEqual, NotEqual, Greater, GreaterEqual, Less, LessEqual
|
|
91
|
-
* **Logic & Sets:** Any, All, Not, In, NotIn, ContainsAnyOf, ContainsAllOf, ContainsNoneOf
|
|
97
|
+
* **Logic & Sets:** Any, All, Not, And, Or, In, NotIn, ContainsAnyOf, ContainsAllOf, ContainsNoneOf
|
|
92
98
|
* **Statistics:** Average, Max, Min, Median, Length
|
|
93
|
-
* **
|
|
99
|
+
* **Functional Programming:** Map, Reduce, Filter
|
|
100
|
+
* **Arrays:** Array creation, GenerateRange, AtIndex, Slice, Appended, CumulativeSum, CumulativeProduct
|
|
94
101
|
* **Control Flow:** If statements, Switch-Case, Constants definition
|
|
95
102
|
* **Type Conversion:** Int, Float, Str, IsDefined
|
|
96
|
-
* **Date/Time:** Strptime, Strftime, Today, Now, TimeDelta functions
|
|
97
|
-
* **
|
|
103
|
+
* **Date/Time:** Strptime, Strftime, Today, Now, TimeDelta functions (Weeks, Days, Hours, Minutes)
|
|
104
|
+
* **Integration:** TrapezoidalIntegrate (requires numpy), Interp, FindIntervalIndex, Variable references
|
|
105
|
+
* **Advanced:** HasMatchingSublist for pattern matching
|
|
98
106
|
* **Constants:** Pi
|
|
99
107
|
|
|
100
108
|
[View complete documentation with examples →](https://github.com/LongenesisLtd/mathjson-solver/blob/main/docs/README.md)
|
|
@@ -161,6 +169,10 @@ We welcome contributions! Please feel free to:
|
|
|
161
169
|
|
|
162
170
|
[View license information](https://github.com/LongenesisLtd/mathjson-solver/blob/main/LICENSE)
|
|
163
171
|
|
|
172
|
+
## References
|
|
173
|
+
|
|
174
|
+
This implementation was inspired by the [CortexJS Compute Engine](https://cortexjs.io/compute-engine/), though designed as an independent implementation focused on our specific use cases.
|
|
175
|
+
|
|
164
176
|
---
|
|
165
177
|
|
|
166
178
|
Made with ❤️ by [Longenesis](https://longenesis.com/team)
|
|
@@ -8,8 +8,6 @@ A reliable Python library for numerically evaluating mathematical expressions in
|
|
|
8
8
|
|
|
9
9
|
**What is MathJSON?** MathJSON represents mathematical expressions as JSON arrays, like `["Add", 1, 2, 3]` for 1+2+3. This format is safe, structured, and easy to generate programmatically.
|
|
10
10
|
|
|
11
|
-
Inspired by [CortexJS Compute Engine](https://cortexjs.io/compute-engine/) though designed as an independent implementation focused on our specific use cases.
|
|
12
|
-
|
|
13
11
|
## Table of Contents
|
|
14
12
|
- [Installation](#installation)
|
|
15
13
|
- [Quick Start](#quick-start)
|
|
@@ -55,21 +53,32 @@ except MathJSONException as e:
|
|
|
55
53
|
# Math error: Problem in Divide. ['Divide', 1, 0]. division by zero
|
|
56
54
|
```
|
|
57
55
|
|
|
56
|
+
**Think Functional:** MathJSON Solver embraces functional programming principles. Instead of writing loops and modifying variables, you compose expressions that transform data. Functions like `Map`, `Reduce`, and `Filter` let you process arrays elegantly, while immutable operations ensure predictable, side-effect-free calculations. Don't worry if you're new to functional programming — the examples will guide you naturally into this powerful paradigm.
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
# Functional approach: transform data with expressions
|
|
60
|
+
solver(["Map", ["Array", 1, 2, 3, 4], ["Multiply"], 2]) # [2, 4, 6, 8]
|
|
61
|
+
solver(["Reduce", ["Array", 1, 2, 3, 4], 0, ["Add", "acc", "item"],
|
|
62
|
+
["Variable", "acc"], ["Variable", "item"], ["Variable", "i"]]) # 10
|
|
63
|
+
```
|
|
64
|
+
|
|
58
65
|
## Supported Operations
|
|
59
66
|
|
|
60
67
|
The library supports a comprehensive set of mathematical operations:
|
|
61
68
|
|
|
62
|
-
* **Arithmetic:** Add, Sum, Subtract, Multiply, Divide, Negate, Power, Square, Root, Sqrt, Abs, Round
|
|
69
|
+
* **Arithmetic:** Add, Sum, Subtract, Multiply, Divide, Negate, Power, Square, Root, Sqrt, Abs, Round, Floor, Ceil
|
|
63
70
|
* **Trigonometry:** Sin, Cos, Tan, Arcsin, Arccos, Arctan
|
|
64
71
|
* **Logarithms:** Log, Log2, Log10, Exp
|
|
65
72
|
* **Comparison:** Equal, StrictEqual, NotEqual, Greater, GreaterEqual, Less, LessEqual
|
|
66
|
-
* **Logic & Sets:** Any, All, Not, In, NotIn, ContainsAnyOf, ContainsAllOf, ContainsNoneOf
|
|
73
|
+
* **Logic & Sets:** Any, All, Not, And, Or, In, NotIn, ContainsAnyOf, ContainsAllOf, ContainsNoneOf
|
|
67
74
|
* **Statistics:** Average, Max, Min, Median, Length
|
|
68
|
-
* **
|
|
75
|
+
* **Functional Programming:** Map, Reduce, Filter
|
|
76
|
+
* **Arrays:** Array creation, GenerateRange, AtIndex, Slice, Appended, CumulativeSum, CumulativeProduct
|
|
69
77
|
* **Control Flow:** If statements, Switch-Case, Constants definition
|
|
70
78
|
* **Type Conversion:** Int, Float, Str, IsDefined
|
|
71
|
-
* **Date/Time:** Strptime, Strftime, Today, Now, TimeDelta functions
|
|
72
|
-
* **
|
|
79
|
+
* **Date/Time:** Strptime, Strftime, Today, Now, TimeDelta functions (Weeks, Days, Hours, Minutes)
|
|
80
|
+
* **Integration:** TrapezoidalIntegrate (requires numpy), Interp, FindIntervalIndex, Variable references
|
|
81
|
+
* **Advanced:** HasMatchingSublist for pattern matching
|
|
73
82
|
* **Constants:** Pi
|
|
74
83
|
|
|
75
84
|
[View complete documentation with examples →](https://github.com/LongenesisLtd/mathjson-solver/blob/main/docs/README.md)
|
|
@@ -136,6 +145,10 @@ We welcome contributions! Please feel free to:
|
|
|
136
145
|
|
|
137
146
|
[View license information](https://github.com/LongenesisLtd/mathjson-solver/blob/main/LICENSE)
|
|
138
147
|
|
|
148
|
+
## References
|
|
149
|
+
|
|
150
|
+
This implementation was inspired by the [CortexJS Compute Engine](https://cortexjs.io/compute-engine/), though designed as an independent implementation focused on our specific use cases.
|
|
151
|
+
|
|
139
152
|
---
|
|
140
153
|
|
|
141
154
|
Made with ❤️ by [Longenesis](https://longenesis.com/team)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[metadata]
|
|
2
2
|
name = mathjson-solver
|
|
3
|
-
version = 1.
|
|
3
|
+
version = 1.17.0
|
|
4
4
|
author = Martins Mednis
|
|
5
5
|
author_email = mrt@mednis.info
|
|
6
6
|
description = Utilities for MathJSON evaluation
|
|
@@ -11,8 +11,8 @@ project_urls =
|
|
|
11
11
|
Bug Tracker = https://github.com/LongenesisLtd/mathjson-solver/issues
|
|
12
12
|
classifiers =
|
|
13
13
|
Programming Language :: Python :: 3
|
|
14
|
-
License :: OSI Approved :: MIT License
|
|
15
14
|
Operating System :: OS Independent
|
|
15
|
+
license_expr = MIT
|
|
16
16
|
|
|
17
17
|
[options]
|
|
18
18
|
package_dir =
|
|
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
|
|
|
5
5
|
|
|
6
6
|
setuptools.setup(
|
|
7
7
|
name="mathjson-solver",
|
|
8
|
-
version="1.
|
|
8
|
+
version="1.17.0",
|
|
9
9
|
author="Martins Mednis",
|
|
10
10
|
author_email="mrt@mednis.info",
|
|
11
11
|
description="Utilities for MathJSON evaluation",
|
|
@@ -15,9 +15,9 @@ setuptools.setup(
|
|
|
15
15
|
project_urls={
|
|
16
16
|
"Bug Tracker": "https://github.com/LongenesisLtd/mathjson-solver/issues",
|
|
17
17
|
},
|
|
18
|
+
license_expr="MIT",
|
|
18
19
|
classifiers=[
|
|
19
20
|
"Programming Language :: Python :: 3",
|
|
20
|
-
"License :: OSI Approved :: MIT License",
|
|
21
21
|
"Operating System :: OS Independent",
|
|
22
22
|
],
|
|
23
23
|
package_dir={"": "src"},
|
|
@@ -70,6 +70,16 @@ def _CumulativeProduct(l: list) -> list:
|
|
|
70
70
|
return res
|
|
71
71
|
|
|
72
72
|
|
|
73
|
+
def _CumulativeSum(l: list) -> list:
|
|
74
|
+
res = []
|
|
75
|
+
for i, x in enumerate(l):
|
|
76
|
+
if i == 0:
|
|
77
|
+
res.append(x)
|
|
78
|
+
else:
|
|
79
|
+
res.append(reduce(lambda a, b: a + b, l[: i + 1]))
|
|
80
|
+
return res
|
|
81
|
+
|
|
82
|
+
|
|
73
83
|
def find_interpolation_bounds_indexes(
|
|
74
84
|
l: list, target: int | float
|
|
75
85
|
) -> Union[Union[int, float], tuple[Union[int, float], Union[int, float]]]:
|
|
@@ -374,6 +384,12 @@ def create_mathjson_solver(solver_parameters):
|
|
|
374
384
|
def Float(s):
|
|
375
385
|
return float(f(s[1], c))
|
|
376
386
|
|
|
387
|
+
def Floor(s):
|
|
388
|
+
return math.floor(f(s[1], c))
|
|
389
|
+
|
|
390
|
+
def Ceil(s):
|
|
391
|
+
return math.ceil(f(s[1], c))
|
|
392
|
+
|
|
377
393
|
def Constants(s):
|
|
378
394
|
for x in s[1:-1]:
|
|
379
395
|
c[x[0]] = f(x[1], c)
|
|
@@ -629,6 +645,26 @@ def create_mathjson_solver(solver_parameters):
|
|
|
629
645
|
except TypeError:
|
|
630
646
|
return False
|
|
631
647
|
|
|
648
|
+
def BooleanAnd(s):
|
|
649
|
+
"""
|
|
650
|
+
Boolean AND operation.
|
|
651
|
+
["And", condition1, condition2, ...]
|
|
652
|
+
"""
|
|
653
|
+
for x in s[1:]:
|
|
654
|
+
if not f(x, c):
|
|
655
|
+
return False
|
|
656
|
+
return True
|
|
657
|
+
|
|
658
|
+
def BooleanOr(s):
|
|
659
|
+
"""
|
|
660
|
+
Boolean OR operation.
|
|
661
|
+
["Or", condition1, condition2, ...]
|
|
662
|
+
"""
|
|
663
|
+
for x in s[1:]:
|
|
664
|
+
if f(x, c):
|
|
665
|
+
return True
|
|
666
|
+
return False
|
|
667
|
+
|
|
632
668
|
# sin, cos, tan, arcsin, arccos, arctan
|
|
633
669
|
def Sin(s):
|
|
634
670
|
return math.sin(f(s[1], c))
|
|
@@ -840,6 +876,18 @@ def create_mathjson_solver(solver_parameters):
|
|
|
840
876
|
return ["Array"] + _CumulativeProduct(array)
|
|
841
877
|
# return _CumulativeProduct(array)
|
|
842
878
|
|
|
879
|
+
def CumulativeSum(s):
|
|
880
|
+
"""
|
|
881
|
+
["CumulativeSum", array]
|
|
882
|
+
The `array` must be an array of numeric values.
|
|
883
|
+
"""
|
|
884
|
+
array = f(s[1], c)
|
|
885
|
+
if not (isinstance(array, list) and array[0] == "Array"):
|
|
886
|
+
raise ValueError("Parameter 1 must be an array.")
|
|
887
|
+
array = [f(x, c) for x in array[1:]]
|
|
888
|
+
return ["Array"] + _CumulativeSum(array)
|
|
889
|
+
# return
|
|
890
|
+
|
|
843
891
|
def Interp(s):
|
|
844
892
|
"""
|
|
845
893
|
["Interp", x_array, y_array, target_x]
|
|
@@ -900,6 +948,49 @@ def create_mathjson_solver(solver_parameters):
|
|
|
900
948
|
|
|
901
949
|
# return total_area
|
|
902
950
|
|
|
951
|
+
def Reduce(s):
|
|
952
|
+
"""
|
|
953
|
+
["Reduce", list, initial_value, function, str_name_of_accumulator, str_name_of_current, str_name_of_index]
|
|
954
|
+
"""
|
|
955
|
+
the_list = f(s[1], c)[1:]
|
|
956
|
+
initial_value = f(s[2], c)
|
|
957
|
+
function_expression = s[3]
|
|
958
|
+
|
|
959
|
+
_accumulator = s[4]
|
|
960
|
+
name_accumulator = _accumulator[1]
|
|
961
|
+
|
|
962
|
+
_current = s[5]
|
|
963
|
+
name_current = _current[1]
|
|
964
|
+
|
|
965
|
+
_index = s[6]
|
|
966
|
+
name_index = _index[1]
|
|
967
|
+
|
|
968
|
+
c[name_accumulator] = initial_value
|
|
969
|
+
|
|
970
|
+
for i, x in enumerate(the_list):
|
|
971
|
+
c[name_current] = x
|
|
972
|
+
c[name_index] = i
|
|
973
|
+
c[name_accumulator] = f(function_expression, c)
|
|
974
|
+
|
|
975
|
+
return c[name_accumulator]
|
|
976
|
+
|
|
977
|
+
def Appended(s):
|
|
978
|
+
"""
|
|
979
|
+
["Appended", array, value]
|
|
980
|
+
The `array` must be an array of values.
|
|
981
|
+
The `value` is the value to append to the array.
|
|
982
|
+
"""
|
|
983
|
+
array = f(s[1], c)
|
|
984
|
+
|
|
985
|
+
if not (isinstance(array, list) and array[0] == "Array"):
|
|
986
|
+
raise ValueError("Parameter 1 must be an array.")
|
|
987
|
+
|
|
988
|
+
value = f(s[2], c)
|
|
989
|
+
|
|
990
|
+
array = [x for x in array[1:]]
|
|
991
|
+
array.append(value)
|
|
992
|
+
return ["Array"] + array
|
|
993
|
+
|
|
903
994
|
constructs = {
|
|
904
995
|
"Sum": Sum,
|
|
905
996
|
"Add": Add,
|
|
@@ -939,6 +1030,8 @@ def create_mathjson_solver(solver_parameters):
|
|
|
939
1030
|
# "NotEqual": lambda s: f(s[1], c) != f(s[2], c),
|
|
940
1031
|
"NotEqual": lambda s: comparison_safe_converter(f(s[1], c))
|
|
941
1032
|
!= comparison_safe_converter(f(s[2], c)),
|
|
1033
|
+
"And": BooleanAnd,
|
|
1034
|
+
"Or": BooleanOr,
|
|
942
1035
|
"Abs": lambda s: abs(f(s[1], c)),
|
|
943
1036
|
"Round": lambda s: (
|
|
944
1037
|
round(f(s[1], c), f(s[2], c))
|
|
@@ -964,6 +1057,8 @@ def create_mathjson_solver(solver_parameters):
|
|
|
964
1057
|
"ContainsNoneOf": Contains_none_of,
|
|
965
1058
|
"Int": Int,
|
|
966
1059
|
"Float": Float,
|
|
1060
|
+
"Floor": Floor,
|
|
1061
|
+
"Ceil": Ceil,
|
|
967
1062
|
"Str": Str,
|
|
968
1063
|
"Not": Not,
|
|
969
1064
|
# "IsDefined": lambda s: s[1] in c,
|
|
@@ -992,9 +1087,12 @@ def create_mathjson_solver(solver_parameters):
|
|
|
992
1087
|
"AtIndex": AtIndex,
|
|
993
1088
|
"Slice": Slice,
|
|
994
1089
|
"CumulativeProduct": CumulativeProduct,
|
|
1090
|
+
"CumulativeSum": CumulativeSum,
|
|
995
1091
|
"Interp": Interp,
|
|
996
1092
|
"FindIntervalIndex": FindIntervalIndex,
|
|
997
1093
|
"TrapezoidalIntegrate": TrapezoidalIntegrate,
|
|
1094
|
+
"Reduce": Reduce,
|
|
1095
|
+
"Appended": Appended,
|
|
998
1096
|
"Sin": Sin,
|
|
999
1097
|
"Cos": Cos,
|
|
1000
1098
|
"Tan": Tan,
|
|
@@ -1066,6 +1164,8 @@ def extract_variables(s: Union[list, int, float, str], li: set, ignore_list: set
|
|
|
1066
1164
|
"Less",
|
|
1067
1165
|
"LessEqual",
|
|
1068
1166
|
"NotEqual",
|
|
1167
|
+
"And",
|
|
1168
|
+
"Or",
|
|
1069
1169
|
"Abs",
|
|
1070
1170
|
"Round",
|
|
1071
1171
|
"Max",
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mathjson-solver
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.17.0
|
|
4
4
|
Summary: Utilities for MathJSON evaluation
|
|
5
5
|
Home-page: https://github.com/LongenesisLtd/mathjson-solver
|
|
6
6
|
Author: Martins Mednis
|
|
7
7
|
Author-email: mrt@mednis.info
|
|
8
8
|
Project-URL: Bug Tracker, https://github.com/LongenesisLtd/mathjson-solver/issues
|
|
9
9
|
Classifier: Programming Language :: Python :: 3
|
|
10
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
11
10
|
Classifier: Operating System :: OS Independent
|
|
12
11
|
Requires-Python: >=3.6
|
|
13
12
|
Description-Content-Type: text/markdown
|
|
@@ -33,8 +32,6 @@ A reliable Python library for numerically evaluating mathematical expressions in
|
|
|
33
32
|
|
|
34
33
|
**What is MathJSON?** MathJSON represents mathematical expressions as JSON arrays, like `["Add", 1, 2, 3]` for 1+2+3. This format is safe, structured, and easy to generate programmatically.
|
|
35
34
|
|
|
36
|
-
Inspired by [CortexJS Compute Engine](https://cortexjs.io/compute-engine/) though designed as an independent implementation focused on our specific use cases.
|
|
37
|
-
|
|
38
35
|
## Table of Contents
|
|
39
36
|
- [Installation](#installation)
|
|
40
37
|
- [Quick Start](#quick-start)
|
|
@@ -80,21 +77,32 @@ except MathJSONException as e:
|
|
|
80
77
|
# Math error: Problem in Divide. ['Divide', 1, 0]. division by zero
|
|
81
78
|
```
|
|
82
79
|
|
|
80
|
+
**Think Functional:** MathJSON Solver embraces functional programming principles. Instead of writing loops and modifying variables, you compose expressions that transform data. Functions like `Map`, `Reduce`, and `Filter` let you process arrays elegantly, while immutable operations ensure predictable, side-effect-free calculations. Don't worry if you're new to functional programming — the examples will guide you naturally into this powerful paradigm.
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
# Functional approach: transform data with expressions
|
|
84
|
+
solver(["Map", ["Array", 1, 2, 3, 4], ["Multiply"], 2]) # [2, 4, 6, 8]
|
|
85
|
+
solver(["Reduce", ["Array", 1, 2, 3, 4], 0, ["Add", "acc", "item"],
|
|
86
|
+
["Variable", "acc"], ["Variable", "item"], ["Variable", "i"]]) # 10
|
|
87
|
+
```
|
|
88
|
+
|
|
83
89
|
## Supported Operations
|
|
84
90
|
|
|
85
91
|
The library supports a comprehensive set of mathematical operations:
|
|
86
92
|
|
|
87
|
-
* **Arithmetic:** Add, Sum, Subtract, Multiply, Divide, Negate, Power, Square, Root, Sqrt, Abs, Round
|
|
93
|
+
* **Arithmetic:** Add, Sum, Subtract, Multiply, Divide, Negate, Power, Square, Root, Sqrt, Abs, Round, Floor, Ceil
|
|
88
94
|
* **Trigonometry:** Sin, Cos, Tan, Arcsin, Arccos, Arctan
|
|
89
95
|
* **Logarithms:** Log, Log2, Log10, Exp
|
|
90
96
|
* **Comparison:** Equal, StrictEqual, NotEqual, Greater, GreaterEqual, Less, LessEqual
|
|
91
|
-
* **Logic & Sets:** Any, All, Not, In, NotIn, ContainsAnyOf, ContainsAllOf, ContainsNoneOf
|
|
97
|
+
* **Logic & Sets:** Any, All, Not, And, Or, In, NotIn, ContainsAnyOf, ContainsAllOf, ContainsNoneOf
|
|
92
98
|
* **Statistics:** Average, Max, Min, Median, Length
|
|
93
|
-
* **
|
|
99
|
+
* **Functional Programming:** Map, Reduce, Filter
|
|
100
|
+
* **Arrays:** Array creation, GenerateRange, AtIndex, Slice, Appended, CumulativeSum, CumulativeProduct
|
|
94
101
|
* **Control Flow:** If statements, Switch-Case, Constants definition
|
|
95
102
|
* **Type Conversion:** Int, Float, Str, IsDefined
|
|
96
|
-
* **Date/Time:** Strptime, Strftime, Today, Now, TimeDelta functions
|
|
97
|
-
* **
|
|
103
|
+
* **Date/Time:** Strptime, Strftime, Today, Now, TimeDelta functions (Weeks, Days, Hours, Minutes)
|
|
104
|
+
* **Integration:** TrapezoidalIntegrate (requires numpy), Interp, FindIntervalIndex, Variable references
|
|
105
|
+
* **Advanced:** HasMatchingSublist for pattern matching
|
|
98
106
|
* **Constants:** Pi
|
|
99
107
|
|
|
100
108
|
[View complete documentation with examples →](https://github.com/LongenesisLtd/mathjson-solver/blob/main/docs/README.md)
|
|
@@ -161,6 +169,10 @@ We welcome contributions! Please feel free to:
|
|
|
161
169
|
|
|
162
170
|
[View license information](https://github.com/LongenesisLtd/mathjson-solver/blob/main/LICENSE)
|
|
163
171
|
|
|
172
|
+
## References
|
|
173
|
+
|
|
174
|
+
This implementation was inspired by the [CortexJS Compute Engine](https://cortexjs.io/compute-engine/), though designed as an independent implementation focused on our specific use cases.
|
|
175
|
+
|
|
164
176
|
---
|
|
165
177
|
|
|
166
178
|
Made with ❤️ by [Longenesis](https://longenesis.com/team)
|
|
@@ -9,18 +9,24 @@ src/mathjson_solver.egg-info/PKG-INFO
|
|
|
9
9
|
src/mathjson_solver.egg-info/SOURCES.txt
|
|
10
10
|
src/mathjson_solver.egg-info/dependency_links.txt
|
|
11
11
|
src/mathjson_solver.egg-info/top_level.txt
|
|
12
|
-
tests/test_CumulativeProduct.py
|
|
13
|
-
tests/test_Slice.py
|
|
14
12
|
tests/test_TrapezoidalIntegratel.py
|
|
15
13
|
tests/test_atindex.py
|
|
14
|
+
tests/test_cumulative.py
|
|
16
15
|
tests/test_equal.py
|
|
17
16
|
tests/test_exceptions.py
|
|
18
17
|
tests/test_extract_variables.py
|
|
19
18
|
tests/test_findinterval.py
|
|
20
19
|
tests/test_gail_model.py
|
|
20
|
+
tests/test_gail_model_nci_validated_no_beta.py
|
|
21
|
+
tests/test_gail_model_nci_validated_with_beta.py
|
|
21
22
|
tests/test_interpolate.py
|
|
23
|
+
tests/test_nci_discrete_implementation_no_beta.py
|
|
24
|
+
tests/test_nci_discrete_implementation_with_beta.py
|
|
22
25
|
tests/test_range.py
|
|
26
|
+
tests/test_reduce_simple.py
|
|
23
27
|
tests/test_scalars.py
|
|
24
28
|
tests/test_sets.py
|
|
25
29
|
tests/test_simple_cases.py
|
|
30
|
+
tests/test_slice.py
|
|
31
|
+
tests/test_state_tuples_reduce.py
|
|
26
32
|
tests/test_with_pytest.py
|
|
@@ -16,3 +16,14 @@ def test_CumulativeProduct1():
|
|
|
16
16
|
solver = create_solver(parameters)
|
|
17
17
|
# assert solver(expression) == expected_result
|
|
18
18
|
assert solver(expression) == expected_result
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_CumulativeSum1():
|
|
22
|
+
parameters = {"test_array": ["Array", 1, 2, 3, 4, 5]}
|
|
23
|
+
|
|
24
|
+
expression = ["CumulativeSum", "test_array"]
|
|
25
|
+
|
|
26
|
+
expected_result = ["Array", 1, 3, 6, 10, 15]
|
|
27
|
+
solver = create_solver(parameters)
|
|
28
|
+
# assert solver(expression) == expected_result
|
|
29
|
+
assert solver(expression) == expected_result
|
|
@@ -43,6 +43,11 @@ from mathjson_solver import create_solver
|
|
|
43
43
|
({}, ["NotEqual", 1, 2], True),
|
|
44
44
|
({}, ["NotEqual", "aaa", "bbb"], True),
|
|
45
45
|
({}, ["NotEqual", "aaa", 0], True),
|
|
46
|
+
({}, ["And", True, True], True),
|
|
47
|
+
({}, ["And", True, False], False),
|
|
48
|
+
({}, ["Or", True, False], True),
|
|
49
|
+
({}, ["Or", True, True], True),
|
|
50
|
+
({}, ["Or", False, False], False),
|
|
46
51
|
],
|
|
47
52
|
)
|
|
48
53
|
def test_solver_comparison(parameters, expression, expected_result):
|