Skip to content

Open-source cross-platform symbolic algebra library for C# and F#. One of the most powerful in .NET. Can be used for both production and research purposes.

License

Notifications You must be signed in to change notification settings

ryyanmapes/AngouriMath

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AngouriMath logo

AngouriMath

New open-source cross-platform symbolic algebra library for C# · F# · Jupyter · C++ (WIP)
Get started · Examples · Contributions · What's new · Website

Discord

Status board

Solution Build

Builds and tests

Kernel/C# F# Interactive C++
Build C#/Kernel Build F# Build Interactive Build C++ Build
Test C# Test F# Test Interactive Test C++ Test

Note, that all tests and builds are tested for the following three operating systems: Windows, Ubuntu, Mac OS.

Coverage

Kernel/C# F# C++
??? ???

Versions

Kernel/C# F# Interactive C++
Prerelease Nuget (with prereleases) Nuget (with prereleases) Nuget (with prereleases) GitHub release (latest SemVer including pre-releases)
Stable Nuget Nuget Nuget WIP
Downloads Nuget Nuget Nuget WIP

There are also latest-master versions (updated on every push to master) on MyGet:

MyGet Downloads
MyGet (with prereleases) MyGet
MyGet (with prereleases) MyGet
MyGet (with prereleases) MyGet

Source to install from MyGet:

https://www.myget.org/F/angourimath/api/v3/index.json  

Other info

Website Stars License
Website GitHub Repo stars GitHub

What is it about?

AngouriMath now supports Jupyter integration

AngouriMath is an open source symbolic algebra library. That is, via AngouriMath, you can automatically solve equations, systems of equations, work with sets, differentiate, parse from string, compile expressions, work with matrices, find limits, convert an expression to LaTeX, and many other things.

It is not a CAS, so you can use it in any your project by installing it from NuGet. AngouriMath can be used in calculators, algebra systems, educational/quiz apps, graphics, TeX rendering applications, etc.

It is free to use even in commercial projects. We work on it a lot, so your requests on issues are likely to be considered within a few hours.

Quick start

  1. Install AngouriMath from NuGet.
  2. Write the following code:
using AngouriMath; using System;
Entity expr = "x + sin(y)";
Console.WriteLine(expr);
  1. Run.

More detailed Quick Start.

If you are new to AM, we suggest you checking out some samples instead of reading boring documentation. If you want to contribute, we would be happy to welcome you in our community.

For any questions, feel free to contact us via Discord.

Official website: am.angouri.org.

Examples

Expand any section to see. Examples with live shell are on the website.

Computations

Use as a simple calculator:

Entity expr = "1 + 2 * log(3, 9)";
Console.WriteLine(expr.EvalNumerical());
Console.WriteLine("2 / 3 + sqrt(-16)".EvalNumerical());
>>> 2 / 3 + 4i
Console.WriteLine("(-2) ^ 3".EvalNumerical());

Build expressions with variables and substitute them:

Entity expr = "2x + sin(x) / sin(2 ^ x)";
var subs = expr.Substitute("x", 0.3m);
Console.WriteLine(subs);

Simplify complicated expressions:

Console.WriteLine("2x + x + 3 + (4 a * a^6) / a^3 / 5".Simplify());
var expr = "1/2 + sin(pi / 4) + (sin(3x)2 + cos(3x)2)";
Console.WriteLine(expr.Simplify());

Compiled functions work 15x+ faster

var x = MathS.Variable("x");
var expr = MathS.Sin(x) + MathS.Sqrt(x) / (MathS.Sqrt(x) + MathS.Cos(x)) + MathS.Pow(x, 3);
var func = expr.Compile(x);
Console.WriteLine(func.Substitute(3));
var expr = "sin(x) + sqrt(x) / (sqrt(x) + cos(x)) + x3";
var compiled = expr.Compile("x");
Console.WriteLine(compiled.Substitute(4));
Algebra

Start with boolean algebra:

Entity expr1 = "a and b or c";

// Those are the same
Entity expr3 = "a -> b";
Entity expr3 = "a implies b";
Entity expr = "a -> true";
Console.WriteLine(MathS.SolveBooleanTable(expr, "a"));
>>> Matrix[2 x 1]
>>> False
>>> True

Next, solve some equations:

Console.WriteLine("x^2 + x + a".SolveEquation("x"));

Under developing now and forever (always available)

Entity expr = "(sin(x)^2 - sin(x) + a)(b - x)((-3) * x + 2 + 3 * x ^ 2 + (x + (-3)) * x ^ 3)";
Console.WriteLine(expr.SolveEquation("x").Latexise());

Try some inequalities:

Console.WriteLine("(x - 6)(x + 9) >= 0".Solve("x"));

Systems of equations:

var system = MathS.Equations(
    "x^2 + y + a",
    "y - 0.1x + b"
);
Console.WriteLine(system);
var solutions = system.Solve("x", "y");
Console.WriteLine(solutions);

System:

Result:

var system = MathS.Equations(
    "cos(x2 + 1)^2 + 3y",
    "y * (-1) + 4cos(x2 + 1)"
);
Console.WriteLine(system.Latexise());
var solutions = system.Solve("x", "y");
Console.WriteLine(solutions);
(solution matrix is too complicated to show)
Calculus

Find derivatives:

Entity func = "x^2 + ln(cos(x) + 3) + 4x";
Entity derivative = func.Differentiate("x");
Console.WriteLine(derivative.Simplify());

Find limits:

WriteLine("(a x^2 + b x) / (e x - h x^2 - 3)".Limit("x", "+oo").InnerSimplified);

Find integrals:

WriteLine("x^2 + a x".Integrate("x").InnerSimplified);
Sets

There are four types of sets:

WriteLine("{ 1, 2 }".Latexise());
WriteLine("[3; +oo)".Latexise());
WriteLine("RR".Latexise());
WriteLine("{ x : x^8 + a x < 0 }".Latexise());

And there operators:

WriteLine(@"A \/ B".Latexise());
WriteLine(@"A /\ B".Latexise());
WriteLine(@"A \ B".Latexise());
Syntax

You can build LaTeX with AngouriMath:

var expr = "x ^ y + sqrt(x) + integral(sqrt(x) / a, x, 1) + derive(sqrt(x) / a, x, 1) + limit(sqrt(x) / a, x, +oo)";
Console.WriteLine(expr.Latexise());
>>> {x}^{y}+\sqrt{x}+\int \left[\frac{\sqrt{x}}{a}\right] dx+\frac{d\left[\frac{\sqrt{x}}{a}\right]}{dx}+\lim_{x\to \infty } \left[\frac{\sqrt{x}}{a}\right]

You can parse Entity from string with

var expr = MathS.FromString("x + 2 + sqrt(x)");
Entity expr = "x + 2 + sqrt(x)";

A few convenient features: x2 => x^2, a x => a * x, (...)2 => (...)^2, 2(...) => 2 * (...)

Compilation

Now you can compile expressions with pritimives into native lambdas. They will be at least as fast as if you wrote them in line in code, or faster if you have same subexpressions in your expression.

Entity expr = "a and x > 3";
var func = expr.Compile<bool, double, bool>("a", "x");
WriteLine(func(true, 6));
WriteLine(func(false, 6));
WriteLine(func(true, 2));
WriteLine(func(false, 2));

Output:

True
False
False
False
F#

Download

Not everything is supported directly from F#, so if something missing, you will need to call the necessary methods from AngouriMath.

open Functions
open Operators
open Shortcuts

printfn "%O" (solutions "x" "x + 2 = 0")

printfn "%O" (simplified (solutions "x" "x^2 + 2 a x + a^2 = 0"))

printfn "%O" (``dy/dx`` "x^2 + a x")

printfn "%O" (integral "x" "x2 + e")

printfn "%O" (``lim x->0`` "sin(a x) / x")

printfn "%O" (latex "x / e + alpha + sqrt(x) + integral(y + 3, y, 1)")
C++ (Experimental)

At the moment, AngouriMath.CPP is in the experimental phase. See how to get AngouriMath for C++.

#include <AngouriMath.h>

int main()
{
    AngouriMath::Entity expr = "x y + 2";
    std::cout << expr.Differentiate("x");
}
Jupyter

If you already installed Jupyter and Interactive for it, install package by copying this to your first cell:

#r "nuget:AngouriMath.Interactive, *-*"

Now any ILatexiseable will be displayed as LaTeX. Try example here, or view it

Check the F# and C# samples.

Multithreading

You are guaranteed that all functions in AM run in one thread. It is also guaranteed that you can safely run multiple functions from AM in different threads, that is, all static variables and lazy properties are thread-safe.

There is also support of cancellation a task. However, to avoid injecting the cancellation token argument into all methods, we use AsyncLocal<T> instead. That is why instead of passing your token to all methods what you need is to pass it once to the MathS.Multithreading.SetLocalCancellationToken(CancellationToken) method.

There is a sample code demonstrating cancellation:

var cancellationTokenSource = new CancellationTokenSource();

// That goes instead of passing your token to methods
MathS.Multithreading.SetLocalCancellationToken(cancellationTokenSource.Token);

// Then you normally run your task
var currTask = Task.Run(() => InputText.Text.Solve("x"), cancellationTokenSource.Token);

try
{
    await currTask;
    LabelState.Text = currTask.Result.ToString();
}
catch (OperationCanceledException)
{
    LabelState.Text = "Operation canceled";
}

If you want, you can add a badge to your repo:

[![Powered by AngouriMath](https://img.shields.io/badge/Powered%20by-AngouriMath-purple?style=flat-square&labelColor=646)](https://am.angouri.org)

Powered by AngouriMath

Contribution

We appreciate and welcome any contributors to AngouriMath. Current tasks can be tracked on this page.

Use pull requests to contribute to it. We also appreciate early pull requests so that we know what you are improving and can help you with something.

Documentation for contributors and developers is here.

License

GitHub

The project is open source, but can be used in closed commercial projects. There is no restriction on it with the only requirement to keep the MIT license with all distributives of AngouriMath.

About

Open-source cross-platform symbolic algebra library for C# and F#. One of the most powerful in .NET. Can be used for both production and research purposes.

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 93.2%
  • C++ 2.4%
  • F# 2.2%
  • GAP 1.3%
  • Jupyter Notebook 0.6%
  • CMake 0.2%
  • Other 0.1%