@@ -5,6 +5,8 @@ using Zygote
55abstract type SurrogateOptimizationAlgorithm end
66abstract type ParallelStrategy end
77
8+ const AbstractSurrogate = Union{AbstractDeterministicSurrogate, AbstractStochasticSurrogate}
9+
810struct KrigingBeliever <: ParallelStrategy end
911struct KrigingBelieverUpperBound <: ParallelStrategy end
1012struct KrigingBelieverLowerBound <: ParallelStrategy end
@@ -32,7 +34,7 @@ struct RTEA{K, Z, P, N, S} <: SurrogateOptimizationAlgorithm
3234end
3335
3436function 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.
8587When w is close to zero, we do pure exploration, while w close to 1 corresponds to exploitation.
8688"""
8789function 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"""
236238SRBF 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"""
239241function 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 ]))
377379
378380# Ask SRBF ND
379381function 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
484486
485487# Ask SRBF 1D
486488function 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
935937end
936938
937939function 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(
990992end
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
995997DYCORS optimization method in 1D, following closely: Combining radial basis function
996998surrogates and dynamic coordinate search in high-dimensional expensive black-box optimization".
997999"""
9981000function 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,
10561058end
10571059
10581060function 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(
11101112end
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
11151117This is an implementation of the DYCORS strategy by Regis and Shoemaker:
11161118Rommel G Regis and Christine A Shoemaker.
@@ -1124,7 +1126,7 @@ to perturb a given coordinate and decrease this probability after each function
11241126evaluation, so fewer coordinates are perturbed later in the optimization.
11251127"""
11261128function 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
12111213end
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
12601262end
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)
13031305end
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
13081310SOP 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"""
13151317function 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
14981500end
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
15471549end
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)
15601562end
15611563
15621564function 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})
17581760end
17591761
17601762function 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,
17981800end
17991801
18001802function 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
18421844function 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,
19461948end
19471949
19481950function 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
0 commit comments