
    VhL                     	   d dl Z d dlmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
Zd Z G d de j                  j                        Z G d	 d
e j                  j                        Zd Z G d de j                  j                        Z G d de j                  j                        Zd Zd Z G d de j                  j                        Z G d de j                  j                        Z G d de j                  j                        Z G d de j                  j                        Zd Zd Z G d de j                  j                        Z G d de j                  j                        Z G d  d!e j                  j                        Z G d" d#e j                  j                        Zd$ Z  G d% d&e j                  j                        Z! G d' d(e j                  j                        Z"d) Z# G d* d+e j                  j                        Z$ ed,ejJ                  d-d-e e	e jL                  e jN                        d./       ed0d1 ejJ                  d-d-e e	e jL                  e jN                        d.2       ed3ejJ                  d-d-e e	e jL                  e jN                        d./       ed4d5 d.d.e e	e jL                  e jN                        d./       ed6ejJ                  d.d.e e	e jL                  e jN                        d.d7 8       ed9ejJ                  d.d.e e	e jL                  e jN                        d./       ed:ejJ                  d-d-e  e	e jL                  e jN                        d./       ed;ejJ                  d-d-e e	e jL                  e jN                        d./       ed<ejJ                  d-d-e e	e jL                  e jN                        d./       ed=ejJ                  d-d-e e	e jL                  e jN                        d.d> 8       ed?ejJ                  d-d-e  e	e jL                  e jN                        d./       ed@e!jJ                  d-d-e e	e jL                  e jN                        d./       edAe"jJ                  d-d-e e	e jL                  e jN                        d./       edBe$jJ                  d-d-e# e	e jL                  e jN                        d./      gZ(y)C    N)partial)make_tensor)OpInfoSampleInput)all_types_andc                 >    | j                         j                         S N)cpunumpy)tensors    \/home/dcms/DCMS/lib/python3.12/site-packages/torch/testing/_internal/autograd_function_db.pyto_numpyr      s    ::<    c                   \    e Zd Zed        Zed        Zed        Zed        Zed        Zy)	NumpyCubec                     t        |       }t        j                  d|dz  z  | j                        }t        j                  |dz  | j                        |fS N      devicer   torchr   r   )inputinput_npdinputs      r   forwardzNumpyCube.forward   sF    E?a(a-/E||HM%,,?GGr   c                 d    | j                  |d   |d          | j                  |d   |d          y Nr      save_for_backwardsave_for_forwardctxinputsoutputs      r   setup_contextzNumpyCube.setup_context$   s2    fQi3VAYq	2r   c                     | j                   \  }}t        j                  ||      dt        j                  ||      z  z   S N   saved_tensorsNumpyMulapply)r%   grad_output
grad_savedr   r   s        r   backwardzNumpyCube.backward)   s8    ))v~~k62Q
TY9Z5ZZZr   c                 D    t         j                  |      }||d   |d   ffS Nr   )r   r/   )infoin_dimsr   results       r   vmapzNumpyCube.vmap.   s(    '
GAJ///r   c                 ~    | j                   \  }}t        j                  ||      dt        j                  ||      z  fS r*   r,   r%   input_tangentr   r   s       r   jvpzNumpyCube.jvp3   s8    ))v~~mV4a(..X]:^6^^^r   N	__name__
__module____qualname__staticmethodr   r(   r2   r8   r<    r   r   r   r      sj    H H
 3 3 [ [ 0 0 _ _r   r   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)CubeGenVmapTc                     | dz  d| dz  z  fS )Nr   r   rB   xs    r   r   zCubeGenVmap.forward<   s    Avq16z!!r   c                 d    | j                  |d   |d          | j                  |d   |d          y r   r!   r%   r&   outputss      r   r(   zCubeGenVmap.setup_context@   s2    fQi4VAY
3r   c                 :    | j                   \  }}||z  d|z  z   }|S r*   r-   )r%   r0   r1   _inputr   r7   s         r   r2   zCubeGenVmap.backwardE   s)    **v%F
2r   c                 ~    | j                   \  }}t        j                  ||      dt        j                  ||      z  fS r*   )r-   
MulGenVmapr/   r.   r:   s       r   r<   zCubeGenVmap.jvpK   s:    ))vv6HNN=Z_<`8```r   N	r>   r?   r@   generate_vmap_rulerA   r   r(   r2   r<   rB   r   r   rD   rD   9   sX    " " 4 4  
 a ar   rD   c              +   b   K   t        t        |||      }t         |ddd      d       y w)Nr   dtyperequires_gradr    g?r   lowhighrB   argsr   r   r   opinfor   rT   rU   kwargsmake_args         r   sample_inputs_numpy_cuber`   Q   s,     {6m\H
hqc2
<<s   -/c                       e Zd Zed        Zed        Zeej                  j                  j                  d               Z
y)NumpyCubeNotComposablec                 d    t        |       }t        j                  |dz  | j                        |fS )Nr   r   r   )r   r   s     r   r   zNumpyCubeNotComposable.forwardW   s)    E?||HM%,,?IIr   c                 D    |\  }}|| _         |d   j                  | _        y r4   )r   r   )r%   r&   r'   _r   s        r   r(   z$NumpyCubeNotComposable.setup_context\   s#    8AY%%
r   c                 h    d| j                   dz  z  }t        j                  || j                        S r   )r   r   r   r   )r%   r0   r1   	result_nps       r   r2   zNumpyCubeNotComposable.backwardb   s,     *+	||Icjj99r   N)r>   r?   r@   rA   r   r(   r   autogradfunctiononce_differentiabler2   rB   r   r   rb   rb   V   sV    J J & &
 
^^00: 1 :r   rb   c                   \    e Zd Zed        Zed        Zed        Zed        Zed        Zy)r.   c                 n    t        j                  t        |       t        |      z  | j                        S Nr   )r   r   r   r   rG   ys     r   r   zNumpyMul.forwardj   s$    ||HQK(1+5ahhGGr   c                 @     | j                   |   | j                  |  y r	   r!   r$   s      r   r(   zNumpyMul.setup_contextn   "    v&f%r   c                     | j                   \  }}d }| j                  d   rt        j                  ||      }d }| j                  d   rt        j                  ||      }||fS r   )r-   needs_input_gradr.   r/   r%   r0   rG   ro   gxgys         r   r2   zNumpyMul.backwards   s`      1"Q/B"Q/B2vr   c                     |\  }}||j                  |d      n|j                  d      }||j                  |d      n|j                  d      }t        j                  ||      }|j                  dd      }|dfS )Nr   )movedim	unsqueezer.   r/   )r5   r6   rG   ro   x_bdimy_bdimr7   s          r   r8   zNumpyMul.vmap~   ss     %+%7AIIfb!Q[[_%+%7AIIfb!Q[[_1%A&qyr   c                 6    | j                   \  }}||z  ||z  z   S r	   rL   r%   	x_tangent	y_tangentrG   ro   s        r   r<   zNumpyMul.jvp   $      11}y1},,r   Nr=   rB   r   r   r.   r.   i   sf    H H & &     - -r   r.   c           	   +   x   K   t        t        |||      }t         |ddd       |dddd      f       y w)NrS      ?r   rV   r   rY   r[   r\   s         r   sample_inputs_numpy_mulr      s;     {6m\H
hqc2(1aSWX:Y9[
\\s   8:c              +   h   K   t        t        |||      }t         |ddd      dddi	       y w)
NrS   r   r   r   rV   rB   scalarQ	@)rZ   r^   r[   r\   s         r   sample_inputs_numpy_mul_scalarr      s3     {6m\H
hqc2XtDT
UUs   02c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)rO   Tc                     | |z  S r	   rB   rn   s     r   r   zMulGenVmap.forward   s    1ur   c                 @     | j                   |   | j                  |  y r	   r!   rI   s      r   r(   zMulGenVmap.setup_context   rq   r   c                     | j                   \  }}d }| j                  d   rt        j                  ||      }d }| j                  d   rt        j                  ||      }||fS r   )r-   rs   rO   r/   rt   s         r   r2   zMulGenVmap.backward   sd      1"!!+q1B"!!+q1B2vr   c                 6    | j                   \  }}||z  ||z  z   S r	   rL   r~   s        r   r<   zMulGenVmap.jvp   r   r   NrP   rB   r   r   rO   rO      sV      & &   - -r   rO   c                   \    e Zd Zed        Zed        Zed        Zed        Zed        Zy)	NumpyExp_c                 H    t        |       }t        j                  ||       | S r	   )r   npexp)rG   x_nps     r   r   zNumpyExp_.forward   s    {
tTr   c                 r    |\  }| j                  |       | j                  |       | j                  |       y r	   )
mark_dirtyr"   r#   )r%   r&   r'   rG   s       r   r(   zNumpyExp_.setup_context   s1    qf%V$r   c                 J    | j                   \  }t        j                  ||      S r	   r,   )r%   r0   r'   s      r   r2   zNumpyExp_.backward   s     ##~~k622r   c                 :    t         j                  |       ||d   fS r4   )r   r/   )r5   r6   rG   s      r   r8   zNumpyExp_.vmap   s    '!*}r   c                 D    | j                   \  }|j                  |       |S r	   )r-   mul_)r%   r   r'   s      r   r<   zNumpyExp_.jvp   s#     ##vr   Nr=   rB   r   r   r   r      sd     
 % % 3 3    r   r   c                   \    e Zd Zed        Zed        Zed        Zed        Zed        Zy)	NumpySortc                    | j                   }t        |       } t        j                  | |      }t        j                  ||      }t	        j
                  | |      t	        j
                  ||      t	        j
                  ||      fS )Naxisr   )r   r   r   argsortr   r   )rG   dimr   indind_invs        r   r   zNumpySort.forward   sh    QKjj%**Ss+LL6*LLV,LL0
 	
r   c                     |\  }}|\  }}}| j                  ||       | j                  ||       | j                  ||       || _        y r	   mark_non_differentiabler"   r#   r   )r%   r&   r'   _xr   re   r   r   s           r   r(   zNumpySort.setup_context   sM    C 3##C1c7+S'*r   c                 h    | j                   \  }}t        j                  |||| j                        d fS r	   r-   	NumpyTaker/   r   r%   r0   _0_1r   r   s         r   r2   zNumpySort.backward   s/    ((W{GS#''BDHHr   c                     |\  }}|j                  |d      }|dk\  r|n||j                         z   dz
  }t        j                  ||dz         dfS )Nr   r    )r   r   r   )ry   r   r   r/   )r5   r6   rG   r   r{   re   s         r   r8   zNumpySort.vmap   sQ    	IIfa AXc3=1#4q#'*I55r   c                 j    | j                   \  }}t        j                  |||| j                        d d fS r	   r   r%   r   re   r   r   s        r   r<   zNumpySort.jvp   s1    ((Wy#w@$LLr   Nr=   rB   r   r   r   r      sh    	
 	
   I I 6 6 M Mr   r   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)SortGenVmapTc                     t        j                  | |      }t        j                  ||      }t        j                  | ||      }|||fS )N)r   r   )r   r   take_along_dim)rG   r   r   r   r7   s        r   r   zSortGenVmap.forward   sC    mmA3'--#.%%a#6sG##r   c                     |\  }}|\  }}}| j                  ||       | j                  ||       | j                  ||       || _        y r	   r   )r%   r&   rJ   rG   r   re   r   r   s           r   r(   zSortGenVmap.setup_context  sM    3!3##C1c7+S'*r   c                 h    | j                   \  }}t        j                  |||| j                        d fS r	   r-   TakeGenVmapr/   r   r   s         r   r2   zSortGenVmap.backward  s1    ((W  gsCGGDdJJr   c                 j    | j                   \  }}t        j                  |||| j                        d d fS r	   r   r   s        r   r<   zSortGenVmap.jvp  s3    ((W  C#''BD$NNr   NrP   rB   r   r   r   r      sZ    $ $   K K O Or   r   c              +   ^   K   t        t        |||      }t         |dd      d       y w)NrS   r      )r    rY   r[   r\   s         r   sample_inputs_numpy_sortr     )     {6m\H
hq!n4
00   +-c              +      K   t        t        |||      } |dd      }d}t        j                  |d      \  }}	}
t	        ||	|
|f       y w)NrS   r   r   r    rY   )r   r   r   r/   r   )r]   r   rT   rU   r^   r_   r   r   re   r   r   s              r   sample_inputs_numpy_taker     sP     {6m\Ha^F
Coofa0OAsG
fC##6
77s   AAc                   \    e Zd Zed        Zed        Zed        Zed        Zed        Zy)r   c                     | j                   }t        |       } t        |      }t        j                  t	        j
                  | ||      |      S rm   )r   r   r   r   r   take_along_axis)rG   r   r   r   r   s        r   r   zNumpyTake.forward%  s=    QKsm||B..q#s;FKKr   c                 h    |\  }}}}| j                  ||       | j                  ||       || _        y r	   r"   r#   r   )r%   r&   r'   r   r   r   r   s          r   r(   zNumpyTake.setup_context,  7     &C#c7+S'*r   c                 p    | j                   \  }}t        j                  |||| j                        }|d d d fS r	   r   r%   r0   r   r   r7   s        r   r2   zNumpyTake.backward3  s8    ((WgsCGGDtT4''r   c                      |\  }}}}	||j                         n|dz
  }
|dk\  r|n||
z   } fd} |||      } |||      } |||      }t        j                  ||||dz         dfS )Nr    r   c                 z    |' | j                   j                  g| j                   S | j                  |d      S r4   )expand
batch_sizeshapery   )rG   r{   r5   s     r   expand_bdimz#NumpyTake.vmap.<locals>.expand_bdimA  s7    ~qxx:!''::99VQ''r   )r   r   r/   )r5   r6   rG   r   r   r   r{   ind_bdimind_inv_bdimre   logical_dimr   s   `           r   r8   zNumpyTake.vmap9  s    ,3), "(aeegVaZAXc3#4	(
 6"#x(g|4q#wa8!;;r   c                 t    |J |J | j                   \  }}t        j                  |||| j                        S r	   r   r%   r   ind_tangentind_inv_tangentre   r   r   s          r   r<   zNumpyTake.jvpL  sB    """&&&((Wy#w@@r   Nr=   rB   r   r   r   r   $  sh    L L   ( (
 < <$ A Ar   r   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)r   Tc                 0    t        j                  | ||      S r	   )r   r   )rG   r   r   r   s       r   r   zTakeGenVmap.forwardV  s    ##AsC00r   c                 h    |\  }}}}| j                  ||       | j                  ||       || _        y r	   r   )r%   r&   rJ   r   r   r   r   s          r   r(   zTakeGenVmap.setup_contextZ  r   r   c                 p    | j                   \  }}t        j                  |||| j                        }|d d d fS r	   r   r   s        r   r2   zTakeGenVmap.backwarda  s:    ((W"";cggFtT4''r   c                 d    | j                   \  }}t        j                  |||| j                        S r	   r   r   s          r   r<   zTakeGenVmap.jvpg  s,    ((W  C#''BBr   NrP   rB   r   r   r   r   S  sX    1 1   ( (
 C Cr   r   c                   \    e Zd Zed        Zed        Zed        Zed        Zed        Zy)Selectc                     | |   S r	   rB   rG   idxs     r   r   zSelect.forwardm      vr   c                 >    |\  }}|j                   | _        || _        y r	   r   x_shaper   r%   r&   r'   rG   r   s        r   r(   zSelect.setup_contextq      3ggr   c                 ^    |j                  | j                        }||| j                  <   |d fS r	   	new_zerosr   r   r%   r0   r7   s      r   r2   zSelect.backwardw  -    &&s{{3%swwt|r   c                 `    |\  }}|j                  |d      }t        j                  ||      dfS Nr    r   )ry   r   r/   r5   r6   rG   r   r{   re   s         r   r8   zSelect.vmap}  s1    	IIfa ||As#Q&&r   c                 B    t         j                  || j                        S r	   )r   r/   r   r%   r   re   s      r   r<   z
Select.jvp  s    ||Isww//r   Nr=   rB   r   r   r   r   l  sd       
  
 ' '
 0 0r   r   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)SelectGenVmapTc                     | |   S r	   rB   r   s     r   r   zSelectGenVmap.forward  r   r   c                 >    |\  }}|j                   | _        || _        y r	   r   )r%   r&   rJ   rG   r   s        r   r(   zSelectGenVmap.setup_context  r   r   c                 ^    |j                  | j                        }||| j                  <   |d fS r	   r   r   s      r   r2   zSelectGenVmap.backward  r   r   c                 B    t         j                  || j                        S r	   )r   r/   r   r   s      r   r<   zSelectGenVmap.jvp  s    ""9cgg66r   NrP   rB   r   r   r   r     sV       
  
 7 7r   r   c              +   ^   K   t        t        |||      }t         |dd      d       y w)NrS   r   r   r   rY   r[   r\   s         r   sample_inputs_selectr     r   r   c                   T    e Zd ZdZdZed        Zed        Zed        Zed        Z	y)ScaleGradGenVmapTr   c                 "    | j                         S r	   clonerF   s    r   r   zScaleGradGenVmap.forward  s    wwyr   c                      y r	   rB   rI   s      r   r(   zScaleGradGenVmap.setup_context      r   c                 (    |t         j                  z  S r	   r   scale)r%   r0   s     r   r2   zScaleGradGenVmap.backward  s    -3333r   c                 (    |t         j                  z  S r	   r  )r%   r   s     r   r<   zScaleGradGenVmap.jvp  s    +1111r   N)
r>   r?   r@   rQ   r  rA   r   r(   r2   r<   rB   r   r   r   r     s[    E    4 4 2 2r   r   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)ZeroGradientsGenVmapTc                 B    | j                         |j                         fS r	   r   rn   s     r   r   zZeroGradientsGenVmap.forward  s    wwy!'')##r   c                      y r	   rB   rI   s      r   r(   z"ZeroGradientsGenVmap.setup_context  r   r   c                     t        j                  ddg|j                  |j                  |j                  dt        j                  |j                  |j                  |j                        fS )Nr   r   rT   r   r   zerosr   rT   r   r%   ru   rv   s      r   r2   zZeroGradientsGenVmap.backward  sP     KK1JrxxJrxx		JKKC
 	
r   c                     t        j                  |j                  |j                  |j                        t        j                  |j                  |j                  |j                        fS )Nr	  r
  r  s      r   r<   zZeroGradientsGenVmap.jvp  sF    
 KKCKKC
 	
r   NrP   rB   r   r   r  r    sV    $ $   
 
 
 
r   r  c              +   Z   K   t        t        |||      }t         |dd             y w)NrS   r   r   r[   r\   s         r   "sample_inputs_forward_default_argsr    s'     {6m\H
hq!n
%%s   )+c                   ^    e Zd Zedd       Zed        Zed        Zed        Zed        Zy)ForwardHasDefaultArgsc                     | |   S r	   rB   r   s     r   r   zForwardHasDefaultArgs.forward  r   r   c                 >    |\  }}|j                   | _        || _        y r	   r   r   s        r   r(   z#ForwardHasDefaultArgs.setup_context  r   r   c                 ^    |j                  | j                        }||| j                  <   |d fS r	   r   r   s      r   r2   zForwardHasDefaultArgs.backward  r   r   c                 `    |\  }}|j                  |d      }t        j                  ||      dfS r   )ry   r  r/   r   s         r   r8   zForwardHasDefaultArgs.vmap  s3    	IIfa $**1c2A55r   c                 B    t         j                  || j                        S r	   )r  r/   r   r   s      r   r<   zForwardHasDefaultArgs.jvp  s    $**9cgg>>r   N)r   r=   rB   r   r   r  r    sd       
  
 6 6
 ? ?r   r  NumpyCubeAutogradFunctionTF)opsupports_forward_adsupports_fwgrad_bwgradsample_inputs_funcdtypessupports_out!NumpyExpMarkDirtyAutogradFunctionc                 H    t         j                  | j                               S r	   )r   r/   r   rF   s    r   <lambda>r     s    Y__QWWY/ r   )r  inplace_variantr  r  r  r  r  NumpyMulAutogradFunction&NumpyCubeNotComposableAutogradFunctionc                 2    t         j                  |       d   S r4   )rb   r/   rF   s    r   r   r     s    +11!4Q7 r   NumpySortAutogradFunctionc                     | S r	   rB   ro   r   s     r   r   r   %       r   )r  r  r  r  r  r  gradcheck_wrapperNumpyTakeAutogradFunctionSelectAutogradFunctionCubeGenVmapAutogradFunctionMulGenVmapAutogradFunctionSortGenVmapAutogradFunctionc                     | S r	   rB   r'  s     r   r   r   S  r(  r   SelectGenVmapAutogradFunction ScaleGradGenVmapAutogradFunction$ZeroGradientsGenVmapAutogradFunction%ForwardHasDefaultArgsAutogradFunction))r   	functoolsr   torch.testingr   #torch.testing._internal.opinfo.corer   r   $torch.testing._internal.common_dtyper   r   r   r   rh   Functionr   rD   r`   rb   r.   r   r   rO   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r/   boolhalfautograd_function_dbrB   r   r   <module>r<     sy     % ?  _'' _8a%..)) a0=
:U^^44 :&!-u~~&& !-F]
V-(( -:'' >&M'' &MPO%..)) O<1
8-A'' -A^C%..)) C20U^^$$ 067ENN++ 7012u~~.. 2(
5>>22 
>&
?ENN33 ?: #?? #3UZZ4 +/! #3UZZ4	 ">> #2UZZ4 07!$3UZZ4 #??!$3UZZ4*	 #??!$3UZZ4  << #/UZZ4 % #3UZZ4 $ #2UZZ4 % #3UZZ4*	 ' #/UZZ4 *!! #3UZZ4 .%% #2UZZ4 / && #=UZZ4sB r   