Spaces:
Sleeping
Sleeping
Commit
·
7f5b38a
1
Parent(s):
9fa51a8
Add feature to set arbitrary variable names
Browse files- README.md +2 -2
- julia/sr.jl +5 -1
- pysr/sr.py +10 -0
- setup.py +1 -1
README.md
CHANGED
|
@@ -304,14 +304,14 @@ pd.DataFrame, Results dataframe, giving complexity, MSE, and equations
|
|
| 304 |
- [x] Use @fastmath
|
| 305 |
- [x] Try @spawn over each sub-population. Do random sort, compute mutation for each, then replace 10% oldest.
|
| 306 |
- [x] Control max depth, rather than max number of nodes?
|
|
|
|
| 307 |
- [ ] Sort these todo lists by priority
|
| 308 |
|
| 309 |
## Feature ideas
|
| 310 |
|
| 311 |
- [ ] Sympy printing
|
| 312 |
-
- [ ] Allow user to pass names for variables - use these when printing
|
| 313 |
- [ ] Hierarchical model, so can re-use functional forms. Output of one equation goes into second equation?
|
| 314 |
-
- [ ] Call function to read from csv after running
|
| 315 |
- [ ] Add function to plot equations
|
| 316 |
- [ ] Refresh screen rather than dumping to stdout?
|
| 317 |
- [ ] Add ability to save state from python
|
|
|
|
| 304 |
- [x] Use @fastmath
|
| 305 |
- [x] Try @spawn over each sub-population. Do random sort, compute mutation for each, then replace 10% oldest.
|
| 306 |
- [x] Control max depth, rather than max number of nodes?
|
| 307 |
+
- [x] Allow user to pass names for variables - use these when printing
|
| 308 |
- [ ] Sort these todo lists by priority
|
| 309 |
|
| 310 |
## Feature ideas
|
| 311 |
|
| 312 |
- [ ] Sympy printing
|
|
|
|
| 313 |
- [ ] Hierarchical model, so can re-use functional forms. Output of one equation goes into second equation?
|
| 314 |
+
- [ ] Call function to read from csv after running, so dont need to run again
|
| 315 |
- [ ] Add function to plot equations
|
| 316 |
- [ ] Refresh screen rather than dumping to stdout?
|
| 317 |
- [ ] Add ability to save state from python
|
julia/sr.jl
CHANGED
|
@@ -121,7 +121,11 @@ function stringTree(tree::Node)::String
|
|
| 121 |
if tree.constant
|
| 122 |
return string(tree.val)
|
| 123 |
else
|
| 124 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
end
|
| 126 |
elseif tree.degree == 1
|
| 127 |
return "$(unaops[tree.op])($(stringTree(tree.l)))"
|
|
|
|
| 121 |
if tree.constant
|
| 122 |
return string(tree.val)
|
| 123 |
else
|
| 124 |
+
if useVarMap
|
| 125 |
+
return varMap[tree.val]
|
| 126 |
+
else
|
| 127 |
+
return "x$(tree.val - 1)"
|
| 128 |
+
end
|
| 129 |
end
|
| 130 |
elseif tree.degree == 1
|
| 131 |
return "$(unaops[tree.op])($(stringTree(tree.l)))"
|
pysr/sr.py
CHANGED
|
@@ -75,6 +75,7 @@ def pysr(X=None, y=None, weights=None,
|
|
| 75 |
maxsize=20,
|
| 76 |
fast_cycle=False,
|
| 77 |
maxdepth=None,
|
|
|
|
| 78 |
threads=None, #deprecated
|
| 79 |
julia_optimization=3,
|
| 80 |
):
|
|
@@ -135,6 +136,8 @@ def pysr(X=None, y=None, weights=None,
|
|
| 135 |
:param fast_cycle: bool, (experimental) - batch over population subsamples. This
|
| 136 |
is a slightly different algorithm than regularized evolution, but does cycles
|
| 137 |
15% faster. May be algorithmically less efficient.
|
|
|
|
|
|
|
| 138 |
:param julia_optimization: int, Optimization level (0, 1, 2, 3)
|
| 139 |
:returns: pd.DataFrame, Results dataframe, giving complexity, MSE, and equations
|
| 140 |
(as strings).
|
|
@@ -153,6 +156,8 @@ def pysr(X=None, y=None, weights=None,
|
|
| 153 |
if weights is not None:
|
| 154 |
assert len(weights.shape) == 1
|
| 155 |
assert X.shape[0] == weights.shape[0]
|
|
|
|
|
|
|
| 156 |
|
| 157 |
if populations is None:
|
| 158 |
populations = procs
|
|
@@ -222,6 +227,7 @@ const nrestarts = {nrestarts:d}
|
|
| 222 |
const perturbationFactor = {perturbationFactor:f}f0
|
| 223 |
const annealing = {"true" if annealing else "false"}
|
| 224 |
const weighted = {"true" if weights is not None else "false"}
|
|
|
|
| 225 |
const mutationWeights = [
|
| 226 |
{weightMutateConstant:f},
|
| 227 |
{weightMutateOperator:f},
|
|
@@ -248,6 +254,10 @@ const y = convert(Array{Float32, 1}, """f"{y_str})"
|
|
| 248 |
def_datasets += """
|
| 249 |
const weights = convert(Array{Float32, 1}, """f"{weight_str})"
|
| 250 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 251 |
with open(f'/tmp/.hyperparams_{rand_string}.jl', 'w') as f:
|
| 252 |
print(def_hyperparams, file=f)
|
| 253 |
|
|
|
|
| 75 |
maxsize=20,
|
| 76 |
fast_cycle=False,
|
| 77 |
maxdepth=None,
|
| 78 |
+
variable_names=[],
|
| 79 |
threads=None, #deprecated
|
| 80 |
julia_optimization=3,
|
| 81 |
):
|
|
|
|
| 136 |
:param fast_cycle: bool, (experimental) - batch over population subsamples. This
|
| 137 |
is a slightly different algorithm than regularized evolution, but does cycles
|
| 138 |
15% faster. May be algorithmically less efficient.
|
| 139 |
+
:param variable_names: list, a list of names for the variables, other
|
| 140 |
+
than "x0", "x1", etc.
|
| 141 |
:param julia_optimization: int, Optimization level (0, 1, 2, 3)
|
| 142 |
:returns: pd.DataFrame, Results dataframe, giving complexity, MSE, and equations
|
| 143 |
(as strings).
|
|
|
|
| 156 |
if weights is not None:
|
| 157 |
assert len(weights.shape) == 1
|
| 158 |
assert X.shape[0] == weights.shape[0]
|
| 159 |
+
if len(variable_names) != 0:
|
| 160 |
+
assert len(variable_names) == X.shape[1]
|
| 161 |
|
| 162 |
if populations is None:
|
| 163 |
populations = procs
|
|
|
|
| 227 |
const perturbationFactor = {perturbationFactor:f}f0
|
| 228 |
const annealing = {"true" if annealing else "false"}
|
| 229 |
const weighted = {"true" if weights is not None else "false"}
|
| 230 |
+
const useVarMap = {"false" if len(variable_names) == 0 else "true"}
|
| 231 |
const mutationWeights = [
|
| 232 |
{weightMutateConstant:f},
|
| 233 |
{weightMutateOperator:f},
|
|
|
|
| 254 |
def_datasets += """
|
| 255 |
const weights = convert(Array{Float32, 1}, """f"{weight_str})"
|
| 256 |
|
| 257 |
+
if len(variable_names) != 0:
|
| 258 |
+
def_hyperparams += f"""
|
| 259 |
+
const varMap = {'["' + '", "'.join(variable_names) + '"]'}"""
|
| 260 |
+
|
| 261 |
with open(f'/tmp/.hyperparams_{rand_string}.jl', 'w') as f:
|
| 262 |
print(def_hyperparams, file=f)
|
| 263 |
|
setup.py
CHANGED
|
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
|
| 5 |
|
| 6 |
setuptools.setup(
|
| 7 |
name="pysr", # Replace with your own username
|
| 8 |
-
version="0.3.
|
| 9 |
author="Miles Cranmer",
|
| 10 |
author_email="[email protected]",
|
| 11 |
description="Simple and efficient symbolic regression",
|
|
|
|
| 5 |
|
| 6 |
setuptools.setup(
|
| 7 |
name="pysr", # Replace with your own username
|
| 8 |
+
version="0.3.19",
|
| 9 |
author="Miles Cranmer",
|
| 10 |
author_email="[email protected]",
|
| 11 |
description="Simple and efficient symbolic regression",
|