GraphMate / backend /solver.py
Advay-Singh's picture
Upload 10 files
4bd99f3 verified
import re
import sympy as sp
import random
class LinearSolverEngine:
def __init__(self, lhs, rhs, n=3):
self.lhs_raw = lhs
self.rhs_raw = rhs
self.n = n
def _clean_string(self, text):
text = text.lower().replace(" ", "")
text = re.sub(r'(\d)([a-z])', r'\1*\2', text)
return text
def run(self):
lhs_c = self._clean_string(self.lhs_raw)
rhs_c = self._clean_string(self.rhs_raw)
lhs_expr = sp.sympify(lhs_c)
rhs_expr = sp.sympify(rhs_c)
full_eq = sp.Eq(lhs_expr, rhs_expr)
vars_found = sorted(list(full_eq.free_symbols), key=lambda x: x.name)
if len(vars_found) < 2:
return "Please enter an equation with 2 variables (e.g., x - v = 6)", [], "N/A"
input_var = vars_found[0]
target_var = vars_found[1]
points = [1, 3, 5]
random.shuffle(points)
solutions_data = []
steps = f"Given equation: {self.lhs_raw} = {self.rhs_raw}\n\n"
for i, val in enumerate(points, 1):
subbed_eq = full_eq.subs(input_var, val)
plugged_in_str = re.sub(rf'\b{input_var}\b', f"({val})", lhs_c)
target_value = sp.solve(subbed_eq, target_var)[0]
isolated_rhs = sp.solve(subbed_eq, target_var, dict=True)[0][target_var]
steps += f"Solution number {i}:\n"
steps += f"Step A: Let's take {input_var} as {val}\n"
steps += f"Step B: Plug it in: {plugged_in_str} = {rhs_c}\n"
steps += f"Step C: Simplify and solve for {target_var}...\n"
# The "Human-like" math breakdown
steps += f"{target_var} = {isolated_rhs}\n"
steps += f"Result: When {input_var} = {val}, then {target_var} = {target_value}\n"
steps += f"Point: ({val}, {target_value})\n\n"
solutions_data.append((float(val), float(target_value)))
return steps, solutions_data, input_var