
    Vh#                        U d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlm	Z	 d dl
mZ ej                  j                  Z ee      Zeeeeef   f   ed<   d Zd Z eej(                        dej*                  dd	fd
       Z eej,                        dddd	ej.                  fdej0                  fd       Z G d d      Z G d d      Z e	ej6                  ej8                  ej:                  ej<                  ej>                  ej@                  ejB                  ejD                  ejF                  ejH                  ejJ                  ejL                  ejN                  ejP                  ejR                  g      Z* e jV                  ejX                  e*      Z- e-ej\                  g      dd       Z. e-ej^                  j`                  g      dddd       Z1eje                  e*       y)    N)defaultdict)Callable)get_decompositions)
OpOverloadrng_decompositionsc                 6    t        j                  | t              S N)decompregister_decompositionr   )aten_ops    T/home/dcms/DCMS/lib/python3.12/site-packages/torch/_decomp/decompositions_for_rng.pyregister_rng_decompositionr      s    ((2DEE    c           	      h    t        d| j                   d| j                   d| j                   d      )Nz"You are trying to functionalize a z RNG operator but zE does not use Philox/counter-based RNG. Therefore, functionalizing a zo RNG operator is not supported. We are discussing the possibility of a Philox-based RNG implementation for CPU.)RuntimeErrortype)devices    r   throw_on_non_cudar      sB    

,V[[M9KFKK= YFFLkk] Si	i r   Fc                     |r|j                   dk7  rt        |       t        j                         \  }}|xs t        j
                  }t        j                  j                  j                  | ||d ||      \  }}t        j                  |       |S Ncuda)
r   r   PhiloxStateTrackerget_state_as_tupletorchfloat32opsrngprimsphilox_randadvance_offset)	shapedtypelayoutr   
pin_memoryseedoffsetoutoffset_jumps	            r   randr(       sy    &++'&!%88:LD&"U]]Eyy))55tVT65C %%k2Jr   xc                 H   |xs | j                   }|j                  dk7  rt        |       |xs | j                  }t        j                         \  }}t        j                  j                  j                  | j                  ||d ||      \  }}	t        j                  |	       |S r   )r   r   r   r!   r   r   r   r   r   r   r    r   )
r)   r!   r"   r   r#   memory_formatr$   r%   r&   r'   s
             r   	rand_liker,   -   s     qxxF{{f&!QWWE%88:LD&yy))55	vtVUC %%k2Jr   c                   D    e Zd ZdZddZd Zd Zd ZddZd Z	d	 Z
d
 Zy)PhiloxStatea  
    Represents a PhiloxRngState - (seed, offset) where offset = base_offset +
    relative_offset. seed and base_offset basically point to the rng state just
    before tracing starts. relative offset tracks the totally consumed offset at
    trace time.
    Nc                 $    | j                          y r	   )resetselfs    r   __init__zPhiloxState.__init__J   s    

r   c                     t        j                  d      | _        t        j                  d      | _        d| _        d| _        y )N r   F)r   tensorr$   base_offsetrelative_offsetoffset_advanced_alteast_oncer1   s    r   r0   zPhiloxState.resetM   s3    LL$	 <<+ ,1)r   c                 |    | j                   j                         dk7  r| j                  j                         dk7  sJ y Nr   )r$   numelr7   r1   s    r   validate_statezPhiloxState.validate_stateS   s4    yy A%$*:*:*@*@*Ba*GGG*Gr   c                 :    d| _         | j                  |z   | _        y )NT)r9   r8   )r2   consumed_offsets     r   r   zPhiloxState.advance_offsetV   s    ,0)#33oEr   c                 .    || _         || _        || _        y r	   )r$   r7   r8   )r2   r$   r7   r8   s       r   	set_statezPhiloxState.set_stateZ   s    	&.r   c                 l    | j                          | j                  | j                  | j                  z   fS r	   )r=   r$   r7   r8   r1   s    r   r   zPhiloxState.get_state_as_tuple_   s.    		4++d.B.BBCCr   c                     | j                          t        j                  | j                  | j                  | j
                  z   g      S r	   )r=   r   stackr$   r7   r8   r1   s    r   get_state_as_tensorzPhiloxState.get_state_as_tensorc   s7    {{DIIt'7'7$:N:N'NOPPr   c                 V    t        j                  |      \  | _        | _        d| _        y r;   )r   unbindr$   r7   r8   )r2   states     r   set_state_from_tensorz!PhiloxState.set_state_from_tensorh   s"    &+ll5&9#	4# r   )returnN)r   )__name__
__module____qualname____doc__r3   r0   r=   r   rA   r   rE   rI   r5   r   r   r.   r.   B   s3    2HF/
DQ
!r   r.   c                       e Zd ZU dZeed<   eed<   eed<   d Zd Zed        Z	ed        Z
ed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zy)r   a  
    Singleton class to track the philox rng state during AOT Autograd tracing.
    For each aot tracing instance, AOT Autograd resets this tracker and keeps
    track of both forward and backward offsets. At runtime, we only care about
    the total consumed forward and backward offsets. For dynamic shapes, these
    offsets are a function of input shapes. Therefore, the AOT generated graphs
    have additional outputs that compute total consumed forward and backward
    offsets.
    running_state	fwd_state	bwd_statec                 .    t         j                          | S r	   r   r0   r1   s    r   	__enter__zPhiloxStateTracker.__enter__}   s      "r   c                 ,    t         j                          y r	   rT   )r2   exc_typeexc_calexc_tbs       r   __exit__zPhiloxStateTracker.__exit__   s      "r   c                 ^    t               | _        t               | _        t               | _        y r	   )r.   rP   rQ   rR   clss    r   r0   zPhiloxStateTracker.reset   s    'M##r   c                 &    | j                   | _        y r	   )rQ   rP   r\   s    r   mark_beginning_of_forwardz,PhiloxStateTracker.mark_beginning_of_forward         MMr   c                 &    | j                   | _        y r	   )rR   rP   r\   s    r   mark_beginning_of_backwardz-PhiloxStateTracker.mark_beginning_of_backward   r`   r   c                     |dk(  r-| j                   j                  ||       | j                          y |dk(  sJ | j                  j                  ||       y )Nforwardbackward)rQ   rA   r_   rR   )r]   r$   r%   modes       r   record_statezPhiloxStateTracker.record_state   sN     9MM##D&1))+:%%%MM##D&1r   c                 6    | j                   j                         S r	   )rP   rE   r\   s    r   rE   z&PhiloxStateTracker.get_state_as_tensor   s       4466r   c                 6    | j                   j                         S r	   )rP   r   r\   s    r   r   z%PhiloxStateTracker.get_state_as_tuple   s      3355r   c                 :    | j                   j                  |       y r	   )rP   rI   )r]   r)   s     r   rI   z(PhiloxStateTracker.set_state_from_tensor   s     	//2r   c                 :    | j                   j                  |       y r	   )rP   r   )r]   r?   s     r   r   z!PhiloxStateTracker.advance_offset   s    ((9r   c                 .    | j                   j                  S r	   )rP   r8   r\   s    r   get_current_relative_offsetz.PhiloxStateTracker.get_current_relative_offset   s      000r   c                     | dz   dz  dz  S )N      r5   )r%   s    r   multiple_of_4z PhiloxStateTracker.multiple_of_4   s    
 
q 1$$r   c                     | j                   j                  s| j                   j                  S | j                  | j                   j                  | j                   j                  z         S r	   )rQ   r9   r7   rq   r8   r\   s    r   get_updated_fwd_offsetz)PhiloxStateTracker.get_updated_fwd_offset   P     }}99==,,,  MM%%(E(EE
 	
r   c                     | j                   j                  s| j                   j                  S | j                  | j                   j                  | j                   j                  z         S r	   )rR   r9   r7   rq   r8   r\   s    r   get_updated_bwd_offsetz)PhiloxStateTracker.get_updated_bwd_offset   rt   r   N)rK   rL   rM   rN   r.   __annotations__rU   rZ   classmethodr0   r_   rb   rg   rE   r   rI   r   rm   staticmethodrq   rs   rv   r5   r   r   r   r   n   s    # & &
 * * * * 2 2 7 7 6 6 3 3
 : : 1 1 % % 
 
 
 
r   r   )registryc                     | j                   t        j                   d      k(  rt        S | j                  t        j                  | t        j
                        |k        S Ncpu)r!   )r   r   NotImplementedcopy_r,   r   )r2   ps     r   
bernoulli_r      s@    {{ell5))::eood%--@1DEEr   )	generatorc                    | j                   t        j                   d      k(  rt        S |J t        j                  | t        j                        |k  S r|   )r   r   r~   r,   r   )r2   r   r   s      r   bernoulli_pr     sC    {{ell5))??4u}}599r   )g      ?)3	functoolscollectionsr   typingr   r   torch._decomp_decompr
   r   
torch._opsr   r   atendictr   strrw   r   r   r(   stridedr,   preserve_formatTensorr.   r   cauchycauchy_exponentialexponential_	geometric
geometric_native_dropoutnormalnormal_normal_functional
log_normallog_normal_rrelu_with_noiserrelu_with_noise_uniform_extra_random_decompspartialr   register_extra_random_decompr   	bernoullir   r   updater5   r   r   <module>r      s    #    , ! yy~~<G<M Dd:x#7889 MF DII&5==% 	 '	 DNN+ ''|| ,()! )!Xj
 j
j * &  1y00
!!,@  
 t/0F 1F t~~//01:$ : 2:   . /r   