Spaces:
Running
Running
Add `bumper` parameter
Browse files- README.md +1 -1
- docs/tuning.md +1 -1
- pysr/julia_extensions.py +2 -0
- pysr/param_groupings.yml +1 -0
- pysr/sr.py +8 -0
- pysr/test/test.py +2 -1
README.md
CHANGED
|
@@ -287,7 +287,7 @@ model = PySRRegressor(
|
|
| 287 |
# ^ Higher precision calculations.
|
| 288 |
warm_start=True,
|
| 289 |
# ^ Start from where left off.
|
| 290 |
-
|
| 291 |
# ^ Faster evaluation (experimental)
|
| 292 |
julia_project=None,
|
| 293 |
# ^ Can set to the path of a folder containing the
|
|
|
|
| 287 |
# ^ Higher precision calculations.
|
| 288 |
warm_start=True,
|
| 289 |
# ^ Start from where left off.
|
| 290 |
+
bumper=True,
|
| 291 |
# ^ Faster evaluation (experimental)
|
| 292 |
julia_project=None,
|
| 293 |
# ^ Can set to the path of a folder containing the
|
docs/tuning.md
CHANGED
|
@@ -20,7 +20,7 @@ I run from IPython (Jupyter Notebooks don't work as well[^1]) on the head node o
|
|
| 20 |
8. I typically don't use `maxdepth`, but if I do, I set it strictly, while also leaving 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.
|
| 21 |
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`.
|
| 22 |
10. Set `weight_optimize` to some larger value, maybe `0.001`. This is very important if `ncycles_per_iteration` is large, so that optimization happens more frequently.
|
| 23 |
-
11. Set `
|
| 24 |
12. For final runs, after I have tuned everything, I typically set `niterations` to some very large value, and just let it run for a week until my job finishes (genetic algorithms tend not to converge, they can look like they settle down, but then find a new family of expression, and explore a new space). If I am satisfied with the current equations (which are visible either in the terminal or in the saved csv file), I quit the job early.
|
| 25 |
|
| 26 |
Since I am running in IPython, I can just hit `q` and then `<enter>` to stop the job, tweak the hyperparameters, and then start the search again.
|
|
|
|
| 20 |
8. I typically don't use `maxdepth`, but if I do, I set it strictly, while also leaving 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.
|
| 21 |
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`.
|
| 22 |
10. Set `weight_optimize` to some larger value, maybe `0.001`. This is very important if `ncycles_per_iteration` is large, so that optimization happens more frequently.
|
| 23 |
+
11. Set `bumper` to `True`. This turns on bump allocation but is experimental. It should give you a nice 20% speedup.
|
| 24 |
12. For final runs, after I have tuned everything, I typically set `niterations` to some very large value, and just let it run for a week until my job finishes (genetic algorithms tend not to converge, they can look like they settle down, but then find a new family of expression, and explore a new space). If I am satisfied with the current equations (which are visible either in the terminal or in the saved csv file), I quit the job early.
|
| 25 |
|
| 26 |
Since I am running in IPython, I can just hit `q` and then `<enter>` to stop the job, tweak the hyperparameters, and then start the search again.
|
pysr/julia_extensions.py
CHANGED
|
@@ -8,6 +8,8 @@ def load_required_packages(
|
|
| 8 |
):
|
| 9 |
if turbo:
|
| 10 |
load_package("LoopVectorization", "bdcacae8-1622-11e9-2a5c-532679323890")
|
|
|
|
|
|
|
| 11 |
if enable_autodiff:
|
| 12 |
load_package("Zygote", "e88e6eb3-aa80-5325-afca-941959d7151f")
|
| 13 |
if cluster_manager is not None:
|
|
|
|
| 8 |
):
|
| 9 |
if turbo:
|
| 10 |
load_package("LoopVectorization", "bdcacae8-1622-11e9-2a5c-532679323890")
|
| 11 |
+
if bumper:
|
| 12 |
+
load_package("Bumper", "8ce10254-0962-460f-a3d8-1f77fea1446e")
|
| 13 |
if enable_autodiff:
|
| 14 |
load_package("Zygote", "e88e6eb3-aa80-5325-afca-941959d7151f")
|
| 15 |
if cluster_manager is not None:
|
pysr/param_groupings.yml
CHANGED
|
@@ -74,6 +74,7 @@
|
|
| 74 |
- precision
|
| 75 |
- fast_cycle
|
| 76 |
- turbo
|
|
|
|
| 77 |
- enable_autodiff
|
| 78 |
- Determinism:
|
| 79 |
- random_state
|
|
|
|
| 74 |
- precision
|
| 75 |
- fast_cycle
|
| 76 |
- turbo
|
| 77 |
+
- bumper
|
| 78 |
- enable_autodiff
|
| 79 |
- Determinism:
|
| 80 |
- random_state
|
pysr/sr.py
CHANGED
|
@@ -484,6 +484,10 @@ class PySRRegressor(MultiOutputMixin, RegressorMixin, BaseEstimator):
|
|
| 484 |
search evaluation. Certain operators may not be supported.
|
| 485 |
Does not support 16-bit precision floats.
|
| 486 |
Default is `False`.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 487 |
precision : int
|
| 488 |
What precision to use for the data. By default this is `32`
|
| 489 |
(float32), but you can select `64` or `16` as well, giving
|
|
@@ -727,6 +731,7 @@ class PySRRegressor(MultiOutputMixin, RegressorMixin, BaseEstimator):
|
|
| 727 |
batch_size: int = 50,
|
| 728 |
fast_cycle: bool = False,
|
| 729 |
turbo: bool = False,
|
|
|
|
| 730 |
precision: int = 32,
|
| 731 |
enable_autodiff: bool = False,
|
| 732 |
random_state=None,
|
|
@@ -822,6 +827,7 @@ class PySRRegressor(MultiOutputMixin, RegressorMixin, BaseEstimator):
|
|
| 822 |
self.batch_size = batch_size
|
| 823 |
self.fast_cycle = fast_cycle
|
| 824 |
self.turbo = turbo
|
|
|
|
| 825 |
self.precision = precision
|
| 826 |
self.enable_autodiff = enable_autodiff
|
| 827 |
self.random_state = random_state
|
|
@@ -1609,6 +1615,7 @@ class PySRRegressor(MultiOutputMixin, RegressorMixin, BaseEstimator):
|
|
| 1609 |
|
| 1610 |
load_required_packages(
|
| 1611 |
turbo=self.turbo,
|
|
|
|
| 1612 |
enable_autodiff=self.enable_autodiff,
|
| 1613 |
cluster_manager=cluster_manager,
|
| 1614 |
)
|
|
@@ -1654,6 +1661,7 @@ class PySRRegressor(MultiOutputMixin, RegressorMixin, BaseEstimator):
|
|
| 1654 |
maxdepth=maxdepth,
|
| 1655 |
fast_cycle=self.fast_cycle,
|
| 1656 |
turbo=self.turbo,
|
|
|
|
| 1657 |
enable_autodiff=self.enable_autodiff,
|
| 1658 |
migration=self.migration,
|
| 1659 |
hof_migration=self.hof_migration,
|
|
|
|
| 484 |
search evaluation. Certain operators may not be supported.
|
| 485 |
Does not support 16-bit precision floats.
|
| 486 |
Default is `False`.
|
| 487 |
+
bumper: bool
|
| 488 |
+
(Experimental) Whether to use Bumper.jl to speed up the search
|
| 489 |
+
evaluation. Does not support 16-bit precision floats.
|
| 490 |
+
Default is `False`.
|
| 491 |
precision : int
|
| 492 |
What precision to use for the data. By default this is `32`
|
| 493 |
(float32), but you can select `64` or `16` as well, giving
|
|
|
|
| 731 |
batch_size: int = 50,
|
| 732 |
fast_cycle: bool = False,
|
| 733 |
turbo: bool = False,
|
| 734 |
+
bumper: bool = False,
|
| 735 |
precision: int = 32,
|
| 736 |
enable_autodiff: bool = False,
|
| 737 |
random_state=None,
|
|
|
|
| 827 |
self.batch_size = batch_size
|
| 828 |
self.fast_cycle = fast_cycle
|
| 829 |
self.turbo = turbo
|
| 830 |
+
self.bumper = bumper
|
| 831 |
self.precision = precision
|
| 832 |
self.enable_autodiff = enable_autodiff
|
| 833 |
self.random_state = random_state
|
|
|
|
| 1615 |
|
| 1616 |
load_required_packages(
|
| 1617 |
turbo=self.turbo,
|
| 1618 |
+
bumper=self.bumper,
|
| 1619 |
enable_autodiff=self.enable_autodiff,
|
| 1620 |
cluster_manager=cluster_manager,
|
| 1621 |
)
|
|
|
|
| 1661 |
maxdepth=maxdepth,
|
| 1662 |
fast_cycle=self.fast_cycle,
|
| 1663 |
turbo=self.turbo,
|
| 1664 |
+
bumper=self.bumper,
|
| 1665 |
enable_autodiff=self.enable_autodiff,
|
| 1666 |
migration=self.migration,
|
| 1667 |
hof_migration=self.hof_migration,
|
pysr/test/test.py
CHANGED
|
@@ -58,12 +58,13 @@ class TestPipeline(unittest.TestCase):
|
|
| 58 |
model.fit(self.X, y, variable_names=["c1", "c2", "c3", "c4", "c5"])
|
| 59 |
self.assertIn("c1", model.equations_.iloc[-1]["equation"])
|
| 60 |
|
| 61 |
-
def
|
| 62 |
y = self.X[:, 0]
|
| 63 |
weights = np.ones_like(y)
|
| 64 |
model = PySRRegressor(
|
| 65 |
**self.default_test_kwargs,
|
| 66 |
early_stop_condition="stop_if(loss, complexity) = loss < 1e-4 && complexity == 1",
|
|
|
|
| 67 |
)
|
| 68 |
model.fit(self.X, y, weights=weights)
|
| 69 |
print(model.equations_)
|
|
|
|
| 58 |
model.fit(self.X, y, variable_names=["c1", "c2", "c3", "c4", "c5"])
|
| 59 |
self.assertIn("c1", model.equations_.iloc[-1]["equation"])
|
| 60 |
|
| 61 |
+
def test_linear_relation_weighted_bumper(self):
|
| 62 |
y = self.X[:, 0]
|
| 63 |
weights = np.ones_like(y)
|
| 64 |
model = PySRRegressor(
|
| 65 |
**self.default_test_kwargs,
|
| 66 |
early_stop_condition="stop_if(loss, complexity) = loss < 1e-4 && complexity == 1",
|
| 67 |
+
bumper=True,
|
| 68 |
)
|
| 69 |
model.fit(self.X, y, weights=weights)
|
| 70 |
print(model.equations_)
|