def check_conjugacy(g_new, g_old): return abs(dot(g_new, g_old) / dot(g_new, g_new))
def check_descent(p_new, g_new): return dot(p_new, g_new) / dot(g_new, g_new)
def fletcher_reeves(g_new, g_old, precond=lambda x : x): num = dot(precond(g_new), g_new) den = dot(g_old, g_old) beta = num/den return beta
def pollak_ribere(g_new, g_old, precond=lambda x : x): num = dot(precond(g_new), g_new-g_old) den = dot(g_old, g_old) beta = num/den return beta
def pollak_ribere(g_new, g_old, precond=lambda x: x): num = dot(precond(g_new), g_new - g_old) den = dot(g_old, g_old) beta = num / den return beta
def fletcher_reeves(g_new, g_old, precond=lambda x: x): num = dot(precond(g_new), g_new) den = dot(g_old, g_old) beta = num / den return beta
def __call__(self): """ Returns SRVM search direction """ self.iter += 1 unix.cd(self.path) g = self.load('g_new') if self.iter == 1: ShatT_ghat = g self.save('ShatT_ghat', g) print 'max(ShatT_ghat)', max(ShatT_ghat) return -g, 0 elif self.iter > self.maxiter: print 'restarting SRVM... [periodic restart]' self.restart() return -g, 1 mu = self.loadtxt('alpha') g_old = self.load('g_old') print 'max(g_old-g)', max(g_old - g) dghat = g - g_old yhat = mu * g_old + dghat kk = self.iter - 1 w = self.update(yhat, kk - 1, 1) self.save('w', w) unix.mv('w', 'w_%04d' % kk) print 'max(w)', max(w) ShatT_ghat = self.load('ShatT_ghat') #print 'max(ShatT_ghat)',max(ShatT_ghat) belta = w - mu * ShatT_ghat a = dot(w, belta) b = dot(w, w) nu = self.srvm_nu(a, b) self.savetxt('a', a) unix.mv('a', 'a_%04d' % kk) self.savetxt('nu', nu) unix.mv('nu', 'nu_%04d' % kk) ShatT_ghat = self.update(g, kk, 1) q = self.update(ShatT_ghat, kk, 0) #q = -q self.save('ShatT_ghat', ShatT_ghat) print 'max(g)', max(g) print 'max(q)', max(q) status = self.check_status(g, q) print 'status', status #status = 0 if status != 0: self.restart() return -g, status else: return -q, status