Source code for wield.control.fitting.SISO.v2.arguments.ranges

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: © 2021 Massachusetts Institute of Technology.
# SPDX-FileCopyrightText: © 2021 Lee McCuller <mcculler@caltech.edu>
# NOTICE: authors should document their contributions in concisely in NOTICE
# with details inline in source files, comments, and docstrings.
"""
"""
from wield.bunch import Bunch

from .base import (
    ArgumentError,
    mapcheck_positive_float_orNone,
    mapcheck_positive_float,
    mapcheck_int_orNone,
    mapcheck_positive_int_orNone,
)


[docs] def mapcheck_reldeg(aid, aname, val): val = mapcheck_int_orNone(aid, aname, val) if val is None: return val ival = int(val) if ival != float(val): raise ArgumentError("argument '{}' must be an integer".format(aname)) if aname == "relative_degree_min": rdmax = aid.hint("relative_degree_max") if rdmax is not None and val > rdmax: raise ArgumentError( "argument 'relative_degree_min'={} must be smaller" " or equal to 'relative_degree_max'={}".format(val, rdmax) ) return val
[docs] def default_reldeg_minmax(aid, aname): val = aid.hint("relative_degree") return val
[docs] def default_delay_s(aid, aname): val_min = aid.hint("delay_s_min") val_max = aid.hint("delay_s_max") if val_max is not None: if val_min < 0: if val_max > 0: val = 0 else: val = val_max else: val = val_min else: val = val_min return val
[docs] def mapcheck_delay_s(aid, aname, val): val = float(val) val_min = aid.hint("delay_s_min") val_max = aid.hint("delay_s_max") if val < val_min: raise ArgumentError( ("Argument 'delay_s'={} must be larger than 'delay_s_min'={}").format( val, val_min ) ) if val_max is not None: if val > val_max: raise ArgumentError( ("Argument 'delay_s'={} must be larger than 'delay_s_max'={}").format( val, val_max ) ) elif val > val_min: raise ArgumentError( ( "Argument 'delay_s' must be equal to 'delay_s_min' since" " 'delay_s_max' is not specified. Either specify 'delay_s_max'" " or don't specify 'delay_s', in which case it will default to 'delay_s_min'." ).format(val, val_min) ) return val
[docs] def mapcheck_total_degree_min(aid, aname, val): val = mapcheck_positive_int_orNone(aid, aname, val) if val is None: return val val = int(val) if val < 0: raise ArgumentError("Argument '{}'=val must not be negative".format(aname, val)) return val
kw_hints = Bunch( relative_degree=dict( APgroup="order", APpriority=10, mapcheck=mapcheck_reldeg, default=None, about=""" Sets the initial relative degree (number zeros minus polse). Defaults to None, which will be the midpoint of the min and max if they are specified, otherwise this will default to 0, which typically will still fit filters to the correct degree. If constrained to be different than the data, the filter will enter the asymptotic regime set by the relative degree within 2x of the 'root_bandwidth_Hz_max' setting. """, ), relative_degree_max=dict( APgroup="order", APpriority=11, mapcheck=mapcheck_reldeg, default=default_reldeg_minmax, require_hints=["relative_degree"], about=""" Maximum value for the filter relative degree (number zeros minus polse). Defaults to the relative degree (which may be None). If this value is None, the degree is unconstrained and the fit will land at some degree that fits well. """, ), relative_degree_min=dict( APgroup="order", APpriority=12, mapcheck=mapcheck_reldeg, default=default_reldeg_minmax, require_hints=[ "relative_degree", # needed for the ordering check "relative_degree_max", ], about=""" Minimum value for the filter relative degree (number zeros minus polse). Defaults to the relative degree (which may be None). If this value is None, the degree is unconstrained and the fit will land at some degree that fits well. """, ), total_degree_min=dict( APgroup="order", APpriority=13, mapcheck=mapcheck_total_degree_min, default=2, aliases=[ "degree_min", ], about=""" Minimum degree to search through during the successive order reduction phase. Defaults to 2. If None, then successive reduction will not be performed. """, ), delay_s=dict( APgroup="delay", APpriority=16, mapcheck=mapcheck_delay_s, default=default_delay_s, aliases=["delay_seconds"], aliases_bad=["delay"], require_hints=[ "delay_s_min", "delay_s_max", ], about=""" Use this delay (in seconds) for the initial fitting up until the "baseline" fit determination is complete. By default this is the same as delay_s_min, unless delay_s_min is negative, in which case it defaults to the smaller of 0 seconds or delay_s_max. """, ), delay_s_max=dict( APgroup="delay", APpriority=15, mapcheck=mapcheck_positive_float_orNone, default=None, aliases=["delay_max_s"], aliases_bad=["delay_max"], about=""" The maximum delay in seconds. Defaults to None, in which case delay is never fit as a free parameter. """, ), delay_s_min=dict( APgroup="delay", APpriority=17, mapcheck=mapcheck_positive_float, default=0, aliases=["delay_min_s"], aliases_bad=["delay_min"], about=""" The minimum delay in seconds. Defaults to 0. Also sets the typical default value of the delay used for the initial part of the fits. Must always be specified (cannot be None). """, ), )