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)
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]
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}
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
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)
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'))
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)
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)
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)
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)]
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)]
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)
def test_index_bijection(): with pytest.raises(TypeError): Tensor.index_bijection((1, 1, 1, 1), 1, 2)
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')
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())