o
    Ei0                     @   sP   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lZdd Z	dS )   )*    N)op)partialc                     s   t jdddt jdddddlm m fdddfd
d	dd fdd} | G  fdddt}| S )NTensortinygrad)from_dtypesr   )r   r	   c                    s4   t | tjjttfrtjj | gtjg dS | S N)argsoutput)
isinstanceeinxtracerScalarfloatintapplyr   xtTensor S/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/backend/_tinygrad.pyscalar_to_tensor   s   
z create.<locals>.scalar_to_tensorFc                    s$   t jt fdd}|S )Nc                     sD    rfdd| D } ndd | D } | d | d< t |  S )Nc                    s   g | ]} |qS r   r   .0ar   r   r   
<listcomp>   s    z>create.<locals>.elementwise.<locals>.outer.<locals>.<listcomp>c                 S      g | ]}|qS r   r   r   r   r   r   r          r   )r   elementwise)r   )convert_all_to_tensorfuncr   r   r   outer   s
   z*create.<locals>.elementwise.<locals>.outerr   trace	functoolswraps)r$   r#   r%   r   )r#   r$   r   r"      s   zcreate.<locals>.elementwisec                    s"   t j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}d|v rG|d|d< tj | g|t	|d	S )
NkeepdimsFr   r   T)reverseaxiskeepdimr   kwargsr   )
getr   r   listshapesortedpopr   r   r   )tensorr,   r/   r*   r2   axesr   r$   r   r   reduce&   s   

z&create.<locals>.reduce.<locals>.reduceNr&   )r$   r8   r   r7   r   r8   %   s   zcreate.<locals>.reducec                    s   t | tr
t | S | S r9   )r   strgetattrr   )r	   r   r   to_dtype<   s   

zcreate.<locals>.to_dtypec                       s  e Zd ZdZ gZe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ejd#fdd	Zeejd$fd
d	ZejZjZejZjZejddZjZejZejZ j!Z!e"#dZ$e"#dZ%e"#dZ&e"#dZ'e"#dZ(e"#dZ)ej*Z*ej+Z+j,Z,j-Z-j.Z.j/Z/j,Z0j1Z1j2Z2e
3j4Z4e
3j5Z5e
3j6Z6e
3j7Z7e
3j8Z8eejdd Z9eejdd Z:eejdd Z;eejdd Z<e
=j>Z>e
=j?Z?e
=j@Z@eejdd ZAeejdd ZBG fd d!d!ZCd"S )%zcreate.<locals>.tinygradr   c                    s   t jj | gt j|dS r
   )r   r   r   r   )r5   r2   r   r   r   	to_tensorJ   s
   
z"create.<locals>.tinygrad.to_tensorc           	         s`  | d}t|dkrtd|\}}| d}t|t|kr$tddd |D }dd |D }g }ttt|d d d D ]0}t|| d	kt|| jd	kkrXtdt|| d	krq|||  || || qAt|d
krd|d | }t	
 j
|g|R  }nt|d
kr|d	 }n
|d	 }|d
d  }|D ]}| ||}q|S )Nz->   zInvalid equation,c                 S   s   g | ]
}|  d dqS )  )stripreplace)r   r   r   r   r   r   a   s    z3create.<locals>.tinygrad.einsum.<locals>.<listcomp>c                 S   r    r   r   )r   tr   r   r   r   b   r!   r   r   )splitlen
ValueErrorr1   ranger2   appendr4   joinr   einsummultiply)	backendequationtensorsr   inputsr   scalarsiscalarr   r   r   rL   W   s8   

"


zcreate.<locals>.tinygrad.einsumint32c                    s(   t |tr
t|}t j| |dS )N)dtype)r   r:   r;   r   arange)nrV   )r   tdtypesr   r   rW   z   s   

zcreate.<locals>.tinygrad.aranger   c                    sJ   t | d j}t fdd| D | < tjjg | d it|dS )Nr   c                 3   s    | ]}|j   V  qd S r9   )r2   )r   r5   r,   r   r   	<genexpr>   s    z7create.<locals>.tinygrad.concatenate.<locals>.<genexpr>dimr.   )r1   r2   sumr   r   catr   )rP   r,   r2   r   rZ   r   concatenate   s
   z$create.<locals>.tinygrad.concatenateF)upcast<z<=>z>=z==z!=c                 S      t  r9   NotImplementedError)r5   coordinatesr   r   r   get_at      zcreate.<locals>.tinygrad.get_atc                 S   rc   r9   rd   r5   rf   updatesr   r   r   set_at   rh   zcreate.<locals>.tinygrad.set_atc                 S   rc   r9   rd   ri   r   r   r   add_at   rh   zcreate.<locals>.tinygrad.add_atc                 S   rc   r9   rd   ri   r   r   r   subtract_at   rh   z$create.<locals>.tinygrad.subtract_atc                 S   s   | S r9   r   )r5   r   r   r   stop_gradient   s   z&create.<locals>.tinygrad.stop_gradientc                 S   s   t d)NzDFunctions relying on vmap are not supported for the tinygrad backendrd   )r   in_axesout_axesinput_shapesoutput_shapesr   r   r   vmap   s   zcreate.<locals>.tinygrad.vmapc                       s   e Zd Zej fddZdS )zcreate.<locals>.tinygrad.randomc                    s$   t jj jg |t j|d|kS r
   )r   r   r   randr   )rngpr2   r   r   r   	bernoulli   s   
z)create.<locals>.tinygrad.random.bernoulliN)__name__
__module____qualname__r   r'   rw   r   r   r   r   random   s    r{   N)rU   )r   )Drx   ry   rz   nametensor_typesstaticmethodr<   r   r'   r=   r   reshape	transposepermutebroadcast_toexpandclassmethodrL   rW   r_   associative_binary_to_naryaddsubsubtractmulrM   divtrue_divider   floor_dividedividelogical_and
logical_orwherer   Operatorless
less_equalgreatergreater_equalequal	not_equalmaximumminimumr]   meanvarstdcount_nonzerominmaxr"   logexpsqrtrsqrtsquarerg   rk   rl   rm   
keep_shapeflipsoftmaxlog_softmaxrn   rs   r{   r   )r   r"   r8   r   rY   	to_dtype2r   r   r   D   s    !










)F)r   import_r   r   r	   Backend)r<   r   r   )r   r	   r"   r8   r   r   rY   r   r   create	   s   
 r   )
baseeinx.tracerr   einx.tracer.tensorr   r   typesr(   r   r   r   r   r   r   <module>   s    