Skip to content

mathy_core

Mathy Core

Parse text into trees, visualize them, and make them dance by your rules.

Package version

Mathy includes a Computer Algebra System (or CAS). Its job is to turn text into math trees that can be examined and manipulated by a multi-step process:

  1. Tokenize the text into a list of type/value pairs
  2. Parse the token list into an Expression tree
  3. Modify the tree by applying a transformation rule to it.

Requirements

  • Python 3.6+

Installation

$ pip install mathy_core

Examples

Arithmetic

To understand how Mathy's CAS components work, let's add some numbers and assert that the result is what we think it should be.

Open Example In Colab

from mathy_core import ExpressionParser

expression = ExpressionParser().parse("4 + 2")
assert expression.evaluate() == 6

Variables Evaluation

Mathy can also deal with expressions that have variables.

When an expression has variables in it, you can evaluate it by providing the "context" to use:

Open Example In Colab

from mathy_core import ExpressionParser, MathExpression

expression: MathExpression = ExpressionParser().parse("4x + 2y")
assert expression.evaluate({"x": 2, "y": 5}) == 18

Tree Transformations

Mathy can also transform the parsed Expression trees using rules that change the tree structure without altering the value it outputs when you call evaluate().

Open Example In Colab

from mathy_core import ExpressionParser
from mathy_core.rules import DistributiveFactorOutRule

input = "4x + 2x"
output = "(4 + 2) * x"
parser = ExpressionParser()

input_exp = parser.parse(input)
output_exp = parser.parse(output)

# Verify that the rule transforms the tree as expected
change = DistributiveFactorOutRule().apply_to(input_exp)
assert str(change.result) == output

# Verify that both trees evaluate to the same value
ctx = {"x": 3}
assert input_exp.evaluate(ctx) == output_exp.evaluate(ctx)

Contributors

Mathy Core wouldn't be possible without the contributions of the following people:

This project follows the all-contributors specification. Contributions of any kind are welcome!