summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBirte Kristina Friesel <birte.friesel@uos.de>2024-12-12 18:21:08 +0100
committerBirte Kristina Friesel <birte.friesel@uos.de>2024-12-12 18:21:08 +0100
commit54cb9c0f47b17c57e30c9b8e2b0feb9f11623a09 (patch)
tree89270f88fc1247cc8be418d6cd77a3cd975bfd0f
parent50606967e2ae749bf9ab3fa213a7da6e89b0aeed (diff)
Support lower regression bounds other than -∞
DFATOOL_ULS_MIN_BOUND=0 is especially useful in many cases
-rw-r--r--lib/functions.py15
-rw-r--r--lib/paramfit.py3
2 files changed, 14 insertions, 4 deletions
diff --git a/lib/functions.py b/lib/functions.py
index ae8283a..187e6ff 100644
--- a/lib/functions.py
+++ b/lib/functions.py
@@ -27,6 +27,8 @@ dfatool_rmt_relevance_threshold = float(
os.getenv("DFATOOL_RMT_RELEVANCE_THRESHOLD", "0.5")
)
+dfatool_uls_min_bound = float(os.getenv("DFATOOL_ULS_MIN_BOUND", -np.inf))
+
if dfatool_preproc_relevance_method == "mi":
import sklearn.feature_selection
@@ -97,7 +99,7 @@ class ParamFunction:
num_vars,
repr_str=None,
ini=None,
- bounds=((-np.inf, -np.inf), (np.inf, np.inf)),
+ bounds=((dfatool_uls_min_bound, dfatool_uls_min_bound), (np.inf, np.inf)),
):
"""
Create function object suitable for regression analysis.
@@ -1927,7 +1929,7 @@ class AnalyticFunction(ModelFunction):
upper_bounds.append(np.max(X[param_index]))
self.model_args[i] = np.mean(X[param_index])
else:
- lower_bounds.append(-np.inf)
+ lower_bounds.append(dfatool_uls_min_bound)
upper_bounds.append(np.inf)
error_function = lambda P, X, y: self._function(P, X) - y
try:
@@ -2144,7 +2146,14 @@ class analytic:
lambda model_param: True,
3,
repr_str="β₀ + β₁ * roofline(x, β₂)",
- bounds=((-np.inf, -np.inf, -np.inf), (np.inf, np.inf, np.inf)),
+ bounds=(
+ (
+ dfatool_uls_min_bound,
+ dfatool_uls_min_bound,
+ dfatool_uls_min_bound,
+ ),
+ (np.inf, np.inf, np.inf),
+ ),
),
# "num0_8": ParamFunction(
# lambda reg_param, model_param: reg_param[0]
diff --git a/lib/paramfit.py b/lib/paramfit.py
index 05ffb86..000aa9c 100644
--- a/lib/paramfit.py
+++ b/lib/paramfit.py
@@ -17,6 +17,7 @@ from .utils import (
logger = logging.getLogger(__name__)
best_fit_metric = os.getenv("DFATOOL_ULS_ERROR_METRIC", "ssr")
+dfatool_uls_min_bound = float(os.getenv("DFATOOL_ULS_MIN_BOUND", -np.inf))
class ParamFit:
@@ -211,7 +212,7 @@ def _try_fits(
ini = [0] + [1 for i in range(1, param_function._num_variables)]
if function_name == "roofline":
param_function.bounds = (
- (-np.inf, -np.inf, np.min(X)),
+ (dfatool_uls_min_bound, dfatool_uls_min_bound, np.min(X)),
(np.inf, np.inf, np.max(X)),
)
ini[2] = np.mean(X)