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

import copy


[docs] def adjoint( transform, inout_datastore, controlvect, obsvect, mapper, di, df, mode, runsubdir, workdir, onlyinit=False, **kwargs ): """Broadcast the output sensitivity to all input tracers. The adjoint of summation: each input tracer gets a copy of the output sensitivity ``adj_out`` (since :math:`\\partial(\\sum x_i)/\\partial x_j = 1` for all :math:`j`). For sparse data, the ``parameter`` metadata field is updated to the input tracer name. Args: transform (Plugin): families instance. inout_datastore (dict): mutable datastore. controlvect: unused. obsvect: unused. mapper (dict): transform mapper. di (datetime): sub-simulation start date. df (datetime): unused. mode (str): ``'adj'``. runsubdir (str): unused. workdir (str): unused. onlyinit (bool): if ``True`` (non-sparse), return immediately. **kwargs: unused. """ trid_out = list(mapper["outputs"].keys())[0] xmod = inout_datastore["outputs"] # If sparse data, different treatment if mapper["outputs"][trid_out].get("sparse_data", False): for trid in mapper["inputs"]: inout_datastore["inputs"][trid][di] = \ copy.deepcopy(xmod[trid_out][di]) inout_datastore["inputs"][trid][di].loc[ :, ("metadata", "parameter") ] = trid[1].lower() return if onlyinit: return for trid in mapper["inputs"]: inout_datastore["inputs"][trid][di] = \ {k: xmod[trid_out][k] for k in xmod[trid_out]} if not onlyinit: inout_datastore["inputs"][trid][di]["adj_out"] = \ copy.deepcopy(xmod[trid_out][di]["adj_out"])