def optimize_shift(u0s, driv, l_op, shift_z0, opt_index=None, **keyargs): ns = [u.n for u in u0s] zs = [u.z for u in u0s] bt = type(u0s[0]) if(opt_index == None): opt_index = range(len(zs)) def basis(shift_z): return [l2.d0_basis(bt, n, z + cond(i in opt_index, shift_z, 0)) for (n, z, i) in zip(ns, zs, range(len(zs)))] # numerical derivative if('h' in keyargs): def one(vs): shift_z = vs[0] us = basis(shift_z) return val_only(us, driv, l_op) res = nnewton.nnewton(one, [shift_z0], func='v', **keyargs) (res_conv, shift_z_opt, val_opt, grad_opt) = res # analytic derivative else: def one(vs): shift_z = vs[0] us = basis(shift_z) (val, grad, hess, data) = val_grad_hess(us, driv, l_op) g_val = sum([grad[i] for i in opt_index]) h_val = sum([hess[i, j] for i in opt_index for j in opt_index]) g = np.array([g_val]) h = np.array([[h_val]]) return (val, g, h) res = nnewton.nnewton(one, [shift_z0], func="vgh", **keyargs) (res_conv, shift_z_opt, val_opt, grad_opt) = res basis_opt = basis(shift_z_opt[0]) return (res_conv, basis_opt, shift_z_opt[0], val_opt, grad_opt)
def test_1basis_1skp(self): us = [ l2.STO(1.0, 2, 0.5-0.5j) ] h_atom = l2.HAtom(1.0) l_op = h_atom.h_minus_ene_op(1, 0.9) driv = h_atom.length(1, 0, 1) target = opt_cbf.newton_target(us, driv, l_op) res = nnewton(target, [0.5-0.5j], func="vgh") """ res = opt_cbf.optimize_simple(us, driv, l_op, eps=0.0000001, show_lvl=0) self.assertTrue(res[0]) """ self.assertTrue(res[0]) self.assertAlmostEqual(1.1117640506-0.3673558953j, res[1][0])