Ejemplo n.º 1
0
 def test_contracting_more_complicated_index_structure(self) -> None:
     complicated_tensor = et.Tensor([[[[[[[[[[[[1]]]]]]]]]]]], [
         '^mu', '_nu', '_rho', 'a', 'b', 'c', 'c', 'a', 'e', '^nu', '^rho',
         '_mu'
     ])
     simple_tensor = et.Tensor([[1]], ['b', 'e'])
     self.assertEqual(complicated_tensor, simple_tensor)
Ejemplo n.º 2
0
 def test_replace_indices_with_same_pattern(self) -> None:
     rank_three_tensor = self.a * et.Tensor(self.a_value,
                                            ['_nu']) * et.Tensor(1, ['i'])
     other_rank_three_tensor = et.Tensor(rank_three_tensor.value,
                                         ['^alpha', '_beta', 'j'])
     other_rank_three_tensor.reindex_as(['^mu', '_nu', 'i'])
     self.assertEqual(rank_three_tensor, other_rank_three_tensor)
Ejemplo n.º 3
0
 def test_contractable_indices_in_tensor_are_contracted(self) -> None:
     matrix = np.array([[1, 0], [0, 3]])
     tensor = et.Tensor(matrix, ['i', 'i'])
     self.assertEqual(tensor, 4)
Ejemplo n.º 4
0
 def test_tensors_with_different_values_are_not_equal(self) -> None:
     b = et.Tensor(2 * np.array(self.a_value), self.a_indices)
     self.assertNotEqual(self.a, b)
Ejemplo n.º 5
0
 def test_list_passed_to_tensor_as_one_input_raises_exception(self) -> None:
     rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
     with self.assertRaises(ValueError):
         b = rank_two_tensor[[0], :]
Ejemplo n.º 6
0
 def test_neg_tensor_plus_tensor_equals_zero_tensor(self) -> None:
     zero_list = [0 for x in self.a_value]
     self.assertEqual(self.a + -self.a, et.Tensor(zero_list,
                                                  self.a_indices))
Ejemplo n.º 7
0
 def test_multiply_vector_and_1_form(self) -> None:
     lowered_indices = [self.a_indices[0].replace('^', '_')]
     b = et.Tensor(self.a_value, lowered_indices)
     vector_squared_value = self.a_value[0]**2 - sum(
         [x**2 for x in self.a_value[1:]])
     self.assertEqual((self.a * b), vector_squared_value)
Ejemplo n.º 8
0
 def test_exception_raised_when_adding_tensors_with_different_indices(
         self) -> None:
     b = et.Tensor(self.a_value, [self.a_indices[0] + '*'])
     with self.assertRaises(ValueError):
         c = self.a + b
Ejemplo n.º 9
0
 def test_tensors_with_different_indices_are_not_equal(self) -> None:
     b = et.Tensor(self.a_value, [self.a_indices[0] + '*'])
     self.assertNotEqual(self.a, b)
Ejemplo n.º 10
0
 def test_two_slices_in_rank_two_tensor(self) -> None:
     rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
     self.assertEqual(rank_two_tensor[:, :], rank_two_tensor)
Ejemplo n.º 11
0
 def test_two_indices_in_rank_two_tensor(self) -> None:
     rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
     self.assertEqual(rank_two_tensor[0, 0], 1)
Ejemplo n.º 12
0
 def test_one_index_then_one_slice_in_rank_two_tensor(self) -> None:
     rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
     a_nu = et.Tensor(self.a_value, ['^nu'])
     self.assertEqual(rank_two_tensor[0, :], a_nu)
Ejemplo n.º 13
0
 def test_one_slice_then_one_slice_in_rank_two_tensor(self) -> None:
     rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
     self.assertEqual(rank_two_tensor[:, 0], self.a)
Ejemplo n.º 14
0
 def test_rank_zero_tensor_equals_corresponding_scalar(self) -> None:
     three = et.Tensor(3, [])
     self.assertEqual(three, 3)
Ejemplo n.º 15
0
 def test_wrong_number_of_indices_passed_to_tensor_as_index_raises_exception(
         self) -> None:
     rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
     with self.assertRaises(ValueError):
         b = rank_two_tensor[0]
Ejemplo n.º 16
0
 def test_contractable_lorentz_indices_in_tensor_are_contracted_upper_lower_1_3(
         self) -> None:
     matrix = np.array([[[1, 0]], [[0, 3]]])
     tensor = et.Tensor(matrix, ['^mu', '^nu', '_mu'])
     self.assertEqual(tensor, et.Tensor([4], ['^nu']))
Ejemplo n.º 17
0
 def test_scalar_tensor_with_frame_equal_to_tensor(self):
     a = et.Tensor_with_Frame(1, [], 'A')
     b = et.Tensor(1, [])
     self.assertEqual(a, b)
Ejemplo n.º 18
0
 def test_scalar_tensor_and_tensor_with_frame_are_not_equal_if_values_are_unequal(
         self):
     a = et.Tensor_with_Frame(1, [], 'A')
     b = et.Tensor(2, [])
     self.assertNotEqual(a, b)
Ejemplo n.º 19
0
 def test_adding_two_tensors(self) -> None:
     b = et.Tensor(2 * np.array(self.a_value), self.a_indices)
     self.assertEqual(self.a + self.a, b)
Ejemplo n.º 20
0
 def test_identical_tensors_are_equal(self) -> None:
     b = et.Tensor(self.a_value, self.a_indices)
     self.assertEqual(self.a, b)
Ejemplo n.º 21
0
 def test_cannot_multiply_tensors_with_the_same_index(self) -> None:
     b = et.Tensor(self.a_value, self.a_indices)
     with self.assertRaises(ValueError):
         c = self.a * b
Ejemplo n.º 22
0
 def test_that_sum_of_tensor_with_frame_and_a_tensor_without_frames_raises_exception(
         self):
     a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
     b = et.Tensor(self.a_value, self.a_indices)
     with self.assertRaises(TypeError):
         c = a + b
Ejemplo n.º 23
0
 def test_left_multiply_vector_by_two_point_five(self) -> None:
     product_tensor = et.Tensor(2.5 * np.array(self.a_value),
                                self.a_indices)
     self.assertEqual(2.5 * self.a, product_tensor)
Ejemplo n.º 24
0
 def test_tensors_with_different_shapes_are_not_equal(self) -> None:
     b = et.Tensor(self.a_value * 2, self.a_indices)
     self.assertNotEqual(self.a, b)
Ejemplo n.º 25
0
 def test_tensor_minus_itself_equals_zero_tensor(self) -> None:
     zero_list = [0 for x in self.a_value]
     self.assertEqual(self.a - self.a, et.Tensor(zero_list, self.a_indices))
Ejemplo n.º 26
0
class TestEinsteinTensor(unittest.TestCase):

    a_value = [1, 0, 0, 0]
    assert type(a_value) in [type([]), type((0, ))]
    assert any([x != 0 for x in a_value])
    a_indices = ['^mu']
    assert len(a_indices) == 1
    assert a_indices[0][0] == '^'
    a = et.Tensor(a_value, a_indices)

    def test_identical_tensors_are_equal(self) -> None:
        b = et.Tensor(self.a_value, self.a_indices)
        self.assertEqual(self.a, b)

    def test_tensors_with_different_shapes_are_not_equal(self) -> None:
        b = et.Tensor(self.a_value * 2, self.a_indices)
        self.assertNotEqual(self.a, b)

    def test_tensors_with_different_values_are_not_equal(self) -> None:
        b = et.Tensor(2 * np.array(self.a_value), self.a_indices)
        self.assertNotEqual(self.a, b)

    def test_tensors_with_different_indices_are_not_equal(self) -> None:
        b = et.Tensor(self.a_value, [self.a_indices[0] + '*'])
        self.assertNotEqual(self.a, b)

    def test_adding_two_tensors(self) -> None:
        b = et.Tensor(2 * np.array(self.a_value), self.a_indices)
        self.assertEqual(self.a + self.a, b)

    def test_exception_raised_when_adding_tensors_with_different_indices(
            self) -> None:
        b = et.Tensor(self.a_value, [self.a_indices[0] + '*'])
        with self.assertRaises(ValueError):
            c = self.a + b

    def test_cannot_multiply_tensors_with_the_same_index(self) -> None:
        b = et.Tensor(self.a_value, self.a_indices)
        with self.assertRaises(ValueError):
            c = self.a * b

    def test_multiply_vector_and_1_form(self) -> None:
        lowered_indices = [self.a_indices[0].replace('^', '_')]
        b = et.Tensor(self.a_value, lowered_indices)
        vector_squared_value = self.a_value[0]**2 - sum(
            [x**2 for x in self.a_value[1:]])
        self.assertEqual((self.a * b), vector_squared_value)

    def test_right_multiply_vector_by_one(self) -> None:
        self.assertEqual(self.a * 1, self.a)

    def test_left_multiply_vector_by_one(self) -> None:
        self.assertEqual(1 * self.a, self.a)

    def test_right_multiply_vector_by_two(self) -> None:
        self.assertEqual(self.a * 2, self.a + self.a)

    def test_left_multiply_vector_by_two(self) -> None:
        self.assertEqual(2 * self.a, self.a + self.a)

    def test_right_multiply_vector_by_two_point_five(self) -> None:
        product_tensor = et.Tensor(2.5 * np.array(self.a_value),
                                   self.a_indices)
        self.assertEqual(self.a * 2.5, product_tensor)

    def test_left_multiply_vector_by_two_point_five(self) -> None:
        product_tensor = et.Tensor(2.5 * np.array(self.a_value),
                                   self.a_indices)
        self.assertEqual(2.5 * self.a, product_tensor)

    def test_str_tensor(self) -> None:
        self.assertEqual(self.a.__str__(),
                         str(self.a.value) + " " + str(self.a.indices))

    def test_repr_tensor(self) -> None:
        self.assertEqual(self.a.__repr__(), self.a.__str__())

    def test_neg_tensor_plus_tensor_equals_zero_tensor(self) -> None:
        zero_list = [0 for x in self.a_value]
        self.assertEqual(self.a + -self.a, et.Tensor(zero_list,
                                                     self.a_indices))

    def test_tensor_minus_itself_equals_zero_tensor(self) -> None:
        zero_list = [0 for x in self.a_value]
        self.assertEqual(self.a - self.a, et.Tensor(zero_list, self.a_indices))

    def test_twice_tensor_minus_itself_equals_itself(self) -> None:
        self.assertEqual((self.a + self.a) - self.a, self.a)

    def test_list_passed_to_tensor_as_only_input_raises_exception(
            self) -> None:
        with self.assertRaises(ValueError):
            b = self.a[[0]]

    def test_list_passed_to_tensor_as_one_input_raises_exception(self) -> None:
        rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
        with self.assertRaises(ValueError):
            b = rank_two_tensor[[0], :]

    def test_wrong_number_of_indices_passed_to_tensor_as_slice_raises_exception(
            self) -> None:
        rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
        with self.assertRaises(ValueError):
            b = rank_two_tensor[:]

    def test_wrong_number_of_indices_passed_to_tensor_as_index_raises_exception(
            self) -> None:
        rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
        with self.assertRaises(ValueError):
            b = rank_two_tensor[0]

    def test_rank_zero_tensor_equals_corresponding_scalar(self) -> None:
        three = et.Tensor(3, [])
        self.assertEqual(three, 3)

    def test_one_slice_then_one_slice_in_rank_two_tensor(self) -> None:
        rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
        self.assertEqual(rank_two_tensor[:, 0], self.a)

    def test_one_index_then_one_slice_in_rank_two_tensor(self) -> None:
        rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
        a_nu = et.Tensor(self.a_value, ['^nu'])
        self.assertEqual(rank_two_tensor[0, :], a_nu)

    def test_two_indices_in_rank_two_tensor(self) -> None:
        rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
        self.assertEqual(rank_two_tensor[0, 0], 1)

    def test_two_slices_in_rank_two_tensor(self) -> None:
        rank_two_tensor = self.a * et.Tensor(self.a_value, ['^nu'])
        self.assertEqual(rank_two_tensor[:, :], rank_two_tensor)

    def test_replace_indices_with_same_pattern(self) -> None:
        rank_three_tensor = self.a * et.Tensor(self.a_value,
                                               ['_nu']) * et.Tensor(1, ['i'])
        other_rank_three_tensor = et.Tensor(rank_three_tensor.value,
                                            ['^alpha', '_beta', 'j'])
        other_rank_three_tensor.reindex_as(['^mu', '_nu', 'i'])
        self.assertEqual(rank_three_tensor, other_rank_three_tensor)

    def test_replace_indices_with_different_number_of_indices_raises_value_error(
            self) -> None:
        with self.assertRaises(ValueError):
            self.a.reindex_as(['^nu', '^rho'])

    def test_replace_indices_with_different_pattern_raises_value_error(
            self) -> None:
        with self.assertRaises(ValueError):
            self.a.reindex_as(['_nu'])

    def test_add_tensor_to_integer_raises_value_error(self) -> None:
        with self.assertRaises(TypeError):
            b = self.a + 3

    def test_add_integer_to_tensor_raises_value_error(self) -> None:
        with self.assertRaises(TypeError):
            b = 3 + self.a

    def test_tensors_with_different_frames_are_not_equal(self):
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        b = et.Tensor_with_Frame(self.a_value, self.a_indices, 'B')
        self.assertNotEqual(a, b)

    def test_scalars_with_different_frames_are_equal(self):
        a = et.Tensor_with_Frame(1, [], 'A')
        b = et.Tensor_with_Frame(1, [], 'B')
        self.assertEqual(a, b)

    def test_scalar_tensor_with_frame_equal_to_tensor(self):
        a = et.Tensor_with_Frame(1, [], 'A')
        b = et.Tensor(1, [])
        self.assertEqual(a, b)

    def test_scalar_tensor_with_frame_equal_to_scalar(self):
        a = et.Tensor_with_Frame(1, [], 'A')
        self.assertEqual(a, 1)

    def test_scalars_tensors_with_different_frames_are_not_equal_if_values_are_unequal(
            self):
        a = et.Tensor_with_Frame(1, [], 'A')
        b = et.Tensor_with_Frame(2, [], 'B')
        self.assertNotEqual(a, b)

    def test_scalar_tensor_and_tensor_with_frame_are_not_equal_if_values_are_unequal(
            self):
        a = et.Tensor_with_Frame(1, [], 'A')
        b = et.Tensor(2, [])
        self.assertNotEqual(a, b)

    def test_scalar_tensor_and_tensor_with_frame_are_not_equal_if_values_are_unequal(
            self):
        a = et.Tensor_with_Frame(1, [], 'A')
        b = et.Tensor(2, [])
        self.assertNotEqual(a, b)

    def test_scalar_tensor_and_scalar_are_not_equal_if_values_are_unequal(
            self):
        a = et.Tensor_with_Frame(1, [], 'A')
        b = 2
        self.assertNotEqual(a, b)

    def test_that_sum_of_tensors_with_frames_has_same_frame(self):
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual((a + a).frame, a.frame)

    def test_that_sum_of_tensors_with_different_frames_raises_exception(self):
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        b = et.Tensor_with_Frame(self.a_value, self.a_indices, 'B')
        with self.assertRaises(ValueError):
            c = a + b

    def test_that_sum_of_tensor_with_frame_and_a_tensor_without_frames_raises_exception(
            self):
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        b = et.Tensor(self.a_value, self.a_indices)
        with self.assertRaises(TypeError):
            c = a + b

    def test_str_tensor_with_frame(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual(
            a.__str__(),
            str(a.tensor.value) + " " + str(a.tensor.indices) + " " + a.frame)

    def test_repr_tensor_with_frame(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual(a.__repr__(), a.__str__())

    def test_neg_tensor_with_frame_plus_tensor_with_frame_equals_zero_tensor(
            self) -> None:
        zero_list = [0 for x in self.a_value]
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual(a + -a,
                         et.Tensor_with_Frame(zero_list, self.a_indices, 'A'))

    def test_tensor_with_frame_minus_itself_equals_zero_tensor(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        zero_list = [0 for x in self.a_value]
        zero_frame_tensor = et.Tensor_with_Frame(zero_list, self.a_indices,
                                                 'A')
        self.assertEqual(a - a, zero_frame_tensor)

    def test_twice_tensor_with_frame_minus_itself_equals_itself(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual((a + a) - a, a)

    def test_right_multiply_vector_with_frame_by_one(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual(a * 1, a)

    def test_left_multiply_vector_with_frame_by_one(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual(1 * a, a)

    def test_right_multiply_vector_with_frame_by_two(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual(a * 2, a + a)

    def test_left_multiply_vector_with_frame_by_two(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        self.assertEqual(2 * a, a + a)

    def test_right_multiply_vector_with_frame_by_two_point_five(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        product_tensor_with_frame = et.Tensor_with_Frame(
            2.5 * np.array(self.a_value), self.a_indices, 'A')
        self.assertEqual(a * 2.5, product_tensor_with_frame)

    def test_left_multiply_vector_with_frame_by_two_point_five(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        product_tensor_with_frame = et.Tensor_with_Frame(
            2.5 * np.array(self.a_value), self.a_indices, 'A')
        self.assertEqual(2.5 * a, product_tensor_with_frame)

    def test_product_of_two_tensors_with_frames_has_same_frame(self) -> None:
        a = et.Tensor_with_Frame(self.a_value, self.a_indices, 'A')
        b = et.Tensor_with_Frame(self.a_value, ['^nu'], 'A')
        self.assertEqual((a * b).frame, 'A')

    def test_contractable_lorentz_indices_in_tensor_are_contracted_upper_lower(
            self) -> None:
        matrix = np.array([[1, 0], [0, 3]])
        tensor = et.Tensor(matrix, ['^mu', '_mu'])
        self.assertEqual(tensor, 4)

    def test_contractable_lorentz_indices_in_tensor_are_contracted_lower_upper(
            self) -> None:
        matrix = np.array([[1, 0], [0, 3]])
        tensor = et.Tensor(matrix, ['_mu', '^mu'])
        self.assertEqual(tensor, 4)

    def test_contractable_indices_in_tensor_are_contracted(self) -> None:
        matrix = np.array([[1, 0], [0, 3]])
        tensor = et.Tensor(matrix, ['i', 'i'])
        self.assertEqual(tensor, 4)

    def test_contractable_lorentz_indices_in_tensor_are_contracted_upper_lower_1_3(
            self) -> None:
        matrix = np.array([[[1, 0]], [[0, 3]]])
        tensor = et.Tensor(matrix, ['^mu', '^nu', '_mu'])
        self.assertEqual(tensor, et.Tensor([4], ['^nu']))

    def test_contracting_more_complicated_index_structure(self) -> None:
        complicated_tensor = et.Tensor([[[[[[[[[[[[1]]]]]]]]]]]], [
            '^mu', '_nu', '_rho', 'a', 'b', 'c', 'c', 'a', 'e', '^nu', '^rho',
            '_mu'
        ])
        simple_tensor = et.Tensor([[1]], ['b', 'e'])
        self.assertEqual(complicated_tensor, simple_tensor)