Skip to content

Commit 6b0942a

Browse files
0.34.8
1 parent b67bd77 commit 6b0942a

2 files changed

Lines changed: 30 additions & 38 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
77

88
[project]
99
name = "spotpython"
10-
version = "0.34.7"
10+
version = "0.34.8"
1111
authors = [
1212
{ name="T. Bartz-Beielstein", email="tbb@bartzundbartz.de" }
1313
]

src/spotpython/spot/spot.py

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)