Irreps

A group representation \((D,V)\) describe the action of a group \(G\) on a vector space \(V\)

\[D : G \longrightarrow \text{linear map on } V.\]

The irreducible representations, in short irreps (definition of irreps) are the “smallest” representations.

  • Any representation can be decomposed via a change of basis into a direct sum of irreps

  • Any physical quantity, under the action of \(O(3)\), transforms with a representation of \(O(3)\)

The irreps of \(SO(3)\) are called the wigner matrices \(D^L\). The irreps of the group of inversion (\(\{e, I\}\)) are the trivial representation \(\sigma_+\) and the sign representation \(\sigma_-\)

\[\begin{split}\sigma_p(g) = \left \{ \begin{array}{l} 1 \text{ if } g = e \\ p \text{ if } g = I \end{array} \right..\end{split}\]

The group \(O(3)\) is the direct product of \(SO(3)\) and inversion

\[g = r i, \quad r \in SO(3), i \in \text{inversion}.\]

The irreps of \(O(3)\) are the product of the irreps of \(SO(3)\) and inversion. An instance of the class e3nn.o3.Irreps represent a direct sum of irreps of \(O(3)\):

\[g = r i \mapsto \bigoplus_{j=1}^n m_j \times \sigma_{p_j}(i) D^{L_j}(r)\]

where \((m_j \in \mathbb{N}, p_j = \pm 1, L_j = 0,1,2,3,\dots)_{j=1}^n\) defines the e3nn.o3.Irreps.

Irreps of \(O(3)\) are often confused with the spherical harmonics, the relation between the irreps and the spherical harmonics is explained at Spherical Harmonics.

class e3nn.o3.Irrep(l: int | Irrep | str | tuple, p=None)[source]

Bases: tuple

Irreducible representation of \(O(3)\)

This class does not contain any data, it is a structure that describe the representation. It is typically used as argument of other classes of the library to define the input and output representations of functions.

Parameters:
  • l (int) – non-negative integer, the degree of the representation, \(l = 0, 1, \dots\)

  • p ({1, -1}) – the parity of the representation

Examples

Create a scalar representation (\(l=0\)) of even parity.

>>> Irrep(0, 1)
0e

Create a pseudotensor representation (\(l=2\)) of odd parity.

>>> Irrep(2, -1)
2o

Create a vector representation (\(l=1\)) of the parity of the spherical harmonics (\(-1^l\) gives odd parity).

>>> Irrep("1y")
1o
>>> Irrep("2o").dim
5
>>> Irrep("2e") in Irrep("1o") * Irrep("1o")
True
>>> Irrep("1o") + Irrep("2o")
1x1o+1x2o

Methods:

D_from_angles(alpha, beta, gamma[, k])

Matrix \(p^k D^l(\alpha, \beta, \gamma)\)

D_from_axis_angle(axis, angle)

Matrix of the representation, see Irrep.D_from_angles

D_from_matrix(R)

Matrix of the representation, see Irrep.D_from_angles

D_from_quaternion(q[, k])

Matrix of the representation, see Irrep.D_from_angles

count(_value)

Return number of occurrences of value.

index(_value)

Return first index of value.

is_scalar()

Equivalent to l == 0 and p == 1

iterator([lmax])

Iterator through all the irreps of \(O(3)\)

Attributes:

dim

The dimension of the representation, \(2 l + 1\).

l

The degree of the representation, \(l = 0, 1, \dots\).

p

The parity of the representation, \(p = \pm 1\).

D_from_angles(alpha, beta, gamma, k=None) Tensor[source]

Matrix \(p^k D^l(\alpha, \beta, \gamma)\)

(matrix) Representation of \(O(3)\). \(D\) is the representation of \(SO(3)\), see wigner_D.

Parameters:
  • alpha (torch.Tensor) – tensor of shape \((...)\) Rotation \(\alpha\) around Y axis, applied third.

  • beta (torch.Tensor) – tensor of shape \((...)\) Rotation \(\beta\) around X axis, applied second.

  • gamma (torch.Tensor) – tensor of shape \((...)\) Rotation \(\gamma\) around Y axis, applied first.

  • k (torch.Tensor, optional) – tensor of shape \((...)\) How many times the parity is applied.

Returns:

tensor of shape \((..., 2l+1, 2l+1)\)

Return type:

torch.Tensor

See also

o3.wigner_D, Irreps.D_from_angles

D_from_axis_angle(axis, angle) Tensor[source]

Matrix of the representation, see Irrep.D_from_angles

Parameters:
Returns:

tensor of shape \((..., 2l+1, 2l+1)\)

Return type:

torch.Tensor

D_from_matrix(R) Tensor[source]

Matrix of the representation, see Irrep.D_from_angles

Parameters:
Returns:

tensor of shape \((..., 2l+1, 2l+1)\)

Return type:

torch.Tensor

Examples

>>> m = Irrep(1, -1).D_from_matrix(-torch.eye(3))
>>> m.long()
tensor([[-1,  0,  0],
        [ 0, -1,  0],
        [ 0,  0, -1]])
D_from_quaternion(q, k=None) Tensor[source]

Matrix of the representation, see Irrep.D_from_angles

Parameters:
Returns:

tensor of shape \((..., 2l+1, 2l+1)\)

Return type:

torch.Tensor

count(_value)[source]

Return number of occurrences of value.

property dim: int[source]

The dimension of the representation, \(2 l + 1\).

index(_value)[source]

Return first index of value.

Raises ValueError if the value is not present.

is_scalar() bool[source]

Equivalent to l == 0 and p == 1

classmethod iterator(lmax=None)[source]

Iterator through all the irreps of \(O(3)\)

Examples

>>> it = Irrep.iterator()
>>> next(it), next(it), next(it), next(it)
(0e, 0o, 1o, 1e)
property l: int[source]

The degree of the representation, \(l = 0, 1, \dots\).

property p: int[source]

The parity of the representation, \(p = \pm 1\).

class e3nn.o3.Irreps(irreps=None)[source]

Bases: tuple

Direct sum of irreducible representations of \(O(3)\)

This class does not contain any data, it is a structure that describe the representation. It is typically used as argument of other classes of the library to define the input and output representations of functions.

dim[source]

the total dimension of the representation

Type:

int

num_irreps[source]

number of irreps. the sum of the multiplicities

Type:

int

ls[source]

list of \(l\) values

Type:

list of int

lmax[source]

maximum \(l\) value

Type:

int

Examples

Create a representation of 100 \(l=0\) of even parity and 50 pseudo-vectors.

>>> x = Irreps([(100, (0, 1)), (50, (1, 1))])
>>> x
100x0e+50x1e
>>> x.dim
250

Create a representation of 100 \(l=0\) of even parity and 50 pseudo-vectors.

>>> Irreps("100x0e + 50x1e")
100x0e+50x1e
>>> Irreps("100x0e + 50x1e + 0x2e")
100x0e+50x1e+0x2e
>>> Irreps("100x0e + 50x1e + 0x2e").lmax
1
>>> Irrep("2e") in Irreps("0e + 2e")
True

Empty Irreps

>>> Irreps(), Irreps("")
(, )

Methods:

D_from_angles(alpha, beta, gamma[, k])

Matrix of the representation

D_from_axis_angle(axis, angle)

Matrix of the representation

D_from_matrix(R)

Matrix of the representation

D_from_quaternion(q[, k])

Matrix of the representation

count(ir)

Multiplicity of ir.

index(_object)

Return first index of value.

randn(*size[, normalization, requires_grad, ...])

Random tensor.

remove_zero_multiplicities()

Remove any irreps with multiplicities of zero.

simplify()

Simplify the representations.

slices()

List of slices corresponding to indices for each irrep.

sort()

Sort the representations.

spherical_harmonics(lmax[, p])

representation of the spherical harmonics

D_from_angles(alpha, beta, gamma, k=None)[source]

Matrix of the representation

Parameters:
Returns:

tensor of shape \((..., \mathrm{dim}, \mathrm{dim})\)

Return type:

torch.Tensor

D_from_axis_angle(axis, angle)[source]

Matrix of the representation

Parameters:
Returns:

tensor of shape \((..., \mathrm{dim}, \mathrm{dim})\)

Return type:

torch.Tensor

D_from_matrix(R)[source]

Matrix of the representation

Parameters:

R (torch.Tensor) – tensor of shape \((..., 3, 3)\)

Returns:

tensor of shape \((..., \mathrm{dim}, \mathrm{dim})\)

Return type:

torch.Tensor

D_from_quaternion(q, k=None)[source]

Matrix of the representation

Parameters:
Returns:

tensor of shape \((..., \mathrm{dim}, \mathrm{dim})\)

Return type:

torch.Tensor

count(ir) int[source]

Multiplicity of ir.

Parameters:

ir (e3nn.o3.Irrep) –

Returns:

total multiplicity of ir

Return type:

int

index(_object)[source]

Return first index of value.

Raises ValueError if the value is not present.

randn(*size: int, normalization: str = 'component', requires_grad: bool = False, dtype=None, device=None) Tensor[source]

Random tensor.

Parameters:
  • *size (list of int) – size of the output tensor, needs to contains a -1

  • normalization ({'component', 'norm'}) –

Returns:

tensor of shape size where -1 is replaced by self.dim

Return type:

torch.Tensor

Examples

>>> Irreps("5x0e + 10x1o").randn(5, -1, 5, normalization='norm').shape
torch.Size([5, 35, 5])
>>> random_tensor = Irreps("2o").randn(2, -1, 3, normalization='norm')
>>> random_tensor.norm(dim=1).sub(1).abs().max().item() < 1e-5
True
remove_zero_multiplicities() Irreps[source]

Remove any irreps with multiplicities of zero.

Return type:

e3nn.o3.Irreps

Examples

>>> Irreps("4x0e + 0x1o + 2x3e").remove_zero_multiplicities()
4x0e+2x3e
simplify() Irreps[source]

Simplify the representations.

Return type:

e3nn.o3.Irreps

Examples

Note that simplify does not sort the representations.

>>> Irreps("1e + 1e + 0e").simplify()
2x1e+1x0e

Equivalent representations which are separated from each other are not combined.

>>> Irreps("1e + 1e + 0e + 1e").simplify()
2x1e+1x0e+1x1e
slices()[source]

List of slices corresponding to indices for each irrep.

Examples

>>> Irreps('2x0e + 1e').slices()
[slice(0, 2, None), slice(2, 5, None)]
sort()[source]

Sort the representations.

Returns:

Examples

>>> Irreps("1e + 0e + 1e").sort().irreps
1x0e+1x1e+1x1e
>>> Irreps("2o + 1e + 0e + 1e").sort().p
(3, 1, 0, 2)
>>> Irreps("2o + 1e + 0e + 1e").sort().inv
(2, 1, 3, 0)
static spherical_harmonics(lmax: int, p: int = -1) Irreps[source]

representation of the spherical harmonics

Parameters:
  • lmax (int) – maximum \(l\)

  • p ({1, -1}) – the parity of the representation

Returns:

representation of \((Y^0, Y^1, \dots, Y^{\mathrm{lmax}})\)

Return type:

e3nn.o3.Irreps

Examples

>>> Irreps.spherical_harmonics(3)
1x0e+1x1o+1x2e+1x3o
>>> Irreps.spherical_harmonics(4, p=1)
1x0e+1x1e+1x2e+1x3e+1x4e