o
    Ei;                     @   sH   d dl T ddlmZ ddlmZ ddlZddlZddlmZ dd Z	dS )   )*    N)op)partialc               
      s8  dd l tdd jdd d D } | dk r,d}j d td	|  t|S tjdfd
d	 d fdd	d}t	ddd l dd fdddt
v rcjj}nt	dddd lm} dd lm} dt|jv rd|j_G  f	dddt}tj|j | S )Nr   c                 s   s    | ]}t |V  qd S N)int).0i r
   P/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/backend/_torch.py	<genexpr>       zcreate.<locals>.<genexpr>.   )r   r   z;einx with PyTorch requires PyTorch version >= 2, but found z*. einx functions are disabled for PyTorch.z	WARNING: c                    sj   d  | D ]}t |tjjrt |tjjs|j  nq d u r"td fddfddt| D S )Nz>Failed to determine the PyTorch device placement of parametersc                    sD   t j|r d u s| v r t jjj|gd it jddS |S )Ndevicer
   argskwargsoutput)einxtracer	is_scalarapplyasarrayTensor)r	   x)r   scalar_indicesttorchr
   r   	to_tensor   s   
z9create.<locals>.move_scalars_to_device.<locals>.to_tensorc                    s   g | ]	\}} ||qS r
   r
   )r   r	   argr   r
   r   
<listcomp>'   s    z:create.<locals>.move_scalars_to_device.<locals>.<listcomp>)
isinstancer   r   r   Scalarr   
ValueError	enumerate)r   r   r   r   )r   r   r   r   move_scalars_to_device   s   z&create.<locals>.move_scalars_to_devicec                    s$   t jt  fdd}|S )Nc                     s    | } | i |S r   r
   )r   r   )r'   r   r   r
   r   wrapper*   s   
zFcreate.<locals>.move_scalars_to_device_in_elementwise.<locals>.wrapper)r   trace	functoolswraps)r   r   r(   )r'   )r   r   r   %move_scalars_to_device_in_elementwise)   s   z5create.<locals>.move_scalars_to_device_in_elementwise __einx_decorated_construct_graphtorchc                 S   sL   t | tr| S t | trt| S t | tjrt|  S tdt|  d)NzCannot convert z	 to tuple)r"   tuplelistnpndarraytolistr$   typer   r
   r
   r   to_tuple7   s   

zcreate.<locals>.to_tuplec                    s   t | trt |  S | S r   )r"   strvarsr5   )torch_r
   r   to_dtypeC   s   
zcreate.<locals>.to_dtypecompilerztorch._dynamo_dynamocapture_func_transformsTc                       s  e Zd ZdZjgZdZeZeZ	ee
jdd Zee
jd2fdd	Zee
jfdd	Zee
jfd
dZee
jfddZee
j fddZee
jd3fdd	ZejZejZeejZejZeejZejZejZejZeejZeejZej dgdZ ee
j!"dZ#ee
j!"dZ$ee
j!"dZ%ee
j!"dZ&ee
j!"dZ'ee
j!"dZ(eej)Z)eej*Z*e+j,Z,e+j-Z-e+j.Z.e+j/Z/e+j0Z0e+j1Z1e+j2Z2e+j3Z3e+j4Z4e+j5Z5e+j6Z6ej7Z7ej8Z8ej9Z9ej:Z:ej;Z;ee
jdd Z<ee
jdd Z=ee
jdd  Z>ee
jd!d" Z?ee
jfd#d$Z@ee
jfd%d&ZAee
jfd'd(ZBee
jfd)d*ZCee
jd+d, ZDee
jfd-d.ZEG fd/d0d0ZFd1S )4zcreate.<locals>.torchr.   
_call_implc                 S   s   J r   r
   )r   shaper
   r
   r   r   b   s   zcreate.<locals>.torch.to_tensorFc                    s`   d | D ]}t |tjjkr|j nqd u rd fddfdd| D } | S )Ncpuc                    sH   t | tjjs r"tj| r"tjjj| gditj| jdS | S )Nr   r   )	r"   r   r   TensorRequiringConversionr   r   r   r   r?   )tensor)convert_scalarsr   r   r
   r   r   r   s   
z6create.<locals>.torch.all_to_tensor.<locals>.to_tensorc                    s   g | ]} |qS r
   r
   )r   rB   r    r
   r   r!      s    z7create.<locals>.torch.all_to_tensor.<locals>.<listcomp>)r4   r   r   r   r   )tensorsrC   rB   r&   )rC   r   r   r   all_to_tensorg   s   
z#create.<locals>.torch.all_to_tensorc                    s*   t j| |kr
| S tj|  |S r   )r   r   	get_shaper   reshaperB   r?   r6   r   r
   r   rG      s   zcreate.<locals>.torch.reshapec                    s   t j|  |S r   )r   	transposepermute)rB   permrI   r
   r   rJ         zcreate.<locals>.torch.transposec                    s   t j|  |S r   )r   broadcast_torH   rI   r
   r   rN      rM   z"create.<locals>.torch.broadcast_toc                    s     |}t j| g|R  S r   )r   einsum)equationrD   )r'   r   r
   r   rO      s   zcreate.<locals>.torch.einsumint32c                    s   t j|  |dS )N)dtype)r   arange)nrR   )r:   r   r
   r   rS      s   zcreate.<locals>.torch.aranger   )r   <z<=>z>=z==z!=c                 S   s   t |tr&tdd |D s|d jdkr| | S | tdd |D  d S t |tttjjfs5|jdkr9| | S | |d   d S )Nc                 s   $    | ]}t |tttjjfV  qd S r   r"   slicer   r   r   r#   r   cr
   r
   r   r         " z/create.<locals>.torch.get_at.<locals>.<genexpr>r   c                 s       | ]}|d  V  qd S r   r
   rZ   r
   r
   r   r      r   )	r"   r/   anyndimrY   r   r   r   r#   )rB   coordinatesr
   r
   r   get_at   s   

zcreate.<locals>.torch.get_atc                 S   s   t |tr.tdd |D s|d jdkr| ||S tdd |D }|d  }| ||S t |tttjj	fs=|jdkrC| ||S |d  }|d  }| ||S )Nc                 s   rW   r   rX   rZ   r
   r
   r   r      r\   z/create.<locals>.torch.set_at.<locals>.<genexpr>r   c                 s   r]   r   r
   rZ   r
   r
   r   r      r   )
r"   r/   r^   r_   __setitem__rY   r   r   r   r#   rB   r`   updatesr
   r
   r   set_at   s   

zcreate.<locals>.torch.set_atc                 S      t |tr:tdd |D s|d jdkr!| || ||S tdd |D }|d  }| || ||S t |ttt	j
jfsI|jdkrU| || ||S |d  }|d  }| || ||S )Nc                 s   rW   r   rX   rZ   r
   r
   r   r     r\   z/create.<locals>.torch.add_at.<locals>.<genexpr>r   c                 s   r]   r   r
   rZ   r
   r
   r   r     r   )r"   r/   r^   r_   rb   __getitem____iadd__rY   r   r   r   r#   rc   r
   r
   r   add_at  .   

zcreate.<locals>.torch.add_atc                 S   rf   )Nc                 s   rW   r   rX   rZ   r
   r
   r   r   /  r\   z4create.<locals>.torch.subtract_at.<locals>.<genexpr>r   c                 s   r]   r   r
   rZ   r
   r
   r   r   7  r   )r"   r/   r^   r_   rb   rg   __isub__rY   r   r   r   r#   rc   r
   r
   r   subtract_at*  rj   z!create.<locals>.torch.subtract_atc                    s"   t |tr|g}t j| |S r   )r"   r   r   
keep_shapefliprB   axisr&   r
   r   rn   N  s   
zcreate.<locals>.torch.flipc                    s$   t |tr|g}t j| ||S r   )r"   r   r   rm   roll)rB   shiftrp   r&   r
   r   rq   U  s   
zcreate.<locals>.torch.rollc                    sH   t |ttfrt|dkrtdt| d|d }t j| |S )Nr   z7PyTorch only supports softmax along a single axis, got  axesr   )r"   r0   r/   lenr$   r   rm   softmaxro   r&   r
   r   ru   \  s   zcreate.<locals>.torch.softmaxc                    sL   t |ttfrt|dkrtdt| d|d }t jjj	| |S )Nr   z;PyTorch only supports log_softmax along a single axis, got rs   r   )
r"   r0   r/   rt   r$   r   rm   nn
functionallog_softmaxro   r&   r
   r   rx   h  s   z!create.<locals>.torch.log_softmaxc                 S   s   t d)Nz6stop_gradient is currently not implemented for PyTorch)NotImplementedErrorr5   r
   r
   r   stop_gradientt  s   z#create.<locals>.torch.stop_gradientc                    sr   t jjj| gt|trt|n|t|trt|n|ddt jjdd |D dd} t jj j| gdd} | S )	N)in_dimsout_dimsvmapc                 S   s   g | ]}t j|qS r
   )r   r   r   )r   r?   r
   r
   r   r!     s    z.create.<locals>.torch.vmap.<locals>.<listcomp>)r   )r   r   	signaturer   z>Workaround for https://github.com/pytorch/pytorch/issues/94674)r   comment)	r   r   r   r}   r"   r0   r/   Functionallow_in_graph)r   in_axesout_axesinput_shapesoutput_shapes)	tcompilerr   r
   r   r}   y  s"   zcreate.<locals>.torch.vmapc                       s    e Zd Zej fddZdS )zcreate.<locals>.torch.randomc                    s4   t jjj ||gd| it j|ddkS )N	generatorr   g      ?)r   r   r   	bernoullifullr   )rngpr?   rI   r
   r   r     s   
z&create.<locals>.torch.random.bernoulliN)__name__
__module____qualname__r   r)   r   r
   rI   r
   r   random  s    r   N)F)rQ   )Gr   r   r   namer   tensor_typesfunction_namestaticmethodr6   r:   r   r)   r   rE   rG   rJ   rN   rO   rS   r   stackconcatenateassociative_binary_to_naryelementwiseaddsubtractmultiplytrue_dividefloor_dividedividelogical_and
logical_orwherer   Operatorless
less_equalgreatergreater_equalequal	not_equalmaximumminimumreducesummeanvarstdprodcount_nonzeror^   allminmax	logsumexplogexpsqrtrsqrtsquarera   re   ri   rl   rn   rq   ru   rx   rz   r}   r   r
   	r'   r,   r   r:   	to_dtype2r6   	to_tuple2r9   r   r
   r   r.   X   s    ""

r   )r.   r/   __version__splitprintErrorBackendr   r)   r   import_dirr;   torch._dynamor<   r8   configr=   Backendjitdecorate_traced_functionsr   )versionmessage MARKER_DECORATED_CONSTRUCT_GRAPHr;   r<   r.   r
   r   r   create   s<   "	

$  Fr   )
baseeinx.tracerr   einx.tracer.tensorr   r   typesr*   r   r   r
   r
   r
   r   <module>   s    