o
    gi!                     @   sH  d dl 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m	Z	m
Z
 d dl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 e	d
edef d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 e
ded efd!d"Z!e
d(ddd#ed$ed eegef fd%d"Z!d(d&d"Z!dS ))    N)Callable)partial)AnyTypeVaroverload)CallOperationError)	lru_cache   )registry)Tensor_F.)boundc                   @   s   e Zd Zdd ZdS )	TensorArgc                 C   s
   || _ d S Nvalue)selfr    r   T/home/ubuntu/SoloSpeech/.venv/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>;       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kwargsr    bound_arguments_without_defaultsbound_arguments_with_defaultsenew_args
new_kwargsnameparamval	is_tensorr   )r   r   r   _split_tensors   sT   




*rC   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_scalarZ   s   $rM   c                 C   s:   zt | }W n ty   t dd }Y nw i |jS )Nc                 S      d S r   r   shaper   r   r   <lambda>b   s    z _get_signature.<locals>.<lambda>)r)   r7   
ValueErrorr%   )funcr7   r   r   r   _get_signature^   s   
rT   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 )
NrO   c                 s   s    | ]}t |V  qd S r   )rD   r   rL   r   r   r   r   l   r   z_to_tracer.<locals>.<genexpr>)type)rP   concreter   )rV   r%   zThe z+ to the einx function has an invalid type: )r.   r   is_supported_tensorr   tracerr7   	classicalr   	get_shaperG   ndarrayConvertibleTensorr,   rP   typesSimpleNamespacerV   rM   callablerT   rR   )rL   backendr?   r   r   r   
_to_tracerf   s   
&
"
rb   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 )	Nra   c                 S   s   g | ]
}t |tjr|qS r   )r.   rY   TracerrU   r   r   r   
<listcomp>   s    z$_construct_graph.<locals>.<listcomp>op)inputsoutputr?   )optimizationsT)return_code)	r/   valuesrY   	depend_onGraphoptimizerh   compilercompile)	r8   r9   rS   ra   input_tracersoutput_tracergraphfunctioncoder   r   r   _construct_graphz   s   ru   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   rK   r   r   r   
to_ord_str   s   r{   c                    sF   d u r	t | ttt| d t| d dd fdd
}|S )NrS   F)ra   rr   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 )Nra   c                    (   g | ]\}}t | t| d dqS z positional argumentr?   rb   r{   r   irL   ra   r   r   rd         ( z6_api_withoutbackend.<locals>.inner.<locals>.<listcomp>c              	      (   i | ]\}}|t | d | ddqS zkeyword argument ''r   rb   r   kr   r   r   r   
<dictcomp>   r   z6_api_withoutbackend.<locals>.inner.<locals>.<dictcomp>r8   r9   )	rC   r
   getraise_on_import_failure	enumerater&   	Exceptionr   create)ra   rr   r8   r9   r   rs   rt   r<   construct_graph_with_cacher7   r   r   inner   s   
z"_api_withoutbackend.<locals>.innerr)   r7   r   r   ru   	functoolswraps)rS   r7   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)rS   ra   F)rr   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                    r}   r~   r   r   r   r   r   rd      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   )rC   r   r&   r   r   r   )rr   r8   r9   r   rs   rt   r<   ra   r   r7   r   r   r      s   
z_api_withbackend.<locals>.innerr   )rS   ra   r7   r   r   r   r   _api_withbackend   s   
r   rS   returnc                 C   rN   r   r   r|   r   r   r   api      r   ra   r7   c                 C   rN   r   r   rS   ra   r7   r   r   r   r      r   c                 C   s8   | d u rt t||dS |d u rt| |dS t| ||dS )N)ra   r7   )r7   )r   r   r   r   r   r   r   r   r      s
   r   )NNN)"r   r)   	tracebackr^   collections.abcr   r   typingr   r   r   numpyrG   einx._src.tracer_srcrY   einx._src.frontend.errorsr   einx._src.util.lru_cacher   ra   r
   r   r   r   rC   rM   rT   rb   ru   r{   r   r   r   r   r   r   r   <module>   s8    @
"(