o
    Eit                     @   st   d dl Z d dlZd dlZd dlZd dlmZ dd Zdd Ze	 Z
dd Zd	d
 ZG dd dZG dd dZdS )    N)opc                    s   t j fdd}|S )Nc                     s(   | d }| dd  D ]} ||}q
|S )Nr       )argsxy	binary_opr   N/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/backend/base.pynary_op	   s   z+associative_binary_to_nary.<locals>.nary_op)einxtrace)r	   r   r   r   r
   associative_binary_to_nary   s   r   c                    sx   t  ttfrt ttfstddd  fdd}ddtv r)jnt d|_d	  d
 d |S )Nz8in_axes and out_axes must be tuples or lists of integersc                    s   t  fdd|  S )Nc                    s   | j | dS Naxisstack)backendxsr   r   r
   <lambda>   s    z-vmap_forloop.<locals>.stack.<locals>.<lambda>)r   jit)r   r   r   r   r
   r      s   zvmap_forloop.<locals>.stackc                     s  t | t krtdt  dt |  dd t| D }t |dkr-td| | }g gt  }t|D ]5  fddt| D  }t |t krbtdt  d	t | t||D ]	\}}|| qgq<tfd
dt|D }|S )Nz	Expected z arguments, got c                 S   s"   h | ]\}}|d ur|j | qS Nshape.0argr   r   r   r
   	<setcomp>   s   " z.vmap_forloop.<locals>.inner.<locals>.<setcomp>r   z>Expected all arguments to have same size along vmap axis, got c                    s4   g | ]\}}|d ur|t d f|  f  n|qS r   )slicer   ir   r
   
<listcomp>%   s    "z/vmap_forloop.<locals>.inner.<locals>.<listcomp>z& arguments from vmapped function, got c                 3   s     | ]\}} ||d V  qdS )r   Nr   )r   out_axisxs_stackr   r   r
   	<genexpr>/   s    
z.vmap_forloop.<locals>.inner.<locals>.<genexpr>)len
ValueErrorzippoprangeappendtuple)r   value	xs_stacksr   r$   r   in_axesr   out_axesr   r    r
   inner   s0   zvmap_forloop.<locals>.innerzvmap(__name__z, zin_axes=z, out_axes=))
isinstancer,   listr'   dirr3   str)r   r0   r1   r   r2   r   r/   r
   vmap_forloop   s   $r9   c                   C   s   t tdsg t_tjS )Nbackend_stack)hasattr_thread_localr:   r   r   r   r
   _get_backend_stack=   s   
r=   c                   C   s   t t dkrt d S d S )Nr   )r&   r=   r   r   r   r
   get_defaultC   s   
r?   c                   @   sR  e Zd ZdZg Zdd Zdd Zedd Ze	e
jd(d	d
Ze	e
jd)ddZe	e
jdd Ze	e
jd*ddZe	e
jd+ddZe	e
jd*ddZe	e
jd*ddZe	e
jd*ddZe	e
jd*ddZe	e
jd*dd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
d&d' ZdS ),BackendNc                 C   s   t  |  | S r   )r=   r+   )r   r   r   r
   	__enter__N   s   zBackend.__enter__c                 G   s    t  d | u s	J t    d S Nr>   )r=   r)   )r   r   r   r   r
   __exit__R   s   zBackend.__exit__c                 C      | S r   r   )fr   r   r
   _decorate_construct_graphV   s   z!Backend._decorate_construct_graphFc                    s     fddfdd|D S )Nc                    s0   t | tjjsrtj| r | | j} | S r   )r5   r   tracerTensorRequiringConversion	is_scalar	to_tensorr   tensor)r   convert_scalarsr   r
   rJ   ]   s   
z(Backend.all_to_tensor.<locals>.to_tensorc                    s   g | ]} |qS r   r   r   rL   )rJ   r   r
   r"   d       z)Backend.all_to_tensor.<locals>.<listcomp>r   )r   tensorsrM   r   )r   rM   rJ   r
   all_to_tensorZ   s   zBackend.all_to_tensorr   c                    s.   t d f| d  | j fdd|D |dS )Nr   c                    s   g | ]}|  qS r   r   rN   sr   r
   r"   j   rO   z!Backend.stack.<locals>.<listcomp>r   )r   concatenate)r   rP   r   r   rR   r
   r   f   s   zBackend.stackc              	   C   s   |  || | |||S r   )subtractmultiplyfloor_divide)r   r   r   r   r   r
   modl   s   zBackend.modc                    sr   t  tr f | j| dd}| |}| |t fddt|jD }| | j	| 
||  dd| S )NTr   keepdimsc                 3   s     | ]\}}| vr|V  qd S r   r   )r   r!   rS   r   r   r
   r%   z   s    z$Backend.logsumexp.<locals>.<genexpr>F)r5   intmaxstop_gradientreshaper,   	enumerater   logsumexp)r   r   r   x_max_keepdimsx_max_dropdimsr   r   r
   	logsumexpq   s   

zBackend.logsumexpc                 C   s   |  | j|||dS )NrY   )sqrtvar)r   r   r   rZ   r   r   r
   std   s   zBackend.stdc                 C   s&   |  |}| j||d}| |}|S r   )r`   ra   rb   r   rL   r   r   r   r
   prod   s   

zBackend.prodc                 C   s   | j ||ddkS )Nr   r   )count_nonzerori   r   r   r
   any   s   zBackend.anyc                    sV   |d u rt  j}nt|tr j| }nt  fdd|D }| j |d|kS )Nc                    s   g | ]} j | qS r   r   )r   r!   rK   r   r
   r"      s    zBackend.all.<locals>.<listcomp>r   )nprj   r   r5   r[   rk   )r   rL   r   	total_numr   rK   r
   all   s   
zBackend.allc                 C   sB   | j ||dd}| |}|| }| || j| ||dd S NTrY   )r\   r]   rb   ra   r   r   r   x_maxr   r   r
   softmax      
 zBackend.softmaxc                 C   sB   | j ||dd}| |}|| }|| | j| ||dd S rp   )r\   r]   r`   ra   rb   rq   r   r   r
   log_softmax   rt   zBackend.log_softmaxc                 C   sB   t |tr|f}|D ]}td f| td d df }|| }q
|S rB   )r5   r[   r   )r   rL   r   cr   r   r
   flip   s   

zBackend.flipc                 C   s   t |tr|f}t |tr|f}t|t|kr&tdt| dt| t||D ]%\}}| |j| }| || |j| }td f| |f }|| }q+|S )NzGot z shifts, expected )	r5   r[   r&   r'   r(   aranger   rX   r   )r   rL   shiftr   indicesrv   r   r   r
   roll   s   


zBackend.rollc                 C   s   d|  | S )Ng      ?)rf   )r   r   r   r   r
   rsqrt   s   zBackend.rsqrtc                 C   s   t jdjj| |||dS )Nr   )r0   r1   )r   rG   import_r   r9   )r   r   r0   r1   r   r   r
   vmap   s   zBackend.vmapc                 C   rD   r   r   )r   r   r   r
   r      s    zBackend.<lambda>)F)r   r   )NF)r3   
__module____qualname__function_name
decoratorsrA   rC   staticmethodrF   classmethodr   r   rQ   r   rX   re   rh   rj   rl   ro   rs   ru   rw   r{   r|   r~   r   
keep_shaper]   r   r   r   r
   r@   J   sd    

	r@   c                   @   s   e Zd Zdd Zdd ZdS )ErrorBackendc                 C   s
   || _ d S r   )message)selfr   r   r   r
   __init__      
zErrorBackend.__init__c                 C   s
   t | jr   )RuntimeErrorr   )r   namer   r   r
   __getattr__   r   zErrorBackend.__getattr__N)r3   r   r   r   r   r   r   r   r
   r      s    r   )r   	functools	threadingnumpyrm   einx.tracer.tensorr   r   r9   localr<   r=   r?   r@   r   r   r   r   r
   <module>   s    ' 