U
    9%e^+                     @   sb  d dl mZmZ d dlZd dlm  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 dlmZmZ dZ ej!"e dZ#ej!"e ddZ$ej!"e ddZ%ej!"e ddZ&dd Z'd&ddZ(ej)dddZ*ej)dddZ+dd Z,dd Z-d d! Z.d"d# Z/e. Z0e/ Z1d$d% Z2dS )'    )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)_get_current_dispatch_mode_pop_mode_temporarilyrngprimsZDEFZIMPLZCompositeExplicitAutogradAutogradZMetac                 C   s&   t d| j d| j d| j dd S )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)device r   U/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_prims/rng_prims.pythrow_on_non_cuda"   s    r   c           	      C   s   t | t| | t| | ttjjj	| }|j
}|rB||_t| t| ||fD ](}||_tjjj|_||_||_||_qZd S N)rngprimZdefinerngprim_implimplrngprim_meta_implgetattrtorchZ_opsZopsr   defaultZ_tagsrngprim_autograd_implr
   __doc__Z_prims_commonZRETURN_TYPEZNEWreturn_typeschema	impl_atenZprim_meta_impl)	namer&   r'   	impl_metadoctagsZprim_packetZprimpr   r   r   register_rng_prim*   s    
r-   shapec                 C   s   t tjdtjdS )Nr   dtype)r   Z
TensorLiker!   Ztensorint64r.   r   r   r   philox_rand_offset_metaA   s    r3   c                 C   s   d}| D ]}||9 }qt j|t jd}d}d}d}t jt j }|j| }|| d | }	t|	|j| }	|d ||	 |  d | }
|
S )N   r0         )	r!   Zscalar_tensorr2   cudaZget_device_propertiesZcurrent_deviceZmax_threads_per_multi_processorminZmulti_processor_count)r/   Znumel_scalarZdim_sizeZnumel
block_sizeZunrollZcurand4_engine_callsZdevice_propertyZblocks_per_smZ	grid_sizeoffsetr   r   r   philox_rand_offsetG   s    

r;   c                  C   sz   d} d}t jt jt jtttdf  ttddd}t jt jt jtttdf  ttddd}t| |||d	t j	j
fd
 d S )NZphilox_randzphilox_rand(SymInt[] size, Tensor seed, Tensor offset, int[]? stride, Device? device=None, ScalarType? dtype=None) -> (Tensor, Tensor).)r/   seedr:   strider   r1   c                 S   s6   |d kst t| }tj| |||d}t| }||fS )N)r/   stridesr1   r   )AssertionErrorr	   r   Z
TensorMetar3   )r/   r<   r:   r=   r   r1   random_valuesr   r   r   _philox_rand_metac   s    	   z/register_philox_rand.<locals>._philox_rand_metac              	   S   st   |d kst |jdkrg }n|g}|jdkr4t|tj|" t|| tj| ||d}W 5 Q R X |t	| fS )Ncpur7   )r   r1   )
r?   r   r   r!   randomZfork_rngr   Zset_torch_state_tensorZrandr;   )r/   r<   r:   r=   r   r1   devicesr@   r   r   r   _philox_randt   s    	

z*register_philox_rand.<locals>._philox_randz$Philox based stateless rand operator)r(   r&   r'   r)   r*   r+   )r!   SizeTensorr   r   intr   r   r-   TagZnondeterministic_seeded)r(   r&   rA   rE   r   r   r   register_philox_rand_   s0    rJ   c                 C   sl   | dr.| d}t|tr(t|}|jS dd | D }tdd |D rRdS tdd |D rhdS d S )	Nr   c                 S   s    h | ]}t |tjr|jjqS r   )
isinstancer!   rG   r   r   ).0argr   r   r   	<setcomp>   s      zget_device.<locals>.<setcomp>c                 s   s   | ]}|d kV  qdS )r7   Nr   rL   devr   r   r   	<genexpr>   s     zget_device.<locals>.<genexpr>r7   c                 s   s   | ]}|d kV  qdS )rB   Nr   rO   r   r   r   rQ      s     rB   )getrK   strr!   r   r   any)argskwargsr   rD   r   r   r   
get_device   s    



rW   c                     s   t dtj tj tj tj tj tj	t
dd tjdd tjdd tjfdd	 t fd
dtfdd} S )Nrun_and_save_rng_stateTZdeferred_errorc                 _   s   t j | ||fS r   )r!   r7   get_rng_stateoprU   rV   r   r   r   	impl_cuda   s    z5register_run_and_save_rng_state_op.<locals>.impl_cudac                 _   s   t  | ||fS r   )r!   rZ   r[   r   r   r   impl_cpu   s    z4register_run_and_save_rng_state_op.<locals>.impl_cpuc                    sB    d}t ||}||ks*td| || }|| f||S N)r7   rB   zBackend not supported for rW   r?   )r\   rU   rV   impl_mapr   r   r^   r]   r   r   impl_backend_select   s
    

z?register_run_and_save_rng_state_op.<locals>.impl_backend_selectc                    s    | f||S r   r   r[   )rc   r   r   impl_fake_tensor_mode   s    zAregister_run_and_save_rng_state_op.<locals>.impl_fake_tensor_modec              
      s   t  }|d k	stt }|jr | f||}t|jj| f|}t|jj|}|jd||}t	||d |jdW  5 Q R  S | f||W  5 Q R  S W 5 Q R X d S NZcall_function)Zconstanttracer)
r   r?   r   enable_tracingpytreetree_maprf   unwrap_proxycreate_proxyr   )r\   rU   rV   modeout
proxy_argsproxy_kwargs	out_proxy)rd   rX   r   r   impl_proxy_dispatch_mode   s(          zDregister_run_and_save_rng_state_op.<locals>.impl_proxy_dispatch_mode)r   fallthroughr   ADInplaceOrViewAutocastCPUAutocastCUDAPythonDispatcherPythonTLSSnapshotpy_implr   r   CUDACPUBackendSelectr   r   )rq   r   )rc   r^   r]   rd   rX   r   "register_run_and_save_rng_state_op   s(    






r|   c                     s   t dtj tj tj tj tj tj	t
dd tjdd tjdd  tfdd	} tj fd
d}tdd }S )Nrun_with_rng_stateTrY   c                 _   s4   t j }t j|   |||}t j| |S r   )r!   r7   rZ   set_rng_staterB   	rng_stater\   rU   rV   Zcurrent_staterm   r   r   r   r]      s
    

z1register_run_with_rng_state_op.<locals>.impl_cudac                 _   s*   t  }t |  |||}t | |S r   )r!   rZ   r~   r   r   r   r   r^      s
    


z0register_run_with_rng_state_op.<locals>.impl_cpuc           	   
      s   t  }|d k	stt }|jrt   | |f||}W 5 Q R X t|jj| |f|}t|jj|}|j	d ||}t
||d |jdW  5 Q R  S  | |f||W  5 Q R  S W 5 Q R X d S re   )r   r?   r   rg   r   rh   ri   rf   rj   rk   r   )	r   r\   rU   rV   rl   rm   rn   ro   rp   )r}   r   r   rq      s0     
      z@register_run_with_rng_state_op.<locals>.impl_proxy_dispatch_modec                    sD    d}t ||}||ks*td| || }|| |f||S r_   r`   )r   r\   rU   rV   ra   r   r   rb   r   r   rc     s
    

z;register_run_with_rng_state_op.<locals>.impl_backend_selectc                 _   s
   |||S r   r   )r   r\   rU   rV   r   r   r   rd     s    z=register_run_with_rng_state_op.<locals>.impl_fake_tensor_mode)r   rr   r   rs   rt   ru   rw   rv   rx   r   r   ry   rz   r   r{   r   )rq   rc   rd   r   )r^   r]   r}   r   register_run_with_rng_state_op   s(    







r   c                   C   s
   t   d S r   )rJ   r   r   r   r   register_rng_prims#  s    r   )N)3typingr   r   r!   Ztorch.utils._pytreeutilsZ_pytreerh   r   Ztorch._Cr   Ztorch._higher_order_ops.utilsr   Z
torch._opsr   Ztorch._prims_commonr   r	   Ztorch._prims_common.wrappersr
   Ztorch._subclasses.fake_tensorr   Z"torch.fx.experimental.proxy_tensorr   r   r   Ztorch.typesr   r   Ztorch.utils._python_dispatchr   r   Zrngprim_namespaceZlibraryLibraryr   r   r#   r   r   r-   rF   r3   r;   rJ   rW   r|   r   rX   r}   r   r   r   r   r   <module>   sD     
77C