o
    Ei@                     @   s2   d dl T d dlT dd ZG dd dZdd ZdS )	   )*c                 C   s   | j d ur	| j jS d S N)origin	signaturenode r   Q/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/tracer/optimize.pyget_signature   s   
r
   c                   @   s   e Zd Zdd Zdd ZdS )	Optimizerc                 C   s   i | _ d| _d S )NF)optimized_nodeschangedselfr   r   r	   __init__   s   
zOptimizer.__init__c              
      s  t | jv r jt | S t|tr2|jd u rtdt |j|j|j |j	 |jd}nt|t
rt|jtr
t|dkrkt|jjdkrk|jj}t |jj |jjjj|gt|dd}d _nt|dkrt|jj|jjkr |jj}d _nt|dkrt|jj|jjkr |jj}d _nt|dkrt|jjttt|jkr |jj}d _ntjdd	 |jj} fd
d}tj|||jj  jt | }t |jj |jj |jj||jj fdd|jjD |jj |jjd n9|}n6t|tr fdd|D }n&t|t r/t  fdd|D }nt|t!rA fdd|" D }n|}| jt |< |S )NzFunction output is None)funcargskwargsvirtual_argsoutputreshape)r   r   Tbroadcast_to	transposec                 S   s   |   S r   )__copy__r   r   r   r	   <lambda>E   s    z$Optimizer.__call__.<locals>.<lambda>c                    s$   t | jvs	J |  jt |< d S r   )idr   )new_noder   r   r   r	   storeH   s   z!Optimizer.__call__.<locals>.storec                    s,   g | ]\}} j t|  j t| fqS r   )r   r   ).0	tensor_in
tensor_outr   r   r	   
<listcomp>U   s    z&Optimizer.__call__.<locals>.<listcomp>)r   r   inplace_updatescomment	depend_onc                    s   g | ]} |qS r   r   r   xr   r   r	   r!   b   s    c                 3   s    | ]} |V  qd S r   r   r%   r   r   r	   	<genexpr>d   s    z%Optimizer.__call__.<locals>.<genexpr>c                    s   i | ]	\}}| |qS r   r   )r   kvr   r   r	   
<dictcomp>f   s    z&Optimizer.__call__.<locals>.<dictcomp>)#r   r   
isinstanceTracableFunctionr   
ValueErrorr   r   r   r   Tracerr   Applicationr
   tensorshapeapplyopTensorr   	get_shapelistpermutationrangeleneinx	tree_utiltree_mapr   r"   r#   r$   tupledictitems)r   r   r   r1   new_output_nodesr   r   r   r	   __call__   s   








zOptimizer.__call__N)__name__
__module____qualname__r   rA   r   r   r   r	   r      s    r   c                 C   s   	 t  }|| } |js	 | S qr   )r   r   )r   	optimizerr   r   r	   optimizen   s   rF   N)tracerr0   r
   r   rF   r   r   r   r	   <module>   s
    b