RepArray#

class cuequivariance_jax.RepArray(
reps: dict[int, Rep] | Rep | Irreps | str | dict[int, Irreps] | dict[int, str],
array: Array,
layout: IrrepsLayout | None = None,
)#

一个用 cue.Rep 字典装饰的 jax.Array,用于在群表示下变换的轴。

示例

您可以通过为每个轴指定 cue.Rep 来创建一个 cuex.RepArray

>>> cuex.RepArray({0: cue.SO3(1), 1: cue.SO3(1)}, jnp.eye(3))
{0: 1, 1: 1}
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

默认情况下,不是 cue.Rep 的参数将自动转换为 cue.IrrepsAndLayout

>>> with cue.assume(cue.SO3, cue.ir_mul):
...     x = cuex.RepArray({0: "1", 1: "2"}, jnp.ones((3, 5)))
>>> x
{0: 1, 1: 2}
[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
>>> x.rep(0).irreps, x.rep(0).layout
(1, (irrep,mul))

IrrepsArray

IrrepsArray 只是 RepArray 的一个特例,其中最后一个轴是 cue.IrrepsAndLayout

>>> x = cuex.RepArray(
...     cue.Irreps("SO3", "2x0"), jnp.zeros((3, 2)), cue.ir_mul
... )
>>> x
{1: 2x0}
[[0. 0.]
 [0. 0.]
 [0. 0.]]
>>> x.is_irreps_array()
True

您可以使用默认的群和布局

>>> with cue.assume(cue.SO3, cue.ir_mul):
...     cuex.RepArray("2x0", jnp.array([1.0, 2.0]))
{0: 2x0} [1. 2.]

算术

支持基本的算术运算,只要它们是等变的

>>> with cue.assume(cue.SO3, cue.ir_mul):
...     x = cuex.RepArray("2x0", jnp.array([1.0, 2.0]))
...     y = cuex.RepArray("2x0", jnp.array([3.0, 4.0]))
...     x + y
{0: 2x0} [4. 6.]
>>> 3.0 * x
{0: 2x0} [3. 6.]
property shape: tuple[int, ...]#

数组的形状。

property ndim: int#

数组的维度数。

property dtype: dtype#

数组的数据类型。

is_irreps_array() bool#

检查 RepArray 是否是 IrrepsArray

IrrepsArray 是一个 RepArray,其中最后一个轴是一个 IrrepsAndLayout

rep(axis: int) Rep#

返回给定轴的 Rep。

property irreps: Irreps#

返回 IrrepsArrayIrreps

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array

property layout: IrrepsLayout#

返回 IrrepsArray 的布局。

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array

property slice_by_mul: _MulIndexSliceHelper#

返回关于重数的切片。

示例

>>> x = cuex.RepArray(
...     cue.Irreps("SO3", "2x0 + 1"),
...     jnp.array([1.0, 2.0, 0.0, 0.0, 0.0]),
...     cue.ir_mul
... )
>>> x.slice_by_mul[1:4]
{0: 0+1} [2. 0. 0. 0.]

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array

transform(
v: Array,
) RepArray#

根据表示变换数组。

参数:

v – 角度向量。

示例

>>> x = cuex.RepArray(
...     {0: cue.SO3(1), 1: cue.SO3(1)}, jnp.ones((3, 3))
... )
>>> x
{0: 1, 1: 1}
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
>>> x.transform(jnp.array([np.pi, 0.0, 0.0])).array.round(1)
Array([[ 1., -1., -1.],
       [-1.,  1.,  1.],
       [-1.,  1.,  1.]]...)
property segments: list[Array]#

将数组分割成段。

示例

>>> x = cuex.RepArray(
...     cue.Irreps("SO3", "2x0 + 1"), jnp.array([1.0, 2.0, 0.0, 0.0, 0.0]),
...     cue.ir_mul
... )
>>> x.segments
[Array(...), Array(...)]

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array

filter(
*,
keep: str | Sequence[Irrep] | Callable[[MulIrrep], bool] | None = None,
drop: str | Sequence[Irrep] | Callable[[MulIrrep], bool] | None = None,
mask: Sequence[bool] | None = None,
) RepArray#

过滤 irreps。

参数:
  • keep – 要保留的 Irreps。

  • drop – 要丢弃的 Irreps。

  • mask – 用于保留段的布尔掩码。

  • axis – 要过滤的轴。

示例

>>> x = cuex.RepArray(
...     cue.Irreps("SO3", "2x0 + 1"),
...     jnp.array([1.0, 2.0, 0.0, 0.0, 0.0]), cue.ir_mul
... )
>>> x.filter(keep="0")
{0: 2x0} [1. 2.]
>>> x.filter(drop="0")
{0: 1} [0. 0. 0.]
>>> x.filter(mask=[True, False])
{0: 2x0} [1. 2.]

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array

sort() RepArray#

排序 irreps。

示例

>>> x = cuex.RepArray(
...     cue.Irreps("SO3", "1 + 2x0"),
...     jnp.array([1.0, 1.0, 1.0, 2.0, 3.0]), cue.ir_mul
... )
>>> x.sort()
{0: 2x0+1} [2. 3. 1. 1. 1.]

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array

regroup() RepArray#

清理 irreps。

示例

>>> x = cuex.RepArray(
...     cue.Irreps("SO3", "0 + 1 + 0"), jnp.array([0., 1., 2., 3., -1.]),
...     cue.ir_mul
... )
>>> x.regroup()
{0: 2x0+1} [ 0. -1.  1.  2.  3.]

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array

change_layout(
layout: IrrepsLayout,
) RepArray#

更改 IrrepsArray 的布局。

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array

move_axis_to_mul(
axis: int,
) RepArray#

将轴移动到重数。

注意

此方法仅适用于 IrrepsArray。 请参阅 is_irreps_array