-
Notifications
You must be signed in to change notification settings - Fork 36
Open
Description
Hello, thank you so much for your amazing work and for sharing the code!
After going through the details, I have two questions about the SO(3) noise that I’m struggling to understand, and I’d greatly appreciate your insights:
- Since U(SO(3)) is used during sampling, why isn’t it directly used during training, and instead, IGSO(3) with 1.5 sigma is adopted? Is there a specific reason or advantage behind this choice?
- Why isn’t the sampling done directly on IGSO(3), but instead involves a coupling step with the ground truth rotation (
rotmats_1)? What’s the purpose of this coupling step?
def _corrupt_rotmats(self, rotmats_1, t, res_mask, diffuse_mask, rotmats_0=None):
num_batch, num_res = res_mask.shape
if rotmats_0 is None:
noisy_rotmats = self.igso3.sample(
torch.tensor([1.5]),
num_batch*num_res
).to(self._device)
noisy_rotmats = noisy_rotmats.reshape(num_batch, num_res, 3, 3)
rotmats_0 = torch.einsum(
"...ij,...jk->...ik", rotmats_1, noisy_rotmats)
rotmats_t = so3_utils.geodesic_t(t[..., None], rotmats_1, rotmats_0)
identity = torch.eye(3, device=self._device)
rotmats_t = (
rotmats_t * res_mask[..., None, None]
+ identity[None, None] * (1 - res_mask[..., None, None])
)
return _rots_diffuse_mask(rotmats_t, rotmats_1, diffuse_mask)
I’m really looking forward to your response. Thank you so much for taking the time to address my questions!
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels