Source code for pycif.plugins.transforms.system.fromcontrol.perturb_transform
from logging import debug
[docs]
def perturb_transform(self, nsamples, dir_samples, file_samples, transf_mapper):
# Just keep in memory that x should be perturbed
self.perturb_xb = True
self.nsamples = nsamples
self.dir_samples = dir_samples
self.file_samples = file_samples
# Update data vector to fit samples
datavect = self.controlvect.datavect
components = datavect.components
trid2clean = []
for trid in transf_mapper["outputs"]:
comp, trcr = trid
if "__sample#" not in trcr:
continue
trcr_ref = trcr.split("__sample#")[0]
component = getattr(components, comp)
if not hasattr(component, "parameters"):
raise KeyError(f"Component '{comp}' has no 'parameters' attribute. "
"Please check your yaml.")
params = component.parameters
if not hasattr(params, trcr_ref):
debug(f"Skipping tracer {trid} for 'fromcontrol' transfrom as "
f"{trcr_ref} is not in the 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 varname if not specified
if tracer_out.varname == "":
tracer_out.varname = trcr_ref
transf_mapper["outputs"][trid]["tracer"] = tracer_out
for trid in set(trid2clean):
comp, trcr = trid
component = getattr(components, comp)
params = component.parameters
params.attributes.remove(trcr)
delattr(params, trcr)