Skip to content

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#InteractiveC++
BuildC#/Kernel BuildF# BuildInteractive BuildC++ Build
TestC# TestF# TestInteractive TestC++ 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

PrereleaseStableDownloads
Kernel/C#Nuget (with prereleases)NugetNuget
F#Nuget (with prereleases)NugetNuget
InteractiveNuget (with prereleases)NugetNuget
ExperimentalNuget (with prereleases)NugetNuget
TerminalNuget (with prereleases)NugetNuget
C++GitHub release (latest SemVer including pre-releases)WIPWIP

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

MyGetDownloads
MyGet (with prereleases)MyGet
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

WebsiteStarsLicense
WebsiteGitHub Repo starsGitHub

GitHub contributors

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

What is it about?

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

Where can be used?

AngouriMath now supports Jupyter integration

The two areas of use:


🧪 Research / Data Science[click 🖱️]

AngouriMath for research

As F#, great first-functional language, skyrocketing in the area of data analysis and interactive research, AngouriMath offers a few ways to conveniently work with symbolic expressions.

Notebooks

gif

Notebooks provide amazing experience working with function visualization, for functions over one and two variables. With dotnet/interactive, it can be used in Visual Studio Code notebooks as well as Jupyter notebooks. To install the package, simply run this in the notebook:

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

Terminal

gif

As both a demonstration sample and a convenient tool, this repository includes tool called AngouriMath.Terminal. It is a CLI-based program to interact with AngouriMath (as opposed to API-based interaction, that is, consuming it as a lib).

[ Download ]

Or build from sources:

git clone https://github.com/asc-community/AngouriMath
cd AngouriMath/Sources/Terminal/AngouriMath.Terminal
dotnet run -c release

See the online Jupyter notebook on how to use the F# API of AngouriMath. Note, that the C# API is still available via open AngouriMath command, then you can call the main library's methods.

See its source folder.

More

Read more about using AngouriMath for research on the website.


💻 Software Development[click 🖱️]

It is installed from nuget for both C# and F# and can be used by Web/Desktop/Mobile development.

Installing the library

  1. Install AngouriMath from NuGet.
  2. Write the following code:
usingAngouriMath;usingSystem;Entityexpr="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:

Entityexpr="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:

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

Simplify complicated expressions:

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

Compiled functions work 15x+ faster

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

Start with boolean algebra:

Entityexpr1="a and b or c";// Those are the sameEntityexpr3="a -> b";Entityexpr3="a implies b";
Entityexpr="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)

Entityexpr="(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:

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

System:

Result:

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

Find derivatives:

Entityfunc="x^2 + ln(cos(x) + 3) + 4x";Entityderivative=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:

varexpr="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

varexpr=MathS.FromString("x + 2 + sqrt(x)");Entityexpr="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.

Entityexpr="a and x > 3";varfunc=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
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:

varcancellationTokenSource=newCancellationTokenSource();// That goes instead of passing your token to methodsMathS.Multithreading.SetLocalCancellationToken(cancellationTokenSource.Token);// Then you normally run your taskvarcurrTask=Task.Run(()=>InputText.Text.Solve("x"),cancellationTokenSource.Token);try{awaitcurrTask;LabelState.Text=currTask.Result.ToString();}catch(OperationCanceledException){LabelState.Text="Operation canceled";}
F#

Download

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

openFunctionsopenOperatorsopenShortcuts
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>intmain()
{
AngouriMath::Entity expr = "x y + 2";
std::cout << expr.Differentiate("x");
}

Contribution

AngouriMath is a free open-source project, there is no big company backing us. That is why we warmly welcome any contributors to the project. Aside from volunteer donations, you can help developing the project: check the guide for developers.

License & citation

GitHubDOI

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

New open-source cross-platform symbolic algebra library for C# and F#. Can be used for both production and research purposes.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages