Beispiel #1
0
 def test_max_truncation_error_relative(self):
   absolute = np.diag([2.0, 1.0, 0.2, 0.1])
   relative = np.diag([2.0, 1.0, 0.2, 0.1])
   max_truncation_err = 0.2
   _, _, _, trunc_sv_absolute = decompositions.svd_decomposition(
       np, absolute, 1,
       max_truncation_error=max_truncation_err,
       relative=False)
   _, _, _, trunc_sv_relative = decompositions.svd_decomposition(
       np, relative, 1,
       max_truncation_error=max_truncation_err,
       relative=True)
   np.testing.assert_almost_equal(trunc_sv_absolute, [0.1])
   np.testing.assert_almost_equal(trunc_sv_relative, [0.2, 0.1])
 def test_expected_shapes(self):
     val = np.zeros((2, 3, 4, 5))
     u, s, vh, _ = decompositions.svd_decomposition(np, val, 2)
     self.assertEqual(u.shape_tensor, (2, 3, 6))
     self.assertEqual(s.shape_tensor, (6, ))
     self.assertAllClose(s, np.zeros(6))
     self.assertEqual(vh.shape_tensor, (6, 4, 5))
Beispiel #3
0
 def svd_decomposition(self,
                       tensor: Tensor,
                       split_axis: int,
                       max_singular_values: Optional[int] = None,
                       max_truncation_error: Optional[float] = None
                      ) -> Tuple[Tensor, Tensor, Tensor, Tensor]:
   return decompositions.svd_decomposition(
       self.np, tensor, split_axis, max_singular_values, max_truncation_error)
Beispiel #4
0
 def test_max_singular_values_larger_than_bond_dimension(self):
   random_matrix = np.random.rand(10, 6)
   unitary1, _, unitary2 = np.linalg.svd(random_matrix, full_matrices=False)
   singular_values = np.array(range(6))
   val = unitary1.dot(np.diag(singular_values).dot(unitary2.T))
   u, s, vh, _ = decompositions.svd_decomposition(
       np, val, 1, max_singular_values=30)
   self.assertEqual(u.shape, (10, 6))
   self.assertEqual(s.shape, (6,))
   self.assertEqual(vh.shape, (6, 6))
 def test_max_truncation_error(self):
     random_matrix = np.random.rand(10, 10)
     unitary1, _, unitary2 = np.linalg.svd(random_matrix)
     singular_values = np.array(range(10))
     val = unitary1.dot(np.diag(singular_values).dot(unitary2.T))
     u, s, vh, trun = decompositions.svd_decomposition(
         np, val, 1, max_truncation_error=math.sqrt(5.1))
     self.assertEqual(u.shape_tensor, (10, 7))
     self.assertEqual(s.shape_tensor, (7, ))
     self.assertAllClose(s, np.arange(9, 2, -1))
     self.assertEqual(vh.shape_tensor, (7, 10))
     self.assertAllClose(trun, np.arange(2, -1, -1))
def test_singular_values(dtype, R, R1, num_charges):
    np.random.seed(10)
    D = 30
    charges = [
        BaseCharge(np.random.randint(-5, 6, (num_charges, D)),
                   charge_types=[U1Charge] * num_charges) for n in range(R)
    ]
    flows = [True] * R
    A = BlockSparseTensor.random(
        [Index(charges[n], flows[n]) for n in range(R)], dtype=dtype)
    _, s, _, _ = decompositions.svd_decomposition(bs, A, R1)
    _, s_dense, _, _ = np_decompositions.svd_decomposition(np, A.todense(), R1)
    np.testing.assert_almost_equal(np.sort(s.todense()),
                                   np.sort(s_dense[s_dense > 1E-13]))
def test_svd_decompositions(dtype, R, R1, num_charges):
    np.random.seed(10)
    D = 30
    charges = [
        BaseCharge(np.random.randint(-5, 6, (num_charges, D)),
                   charge_types=[U1Charge] * num_charges) for n in range(R)
    ]
    flows = [True] * R
    A = BlockSparseTensor.random(
        [Index(charges[n], flows[n]) for n in range(R)], dtype=dtype)

    u, s, v, _ = decompositions.svd_decomposition(bs, A, R1)
    u_dense, s_dense, v_dense, _ = np_decompositions.svd_decomposition(
        np, A.todense(), R1)
    res1 = bs.tensordot(bs.tensordot(u, bs.diag(s), 1), v, 1)
    res2 = np.tensordot(np.tensordot(u_dense, np.diag(s_dense), 1), v_dense, 1)
    np.testing.assert_almost_equal(res1.todense(), res2)