Skip to content

Commit 1f54196

Browse files
v0.0.7 zero range fixed
1 parent 2e60bcd commit 1f54196

8 files changed

Lines changed: 81 additions & 78 deletions

File tree

-39.6 KB
Binary file not shown.

dist/spotPython-0.0.6.tar.gz

-3.79 MB
Binary file not shown.
39.7 KB
Binary file not shown.

dist/spotPython-0.0.7.tar.gz

3.79 MB
Binary file not shown.

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

src/spotPython/build/kriging.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -844,15 +844,19 @@ def nat_to_cod_x(self, nat_X):
844844
X = copy.deepcopy(nat_X)
845845
if self.cod_type == "norm":
846846
for i in range(self.k):
847-
X[i] = (X[i] - self.nat_range_X[i][0]) / float(self.nat_range_X[i][1] - self.nat_range_X[i][0])
848-
# TODO: Implement range correction if range == 0:
847+
# TODO: Check Implementation of range correction if range == 0:
849848
# rangex <- xmax - xmin
850849
# rangey <- ymax - ymin
851850
# xmin[rangex == 0] <- xmin[rangex == 0] - 0.5
852851
# xmax[rangex == 0] <- xmax[rangex == 0] + 0.5
853852
# rangex[rangex == 0] <- 1
854853
# logger.debug(f"self.nat_range_X[{i}]:\n {self.nat_range_X[i]}")
855854
# logger.debug(f"X[{i}]:\n {X[i]}")
855+
rangex = float(self.nat_range_X[i][1] - self.nat_range_X[i][0])
856+
if rangex == 0:
857+
self.nat_range_X[i][0] = self.nat_range_X[i][0] - 0.5
858+
self.nat_range_X[i][1] = self.nat_range_X[i][1] + 0.5
859+
X[i] = (X[i] - self.nat_range_X[i][0]) / float(self.nat_range_X[i][1] - self.nat_range_X[i][0])
856860
return X
857861
elif self.cod_type == "std":
858862
for i in range(self.k):

src/spotPython/spot/spot.py

Lines changed: 71 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
logger = logging.getLogger(__name__)
3131
# configure the handler and formatter as needed
32-
py_handler = logging.FileHandler(f"{__name__}.log", mode='w')
32+
py_handler = logging.FileHandler(f"{__name__}.log", mode="w")
3333
py_formatter = logging.Formatter("%(name)s %(asctime)s %(levelname)s %(message)s")
3434
# add formatter to the handler
3535
py_handler.setFormatter(py_formatter)
@@ -118,30 +118,30 @@ def __str__(self):
118118
return self.__class__.__name__
119119

120120
def __init__(
121-
self,
122-
fun,
123-
lower,
124-
upper,
125-
fun_evals=15,
126-
fun_repeats=1,
127-
fun_control={},
128-
max_time=inf,
129-
noise=False,
130-
tolerance_x=0,
131-
var_type=["num"],
132-
infill_criterion="y",
133-
n_points=1,
134-
ocba_delta=0,
135-
seed=123,
136-
log_level=50,
137-
show_models=False,
138-
show_progress=False,
139-
design=None,
140-
design_control={},
141-
surrogate=None,
142-
surrogate_control={},
143-
optimizer=None,
144-
optimizer_control={},
121+
self,
122+
fun,
123+
lower,
124+
upper,
125+
fun_evals=15,
126+
fun_repeats=1,
127+
fun_control={},
128+
max_time=inf,
129+
noise=False,
130+
tolerance_x=0,
131+
var_type=["num"],
132+
infill_criterion="y",
133+
n_points=1,
134+
ocba_delta=0,
135+
seed=123,
136+
log_level=50,
137+
show_models=False,
138+
show_progress=False,
139+
design=None,
140+
design_control={},
141+
surrogate=None,
142+
surrogate_control={},
143+
optimizer=None,
144+
optimizer_control={},
145145
):
146146
# small value:
147147
self.eps = sqrt(spacing(1))
@@ -180,31 +180,29 @@ def __init__(
180180
# Infill points:
181181
self.n_points = n_points
182182
# Objective function related information:
183-
self.fun_control = {"sigma": 0,
184-
"seed": None}
183+
self.fun_control = {"sigma": 0, "seed": None}
185184
self.fun_control.update(fun_control)
186185
# Design related information:
187186
self.design = design
188187
if design is None:
189188
self.design = spacefilling(k=self.k, seed=self.seed)
190-
self.design_control = {"init_size": 10,
191-
"repeats": 1}
189+
self.design_control = {"init_size": 10, "repeats": 1}
192190
self.design_control.update(design_control)
193191
# Surrogate related information:
194192
self.surrogate = surrogate
195193
self.surrogate_control = {
196194
"noise": self.noise,
197195
"model_optimizer": differential_evolution,
198196
"model_fun_evals": None,
199-
"min_theta": -3.,
200-
"max_theta": 3.,
197+
"min_theta": -3.0,
198+
"max_theta": 3.0,
201199
"n_theta": 1,
202200
"n_p": 1,
203201
"optim_p": False,
204202
"cod_type": "norm",
205203
"var_type": self.var_type,
206204
"seed": 124,
207-
"use_cod_y": False
205+
"use_cod_y": False,
208206
}
209207
self.surrogate_control.update(surrogate_control)
210208
# If no surrogate model is specified, use the internal
@@ -225,12 +223,11 @@ def __init__(
225223
optim_p=self.surrogate_control["optim_p"],
226224
cod_type=self.surrogate_control["cod_type"],
227225
var_type=self.surrogate_control["var_type"],
228-
use_cod_y=self.surrogate_control["use_cod_y"]
226+
use_cod_y=self.surrogate_control["use_cod_y"],
229227
)
230228
# Optimizer related information:
231229
self.optimizer = optimizer
232-
self.optimizer_control = {"max_iter": 1000,
233-
"seed": 125}
230+
self.optimizer_control = {"max_iter": 1000, "seed": 125}
234231
self.optimizer_control.update(optimizer_control)
235232
if self.optimizer is None:
236233
self.optimizer = optimize.differential_evolution
@@ -249,7 +246,7 @@ def __init__(
249246
def to_red_dim(self):
250247
self.all_lower = self.lower
251248
self.all_upper = self.upper
252-
self.ident = (self.upper-self.lower) == 0
249+
self.ident = (self.upper - self.lower) == 0
253250
self.lower = self.lower[~self.ident]
254251
self.upper = self.upper[~self.ident]
255252
self.red_dim = self.ident.any()
@@ -277,9 +274,12 @@ def run(self):
277274
(object): spot
278275
"""
279276
# (S-2) Initial Design:
280-
X0 = self.generate_design(size=self.design_control["init_size"],
281-
repeats=self.design_control["repeats"],
282-
lower=self.lower, upper=self.upper)
277+
X0 = self.generate_design(
278+
size=self.design_control["init_size"],
279+
repeats=self.design_control["repeats"],
280+
lower=self.lower,
281+
upper=self.upper,
282+
)
283283
X0 = repair_non_numeric(X0, self.var_type)
284284
self.X = X0
285285
# (S-3): Eval initial design:
@@ -300,7 +300,7 @@ def run(self):
300300
# (S-9) Termination Criteria, Conditions:
301301

302302
timeout_start = time.time()
303-
while (self.counter < self.fun_evals) and (time.time() < timeout_start + self.max_time*60):
303+
while (self.counter < self.fun_evals) and (time.time() < timeout_start + self.max_time * 60):
304304
# OCBA (only if noise)
305305
if self.noise and self.ocba_delta > 0: # and self.fun_repeats > 0 and self.design_control["repeats"] > 0:
306306
X_ocba = get_ocba_X(self.mean_X, self.mean_y, self.var_y, self.ocba_delta)
@@ -320,10 +320,10 @@ def run(self):
320320
X0 = repeat(X0, self.fun_repeats, axis=0)
321321
# 2. No X0 found. Then generate self.n_points new solutions:
322322
else:
323-
self.design = spacefilling(k=self.k, seed=self.seed+self.counter)
324-
X0 = self.generate_design(size=self.n_points,
325-
repeats=self.design_control["repeats"],
326-
lower=self.lower, upper=self.upper)
323+
self.design = spacefilling(k=self.k, seed=self.seed + self.counter)
324+
X0 = self.generate_design(
325+
size=self.n_points, repeats=self.design_control["repeats"], lower=self.lower, upper=self.upper
326+
)
327327
X0 = repair_non_numeric(X0, self.var_type)
328328
logger.warning("No new XO found on surrogate. Generate new solution %s", X0)
329329
# (S-18): Evaluating New Solutions:
@@ -353,9 +353,9 @@ def run(self):
353353
# progress bar:
354354
if self.show_progress:
355355
if isfinite(self.fun_evals):
356-
progress_bar(self.counter/self.fun_evals)
356+
progress_bar(self.counter / self.fun_evals)
357357
else:
358-
progress_bar((time.time()-timeout_start)/(self.max_time*60))
358+
progress_bar((time.time() - timeout_start) / (self.max_time * 60))
359359
return self
360360

361361
def generate_design(self, size, repeats, lower, upper):
@@ -396,21 +396,22 @@ def suggest_new_X(self):
396396
new_X = np.zeros([self.n_points, self.k], dtype=float)
397397

398398
for i in range(self.n_points):
399-
if self.optimizer.__name__ == 'dual_annealing':
399+
if self.optimizer.__name__ == "dual_annealing":
400400
result = self.optimizer(func=self.infill, bounds=self.de_bounds)
401-
elif self.optimizer.__name__ == 'differential_evolution':
402-
result = self.optimizer(func=self.infill,
403-
bounds=self.de_bounds,
404-
maxiter=self.optimizer_control["max_iter"],
405-
seed=self.optimizer_control["seed"],
406-
# popsize=10,
407-
# updating="deferred"
408-
)
409-
elif self.optimizer.__name__ == 'direct':
401+
elif self.optimizer.__name__ == "differential_evolution":
402+
result = self.optimizer(
403+
func=self.infill,
404+
bounds=self.de_bounds,
405+
maxiter=self.optimizer_control["max_iter"],
406+
seed=self.optimizer_control["seed"],
407+
# popsize=10,
408+
# updating="deferred"
409+
)
410+
elif self.optimizer.__name__ == "direct":
410411
result = self.optimizer(func=self.infill, bounds=self.de_bounds, eps=1e-2)
411-
elif self.optimizer.__name__ == 'shgo':
412+
elif self.optimizer.__name__ == "shgo":
412413
result = self.optimizer(func=self.infill, bounds=self.de_bounds)
413-
elif self.optimizer.__name__ == 'basinhopping':
414+
elif self.optimizer.__name__ == "basinhopping":
414415
result = self.optimizer(func=self.infill, x0=self.min_X)
415416
else:
416417
result = self.optimizer(func=self.infill, bounds=self.de_bounds)
@@ -507,12 +508,15 @@ def plot_model(self, y_min=None, y_max=None):
507508
plt.legend(loc="best")
508509
# plt.title(self.surrogate.__class__.__name__ + ". " + str(self.counter) + ": " + str(self.min_y))
509510
if self.noise:
510-
plt.title(str(self.counter) + ". y (noise): "
511-
+ str(np.round(self.min_y, 6)) + " y mean: "
512-
+ str(np.round(self.min_mean_y, 6)))
511+
plt.title(
512+
str(self.counter)
513+
+ ". y (noise): "
514+
+ str(np.round(self.min_y, 6))
515+
+ " y mean: "
516+
+ str(np.round(self.min_mean_y, 6))
517+
)
513518
else:
514-
plt.title(str(self.counter) + ". y: "
515-
+ str(np.round(self.min_y, 6)))
519+
plt.title(str(self.counter) + ". y: " + str(np.round(self.min_y, 6)))
516520
plt.show()
517521

518522
def print_results(self):
@@ -546,18 +550,12 @@ def plot_contour(self, i=0, j=1, min_z=None, max_z=None, show=True):
546550
fig = pylab.figure(figsize=(9, 6))
547551
n_grid = 100
548552
# lower and upper
549-
x = np.linspace(
550-
self.lower[i], self.upper[i], num=n_grid
551-
)
552-
y = np.linspace(
553-
self.lower[j], self.upper[j], num=n_grid
554-
)
553+
x = np.linspace(self.lower[i], self.upper[i], num=n_grid)
554+
y = np.linspace(self.lower[j], self.upper[j], num=n_grid)
555555
X, Y = meshgrid(x, y)
556556
# Predict based on the optimized results
557557
z0 = np.mean(np.array([self.lower, self.upper]), axis=0)
558-
zz = array(
559-
[self.surrogate.predict(array([self.chg(x, y, z0, i, j)])) for x, y in zip(ravel(X), ravel(Y))]
560-
)
558+
zz = array([self.surrogate.predict(array([self.chg(x, y, z0, i, j)])) for x, y in zip(ravel(X), ravel(Y))])
561559
zs = zz[:, 0]
562560
Z = zs.reshape(X.shape)
563561
if min_z is None:
@@ -584,6 +582,6 @@ def plot_contour(self, i=0, j=1, min_z=None, max_z=None, show=True):
584582
def print_importance(self):
585583
theta = np.power(10, self.surrogate.theta)
586584
print("Importance relative to the most important parameter:")
587-
imp = 100*theta/np.max(theta)
585+
imp = 100 * theta / np.max(theta)
588586
for i in range(len(imp)):
589587
print("Parameter", i, ": ", imp[i])

src/spotPython/utils/progress.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from sys import stdout
22

33

4-
def progress_bar(progress, bar_length=10):
4+
def progress_bar(progress, bar_length=10, message="spotPython tuning:"):
55
"""
66
Displays or updates a console progress bar.
77
See: https://stackoverflow.com/a/15860757
@@ -10,6 +10,7 @@ def progress_bar(progress, bar_length=10):
1010
(float) progress: a float between 0 and 1. Any int will be converted to a float.
1111
A value under 0 represents a halt.
1212
A value at 1 or bigger represents 100%.
13+
A message text.
1314
"""
1415

1516
status = ""
@@ -25,7 +26,7 @@ def progress_bar(progress, bar_length=10):
2526
progress = 1
2627
status = "Done...\r\n"
2728
block = int(round(bar_length * progress))
28-
text = "spotPython tuning: [{0}] {1:.2f}% {2}\r".format(
29+
text = message + " [{0}] {1:.2f}% {2}\r".format(
2930
"#" * block + "-" * (bar_length - block), progress * 100, status
3031
)
3132
stdout.write(text)

0 commit comments

Comments
 (0)