
    VhD                        U d dl mZ d dlmZmZ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 erd d
lmZ g Z	 d=dZ  G d dejB                  jD                        Z# G d dejB                  jD                        Z$ G d dejB                  jD                        Z% G d dejB                  jD                        Z& G d dejB                  jD                        Z'i Z( e)e       e)e       e)e      feiZ*e*jW                         D ]  \  Z,Z-e,D ]  Z.e.D ]  Z/ ee-e/      e(e/<     ! d Z0 e0eez   ez         d        Z1 e0ejd                  jf                  ejf                  g      d        Z4 e0ejd                  jj                  g      d        Z6 e0ejd                  jn                  g      d        Z8 e0ejd                  jr                  g      d        Z: e0ejd                  jv                  g      d        Z<i Z=e>dedef   f   e?d<   d  Z@ e@eez   ez         d!        ZA e@e      d"        ZB e@eez         d#        ZC e@e	e
z         d$        ZD e@ej                  j                  j                  g      d%        ZG e@ej                  j                  j                  g      d&        ZH e@ej                  j                  j                  g      d'        ZJ e@ej                  j                  j                  g      d(        ZK e@ej                  j                  j                  g      d)        ZL e@ej                  j                  j                  g      d*        ZM e@ej                  j                  jj                  g      d+        Z5 e@ej                  j                  j                  g      d,        ZN e@ej                  j                  j                  g      d-        ZO e@ej                  j                  j                  ej                  j                  j                  g      d.        ZR e@ej                  j                  j                  g      d/        ZS e@ej                  j                  j                  g      d0        ZT e@ej                  j                  j                  g      d1        ZU e@ej                  j                  j                  g      d2        ZV e@ej                  j                  j                  g      d3        ZW e@ej                  j                  jf                  g      d4        Z3 e@ej                  j                  j                  g      d5        ZX e@ej                  j                  j                  g      d6        ZY e@ej                  j                  j                  g      d7        ZZ e@ej                  j                  j                  g      d8        Z[ e@ej                  j                  j                  g      d9        Z\ e@ej                  j                  j                  g      d:        Z] e@ej                  j                  j                  g      d;        Z^ e@ej                  j                  j                  g      d<        Z_y)>    )partial)AnyCallableTYPE_CHECKINGN   )_apply_native_binaryNATIVE_BINARY_FNSNATIVE_INPLACE_BINARY_FNS)	_get_data_masks_match_maybe_get_maskis_masked_tensorMaskedTensor)_apply_pass_through_fnPASSTHROUGH_FNS)_apply_reductionNATIVE_REDUCE_FNSTENSOR_REDUCE_FNSTORCH_REDUCE_FNS)_apply_native_unaryNATIVE_INPLACE_UNARY_FNSNATIVE_UNARY_FNS)
OpOverloadc           	          |*|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        S/home/dcms/DCMS/lib/python3.12/site-packages/torch/masked/maskedtensor/_ops_refs.py_check_args_kwargs_lengthr#   "   s|     CI 5n0
)CI;O
 	
 *F";n2:,iF}U
 	
 #<    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.forward0   sZ    &VWW L~~~~DOO-t/@AAr$   c                     |S N r-   grad_outputs     r"   backwardz_MaskedContiguous.backward=   s    r$   N__name__
__module____qualname__staticmethodr1   r7   r4   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"   r1   z_MaskedToDense.forwardC   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@   rA   
sparse_cooto_sparse_coo
sparse_csrto_sparse_csrrB   rC   r   )r-   r6   r@   s      r"   r7   z_MaskedToDense.backwardQ   sn    U%%%,,..u''',,..u}}$''))?HHr$   Nr8   r4   r$   r"   r>   r>   B   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@   rA   rE   r)   r*   rF   coalescesparse_maskr   r-   r.   r/   r0   rM   sparse_datas         r"   r1   z_MaskedToSparse.forward_   s{    &TUU <<5+++L~~~~((*335&&{3K55r$   c                 "    |j                         S r3   rC   r5   s     r"   r7   z_MaskedToSparse.backwardo       ##%%r$   Nr8   r4   r$   r"   rJ   rJ   ^   s(    6 6 & &r$   rJ   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@   rA   rG   r)   r*   rH   rM   r   rN   s         r"   r1   z_MaskedToSparseCsr.forwardu   s    &WXX""a'Z[`[m[m[r[r[tZuv  <<5+++L~~~~((*&&{3K55r$   c                 "    |j                         S r3   rQ   r5   s     r"   r7   z_MaskedToSparseCsr.backward   rR   r$   Nr8   r4   r$   r"   rT   rT   t   s(    6 6& & &r$   rT   c                   ,    e Zd Zed        Zed        Zy)_MaskedWherec                     | j                  |       | j                  |       t        j                  j                  j                  |||      S r3   )mark_non_differentiablesave_for_backwardrA   opsatenwhere)r-   condselfothers       r"   r1   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 r3   )r   r)   rA   
zeros_liker*   bool)mts    r"   masked_out_likez._MaskedWhere.backward.<locals>.masked_out_like   s/    u/?/?/N/S/S/UVVr$   )saved_tensorsrA   r`   ra   rb   )r-   r6   rc   rk   s       r"   r7   z_MaskedWhere.backward   sb    ##	W IINN  {OK4PQIINN  {'C[Q
 	
r$   Nr8   r4   r$   r"   r\   r\      s(    7 7
 

 

r$   r\   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 r3   )r   _MASKEDTENSOR_FUNCTION_TABLE)funcopr`   s     r"   wrapperz'register_function_func.<locals>.wrapper   s&     	AB/6tR/@(,	Ar$   r4   )r`   rr   s   ` r"   register_function_funcrs      s    A Nr$   c                      t        | g|i |S r3   r   rp   r   r   s      r"   _general_function_reductionsrw          D242622r$   c                 F    t        ||ddd       t        j                  | S )Nz__torch_function__, torch.where   r   r    r!   )r#   r\   applyrv   s      r"   _function_wherer}      s*    f7!PQ t$$r$   c                 2    t         j                  |d         S Nr   )r&   r|   rv   s      r"   _function_contiguousr      s    ""47++r$   c                 2    t         j                  |d         S r   )r>   r|   rv   s      r"   _function_to_denser      s    Q((r$   c                 2    t         j                  |d         S r   )rJ   r|   rv   s      r"   _function_to_sparser      s      a))r$   c                 2    t         j                  |d         S r   )rT   r|   rv   s      r"   _function_to_sparse_csrr      s    ##DG,,r$   r   ._MASKEDTENSOR_DISPATCH_TABLEc                       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 r3   )r   r   )rp   aten_opaten_opss     r"   rr   z'register_dispatch_func.<locals>.wrapper   s&     	KG4;D'4J(1	Kr$   r4   )r   rr   s   ` r"   register_dispatch_funcr      s    K Nr$   c                      t        | g|i |S r3   ru   rv   s      r"   _general_reductionr      rx   r$   c                      t        | g|i |S r3   )r   rv   s      r"   _general_passthroughr     s    !$8888r$   c                      t        | g|i |S r3   )r   rv   s      r"   _general_unaryr     s    t5d5f55r$   c                      t        | g|i |S r3   )r   rv   s      r"   _general_binaryr     s    6t6v66r$   c                      y r3   r4   rv   s      r"   strider         r$   c                      y r3   r4   rv   s      r"   
sym_strider     r   r$   c                 2    t        |d         j                  S r   )r   r@   rv   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   rp   r   r   r/   s       r"   r(   r(      s>    T!WD~~STT*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   2  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&   r|   rv   s      r"   r+   r+   <  s5    a##PQQ""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__, rz   r    r   r   z0: args[1] expected to be the same as data.size()rV   z2: args[2] expected to be the same as data.stride())r#   r   r   tuplerY   r   r   r   rp   r   r   r/   r0   s        r"   new_empty_stridedr   C  s    dF.B4&,ITUVT!WD47#DT!W~tyy{++"4&(XY
 	
 T!W~t{{}--"4&(Z[
 	
 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   rA   r`   ra   _local_scalar_denser   rv   s      r"   r   r   S  sF    47#/v5MNOO99>>--iQ.@AAr$   c                 V    t         | t        |d               t        |d               S r   )r   r   r   rv   s      r"   _apply_fn_on_datar   Z  s&    YtAw/0/$q'2JKKr$   c                 h     | t        |d         g|dd  i |}t        |t        |d               S )Nr   r   )r   r   r   )rp   r   r   new_datas       r"   _to_copyr   _  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   rz   r   r{   r   rV   )r#   r   r   rA   r`   ra   _masked_softmaxr   )rp   r   r   r/   r0   result_datas         r"   _softmaxr   e  sl    f,TF3aA 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   )rp   r   r   r   s       r"   	ones_liker   p  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   rA   r`   ra   _masked_softmax_backwardr   rX   r   )
rp   r   r   gradoutputdim_input_dtype	grad_datanew_grad_dataress
             r"   _softmax_backward_datar   w  s    dF.B4&,ITUV&*#D&#|"26":D&)\  dO			??fT"").. 	
 =/$*?@
"4&(TU
 	
r$   c                     t        ||d|  d       t        t        |d         t        |d               st        d       | t	        |d         t	        |d                |d   S )Nr   rV   r   r   r   z3args[0] mask and args[1] mask must match but do not)r#   r   r   r   r   rv   s      r"   copy_r     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   rz   r   r{   ;__torch_dispatch__, {func}: expected args[0] to be a tensorr   rV   dtype)
r#   rA   	is_tensorr   r   r   r   ri   r)   r*   )rp   r   r   mxmyr   new_masks          r"   rb   rb     s    f,TF3aA ??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   r{   r   r   )r#   rA   r   	TypeErrorr   r   r   ri   is_sparse_coor   rL   r   rM   rp   r   r   rj   r   r   s         r"   
_to_sparser     s    f,TF3aA ??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   r{   r   )r#   rA   r   r   r   r   r   ri   is_sparse_csrr   r   rM   r   s         r"   _to_sparse_csrr     s    f,TF3aA ??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#   rA   r   r   r   r   r   ri   r   r   )rp   r   r   rj   r   r   s         r"   	_to_denser     s    f,TF3aA ??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   r{   )r#   r   indicesr   rA   r   ri   r   s       r"   _indicesr     sW     f,TF3aA 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   rA   r   ri   r   s       r"   _valuesr     sU    f,TF3aA 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)   rA   r   ri   r   )rp   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   rV   r   r   r   )r#   r   is_same_sizerv   s      r"   r   r     s<    dF.B4&,ITUVT!W**9T!W+=>>r$   c                 ^   t        ||d|  dd       t        |d         }t        |d         }|t        d|  d      |j                  t
        j                  k7  rt        d|  d      |j                  rt        d|        t         | ||z        t        j                  d            S )	Nr   r   r   r{   z': expected args[0] to be a MaskedTensorz: expected a boolean tensorz+MaskedTensors with sparse data do not have T)
r#   r   r   r   r   rA   ri   r   r   tensorr   s        r"   _is_any_truer     s    f,TF3aA T!WD47#D|"4&(OP
 	
 zzUZZ/v5PQRR~~FtfMNNTD[)5<<+=>>r$   )NN)`	functoolsr   typingr   r   r   rA   binaryr   r	   r
   corer   r   r   r   r   passthroughr   r   
reductionsr   r   r   r   unaryr   r   r   
torch._opsr   __all__r#   autogradFunctionr&   r>   rJ   rT   r\   ro   r   _function_fn_apply_mapitemsfn_map_listapply_fnfn_mapfnrs   rw   Tensorrb   r}   r+   r   rC   r   	to_sparser   rH   r   r   dict__annotations__r   r   r   r   r   r`   ra   r   r   primr@   r(   r   r   r   r   detachcloner   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r$   r"   <module>r     s    / /  V V  A  S R %  ;?

// &IU^^,, I8&enn-- &,&00 &4
5>>** 
*  "  	     499; EK E 	EB/6x/D(,	EEE& ),<<?PPQ3 R3 ++U[[9:% ;% 0012, 3, ../0) 1) //01* 2* 3345- 6- HJ d<#s(1C#CD I& ),<<?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? >>?@
 A
. --./ 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?
 4456? 7?r$   