Source code for enerzyme.models.layers.gradient
import torch
from torch import Tensor
from torch.autograd import grad
from torch.autograd.functional import jacobian
from ..layers import BaseFFLayer
[docs]
class ForceLayer(BaseFFLayer):
[docs]
def __init__(self) -> None:
super().__init__(input_fields={"E", "Ra"}, output_fields={"Fa"})
[docs]
def get_Fa(self, E: Tensor, Ra: Tensor) -> Tensor:
if E.dim() > 1:
return torch.stack([-grad(torch.sum(E[:,i]), Ra, retain_graph=True, create_graph=self.training)[0] for i in range(E.shape[-1])], dim=-1)
else:
return -grad(torch.sum(E), Ra, retain_graph=True, create_graph=self.training)[0]
[docs]
class EnergyVarianceGradientLayer(BaseFFLayer):
[docs]
def __init__(self) -> None:
super().__init__(input_fields={"E_var", "Ra"}, output_fields={"E_var_grad"})
[docs]
def get_E_var_grad(self, E_var: Tensor, Ra: Tensor) -> Tensor:
return grad(torch.sum(E_var), Ra, retain_graph=True, create_graph=self.training)[0]