Awesome
fastmath
A Clojure math library.
Documentation
3.0.0-alpha1 (WIP)
2.4.0
Clerk notebooks
Installation
[generateme/fastmath "2.4.0"]
Alpha
[generateme/fastmath "3.0.0-alpha1"]
Source code in the 3.x
branch.
2.3.0 GPL warning
Important Note
Fastmath 2.3.0
depends on SMILE 3.0.x which is GPL. That means that Fastmath 2.3.0 also should be treated as GPL. Version 2.4.x
fixes it and brings back SMILE LGPL 2.x dependency.
MKL
Important Note
Fastmath relies on SMILE 2.6.0 which relies on BLAS/LAPACK via MKL and/or OpenBlas. MKL (preferred) and OpenBlas are included as dependencies in fastmath
. This leads to addional 1GB of jar files. I can't assure that all functionalities will work on OpenBlas (see: #15) but 99% should. If you need fastmath
to be lighter, please exclude MKL from your path.
lein / project.clj
[generateme/fastmath "2.4.0" :exclusions [com.github.haifengl/smile-mkl]]
deps.edn
{:deps {generateme/fastmath {:mvn/version "2.4.0"
:exclusions [com.github.haifengl/smile-mkl]}}}
If you don't need certain interpolation or clustering methods you can exclude OpenBlas as well (be warned that other things can break):
:exclusions [com.github.haifengl/smile-mkl org.bytedeco/openblas]
MKL Exception
When MKL is not available fastmath
(SMILE actually, here and here) will throw two exceptions with full stack traces about lack of MKL. You can safely ignore them.
[main] DEBUG smile.math.blas.LAPACK - Failed to create MKL instance:
java.lang.ClassNotFoundException: smile.math.blas.mkl.MKL
[...]
[main] DEBUG smile.math.blas.BLAS - Failed to create MKL instance:
java.lang.ClassNotFoundException: smile.math.blas.mkl.MKL
[...]
Contribution
NOTE Currently we work on the 3.x branch only. PRs to master branch will not be accepted.
We accept PRs!
- when fixing a bug/typo/docstring - just push a PR
- if you want to add a new function or have an idea - please consult it before starting a work
- if you want to enhance a documentation - please read this wiki page
Content
PrimitiveMath
Code adopted from Zach Tellmans' library.
[* + - / > < >= <= == rem quot mod bit-or bit-and bit-xor bit-not bit-shift-left bit-shift-right unsigned-bit-shift-right inc dec zero? neg? pos? min max even? odd? bool-and bool-or bool-xor bool-not << >> >>> not==]
Math functions
- Trigonometric functions
- Power: log, ln, logb, exp, pow, sqrt
- Rounding functions: round, floor, ceil, trunc, frac, approx + other
- Normalizations: norm wrap, constrain
- Interpolations: lerp, cos-interpolation, smooth-interpolation, quad-interpolation, smoothstep
- Special functions: erf, beta, gamma + other
- Distance: dist, hypot
- Sign: sgn, signum, abs
- Other: gcd, lcm
Most of them backed by Jafama FastMath 2.3.1 or Apache Commons Math 3.6.1
Vector operations protocol and implementations
- 2d (
Vec2
), 3d (Vec3
) and 4d (Vec4
) vector types. - ArrayVector for fixed length long vectors (fixed sized double-array)
- Clojure vector, double array, Number (as 1d vector)
Matrix operations protocol and implementations
- 2d (
Mat2x2
), 3d (Mat3x3
) and 4d (Mat4x4
) matrix types.
With typical basic matrix operations
Complex and Quaternion number functions
- primitive operations: mult, div, add, sub
- abs, arg, conjugate, reciprocal, neg
- atan, asin, acos, csc, sec, tanh, tan, sinh, sin, cosh, cos
- log, exp, pow
- sqrt, sq, sqrt1z
Integration, differentiations and solvers
- Integration: VEGAS/VEGAS+ Monte Carlo, h-adaptive Cubature, h-adaptive Gauss-Kronrod (QuadGK), Simpson, Romberg, Trapezoid, Gauss-Legendre, Midpoint
- Derivatives - any degree and order of accuracy
- Gradient and Hessian for multivariate functions
- Solvers (root finding): brent, bisection, illinois, muller, muller2, pegasus, regula-falsi, ridders, secant
Random numbers
- Collection of random number generators
- Random generator functions for each primitive type (drand - double, lrand - long, frand - float, irand - int)
- Additional RNG functions: brand - true/false, grand - gaussian distributed double
- Random sequences: from distribution, halton, sobol, R2, sphere, uniform
Distributions
- Collection of distributions (60+)
Noise
- 4 noise types: value, gradient, simplex, discrete
- 3 noise blends: fbm, ridgedmulti, billow
- Ready to use fbm functions: noise (perlin), vnoise (value noise), simplex
- Warp noise
Statistics
- Descriptive statistics: size, min, max, mode, mean, median, percentiles, kurtosis, skewness, IQR, LAV, UAV and other
- Correlations
- t-test
- ACF/PACF
- histogram
- Bootstrap
- Confidence intervals
Bootstrap
Bootstrap functions and confidence intervals
Interpolations
1d, 2d interpolations
Easings
Several easing functions (in, out, in-out)
Transforms
- Wavelets: 1d, 2d (haar, biorthogonal, symlet, coiflet, daubechies, legendre)
- 1d Fast Sine, Cosine and Hadamard
Vector fields
Great collection (100+) of R^2->R^2 functions.
Gaussian Processes
Gaussian Processes
Clustering
Various clustering algorithms including K-Means++, DBSCAN, CLARANS, DENCLUE, MEC, Spectral, Deterministic Annealing
Optimization
L-BFGS-B, Gradient, Nelder-Mead, Simplex, Powell, BOBYQA, CMAES, BayesianOptimizer, Linear optimizer
Grids
Hexagonal, squared, triangular, rhomboidal grid functions
Kernels
Collection of various kernels (density, RBF, correlation)
Signal
- Signal (audio) processing filters and oscillators
- Smoothing filters: Savitzky-Golay, moving average, kernel smoothing
EFloat
Floating point operations with error bounds
Other
Plenty of constant values
Almost all functions optimized to work with double
and long
primitives
Supporting libraries
- Apache Commons Math 3.6.1 - Apache 2.0 Licence
- SMILE 2.5.0 - Apache 2.0 Licence
- Jafama FastMath 2.3.1 - Apache 2.0 Licence
- PrimitiveMath - MIT Licence
- JWave - MIT Licence
- SSJ - Apache 2.0 Licence
Alternatives
Since this library is only JVM version, you can check following Clojure/ClojureScript libraries as replacement
- PrimitiveMath - for primitive operators
- Kixi stats - for pure clj(s) statistics/distributions (tends to be 2-10x slower)
- thi.ng - for vectors, general math, noise, complex numbers, transforms (fourier)
- vectorz-clj - fast vector operations
- Incanter - statistics/distributions/probability
Java
Java classes are compiled for java 1.8
How To Help
If you see place of improvement, I'm accepting PRs.
Licence
- The Unlicence - up to 1.5.2
- MIT License - from 1.5.3 (with te exception of 2.3.0 which should be treated as GPL)
Copyright (c) 2024 generateme