omniopt2 8911__py3-none-any.whl → 9061__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of omniopt2 might be problematic. Click here for more details.

Files changed (40) hide show
  1. .omniopt.py +629 -712
  2. .pareto.py +134 -0
  3. omniopt +1 -1
  4. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt.py +629 -712
  5. omniopt2-9061.data/data/bin/.pareto.py +134 -0
  6. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/omniopt +1 -1
  7. {omniopt2-8911.dist-info → omniopt2-9061.dist-info}/METADATA +1 -1
  8. {omniopt2-8911.dist-info → omniopt2-9061.dist-info}/RECORD +40 -38
  9. omniopt2.egg-info/PKG-INFO +1 -1
  10. omniopt2.egg-info/SOURCES.txt +1 -0
  11. pyproject.toml +1 -1
  12. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.colorfunctions.sh +0 -0
  13. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.general.sh +0 -0
  14. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.helpers.py +0 -0
  15. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_cpu_ram_usage.py +0 -0
  16. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_general.py +0 -0
  17. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_gpu_usage.py +0 -0
  18. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_kde.py +0 -0
  19. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_scatter.py +0 -0
  20. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_scatter_generation_method.py +0 -0
  21. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_scatter_hex.py +0 -0
  22. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_time_and_exit_code.py +0 -0
  23. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_trial_index_result.py +0 -0
  24. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.omniopt_plot_worker.py +0 -0
  25. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.random_generator.py +0 -0
  26. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.shellscript_functions +0 -0
  27. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/.tpe.py +0 -0
  28. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/LICENSE +0 -0
  29. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/apt-dependencies.txt +0 -0
  30. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/omniopt_docker +0 -0
  31. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/omniopt_evaluate +0 -0
  32. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/omniopt_plot +0 -0
  33. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/omniopt_share +0 -0
  34. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/pylint.rc +0 -0
  35. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/requirements.txt +0 -0
  36. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/setup.py +0 -0
  37. {omniopt2-8911.data → omniopt2-9061.data}/data/bin/test_requirements.txt +0 -0
  38. {omniopt2-8911.dist-info → omniopt2-9061.dist-info}/WHEEL +0 -0
  39. {omniopt2-8911.dist-info → omniopt2-9061.dist-info}/licenses/LICENSE +0 -0
  40. {omniopt2-8911.dist-info → omniopt2-9061.dist-info}/top_level.txt +0 -0
.pareto.py ADDED
@@ -0,0 +1,134 @@
1
+ import os
2
+ import importlib.util
3
+ from typing import Tuple, List, Dict, Any
4
+ from rich.table import Table
5
+ from rich.text import Text
6
+ import numpy as np
7
+
8
+
9
+ # ----------------- Helpers import -----------------
10
+ script_dir = os.path.dirname(os.path.realpath(__file__))
11
+ helpers_file: str = f"{script_dir}/.helpers.py"
12
+ spec = importlib.util.spec_from_file_location(
13
+ name="helpers",
14
+ location=helpers_file,
15
+ )
16
+ if spec is not None and spec.loader is not None:
17
+ helpers = importlib.util.module_from_spec(spec)
18
+ spec.loader.exec_module(helpers)
19
+ else:
20
+ raise ImportError(f"Could not load module from {helpers_file}")
21
+
22
+ # ----------------- Table utilities -----------------
23
+ def pareto_front_table_filter_rows(rows: List[Dict[str, str]], idxs: List[int]) -> List[Dict[str, str]]:
24
+ result = []
25
+ for row in rows:
26
+ try:
27
+ trial_index = int(row["trial_index"])
28
+ except (KeyError, ValueError):
29
+ continue
30
+
31
+ if row.get("trial_status", "").strip().upper() == "COMPLETED" and trial_index in idxs:
32
+ result.append(row)
33
+ return result
34
+
35
+ def pareto_front_table_add_headers(table: Table, param_cols: List[str], result_cols: List[str]) -> None:
36
+ for col in param_cols:
37
+ table.add_column(col, justify="center")
38
+ for col in result_cols:
39
+ table.add_column(Text(f"{col}", style="cyan"), justify="center")
40
+
41
+ def pareto_front_table_add_rows(table: Table, rows: List[Dict[str, str]], param_cols: List[str], result_cols: List[str]) -> None:
42
+ for row in rows:
43
+ values = [str(helpers.to_int_when_possible(row[col])) for col in param_cols]
44
+ result_values = [Text(str(helpers.to_int_when_possible(row[col])), style="cyan") for col in result_cols]
45
+ table.add_row(*values, *result_values, style="bold green")
46
+
47
+ # ----------------- Pareto internal utilities -----------------
48
+ def _validate_xy(x: np.ndarray, y: np.ndarray) -> None:
49
+ if x.shape != y.shape:
50
+ raise ValueError("Input arrays x and y must have the same shape.")
51
+ if x.size == 0:
52
+ raise ValueError("Input arrays must not be empty.")
53
+ if not np.isfinite(x).all() or not np.isfinite(y).all():
54
+ raise ValueError("Input arrays must contain only finite numbers (no NaN/Inf).")
55
+
56
+ def _point_dominates(xi: float, yi: float, xj: float, yj: float, x_minimize: bool, y_minimize: bool) -> bool:
57
+ """Return True if j dominates i (standard weak Pareto: >= in all, > in at least one)."""
58
+ if x_minimize:
59
+ x_better_eq = xj <= xi
60
+ x_strict = xj < xi
61
+ else:
62
+ x_better_eq = xj >= xi
63
+ x_strict = xj > xi
64
+
65
+ if y_minimize:
66
+ y_better_eq = yj <= yi
67
+ y_strict = yj < yi
68
+ else:
69
+ y_better_eq = yj >= yi
70
+ y_strict = yj > yi
71
+
72
+ return x_better_eq and y_better_eq and (x_strict or y_strict)
73
+
74
+ def _find_dominated(x: np.ndarray, y: np.ndarray, x_minimize: bool, y_minimize: bool) -> np.ndarray:
75
+ n = len(x)
76
+ is_dominated = np.zeros(n, dtype=bool)
77
+ for i in range(n):
78
+ if is_dominated[i]:
79
+ continue
80
+ xi, yi = x[i], y[i]
81
+ for j in range(n):
82
+ if i == j:
83
+ continue
84
+ xj, yj = x[j], y[j]
85
+ if _point_dominates(xi, yi, xj, yj, x_minimize, y_minimize):
86
+ is_dominated[i] = True
87
+ break
88
+ return is_dominated
89
+
90
+ # ----------------- Public Pareto functions -----------------
91
+ def pareto_front_general(
92
+ x: np.ndarray,
93
+ y: np.ndarray,
94
+ x_minimize: bool = True,
95
+ y_minimize: bool = True
96
+ ) -> np.ndarray:
97
+ try:
98
+ xa = np.asarray(x, dtype=float).ravel()
99
+ ya = np.asarray(y, dtype=float).ravel()
100
+ _validate_xy(xa, ya)
101
+ is_dominated = _find_dominated(xa, ya, x_minimize, y_minimize)
102
+ return np.where(~is_dominated)[0]
103
+ except Exception as e:
104
+ print("Error in pareto_front_general:", str(e))
105
+ return np.array([], dtype=int)
106
+
107
+ def pareto_front_filter_complete_points(
108
+ path_to_calculate: str,
109
+ records: Dict[Tuple[int, str], Dict[str, Dict[str, float]]],
110
+ primary_name: str,
111
+ secondary_name: str
112
+ ) -> List[Tuple[Tuple[int, str], float, float]]:
113
+ points = []
114
+ for key, metrics in records.items():
115
+ means = metrics['means']
116
+ if primary_name in means and secondary_name in means:
117
+ points.append((key, means[primary_name], means[secondary_name]))
118
+ if len(points) == 0:
119
+ raise ValueError(f"No full data points with both objectives found in {path_to_calculate}.")
120
+ return points
121
+
122
+ def pareto_front_select_pareto_points(
123
+ x: np.ndarray,
124
+ y: np.ndarray,
125
+ x_minimize: bool,
126
+ y_minimize: bool,
127
+ points: List[Tuple[Any, float, float]],
128
+ num_points: int
129
+ ) -> List[Tuple[Any, float, float]]:
130
+ indices = pareto_front_general(x, y, x_minimize, y_minimize)
131
+ # Sort by x ascending
132
+ sorted_indices = indices[np.argsort(x[indices])]
133
+ selected_points = [points[i] for i in sorted_indices[:num_points]]
134
+ return selected_points
omniopt CHANGED
@@ -1877,7 +1877,7 @@ EOF
1877
1877
  kill_tail_when_squeue_job_empty "$started_job_nr" &
1878
1878
 
1879
1879
  tail_log_file() {
1880
- trap 'ask_cancel' SIGINT
1880
+ #trap 'ask_cancel' SIGINT
1881
1881
  # weird exec stuff for disabling the "Terminated" message coming from kill
1882
1882
  exec 3>&2 # 3 is now a copy of 2
1883
1883
  exec 2> /dev/null # 2 now points to /dev/null