o
    Eiz!                     @   s  d dl Z d dlZd dlmZ d dlZG dd dZg i ddg dg fddZe Zdd Z	G d	d
 d
Z
G dd dZG dd deZd!ddZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dZd"dd ZdS )#    N)partialc                   @   s    e Zd Zdd Zedd ZdS )Applicationc	                    s  | _ | _| _|d u rt n| _| _| _| _| _ fdd}	t	j
|	 j |dkrKtjdd g|R i |}
|
d  _|
d  _d S |dkritjd	d g|R i |}
|
d  _|
d  _d S |d
krtjdd g|R i |}
|
d  _|
d  _d S d S )Nc                    s
    | _ d S Norigin)tracerkeyself O/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/tracer/tracer.pyupdate_origin      
z+Application.__init__.<locals>.update_originreshapec                 S      d S r   r   tensorshaper   r   r   <lambda>       z&Application.__init__.<locals>.<lambda>r   r   broadcast_toc                 S   r   r   r   r   r   r   r   r      r   	transposec                 S   r   r   r   )r   permutationr   r   r   r   !   r   r   )opargskwargsTraceroutput	signatureinplace_updatescomment	depend_oneinx	tree_utiltree_map_with_keyinspectgetcallargsr   r   r   )r
   r   r   r   r   r   r   r    r!   r   paramsr   r	   r   __init__   s.   


zApplication.__init__c                 C   s&   | j gt| j t| j  | j S r   )r   listr   r   valuesr!   r	   r   r   r   dependencies%   s   &zApplication.dependenciesN)__name__
__module____qualname__r(   propertyr+   r   r   r   r   r      s    r   c           
   
   C   s   t | trt| jt| jt| i | j||||||dS t | trDt|dks+J | |i |}|d urBdd }	t	j
|	|| |S t| |||||||t  djS )N)r   r   r   r   r   r    r!   r   c                 S   s0   t | t |krtdt | dt |  d S )NzExpected output type z$ when tracing TracableFunction, got )type
ValueError)
got_outputexpected_outputr   r   r   checkD   s   zapply.<locals>.check)
isinstancer   applyfuncr)   r   keywordsTracableFunctionlenr"   r#   tree_mapr   _get_depend_on_stackr   )
r   r   r   r   r   r   r    r!   r2   r4   r   r   r   r6   *   s<   



	r6   c                   C   s   t tdsg t_tjS )Nr!   )hasattr_thread_localr!   r   r   r   r   r<   ^   s   
r<   c                   @   $   e Zd Zdd Zdd Zdd ZdS )r!   c                 C   s   t tj|| _d S r   )r)   r"   r#   tree_flattenr   r
   tracersr   r   r   r(   e   s   zdepend_on.__init__c                 C   s   t  | j d S r   )r<   appendr   r	   r   r   r   	__enter__h      zdepend_on.__enter__c                 G   s"   t  d | ju s
J t    d S )N)r<   r   popr
   r   r   r   r   __exit__k   s   zdepend_on.__exit__N)r,   r-   r.   r(   rD   rI   r   r   r   r   r!   d       r!   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )r   Nc                 C   
   || _ d S r   r   )r
   r   r   r   r   r(   q   r   zTracer.__init__c                 C   s,   | dr|drt| |S t | |S )N__)
startswithendswithobject__getattribute__MemberAccessr
   r   r   r   r   __getattr__t   s   zTracer.__getattr__c                 C   s   t  | |S r   )GetAtrR   r   r   r   __getitem__z      zTracer.__getitem__c                 O   s   t | ||dS )Nr   r   r6   r
   r   r   r   r   r   __call__}      zTracer.__call__c                 C   s   t | tksJ t S r   )r0   r   r	   r   r   r   __copy__   s   zTracer.__copy__r   )r,   r-   r.   r(   rS   rU   rZ   r\   r   r   r   r   r   p   s    
r   c                   @      e Zd Zdd Zdd ZdS )Importc                 C   s$   t j| dd || _|| _|| _d S Nconstantr   )r   r(   import_as_from_)r
   ra   rb   rc   r   r   r   r(      s   
zImport.__init__c                 C   s   t | S r   rX   r	   r   r   r   rZ      s   zImport.__call__Nr,   r-   r.   r(   rZ   r   r   r   r   r^      s    r^   c                 C   s   t | || S r   )r^   )ra   rb   rc   r   r   r   ra      r[   ra   c                   @   r]   )rQ   c                 C      t j| dd d S r_   r   r(   r	   r   r   r   r(      rE   zMemberAccess.__init__c                 C   s   t |tsJ t| ||gdS N)r   )r5   strr6   r
   objr   r   r   r   rZ      s   zMemberAccess.__call__Nrd   r   r   r   r   rQ          rQ   c                   @   "   e Zd ZdefddZdd ZdS )Operatorr   c                 C      t j| dd || _d S r_   r   r(   r   r
   r   r   r   r   r(         
zOperator.__init__c                 G   s   t | |dS rg   rX   rH   r   r   r   rZ      rV   zOperator.__call__Nr,   r-   r.   rh   r(   rZ   r   r   r   r   rm          rm   c                   @   rl   )AssignAtr   c                 C   rn   r_   ro   rp   r   r   r   r(      rq   zAssignAt.__init__c                 C   s   t | |||gdS rg   rX   )r
   rj   r   updater   r   r   rZ      rE   zAssignAt.__call__Nrr   r   r   r   r   rt      rs   rt   c                   @   r]   )rT   c                 C   re   r_   rf   r	   r   r   r   r(      rE   zGetAt.__init__c                 C   s   t | ||gdS rg   rX   ri   r   r   r   rZ      s   zGetAt.__call__Nrd   r   r   r   r   rT      rk   rT   c                   @   r?   )Functionc                 C   rK   r   )r   )r
   r   r   r   r   r(      r   zFunction.__init__c                 C   s
   t | jS r   )rv   r   r	   r   r   r   r\      r   zFunction.__copy__c                 O   s    t | ||tjdd | jdS )Nc                 S   s   |   S r   )r\   )xr   r   r   r      s    z#Function.__call__.<locals>.<lambda>)r   r   r   )r6   r"   r#   r;   r   rY   r   r   r   rZ      s   zFunction.__call__N)r,   r-   r.   r(   r\   rZ   r   r   r   r   rv      rJ   rv   c                   @   s*   e Zd Zdddg ddfddZdd ZdS )r9   Nc                 C   s   t |  t|t rtd|d ur|d u r|d u rtd|d u r(|d ur(g }|d ur2|d u r2i }|d urI|d u rI|d usB|d urI||i |}|| _|| _|| _|| _|| _|| _	d S )Nzfunc cannot be a tracer objectz<Cannot create a TracableFunction with an output but no input)
r   r(   r5   r1   r7   r   r   virtual_argsr   name)r
   r7   r   r   rx   r   ry   r   r   r   r(      s"   

 
zTracableFunction.__init__c                 O   s"   | j d u r	td| j |i |S )NzKCannot call a TracableFunction that was created without a callable function)r7   NotImplementedErrorrY   r   r   r   rZ      s
   
zTracableFunction.__call__rd   r   r   r   r   r9      s    r9   c                   @   r]   )Usagesc                    s    i _  fdd  | d S )Nc                    s4  t | jvrg jt | < t| ttfr | D ]} | qd S t| tr2|  D ]} | q)d S t| tr}t| jt	r}| jj
D ]9}t|trvt |jvrVg jt |< jt | D ]}t |t | jkrj nq]jt | | j  | qAd S t| tr | j  | j  | j  | j d S d S r   )idusagesr5   r)   tupledictr*   r   r   r   r+   rC   r9   r7   r   r   r   )rw   yusage_capture_usagesr
   r   r   r      s8   








z(Usages.__init__.<locals>._capture_usages)r}   rA   r   r   r   r(      s   zUsages.__init__c                    s$   g  fdd}t j|| S )Nc                    s*   t |  jv r jt |   d S d S r   )r|   r}   extend)r   r
   r}   r   r   retrieve_usages  s   z#Usages.get.<locals>.retrieve_usages)r"   r#   r;   )r
   rB   r   r   r   r   get	  s   z
Usages.getN)r,   r-   r.   r(   r   r   r   r   r   r{      s    !r{   c                 C   s$   | d u rt t||dS t| ||dS )NrW   r7   r   r   )r   tracer9   r   r   r   r   r     s   r   )NN)NNN)r"   r%   	functoolsr   	threadingr   r6   localr>   r<   r!   r   r^   ra   rQ   rm   rt   rT   rv   r9   r{   r   r   r   r   r   <module>   s6    %
1
			 -