o
    EiJ                     @   s   d dl Z ddlT ddlT ddlmZ d dlmZ G dd dZG dd	 d	Zd
d ZG dd dZ	G dd dZ
G dd dZdS )    N   )*)optimize)partialc                   @   s@   e Zd ZdddZdd Zdd Zdd	 Zdd
dZdd ZdS )	VariablesNc                 C   s2   i | _ || _g | _| jd ur| jj|  d S d S N)	variablesparentchildrenappend)selfr	    r   P/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/tracer/compile.py__init__	   s   
zVariables.__init__c                 C   s
   t | dS )Nr	   )r   r   r   r   r   fork      
zVariables.forkc                 C   s   || j v p| jd uo|| jv S r   r   r	   r   namer   r   r   __contains__   s   zVariables.__contains__c                 C   sD   || j v rdS | jd ur|| jv rdS | jD ]	}||v r dS qdS )NFT)r   r	   r
   )r   r   childr   r   r   _is_free   s   

zVariables._is_freec                 C   s   |d u r|d us
J || v rt d| d|| j|< |S |d u s#J d}| | |  }s?|d7 }| | |  }r0|| j|< |S )NzVariable name 'z' already existsr   r   )
ValueErrorr   r   )r   valueprefixr   ir   r   r   add    s   

zVariables.addc                 C   s8   || j v r
| j | S | jd ur| j| S td| d)Nz
Variable 'z' is not set)r   r	   r   r   r   r   r   __getitem__/   s
   



zVariables.__getitem__r   )NN)	__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r      s    


r   c                   @   s@   e Zd Zdd Zdd Zedd Zdd Zd	d
 Zdd Z	dS )Blockc                 C   s   || _ || _g | _d S r   )r   r	   code)r   r   r	   r   r   r   r   8   s   
zBlock.__init__c                 C   s    |j | u p|j d uo| |j S r   )r	   is_parent_of)r   otherr   r   r   r%   =   s   
zBlock.is_parent_ofc                 C   s"   | }|j d ur|j }|j d us|S r   r   )r   blockr   r   r   
root_blockB   s
   

zBlock.root_blockc                 C   s
   | j d u S r   r   r   r   r   r   is_rootI   r   zBlock.is_rootc                 C   sP   g }| j D ] }t|tr|| qt|tsJ |dd | D  q|S )Nc                 s   s    | ]}d | V  qdS )z    Nr   .0liner   r   r   	<genexpr>S       

z*Block.get_lines_of_code.<locals>.<genexpr>)r$   
isinstancestrr   r#   extendget_lines_of_code)r   linesr   r   r   r   r2   L   s   



zBlock.get_lines_of_codec                 C   s   d |  S )N
)joinr2   r   r   r   r   __str__Y   s   zBlock.__str__N)
r    r!   r"   r   r%   propertyr(   r)   r2   r6   r   r   r   r   r#   7   s    
r#   c                 C   s   t | tsJ d}| d dko| d dk}|r?t| D ]#\}}|dkr(|d7 }q|dkr>|d8 }|dkr>|t| d k} nq|rG| dd } | S )Nr   ()r   )r/   r0   	enumeratelen)slevelcan_remove_parenthesesr   cr   r   r   _remove_parentheses]   s    
rA   c                   @   sd   e Zd Zdd Zedd Zedd Zedd Zed	d
 Zdd Z	dd Z
dd Zdd ZdS )
Definitionc                 C   s   || _ || _|| _d| _d S )NF)_value_block_codeoverwritten)r   r   r'   r$   r   r   r   r   p   s   
zDefinition.__init__c                 C      | j rtd| jS N'Trying to access overwritten definition)rF   r   rC   r   r   r   r   r   v      zDefinition.valuec                 C   rG   rH   )rF   r   rD   r   r   r   r   r'   |   rJ   zDefinition.blockc                 C   rG   rH   )rF   r   rE   r   r   r   r   r$      rJ   zDefinition.codec                 C   s$   | j rtd|  std| jS )NrI   z0Trying to access name of non-variable definition)rF   r   is_variablerE   r   r   r   r   r      s
   zDefinition.namec                 C   s"   | j rtd| jd uo| j S rH   )rF   r   rE   isidentifierr   r   r   r   rK      s   zDefinition.is_variablec                 C   s    | j rtdt| jtttfS rH   )rF   r   r/   r   tuplelistdictr   r   r   r   	is_pytree   s   zDefinition.is_pytreec                 C      | j S r   )rF   r   r   r   r   is_overwritten      zDefinition.is_overwrittenc                 C   s6   | j rtd|  stdd| _ t|| j| jdS )Nz$Trying to overwrite definition twicez+Trying to overwrite non-variable definitionTr$   )rF   r   rK   rB   rD   rE   )r   	new_valuer   r   r   	overwrite   s   zDefinition.overwriteN)r    r!   r"   r   r7   r   r'   r$   r   rK   rP   rR   rV   r   r   r   r   rB   o   s    



rB   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d Z	dd Z
dd Zdd ZdS )
CodeObjectc                    s   t t d d_i _g _t|_tj	fdd|_
tj_jD ](}d|j dtt|j }t|j}d|vrH|d| 7 }|d j _q(dd	 jD  tj   tj	 fd
dj
_d S )Nr   c                    s     | jS r   )get_definition_ofr   )xr   r   r   <lambda>   s    z%CodeObject.__init__.<locals>.<lambda>z# z: r4    = c                 S   s   i | ]}|j |jqS r   )r   r   )r+   
definitionr   r   r   
<dictcomp>       z'CodeObject.__init__.<locals>.<dictcomp>c                    s    |  S r   r   r   )locals_globalsr   r   rZ      s    )r#   r   r(   definitions	constantsUsagesusageseinx	tree_utiltree_mapnamesr0   r$   r   typer   execoutput)r   objectsr\   r,   	value_strr   )r`   r   r   r      s   


zCodeObject.__init__c                 C   rQ   r   rT   r   r   r   r   r6      rS   zCodeObject.__str__c                 C   sl   t |}t|dkr| jS |d }|dd  D ]}t|t|kr"q||r*|}q||r0qtd|S )Nr   r   zCannot join blocks)rN   r<   r(   idr%   r   )r   blocksr'   block2r   r   r   join_blocks   s   

zCodeObject.join_blocksc              	      s<  t |tsJ |jd urd|j nd}fdd|jD }dd |D  d}t |jtrd|jj |jj}|jjd urN d|jj |jj}|jj	d ur^d	|jj	 d
 t
fdd jD s} jd|  |j | d S jt j|  jt|j< d S d }t |jtrd}|jd j}|jd }| d| }	nt |jtrt|jdkr|jj}
|jd j}d|
 | d}	nt|jdkr|jj}
|jd j}|jd j}d| d
|
 d
| d}	ntd|jj dt |jtrB|jd j}|jd j}|jj}
|jd j}d| dt| d|
 d
t| d	}	n|t |jtr|jd j}|jd }t |ts`|f}t |tshJ t|dksqJ fdddfdd|D }| d| d}	n2|jj}
fdd|jD fdd|j D  }d| }|
 d| d}	t |jt }t|j dk}|d u r| o| ot|	dk otj!"|jdk}|r|rJ |j |	 nt |jtt#fr3t$d d |jD r3|rJ  fd!d|jD }d
d"d |D } j%| d#t|	 |  nU|ro|j D ]*\}}|}j!"|}|& rZ|j' u rZt|dks\J (|| q9 j%t|	|  nj)|j d$d%j*} j%| d#t|	 |  |r fd&d'}t+j,-||j d S d S )(Nz  #  c                       g | ]}  |qS r   rX   r+   rY   r   r   r   
<listcomp>   r^   z2CodeObject.execute_application.<locals>.<listcomp>c                 S      g | ]}|j qS r   r'   r+   dr   r   r   rv          Fzimport z as zfrom  c                 3   s0    | ]}t |to| kp| d  V  qdS )z  #N)r/   r0   
startswithr*   )
import_strr   r   r-      s    

z1CodeObject.execute_application.<locals>.<genexpr>r   Tr   .r8   r:      z*Invalid number of arguments for operator ''[z] c                    sv   t | tr3d}| jd ur|t| j7 }|d7 }| jd ur#|t| j7 }| jd ur1|dt| j 7 }|S t | jS )Nrr   :)	r/   slicestartr0   stopsteprA   rX   r$   )r=   rY   r   r   r   slice_to_str  s   



z4CodeObject.execute_application.<locals>.slice_to_str, c                 3   s    | ]} |V  qd S r   r   )r+   r=   )r   r   r   r-     s    ]c                    s   g | ]}  |jqS r   rX   r$   r+   argr   r   r   rv   $  s    c                    s&   g | ]\}}| d   |j qS )=r   r+   kvr   r   r   rv   $  s       c                 s   s    | ]}t |tV  qd S r   )r/   Tracerru   r   r   r   r-   :  r.   c                       g | ]
}j | d dqS )rY   r   new_variable_definitionru   r'   r   r   r   rv   ?      c                 S   s   g | ]}|j d  qS ),r_   ry   r   r   r   rv   B  r^   r[   rY   r   c                    sF    | }t|jtr!d|j d | jj } j| d S d S )Nzassert z
.shape == )rX   r/   r   Tensorr$   shaper   )rk   r\   r,   r   r   r   checkW  s
   
z-CodeObject.execute_application.<locals>.check).r/   Applicationcommentdependenciesrq   opImportimport_as_from_anyr$   insertnew_value_definitionrk   ra   rn   r   MemberAccessrX   argsOperatorr<   r   AssignAtrA   GetAtrM   r5   kwargsitemsr   inplace_updatesrd   getrN   allr   rK   r'   overwrite_variable_definitionr   r   re   rf   rg   )r   applicationr   in_defsuse_dynamic_output_checkr   inlineobjmember	right_strr   r   arg0arg1keyupdateslicesr   inplaceoutput_defsleft_str	tensor_in
tensor_outin_definitionrd   r   r   )r'   r~   r   r   r   execute_application   s   
(





 
zCodeObject.execute_applicationc                    sJ   t  jjv rtd jt  j<  fdd}tj| j d S )Nz+Trying to add definition for existing valuec                    sn   t |dkr5 j}|D ]}t|tr|d| d7 }qt|tr)|d| d7 }qJ |  j| d S d S )Nr   r   r   z["z"])r<   r$   r/   intr0   r   r'   )rY   r   r$   r   r\   r   r   r   storee  s   

z)CodeObject._add_definition.<locals>.store)rn   r   ra   r   re   rf   tree_map_with_key)r   r\   r   r   r   r   _add_definition_  s
   zCodeObject._add_definitionc                 O   s4   |j j|g|R i |}t|||}| | |S r   )r   r   rB   r   )r   r   r'   r   r   r   r\   r   r   r   r   s  s   
z"CodeObject.new_variable_definitionc                 C   s6   t |||}| | | r|jjj||jd |S )Nr_   )rB   r   rK   r'   r   r   r   )r   r   r'   r$   r\   r   r   r   r   y  s
   
zCodeObject.new_value_definitionc                 C   s   t ||d}| | |S )Nz!!!)rB   r   )r   r   r'   r\   r   r   r   new_empty_definition  s   
zCodeObject.new_empty_definitionc                 C   s,   |  r| r
J ||| jt|< d S r   )rK   rP   rV   ra   rn   )r   old_definitionrU   r   r   r   r     s   z(CodeObject.overwrite_variable_definitionc           
         s  t |jv rjt | }| rtd|S t|tr|jd u r&tdj}|jd ur8j	|||jd}nj	||dd}t
|j |d  fdd|jD } fd	d|jD }d
d |D }|j}|jd|j dd| d |j  |jd|j  |S t|tr|jdkrt|jd S |jd u rtdt| t|jtrʈ|j t |jv sJ jt | S J t|j t|trt|jd| dS t|trfdd|D }dddd |D  t|dkrdnd d }	t|dd |D |	S t|trCfdd|D }dddd |D  d }	t|dd |D |	S t|trtfd d!| D }d"dd#d$ | D  d% }	t|d&d |  D |	S t|t!t"t#j$t#j%frt|jt|S t|t&r|j'd urd'|j(j d|j)j d|j'j d}	n%|j)d urd'|j(j d|j)j d}	nd'|j(j d}	t|j|	S |d u rt|jd(S j	|jd)d}j*| |S )*Nz%Trying to access overwritten variablez3Cannot define a function without args and/or kwargsr_   r   r   r   c                    r   )r   r   r   r   function_blockr   r   r   rv     r   z0CodeObject.get_definition_of.<locals>.<listcomp>c                    s   g | ]} | qS r   )r   )r+   virtual_argr   r   r   rv     s    
c                 S   rw   r   r_   ry   r   r   r   rv     r{   zdef r8   r   z):z    return constantz>Got a tracer without an origin and a concrete value with type F"c                    rs   r   rt   r+   ar   r   r   rv     r^   c                 S   rw   r   rT   ry   r   r   r   rv     r{   r   r   rr   r:   c                 S   rw   r   rx   ry   r   r   r   rv     r{   c                    rs   r   rt   r   r   r   r   rv     r^   r   c                 S   rw   r   rT   ry   r   r   r   rv     r{   r   c                 S   rw   r   rx   ry   r   r   r   rv     r{   c                    s   i | ]
\}}|  |qS r   rt   r   r   r   r   r]     s    z0CodeObject.get_definition_of.<locals>.<dictcomp>{c                 s   s&    | ]\}}d | d|j  V  qdS )r   z": NrT   r   r   r   r   r-     s   $ z/CodeObject.get_definition_of.<locals>.<genexpr>}c                 S   rw   r   rx   )r+   r   r   r   r   rv     r{   zslice(Noneconst)+rn   ra   rR   r   r/   TracableFunctionr   r(   r   r   r#   r   r   virtual_argsrX   rk   r$   r   r5   r   originrB   ri   r   r   r0   rM   r<   rq   rN   rO   r   valuesr   floatnpintegerfloatingr   r   r   r   rb   )
r   rY   r\   r'   arg_defsvirtual_arg_defsargnames
output_defx_defsr$   r   r   r   rX     s   


"



2  8(
zCodeObject.get_definition_ofN)r    r!   r"   r   r6   rq   r   r   r   r   r   r   rX   r   r   r   r   rW      s     rW   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CompiledFunctionc                 C   s&   t |}t|}t|| _|j| _d S r   )r   rW   r0   r$   rk   r   )r   functioncode_objectr   r   r   r     s   
zCompiledFunction.__init__c                 G   s
   | j | S r   )r   )r   input_concreter   r   r   __call__  s   
zCompiledFunction.__call__c                 C   rQ   r   rT   r   r   r   r   r6     rS   zCompiledFunction.__str__N)r    r!   r"   r   r   r6   r   r   r   r   r     s    r   )re   tracertensorr   	functoolsr   r   r#   rA   rB   rW   r   r   r   r   r   <module>   s    /&7  ;