Esempio n. 1
0
def test_dual_basis_element():
    de = DualBasisElement()
    de_2 = DualBasisElement()
    db_0 = de + de_2
    assert isinstance(db_0, DualBasis)
    db_1 = db_0 + db_0
    assert isinstance(db_1, DualBasis)

    dim = 2
    opdm = np.random.random((dim, dim))
    opdm = (opdm.T + opdm) / 2
    opdm = Tensor(tensor=opdm, name='opdm')
    rdm = MultiTensor([opdm])

    def generate_dual_basis_element(i, j):
        element = DualBasisElement(tensor_names=["opdm"],
                                   tensor_elements=[(i, j)],
                                   tensor_coeffs=[-1.0],
                                   bias=1 if i == j else 0,
                                   scalar=0)
        return element

    opdm_to_oqdm_map = DualBasis()
    for _, idx in opdm.all_iterator():
        i, j = idx
        opdm_to_oqdm_map += generate_dual_basis_element(i, j)

    rdm.dual_basis = opdm_to_oqdm_map
    A, b, _ = rdm.synthesize_dual_basis()
    Adense = A.todense()
    opdm_flat = opdm.data.reshape((-1, 1))
    oqdm = Adense.dot(opdm_flat)
    test_oqdm = oqdm + b.todense()
    assert np.allclose(test_oqdm.reshape((dim, dim)), np.eye(dim) - opdm.data)
Esempio n. 2
0
def test_namedtensor_getdata():
    data = np.arange(16).reshape((4, 4))
    td = Tensor(name='opdm', tensor=data, basis=index_index_basis(4))
    for i, j in product(range(4), repeat=2):
        assert np.isclose(td[i, j], data[i, j])
    blank_td = Tensor(name='opdm')
    with pytest.raises(TypeError):
        _ = blank_td[0, 0]
Esempio n. 3
0
def test_multitensor_offsetmap():
    a = np.random.random((5, 5, 5, 5))
    b = np.random.random((4, 4, 4))
    c = np.random.random((3, 3))
    at = Tensor(tensor=a, name='a')
    bt = Tensor(tensor=b, name='b')
    ct = Tensor(tensor=c, name='c')
    mt = MultiTensor([at, bt, ct])

    assert mt.off_set_map == {'a': 0, 'b': 5**4, 'c': 5**4 + 4**3}
Esempio n. 4
0
def test_add_dualelement():
    a = np.random.random((5, 5, 5, 5))
    b = np.random.random((4, 4, 4))
    c = np.random.random((3, 3))
    at = Tensor(tensor=a, name='a')
    bt = Tensor(tensor=b, name='b')
    ct = Tensor(tensor=c, name='c')
    mt = MultiTensor([at, bt, ct])
    assert isinstance(mt.dual_basis, DualBasis)

    dbe = DualBasisElement()
    dbe.add_element('a', (0, 1, 2, 3), 4)
    mt.add_dual_elements(dbe)
    assert len(mt.dual_basis) == 1
Esempio n. 5
0
def test_tmap():
    a = np.random.random((5, 5))
    b = np.random.random((4, 4))
    c = np.random.random((3, 3))
    at = Tensor(tensor=a, name='a')
    bt = Tensor(tensor=b, name='b')
    ct = Tensor(tensor=c, name='c')
    ttmap = TMap(tensors=[at, bt, ct])
    assert np.allclose(ttmap['a'].data, a)
    assert np.allclose(ttmap['b'].data, b)
    assert np.allclose(ttmap['c'].data, c)

    tmp_tensors = [a, b, c]
    for idx, iterated_tensor in enumerate(ttmap):
        assert np.allclose(iterated_tensor.data, tmp_tensors[idx])
def test_d2_to_g2():
    # this should test for correctness
    filename = os.path.join(DATA_DIRECTORY, "H1-Li1_sto-3g_singlet_1.45.hdf5")
    molecule = MolecularData(filename=filename)
    molecule.load()
    opdm = molecule.fci_one_rdm
    tpdm = molecule.fci_two_rdm
    phdm = map_two_pdm_to_particle_hole_dm(tpdm, opdm)

    db = tpdm_to_phdm_mapping(molecule.n_qubits)
    topdm = Tensor(tensor=opdm, name='ck')
    ttpdm = Tensor(tensor=np.einsum('ijlk', tpdm), name='cckk')
    tphdm = Tensor(tensor=np.einsum('ijlk', phdm), name='ckck')
    mt = MultiTensor(tensors=[topdm, ttpdm, tphdm], dual_basis=db)
    A, _, b = mt.synthesize_dual_basis()
    vec_rdms = mt.vectorize_tensors()
    assert np.isclose(np.linalg.norm(A.dot(vec_rdms) - b), 0)
Esempio n. 7
0
def test_tensor_iterator():
    a = np.arange(16).reshape((4, 4))
    test_tensor = Tensor(tensor=a)
    assert np.allclose(test_tensor.data, a)
    assert test_tensor.size == 16
    assert isinstance(test_tensor.basis, Bijection)

    a_triu = a[np.triu_indices_from(a)]
    a_tril = a[np.tril_indices_from(a)]

    counter = 0
    for val, idx in test_tensor.utri_iterator():
        assert val == a[tuple(idx)]
        assert val == a_triu[counter]
        counter += 1
    assert counter == 4 * (4 + 1) / 2

    counter = 0
    for val, idx in test_tensor.ltri_iterator():
        assert val == a[tuple(idx)]
        assert val == a_tril[counter]
        counter += 1
    assert counter == 4 * (4 + 1) / 2

    counter = 0
    for val, idx in test_tensor.all_iterator():
        assert val == a[tuple(idx)]
        counter += 1

    assert np.allclose(test_tensor.vectorize(), a.reshape((-1, 1), order='C'))

    with pytest.raises(TypeError):
        list(test_tensor._iterator('blah'))
Esempio n. 8
0
def test_namedtensor_initialization():
    td = Tensor()
    assert isinstance(td, Tensor)

    data = np.arange(16).reshape((4, 4))
    td = Tensor(name='opdm', tensor=data, basis=index_index_basis(4))
    assert td.name == 'opdm'
    for i in range(4):
        assert td.basis.fwd(i) == i
    assert np.allclose(td.data, data)

    with pytest.raises(TypeError):
        _ = Tensor(name='opdm',
                   tensor=data,
                   basis=dict(zip(range(4), range(4))))

    td = Tensor(name='opdm', tensor=data)
    assert isinstance(td.basis, Bijection)
Esempio n. 9
0
def test_multitensor_init():
    """
    Testing the generation of a multitensor object with random tensors
    """
    a = np.random.random((5, 5))
    b = np.random.random((4, 4))
    c = np.random.random((3, 3))
    at = Tensor(tensor=a, name='a')
    bt = Tensor(tensor=b, name='b')
    ct = Tensor(tensor=c, name='c')
    mt = MultiTensor([at, bt, ct])

    with pytest.raises(TypeError):
        _ = MultiTensor((at, bt))

    assert len(mt.dual_basis) == 0

    assert np.isclose(mt.vec_dim, 5**2 + 4**2 + 3**2)
Esempio n. 10
0
def test_synthesis_dualbasis():
    a = np.random.random((5, 5))
    b = np.random.random((4, 4))
    c = np.random.random((3, 3))
    at = Tensor(tensor=a, name='a')
    bt = Tensor(tensor=b, name='b')
    ct = Tensor(tensor=c, name='c')
    dbe = DualBasisElement()
    dbe.add_element('a', (0, 1), 4)
    dbe.add_element('a', (1, 0), 4)
    mt = MultiTensor([at, bt, ct], DualBasis(elements=[dbe]))

    A, c, b = mt.synthesize_dual_basis()
    assert isinstance(A, sp.sparse.csr_matrix)
    assert isinstance(c, sp.sparse.csr_matrix)
    assert isinstance(b, sp.sparse.csr_matrix)
    assert A.shape == (1, 50)
    assert b.shape == (1, 1)
    assert c.shape == (1, 1)
Esempio n. 11
0
def test_namedtensor_call():
    """
    make a matrix that has a different basis than indexing
    """
    n = 4
    dim = int(n * (n - 1) / 2)
    geminals = []
    bas = {}
    cnt = 0
    for i in range(4):
        for j in range(i + 1, 4):
            bas[cnt] = (i, j)
            geminals.append((i, j))
            cnt += 1
    rev_bas = dict(zip(bas.values(), bas.keys()))

    rand_mat = np.random.random((dim, dim))
    basis_bijection = index_tuple_basis(geminals)
    test_tensor = Tensor(tensor=rand_mat, basis=basis_bijection)
    assert test_tensor.basis.fwd(0) == (0, 1)
    assert test_tensor.basis.fwd(2) == (0, 3)
    assert test_tensor.basis.rev(test_tensor.basis.fwd(5)) == 5
    assert test_tensor.ndim == 2
    assert test_tensor.dim == dim
    # index into data directly
    assert test_tensor[2, 3] == rand_mat[2, 3]
    # index into data via basis indexing
    assert test_tensor(0, 1, 0, 1) == rand_mat[0, 0]
    assert test_tensor(0, 1, 0, 1) == rand_mat[0, 0]
    assert test_tensor(1, 2, 0, 1) == rand_mat[rev_bas[(1, 2)],
                                               rev_bas[(0, 1)]]
    assert test_tensor.index_vectorized(1, 2, 0, 1) == rev_bas[(1, 2)] * dim + \
           rev_bas[(0, 1)]

    # testing iteration over the upper triangle
    for iter_vals in test_tensor.utri_iterator():
        val, [i, j] = iter_vals
        assert val == rand_mat[test_tensor.basis.rev(i),
                               test_tensor.basis.rev(j)]
Esempio n. 12
0
def test_synthesis_element():
    a = np.random.random((5, 5))
    b = np.random.random((4, 4))
    c = np.random.random((3, 3))
    at = Tensor(tensor=a, name='a')
    bt = Tensor(tensor=b, name='b')
    ct = Tensor(tensor=c, name='c')
    mt = MultiTensor([at, bt, ct])

    dbe = DualBasisElement()
    dbe.add_element('a', (0, 1), 4)
    dbe.add_element('a', (1, 0), 4)
    with pytest.raises(TypeError):
        dbe.add_element(5)

    with pytest.raises(TypeError):
        mt.add_dual_elements(5)

    mt.add_dual_elements(dbe)
    colidx, data_vals = mt.synthesize_element(dbe)
    assert data_vals == [4, 4]
    assert colidx == [1, 5]
    assert [at.data[0, 1], at.data[1, 0]] == [at(0, 1), at(1, 0)]
Esempio n. 13
0
def test_tensor_index():
    """
    Testing the index_vectorized which is mapped through the basis
    """
    a = np.arange(16).reshape((4, 4), order='C')
    basis = [(0, 0), (0, 1), (1, 0), (1, 1)]
    basis = index_tuple_basis(basis)
    tt = Tensor(tensor=a, basis=basis)
    assert np.allclose(tt.data, a)
    assert tt.size == 16
    assert isinstance(tt.basis, Bijection)
    assert np.isclose(tt.index_vectorized(0, 0, 0, 0), 0)
    assert np.isclose(tt.index_vectorized(0, 0, 0, 1), 1)
    assert np.isclose(tt.index_vectorized(0, 0, 1, 0), 2)
    assert np.isclose(tt.index_vectorized(0, 0, 1, 1), 3)
    assert np.isclose(tt.index_vectorized(0, 1, 0, 0), 4)
    assert np.isclose(tt.index_vectorized(0, 1, 0, 1), 5)
    assert np.isclose(tt.index_vectorized(0, 1, 1, 0), 6)
    assert np.isclose(tt.index_vectorized(0, 1, 1, 1), 7)
    assert np.isclose(tt.index_vectorized(1, 0, 0, 0), 8)
    # etc...

    a = np.arange(16).reshape((4, 4), order='C')
    tt = Tensor(tensor=a)  # the canonical basis
    assert np.isclose(tt.index_vectorized(0, 0), 0)
    assert np.isclose(tt.index_vectorized(0, 1), 1)
    assert np.isclose(tt.index_vectorized(0, 2), 2)
    assert np.isclose(tt.index_vectorized(0, 3), 3)
    assert np.isclose(tt.index_vectorized(1, 0), 4)
    assert np.isclose(tt.index_vectorized(1, 1), 5)
    assert np.isclose(tt.index_vectorized(1, 2), 6)
    assert np.isclose(tt.index_vectorized(1, 3), 7)
Esempio n. 14
0
def test_index_bijection():
    with pytest.raises(TypeError):
        Tensor.index_bijection((1, 1, 1, 1), 1, 2)
Esempio n. 15
0
def test_get_obj_size():
    assert Tensor.get_obj_size(1) == 1
    assert Tensor.get_obj_size([1, 1]) == 2
    with pytest.raises(TypeError):
        Tensor.get_obj_size('a')
Esempio n. 16
0
def test_vectorize_test():
    a = np.random.random((5, 5))
    b = np.random.random((4, 4))
    c = np.random.random((3, 3))
    at = Tensor(tensor=a, name='a')
    bt = Tensor(tensor=b, name='b')
    ct = Tensor(tensor=c, name='c')
    mt = MultiTensor([at, bt, ct])
    vec = np.vstack((at.vectorize(), bt.vectorize()))
    vec = np.vstack((vec, ct.vectorize()))
    assert np.allclose(vec, mt.vectorize_tensors())

    a = np.random.random((5, 5, 5, 5))
    b = np.random.random((4, 4, 4))
    c = np.random.random((3, 3))
    at = Tensor(tensor=a, name='a')
    bt = Tensor(tensor=b, name='b')
    ct = Tensor(tensor=c, name='c')
    mt = MultiTensor([at, bt, ct])
    vec = np.vstack((at.vectorize(), bt.vectorize()))
    vec = np.vstack((vec, ct.vectorize()))
    assert np.allclose(vec, mt.vectorize_tensors())