o
    i                     @   s   d dl m  mZ d dlZd dlZd dlZd dlZd dlm	Z	 ej
ejejejejdZG dd dZG dd dZdd	d
ZdS )    N)pytree)+*-z==z!=c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )CompilationCachec                 C   s   i | _ d| _d S )Nr   )tracerid_to_concrete	enter_numself r   Q/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/tracer/compiler/run.py__init__      
zCompilationCache.__init__c                 C   s4   | j dksJ | j dkr| j  |  j d7  _ d S )Nr      r   r   clearr	   r   r   r   	__enter__      

zCompilationCache.__enter__c                 G   s4   |  j d8  _ | j dkr| j  | j dksJ d S )Nr   r   r   )r
   argsr   r   r   __exit__   r   zCompilationCache.__exit__c           	         sJ  t |tjrt| S t |tjr|jd usJ |jjD ]} | qt |jtjj	j
r9t |jj|jjS t |jtjj	jrP |jj |jj S t |jtjj	jr |jj} fdd|jjD } fdd|jj D }||i |S t |jtjj	jr|jjd u r|jj}t|S |jj}t|}t||jjS t |jtjj	jrt|jj  fdd|jjD  S t |jtjr݈ |jj}t  j!|jj"|  | S t |jtjj	j#r |jj$}|sJ |jj% |jj&S t |jtjj	j'rtt(|jj)S t |jtjj	j*r|jj+S t,dt-|j )Nc                       g | ]}  |qS r   __getitem__.0argr	   r   r   
<listcomp>+       z-CompilationCache._get_new.<locals>.<listcomp>c                    s   i | ]
\}}|  |qS r   r   r   kvr	   r   r   
<dictcomp>,   s    z-CompilationCache._get_new.<locals>.<dictcomp>c                    r   r   r   r   r	   r   r   r   7   r   zUnsupported operation: ).
isinstancetracerGraphCompiledGraphTracerorigininputsr   	signaturepythonGetAttrgetattrobjkeyGetItemCallfunctionr   kwargsitemsImportfrom_import_	importlibimport_moduleOperatorApplicationname_to_operatoroperatoroperandsCastinputr   map__setitem__outputAssert	conditionmessagexsBuiltinbuiltinsnameConstantvalueNotImplementedErrortype)	r
   xr>   funcr   r2   moduleconcrete_outputrC   r   r	   r   _get_new   sH   


"zCompilationCache._get_newc                    s   t |ttB tB tjB tjB tB s|d u r|S t |tr% fdd|D S t |t	r5t	 fdd|D S t |t
rE fdd| D S t| jv rS jt| S  |}t| jvsaJ | jt|< |S )Nc                    r   r   r   r   itemr	   r   r   r   K   r   z0CompilationCache.__getitem__.<locals>.<listcomp>c                 3   s    | ]}  |V  qd S Nr   rR   r	   r   r   	<genexpr>M   s    z/CompilationCache.__getitem__.<locals>.<genexpr>c                    s"   i | ]\}}  |  |qS r   r   r   r	   r   r   r!   O   s   " z0CompilationCache.__getitem__.<locals>.<dictcomp>)r"   strintfloatnpintegerfloatingboollisttupledictr3   idr   rQ   r
   rM   concreter   r	   r   r   G   s   *



zCompilationCache.__getitem__c                 C   s4   t |tjsJ t|| jvsJ || jt|< d S rT   )r"   r#   r&   r`   r   ra   r   r   r   r@   X   s   zCompilationCache.__setitem__N)	__name__
__module____qualname__r   r   r   rQ   r   r@   r   r   r   r   r      s    *r   c                   @   s   e Zd Zdd Zdd ZdS )r%   c                 C   s   || _ || _d S rT   )graphcache)r
   rf   rg   r   r   r   r   _   r   zCompiledGraph.__init__c                 G   s   t |t | jjkrtdt | jj dt | | j" t| jj|ddD ]	\}}|| j|< q'| j| jj W  d    S 1 sBw   Y  d S )Nz	Expected z arguments, got F)strict)lenrf   r(   
ValueErrorrg   ziprA   )r
   r   r>   rb   r   r   r   __call__c   s    $zCompiledGraph.__call__N)rc   rd   re   r   rl   r   r   r   r   r%   ^   s    r%   Fc                 C   s   t  |  }|r|d fS |S rT   )r   )objectreturn_coder1   r   r   r   compilel   s   
ro   )F)einx._src.tracer_srcr#   r7   r;   rG   numpyrY   einx._src.utilr   addmulsubeqner:   r   r%   ro   r   r   r   r   <module>   s    R