[docs]@dataclass(frozen=True)classScalingOptions:"""Scaling options in optimization problems. Attributes: method: The method used for scaling. Can be "start_values" or "bounds". Default is "start_values". clipping_value: The minimum value to which elements are clipped to avoid division by zero. Must be a positive number. Default is 0.1. magnitude: A factor by which the scaled parameters are multiplied to adjust their magnitude. Must be a positive number. Default is 1.0. Raises: InvalidScalingError: If scaling options cannot be processed, e.g. because they do not have the correct type. """method:Literal["start_values","bounds"]="start_values"clipping_value:float=0.1magnitude:float=1.0def__post_init__(self)->None:_validate_attribute_types_and_values(self)
classScalingOptionsDict(TypedDict):method:NotRequired[Literal["start_values","bounds"]]clipping_value:NotRequired[float]magnitude:NotRequired[float]defpre_process_scaling(scaling:bool|ScalingOptions|ScalingOptionsDict|None,)->ScalingOptions|None:"""Convert all valid types of scaling options to optimagic.ScalingOptions. This just harmonizes multiple ways of specifying scaling options into a single format. It performs runtime type checks, but it does not check whether scaling options are consistent with other option choices. Args: scaling: The user provided scaling options. Returns: The scaling options in the optimagic format. Raises: InvalidScalingError: If scaling options cannot be processed, e.g. because they do not have the correct type. """ifisinstance(scaling,bool):scaling=ScalingOptions()ifscalingelseNoneelifisinstance(scaling,ScalingOptions)orscalingisNone:passelse:try:scaling=ScalingOptions(**scaling)except(KeyboardInterrupt,SystemExit):raiseexceptExceptionase:ifisinstance(e,InvalidScalingError):raiseeraiseInvalidScalingError(f"Invalid scaling options of type: {type(scaling)}. Scaling options ""must be of type optimagic.ScalingOptions, a dictionary with a subset ""of the keys {'method', 'clipping_value', 'magnitude'}, None, or a ""boolean.")fromereturnscalingdef_validate_attribute_types_and_values(options:ScalingOptions)->None:ifoptions.methodnotin("start_values","bounds"):raiseInvalidScalingError(f"Invalid scaling method: {options.method}. Valid methods are ""'start_values' and 'bounds'.")if(notisinstance(options.clipping_value,int|float)oroptions.clipping_value<=0):raiseInvalidScalingError(f"Invalid clipping value: {options.clipping_value}. Clipping value ""must be a positive number.")ifnotisinstance(options.magnitude,int|float)oroptions.magnitude<=0:raiseInvalidScalingError(f"Invalid scaling magnitude: {options.magnitude}. Scaling magnitude ""must be a positive number.")