def getGradient(self, coeff=1.0): px1 = -self.endPointGradient() A = self.affB.getTransforms(self.Afft) # A = [np.zeros([self.Tsize, self.dim, self.dim]), np.zeros([self.Tsize, self.dim])] dim2 = self.dim**2 # if self.affineDim > 0: # for t in range(self.Tsize): # AB = np.dot(self.affineBasis, self.Afft[t]) # A[0][t] = AB[0:dim2].reshape([self.dim, self.dim]) # A[1][t] = AB[dim2:dim2+self.dim] foo = evol.landmarkHamiltonianGradient(self.fv0.vertices, self.at, px1, self.param.KparDiff, self.regweight, affine=A) grd = Direction() grd.diff = foo[0]/(coeff*self.Tsize) grd.aff = np.zeros(self.Afft.shape) if self.affineDim > 0: dA = foo[1] db = foo[2] #dAfft = 2*np.multiply(self.affineWeight.reshape([1, self.affineDim]), self.Afft) grd.aff = 2 * self.Afft for t in range(self.Tsize): dAff = np.dot(self.affineBasis.T, np.vstack([dA[t].reshape([dim2,1]), db[t].reshape([self.dim, 1])])) grd.aff[t] -= np.divide(dAff.reshape(grd.aff[t].shape), self.affineWeight.reshape(grd.aff[t].shape)) grd.aff /= (coeff*self.Tsize) # dAfft[:,0:self.dim**2]/=100 return grd
def getGradient(self, coeff=1.0): px1 = -self.endPointGradient() A = [np.zeros([self.Tsize, self.dim, self.dim]), np.zeros([self.Tsize, self.dim])] dim2 = self.dim**2 if self.affineDim > 0: for t in range(self.Tsize): AB = np.dot(self.affineBasis, self.Afft[t]) A[0][t] = AB[0:dim2].reshape([self.dim, self.dim]) A[1][t] = AB[dim2:dim2+self.dim] foo = evol.landmarkHamiltonianGradient(self.x0, self.at, px1, self.param.KparDiff, self.regweight, affine=A, getCovector=True) grd = Direction() grd.diff = foo[0]/(coeff*self.Tsize) grd.aff = np.zeros(self.Afft.shape) if self.affineDim > 0: dA = foo[1] db = foo[2] grd.aff = 2*np.multiply(self.affineWeight.reshape([1, self.affineDim]), self.Afft) #grd.aff = 2 * self.Afft for t in range(self.Tsize): dAff = np.dot(self.affineBasis.T, np.vstack([dA[t].reshape([dim2,1]), db[t].reshape([self.dim, 1])])) #grd.aff[t] -= np.divide(dAff.reshape(grd.aff[t].shape), self.affineWeight.reshape(grd.aff[t].shape)) grd.aff[t] -= dAff.reshape(grd.aff[t].shape) grd.aff /= (self.coeffAff*coeff*self.Tsize) # dAfft[:,0:self.dim**2]/=100 if self.symmetric: grd.initx = (self.initPointGradient() - foo[4][0,...])/(self.coeffInitx * coeff) return grd
def gradientComponent(self, q, kk): px1 = - self.param.fun_objGrad(self.fvDef[kk], self.fv1[kk], self.param.KparDist) / self.param.sigmaError**2 #print 'in fun', kk A = [np.zeros([self.Tsize, self.dim, self.dim]), np.zeros([self.Tsize, self.dim])] dim2 = self.dim**2 if self.affineDim > 0: for t in range(self.Tsize): AB = np.dot(self.affineBasis, self.AfftAll[kk][t]) #print self.dim, dim2, AB.shape, self.affineBasis.shape A[0][t] = AB[0:dim2].reshape([self.dim, self.dim]) A[1][t] = AB[dim2:dim2+self.dim] foo = evol.landmarkHamiltonianGradient(self.fvTmpl.vertices, self.atAll[kk], px1, self.param.KparDiff, self.regweight, getCovector = True, affine=A) #print foo[0].shape, foo[1].shape grd = foo[0:3] pxTmpl = foo[-1][0, :, :] #print 'before put', kk q.put([kk, grd, pxTmpl])
def getGradient(self, coeff=1.0): #grd0 = np.zeros(self.atAll.shape) #pxIncr = np.zeros([self.Ntarg, self.atAll.shape[1], self.atAll.shape[2]]) pxTmpl = np.zeros(self.at.shape[1:3]) q = mp.Queue() #procGrd = [] # for kk in range(Ntarg): # procGrd.append(mp.Process(target = gradientComponent, args=(q,kk,fvTmpl, fv1[kk], xt[kk], at[kk], KparDist, KparDiff, regWeight, sigmaError,))) # for kk in range(Ntarg): # procGrd[kk].start() # for kk in range(Ntarg): # procGrd[kk].join() # print 'all joined' grd = Direction() for kk in range(self.Ntarg): self.gradientComponent(q, kk) grd.all.append(smatch.Direction()) dim2 = self.dim**2 for kk in range(self.Ntarg): foo = q.get() dat = foo[1][0]/(coeff*self.Tsize) dAfft = np.zeros(self.AfftAll[kk].shape) if self.affineDim > 0: dA = foo[1][1] db = foo[1][2] dAfft = 2 * self.AfftAll[kk] for t in range(self.Tsize): dAff = np.dot(self.affineBasis.T, np.vstack([dA[t].reshape([dim2,1]), db[t].reshape([self.dim, 1])])) dAfft[t] -= np.divide(dAff.reshape(dAfft[t].shape), self.affineWeight.reshape(dAfft[t].shape)) dAfft /= (coeff*self.Tsize) #print dat.shape grd.all[foo[0]].diff = dat grd.all[foo[0]].aff = dAfft #print foo[0], grd[foo[0]][1].shape pxTmpl += foo[2] #print pxTmpl.shape foo2 = evol.landmarkHamiltonianGradient(self.fv0.vertices, self.at, pxTmpl/self.lambdaPrior, self.param.KparDiff, self.regweight) # xtPrior = np.copy(foo2[1]) grd.prior = foo2[0] / (self.tmplCoeff*coeff*self.Tsize) return grd