mathai 0.3.9__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.
mathai/base.py CHANGED
@@ -290,6 +290,8 @@ def flatten_tree(node):
290
290
  node.children = [flatten_tree(child) for child in node.children]
291
291
  return node
292
292
  def dowhile(eq, fx):
293
+ if eq is None:
294
+ return None
293
295
  while True:
294
296
  orig = eq.copy_tree()
295
297
  eq2 = fx(eq)
mathai/integrate.py CHANGED
@@ -132,7 +132,7 @@ def inteq(eq):
132
132
  def rm(eq):
133
133
  if eq.name == "f_try":
134
134
  eq = TreeNode(eq.name, list(set(eq.children)))
135
- return TreeNode(eq.name, [rm(child) for child in eq.children])
135
+ return TreeNode(eq.name, [rm(child) for child in eq.children if child is not None])
136
136
  def solve_integrate(eq):
137
137
 
138
138
  eq2 = dowhile(eq, _solve_integrate)
@@ -296,7 +296,7 @@ def _sqint(equation):
296
296
  return coll
297
297
 
298
298
  def sqint(eq):
299
- out = _sqint(eq)
299
+ out = simplify(_sqint(eq))
300
300
  if out is None:
301
301
  return eq
302
302
  return out
mathai/search.py ADDED
@@ -0,0 +1,117 @@
1
+ from mathai import *
2
+ import copy
3
+ from concurrent.futures import ThreadPoolExecutor, TimeoutError
4
+
5
+ def dfs_simplify(equation, functions, true_expr, false_expr,
6
+ max_timeout=25, max_small=4,
7
+ base_timeout=1, time_per_char=0.1, timeout_increase=0.5):
8
+ """
9
+ Perform DFS simplification on a given equation using provided functions.
10
+
11
+ Args:
12
+ equation: The starting expression (TreeNode or parsed equation)
13
+ functions: List of simplification functions
14
+ true_expr: Expression representing True (immediate termination)
15
+ false_expr: Expression representing False (immediate termination)
16
+ max_timeout: Maximum timeout allowed for any function
17
+ max_small: Number of smallest expressions to track
18
+ base_timeout: Base timeout in seconds
19
+ time_per_char: Additional timeout per character of expression
20
+ timeout_increase: Factor to increase timeout for consecutive timeouts
21
+
22
+ Returns:
23
+ tuple(found_boolean, boolean_path, smallest_expressions)
24
+ """
25
+ original_eq = simplify(equation)
26
+ smallest_four = []
27
+
28
+ stack = [(copy.deepcopy(original_eq), [copy.deepcopy(original_eq)])]
29
+ visited = set()
30
+
31
+ found_boolean = False
32
+ boolean_path = None
33
+ boolean_expr = None
34
+
35
+ executor = ThreadPoolExecutor(max_workers=3)
36
+ consecutive_timeouts = 0
37
+
38
+ while stack and not found_boolean:
39
+ current_eq, path = stack.pop()
40
+ expr_str = str(current_eq)
41
+
42
+ if expr_str in visited:
43
+ continue
44
+ visited.add(expr_str)
45
+
46
+ # Thinking message
47
+ printeq(current_eq)
48
+
49
+ # Immediate termination using predicate functions
50
+ if true_expr(current_eq):
51
+ found_boolean = True
52
+ boolean_path = path
53
+ boolean_expr = current_eq
54
+ break
55
+ if false_expr(current_eq):
56
+ found_boolean = True
57
+ boolean_path = path
58
+ boolean_expr = current_eq
59
+ break
60
+
61
+
62
+ # Insert into smallest_four if qualifies
63
+ inserted = False
64
+ for j in range(len(smallest_four)):
65
+ if len(expr_str) < len(str(smallest_four[j][0])):
66
+ smallest_four.insert(j, (copy.deepcopy(current_eq), copy.deepcopy(path)))
67
+ inserted = True
68
+ break
69
+ if not inserted and len(smallest_four) < max_small:
70
+ smallest_four.append((copy.deepcopy(current_eq), copy.deepcopy(path)))
71
+ if len(smallest_four) > max_small:
72
+ smallest_four = smallest_four[:max_small]
73
+
74
+ # Calculate adaptive timeout with cap
75
+ timeout = (base_timeout + time_per_char * len(expr_str)) * (1 + timeout_increase * consecutive_timeouts)
76
+ if timeout > max_timeout:
77
+ timeout = max_timeout
78
+
79
+ # Try functions that reduce length first
80
+ reduced_any = False
81
+ for fx in functions:
82
+ print(f"[Thinking] Executing {fx.__name__} on current expression (timeout={timeout:.2f}s):")
83
+ printeq(current_eq)
84
+ future = executor.submit(fx, current_eq)
85
+ try:
86
+ new_expr = future.result(timeout=timeout)
87
+ new_expr_str = str(new_expr)
88
+ if len(new_expr_str) <= len(expr_str) and new_expr_str != expr_str:
89
+ reduced_any = True
90
+ stack.append((new_expr, path + [copy.deepcopy(new_expr)]))
91
+ consecutive_timeouts = 0 # reset after success
92
+ except TimeoutError:
93
+ print(f"[Thinking] {fx.__name__} timed out, skipping.")
94
+ consecutive_timeouts += 1
95
+ continue
96
+
97
+ # If no reducing function worked, try growing functions
98
+ if not reduced_any:
99
+ for fx in functions:
100
+ print(f"[Thinking] Trying growing {fx.__name__} on current expression (timeout={timeout:.2f}s):")
101
+ printeq(current_eq)
102
+ future = executor.submit(fx, current_eq)
103
+ try:
104
+ new_expr = future.result(timeout=timeout)
105
+ new_expr_str = str(new_expr)
106
+ if new_expr_str != expr_str:
107
+ stack.append((new_expr, path + [copy.deepcopy(new_expr)]))
108
+ consecutive_timeouts = 0
109
+ break # only take one growing function
110
+ except TimeoutError:
111
+ print(f"[Thinking] {fx.__name__} (growing) timed out, skipping.")
112
+ consecutive_timeouts += 1
113
+ continue
114
+
115
+ executor.shutdown(wait=True)
116
+
117
+ return found_boolean, boolean_path, smallest_four
mathai/simplify.py CHANGED
@@ -287,7 +287,7 @@ def simplify(eq):
287
287
  else:
288
288
  eq = tree_form("d_0")
289
289
 
290
- if eq.name == "f_mul" and str_form(eq).count("f_pow")>1:
290
+ if eq.name == "f_mul":
291
291
  dic = {}
292
292
  for child in eq.children:
293
293
  head = child
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mathai
3
- Version: 0.3.9
3
+ Version: 0.4.1
4
4
  Summary: Mathematics solving Ai tailored to NCERT
5
5
  Home-page: https://github.com/infinity390/mathai4
6
6
  Author: educated indians are having a low iq and are good for nothing
@@ -1,24 +1,25 @@
1
1
  mathai/__init__.py,sha256=hxMCrvwj98yE5ChWSzvkn0gMxqAQnh8oze3ZlImWyD0,1170
2
2
  mathai/apart.py,sha256=8IlJ8X6SKAjPunUPHVLmgNB5GuEi4_XpY0oLkQqrHKc,3770
3
- mathai/base.py,sha256=zJqozbSeesbxw8YJ_eNXmaoy8K5VmkPHECnuAFGRvW4,12683
3
+ mathai/base.py,sha256=DBFHDBRSPeb8O2cH_YzTNG3h7vxrQzrEPSUpDIPCtPI,12724
4
4
  mathai/console.py,sha256=Sn58iwYE79MLEh67s8X3q6vZjw6g7f9XM1T8_dBBR2o,3048
5
5
  mathai/diff.py,sha256=YUBpRsz0qmBkq5vGxeGnvR4nMKjdOQiIXlNMxpij2ns,3051
6
6
  mathai/expand.py,sha256=SnBltkpIENMGkP0AYmbMlSc4H-CF5RslO2PcBEkn1BQ,3359
7
7
  mathai/factor.py,sha256=NPXxET52TacNExuvw6p1jbC6g3wY6_VOCdlGlexXZio,5916
8
8
  mathai/fraction.py,sha256=Q2ztsh5Bpz6YhML2QU0tfufbAs0Q6J319AhlzKephIY,4396
9
- mathai/integrate.py,sha256=OH_DqnbgoCx7e3gq4u1zEz9ABcaiUvH5t75ap67t4GI,15034
9
+ mathai/integrate.py,sha256=mKw_L8zccFifJINKLCFiYBrkgQM2qO_Pk8b2ShgxTa8,15065
10
10
  mathai/inverse.py,sha256=QCvDrzKquWsZv-BDAzZd9HnU0c3gZvcc44UztHVO5LQ,2919
11
11
  mathai/limit.py,sha256=RA8YAehgYCGVWv9qBc8uQ34BQ9mFthWl2OrVTwcHl2g,4920
12
12
  mathai/linear.py,sha256=BzSnm941Zlod_l6hON4Rs6J4pdAA3MGpRVqr6-66ZBk,5524
13
13
  mathai/logic.py,sha256=UvHzRmKcO9AD51tRzHmpNSEhgW5gmaf4XPaQKFjGfC4,9653
14
14
  mathai/parser.py,sha256=f7bemieFmp0sbup1NlraMLvZDVFvqKGFknEVtlFRMVk,6979
15
15
  mathai/printeq.py,sha256=gIes-pstFOa6FcnpVIVvkjVKuWdsVdo11LlEnmHhakU,1303
16
- mathai/simplify.py,sha256=4gJgEh7fmwJ3aKMliB4d1NalGAx9duIYA7bGAIYUX2Y,15858
16
+ mathai/search.py,sha256=6S_V0PrC2ZnbhkWyT2ZTtExRD_mDlo-C3p0TDn6Dk3w,4743
17
+ mathai/simplify.py,sha256=qG23MRyVLjJL_8Xk5n4Z596bjihFvZg_zKtIvOqrLIk,15824
17
18
  mathai/structure.py,sha256=4Ww2IAx62RcQSO7_17TZES-DjMWBpcFQtL939FBIHwY,4103
18
19
  mathai/tool.py,sha256=UyccamiJy_CkFPakfufyPzdhtlEO6v2D7qwbXQ9V7Rg,2000
19
20
  mathai/trig.py,sha256=Zadw-uTJaMfoXwxuiio7QYHWgPxezEP2xZ2fr__PFM0,10290
20
21
  mathai/univariate_inequality.py,sha256=_r-kkiS4Hr-jRN7f-EL_E4svAMFWJP1Ea50HJKKbjfk,14778
21
- mathai-0.3.9.dist-info/METADATA,sha256=sWapzjSv4xLp5xqwXkpt0_lqv32BcPNlQvpYmwi1tiU,7021
22
- mathai-0.3.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
23
- mathai-0.3.9.dist-info/top_level.txt,sha256=ROP4l3OhGYw3ihkQGASr18xM9GsK4z3_6whV5AyXLwE,7
24
- mathai-0.3.9.dist-info/RECORD,,
22
+ mathai-0.4.1.dist-info/METADATA,sha256=m5N3sDp8R2_3ffySHyzvmo4YDpxYq6dT3FXUfkerCco,7021
23
+ mathai-0.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
24
+ mathai-0.4.1.dist-info/top_level.txt,sha256=ROP4l3OhGYw3ihkQGASr18xM9GsK4z3_6whV5AyXLwE,7
25
+ mathai-0.4.1.dist-info/RECORD,,
File without changes