Esempio n. 1
0
 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