Giter VIP home page Giter VIP logo

asc-community / angourimath Goto Github PK

View Code? Open in Web Editor NEW
773.0 27.0 73.0 22.91 MB

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

Home Page: https://am.angouri.org

License: MIT License

C# 92.75% GAP 1.06% Batchfile 0.08% F# 3.47% Jupyter Notebook 0.48% CMake 0.12% C++ 1.91% PowerShell 0.01% Shell 0.12%
csharp algebra integration latex parsing solver equations nuget inequality symbolic-math

angourimath's Introduction

Warning

AngouriMath is deprecated. You can still use it, but it's unlikely it will go forward. Full story at wbg.gg

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

Join Matrix Chat

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

Prerelease Stable Downloads
Kernel/C# Nuget (with prereleases) Nuget Nuget
F# Nuget (with prereleases) Nuget Nuget
Interactive Nuget (with prereleases) Nuget Nuget
Experimental Nuget (with prereleases) Nuget Nuget
Terminal Nuget (with prereleases) Nuget Nuget
C++ GitHub release (latest SemVer including pre-releases) WIP 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
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

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:
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
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";
}
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");
}

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

GitHub DOI

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.

angourimath's People

Contributors

adk7507 avatar bimal-parajuli avatar cyberillithid avatar davidbeh avatar djvoelker avatar dogayalcin avatar happypig375 avatar illuminati-craz avatar jaimeadf avatar kuhakupixel avatar lehonti avatar mgnslndh avatar momodeve avatar ryyanmapes avatar theseems avatar whiteblackgoose avatar willtyler1 avatar yoshiask avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

angourimath's Issues

What?

Describe the bug

AngouriMath.MathS.Equations("a+b-c", "3a+3b-2c", "3a+4b-4c").Solve("a", "b", "c").Latexise()

\begin{pmatrix}NaN + NaNi & -NaN + NaNi & NaN + NaNi+-NaN + NaNi\end{pmatrix}

Math constants are not recognized by compile method

Description
trying to compile expression which contains math constants such as e and pi generates exception because Compile method recognizes them as variables:

System.Collections.Generic.KeyNotFoundException: 'The given key 'e' was not present in the dictionary.'

   at System.ThrowHelper.ThrowKeyNotFoundException[T](T key)
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at AngouriMath.Entity.InnerCompile(FastExpression fe, String[] variables, Dictionary`2 varNamespace) in C:\Users\Momo\source\repos\MathS\AngouriMath\Functions\Evaluation\Compilation\FastExpression.cs:line 106
   at AngouriMath.Entity.InnerCompile(FastExpression fe, String[] variables, Dictionary`2 varNamespace) in C:\Users\Momo\source\repos\MathS\AngouriMath\Functions\Evaluation\Compilation\FastExpression.cs:line 100
   at AngouriMath.Entity.Compile(String[] variables) in C:\Users\Momo\source\repos\MathS\AngouriMath\Functions\Evaluation\Compilation\FastExpression.cs:line 48
   at Samples.Program.Main(String[] _) in C:\Users\Momo\source\repos\MathS\Samples\Samples\Program.cs:line 139

(see https://github.com/Angourisoft/MathS/blob/master/AngouriMath/Functions/Evaluation/Compilation/FastExpression.cs#L106)

To Reproduce

static void Main(string[] args)
{
    AngouriMath.Entity expr = "x - pi";
    expr.Compile("x");
}

Conditions
AngouriMath 1.0.17.2-Beta (latest)
Visual Studio 2019
Possible solution
Probably we need to replace such constants with their numeric alternatives if variables with the same names were not passed to the compile method.

x^2+y^2+2x*y+w -> w+x^2+2x*y+y^2

#62 (comment)

TryPolynomial is not able to support multiple variables though. I said
There is already a sort performed by Simplify which sorts variables according to their alphabetical order. On top of this, we should follow the mathematical norm of writing higher powers of the same variable first.
So on top of y^2+x^2->x^2+y^2 we would also have x+x^2->x^2+x.
So multiple variables like x^2+y^2+2xy+w would first sort by w, then x, finally y: w+x^2+2xy+y^2

In addition, functions like cos(x) can also follow the alphabetical order of cos.

Infinite loop while solving equation

Description
trying to solve expression for variable which does not exists, causes Solve method to execute forever. This happens because of infitine while loop in AnalyticalSolver:
https://github.com/Angourisoft/MathS/blob/master/AngouriMath/Functions/Algebra/AnalyticalSolver/AnalyticalSolver.cs#L61

To Reproduce

static void Main(string[] args)
{
    AngouriMath.Entity expr = "1";
    expr.Solve("x");
}

Conditions
AngouriMath 1.0.17.2-Beta (latest)
Visual Studio 2019
Possible solution
if we find Entity with no children and it is not our entity - we should break from loop. Consider checking latest commit to MomoBranch: d87422c

I want to contact with you

I am impressed with this project so can you give me your email to contact? I want to ask you something

Why .NET Standard 2.1?

From NuGet, this used to target .NET Standard 2.0. Why was this changed? .NET Standard 2.1 is not supported on multiple platforms such as .NET Framework and UWP which harms adoption of this library. As far as I can see, there is nothing added in .NET Standard 2.1 that is explicitly used by this library. It would be better to switch back.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.