Skip to content

Commit

Permalink
Merge pull request #37 from JuliaDiffEq/Refactor
Browse files Browse the repository at this point in the history
Refactor optimization interface
  • Loading branch information
ChrisRackauckas committed Jun 30, 2019
2 parents c86bc8d + 6f69bee commit 338b605
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 46 deletions.
61 changes: 28 additions & 33 deletions src/Optimization.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
using LinearAlgebra
using Distributions

abstract type SurrogateOptimizationAlgorithm end
struct SRBF <: SurrogateOptimizationAlgorithm end
struct LCBS <: SurrogateOptimizationAlgorithm end
struct EI <: SurrogateOptimizationAlgorithm end

function merit_function(point,w,surr::AbstractSurrogate,s_max,s_min,d_max,d_min,box_size)
if length(point)==1
D_x = box_size+1
Expand All @@ -23,14 +28,12 @@ function merit_function(point,w,surr::AbstractSurrogate,s_max,s_min,d_max,d_min,
end
end


"""
SRBF(lb,ub,surr::AbstractSurrogate,
maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int)
Finds minimum of objective function while sampling the AbstractSurrogate at
the same time.
SRBF ND:
surrogate_optimize(obj::Function,::SRBF,lb,ub,surr::AbstractSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
"""
function SRBF(lb,ub,surr::AbstractSurrogate,maxiters::Int,sample_type::SamplingAlgorithm,num_new_samples::Int,obj::Function)
function surrogate_optimize(obj::Function,::SRBF,lb,ub,surr::AbstractSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
#Suggested by:
#https://www.mathworks.com/help/gads/surrogate-optimization-algorithm.html
scale = 0.2
Expand Down Expand Up @@ -173,14 +176,10 @@ function SRBF(lb,ub,surr::AbstractSurrogate,maxiters::Int,sample_type::SamplingA
end

"""
SRBF(lb::Number,ub::Number,surr::AbstractSurrogate,
maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int)
Finds minimum of objective function while sampling the AbstractSurrogate at
the same time.
SRBF 1D:
surrogate_optimize(obj::Function,::SRBF,lb::Number,ub::Number,surr::AbstractSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
"""
function SRBF(lb::Number,ub::Number,surr::AbstractSurrogate,maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int,obj::Function)
function surrogate_optimize(obj::Function,::SRBF,lb::Number,ub::Number,surr::AbstractSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
#Suggested by:
#https://www.mathworks.com/help/gads/surrogate-optimization-algorithm.html
scale = 0.2
Expand Down Expand Up @@ -308,16 +307,13 @@ function SRBF(lb::Number,ub::Number,surr::AbstractSurrogate,maxiters::Int,
end

"""
LCBS(lb::Number,ub::Number,surr::Kriging,maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int,obj::Function))
LCBS 1D
Implementation of Lower Confidence Bound (LCB), goal is to minimize:
LCB(x) := E[x] - k * sqrt(Var[x]), default value of k = 2
https://pysot.readthedocs.io/en/latest/options.html#strategy
surrogate_optimize(obj::Function,::LCBS,lb::Number,ub::Number,krig::Kriging,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
"""
function LCBS(lb::Number,ub::Number,krig::Kriging,maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int,obj::Function)

function surrogate_optimize(obj::Function,::LCBS,lb::Number,ub::Number,krig::Kriging,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
#Default value
k = 2.0
dtol = 1e-3 * norm(ub-lb)
Expand Down Expand Up @@ -366,16 +362,13 @@ function LCBS(lb::Number,ub::Number,krig::Kriging,maxiters::Int,
end

"""
LCBS(lb,ub,surr::Kriging,maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int,obj::Function))
LCBS ND
Implementation of Lower Confidence Bound (LCB), goal is to minimize:
LCB(x) := E[x] - k * sqrt(Var[x]), default value of k = 2
https://pysot.readthedocs.io/en/latest/options.html#strategy
surrogate_optimize(obj::Function,::LCBS,lb,ub,krig::Kriging,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
"""
function LCBS(lb,ub,krig::Kriging,maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int,obj::Function)

function surrogate_optimize(obj::Function,::LCBS,lb,ub,krig::Kriging,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
#Default value
k = 2.0
dtol = 1e-3 * norm(ub-lb)
Expand Down Expand Up @@ -426,10 +419,11 @@ function LCBS(lb,ub,krig::Kriging,maxiters::Int,
end
end


function EI(lb::Number,ub::Number,krig::Kriging,maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int,obj::Function)

"""
Expected improvement method 1D
surrogate_optimize(obj::Function,::EI,lb::Number,ub::Number,krig::Kriging,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
"""
function surrogate_optimize(obj::Function,::EI,lb::Number,ub::Number,krig::Kriging,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
dtol = 1e-3*norm(ub-lb)
eps = 0.01
for i = 1:maxiters
Expand Down Expand Up @@ -477,10 +471,11 @@ function EI(lb::Number,ub::Number,krig::Kriging,maxiters::Int,
end
end


function EI(lb,ub,krig::Kriging,maxiters::Int,
sample_type::SamplingAlgorithm,num_new_samples::Int,obj::Function)

"""
Expected improvement method ND
surrogate_optimize(obj::Function,::EI,lb,ub,krig::Kriging,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
"""
function surrogate_optimize(obj::Function,::EI,lb,ub,krig::Kriging,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
dtol = 1e-3*norm(ub-lb)
eps = 0.01
for i = 1:maxiters
Expand Down
4 changes: 2 additions & 2 deletions src/Surrogates.jl
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ include("Sampling.jl")
include("Optimization.jl")

export Kriging, RadialBasis, add_point!, current_estimate, std_error_at_point
export sample, SamplingAlgorithm, GridSample, UniformSample, SobolSample, LatinHypercubeSample, LowDiscrepancySample
export SRBF,LCBS,EI
export sample, GridSample, UniformSample, SobolSample, LatinHypercubeSample, LowDiscrepancySample
export SRBF,LCBS,EI,surrogate_optimize

end
21 changes: 10 additions & 11 deletions test/optimization.jl
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ b = 6
#Using Kriging

my_k = Kriging(x,y,p)
SRBF(a,b,my_k,50,SobolSample(),50,objective_function)
surrogate_optimize(objective_function,SRBF(),a,b,my_k,UniformSample())

#Using RadialBasis
my_rad = RadialBasis(x,y,a,b,z->norm(z),1)
SRBF(a,b,my_rad,10,UniformSample(),10,objective_function)
surrogate_optimize(objective_function,SRBF(),a,b,my_rad,UniformSample())



Expand All @@ -42,13 +42,14 @@ ub = [6.0,6.0]
#Kriging

my_k_ND = Kriging(x,y,p,theta)
SRBF(lb,ub,my_k_ND,10,UniformSample(),10,objective_function_ND)
surrogate_optimize(objective_function_ND,SRBF(),lb,ub,my_k_ND,UniformSample())

#Radials

bounds = [[1.0,6.0],[1.0,6.0]]
my_rad_ND = RadialBasis(x,y,bounds,z->norm(z),1)
SRBF(lb,ub,my_rad_ND,10,UniformSample(),100,objective_function_ND)
surrogate_optimize(objective_function_ND,SRBF(),lb,ub,my_rad_ND,UniformSample())



####### LCBS #########
Expand All @@ -57,12 +58,11 @@ SRBF(lb,ub,my_rad_ND,10,UniformSample(),100,objective_function_ND)
objective_function = x -> 2*x+1
x = [2.0,4.0,6.0]
y = [5.0,9.0,13.0]
p = 2
p = 1.8
a = 2
b = 6
my_k = Kriging(x,y,p)
LCBS(a,b,my_k,10,SobolSample(),10,objective_function)

surrogate_optimize(objective_function,LCBS(),a,b,my_k,UniformSample())


##### ND #####
Expand All @@ -76,7 +76,7 @@ ub = [6.0,6.0]

#Kriging
my_k_ND = Kriging(x,y,p,theta)
LCBS(lb,ub,my_k_ND,10,UniformSample(),10,objective_function_ND)
surrogate_optimize(objective_function_ND,LCBS(),lb,ub,my_k_ND,UniformSample())


##### EI ######
Expand All @@ -90,7 +90,7 @@ p = 2
a = 2
b = 6
my_k = Kriging(x,y,p)
EI(a,b,my_k,100,SobolSample(),100,objective_function)
surrogate_optimize(objective_function,EI(),a,b,my_k,UniformSample(),maxiters=200,num_new_samples=155)


###ND###
Expand All @@ -105,5 +105,4 @@ ub = [6.0,6.0]

#Kriging
my_k_ND = Kriging(x,y,p,theta)
EI(lb,ub,my_k_ND,100,UniformSample(),100,objective_function_ND)
println(my_k_ND.x)
surrogate_optimize(objective_function_ND,EI(),lb,ub,my_k_ND,UniformSample())

0 comments on commit 338b605

Please sign in to comment.