Ë
      Qg[	  ã                   ó   — d dl Z d„ Zd„ Zy)é    Nc                 óœ  — | d d …d d…d d…f   }| d d …d d…df   }|d d …d d…d d…f   }|d d …d d…df   }|j                  dd¬«      }|j                  dd¬«      }||z
  }||z
  }	t        j                  |	j                  |«      }
t        j                  j                  |
«      \  }}}t        j                  |j                  |j                  «      }t        j                  |«      dk  r;|dd d …fxx   dz  cc<   t        j                  |j                  |j                  «      }t        j                  ||«      }t        j                  ||j                  «      j                  |t        j                  ||j                  «      j                  z
  z   }t        j                  |«      }||d d …d d…d d…f<   ||d d …d d…df<   d|d d …ddf<   |S )Né   r   T)ÚdimÚkeepdiméÿÿÿÿé   )ÚmeanÚtorchÚmatmulÚTÚlinalgÚsvdÚdetÚ
zeros_like)ÚAÚBÚA_rotÚA_transÚB_rotÚB_transÚ
A_centroidÚ
B_centroidÚ
A_centeredÚ
B_centeredÚHÚUÚ_ÚVtÚRÚB_rot_alignedÚB_trans_alignedÚ	B_aligneds                     úC/home/cameronsmith/repos/cheaper_flowmap/scripts/viser_vis_extra.pyÚalign_posesr$      sº  € àŠa!RaRˆi‰L€EØ’2A2q‰k€GàŠa!RaRˆi‰L€EØ’2A2q‰k€Gð —‘ !¨TÓ2€JØ—‘ !¨TÓ2€Jð ˜:Ñ%€JØ˜:Ñ%€Jô 	‰Z—\‘\ :Ó.€AÜ|‰|×Ñ Ó"H€A€qˆ"Ü‰R—T‘T˜1Ÿ3™3Ó€Aô ‡yyƒ|aÒØ
ˆ2Šqˆ5‹	R‰‹	ÜL‰L˜Ÿ™˜qŸs™sÓ#ˆô —L‘L  EÓ*€Mô —l‘l 1 g§i¡iÓ0×2Ñ2°jÄ5Ç<Á<ÐPQÐS]×S_ÑS_ÓC`×CbÑCbÑ6bÑc€Oô × Ñ  Ó#€IØ(€IŠa!RaRˆiÑØ)€IŠa!QˆhÑØ€IŠaAˆgÑàÐó    c                 óZ  — | j                   |j                   k(  sJ d«       ‚| j                  dk(  r| j                   d   dk(  sJ d«       ‚| j                  d¬«      }|j                  d¬«      }| |z
  }||z
  }|j                  |z  }t        j
                  j                  |«      \  }}}	|	j                  |j                  z  }
t	        j                  |
«      dk  r*|	dd	d	…fxx   dz  cc<   |	j                  |j                  z  }
||
|z  z
  }|
|j                  z  j                  |z   }||
|fS )
a?  
    Aligns two sets of 3D points A and B using Procrustes analysis.
    Args:
        A (torch.Tensor): Nx3 tensor of 3D points.
        B (torch.Tensor): Nx3 tensor of 3D points.
    Returns:
        torch.Tensor: Aligned B points.
        torch.Tensor: Rotation matrix.
        torch.Tensor: Translation vector.
    z#Point sets must have the same shapeé   r   r   zInput tensors must be Nx3r   )r   r   N)ÚshapeÚndimr	   r   r
   r   r   r   )r   r   Ú
centroid_AÚ
centroid_Br   r   r   r   ÚSr   r   Útr"   s                r#   Úalign_pointsr.   -   s  € ð 7‰7a—g‘gÒÐDÐDÔDØ6‰6QŠ;˜1Ÿ7™7 1™:¨š?ÐGÐ,GÔGð —‘˜A“€JØ—‘˜A“€Jð Z‘€JØZ‘€Jð 	‰zÑ!€Aô |‰|×Ñ Ó"H€A€qˆ"Ø
‰ˆqs‰s‰
€Aô ‡yyƒ|aÒØ
ˆ2Šqˆ5‹	R‰‹	ØD‰D1—3‘3‰Jˆð 	Q˜‘^Ñ#€Að Q—S‘S‘—‘˜a‘€Iàa˜ˆ?Ðr%   )r
   r$   r.   © r%   r#   ú<module>r0      s   ðÛ ò&óT)r%   