o
    i                     @   sZ  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Zd dl	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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   )api)Tensor)partial)registry)Backend   )_make_iskwarg_unsupported_op) _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}dd lm}  z	|j|jjf W n   | j Y  fdd}dd }|t jj||d	S )
Nz	jax.numpyjnp)as_r   c                    s
   t |  S N)
isinstancetensortensor_types O/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/frontend/impl/jax.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jax	jax.numpynumpyArraycoreTracerndarrayr!   )r   r    r2   r   r   r   r   r   _get_backend_kwargs   s"   	r9   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#   r2   adapterclassical_from_jaxopsvmap_from_jaxr$   constantdecomposednamedtensor_from_vmapopr4   r8   &namedtensor_from_decomposednamedtensornamedtensor_calltensorfactoryeinx_from_namedtensorr   typesSimpleNamespacer9   )rH   r#   r=   r2   r'   vmapr   r   r   adapt_with_vmap-   s   

rO   r2   z``jax.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   )namer=   r   r   r   <lambda>A   s    z(adapt_numpylike_reduce.<locals>.<lambda>r:   r=   r@   r   )r	   r"   r#   r2   rB   rC   rD   r$   rF   $decomposednamedtensor_from_classicalreducer4   r8   rI   rH   rJ   rK   r   rL   rM   r9   rH   r=   r2   r'   r   r   r   adapt_numpylike_reduce@   s   
rW   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 )Nr:   rS   r@   r   )r	   r"   r#   r2   rB   rC   rD   r$   rF   rT   elementwiser4   r8   rI   rH   rJ   rK   r   rL   rM   r9   rV   r   r   r   adapt_numpylike_elementwiseR   s   
rY   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 )Nr:   rD   rQ   priorityr   )r"   r#   r2   rB   rC   rD   rI   rJ   r4   r8   rK   r   r9   )r2   r'   decomposednamedtensor_opsrQ   namedtensor_opseinx_opscreater   r   
new_createe   s   
z$_backend_creator.<locals>.new_creater   )ra   rb   r   r`   r   _backend_creatord   s   rc   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   )rB   rT   rX   getattrr   rQ   r'   r   r   
<dictcomp>w      " z,create_backend_numpylike.<locals>.<dictcomp>c                        i | ]}|t jt |qS r   )rB   rT   rU   re   rf   rg   r   r   rh   x        c                    rj   r   )rB   rT   preserve_shapere   rf   rg   r   r   rh   y   rk   c                    rd   r   )rB   rT   argfindre   rf   rg   r   r   rh   z   ri   c                    rd   r   )rB   rT   update_at_ravelledre   rf   rg   r   r   rh   {   ri   )get_atdotjax.numpylike)
rB   rD   rX   rU   rl   rm   	update_atrT   get_at_ravelledrp   r2   r'   r]   r   rg   r   create_backend_numpyliket   s   

ru   rq   c                 C   s@   t | }t j|t j|t j|t j|d}|dfS )N)idsummultiplyrp   
jax.einsum)rB   einsum_from_jax!decomposednamedtensor_from_einsumrv   rw   rx   rp   )r2   r'   einsumr]   r   r   r   create_backend_einsum   s   




r}   ry   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)r;   allow_squeeze_unsqueezer'   )rB   rG   rH   r4   r8   rf   r'   elementary_opsr2   rN   r   r   rh      s    z'create_backend_vmap.<locals>.<dictcomp>c                 S   s   i | ]}|t |d qS )jax.vmap)r
   rf   r   r   r   rh      s    r   )rB   rE   elementary_from_classicalrD   allrr   rt   r   r   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 )Nrp   r2   r   r[   r   )ru   rD   r}   r   r9   )einx_ops_numpylikeeinx_ops_einsumr_   r   r   r   create_backend   s   r   r   ) einx._src.tracer_srcr"   einx._src.adapterrB   r   rL   r   inspect	functoolsr   rA   r   r   _utilr	   r
   _docsr   r   r   r9   rO   __doc__rW   rY   rc   ru   register_on_importr}   r   r   r   r   r   r   <module>   sB    



