a
    d                     @   s   d dl mZ d dlmZ d dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZmZ G dd dZG d	d
 d
ZG dd dZG dd dZdS )    )partial)TupleN)	gradcheck)assert_allclose)BoxesBoxes3Dc                   @   s   e Zd Zdd Zdd Zdd Zejddd	ge	e
 d
ddZejddd	ge	e
 d
ddZejddd	ge	e
 d
ddZejdg ddd Zdd Zdd Zdd ZdS )TestBoxes2Dc                    s\    fdd}t | sJ t| | g}t |s:J t| | g}t |sXJ d S )Nc                     s   t jdd d} t jddd d}| d d d |d< | d d |d< | d d |d< | d dd  |d	< | d d |d
< | d d |d< |S )N      devicedtype   r   r   r   r   r	   r   r   r	   r	   )r   r   r      r   r   r   r   r	   torchZrandzerosZpointsZtensor_boxesr    a/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/test/geometry/test_boxes.py_create_tensor_box   s    z2TestBoxes2D.test_smoke.<locals>._create_tensor_box)r   r   catstackselfr   r   r   	two_boxesZbatched_bboxr   r   r   
test_smoke   s    zTestBoxes2D.test_smokec           	      C   s  t tjddgddgddgddggg||d}tjddgddgddgddggddgddgddgddggg||d}t |}t |d  }| \}}| | fdksJ | \}}|jdkr|jdksJ t|d	krt|d	ksJ |tjddg|d
k r"|tjddg|d
k s&J | \}}|jd	krJ|jd	ksNJ |j	dkrf|j	dksjJ |tjddgg|d
k r|tjddgg|d
k sJ d S )N      ?      @       @r         @      @)r   r   r	   r   r   r	   r   )
r   r   tensorget_boxes_shapeitemndimlen	as_tensorallshape)	r   r   r   boxt_boxesboxesboxes_batchhwr   r   r   test_get_boxes_shape(   s,    .6z TestBoxes2D.test_get_boxes_shapec                 C   s   t jddgddgddgddggg||d}t jddgddgddgddggg||d}tt ||g}| \}}|jdkr|jdksJ |jdkr|jdksJ |t jdgd	gg|d
k r|t jd	gdgg|d
k sJ d S )Nr"   r#   r$   r   r%   r&   r   r   r	   r   r'   r
   )	r   r)   r   r   r*   r,   r0   r.   r/   )r   r   r   t_box1t_box2batched_boxesr5   r6   r   r   r   test_get_boxes_shape_batchF   s    **z&TestBoxes2D.test_get_boxes_shape_batchr0   )r	   r
   )r	   r	   r
   r0   c                 C   s  t jg dg||dj| }t jg dg||dj| }t jg dg||dj| }t jddgddgddgddggg||djg |dR  }t jddgddgddgddggg||djg |dR  }t jddgddgddgddggg||djg |dR  }	tj|d	d
j}
tj|dd
j}tj|dd
j}tj|dd
j}tj|dd
j}|
j|	jksdJ t|
|	 |j|	jksJ t||	 |j|	jksJ t||	 |j|	jksJ t||	 |j|	jksJ t||	 d S )Nr	   r   r   r
   r   r	   r   r   r   r	   r   r   r   r	   r   r   r
   xyxymode	xyxy_plusxywhverticesvertices_plus)r   r.   viewr   from_tensordatar0   r   )r   r0   r   r   box_xyxybox_xyxy_plusZbox_xywhZbox_verticesZbox_vertices_plusexpected_box
boxes_xyxyboxes_xyxy_plus
boxes_xywhboxes_vertices_plusr   r   r   test_from_tensorR   s2    :,:



zTestBoxes2D.test_from_tensorc                 C   s   t jg dg||dj| }t jg dg||dj| }ztj|dd dsTJ dW n tyh   Y n0 ztj|dd dsJ dW n ty   Y n0 d S )	N)r	   r   r
   r   )r	   r   r   r   rA   rB   Fz2Boxes.from_tensor should have raised any exceptionrD   )r   r.   rH   r   rI   
ValueError)r   r0   r   r   rK   rL   r   r   r   test_from_invalid_tensors   s    z$TestBoxes2D.test_from_invalid_tensorc                 C   s  t tjddgddgddgddggg||djg |dR  }tjg dg||dj| }tjg dg||dj| }tjg dg||dj| }tjddgddgddgddggg||djg |dR  }tjddgddgddgddggg||djg |dR  }	|jd	d
}
|jdd
}|jdd
}|jdd
}|jdd
}|
j|jksTJ t|
| |j|jkspJ t|| |j|jksJ t|| |j|jksJ t|| |j|	jksJ t||	 d S )Nr   r   r	   r   r>   r?   r@   r
   rA   rB   rD   rE   rF   rG   )r   r   r.   rH   	to_tensorr0   r   )r   r0   r   r   r1   Zexpected_box_xyxyZexpected_box_xyxy_plusZexpected_box_xywhexpected_verticesexpected_vertices_plusrN   rO   rP   Zboxes_verticesrQ   r   r   r   test_boxes_to_tensor   s:    >,,



z TestBoxes2D.test_boxes_to_tensorrC   )rA   rD   rE   rF   rG   c           	      C   s   t jddgddgddgddggg||dt jddgddgddgddggddgddgddgddggg||dg}t jg dg||dt jg dg dg||dg}|dv r|n|}tj||d}||}|d j|d jksJ |d j|d jksJ d S )	Nr	   r   r   r   )r	   r	      rZ   )rF   rG   rB   r   )r   r.   r   rI   rV   r0   )	r   rC   r   r   Zsrc_1Zsrc_2srcr1   outr   r   r   test_boxes_list_to_tensor_list   s    (:
z*TestBoxes2D.test_boxes_list_to_tensor_listc              	   C   s  t jddgddgddgddggg||d}t jddgddgddgddggg||d}t|t| }}tt ||g}tt ||g}d\}	}
t jg dg d	g d	g dg dg dg dgg||d}t jg dg dg d
g d
g d
g d
g dgg||d}t ||g}t ||g}||	|
}||	|
}||	|
}||	|
}|j|jkshJ t|| |j|jksJ t|| |j|jksJ t|| |j|jksJ t|| d S )Nr"   r#   r$   r   r&   r%   )   rZ   r   r   r   r   r   r   r	   r	   r	   r   r   r   r	   r	   r	   )r   r)   r   r   r   to_maskr0   r   )r   r   r   r9   r:   box1box2r    r;   heightwidthexpected_mask1expected_mask2expected_two_masksexpected_batched_masksmask1mask2	two_masksbatched_masksr   r   r   test_boxes_to_mask   sd      


zTestBoxes2D.test_boxes_to_maskc                 C   s   t tjg dgdtjd}|j|djj|ks6J |j|djj|ksNJ |||}||u sfJ |jj|ksJ |jj|kd S )Nr>   cpur   r'   r   )	r   rI   r   r.   float32torJ   r   r   r   r   r   r3   Zboxes_movedr   r   r   test_to   s    zTestBoxes2D.test_toc           
      C   sR  t jtddd}t jddgddgddgddggg||d}t|}t|  }t|  }t|  }tt g dg}t|  }	tt	|d	d
|fddsJ tt	|d	dd|fddsJ tt	|d	dd|fddsJ tt	|dd
|fddsJ tdd |fdds4J tdd |	fddsNJ d S )N)r)   methodc                 [   s0   t | }t||f i |}t|t r,|jS |S N)r   getattr
isinstancerJ   )r)   rv   kwargsr3   resultr   r   r   apply_boxes_method  s    z6TestBoxes2D.test_gradcheck.<locals>.apply_boxes_methodr"   r#   r$   r   )r"   r#   r%         @rV   )rv   TZraise_exceptionrD   )rv   rC   rG   r*   c                 S   s   t j| ddjS )NrD   rB   r   rI   rJ   xr   r   r   <lambda>      z,TestBoxes2D.test_gradcheck.<locals>.<lambda>c                 S   s   t j| ddjS )NrE   rB   r   r   r   r   r   r     r   )
r   ZTensorstrr)   utilstensor_to_gradcheck_vardetachcloner   r   )
r   r   r   r|   t_boxes1Zt_boxes2Zt_boxes3Zt_boxes4Zt_boxes_xyxyZt_boxes_xyxy1r   r   r   test_gradcheck  s$    *


zTestBoxes2D.test_gradcheckN)__name__
__module____qualname__r!   r7   r<   pytestmarkparametrizer   intrR   rU   rY   r]   ro   ru   r   r   r   r   r   r      s    #
@	r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestTransformBoxes2Dc           	      C   s   t jg dg||d}t jg dg||d}t|}tj|dd}t jg dg dg dgg||d}||}t|j|jd	d	d
 ||usJ d S N rha@)\Y@Ex@(\y@r   粝Kw@r   y&1\@r   FZvalidate_boxes                    @r   r"   r   r   r   r"   -C6?ZatolZrtol)r   r)   r   rI   transform_boxesr   rJ   	r   r   r   rN   expected_boxes_xyxyr3   expected_boxes	trans_mattransformed_boxesr   r   r   test_transform_boxes  s    
$
z)TestTransformBoxes2D.test_transform_boxesc           	      C   s   t jg dg||d}t jg dg||d}t|}tj|dd}t jg dg dg dgg||d}||}t|j|jd	d	d
 ||u sJ d S r   )r   r)   r   rI   transform_boxes_r   rJ   r   r   r   r   test_transform_boxes_.  s    
$
z*TestTransformBoxes2D.test_transform_boxes_c           	      C   s   t jg dg dg dg dg||dddd}t jg dg d	g d
g dgg dg dg dg dgg||d}t jg dg dg dgg dg dg dgg||d}t|}tj|dd}||}t|j|jddd d S )Nr   )Mb?m4#T@     @r   );Nёd@Mbp@W/'@+@)ʡE]@窂QIb@Mb p@K4y@r   r   r	   r   )V-@r   r"   r   )Xu@r   	h"@r   )Pnx@r   Zd;o@r   r   r   r   )r"   r   r   Fr   r   r   )r   r)   repeatr   rI   r   r   rJ   )	r   r   r   rN   r   r   r3   r   r\   r   r   r   test_transform_multiple_boxes=  sJ    
	

z2TestTransformBoxes2D.test_transform_multiple_boxesc                 C   s   t jg dg dg dg dg||d}t|}t jg dg dg dgg||d}t|}t|j}d	d
 }t|||fddsJ d S )N)r   r   gT㥛 p@gQ8s@)r   r   r   gz@)r   r   gBiޖu@gʡE@)r   r   gx&a@g(\p@r   r   r   r   c                 S   s   t | }||}|jS rw   )r   r   rJ   )ZquadrilateralsMr3   r   r   r   _wrapper_transform_boxes  s    
zETestTransformBoxes2D.test_gradcheck.<locals>._wrapper_transform_boxesTr~   )r   r)   r   rI   r   r   rJ   r   )r   r   r   rN   r3   r   r2   r   r   r   r   r   n  s    

$
z#TestTransformBoxes2D.test_gradcheckNr   r   r   r   r   r   r   r   r   r   r   r     s   1r   c                   @   s   e Zd Zdd Zdd Zdd Zejddd	ge	e
 d
ddZejddd	ge	e
 d
ddZejddd	ge	e
 d
ddZdd Zdd Zdd ZdS )
TestBbox3Dc                    s\    fdd}t | sJ t| | g}t |s:J t| | g}t |sXJ d S )Nc                     sr  t jdd d} t jddd d}| d d d |d< | d d |d< | d d |d	< | d d
 |d< | d d |d< | d d |d< | d d
 |d< | d d |d< | d d |d< | d d
 |d< | d d |d< | d d |d< | d d |d< | d d |d< | d d |d< | d d |d< | d dd  |d< | d d |d< | d d |d< | d d |d< |S )Nr	      r      r   r   r   r   r   r   r   r	   r   )r   r   r   r
   )r   r   r	   )r   r   r   r   r   )r   r   r   )r   r
   r   )r   r
   r	   rZ   )r   r
   r   )r   rZ   r   )r   rZ   r	   )r   rZ   r   )r   r   )r   r^   r   )r   r^   r	   )r   r^   r   r   r   r   r   r   r     s.    z1TestBbox3D.test_smoke.<locals>._create_tensor_box)r   r   r   r   r   r   r   r   r!     s    zTestBbox3D.test_smokec           
      C   sR  t tjg dg dg dg dg dg dg dg dgg||d	}tjg dg dg dg dg dg dg dg dgg d
g dg dg dg dg dg dg dgg||d	}t |}t |d  }| \}}}	| | |	 fdksJ | \}}}	|jdkr |	jdks$J t|dkrNt|dkrNt|	dksRJ |tjddg|dk r|tjddg|dk r|	tjddg|dk sJ | \}}}	|jdkr|	jdksJ |j	dkr|	j	dksJ |tjddgg|dk rJ|tjddgg|dk rJ|	tjddgg|dk sNJ d S )Nr   r   r	       
      r   r   r   r   r   r	   r   r   r   r   r   r	   r   r   r   r   r   r   r
   rZ   r   r
   A   +   6   rZ   r   r   rZ   r   r
   rZ   r   r
   r   r   r   r   r   r   r   )      ?@      5@      &@r	   r   r        N@r'   r        I@r        D@r(   )
r   r   r)   r*   r+   r,   r-   r.   r/   r0   )
r   r   r   r1   r2   r3   r4   dr5   r6   r   r   r   r7     sH    422.zTestBbox3D.test_get_boxes_shapec           	   
   C   sP  t jg dg dg dg dg dg dg dg dgg||d	}t jg d
g dg dg dg dg dg dg dgg||d	}tt ||g}| \}}}|jdkr|jdkr|jdksJ |jdkr|jdkr|jdksJ |t jdgdgg|dk rH|t jdgdgg|dk rH|t jdgdgg|dk sLJ d S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r   r   r'   r   r   r   r   )	r   r)   r   r   r*   r,   r0   r.   r/   )	r   r   r   r9   r:   r;   r   r5   r6   r   r   r   r<     s(    44""z%TestBbox3D.test_get_boxes_shape_batchr0   )r	   r   )r	   r	   r   r=   c              
   C   s8  t jg dg||dj| }t jg dg||dj| }t jg dg||dj| }t jg dg dg dg dg d	g d
g dg dgg||djg |d d ddR  }tj|ddj}tj|ddj}	tj|ddj}
|j|jksJ t|| |	j|jksJ t|	| |
j|jks*J t|
| d S )Nr	   r   r   r
   rZ   r   r   )r	   r   r   r   r
   rZ   )r	   r   r   r   r   r   r	   r   r   r   r   r   r   r
   r   r	   r
   r   )r	   r   rZ   )r   r   rZ   r   )r	   r
   rZ   r   r   xyzxyzrB   xyzxyz_plusxyzwhd)r   r.   rH   r   rI   rJ   r0   r   )r   r0   r   r   
box_xyzxyzbox_xyzxyz_plusZ
box_xyzwhdrM   kornia_xyzxyzkornia_xyzxyz_pluskornia_xyzwhdr   r   r   rR     s.    4


zTestBbox3D.test_from_tensorc                 C   s   t jg dg||dj| }t jg dg||dj| }ztj|dd dsTJ dW n tyh   Y n0 ztj|dd dsJ dW n ty   Y n0 d S )	N)r	   r   r   r
   r   r   )r	   r   r   r   r   r
   r   rB   Fz4Boxes3D.from_tensor should have raised any exceptionr   )r   r.   rH   r   rI   rT   )r   r0   r   r   r   r   r   r   r   rU     s    z#TestBbox3D.test_from_invalid_tensorc                 C   s>  t tjg dg dg dg dg dg dg dg dgg||d	jg |d d
 ddR  }tjg dg||d	j| }tjg dg||d	j| }tjg dg||d	j| }tjg dg dg dg dg dg dg dg dgg||d	jg |d d
 ddR  }tjg dg dg dg dg dg dg dg dgg||d	jg |d d
 ddR  }	|jdd}
|jdd}|jdd}|jdd}|jdd}|
j|jksJ t|
| |j|jksJ t|| |j|jksJ t|| |j|jksJ t|| |j|	jks0J t||	 d S )N)r   r   r	   )r	   r   r	   )r   r   r   )r	   r   r   )r   r   r   )r	   r   r	   )r   r   r	   )r	   r   r   r   r   r   r   )r	   r   r	   r   r
   r   )r	   r   r	   r   r   r   )r	   r   r	   r   r   r   )r   r   r	   )r   r
   r	   )r	   r
   r	   r   r   r   r   r   rB   r   r   rF   rG   )r   r   r.   rH   rV   r0   r   )r   r0   r   r   r1   Zexpected_box_xyzxyzZexpected_box_xyzxyz_plusZexpected_box_xyzwhdrW   rX   r   r   r   Zkornia_verticesZkornia_vertices_plusr   r   r   rY     sj    4
4
4




zTestBbox3D.test_boxes_to_tensorc                 C   s  t jg dg dg dg dg dg dg dg dgg||d	}t jg d
g dg dg dg d
g dg dg dgg||d	}t|t| }}tt ||g}tt ||g}d\}	}
}t jg dg dg dg dg dg dg dgg dg dg dg dg dg dg dgg dg dg dg dg dg dg dggg||d	}t jg dg dg dg dg dg dg dgg dg dg dg dg dg dg dgg dg dg dg dg dg dg dggg||d	}t ||g}t ||g}||	|
|}||	|
|}||	|
|}||	|
|}|j|jksVJ t|| |j|jksrJ t|| |j|jksJ t|| |j|jksJ t|| d S )N)r"   r"   r"   )r#   r"   r"   )r#   r$   r"   )r"   r$   r"   )r"   r"   r$   )r#   r"   r$   )r#   r$   r$   )r"   r$   r$   r   )r$   r$   r"   )r&   r$   r"   )r&   r%   r"   )r   r^   rZ   r_   r`   ra   )r   r)   r   r   r   rb   r0   r   )r   r   r   r9   r:   rc   rd   r    r;   depthre   rf   rg   rh   ri   rj   rk   rl   rm   rn   r   r   r   test_bbox_to_maskK  s    


$

#


zTestBbox3D.test_bbox_to_maskc                 C   s   t tjg dgdtjd}|j|djj|ks6J |j|djj|ksNJ |||}||u sfJ |jj|ksJ |jj|kd S )Nr   rp   r   r'   rq   )	r   rI   r   r.   rr   rs   rJ   r   r   rt   r   r   r   ru     s    zTestBbox3D.test_toc              
   C   s   t jg dg dg dg dg dg dg dg dgg||d	}t|}tt g d
g}t|  }tdd |fddsJ tdd |fddsJ d S )Nr   r   r   r   r   r   r   r   r   )r"   r#   g       @r%   r}   g      (@c                 S   s   t j| ddjS )Nr   rB   r   rI   rJ   r   r   r   r   r     r   z+TestBbox3D.test_gradcheck.<locals>.<lambda>Tr~   c                 S   s   t j| ddjS )Nr   rB   r   r   r   r   r   r     r   )r   r)   r   r   r   r   r   )r   r   r   r   Zt_boxes_xyzxyzZt_boxes_xyzxyz1r   r   r   r     s    4

zTestBbox3D.test_gradcheckN)r   r   r   r!   r7   r<   r   r   r   r   r   rR   rU   rY   r   ru   r   r   r   r   r   r     s   (+- 	r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestTransformBoxes3Dc           	      C   s   t jg dg||d}t jg dg||d}t|}tj|dd}t jg dg dg dg d	gg||d}||}t|j|jd
d
d ||usJ d S Nr   r   ;Oq@r   r   g)\b|@r   r   r   g;O@r   r   g)\b@Fr   r   r   r   r   r   r"   r   r   r   r   r$   r"   r   r   r   r"   r   r   )r   r)   r   rI   r   r   rJ   	r   r   r   boxes_xyzxyzexpected_boxes_xyzxyzr3   r   r   r   r   r   r   r     s     

z)TestTransformBoxes3D.test_transform_boxesc           	      C   s   t jg dg||d}t jg dg||d}t|}tj|dd}t jg dg dg dg d	gg||d}||}t|j|jd
d
d ||u sJ d S r   )r   r)   r   rI   r   r   rJ   r   r   r   r   r     s     

z*TestTransformBoxes3D.test_transform_boxes_c           	      C   s   t jg dg dg dg dg||dddd}t jg dg d	g d
g dgg dg dg dg dgg||d}t jg dg dg dg dgg dg dg dg dgg||d}t|}tj|dd}||}t|j|jddd d S )Nr   )r   r        X}@r   r   r   )r   r   =
ףp}E@r   r   gC@)r   r   QFm@r   r   g
ףp=2x@r   r   r	   r   )r   r   g     `@r"   r   g     @)r   r   g=
ףpU@r   r   gC@)r   r   gQV}@r   r   g
ףp=2@r   r   r   r   )r"   r   r   r   )r   r   r"   r   Fr   r   r   )r   r)   r   r   rI   r   r   rJ   )	r   r   r   r   r   r   r3   r   r\   r   r   r   r   +  sJ    
	

z2TestTransformBoxes3D.test_transform_multiple_boxesc                 C   s   t jg dg dg dg dg||d}t|}t jg dg dg dg d	gg||d}t|}t|j}d
d }t|||fddsJ d S )N)r   r   r   gEx@g(\y@g)\R|@)r   r   r  r   r   r   )r   r   r  gW/'@g+@gC@)r   r   r  gMbp@gK4y@g
ףp="x@r   r   r   r   r   c                 S   s   t | }||}|jS rw   )r   r   rJ   )Zhexahedronsr   r3   r   r   r   r   s  s    
zETestTransformBoxes3D.test_gradcheck.<locals>._wrapper_transform_boxesTr~   )r   r)   r   rI   r   r   rJ   r   )r   r   r   r   r3   r   r2   r   r   r   r   r   \  s&    


z#TestTransformBoxes3D.test_gradcheckNr   r   r   r   r   r     s   1r   )	functoolsr   typingr   r   r   Ztorch.autogradr   Ztorch.testingr   Zkornia.testingZtestingr   Zkornia.geometry.boxesr   r   r   r   r   r   r   r   r   r   <module>   s     k  u