Spaces:
Sleeping
Sleeping
Commit
·
211c6a7
1
Parent(s):
0d82add
Force all operators to be fast versions
Browse files- TODO.md +1 -0
- julia/operators.jl +20 -9
- julia/sr.jl +5 -4
- pysr/sr.py +2 -2
TODO.md
CHANGED
|
@@ -78,6 +78,7 @@
|
|
| 78 |
|
| 79 |
## Algorithmic performance ideas:
|
| 80 |
|
|
|
|
| 81 |
- [ ] Idea: use gradient of equation with respect to each operator (perhaps simply add to each operator) to tell which part is the most "sensitive" to changes. Then, perhaps insert/delete/mutate on that part of the tree?
|
| 82 |
- [ ] Start populations staggered; so that there is more frequent printing (and pops that start a bit later get hall of fame already)?
|
| 83 |
- [ ] Consider adding mutation for constant<->variable
|
|
|
|
| 78 |
|
| 79 |
## Algorithmic performance ideas:
|
| 80 |
|
| 81 |
+
- [ ] Use package compiler and compile sr.jl into a standalone binary that can be used by pysr.
|
| 82 |
- [ ] Idea: use gradient of equation with respect to each operator (perhaps simply add to each operator) to tell which part is the most "sensitive" to changes. Then, perhaps insert/delete/mutate on that part of the tree?
|
| 83 |
- [ ] Start populations staggered; so that there is more frequent printing (and pops that start a bit later get hall of fame already)?
|
| 84 |
- [ ] Consider adding mutation for constant<->variable
|
julia/operators.jl
CHANGED
|
@@ -1,15 +1,26 @@
|
|
| 1 |
import SpecialFunctions: gamma, lgamma, erf, erfc, beta
|
| 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
# Define allowed operators. Any julia operator can also be used.
|
| 4 |
-
plus(x::Float32, y::Float32)::Float32 = x
|
| 5 |
-
mult(x::Float32, y::Float32)::Float32 = x
|
| 6 |
-
pow(x::Float32, y::Float32)::Float32 =
|
| 7 |
-
div(x::Float32, y::Float32)::Float32 = x
|
| 8 |
-
logm(x::Float32)::Float32 =
|
| 9 |
-
logm2(x::Float32)::Float32 =
|
| 10 |
-
logm10(x::Float32)::Float32 =
|
| 11 |
-
sqrtm(x::Float32)::Float32 =
|
| 12 |
-
neg(x::Float32)::Float32 =
|
| 13 |
|
| 14 |
function greater(x::Float32, y::Float32)::Float32
|
| 15 |
if x > y
|
|
|
|
| 1 |
import SpecialFunctions: gamma, lgamma, erf, erfc, beta
|
| 2 |
|
| 3 |
+
|
| 4 |
+
import Base.FastMath: sqrt_llvm_fast, neg_float_fast,
|
| 5 |
+
add_float_fast, sub_float_fast, mul_float_fast, div_float_fast, rem_float_fast,
|
| 6 |
+
eq_float_fast, ne_float_fast, lt_float_fast, le_float_fast,
|
| 7 |
+
sign_fast, abs_fast, log_fast, log2_fast, log10_fast, sqrt_fast
|
| 8 |
+
|
| 9 |
+
# Implicitly defined:
|
| 10 |
+
#binary: mod
|
| 11 |
+
#unary: exp, abs, log1p, sin, cos, tan, sinh, cosh, tanh, asin, acos, atan, asinh, acosh, atanh, erf, erfc, gamma, relu, round, floor, ceil, round, sign.
|
| 12 |
+
|
| 13 |
+
# Use some fast operators from https://github.com/JuliaLang/julia/blob/81597635c4ad1e8c2e1c5753fda4ec0e7397543f/base/fastmath.jl
|
| 14 |
# Define allowed operators. Any julia operator can also be used.
|
| 15 |
+
plus(x::Float32, y::Float32)::Float32 = add_float_fast(x, y) #Do not change the name of this operator.
|
| 16 |
+
mult(x::Float32, y::Float32)::Float32 = mul_float_fast(x, y) #Do not change the name of this operator.
|
| 17 |
+
pow(x::Float32, y::Float32)::Float32 = sign_fast(x)*ccall(("powf",libm), Float32, (Float32,Float32), abs_fast(x), y)
|
| 18 |
+
div(x::Float32, y::Float32)::Float32 = div_float_fast(x, y)
|
| 19 |
+
logm(x::Float32)::Float32 = log_fast(abs_fast(x) + 1f-8)
|
| 20 |
+
logm2(x::Float32)::Float32 = log2_fast(abs_fast(x) + 1f-8)
|
| 21 |
+
logm10(x::Float32)::Float32 = log10_fast(abs_fast(x) + 1f-8)
|
| 22 |
+
sqrtm(x::Float32)::Float32 = sqrt_fast(abs_fast(x))
|
| 23 |
+
neg(x::Float32)::Float32 = sub_float_fast(x)
|
| 24 |
|
| 25 |
function greater(x::Float32, y::Float32)::Float32
|
| 26 |
if x > y
|
julia/sr.jl
CHANGED
|
@@ -282,10 +282,10 @@ function evalTreeArray(tree::Node, cX::Array{Float32, 2})::Union{Array{Float32,
|
|
| 282 |
return nothing
|
| 283 |
end
|
| 284 |
op = unaops[tree.op]
|
| 285 |
-
@
|
| 286 |
cumulator[i] = op(cumulator[i])
|
| 287 |
end
|
| 288 |
-
@inbounds
|
| 289 |
if isinf(cumulator[i]) || isnan(cumulator[i])
|
| 290 |
return nothing
|
| 291 |
end
|
|
@@ -302,10 +302,10 @@ function evalTreeArray(tree::Node, cX::Array{Float32, 2})::Union{Array{Float32,
|
|
| 302 |
return nothing
|
| 303 |
end
|
| 304 |
|
| 305 |
-
@
|
| 306 |
cumulator[i] = op(cumulator[i], array2[i])
|
| 307 |
end
|
| 308 |
-
@inbounds
|
| 309 |
if isinf(cumulator[i]) || isnan(cumulator[i])
|
| 310 |
return nothing
|
| 311 |
end
|
|
@@ -1032,6 +1032,7 @@ function fullRun(niterations::Integer;
|
|
| 1032 |
end
|
| 1033 |
if shouldOptimizeConstants
|
| 1034 |
#pass #(We already calculate full scores in the optimizer)
|
|
|
|
| 1035 |
else
|
| 1036 |
tmp_pop = finalizeScores(tmp_pop)
|
| 1037 |
end
|
|
|
|
| 282 |
return nothing
|
| 283 |
end
|
| 284 |
op = unaops[tree.op]
|
| 285 |
+
@inbounds @simd for i=1:clen
|
| 286 |
cumulator[i] = op(cumulator[i])
|
| 287 |
end
|
| 288 |
+
@inbounds for i=1:clen
|
| 289 |
if isinf(cumulator[i]) || isnan(cumulator[i])
|
| 290 |
return nothing
|
| 291 |
end
|
|
|
|
| 302 |
return nothing
|
| 303 |
end
|
| 304 |
|
| 305 |
+
@inbounds @simd for i=1:clen
|
| 306 |
cumulator[i] = op(cumulator[i], array2[i])
|
| 307 |
end
|
| 308 |
+
@inbounds for i=1:clen
|
| 309 |
if isinf(cumulator[i]) || isnan(cumulator[i])
|
| 310 |
return nothing
|
| 311 |
end
|
|
|
|
| 1032 |
end
|
| 1033 |
if shouldOptimizeConstants
|
| 1034 |
#pass #(We already calculate full scores in the optimizer)
|
| 1035 |
+
#TODO - not correct. only randomly calculate!
|
| 1036 |
else
|
| 1037 |
tmp_pop = finalizeScores(tmp_pop)
|
| 1038 |
end
|
pysr/sr.py
CHANGED
|
@@ -241,8 +241,8 @@ def pysr(X=None, y=None, weights=None,
|
|
| 241 |
op_list[i] = function_name
|
| 242 |
|
| 243 |
def_hyperparams += f"""include("{pkg_directory}/operators.jl")
|
| 244 |
-
const binops = {'[' + ', '.join(binary_operators) + ']'}
|
| 245 |
-
const unaops = {'[' + ', '.join(unary_operators) + ']'}
|
| 246 |
const ns=10;
|
| 247 |
const parsimony = {parsimony:f}f0
|
| 248 |
const alpha = {alpha:f}f0
|
|
|
|
| 241 |
op_list[i] = function_name
|
| 242 |
|
| 243 |
def_hyperparams += f"""include("{pkg_directory}/operators.jl")
|
| 244 |
+
const binops = @fastmath {'[' + ', '.join(binary_operators) + ']'}
|
| 245 |
+
const unaops = @fastmath {'[' + ', '.join(unary_operators) + ']'}
|
| 246 |
const ns=10;
|
| 247 |
const parsimony = {parsimony:f}f0
|
| 248 |
const alpha = {alpha:f}f0
|