Source code for pycif.plugins.transforms.basic.families

"""
``families`` transform: aggregate multiple tracers into one by summation.

Sums a list of input tracers (``parameters_in``) to produce a single output
tracer (``parameter_out``):

.. math::

    y_{out} = \\sum_{i} x_{in,i}

A typical use case is grouping isotopologue species (e.g. ¹²CH₄ and ¹³CH₄)
into a total CH₄ field, or combining sectoral emission fluxes into a single
total flux field.

The adjoint broadcasts the output sensitivity back equally to every input
tracer (since :math:`\\partial y_{out} / \\partial x_{in,i} = 1`).

Both gridded (xarray) and sparse (observation-indexed DataFrame) data are
supported.  Ensemble (batch sampling) runs with ``__sample#N`` tracer
names are handled by routing each sample's inputs to the corresponding
output.
"""


from .forward import forward
from .adjoint import adjoint

_name = "families"
_fullname = "Tracer families or addition"

input_arguments = {
    "component": {
        "doc": "Component of the input tracers to be aggregated",
        "default": None,
        "accepted": str
    },
    "component_out": {
        "doc": "Component of the output tracer, if different from the input component.",
        "default": None,
        "optional": True,
        "accepted": str
    },
    "parameters_in": {
        "doc": "List of tracers to be aggregated.",
        "default": None,
        "accepted": list
    },
    "parameter_out": {
        "doc": "Name of the output tracer.",
        "default": None,
        "optional": True,
        "accepted": str
    }
}


[docs] def ini_mapper(transform, general_mapper={}, **kwargs): """Build the mapper for families. Declares one input entry per input tracer and one output entry for the aggregated tracer. Populates ``outputs2inputs`` for routing. An optional ``component_out`` overrides the output component name. Args: transform: families plugin instance (carries ``parameters_in``, ``parameter_out``, ``component``, and optionally ``component_out``). general_mapper (dict): unused. **kwargs: unused. Returns: dict: mapper with ``inputs``, ``outputs``, and ``outputs2inputs``. """ parameters_in = transform.parameters_in parameter_out = transform.parameter_out component = transform.component component_out = getattr(transform, "component_out", component) trid_out = (component_out, parameter_out) loc_outputs = { trid_out: {"force_loadin": True, "force_dump": False, "tracer_from_previous": True, # "sparse_data_from_previous": True, # "dates_from_previous": True } } loc_inputs = { (component, param): {"force_loadin": True, "force_dump": False} for param in parameters_in } mapper = {"inputs": loc_inputs, "outputs": loc_outputs} mapper["outputs2inputs"] = { trid_out: [(component, param) for param in parameters_in] } return mapper