diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index dcb80cb556f5ccdd8626ba6cbbaccb89cd80c392..e35f59d2051aee6a1e6f9b528ab47fcd01e13c8d 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -19,4 +19,3 @@ body: attributes: value: | Be sure to check out the [PySR forums](https://github.com/MilesCranmer/PySR/discussions) to chat with other users about PySR use-cases! - diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index cd56769bbfb755ce0fdf9c0a893bde5cc22e68bb..b863a4d8f582fc3913802d4003be14ec2b6781ec 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -32,7 +32,7 @@ jobs: julia-version: ['1.9'] python-version: ['3.10'] os: [ubuntu-latest] - + steps: - uses: actions/checkout@v3 - name: "Set up Julia" @@ -96,7 +96,7 @@ jobs: matrix: python-version: ['3.9'] os: ['ubuntu-latest'] - + steps: - uses: actions/checkout@v3 - name: "Cache conda" @@ -129,7 +129,7 @@ jobs: coveralls: name: Indicate completion to coveralls.io - needs: + needs: - test runs-on: ubuntu-latest defaults: diff --git a/.github/workflows/CI_Windows.yml b/.github/workflows/CI_Windows.yml index 73fb1f45d9a02316950fd9be55921d88c45c41e5..5ca0cce21482a050da6259f64d8cd4675bfd1eff 100644 --- a/.github/workflows/CI_Windows.yml +++ b/.github/workflows/CI_Windows.yml @@ -32,7 +32,7 @@ jobs: julia-version: ['1.9'] python-version: ['3.10'] os: [windows-latest] - + steps: - uses: actions/checkout@v3 - name: "Set up Julia" diff --git a/.github/workflows/CI_conda_forge.yml b/.github/workflows/CI_conda_forge.yml index 9fbb4be70b973d30b42a61aa935501bc36043e2a..51c70f9a6b63ab5af3573ea4cd3002ef183233a5 100644 --- a/.github/workflows/CI_conda_forge.yml +++ b/.github/workflows/CI_conda_forge.yml @@ -23,7 +23,7 @@ jobs: python-version: ['3.8', '3.9', '3.10', '3.11'] os: ['ubuntu-latest', 'macos-latest'] use-mamba: [true, false] - + steps: - name: "Set up Conda" uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/CI_docker_large_nightly.yml b/.github/workflows/CI_docker_large_nightly.yml index c9a7a8063d764adb99acd4a45491739cc839cecc..7c8ac50808cc808e4d41e89dd067b8ebc6615416 100644 --- a/.github/workflows/CI_docker_large_nightly.yml +++ b/.github/workflows/CI_docker_large_nightly.yml @@ -22,8 +22,8 @@ jobs: python-version: ['3.10'] os: [ubuntu-latest] arch: ['linux/amd64', 'linux/arm64'] - - + + steps: - uses: actions/checkout@v3 - name: Set up QEMU diff --git a/.github/workflows/CI_large_nightly.yml b/.github/workflows/CI_large_nightly.yml index eddfec137b25d6b47dd5e66b76f7961f23dd3bd5..950072b5e53df9d62c586b7208cb8ce097daaf1e 100644 --- a/.github/workflows/CI_large_nightly.yml +++ b/.github/workflows/CI_large_nightly.yml @@ -26,7 +26,7 @@ jobs: julia-version: ['1.6', '1.8', '1.9'] python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] os: [ubuntu-latest, macos-latest, windows-latest] - + steps: - uses: actions/checkout@v3 - name: "Set up Julia" diff --git a/.github/workflows/CI_mac.yml b/.github/workflows/CI_mac.yml index 783f1b3c84c6c114f9d79915521002be4e5f491b..6edb13ca27e8e844151ec0d276b50637bc9b943d 100644 --- a/.github/workflows/CI_mac.yml +++ b/.github/workflows/CI_mac.yml @@ -32,7 +32,7 @@ jobs: julia-version: ['1.9'] python-version: ['3.10'] os: [macos-latest] - + steps: - uses: actions/checkout@v3 - name: "Set up Julia" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b0be5146710e79af9f59428ff6e3e8dd5c9ed26c..5605428d8da7fd30f49583ae675cd1a0b65639d2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -37,11 +37,11 @@ jobs: # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. - + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality - + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild @@ -50,7 +50,7 @@ jobs: # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - # If the Autobuild fails above, remove it and uncomment the following three lines. + # If the Autobuild fails above, remove it and uncomment the following three lines. # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. # - run: | diff --git a/.github/workflows/docker_deploy.yml b/.github/workflows/docker_deploy.yml index 14d6bd85d1af418b8a7b42dd47b67c54f93cc710..c7bc0e6a60e6ebb75ee6665cb831b0b88257b5ec 100644 --- a/.github/workflows/docker_deploy.yml +++ b/.github/workflows/docker_deploy.yml @@ -9,7 +9,7 @@ on: tags: - "v*.*.*" workflow_dispatch: - + jobs: docker: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 42c5975a5026c14a2fa6ad8fc7a74c09dc07065d..2abe1477964bd9ee84f70129d747395d4dc26111 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -18,7 +18,7 @@ jobs: defaults: run: shell: bash - + steps: - uses: actions/checkout@v3 - name: "Set up Python" @@ -33,4 +33,4 @@ jobs: - name: "Build API docs" run: cd docs && ./gen_docs.sh - name: "Deploy documentation" - run: mkdocs gh-deploy --force \ No newline at end of file + run: mkdocs gh-deploy --force diff --git a/.github/workflows/update_backend.yml b/.github/workflows/update_backend.yml index a1ab23bef5fe4f56ddb8536336ee49bfc45a915e..3b47b700ae28418fa5fd3e7af14a58974ad63d8b 100644 --- a/.github/workflows/update_backend.yml +++ b/.github/workflows/update_backend.yml @@ -48,7 +48,7 @@ jobs: CURRENT_PYSR_PATCH_VERSION=$(python -c 'import pysr; print(pysr.version.__version__.split(".")[-1], end="")' 2>/dev/null) NEW_PYSR_PATCH_VERSION=$((CURRENT_PYSR_PATCH_VERSION + 1)) sed -i "s/^__version__ = .*/__version__ = \"$(python -c 'import pysr; print(".".join(pysr.version.__version__.split(".")[:-1]), end="")' 2>/dev/null).${NEW_PYSR_PATCH_VERSION}\"/" pysr/version.py - + # Set SymbolicRegression.jl version: sed -i "s/^__symbolic_regression_jl_version__ = .*/__symbolic_regression_jl_version__ = \"${{ steps.get-latest.outputs.version }}\"/" pysr/version.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d1c0ed857745c86b307010bc945ba4cbfc731a0c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,31 @@ +repos: + # General linting + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + # General formatting + - repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + - id: black-jupyter + # Stripping notebooks + - repo: https://github.com/kynan/nbstripout + rev: 0.6.1 + hooks: + - id: nbstripout + # Unused imports + - repo: https://github.com/hadialqattan/pycln + rev: "v2.2.2" + hooks: + - id: pycln + # Sorted imports + - repo: https://github.com/PyCQA/isort + rev: "5.12.0" + hooks: + - id: isort + additional_dependencies: [toml] diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 5c7bcfc0b656e7255b1b2404ffbcb2e606123654..f1695ea758c184e7146c95eb10ef7e2657187d74 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -121,4 +121,4 @@ Thanks for being part of the PySR community! - \ No newline at end of file + diff --git a/README.md b/README.md index aa65563af6a1e2c98e2a582ccdd51281af071cc2..e7db9d506b6441d99665bc558cfd4a23a335c4da 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ The PySR build in conda includes all required dependencies, so you can install i conda install -c conda-forge pysr ``` -from within your target conda environment. +from within your target conda environment. However, note that the conda install does not support precompilation of Julia libraries, so the start time may be slightly slower as the JIT-compilation will be running. @@ -305,7 +305,7 @@ model = PySRRegressor( # ^ 2 populations per core, so one is always running. population_size=50, # ^ Slightly larger populations, for greater diversity. - ncyclesperiteration=500, + ncyclesperiteration=500, # ^ Generations between migrations. niterations=10000000, # Run forever early_stop_condition=( diff --git a/benchmarks/README.md b/benchmarks/README.md index 3cedfd4f3094873e57e8abd19ef8ee09a7b8715c..b8a5221c064aba5a16f75ace1ae86422b5ea5ea3 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -21,7 +21,7 @@ v0.3.6 | 25900 v0.3.7 | 26600 v0.3.8 | 7470 v0.3.9 | 6760 -v0.3.10 | +v0.3.10 | v0.3.11 | 19500 v0.3.12 | 19000 v0.3.13 | 15200 diff --git a/benchmarks/hyperparamopt.py b/benchmarks/hyperparamopt.py index 3c933f89e647a75c195052bb7f2ca9f10923666b..e6f4b1cf03c41aa2325d7b67ba1b3316741ac481 100644 --- a/benchmarks/hyperparamopt.py +++ b/benchmarks/hyperparamopt.py @@ -1,13 +1,15 @@ """Start a hyperoptimization from a single node""" -import sys -import numpy as np import pickle as pkl -from pysr import PySRRegressor +import sys + import hyperopt -from hyperopt import hp, fmin, tpe, Trials +import numpy as np +from hyperopt import Trials, fmin, hp, tpe from hyperopt.fmin import generate_trials_to_calculate from space import * +from pysr import PySRRegressor + # Change the following code to your file ################################################################################ TRIALS_FOLDER = "trials2" diff --git a/benchmarks/print_best_model.py b/benchmarks/print_best_model.py index 880a4da34a0c0c16a226a7b52b8fb74091e7a7ed..3dd9a6b1a39bc14ab45c66249cd60b4f74d1b011 100644 --- a/benchmarks/print_best_model.py +++ b/benchmarks/print_best_model.py @@ -1,12 +1,11 @@ """Print the best model parameters and loss""" -import sys -import numpy as np import pickle as pkl -import hyperopt -from hyperopt import hp, fmin, tpe, Trials -from space import space from pprint import PrettyPrinter +import hyperopt +import numpy as np +from hyperopt import Trials, fmin, hp, tpe +from space import space # Change the following code to your file ################################################################################ @@ -51,7 +50,6 @@ import glob path = TRIALS_FOLDER + "/*.pkl" files = 0 for fname in glob.glob(path): - trials_obj = pkl.load(open(fname, "rb")) n_trials = trials_obj["n"] trials_obj = trials_obj["trials"] diff --git a/benchmarks/space.py b/benchmarks/space.py index 284addd7237441b437160815874cd0ed63068e2a..5d6a2e4eba792c3ee03fae1e6d0dcf67a1edf022 100644 --- a/benchmarks/space.py +++ b/benchmarks/space.py @@ -1,5 +1,5 @@ import numpy as np -from hyperopt import hp, fmin, tpe, Trials +from hyperopt import Trials, fmin, hp, tpe binary_operators = ["*", "/", "+", "-"] unary_operators = ["sin", "cos", "exp", "log"] diff --git a/datasets/FeynmanEquations.csv b/datasets/FeynmanEquations.csv index bd321d81ab4b586a74fc20942fd9e909a43fed09..bd80cfba0b4bf59d6b99bb98fbc6445101f6ce48 100644 --- a/datasets/FeynmanEquations.csv +++ b/datasets/FeynmanEquations.csv @@ -98,4 +98,4 @@ III.15.14,10,96,m,(h/(2*pi))**2/(2*E_n*d**2),3,h,1,5,E_n,1,5,d,1,5,,,,,,,,,,,,,, III.15.27,10,97,k,2*pi*alpha/(n*d),3,alpha,1,5,n,1,5,d,1,5,,,,,,,,,,,,,,,,,,,,, III.17.37,10,98,f,beta*(1+alpha*cos(theta)),3,beta,1,5,alpha,1,5,theta,1,5,,,,,,,,,,,,,,,,,,,,, III.19.51,10,99,E_n,-m*q**4/(2*(4*pi*epsilon)**2*(h/(2*pi))**2)*(1/n**2),5,m,1,5,q,1,5,h,1,5,n,1,5,epsilon,1,5,,,,,,,,,,,,,,, -III.21.20,10,100,j,-rho_c_0*q*A_vec/m,4,rho_c_0,1,5,q,1,5,A_vec,1,5,m,1,5,,,,,,,,,,,,,,,,,, \ No newline at end of file +III.21.20,10,100,j,-rho_c_0*q*A_vec/m,4,rho_c_0,1,5,q,1,5,A_vec,1,5,m,1,5,,,,,,,,,,,,,,,,,, diff --git a/docs/.gitignore b/docs/.gitignore index e59a8b16fb719525535a0566758a29f631dac10a..43130b842729f45d07d8a18a48eb0bc472ecbe3c 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,4 +1,4 @@ build api.md index.md.bak -papers.md \ No newline at end of file +papers.md diff --git a/docs/_api.md b/docs/_api.md index 2cd838e14ce86fcffa0e0a7d8366f82087ede9d9..bbc6c1f2f2a1f5c3e033adf765bec3fbe77fa058 100644 --- a/docs/_api.md +++ b/docs/_api.md @@ -6,7 +6,7 @@ Let's look at them below. PARAMSKEY ## PySRRegressor Functions - + ::: pysr.PySRRegressor.fit options: show_root_heading: true @@ -60,5 +60,3 @@ PARAMSKEY show_root_heading: true heading_level: 3 show_root_full_path: false - - diff --git a/docs/assets/pysr_logo.svg b/docs/assets/pysr_logo.svg index 0b8e8fa7cb6570ce7b1c555bab6f3c6716d190b4..7de145bd8aaf376ef624abdc6d66e2e215d8e05c 100644 --- a/docs/assets/pysr_logo.svg +++ b/docs/assets/pysr_logo.svg @@ -1 +1 @@ -PySR \ No newline at end of file +PySR diff --git a/docs/assets/pysr_logo_reduced.svg b/docs/assets/pysr_logo_reduced.svg index da33798c7079f69a2f4ca55c848314b59e7cd2c4..162d20c2a1642634483c64523dcdae4c5f6d68cd 100644 --- a/docs/assets/pysr_logo_reduced.svg +++ b/docs/assets/pysr_logo_reduced.svg @@ -12,7 +12,7 @@ .st6{letter-spacing:1;} - + diff --git a/docs/backend.md b/docs/backend.md index 7bf1d7dc5fb9d122b0b61c8e57c06126ef5d732a..0c7afdbf80285e4f57ad6f2dc2d0fc36a8ea2a70 100644 --- a/docs/backend.md +++ b/docs/backend.md @@ -12,7 +12,7 @@ Generally you can do this as follows: git clone https://github.com/MilesCranmer/SymbolicRegression.jl ``` 2. Edit the source code in `src/` to your requirements: - - The documentation for the backend is given [here](https://astroautomata.com/SymbolicRegression.jl/dev/). + - The documentation for the backend is given [here](https://astroautomata.com/SymbolicRegression.jl/dev/). - Throughout the package, you will often see template functions which typically use a symbol `T` (such as in the string `where {T<:Real}`). Here, `T` is simply the datatype of the input data and stored constants, such as `Float32` or `Float64`. Writing functions in this way lets us write functions generic to types, while still having access to the specific type specified at compilation time. - Expressions are stored as binary trees, using the `Node{T}` type, described [here](https://astroautomata.com/SymbolicRegression.jl/dev/types/#SymbolicRegression.CoreModule.EquationModule.Node). - Parts of the code which are typically edited by users include: @@ -26,4 +26,4 @@ git clone https://github.com/MilesCranmer/SymbolicRegression.jl If you get comfortable enough with the backend, you might consider using the Julia package directly: the API is given on the [SymbolicRegression.jl documentation](https://astroautomata.com/SymbolicRegression.jl/dev/). -If you make a change that you think could be useful to other users, don't hesitate to open a pull request on either the PySR or SymbolicRegression.jl repositories! Contributions are very appreciated. \ No newline at end of file +If you make a change that you think could be useful to other users, don't hesitate to open a pull request on either the PySR or SymbolicRegression.jl repositories! Contributions are very appreciated. diff --git a/docs/gen_param_docs.py b/docs/gen_param_docs.py index 6016c584b09ec18dc7d96be981efdfa6a5de4aed..8b12ab9bff7b56c827aadb5c7069906651a921f6 100644 --- a/docs/gen_param_docs.py +++ b/docs/gen_param_docs.py @@ -1,13 +1,14 @@ # Load YAML file param_groupings.yml: -from pathlib import Path -from yaml import safe_load +import re import sys +from docstring_parser import parse +from yaml import safe_load + sys.path.append("..") + + from pysr import PySRRegressor -import pysr -import re -from docstring_parser import parse found_params = [] diff --git a/docs/generate_papers.py b/docs/generate_papers.py index 2ac1d90b3b80f8f2f87ff0be85995fa4410250ac..1ac82fc178d319a108d873000fdb46e20ea9cee5 100644 --- a/docs/generate_papers.py +++ b/docs/generate_papers.py @@ -1,7 +1,8 @@ """This script generates the papers.md file from the papers.yml file.""" -import yaml from pathlib import Path +import yaml + data_file = "papers.yml" papers_header = Path("stylesheets") / "papers_header.txt" output_file = "papers.md" @@ -49,7 +50,7 @@ with open(output_file, "w") as f:
{authors} - + {affiliations}
diff --git a/docs/operators.md b/docs/operators.md index 2b0784b39281f635bee64f7eadd98e032bd3c06f..1d37f36728acd02498a0e67e7507c5d2c7dc406e 100644 --- a/docs/operators.md +++ b/docs/operators.md @@ -64,5 +64,3 @@ instead of `1.5e3`, if you write any constant numbers. Your operator should work with the entire real line (you can use abs(x) for operators requiring positive input - see `log_abs`); otherwise the search code will experience domain errors. - - diff --git a/docs/options.md b/docs/options.md index 2320d3433e1c690ab25bd0a2793136bbc6e80678..5eee94d8e7c55566c7a7edab2f44c3ea2086c2d8 100644 --- a/docs/options.md +++ b/docs/options.md @@ -265,7 +265,7 @@ PySRRegressor(..., loss="loss(x, y) = abs(x * y)") With weights: ```python -model = PySRRegressor(..., loss="myloss(x, y, w) = w * abs(x - y)") +model = PySRRegressor(..., loss="myloss(x, y, w) = w * abs(x - y)") model.fit(..., weights=weights) ``` diff --git a/docs/papers.yml b/docs/papers.yml index 0ee2780a9124827e5f0bc40c82962c40fca79731..94d3b228c0e018ee9abe1628be76809cdaa7ce1f 100644 --- a/docs/papers.yml +++ b/docs/papers.yml @@ -151,7 +151,6 @@ papers: abstract: "We present an approach for using machine learning to automatically discover the governing equations and hidden properties of real physical systems from observations. We train a \"graph neural network\" to simulate the dynamics of our solar system's Sun, planets, and large moons from 30 years of trajectory data. We then use symbolic regression to discover an analytical expression for the force law implicitly learned by the neural network, which our results showed is equivalent to Newton's law of gravitation. The key assumptions that were required were translational and rotational equivariance, and Newton's second and third laws of motion. Our approach correctly discovered the form of the symbolic force law. Furthermore, our approach did not require any assumptions about the masses of planets and moons or physical constants. They, too, were accurately inferred through our methods. Though, of course, the classical law of gravitation has been known since Isaac Newton, our result serves as a validation that our method can discover unknown laws and hidden properties from observed data. More broadly this work represents a key step toward realizing the potential of machine learning for accelerating scientific discovery." image: rediscovering_gravity.png date: 2022-02-04 - link: https://arxiv.org/abs/2202.02306 - title: (Thesis) On Neural Differential Equations - Section 6.1 authors: - Patrick Kidger (1) diff --git a/docs/requirements.txt b/docs/requirements.txt index 29381320e63368d79e5ef1fbf642e8dd2a80dd88..064f3d54314ff9fb413b30c3c34bc33523f34e6d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ mkdocs-material mkdocs-autorefs mkdocstrings[python] -docstring_parser \ No newline at end of file +docstring_parser diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 7476727237c6dcb23d1ac6a564172124fd5bd797..8db9047e24c5ac76e166cb26cc96ea9c8a7d7740 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -2,4 +2,4 @@ --md-primary-fg-color: #C13245; --md-primary-fg-color--light: #D35364; --md-primary-fg-color--dark: #982736; -} \ No newline at end of file +} diff --git a/docs/stylesheets/papers_header.txt b/docs/stylesheets/papers_header.txt index 09e0083423304fc585238bbb663861e2ef479dd1..e1e908a36a309ea383386a7350fd998a722ab084 100644 --- a/docs/stylesheets/papers_header.txt +++ b/docs/stylesheets/papers_header.txt @@ -6,4 +6,3 @@ These are sorted by the date of release, with most recent papers at the top. If you have used PySR in your research, please submit a pull request to add your paper to [this file](https://github.com/MilesCranmer/PySR/blob/master/docs/papers.yml). - diff --git a/docs/tuning.md b/docs/tuning.md index 34ac682f7413a3ff80865e2bcd425e71877befc9..954d7e5f8aafb8a398c3c79ba5aaa322a60e14a7 100644 --- a/docs/tuning.md +++ b/docs/tuning.md @@ -17,7 +17,7 @@ I run from IPython (Jupyter Notebooks don't work as well[^1]) on the head node o 5. Set `ncyclesperiteration` to maybe `5000` or so, until the head node occupation is under `10%`. 6. Set `constraints` and `nested_constraints` as strict as possible. These can help quite a bit with exploration. Typically, if I am using `pow`, I would set `constraints={"pow": (9, 1)}`, so that power laws can only have a variable or constant as their exponent. If I am using `sin` and `cos`, I also like to set `nested_constraints={"sin": {"sin": 0, "cos": 0}, "cos": {"sin": 0, "cos": 0}}`, so that sin and cos can't be nested, which seems to happen frequently. (Although in practice I would just use `sin`, since the search could always add a phase offset!) 7. Set `maxsize` a bit larger than the final size you want. e.g., if you want a final equation of size `30`, you might set this to `35`, so that it has a bit of room to explore. -8. Set `maxdepth` strictly, but leave a bit of room for exploration. e.g., if you want a final equation limited to a depth of `5`, you might set this to `6` or `7`, so that it has a bit of room to explore. +8. Set `maxdepth` strictly, but leave a bit of room for exploration. e.g., if you want a final equation limited to a depth of `5`, you might set this to `6` or `7`, so that it has a bit of room to explore. 9. Set `parsimony` equal to about the minimum loss you would expect, divided by 5-10. e.g., if you expect the final equation to have a loss of `0.001`, you might set `parsimony=0.0001`. 10. Set `weight_optimize` to some larger value, maybe `0.001`. This is very important if `ncyclesperiteration` is large, so that optimization happens more frequently. 11. Set `turbo` to `True`. This may or not work, if there's an error just turn it off (some operators are not SIMD-capable). If it does work, it should give you a nice 20% speedup. @@ -31,7 +31,7 @@ Some things I try out to see if they help: 2. Try setting `adaptive_parsimony_scaling` a bit larger, maybe up to `1000`. 3. Sometimes I try using `warmup_maxsize_by`. This is useful if you find that the search finds a very complex equation very quickly, and then gets stuck. It basically forces it to start at the simpler equations and build up complexity slowly. 4. Play around with different losses: - - I typically try `L2DistLoss()` and `L1DistLoss()`. L1 loss is more robust to outliers compared to L2 (L1 finds the median, while L2 finds the mean of a random variable), so is often a good choice for a noisy dataset. + - I typically try `L2DistLoss()` and `L1DistLoss()`. L1 loss is more robust to outliers compared to L2 (L1 finds the median, while L2 finds the mean of a random variable), so is often a good choice for a noisy dataset. - I might also provide the `weights` parameter to `fit` if there is some reasonable choice of weighting. For example, maybe I know the signal-to-noise of a particular row of `y` - I would set that SNR equal to the weights. Or, perhaps I do some sort of importance sampling, and weight the rows by importance. Very rarely I might also try tuning the mutation weights, the crossover probability, or the optimization parameters. I never use `denoise` or `select_k_features` as I find they aren't very useful. diff --git a/environment.yml b/environment.yml index 62b6c9208f4b3d5e8b90e4c1adfa3dd0e3d28a97..9eea93761baad4a8bd448dca2e06c7ddf1b2c653 100644 --- a/environment.yml +++ b/environment.yml @@ -10,4 +10,4 @@ dependencies: - pyjulia - openlibm - openspecfun - - click \ No newline at end of file + - click diff --git a/examples/pysr_demo.ipynb b/examples/pysr_demo.ipynb index b784bbfd1af21d4e2143c84a0dcce8b1397a051e..31d475985155eb461c12acd49e4b274d6ec25caf 100644 --- a/examples/pysr_demo.ipynb +++ b/examples/pysr_demo.ipynb @@ -1,1465 +1,1474 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "DS4E1PagbDgL" - }, - "source": [ - "# Setup" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tQ1r1bbb0yBv" - }, - "source": [ - "\n", - "## Instructions\n", - "1. Work on a copy of this notebook: _File_ > _Save a copy in Drive_ (you will need a Google account).\n", - "2. (Optional) If you would like to do the deep learning component of this tutorial, turn on the GPU with Edit->Notebook settings->Hardware accelerator->GPU\n", - "3. Execute the following cell (click on it and press Ctrl+Enter) to install Julia, IJulia and other packages (if needed, update `JULIA_VERSION` and the other parameters). This takes a couple of minutes.\n", - "4. Continue to the next section.\n", - "\n", - "_Notes_:\n", - "* If your Colab Runtime gets reset (e.g., due to inactivity), repeat steps 3, 4.\n", - "* After installation, if you want to change the Julia version or activate/deactivate the GPU, you will need to reset the Runtime: _Runtime_ > _Delete and disconnect runtime_ and repeat steps 2-4." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "COndi88gbDgO" - }, - "source": [ - "**Run the following code to install Julia**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GIeFXS0F0zww" - }, - "outputs": [], - "source": [ - "%%shell\n", - "set -e\n", - "\n", - "#---------------------------------------------------#\n", - "JULIA_VERSION=\"1.8.5\"\n", - "export JULIA_PKG_PRECOMPILE_AUTO=0\n", - "#---------------------------------------------------#\n", - "\n", - "if [ -z `which julia` ]; then\n", - " # Install Julia\n", - " JULIA_VER=`cut -d '.' -f -2 <<< \"$JULIA_VERSION\"`\n", - " echo \"Installing Julia $JULIA_VERSION on the current Colab Runtime...\"\n", - " BASE_URL=\"https://julialang-s3.julialang.org/bin/linux/x64\"\n", - " URL=\"$BASE_URL/$JULIA_VER/julia-$JULIA_VERSION-linux-x86_64.tar.gz\"\n", - " wget -nv $URL -O /tmp/julia.tar.gz # -nv means \"not verbose\"\n", - " tar -x -f /tmp/julia.tar.gz -C /usr/local --strip-components 1\n", - " rm /tmp/julia.tar.gz\n", - "\n", - " echo \"Installing PyCall.jl...\"\n", - " julia -e 'using Pkg; Pkg.add(\"PyCall\"); Pkg.build(\"PyCall\")'\n", - " julia -e 'println(\"Success\")'\n", - "\n", - "fi" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ORv1c6xvbDgV" - }, - "source": [ - "Install PySR and PyTorch-Lightning:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "EhMRSZEYFPLz" - }, - "outputs": [], - "source": [ - "%pip install -Uq pysr pytorch_lightning" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "etTMEV0wDqld" - }, - "source": [ - "The following step is not normally required, but colab's printing is non-standard and we need to manually set it up PyJulia:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "j666aOI8xWF_" - }, - "outputs": [], - "source": [ - "from julia import Julia\n", - "\n", - "julia = Julia(compiled_modules=False, threads='auto')\n", - "from julia import Main\n", - "from julia.tools import redirect_output_streams\n", - "\n", - "redirect_output_streams()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6u2WhbVhht-G" - }, - "source": [ - "Let's install the backend of PySR, and all required libraries.\n", - "\n", - "**(This may take some time)**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "J-0QbxyK1_51" - }, - "outputs": [], - "source": [ - "import pysr\n", - "\n", - "# We don't precompile in colab because compiled modules are incompatible static Python libraries:\n", - "pysr.install(precompile=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "vFpyRxmhFqeH" - }, - "outputs": [], - "source": [ - "import sympy\n", - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "from pysr import PySRRegressor\n", - "from sklearn.model_selection import train_test_split" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gsRMQ7grbDga" - }, - "source": [ - "# Simple PySR example:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "myTEwdiUFiGL" - }, - "source": [ - "First, let's learn a simple function\n", - "\n", - "$$2.5382 \\cos(x3) + x0^2 - 2$$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Cb1eb2XuFQh8" - }, - "outputs": [], - "source": [ - "# Dataset\n", - "np.random.seed(0)\n", - "X = 2 * np.random.randn(100, 5)\n", - "y = 2.5382 * np.cos(X[:, 3]) + X[:, 0] ** 2 - 2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cturCkaVjzLs" - }, - "source": [ - "By default, we will set up 30 populations of expressions (which evolve independently except for migrations), use 4 threads, and use `\"best\"` for our model selection strategy:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "4nDAAnisdhTc" - }, - "outputs": [], - "source": [ - "default_pysr_params = dict(\n", - " populations=30,\n", - " model_selection=\"best\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "N4gANfkaj8ie" - }, - "source": [ - "PySR can run for arbitrarily long, and continue to find more and more accurate expressions. You can set the total number of cycles of evolution with `niterations`, although there are also a [few more ways](https://github.com/MilesCranmer/PySR/pull/134) to stop execution.\n", - "\n", - "**This first execution will take a bit longer to startup, as the library is JIT-compiled. The next execution will be much faster.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "p4PSrO-NK1Wa" - }, - "outputs": [], - "source": [ - "# Learn equations\n", - "model = PySRRegressor(\n", - " niterations=30,\n", - " binary_operators=[\"plus\", \"mult\"],\n", - " unary_operators=[\"cos\", \"exp\", \"sin\"],\n", - " **default_pysr_params\n", - ")\n", - "\n", - "model.fit(X, y)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-bsAECbdkQsQ" - }, - "source": [ - "We can print the model, which will print out all the discovered expressions:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "4HR8gknlZz4W" - }, - "outputs": [], - "source": [ - "model" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ME3ddPxXkWQg" - }, - "source": [ - "We can also view the SymPy format of the best expression:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "IQKOohdpztS7" - }, - "outputs": [], - "source": [ - "model.sympy()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EHIIPlmClltn" - }, - "source": [ - "We can also view the SymPy of any other expression in the list, using the index of it in `model.equations_`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GRcxq-TTlpRX" - }, - "outputs": [], - "source": [ - "model.sympy(2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YMugcGX4tbqj" - }, - "source": [ - "## Output" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gIWt5wz5cjXE" - }, - "source": [ - "`model.equations_` is a Pandas DataFrame. We can export the results in various ways:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "HFGaNL6tbDgi" - }, - "outputs": [], - "source": [ - "model.latex()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4hS8kqutcmPQ" - }, - "source": [ - "These is also `model.sympy(), model.jax(), model.pytorch()`. All of these can take an index as input, to get the result for an arbitrary equation in the list.\n", - "\n", - "We can also use `model.predict` for arbitrary equations, with the default equation being the one chosen by `model_selection`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Vbz4IMsk2NYH" - }, - "outputs": [], - "source": [ - "ypredict = model.predict(X)\n", - "ypredict_simpler = model.predict(X, 2)\n", - "\n", - "print(\"Default selection MSE:\", np.power(ypredict - y, 2).mean())\n", - "print(\"Manual selection MSE for index 2:\", np.power(ypredict_simpler - y, 2).mean())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SQDUScGebDgr" - }, - "source": [ - "# Custom operators" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qvgVbOoSFtQY" - }, - "source": [ - "A full list of operators is given here: https://astroautomata.com/PySR/operators,\n", - "but we can also use any binary or unary operator in `julia`, or define our own as arbitrary functions.\n", - "\n", - "Say that we want a command to do quartic powers:\n", - "\n", - "$$ y = x_0^4 - 2 $$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "JvXOVqSyFsdr" - }, - "outputs": [], - "source": [ - "y = X[:, 0] ** 4 - 2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-zoqaL8KGSK5" - }, - "source": [ - "We can do this by passing a string in Julia syntax.\n", - "\n", - "We also define the operator in sympy, with `extra_sympy_mappings`, to enable its use in `predict`, and other export functions." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "PoEkpvYuGUdy" - }, - "outputs": [], - "source": [ - "model = PySRRegressor(\n", - " niterations=5,\n", - " populations=40,\n", - " binary_operators=[\"plus\", \"mult\"],\n", - " unary_operators=[\"cos\", \"exp\", \"sin\", \"quart(x) = x^4\"],\n", - " extra_sympy_mappings={\"quart\": lambda x: x**4},\n", - ")\n", - "model.fit(X, y)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "emn2IajKbDgy" - }, - "outputs": [], - "source": [ - "model.sympy()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wbWHyOjl2_kX" - }, - "source": [ - "Since `quart` is arguably more complex than the other operators, you can also give it a different complexity, using, e.g., `complexity_of_operators={\"quart\": 2}` to give it a complexity of 2 (instead of the default 2). You can also define custom complexities for variables and constants (`complexity_of_variables` and `complexity_of_constants`, respectively - both take a single number).\n", - "\n", - "\n", - "One can also add a binary operator, with, e.g., `\"myoperator(x, y) = x^2 * y\"`. All Julia operators that work on scalar 32-bit floating point values are available.\n", - "\n", - "Make sure that any operator you add is valid over the real line. So, e.g., you will need to define `\"mysqrt(x) = sqrt(abs(x))\"` to enable it for negative numbers,\n", - "or, simply have it return a very large number for bad inputs (to prevent negative input in a soft way):\n", - "`\"mysqrt(x::T) where {T} = (x >= 0) ? x : T(-1e9)\"` (Julia syntax for a template function of input type `T`), which will make `mysqrt(x)` return -10^9 for negative x–hurting the loss of the equation." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pEXT4xskbDg0" - }, - "source": [ - "## Scoring" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IyeYbVVOG60w" - }, - "source": [ - "Using `model_selection=\"best\"`selects the equation with the max score and prints it. But in practice it is best to look through all the equations manually, select an equation above some MSE threshold, and then use the score to select among that loss threshold.\n", - "\n", - "Here, \"score\" is defined by:\n", - "$$ \\text{score} = - \\log(\\text{loss}_i/\\text{loss}_{i-1})/\n", - "(\\text{complexity}_i - \\text{complexity}_{i-1})$$" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "I3IxmvSQrhfw" - }, - "source": [ - "This scoring is motivated by the common strategy of looking for drops in the loss-complexity curve.\n", - "\n", - "From Schmidt & Lipson (2009) -" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eUeXyoLxrd8o" - }, - "source": [ - "![F4.large.jpg](data:image/jpeg;base64,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K7BEjcE/Lkt/Dx1HNUvCunQ+KdPujoyCLQg6x30NwSruD97b1P3eOCKAPd9A8N+DdD+GnjRPCtjNZ6VLZznUIZndnkAhYHbuY4+XI4Ir59+A+n+DbjxJYw6DpzrG1/b+fHdgurYjmKcMSODk1lV+B/L8z08u/j/J/kdt/wAE154dS+EPjDUDYadaXr+MdTtpZrGyjt2nWNkCGTYo3EbjyfWvrmtTzpbsKKCQooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKAP//S/VKigAooAKKACigDivG//I7/AA7/AOwpc/8Apvua7Py1IA2jA6DHSgBDEjDBRSOmCKabWEjHkxkem0UAILK3AwIIsf7gpEsbeMYW3iXJzgIBz60ASPCkigMisB0DDOKEgijbcsaKx7hQDQAn2aHdu8pN3rtGaJLaGb78SP8A7yg0AIbSE9YYz9UFILK3HSCL/vgUANOn2xbcbeEt6mMUg0uzAIFpAAeoES8/pQBVbw5pxdmFlbDd1/cL/hUF94T028szb/YrReQdxt1NAFTSfA2n6bcSSNbWkwZdoX7OoxzTfGOg6WvhHXCNNtOLGc4ECj/lm3tQB8z/AAJS2ufgZ8T5TZRo8drIQWQZ/wCPZjxxXR/sg6fBrPwy8UIYIzK920au6BiP3K4/nQB7Hong06Z4U12wkKML2GRMGLAwYyvI79a8Z8P+AofBXifw2YkgX7RqCA+TCI/uxSdfXrWNX4PuPTy7+P8AKX5MwP8AgmH/AMkM8X/9jzrH/ocdfX1bHnS3CigkKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigD//T/VKigD5O1T9oT4/an468TaT4T+E/h6/0vTtYu9NsZ9W137DcXyQFcypFIAWXDKdy5XnrU1r8cv2jND8UeFYPF/wc0TTtB1XWbTS7m/0vWTey2yzPtMpjQEhVGSWOFHcigZ9V14/+0B8XV8I/CjxNeeFda06TxPbmCyhCTJM1pLPcx23mtGCfuGXdhhjKgGgRl+AH1n4cfHlvh/deKNX8V6Nqfhs63DNr0qz3Nvcw3CQyhZFVf3cglRthGFZT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vxHr02lNoPi+bwvHbSl7qOLT4Lr7YmV+QmUEp0blefm9hQBk6p4euf8AhdXhfUrawZdOh0bVY7i5jjARZpZrIqGI/iYRuffaa8j+HHgTxJbz/C/wLeaBfWUHw81K4vrvXZ0As72MQXMFt9nIPztItyHYf8s9hU5OKAPp2igAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK4/SvCmvQeJ9Xu9Y8VPrug3gItdBn023jjtPmBH7xRvkwBj5s9c0AeNW3w+1+3+Gv2uTSbz7ZofxDvvEy6akYNxeWo1G4b90M8s0Uu9R/FgD+KvQPgvpWo3eu+OvGV/pt3oaeKNRgmtNO1CPZcxwQWsUCvKufkZyjHYeQMevANnqtFAgooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigD/1/1SooAKKACigArI8R+LdD8IWkdzrutadottI/lpNqN1Hbozf3QXIBPtQBpQTx3UMc0MiyxSKHSRCCrKRkEHuCKloAKqDUbU6i1gLmI3yxCc23mDzBGSVD7c52kgjPTINAFuigAooAKKACigAooAZJKkMbO7BVUFiT2A6mvEdL/ba+Busana6fa/ErRmurqUQwrKXiVnJwF3soUc8cmgLXPcaKACsDwR470L4j+Hodc8OajHqukyySRJdRKwVnjco4wwB4ZWHTtQBv0UAFFABXFfDr4zeC/i2+sL4P1+311tInFtffZ1cCCUlhtJZRk/I3TPSgDtaKACsDRfHOheI/EOv6FpupRXer6C8Uep2iA7rZpU3xhsjHzLzxmgDfrnPHvxA8PfDDwzc+IfFGpx6Ro1uyLLdyqzKpZgq5CgnkkDpQBY8H+MNH8feGdO8ReHr+PVdF1GITWt5CCEmQnG4ZAOOPStugAooAKKACigAooAKxfEnjPw/wCDYoZde13TdDinbZE+pXkdusjeil2GT7CgC6mrWVxeizivLeS7MK3It1lUyeUSQJNuc7SQQG6ZFXaAK19fW+mWc11d3EVrawIZJZ53CJGoGSzMeAAOpNWFZZEDKQykZBHQ0ALRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFAH/0P1SooAKKACigAr548W6p4T8MftHaxqPxMl0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)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gDZyxsA7bDg9" - }, - "source": [ - "# Noise example" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cJCHdDt6IOou" - }, - "source": [ - "Here is an example with noise. Known Gaussian noise with $\\sigma$ between 0.1 and 5.0. We record samples of $y$:\n", - "\n", - "$$ \\sigma \\sim U(0.1, 5.0) $$\n", - "$$ \\epsilon \\sim \\mathcal{N}(0, \\sigma^2)$$\n", - "$$ y = 5\\;\\cos(3.5 x_0) - 1.3 + \\epsilon.$$\n", - "We have 5 features, say. The weights change the loss function to be:\n", - "$$MSE = \\sum [(y - f(x))^2*w],$$\n", - "\n", - "so in this example, we can set:\n", - "$$w = 1/\\sigma^2.$$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "up1RvmwyOdal" - }, - "outputs": [], - "source": [ - "np.random.seed(0)\n", - "N = 3000\n", - "upper_sigma = 5\n", - "X = 2 * np.random.rand(N, 5)\n", - "sigma = np.random.rand(N) * (5 - 0.1) + 0.1\n", - "eps = sigma * np.random.randn(N)\n", - "y = 5 * np.cos(3.5 * X[:, 0]) - 1.3 + eps" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-EJPDZbP5YEZ" - }, - "source": [ - "Let's look at this dataset:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "sqMqb4nJ5ZR5" - }, - "outputs": [], - "source": [ - "plt.scatter(X[:, 0], y, alpha=0.2)\n", - "plt.xlabel(\"$x_0$\")\n", - "plt.ylabel(\"$y$\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kaddasbBuDDv" - }, - "source": [ - "Define some weights to use:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "3wqz9_sIbDhA" - }, - "outputs": [], - "source": [ - "weights = 1 / sigma ** 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "v8WBYtcZbDhC" - }, - "outputs": [], - "source": [ - "weights[:5]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NXWdQSCFuAzV" - }, - "source": [ - "Let's run PySR again:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "a07K3KUjOxcp" - }, - "outputs": [], - "source": [ - "model = PySRRegressor(\n", - " loss=\"myloss(x, y, w) = w * abs(x - y)\", # Custom loss function with weights.\n", - " niterations=20,\n", - " populations=20, # Use more populations\n", - " binary_operators=[\"plus\", \"mult\"],\n", - " unary_operators=[\"cos\"],\n", - ")\n", - "model.fit(X, y, weights=weights)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "CHCMO9CouFLP" - }, - "source": [ - "Let's see if we get similar results to the true equation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "oHyUbcg6ggmx" - }, - "outputs": [], - "source": [ - "model" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "OchlZZQP8Ums" - }, - "source": [ - "We can also filter all equations up to 2x the most accurate equation, then select the best score from that list:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "PB67POLr8b_L" - }, - "outputs": [], - "source": [ - "best_idx = model.equations_.query(\n", - " f\"loss < {2 * model.equations_.loss.min()}\"\n", - ").score.idxmax()\n", - "model.sympy(best_idx)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SRHTP4x55roh" - }, - "source": [ - "We can also use `denoise=True`, which will run the input through a Gaussian process to denoise the dataset, before fitting on it." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eTGQ4NA78yAw" - }, - "source": [ - "Let's look at the fit:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ezCC0IkS8zFf" - }, - "outputs": [], - "source": [ - "plt.scatter(X[:, 0], y, alpha=0.1)\n", - "y_prediction = model.predict(X, index=best_idx)\n", - "plt.scatter(X[:, 0], y_prediction)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Multiple outputs" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For multiple outputs, multiple equations are returned:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X = 2 * np.random.randn(100, 5)\n", - "y = 1 / X[:, [0, 1, 2]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = PySRRegressor(\n", - " binary_operators=[\"+\", \"*\"],\n", - " unary_operators=[\"inv(x) = 1/x\"],\n", - " extra_sympy_mappings={\"inv\": lambda x: 1/x},\n", - ")\n", - "model.fit(X, y)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Julia packages and types" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "PySR uses [SymbolicRegression.jl](https://github.com/MilesCranmer/SymbolicRegression.jl)\n", - "as its search backend. This is a pure Julia package, and so can interface easily with any other\n", - "Julia package.\n", - "For some tasks, it may be necessary to load such a package.\n", - "\n", - "For example, let's say we wish to discovery the following relationship:\n", - "\n", - "$$ y = p_{3x + 1} - 5, $$\n", - "\n", - "where $p_i$ is the $i$th prime number, and $x$ is the input feature.\n", - "\n", - "Let's see if we can discover this using\n", - "the [Primes.jl](https://github.com/JuliaMath/Primes.jl) package.\n", - "\n", - "First, let's get the Julia backend\n", - "Here, we might choose to manually specify unlimited threads, `-O3`,\n", - "and `compile_modules=False`, although this will only propagate if Julia has not yet started:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pysr\n", - "jl = pysr.julia_helpers.init_julia(\n", - " julia_kwargs={\"threads\": \"auto\", \"optimize\": 2, \"compiled_modules\": False}\n", - ")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "`jl` stores the Julia runtime.\n", - "\n", - "Now, let's run some Julia code to add the Primes.jl\n", - "package to the PySR environment:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "jl.eval(\"\"\"\n", - "import Pkg\n", - "Pkg.add(\"Primes\")\n", - "\"\"\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This imports the Julia package manager, and uses it to install\n", - "`Primes.jl`. Now let's import `Primes.jl`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "jl.eval(\"import Primes\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Now, we define a custom operator:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "jl.eval(\"\"\"\n", - "function p(i::T) where T\n", - " if 0.5 < i < 1000\n", - " return T(Primes.prime(round(Int, i)))\n", - " else\n", - " return T(NaN)\n", - " end\n", - "end\n", - "\"\"\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "We have created a function `p`, which takes a number `i` of type `T` (e.g., `T=Float64`).\n", - "`p` first checks whether the input is between 0.5 and 1000.\n", - "If out-of-bounds, it returns `NaN`.\n", - "If in-bounds, it rounds it to the nearest integer, computes the corresponding prime number, and then\n", - "converts it to the same type as input.\n", - "\n", - "The equivalent function in Python would be:\n", - "\n", - "```python\n", - "import sympy\n", - "\n", - "def p(i):\n", - " if 0.5 < i < 1000:\n", - " return float(sympy.prime(int(round(i))))\n", - " else:\n", - " return float(\"nan\")\n", - "```\n", - "\n", - "(However, note that this version assumes 64-bit float input, rather than any input type `T`)\n", - "\n", - "Next, let's generate a list of primes for our test dataset.\n", - "Since we are using PyJulia, we can just call `p` directly to do this:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "primes = {i: jl.p(i*1.0) for i in range(1, 999)}" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, let's use this list of primes to create a dataset of $x, y$ pairs:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "\n", - "X = np.random.randint(0, 100, 100)[:, None]\n", - "y = [primes[3*X[i, 0] + 1] - 5 + np.random.randn()*0.001 for i in range(100)]" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that we have also added a tiny bit of noise to the dataset.\n", - "\n", - "Finally, let's create a PySR model, and pass the custom operator. We also need to define the sympy equivalent, which we can leave as a placeholder for now:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pysr import PySRRegressor\n", - "import sympy\n", - "\n", - "class sympy_p(sympy.Function):\n", - " pass\n", - "\n", - "model = PySRRegressor(\n", - " binary_operators=[\"+\", \"-\", \"*\", \"/\"],\n", - " unary_operators=[\"p\"],\n", - " niterations=20,\n", - " extra_sympy_mappings={\"p\": sympy_p}\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "ee30bd41", - "metadata": {}, - "source": [ - "We are all set to go! Let's see if we can find the true relation:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.fit(X, y)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "if all works out, you should be able to see the true relation (note that the constant offset might not be exactly 1, since it is allowed to round to the nearest integer).\n", - "\n", - "You can get the sympy version of the best equation with:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.sympy()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cPc1EDvRbDhL" - }, - "source": [ - "# High-dimensional input: Neural Nets + Symbolic Regression" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": { - "id": "3hS2kTAbbDhL" - }, - "source": [ - "In this example, let's learn a high-dimensional problem. **This will use the method proposed in our NeurIPS paper: https://arxiv.org/abs/2006.11287.**\n", - "\n", - "Let's consider a time series problem:\n", - "\n", - "$$ z = y^2,\\quad y = \\frac{1}{10} \\sum(y_i),\\quad y_i = x_{i0}^2 + 6 \\cos(2*x_{i2})$$\n", - "\n", - "Imagine our time series is 10 timesteps. That is very hard for symbolic regression, even if we impose the inductive bias of $$z=f(\\sum g(x_i))$$ - it is the square of the number of possible equations!\n", - "\n", - "But, as in our paper, **we can break this problem down into parts with a neural network. Then approximate the neural network with the symbolic regression!**\n", - "\n", - "Then, instead of, say, $(10^9)^2=10^{18}$ equations, we only have to consider $2\\times 10^9$ equations." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "SXJGXySlbDhL" - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "\n", - "rstate = np.random.RandomState(0)\n", - "\n", - "N = 100000\n", - "Nt = 10\n", - "X = 6 * rstate.rand(N, Nt, 5) - 3\n", - "y_i = X[..., 0] ** 2 + 6 * np.cos(2 * X[..., 2])\n", - "y = np.sum(y_i, axis=1) / y_i.shape[1]\n", - "z = y**2\n", - "X.shape, y.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8ZqGupq_uSgp" - }, - "source": [ - "## Neural Network definition" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "r2NR0h8-bDhN" - }, - "source": [ - "So, as described above, let's first use a neural network with the sum inductive bias to solve this problem.\n", - "\n", - "Essentially, we will learn two neural networks:\n", - "- `f`\n", - "- `g`\n", - "\n", - "each defined as a multi-layer perceptron. We will sum over `g` the same way as in our equation, but we won't define the summed part beforehand.\n", - "\n", - "Then, we will fit `g` and `f` **separately** using symbolic regression." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aca54ffa" - }, - "source": [ - "> **Warning**\n", - ">\n", - "> We import torch *after* already starting PyJulia. This is required due to interference between their C bindings. If you use torch, and then run PyJulia, you will likely hit a segfault. So keep this in mind for mixed deep learning + PyJulia/PySR workflows." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "nWVfkV_YbDhO" - }, - "outputs": [], - "source": [ - "import torch\n", - "from torch import nn, optim\n", - "from torch.nn import functional as F\n", - "from torch.utils.data import DataLoader, TensorDataset\n", - "import pytorch_lightning as pl\n", - "\n", - "hidden = 128\n", - "total_steps = 30_000\n", - "\n", - "def mlp(size_in, size_out, act=nn.ReLU):\n", - " return nn.Sequential(\n", - " nn.Linear(size_in, hidden),\n", - " act(),\n", - " nn.Linear(hidden, hidden),\n", - " act(),\n", - " nn.Linear(hidden, hidden),\n", - " act(),\n", - " nn.Linear(hidden, size_out),\n", - " )\n", - "\n", - "\n", - "class SumNet(pl.LightningModule):\n", - " def __init__(self):\n", - " super().__init__()\n", - "\n", - " ########################################################\n", - " # The same inductive bias as above!\n", - " self.g = mlp(5, 1)\n", - " self.f = mlp(1, 1)\n", - "\n", - " def forward(self, x):\n", - " y_i = self.g(x)[:, :, 0]\n", - " y = torch.sum(y_i, dim=1, keepdim=True) / y_i.shape[1]\n", - " z = self.f(y)\n", - " return z[:, 0]\n", - "\n", - " ########################################################\n", - "\n", - " # PyTorch Lightning bookkeeping:\n", - " def training_step(self, batch, batch_idx):\n", - " x, z = batch\n", - " predicted_z = self(x)\n", - " loss = F.mse_loss(predicted_z, z)\n", - " return loss\n", - "\n", - " def validation_step(self, batch, batch_idx):\n", - " return self.training_step(batch, batch_idx)\n", - "\n", - " def configure_optimizers(self):\n", - " optimizer = torch.optim.Adam(self.parameters(), lr=self.max_lr)\n", - " scheduler = {\n", - " \"scheduler\": torch.optim.lr_scheduler.OneCycleLR(\n", - " optimizer,\n", - " max_lr=self.max_lr,\n", - " total_steps=self.trainer.estimated_stepping_batches,\n", - " final_div_factor=1e4,\n", - " ),\n", - " \"interval\": \"step\",\n", - " }\n", - " return [optimizer], [scheduler]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kK725aSEuUvG" - }, - "source": [ - "## Data bookkeeping" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KdWVtWUcbDhQ" - }, - "source": [ - "Put everything into PyTorch and do a train/test split:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "0ym19abgbDhR" - }, - "outputs": [], - "source": [ - "from multiprocessing import cpu_count\n", - "Xt = torch.tensor(X).float()\n", - "zt = torch.tensor(z).float()\n", - "X_train, X_test, z_train, z_test = train_test_split(Xt, zt, random_state=0)\n", - "train_set = TensorDataset(X_train, z_train)\n", - "train = DataLoader(train_set, batch_size=128, num_workers=cpu_count(), shuffle=True, pin_memory=True)\n", - "test_set = TensorDataset(X_test, z_test)\n", - "test = DataLoader(test_set, batch_size=256, num_workers=cpu_count(), pin_memory=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3dw_NefuudIq" - }, - "source": [ - "## Train the model with PyTorch Lightning on GPUs:" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hhlhLQUBbDhT" - }, - "source": [ - "Start the model:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "1ldN0999bDhU" - }, - "outputs": [], - "source": [ - "pl.seed_everything(0)\n", - "model = SumNet()\n", - "model.total_steps = total_steps\n", - "model.max_lr = 1e-2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WWRsu5A9bDhW" - }, - "source": [ - "PyTorch Lightning trainer object:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "33R2nrv-b62w" - }, - "outputs": [], - "source": [ - "trainer = pl.Trainer(\n", - " max_steps=total_steps, accelerator=\"gpu\", devices=1\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "jh91CukM5CkI" - }, - "source": [ - "Here, we fit the neural network:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "TXZdF8k1bDhY" - }, - "outputs": [], - "source": [ - "trainer.fit(model, train_dataloaders=train, val_dataloaders=test)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uYzk0yU4ulfH" - }, - "source": [ - "## Latent vectors of network\n", - "\n", - "Let's get the input and output of the learned `g` function from the network over some random data:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "s2sQLla5bDhb" - }, - "outputs": [], - "source": [ - "np.random.seed(0)\n", - "idx = np.random.randint(0, 10000, size=1000)\n", - "\n", - "X_for_pysr = Xt[idx]\n", - "y_i_for_pysr = model.g(X_for_pysr)[:, :, 0]\n", - "y_for_pysr = torch.sum(y_i_for_pysr, dim=1) / y_i_for_pysr.shape[1]\n", - "z_for_pysr = zt[idx] # Use true values.\n", - "\n", - "X_for_pysr.shape, y_i_for_pysr.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "nCCIvvAGuyFi" - }, - "source": [ - "## Learning over the network:\n", - "\n", - "Now, let's fit `g` using PySR.\n", - "\n", - "> **Warning**\n", - ">\n", - "> First, let's save the data, because sometimes PyTorch and PyJulia's C bindings interfere and cause the colab kernel to crash. If we need to restart, we can just load the data without having to retrain the network:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nnet_recordings = {\n", - " \"g_input\": X_for_pysr.detach().cpu().numpy().reshape(-1, 5),\n", - " \"g_output\": y_i_for_pysr.detach().cpu().numpy().reshape(-1),\n", - " \"f_input\": y_for_pysr.detach().cpu().numpy().reshape(-1, 1),\n", - " \"f_output\": z_for_pysr.detach().cpu().numpy().reshape(-1),\n", - "}\n", - "\n", - "# Save the data for later use:\n", - "import pickle as pkl\n", - "\n", - "with open(\"nnet_recordings.pkl\", \"wb\") as f:\n", - " pkl.dump(nnet_recordings, f)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now load the data, including after a crash (be sure to re-run the import cells at the top of this notebook, including the one that starts PyJulia)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pickle as pkl\n", - "\n", - "nnet_recordings = pkl.load(open(\"nnet_recordings.pkl\", \"rb\"))\n", - "f_input = nnet_recordings[\"f_input\"]\n", - "f_output = nnet_recordings[\"f_output\"]\n", - "g_input = nnet_recordings[\"g_input\"]\n", - "g_output = nnet_recordings[\"g_output\"]" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now fit using a subsample of the data (symbolic regression only needs a small sample to find the best equation):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "51QdHVSkbDhc" - }, - "outputs": [], - "source": [ - "rstate = np.random.RandomState(0)\n", - "f_sample_idx = rstate.choice(f_input.shape[0], size=500, replace=False)\n", - "\n", - "model = PySRRegressor(\n", - " niterations=20,\n", - " binary_operators=[\"plus\", \"sub\", \"mult\"],\n", - " unary_operators=[\"cos\", \"square\", \"neg\"],\n", - ")\n", - "model.fit(g_input[f_sample_idx], g_output[f_sample_idx])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1a738a33" - }, - "source": [ - "If this segfaults, restart the notebook, and run the initial imports and PyJulia part, but skip the PyTorch training. This is because PyTorch's C binding tends to interefere with PyJulia. You can then re-run the `pkl.load` cell to import the data." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "xginVMmTu3MZ" - }, - "source": [ - "## Validation" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": { - "id": "6WuaeqyqbDhe" - }, - "source": [ - "Recall we are searching for $f$ and $g$ such that:\n", - "$$z=f(\\sum g(x_i))$$ \n", - "which approximates the true relation:\n", - "$$ z = y^2,\\quad y = \\frac{1}{10} \\sum(y_i),\\quad y_i = x_{i0}^2 + 6 \\cos(2 x_{i2})$$\n", - "\n", - "Let's see how well we did in recovering $g$:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "E1_VWQ45bDhf" - }, - "outputs": [], - "source": [ - "model.equations_[[\"complexity\", \"loss\", \"equation\"]]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "mlU1hidZkgCY" - }, - "source": [ - "A neural network can easily undo a linear transform (which commutes with the summation), so any affine transform in $g$ is to be expected. The network for $f$ has learned to undo the linear transform.\n", - "\n", - "This likely won't find the exact result, but it should find something similar. You may wish to try again but with many more `total_steps` for the neural network (10,000 is quite small!).\n", - "\n", - "Then, we can learn another analytic equation for $f$." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TntGlQEwbDhk" - }, - "source": [ - "**Now, we can compose these together to get the time series model!**\n", - "\n", - "Think about what we just did: we found an analytical equation for $z$ in terms of $500$ datapoints, under the assumption that $z$ is a function of a sum of another function over an axis:\n", - "\n", - "$$ z = f(\\sum_i g(x_i)) $$\n", - "\n", - "And we pulled out analytical copies for $g$ using symbolic regression." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1QsHVjAVbDhk" - }, - "source": [ - "# Other PySR Options" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "S5dO61g1bDhk" - }, - "source": [ - "The full list of PySR parameters can be found here: https://astroautomata.com/PySR/api" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "name": "pysr_demo.ipynb", - "provenance": [] - }, - "gpuClass": "standard", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "DS4E1PagbDgL" + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tQ1r1bbb0yBv" + }, + "source": [ + "\n", + "## Instructions\n", + "1. Work on a copy of this notebook: _File_ > _Save a copy in Drive_ (you will need a Google account).\n", + "2. (Optional) If you would like to do the deep learning component of this tutorial, turn on the GPU with Edit->Notebook settings->Hardware accelerator->GPU\n", + "3. Execute the following cell (click on it and press Ctrl+Enter) to install Julia, IJulia and other packages (if needed, update `JULIA_VERSION` and the other parameters). This takes a couple of minutes.\n", + "4. Continue to the next section.\n", + "\n", + "_Notes_:\n", + "* If your Colab Runtime gets reset (e.g., due to inactivity), repeat steps 3, 4.\n", + "* After installation, if you want to change the Julia version or activate/deactivate the GPU, you will need to reset the Runtime: _Runtime_ > _Delete and disconnect runtime_ and repeat steps 2-4." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "COndi88gbDgO" + }, + "source": [ + "**Run the following code to install Julia**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GIeFXS0F0zww" + }, + "outputs": [], + "source": [ + "%%shell\n", + "set -e\n", + "\n", + "#---------------------------------------------------#\n", + "JULIA_VERSION=\"1.8.5\"\n", + "export JULIA_PKG_PRECOMPILE_AUTO=0\n", + "#---------------------------------------------------#\n", + "\n", + "if [ -z `which julia` ]; then\n", + " # Install Julia\n", + " JULIA_VER=`cut -d '.' -f -2 <<< \"$JULIA_VERSION\"`\n", + " echo \"Installing Julia $JULIA_VERSION on the current Colab Runtime...\"\n", + " BASE_URL=\"https://julialang-s3.julialang.org/bin/linux/x64\"\n", + " URL=\"$BASE_URL/$JULIA_VER/julia-$JULIA_VERSION-linux-x86_64.tar.gz\"\n", + " wget -nv $URL -O /tmp/julia.tar.gz # -nv means \"not verbose\"\n", + " tar -x -f /tmp/julia.tar.gz -C /usr/local --strip-components 1\n", + " rm /tmp/julia.tar.gz\n", + "\n", + " echo \"Installing PyCall.jl...\"\n", + " julia -e 'using Pkg; Pkg.add(\"PyCall\"); Pkg.build(\"PyCall\")'\n", + " julia -e 'println(\"Success\")'\n", + "\n", + "fi" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ORv1c6xvbDgV" + }, + "source": [ + "Install PySR and PyTorch-Lightning:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EhMRSZEYFPLz" + }, + "outputs": [], + "source": [ + "%pip install -Uq pysr pytorch_lightning" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "etTMEV0wDqld" + }, + "source": [ + "The following step is not normally required, but colab's printing is non-standard and we need to manually set it up PyJulia:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "j666aOI8xWF_" + }, + "outputs": [], + "source": [ + "from julia import Julia\n", + "\n", + "julia = Julia(compiled_modules=False, threads=\"auto\")\n", + "from julia import Main\n", + "from julia.tools import redirect_output_streams\n", + "\n", + "redirect_output_streams()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6u2WhbVhht-G" + }, + "source": [ + "Let's install the backend of PySR, and all required libraries.\n", + "\n", + "**(This may take some time)**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "J-0QbxyK1_51" + }, + "outputs": [], + "source": [ + "import pysr\n", + "\n", + "# We don't precompile in colab because compiled modules are incompatible static Python libraries:\n", + "pysr.install(precompile=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vFpyRxmhFqeH" + }, + "outputs": [], + "source": [ + "import sympy\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "from pysr import PySRRegressor\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gsRMQ7grbDga" + }, + "source": [ + "# Simple PySR example:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "myTEwdiUFiGL" + }, + "source": [ + "First, let's learn a simple function\n", + "\n", + "$$2.5382 \\cos(x3) + x0^2 - 2$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Cb1eb2XuFQh8" + }, + "outputs": [], + "source": [ + "# Dataset\n", + "np.random.seed(0)\n", + "X = 2 * np.random.randn(100, 5)\n", + "y = 2.5382 * np.cos(X[:, 3]) + X[:, 0] ** 2 - 2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cturCkaVjzLs" + }, + "source": [ + "By default, we will set up 30 populations of expressions (which evolve independently except for migrations), use 4 threads, and use `\"best\"` for our model selection strategy:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4nDAAnisdhTc" + }, + "outputs": [], + "source": [ + "default_pysr_params = dict(\n", + " populations=30,\n", + " model_selection=\"best\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "N4gANfkaj8ie" + }, + "source": [ + "PySR can run for arbitrarily long, and continue to find more and more accurate expressions. You can set the total number of cycles of evolution with `niterations`, although there are also a [few more ways](https://github.com/MilesCranmer/PySR/pull/134) to stop execution.\n", + "\n", + "**This first execution will take a bit longer to startup, as the library is JIT-compiled. The next execution will be much faster.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "p4PSrO-NK1Wa" + }, + "outputs": [], + "source": [ + "# Learn equations\n", + "model = PySRRegressor(\n", + " niterations=30,\n", + " binary_operators=[\"plus\", \"mult\"],\n", + " unary_operators=[\"cos\", \"exp\", \"sin\"],\n", + " **default_pysr_params\n", + ")\n", + "\n", + "model.fit(X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-bsAECbdkQsQ" + }, + "source": [ + "We can print the model, which will print out all the discovered expressions:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4HR8gknlZz4W" + }, + "outputs": [], + "source": [ + "model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ME3ddPxXkWQg" + }, + "source": [ + "We can also view the SymPy format of the best expression:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "IQKOohdpztS7" + }, + "outputs": [], + "source": [ + "model.sympy()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EHIIPlmClltn" + }, + "source": [ + "We can also view the SymPy of any other expression in the list, using the index of it in `model.equations_`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GRcxq-TTlpRX" + }, + "outputs": [], + "source": [ + "model.sympy(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YMugcGX4tbqj" + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gIWt5wz5cjXE" + }, + "source": [ + "`model.equations_` is a Pandas DataFrame. We can export the results in various ways:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "HFGaNL6tbDgi" + }, + "outputs": [], + "source": [ + "model.latex()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4hS8kqutcmPQ" + }, + "source": [ + "These is also `model.sympy(), model.jax(), model.pytorch()`. All of these can take an index as input, to get the result for an arbitrary equation in the list.\n", + "\n", + "We can also use `model.predict` for arbitrary equations, with the default equation being the one chosen by `model_selection`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Vbz4IMsk2NYH" + }, + "outputs": [], + "source": [ + "ypredict = model.predict(X)\n", + "ypredict_simpler = model.predict(X, 2)\n", + "\n", + "print(\"Default selection MSE:\", np.power(ypredict - y, 2).mean())\n", + "print(\"Manual selection MSE for index 2:\", np.power(ypredict_simpler - y, 2).mean())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SQDUScGebDgr" + }, + "source": [ + "# Custom operators" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qvgVbOoSFtQY" + }, + "source": [ + "A full list of operators is given here: https://astroautomata.com/PySR/operators,\n", + "but we can also use any binary or unary operator in `julia`, or define our own as arbitrary functions.\n", + "\n", + "Say that we want a command to do quartic powers:\n", + "\n", + "$$ y = x_0^4 - 2 $$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "JvXOVqSyFsdr" + }, + "outputs": [], + "source": [ + "y = X[:, 0] ** 4 - 2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-zoqaL8KGSK5" + }, + "source": [ + "We can do this by passing a string in Julia syntax.\n", + "\n", + "We also define the operator in sympy, with `extra_sympy_mappings`, to enable its use in `predict`, and other export functions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "PoEkpvYuGUdy" + }, + "outputs": [], + "source": [ + "model = PySRRegressor(\n", + " niterations=5,\n", + " populations=40,\n", + " binary_operators=[\"plus\", \"mult\"],\n", + " unary_operators=[\"cos\", \"exp\", \"sin\", \"quart(x) = x^4\"],\n", + " extra_sympy_mappings={\"quart\": lambda x: x**4},\n", + ")\n", + "model.fit(X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "emn2IajKbDgy" + }, + "outputs": [], + "source": [ + "model.sympy()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wbWHyOjl2_kX" + }, + "source": [ + "Since `quart` is arguably more complex than the other operators, you can also give it a different complexity, using, e.g., `complexity_of_operators={\"quart\": 2}` to give it a complexity of 2 (instead of the default 2). You can also define custom complexities for variables and constants (`complexity_of_variables` and `complexity_of_constants`, respectively - both take a single number).\n", + "\n", + "\n", + "One can also add a binary operator, with, e.g., `\"myoperator(x, y) = x^2 * y\"`. All Julia operators that work on scalar 32-bit floating point values are available.\n", + "\n", + "Make sure that any operator you add is valid over the real line. So, e.g., you will need to define `\"mysqrt(x) = sqrt(abs(x))\"` to enable it for negative numbers,\n", + "or, simply have it return a very large number for bad inputs (to prevent negative input in a soft way):\n", + "`\"mysqrt(x::T) where {T} = (x >= 0) ? x : T(-1e9)\"` (Julia syntax for a template function of input type `T`), which will make `mysqrt(x)` return -10^9 for negative x–hurting the loss of the equation." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pEXT4xskbDg0" + }, + "source": [ + "## Scoring" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IyeYbVVOG60w" + }, + "source": [ + "Using `model_selection=\"best\"`selects the equation with the max score and prints it. But in practice it is best to look through all the equations manually, select an equation above some MSE threshold, and then use the score to select among that loss threshold.\n", + "\n", + "Here, \"score\" is defined by:\n", + "$$ \\text{score} = - \\log(\\text{loss}_i/\\text{loss}_{i-1})/\n", + "(\\text{complexity}_i - \\text{complexity}_{i-1})$$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "I3IxmvSQrhfw" + }, + "source": [ + "This scoring is motivated by the common strategy of looking for drops in the loss-complexity curve.\n", + "\n", + "From Schmidt & Lipson (2009) -" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eUeXyoLxrd8o" + }, + "source": [ + "![F4.large.jpg](data:image/jpeg;base64,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K7BEjcE/Lkt/Dx1HNUvCunQ+KdPujoyCLQg6x30NwSruD97b1P3eOCKAPd9A8N+DdD+GnjRPCtjNZ6VLZznUIZndnkAhYHbuY4+XI4Ir59+A+n+DbjxJYw6DpzrG1/b+fHdgurYjmKcMSODk1lV+B/L8z08u/j/J/kdt/wAE154dS+EPjDUDYadaXr+MdTtpZrGyjt2nWNkCGTYo3EbjyfWvrmtTzpbsKKCQooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKAP//S/VKigAooAKKACigDivG//I7/AA7/AOwpc/8Apvua7Py1IA2jA6DHSgBDEjDBRSOmCKabWEjHkxkem0UAILK3AwIIsf7gpEsbeMYW3iXJzgIBz60ASPCkigMisB0DDOKEgijbcsaKx7hQDQAn2aHdu8pN3rtGaJLaGb78SP8A7yg0AIbSE9YYz9UFILK3HSCL/vgUANOn2xbcbeEt6mMUg0uzAIFpAAeoES8/pQBVbw5pxdmFlbDd1/cL/hUF94T028szb/YrReQdxt1NAFTSfA2n6bcSSNbWkwZdoX7OoxzTfGOg6WvhHXCNNtOLGc4ECj/lm3tQB8z/AAJS2ufgZ8T5TZRo8drIQWQZ/wCPZjxxXR/sg6fBrPwy8UIYIzK920au6BiP3K4/nQB7Hong06Z4U12wkKML2GRMGLAwYyvI79a8Z8P+AofBXifw2YkgX7RqCA+TCI/uxSdfXrWNX4PuPTy7+P8AKX5MwP8AgmH/AMkM8X/9jzrH/ocdfX1bHnS3CigkKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigD//T/VKigD5O1T9oT4/an468TaT4T+E/h6/0vTtYu9NsZ9W137DcXyQFcypFIAWXDKdy5XnrU1r8cv2jND8UeFYPF/wc0TTtB1XWbTS7m/0vWTey2yzPtMpjQEhVGSWOFHcigZ9V14/+0B8XV8I/CjxNeeFda06TxPbmCyhCTJM1pLPcx23mtGCfuGXdhhjKgGgRl+AH1n4cfHlvh/deKNX8V6Nqfhs63DNr0qz3Nvcw3CQyhZFVf3cglRthGFZT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vxHr02lNoPi+bwvHbSl7qOLT4Lr7YmV+QmUEp0blefm9hQBk6p4euf8AhdXhfUrawZdOh0bVY7i5jjARZpZrIqGI/iYRuffaa8j+HHgTxJbz/C/wLeaBfWUHw81K4vrvXZ0As72MQXMFt9nIPztItyHYf8s9hU5OKAPp2igAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAK4/SvCmvQeJ9Xu9Y8VPrug3gItdBn023jjtPmBH7xRvkwBj5s9c0AeNW3w+1+3+Gv2uTSbz7ZofxDvvEy6akYNxeWo1G4b90M8s0Uu9R/FgD+KvQPgvpWo3eu+OvGV/pt3oaeKNRgmtNO1CPZcxwQWsUCvKufkZyjHYeQMevANnqtFAgooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigD/1/1SooAKKACigArI8R+LdD8IWkdzrutadottI/lpNqN1Hbozf3QXIBPtQBpQTx3UMc0MiyxSKHSRCCrKRkEHuCKloAKqDUbU6i1gLmI3yxCc23mDzBGSVD7c52kgjPTINAFuigAooAKKACigAooAZJKkMbO7BVUFiT2A6mvEdL/ba+Busana6fa/ErRmurqUQwrKXiVnJwF3soUc8cmgLXPcaKACsDwR470L4j+Hodc8OajHqukyySRJdRKwVnjco4wwB4ZWHTtQBv0UAFFABXFfDr4zeC/i2+sL4P1+311tInFtffZ1cCCUlhtJZRk/I3TPSgDtaKACsDRfHOheI/EOv6FpupRXer6C8Uep2iA7rZpU3xhsjHzLzxmgDfrnPHvxA8PfDDwzc+IfFGpx6Ro1uyLLdyqzKpZgq5CgnkkDpQBY8H+MNH8feGdO8ReHr+PVdF1GITWt5CCEmQnG4ZAOOPStugAooAKKACigAooAKxfEnjPw/wCDYoZde13TdDinbZE+pXkdusjeil2GT7CgC6mrWVxeizivLeS7MK3It1lUyeUSQJNuc7SQQG6ZFXaAK19fW+mWc11d3EVrawIZJZ53CJGoGSzMeAAOpNWFZZEDKQykZBHQ0ALRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFAH/0P1SooAKKACigAr548W6p4T8MftHaxqPxMl0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)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gDZyxsA7bDg9" + }, + "source": [ + "# Noise example" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cJCHdDt6IOou" + }, + "source": [ + "Here is an example with noise. Known Gaussian noise with $\\sigma$ between 0.1 and 5.0. We record samples of $y$:\n", + "\n", + "$$ \\sigma \\sim U(0.1, 5.0) $$\n", + "$$ \\epsilon \\sim \\mathcal{N}(0, \\sigma^2)$$\n", + "$$ y = 5\\;\\cos(3.5 x_0) - 1.3 + \\epsilon.$$\n", + "We have 5 features, say. The weights change the loss function to be:\n", + "$$MSE = \\sum [(y - f(x))^2*w],$$\n", + "\n", + "so in this example, we can set:\n", + "$$w = 1/\\sigma^2.$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "up1RvmwyOdal" + }, + "outputs": [], + "source": [ + "np.random.seed(0)\n", + "N = 3000\n", + "upper_sigma = 5\n", + "X = 2 * np.random.rand(N, 5)\n", + "sigma = np.random.rand(N) * (5 - 0.1) + 0.1\n", + "eps = sigma * np.random.randn(N)\n", + "y = 5 * np.cos(3.5 * X[:, 0]) - 1.3 + eps" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-EJPDZbP5YEZ" + }, + "source": [ + "Let's look at this dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "sqMqb4nJ5ZR5" + }, + "outputs": [], + "source": [ + "plt.scatter(X[:, 0], y, alpha=0.2)\n", + "plt.xlabel(\"$x_0$\")\n", + "plt.ylabel(\"$y$\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kaddasbBuDDv" + }, + "source": [ + "Define some weights to use:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3wqz9_sIbDhA" + }, + "outputs": [], + "source": [ + "weights = 1 / sigma**2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "v8WBYtcZbDhC" + }, + "outputs": [], + "source": [ + "weights[:5]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NXWdQSCFuAzV" + }, + "source": [ + "Let's run PySR again:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "a07K3KUjOxcp" + }, + "outputs": [], + "source": [ + "model = PySRRegressor(\n", + " loss=\"myloss(x, y, w) = w * abs(x - y)\", # Custom loss function with weights.\n", + " niterations=20,\n", + " populations=20, # Use more populations\n", + " binary_operators=[\"plus\", \"mult\"],\n", + " unary_operators=[\"cos\"],\n", + ")\n", + "model.fit(X, y, weights=weights)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CHCMO9CouFLP" + }, + "source": [ + "Let's see if we get similar results to the true equation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "oHyUbcg6ggmx" + }, + "outputs": [], + "source": [ + "model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OchlZZQP8Ums" + }, + "source": [ + "We can also filter all equations up to 2x the most accurate equation, then select the best score from that list:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "PB67POLr8b_L" + }, + "outputs": [], + "source": [ + "best_idx = model.equations_.query(\n", + " f\"loss < {2 * model.equations_.loss.min()}\"\n", + ").score.idxmax()\n", + "model.sympy(best_idx)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SRHTP4x55roh" + }, + "source": [ + "We can also use `denoise=True`, which will run the input through a Gaussian process to denoise the dataset, before fitting on it." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eTGQ4NA78yAw" + }, + "source": [ + "Let's look at the fit:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ezCC0IkS8zFf" + }, + "outputs": [], + "source": [ + "plt.scatter(X[:, 0], y, alpha=0.1)\n", + "y_prediction = model.predict(X, index=best_idx)\n", + "plt.scatter(X[:, 0], y_prediction)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multiple outputs" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For multiple outputs, multiple equations are returned:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "X = 2 * np.random.randn(100, 5)\n", + "y = 1 / X[:, [0, 1, 2]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = PySRRegressor(\n", + " binary_operators=[\"+\", \"*\"],\n", + " unary_operators=[\"inv(x) = 1/x\"],\n", + " extra_sympy_mappings={\"inv\": lambda x: 1 / x},\n", + ")\n", + "model.fit(X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Julia packages and types" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "PySR uses [SymbolicRegression.jl](https://github.com/MilesCranmer/SymbolicRegression.jl)\n", + "as its search backend. This is a pure Julia package, and so can interface easily with any other\n", + "Julia package.\n", + "For some tasks, it may be necessary to load such a package.\n", + "\n", + "For example, let's say we wish to discovery the following relationship:\n", + "\n", + "$$ y = p_{3x + 1} - 5, $$\n", + "\n", + "where $p_i$ is the $i$th prime number, and $x$ is the input feature.\n", + "\n", + "Let's see if we can discover this using\n", + "the [Primes.jl](https://github.com/JuliaMath/Primes.jl) package.\n", + "\n", + "First, let's get the Julia backend\n", + "Here, we might choose to manually specify unlimited threads, `-O3`,\n", + "and `compile_modules=False`, although this will only propagate if Julia has not yet started:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pysr\n", + "\n", + "jl = pysr.julia_helpers.init_julia(\n", + " julia_kwargs={\"threads\": \"auto\", \"optimize\": 2, \"compiled_modules\": False}\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "`jl` stores the Julia runtime.\n", + "\n", + "Now, let's run some Julia code to add the Primes.jl\n", + "package to the PySR environment:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "jl.eval(\n", + " \"\"\"\n", + "import Pkg\n", + "Pkg.add(\"Primes\")\n", + "\"\"\"\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This imports the Julia package manager, and uses it to install\n", + "`Primes.jl`. Now let's import `Primes.jl`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "jl.eval(\"import Primes\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Now, we define a custom operator:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "jl.eval(\n", + " \"\"\"\n", + "function p(i::T) where T\n", + " if 0.5 < i < 1000\n", + " return T(Primes.prime(round(Int, i)))\n", + " else\n", + " return T(NaN)\n", + " end\n", + "end\n", + "\"\"\"\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "We have created a function `p`, which takes a number `i` of type `T` (e.g., `T=Float64`).\n", + "`p` first checks whether the input is between 0.5 and 1000.\n", + "If out-of-bounds, it returns `NaN`.\n", + "If in-bounds, it rounds it to the nearest integer, computes the corresponding prime number, and then\n", + "converts it to the same type as input.\n", + "\n", + "The equivalent function in Python would be:\n", + "\n", + "```python\n", + "import sympy\n", + "\n", + "def p(i):\n", + " if 0.5 < i < 1000:\n", + " return float(sympy.prime(int(round(i))))\n", + " else:\n", + " return float(\"nan\")\n", + "```\n", + "\n", + "(However, note that this version assumes 64-bit float input, rather than any input type `T`)\n", + "\n", + "Next, let's generate a list of primes for our test dataset.\n", + "Since we are using PyJulia, we can just call `p` directly to do this:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "primes = {i: jl.p(i * 1.0) for i in range(1, 999)}" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, let's use this list of primes to create a dataset of $x, y$ pairs:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "X = np.random.randint(0, 100, 100)[:, None]\n", + "y = [primes[3 * X[i, 0] + 1] - 5 + np.random.randn() * 0.001 for i in range(100)]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that we have also added a tiny bit of noise to the dataset.\n", + "\n", + "Finally, let's create a PySR model, and pass the custom operator. We also need to define the sympy equivalent, which we can leave as a placeholder for now:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pysr import PySRRegressor\n", + "import sympy\n", + "\n", + "\n", + "class sympy_p(sympy.Function):\n", + " pass\n", + "\n", + "\n", + "model = PySRRegressor(\n", + " binary_operators=[\"+\", \"-\", \"*\", \"/\"],\n", + " unary_operators=[\"p\"],\n", + " niterations=20,\n", + " extra_sympy_mappings={\"p\": sympy_p},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ee30bd41", + "metadata": {}, + "source": [ + "We are all set to go! Let's see if we can find the true relation:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.fit(X, y)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "if all works out, you should be able to see the true relation (note that the constant offset might not be exactly 1, since it is allowed to round to the nearest integer).\n", + "\n", + "You can get the sympy version of the best equation with:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.sympy()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cPc1EDvRbDhL" + }, + "source": [ + "# High-dimensional input: Neural Nets + Symbolic Regression" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "3hS2kTAbbDhL" + }, + "source": [ + "In this example, let's learn a high-dimensional problem. **This will use the method proposed in our NeurIPS paper: https://arxiv.org/abs/2006.11287.**\n", + "\n", + "Let's consider a time series problem:\n", + "\n", + "$$ z = y^2,\\quad y = \\frac{1}{10} \\sum(y_i),\\quad y_i = x_{i0}^2 + 6 \\cos(2*x_{i2})$$\n", + "\n", + "Imagine our time series is 10 timesteps. That is very hard for symbolic regression, even if we impose the inductive bias of $$z=f(\\sum g(x_i))$$ - it is the square of the number of possible equations!\n", + "\n", + "But, as in our paper, **we can break this problem down into parts with a neural network. Then approximate the neural network with the symbolic regression!**\n", + "\n", + "Then, instead of, say, $(10^9)^2=10^{18}$ equations, we only have to consider $2\\times 10^9$ equations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "SXJGXySlbDhL" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "rstate = np.random.RandomState(0)\n", + "\n", + "N = 100000\n", + "Nt = 10\n", + "X = 6 * rstate.rand(N, Nt, 5) - 3\n", + "y_i = X[..., 0] ** 2 + 6 * np.cos(2 * X[..., 2])\n", + "y = np.sum(y_i, axis=1) / y_i.shape[1]\n", + "z = y**2\n", + "X.shape, y.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8ZqGupq_uSgp" + }, + "source": [ + "## Neural Network definition" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "r2NR0h8-bDhN" + }, + "source": [ + "So, as described above, let's first use a neural network with the sum inductive bias to solve this problem.\n", + "\n", + "Essentially, we will learn two neural networks:\n", + "- `f`\n", + "- `g`\n", + "\n", + "each defined as a multi-layer perceptron. We will sum over `g` the same way as in our equation, but we won't define the summed part beforehand.\n", + "\n", + "Then, we will fit `g` and `f` **separately** using symbolic regression." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aca54ffa" + }, + "source": [ + "> **Warning**\n", + ">\n", + "> We import torch *after* already starting PyJulia. This is required due to interference between their C bindings. If you use torch, and then run PyJulia, you will likely hit a segfault. So keep this in mind for mixed deep learning + PyJulia/PySR workflows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nWVfkV_YbDhO" + }, + "outputs": [], + "source": [ + "import torch\n", + "from torch import nn, optim\n", + "from torch.nn import functional as F\n", + "from torch.utils.data import DataLoader, TensorDataset\n", + "import pytorch_lightning as pl\n", + "\n", + "hidden = 128\n", + "total_steps = 30_000\n", + "\n", + "\n", + "def mlp(size_in, size_out, act=nn.ReLU):\n", + " return nn.Sequential(\n", + " nn.Linear(size_in, hidden),\n", + " act(),\n", + " nn.Linear(hidden, hidden),\n", + " act(),\n", + " nn.Linear(hidden, hidden),\n", + " act(),\n", + " nn.Linear(hidden, size_out),\n", + " )\n", + "\n", + "\n", + "class SumNet(pl.LightningModule):\n", + " def __init__(self):\n", + " super().__init__()\n", + "\n", + " ########################################################\n", + " # The same inductive bias as above!\n", + " self.g = mlp(5, 1)\n", + " self.f = mlp(1, 1)\n", + "\n", + " def forward(self, x):\n", + " y_i = self.g(x)[:, :, 0]\n", + " y = torch.sum(y_i, dim=1, keepdim=True) / y_i.shape[1]\n", + " z = self.f(y)\n", + " return z[:, 0]\n", + "\n", + " ########################################################\n", + "\n", + " # PyTorch Lightning bookkeeping:\n", + " def training_step(self, batch, batch_idx):\n", + " x, z = batch\n", + " predicted_z = self(x)\n", + " loss = F.mse_loss(predicted_z, z)\n", + " return loss\n", + "\n", + " def validation_step(self, batch, batch_idx):\n", + " return self.training_step(batch, batch_idx)\n", + "\n", + " def configure_optimizers(self):\n", + " optimizer = torch.optim.Adam(self.parameters(), lr=self.max_lr)\n", + " scheduler = {\n", + " \"scheduler\": torch.optim.lr_scheduler.OneCycleLR(\n", + " optimizer,\n", + " max_lr=self.max_lr,\n", + " total_steps=self.trainer.estimated_stepping_batches,\n", + " final_div_factor=1e4,\n", + " ),\n", + " \"interval\": \"step\",\n", + " }\n", + " return [optimizer], [scheduler]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kK725aSEuUvG" + }, + "source": [ + "## Data bookkeeping" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KdWVtWUcbDhQ" + }, + "source": [ + "Put everything into PyTorch and do a train/test split:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "0ym19abgbDhR" + }, + "outputs": [], + "source": [ + "from multiprocessing import cpu_count\n", + "\n", + "Xt = torch.tensor(X).float()\n", + "zt = torch.tensor(z).float()\n", + "X_train, X_test, z_train, z_test = train_test_split(Xt, zt, random_state=0)\n", + "train_set = TensorDataset(X_train, z_train)\n", + "train = DataLoader(\n", + " train_set, batch_size=128, num_workers=cpu_count(), shuffle=True, pin_memory=True\n", + ")\n", + "test_set = TensorDataset(X_test, z_test)\n", + "test = DataLoader(test_set, batch_size=256, num_workers=cpu_count(), pin_memory=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3dw_NefuudIq" + }, + "source": [ + "## Train the model with PyTorch Lightning on GPUs:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hhlhLQUBbDhT" + }, + "source": [ + "Start the model:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1ldN0999bDhU" + }, + "outputs": [], + "source": [ + "pl.seed_everything(0)\n", + "model = SumNet()\n", + "model.total_steps = total_steps\n", + "model.max_lr = 1e-2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WWRsu5A9bDhW" + }, + "source": [ + "PyTorch Lightning trainer object:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "33R2nrv-b62w" + }, + "outputs": [], + "source": [ + "trainer = pl.Trainer(max_steps=total_steps, accelerator=\"gpu\", devices=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jh91CukM5CkI" + }, + "source": [ + "Here, we fit the neural network:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "TXZdF8k1bDhY" + }, + "outputs": [], + "source": [ + "trainer.fit(model, train_dataloaders=train, val_dataloaders=test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uYzk0yU4ulfH" + }, + "source": [ + "## Latent vectors of network\n", + "\n", + "Let's get the input and output of the learned `g` function from the network over some random data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "s2sQLla5bDhb" + }, + "outputs": [], + "source": [ + "np.random.seed(0)\n", + "idx = np.random.randint(0, 10000, size=1000)\n", + "\n", + "X_for_pysr = Xt[idx]\n", + "y_i_for_pysr = model.g(X_for_pysr)[:, :, 0]\n", + "y_for_pysr = torch.sum(y_i_for_pysr, dim=1) / y_i_for_pysr.shape[1]\n", + "z_for_pysr = zt[idx] # Use true values.\n", + "\n", + "X_for_pysr.shape, y_i_for_pysr.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nCCIvvAGuyFi" + }, + "source": [ + "## Learning over the network:\n", + "\n", + "Now, let's fit `g` using PySR.\n", + "\n", + "> **Warning**\n", + ">\n", + "> First, let's save the data, because sometimes PyTorch and PyJulia's C bindings interfere and cause the colab kernel to crash. If we need to restart, we can just load the data without having to retrain the network:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nnet_recordings = {\n", + " \"g_input\": X_for_pysr.detach().cpu().numpy().reshape(-1, 5),\n", + " \"g_output\": y_i_for_pysr.detach().cpu().numpy().reshape(-1),\n", + " \"f_input\": y_for_pysr.detach().cpu().numpy().reshape(-1, 1),\n", + " \"f_output\": z_for_pysr.detach().cpu().numpy().reshape(-1),\n", + "}\n", + "\n", + "# Save the data for later use:\n", + "import pickle as pkl\n", + "\n", + "with open(\"nnet_recordings.pkl\", \"wb\") as f:\n", + " pkl.dump(nnet_recordings, f)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now load the data, including after a crash (be sure to re-run the import cells at the top of this notebook, including the one that starts PyJulia)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pickle as pkl\n", + "\n", + "nnet_recordings = pkl.load(open(\"nnet_recordings.pkl\", \"rb\"))\n", + "f_input = nnet_recordings[\"f_input\"]\n", + "f_output = nnet_recordings[\"f_output\"]\n", + "g_input = nnet_recordings[\"g_input\"]\n", + "g_output = nnet_recordings[\"g_output\"]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now fit using a subsample of the data (symbolic regression only needs a small sample to find the best equation):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "51QdHVSkbDhc" + }, + "outputs": [], + "source": [ + "rstate = np.random.RandomState(0)\n", + "f_sample_idx = rstate.choice(f_input.shape[0], size=500, replace=False)\n", + "\n", + "model = PySRRegressor(\n", + " niterations=20,\n", + " binary_operators=[\"plus\", \"sub\", \"mult\"],\n", + " unary_operators=[\"cos\", \"square\", \"neg\"],\n", + ")\n", + "model.fit(g_input[f_sample_idx], g_output[f_sample_idx])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1a738a33" + }, + "source": [ + "If this segfaults, restart the notebook, and run the initial imports and PyJulia part, but skip the PyTorch training. This is because PyTorch's C binding tends to interefere with PyJulia. You can then re-run the `pkl.load` cell to import the data." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xginVMmTu3MZ" + }, + "source": [ + "## Validation" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "6WuaeqyqbDhe" + }, + "source": [ + "Recall we are searching for $f$ and $g$ such that:\n", + "$$z=f(\\sum g(x_i))$$ \n", + "which approximates the true relation:\n", + "$$ z = y^2,\\quad y = \\frac{1}{10} \\sum(y_i),\\quad y_i = x_{i0}^2 + 6 \\cos(2 x_{i2})$$\n", + "\n", + "Let's see how well we did in recovering $g$:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "E1_VWQ45bDhf" + }, + "outputs": [], + "source": [ + "model.equations_[[\"complexity\", \"loss\", \"equation\"]]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mlU1hidZkgCY" + }, + "source": [ + "A neural network can easily undo a linear transform (which commutes with the summation), so any affine transform in $g$ is to be expected. The network for $f$ has learned to undo the linear transform.\n", + "\n", + "This likely won't find the exact result, but it should find something similar. You may wish to try again but with many more `total_steps` for the neural network (10,000 is quite small!).\n", + "\n", + "Then, we can learn another analytic equation for $f$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TntGlQEwbDhk" + }, + "source": [ + "**Now, we can compose these together to get the time series model!**\n", + "\n", + "Think about what we just did: we found an analytical equation for $z$ in terms of $500$ datapoints, under the assumption that $z$ is a function of a sum of another function over an axis:\n", + "\n", + "$$ z = f(\\sum_i g(x_i)) $$\n", + "\n", + "And we pulled out analytical copies for $g$ using symbolic regression." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1QsHVjAVbDhk" + }, + "source": [ + "# Other PySR Options" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "S5dO61g1bDhk" + }, + "source": [ + "The full list of PySR parameters can be found here: https://astroautomata.com/PySR/api" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "pysr_demo.ipynb", + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/mkdocs.yml b/mkdocs.yml index dc92d026631d760f102ce04ce7b0886a91300db0..8199745ae71bdfc4fd397f8ae6a3b1368b9f20b2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -13,7 +13,7 @@ theme: toggle: icon: material/toggle-switch-off-outline name: Switch to light mode - + features: - navigation.expand diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..5d7bf33d948c45d40befd4769d0c15f74615472b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,2 @@ +[tool.isort] +profile = "black" diff --git a/pysr/__init__.py b/pysr/__init__.py index d9f9229f75a587d0f02ca8d1a0065a5dc33c9a12..5f2200356cf4810cbd8cfc941ae1032732e51ca4 100644 --- a/pysr/__init__.py +++ b/pysr/__init__.py @@ -1,14 +1,23 @@ from . import sklearn_monkeypatch -from .version import __version__ -from .sr import ( - pysr, - PySRRegressor, - best, - best_tex, - best_callable, - best_row, -) -from .julia_helpers import install -from .feynman_problems import Problem, FeynmanProblem from .export_jax import sympy2jax from .export_torch import sympy2torch +from .feynman_problems import FeynmanProblem, Problem +from .julia_helpers import install +from .sr import PySRRegressor, best, best_callable, best_row, best_tex, pysr +from .version import __version__ + +__all__ = [ + "sklearn_monkeypatch", + "sympy2jax", + "sympy2torch", + "FeynmanProblem", + "Problem", + "install", + "PySRRegressor", + "best", + "best_callable", + "best_row", + "best_tex", + "pysr", + "__version__", +] diff --git a/pysr/_cli/main.py b/pysr/_cli/main.py index 9d3551d98eb311c500e9cfb7cc7a0addb57cf5c8..d82ab79edf7987362e1c86183f4f112e5787e0b9 100644 --- a/pysr/_cli/main.py +++ b/pysr/_cli/main.py @@ -1,4 +1,5 @@ import click + from ..julia_helpers import install diff --git a/pysr/export_jax.py b/pysr/export_jax.py index 6570c3b67d626a5eae9633e65f72daefe2877b68..e1730ca4886fe5cede3cf3d75cda90d3a94e9805 100644 --- a/pysr/export_jax.py +++ b/pysr/export_jax.py @@ -1,7 +1,4 @@ -import functools as ft import sympy -import string -import random # Special since need to reduce arguments. MUL = 0 diff --git a/pysr/export_latex.py b/pysr/export_latex.py index 4e597157f11a7338c4a6a126eb86a9f18df418f0..a9a91d762c1b4b211c5f1f89ac05bc419d3cb0a0 100644 --- a/pysr/export_latex.py +++ b/pysr/export_latex.py @@ -1,9 +1,9 @@ """Functions to help export PySR equations to LaTeX.""" +from typing import List + +import pandas as pd import sympy from sympy.printing.latex import LatexPrinter -import pandas as pd -from typing import List -import warnings class PreciseLatexPrinter(LatexPrinter): diff --git a/pysr/export_numpy.py b/pysr/export_numpy.py index 5e2035935775b9a4e3884e79577ddba856e93e56..63e23dc6b9e93afda7680a396ebdd318404940fc 100644 --- a/pysr/export_numpy.py +++ b/pysr/export_numpy.py @@ -1,8 +1,9 @@ """Code for exporting discovered expressions to numpy""" +import warnings + import numpy as np import pandas as pd from sympy import lambdify -import warnings class CallableEquation: diff --git a/pysr/export_torch.py b/pysr/export_torch.py index 12ebe873199c7ea445850576e3a2c048119d8010..7fcb67e82f705485fadbbdeab9b22fab17f8fd06 100644 --- a/pysr/export_torch.py +++ b/pysr/export_torch.py @@ -5,6 +5,7 @@ import collections as co import functools as ft + import sympy diff --git a/pysr/feynman_problems.py b/pysr/feynman_problems.py index cdcc4cdba6c292cb23dc8e0bc103796c3c2dda2d..a264a901b597dc2b2846fba76f9dbf213cd79df6 100644 --- a/pysr/feynman_problems.py +++ b/pysr/feynman_problems.py @@ -1,8 +1,10 @@ -import numpy as np import csv -from .sr import pysr, best -from pathlib import Path from functools import partial +from pathlib import Path + +import numpy as np + +from .sr import best, pysr PKG_DIR = Path(__file__).parents[1] FEYNMAN_DATASET = PKG_DIR / "datasets" / "FeynmanEquations.csv" @@ -118,6 +120,7 @@ def do_feynman_experiments_parallel( data_dir=FEYNMAN_DATASET, ): import multiprocessing as mp + from tqdm import tqdm problems = mk_problems(first=first, gen=True, dp=dp, data_dir=data_dir) diff --git a/pysr/julia_helpers.py b/pysr/julia_helpers.py index 566ba98aa764571a690d01e3cbd93715f1f079f7..7918c5e6d254ed0a9df08a13d4deee971c3cece9 100644 --- a/pysr/julia_helpers.py +++ b/pysr/julia_helpers.py @@ -1,12 +1,13 @@ """Functions for initializing the Julia environment and installing deps.""" -import sys +import os import subprocess +import sys import warnings from pathlib import Path -import os + from julia.api import JuliaError -from .version import __version__, __symbolic_regression_jl_version__ +from .version import __symbolic_regression_jl_version__, __version__ juliainfo = None julia_initialized = False diff --git a/pysr/sr.py b/pysr/sr.py index 056d0c8af3c37d6b077fcea7b35ae488f4a48d05..8638ac0e67c629a5b9f38bd56701ddc8f65984b1 100644 --- a/pysr/sr.py +++ b/pysr/sr.py @@ -1,40 +1,37 @@ """Define the PySRRegressor scikit-learn interface.""" import copy -from io import StringIO import os -import sys -import numpy as np -import pandas as pd -import sympy -from sympy import sympify +import pickle as pkl import re -import tempfile import shutil -from pathlib import Path -import pickle as pkl -from datetime import datetime +import sys +import tempfile import warnings +from datetime import datetime +from io import StringIO from multiprocessing import cpu_count -from sklearn.base import BaseEstimator, RegressorMixin, MultiOutputMixin +from pathlib import Path + +import numpy as np +import pandas as pd +import sympy +from sklearn.base import BaseEstimator, MultiOutputMixin, RegressorMixin from sklearn.utils import check_array, check_consistent_length, check_random_state -from sklearn.utils.validation import ( - _check_feature_names_in, - check_is_fitted, -) +from sklearn.utils.validation import _check_feature_names_in, check_is_fitted +from sympy import sympify +from .deprecated import make_deprecated_kwargs_for_pysr_regressor +from .export_latex import generate_multiple_tables, generate_single_table, to_latex +from .export_numpy import CallableEquation from .julia_helpers import ( - init_julia, - _process_julia_project, - is_julia_version_greater_eq, _escape_filename, + _load_backend, _load_cluster_manager, + _process_julia_project, _update_julia_project, - _load_backend, + init_julia, + is_julia_version_greater_eq, ) -from .export_numpy import CallableEquation -from .export_latex import generate_single_table, generate_multiple_tables, to_latex -from .deprecated import make_deprecated_kwargs_for_pysr_regressor - Main = None # TODO: Rename to more descriptive name like "julia_runtime" @@ -2454,7 +2451,7 @@ def idx_model_selection(equations: pd.DataFrame, model_selection: str) -> int: def _denoise(X, y, Xresampled=None, random_state=None): """Denoise the dataset using a Gaussian process.""" from sklearn.gaussian_process import GaussianProcessRegressor - from sklearn.gaussian_process.kernels import RBF, WhiteKernel, ConstantKernel + from sklearn.gaussian_process.kernels import RBF, ConstantKernel, WhiteKernel gp_kernel = RBF(np.ones(X.shape[1])) + WhiteKernel(1e-1) + ConstantKernel() gpr = GaussianProcessRegressor( diff --git a/pysr/test/__init__.py b/pysr/test/__init__.py index 9fa94f52760678d41d44a15198adb6cdfe59ed22..7b176eab67718b614d8226ef6572871b97b2211a 100644 --- a/pysr/test/__init__.py +++ b/pysr/test/__init__.py @@ -1,5 +1,7 @@ from .test import runtests +from .test_cli import runtests as runtests_cli from .test_env import runtests as runtests_env from .test_jax import runtests as runtests_jax from .test_torch import runtests as runtests_torch -from .test_cli import runtests as runtests_cli + +__all__ = ["runtests", "runtests_env", "runtests_jax", "runtests_torch", "runtests_cli"] diff --git a/pysr/test/test.py b/pysr/test/test.py index b5b657e79ad6371e24831896dad10e2c51caf6b2..8d6937e406406c2fb9d759e13de1faf8e19dc602 100644 --- a/pysr/test/test.py +++ b/pysr/test/test.py @@ -1,28 +1,28 @@ +import inspect import os +import pickle as pkl +import tempfile import traceback -import inspect import unittest +import warnings +from pathlib import Path + import numpy as np +import pandas as pd +import sympy from sklearn import model_selection from sklearn.utils.estimator_checks import check_estimator -import sympy -import pandas as pd -import warnings -import pickle as pkl -import tempfile -from pathlib import Path -from .. import julia_helpers -from .. import PySRRegressor +from .. import PySRRegressor, julia_helpers +from ..export_latex import to_latex from ..sr import ( - run_feature_selection, - _handle_feature_selection, - _csv_filename_to_pkl_filename, - idx_model_selection, _check_assertions, + _csv_filename_to_pkl_filename, + _handle_feature_selection, _process_constraints, + idx_model_selection, + run_feature_selection, ) -from ..export_latex import to_latex DEFAULT_PARAMS = inspect.signature(PySRRegressor.__init__).parameters DEFAULT_NITERATIONS = DEFAULT_PARAMS["niterations"].default diff --git a/pysr/test/test_cli.py b/pysr/test/test_cli.py index a1270c82feb79e85146cc8714d2499d7a15f113b..0a97a1eb17d0bf7b4e097bff7ac417c4e60034f8 100644 --- a/pysr/test/test_cli.py +++ b/pysr/test/test_cli.py @@ -1,5 +1,7 @@ import unittest + from click import testing as click_testing + from .._cli.main import pysr diff --git a/pysr/test/test_env.py b/pysr/test/test_env.py index c044cfd0cd4247aebbfe111625b3e000611cc43c..423a3064ad792cacba5e66effb85546850003dc0 100644 --- a/pysr/test/test_env.py +++ b/pysr/test/test_env.py @@ -1,7 +1,7 @@ """Contains tests for creating and initializing custom Julia projects.""" -import unittest import os +import unittest from tempfile import TemporaryDirectory from .. import julia_helpers diff --git a/pysr/test/test_jax.py b/pysr/test/test_jax.py index e9834cadd4fe8d84c4bc69635a28740580bc4448..aaafb97cf6b3be04987c56df7f2c87c83baf3ae6 100644 --- a/pysr/test/test_jax.py +++ b/pysr/test/test_jax.py @@ -1,10 +1,11 @@ import unittest +from functools import partial + import numpy as np import pandas as pd import sympy -from functools import partial -from .. import sympy2jax, PySRRegressor +from .. import PySRRegressor, sympy2jax class TestJAX(unittest.TestCase): diff --git a/pysr/test/test_torch.py b/pysr/test/test_torch.py index 3520b28ee48e9bbebad0c98fa2a6b588db9fa031..5a71af71ff55decc488a86fb47cbe99bb90a231d 100644 --- a/pysr/test/test_torch.py +++ b/pysr/test/test_torch.py @@ -1,9 +1,11 @@ +import platform import unittest + import numpy as np import pandas as pd -import platform import sympy -from .. import sympy2torch, PySRRegressor + +from .. import PySRRegressor, sympy2torch # Need to initialize Julia before importing torch...