def two_body_old(sys, psi):
    """Contribution from two-body-terms commutator with c*_k c_k+1"""
    # psi = np.reshape(psi,
    #                  (fci.cistring.num_strings(sys.nsites, sys.nup), fci.cistring.num_strings(sys.nsites, sys.ndown)))
    D = 0.
    for i in range(sys.nsites):
        w = (i + 1) % sys.nsites
        v = (i - 1) % sys.nsites

        D += harmonic.compute_inner_product(psi, sys.nsites,
                                            (sys.nup, sys.ndown), [i, w, i, i],
                                            [1, 0, 1, 0], [1, 1, 0, 0])

        D += harmonic.compute_inner_product(psi, sys.nsites,
                                            (sys.nup, sys.ndown), [i, i, i, w],
                                            [1, 0, 1, 0], [1, 1, 0, 0])

        D -= harmonic.compute_inner_product(psi, sys.nsites,
                                            (sys.nup, sys.ndown), [v, i, i, i],
                                            [1, 0, 1, 0], [1, 1, 0, 0])

        D -= harmonic.compute_inner_product(psi, sys.nsites,
                                            (sys.nup, sys.ndown), [i, i, v, i],
                                            [1, 0, 1, 0], [1, 1, 0, 0])

    return D.conj()
def one_energy(lat, psi, phi):
    D = 0
    for j in [0, 1]:
        for i in range(lat.nsites - 1):
            D += harmonic.compute_inner_product(psi, lat.nsites,
                                                (lat.nup, lat.ndown),
                                                [i, i + 1], [1, 0], [j, j])
        # Assuming periodic conditions
        D += harmonic.compute_inner_product(psi, lat.nsites,
                                            (lat.nup, lat.ndown),
                                            [lat.nsites - 1, 0], [1, 0],
                                            [j, j])
    one_e = -2 * lat.t * np.real(D.conj() * np.exp(-1j * phi))
    return one_e
def nearest_neighbour(lat, psi):
    psi = np.reshape(psi, (fci.cistring.num_strings(
        lat.nsites, lat.nup), fci.cistring.num_strings(lat.nsites, lat.ndown)))
    D = 0.
    for j in [0, 1]:
        for i in range(lat.nsites - 1):
            D += harmonic.compute_inner_product(psi, lat.nsites,
                                                (lat.nup, lat.ndown),
                                                [i, i + 1], [1, 0], [j, j])
        # Assuming periodic conditions
        D += harmonic.compute_inner_product(psi, lat.nsites,
                                            (lat.nup, lat.ndown),
                                            [lat.nsites - 1, 0], [1, 0],
                                            [j, j])
    return D.conj()
def single_operator(lat, psi):
    psi = np.reshape(psi, (fci.cistring.num_strings(lat.nsites, lat.nup), fci.cistring.num_strings(lat.nsites, lat.ndown)))
    D = 0.
    civec=psi
    for j in [0, 1]:
        for i in range(lat.nsites - 1):
            D += harmonic.compute_inner_product(psi, lat.nsites, (lat.nup, lat.ndown), [i], [1], [j])
    return D
def DHP(lat,psi):
    # psi = np.reshape(psi,(fci.cistring.num_strings(lat.nsites,lat.nup),fci.cistring.num_strings(lat.nsites,lat.ndown)))
    psi = np.reshape(psi,
                     (fci.cistring.num_strings(lat.nsites, lat.nup), fci.cistring.num_strings(lat.nsites, lat.ndown)))
    D = 0.
    for i in range(lat.nsites):
        D += harmonic.compute_inner_product(psi,lat.nsites,(lat.nup,lat.ndown),[i,i,i,i],[1,0,1,0],[1,1,0,0])
    # return D/lat.nsites
    return D/lat.nsites
def two_energy(lat, psi):
    two_e = 0
    for i in range(lat.nsites):
        two_e += harmonic.compute_inner_product(psi, lat.nsites,
                                                (lat.nup, lat.ndown),
                                                [i, i, i, i], [1, 0, 1, 0],
                                                [1, 1, 0, 0])
        # Assuming periodic conditions
    return lat.U * two_e
def spin(lat,psi):
    eta = 0.
    for i in range(lat.nsites):
        j = (i+1)%lat.nsites
        #abba
        eta += 0.5*harmonic.compute_inner_product(psi,lat.ne,(lat.nup,lat.ndown),[i,i,j,j],[1,0,1,0],[1,0,0,1]) 
        #baab
        eta += 0.5*harmonic.compute_inner_product(psi,lat.ne,(lat.nup,lat.ndown),[i,i,j,j],[1,0,1,0],[0,1,1,0])
        #aaaa
        eta += 0.25*harmonic.compute_inner_product(psi,lat.ne,(lat.nup,lat.ndown),[i,i,j,j],[1,0,1,0],[1,1,1,1])
        #bbbb
        eta += 0.25*harmonic.compute_inner_product(psi,lat.ne,(lat.nup,lat.ndown),[i,i,j,j],[1,0,1,0],[0,0,0,0])
        #aabb
        eta -= 0.25*harmonic.compute_inner_product(psi,lat.ne,(lat.nup,lat.ndown),[i,i,j,j],[1,0,1,0],[1,1,0,0])
        #bbaa
        eta -= 0.25*harmonic.compute_inner_product(psi,lat.ne,(lat.nup,lat.ndown),[i,i,j,j],[1,0,1,0],[0,0,1,1])
    return eta.real/lat.nsites