Skip to content

Commit 953631e

Browse files
refactor: fix imports and optimization for both type of surrogates
1 parent 5b22099 commit 953631e

File tree

2 files changed

+37
-36
lines changed

2 files changed

+37
-36
lines changed

src/Optimization.jl

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ using Zygote
55
abstract type SurrogateOptimizationAlgorithm end
66
abstract type ParallelStrategy end
77

8+
const AbstractSurrogate = Union{AbstractDeterministicSurrogate, AbstractStochasticSurrogate}
9+
810
struct KrigingBeliever <: ParallelStrategy end
911
struct KrigingBelieverUpperBound <: ParallelStrategy end
1012
struct KrigingBelieverLowerBound <: ParallelStrategy end
@@ -32,7 +34,7 @@ struct RTEA{K, Z, P, N, S} <: SurrogateOptimizationAlgorithm
3234
end
3335

3436
function merit_function(
35-
point, w, surr::AbstractDeterministicSurrogate, s_max, s_min, d_max, d_min,
37+
point, w, surr::AbstractSurrogate, s_max, s_min, d_max, d_min,
3638
box_size)
3739
if length(point) == 1
3840
D_x = box_size + 1
@@ -85,7 +87,7 @@ a few values to achieve both exploitation and exploration.
8587
When w is close to zero, we do pure exploration, while w close to 1 corresponds to exploitation.
8688
"""
8789
function surrogate_optimize(
88-
obj::Function, ::SRBF, lb, ub, surr::AbstractDeterministicSurrogate,
90+
obj::Function, ::SRBF, lb, ub, surr::AbstractSurrogate,
8991
sample_type::SamplingAlgorithm; maxiters = 100,
9092
num_new_samples = 100, needs_gradient = false)
9193
scale = 0.2
@@ -234,10 +236,10 @@ end
234236

235237
"""
236238
SRBF 1D:
237-
surrogate_optimize(obj::Function,::SRBF,lb::Number,ub::Number,surr::AbstractDeterministicSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
239+
surrogate_optimize(obj::Function,::SRBF,lb::Number,ub::Number,surr::AbstractSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
238240
"""
239241
function surrogate_optimize(obj::Function, ::SRBF, lb::Number, ub::Number,
240-
surr::AbstractDeterministicSurrogate, sample_type::SamplingAlgorithm;
242+
surr::AbstractSurrogate, sample_type::SamplingAlgorithm;
241243
maxiters = 100, num_new_samples = 100)
242244
#Suggested by:
243245
#https://www.mathworks.com/help/gads/surrogate-optimization-algorithm.html
@@ -293,8 +295,8 @@ function surrogate_optimize(obj::Function, ::SRBF, lb::Number, ub::Number,
293295
end
294296
end
295297
#3) Evaluate merit function at the sampled points
296-
evaluation_of_merit_function = merit_function.(new_sample, w, surr, s_max,
297-
s_min, d_max, d_min, box_size)
298+
evaluation_of_merit_function = map(x -> merit_function(x, w, surr, s_max,
299+
s_min, d_max, d_min, box_size), new_sample)
298300

299301
new_addition = false
300302
adaptive_point_x = zero(eltype(new_sample[1]))
@@ -377,7 +379,7 @@ end
377379

378380
# Ask SRBF ND
379381
function potential_optimal_points(
380-
::SRBF, strategy, lb, ub, surr::AbstractDeterministicSurrogate,
382+
::SRBF, strategy, lb, ub, surr::AbstractSurrogate,
381383
sample_type::SamplingAlgorithm, n_parallel;
382384
num_new_samples = 500)
383385
scale = 0.2
@@ -484,7 +486,7 @@ end
484486

485487
# Ask SRBF 1D
486488
function potential_optimal_points(::SRBF, strategy, lb::Number, ub::Number,
487-
surr::AbstractDeterministicSurrogate,
489+
surr::AbstractSurrogate,
488490
sample_type::SamplingAlgorithm, n_parallel;
489491
num_new_samples = 500)
490492
scale = 0.2
@@ -935,7 +937,7 @@ function adjust_step_size(sigma_n, sigma_min, C_success, t_success, C_fail, t_fa
935937
end
936938

937939
function select_evaluation_point_1D(
938-
new_points1, surr1::AbstractDeterministicSurrogate, numb_iters,
940+
new_points1, surr1::AbstractSurrogate, numb_iters,
939941
maxiters)
940942
v = [0.3, 0.5, 0.8, 0.95]
941943
k = 4
@@ -990,13 +992,13 @@ function select_evaluation_point_1D(
990992
end
991993

992994
"""
993-
surrogate_optimize(obj::Function,::DYCORS,lb::Number,ub::Number,surr1::AbstractDeterministicSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
995+
surrogate_optimize(obj::Function,::DYCORS,lb::Number,ub::Number,surr1::AbstractSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
994996
995997
DYCORS optimization method in 1D, following closely: Combining radial basis function
996998
surrogates and dynamic coordinate search in high-dimensional expensive black-box optimization".
997999
"""
9981000
function surrogate_optimize(obj::Function, ::DYCORS, lb::Number, ub::Number,
999-
surr1::AbstractDeterministicSurrogate, sample_type::SamplingAlgorithm;
1001+
surr1::AbstractSurrogate, sample_type::SamplingAlgorithm;
10001002
maxiters = 100, num_new_samples = 100)
10011003
x_best = argmin(surr1.y)
10021004
y_best = minimum(surr1.y)
@@ -1056,7 +1058,7 @@ function surrogate_optimize(obj::Function, ::DYCORS, lb::Number, ub::Number,
10561058
end
10571059

10581060
function select_evaluation_point_ND(
1059-
new_points, surrn::AbstractDeterministicSurrogate, numb_iters,
1061+
new_points, surrn::AbstractSurrogate, numb_iters,
10601062
maxiters)
10611063
v = [0.3, 0.5, 0.8, 0.95]
10621064
k = 4
@@ -1110,7 +1112,7 @@ function select_evaluation_point_ND(
11101112
end
11111113

11121114
"""
1113-
surrogate_optimize(obj::Function,::DYCORS,lb::Number,ub::Number,surr1::AbstractDeterministicSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
1115+
surrogate_optimize(obj::Function,::DYCORS,lb::Number,ub::Number,surr1::AbstractSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
11141116
11151117
This is an implementation of the DYCORS strategy by Regis and Shoemaker:
11161118
Rommel G Regis and Christine A Shoemaker.
@@ -1124,7 +1126,7 @@ to perturb a given coordinate and decrease this probability after each function
11241126
evaluation, so fewer coordinates are perturbed later in the optimization.
11251127
"""
11261128
function surrogate_optimize(
1127-
obj::Function, ::DYCORS, lb, ub, surrn::AbstractDeterministicSurrogate,
1129+
obj::Function, ::DYCORS, lb, ub, surrn::AbstractSurrogate,
11281130
sample_type::SamplingAlgorithm; maxiters = 100,
11291131
num_new_samples = 100)
11301132
x_best = collect(surrn.x[argmin(surrn.y)])
@@ -1210,7 +1212,7 @@ function obj2_1D(value, points)
12101212
return min
12111213
end
12121214

1213-
function I_tier_ranking_1D(P, surrSOP::AbstractDeterministicSurrogate)
1215+
function I_tier_ranking_1D(P, surrSOP::AbstractSurrogate)
12141216
#obj1 = objective_function
12151217
#obj2 = obj2_1D
12161218
Fronts = Dict{Int, Array{eltype(surrSOP.x[1]), 1}}()
@@ -1259,7 +1261,7 @@ function I_tier_ranking_1D(P, surrSOP::AbstractDeterministicSurrogate)
12591261
return F
12601262
end
12611263

1262-
function II_tier_ranking_1D(D::Dict, srg::AbstractDeterministicSurrogate)
1264+
function II_tier_ranking_1D(D::Dict, srg::AbstractSurrogate)
12631265
for i in 1:length(D)
12641266
pos = []
12651267
yn = []
@@ -1303,7 +1305,7 @@ function Hypervolume_Pareto_improving(f1_new, f2_new, Pareto_set)
13031305
end
13041306

13051307
"""
1306-
surrogate_optimize(obj::Function,::SOP,lb::Number,ub::Number,surr::AbstractDeterministicSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
1308+
surrogate_optimize(obj::Function,::SOP,lb::Number,ub::Number,surr::AbstractSurrogate,sample_type::SamplingAlgorithm;maxiters=100,num_new_samples=100)
13071309
13081310
SOP Surrogate optimization method, following closely the following papers:
13091311
@@ -1313,7 +1315,7 @@ SOP Surrogate optimization method, following closely the following papers:
13131315
#Suggested number of new_samples = min(500*d,5000)
13141316
"""
13151317
function surrogate_optimize(obj::Function, sop1::SOP, lb::Number, ub::Number,
1316-
surrSOP::AbstractDeterministicSurrogate, sample_type::SamplingAlgorithm;
1318+
surrSOP::AbstractSurrogate, sample_type::SamplingAlgorithm;
13171319
maxiters = 100, num_new_samples = min(500 * 1, 5000))
13181320
d = length(lb)
13191321
N_fail = 3
@@ -1497,7 +1499,7 @@ function obj2_ND(value, points)
14971499
return min
14981500
end
14991501

1500-
function I_tier_ranking_ND(P, surrSOPD::AbstractDeterministicSurrogate)
1502+
function I_tier_ranking_ND(P, surrSOPD::AbstractSurrogate)
15011503
#obj1 = objective_function
15021504
#obj2 = obj2_1D
15031505
Fronts = Dict{Int, Array{eltype(surrSOPD.x), 1}}()
@@ -1546,7 +1548,7 @@ function I_tier_ranking_ND(P, surrSOPD::AbstractDeterministicSurrogate)
15461548
return F
15471549
end
15481550

1549-
function II_tier_ranking_ND(D::Dict, srgD::AbstractDeterministicSurrogate)
1551+
function II_tier_ranking_ND(D::Dict, srgD::AbstractSurrogate)
15501552
for i in 1:length(D)
15511553
pos = []
15521554
yn = []
@@ -1560,7 +1562,7 @@ function II_tier_ranking_ND(D::Dict, srgD::AbstractDeterministicSurrogate)
15601562
end
15611563

15621564
function surrogate_optimize(
1563-
obj::Function, sopd::SOP, lb, ub, surrSOPD::AbstractDeterministicSurrogate,
1565+
obj::Function, sopd::SOP, lb, ub, surrSOPD::AbstractSurrogate,
15641566
sample_type::SamplingAlgorithm; maxiters = 100,
15651567
num_new_samples = min(500 * length(lb), 5000))
15661568
d = length(lb)
@@ -1758,7 +1760,7 @@ function _nonDominatedSorting(arr::Array{Float64, 2})
17581760
end
17591761

17601762
function surrogate_optimize(obj::Function, sbm::SMB, lb::Number, ub::Number,
1761-
surrSMB::AbstractDeterministicSurrogate, sample_type::SamplingAlgorithm;
1763+
surrSMB::AbstractSurrogate, sample_type::SamplingAlgorithm;
17621764
maxiters = 100, n_new_look = 1000)
17631765
#obj contains a function for each output dimension
17641766
dim_out = length(surrSMB.y[1])
@@ -1798,7 +1800,7 @@ function surrogate_optimize(obj::Function, sbm::SMB, lb::Number, ub::Number,
17981800
end
17991801

18001802
function surrogate_optimize(
1801-
obj::Function, smb::SMB, lb, ub, surrSMBND::AbstractDeterministicSurrogate,
1803+
obj::Function, smb::SMB, lb, ub, surrSMBND::AbstractSurrogate,
18021804
sample_type::SamplingAlgorithm; maxiters = 100,
18031805
n_new_look = 1000)
18041806
#obj contains a function for each output dimension
@@ -1840,7 +1842,7 @@ end
18401842
# RTEA (Noisy model based multi objective optimization + standard rtea by fieldsen), use this for very noisy objective functions because there are a lot of re-evaluations
18411843

18421844
function surrogate_optimize(obj, rtea::RTEA, lb::Number, ub::Number,
1843-
surrRTEA::AbstractDeterministicSurrogate, sample_type::SamplingAlgorithm;
1845+
surrRTEA::AbstractSurrogate, sample_type::SamplingAlgorithm;
18441846
maxiters = 100, n_new_look = 1000)
18451847
Z = rtea.z
18461848
K = rtea.k
@@ -1892,8 +1894,8 @@ function surrogate_optimize(obj, rtea::RTEA, lb::Number, ub::Number,
18921894

18931895
#update pareto
18941896
new_to_pareto = false
1897+
counter = zeros(Int, dim_out)
18951898
for i in 1:length(pareto_set)
1896-
counter = zeros(Int, dim_out)
18971899
#compare the y_new values to pareto, if there is at least one entry where it dominates all the others, then it can be in pareto
18981900
for l in 1:dim_out
18991901
if y_new[l] < pareto_front[i][l]
@@ -1911,13 +1913,13 @@ function surrogate_optimize(obj, rtea::RTEA, lb::Number, ub::Number,
19111913
push!(pareto_front, y_new)
19121914
push!(number_of_revaluations, 0)
19131915
end
1914-
update!(surrRTEA, new_x, new_y)
1916+
update!(surrRTEA, x_new, y_new)
19151917
end
19161918
for k in 1:K
19171919
val, pos = findmin(number_of_revaluations)
19181920
x_r = pareto_set[pos]
19191921
y_r = obj(x_r)
1920-
number_of_revaluations[pos] = number_of_revaluations + 1
1922+
number_of_revaluations[pos] = number_of_revaluations[pos] + 1
19211923
#check if it is again in the pareto set or not, if not eliminate it from pareto
19221924
still_in_pareto = false
19231925
for i in 1:length(pareto_set)
@@ -1937,7 +1939,7 @@ function surrogate_optimize(obj, rtea::RTEA, lb::Number, ub::Number,
19371939
#remove from pareto
19381940
deleteat!(pareto_set, pos)
19391941
deleteat!(pareto_front, pos)
1940-
deleteat!(number_of_revaluationsm, pos)
1942+
deleteat!(number_of_revaluations, pos)
19411943
end
19421944
end
19431945
iter = iter + 1
@@ -1946,7 +1948,7 @@ function surrogate_optimize(obj, rtea::RTEA, lb::Number, ub::Number,
19461948
end
19471949

19481950
function surrogate_optimize(
1949-
obj, rtea::RTEA, lb, ub, surrRTEAND::AbstractDeterministicSurrogate,
1951+
obj, rtea::RTEA, lb, ub, surrRTEAND::AbstractSurrogate,
19501952
sample_type::SamplingAlgorithm; maxiters = 100,
19511953
n_new_look = 1000)
19521954
Z = rtea.z
@@ -2000,8 +2002,8 @@ function surrogate_optimize(
20002002

20012003
#update pareto
20022004
new_to_pareto = false
2005+
counter = zeros(Int, dim_out)
20032006
for i in 1:length(pareto_set)
2004-
counter = zeros(Int, dim_out)
20052007
#compare the y_new values to pareto, if there is at least one entry where it dominates all the others, then it can be in pareto
20062008
for l in 1:dim_out
20072009
if y_new[l] < pareto_front[i][l]
@@ -2019,13 +2021,13 @@ function surrogate_optimize(
20192021
push!(pareto_front, y_new)
20202022
push!(number_of_revaluations, 0)
20212023
end
2022-
update!(surrRTEAND, new_x, new_y)
2024+
update!(surrRTEAND, x_new, y_new)
20232025
end
20242026
for k in 1:K
20252027
val, pos = findmin(number_of_revaluations)
20262028
x_r = pareto_set[pos]
20272029
y_r = obj(x_r)
2028-
number_of_revaluations[pos] = number_of_revaluations + 1
2030+
number_of_revaluations[pos] = number_of_revaluations[pos] + 1
20292031
#check if it is again in the pareto set or not, if not eliminate it from pareto
20302032
still_in_pareto = false
20312033
for i in 1:length(pareto_set)
@@ -2045,7 +2047,7 @@ function surrogate_optimize(
20452047
#remove from pareto
20462048
deleteat!(pareto_set, pos)
20472049
deleteat!(pareto_front, pos)
2048-
deleteat!(number_of_revaluationsm, pos)
2050+
deleteat!(number_of_revaluations, pos)
20492051
end
20502052
end
20512053
iter = iter + 1

src/Surrogates.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ using LinearAlgebra
44
using Distributions
55
using GLM
66
using ExtendableSparse
7-
using SurrogatesBase: SurrogatesBase, update!, AbstractDeterministicSurrogate
7+
using SurrogatesBase: SurrogatesBase, update!, AbstractDeterministicSurrogate, AbstractStochasticSurrogate
88

9-
abstract type AbstractSurrogate <: Function end
109
include("utils.jl")
1110
include("Radials.jl")
1211
include("Kriging.jl")
@@ -91,7 +90,7 @@ export LobachevskyStructure,
9190
NeuralStructure, RandomForestStructure,
9291
SecondOrderPolynomialStructure
9392
export WendlandStructure
94-
export AbstractSurrogate, SamplingAlgorithm
93+
export SamplingAlgorithm
9594
export Kriging, RadialBasis, std_error_at_point
9695
# Parallelization Strategies
9796
export potential_optimal_points

0 commit comments

Comments
 (0)