Source code for pycif.plugins.transforms.basic.families.forward
import numpy as np
import copy
[docs]
def forward(
transform,
inout_datastore,
controlvect,
obsvect,
mapper,
di,
df,
mode,
runsubdir,
workdir,
onlyinit=False,
**kwargs
):
trids_in = list(mapper["inputs"].keys())
trids_out = list(mapper["outputs"].keys())
xmod_in = inout_datastore["inputs"]
xmod_out = inout_datastore["outputs"]
# Retrieve reference configuration if batch sampling
trids_in_ref = list(set(
[(trid[0], trid[1].split("__sample#")[0]) for trid in trids_in]))
trids_out_ref = list(set(
[(trid[0], trid[1].split("__sample#")[0]) for trid in trids_out]))
# Build matching dictionary between inputs and outputs
# depending on batch sampling or not
inputs2outputs_map = {}
for trid_out in trids_out:
# If trid_out in trids_out_ref, means that unperturbed
if trid_out in trids_out_ref:
inputs2outputs_map[trid_out] = trids_in_ref[:]
continue
sample_id = trid_out[1].split("__sample#")[1]
inputs2outputs_map[trid_out] = [
trid_in if trid_in in trids_in
else (trid_in[0], f"{trid_in[1]}__sample#{sample_id}")
for trid_in in trids_in_ref
]
keys = ["spec"]
if mode == "tl":
keys.append("incr")
# Run the main code for all group of samples
for trid_out in trids_out:
trids_in_tmp = inputs2outputs_map[trid_out]
# If sparse data, different treatment
if mapper["outputs"][trid_out].get("sparse_data", False):
if onlyinit:
return
inif = "yes"
# Copy outputs from first inputs
inout_datastore["outputs"][trid_out][di] = copy.deepcopy(
xmod_in[trids_in_tmp[0]][di]
)
for k in keys:
inout_datastore["outputs"][trid_out][di].loc[:, ("maindata", k)] = \
np.sum([
xmod_in[trid_in][di].loc[:, ("maindata", k)].values
for trid_in in trids_in_tmp
], axis=0)
return
xmod_out[trid_out][di] = {k: 0 for k in keys}
for trid_in in trids_in_tmp:
for k in keys:
if k in xmod_in[trid_in][di]:
xmod_out[trid_out][di][k] += xmod_in[trid_in][di][k]
for k in xmod_in[trid_in][di]:
if k not in keys:
xmod_out[trid_out][di][k] = xmod_in[trid_in][di][k]