Skip to content

Commit 8310746

Browse files
committed
add ParallelPopulationOptimizer
1 parent 40ff049 commit 8310746

8 files changed

Lines changed: 464 additions & 4 deletions

src/BlackBoxOptim.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ using Distributions, StatsBase, Compat
66

77
export Optimizer, AskTellOptimizer, SteppingOptimizer, PopulationOptimizer,
88
bboptimize, bbsetup, compare_optimizers,
9+
ParallelPopulationOptimizer,
910

1011
DiffEvoOpt, de_rand_1_bin, de_rand_1_bin_radiuslimited,
1112
adaptive_de_rand_1_bin, adaptive_de_rand_1_bin_radiuslimited,
@@ -179,6 +180,7 @@ include("resampling_memetic_search.jl")
179180
include("simultaneous_perturbation_stochastic_approximation.jl")
180181
include("generating_set_search.jl")
181182
include("direct_search_with_probabilistic_descent.jl")
183+
include("parallel_population_optimizer.jl")
182184

183185
# Fitness
184186
# include("fitness/fitness_types.jl") FIXME merge it with fitness.jl

src/opt_controller.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,20 @@ make_opt_results{O<:PopulationOptimizer}(ctrl::OptRunController{O}, oc::OptContr
316316
num_func_evals(ctrl),
317317
population(ctrl.optimizer)
318318
)
319+
320+
# HACK return population results, although ParallelPopulationOptimizer is not
321+
# populaton optimizer
322+
make_opt_results{O<:ParallelPopulationOptimizer}(ctrl::OptRunController{O}, oc::OptController{O}) =
323+
PopulationOptimizationResults{fitness_type(problem(ctrl)), Individual,
324+
typeof(population(ctrl.optimizer))}(
325+
string(oc.parameters[:Method]),
326+
best_fitness(ctrl),
327+
best_candidate(ctrl),
328+
stop_reason(ctrl),
329+
num_steps(ctrl),
330+
start_time(ctrl),
331+
elapsed_time(ctrl),
332+
oc.parameters,
333+
num_func_evals(ctrl),
334+
population(ctrl.optimizer)
335+
)

src/optimization_methods.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const ValidMethods = @compat Dict{Symbol,Union(Any,Function)}(
1414
:simultaneous_perturbation_stochastic_approximation => SimultaneousPerturbationSA2,
1515
:generating_set_search => GeneratingSetSearcher,
1616
:probabilistic_descent => direct_search_probabilistic_descent,
17+
:parallel_population_optimizer => parallel_population_optimizer,
1718
)
1819

1920
const MethodNames = sort!(collect(keys(ValidMethods)))

src/parallel_population_optimizer.jl

Lines changed: 389 additions & 0 deletions
Large diffs are not rendered by default.

test/helper.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,8 @@ using FactCheck
33
using Compat
44

55
NumTestRepetitions = 100
6+
7+
if nprocs() < 4
8+
addprocs(4-nprocs()) # add procs for parallel population optimizer
9+
end
10+
@everywhere using BlackBoxOptim

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ my_tests = [
1818
"test_differential_evolution.jl",
1919
"test_adaptive_differential_evolution.jl",
2020
"test_natural_evolution_strategies.jl",
21+
"test_parallel_population_optimizer.jl",
2122

2223
"test_toplevel_bboptimize.jl",
2324
"test_smoketest_bboptimize.jl",
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
facts("Parallel population optimizer") do
2+
3+
@everywhere using BlackBoxOptim
4+
5+
context("optimizing small problem") do
6+
rosenbrock2d(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
7+
8+
res = bboptimize(rosenbrock2d; Method = :parallel_population_optimizer,
9+
SearchSpace = [(-5.0, 5.0), (-2.0, 2.0)], MaxTime = 100.0,
10+
ShowTrace = true, MigrationSize = 2, MigrationPeriod = 100)
11+
@fact size(best_candidate(res)) => (2,)
12+
@fact typeof(best_fitness(res)) => Float64
13+
@fact best_fitness(res) => less_than(100.0)
14+
pop = population(res)
15+
@fact numdims(pop) --> 2
16+
@fact popsize(pop) > 0 --> true
17+
end
18+
19+
context("propagating exceptions from workers to the master") do
20+
# 0.01 chance to get domain error
21+
bogus(x) = sqrt(x[1]-0.01)
22+
# 0.01 chance to raise exception prematurely during bbsetup()
23+
res = bbsetup(bogus; Method = :parallel_population_optimizer,
24+
SearchSpace = [(0.0, 1.0)], MaxTime = 100.0,
25+
ShowTrace = true, MigrationSize = 2, MigrationPeriod = 100)
26+
@fact_throws RemoteException bboptimize(res)
27+
end
28+
29+
#= doesn't work with PopulationMatrix
30+
context("worker method that uses PopulationMatrix") do
31+
rosenbrock2d(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
32+
33+
res = bboptimize(rosenbrock2d; Method = :parallel_population_optimizer,
34+
WorkerMethod = :separable_nes,
35+
SearchSpace = [(-5.0, 5.0), (-2.0, 2.0)], MaxTime = 100.0,
36+
ShowTrace = true, MigrationSize = 2, MigrationPeriod = 100)
37+
@fact size(best_candidate(res)) => (2,)
38+
@fact typeof(best_fitness(res)) => Float64
39+
@fact best_fitness(res) => less_than(100.0)
40+
pop = population(res)
41+
@fact numdims(pop) --> 2
42+
@fact popsize(pop) > 0 --> true
43+
end
44+
=#
45+
end

test/test_smoketest_bboptimize.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
function rosenbrock2d(x)
2-
return (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
3-
end
4-
51
facts("bboptimize smoketest") do
2+
function rosenbrock2d(x)
3+
return (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
4+
end
5+
66
for(m in keys(BlackBoxOptim.ValidMethods))
77
context("testing $(m) method to ensure it works") do
88
res = bboptimize(rosenbrock2d; Method = m,

0 commit comments

Comments
 (0)