
    Ph B                        d dl mZ d dlZddlmZmZmZ ddlmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZmZmZmZ ddlmZmZmZ g Zd7d	Z G d
 dej6                  j8                        Z G d dej6                  j8                        Z G d dej6                  j8                        Z G d dej6                  j8                        Z  G d dej6                  j8                        Z!i Z" e#e       e#e       e#e      feiZ$e$jK                         D ]  \  Z&Z'e&D ]  Z(e(D ]  Z) ee'e)      e"e)<     ! d Z* e*eez   ez         d        Z+ e*ejX                  jZ                  ejZ                  g      d        Z. e*ejX                  j^                  g      d        Z0 e*ejX                  jb                  g      d        Z2 e*ejX                  jf                  g      d        Z4 e*ejX                  jj                  g      d        Z6i Z7d Z8 e8eez   ez         d        Z9 e8e      d        Z: e8eez         d        Z; e8eez         d        Z< e8ejz                  j|                  j~                  g      d         Z? e8ejz                  j|                  j                  g      d!        Z@ e8ejz                  j                  j                  g      d"        ZB e8ejz                  j|                  j                  g      d#        ZC e8ejz                  j|                  j                  g      d$        ZD e8ejz                  j|                  j                  g      d%        ZE e8ejz                  j|                  j^                  g      d&        Z/ e8ejz                  j|                  j                  g      d'        ZF e8ejz                  j|                  j                  g      d(        ZG e8ejz                  j|                  j                  ejz                  j|                  j                  g      d)        ZJ e8ejz                  j|                  j                  g      d*        ZK e8ejz                  j|                  j                  g      d+        ZL e8ejz                  j|                  j                  g      d,        ZM e8ejz                  j|                  j                  g      d-        ZN e8ejz                  j|                  j                  g      d.        ZO e8ejz                  j|                  jZ                  g      d/        Z- e8ejz                  j|                  j                  g      d0        ZP e8ejz                  j|                  j                  g      d1        ZQ e8ejz                  j|                  j                  g      d2        ZR e8ejz                  j|                  j                  g      d3        ZS e8ejz                  j|                  j                  g      d4        ZT e8ejz                  j|                  j                  g      d5        ZU e8ejz                  j|                  j                  g      d6        ZVy)8    )partialN   )_apply_native_binaryNATIVE_BINARY_FNSNATIVE_INPLACE_BINARY_FNS)is_masked_tensorMaskedTensor	_get_data_masks_match_maybe_get_mask)_apply_pass_through_fnPASSTHROUGH_FNS)_apply_reductionNATIVE_REDUCE_FNSTORCH_REDUCE_FNSTENSOR_REDUCE_FNS)_apply_native_unaryNATIVE_UNARY_FNSNATIVE_INPLACE_UNARY_FNSc           	          |*|t        |       k7  rt        | d| dt        |              |+|t        |      k7  rt        | d| dt        |             y y )Nz: len(args) must be z	 but got z: len(kwargs) must be )len
ValueError)argskwargserror_prefixlen_args
len_kwargss        nC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/masked/maskedtensor/_ops_refs.py_check_args_kwargs_lengthr       sv    CI 5L>)=hZyQTUYQZP[\]]*F";L>)?
|9UXY_U`Tabcc #<    c                   ,    e Zd Zed        Zed        Zy)_MaskedContiguousc                     t        |      st        d      |j                         r|S |j                         }|j	                         }t        |j                         |j                               S )Nz7MaskedContiguous forward: input must be a MaskedTensor.)r   r   is_contiguousget_dataget_maskr	   
contiguousctxinputdatamasks       r   forwardz_MaskedContiguous.forward(   sZ    &VWW L~~~~DOO-t/@AAr    c                     |S N r)   grad_outputs     r   backwardz_MaskedContiguous.backward5   s    r    N__name__
__module____qualname__staticmethodr-   r3   r0   r    r   r"   r"   '   s*    
B 
B  r    r"   c                   ,    e Zd Zed        Zed        Zy)_MaskedToDensec                    t        |      st        d      |j                  t        j                  k(  r|S |j                  | _        |j                         }|j                         }t        |j                         |j                               S )Nz4MaskedToDense forward: input must be a MaskedTensor.)	r   r   layouttorchstridedr%   r&   r	   to_denser(   s       r   r-   z_MaskedToDense.forward;   sg    &STT<<5==(L\\
~~~~DMMOT]]_==r    c                    | j                   }|t        j                  k(  r|j                         S |t        j                  k(  r|j                         S |t        j                  k(  r|j                         S t        d|      )Nz$to_dense: Unsupported input layout: )	r<   r=   
sparse_cooto_sparse_coo
sparse_csrto_sparse_csrr>   r?   r   )r)   r2   r<   s      r   r3   z_MaskedToDense.backwardI   sn    U%%%,,..u''',,..u}}$''))?HHr    Nr4   r0   r    r   r:   r:   :   s*    > > 	I 	Ir    r:   c                   ,    e Zd Zed        Zed        Zy)_MaskedToSparsec                 "   t        |      st        d      |j                  t        j                  k(  r|S |j                         }|j                         }|j                         j                         }|j                  |      }t        ||      S )Nz5MaskedToSparse forward: input must be a MaskedTensor.)r   r   r<   r=   rA   r%   r&   rB   coalescesparse_maskr	   r)   r*   r+   r,   rI   sparse_datas         r   r-   z_MaskedToSparse.forwardW   s{    &TUU <<5+++L~~~~((*335&&{3K55r    c                 "    |j                         S r/   r?   r1   s     r   r3   z_MaskedToSparse.backwardg       ##%%r    Nr4   r0   r    r   rF   rF   V   s(    6 6 & &r    rF   c                   ,    e Zd Zed        Zed        Zy)_MaskedToSparseCsrc                    t        |      st        d      |j                  j                  dk7  r&t        d|j                  j	                                |j
                  t        j                  k(  r|S |j                         }|j                         }|j                         }|j                  |      }t        ||      S )Nz8MaskedToSparseCsr forward: input must be a MaskedTensor.   zHOnly 2D tensors can be converted to the SparseCsr layout but got shape: )r   r   _masked_datandimsizer<   r=   rC   r%   r&   rD   rI   r	   rJ   s         r   r-   z_MaskedToSparseCsr.forwardm   s    &WXX""a'ghmhzhzhh  iB  hC  D  E  E<<5+++L~~~~((*&&{3K55r    c                 "    |j                         S r/   rM   r1   s     r   r3   z_MaskedToSparseCsr.backward   rN   r    Nr4   r0   r    r   rP   rP   l   s(    6 6" & &r    rP   c                   ,    e Zd Zed        Zed        Zy)_MaskedWherec                     | j                  |       | j                  |       t        j                  j                  j                  |||      S r/   )mark_non_differentiablesave_for_backwardr=   opsatenwhere)r)   condselfothers       r   r-   z_MaskedWhere.forward   s;    ##D)d#yy~~##D$66r    c                     | j                   \  }d }d t        j                  j                  j	                  || ||            t        j                  j                  j	                  | ||      |      fS )Nc                     t        | j                         t        j                  | j	                               j                               S r/   )r	   r%   r=   
zeros_liker&   bool)mts    r   masked_out_likez._MaskedWhere.backward.<locals>.masked_out_like   s/    u/?/?/N/S/S/UVVr    )saved_tensorsr=   r\   r]   r^   )r)   r2   r_   rg   s       r   r3   z_MaskedWhere.backward   sb    ##	W IINN  {OK4PQIINN  {'C[Q
 	
r    Nr4   r0   r    r   rX   rX      s(    7 7
 

 

r    rX   c                       fd}|S )a/  
    Used for registering a new __torch_function__ function to MaskedTensor
    Called via _MASKEDTENSOR_FUNCTION_TABLE[func](*args, **kwargs)

    The code to register a new function looks like:

    @register_function_func(list_of_ops)
    def foo(func, *args, **kwargs):
        <implementation>
    c                 :    D ]  }t        | |      t        |<    y r/   )r   _MASKEDTENSOR_FUNCTION_TABLE)funcopr\   s     r   wrapperz'register_function_func.<locals>.wrapper   s    B/6tR/@(, r    r0   )r\   rn   s   ` r   register_function_funcro      s    A Nr    c                      t        | g|i |S r/   r   rl   r   r   s      r   _general_function_reductionsrs          D242622r    c                 F    t        ||ddd       t        j                  | S )Nz__torch_function__, torch.where   r   r   r   )r   rX   applyrr   s      r   _function_wherery      s&    dF,MXYfght$$r    c                 2    t         j                  |d         S Nr   )r"   rx   rr   s      r   _function_contiguousr|      s    ""47++r    c                 2    t         j                  |d         S r{   )r:   rx   rr   s      r   _function_to_denser~      s    Q((r    c                 2    t         j                  |d         S r{   )rF   rx   rr   s      r   _function_to_sparser      s      a))r    c                 2    t         j                  |d         S r{   )rP   rx   rr   s      r   _function_to_sparse_csrr      s    ##DG,,r    c                       fd}|S )a/  
    Used for registering a new __torch_dispatch__ function to MaskedTensor
    Called via _MASKEDTENSOR_DISPATCH_TABLE[func](*args, **kwargs)

    The code to register a new function looks like:

    @register_dispatch_func(list_of_ops)
    def foo(func, *args, **kwargs):
        <implementation>
    c                 :    D ]  }t        | |      t        |<    y r/   )r   _MASKEDTENSOR_DISPATCH_TABLE)rl   aten_opaten_opss     r   rn   z'register_dispatch_func.<locals>.wrapper   s    G4;D'4J(1  r    r0   )r   rn   s   ` r   register_dispatch_funcr      s    K Nr    c                      t        | g|i |S r/   rq   rr   s      r   _general_reductionr      rt   r    c                      t        | g|i |S r/   )r   rr   s      r   _general_passthroughr      s    !$8888r    c                      t        | g|i |S r/   )r   rr   s      r   _general_unaryr      s    t5d5f55r    c                      t        | g|i |S r/   )r   rr   s      r   _general_binaryr      s    6t6v66r    c                      y r/   r0   rr   s      r   strider          r    c                      y r/   r0   rr   s      r   
sym_strider     r   r    c                 2    t        |d         j                  S r{   )r
   r<   rr   s      r   r<   r<     s    T!W$$$r    c                 j    t        |d         }|j                  rt        d       | |g|dd  i |S )Nr   z8MaskedTensors with sparse data do not have is_contiguousr   r
   	is_sparser   rl   r   r   r+   s       r   r$   r$     sD    T!WD~~F
 	
 *tABx*6**r    c                 j    t        |d         }|j                  rt        d       | |g|dd  i |S )Nr   zAMaskedTensors with sparse data do not have is_strides_like_formatr   r   r   s       r   is_strides_like_formatr     sD    T!WD~~O
 	
 *tABx*6**r    c                 j    t        |d         }|j                  rt        d       | |g|dd  i |S )Nr   zGMaskedTensors with sparse data do not have is_non_overlapping_and_denser   r   r   s       r   is_non_overlapping_and_denser     sD    T!WD~~U
 	
 *tABx*6**r    c                 x    t        |d         j                  rt        d      t        j	                  |d         S )Nr   z5MaskedTensors with sparse data do not have contiguous)r
   r   r   r"   rx   rr   s      r   r'   r'   )  s;    a##C
 	
 ""47++r    c                 p   t        ||d|  d       t        |d         }t        |d         }t        |d         t        |j	                               k7  rt        d|  d      t        |d         t        |j                               k7  rt        d|  d      t         | ||d   |d   fi ||      S )	N__torch_dispatch__, rv   r   r   r   z0: args[1] expected to be the same as data.size()rR   z2: args[2] expected to be the same as data.stride())r   r
   r   tuplerU   r   r   r	   )rl   r   r   r+   r,   s        r   new_empty_stridedr   2  s    dF.B4&,ITUVT!WD47#DT!W~tyy{++/v5efggT!W~t{{}--/v5ghiiT47DG>v>EEr    c                     t        |d         st        d|  d      t        j                  j                  j                  t        |d               S )Nr   r   z: expected a mask tensor)r   r   r=   r\   r]   _local_scalar_denser
   rr   s      r   r   r   >  sF    47#/v5MNOO99>>--iQ.@AAr    c                 V    t         | t        |d               t        |d               S r{   )r	   r
   r   rr   s      r   _apply_fn_on_datar   E  s&    YtAw/0/$q'2JKKr    c                 h     | t        |d         g|dd  i |}t        |t        |d               S )Nr   r   )r
   r	   r   )rl   r   r   new_datas       r   _to_copyr   J  s;    Id1g&<ab<V<H/$q'":;;r    c                     t        ||d|  dd       t        |d         }t        |d         }t        j                  j
                  j                  || |d   d      }t        ||      S )Nr   rv   r   rw   r   rR   )r   r
   r   r=   r\   r]   _masked_softmaxr	   )rl   r   r   r+   r,   result_datas         r   _softmaxr   P  si    dF.B4&,ITUbcdT!WD47#D))..00ud1gqIKT**r    c                     t        ||d|  d        | t        |d         fi |}t        |t        |d               S )Nr   r   r   r   )r   r
   r	   r   )rl   r   r   r   s       r   	ones_liker   Y  sG    dF.B4&,ITUVya)4V4K_T!W%=>>r    c                    t        ||d|  d       |\  }}}}t        |      rt        |      rt        ||      st        d      t	        |      }t
        j                  j                  j                  |t	        |      t        |       ||j                  z        }t        |t        |            }	|	S t        d|  d      )Nr      r   zJ__torch_dispatch__, {func}: expected the masks of grad and output to matchz,: grad and output must both be MaskedTensors)r   r   r   r   r
   r=   r\   r]   _masked_softmax_backwardr   rT   r	   )
rl   r   r   gradoutputdiminput_dtype	grad_datanew_grad_dataress
             r   _softmax_backward_datar   `  s    dF.B4&,ITUV%)"D&#{"26":D&)ijjdO			??fT"").. 	
 =/$*?@
/v5abccr    c                     t        ||d|  d       t        t        |d         t        |d               st        d       | t	        |d         t	        |d                |d   S )Nr   rR   r   r   r   z3args[0] mask and args[1] mask must match but do not)r   r   r   r   r
   rr   s      r   copy_r   t  sf    dF.B4&,ITUVQ0/$q'2JKNOO47	YtAw/07Nr    c                 &   t        ||d|  dd       t        j                  |d         st        d      |d   }|d   }t	        |      s/t        |t        j                  |t        j                              }t	        |      s/t        |t        j                  |t        j                              } | |d   |j                         |j                               } | |d   |j                         |j                               }t        ||      S )	Nr   rv   r   rw   ;__torch_dispatch__, {func}: expected args[0] to be a tensorr   rR   dtype)
r   r=   	is_tensorr   r   r	   r   re   r%   r&   )rl   r   r   mxmyr   new_masks          r   r^   r^   }  s    dF.B4&,ITUbcd??47#VWW	aB	aBB"eoob

CDB"eoob

CDDGR[[]BKKM:HDGR[[]BKKM:H(++r    c                    t        ||d|  dd       t        j                  |d         st        d      |d   }t	        |      s/t        |t        j                  |t        j                              }|j                         r|S  | t        |d               j                         }t        |d         j                  |      }t        ||      S )Nr   r   r   rw   r   r   )r   r=   r   	TypeErrorr   r	   r   re   is_sparse_coor   rH   r
   rI   rl   r   r   rf   r   r   s         r   
_to_sparser     s    dF.B4&,ITUbcd??47#UVV	aBB"eoob

CD		ODG,-668Ha!--h7H(++r    c                    t        ||d|  dd       t        j                  |d         st        d      |d   }t	        |      s-t        |t        j                  |      j                               }|j                         r|S  | t        |d               }t        |d         j                  |      }t        ||      S Nr   r   r   rw   r   )r   r=   r   r   r   r	   r   re   is_sparse_csrr   r
   rI   r   s         r   _to_sparse_csrr     s    dF.B4&,ITUbcd??47#VWW	aBB"eoob16689		ODG,-Ha!--h7H(++r    c                 P   t        ||d|  dd       t        j                  |d         st        d      |d   }t	        |      s-t        |t        j                  |      j                               } | t        |d               } | t        |d               }t        ||      S r   )
r   r=   r   r   r   r	   r   re   r
   r   )rl   r   r   rf   r   r   s         r   	_to_denser     s    dF.B4&,ITUbcd??47#VWW	aBB"eoob16689Id1g&'HODG,-H(++r    c                     t        ||d|  dd       t        |d         j                         }t        |t	        j
                  |      j                               S Nr   r   r   rw   )r   r
   indicesr	   r=   r   re   r   s       r   _indicesr     sT     dF.B4&,ITUbcdT!W%%'Deood388:;;r    c                     t        ||d|  dd       t        |d         j                         }t        |t	        j
                  |      j                               S r   )r   r
   valuesr	   r=   r   re   r   s       r   _valuesr     sR    dF.B4&,ITUbcdT!W$$&Deood388:;;r    c                 2   t        |      }t        |d         r|d   j                         |d<   t        |d         r|d   j                         |d<    | |i |}t        j                  |d         |d<    | |i |j                         }t        ||      S )N)listr   r%   r=   r   re   r	   )rl   r   r   new_argsr   r   s         r   (_sparse_coo_tensor_with_dims_and_tensorsr     s    DzHR!Bx((*R!Bx((*X((H??8B<0HRLX((--/H(++r    c                 x    t        ||d|  d       t        |d         j                  t        |d               S )Nr   rR   r   r   r   )r   r
   is_same_sizerr   s      r   r   r     s<    dF.B4&,ITUVT!W**9T!W+=>>r    )NN)W	functoolsr   r=   binaryr   r   r   corer   r	   r
   r   r   passthroughr   r   
reductionsr   r   r   r   unaryr   r   r   __all__r   autogradFunctionr"   r:   rF   rP   rX   rk   r   _function_fn_apply_mapitemsfn_map_listapply_fnfn_mapfnro   rs   Tensorr^   ry   r'   r|   r?   r~   	to_sparser   rD   r   r   r   r   r   r   r   r\   r]   r   r   primr<   r$   r   r   r   r   detachcloner   r   r   r   r   r   r   r   r   r   r   r   r   r0   r    r   <module>r      s     
 [ Z   d// &IU^^,, I8&enn-- &,&00 &0
5>>** 
*  "  u%56>O8PQSc  499;KB/6x/D(,   <" ),<<?PPQ3 R3 ++U[[9:% ;%
 0012, 3, ../0) 1) //01* 2* 3345- 6-  " " ),<<?PPQ3 R3 (9 )9 (+CCD6 E6 ),EEF7 G7 ../0 1 2234 5 ../0% 1% 5567+ 8+ >>?@+ A+ DDEF+ G+ 2234, 5, 99:;F <F ;;<=B >B ..		0D0DEFL GL 0012< 3<
 0012+ 3+ 1123? 4? >>?@d Ad& --./ 0 --./, 0, 2234, 5, 6678, 9, 1123	, 4	, 0012< 3< //01< 2< PPQR, S, 4456? 7?r    