Skip to main content

Step-by-step mathematics solver built on SymPy — equations, calculus, and annotated rules.

Project description

SmartSolver

SmartSolver is a step-by-step mathematics engine built on SymPy. It powers worked solutions inside Ed-Master — showing not just the final answer, but the rules and identities applied along the way.

The implementation lives in math_step_tracker.py (class SmartSolver).


Features

Area What SmartSolver shows
Equations Linear & quadratic solving, discriminant steps
Linear algebra Augmented matrix setup, row swaps/scaling/elimination, RREF, back substitution
Trigonometry Quotient, Pythagorean, double-angle identities; tan reduction
Logarithms & exponentials Log product/power rules, log(x) = c → x = e^c, a^x = b
Differentiation Sum, product, power, chain rule labels
Multivariable calculus Partial derivatives, gradient vectors, multiple integrals (definite bounds)
Integration Partial fractions, LIATE-based integration by parts, direct rules
Limits Setup, direct substitution where valid, final limit
Partial fractions Factor denominator, decompose, integrate term-by-term

Each step includes a description, expression, LaTeX, and rule applied.


Requirements

  • Python 3.10+ (requires-python in pyproject.toml)
  • SymPy ≥ 1.13

Supported Python versions

Status Versions
Minimum Python 3.10
Tested Python 3.10, 3.11, 3.12, 3.13

Only list versions you actually test. Do not claim support for unreleased major versions (e.g. Python 3.x ).

pip install ed-master-smartsolver

Import in Python (package module name is smartsolver):

from smartsolver import SmartSolver

Or install SymPy only when using from source:

pip install sympy

Quick start

from smartsolver import SmartSolver, StepRenderer, serialize_solver_result

solver = SmartSolver()

# Solve a quadratic
result = solver.solve_equation("x^2 + 5x + 6 = 0", "x")
print(StepRenderer.to_text(result["steps"]))
print("Solutions:", result["solutions"])

# JSON-friendly payload (for APIs)
payload = serialize_solver_result(result)
print(payload["steps_latex"])

When running from a git checkout (editable install):

pip install -e .
from smartsolver import SmartSolver

Input notation

SmartSolver accepts student-style strings:

You type Parsed as
x^2 or x**2 x squared
5x 5*x
2x - 4 2x - 4 = 0 (equation assumed zero)
sin(x), cos(x), log(x) SymPy trig / natural log
2**x exponential

Operations

solve_equation(equation, variable='x')

Solve an equation with step-by-step working.

solver.solve_equation("sin(x) - cos(x) = 0", "x")
solver.solve_equation("2**x - 8 = 0", "x")
solver.solve_equation("log(x) - 3 = 0", "x")

Returns: steps, solutions, solution_latex


differentiate(expression, variable='x', order=1)

Differentiate with rule labels (sum, power, chain, etc.).

solver.differentiate("x**2 + 3*x", "x")
solver.differentiate("sin(x)**2", "x", order=1)

Returns: steps, derivative, derivative_latex


integrate(expression, variable='x', lower=None, upper=None)

Integrate with method tracking.

solver.integrate("x*exp(x)", "x")           # integration by parts (LIATE)
solver.integrate("1/(x**2 - 1)", "x")      # partial fractions
solver.integrate("x**2", "x", lower="0", upper="1")  # definite

Returns: steps, integral, integral_latex, methods (e.g. ['Integration by parts'])


partial_fractions(expression, variable='x')

Decompose a rational expression without integrating.

solver.partial_fractions("(2*x + 3)/((x - 1)*(x + 2))")

Returns: steps, decomposition, decomposition_latex


limit(expression, variable='x', point='0', direction='+')

Evaluate a limit with setup steps.

solver.limit("sin(x)/x", "x", point="0", direction="+")

Returns: steps, limit, limit_latex


solve_linear_system(equations, variables)

Solve a linear system with Gaussian elimination (augmented matrix, row operations, RREF, back substitution).

solver.solve_linear_system(
    ["2x + 3y = 7", "x - y = 1"],
    ["x", "y"],
)
# equations can also be one string separated by newlines or semicolons
solver.solve_linear_system("2x + 3y = 7; x - y = 1", ["x", "y"])

Returns: steps, solutions, solutions_by_variable, solution_latex, rref, rref_latex, consistent


matrix_rref(matrix)

Row-reduce a matrix to reduced row echelon form with step-by-step row operations.

solver.matrix_rref("Matrix([[2, 4, 6], [1, 3, 5]])")
solver.matrix_rref([[1, 2, 3], [0, 1, 4]])

Returns: steps, matrix, matrix_latex


partial_derivative(expression, wrt, variables=None, order=1)

Partial derivative holding other variables constant.

solver.partial_derivative("x*y + y^2", "x", ["x", "y"])
solver.partial_derivative("x^2*y", "y", ["x", "y"], order=2)

Returns: steps, derivative, derivative_latex


gradient(expression, variables)

Gradient vector of partial derivatives.

solver.gradient("x^2 + x*y", ["x", "y"])

Returns: steps, gradient, gradient_latex


integrate_multivariable(expression, variables, bounds=None)

Multiple integration over listed variables. Pass bounds for definite integrals.

solver.integrate_multivariable("x*y", ["x", "y"], {"x": (0, 1), "y": (0, 2)})
solver.integrate_multivariable("x + y", ["x", "y"])  # indefinite

Returns: steps, integral, integral_latex


Helper utilities

from smartsolver import (
    StepRenderer,
    serialize_solver_result,
    normalize_math_input,
    parse_math,
    step_to_dict,
)

# Human-readable steps
StepRenderer.to_text(steps)
StepRenderer.to_latex(steps)
StepRenderer.to_html(steps)

# API / JSON serialization
serialize_solver_result(result)

Optional helpers (Ed-Master Math Lab)

If you also ship edmathlab.py alongside this package, it provides stdout-friendly wrappers. They are not included in the PyPI wheel by default.


REST API (Ed-Master platform)

When the Django backend is running, authenticated users can call:

POST /api/math/steps/
Content-Type: application/json

Body:

{
  "operation": "solve",
  "expression": "x^2 + 5x + 6 = 0",
  "variable": "x"
}

Operations: solve, differentiate, integrate, limit, partial_fractions

Response fields: steps, steps_text, steps_html, steps_latex, result, result_latex, operation

Requires a signed-in Ed-Master session (JWT cookie).


Result structure

Each step is a Step dataclass:

@dataclass
class Step:
    description: str   # e.g. "Apply the quotient identity"
    expression: str    # SymPy string at this step
    latex: str         # LaTeX rendering
    rule_applied: str  # e.g. "Quotient identity", "LIATE: choose u"
    substeps: list     # nested steps (reserved)

serialize_solver_result() flattens this for JSON APIs and adds rendered steps_text, steps_html, and steps_latex.


Example session

from smartsolver import SmartSolver, StepRenderer

s = SmartSolver()

print("=== Quadratic ===")
r = s.solve_equation("x^2 + 5x + 6 = 0")
print(StepRenderer.to_text(r["steps"]))

print("=== Trig ===")
r = s.solve_equation("sin(x) - cos(x) = 0")
print(StepRenderer.to_text(r["steps"]))

print("=== Integration by parts ===")
r = s.integrate("x*exp(x)")
print(StepRenderer.to_text(r["steps"]))
print("Answer:", r["integral"])
print("Methods:", r["methods"])

Scope & limitations

SmartSolver is designed for education, not as a replacement for a full computer algebra system.

  • Trig: covers common identities and reduction; general periodic solution sets are simplified.
  • Logs: strongest on combinable logs and log(f(x)) = constant forms.
  • Partial fractions: requires a proper rational form; improper rationals use polynomial division first.
  • Integration by parts: one LIATE-guided pass; does not recurse automatically.
  • u-substitution: basic patterns only.

SymPy still performs the underlying symbolic work; SmartSolver adds annotated steps around it.


Running tests

pip install -e ".[dev]"
python -m unittest discover -s tests -v

Or a quick smoke test:

python -c "from smartsolver import SmartSolver; print(SmartSolver().solve_equation('x-2=0')['solutions'])"

Project layout

.                            # repository root (this folder)
├── __init__.py              # public exports
├── math_step_tracker.py     # SmartSolver core
├── README.md
├── LICENSE
├── pyproject.toml           # PEP 517 build (no setup.py)
└── tests/
    └── test_smartsolver.py

Roadmap

  • PyPI packaging scaffold (ed-master-smartsolver)
  • Recursive integration by parts
  • Richer trig general solutions
  • Public “Try SmartSolver” demo page on Ed-Master

Links


License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ed_master_smartsolver-0.2.0.tar.gz (17.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ed_master_smartsolver-0.2.0-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

Details for the file ed_master_smartsolver-0.2.0.tar.gz.

File metadata

  • Download URL: ed_master_smartsolver-0.2.0.tar.gz
  • Upload date:
  • Size: 17.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ed_master_smartsolver-0.2.0.tar.gz
Algorithm Hash digest
SHA256 dff4cd4be68b6734104562f52999870c30ef58b6930acd7b74bc4f475cac72ca
MD5 fe0d3515ba7824461560529274ceca97
BLAKE2b-256 3f69aae06e0efa27c79b5cd512dddbcd62dc7ac771aa59a51ff84557434de879

See more details on using hashes here.

Provenance

The following attestation bundles were made for ed_master_smartsolver-0.2.0.tar.gz:

Publisher: publish.yml on mngadilinda/SmartSolver

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ed_master_smartsolver-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ed_master_smartsolver-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7a3f1263f765ede59e86bf3a03571d9aff21bc72bd38add7cbb1787c138219c2
MD5 472ebbee6b91994024fa7e8d9824315f
BLAKE2b-256 b9365e3c3aebe328f90e41843b3cd3884fc0420d7f778a4ec620252f654febe2

See more details on using hashes here.

Provenance

The following attestation bundles were made for ed_master_smartsolver-0.2.0-py3-none-any.whl:

Publisher: publish.yml on mngadilinda/SmartSolver

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page