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                     sZ   dd l dd lm  m}  tddtdddd  G  fdddt}| S )	Nr   
tensorflowtfztensorflow.experimental.numpytnpc                 S   sD   t | t |krtdd t| |D sJ tdd t| |D S )Nc                 s   s,    | ]\}}||kp|d kp|d kV  qdS r   N .0s1s2r   r   U/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/backend/_tensorflow.py	<genexpr>   s    
z:create.<locals>._broadcast_static_shape.<locals>.<genexpr>c                 s   s    | ]
\}}t ||V  qd S N)maxr   r   r   r   r          )lenallziptuple)shape1shape2r   r   r   _broadcast_static_shape   s   z'create.<locals>._broadcast_static_shapec                       sT  e Zd ZdZjgZeejfddZ	e
jZe
jZe
jZeejfddZe
j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Ze
jZe
jZe
jZe
j Z e
j!Z!e
j"Z"ee
j#Z#ee
j$Z$e
%j&Z&e
%j'Z'e
%j(Z(e
%j)Z)e
%j*Z*e
%j+Z+e
%j,Z,e
%j-Z-e
%j.Z.e
%j/Z/e
%j0j1Z2e
j3Z3e
j4Z4e
j5Z5e
j0j6Z6e
j7Z7e8ejfddZ9e8ej fdd	Z:e8ejfd
dZ;e8ejfddZ<e8e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fddZAe
Bj0j5Z5e
Bj0j6Z6e
Bj7Z7e
BjCZCefddZDG fdddZEdS )zcreate.<locals>.tensorflowr   c                    s   t jj j| gt j|dS Nargsoutput)einxtracerapplyconvert_to_tensorTensor)tensorshapettfr   r   	to_tensor   s
   
z$create.<locals>.tensorflow.to_tensorc                    s   t  j| g|R ddiS )Noptimizeoptimal)r   einsum)equationtensorsttnpr   r   r,   &   s   z!create.<locals>.tensorflow.einsumc                    sb   |  |d \}}t|tr|d j} j|dd}n|jd d }tjj j||gtj	|dS )Nr   axisr   )
_prepare_coordinates_and_update
isinstancer   r&   stackr    r!   r"   	gather_ndr$   )backendr%   coordinates_	out_shaper'   r   r   get_atT   s   


z!create.<locals>.tensorflow.get_atc                    s<  |d u st |tjjsJ t |trCtdd |D sJ |d j|dd  D ]}|jq( fdd|D } j|dd}nt |tjjsLJ |td f|j	d  d	  }|d
 }|d u sl|j	d |j	kslJ |d u rx|jd d n|j|jd d  
||jdd   }|d ur 
|}||fS )Nc                 s   s    | ]
}t |tjjV  qd S r   )r5   r    r!   r$   r   cr   r   r   r   h   r   zMcreate.<locals>.tensorflow._prepare_coordinates_and_update.<locals>.<genexpr>r   r   c                    s   g | ]}  |qS r   )broadcast_tor=   r8   r&   r   r   
<listcomp>l       zNcreate.<locals>.tensorflow._prepare_coordinates_and_update.<locals>.<listcomp>r1   r2   r   ).N)r5   r    r!   r$   r   r   r&   r6   slicendimr?   )r8   r9   updatesr>   )r   r@   r   r4   c   s&   

z:create.<locals>.tensorflow._prepare_coordinates_and_updatec                    4   |  ||\}}tjj j|||gtj|jdS r   )r4   r    r!   r"   tensor_scatter_nd_updater$   r&   r8   r%   r9   rE   r'   r   r   set_at      z!create.<locals>.tensorflow.set_atc                    rF   r   )r4   r    r!   r"   tensor_scatter_nd_addr$   r&   rH   r'   r   r   add_at   rJ   z!create.<locals>.tensorflow.add_atc                    rF   r   )r4   r    r!   r"   tensor_scatter_nd_subr$   r&   rH   r'   r   r   subtract_at   rJ   z&create.<locals>.tensorflow.subtract_atc                    s"   t |tr|g}t j| |S r   )r5   intr   
keep_shapereversexr3   r'   r   r   flip   s   
zcreate.<locals>.tensorflow.flipc                    s>   t |tr|g}t |tr|g}t j| t|t|dS )Nr2   )r5   rO   r   rP   rollr   )rS   r3   shiftr'   r   r   rU      s
   

zcreate.<locals>.tensorflow.rollc                    L   t |ttfrt|dkrtdt| d|d }t jj| |dS )Nr   z:Tensorflow only supports softmax along a single axis, got  axesr   r2   )	r5   listr   r   
ValueErrorr   rP   nnsoftmaxrR   r'   r   r   r\         z"create.<locals>.tensorflow.softmaxc                    rW   )Nr   z>Tensorflow only supports log_softmax along a single axis, got rX   r   r2   )	r5   rY   r   r   rZ   r   rP   r[   log_softmaxrR   r'   r   r   r^      r]   z&create.<locals>.tensorflow.log_softmaxc                    s"   t j fdd}|S )Nc                     sh  t | t krtdt  dt |  dd t| D }t |dkr-td| | }g }t| D ]3\}  d ura dkr` g fdd	tt |jD  }tjj	j	||}n|j
 }|| q8tjfd
ddd	 |D gd}tjjj||gdd	 D d}t |t krtdt  dt | fdd	t|D }t|S )Nz	Expected z arguments, got c                 S   s"   h | ]\}}|d ur|j | qS r   )r&   )r   argr3   r   r   r   	<setcomp>      " zAcreate.<locals>.tensorflow.vmap.<locals>.inner.<locals>.<setcomp>r   z>Expected all arguments to have same size along vmap axis, got r   c                    s   g | ]}| kr|qS r   r   r   ar2   r   r   rA      rB   zBcreate.<locals>.tensorflow.vmap.<locals>.inner.<locals>.<listcomp>c                    s    |  S r   r   )xsr   r   r   <lambda>   s    z@create.<locals>.tensorflow.vmap.<locals>.inner.<locals>.<lambda>c                 S   s"   g | ]}t j|jd d qS r
   )r    r!   r$   r&   r   rS   r   r   r   rA      ra   )r   c                 S   s   g | ]}t j|qS r   )r    r!   r$   )r   r&   r   r   r   rA      rB   r   z& arguments from vmapped function, got c                    s>   g | ]\} t jjj| fd dtt|jD qS )c                    s,   g | ]}| k r|d  n| krdn|qS )r   r   r   rb   out_axisr   r   rA      s    zMcreate.<locals>.tensorflow.vmap.<locals>.inner.<locals>.<listcomp>.<listcomp>)r    r!   r   	transposeranger   r&   rf   r/   rg   r   rA      s    
)r   rZ   r   poprj   r&   r    r!   r   ri   newaxisappendtracer"   vectorized_mapr   )r   valuerd   r_   permop2)in_axesr   out_axesoutput_shapesr   r(   r0   r2   r   inner   sB   "

z.create.<locals>.tensorflow.vmap.<locals>.inner)r    rn   )r   rs   rt   input_shapesru   rv   )r   r(   r0   )rs   r   rt   ru   r   vmap   s   5zcreate.<locals>.tensorflow.vmapc                       s   e Zd Zej fddZdS )z!create.<locals>.tensorflow.randomc                    s0   t jj jj|gddd| dt j|d|kS )Ng        g      ?float32)minvalmaxvaldtypeseed)r   kwargsr   )r    r!   r"   randomuniformr$   )rngpr&   r'   r   r   	bernoulli  s   
z+create.<locals>.tensorflow.random.bernoulliN)__name__
__module____qualname__r    rn   r   r   r'   r   r   r     s    r   N)Fr   r   r   namer$   tensor_typesstaticmethodr    rn   r)   r   reshaperi   r?   r,   aranger6   concatenateassociative_binary_to_naryelementwiseaddsubtractmultiplytrue_dividefloor_dividedividelogical_and
logical_orwhereless
less_equalgreatergreater_equalequal	not_equalmaximumminimumreducesummeanvarstdprodcount_nonzeroanyr   minr   mathreduce_logsumexp	logsumexplogexpsqrtrsqrtsquareclassmethodr<   r4   rI   rL   rN   rT   rU   r\   r^   rP   stop_gradientrx   r   r   r   r   r(   r0   r   r   r      s    

9)r   tensorflow.experimental.numpyexperimentalnumpyr!   import_Backend)r	   r   r   r   r   create   s    r   )
baseeinx.tracerr!   einx.tracer.tensorr   r    types	functoolsr   r   r   r   r   r   <module>   s    