diff --git a/nifty_core.py b/nifty_core.py index 2cb8223f8ef007bdfed633910ceecfa44e3af09f..f132391b272574e2691aa68bfcd1e2e12e23f5ef 100644 --- a/nifty_core.py +++ b/nifty_core.py @@ -484,7 +484,7 @@ class _about(object): ## nifty support class for global settings """ ## version - self._version = "0.5.7" + self._version = "0.5.9" ## switches and notifications self._errors = notification(default=True,ccode=notification._code) @@ -2186,7 +2186,7 @@ class rg_space(space): Only even numbers of grid points per axis are supported. The basis transformations between position `x` and Fourier mode `k` rely on (inverse) fast Fourier transformations using the - :math:`exp(2 \pi i k^\dagger x / N)`-formulation. + :math:`exp(2 \pi i k^\dagger x)`-formulation. Attributes ---------- @@ -7810,7 +7810,7 @@ class operator(object): x_ = x.transform(target=domain,overwrite=False) ## weight if ... if(not self.imp)and(not domain.discrete)and(not inverse): - x_ = x_.weight(power=1,overwrite=False) + x_ = x_.weight(power=1,overwrite=False) return x_ def _debriefing(self,x,x_,target,inverse): ## > evaluates x and x_ after `multiply` @@ -10124,13 +10124,13 @@ class response_operator(operator): domain : space The space wherein valid arguments live. sym : bool - Indicates whether the operator is self-adjoint or not + Indicates whether the operator is self-adjoint or not. uni : bool - Indicates whether the operator is unitary or not + Indicates whether the operator is unitary or not. imp : bool Indicates whether the incorporation of volume weights in multiplications is already implemented in the `multiply` - instance methods or not + instance methods or not. target : space The space wherein the operator output lives sigma : float @@ -10274,15 +10274,17 @@ class response_operator(operator): ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ def _multiply(self,x,**kwargs): ## > applies the operator to a given field - ## weight - if(self.domain.discrete)and(self.den): - x_ = self.domain.calc_weight(x.val,power=1) - elif(not self.domain.discrete)and(not self.den): - x_ = self.domain.calc_weight(x.val,power=-1) - else: - x_ = x.val +# ## weight ## TODO: remove in future version +# if(self.domain.discrete)and(self.den): +# x_ = self.domain.calc_weight(x.val,power=1) +# elif(not self.domain.discrete)and(not self.den): +# x_ = self.domain.calc_weight(x.val,power=-1) +# else: +# x_ = x.val +# ## smooth +# x_ = self.domain.calc_smooth(x_.val,sigma=self.sigma) ## smooth - x_ = self.domain.calc_smooth(x_,sigma=self.sigma) + x_ = self.domain.calc_smooth(x.val,sigma=self.sigma) ## mask x_ = self.mask*x_ ## assign @@ -10296,15 +10298,54 @@ class response_operator(operator): x_ = self.mask*x_ ## smooth x_ = self.domain.calc_smooth(x_,sigma=self.sigma) - ## weight - if(self.domain.discrete)and(self.den): - x_ = self.domain.calc_weight(x_,power=1) - elif(not self.domain.discrete)and(not self.den): - x_ = self.domain.calc_weight(x_,power=-1) +# ## weight ## TODO: remove in future version +# if(self.domain.discrete)and(self.den): +# x_ = self.domain.calc_weight(x_,power=1) +# elif(not self.domain.discrete)and(not self.den): +# x_ = self.domain.calc_weight(x_,power=-1) return x_ ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + def _briefing(self,x,domain,inverse): ## > prepares x for `multiply` + ## inspect x + if(not isinstance(x,field)): + x_ = field(domain,val=x,target=None) + else: + ## check x.domain + if(domain==x.domain): + x_ = x + ## transform + else: + x_ = x.transform(target=domain,overwrite=False) + ## weight if ... + if(not self.imp)and(not domain.discrete)and(not inverse)and(self.den): ## respect density + x_ = x_.weight(power=1,overwrite=False) + return x_ + + def _debriefing(self,x,x_,target,inverse): ## > evaluates x and x_ after `multiply` + if(x_ is None): + return None + else: + ## inspect x_ + if(not isinstance(x_,field)): + x_ = field(target,val=x_,target=None) + elif(x_.domain!=target): + raise ValueError(about._errors.cstring("ERROR: invalid output domain.")) + ## weight if ... + if(not self.imp)and(not target.discrete)and(not self.den^inverse): ## respect density + x_ = x_.weight(power=-1,overwrite=False) + ## inspect x + if(isinstance(x,field)): + ## repair ... + if(self.domain==self.target!=x.domain): + x_ = x_.transform(target=x.domain,overwrite=False) ## ... domain + if(x_.domain==x.domain)and(x_.target!=x.target): + x_.set_target(newtarget=x.target) ## ... codomain + return x_ + + ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + def __repr__(self): return "<nifty.response_operator>"