Spaces:
Running
Running
MilesCranmer
commited on
Merge branch 'master' of github.com:MilesCranmer/Eureqa.jl
Browse files
eureqa.jl
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
# Define allowed operators
|
2 |
-
plus(x::Float32, y::Float32) = x+y
|
3 |
-
mult(x::Float32, y::Float32) = x*y;
|
4 |
|
5 |
##########################
|
6 |
# # Allowed operators
|
@@ -328,6 +328,28 @@ function deleteRandomOp(tree::Node)::Node
|
|
328 |
return tree
|
329 |
end
|
330 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
331 |
# Go through one simulated annealing mutation cycle
|
332 |
# exp(-delta/T) defines probability of accepting a change
|
333 |
function iterate(
|
@@ -342,7 +364,7 @@ function iterate(
|
|
342 |
|
343 |
mutationChoice = rand()
|
344 |
weight_for_constant = min(8, countConstants(tree))
|
345 |
-
weights = [weight_for_constant, 1, 1, 1, 2]
|
346 |
weights /= sum(weights)
|
347 |
cweights = cumsum(weights)
|
348 |
n = countNodes(tree)
|
@@ -355,8 +377,11 @@ function iterate(
|
|
355 |
tree = appendRandomOp(tree)
|
356 |
elseif mutationChoice < cweights[4]
|
357 |
tree = deleteRandomOp(tree)
|
|
|
|
|
|
|
358 |
else
|
359 |
-
|
360 |
end
|
361 |
|
362 |
if annealing
|
|
|
1 |
# Define allowed operators
|
2 |
+
plus(x::Float32, y::Float32)::Float32 = x+y
|
3 |
+
mult(x::Float32, y::Float32)::Float32 = x*y;
|
4 |
|
5 |
##########################
|
6 |
# # Allowed operators
|
|
|
328 |
return tree
|
329 |
end
|
330 |
|
331 |
+
|
332 |
+
# Simplify tree
|
333 |
+
function simplifyTree(tree::Node)::Node
|
334 |
+
if tree.degree == 1
|
335 |
+
tree.l = simplifyTree(tree.l)
|
336 |
+
if tree.l.degree == 0 && tree.l.constant
|
337 |
+
return Node(tree.op(tree.l.val))
|
338 |
+
end
|
339 |
+
elseif tree.degree == 2
|
340 |
+
tree.r = simplifyTree(tree.r)
|
341 |
+
tree.l = simplifyTree(tree.l)
|
342 |
+
constantsBelow = (
|
343 |
+
tree.l.degree == 0 && tree.l.constant &&
|
344 |
+
tree.r.degree == 0 && tree.r.constant
|
345 |
+
)
|
346 |
+
if constantsBelow
|
347 |
+
return Node(tree.op(tree.l.val, tree.r.val))
|
348 |
+
end
|
349 |
+
end
|
350 |
+
return tree
|
351 |
+
end
|
352 |
+
|
353 |
# Go through one simulated annealing mutation cycle
|
354 |
# exp(-delta/T) defines probability of accepting a change
|
355 |
function iterate(
|
|
|
364 |
|
365 |
mutationChoice = rand()
|
366 |
weight_for_constant = min(8, countConstants(tree))
|
367 |
+
weights = [weight_for_constant, 1, 1, 1, 1, 2] .* 1.0
|
368 |
weights /= sum(weights)
|
369 |
cweights = cumsum(weights)
|
370 |
n = countNodes(tree)
|
|
|
377 |
tree = appendRandomOp(tree)
|
378 |
elseif mutationChoice < cweights[4]
|
379 |
tree = deleteRandomOp(tree)
|
380 |
+
elseif mutationChoice < cweights[5]
|
381 |
+
tree = simplifyTree(tree) # Sometimes we simplify tree
|
382 |
+
return tree
|
383 |
else
|
384 |
+
return tree
|
385 |
end
|
386 |
|
387 |
if annealing
|