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