A symbolic mathematics library for Moonbit.
Dependencies
///|
test "quickstart expression construction and simplification" {
let x = Expr::Symbol("x")
let y = Expr::Symbol("y")
let expr = add([integer(1), mul([x, pow(y, integer(2))])])
debug_inspect(expr, content="(+ (* sym:x (^ sym:y 2)) 1)")
inspect(pretty_string(expr), content="x*y**2 + 1")
let cancelled = simplify(
mul([add([x, integer(1)]), pow(add([x, integer(1)]), integer(-1))]),
)
inspect(pretty_string(cancelled), content="1")
}///|
test "quickstart exact rationals remain symbolic" {
let third = try! rational(1, 3)
let expr = add([third, third, third])
inspect(pretty_string(expr), content="1")
}///|
test "targeted simplification keeps intent explicit" {
let x = Expr::Symbol("x")
let sin_x = @symcore.function("sin", [x])
let cos_x = @symcore.function("cos", [x])
let trig = add([pow(sin_x, integer(2)), pow(cos_x, integer(2))])
inspect(pretty_string(trigsimp(trig)), content="1")
let frac_expr = mul([
add([x, integer(1)]),
pow(Expr::Symbol("y"), integer(-1)),
])
let (num, den) = fraction(frac_expr)
inspect(pretty_string(num), content="x + 1")
inspect(pretty_string(den), content="y")
}///|
test "cse extracts and reconstructs shared structure" {
let x = Expr::Symbol("x")
let shared = @symcore.function("sin", [x])
let exprs = [mul([shared, shared]), add([shared, shared])]
let result = cse(exprs)
inspect(result.replacement_count(), content="1")
let replacements = result.replacements_copy()
let (tmp, rhs) = replacements[0]
inspect(tmp, content="x0")
inspect(pretty_string(rhs), content="sin(x)")
let rebuilt = cse_reconstruct(result)
assert_true(pretty_string(rebuilt[0]) == pretty_string(exprs[0]))
assert_true(pretty_string(rebuilt[1]) == pretty_string(exprs[1]))
}///|
test "fu-style helpers are available from the root package" {
let x = Expr::Symbol("x")
let sin_x = @symcore.function("sin", [x])
let cos_x = @symcore.function("cos", [x])
let tan_x = @symcore.function("tan", [x])
inspect(
to_repr(tr2(tan_x)).to_string(),
content="(* (^ (call cos sym:x) -1) (call sin sym:x))",
)
inspect(
pretty_string(tr2i(mul([sin_x, pow(cos_x, integer(-1))]))),
content="tan(x)",
)
}///|
test "quickstart expression construction and simplification" {
let x = Expr::Symbol("x")
let y = Expr::Symbol("y")
let expr = add([integer(1), mul([x, pow(y, integer(2))])])
debug_inspect(expr, content="(+ (* sym:x (^ sym:y 2)) 1)")
inspect(pretty_string(expr), content="x*y**2 + 1")
let cancelled = simplify(
mul([add([x, integer(1)]), pow(add([x, integer(1)]), integer(-1))]),
)
inspect(pretty_string(cancelled), content="1")
}///|
test "quickstart exact rationals remain symbolic" {
let third = try! rational(1, 3)
let expr = add([third, third, third])
inspect(pretty_string(expr), content="1")
}///|
test "targeted simplification keeps intent explicit" {
let x = Expr::Symbol("x")
let sin_x = @symcore.function("sin", [x])
let cos_x = @symcore.function("cos", [x])
let trig = add([pow(sin_x, integer(2)), pow(cos_x, integer(2))])
inspect(pretty_string(trigsimp(trig)), content="1")
let frac_expr = mul([
add([x, integer(1)]),
pow(Expr::Symbol("y"), integer(-1)),
])
let (num, den) = fraction(frac_expr)
inspect(pretty_string(num), content="x + 1")
inspect(pretty_string(den), content="y")
}///|
test "cse extracts and reconstructs shared structure" {
let x = Expr::Symbol("x")
let shared = @symcore.function("sin", [x])
let exprs = [mul([shared, shared]), add([shared, shared])]
let result = cse(exprs)
inspect(result.replacement_count(), content="1")
let replacements = result.replacements_copy()
let (tmp, rhs) = replacements[0]
inspect(tmp, content="x0")
inspect(pretty_string(rhs), content="sin(x)")
let rebuilt = cse_reconstruct(result)
assert_true(pretty_string(rebuilt[0]) == pretty_string(exprs[0]))
assert_true(pretty_string(rebuilt[1]) == pretty_string(exprs[1]))
}///|
test "fu-style helpers are available from the root package" {
let x = Expr::Symbol("x")
let sin_x = @symcore.function("sin", [x])
let cos_x = @symcore.function("cos", [x])
let tan_x = @symcore.function("tan", [x])
inspect(
to_repr(tr2(tan_x)).to_string(),
content="(* (^ (call cos sym:x) -1) (call sin sym:x))",
)
inspect(
pretty_string(tr2i(mul([sin_x, pow(cos_x, integer(-1))]))),
content="tan(x)",
)
}fn simplify_with_patterns(expr : Expr, patterns : Array[SimplifyPattern], max_passes? : Int) -> Exprfn sparse_matrix(rows : Int, cols : Int, entries : Map[(Int, Int), Expr]) -> SparseMatrix raise MatrixErrorA symbolic mathematics library for Moonbit.
Dependencies