
    Ph,'                        d dl mZmZ d dlZd dlmc mZ d dlmZ d dl	m
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mZ d d
lmZmZmZ d dlmZmZ dZej<                  j?                  ed      Z ej<                  j?                  edd      Z!ej<                  j?                  edd      Z"ej<                  j?                  edd      Z#d Z$ddZ%dejL                  fdZ'dejL                  fdZ(d Z)d Z*d Z+d Z, e+       Z- e,       Z.d Z/y)    )OptionalTupleN)_prims)DispatchKey)autograd_not_implemented)HigherOrderOperator)CUDARngStateHelpermake_contiguous_strides_for)backwards_not_supported)FakeTensorMode)disable_proxy_modes_tracingProxyTorchDispatchModetrack_tensor_tree)_device_dtyperngprimsDEFIMPLCompositeExplicitAutogradAutogradMetac           	      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    aC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/_prims/rng_prims.pythrow_on_non_cudar      sB    

,V[[M9KFKK= YFFLkk] Si	i     c                    t         j                  |       t        j                  | |       t        j                  | |       t        t        j                  j                  j                  |       }|j                  }|r||_        t        j                  | t        |             ||fD ]G  }||_        t        j                  j                   j"                  |_        ||_        ||_        ||_        I y N)rngprimdefinerngprim_implimplrngprim_meta_implgetattrtorch_opsopsr   default_tagsrngprim_autograd_implr   __doc___prims_commonRETURN_TYPENEWreturn_typeschema	impl_atenprim_meta_impl)	namer2   r3   	impl_metadoctagsprim_packetprimps	            r   register_rng_primr<   &   s    NN6dI&4+%**..1148KD
t%<T%BC4 	++77;;$ !r   shapec                 r    t        j                  t        j                  dt        j                              S )Nr   dtype)r   
TensorLiker'   tensorint64)r=   s    r   philox_rand_offset_metarD   =   s$     U\\!5;;?@@r   c                 |   d}| D ]  }||z  }	 t        j                  |t         j                        }d}d}d}t         j                  j	                  t         j                  j                               }|j                  |z  }||z   dz
  |z  }	t        |	|j                  |z        }	|dz
  ||	z  |z  z  dz   |z  }
|
S )N   r?         )	r'   scalar_tensorrC   cudaget_device_propertiescurrent_devicemax_threads_per_multi_processorminmulti_processor_count)r=   numel_scalardim_sizenumel
block_sizeunrollcurand4_engine_callsdevice_propertyblocks_per_sm	grid_sizeoffsets              r   philox_rand_offsetrZ   C   s     L  EKK@EJFjj66uzz7P7P7RSO#CCzQM#a'J6IIDD}TUI	
Y.781<F Mr   c                     d} d}dt         j                  dt         j                  dt         j                  dt        t        t
        df      dt        d	t        fd
}dt         j                  dt         j                  dt         j                  dt        t        t
        df      dt        d	t        fd}t        | |||dt         j                  j                  f       y )Nphilox_randzphilox_rand(SymInt[] size, Tensor seed, Tensor offset, int[]? stride, Device? device=None, ScalarType? dtype=None) -> (Tensor, Tensor)r=   seedrY   stride.r   r@   c                 p    |J t        |       }t        j                  | |||      }t        |       }||fS )N)r=   stridesr@   r   )r
   r   
TensorMetarD   )r=   r]   rY   r^   r   r@   random_valuess          r   _philox_rand_metaz/register_philox_rand.<locals>._philox_rand_meta_   sH     ~~,U3))uV
 )/v&&r   c                 F   |J |j                   dk(  rg }n|g}|j                   dk7  rt        |      t        j                  j	                  |      5  t        j                  ||       t        j                  | ||      }d d d        t        |       fS # 1 sw Y   xY w)NcpurJ   )r   r@   )	r   r   r'   randomfork_rngr	   set_torch_state_tensorrandrZ   )r=   r]   rY   r^   r   r@   devicesrb   s           r   _philox_randz*register_philox_rand.<locals>._philox_randp   s     ~~;;%GhG;;& #F++\\""7+55dFC!JJuV5IM , 0777	 ,+s   /BB z$Philox based stateless rand operator)r5   r2   r3   r6   r7   r8   )r'   SizeTensorr   r   intr   r   r<   Tagnondeterministic_seeded)r5   r2   rc   rk   s       r   register_philox_randrq   [   s    D VF'zz'll' ' sCx)	'
 ' '"8zz8ll8 8 sCx)	8
 8 80 #2ii//1r   c                 |   |j                  d      rB|j                  d      }t        |t              rt        j                  |      }|j
                  S | D ch c]3  }t        |t        j                        s|j                  j
                  5 }}t        d |D              ryt        d |D              ryy c c}w )Nr   c              3   &   K   | ]	  }|d k(    yw)rJ   N .0devs     r   	<genexpr>zget_device.<locals>.<genexpr>   s     
,GS3&=G   rJ   c              3   &   K   | ]	  }|d k(    yw)re   Nrt   ru   s     r   rx   zget_device.<locals>.<genexpr>   s     -WcSE\Wry   re   )get
isinstancestrr'   r   r   rm   any)argskwargsr   argrj   s        r   
get_devicer      s    zz(H%fc"\\&)F{{*.P$3*S%,,2Oszz$GP

,G
,,	-W-	- Qs   B98B9c                     t        d       j                  t        j                        t	        d             j                  t        j
                        d        j                  t        j                        d        j                  t        j                        fd       j                  t              fd       } j                  t              fd       }S )	Nrun_and_save_rng_stateTdeferred_errorc                 N    t         j                  j                          | |i |fS r    )r'   rJ   get_rng_stateopr   r   s      r   	impl_cudaz5register_run_and_save_rng_state_op.<locals>.impl_cuda   s$    zz'')2t+>v+>>>r   c                 :    t        j                          | |i |fS r    )r'   r   r   s      r   impl_cpuz4register_run_and_save_rng_state_op.<locals>.impl_cpu   s     ""$b$&9&&999r   c                 d    d}t        ||      }||v s
J d|        ||   } || g|i |S N)rJ   re   zBackend not supported for r   )r   r   r   impl_mapr   r$   r   r   s         r   impl_backend_selectz?register_run_and_save_rng_state_op.<locals>.impl_backend_select   sS    %h7D&)!H%?x#HH!B((((r   c                 L    | 5   |g|i |cd d d        S # 1 sw Y   y xY wr    rt   )moder   r   r   r   s       r   impl_fake_tensor_modezAregister_run_and_save_rng_state_op.<locals>.impl_fake_tensor_mode   s$     &r;D;F; TTs   #c                 j   | j                   r |g|i |}t        j                  | j                  j                  |g|      }t        j                  | j                  j                  |      }| j                  j                  d	||      }t        ||d | j                        S  	|g|i |S Ncall_function)constanttracer)enable_tracingpytreetree_mapr   unwrap_proxycreate_proxyr   )
r   r   r   r   out
proxy_argsproxy_kwargs	out_proxyr   r   s
           r   impl_proxy_dispatch_modezDregister_run_and_save_rng_state_op.<locals>.impl_proxy_dispatch_mode   s    %b:4:6:C)A)AB;;OJ!??4;;+C+CVLL00!7\I %S)d4;;WW)">t>v>>r   )
r   py_implr   r   r   CUDACPUBackendSelectr   r   )r   r   r   r   r   r   s     @@@@r   "register_run_and_save_rng_state_opr      s    01IJ8"";#7#78 !7M ##K$4$45? 6? ##KOO4: 5: ##K$=$=>) ?) ##N3< 4<
 ##$:;
? <
? "!r   c                     t        d       j                  t        j                        t	        d             j                  t        j
                        d        j                  t        j                        d        j                  t              fd       } j                  t        j                        fd       }j                  t              d        }S )	Nrun_with_rng_stateTr   c                     t         j                  j                         }t         j                  j                  | j	                                 ||i |}t         j                  j                  |       |S r    )r'   rJ   r   set_rng_statere   	rng_stater   r   r   current_stater   s         r   r   z1register_run_with_rng_state_op.<locals>.impl_cuda   sR    

002

  1$!&!

  /
r   c                     t        j                         }t        j                  |         ||i |}t        j                  |       |S r    )r'   r   r   r   s         r   r   z0register_run_with_rng_state_op.<locals>.impl_cpu   s@    ++-I&$!&!M*
r   c                    | j                   rt               5   	||g|i |}d d d        t        j                  | j                  j
                  ||g|      }t        j                  | j                  j
                  |      }| j                  j                  d	||      }t        |d | j                        S  	||g|i |S # 1 sw Y   xY wr   )r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   s
            r   r   z@register_run_with_rng_state_op.<locals>.impl_proxy_dispatch_mode   s    ,.(BHHH /((9b*@4*@J "??4;;+C+CVLL00!3ZI %S)d4;;WW%iEdEfEE /.s   CCc                 f    d}t        ||      }||v s
J d|        ||   } || |g|i |S r   r   )	r   r   r   r   r   r   r$   r   r   s	          r   r   z;register_run_with_rng_state_op.<locals>.impl_backend_select   sU    %h7D&)!H%?x#HH!Ir3D3F33r   c                 B    | 5   ||i |cd d d        S # 1 sw Y   y xY wr    rt   )r   r   r   r   r   s        r   r   z=register_run_with_rng_state_op.<locals>.impl_fake_tensor_mode   s     t&v& TTs   )
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   s      @@@r   register_run_with_rng_state_opr      s    ,-AB4{334 !3DI  0 01 2 0 1  67F 8F  9 9:4 ;4 /' 0' r   c                      t                y r    )rq   rt   r   r   register_rng_primsr     s    r   r    )0typingr   r   r'   torch.utils._pytreeutils_pytreer   r   torch._Cr   torch._higher_order_ops.utilsr   
torch._opsr   torch._prims_commonr	   r
   torch._prims_common.wrappersr   torch._subclasses.fake_tensorr   "torch.fx.experimental.proxy_tensorr   r   r   torch.typesr   r   rngprim_namespacelibraryLibraryr!   r#   r,   r%   r   r<   rl   rD   rZ   rq   r   r   r   r   r   r   rt   r   r   <module>r      s   "  $ $    B * O @ 8 
 (  
--

 15
9}}$$v: --.?T MM))*;VVL %.A::A::04n*"Z6r <= 35 r   