Source code for stride.optimisation.pipelines.steps.norm_field


import numpy as np

from .utils import name_from_op_name
from ....core import Operator


[docs] class NormField(Operator): """ Normalise a StructuredData object between -1 and +1. Parameters ---------- """ def __init__(self, **kwargs): super().__init__(**kwargs) self.global_norm = kwargs.pop('global_norm', False) self.norm_guess_change = kwargs.pop('norm_guess_change', 0.5) self.norm_value = None
[docs] def forward(self, field, **kwargs): variable = kwargs.pop('variable', None) global_norm = kwargs.pop('global_norm', self.global_norm) norm_guess_change = kwargs.pop('norm_guess_change', self.norm_guess_change) if self.norm_value is None or not global_norm: self.norm_value = np.max(np.abs(field.extended_data)) + 1e-31 # work out guess change based on field value if variable is not None: min_val = np.min(variable.extended_data) max_val = np.max(variable.extended_data) mid_val = (max_val + min_val) / 2.0 if variable.transform is not None: mid_val = variable.transform(mid_val) var_corr = mid_val * norm_guess_change / 100 else: var_corr = 1. out_field = field.alike(name=name_from_op_name(self, field)) out_field.extended_data[:] = field.extended_data out_field.extended_data[:] *= var_corr / self.norm_value return out_field
[docs] def adjoint(self, d_field, field, **kwargs): raise NotImplementedError('No adjoint implemented for step %s' % self.__class__.__name__)