Source code for pycif.plugins.transforms.system.toobsvect.perturb_transform
import copy
from logging import debug
import numpy as np
[docs]
def perturb_transform(self, nsamples, dir_samples, file_samples, transf_mapper):
obsvect = self.obsvect
datavect = obsvect.datavect
components = datavect.components
# Save original dimension
if not hasattr(obsvect, "dim_ref"):
obsvect.dim_ref = obsvect.dim
# Update data vector to fit samples
trid2clean = []
nmembers = 0
for trid in transf_mapper["inputs"]:
comp = trid[0]
trcr = trid[1]
if "__sample#" not in trcr:
continue
trcr_ref = trcr.split("__sample#")[0]
member_ID = int(trcr.split("__sample#")[1])
nmembers = max(nmembers, member_ID)
component = getattr(components, comp)
params = component.parameters
if not hasattr(params, trcr_ref):
debug(
f"Skipping {trid} for 'tooobsvect' as {trcr_ref} "
"is not in datavect"
)
continue
tracer = getattr(params, trcr_ref)
params.attributes.append(trcr)
trid2clean.append((comp, trcr_ref))
# Copy tracer
tracer_out = tracer.__class__(plg_orig=tracer)
setattr(params, trcr, tracer_out)
# Update tracer pointer
tracer_out.ypointer = tracer.ypointer + member_ID * obsvect.dim
# Update tracer datastore
tracer_out.datastore = copy.deepcopy(tracer_out.datastore)
if tracer_out.datastore["metadata"]["parameter"].dtype == 'category':
tracer_out.datastore.loc[:, ("metadata", "parameter")] = \
tracer_out.datastore["metadata"]["parameter"].cat.add_categories(
trcr)
tracer_out.datastore.loc[
tracer_out.datastore["metadata"]["parameter"] == trcr_ref,
("metadata", "parameter")] = trcr
# Update obsvect dimension and data
obsvect.dim = (nmembers + 1) * obsvect.dim_ref
# Extend data according to new dimension
for data_id in ["dy", "ysim", "yobs", "yobs_err", "obsvect_mask"]:
setattr(obsvect, data_id,
np.tile(getattr(obsvect, data_id),
nmembers + 1))
# Removing non-perturbed tracers
for trid in set(trid2clean):
comp = trid[0]
trcr = trid[1]
component = getattr(components, comp)
params = component.parameters
params.attributes.remove(trcr)
delattr(params, trcr)