|
"""Real spherical harmonics in Cartesian form for PyTorch. |
|
|
|
This is an autogenerated file. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
""" |
|
|
|
import torch |
|
|
|
|
|
def rsh_cart_0(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 0. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,1) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
|
|
return torch.stack( |
|
[ |
|
xyz.new_tensor(0.282094791773878).expand(xyz.shape[:-1]), |
|
], |
|
-1, |
|
) |
|
|
|
|
|
def rsh_cart_1(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 1. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,4) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
x = xyz[..., 0] |
|
y = xyz[..., 1] |
|
z = xyz[..., 2] |
|
|
|
return torch.stack( |
|
[ |
|
xyz.new_tensor(0.282094791773878).expand(xyz.shape[:-1]), |
|
-0.48860251190292 * y, |
|
0.48860251190292 * z, |
|
-0.48860251190292 * x, |
|
], |
|
-1, |
|
) |
|
|
|
|
|
def rsh_cart_2(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 2. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,9) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
x = xyz[..., 0] |
|
y = xyz[..., 1] |
|
z = xyz[..., 2] |
|
|
|
x2 = x**2 |
|
y2 = y**2 |
|
z2 = z**2 |
|
xy = x * y |
|
xz = x * z |
|
yz = y * z |
|
|
|
return torch.stack( |
|
[ |
|
xyz.new_tensor(0.282094791773878).expand(xyz.shape[:-1]), |
|
-0.48860251190292 * y, |
|
0.48860251190292 * z, |
|
-0.48860251190292 * x, |
|
1.09254843059208 * xy, |
|
-1.09254843059208 * yz, |
|
0.94617469575756 * z2 - 0.31539156525252, |
|
-1.09254843059208 * xz, |
|
0.54627421529604 * x2 - 0.54627421529604 * y2, |
|
], |
|
-1, |
|
) |
|
|
|
|
|
def rsh_cart_3(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 3. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,16) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
x = xyz[..., 0] |
|
y = xyz[..., 1] |
|
z = xyz[..., 2] |
|
|
|
x2 = x**2 |
|
y2 = y**2 |
|
z2 = z**2 |
|
xy = x * y |
|
xz = x * z |
|
yz = y * z |
|
|
|
return torch.stack( |
|
[ |
|
xyz.new_tensor(0.282094791773878).expand(xyz.shape[:-1]), |
|
-0.48860251190292 * y, |
|
0.48860251190292 * z, |
|
-0.48860251190292 * x, |
|
1.09254843059208 * xy, |
|
-1.09254843059208 * yz, |
|
0.94617469575756 * z2 - 0.31539156525252, |
|
-1.09254843059208 * xz, |
|
0.54627421529604 * x2 - 0.54627421529604 * y2, |
|
-0.590043589926644 * y * (3.0 * x2 - y2), |
|
2.89061144264055 * xy * z, |
|
0.304697199642977 * y * (1.5 - 7.5 * z2), |
|
1.24392110863372 * z * (1.5 * z2 - 0.5) - 0.497568443453487 * z, |
|
0.304697199642977 * x * (1.5 - 7.5 * z2), |
|
1.44530572132028 * z * (x2 - y2), |
|
-0.590043589926644 * x * (x2 - 3.0 * y2), |
|
], |
|
-1, |
|
) |
|
|
|
|
|
def rsh_cart_4(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 4. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,25) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
x = xyz[..., 0] |
|
y = xyz[..., 1] |
|
z = xyz[..., 2] |
|
|
|
x2 = x**2 |
|
y2 = y**2 |
|
z2 = z**2 |
|
xy = x * y |
|
xz = x * z |
|
yz = y * z |
|
x4 = x2**2 |
|
y4 = y2**2 |
|
z4 = z2**2 |
|
|
|
return torch.stack( |
|
[ |
|
xyz.new_tensor(0.282094791773878).expand(xyz.shape[:-1]), |
|
-0.48860251190292 * y, |
|
0.48860251190292 * z, |
|
-0.48860251190292 * x, |
|
1.09254843059208 * xy, |
|
-1.09254843059208 * yz, |
|
0.94617469575756 * z2 - 0.31539156525252, |
|
-1.09254843059208 * xz, |
|
0.54627421529604 * x2 - 0.54627421529604 * y2, |
|
-0.590043589926644 * y * (3.0 * x2 - y2), |
|
2.89061144264055 * xy * z, |
|
0.304697199642977 * y * (1.5 - 7.5 * z2), |
|
1.24392110863372 * z * (1.5 * z2 - 0.5) - 0.497568443453487 * z, |
|
0.304697199642977 * x * (1.5 - 7.5 * z2), |
|
1.44530572132028 * z * (x2 - y2), |
|
-0.590043589926644 * x * (x2 - 3.0 * y2), |
|
2.5033429417967 * xy * (x2 - y2), |
|
-1.77013076977993 * yz * (3.0 * x2 - y2), |
|
0.126156626101008 * xy * (52.5 * z2 - 7.5), |
|
0.267618617422916 * y * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
1.48099765681286 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 0.952069922236839 * z2 |
|
+ 0.317356640745613, |
|
0.267618617422916 * x * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
0.063078313050504 * (x2 - y2) * (52.5 * z2 - 7.5), |
|
-1.77013076977993 * xz * (x2 - 3.0 * y2), |
|
-3.75501441269506 * x2 * y2 |
|
+ 0.625835735449176 * x4 |
|
+ 0.625835735449176 * y4, |
|
], |
|
-1, |
|
) |
|
|
|
|
|
def rsh_cart_5(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 5. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,36) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
x = xyz[..., 0] |
|
y = xyz[..., 1] |
|
z = xyz[..., 2] |
|
|
|
x2 = x**2 |
|
y2 = y**2 |
|
z2 = z**2 |
|
xy = x * y |
|
xz = x * z |
|
yz = y * z |
|
x4 = x2**2 |
|
y4 = y2**2 |
|
z4 = z2**2 |
|
|
|
return torch.stack( |
|
[ |
|
xyz.new_tensor(0.282094791773878).expand(xyz.shape[:-1]), |
|
-0.48860251190292 * y, |
|
0.48860251190292 * z, |
|
-0.48860251190292 * x, |
|
1.09254843059208 * xy, |
|
-1.09254843059208 * yz, |
|
0.94617469575756 * z2 - 0.31539156525252, |
|
-1.09254843059208 * xz, |
|
0.54627421529604 * x2 - 0.54627421529604 * y2, |
|
-0.590043589926644 * y * (3.0 * x2 - y2), |
|
2.89061144264055 * xy * z, |
|
0.304697199642977 * y * (1.5 - 7.5 * z2), |
|
1.24392110863372 * z * (1.5 * z2 - 0.5) - 0.497568443453487 * z, |
|
0.304697199642977 * x * (1.5 - 7.5 * z2), |
|
1.44530572132028 * z * (x2 - y2), |
|
-0.590043589926644 * x * (x2 - 3.0 * y2), |
|
2.5033429417967 * xy * (x2 - y2), |
|
-1.77013076977993 * yz * (3.0 * x2 - y2), |
|
0.126156626101008 * xy * (52.5 * z2 - 7.5), |
|
0.267618617422916 * y * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
1.48099765681286 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 0.952069922236839 * z2 |
|
+ 0.317356640745613, |
|
0.267618617422916 * x * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
0.063078313050504 * (x2 - y2) * (52.5 * z2 - 7.5), |
|
-1.77013076977993 * xz * (x2 - 3.0 * y2), |
|
-3.75501441269506 * x2 * y2 |
|
+ 0.625835735449176 * x4 |
|
+ 0.625835735449176 * y4, |
|
-0.65638205684017 * y * (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
8.30264925952416 * xy * z * (x2 - y2), |
|
0.00931882475114763 * y * (52.5 - 472.5 * z2) * (3.0 * x2 - y2), |
|
0.0913054625709205 * xy * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z), |
|
0.241571547304372 |
|
* y |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
), |
|
-1.24747010616985 * z * (1.5 * z2 - 0.5) |
|
+ 1.6840846433293 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.498988042467941 * z, |
|
0.241571547304372 |
|
* x |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
), |
|
0.0456527312854602 * (x2 - y2) * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z), |
|
0.00931882475114763 * x * (52.5 - 472.5 * z2) * (x2 - 3.0 * y2), |
|
2.07566231488104 * z * (-6.0 * x2 * y2 + x4 + y4), |
|
-0.65638205684017 * x * (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
], |
|
-1, |
|
) |
|
|
|
|
|
def rsh_cart_6(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 6. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,49) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
x = xyz[..., 0] |
|
y = xyz[..., 1] |
|
z = xyz[..., 2] |
|
|
|
x2 = x**2 |
|
y2 = y**2 |
|
z2 = z**2 |
|
xy = x * y |
|
xz = x * z |
|
yz = y * z |
|
x4 = x2**2 |
|
y4 = y2**2 |
|
z4 = z2**2 |
|
|
|
return torch.stack( |
|
[ |
|
xyz.new_tensor(0.282094791773878).expand(xyz.shape[:-1]), |
|
-0.48860251190292 * y, |
|
0.48860251190292 * z, |
|
-0.48860251190292 * x, |
|
1.09254843059208 * xy, |
|
-1.09254843059208 * yz, |
|
0.94617469575756 * z2 - 0.31539156525252, |
|
-1.09254843059208 * xz, |
|
0.54627421529604 * x2 - 0.54627421529604 * y2, |
|
-0.590043589926644 * y * (3.0 * x2 - y2), |
|
2.89061144264055 * xy * z, |
|
0.304697199642977 * y * (1.5 - 7.5 * z2), |
|
1.24392110863372 * z * (1.5 * z2 - 0.5) - 0.497568443453487 * z, |
|
0.304697199642977 * x * (1.5 - 7.5 * z2), |
|
1.44530572132028 * z * (x2 - y2), |
|
-0.590043589926644 * x * (x2 - 3.0 * y2), |
|
2.5033429417967 * xy * (x2 - y2), |
|
-1.77013076977993 * yz * (3.0 * x2 - y2), |
|
0.126156626101008 * xy * (52.5 * z2 - 7.5), |
|
0.267618617422916 * y * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
1.48099765681286 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 0.952069922236839 * z2 |
|
+ 0.317356640745613, |
|
0.267618617422916 * x * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
0.063078313050504 * (x2 - y2) * (52.5 * z2 - 7.5), |
|
-1.77013076977993 * xz * (x2 - 3.0 * y2), |
|
-3.75501441269506 * x2 * y2 |
|
+ 0.625835735449176 * x4 |
|
+ 0.625835735449176 * y4, |
|
-0.65638205684017 * y * (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
8.30264925952416 * xy * z * (x2 - y2), |
|
0.00931882475114763 * y * (52.5 - 472.5 * z2) * (3.0 * x2 - y2), |
|
0.0913054625709205 * xy * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z), |
|
0.241571547304372 |
|
* y |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
), |
|
-1.24747010616985 * z * (1.5 * z2 - 0.5) |
|
+ 1.6840846433293 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.498988042467941 * z, |
|
0.241571547304372 |
|
* x |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
), |
|
0.0456527312854602 * (x2 - y2) * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z), |
|
0.00931882475114763 * x * (52.5 - 472.5 * z2) * (x2 - 3.0 * y2), |
|
2.07566231488104 * z * (-6.0 * x2 * y2 + x4 + y4), |
|
-0.65638205684017 * x * (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
4.09910463115149 * x**4 * xy |
|
- 13.6636821038383 * xy**3 |
|
+ 4.09910463115149 * xy * y**4, |
|
-2.36661916223175 * yz * (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
0.00427144889505798 * xy * (x2 - y2) * (5197.5 * z2 - 472.5), |
|
0.00584892228263444 |
|
* y |
|
* (3.0 * x2 - y2) |
|
* (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z), |
|
0.0701870673916132 |
|
* xy |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
), |
|
0.221950995245231 |
|
* y |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
), |
|
-1.48328138624466 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
+ 1.86469659985043 |
|
* z |
|
* ( |
|
-1.33333333333333 * z * (1.5 * z2 - 0.5) |
|
+ 1.8 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.533333333333333 * z |
|
) |
|
+ 0.953538034014426 * z2 |
|
- 0.317846011338142, |
|
0.221950995245231 |
|
* x |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
), |
|
0.0350935336958066 |
|
* (x2 - y2) |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
), |
|
0.00584892228263444 |
|
* x |
|
* (x2 - 3.0 * y2) |
|
* (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z), |
|
0.0010678622237645 * (5197.5 * z2 - 472.5) * (-6.0 * x2 * y2 + x4 + y4), |
|
-2.36661916223175 * xz * (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
0.683184105191914 * x2**3 |
|
+ 10.2477615778787 * x2 * y4 |
|
- 10.2477615778787 * x4 * y2 |
|
- 0.683184105191914 * y2**3, |
|
], |
|
-1, |
|
) |
|
|
|
|
|
def rsh_cart_7(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 7. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,64) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
x = xyz[..., 0] |
|
y = xyz[..., 1] |
|
z = xyz[..., 2] |
|
|
|
x2 = x**2 |
|
y2 = y**2 |
|
z2 = z**2 |
|
xy = x * y |
|
xz = x * z |
|
yz = y * z |
|
x4 = x2**2 |
|
y4 = y2**2 |
|
z4 = z2**2 |
|
|
|
return torch.stack( |
|
[ |
|
xyz.new_tensor(0.282094791773878).expand(xyz.shape[:-1]), |
|
-0.48860251190292 * y, |
|
0.48860251190292 * z, |
|
-0.48860251190292 * x, |
|
1.09254843059208 * xy, |
|
-1.09254843059208 * yz, |
|
0.94617469575756 * z2 - 0.31539156525252, |
|
-1.09254843059208 * xz, |
|
0.54627421529604 * x2 - 0.54627421529604 * y2, |
|
-0.590043589926644 * y * (3.0 * x2 - y2), |
|
2.89061144264055 * xy * z, |
|
0.304697199642977 * y * (1.5 - 7.5 * z2), |
|
1.24392110863372 * z * (1.5 * z2 - 0.5) - 0.497568443453487 * z, |
|
0.304697199642977 * x * (1.5 - 7.5 * z2), |
|
1.44530572132028 * z * (x2 - y2), |
|
-0.590043589926644 * x * (x2 - 3.0 * y2), |
|
2.5033429417967 * xy * (x2 - y2), |
|
-1.77013076977993 * yz * (3.0 * x2 - y2), |
|
0.126156626101008 * xy * (52.5 * z2 - 7.5), |
|
0.267618617422916 * y * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
1.48099765681286 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 0.952069922236839 * z2 |
|
+ 0.317356640745613, |
|
0.267618617422916 * x * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
0.063078313050504 * (x2 - y2) * (52.5 * z2 - 7.5), |
|
-1.77013076977993 * xz * (x2 - 3.0 * y2), |
|
-3.75501441269506 * x2 * y2 |
|
+ 0.625835735449176 * x4 |
|
+ 0.625835735449176 * y4, |
|
-0.65638205684017 * y * (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
8.30264925952416 * xy * z * (x2 - y2), |
|
0.00931882475114763 * y * (52.5 - 472.5 * z2) * (3.0 * x2 - y2), |
|
0.0913054625709205 * xy * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z), |
|
0.241571547304372 |
|
* y |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
), |
|
-1.24747010616985 * z * (1.5 * z2 - 0.5) |
|
+ 1.6840846433293 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.498988042467941 * z, |
|
0.241571547304372 |
|
* x |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
), |
|
0.0456527312854602 * (x2 - y2) * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z), |
|
0.00931882475114763 * x * (52.5 - 472.5 * z2) * (x2 - 3.0 * y2), |
|
2.07566231488104 * z * (-6.0 * x2 * y2 + x4 + y4), |
|
-0.65638205684017 * x * (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
4.09910463115149 * x**4 * xy |
|
- 13.6636821038383 * xy**3 |
|
+ 4.09910463115149 * xy * y**4, |
|
-2.36661916223175 * yz * (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
0.00427144889505798 * xy * (x2 - y2) * (5197.5 * z2 - 472.5), |
|
0.00584892228263444 |
|
* y |
|
* (3.0 * x2 - y2) |
|
* (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z), |
|
0.0701870673916132 |
|
* xy |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
), |
|
0.221950995245231 |
|
* y |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
), |
|
-1.48328138624466 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
+ 1.86469659985043 |
|
* z |
|
* ( |
|
-1.33333333333333 * z * (1.5 * z2 - 0.5) |
|
+ 1.8 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.533333333333333 * z |
|
) |
|
+ 0.953538034014426 * z2 |
|
- 0.317846011338142, |
|
0.221950995245231 |
|
* x |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
), |
|
0.0350935336958066 |
|
* (x2 - y2) |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
), |
|
0.00584892228263444 |
|
* x |
|
* (x2 - 3.0 * y2) |
|
* (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z), |
|
0.0010678622237645 * (5197.5 * z2 - 472.5) * (-6.0 * x2 * y2 + x4 + y4), |
|
-2.36661916223175 * xz * (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
0.683184105191914 * x2**3 |
|
+ 10.2477615778787 * x2 * y4 |
|
- 10.2477615778787 * x4 * y2 |
|
- 0.683184105191914 * y2**3, |
|
-0.707162732524596 |
|
* y |
|
* (7.0 * x2**3 + 21.0 * x2 * y4 - 35.0 * x4 * y2 - y2**3), |
|
2.6459606618019 * z * (6.0 * x**4 * xy - 20.0 * xy**3 + 6.0 * xy * y**4), |
|
9.98394571852353e-5 |
|
* y |
|
* (5197.5 - 67567.5 * z2) |
|
* (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
0.00239614697244565 |
|
* xy |
|
* (x2 - y2) |
|
* (4.33333333333333 * z * (5197.5 * z2 - 472.5) - 3150.0 * z), |
|
0.00397356022507413 |
|
* y |
|
* (3.0 * x2 - y2) |
|
* ( |
|
3.25 * z * (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z) |
|
+ 1063.125 * z2 |
|
- 118.125 |
|
), |
|
0.0561946276120613 |
|
* xy |
|
* ( |
|
-4.8 * z * (52.5 * z2 - 7.5) |
|
+ 2.6 |
|
* z |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
) |
|
+ 48.0 * z |
|
), |
|
0.206472245902897 |
|
* y |
|
* ( |
|
-2.625 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 2.16666666666667 |
|
* z |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
) |
|
- 10.9375 * z2 |
|
+ 2.1875 |
|
), |
|
1.24862677781952 * z * (1.5 * z2 - 0.5) |
|
- 1.68564615005635 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 2.02901851395672 |
|
* z |
|
* ( |
|
-1.45833333333333 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
+ 1.83333333333333 |
|
* z |
|
* ( |
|
-1.33333333333333 * z * (1.5 * z2 - 0.5) |
|
+ 1.8 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* ( |
|
1.66666666666667 * z * (1.5 * z2 - 0.5) |
|
- 0.666666666666667 * z |
|
) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.533333333333333 * z |
|
) |
|
+ 0.9375 * z2 |
|
- 0.3125 |
|
) |
|
- 0.499450711127808 * z, |
|
0.206472245902897 |
|
* x |
|
* ( |
|
-2.625 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 2.16666666666667 |
|
* z |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
) |
|
- 10.9375 * z2 |
|
+ 2.1875 |
|
), |
|
0.0280973138060306 |
|
* (x2 - y2) |
|
* ( |
|
-4.8 * z * (52.5 * z2 - 7.5) |
|
+ 2.6 |
|
* z |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
) |
|
+ 48.0 * z |
|
), |
|
0.00397356022507413 |
|
* x |
|
* (x2 - 3.0 * y2) |
|
* ( |
|
3.25 * z * (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z) |
|
+ 1063.125 * z2 |
|
- 118.125 |
|
), |
|
0.000599036743111412 |
|
* (4.33333333333333 * z * (5197.5 * z2 - 472.5) - 3150.0 * z) |
|
* (-6.0 * x2 * y2 + x4 + y4), |
|
9.98394571852353e-5 |
|
* x |
|
* (5197.5 - 67567.5 * z2) |
|
* (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
2.6459606618019 * z * (x2**3 + 15.0 * x2 * y4 - 15.0 * x4 * y2 - y2**3), |
|
-0.707162732524596 |
|
* x |
|
* (x2**3 + 35.0 * x2 * y4 - 21.0 * x4 * y2 - 7.0 * y2**3), |
|
], |
|
-1, |
|
) |
|
|
|
|
|
|
|
def rsh_cart_8(xyz: torch.Tensor): |
|
"""Computes all real spherical harmonics up to degree 8. |
|
|
|
This is an autogenerated method. See |
|
https://github.com/cheind/torch-spherical-harmonics |
|
for more information. |
|
|
|
Params: |
|
xyz: (N,...,3) tensor of points on the unit sphere |
|
|
|
Returns: |
|
rsh: (N,...,81) real spherical harmonics |
|
projections of input. Ynm is found at index |
|
`n*(n+1) + m`, with `0 <= n <= degree` and |
|
`-n <= m <= n`. |
|
""" |
|
x = xyz[..., 0] |
|
y = xyz[..., 1] |
|
z = xyz[..., 2] |
|
|
|
x2 = x**2 |
|
y2 = y**2 |
|
z2 = z**2 |
|
xy = x * y |
|
xz = x * z |
|
yz = y * z |
|
x4 = x2**2 |
|
y4 = y2**2 |
|
|
|
return torch.stack( |
|
[ |
|
0.282094791773878 * torch.ones(1, device=xyz.device).expand(xyz.shape[:-1]), |
|
-0.48860251190292 * y, |
|
0.48860251190292 * z, |
|
-0.48860251190292 * x, |
|
1.09254843059208 * xy, |
|
-1.09254843059208 * yz, |
|
0.94617469575756 * z2 - 0.31539156525252, |
|
-1.09254843059208 * xz, |
|
0.54627421529604 * x2 - 0.54627421529604 * y2, |
|
-0.590043589926644 * y * (3.0 * x2 - y2), |
|
2.89061144264055 * xy * z, |
|
0.304697199642977 * y * (1.5 - 7.5 * z2), |
|
1.24392110863372 * z * (1.5 * z2 - 0.5) - 0.497568443453487 * z, |
|
0.304697199642977 * x * (1.5 - 7.5 * z2), |
|
1.44530572132028 * z * (x2 - y2), |
|
-0.590043589926644 * x * (x2 - 3.0 * y2), |
|
2.5033429417967 * xy * (x2 - y2), |
|
-1.77013076977993 * yz * (3.0 * x2 - y2), |
|
0.126156626101008 * xy * (52.5 * z2 - 7.5), |
|
0.267618617422916 * y * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
1.48099765681286 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 0.952069922236839 * z2 |
|
+ 0.317356640745613, |
|
0.267618617422916 * x * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z), |
|
0.063078313050504 * (x2 - y2) * (52.5 * z2 - 7.5), |
|
-1.77013076977993 * xz * (x2 - 3.0 * y2), |
|
-3.75501441269506 * x2 * y2 |
|
+ 0.625835735449176 * x4 |
|
+ 0.625835735449176 * y4, |
|
-0.65638205684017 * y * (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
8.30264925952416 * xy * z * (x2 - y2), |
|
0.00931882475114763 * y * (52.5 - 472.5 * z2) * (3.0 * x2 - y2), |
|
0.0913054625709205 * xy * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z), |
|
0.241571547304372 |
|
* y |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
), |
|
-1.24747010616985 * z * (1.5 * z2 - 0.5) |
|
+ 1.6840846433293 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.498988042467941 * z, |
|
0.241571547304372 |
|
* x |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
), |
|
0.0456527312854602 * (x2 - y2) * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z), |
|
0.00931882475114763 * x * (52.5 - 472.5 * z2) * (x2 - 3.0 * y2), |
|
2.07566231488104 * z * (-6.0 * x2 * y2 + x4 + y4), |
|
-0.65638205684017 * x * (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
4.09910463115149 * x**4 * xy |
|
- 13.6636821038383 * xy**3 |
|
+ 4.09910463115149 * xy * y**4, |
|
-2.36661916223175 * yz * (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
0.00427144889505798 * xy * (x2 - y2) * (5197.5 * z2 - 472.5), |
|
0.00584892228263444 |
|
* y |
|
* (3.0 * x2 - y2) |
|
* (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z), |
|
0.0701870673916132 |
|
* xy |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
), |
|
0.221950995245231 |
|
* y |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
), |
|
-1.48328138624466 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
+ 1.86469659985043 |
|
* z |
|
* ( |
|
-1.33333333333333 * z * (1.5 * z2 - 0.5) |
|
+ 1.8 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.533333333333333 * z |
|
) |
|
+ 0.953538034014426 * z2 |
|
- 0.317846011338142, |
|
0.221950995245231 |
|
* x |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
), |
|
0.0350935336958066 |
|
* (x2 - y2) |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
), |
|
0.00584892228263444 |
|
* x |
|
* (x2 - 3.0 * y2) |
|
* (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z), |
|
0.0010678622237645 * (5197.5 * z2 - 472.5) * (-6.0 * x2 * y2 + x4 + y4), |
|
-2.36661916223175 * xz * (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
0.683184105191914 * x2**3 |
|
+ 10.2477615778787 * x2 * y4 |
|
- 10.2477615778787 * x4 * y2 |
|
- 0.683184105191914 * y2**3, |
|
-0.707162732524596 |
|
* y |
|
* (7.0 * x2**3 + 21.0 * x2 * y4 - 35.0 * x4 * y2 - y2**3), |
|
2.6459606618019 * z * (6.0 * x**4 * xy - 20.0 * xy**3 + 6.0 * xy * y**4), |
|
9.98394571852353e-5 |
|
* y |
|
* (5197.5 - 67567.5 * z2) |
|
* (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
0.00239614697244565 |
|
* xy |
|
* (x2 - y2) |
|
* (4.33333333333333 * z * (5197.5 * z2 - 472.5) - 3150.0 * z), |
|
0.00397356022507413 |
|
* y |
|
* (3.0 * x2 - y2) |
|
* ( |
|
3.25 * z * (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z) |
|
+ 1063.125 * z2 |
|
- 118.125 |
|
), |
|
0.0561946276120613 |
|
* xy |
|
* ( |
|
-4.8 * z * (52.5 * z2 - 7.5) |
|
+ 2.6 |
|
* z |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
) |
|
+ 48.0 * z |
|
), |
|
0.206472245902897 |
|
* y |
|
* ( |
|
-2.625 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 2.16666666666667 |
|
* z |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
) |
|
- 10.9375 * z2 |
|
+ 2.1875 |
|
), |
|
1.24862677781952 * z * (1.5 * z2 - 0.5) |
|
- 1.68564615005635 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 2.02901851395672 |
|
* z |
|
* ( |
|
-1.45833333333333 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
+ 1.83333333333333 |
|
* z |
|
* ( |
|
-1.33333333333333 * z * (1.5 * z2 - 0.5) |
|
+ 1.8 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* ( |
|
1.66666666666667 * z * (1.5 * z2 - 0.5) |
|
- 0.666666666666667 * z |
|
) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.533333333333333 * z |
|
) |
|
+ 0.9375 * z2 |
|
- 0.3125 |
|
) |
|
- 0.499450711127808 * z, |
|
0.206472245902897 |
|
* x |
|
* ( |
|
-2.625 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 2.16666666666667 |
|
* z |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
) |
|
- 10.9375 * z2 |
|
+ 2.1875 |
|
), |
|
0.0280973138060306 |
|
* (x2 - y2) |
|
* ( |
|
-4.8 * z * (52.5 * z2 - 7.5) |
|
+ 2.6 |
|
* z |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
) |
|
+ 48.0 * z |
|
), |
|
0.00397356022507413 |
|
* x |
|
* (x2 - 3.0 * y2) |
|
* ( |
|
3.25 * z * (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z) |
|
+ 1063.125 * z2 |
|
- 118.125 |
|
), |
|
0.000599036743111412 |
|
* (4.33333333333333 * z * (5197.5 * z2 - 472.5) - 3150.0 * z) |
|
* (-6.0 * x2 * y2 + x4 + y4), |
|
9.98394571852353e-5 |
|
* x |
|
* (5197.5 - 67567.5 * z2) |
|
* (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
2.6459606618019 * z * (x2**3 + 15.0 * x2 * y4 - 15.0 * x4 * y2 - y2**3), |
|
-0.707162732524596 |
|
* x |
|
* (x2**3 + 35.0 * x2 * y4 - 21.0 * x4 * y2 - 7.0 * y2**3), |
|
5.83141328139864 * xy * (x2**3 + 7.0 * x2 * y4 - 7.0 * x4 * y2 - y2**3), |
|
-2.91570664069932 |
|
* yz |
|
* (7.0 * x2**3 + 21.0 * x2 * y4 - 35.0 * x4 * y2 - y2**3), |
|
7.87853281621404e-6 |
|
* (1013512.5 * z2 - 67567.5) |
|
* (6.0 * x**4 * xy - 20.0 * xy**3 + 6.0 * xy * y**4), |
|
5.10587282657803e-5 |
|
* y |
|
* (5.0 * z * (5197.5 - 67567.5 * z2) + 41580.0 * z) |
|
* (-10.0 * x2 * y2 + 5.0 * x4 + y4), |
|
0.00147275890257803 |
|
* xy |
|
* (x2 - y2) |
|
* ( |
|
3.75 * z * (4.33333333333333 * z * (5197.5 * z2 - 472.5) - 3150.0 * z) |
|
- 14293.125 * z2 |
|
+ 1299.375 |
|
), |
|
0.0028519853513317 |
|
* y |
|
* (3.0 * x2 - y2) |
|
* ( |
|
-7.33333333333333 * z * (52.5 - 472.5 * z2) |
|
+ 3.0 |
|
* z |
|
* ( |
|
3.25 * z * (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z) |
|
+ 1063.125 * z2 |
|
- 118.125 |
|
) |
|
- 560.0 * z |
|
), |
|
0.0463392770473559 |
|
* xy |
|
* ( |
|
-4.125 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
+ 2.5 |
|
* z |
|
* ( |
|
-4.8 * z * (52.5 * z2 - 7.5) |
|
+ 2.6 |
|
* z |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
) |
|
+ 48.0 * z |
|
) |
|
+ 137.8125 * z2 |
|
- 19.6875 |
|
), |
|
0.193851103820053 |
|
* y |
|
* ( |
|
3.2 * z * (1.5 - 7.5 * z2) |
|
- 2.51428571428571 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
+ 2.14285714285714 |
|
* z |
|
* ( |
|
-2.625 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 2.16666666666667 |
|
* z |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 |
|
* z |
|
* (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
) |
|
- 10.9375 * z2 |
|
+ 2.1875 |
|
) |
|
+ 5.48571428571429 * z |
|
), |
|
1.48417251362228 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.86581687426801 |
|
* z |
|
* ( |
|
-1.33333333333333 * z * (1.5 * z2 - 0.5) |
|
+ 1.8 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.533333333333333 * z |
|
) |
|
+ 2.1808249179756 |
|
* z |
|
* ( |
|
1.14285714285714 * z * (1.5 * z2 - 0.5) |
|
- 1.54285714285714 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 1.85714285714286 |
|
* z |
|
* ( |
|
-1.45833333333333 |
|
* z |
|
* (1.66666666666667 * z * (1.5 * z2 - 0.5) - 0.666666666666667 * z) |
|
+ 1.83333333333333 |
|
* z |
|
* ( |
|
-1.33333333333333 * z * (1.5 * z2 - 0.5) |
|
+ 1.8 |
|
* z |
|
* ( |
|
1.75 |
|
* z |
|
* ( |
|
1.66666666666667 * z * (1.5 * z2 - 0.5) |
|
- 0.666666666666667 * z |
|
) |
|
- 1.125 * z2 |
|
+ 0.375 |
|
) |
|
+ 0.533333333333333 * z |
|
) |
|
+ 0.9375 * z2 |
|
- 0.3125 |
|
) |
|
- 0.457142857142857 * z |
|
) |
|
- 0.954110901614325 * z2 |
|
+ 0.318036967204775, |
|
0.193851103820053 |
|
* x |
|
* ( |
|
3.2 * z * (1.5 - 7.5 * z2) |
|
- 2.51428571428571 |
|
* z |
|
* ( |
|
2.25 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
+ 2.14285714285714 |
|
* z |
|
* ( |
|
-2.625 * z * (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 2.16666666666667 |
|
* z |
|
* ( |
|
-2.8 * z * (1.5 - 7.5 * z2) |
|
+ 2.2 |
|
* z |
|
* ( |
|
2.25 |
|
* z |
|
* (2.33333333333333 * z * (1.5 - 7.5 * z2) + 4.0 * z) |
|
+ 9.375 * z2 |
|
- 1.875 |
|
) |
|
- 4.8 * z |
|
) |
|
- 10.9375 * z2 |
|
+ 2.1875 |
|
) |
|
+ 5.48571428571429 * z |
|
), |
|
0.0231696385236779 |
|
* (x2 - y2) |
|
* ( |
|
-4.125 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
+ 2.5 |
|
* z |
|
* ( |
|
-4.8 * z * (52.5 * z2 - 7.5) |
|
+ 2.6 |
|
* z |
|
* ( |
|
2.75 * z * (3.0 * z * (52.5 * z2 - 7.5) - 30.0 * z) |
|
- 91.875 * z2 |
|
+ 13.125 |
|
) |
|
+ 48.0 * z |
|
) |
|
+ 137.8125 * z2 |
|
- 19.6875 |
|
), |
|
0.0028519853513317 |
|
* x |
|
* (x2 - 3.0 * y2) |
|
* ( |
|
-7.33333333333333 * z * (52.5 - 472.5 * z2) |
|
+ 3.0 |
|
* z |
|
* ( |
|
3.25 * z * (3.66666666666667 * z * (52.5 - 472.5 * z2) + 280.0 * z) |
|
+ 1063.125 * z2 |
|
- 118.125 |
|
) |
|
- 560.0 * z |
|
), |
|
0.000368189725644507 |
|
* (-6.0 * x2 * y2 + x4 + y4) |
|
* ( |
|
3.75 * z * (4.33333333333333 * z * (5197.5 * z2 - 472.5) - 3150.0 * z) |
|
- 14293.125 * z2 |
|
+ 1299.375 |
|
), |
|
5.10587282657803e-5 |
|
* x |
|
* (5.0 * z * (5197.5 - 67567.5 * z2) + 41580.0 * z) |
|
* (-10.0 * x2 * y2 + x4 + 5.0 * y4), |
|
7.87853281621404e-6 |
|
* (1013512.5 * z2 - 67567.5) |
|
* (x2**3 + 15.0 * x2 * y4 - 15.0 * x4 * y2 - y2**3), |
|
-2.91570664069932 |
|
* xz |
|
* (x2**3 + 35.0 * x2 * y4 - 21.0 * x4 * y2 - 7.0 * y2**3), |
|
-20.4099464848952 * x2**3 * y2 |
|
- 20.4099464848952 * x2 * y2**3 |
|
+ 0.72892666017483 * x4**2 |
|
+ 51.0248662122381 * x4 * y4 |
|
+ 0.72892666017483 * y4**2, |
|
], |
|
-1, |
|
) |
|
|
|
|
|
__all__ = [ |
|
"rsh_cart_0", |
|
"rsh_cart_1", |
|
"rsh_cart_2", |
|
"rsh_cart_3", |
|
"rsh_cart_4", |
|
"rsh_cart_5", |
|
"rsh_cart_6", |
|
"rsh_cart_7", |
|
"rsh_cart_8", |
|
] |
|
|
|
|
|
from typing import Optional |
|
import torch |
|
|
|
|
|
class SphHarm(torch.nn.Module): |
|
def __init__(self, m, n, dtype=torch.float32) -> None: |
|
super().__init__() |
|
self.dtype = dtype |
|
m = torch.tensor(list(range(-m + 1, m))) |
|
n = torch.tensor(list(range(n))) |
|
self.is_normalized = False |
|
vals = torch.cartesian_prod(m, n).T |
|
vals = vals[:, vals[0] <= vals[1]] |
|
m, n = vals.unbind(0) |
|
|
|
self.register_buffer("m", tensor=m) |
|
self.register_buffer("n", tensor=n) |
|
self.register_buffer("l_max", tensor=torch.max(self.n)) |
|
|
|
f_a, f_b, initial_value, d0_mask_3d, d1_mask_3d = self._init_legendre() |
|
self.register_buffer("f_a", tensor=f_a) |
|
self.register_buffer("f_b", tensor=f_b) |
|
self.register_buffer("d0_mask_3d", tensor=d0_mask_3d) |
|
self.register_buffer("d1_mask_3d", tensor=d1_mask_3d) |
|
self.register_buffer("initial_value", tensor=initial_value) |
|
|
|
@property |
|
def device(self): |
|
return next(self.buffers()).device |
|
|
|
def forward(self, points: torch.Tensor) -> torch.Tensor: |
|
"""Computes the spherical harmonics.""" |
|
|
|
B, N, D = points.shape |
|
dtype = points.dtype |
|
theta, phi = points.view(-1, D).to(self.dtype).unbind(-1) |
|
cos_colatitude = torch.cos(phi) |
|
legendre = self._gen_associated_legendre(cos_colatitude) |
|
vals = torch.stack([self.m.abs(), self.n], dim=0) |
|
vals = torch.cat( |
|
[ |
|
vals.repeat(1, theta.shape[0]), |
|
torch.arange(theta.shape[0], device=theta.device) |
|
.unsqueeze(0) |
|
.repeat_interleave(vals.shape[1], dim=1), |
|
], |
|
dim=0, |
|
) |
|
legendre_vals = legendre[vals[0], vals[1], vals[2]] |
|
legendre_vals = legendre_vals.reshape(-1, theta.shape[0]) |
|
angle = torch.outer(self.m.abs(), theta) |
|
vandermonde = torch.complex(torch.cos(angle), torch.sin(angle)) |
|
harmonics = torch.complex( |
|
legendre_vals * torch.real(vandermonde), |
|
legendre_vals * torch.imag(vandermonde), |
|
) |
|
|
|
|
|
m = self.m.unsqueeze(-1) |
|
harmonics = torch.where( |
|
m < 0, (-1.0) ** m.abs() * torch.conj(harmonics), harmonics |
|
) |
|
harmonics = harmonics.permute(1, 0).reshape(B, N, -1).to(dtype) |
|
return harmonics |
|
|
|
def _gen_recurrence_mask(self) -> tuple[torch.Tensor, torch.Tensor]: |
|
"""Generates mask for recurrence relation on the remaining entries. |
|
|
|
The remaining entries are with respect to the diagonal and offdiagonal |
|
entries. |
|
|
|
Args: |
|
l_max: see `gen_normalized_legendre`. |
|
Returns: |
|
torch.Tensors representing the mask used by the recurrence relations. |
|
""" |
|
|
|
|
|
m_mat, l_mat = torch.meshgrid( |
|
torch.arange(0, self.l_max + 1, device=self.device, dtype=self.dtype), |
|
torch.arange(0, self.l_max + 1, device=self.device, dtype=self.dtype), |
|
indexing="ij", |
|
) |
|
if self.is_normalized: |
|
c0 = l_mat * l_mat |
|
c1 = m_mat * m_mat |
|
c2 = 2.0 * l_mat |
|
c3 = (l_mat - 1.0) * (l_mat - 1.0) |
|
d0 = torch.sqrt((4.0 * c0 - 1.0) / (c0 - c1)) |
|
d1 = torch.sqrt(((c2 + 1.0) * (c3 - c1)) / ((c2 - 3.0) * (c0 - c1))) |
|
else: |
|
d0 = (2.0 * l_mat - 1.0) / (l_mat - m_mat) |
|
d1 = (l_mat + m_mat - 1.0) / (l_mat - m_mat) |
|
|
|
d0_mask_indices = torch.triu_indices(self.l_max + 1, 1) |
|
d1_mask_indices = torch.triu_indices(self.l_max + 1, 2) |
|
|
|
d_zeros = torch.zeros( |
|
(self.l_max + 1, self.l_max + 1), dtype=self.dtype, device=self.device |
|
) |
|
d_zeros[d0_mask_indices] = d0[d0_mask_indices] |
|
d0_mask = d_zeros |
|
|
|
d_zeros = torch.zeros( |
|
(self.l_max + 1, self.l_max + 1), dtype=self.dtype, device=self.device |
|
) |
|
d_zeros[d1_mask_indices] = d1[d1_mask_indices] |
|
d1_mask = d_zeros |
|
|
|
|
|
i = torch.arange(self.l_max + 1, device=self.device)[:, None, None] |
|
j = torch.arange(self.l_max + 1, device=self.device)[None, :, None] |
|
k = torch.arange(self.l_max + 1, device=self.device)[None, None, :] |
|
mask = (i + j - k == 0).to(self.dtype) |
|
d0_mask_3d = torch.einsum("jk,ijk->ijk", d0_mask, mask) |
|
d1_mask_3d = torch.einsum("jk,ijk->ijk", d1_mask, mask) |
|
return (d0_mask_3d, d1_mask_3d) |
|
|
|
def _recursive(self, i: int, p_val: torch.Tensor, x: torch.Tensor) -> torch.Tensor: |
|
coeff_0 = self.d0_mask_3d[i] |
|
coeff_1 = self.d1_mask_3d[i] |
|
h = torch.einsum( |
|
"ij,ijk->ijk", |
|
coeff_0, |
|
torch.einsum("ijk,k->ijk", torch.roll(p_val, shifts=1, dims=1), x), |
|
) - torch.einsum("ij,ijk->ijk", coeff_1, torch.roll(p_val, shifts=2, dims=1)) |
|
p_val = p_val + h |
|
return p_val |
|
|
|
def _init_legendre(self): |
|
a_idx = torch.arange(1, self.l_max + 1, dtype=self.dtype, device=self.device) |
|
b_idx = torch.arange(self.l_max, dtype=self.dtype, device=self.device) |
|
if self.is_normalized: |
|
|
|
initial_value: torch.Tensor = torch.tensor( |
|
0.5 / (torch.pi**0.5), device=self.device |
|
) |
|
f_a = torch.cumprod(-1 * torch.sqrt(1.0 + 0.5 / a_idx), dim=0) |
|
f_b = torch.sqrt(2.0 * b_idx + 3.0) |
|
else: |
|
|
|
initial_value = torch.tensor(1.0, device=self.device) |
|
f_a = torch.cumprod(1.0 - 2.0 * a_idx, dim=0) |
|
f_b = 2.0 * b_idx + 1.0 |
|
|
|
d0_mask_3d, d1_mask_3d = self._gen_recurrence_mask() |
|
return f_a, f_b, initial_value, d0_mask_3d, d1_mask_3d |
|
|
|
def _gen_associated_legendre(self, x: torch.Tensor) -> torch.Tensor: |
|
r"""Computes associated Legendre functions (ALFs) of the first kind. |
|
|
|
The ALFs of the first kind are used in spherical harmonics. The spherical |
|
harmonic of degree `l` and order `m` can be written as |
|
`Y_l^m(θ, φ) = N_l^m * P_l^m(cos(θ)) * exp(i m φ)`, where `N_l^m` is the |
|
normalization factor and θ and φ are the colatitude and longitude, |
|
repectively. `N_l^m` is chosen in the way that the spherical harmonics form |
|
a set of orthonormal basis function of L^2(S^2). For the computational |
|
efficiency of spherical harmonics transform, the normalization factor is |
|
used in the computation of the ALFs. In addition, normalizing `P_l^m` |
|
avoids overflow/underflow and achieves better numerical stability. Three |
|
recurrence relations are used in the computation. |
|
|
|
Args: |
|
l_max: The maximum degree of the associated Legendre function. Both the |
|
degrees and orders are `[0, 1, 2, ..., l_max]`. |
|
x: A vector of type `float32`, `float64` containing the sampled points in |
|
spherical coordinates, at which the ALFs are computed; `x` is essentially |
|
`cos(θ)`. For the numerical integration used by the spherical harmonics |
|
transforms, `x` contains the quadrature points in the interval of |
|
`[-1, 1]`. There are several approaches to provide the quadrature points: |
|
Gauss-Legendre method (`scipy.special.roots_legendre`), Gauss-Chebyshev |
|
method (`scipy.special.roots_chebyu`), and Driscoll & Healy |
|
method (Driscoll, James R., and Dennis M. Healy. "Computing Fourier |
|
transforms and convolutions on the 2-sphere." Advances in applied |
|
mathematics 15, no. 2 (1994): 202-250.). The Gauss-Legendre quadrature |
|
points are nearly equal-spaced along θ and provide exact discrete |
|
orthogonality, (P^m)^T W P_m = I, where `T` represents the transpose |
|
operation, `W` is a diagonal matrix containing the quadrature weights, |
|
and `I` is the identity matrix. The Gauss-Chebyshev points are equally |
|
spaced, which only provide approximate discrete orthogonality. The |
|
Driscoll & Healy qudarture points are equally spaced and provide the |
|
exact discrete orthogonality. The number of sampling points is required to |
|
be twice as the number of frequency points (modes) in the Driscoll & Healy |
|
approach, which enables FFT and achieves a fast spherical harmonics |
|
transform. |
|
is_normalized: True if the associated Legendre functions are normalized. |
|
With normalization, `N_l^m` is applied such that the spherical harmonics |
|
form a set of orthonormal basis functions of L^2(S^2). |
|
|
|
Returns: |
|
The 3D array of shape `(l_max + 1, l_max + 1, len(x))` containing the values |
|
of the ALFs at `x`; the dimensions in the sequence of order, degree, and |
|
evalution points. |
|
""" |
|
p = torch.zeros( |
|
(self.l_max + 1, self.l_max + 1, x.shape[0]), dtype=x.dtype, device=x.device |
|
) |
|
p[0, 0] = self.initial_value |
|
|
|
|
|
y = torch.cumprod( |
|
torch.broadcast_to(torch.sqrt(1.0 - x * x), (self.l_max, x.shape[0])), dim=0 |
|
) |
|
p_diag = self.initial_value * torch.einsum("i,ij->ij", self.f_a, y) |
|
|
|
diag_indices = torch.stack( |
|
[torch.arange(0, self.l_max + 1, device=x.device)] * 2, dim=0 |
|
) |
|
p[(diag_indices[0][1:], diag_indices[1][1:])] = p_diag |
|
|
|
diag_indices = torch.stack( |
|
[torch.arange(0, self.l_max, device=x.device)] * 2, dim=0 |
|
) |
|
|
|
|
|
p_offdiag = torch.einsum( |
|
"ij,ij->ij", |
|
torch.einsum("i,j->ij", self.f_b, x), |
|
p[(diag_indices[0], diag_indices[1])], |
|
) |
|
p[(diag_indices[0][: self.l_max], diag_indices[1][: self.l_max] + 1)] = ( |
|
p_offdiag |
|
) |
|
|
|
|
|
if self.l_max > 1: |
|
for i in range(2, self.l_max + 1): |
|
p = self._recursive(i, p, x) |
|
return p |
|
|