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"])