using ExprOptimization const grammar = @grammar begin Real = x Real = Real * Real Real = Real + Real Real = Real - Real Real = |(1:5) end const S = SymbolTable(grammar) ground_truth(x) = x*x + 2x + 1 function loss(tree::RuleNode, grammar::Grammar) ex = get_executable(tree, grammar) los = 0.0 for x = -5.0:1.0:5.0 S[:x] = x los += abs2(Core.eval(S,ex) - ground_truth(x)) end los end ?MonteCarlo using Random Random.seed!(10) p = MonteCarlo(20000, 6) results_mc = optimize(p, grammar, :Real, loss) (results_mc.expr, results_mc.loss) display(results_mc.tree, grammar) ?GeneticProgram Random.seed!(1) p = GeneticProgram(1000,20,6,0.3,0.3,0.4) results_gp = optimize(p, grammar, :Real, loss) (results_gp.expr, results_gp.loss) display(results_gp.tree, grammar) ?GrammaticalEvolution Random.seed!(1) p = GrammaticalEvolution(grammar,:Real,1000,20,10,10,6,0.2,0.4,0.4; select_method=GrammaticalEvolutions.TruncationSelection(300)) results_ge = optimize(p, grammar, :Real, loss) (results_ge.expr, results_ge.loss) display(results_ge.tree, grammar) ?CrossEntropy Random.seed!(1) p = CrossEntropy(1000,20,6,500) results_ce = optimize(p, grammar, :Real, loss) (results_ce.expr, results_ce.loss) display(results_ce.tree, grammar) ?PIPE Random.seed!(3) p = PIPE(PPT(0.8),1000,20,0.2,0.1,0.05,1,0.2,0.6,0.999,6) results_pipe = optimize(p, grammar, :Real, loss) (results_pipe.expr, results_pipe.loss) display(results_pipe.tree, grammar)