o
    Ei>                     @   s   d dl ZddlT d dlmZ G dd dZG dd deZG d	d
 d
eZG dd deZ	G dd deZ
dd Zdd Zdd Zdd Zedd ZdS )    N   )*)partialc                   @   s   e Zd Zd efddZd efddZd efddZd efddZd efd	d
Zd efddZ	d efddZ
d efddZd efddZd efddZd efddZd efddZdd efddZdd ZdS ) opc                       t  fdd}|S )Nc                    s(   |t | kr| S t | |gt|ddS )Nreshapeargsoutput	signature	get_shapeapplyTensortensorshaper    O/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/tracer/tensor.pyr      s   zop.reshape.<locals>.reshapetrace)r   r   r   r   r   r      s   z
op.reshapec                    r   )Nc                    sH   t |t t jkr S t fdd|D }t |gt|ddS )Nc                 3   s    | ]} j | V  qd S Nr   .0ir   r   r   	<genexpr>       z2op.transpose.<locals>.transpose.<locals>.<genexpr>	transposer   )listrangendimtupler   r   )r   permr   r   r   r   r       s   zop.transpose.<locals>.transposer   )r   r    r   r   r   r       s   zop.transposec                    r   )Nc                    s(   t | |kr| S t | |gt|ddS )Nbroadcast_tor   r   r   r   r   r   r&      s
   z%op.broadcast_to.<locals>.broadcast_tor   )r   r&   r   r   r   r&      s   zop.broadcast_toc                    r   )Nc              	      sD  |  dd  d}t|t|kr tdt| dt| i  tt||D ]S\}\}}| dd}t|t|jkrStdt| dt|j d	| d
t||jD ]"\}}| v rw | |krvtd| d |  d| qY| |< qYq)|  dd  dd}	t fdd|	D }
t	| g||t
|
dS )Nz->r   ,z	Expected z tensors, got   z axes, got z for z-th (zero-based) input tensorz Got conflicting values for axis z: z and c                 3   s    | ]} | V  qd S r   r   )r   axisvaluesr   r   r   ?       z,op.einsum.<locals>.einsum.<locals>.<genexpr>r	   kwargsr
   )splitlen
ValueError	enumeratezipstripreplacer   r$   r   r   )eqtensorsr0   exprsr   exprr   r+   valueexpr_out	shape_outr   r,   r   einsum)   s,    
zop.einsum.<locals>.einsumr   )r   r?   r   r   r   r?   (   s   z	op.einsumc                       t d fdd	}|S )Nint32c                    s   t  | gd|it| fdS Ndtyper/   r   r   )nrC   r   r   r   arangeE   s   zop.arange.<locals>.arange)rA   r   )r   rF   r   r   r   rF   D      z	op.arangec                    r@   )Nr   c                    sV   |dk rt | d j| d }t| d j}||t |  t | gd|it|dS )Nr   r   r+   r/   )r2   r   r!   insertr   r   r9   r+   r   r   r   r   stackL   s
   zop.stack.<locals>.stackr   r   )r   rJ   r   r   r   rJ   K   s   zop.stackc                    r@   )Nr   c                    sB   t | d j}t fdd| D | < t| gd it|dS )Nr   c                 3   s    | ]}|j   V  qd S r   r   )r   r   r+   r   r   r   Z   r   z6op.concatenate.<locals>.concatenate.<locals>.<genexpr>r+   r/   )r!   r   sumr   r   rI   r   rL   r   concatenateW   s   z#op.concatenate.<locals>.concatenaterK   r   )r   rN   r   r   r   rN   V   s   zop.concatenatec                    s   t d fdd	}|S )Nfloat32c                    s   t  | gd|it| dS rB   rD   )r   rC   r   r   r   fill_constant`      z'op.fill_constant.<locals>.fill_constant)rO   r   )r   r<   rP   r   r   r   rP   _   rG   zop.fill_constantc                    r   )Nc                     s   d }| D ]A}dt |v rE|d u r|j}q|j}t|t|k r+d| }t|t|k st|t|k r?d| }t|t|k s3t||}q|d usLJ t | |t|dS )Nr   )r   r/   )dirr   r2   npmaximumr   r   )r	   r0   r   ashape2r   r   r   elementwiseg   s    z#op.elementwise.<locals>.elementwiser   )r   rW   r   r   r   rW   f   s   zop.elementwisec                    r   )Nc                     s   t  | |t| d jdS )Nr   r/   )r   r   r   )r	   r0   r   r   r   
keep_shape|   rQ   z!op.keep_shape.<locals>.keep_shaper   )r   rX   r   r   r   rX   {   s   zop.keep_shapec                    s   t d fdd	}|S )Nc                    s   | dd}|d u rd}n/t|tr|gn|}t| j}|r(|D ]}d||< q nt|ddD ]}||= q.i |d|i}t | g|t|dS )	NkeepdimsFr   r   T)reverser+   r/   )get
isinstanceintr!   r   sortedr   r   )r   r+   r0   rY   r   axesrU   r   r   r   reduce   s   

zop.reduce.<locals>.reducer   r   )r   r`   r   r   r   r`      s   z	op.reducec                    r   )Nc                    sZ  t |ts|fn|}tdd |D tjkr"tdtj dd tfdd|D rt|tjk rJ|td f }t|tjk s:g }g }d}d	}tjD ] }|rkt || trh|	| qWd
}qWt || trw|	| qWdd  dd |D tdd D dkrtdt
 fddtjd D }tfdd|D | fdd|D  }neg }j}	|D ]U}
t |
tt
jfr|	dd  }	qt |
tr|
|	d \}}}|	|| |  |	dd  }	q|
d u r|	d qt |
tr|
jdkr|	dd  }	qtdt|
 t|t|	 }t|gt|dS )Nc                 S   s   g | ]}|d ur|qS r   r   r   cr   r   r   
<listcomp>   s    z-op.get_at.<locals>.get_at.<locals>.<listcomp>z)Too many indices for tensor of dimension c                 S   s6   | d u st | tttjfrdS t | trdS | jdkS )NFTr   )r\   slicer]   rS   integerr!   r#   )rb   r   r   r   is_multidim   s
   

z.op.get_at.<locals>.get_at.<locals>.is_multidimc                 3   s    | ]} |V  qd S r   r   ra   )rf   r   r   r      r.   z,op.get_at.<locals>.get_at.<locals>.<genexpr>r   TFc                 S   sb   t tdd | D } t | dksJ t| dks(t| dkr,t | dkr,tdt | S )Nc                 S      h | ]}t |qS r   r]   r   r   r   r   	<setcomp>       z?op.get_at.<locals>.get_at.<locals>.broadcast.<locals>.<setcomp>r      r   zCannot broadcast coordinates)rS   asarrayr!   allr2   aminr3   amax)dimsr   r   r   	broadcast   s
   &
z,op.get_at.<locals>.get_at.<locals>.broadcastc                 S   s   g | ]
}t |ts|jqS r   )r\   rd   r   ra   r   r   r   rc      s    c                 S   rg   r   )r2   )r   sr   r   r   ri      rj   z,op.get_at.<locals>.get_at.<locals>.<setcomp>r   z:Expected all coordinates to have same number of dimensionsc                    s    g | ]} d d |f qS r   r   r   )rq   shapesr   r   rc           c                       g | ]} j | qS r   r   r   r   r   r   rc          c                    ru   r   r   r   r   r   r   rc      rv   zInvalid coordinate type: )r	   r
   )r\   r$   r2   r   r3   anyrd   r"   r#   appendrS   rl   r]   re   indicesr   	TypeErrortyper   )r   coordinatescoordinates2front_slicesback_slicesr   is_frontr   output_shapeinput_shaperr   startstopstepr   )rq   rf   rs   r   r   get_at   sb   


zop.get_at.<locals>.get_atr   )r   r   r   r   r   r      s   Iz	op.get_atNFc                    s2   d u rt tjjjj dS t fdd}|S )Ninplacec                    s2   t | j}t| ||g| r| |fgdS g dS )N)r	   r
   inplace_updates)r   r   r   )r   r|   updater
   r   r   r   r   	update_at   s   
zop.update_at.<locals>.update_at)r   einxtracerr   r   r   r   )r   r   r   r   r   r   r      s
   	zop.update_atc                    r   )Nc                    s*   t  | g||ddtdd |D ddS )N)in_axesout_axesvmapc                 S   s   g | ]}t |qS r   )r   )r   r   r   r   r   rc      rj   z;op.vmap.<locals>.vmap_with_output_types.<locals>.<listcomp>)r
   )r	   r0   r   r
   )r   Function)r   r   r   input_shapesoutput_shapesr   r   r   vmap_with_output_types   s   z'op.vmap.<locals>.vmap_with_output_typesr   )r   r   r   r   r   r      s   	zop.vmap)NF)__name__
__module____qualname__Tracerr   r    r&   r?   rF   rJ   rN   rP   rW   rX   r`   r   r   r   r   r   r   r   r      s    
	Mr   c                   @   s  e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?S )@r   c                 C   sv   t |  t|tjr#|jdkrtd| tdd |D | _d S ztdd |D | _W d S    td| )Nr   zInvalid shape: c                 s       | ]}t |V  qd S r   rh   r   r   r   r   r     r.   z"Tensor.__init__.<locals>.<genexpr>c                 s   r   r   rh   r   r   r   r   r     r.   )	r   __init__r\   rS   ndarrayr#   r3   r$   r   selfr   r   r   r   r     s   

zTensor.__init__c                 C   s
   t | jS r   )r2   r   r   r   r   r   r#     s   
zTensor.ndimc                 C   s   t | tksJ t| jS r   )r{   r   r   r   r   r   r   __copy__  s   
zTensor.__copy__c                 C   s   t t | |S r   )r   r   GetAt)r   keyr   r   r   __getitem__     zTensor.__getitem__c                 C   sb   |j d ur$t|j jtr$|j jdkr$|j jd | u r$|j jd |u r$|S tjtddd| ||S )N=r   r   Tr   )originr\   r   AssignAtr	   r   )r   r   r<   r   r   r   __setitem__  s   
zTensor.__setitem__c                 C   @   t | jjtstdtjtddd| jjd | jjd |S )N2Inplace operator only supported for get_at outputsz+=Tr   r   r   r\   r   r   r   r3   r   r   r	   r   r<   r   r   r   __iadd__+  
   zTensor.__iadd__c                 C   r   )Nr   z-=Tr   r   r   r   r   r   r   r   __isub__2  r   zTensor.__isub__c                 C   r   )Nr   z*=Tr   r   r   r   r   r   r   r   __imul__9  r   zTensor.__imul__c                 C   r   )Nr   z/=Tr   r   r   r   r   r   r   r   __itruediv__@  r   zTensor.__itruediv__c                 C   r   )Nr   z//=Tr   r   r   r   r   r   r   r   __ifloordiv__G  r   zTensor.__ifloordiv__c                 C      t td| |S N+r   rW   Operatorr   otherr   r   r   __add__N     zTensor.__add__c                 C      t td|| S r   r   r   r   r   r   __radd__Q  r   zTensor.__radd__c                 C   s   t td| S N-r   r   r   r   r   __neg__T  r   zTensor.__neg__c                 C   r   r   r   r   r   r   r   __sub__W  r   zTensor.__sub__c                 C   r   r   r   r   r   r   r   __rsub__Z  r   zTensor.__rsub__c                 C   r   Nr   r   r   r   r   r   __mul__]  r   zTensor.__mul__c                 C   r   r   r   r   r   r   r   __rmul__`  r   zTensor.__rmul__c                 C   r   N/r   r   r   r   r   __truediv__c  r   zTensor.__truediv__c                 C   r   r   r   r   r   r   r   __rtruediv__f  r   zTensor.__rtruediv__c                 C   r   Nz//r   r   r   r   r   __floordiv__i  r   zTensor.__floordiv__c                 C   r   r   r   r   r   r   r   __rfloordiv__l  r   zTensor.__rfloordiv__c                 C   r   r   r   r   r   r   r   __div__o  r   zTensor.__div__c                 C   r   r   r   r   r   r   r   __rdiv__r  r   zTensor.__rdiv__c                 C   r   N%r   r   r   r   r   __mod__u  r   zTensor.__mod__c                 C   r   r   r   r   r   r   r   __rmod__x  r   zTensor.__rmod__c                 C   r   )N<r   r   r   r   r   __lt__{  r   zTensor.__lt__c                 C   r   )Nz<=r   r   r   r   r   __le__~  r   zTensor.__le__c                 C   r   )N>r   r   r   r   r   __gt__  r   zTensor.__gt__c                 C   r   )Nz>=r   r   r   r   r   __ge__  r   zTensor.__ge__c                 C   r   )Nz==r   r   r   r   r   __eq__  r   zTensor.__eq__c                 C   r   )Nz!=r   r   r   r   r   __ne__  r   zTensor.__ne__N)#r   r   r   r   propertyr#   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     sB    
r   c                   @      e Zd Zdd ZdS )Scalarc                 C   s   t | d d S )Nr   r   r   r   r   r   r   r        zScalar.__init__Nr   r   r   r   r   r   r   r   r         r   c                   @   r   )TensorRequiringConversionc                 C   s   t | | d S r   r   r   r   r   r   r     r   z"TensorRequiringConversion.__init__Nr   r   r   r   r   r     r   r   c                   @   s   e Zd Zdd Zdd ZdS )TensorFactoryc                 C   s
   || _ d S r   params)r   r   r   r   r   r     s   
zTensorFactory.__init__c                    sB   t dd  jD rn fdd| D }t |g|t|dS )Nc                 s   s    | ]}| d V  qdS )z**N)
startswith)r   paramr   r   r   r     r   z)TensorFactory.__call__.<locals>.<genexpr>c                    s    i | ]\}}| j v r||qS r   r   )r   kvr   r   r   
<dictcomp>  rt   z*TensorFactory.__call__.<locals>.<dictcomp>r/   )rw   r   itemsr   r   )r   r   r0   r   r   r   __call__  s   zTensorFactory.__call__N)r   r   r   r   r   r   r   r   r   r     s    r   c              	   C      t | ttttjtjtjtfS r   )	r\   r]   floatboolrS   re   floatingbool_r   xr   r   r   	is_scalar     r   c              	   C   r   r   )	r\   r]   r   r   rS   re   r   r   r   r   r   r   r   	is_tensor  r   r   c                 C   sZ   t | ttfr#dd | D }t|dkrtd| }t| f| S t| r)dS td)Nc                 S   rg   r   )_get_list_shape)r   yr   r   r   ri     rj   z"_get_list_shape.<locals>.<setcomp>r   z)Failed to determine shape of input tensorr   )r\   r$   r!   r2   r3   popr   )r   	subshapessubshaper   r   r   r     s   r   c                 C   sF   t | ttfrt| S t| rdS ztdd | jD W S    Y d S )Nr   c                 s   r   r   rh   r   r   r   r   r     r.   zget_shape.<locals>.<genexpr>)r\   r$   r!   r   r   r   r   r   r   r   r     s   r   c                 K   s0   t | r| S t| tr| ||dS J t|  )N)r0   )r   r\   r   r{   )r   r   backendr0   r   r   r   call_factory  s
   
r   )numpyrS   r   	functoolsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s      | 