Skip to content

check_composition_clone_deep_clones_components

yohou.testing.check_composition_clone_deep_clones_components(compositor, descriptor)

Check clone(compositor) produces fresh same-type components.

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 a cloned component is the same instance or a different type.

Source Code

Source code in src/yohou/testing/contract.py
def check_composition_clone_deep_clones_components(compositor, descriptor: dict) -> None:
    """Check ``clone(compositor)`` produces fresh same-type components.

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

    Raises
    ------
    AssertionError
        If a cloned component is the same instance or a different type.

    """
    name = type(compositor).__name__
    attr = descriptor["attr"]
    cloned = clone(compositor)

    orig_entries = getattr(compositor, attr)
    cloned_entries = getattr(cloned, attr)
    assert len(orig_entries) == len(cloned_entries), f"{name}: clone() changed component count"

    for orig, cl in zip(orig_entries, cloned_entries, strict=True):
        orig_est, cl_est = orig[1], cl[1]
        if not isinstance(orig_est, BaseEstimator):
            continue  # 'passthrough'/None sentinels
        assert type(orig_est) is type(cl_est), f"{name}: component {orig[0]!r} changed type under clone()"
        assert orig_est is not cl_est, f"{name}: component {orig[0]!r} was not deep-cloned (same instance)"