MilesCranmer commited on
Commit
d6f734d
2 Parent(s): e66aef0 4726b4a

Merge pull request #298 from w2ll2am/master

Browse files

Added CLI to run pysr.install() to install Julia dependencies

.github/workflows/CI.yml CHANGED
@@ -54,11 +54,13 @@ jobs:
54
  python -m pip install --upgrade pip
55
  pip install -r requirements.txt
56
  python setup.py install
57
- python -c 'import pysr; pysr.install()'
58
  - name: "Install Coverage tool"
59
  run: pip install coverage coveralls
60
  - name: "Run tests"
61
- run: coverage run --source=pysr --omit='*/test/*,*/feynman_problems.py' -m pysr.test main
 
 
62
  - name: "Install JAX"
63
  run: pip install jax jaxlib # (optional import)
64
  - name: "Run JAX tests"
@@ -112,7 +114,7 @@ jobs:
112
  - name: "Install PySR"
113
  run: |
114
  python3 -m pip install .
115
- python3 -c 'import pysr; pysr.install()'
116
  - name: "Run tests"
117
  run: cd /tmp && python -m pysr.test main
118
 
 
54
  python -m pip install --upgrade pip
55
  pip install -r requirements.txt
56
  python setup.py install
57
+ python -m pysr install
58
  - name: "Install Coverage tool"
59
  run: pip install coverage coveralls
60
  - name: "Run tests"
61
+ run: |
62
+ coverage run --source=pysr --omit='*/test/*,*/feynman_problems.py' -m pysr.test main
63
+ coverage run --append --source=pysr --omit='*/test/*,*/feynman_problems.py' -m pysr.test cli
64
  - name: "Install JAX"
65
  run: pip install jax jaxlib # (optional import)
66
  - name: "Run JAX tests"
 
114
  - name: "Install PySR"
115
  run: |
116
  python3 -m pip install .
117
+ python3 -m pysr install
118
  - name: "Run tests"
119
  run: cd /tmp && python -m pysr.test main
120
 
.github/workflows/CI_Windows.yml CHANGED
@@ -54,9 +54,11 @@ jobs:
54
  python -m pip install --upgrade pip
55
  pip install -r requirements.txt
56
  python setup.py install
57
- python -c 'import pysr; pysr.install()'
58
  - name: "Run tests"
59
- run: python -m pysr.test main
 
 
60
  - name: "Install Torch"
61
  run: pip install torch # (optional import)
62
  - name: "Run Torch tests"
 
54
  python -m pip install --upgrade pip
55
  pip install -r requirements.txt
56
  python setup.py install
57
+ python -m pysr install
58
  - name: "Run tests"
59
+ run: |
60
+ python -m pysr.test main
61
+ python -m pysr.test cli
62
  - name: "Install Torch"
63
  run: pip install torch # (optional import)
64
  - name: "Run Torch tests"
.github/workflows/CI_docker.yml CHANGED
@@ -39,4 +39,4 @@ jobs:
39
  - name: Build docker
40
  run: docker build --platform=${{ matrix.arch }} -t pysr --build-arg JLVERSION=${{ matrix.julia-version }} --build-arg PYVERSION=${{ matrix.python-version }} .
41
  - name: Test docker
42
- run: docker run --platform=${{ matrix.arch }} --rm pysr /bin/bash -c 'python3 -m pysr.test main && python3 -m pysr.test env'
 
39
  - name: Build docker
40
  run: docker build --platform=${{ matrix.arch }} -t pysr --build-arg JLVERSION=${{ matrix.julia-version }} --build-arg PYVERSION=${{ matrix.python-version }} .
41
  - name: Test docker
42
+ run: docker run --platform=${{ matrix.arch }} --rm pysr /bin/bash -c 'python3 -m pysr.test main && python3 -m pysr.test cli && python3 -m pysr.test env'
.github/workflows/CI_docker_large_nightly.yml CHANGED
@@ -33,4 +33,4 @@ jobs:
33
  - name: Build docker
34
  run: docker build --platform=${{ matrix.arch }} -t pysr --build-arg JLVERSION=${{ matrix.julia-version }} .
35
  - name: Test docker
36
- run: docker run --platform=${{ matrix.arch }} --rm pysr /bin/bash -c 'python3 -m pysr.test main && python3 -m pysr.test env'
 
33
  - name: Build docker
34
  run: docker build --platform=${{ matrix.arch }} -t pysr --build-arg JLVERSION=${{ matrix.julia-version }} .
35
  - name: Test docker
36
+ run: docker run --platform=${{ matrix.arch }} --rm pysr /bin/bash -c 'python3 -m pysr.test main && python3 -m pysr.test cli && python3 -m pysr.test env'
.github/workflows/CI_large_nightly.yml CHANGED
@@ -42,9 +42,11 @@ jobs:
42
  python -m pip install --upgrade pip
43
  pip install -r requirements.txt
44
  python setup.py install
45
- python -c 'import pysr; pysr.install()'
46
  - name: "Run tests"
47
- run: python -m pysr.test main
 
 
48
  - name: "Run new env test"
49
  run: python -m pysr.test env
50
  if: ${{ !(matrix.os == 'windows-latest' && matrix.python-version == '3.7') }}
 
42
  python -m pip install --upgrade pip
43
  pip install -r requirements.txt
44
  python setup.py install
45
+ python -m pysr install
46
  - name: "Run tests"
47
+ run: |
48
+ python -m pysr.test main
49
+ python -m pysr.test cli
50
  - name: "Run new env test"
51
  run: python -m pysr.test env
52
  if: ${{ !(matrix.os == 'windows-latest' && matrix.python-version == '3.7') }}
.github/workflows/CI_mac.yml CHANGED
@@ -54,9 +54,11 @@ jobs:
54
  python -m pip install --upgrade pip
55
  pip install -r requirements.txt
56
  python setup.py install
57
- python -c 'import pysr; pysr.install()'
58
  - name: "Run tests"
59
- run: python -m pysr.test main
 
 
60
  - name: "Install JAX"
61
  run: pip install jax jaxlib # (optional import)
62
  - name: "Run JAX tests"
 
54
  python -m pip install --upgrade pip
55
  pip install -r requirements.txt
56
  python setup.py install
57
+ python -m pysr install
58
  - name: "Run tests"
59
+ run: |
60
+ python -m pysr.test main
61
+ python -m pysr.test cli
62
  - name: "Install JAX"
63
  run: pip install jax jaxlib # (optional import)
64
  - name: "Run JAX tests"
Dockerfile CHANGED
@@ -28,7 +28,7 @@ ADD ./pysr/ /pysr/pysr/
28
  RUN pip3 install .
29
 
30
  # Install Julia pre-requisites:
31
- RUN python3 -c 'import pysr; pysr.install()'
32
 
33
  # metainformation
34
  LABEL org.opencontainers.image.authors = "Miles Cranmer"
 
28
  RUN pip3 install .
29
 
30
  # Install Julia pre-requisites:
31
+ RUN python3 -m pysr install
32
 
33
  # metainformation
34
  LABEL org.opencontainers.image.authors = "Miles Cranmer"
environment.yml CHANGED
@@ -9,4 +9,5 @@ dependencies:
9
  - setuptools
10
  - pyjulia
11
  - openlibm
12
- - openspecfun
 
 
9
  - setuptools
10
  - pyjulia
11
  - openlibm
12
+ - openspecfun
13
+ - click
pysr/__main__.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ from pysr._cli.main import pysr as _cli
2
+
3
+ if __name__ == "__main__":
4
+ _cli(prog_name="pysr")
pysr/_cli/__init__.py ADDED
File without changes
pysr/_cli/main.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import click
2
+ from ..julia_helpers import install
3
+
4
+
5
+ @click.group("pysr")
6
+ @click.pass_context
7
+ def pysr(context):
8
+ ctx = context
9
+
10
+
11
+ @pysr.command("install", help="Install Julia dependencies for PySR.")
12
+ @click.option(
13
+ "-p",
14
+ "julia_project",
15
+ "--project",
16
+ default=None,
17
+ type=str,
18
+ help="Install in a specific Julia project (e.g., a local copy of SymbolicRegression.jl).",
19
+ metavar="PROJECT_DIRECTORY",
20
+ )
21
+ @click.option("-q", "--quiet", is_flag=True, default=False, help="Disable logging.")
22
+ @click.option(
23
+ "--precompile",
24
+ "precompile",
25
+ flag_value=True,
26
+ default=None,
27
+ help="Force precompilation of Julia libraries.",
28
+ )
29
+ @click.option(
30
+ "--no-precompile",
31
+ "precompile",
32
+ flag_value=False,
33
+ default=None,
34
+ help="Disable precompilation.",
35
+ )
36
+ def _install(julia_project, quiet, precompile):
37
+ install(julia_project, quiet, precompile)
pysr/export_latex.py CHANGED
@@ -96,7 +96,6 @@ def generate_single_table(
96
  "$" + output_variable_name + " = " + latex_equation + "$"
97
  )
98
  else:
99
-
100
  broken_latex_equation = " ".join(
101
  [
102
  r"\begin{minipage}{0.8\linewidth}",
 
96
  "$" + output_variable_name + " = " + latex_equation + "$"
97
  )
98
  else:
 
99
  broken_latex_equation = " ".join(
100
  [
101
  r"\begin{minipage}{0.8\linewidth}",
pysr/julia_helpers.py CHANGED
@@ -110,10 +110,8 @@ def install(julia_project=None, quiet=False, precompile=None): # pragma: no cov
110
 
111
  def _import_error():
112
  return """
113
- Required dependencies are not installed or built. Run the following code in the Python REPL:
114
-
115
- >>> import pysr
116
- >>> pysr.install()
117
  """
118
 
119
 
@@ -286,14 +284,14 @@ def _backend_version_assertion(Main):
286
  f"does not match expected version {expected_backend_version}. "
287
  "Things may break. "
288
  "Please update your PySR installation with "
289
- "`python -c 'import pysr; pysr.install()'`."
290
  )
291
  except JuliaError: # pragma: no cover
292
  warnings.warn(
293
  "You seem to have an outdated version of SymbolicRegression.jl. "
294
  "Things may break. "
295
  "Please update your PySR installation with "
296
- "`python -c 'import pysr; pysr.install()'`."
297
  )
298
 
299
 
 
110
 
111
  def _import_error():
112
  return """
113
+ Required dependencies are not installed or built. Run the following command in your terminal:
114
+ python3 -m pysr install
 
 
115
  """
116
 
117
 
 
284
  f"does not match expected version {expected_backend_version}. "
285
  "Things may break. "
286
  "Please update your PySR installation with "
287
+ "`python3 -m pysr install`."
288
  )
289
  except JuliaError: # pragma: no cover
290
  warnings.warn(
291
  "You seem to have an outdated version of SymbolicRegression.jl. "
292
  "Things may break. "
293
  "Please update your PySR installation with "
294
+ "`python3 -m pysr install`."
295
  )
296
 
297
 
pysr/test/__init__.py CHANGED
@@ -2,3 +2,4 @@ from .test import runtests
2
  from .test_env import runtests as runtests_env
3
  from .test_jax import runtests as runtests_jax
4
  from .test_torch import runtests as runtests_torch
 
 
2
  from .test_env import runtests as runtests_env
3
  from .test_jax import runtests as runtests_jax
4
  from .test_torch import runtests as runtests_torch
5
+ from .test_cli import runtests as runtests_cli
pysr/test/__main__.py CHANGED
@@ -11,7 +11,7 @@ if __name__ == "__main__":
11
  parser.add_argument(
12
  "test",
13
  nargs="*",
14
- help="Test to run. One or more of 'main', 'env', 'jax', 'torch'.",
15
  )
16
 
17
  # Parse args:
@@ -25,7 +25,7 @@ if __name__ == "__main__":
25
 
26
  # Run tests:
27
  for test in tests:
28
- if test in {"main", "env", "jax", "torch"}:
29
  cur_dir = os.path.dirname(os.path.abspath(__file__))
30
  print(f"Running test from {cur_dir}")
31
  if test == "main":
@@ -36,6 +36,8 @@ if __name__ == "__main__":
36
  runtests_jax()
37
  elif test == "torch":
38
  runtests_torch()
 
 
39
  else:
40
  parser.print_help()
41
  raise SystemExit(1)
 
11
  parser.add_argument(
12
  "test",
13
  nargs="*",
14
+ help="Test to run. One or more of 'main', 'env', 'jax', 'torch', 'cli'.",
15
  )
16
 
17
  # Parse args:
 
25
 
26
  # Run tests:
27
  for test in tests:
28
+ if test in {"main", "env", "jax", "torch", "cli"}:
29
  cur_dir = os.path.dirname(os.path.abspath(__file__))
30
  print(f"Running test from {cur_dir}")
31
  if test == "main":
 
36
  runtests_jax()
37
  elif test == "torch":
38
  runtests_torch()
39
+ elif test == "cli":
40
+ runtests_cli()
41
  else:
42
  parser.print_help()
43
  raise SystemExit(1)
pysr/test/test_cli.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import unittest
2
+ from click import testing as click_testing
3
+ from .._cli.main import pysr
4
+
5
+
6
+ class TestCli(unittest.TestCase):
7
+ # TODO: Include test for custom project here.
8
+ def setUp(self):
9
+ self.cli_runner = click_testing.CliRunner()
10
+
11
+ def test_help_on_all_commands(self):
12
+ expected = "\n".join(
13
+ [
14
+ "Usage: pysr [OPTIONS] COMMAND [ARGS]...",
15
+ "",
16
+ "Options:",
17
+ " --help Show this message and exit.",
18
+ "",
19
+ "Commands:",
20
+ " install Install Julia dependencies for PySR.",
21
+ "",
22
+ ]
23
+ )
24
+ result = self.cli_runner.invoke(pysr, ["--help"])
25
+ self.assertEqual(expected, result.output)
26
+ self.assertEqual(0, result.exit_code)
27
+
28
+ def test_help_on_install(self):
29
+ expected = "\n".join(
30
+ [
31
+ "Usage: pysr install [OPTIONS]",
32
+ "",
33
+ " Install Julia dependencies for PySR.",
34
+ "",
35
+ "Options:",
36
+ " -p, --project PROJECT_DIRECTORY",
37
+ " Install in a specific Julia project (e.g., a",
38
+ " local copy of SymbolicRegression.jl).",
39
+ " -q, --quiet Disable logging.",
40
+ " --precompile Force precompilation of Julia libraries.",
41
+ " --no-precompile Disable precompilation.",
42
+ " --help Show this message and exit.",
43
+ "",
44
+ ]
45
+ )
46
+ result = self.cli_runner.invoke(pysr, ["install", "--help"])
47
+ self.assertEqual(expected, result.output)
48
+ self.assertEqual(0, result.exit_code)
49
+
50
+
51
+ def runtests():
52
+ """Run all tests in cliTest.py."""
53
+ loader = unittest.TestLoader()
54
+ suite = unittest.TestSuite()
55
+ suite.addTests(loader.loadTestsFromTestCase(TestCli))
56
+ runner = unittest.TextTestRunner()
57
+ return runner.run(suite)
pysr/version.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "0.13.0"
2
  __symbolic_regression_jl_version__ = "0.18.0"
 
1
+ __version__ = "0.14.0"
2
  __symbolic_regression_jl_version__ = "0.18.0"
requirements.txt CHANGED
@@ -1,5 +1,7 @@
1
  sympy
2
  pandas
3
  numpy
4
- scikit_learn >= 1.0.0
5
- julia >= 0.6.0
 
 
 
1
  sympy
2
  pandas
3
  numpy
4
+ scikit_learn>=1.0.0
5
+ julia>=0.6.0
6
+ click>=7.0.0
7
+ setuptools>=50.0.0