Skip to content

Commit ff802d0

Browse files
committed
more steps towards using pycommons
1 parent ded6f13 commit ff802d0

File tree

19 files changed

+78
-291
lines changed

19 files changed

+78
-291
lines changed

moptipy/algorithms/so/fea1plus1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,13 @@
9292

9393
import numpy as np
9494
from numpy.random import Generator
95+
from pycommons.strings.string_conv import num_to_str
9596

9697
from moptipy.api.algorithm import Algorithm1
9798
from moptipy.api.operators import Op0, Op1
9899
from moptipy.api.process import Process
99100
from moptipy.utils.logger import CSV_SEPARATOR
100101
from moptipy.utils.nputils import DEFAULT_INT
101-
from moptipy.utils.strings import num_to_str
102102

103103
#: the log section for the frequency table
104104
H_LOG_SECTION: Final[str] = "H"

moptipy/algorithms/so/fitnesses/ffa.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,14 @@
5858

5959
import numpy as np
6060
from numpy.random import Generator
61+
from pycommons.strings.string_conv import num_to_str
6162

6263
from moptipy.algorithms.so.fea1plus1 import SWITCH_TO_MAP_RANGE, log_h
6364
from moptipy.algorithms.so.fitness import Fitness, FRecord
6465
from moptipy.api.objective import Objective, check_objective
6566
from moptipy.api.process import Process
6667
from moptipy.utils.logger import KeyValueLogSection
6768
from moptipy.utils.nputils import DEFAULT_INT
68-
from moptipy.utils.strings import num_to_str
6969

7070
#: The lower bound at which we switch to an offset-based backing array for
7171
#: the frequency table H.

moptipy/algorithms/so/vector/cmaes_lib.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@
4242
import numpy as np
4343
from cmaes import CMA, SepCMA # type: ignore
4444
from numpy.random import Generator
45+
from pycommons.strings.string_conv import num_to_str
4546
from pycommons.types import type_error
4647

4748
from moptipy.api.algorithm import Algorithm
4849
from moptipy.api.process import Process
4950
from moptipy.spaces.vectorspace import VectorSpace
5051
from moptipy.utils.logger import CSV_SEPARATOR, KeyValueLogSection
51-
from moptipy.utils.strings import num_to_str
5252

5353

5454
def _run_cma(cma: SepCMA | CMA,

moptipy/evaluation/ecdf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import numpy as np
4141
from pycommons.io.console import logger
4242
from pycommons.io.path import Path
43+
from pycommons.strings.string_conv import num_to_str
4344
from pycommons.types import check_int_range, type_error
4445

4546
from moptipy.api.logging import (
@@ -63,7 +64,6 @@
6364
KEY_VALUE_SEPARATOR,
6465
)
6566
from moptipy.utils.nputils import is_all_finite
66-
from moptipy.utils.strings import num_to_str
6767

6868
#: The number of instances.
6969
KEY_N_INSTS: Final[str] = f"{KEY_N}Insts"

moptipy/evaluation/end_results.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020

2121
from pycommons.io.console import logger
2222
from pycommons.io.path import Path, file_path
23+
from pycommons.strings.string_conv import (
24+
int_or_none_to_str,
25+
num_or_none_to_str,
26+
num_to_str,
27+
str_to_int_or_none,
28+
str_to_num,
29+
str_to_num_or_none,
30+
)
2331
from pycommons.types import check_int_range, check_to_int_range, type_error
2432

2533
from moptipy.api.logging import (
@@ -56,13 +64,7 @@
5664
from moptipy.utils.logger import CSV_SEPARATOR
5765
from moptipy.utils.math import try_float_div, try_int
5866
from moptipy.utils.strings import (
59-
intfloatnone_to_str,
60-
intnone_to_str,
61-
num_to_str,
6267
sanitize_names,
63-
str_to_intfloat,
64-
str_to_intfloatnone,
65-
str_to_intnone,
6668
)
6769

6870
#: The internal CSV header, part 1
@@ -489,12 +491,12 @@ def to_csv(results: Iterable["EndResult"], file: str) -> Path:
489491
f"{e.total_fes}{CSV_SEPARATOR}"
490492
f"{e.total_time_millis}")
491493
if needs_goal_f:
492-
write(f"{CSV_SEPARATOR}{intfloatnone_to_str(e.goal_f)}")
494+
write(f"{CSV_SEPARATOR}{num_or_none_to_str(e.goal_f)}")
493495
if needs_max_fes:
494-
write(f"{CSV_SEPARATOR}{intnone_to_str(e.max_fes)}")
496+
write(f"{CSV_SEPARATOR}{int_or_none_to_str(e.max_fes)}")
495497
if needs_max_ms:
496-
write(
497-
f"{CSV_SEPARATOR}{intnone_to_str(e.max_time_millis)}")
498+
write(f"{CSV_SEPARATOR}"
499+
f"{int_or_none_to_str(e.max_time_millis)}")
498500
write("\n")
499501

500502
logger(f"Done writing end results to CSV file {path!r}.")
@@ -625,17 +627,17 @@ def from_csv(file: str, consumer: Callable[["EndResult"], Any],
625627
splt[idx_objective].strip(), # objective
626628
encoding, # encoding
627629
int((splt[idx_seed])[2:], 16), # rand seed
628-
str_to_intfloat(splt[idx_best_f]), # best_f
630+
str_to_num(splt[idx_best_f]), # best_f
629631
int(splt[idx_li_fe]), # last_improvement_fe
630632
int(splt[idx_li_ms]), # last_improvement_time_millis
631633
int(splt[idx_tt_fe]), # total_fes
632634
int(splt[idx_tt_ms]), # total_time_millis
633635
None if idx_goal_f < 0 else
634-
str_to_intfloatnone(splt[idx_goal_f]), # goal_f
636+
str_to_num_or_none(splt[idx_goal_f]), # goal_f
635637
None if idx_max_fes < 0 else
636-
str_to_intnone(splt[idx_max_fes]), # max_fes
638+
str_to_int_or_none(splt[idx_max_fes]), # max_fes
637639
None if idx_max_ms < 0 else
638-
str_to_intnone(splt[idx_max_ms])) # max_time_millis
640+
str_to_int_or_none(splt[idx_max_ms])) # max_time_ms
639641
if filterer(er):
640642
consumer(er)
641643

@@ -864,7 +866,7 @@ def lines(self, lines: list[str]) -> bool:
864866
values[fe_col], "fes", current_fes, 1_000_000_000_000_000)
865867
current_ms = check_to_int_range(
866868
values[ms_col], "ms", current_ms, 1_000_000_000_00)
867-
f: int | float = str_to_intfloat(values[f_col])
869+
f: int | float = str_to_num(values[f_col])
868870
if (current_fes <= limit_fes) and (current_ms <= limit_ms):
869871
if f < current_f: # can only update best within budget
870872
current_f = f
@@ -945,7 +947,7 @@ def lines(self, lines: list[str]) -> bool:
945947
type=int, nargs="?", default=None)
946948
parser.add_argument(
947949
"--goalF", help="the goal objective value",
948-
type=str_to_intfloat, nargs="?", default=None)
950+
type=str_to_num, nargs="?", default=None)
949951
args: Final[argparse.Namespace] = parser.parse_args()
950952

951953
end_results: Final[list[EndResult]] = []

moptipy/evaluation/end_statistics.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from pycommons.io.console import logger
1818
from pycommons.io.path import Path, file_path
19+
from pycommons.strings.string_conv import num_to_str, str_to_num
1920
from pycommons.types import check_int_range, type_error, type_name_of
2021

2122
from moptipy.api.logging import (
@@ -51,7 +52,7 @@
5152
from moptipy.utils.help import argparser
5253
from moptipy.utils.logger import CSV_SEPARATOR, SCOPE_SEPARATOR
5354
from moptipy.utils.math import try_int, try_int_div
54-
from moptipy.utils.strings import num_to_str, sanitize_name, str_to_intfloat
55+
from moptipy.utils.strings import sanitize_name
5556

5657
#: The key for the best F.
5758
KEY_BEST_F_SCALED: Final[str] = KEY_BEST_F + "scaled"
@@ -1133,7 +1134,7 @@ def from_csv(file: str,
11331134
idx += CSV_COLS
11341135

11351136
if has_goal_f == 1:
1136-
goal_f = str_to_intfloat(row[idx])
1137+
goal_f = str_to_num(row[idx])
11371138
idx += 1
11381139
elif has_goal_f == 2:
11391140
goal_f = Statistics.from_csv(
@@ -1176,12 +1177,12 @@ def from_csv(file: str,
11761177
idx += CSV_COLS
11771178

11781179
if has_ert_fes:
1179-
ert_fes = str_to_intfloat(row[idx]) \
1180+
ert_fes = str_to_num(row[idx]) \
11801181
if n_success > 0 else inf
11811182
idx += 1
11821183

11831184
if has_ert_time:
1184-
ert_time = str_to_intfloat(row[idx]) \
1185+
ert_time = str_to_num(row[idx]) \
11851186
if n_success > 0 else inf
11861187
idx += 1
11871188

moptipy/evaluation/ert.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import numpy as np
3838
from pycommons.io.console import logger
3939
from pycommons.io.path import Path
40+
from pycommons.strings.string_conv import num_to_str
4041
from pycommons.types import type_error
4142

4243
from moptipy.api.logging import (
@@ -60,7 +61,6 @@
6061
KEY_VALUE_SEPARATOR,
6162
)
6263
from moptipy.utils.nputils import DEFAULT_FLOAT, DEFAULT_INT, is_all_finite
63-
from moptipy.utils.strings import num_to_str
6464

6565

6666
def compute_single_ert(source: Iterable[Progress],

moptipy/evaluation/frequency.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from pycommons.io.console import logger
2121
from pycommons.io.path import Path
22+
from pycommons.strings.string_conv import str_to_num
2223
from pycommons.types import type_error
2324

2425
from moptipy.algorithms.so.fea1plus1 import H_LOG_SECTION
@@ -37,9 +38,6 @@
3738
from moptipy.evaluation.log_parser import SetupAndStateParser
3839
from moptipy.utils.help import argparser
3940
from moptipy.utils.logger import CSV_SEPARATOR, SCOPE_SEPARATOR
40-
from moptipy.utils.strings import (
41-
str_to_intfloat,
42-
)
4341

4442
#: the lower bound of the objective function
4543
_FULL_KEY_LOWER_BOUND: Final[str] = \
@@ -428,12 +426,12 @@ def setup_section(self, data: dict[str, str]) -> None:
428426
"""
429427
super().setup_section(data)
430428
if self.__report_lower_bound and (_FULL_KEY_LOWER_BOUND in data):
431-
lb: Final[int | float] = str_to_intfloat(
429+
lb: Final[int | float] = str_to_num(
432430
data[_FULL_KEY_LOWER_BOUND])
433431
if isfinite(lb):
434432
self.__counter[lb] = max(self.__counter[lb], 1)
435433
if self.__report_upper_bound and (_FULL_KEY_UPPER_BOUND in data):
436-
ub: Final[int | float] = str_to_intfloat(
434+
ub: Final[int | float] = str_to_num(
437435
data[_FULL_KEY_UPPER_BOUND])
438436
if isfinite(ub):
439437
self.__counter[ub] = max(self.__counter[ub], 1)
@@ -453,7 +451,7 @@ def lines(self, lines: list[str]) -> bool:
453451
f_col: Final[int] = columns.index(PROGRESS_CURRENT_F)
454452
counter = self.__counter
455453
for line in lines[1:]:
456-
f: int | float = str_to_intfloat(line.split(
454+
f: int | float = str_to_num(line.split(
457455
CSV_SEPARATOR)[f_col])
458456
counter[f] += 1
459457
elif self.__state_h == 1:
@@ -462,7 +460,7 @@ def lines(self, lines: list[str]) -> bool:
462460
for line in lines:
463461
split = line.split(CSV_SEPARATOR)
464462
for i in range(0, len(split), 2):
465-
counter[str_to_intfloat(split[i])] += int(split[i + 1])
463+
counter[str_to_num(split[i])] += int(split[i + 1])
466464
else:
467465
return super().lines(lines)
468466

moptipy/evaluation/ioh_analyzer.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,17 @@
4141

4242
import argparse
4343
import contextlib
44-
from typing import Callable, Final
44+
from typing import Any, Callable, Final
4545

4646
import numpy as np
4747
from pycommons.io.console import logger
4848
from pycommons.io.path import Path, directory_path
49+
from pycommons.strings.string_conv import float_to_str
4950
from pycommons.types import check_int_range, type_error
5051

5152
from moptipy.evaluation.base import F_NAME_RAW, TIME_UNIT_FES, check_f_name
5253
from moptipy.evaluation.progress import Progress
5354
from moptipy.utils.help import argparser
54-
from moptipy.utils.strings import num_to_str
5555

5656

5757
def __prefix(s: str) -> str:
@@ -88,6 +88,17 @@ def __int_suffix(s: str) -> int:
8888
return 1
8989

9090

91+
def __npstr(a: Any) -> str:
92+
"""
93+
Convert numpy numbers to strings.
94+
95+
:param a: the input
96+
:returns: a string
97+
"""
98+
return str(int(a)) if isinstance(a, np.integer) \
99+
else float_to_str(float(a))
100+
101+
91102
def moptipy_to_ioh_analyzer(
92103
results_dir: str,
93104
dest_dir: str,
@@ -214,14 +225,14 @@ def __consume(progress: Progress) -> None:
214225
info.write(f", {per_dim[0]}:")
215226
fes = per_dim[1]
216227
f = per_dim[2]
217-
info.write(num_to_str(fes[-1]))
228+
info.write(__npstr(fes[-1]))
218229
info.write("|")
219-
info.write(num_to_str(f[-1]))
230+
info.write(__npstr(f[-1]))
220231
dat.write(
221232
'"function evaluation" "best-so-far f(x)"\n')
222233
for i, ff in enumerate(f):
223-
dat.write(f"{num_to_str(fes[i])} "
224-
f"{num_to_str(ff)}\n")
234+
dat.write(
235+
f"{__npstr(fes[i])} {__npstr(ff)}\n")
225236
dat.write("\n")
226237
info.write("\n")
227238
del data

moptipy/evaluation/log_parser.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
from pycommons.io.console import logger
2929
from pycommons.io.path import Path, directory_path, file_path
30+
from pycommons.strings.string_conv import str_to_num
3031
from pycommons.types import check_to_int_range
3132

3233
from moptipy.api.logging import (
@@ -61,7 +62,6 @@
6162
from moptipy.utils.strings import (
6263
PART_SEPARATOR,
6364
sanitize_name,
64-
str_to_intfloat,
6565
)
6666

6767
#: the maximum FEs of a black-box process
@@ -696,7 +696,7 @@ def setup_section(self, data: dict[str, str]) -> None:
696696
self.goal_f = None
697697
if _FULL_KEY_GOAL_F in data:
698698
goal_f = data[_FULL_KEY_GOAL_F]
699-
g: Final[int | float] = str_to_intfloat(goal_f)
699+
g: Final[int | float] = str_to_num(goal_f)
700700
if isfinite(g):
701701
self.goal_f = g
702702
elif not (isinf(g) and (g >= inf)):
@@ -761,7 +761,7 @@ def state_section(self, lines: list[str]) -> None:
761761
if self.max_time_millis is not None:
762762
_check_max_time_millis(self.max_time_millis, self.total_fes,
763763
self.total_time_millis)
764-
self.best_f = str_to_intfloat(data[KEY_BEST_F])
764+
self.best_f = str_to_num(data[KEY_BEST_F])
765765
if not isfinite(self.best_f):
766766
raise ValueError(f"infinite best f detected: {self.best_f}")
767767
self.last_improvement_fe = check_to_int_range(

0 commit comments

Comments
 (0)