Skip to content

check_composition_nested_param_addressable

yohou.testing.check_composition_nested_param_addressable(compositor, descriptor)

Check nested <name>__<param> get/set on a _BaseComposition.

get_params(deep=True) must expose the first component's parameters as <name>__<param>, and set_params(<name>__<param>=value) must round-trip.

Parameters

Name Type Description Default
compositor BaseEstimator

A _BaseComposition-based compositor instance.

required
descriptor dict

Carries the composition-attribute name under "attr".

required

Raises

Type Description
AssertionError

If the nested parameter is absent or does not round-trip.

Source Code

Source code in src/yohou/testing/contract.py
def check_composition_nested_param_addressable(compositor, descriptor: dict) -> None:
    """Check nested ``<name>__<param>`` get/set on a ``_BaseComposition``.

    ``get_params(deep=True)`` must expose the first component's parameters as
    ``<name>__<param>``, and ``set_params(<name>__<param>=value)`` must round-trip.

    Parameters
    ----------
    compositor : BaseEstimator
        A ``_BaseComposition``-based compositor instance.
    descriptor : dict
        Carries the composition-attribute name under ``"attr"``.

    Raises
    ------
    AssertionError
        If the nested parameter is absent or does not round-trip.

    """
    name = type(compositor).__name__
    attr = descriptor["attr"]
    comp_name, inner = _first_named_component(compositor, attr)

    inner_params = inner.get_params(deep=False)
    if not inner_params:
        return  # component exposes no params; nothing to address

    param = next(iter(inner_params))
    key = f"{comp_name}__{param}"

    deep = compositor.get_params(deep=True)
    assert key in deep, f"{name}: get_params(deep=True) missing nested key {key!r}"

    value = deep[key]
    compositor.set_params(**{key: value})
    round_tripped = compositor.get_params(deep=True)[key]
    assert _safe_equal(round_tripped, value), f"{name}: set_params({key}=...) did not round-trip"