Coverage for hiphive/core/tensors.py: 100%

27 statements  

« prev     ^ index     » next       coverage.py v7.10.1, created at 2025-08-01 17:04 +0000

1""" 

2Module containing tensor related functions 

3""" 

4 

5import numpy as np 

6 

7 

8_paths = dict() 

9 

10 

11def rotation_tensor_as_matrix(R, order): 

12 einsum_input = [] 

13 for i in range(order): 

14 einsum_input.append(R) 

15 einsum_input.append([i, order + i]) 

16 R_tensor = np.einsum(*einsum_input) 

17 R_matrix = R_tensor.reshape((3**order, 3**order)) 

18 return R_matrix 

19 

20 

21def rotate_tensor_precalc(T, R): 

22 order = len(T.shape) 

23 return np.dot(T.ravel(), R).reshape((3,) * order) 

24 

25 

26def rotate_tensor(T, R, path=None): 

27 r"""Equivalent to 

28 :math:`T_{abc} \ldots = T_{ijk} \ldots R_{ia} R_{jb} R_{kc} \ldots`.""" 

29 

30 order = len(T.shape) 

31 if order not in _paths: 

32 path = ['einsum_path', (0, 1)] 

33 for i in range(order - 1, 0, -1): 

34 path.append((0, i)) 

35 _paths[order] = path 

36 

37 einsum_input = [T, list(range(order))] 

38 for i in range(order): 

39 einsum_input.append(R) 

40 einsum_input.append([i, order + i]) 

41 return np.einsum(*einsum_input, optimize=_paths[order]) 

42 

43 

44def rotation_to_cart_coord(R: np.ndarray, cell: np.ndarray): 

45 """Returns the rotation matrix in cart coord given a cell metric. """ 

46 return np.dot(np.dot(cell.T, R), np.linalg.inv(cell.T))