Let give some symbols like x1
and x2
.
The algorithm will consider first the linear combinations a*x1+b
and c*x2+d
, then extra start symbolic expressions defined with extraExpressions
.
Set verbose
to true
to get some information during regression.
Then the first iteration starts:
- We apply the unary operators defined with
un_ops
, for examplee*log(a*x1+b)+f
andg*log(c*x2+d)+h
. - We apply then the binary operators defined with
bin_ops
, for examplei*(a*x1+b+c*x2+d)+j
same ask*x1+l*x2+m
, etc. We can skip some combinations according to symmetric binary operators.
We can define the depth of operators with operatorDepth
.
At each combination, we compute an optimal expression. If paramValues
is empty, we search optimal parameters with ceres
, else we use a discrete optimizer.
If discreteParams
is true
, parameters will be rounded to admissible values after ceres optimization.
We process like that until the computed loss is less than epsLoss
.
eps
is used to round numeric values and compare with other expressions for example.
It is possible to call user callback during process with callback
.
sudo apt update
sudo apt install -y cmake make git libcurl4-openssl-dev libboost-dev libqt6charts6-dev libmlpack-dev libensmallen-dev libarmadillo-dev libstb-dev pybind11-dev graphviz libgraphviz-dev libqt6svg6-dev build-essential python3-sympy
sudo apt install -y libgoogle-glog-dev libatlas-base-dev libeigen3-dev libsuitesparse-dev
cd ~
mkdir symreg_ws
cd symreg_ws
git clone https://github.com/Julien-Livet/SymReg.git
git clone --recursive https://ceres-solver.googlesource.com/ceres-solver
cd ceres-solver
mkdir build
cd build
cmake .. -DBUILD_TESTING=OFF
make -j$(nproc)
sudo make install
cd ../../SymReg
mkdir build
cd build
cmake ..
make -j$(nproc)
sudo make install
./benchmark 0
./primes_demo
ctest -V
time ./test_symreg --gtest_filter=TestSymReg.Line
cd ..
pip install --break-system-packages -e .
In MSYS2 UCRT64 prompt:
pacman -Syu
pacman -Sy git
pacman -Sy mingw-w64-ucrt-x86_64-cmake
pacman -Sy mingw-w64-ucrt-x86_64-ninja
pacman -Sy mingw-w64-ucrt-x86_64-toolchain base-devel
pacman -Sy mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb
pacman -Sy mingw-w64-ucrt-x86_64-boost
pacman -Sy mingw-w64-ucrt-x86_64-qt6
pacman -Sy mingw-w64-ucrt-x86_64-armadillo
pacman -Sy mingw-w64-ucrt-x86_64-ensmallen
pacman -Sy mingw-w64-ucrt-x86_64-python
pacman -Sy mingw-w64-ucrt-x86_64-pybind11
pacman -Sy mingw-w64-ucrt-x86_64-graphviz
pacman -Sy mingw-w64-ucrt-x86_64-mlpack
pacman -Sy mingw-w64-ucrt-x86_64-eigen3
pacman -Sy mingw-w64-ucrt-x86_64-ceres-solver
pacman -Sy mingw-w64-ucrt-x86_64-blas
pacman -Sy mingw-w64-ucrt-x86_64-lapack
pacman -Sy mingw-w64-ucrt-x86_64-suitesparse
pacman -Sy mingw-w64-ucrt-x86_64-python-pip
pacman -Sy mingw-w64-ucrt-x86_64-python-pytest
pacman -Sy mingw-w64-ucrt-x86_64-python-numpy
cd ~
mkdir symreg_ws
cd symreg_ws
git clone https://github.com/DrTimothyAldenDavis/SuiteSparse.git
cd SuiteSparse
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/ucrt64 -DBLAS_LIBRARIES=/ucrt64/lib/libblas.dll.a -DLAPACK_LIBRARIES=/ucrt64/lib/liblapack.dll.a ..
ninja -j$(nproc)
ninja install
cd ../..
git clone https://github.com/mlpack/mlpack.git
cd mlpack
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/ucrt64 ..
ninja -j$(nproc)
ninja install
cd ../..
git clone https://github.com/Julien-Livet/SymReg.git
git clone https://github.com/Julien-Livet/Sym.git
cd Sym
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/ucrt64 ..
ninja -j$(nproc)
ninja install
cd ../../SymReg
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/ucrt64 -DBLAS_LIBRARIES=/ucrt64/lib/libblas.dll.a -DLAPACK_LIBRARIES=/ucrt64/lib/liblapack.dll.a -DPython3_EXECUTABLE=/ucrt64/bin/python -DPython3_LIBRARY=/ucrt64/lib/libpython3.12.dll.a -DPython3_INCLUDE_DIR=/ucrt64/include/python3.12 ..
ninja -j$(nproc)
ninja install
cd ..
mkdir symreg
cp build/*pyd symreg
pip install --break-system-packages -e .
cd scripts
pytest -s test_symreg.py
Copy following DLL files from MSYS2 UCRT64 bin folder to launch executables from Windows Explorer: libarmadillo.dll libopenblas.dll libblas.dll libceres-4.dll libcurl-4.dll libgcc_s_seh-1.dll libglog-2.dll libgvc-6.dll libstdc++-6.dll libwinpthread-1.dll Qt6Charts.dll Qt6Core.dll Qt6Gui.dll Qt6OpenGL.dll Qt6Svg.dll Qt6Widgets.dll zlib1.dll
In CMD prompt:
D:
cd D:\Programmes\msys64\home\Julien\symreg_ws\SymReg\build
benchmark.exe 0
primes_demo.exe
ctest -V
test_symreg.exe --gtest_filter=TestSymReg.Line
Test name | MSE | Expression time | Test time | Input symbolic expression | Found symbolic expression |
---|---|---|---|---|---|
5x1Add7x2Addx3Add8 | 8.38789e-14 | 4ms | 5ms | 5.2*x1+7.3*x2+x3+8.6 |
5.2*x1 + 7.3*x2 + x3 + 8.6 |
LinearFit | 3.44176e-16 | 0ms | 0ms | 2*x+3 |
2.0*x + 3.0 |
LogFit | 0 | 1ms | 1ms | 2*log(3*x+4)+5 |
2.0*log(3.0*x + 4.0) + 5.0 |
Test1 | 4.03717e-15 | 0ms | 0ms | x**2+x+1 |
x + x**2.0 + 1.0 |
Test2 | 4.1359e-24 | 19ms | 19ms | exp(x)*sin(x) |
exp(x)*sin(x) |
Test3 | 2.15704e-32 | 2ms | 2ms | x / (1 + x**2) |
x/(x**2.0 + 1.0)**1.0 |
Test4 | 7.25338e-22 | 2ms | 4ms | x**2+y**2 |
x**2.0 + y**2.0 |
Test5 | 3.35266e-30 | 21ms | 23ms | log(x)+sin(x) |
log(x) + sin(x) |
Test6 | 4.84764e-32 | 991ms | 992ms | exp(-0.5*x**2)/sqrt(2*pi) |
0.4*exp(-0.5*x**2.0) |
PySR | 1.21677e-22 | 1196ms | 1438ms | 2.5382*cos(x3)+x0**2-0.5 |
x0**2.0 + 2.5*cos(x3) - 0.5 |
GPLearn | 1.02851e-21 | 3ms | 6ms | x0**2-x1**2+x1-1 |
x0**2.0 + x1 - 1.0*x1**2.0 - 1.0 |
x1Mulx2 | 1.1832e-15 | 0ms | 0ms | x1*x2 |
x1*x2 |
Nguyen1 | 3.28779e-20 | 1ms | 2ms | x+x**2+x**3 |
1.0*x + 1.0*x**2.0 + 1.0*x**3.0 |
Nguyen2 | 4.19683e-20 | 0ms | 1ms | x+x**2+x**3+x**4 |
1.0*x + 1.0*x**2.0 + 1.0*x**3.0 + 1.0*x**4.0 |
Nguyen3 | 2.4968e-20 | 24ms | 50ms | x+x**2+x**3+x**4+x**5 |
1.0*x + 1.0*x**2.0 + 1.0*x**3.0 + 1.0*x**4.0 + 1.0*x**5.0 |
Nguyen4 | 1.24337e-22 | 92ms | 115ms | x+x**2+x**3+x**4+x**5+x**6 |
1.0*x + 1.0*x**2.0 + 1.0*x**3.0 + 1.0*x**4.0 + 1.0*x**5.0 + 1.0*x**6.0 |
Nguyen5 | 1.97215e-31 | 891ms | 898ms | sin(x**2)*cos(x)-1 |
sin(x**2.0)*cos(x) - 1.0 |
Nguyen6 | 1.10934e-31 | 56ms | 60ms | sin(x)+sin(x+x**2) |
sin(x) + sin(x + x**2.0) |
Nguyen7 | 1.50377e-30 | 246ms | 250ms | log(x+1)+log(x**2+1) |
log(x + 1.0) + log(x**2.0 + 1.0) |
Nguyen8 | 0 | 0ms | 0ms | sqrt(x) |
x**0.5 |
Nguyen9 | 0 | 255ms | 267ms | sin(x1)+sin(x2**2) |
sin(x1) + sin(x2**2.0) |
Nguyen10 | 0 | 9ms | 11ms | 2*sin(x1)*cos(x2) |
2.0*sin(x1)*cos(x2) |
Keijzer10 | 0 | 2ms | 3ms | x1**x2 |
x1**x2 |
d_bacres1 | 8.92493e-20 | 0ms | 541ms | 20-x-(x*y/(1+0.5*x**2)) |
-1.7*x*y/(0.8*x**2.0 + 1.7)**1.0 - 1.0*x + 20.0 |
d_bacres2 | 4.34292e-21 | 639ms | 1059ms | 10-(x*y/(1+0.5*x**2)) |
10.0 - 298.6/(208.0*x**2.0/(x*y)**1.0 + 416.0/(x*y)**1.0)**1.0 |
d_barmag1 | 1.42591e-27 | 4031ms | 4409ms | 0.5*sin(x-y)-sin(x) |
-1.0*sin(x) + 0.5*sin(x - 1.0*y) |
d_barmag2 | 7.61955e-28 | 4441ms | 4805ms | 0.5*sin(y-x)-sin(y) |
-1.0*sin(y) - 0.5*sin(x - 1.0*y) |
d_glider1 | 1.07305e-25 | 16170ms | 16475ms | -0.05*x**2-sin(y) |
-1.0*sin(y) |
d_glider2 | 1.5599e-15 | 11ms | 347ms | x-cy/x |
(-1.0*cy + x**2.0)/x**1.0 |
d_lv1 | 7.55206e-27 | 10ms | 269ms | 3*x-2*x*y-x**2 |
-2.0*x*y + 3.0*x - 1.0*x**2.0 |
d_lv2 | 8.13647e-27 | 48ms | 364ms | 2*y-x*y-y**2 |
-1.0*x*y + 2.0*y - 1.0*y**2.0 |
d_shearflow1 | 4.12295e-27 | 21ms | 296ms | cos(x)*cot(y) |
cos(x)*cot(y) |
d_shearflow2 | 6.10506e-19 | 359ms | 844ms | (cy**2+0.1*sy**2)*sx |
sx*(1.0*cy**2.0 + 0.1*sy**2.0) |
d_vdp1 | 2.31375e-13 | 58ms | 335ms | 10*(y-(1/3*(x**3-x))) |
3.3*x - 3.3*x**3.0 + 10.0*y |
d_vdp2 | 4.09897e-25 | 0ms | 637ms | -0.1*x |
-0.1*x |
Test name | MSE | Expression time | Test time | Input symbolic expression | Found symbolic expression |
---|---|---|---|---|---|
5x1Add7x2Addx3Add8 | 0.00378479 | 20ms | 50ms | 5.2*x1+7.3*x2+x3+8.6 |
5.2*x1 + 7.3*x2 + 1.0*x3 + 8.6 |
LinearFit | 1.14303e-05 | 0ms | 0ms | 2*x+3 |
2.0*x + 3.0 |
LogFit | 0.0022121 | 17ms | 18ms | 2*log(3*x+4)+5 |
2.0*log(3.0*x + 4.0) + 5.0 |
Test1 | 0.0644484 | 14ms | 15ms | x**2+x+1 |
1.0*x + 1.0*x**2.0 + 1.0 |
Test2 | 82.7865 | 196ms | 1868ms | exp(x)*sin(x) |
exp(x)*sin(x) - 0.1 |
Test3 | 1.70665e-06 | 15ms | 2191ms | x / (1 + x**2) |
x/(x**2.0 + 1.0)**1.0 |
Test4 | 1.25972e-05 | 265ms | 505ms | x**2+y**2 |
1.0*x**2.0 + 1.0*y**2.0 |
Test5 | 0.000162595 | 712ms | 2398ms | log(x)+sin(x) |
log(x) + sin(x) |
Test6 | 4.90219e-07 | 5504ms | 13467ms | exp(-0.5*x**2)/sqrt(2*pi) |
0.4*exp(-0.5*x**2.0) |
PySR | 0.000143323 | 1588ms | 6972ms | 2.5382*cos(x3)+x0**2-0.5 |
1.0*x0**2.0 + 2.5*cos(1.0*x3) - 0.4 |
GPLearn | 4.26414e-05 | 284ms | 507ms | x0**2-x1**2+x1-1 |
1.0*x0**2.0 + 1.0*x1 - 1.0*x1**2.0 - 1.0 |
x1Mulx2 | 2.45325e-06 | 0ms | 0ms | x1*x2 |
1.0*x1*x2 |
Nguyen1 | 2.62823e-05 | 802ms | 908ms | x+x**2+x**3 |
1.0*x + 1.0*x**2.0 + 1.0*x**3.0 |
Nguyen2 | 3.18715e-05 | 652ms | 885ms | x+x**2+x**3+x**4 |
1.0*x + 1.0*x**2.0 + 1.0*x**3.0 + 1.0*x**4.0 |
Nguyen3 | 6.71155e-05 | 935ms | 1042ms | x+x**2+x**3+x**4+x**5 |
1.0*x + 1.0*x**2.0 + 1.0*x**3.0 + 1.0*x**4.0 + 1.0*x**5.0 |
Nguyen4 | 4.23057e-05 | 866ms | 977ms | x+x**2+x**3+x**4+x**5+x**6 |
1.0*x + 1.0*x**2.0 + 1.0*x**3.0 + 1.0*x**4.0 + 1.0*x**5.0 + 1.1*x**6.0 + 0.1*x**7.0 - 0.1*x**9.0 |
Nguyen5 | 2.08185e-05 | 1500ms | 1531ms | sin(x**2)*cos(x)-1 |
sin(x**2.0)*cos(x) - 1.0 |
Nguyen6 | 4.39748e-05 | 219ms | 227ms | sin(x)+sin(x+x**2) |
sin(x) + sin(x + x**2.0) |
Nguyen7 | 7.69403e-05 | 401ms | 1115ms | log(x+1)+log(x**2+1) |
log(x + 1.0) + log(x**2.0 + 1.0) |
Nguyen8 | 3.76766e-05 | 0ms | 1ms | sqrt(x) |
x**0.5 |
Nguyen9 | 1.51535e-05 | 339ms | 619ms | sin(x1)+sin(x2**2) |
sin(x1) + sin(x2**2.0) |
Nguyen10 | 2.14083e-05 | 36ms | 767ms | 2*sin(x1)*cos(x2) |
2.0*sin(x1)*cos(x2) |
Keijzer10 | 3.67798e-05 | 6ms | 15438ms | x1**x2 |
x1**x2 |
d_bacres1 | 0.0155473 | 430ms | 1293ms | 20-x-(x*y/(1+0.5*x**2)) |
-1.1*x*y/(0.5*x**2.0 - 0.1/(10.0 - 0.7*x)**1.0 + 0.9)**1.0 - 1.02*x + 0.5/(0.5*x**2.0 - 0.1/(10.0 - 0.7*x)**1.0 + 0.9)**1.0 + 20.6 |
d_bacres2 | 0.0127714 | 197ms | 541ms | 10-(x*y/(1+0.5*x**2)) |
-0.6*y/(0.3*x + 0.1)**1.0 + 0.1*y/(-3.5*x + 1.6*x**2.0 + 1.9)**1.0 - 0.3/(0.3*x + 0.1)**1.0 + 5.9/(-3.5*x + 1.6*x**2.0 + 1.9)**1.0 + 10.0 |
d_barmag1 | 0.00167878 | 10299ms | 40760ms | 0.5*sin(x-y)-sin(x) |
-1.0*sin(x) + 0.5*sin(x - 1.0*y) |
d_barmag2 | 0.000946167 | 29806ms | 77585ms | 0.5*sin(y-x)-sin(y) |
-1.0*sin(y) - 0.5*sin(x - 1.0*y) |
d_glider1 | 0.0164986 | 18617ms | 19017ms | -0.05*x**2-sin(y) |
-1.0*sin(y) |
d_glider2 | 0.0154252 | 42ms | 336ms | x-cy/x |
1.0*(-cy + x**2.0)/x**1.0 |
d_lv1 | 0.00831714 | 7196ms | 7750ms | 3*x-2*x*y-x**2 |
-2.0*x*y + 3.0*x - 1.0*x**2.0 |
d_lv2 | 0.00166309 | 4129ms | 4496ms | 2*y-x*y-y**2 |
-1.0*x*y + 2.0*y - 1.0*y**2.0 |
d_shearflow1 | 0.000936923 | 118ms | 61044ms | cos(x)*cot(y) |
cos(x)*cot(y) |
d_shearflow2 | 1.62147 | 9ms | 325ms | (cy**2+0.1*sy**2)*sx |
1.1*cy**2.0*sx |
d_vdp1 | 0.0325666 | 37ms | 389ms | 10*(y-(1/3*(x**3-x))) |
3.3*x - 3.3*x**3.0 + 10.0*y |
d_vdp2 | 2.84792e-06 | 98ms | 414ms | -0.1*x |
-0.1*x |