From 609a3408c1c6587728f90d16407f57a4a433ba55 Mon Sep 17 00:00:00 2001 From: jdcpni Date: Fri, 31 Jan 2025 23:25:07 -0500 Subject: [PATCH] =?UTF-8?q?=E2=80=A2=20transferfunctions.py:=20=20=20-=20r?= =?UTF-8?q?ename=20bounds=20->=20range=20=20=20-=20add=20DeterministicTran?= =?UTF-8?q?sferFunction=20subclass=20of=20TransferFunction:=20=20=20=20=20?= =?UTF-8?q?-=20scale=20and=20offset=20Parameters=20used=20by=20all=20subcl?= =?UTF-8?q?asses=20=20=20=20=20-=20add=20=5Frange=5Fsetter()=20that=20adju?= =?UTF-8?q?sts=20range=20based=20on=20scale=20and/or=20offset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- psyneulink/core/components/component.py | 2 +- .../nonstateful/selectionfunctions.py | 2 - .../nonstateful/transferfunctions.py | 130 +++++++----------- .../nonstateful/transformfunctions.py | 3 - .../processing/transfermechanism.py | 31 +++-- tests/log/test_log.py | 28 ++-- 6 files changed, 77 insertions(+), 119 deletions(-) diff --git a/psyneulink/core/components/component.py b/psyneulink/core/components/component.py index 4172fd7c4b..1335ffb328 100644 --- a/psyneulink/core/components/component.py +++ b/psyneulink/core/components/component.py @@ -1484,7 +1484,7 @@ def _get_compilation_params(self): "control_signal", "competition", "has_recurrent_input_port", "enable_learning", "enable_output_type_conversion", "changes_shape", - "output_type", "bounds", "internal_only", + "output_type", "range", "internal_only", "require_projection_in_composition", "default_input", "shadow_inputs", "compute_reconfiguration_cost", "reconfiguration_cost", "net_outcome", "outcome", diff --git a/psyneulink/core/components/functions/nonstateful/selectionfunctions.py b/psyneulink/core/components/functions/nonstateful/selectionfunctions.py index defd01e050..dcb57745d6 100644 --- a/psyneulink/core/components/functions/nonstateful/selectionfunctions.py +++ b/psyneulink/core/components/functions/nonstateful/selectionfunctions.py @@ -218,8 +218,6 @@ class OneHot(SelectionFunction): function. Values specified for parameters in the dictionary override any assigned to those parameters in arguments of the constructor. - bounds : None - owner : Component `component ` to which to assign the Function. diff --git a/psyneulink/core/components/functions/nonstateful/transferfunctions.py b/psyneulink/core/components/functions/nonstateful/transferfunctions.py index 37d8230305..5533cfee1d 100644 --- a/psyneulink/core/components/functions/nonstateful/transferfunctions.py +++ b/psyneulink/core/components/functions/nonstateful/transferfunctions.py @@ -40,7 +40,7 @@ Standard Attributes ~~~~~~~~~~~~~~~~~~~ -All TransferFunctions have a `bounds ` attribute that specifies the lower and upper limits +All TransferFunctions have a `range ` attribute that specifies the lower and upper limits of the function's result. For some subclasses, this may be modified by other parameters. In addition, all TransferFunctions have a pair of modulable parameters as described below. @@ -115,22 +115,22 @@ 'Linear', 'Logistic', 'ReLU', 'SoftMax', 'Tanh', 'TransferFunction', 'TransferWithCosts' ] -def _bounds_getter_using_scale_and_offset(owning_component=None, context=None): - """Reassign bounds based on scale and offset applied to function's output for default upper and lower bounds +def _range_getter_using_scale_and_offset(owning_component=None, context=None): + """Reassign range based on scale and offset applied to function's default_range """ - default_bounds = owning_component.default_bounds + default_range = owning_component.default_range scale = owning_component.parameters.scale._get(context) offset = owning_component.parameters.offset._get(context) # Deal with lower bound = None: - lower_bound = -np.inf if default_bounds[0] is None else default_bounds[0] + lower_bound = -np.inf if default_range[0] is None else default_range[0] output_for_fct_lower_bound = scale * lower_bound + offset # Deal with upper bound = None: - upper_bound = np.inf if default_bounds[1] is None else default_bounds[1] + upper_bound = np.inf if default_range[1] is None else default_range[1] output_for_fct_upper_bound = scale * upper_bound + offset - # Need to do this since scale could be negative, reversing upper and lower bounds: + # Need to do this since scale could be negative, reversing upper and lower range: lower_bound = min(output_for_fct_lower_bound, output_for_fct_upper_bound) upper_bound = max(output_for_fct_lower_bound, output_for_fct_upper_bound) @@ -149,11 +149,14 @@ class TransferFunction(Function_Base): Attributes ---------- - bounds : tuple(lower bound: float, uppper bound: float) + range : tuple(lower bound: float, uppper bound: float) read-only Parameter that indicates the lower and upper limits of the function's result. The two items of the - tuple indicate the lower and upper bounds, respectively, with `None` as the entry if there is no bound. Some - subclasses of TransferFunction may have other Parameters that influence the bounds, which are described under - the `bounds ` attribute of the relevant subclass. + tuple indicate the lower and upper bounds of range, respectively, with `None` as the entry if there are no + bounds. Some subclasses of TransferFunction may have other Parameters that influence the range, which are + described under the `range ` attribute of the relevant subclasses. + + default_range : tuple(lower bound: float, uppper bound: float) + class attribute that indicates the upper and lower limits of the Function's result. """ componentType = TRANSFER_FUNCTION_TYPE @@ -163,14 +166,14 @@ class Parameters(Function_Base.Parameters): Attributes ---------- - bounds - see `bounds ` + range + see `range ` :default value: (None, None) :type: """ - bounds = Parameter((None,None), read_only=True) + range = Parameter((None,None), read_only=True) def _gen_llvm_function_body(self, ctx, builder, params, state, arg_in, arg_out, *, tags:frozenset): assert isinstance(arg_in.type.pointee, pnlvm.ir.ArrayType) @@ -199,16 +202,19 @@ class DeterministicTransferFunction(TransferFunction): In addition to the `standard attributes ` of a TransferFunction, all DeterministicTransferFunctions have a `scale ` and `offset - ` Parameter, that are used to determine the `bounds ` + ` Parameter, that are used to determine the `range ` Attributes ---------- - bounds : tuple(lower bound: float, uppper bound: float) - read-only Parameter that indicates the lower and upper limits of the function's result, after the `scale + default_range : tuple(lower bound: float, uppper bound: float) + class attribute that indicates the upper and lower limits of the Function's result, before `scale + ` or `offset ` are applied. + + range : tuple(lower bound: float, uppper bound: float) + read-only Parameter that indicates the lower and upper limits of the Function's result, after the `scale ` and `offset ` Parameters - have been applied to the result of the function: :math:`result(lower, upper) * scale + offset`, where - result(lower, upper) is given by the default values of the `bounds ` attribute. + have been applied to the Function's default_range: :math:`default_range(lower, upper) * scale + offset`. scale : float determines the value by which the result of the function is multiplied, before `offset @@ -225,8 +231,8 @@ class Parameters(TransferFunction.Parameters): Attributes ---------- - bounds - see `bounds ` + range + see `range ` :default value: None :type: @@ -243,25 +249,13 @@ class Parameters(TransferFunction.Parameters): :default value: 0.0 :type: float """ - bounds = Parameter((None, None), - getter=_bounds_getter_using_scale_and_offset, + range = Parameter((None, None), + getter=_range_getter_using_scale_and_offset, read_only=True, dependencies={'scale', 'offset'}) scale = Parameter(1.0, modulable=True) offset = Parameter(0.0, modulable=True) - # # MODIFIED 1/29/25 OLD: - # @check_user_specified - # def __init__(self, - # offset: Optional[ValidParamSpecType] = None, - # scale: Optional[ValidParamSpecType] = None, - # **kwargs): - # - # super().__init__(offset=offset, - # scale=scale, - # **kwargs) - # # MODIFIED 1/29/25 END - # ********************************************************************************************************************** # Identity @@ -328,7 +322,7 @@ class Identity(DeterministicTransferFunction): # PREFERENCE_SET_NAME: 'IdentityClassPreferences', REPORT_OUTPUT_PREF: PreferenceEntry(False, PreferenceLevel.INSTANCE), } - default_bounds = (None, None) + default_range = (None, None) @check_user_specified @beartype @@ -475,7 +469,7 @@ class Linear(DeterministicTransferFunction): # value added to each element of `variable ` after applying the `slope ` (if it is specified). - bounds : (None, None) + range : (None, None) modified by `scale and/or `offset ` if they are specified. scale : float @@ -506,7 +500,7 @@ class Linear(DeterministicTransferFunction): # _model_spec_class_name_is_generic = True - default_bounds = (None, None) + default_range = (None, None) class Parameters(DeterministicTransferFunction.Parameters): """ @@ -766,7 +760,7 @@ class Exponential(DeterministicTransferFunction): # --------------------------- value added to `variable ` after multiplying by `rate ` and before exponentiation; assigned as *ADDITIVE_PARAM* of the Exponential Function. - bounds : (0, None) + range : (0, None) modified by `scale and/or `offset ` if they are specified. scale : float @@ -790,7 +784,7 @@ class Exponential(DeterministicTransferFunction): # --------------------------- """ componentName = EXPONENTIAL_FUNCTION - default_bounds = (0, None) + default_range = (0, None) class Parameters(DeterministicTransferFunction.Parameters): @@ -1034,7 +1028,7 @@ class Logistic(DeterministicTransferFunction): # ------------------------------ value to add to each element of `variable ` before applying `gain `; this argument has an effect identical to bias, but with the opposite sign (see `note ` above). - bounds : (0, 1) + range : (0, 1) modified by `scale and/or `offset ` if they are specified. scale : float @@ -1060,7 +1054,7 @@ class Logistic(DeterministicTransferFunction): # ------------------------------ componentName = LOGISTIC_FUNCTION # parameter_keywords.update({GAIN, BIAS}) _model_spec_class_name_is_generic = True - default_bounds = (0, 1) + default_range = (0, 1) class Parameters(DeterministicTransferFunction.Parameters): @@ -1346,7 +1340,7 @@ class Tanh(DeterministicTransferFunction): # ---------------------------------- value subtracted from each element of `variable ` before applying the `gain ` (if it is specified). This attribute is identical to bias, with the opposite sign. - bounds : (None, None) + range : (None, None) modified by `scale and/or `offset ` if they are specified. scale : float @@ -1370,7 +1364,7 @@ class Tanh(DeterministicTransferFunction): # ---------------------------------- componentName = TANH_FUNCTION # parameter_keywords.update({GAIN, BIAS, OFFSET}) - default_bounds = (-1, 1) + default_range = (-1, 1) class Parameters(DeterministicTransferFunction.Parameters): @@ -1641,7 +1635,7 @@ class ReLU(DeterministicTransferFunction): # ---------------------------------- leak : float : default 0.0 scaling factor between 0 and 1 when (variable - bias) is less than or equal to 0. - bounds : (None, None) + range : (None, None) modified by `scale and/or `offset ` if they are specified. scale : float : default 1.0 @@ -1665,7 +1659,7 @@ class ReLU(DeterministicTransferFunction): # ---------------------------------- componentName = RELU_FUNCTION # parameter_keywords.update({GAIN, BIAS, LEAK}) - default_bounds = (None, None) + default_range = (None, None) class Parameters(DeterministicTransferFunction.Parameters): @@ -1917,7 +1911,7 @@ class Gaussian(DeterministicTransferFunction): # ------------------------------ bias : float : default 0.0 value added to each element of `variable ` before applying the Gaussian transform. - bounds : (None, None) + range : (None, None) modified by `scale and/or `offset ` if they are specified. scale : float @@ -1942,7 +1936,7 @@ class Gaussian(DeterministicTransferFunction): # ------------------------------ componentName = GAUSSIAN_FUNCTION # parameter_keywords.update({STANDARD_DEVIATION, BIAS, SCALE, OFFSET}) - default_bounds = (None, None) + default_range = (None, None) class Parameters(TransferFunction.Parameters): """ @@ -2238,7 +2232,7 @@ class Parameters(TransferFunction.Parameters): offset = Parameter(0.0, modulable=True) random_state = Parameter(None, loggable=False, getter=_random_state_getter, dependencies='seed') seed = Parameter(DEFAULT_SEED(), modulable=True, fallback_default=True, setter=_seed_setter) - bounds = (None, None) + range = (None, None) @check_user_specified @beartype @@ -2462,7 +2456,7 @@ class Parameters(TransferFunction.Parameters): p = Parameter(0.5, modulable=True, aliases=[MULTIPLICATIVE_PARAM]) random_state = Parameter(None, loggable=False, getter=_random_state_getter, dependencies='seed') seed = Parameter(DEFAULT_SEED(), modulable=True, fallback_default=True, setter=_seed_setter) - bounds = (None, None) + range = (None, None) @check_user_specified @beartype @@ -2959,7 +2953,7 @@ class SoftMax(TransferFunction): for 2d variables, determines whether the SoftMax function is applied to the entire variable (per_item = False), or applied to each item in the variable separately (per_item = True). - bounds : None if `output ` in {ARG_MAX, MAX_VAL}, else (0, 1) : default (0, 1) + range : None if `output ` in {ARG_MAX, MAX_VAL}, else (0, 1) : default (0, 1) owner : Component `component ` to which the Function has been assigned. @@ -3006,8 +3000,8 @@ class Parameters(TransferFunction.Parameters): :default value: 0.1 :type: ``float`` - bounds - see `bounds ` + range + see `range ` :default value: (0, 1) :type: @@ -3042,7 +3036,7 @@ class Parameters(TransferFunction.Parameters): adapt_scale = Parameter(1.0, modulable=True) adapt_base = Parameter(1.0, modulable=True) adapt_entropy_weighting = Parameter(0.95, modulable=True) - bounds = (0, 1) + range = (0, 1) output = ALL per_item = Parameter(True, pnl_internal=True) one_hot_function = Parameter(None, stateful=False, loggable=False) @@ -4460,13 +4454,6 @@ def _function(self, # Compute current intensity intensity = self.parameters.transfer_fct._get(context)(variable, context=context) - # # MODIFIED 1/29/25 OLD: - # # Apply scale and offset to current intensity (which is value returned by function) - # scale = self.parameters.scale._get(context) - # offset = self.parameters.offset._get(context) - # intensity = scale * intensity + offset - # MODIFIED 1/29/25 END - # THEN, DEAL WITH COSTS # Note: only compute costs that are enabled; others are left as None, or with their value when last enabled. @@ -4525,16 +4512,7 @@ def _is_identity(self, context=None, defaults=False): else: enabled_cost_functions = self.parameters.enabled_cost_functions.get(context) - # MODIFIED 1/29/25 OLD: return transfer_fct._is_identity(context, defaults=defaults) and enabled_cost_functions == CostFunctions.NONE - # MODIFIED 1/29/25 NEW: - # return ( - # transfer_fct._is_identity(context, defaults=defaults) - # and self.parameters.scale.get(context) == 1.0 - # and self.parameters.offset.get(context) == 0.0 - # and enabled_cost_functions == CostFunctions.NONE - # ) - # MODIFIED 1/29/25 END @beartype def assign_costs(self, cost_functions: Union[CostFunctions, list], execution_context=None): @@ -4660,18 +4638,6 @@ def _gen_llvm_function_body(self, ctx, builder, params, state, arg_in, arg_out, trans_out = arg_out builder.call(trans_f, [trans_p, trans_s, trans_in, trans_out]) - # # MODIFIED 1/29/25 NEW: - # # apply scale and offset - # scale_ptr = ctx.get_param_or_state_ptr(builder, self, SCALE, param_struct_ptr=params) - # offset_ptr = ctx.get_param_or_state_ptr(builder, self, OFFSET, param_struct_ptr=params) - # scale = pnlvm.helpers.load_extract_scalar_array_one(builder, scale_ptr) - # offset = pnlvm.helpers.load_extract_scalar_array_one(builder, offset_ptr) - # # trans_out = pnlvm.helpers.load_extract_scalar_array_one(builder, trans_out) - # # trans_out = builder.fmul(trans_out, scale) - # # trans_out = builder.fadd(trans_out, offset) - # # builder.store(builder.load(trans_out), trans_out) - # # MODIFIED 1/29/25 END - intensity_ptr = ctx.get_state_space(builder, self, state, self.parameters.intensity) costs = [(self.parameters.intensity_cost_fct, CostFunctions.INTENSITY, self.parameters.intensity_cost), diff --git a/psyneulink/core/components/functions/nonstateful/transformfunctions.py b/psyneulink/core/components/functions/nonstateful/transformfunctions.py index fd0e2f2022..4187376ff5 100644 --- a/psyneulink/core/components/functions/nonstateful/transformfunctions.py +++ b/psyneulink/core/components/functions/nonstateful/transformfunctions.py @@ -1735,8 +1735,6 @@ class MatrixTransform(TransformFunction): # ----------------------------------- be used if `variable ` is a scalar (i.e., has only one element), and **operation** is set to *L0* (since it is not needed, and can produce a divide by zero error). - bounds : None - params : Dict[param keyword: param value] : default None a `parameter dictionary ` that specifies the parameters for the function. Values specified for parameters in the dictionary override any assigned to those parameters in @@ -1823,7 +1821,6 @@ class Parameters(TransformFunction.Parameters): matrix = Parameter(None, modulable=True, mdf_name='B') operation = Parameter(DOT_PRODUCT, stateful=False) normalize = Parameter(False) - bounds = None @check_user_specified @beartype diff --git a/psyneulink/core/components/mechanisms/processing/transfermechanism.py b/psyneulink/core/components/mechanisms/processing/transfermechanism.py index e6a6fe06f8..5254fcf804 100644 --- a/psyneulink/core/components/mechanisms/processing/transfermechanism.py +++ b/psyneulink/core/components/mechanisms/processing/transfermechanism.py @@ -477,7 +477,7 @@ after the TransferMechanism has been constructed must be done to its base value (see `ModulatorySignal_Modulation` for additional information). -Finally, `clipping ` can also be used to cap the result to within specified bounds:: +Finally, `clipping ` can also be used to cap the result to within specified range:: >>> my_linear_tm.clip = (.5, 1.2) >>> my_linear_tm.execute([1.0, 1.0, 1.0]) @@ -487,7 +487,7 @@ >>> my_linear_tm.execute([1.0, 1.0, 1.0]) array([[0.5 , 1.01316799, 1.2 ]]) -Note that the bounds specified in **clip** apply to all elements of the result if it is an array. +Note that the range specified in **clip** applies to all elements of the result if it is an array. .. _TransferMechanism_Examples_Execution_With_Integration: @@ -909,19 +909,19 @@ def _clip_setter(value, owning_component=None, context=None): if (value is not None and owning_component.function - and hasattr(owning_component.function, 'bounds') - and owning_component.function.bounds is not None - and isinstance(owning_component.function.bounds, tuple) - and owning_component.function.bounds != (None, None)): - bounds = owning_component.function.bounds - if bounds[0] is None: + and hasattr(owning_component.function, 'range') + and owning_component.function.range is not None + and isinstance(owning_component.function.range, tuple) + and owning_component.function.range != (None, None)): + range = owning_component.function.range + if range[0] is None: lower_bound = -np.inf else: - lower_bound = bounds[0] - if bounds[1] is None: + lower_bound = range[0] + if range[1] is None: upper_bound = np.inf else: - upper_bound = bounds[1] + upper_bound = range[1] if value[0] is None: lower_clip = -np.inf else: @@ -1065,9 +1065,10 @@ class TransferMechanism(ProcessingMechanism_Base): maximum value is set to the value of clip that it exceeds. If either item is `None`, no clipping is performed for that item. If the `function ` returns an array, the clip is applied elementwise (i.e., the clip is applied to each element of the array independently). If either item is outside - the interval of the function's `bounds ` after its `scale ` and - `offset ` have been applied (i.e., :math:`function.bounds(lower,upper) * scale + - offset`), a warning is issued and that item of the clip is ignored. + the interval of the function's `range ` Parameter after its `scale + ` and `offset ` Parameters have been applied (i.e., + :math:`function.range(lower,upper) * scale + offset`), a warning is issued and the corresponding items of + clip are ignored. integrator_mode : bool determines whether the TransferMechanism uses its `integrator_function ` @@ -1540,7 +1541,7 @@ def _instantiate_attributes_after_function(self, context=None): self.parameters.value.history_min_length = self._termination_measure_num_items_expected - 1 - # Force call to _clip_setter in order to check against bounds (now that any function bounds are known) + # Force call to _clip_setter in order to check against range (now that any function range are known) if self.clip is not None: self.clip = self.clip diff --git a/tests/log/test_log.py b/tests/log/test_log.py index 1fd372c6bb..0f357e5400 100644 --- a/tests/log/test_log.py +++ b/tests/log/test_log.py @@ -21,7 +21,7 @@ def test_log(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -62,7 +62,7 @@ def test_log(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -97,7 +97,6 @@ def test_log(self): assert PJ.loggable_items == { 'execute_until_finished': 'OFF', 'exponent': 'OFF', - 'func_bounds': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_matrix': 'OFF', @@ -128,7 +127,7 @@ def test_log(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -167,7 +166,7 @@ def test_log(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -202,7 +201,6 @@ def test_log(self): assert PJ.loggable_items == { 'execute_until_finished': 'OFF', 'exponent': 'OFF', - 'func_bounds': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_matrix': 'OFF', @@ -293,7 +291,7 @@ def test_log_dictionary_without_time(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -332,7 +330,7 @@ def test_log_dictionary_without_time(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -367,7 +365,6 @@ def test_log_dictionary_without_time(self): assert PJ.loggable_items == { 'execute_until_finished': 'OFF', 'exponent': 'OFF', - 'func_bounds': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_matrix': 'OFF', @@ -402,7 +399,7 @@ def test_log_dictionary_without_time(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -441,7 +438,7 @@ def test_log_dictionary_without_time(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -476,7 +473,6 @@ def test_log_dictionary_without_time(self): assert PJ.loggable_items == { 'execute_until_finished': 'OFF', 'exponent': 'OFF', - 'func_bounds': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_matrix': 'OFF', @@ -568,7 +564,7 @@ def test_log_dictionary_with_time(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -607,7 +603,7 @@ def test_log_dictionary_with_time(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -651,7 +647,7 @@ def test_log_dictionary_with_time(self): 'clip': 'OFF', 'termination_threshold': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF', @@ -695,7 +691,7 @@ def test_log_dictionary_with_time(self): 'termination_threshold': 'OFF', 'execute_until_finished': 'OFF', 'func_additive_param': 'OFF', - 'func_bounds': 'OFF', + 'func_range': 'OFF', 'func_execute_until_finished': 'OFF', 'func_has_initializers': 'OFF', 'func_intercept': 'OFF',