@@ -902,6 +902,33 @@ def to_all_dim_if_needed(self, X: np.ndarray) -> np.array:
902902 else :
903903 return X
904904
905+ def _handle_acquisition_failure (self ) -> np .array :
906+ """
907+ Handle acquisition failure by proposing new design points.
908+ This method is called when no new design points can be suggested
909+ by the surrogate model. Depending on the specified strategy,
910+ it either proposes a Morris-Mitchell minimizing point or generates
911+ a new space-filling design as a fallback.
912+
913+ Returns:
914+ np.ndarray: New design points proposed as a fallback.
915+ """
916+ # No new X0 found on surrogate:
917+ # use morris-mitchell ("mm") or random design as fallback
918+ if self .acquisition_failure_strategy == "mm" :
919+ X0 = propose_mmphi_intensive_minimizing_point (X = self .X , n_candidates = 100 , q = 2 , p = 2 , seed = 1 , lower = self .lower , upper = self .upper )
920+ # ensure that X0 is repeated according to repeats=self.design_control["repeats"]
921+ X0 = repeat (X0 , self .design_control ["repeats" ], axis = 0 )
922+ print ("Using mmphi minimizing point as fallback." )
923+ else :
924+ # fallback to spacefilling design (acquisition_failure_strategy == "random"):
925+ self .design = SpaceFilling (k = self .k , seed = self .fun_control ["seed" ] + self ._get_counter ())
926+ X0 = self .generate_design (size = self .n_points , repeats = self .design_control ["repeats" ], lower = self .lower , upper = self .upper )
927+ print ("Using spacefilling design as fallback." )
928+ X0 = repair_non_numeric (X0 , self .var_type )
929+ logger .warning ("No new XO found on surrogate. Generate new solution %s" , X0 )
930+ return X0
931+
905932 def get_new_X0 (self ) -> np .array :
906933 """
907934 Generate new design points for the optimization process.
@@ -991,21 +1018,7 @@ def get_new_X0(self) -> np.array:
9911018 return repeat (X0 , self .fun_repeats , axis = 0 )
9921019 # If no X0 found, then generate self.n_points new solutions:
9931020 else :
994- # No new X0 found on surrogate:
995- # use morris-mitchell ("mm") or random design as fallback
996- if self .acquisition_failure_strategy == "mm" :
997- X0 = propose_mmphi_intensive_minimizing_point (X = self .X , n_candidates = 100 , q = 2 , p = 2 , seed = 1 , lower = self .lower , upper = self .upper )
998- # ensure that X0 is repeated according to repeats=self.design_control["repeats"]
999- X0 = repeat (X0 , self .design_control ["repeats" ], axis = 0 )
1000- print ("Using mmphi minimizing point as fallback." )
1001- else :
1002- # fallback to spacefilling design (acquisition_failure_strategy == "random"):
1003- self .design = SpaceFilling (k = self .k , seed = self .fun_control ["seed" ] + self ._get_counter ())
1004- X0 = self .generate_design (size = self .n_points , repeats = self .design_control ["repeats" ], lower = self .lower , upper = self .upper )
1005- print ("Using spacefilling design as fallback." )
1006- X0 = repair_non_numeric (X0 , self .var_type )
1007- logger .warning ("No new XO found on surrogate. Generate new solution %s" , X0 )
1008- return X0
1021+ return self ._handle_acquisition_failure ()
10091022
10101023 def run (self , X_start : np .ndarray = None ) -> Spot :
10111024 """
@@ -1934,28 +1947,7 @@ def generate_random_point(self):
19341947 assert np.all(X0 <= S.upper)
19351948 assert y0 >= 0
19361949 """
1937- # X0 = self.generate_design(
1938- # size=1,
1939- # repeats=1,
1940- # lower=self.lower,
1941- # upper=self.upper,
1942- # )
1943-
1944- # No new X0 found:
1945- # use morris-mitchell ("mm") or random design as fallback
1946- if self .acquisition_failure_strategy == "mm" :
1947- X0 = propose_mmphi_intensive_minimizing_point (X = self .X , n_candidates = 1000 , q = 2 , p = 2 , seed = 1 , lower = self .lower , upper = self .upper )
1948- # ensure that X0 is repeated according to repeats=self.design_control["repeats"]
1949- X0 = repeat (X0 , self .design_control ["repeats" ], axis = 0 )
1950- print ("Using mmphi minimizing point as fallback." )
1951- else :
1952- # fallback to spacefilling design (acquisition_failure_strategy == "random"):
1953- self .design = SpaceFilling (k = self .k , seed = self .fun_control ["seed" ] + self ._get_counter ())
1954- X0 = self .generate_design (size = self .n_points , repeats = self .design_control ["repeats" ], lower = self .lower , upper = self .upper )
1955- print ("Using spacefilling design as fallback." )
1956- X0 = repair_non_numeric (X0 , self .var_type )
1957-
1958- # X0 = repair_non_numeric(X=X0, var_type=self.var_type)
1950+ X0 = self ._handle_acquisition_failure ()
19591951 X_all = self .to_all_dim_if_needed (X0 )
19601952 logger .debug ("In Spot() generate_random_point(), before calling self.fun: X_all: %s" , X_all )
19611953 logger .debug ("In Spot() generate_random_point(), before calling self.fun: fun_control: %s" , self .fun_control )
0 commit comments