def quadratic_step(g, H, w, trust, log=no_log):
ev = np.linalg.eigvalsh((H+H.T)/2)
rfo = np.vstack((np.hstack((H, g[:, None])),
np.hstack((g, 0))[None, :]))
D, V = np.linalg.eigh((rfo+rfo.T)/2)
dq = V[:-1, 0]/V[-1, 0]
l = D[0]
if norm(dq) <= trust:
log('Pure RFO step was performed:')
on_sphere = False
else:
def steplength(l):
return norm(np.linalg.solve(l*eye(H.shape[0])-H, g))-trust
l = Math.findroot(steplength, ev[0]) # minimization on sphere
dq = np.linalg.solve(l*eye(H.shape[0])-H, g)
on_sphere = False
log('Minimization on sphere was performed:')
dE = dot(g, dq)+0.5*dq.dot(H).dot(dq) # predicted energy change
log('* Trust radius: {:.2}'.format(trust))
log('* Number of negative eigenvalues: {}'.format((ev < 0).sum()))
log('* Lowest eigenvalue: {:.3}'.format(ev[0]))
log('* lambda: {:.3}'.format(l))
log('Quadratic step: RMS: {:.3}, max: {:.3}'.format(Math.rms(dq), max(abs(dq))))
log('* Predicted energy change: {:.3}'.format(dE))
return dq, dE, on_sphere
评论列表
文章目录