diff --git a/nifty_core.py b/nifty_core.py index 9593b7a92548e56d55700d9fcefd11abdeaec242..b17c8d4ed6eae6cb9efc184d926fda4f1ec92194 100644 --- a/nifty_core.py +++ b/nifty_core.py @@ -163,7 +163,7 @@ import powerspectrum as gp pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679 -__version__ = "0.9.5" +__version__ = "0.9.6" ##----------------------------------------------------------------------------- @@ -10429,11 +10429,11 @@ class response_operator(operator): for ii in xrange(np.size(assign,axis=1)): if(np.any(assign[:,ii]>=self.domain.dim(split=True)[ii]))or(np.any(assign[:,ii]<-self.domain.dim(split=True)[ii])): raise IndexError(about._errors.cstring("ERROR: invalid bounds.")) - self.assign = assign.T ## transpose + self.assign = assign ## transpose if(target is None): ## set target - target = point_space(np.size(assign,axis=0),datatype=self.domain.datatype) + target = point_space(np.size(self.assign,axis=0),datatype=self.domain.datatype) else: ## check target if(not isinstance(target,space)): @@ -10442,8 +10442,8 @@ class response_operator(operator): raise ValueError(about._errors.cstring("ERROR: continuous codomain.")) ## discrete(!) elif(np.size(target.dim(split=True))!=1): raise ValueError(about._errors.cstring("ERROR: structured codomain.")) ## unstructured(!) - elif(np.size(assign,axis=0)!=target.dim(split=False)): - raise ValueError(about._errors.cstring("ERROR: dimension mismatch ( "+str(np.size(assign,axis=0))+" <> "+str(target.dim(split=False))+" ).")) + elif(np.size(self.assign,axis=0)!=target.dim(split=False)): + raise ValueError(about._errors.cstring("ERROR: dimension mismatch ( "+str(np.size(self.assign,axis=0))+" <> "+str(target.dim(split=False))+" ).")) self.target = target ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -10493,13 +10493,14 @@ class response_operator(operator): ## mask x_ *= self.mask ## assign - #return x_[self.assign.tolist()] - return field(self.target,val=x_[self.assign.tolist()],target=kwargs.get("target",None)) + #return x_[self.assign.T.tolist()] + return field(self.target,val=x_[self.assign.T.tolist()],target=kwargs.get("target",None)) def _adjoint_multiply(self,x,**kwargs): ## > applies the adjoint operator to a given field x_ = np.zeros(self.domain.dim(split=True),dtype=self.domain.datatype,order='C') ## assign (transposed) - x_[self.assign.tolist()] += x.val.flatten(order='C') + for ii in xrange(np.size(self.assign,axis=0)): + x_[np.array([self.assign[ii]]).T.tolist()] += x[ii] ## mask x_ *= self.mask ## smooth diff --git a/nifty_tools.py b/nifty_tools.py index 582fdee054f3422aa4173d1e249f0d8d7527c510..a8fee8a49c0359e1f9eec970a7431c4581bd0bcb 100644 --- a/nifty_tools.py +++ b/nifty_tools.py @@ -1006,6 +1006,8 @@ class steepest_descent(object): self.c = c ## 0 < c1 < c2 < 1 self.note = notification(default=bool(note)) + self._alpha = None ## last alpha + ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ def __call__(self,x0,alpha=1,tol=1E-4,clevel=8,limii=100000): @@ -1041,6 +1043,10 @@ class steepest_descent(object): raise TypeError(about._errors.cstring("ERROR: invalid input.")) self.x = x0 + ## check for exsisting alpha + if(alpha is None)and(self._alpha is not None): + alpha = self._alpha + clevel = max(1,int(clevel)) limii = int(limii) @@ -1091,6 +1097,10 @@ class steepest_descent(object): if(self.spam is not None): self.spam(self.x,ii) + ## memorise last alpha + if(alpha is not None): + self._alpha = alpha/a ## undo update + return self.x,convergence ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++