
    PizK                     $   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	m
Z
mZmZmZ d dlZd dlZe G d d                      Zd Zd	eej                 fd
Z G d d          Z	 dBdej        dee         dej        dej        dedej        fdZ	 dBdej        dee         dee         dedej        f
dZdej        dej        fdZdede
ee         ddf         fdZdej        dee	eef                  fdZde	eef         dej        fdZdej        dej        ej        ffdZ dej        d ej        d!ej        dej        ej        ffd"Z!dej        defd#Z"d$efd%Z#dej        dee	eef                  fd&Z$de	eef         defd'Z%d(ej        d)ed*edej        fd+Z&d,edej        fd-Z'd,ed.ed/edeej                 fd0Z(d1eed2f         d.ed3edeeee                  ee         f         fd4Z)dej        dee         dej        fd5Z*d6ej        dee         dej        fd7Z+d(ej        dee         d8ed9edej        f
d:Z,d;ej        d<ed=edeej        e-f         fd>Z.d?e	eef         de	eef         fd@Z/d(ej        dej        fdAZ0dS )C    Ndeepcopy)	dataclass)product)AnyDict	Generator	ItemsViewListTuplec                   \    e Zd ZU ej        ed<   ej        ed<   eed<   eed<   eed<   d ZdS )RLEDataalt_lens_ntcounts_initbhwc                     | j         S N)r   selfs    r/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torchao/_models/sam2/utils/amg.py__len__zRLEData.__len__   s	    v    N)__name__
__module____qualname__torchTensor__annotations__intr    r   r   r   r      s\         
FFF
FFF
FFF    r   r   c                    |                                  }|                                 }|                                }||                                         }||                                         }d t	          ||          D             }t          j        |                              |j                  }t          j	        |d|          }|                    |j                  }t
          j
                            ||          S )Nc                 B    g | ]\  }}|t          j        |          z   S r"   )r   arange).0ols      r   
<listcomp>z)nt_index_select_dim_0.<locals>.<listcomp>#   s)    SSSv1q5<??"SSSr   r   lengths)valuesoffsetsdiffcpuzipr   cattodeviceindex_selectnestednested_tensor_from_jagged)	ntindexr,   r-   r+   offsets_indexlengths_indexindicesvalues_indexs	            r   nt_index_select_dim_0r=      s    YY[[FjjllGllnnGEN&&((MEN&&((MSS]M1R1RSSSGi  ##FM22G%fa99L!$$V]33M<11,1VVVr   ntsc                 f   g }g }| D ]b}|                     |                                           |                     |                                                                           ct	          j        |          }t	          j        |          }t          j                            ||          S )Nr*   )appendr,   r-   r.   r   r1   r5   r6   )r>   
all_valuesall_lengthsr7   
new_valuesnew_lengthss         r   nt_cat_dim_0rE   *   s    JK 0 0"))++&&&2::<<,,..////:&&J)K((K<11*k1RRRr   c                       e Zd ZdZddZdededdfdZdeddfdZdedefd	Z	de
eef         fd
Zdej        ddfdZddZddZdS )MaskDataz
    A structure for storing masks and their related data in batched format.
    Implements basic filtering and concatenation.
    returnNc                     |                                 D ]>}t          |t          t          j        t
          j        t          f          s
J d            ?t          di || _	        d S )N=MaskData only supports list, numpy arrays, and torch tensors.r"   )
r,   
isinstancelistnpndarrayr   r   r   dict_stats)r   kwargsvs      r   __init__zMaskData.__init__<   si     	 	Aa$
EL'!JKK  O K  nnVnnr   keyitemc                     t          |t          t          j        t          j        t          f          s
J d            || j        |<   d S )NrJ   )rK   rL   rM   rN   r   r   r   rP   )r   rT   rU   s      r   __setitem__zMaskData.__setitem__C   sJ    $rz5< IJJ 	
 	
K	
 	
J  Cr   c                     | j         |= d S r   rP   r   rT   s     r   __delitem__zMaskData.__delitem__I   s    Kr   c                     | j         |         S r   rY   rZ   s     r   __getitem__zMaskData.__getitem__L   s    {3r   c                 4    | j                                         S r   )rP   itemsr   s    r   r_   zMaskData.itemsO   s    {  """r   keepc           	         | j                                         D ]\  }d | j         |<   t          t          j                  r         | j         |<   >t          t
          j                  rG                                                                	                                         | j         |<   t          t                    r9j        t          j        k    r$fdt                    D             | j         |<   t          t                    rfdD             | j         |<   t          t                    r[t          j                  }t          |j                 |                    d          j        j                  | j         |<   t+          d| dt-                     d          d S )Nc                 *    g | ]\  }}|         |S r"   r"   )r&   iar`   s      r   r)   z#MaskData.filter.<locals>.<listcomp>\   s&    !H!H!H1Q!H!!H!H!Hr   c                      g | ]
}|         S r"   r"   )r&   rc   rR   s     r   r)   z#MaskData.filter.<locals>.<listcomp>^   s    !5!5!51!A$!5!5!5r   r   r   r   r   r   r   MaskData key  has an unsupported type .)rP   r_   rK   r   r   rM   rN   detachr/   numpyrL   dtypebool	enumerater   r=   r   r   sizer   r   	TypeErrortype)r   r`   knew_alt_lens_ntrR   s    `  @r   filterzMaskData.filterR   s   K%%'' 	X 	XDAqy!%AAu|,, X!"4AArz** X!"4;;==#4#4#6#6#<#<#>#>!?AAt$$ Xuz)A)A!H!H!H!H	!!H!H!HAAt$$ X!5!5!5!5!5!5!5AAw'' 
X"7t"L"L!( / !d 3%**1--cc" " "A   V V VDQRGG V V VWWW-	X 	Xr   	new_statsc           	      "   |                                 D ]\  }}|| j        vs| j        |         t          |          | j        |<   4t          |t          j                  r,t	          j        | j        |         |gd          | j        |<   zt          |t          j                  r,t          j	        | j        |         |gd          | j        |<   t          |t                    r&| j        |         t          |          z   | j        |<   t          |t                    r| j        |         j        |j        k    sJ | j        |         j        |j        k    sJ t          t          | j        |         j        |j        g          t	          j        | j        |         j        |j        g          | j        |         j        |j        z   |j        |j                  | j        |<   t%          d| dt'          |           d          d S )Nr   dimaxisrf   rg   rh   ri   )r_   rP   r   rK   r   r   r1   rM   rN   concatenaterL   r   r   r   rE   r   r   r   rp   rq   )r   ru   rr   rR   s       r   r1   zMaskData.catk   s   OO%% 	X 	XDAq##t{1~'=!)!AAu|,, X!&DKNA+>A!F!F!FAArz** X!#Q0C!!L!L!LAAt$$ X!%Q(1++!=AAw'' X{1~'13....{1~'13....!( ,Q3Q]C! ! !&	4;q>+Eq}*U V Vk!n&,cc" " "A   V V VDQRGG V V VWWW-	X 	Xr   c                    | j                                         D ]q\  }}t          |t          j                  rR|                                                                                                                                | j         |<   rd S r   )	rP   r_   rK   r   r   floatrj   r/   rk   )r   rr   rR   s      r   to_numpyzMaskData.to_numpy   s~    K%%'' 	B 	BDAq!U\** B!"!1!1!3!3!7!7!9!9!?!?!A!AA	B 	Br   )rH   N)ru   rG   rH   N)r   r   r   __doc__rS   strr   rW   r[   r]   r
   r_   r   r   rt   r1   r~   r"   r   r   rG   rG   6   s        
% % % % s  #  $        s t     s  s        #yc* # # # #X5< XD X X X X2X X X X2B B B B B Br   rG         4@boxescrop_boxcrop_box_torchorig_box_torchatolrH   c                 &   t          | |                                          } t          j        | |dddf         |d          }t          j        | |dddf         |d          }t          j        ||           }t          j        |d          S )zNFilter masks at the edge of a crop, but not at the edge of the original image.Nr   )r   rtol   rw   )uncrop_boxes_xyxyr}   r   iscloselogical_andany)r   r   r   r   r   near_crop_edgenear_image_edges          r   is_box_near_crop_edge_torchr      s     eX..4466E]5.qqq*ASTUUUNmE>$'+BTUVVVO&~7GHHN9^++++r   orig_boxc                     t          j        |t           j        | j                  }t          j        |t           j        | j                  }t	          | ||||          S )Nrl   r3   )r   	as_tensorr}   r3   r   )r   r   r   r   r   r   s         r   is_box_near_crop_edger      sU     _XU[VVVN_XU[VVVN&x  r   box_xyxyc                 t    t          |           }|d         |d         z
  |d<   |d         |d         z
  |d<   |S )N   r      r   r   )r   box_xywhs     r   box_xyxy_to_xywhr      s@    !!H1++HQK1++HQKOr   
batch_sizec              '   J   K   t                    dk    rt          fdD                       s
J d            t          d                    z  t          t          d                    z  dk              z   }t          |          D ] fdD             V  d S )Nr   c              3   d   K   | ]*}t          |          t          d                    k    V  +dS )r   N)len)r&   rd   argss     r   	<genexpr>z!batch_iterator.<locals>.<genexpr>   s8       F FAQ3tAw<<!7 F F F F F Fr   z8Batched iteration must have inputs of all the same size.c                 6    g | ]}|z  d z   z           S r   r"   )r&   argr   r   s     r   r)   z"batch_iterator.<locals>.<listcomp>   s0    JJJcs1z>QUj$889JJJr   )r   allr!   range)r   r   	n_batchesr   s   `` @r   batch_iteratorr      s      t99q==S F F F F F F FFF==B =F DG
*ST!W
1Ja1O-P-PPI9 K KJJJJJTJJJJJJJK Kr   tensorc           
         | j         \  }}}|                     ddd                              d          } | ddddf         | ddddf         z  }|                                }g }t	          |          D ]}||dddf         |k    df         }t          j        t          j        dg|j        |j	                  |dz   t          j        ||z  g|j        |j	                  g          }|dd         |dd         z
  }	| |df         dk    rg ndg}
|

                    |	                                                                                                           |                    ||g|
d           |S )[
    Encodes masks to an uncompressed RLE, in the format expected by
    pycoco tools.
    r   r   r   Nr   ro   counts)shapepermuteflattennonzeror   r   r1   r   rl   r3   extendrj   r/   tolistr@   )r   r   r   r   r.   change_indicesoutrc   cur_idxsbtw_idxsr   s              r   mask_to_rle_pytorchr      s    lGAq!^^Aq!$$,,Q//F !!!QRR%=6!!!SbS&>)D\\^^N C1XX 7 7!.A"6!";Q">?9aSxOOO1a!eWHN8?SSS
 
 ABB<(3B3-/ad|q((qchoo''++--4466777

QFf556666Jr   rlec                     | d         \  }}t          j        ||z  t                    }d}d}| d         D ]}|||||z   <   ||z  }|dz  }|                    ||          }|                                S )z/Compute a binary mask from an uncompressed RLE.ro   rl   r   Fr   T)rM   emptyrm   reshape	transpose)r   r   r   maskidxparitycounts          r   rle_to_maskr      s    v;DAq8AE&&&D
CFX  "(S3;u$<<1D>>r   c                 r   | j         \  }}}|                     ddd                              d          } | ddddf         | ddddf         z  }t          j        dt
          |j                  }|                    |                    ddd                    }t          j	        |||gd          }|S )	r   r   r   r   Nr   )r   r   r   rw   )
r   r   r   r   onesrm   r3   	expand_asnarrowr1   )r   r   r   r   r.   rd   s         r   _mask_to_rle_pytorch_2_0_0r      s     lGAq!^^Aq!$$,,Q//F !!!QRR%=6!!!SbS&>)D
6dk:::A 	
DKK1a(())A9aq\q)))DKr   r.   r   c                    |                      ddd                              d          } |                    d          }|d d df         }|                                dk    r|}|}nD|                    dd|                    d          dz
            }|                    ddd          }t          j        ||g          }||z
  }t          j        	                    ||          }| d d df         dk    }	||	fS )Nr   r   r   rw   r*   )
r   r   sumnumelr   ro   r   r1   r5   r6   )
r   r.   r   alt_lensall_cur_idxall_cur_idx_0all_cur_idx_1all_btw_idxr   r   s
             r   _mask_to_rle_pytorch_2_0_1r      s    ^^Aq!$$,,Q//FxxAxH A&Ka###**1a1A1A!1D1Dq1HII#**1a33)]M:;;K+K,88h8WWKA,!#K##r   c                    | j         \  }}}t          j        j                            d          5  t          |           }d d d            n# 1 swxY w Y   t          j        j                            d          5  d}||                                dz   dz  k    s
J d            t          j        d |                    |          D                       }d d d            n# 1 swxY w Y   t          j        j                            d          5  t          | ||          \  }}d d d            n# 1 swxY w Y   t          |||||          S )	Nz1mask_to_rle_pytorch_2: _mask_to_rle_pytorch_2_0_0zmask_to_rle_pytorch_2: nonzero   iz!Needed more chunks than expected.c                 6    g | ]}|                                 S r"   )r   )r&   ds     r   r)   z,_mask_to_rle_pytorch_2_0.<locals>.<listcomp>  s     #P#P#PAAIIKK#P#P#Pr   z1mask_to_rle_pytorch_2: _mask_to_rle_pytorch_2_0_1rf   )r   r   autogradprofilerrecord_functionr   r   r1   chunkr   r   )	r   r   r   r   r.   
num_chunksr   r   r   s	            r   _mask_to_rle_pytorch_2_0r     s#   lGAq!		 	0	0;
 
 2 2 *&112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
	 	0	01Q	R	R R R 
tzz||j8ZGHHH/ IHH #P#PJ9O9O#P#P#PQQR R R R R R R R R R R R R R R 
	 	0	0;
 
 
 
 $>D.$
 $
 [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 {qAQRSSSSs6   AAA;AC##C'*C'D33D7:D7rle_datac                    t           j        j                            d          5  g }| j                                                                        }| j                                        }|                                }|                                }| j	                                        }d}t          t          | j                  |          D ]k\  }}|||||         z            d d         }|||         z  }|rg ndg}	|	                    |           |                    | j        | j        g|	d           l	 d d d            n# 1 swxY w Y   |S )Nz(mask_to_rle_pytorch_2: Encode run lengthr   r   r   )r   r   r   r   r   r-   r.   r,   r   r   r0   r   r   r   r@   r   r   )
r   r   r   r   r   offsetrc   cir   r   s
             r   _mask_to_rle_pytorch_2_1r   )  s   		 	0	02
 
 M M '//116688*1133??$$!((***1133xz**K88 	M 	MEAr"6FXa[,@#@A#2#FHhqk!F&RRA3FMM(###JJXZ 8FKKLLLL	MM M M M M M M M M M M M M M M" Js   DE

EEc                     t           j        j                            d          5  t	          t          |                     cd d d            S # 1 swxY w Y   d S )Nmask_to_rle_pytorch_2)r   r   r   r   r   r   )r   s    r   r   r   >  s    		 	0	01H	I	I J J'(@(H(HIIJ J J J J J J J J J J J J J J J J Js   AAAc                 >    t          | d         dd d                   S )Nr   r   r   )r   )r   s    r   area_from_rler   C  s    s8}QTT"###r   masksmask_thresholdthreshold_offsetc                 (   | ||z   k                         dt          j                                       dt          j                  }| ||z
  k                         dt          j                                       dt          j                  }||z  S )z
    Computes the stability score for a batch of masks. The stability
    score is the IoU between the binary masks obtained by thresholding
    the predicted mask logits at high and low values.
    r   r   )r   r   int16int32)r   r   r   intersectionsunionss        r   calculate_stability_scorer   I  s     
.#33	4	Ru{	#	#	Ru{	#	#  
.#33	4	Ru{	#	#	Ru{	#	# 
 6!!r   
n_per_sidec                 $   dd| z  z  }t          j        |d|z
  |           }t          j        |dddf         | df          }t          j        |dddf         d| f          }t          j        ||gd                              dd          }|S )z;Generates a 2D grid of points evenly spaced in [0,1]x[0,1].r   r   Nr   ry   )rM   linspacetilestackr   )r   r   points_one_sidepoints_xpoints_ypointss         r   build_point_gridr   `  s    !j.!Fk&!f*jAAOwtQQQw/*aAAHwqqq$w/!ZAAHXx*444<<RCCFMr   n_layersscale_per_layerc                     g }t          |dz             D ]9}t          | ||z  z            }|                    t          |                     :|S )z*Generates point grids for all crop layers.r   )r   r!   r@   r   )r   r   r   points_by_layerrc   n_pointss         r   build_all_layer_point_gridsr   j  sa     O8a<   ; ;z_a%7899/99::::r   im_size.overlap_ratioc           	         g g }}| \  }}t          ||          }|                    dd||g           |                    d           d }t          |          D ]}	d|	dz   z  }
t          ||z  d|
z  z             |||
           |||
          fdt          |
          D             }fdt          |
          D             }t	          ||          D ]Z\  }}||t          |z   |          t          |z   |          g}|                    |           |                    |	dz              [||fS )zr
    Generates a list of crop boxes of different sizes. Each layer
    has (2**i)**2 boxes for the ith layer.
    r   c                 \    t          t          j        ||dz
  z  | z   |z                      S )Nr   )r!   mathceil)orig_lenn_cropsoverlaps      r   crop_lenz%generate_crop_boxes.<locals>.crop_len  s-    49g15@GKLLMMMr   r   r   c                 :    g | ]}t          z
  |z            S r"   r!   )r&   rc   crop_wr  s     r   r)   z'generate_crop_boxes.<locals>.<listcomp>  +    TTTqsFW,122TTTr   c                 :    g | ]}t          z
  |z            S r"   r
  )r&   rc   crop_hr  s     r   r)   z'generate_crop_boxes.<locals>.<listcomp>  r  r   )minr@   r   r!   r   )r   r   r   
crop_boxes
layer_idxsim_him_w
short_sider  i_layern_crops_per_sidecrop_box_x0crop_box_y0x0y0boxr  r  r  s                   @@@r   generate_crop_boxesr  u  s     
JJD$T4J q!T4()))aN N N ?? + +1-mj0A8H4HIJJ$ 0'::$ 0'::TTTTTEBR<S<STTTTTTTTEBR<S<STTT k;77 	+ 	+FBr3rF{D113rF{D3I3IJCc"""gk****	+
 z!!r   c                    |\  }}}}t          j        ||||gg                                          }|                    | j        d          }t          | j                  dk    r|                    d          }| |z   S NT)r3   non_blockingr   r   r   r   
pin_memoryr2   r3   r   r   	unsqueeze)r   r   r  r  _r   s         r   r   r     s    LBAq\BB+,--88::FYYelY>>F
5;1!!!$$6>r   r   c                     |\  }}}}t          j        ||gg                                          }|                    | j        d          }t          | j                  dk    r|                    d          }| |z   S r  r   )r   r   r  r  r#  r   s         r   uncrop_pointsr%    sy    LBAq\B8*%%0022FYYfm$Y??F
6<A!!!$$F?r   orig_horig_wc                     |\  }}}}|dk    r|dk    r||k    r||k    r| S |||z
  z
  |||z
  z
  }	}|||z
  ||	|z
  f}
t           j        j                            | |
d          S )Nr   )value)r   nn
functionalpad)r   r   r&  r'  r  r  x1y1pad_xpad_yr,  s              r   uncrop_masksr1    s     NBB	Qww277rV||fR"W%vb'95Eurz2urz
*C8""5#Q"777r   r   area_threshmodec                    ddl }|dv sJ |dk    }|| z                      t          j                  }|                    |d          \  }}}}	|dddf         dd         }
fdt          |
          D             }t          |          dk    r| d	fS dg|z   |sSfd
t          |          D             t                    dk    r%t          t          j	        |
                    dz   gt          j
        |          } | dfS )z
    Removes small disconnected regions and holes in a mask. Returns the
    mask and an indicator of if the mask has been modified.
    r   N)holesislandsr5  r   r   r   c                 ,    g | ]\  }}|k     |d z   S r   r"   )r&   rc   sr2  s      r   r)   z(remove_small_regions.<locals>.<listcomp>  s&    KKKtq!1{??QU???r   Fc                     g | ]}|v|	S r"   r"   )r&   rc   fill_labelss     r   r)   z(remove_small_regions.<locals>.<listcomp>  s#    JJJQQk5I5Iq5I5I5Ir   T)cv2astyperM   uint8connectedComponentsWithStatsrn   r   r   r!   argmaxisin)r   r2  r3  r;  correct_holesworking_maskn_labelsregionsstatsr#  sizessmall_regionsr:  s    `          @r   remove_small_regionsrH    s;    JJJ'''''GOM!D(00::L"%"B"B<QR"S"SHgua!!!R%LEKKKKy'7'7KKKM
=QU{#%K 6JJJJ%//JJJ{q  ry//00145K77K((D:r   uncompressed_rlec                     ddl m} | d         \  }}|                    | ||          }|d                             d          |d<   |S )Nr   )r   ro   r   zutf-8)pycocotoolsr   frPyObjectsdecode)rI  
mask_utilsr   r   r   s        r   coco_encode_rlerO    sZ    ......F#DAq

 
 !11a
8
8CM((11CMJr   c                    | j         }|dd         \  }}t          |          dk    r|                     dd          } n|                     d          } t	          j        | d          \  }}|t	          j        ||j                  dddf         z  }t	          j        |d          \  }}||| z  z   }t	          j        |d          \  }}t	          j        | d          \  }	}|	t	          j        ||	j                  dddf         z  }
t	          j        |
d          \  }}|
||	 z  z   }
t	          j        |
d          \  }}||k     ||k     z  }t	          j	        ||||gd          }||                     d          z  }t          |          dk    r |j
        g |dd         d	R  }n|d         }|S )
z
    Calculates boxes in XYXY format around masks. Return [0,0,0,0] for
    an empty mask. For input shape C1xC2x...xHxW, the output shape is C1xC2x...x4.
    Nr   r   r   rw   )r3      )r   r   r   r"  r   maxr%   r3   r  r   r   )r   r   r   r   	in_heightr#  in_height_coordsbottom_edges	top_edgesin_widthin_width_coordsright_edges
left_edgesempty_filterr   s                  r   batched_mask_to_boxr^    s    KE:DAq
5zzA~~a$$"" 9U+++LIq 5<):J#K#K#KDRSRSRSG#TTi 0b999OL!'!	z*::9-2666LIq )Er***KHaa!H!H!Hqqq!QQOYB777NK%hY7OIo2666MJ  *,	1IJL
+z9k<Hb
Q
Q
QC
,))"--
-C 5zzA~~ck)5":)q)))!fJr   )r   )1r  copyr   dataclassesr   	itertoolsr   typingr   r   r	   r
   r   r   rk   rM   r   r   r=   r   rE   rG   r!   r}   r   r   r   r   r   r   rN   r   r   r   r   r   r   r   r   r   r   r  r   r%  r1  rm   rH  rO  r^  r"   r   r   <module>rc     s          ! ! ! ! ! !       ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?             
W 
W 
WSd5<( S S S SQB QB QB QB QB QB QB QBr , ,<,3i, L, L	,
 , \, , , ,  RV <#'98<S	IN
\   u|     Ks KiS	48M.N K K K K d38n1E    >T#s(^ 
    u| u|8T    ,$L$ %$>Cl$lEL!$ $ $ $.TU\ Tg T T T T6w    *J%, J4S#X3G J J J J
$tCH~ $# $ $ $ $"<")."BG"
\" " " ".     "58	"*   ""38_""(+""<A""
4S	?DI%&"" "" "" ""JU\ T#Y 5<    %, $s)     	8<	8#'9	869	8CF	8
\	8 	8 	8 	8
*#(03
2:t   6d38n c3h    +u| + + + + + + +r   