a
    dA                     @   s   d dl Z d dlZd dlmZ d dlZd dlm  mZ d dl	m
Z d dl	mZ dd Zdd ZG dd	 d	ZG d
d dZG dd dZG dd dZG dd dZdS )    N)	gradcheck)assert_closec                 C   s   t jd||d| ddS )z-Create a batched homogeneous identity matrix.   devicedtype   )torchZeyerepeat
batch_sizer   r    r   b/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/test/geometry/test_linalg.pyidentity_matrix   s    r   c                 C   sb  |   dksJ | j| j|j  kr0|jks6n J t| t|  }}|||||t| t|  ||t| t| |||||g}tj|ddddd}t||t||||||t| |t||||||g}tj|ddddd}t|t| ||t|t|||||||||||g}	tj|	ddddd}
t	|
t	||S )z-Create a rotation matrix from x, y, z angles.r   )dimr   )
r   shaper	   Z	ones_likeZ
zeros_likecossinstackviewmatmul)xyzoneszerosZrx_tmprxZry_tmpZryZrz_tmpZrzr   r   r   euler_angles_to_rotation_matrix   st     


r   c                   @   sZ   e Zd Zejdg dejdg dejdddgdd	 Zd
d Zdd ZdS )TestTransformPointsr   r         
num_points)r!      r"   num_dimsr!   r$   c                 C   sr   |d }t j|||||d}t||j||d}||}t||}	t |}
t|
|	}t||ddd d S )Nr   r   -C6?atolrtol)	r	   randutilscreate_random_homographytokgltransform_pointsZinverser   )selfr   r#   r%   r   r   eye_size
points_srcdst_homo_srcZ
points_dstZsrc_homo_dstZpoints_dst_to_srcr   r   r   test_transform_pointsU   s    

z)TestTransformPoints.test_transform_pointsc           	      C   sn   d\}}}|d }t j|||||d}t||j||d}t|}t|}ttjj	||fddsjJ d S )N)r!   r$   r!   r   r   TZraise_exception)
r	   r*   r+   r,   r-   tensor_to_gradcheck_varr   korniageometryr/   )	r0   r   r   r   r#   r%   r1   r2   r3   r   r   r   test_gradcheckj   s    


z"TestTransformPoints.test_gradcheckc           	      C   s\   t jddd||d}td|}tjj}t j|}|||}|||}t||ddd d S )Nr   r!   r   r$   r&   r'   )	r	   r   r7   Zeye_liker8   r/   Zjitscriptr   )	r0   r   r   ZpointsZ	transformopZ	op_scriptactualexpectedr   r   r   test_jitu   s    

zTestTransformPoints.test_jitN)	__name__
__module____qualname__pytestmarkparametrizer4   r9   r>   r   r   r   r   r   T   s   r   c                   @   sX   e Zd Zdd Zdd Zdd Zejdg dd	d
 Z	ejdg ddd Z
dS )TestComposeTransformsc                 C   sj   d}t |||d}t |||d}tj||}tj|d |d }|j|ddfksXJ |jdksfJ d S Nr!   r   r   r   r   r   )r   r7   r8   compose_transformationsr   )r0   r   r   r   trans_01trans_12
to_check_1
to_check_2r   r   r   
test_smoke   s    z TestComposeTransforms.test_smokec           	      C   s6  t jd||d}t jd||d}t jd||d}t jd||d}t jd||d}tt tj||}W d    n1 s~0    Y  tt tj||}W d    n1 s0    Y  tt tj||}W d    n1 s0    Y  tt tj||}W d    n1 s(0    Y  d S N   r   r   r$   r   r"   
   rR   )   r   r   rG   r$   r$   )r	   r*   rB   raises
ValueErrorr7   r8   rH   	r0   r   r   rK   rL   
to_check_3Z
to_check_4Z
to_check_5_r   r   r   test_exception   s    ,,,z$TestComposeTransforms.test_exceptionc                 C   sb   d}t d||dd }t d||dd }|dd ddf  |7  < t||}t||ddd	 d S 
NrR   r   r   r   .r$   r   r&   r'   r   r.   rH   r   )r0   r   r   offsetrI   rJ   trans_02r   r   r   test_translation_4x4   s    z*TestComposeTransforms.test_translation_4x4r   r    c                 C   sZ   d}t |||d}t |||d}|dd ddf  |7  < t||}t||ddd d S NrR   r   .r$   r   r&   r'   r\   )r0   r   r   r   r]   rI   rJ   r^   r   r   r   test_translation_Bx4x4   s    z,TestComposeTransforms.test_translation_Bx4x4c                 C   sL   t |||d}t |||d}t|}t|}ttj||fddsHJ d S Nr   Tr5   )r   r+   r6   r   r.   rH   )r0   r   r   r   rI   rJ   r   r   r   r9      s
    

z$TestComposeTransforms.test_gradcheckN)r?   r@   rA   rM   rZ   r_   rB   rC   rD   ra   r9   r   r   r   r   rE      s   	
	rE   c                   @   sr   e Zd Zdd Zdd Zdd Zejdg dd	d
 Z	ejdg ddd Z
ejdg ddd ZdS )TestInverseTransformationc                 C   sT   d}t |||d}tj|}tj|d }|j|ddfksBJ |jdksPJ d S rF   )r   r7   r8   inverse_transformationr   )r0   r   r   r   rI   rK   rL   r   r   r   rM      s    z$TestInverseTransformation.test_smokec                 C   s   t jd||d}t jd||d}t jd||d}tt tj|}W d    n1 s\0    Y  tt tj|}W d    n1 s0    Y  tt tj|}W d    n1 s0    Y  d S )NrO   r   rQ   rT   )r	   r*   rB   rU   rV   r7   r8   rd   )r0   r   r   rK   rL   rX   rY   r   r   r   rZ      s    **z(TestInverseTransformation.test_exceptionc                 C   sX   d}t d||dd }|dd ddf  |7  < t|}t|}t||ddd	 d S r[   r   r.   rd   r   )r0   r   r   r]   rI   trans_10trans_01_hatr   r   r   r_      s    

z.TestInverseTransformation.test_translation_4x4r   r    c                 C   sT   d}t |||d}|dd ddf  |7  < t|}t|}t||ddd d S r`   re   )r0   r   r   r   r]   rI   rf   rg   r   r   r   ra      s    

z0TestInverseTransformation.test_translation_Bx4x4c                 C   s   d}ddt j  }}}tj|||d}t|| || || }	t|||d}
|
dd ddf  |7  < |	dd dd df |
dd dd df< t|
}t|}t|
|ddd d S )	NrR   r   r   .r$   r   r&   r'   )	r7   pir	   r   r   r   r.   rd   r   )r0   r   r   r   r]   r   r   r   r   Zrmat_01rI   rf   rg   r   r   r   test_rotation_translation_Bx4x4   s    (

z9TestInverseTransformation.test_rotation_translation_Bx4x4c                 C   s2   t |||d}t|}ttj|fdds.J d S rb   )r   r+   r6   r   r.   rd   )r0   r   r   r   rI   r   r   r   r9      s    
z(TestInverseTransformation.test_gradcheckN)r?   r@   rA   rM   rZ   r_   rB   rC   rD   ra   ri   r9   r   r   r   r   rc      s   
	
	
rc   c                   @   sX   e Zd Zdd Zdd Zdd Zejdg dd	d
 Z	ejdg ddd Z
dS )TestRelativeTransformationc                 C   sj   d}t |||d}t |||d}tj||}tj|d |d }|j|ddfksXJ |jdksfJ d S rF   )r   r7   r8   relative_transformationr   )r0   r   r   r   rI   r^   rK   rL   r   r   r   rM     s    z%TestRelativeTransformation.test_smokec           	      C   s6  t jd||d}t jd||d}t jd||d}t jd||d}t jd||d}tt tj||}W d    n1 s~0    Y  tt tj||}W d    n1 s0    Y  tt tj||}W d    n1 s0    Y  tt tj||}W d    n1 s(0    Y  d S rN   )r	   r*   rB   rU   rV   r7   r8   rk   rW   r   r   r   rZ     s    ,,,z)TestRelativeTransformation.test_exceptionc                 C   sn   d}t d||dd }t d||dd }|dd ddf  |7  < t||}t||}t||ddd	 d S )
N      $@r   r   r   .r$   r   r&   r'   )r   r.   rk   rH   r   )r0   r   r   r]   rI   r^   rJ   trans_02_hatr   r   r   r_   +  s    z/TestRelativeTransformation.test_translation_4x4r   r    c                 C   s   d}ddt j  }}}tj|||d}t|| || || }	t|||d}
t|||d}|dd ddf  |7  < |	dd dd df |dd dd df< t|
|}t|
|}t	||ddd d S )	Nrl           r   .r$   r   r&   r'   )
r7   rh   r	   r   r   r   r.   rk   rH   r   )r0   r   r   r   r]   r   r   r   r   Zrmat_02rI   r^   rJ   rm   r   r   r   ri   5  s    (z:TestRelativeTransformation.test_rotation_translation_Bx4x4c                 C   sL   t |||d}t |||d}t|}t|}ttj||fddsHJ d S rb   )r   r+   r6   r   r.   rk   )r0   r   r   r   rI   r^   r   r   r   r9   E  s
    

z)TestRelativeTransformation.test_gradcheckN)r?   r@   rA   rM   rZ   r_   rB   rC   rD   ri   r9   r   r   r   r   rj     s   

rj   c                   @   sX   e Zd Zdd Zejdg ddd Zejdg ddd	 Zd
d Z	dd Z
dS )TestPointsLinesDistancesc                 C   s   t jddd||d}t jddd||d}t||}|jdksBJ t jddd||d}t jddd||d}t||}|jdksJ d S )Nr   r!   r   r$   r   r   r	   r*   r.   point_line_distancer   )r0   r   r   ptslines	distancesr   r   r   rM   P  s    z#TestPointsLinesDistances.test_smokezbatch_size, sample_size)rp   )r!   r   )r   r   )rP   r   )r   r$   )r!   r$   )r   r$   )rP   r$   c           
      C   sT   || }}t j||d||d}t j||d||d}t||}	|	j||fksPJ d S )Nr!   r   r$   rq   )
r0   r   Zsample_sizer   r   BNrs   rt   ru   r   r   r   
test_shape\  s
    
z#TestPointsLinesDistances.test_shapezbatch_size, extra_dim_sizec                 C   s`   ||d  }}}t j|||d||d}t j|||d||d}	t||	}
|
j|||fks\J d S )Nr$   r!   r   rq   )r0   r   Zextra_dim_sizer   r   rv   Trw   rs   rt   ru   r   r   r   test_shapesf  s
    z$TestPointsLinesDistances.test_shapesc                 C   s   t jddg|t jddddddd}t jg dg dg d	g d
g dg dg|t jdddd}t||}t jddddt t jdt jdd t t jdt jdg|ddd}t||ddd d S )N      ?r   r   r   r!   rS   )rn   r{   rn   )rn   r{   r{   )r{   rn   rn   )r{   rn   r{   )r{   r{   rn   )r{   r{   r{   r$   rn   g       @)r   )r   gư>)r)   r(   )	r	   Ztensorfloat64r   Ztiler.   rr   sqrtr   )r0   r   rs   rt   ru   Zdistances_expectedr   r   r   test_functionalp  s,    *&
z(TestPointsLinesDistances.test_functionalc                 C   sL   t jddd|dt jd}t jddd|dt jd}ttj||fddsHJ d S )Nr!   r$   T)r   Zrequires_gradr   r5   )r	   r*   r|   r   r.   rr   )r0   r   rs   rt   r   r   r   r9     s    z'TestPointsLinesDistances.test_gradcheckN)r?   r@   rA   rM   rB   rC   rD   rx   rz   r~   r9   r   r   r   r   ro   O  s   

ro   )rB   r	   Ztorch.autogradr   r7   Zkornia.geometry.linalgr8   Zlinalgr.   Zkornia.testingZtestingr+   r   r   r   r   rE   rc   rj   ro   r   r   r   r   <module>   s   D+BEI