o
    i                     @   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mZ ddl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)_unsupported_op)api) _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  fdd}dd }| t jj||d	S )
Nnumpynp)as_r   c                    s   t |  jS N)
isinstancendarraytensorr    Q/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/frontend/impl/numpy.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SkipCastr   r   )r   r   r   r   r   r   _get_backend_kwargs   s   	r0   c                 C   s   t | fdd}tj }tj|}tjj| } tj	j
| |jd} tj| |} t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   )nameiskwargr   r   r   <lambda>$   s    z(adapt_numpylike_reduce.<locals>.<lambda>expected_typer3   backendr   )r   r    r!   r   adapterclassical_from_numpyopsr"   constant$decomposednamedtensor_from_classicalreducer   &namedtensor_from_decomposednamedtensoropnamedtensor_calltensorfactoryeinx_from_namedtensorr   typesSimpleNamespacer0   rA   r3   r   r%   r   r   r   adapt_numpylike_reduce#   s   
rG   c                 C   s   t | }tj }tj|}tjj| } tj	j
| ||jd} tj| |} tjj| |jd} tjj
| |d} t| tjdi t dS )Nr5   r7   r8   r   )r   r    r!   r   r:   r;   r<   r"   r=   r>   elementwiser   r@   rA   rB   rC   r   rD   rE   r0   rF   r   r   r   adapt_numpylike_elementwise5   s   
rI   c                    s    fdd}|S )Nc                     sh   t j } tj| } | |\}}tj||}tjj|| jd}tj	|}t
d||ddt S )Nr5   r<   r2   priorityr   )r    r!   r   r:   r;   r<   r@   rB   r   rC   r   r0   )r   r%   decomposednamedtensor_opsr2   namedtensor_opseinx_opscreater   r   
new_createH   s   
z$_backend_creator.<locals>.new_creater   )rQ   rR   r   rP   r   _backend_creatorG   s   rS   c                    s    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:   r>   rH   getattrr   r2   r%   r   r   
<dictcomp>Z      " z,create_backend_numpylike.<locals>.<dictcomp>c                        i | ]}|t jt |qS r   )r:   r>   r?   rU   rV   rW   r   r   rX   [        c                    rZ   r   )r:   r>   preserve_shaperU   rV   rW   r   r   rX   \   r[   c                    rT   r   )r:   r>   argfindrU   rV   rW   r   r   rX   ]   rY   c                    rT   r   )r:   r>   update_at_ravelledrU   rV   rW   r   r   rX   ^   rY   )get_atdotnumpy.numpylike)
r:   r<   rH   r?   r\   r]   	update_atr>   get_at_ravelledr`   )r   r%   rM   r   rW   r   create_backend_numpylikeW   s   

rd   r   ra   c                 C   s@   t | }t j|t j|t j|t j|d}|dfS )N)idsummultiplyr`   numpy.einsum)r:   einsum_from_numpy!decomposednamedtensor_from_einsumre   rf   rg   r`   )r   r%   einsumrM   r   r   r   create_backend_einsumk   s   




rl   rh   c                  C   s8   t  j} t j}| d|d iB }td|dddt S )Nr`   r   rK   r   )rd   r<   rl   r   r0   )einx_ops_numpylikeeinx_ops_einsumrO   r   r   r   create_backend|   s   rp   )r9   r   r   einx._src.adapter_srcr:   einx._src.tracerr    _utilr   r   r   rD   _docsr	   r
   r0   rG   __doc__rI   rS   rd   register_on_importrl   rp   r   r   r   r   <module>   s0    

