o
    gi                     @   s>  d dl m  mZ d dlm  mZ ddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ d dlZdd	lmZ dd
lmZ ddlmZ dd Zd#ddZedde_dd Ze e_dd Ze e_dd Zedd Zedde edd Zedde edd Zedd e d!d" Zedde dS )$    N   )Tensor)registry)Backend   )_make_iskwarg_unsupported_op)api) _make_doc_adapt_numpylike_reduce)%_make_doc_adapt_numpylike_elementwise)_make_doc_adapt_with_vmapc                     s   t jjjddd t jj jt jj j	t jj
 jt jj jt j t j g} dd lm   fdd}dd }| t jj||d	S )
Nzmlx.coremx)as_r   c                    s   t |  jS N)
isinstancearraytensorr    Y/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/einx/_src/frontend/impl/mlx.pyis_supported_tensor   s   z0_get_backend_kwargs.<locals>.is_supported_tensorc                 S   s   t dd | jD S )Nc                 s   s    | ]}t |V  qd S r   )int).0xr   r   r   	<genexpr>   s    z9_get_backend_kwargs.<locals>.get_shape.<locals>.<genexpr>)tupleshaper   r   r   r   	get_shape   s   z&_get_backend_kwargs.<locals>.get_shape)optimizationscompilerr   r   )tracer	signaturepythonimport_	optimizer	classicalSkipReshapereshapeSkipTranspose	transposeSkipBroadcastTobroadcast_toSkipConcatenateconcatenateInlineGraphSkipCastmlx.corecorer    )r   r   r   r   r   r   _get_backend_kwargs   s   	r3   c                 C   s   t | }tj }tj|}t|}tjj	| } tj
j| ||jjd} tj| |} tjj| |jjd} tjj| ||dd} t| tjdi t dS )Nexpected_type	bijective)iskwargel_opimplicit_outputbackendr   )r   r!   r"   mlxadapterclassical_from_mlxopsvmap_from_mlxr#   constantdecomposednamedtensor_from_vmapopr2   r   &namedtensor_from_decomposednamedtensornamedtensor_calltensorfactoryeinx_from_namedtensorr	   typesSimpleNamespacer3   )rC   r"   r7   r<   r&   vmapr   r   r   adapt_with_vmap$   s   

rJ   r<   z``mlx.core.vmap``c                 C   s   t | fdd}tj }tj|}tjj| } tj	j
| |jjd} tj| |} tjj| |jjd} tjj
| |d} t| tjdi t dS )Nc                 S   s   | dko|| S )Naxisr   )namer7   r   r   r   <lambda>8   s    z(adapt_numpylike_reduce.<locals>.<lambda>r4   r7   r:   r   )r   r!   r"   r<   r=   r>   r?   r#   rA   $decomposednamedtensor_from_classicalreducer2   r   rD   rC   rE   rF   r	   rG   rH   r3   rC   r7   r<   r&   r   r   r   adapt_numpylike_reduce7   s   
rR   c                 C   s   t | }tj }tj|}tjj| } tj	j
| ||jjd} tj| |} tjj| |jjd} tjj
| |d} t| tjdi t dS )Nr4   rN   r:   r   )r   r!   r"   r<   r=   r>   r?   r#   rA   rO   elementwiser2   r   rD   rC   rE   rF   r	   rG   rH   r3   rQ   r   r   r   adapt_numpylike_elementwiseI   s   
rT   c                    s    fdd}|S )Nc                     sj   t j } tj| } | |\}}tj||}tjj|| jj	d}tj
|}td||ddt S )Nr4   r?   rL   priorityr   )r!   r"   r<   r=   r>   r?   rD   rE   r2   r   rF   r   r3   )r<   r&   decomposednamedtensor_opsrL   namedtensor_opseinx_opscreater   r   
new_create\   s   
z$_backend_creator.<locals>.new_creater   )r\   r]   r   r[   r   _backend_creator[   s   r^   c                    s   t | } fddt jjD  fddt jjD B  fddt jjD B  fddt jjD B  fddt jjD B t j	 t j
|dB }|dfS )	Nc                    "   i | ]}|t jt | qS r   )r=   rO   rS   getattrr   rL   r&   r   r   
<dictcomp>q      " z,create_backend_numpylike.<locals>.<dictcomp>c                        i | ]}|t jt |qS r   )r=   rO   rP   r`   ra   rb   r   r   rc   r        c                    re   r   )r=   rO   preserve_shaper`   ra   rb   r   r   rc   s   rf   c                    r_   r   )r=   rO   argfindr`   ra   rb   r   r   rc   t   rd   c                    r_   r   )r=   rO   update_at_ravelledr`   ra   rb   r   r   rc   u   rd   )get_atdotmlx.numpylike)r=   einsum_from_mlxr?   rS   rP   rg   rh   	update_atrO   get_at_ravelled!decomposednamedtensor_from_einsumrk   r<   r&   einsumrX   r   rb   r   create_backend_numpylikel   s   
	rs   rl   c                 C   s@   t | }t j|t j|t j|t j|d}|dfS )N)idsummultiplyrk   
mlx.einsum)r=   rm   rp   rt   ru   rv   rk   rq   r   r   r   create_backend_einsum   s   




rx   rw   c                    sL   t t j  fddt jjD dd t jjD B }|dfS )Nc              
      s,   i | ]}|t jj| jjd  dqS )T)r5   allow_squeeze_unsqueezer&   )r=   rB   rC   r2   r   ra   r&   elementary_opsr<   rI   r   r   rc      s    z'create_backend_vmap.<locals>.<dictcomp>c                 S   s   i | ]}|t |d qS )mlx.vmap)r   ra   r   r   r   rc      s    r|   )r=   r@   elementary_from_classicalr?   allrn   )r<   r&   rX   r   rz   r   create_backend_vmap   s   
r   r|   c                  C   s8   t  j} t j}| d|d iB }td|dddt S )Nrk   r<   r   rV   r   )rs   r?   rx   r   r3   )einx_ops_numpylikeeinx_ops_einsumrZ   r   r   r   create_backend   s   r   r   )einx._src.tracer_srcr!   einx._src.adapterr=   rG   r   r;   r   r   _utilr   r   r	   _docsr
   r   r   r3   rJ   __doc__rR   rT   r^   rs   register_on_importrx   r   r   r   r   r   r   <module>   s<    



