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                     sR   dd l m  tdddd  fddG  fdd	d	t} |  S )
Nr   zmlx.coremxc                 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)
isinstancetuplelistnpndarraytolist
ValueErrortypex r   N/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/backend/_mlx.pyto_tuple   s   

zcreate.<locals>.to_tuplec                    s(   t | tr| dkr jS t |  S | S )Nbool)r   strbool_varsr   )r   r   r   to_dtype   s
   
zcreate.<locals>.to_dtypec                       s  e Zd ZdZ jgZeZeej	fddZ
eej	fddZejZejZeej	dd Zeej	d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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(j0Z0e(j1Z1e(j2Z2ej3Z3ej4Z4ej5Z5ej6Z6ej7Z7eej	dd Z8eej	dd Z9eej	dd Z:eej	dd Z;e<j=Z=e<j>Z>edddZ?j5Z5j6Z6j7Z7G fdddZ@dS )zcreate.<locals>.mlxmlxc                    s   t jj j| gt j|dS N)argsoutput)einxtracerapplyarrayTensortensorshapetmxr   r   	to_tensor(   s
   
zcreate.<locals>.mlx.to_tensorc                    s>   t j| r | } t jj j| t|gt j|dS r   )r   r   	is_scalarr    r   reshaper	   r!   r"   )r&   r   r   r   r)   1   s
   
zcreate.<locals>.mlx.reshapec                 W      t d)Nzmlx does not support einsum yetNotImplementedError)equationtensorsr   r   r   einsum=      zcreate.<locals>.mlx.einsumNint32c                    sD   | g}|d ur| | |d ur| | t j|d|iS )Ndtype)appendr   arange)startstopstepr2   r   )r&   r   r   r   r4   B   s   

zcreate.<locals>.mlx.arangec                 S   s   | | S )Nr   )r#   coordinatesr   r   r   get_ats   r0   zcreate.<locals>.mlx.get_atc                 S   &   t jj| j| j|gt j| jdS r   )r   r   r   atsetr!   r$   r#   r8   updatesr   r   r   set_atx      zcreate.<locals>.mlx.set_atc                 S   r:   r   r   r   r   r;   addr!   r$   r=   r   r   r   add_at   r@   zcreate.<locals>.mlx.add_atc                 S   s(   t jj| j| j| gt j| jdS r   rA   r=   r   r   r   subtract_at   s   zcreate.<locals>.mlx.subtract_atc                 S   r*   )Nz#mlx does not fully support vmap yetr+   )r   in_axesout_axesinput_shapesoutput_shapesr   r   r   vmap   s   zcreate.<locals>.mlx.vmapc                       s   e Zd Zej fddZdS )zcreate.<locals>.mlx.randomc                    s(   t jj jj||| gt j|d d S r   )r   r   r   random	bernoullir!   )rngpr$   r%   r   r   rK      s
   

z$create.<locals>.mlx.random.bernoulliN)__name__
__module____qualname__r   tracerK   r   r%   r   r   rJ      s    rJ   )NNr1   )NN)ArN   rO   rP   namer    tensor_typesstaticmethodr   r   rQ   r'   r)   r   	transposebroadcast_tor/   r4   stackconcatenateassociative_binary_to_naryelementwiserB   subtractmultiplydividetrue_dividefloor_divide	remaindermodlogical_and
logical_orwhereless
less_equalgreatergreater_equalequal	not_equalmaximumminimumreducesummeanvarprodcount_nonzeroanyallminmax	logsumexplogexpsqrtrsqrtsquarer9   r?   rC   rD   
keep_shapesoftmaxstop_gradientrI   rJ   r   r   r&   r   	to_dtype2r   r   r   r   "   s    r   )mlx.corecorer   import_Backend)r   r   r   r   create   s   
	 r   )
baseeinx.tracerr   einx.tracer.tensorr   r   types	functoolsr   r   r   r   r   r   <module>   s    