What is it about?
AngouriMath is a free open-source symbolic algebra library, written in and for .NET, that I've been working since the end of 2019. The previous major release happened on the second of March, I made an article about it too.
Now, let me tell what we, together with contributors, did within these four months!
AngouriMath is made for C#, F#, Interactive, and to an extent, C++, so let me draw a distinction, what package affects what environment:
C# | F# | Interactive | C++ | |
AngouriMath | ✓ | ✓ | ✓ | |
AngouriMath.FSharp | ✓ | ✓ | ||
AngouriMath.Interactive | ✓ | |||
AngouriMath.CPP | ✓ |
Matrices
This is the main change in terms of breaking API and behaviour. Now, instead of tensor, there's matrix, which is Entity.Matrix
. There is also vector, but it doesn't have its own type. Instead, it's a single-column matrix. So for matrices there's only one type.
The syntax for parsing is
Entity a = "[1, 2, 3]";
it becomes a vector of three elements.
Entity a = "[1, 2, 3]T"
becomes a transposed vector, that is, instead of column vector, it's a row vector. Here's how we create a 2x2 matrix:
Entity a = "[[1, 2], [3, 4]]"
[1, 2] is a row.
The properties and functions of matrix:
Entity.Matrix m = ...
m.Adjugate // null if it doesn't exist
m.AsScalar() // casts a 1x1 to scalar
m.Inverse // null if it doesn't exist
m.Pow(int) // finds a matrix power or throws
m.ReducedRowEchelonForm
See more at the docs.
There are also improvements in AngouriMath.FSharp's matrices. All matrix-related functions moved to AngouriMath.FSharp.Matrices
. Now there is a number of operators for matrices specifically all of which end with dot. For example,
a +. b
a -. b
a *. b
a /. b
a **. b // matrix power
a ***. b // tensor product
a ****. b // tensor power
Parser and LaTeX
The parser now supports Cyrillic and Greek letters, as well as it skips \n and \r letters, which might be helpful for building matrices.
There's also now a setting MathS.Settings.ExplicitParsingOnly
, which, when set to true, does not insert omitted operators, so while
Entity a = "2x + 3(x + 1)";
is fine when the setting is disabled, it won't be considered valid with the setting enabled.
There is also MathS.Parse
which returns an Either
of Entity
and reason why parsing failed. Either
is an anonymous type union from Honk#, which I'll mention later. Example of code using it:
using AngouriMath;
using System;
var res = MathS.Parse("2x + 3")
.Switch(
valid => valid,
failure => failure.Reason.Switch<Entity>(
unknown => $"Unknown reason: {unknown.Reason}",
missingOperator => $"Operator missed: {missingOperator.Details}",
internalError => $"Internal error: {internalError.Details}"
)
);
Console.WriteLine(res);
Latexise now doesn't produce unneeded \times, and instead, \dot-s are only produced when needed (e. g. between variables). A few bugs in it fixed.
New Functions
MathS.Series.Maclaurin
, MathS.Series.Taylor
, MathS.Series.TaylorTerms
are functions to generate Taylor expansion expressions.
A lot of experimental API added for number theory. The final function is the symbolic form of sine and cosine based on existing analytical angles, for example, here's the precise value of sin(17/42 pi):
1/2 * ((sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) ^ 2 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) * sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) - 2 * sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) * sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) * sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2))) - -(2 * sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) * sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) * sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) + (sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) ^ 2 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) * sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2))) * sqrt(3) / 2
All added functions: SymbolicFormOfSine
, SymbolicFormOfCosine
, ExpandSineOfSum
, ExpandConsineOfSum
, ExpandSineArgumentMultiplied
, ExpandCosineArgumentMultiplied
, GetSineOfHalvedAngle
, GetCosineOfHalvedAngle
, DecomposeRational
, GetSineOfHalvedAngle
A few synonyms added for hyperbolic functions. All functions from AngouriMath.FSharp now get InnerSimplified
applied (for instance, sqrt 4
will return 2
while MathS.Sqrt(4)
will still return a power node).
AngouriMath.Interactive now has a AggressiveOperators module, which overrides the default operators, such as +, -, *, /, **, <, >, >=, <=, =. It is not recommended to use it as a library, but might be useful for some small calculations, like I did it in the terminal.
AngouriMath.CPP: wrapper for C++
Now there's a native version of the library that can be consumed from unmanaged code. It is possible thanks to NativeAOT, new feature which allows to compile managed .NET assemblies into native code. Here's an example:
#include <AngouriMath.h>
AngouriMath::Entity expr("x * y + 2sin(x * y) - y^x");
std::cout << expr.Differentiate("x") << "\n";
Output:
y + cos(x * y) * y * 2 - y ^ x * ln(y)
It is currently in the experimental phase. You can try it by installing it following a short instruction. Very few functions are still exposed, so it can be barely used for now, but hope it will be developed further in the future.
My Reddit post about it.
Using AngouriMath in your projects
Now, aside from netstandard2.0, it multitargets .NET Framework 4.7.2+ and netstandard2.1. The former allows to use the library in legacy projects more conveniently.
Honk# now helps to maintain the project easier, but since it's shipped with AngouriMath now, it might be a good idea to try its syntax in some cases.
Conclusion
There are a lot of minor features and fixes that are not very interesting to read about. Most of them and other updates are listed in the what's new page on the website.
Thank you for your attention! Feel free to ask questions.
References
Github of the project
Nuget (C#, F#, Interactive)
Try in binder
NativeAOT for native compilation
dotnet/interactive for Jupyter and notebooks
Honk# for convenient coding
My twitter
Thanks
Aside from myself, I want to thank these people for helping with the project:
Contributors: Happypig375, ryynmapes, MomoDeve, TheSeems, KuhakuPixel, jaimeadf, yoshiask.
Consultants: Happypig375, mednik.
Sponsors: zyzhu.