o
    gi                     @   s   d dl mZ d dl mZ 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ZddlmZ dd	lmZ dd
lmZ dd Z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 dd Zedde dS )   )registry)Backend    N   )_make_iskwarg)api)partial) _make_doc_adapt_numpylike_reduce)%_make_doc_adapt_numpylike_elementwisec                     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 dd l fdd}fdd}| t jj||d	S )
Nnumpynp)as_r   c                    s   z  |  W dS    Y dS )NTF)array_namespace)tensor)array_api_compat ^/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/einx/_src/frontend/impl/arrayapi.pyis_supported_tensor   s
   
z0_get_backend_kwargs.<locals>.is_supported_tensorc                    sX   t | ttB tB  jB  jB  jB rdS t| dr#tdd | j	D S t
dt|  )Nr   shapec                 s   s    | ]}t |V  qd S )N)int).0xr   r   r   	<genexpr>&   s    z9_get_backend_kwargs.<locals>.get_shape.<locals>.<genexpr>z#Cannot get shape of object of type )
isinstancer   floatboolintegerfloatingbool_hasattrtupler   	TypeErrortype)r   )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SkipCastr   r   r%   )r$   r   r#   r   )r   r   r   _get_backend_kwargs   s   	r6   c                 C   s   t | fdd}t }tj|j}tj|}tjj	
| } tjj| ttj|d} tj| |} tjj| |ttj|d} tjj| |d} t| tjdi t dS )Nc                 S   s   | dko|| S )Naxisr   )nameiskwargr   r   r   <lambda>.   s    z(adapt_numpylike_reduce.<locals>.<lambda>expected_typecontextr<   r9   backendr   )r   adapterArrayApiNamespaceStackr&   r'   arrayapiget_xpclassical_from_arrayapiopsr(   constant$decomposednamedtensor_from_classicalreducer   tensortype_from_arrayapi&namedtensor_from_decomposednamedtensoropnamedtensor_calltensorfactoryeinx_from_namedtensorr   typesSimpleNamespacer6   rM   r9   xp_stackxpr+   r   r   r   adapt_numpylike_reduce-   s   rU   c                 C   s   t | }t }tj|j}tj|}tjj	
| } tjj| |ttj|d} tj| |} tjj| |ttj|d} tjj| |d} t| tjdi t dS )Nr;   r=   r?   r@   r   )r   rB   rC   r&   r'   rD   rE   rF   rG   r(   rH   rI   elementwiser   rK   rL   rM   rN   rO   r   rP   rQ   r6   rR   r   r   r   adapt_numpylike_elementwise@   s   rW   c                    s    fdd}|S )Nc                     s|   t  } tj| j}t j|} ||\}}t j||}t j	j|| t
t j|d}t j|}td||ddt S )Nr=   irG   r8   priorityr   )rB   rC   r&   r'   rD   rE   rF   rG   rL   rN   r   rK   rO   r   r6   )rS   rT   r+   decomposednamedtensor_opsr8   namedtensor_opseinx_opscreater   r   
new_createT   s   z$_backend_creator.<locals>.new_creater   )r^   r_   r   r]   r   _backend_creatorS   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   )rB   rI   rV   getattrr   r8   r+   r   r   
<dictcomp>m      " z,create_backend_numpylike.<locals>.<dictcomp>c                        i | ]}|t jt |qS r   )rB   rI   rJ   rb   rc   rd   r   r   re   n        c                    rg   r   )rB   rI   preserve_shaperb   rc   rd   r   r   re   o   rh   c                    ra   r   )rB   rI   argfindrb   rc   rd   r   r   re   p   rf   c                    ra   r   )rB   rI   update_at_ravelledrb   rc   rd   r   r   re   q   rf   )get_atdotarrayapi.numpylike)rB   einsum_from_arrayapirG   rV   rJ   ri   rj   	update_atrI   get_at_ravelled!decomposednamedtensor_from_einsumrm   rT   r+   einsumrZ   r   rd   r   create_backend_numpylikeh   s   
	ru   r   rn   c                 C   s@   t | }t j|t j|t j|t j|d}|dfS )N)idsummultiplyrm   arrayapi.einsum)rB   ro   rr   rv   rw   rx   rm   rs   r   r   r   create_backend_einsum{   s   




rz   ry   c                  C   s8   t  j} t j}| d|d iB }td|dddt S )Nrm   rD   rX   r   )ru   rG   rz   r   r6   )einx_ops_numpylikeeinx_ops_einsumr\   r   r   r   create_backend   s   r~   rD   )rA   r   r   einx._src.adapter_srcrB   einx._src.tracerr&   _utilr   r   rP   	functoolsr   _docsr	   r
   r6   rU   __doc__rW   r`   ru   register_on_importrz   r~   r   r   r   r   <module>   s0     

