o
    i                      @   s   d dl Z d dlZddl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Zd dlZd dlmZ G dd	 d	Zd
d Zdd Zdd Zdd ZdddZdd Zdd Zdd ZdddZdS )    N   )Tensor)	lru_cache)registry)partial)CallOperationErrorc                   @   s   e Zd Zdd ZdS )	TensorArgc                 C   s
   || _ d S Nvalue)selfr    r   J/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/frontend/api.py__init__   s   
zTensorArg.__init__N)__name__
__module____qualname__r   r   r   r   r   r      s    r   c              
      s  g fdd z| j |i |}|j }|  |j }W n ty7 } ztd| d|  |d }~ww g }i }| j D ]\}	}
|	|v r||	 }|
jtu sW|
jdkrZd}nd}|ru|
j	t
jjkrqt fdd	|D }n |}|
j	t
jjkr|| qA|
j	t
jjkrt|ttB sJ || qA|
j	t
jjkr|||	< qA|
j	t
jjkrt|tsJ || qA|
j	t
jjkr|	|v r|||	< qA|	|vr|||	< qA|| qAtd
|
j	 qA||fS )Nc                    s     |  t| S r	   )appendr   r
   )tensor_argsr   r   replace_with_tensorarg   s   
z._split_tensors.<locals>.replace_with_tensorargz1The einx operation received incorrect arguments. z
The function's signature is: r   TFc                 3   s    | ]} |V  qd S r	   r   ).0v)r   r   r   	<genexpr>4       z!_split_tensors.<locals>.<genexpr>zUnknown parameter kind: )bind	argumentscopyapply_defaults	TypeError
parametersitems
annotationr   kindinspect	ParameterVAR_POSITIONALtuplePOSITIONAL_ONLYr   
isinstancelistextendKEYWORD_ONLYVAR_KEYWORDdictupdatePOSITIONAL_OR_KEYWORDAssertionError)	signatureargskwargsbound bound_arguments_without_defaultsbound_arguments_with_defaultsenew_args
new_kwargsnameparamval	is_tensorr   )r   r   r   _split_tensors   sT   




*r>   c                 C   s$   t | ttB tB tjB tjB tjB S r	   )r(   intfloatboolnpintegerfloatingbool_xr   r   r   
_is_scalarS   s   $rH   c                 C   s:   zt | }W n ty   t dd }Y nw i |jS )Nc                 S   s   d S r	   r   shaper   r   r   <lambda>[   s    z _get_signature.<locals>.<lambda>)r#   r1   
ValueErrorr   )funcr1   r   r   r   _get_signatureW   s   
rN   c                 C   s   t | trv|| jrtjjjd || jdS t | jt	j
r9tjjjd tdd | jjD tjt| jddS t| jrOtjjjd dtjt| jddS t| jritjjjd d tjt| jt| jddS td| d	t| j | S )
NrI   c                 s   s    | ]}t |V  qd S r	   )r?   r   rG   r   r   r   r   e   r   z_to_tracer.<locals>.<genexpr>)type)rJ   concreter   )rP   r   zThe z+ to the einx function has an invalid type: )r(   r   is_supported_tensorr   tracerr1   	classicalr   	get_shaperB   ndarrayConvertibleTensorr&   rJ   typesSimpleNamespacerP   rH   callablerN   rL   )rG   backendr:   r   r   r   
_to_tracer_   s   
&
"
r\   c           	      C   s   |d u r|d }dd t | t |  D }tj|  || i |}W d    n1 s.w   Y  tj||dd}tj||jd}|jj|dd\}}||fS )	Nr[   c                 S   s   g | ]
}t |tjr|qS r   )r(   rS   TracerrO   r   r   r   
<listcomp>x   s    z$_construct_graph.<locals>.<listcomp>op)inputsoutputr:   )optimizationsT)return_code)	r)   valuesrS   	depend_onGraphoptimizerb   compilercompile)	r2   r3   rM   r[   input_tracersoutput_tracergraphfunctioncoder   r   r   _construct_graphs   s   ro   c                 C   s2   | dkrdS | dkrdS | dkrdS | d  dS )Nr   1str   2nd   3rdthr   rF   r   r   r   
to_ord_str   s   ru   c                    sF   d u r	t | ttt| d t| d dd fdd
}|S )N)rM   F)r[   rl   c              
      s   t ||\}}}|d= t |     fddt|D } fdd| D }||d iB d\}}|r<|S z|| W S  tyT } zt|||d }~ww )Nr[   c                    (   g | ]\}}t | t| d dqS z positional argumentr:   r\   ru   r   irG   r[   r   r   r^         ( z6_api_withoutbackend.<locals>.inner.<locals>.<listcomp>c              	      (   i | ]\}}|t | d | ddqS zkeyword argument ''rx   r\   r   kr   r|   r   r   
<dictcomp>   r}   z6_api_withoutbackend.<locals>.inner.<locals>.<dictcomp>r2   r3   )	r>   r   getraise_on_import_failure	enumerater    	Exceptionr   create)r[   rl   r2   r3   r   rm   rn   r7   construct_graph_with_cacher1   r|   r   inner   s   
z"_api_withoutbackend.<locals>.innerr#   r1   r   r   ro   	functoolswraps)rM   r1   r   r   r   r   _api_withoutbackend   s   
r   c                    sH   d u r	t | ttt|  dt| dd fdd
}|S )N)rM   r[   F)rl   c              
      s   t ||\}}} fddt|D } fdd| D }||d\}}| r+|S z|| W S  tyC } zt|||d }~ww )Nc                    rv   rw   ry   rz   r|   r   r   r^      r}   z3_api_withbackend.<locals>.inner.<locals>.<listcomp>c              	      r~   r   r   r   r|   r   r   r      r}   z3_api_withbackend.<locals>.inner.<locals>.<dictcomp>r   )r>   r   r    r   r   r   )rl   r2   r3   r   rm   rn   r7   r[   r   r1   r   r   r      s   
z_api_withbackend.<locals>.innerr   )rM   r[   r1   r   r   r   r   _api_withbackend   s   
r   c                 C   s8   | d u rt t||dS |d u rt| |dS t| ||dS )N)r[   r1   )r1   )r   apir   r   )rM   r[   r1   r   r   r   r      s
   r   r	   )NNN)r   r#   rX   r   einx._src.tracer_srcrS   einx._src.util.lru_cacher   r[   r   numpyrB   r   	tracebackeinx._src.frontend.errorsr   r   r>   rH   rN   r\   ro   ru   r   r   r   r   r   r   r   <module>   s*    @
"