Skip to content

Commit 7203dad

Browse files
v0.16.13
1 parent 992e1b2 commit 7203dad

3 files changed

Lines changed: 51 additions & 38 deletions

File tree

notebooks/00_spotPython_tests.ipynb

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6196,7 +6196,7 @@
61966196
},
61976197
{
61986198
"cell_type": "code",
6199-
"execution_count": 2,
6199+
"execution_count": null,
62006200
"metadata": {},
62016201
"outputs": [],
62026202
"source": [
@@ -6233,17 +6233,9 @@
62336233
},
62346234
{
62356235
"cell_type": "code",
6236-
"execution_count": 1,
6236+
"execution_count": null,
62376237
"metadata": {},
6238-
"outputs": [
6239-
{
6240-
"name": "stdout",
6241-
"output_type": "stream",
6242-
"text": [
6243-
"All assertions passed!\n"
6244-
]
6245-
}
6246-
],
6238+
"outputs": [],
62476239
"source": [
62486240
"# Initialize logging\n",
62496241
"import numpy as np\n",

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.16.12"
10+
version = "0.16.13"
1111
authors = [
1212
{ name="T. Bartz-Beielstein", email="tbb@bartzundbartz.de" }
1313
]

src/spotpython/build/kriging.py

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import copy
22
from math import erf
33
import matplotlib.pyplot as plt
4-
from numpy import max, min, var, mean
4+
from numpy import max, min, var
55
from numpy import sqrt
66
from numpy import exp
77
from numpy import array
@@ -28,7 +28,7 @@
2828
from spotpython.utils.aggregate import aggregate_mean_var
2929
import logging
3030
import numpy as np
31-
from typing import List, Union, Tuple, Any, Optional
31+
from typing import List, Union, Tuple, Any, Optional, Dict
3232

3333

3434
logger = logging.getLogger(__name__)
@@ -386,31 +386,52 @@ def optimize_model(self) -> Union[List[float], Tuple[float]]:
386386
result["x"] (Union[List[float], Tuple[float]]):
387387
A list or tuple of optimized parameter values.
388388
"""
389-
logger.debug("In optimize_model(): self.de_bounds passed to optimizer: %s", self.de_bounds)
390-
if self.model_optimizer.__name__ == 'dual_annealing':
391-
result = self.model_optimizer(func=self.fun_likelihood,
392-
bounds=self.de_bounds)
393-
elif self.model_optimizer.__name__ == 'differential_evolution':
394-
result = self.model_optimizer(func=self.fun_likelihood,
395-
bounds=self.de_bounds,
396-
maxiter=self.model_fun_evals,
397-
seed=self.seed)
398-
elif self.model_optimizer.__name__ == 'direct':
399-
result = self.model_optimizer(func=self.fun_likelihood,
400-
bounds=self.de_bounds,
401-
# maxfun=self.model_fun_evals,
402-
eps=1e-2)
403-
elif self.model_optimizer.__name__ == 'shgo':
404-
result = self.model_optimizer(func=self.fun_likelihood,
405-
bounds=self.de_bounds)
406-
elif self.model_optimizer.__name__ == 'basinhopping':
407-
result = self.model_optimizer(func=self.fun_likelihood,
408-
x0=mean(self.de_bounds, axis=1))
389+
logger.debug("Entering optimize_model.")
390+
if not callable(self.model_optimizer):
391+
logger.error("model_optimizer is not callable.")
392+
raise ValueError("model_optimizer must be a callable function or method.")
393+
394+
optimizer_strategies: Dict[str, Dict] = {
395+
'dual_annealing': {'func': self.fun_likelihood, 'bounds': self.de_bounds},
396+
'differential_evolution': {
397+
'func': self.fun_likelihood,
398+
'bounds': self.de_bounds,
399+
'maxiter': self.model_fun_evals,
400+
'seed': self.seed
401+
},
402+
'direct': {
403+
'func': self.fun_likelihood,
404+
'bounds': self.de_bounds,
405+
'eps': 1e-2
406+
},
407+
'shgo': {'func': self.fun_likelihood, 'bounds': self.de_bounds},
408+
'basinhopping': {'func': self.fun_likelihood, 'x0': np.mean(self.de_bounds, axis=1)}
409+
}
410+
411+
optimizer_name = self.model_optimizer.__name__
412+
logger.debug("Optimizer selected: %s", optimizer_name)
413+
414+
if optimizer_name not in optimizer_strategies:
415+
logger.info("Using default options for optimizer: %s", optimizer_name)
416+
optimizer_args = {'func': self.fun_likelihood, 'bounds': self.de_bounds}
409417
else:
410-
result = self.model_optimizer(func=self.fun_likelihood, bounds=self.de_bounds)
411-
logger.debug("In optimize_model(): result: %s", result)
412-
logger.debug('In optimize_model(): returned result["x"]: %s', result["x"])
413-
return result["x"]
418+
optimizer_args = optimizer_strategies[optimizer_name]
419+
420+
logger.debug("Parameters for optimization: %s", optimizer_args)
421+
422+
try:
423+
result = self.model_optimizer(**optimizer_args)
424+
except Exception as e:
425+
logger.error("Optimization failed due to error: %s", str(e))
426+
raise
427+
428+
if "x" not in result:
429+
logger.error("Optimization result does not contain 'x'. Result: %s", result)
430+
raise ValueError("The optimization result does not contain the expected 'x' key.")
431+
logger.debug("Optimization result: %s", result)
432+
optimized_parameters = list(result["x"])
433+
logger.debug("Extracted optimized parameters: %s", optimized_parameters)
434+
return optimized_parameters
414435

415436
def update_log(self) -> None:
416437
"""

0 commit comments

Comments
 (0)