o
    i                     @   sh   d dl m  mZ d dlm  m  mZ d dlZG dd dZG dd dZ	G dd dZ
dd	 ZdS )
    Nc                   @   s   e Zd Zdd Zdd ZdS )Scopec                 C   s   d | _ d | _d S N)required_scopesparentself r   Z/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/tracer/compiler/python/scope.py__init__      
zScope.__init__c                 C   s>   |d u rt dt| t|krdS |jd u rdS | |jS )NzOther scope is None.TF)
ValueErroridr   is_predecessor_of)r   otherr   r   r	   r      s   
zScope.is_predecessor_ofN)__name__
__module____qualname__r
   r   r   r   r   r	   r      s    r   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 )_IntermediateMapc                 C   s   i | _ || _d S r   )id_to_scopesglobal_scope)r   r   r   r   r	   r
      r   z_IntermediateMap.__init__c                    s`   t |ttB tB tB tjB tjB tjB s |d u s |dks |g kr"dS t	 fddt
|D S )Nr   Tc                 3   s    | ]
}t | jv V  qd S r   )r   r   .0yr   r   r	   	<genexpr>   s    z0_IntermediateMap.__contains__.<locals>.<genexpr>)
isinstancestrintfloatboolnpintegerfloatingbool_allpytreeflattenr   xr   r   r	   __contains__   s   @z_IntermediateMap.__contains__c                    s   t |ttB tB tB tjB tjB tjB s |d u s |dks |g kr$ j	gS  fddt
|D }t |trDtdd |D rDt|dksFJ |S )Nr   c                    s$   g | ]} j t| D ]}|qqS r   )r   r   )r   r   scoper   r   r	   
<listcomp>%   s   $ z0_IntermediateMap.__getitem__.<locals>.<listcomp>c                 s       | ]}t |tV  qd S r   r   r   r   sr   r   r	   r   &       z/_IntermediateMap.__getitem__.<locals>.<genexpr>r   )r   r   r   r   r   r   r    r!   r"   r   r$   r%   listr#   len)r   r'   resultr   r   r	   __getitem__!   s
   @,z_IntermediateMap.__getitem__c                 C   sb   t |trtdd |D rt|dksJ t |tjtjB r(|| jt|< d S t	dt
| )Nc                 s   r+   r   r,   r-   r   r   r	   r   *   r/   z/_IntermediateMap.__setitem__.<locals>.<genexpr>r   zUnsupported type for key: )r   r0   r#   r1   tracerTracerGraphr   r   	TypeErrortype)r   r'   scopesr   r   r	   __setitem__)   s   ,z_IntermediateMap.__setitem__c                 C   s
   | j  S r   )r   itemsr   r   r   r	   r;   0   s   
z_IntermediateMap.itemsc                 C   s.   dd | j  D }tdd |D  }|S )Nc                 S   s   g | ]	}|D ]}|qqS r   r   )r   r9   r)   r   r   r	   r*   4   s    z/_IntermediateMap.all_scopes.<locals>.<listcomp>c                 S      i | ]}t ||qS r   r   r-   r   r   r	   
<dictcomp>5       z/_IntermediateMap.all_scopes.<locals>.<dictcomp>)r   valuesr0   )r   r9   r   r   r	   
all_scopes3   s   z_IntermediateMap.all_scopesN)	r   r   r   r
   r(   r3   r:   r;   rA   r   r   r   r	   r      s    r   c                   @   s8   e Zd Zdd Zdd Zdd Zedd Zd	d
 ZdS )Mapc                 C   s   i | _ || _|| _d S r   )id_to_scoper   r9   )r   r   r9   r   r   r	   r
   :   s   
zMap.__init__c                 C   s~   t dd |D  | jg }|d }|dd  D ]#}t|t|kr$q||r,|}q||r2qtd| d| d|S )Nc                 S   r<   r   r=   r-   r   r   r	   r>   @   r?   z*Map._find_common_scope.<locals>.<dictcomp>r      Scopes  and F are not in a predecessor relationship, cannot determine common scope.)r0   r@   r   r   r   r   )r   r9   r)   scope2r   r   r	   _find_common_scope?   s   

zMap._find_common_scopec                    s   t |ttB tB tB tjB tjB tjB s |d u s |dks |g kr# j	S t
| jv r1 jt
| S t |ttB rD  fdd|D S t |tr_  fddt| t|  D S td| d)Nr   c                       g | ]} | qS r   r   r   r   r   r	   r*   U       z#Map.__getitem__.<locals>.<listcomp>c                    rJ   r   r   r   r   r   r	   r*   W   rK   zKey z not found in scope map.)r   r   r   r   r   r   r    r!   r"   r   r   rC   r0   tuplerI   dictkeysr@   KeyErrorr&   r   r   r	   r3   N   s   @
,zMap.__getitem__c                 C      | j S r   )r   r   r   r   r	   root[   s   zMap.rootc                 C   rP   r   )r9   r   r   r   r	   r@   _   s   z
Map.valuesN)	r   r   r   r
   rI   r3   propertyrQ   r@   r   r   r   r	   rB   9   s    
rB   c                    s   t  g_t fdd  |   }fddfdd}|D ]}t|tkr9||j|_q)t|} D ]\}}|||j	|< qC|S )Nc                    s  | vrt | tjr| jd u rtd|  dt | tjrN| jd urNfdd| jjD g }tdd |D  }|| < t	| jj
D ]}| qFnt | ttB rmfdd| D g }tdd |D  }nlt | trfd	dt|  t|   D g }td
d |D  }nEt | tjrt  | jD ]} g|< q| j
} fdd|D }t|dkrg}t|dksJ | _|| < |}ng}n|  }t |trtdd |D rt|dksJ |S )NzTracer z1 has no origin, cannot determine required scopes.c                       g | ]} |D ]}|qqS r   r   r   inputr)   _get_required_scopesr   r	   r*   o       z<get_scopes.<locals>._get_required_scopes.<locals>.<listcomp>c                 S   r<   r   r=   r-   r   r   r	   r>   p   r?   z<get_scopes.<locals>._get_required_scopes.<locals>.<dictcomp>c                    rS   r   r   rT   rV   r   r	   r*   w   rX   c                 S   r<   r   r=   r-   r   r   r	   r>   x   r?   c                    rS   r   r   rT   rV   r   r	   r*   z   rX   c                 S   r<   r   r=   r-   r   r   r	   r>   {   r?   c                    s    g | ]}t |t  kr|qS r   r=   )r   r)   inner_scoper   r	   r*      s     r   c                 s   r+   r   r,   r-   r   r   r	   r      r/   z;get_scopes.<locals>._get_required_scopes.<locals>.<genexpr>)r   r4   r5   originr   inputsr0   r@   r$   r%   outputrL   rM   rN   r6   r   r1   r   r#   )r'   input_scopesr2   r]   rU   required_output_scopes)rW   r   r   rY   r	   rW   j   s@   

,

,z(get_scopes.<locals>._get_required_scopesc                    sJ   |j d usJ t t|krdS  |j v rdS t fdd|j D S )NTc                 3   s    | ]} |V  qd S r   r   r-   )_is_predecessor_ofr)   r   r	   r      r/   z9get_scopes.<locals>._is_predecessor_of.<locals>.<genexpr>)r   r   any)r)   rH   r`   )r)   r	   r`      s   
z&get_scopes.<locals>._is_predecessor_ofc                    s   t dd | D  } t| dkrtd| d }| dd  D ]#}t|t|kr*q ||r2|}q ||r8qtd| d| d|S )	Nc                 S   r<   r   r=   r-   r   r   r	   r>      r?   z:get_scopes.<locals>._find_common_scope.<locals>.<dictcomp>r   zNo scopes foundrD   rE   rF   rG   )r0   r@   r1   r   r   )r9   r)   rH   rb   r   r	   rI      s   

z&get_scopes.<locals>._find_common_scope)
r   r   r   rA   r   r   rB   r;   rI   rC   )r'   r9   rI   r)   
scopes_maptraceridr   )rW   r`   r   r   r	   
get_scopesc   s    &	
re   )einx._src.tracer_srcr4   einx._src.util.pytreeutilr$   numpyr   r   r   rB   re   r   r   r   r	   <module>   s    #*