Skip to content

Commit 68909ad

Browse files
committed
Update logging for parameters
1 parent 241e5c7 commit 68909ad

File tree

3 files changed

+52
-34
lines changed

3 files changed

+52
-34
lines changed

bayes_opt/logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def _step(self, instance: BayesianOptimization, colour: str = _colour_regular_me
169169
cells[2] = self._format_bool(res["allowed"])
170170
params = res.get("params", {})
171171
cells[3:] = [
172-
instance.space._params_config[key].repr(val, self._default_cell_size)
172+
instance.space._params_config[key].to_string(val, self._default_cell_size)
173173
for key, val in params.items()
174174
]
175175

bayes_opt/parameter.py

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def kernel_transform(self, value: NDArray[Float]) -> NDArray[Float]:
120120
np.ndarray
121121
"""
122122

123-
def repr(self, value: Any, str_len: int) -> str:
123+
def to_string(self, value: Any, str_len: int) -> str:
124124
"""Represent a parameter value as a string.
125125
126126
Parameters
@@ -135,11 +135,9 @@ def repr(self, value: Any, str_len: int) -> str:
135135
-------
136136
str
137137
"""
138-
s = repr(value)
138+
s = f"{value!r:<{str_len}}"
139139

140140
if len(s) > str_len:
141-
if "." in s:
142-
return s[:str_len]
143141
return s[: str_len - 3] + "..."
144142
return s
145143

@@ -194,7 +192,7 @@ def to_param(self, value: float | NDArray[Float]) -> float:
194192
return value
195193
return value.flatten()[0]
196194

197-
def repr(self, value: float, str_len: int) -> str:
195+
def to_string(self, value: float, str_len: int) -> str:
198196
"""Represent a parameter value as a string.
199197
200198
Parameters
@@ -211,7 +209,7 @@ def repr(self, value: float, str_len: int) -> str:
211209
"""
212210
s = f"{value:<{str_len}.{str_len}}"
213211
if len(s) > str_len:
214-
if "." in s:
212+
if "." in s and "e" not in s:
215213
return s[:str_len]
216214
return s[: str_len - 3] + "..."
217215
return s
@@ -297,28 +295,6 @@ def to_param(self, value: int | float | NDArray[Int] | NDArray[Float]) -> int:
297295
"""
298296
return int(np.round(np.squeeze(value)))
299297

300-
def repr(self, value: int, str_len: int) -> str:
301-
"""Represent a parameter value as a string.
302-
303-
Parameters
304-
----------
305-
value : Any
306-
The value to represent.
307-
308-
str_len : int
309-
The maximum length of the string representation.
310-
311-
Returns
312-
-------
313-
str
314-
"""
315-
s = f"{value:<{str_len}}"
316-
if len(s) > str_len:
317-
if "." in s:
318-
return s[:str_len]
319-
return s[: str_len - 3] + "..."
320-
return s
321-
322298
def kernel_transform(self, value: NDArray[Float]) -> NDArray[Float]:
323299
"""Transform a parameter value for use in a kernel.
324300
@@ -352,6 +328,13 @@ class CategoricalParameter(BayesParameter):
352328
"""
353329

354330
def __init__(self, name: str, categories: Sequence[Any]) -> None:
331+
if len(categories) != len(set(categories)):
332+
msg = "Categories must be unique."
333+
raise ValueError(msg)
334+
if len(categories) < 2:
335+
msg = "At least two categories are required."
336+
raise ValueError(msg)
337+
355338
self.categories = categories
356339
lower = np.zeros(self.dim)
357340
upper = np.ones(self.dim)
@@ -412,7 +395,7 @@ def to_param(self, value: float | NDArray[Float]) -> Any:
412395
"""
413396
return self.categories[int(np.argmax(value))]
414397

415-
def repr(self, value: Any, str_len: int) -> str:
398+
def to_string(self, value: Any, str_len: int) -> str:
416399
"""Represent a parameter value as a string.
417400
418401
Parameters
@@ -427,7 +410,10 @@ def repr(self, value: Any, str_len: int) -> str:
427410
-------
428411
str
429412
"""
430-
s = f"{value:^{str_len}}"
413+
if not isinstance(value, str):
414+
value = repr(value)
415+
s = f"{value:<{str_len}}"
416+
431417
if len(s) > str_len:
432418
return s[: str_len - 3] + "..."
433419
return s

tests/test_parameter.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ def target_func(**kwargs):
7070

7171

7272
def test_cat_parameters():
73-
fruit_ratings = {"apple": 1.0, "banana": 2.0, "mango": 5.0, "honeydew melon": -10.0, "straberry": np.pi}
73+
fruit_ratings = {"apple": 1.0, "banana": 2.0, "mango": 5.0, "honeydew melon": -10.0, "strawberry": np.pi}
7474

7575
def target_func(fruit: str):
7676
return fruit_ratings[fruit]
7777

78-
fruits = ("apple", "banana", "mango", "honeydew melon", "straberry")
79-
pbounds = {"fruit": ("apple", "banana", "mango", "honeydew melon", "straberry")}
78+
fruits = ("apple", "banana", "mango", "honeydew melon", "strawberry")
79+
pbounds = {"fruit": ("apple", "banana", "mango", "honeydew melon", "strawberry")}
8080
space = TargetSpace(target_func, pbounds)
8181

8282
assert space.dim == len(fruits)
@@ -101,3 +101,35 @@ def target_func(fruit: str):
101101
assert (space.params[1] == np.array([0, 0, 0, 1, 0])).all()
102102

103103
assert (space.target == np.array([target1, target2])).all()
104+
105+
106+
def test_to_string():
107+
pbounds = {"p1": (0, 1), "p2": (1, 2)}
108+
space = TargetSpace(None, pbounds)
109+
110+
assert space._params_config["p1"].to_string(0.2, 5) == "0.2 "
111+
assert space._params_config["p2"].to_string(1.5, 5) == "1.5 "
112+
assert space._params_config["p1"].to_string(0.2, 3) == "0.2"
113+
assert space._params_config["p2"].to_string(np.pi, 5) == "3.141"
114+
assert space._params_config["p1"].to_string(1e-5, 6) == "1e-05 "
115+
assert space._params_config["p2"].to_string(-1e-5, 6) == "-1e-05"
116+
assert space._params_config["p1"].to_string(1e-15, 5) == "1e-15"
117+
assert space._params_config["p1"].to_string(-1.2e-15, 7) == "-1.2..."
118+
119+
pbounds = {"p1": (0, 5, int), "p3": (-1, 3, int)}
120+
space = TargetSpace(None, pbounds)
121+
122+
assert space._params_config["p1"].to_string(2, 5) == "2 "
123+
assert space._params_config["p3"].to_string(0, 5) == "0 "
124+
assert space._params_config["p1"].to_string(2, 3) == "2 "
125+
assert space._params_config["p3"].to_string(-1, 5) == "-1 "
126+
assert space._params_config["p1"].to_string(123456789, 6) == "123..."
127+
128+
pbounds = {"fruit": ("apple", "banana", "mango", "honeydew melon", "strawberry")}
129+
space = TargetSpace(None, pbounds)
130+
131+
assert space._params_config["fruit"].to_string("apple", 5) == "apple"
132+
assert space._params_config["fruit"].to_string("banana", 5) == "ba..."
133+
assert space._params_config["fruit"].to_string("mango", 5) == "mango"
134+
assert space._params_config["fruit"].to_string("honeydew melon", 10) == "honeyde..."
135+
assert space._params_config["fruit"].to_string("strawberry", 10) == "strawberry"

0 commit comments

Comments
 (0)