2024-10-02 22:15:59 +04:00

133 lines
3.7 KiB
Python

import sys
from enum import Enum
import numpy as np
# Exit status.
class ExitStatus(Enum):
"""
Exit statuses.
"""
RADIUS_SUCCESS = 0
TARGET_SUCCESS = 1
FIXED_SUCCESS = 2
CALLBACK_SUCCESS = 3
FEASIBLE_SUCCESS = 4
MAX_EVAL_WARNING = 5
MAX_ITER_WARNING = 6
INFEASIBLE_ERROR = -1
LINALG_ERROR = -2
class Options(str, Enum):
"""
Options.
"""
DEBUG = "debug"
FEASIBILITY_TOL = "feasibility_tol"
FILTER_SIZE = "filter_size"
HISTORY_SIZE = "history_size"
MAX_EVAL = "maxfev"
MAX_ITER = "maxiter"
NPT = "nb_points"
RHOBEG = "radius_init"
RHOEND = "radius_final"
SCALE = "scale"
STORE_HISTORY = "store_history"
TARGET = "target"
VERBOSE = "disp"
class Constants(str, Enum):
"""
Constants.
"""
DECREASE_RADIUS_FACTOR = "decrease_radius_factor"
INCREASE_RADIUS_FACTOR = "increase_radius_factor"
INCREASE_RADIUS_THRESHOLD = "increase_radius_threshold"
DECREASE_RADIUS_THRESHOLD = "decrease_radius_threshold"
DECREASE_RESOLUTION_FACTOR = "decrease_resolution_factor"
LARGE_RESOLUTION_THRESHOLD = "large_resolution_threshold"
MODERATE_RESOLUTION_THRESHOLD = "moderate_resolution_threshold"
LOW_RATIO = "low_ratio"
HIGH_RATIO = "high_ratio"
VERY_LOW_RATIO = "very_low_ratio"
PENALTY_INCREASE_THRESHOLD = "penalty_increase_threshold"
PENALTY_INCREASE_FACTOR = "penalty_increase_factor"
SHORT_STEP_THRESHOLD = "short_step_threshold"
LOW_RADIUS_FACTOR = "low_radius_factor"
BYRD_OMOJOKUN_FACTOR = "byrd_omojokun_factor"
THRESHOLD_RATIO_CONSTRAINTS = "threshold_ratio_constraints"
LARGE_SHIFT_FACTOR = "large_shift_factor"
LARGE_GRADIENT_FACTOR = "large_gradient_factor"
RESOLUTION_FACTOR = "resolution_factor"
IMPROVE_TCG = "improve_tcg"
# Default options.
DEFAULT_OPTIONS = {
Options.DEBUG.value: False,
Options.FEASIBILITY_TOL.value: np.sqrt(np.finfo(float).eps),
Options.FILTER_SIZE.value: sys.maxsize,
Options.HISTORY_SIZE.value: sys.maxsize,
Options.MAX_EVAL.value: lambda n: 500 * n,
Options.MAX_ITER.value: lambda n: 1000 * n,
Options.NPT.value: lambda n: 2 * n + 1,
Options.RHOBEG.value: 1.0,
Options.RHOEND.value: 1e-6,
Options.SCALE.value: False,
Options.STORE_HISTORY.value: False,
Options.TARGET.value: -np.inf,
Options.VERBOSE.value: False,
}
# Default constants.
DEFAULT_CONSTANTS = {
Constants.DECREASE_RADIUS_FACTOR.value: 0.5,
Constants.INCREASE_RADIUS_FACTOR.value: np.sqrt(2.0),
Constants.INCREASE_RADIUS_THRESHOLD.value: 2.0,
Constants.DECREASE_RADIUS_THRESHOLD.value: 1.4,
Constants.DECREASE_RESOLUTION_FACTOR.value: 0.1,
Constants.LARGE_RESOLUTION_THRESHOLD.value: 250.0,
Constants.MODERATE_RESOLUTION_THRESHOLD.value: 16.0,
Constants.LOW_RATIO.value: 0.1,
Constants.HIGH_RATIO.value: 0.7,
Constants.VERY_LOW_RATIO.value: 0.01,
Constants.PENALTY_INCREASE_THRESHOLD.value: 1.5,
Constants.PENALTY_INCREASE_FACTOR.value: 2.0,
Constants.SHORT_STEP_THRESHOLD.value: 0.5,
Constants.LOW_RADIUS_FACTOR.value: 0.1,
Constants.BYRD_OMOJOKUN_FACTOR.value: 0.8,
Constants.THRESHOLD_RATIO_CONSTRAINTS.value: 2.0,
Constants.LARGE_SHIFT_FACTOR.value: 10.0,
Constants.LARGE_GRADIENT_FACTOR.value: 10.0,
Constants.RESOLUTION_FACTOR.value: 2.0,
Constants.IMPROVE_TCG.value: True,
}
# Printing options.
PRINT_OPTIONS = {
"threshold": 6,
"edgeitems": 2,
"linewidth": sys.maxsize,
"formatter": {
"float_kind": lambda x: np.format_float_scientific(
x,
precision=3,
unique=False,
pad_left=2,
)
},
}
# Constants.
BARRIER = 2.0 ** min(
100,
np.finfo(float).maxexp // 2,
-np.finfo(float).minexp // 2,
)