o
    Ei!                     @   sd   d dl Z d dlZd dlZdddZdd Zdddd	Zd
d Zdd Zdd Z	dd Z
dd ZdS )    Nc                    s   |d u rVg }| D ]K}t jj|}t jj|}tdd |D rNdd t|D d \} tt j	D ]t jj
| fdd}|t|g q5q|| q|S |d us\J t| t|krhtdg }g }t| |D ]\}}t jj|}t jj|}|||j}td	d |D rd
d t|D d \} tdgdd  j	D  }	tt j	D ]:td f| t|	 |	d  f }
||
 }t jj
| fdd}t|g|g|\}}|| || qqq|| || qq||fS )Nc                 s        | ]}t |tjjjV  qd S N
isinstanceeinxexprstage3Concatenation.0e r   I/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einx/op/util.py	<genexpr>       zflatten.<locals>.<genexpr>c                 S   (   g | ]\}}t |tjjjr||fqS r   r   r   ir   r   r   r   
<listcomp>       zflatten.<locals>.<listcomp>r   c                    "   t | t  kr| j  S d S r   idchildren__deepcopy__r   concat_exprr   r   r   <lambda>      zflatten.<locals>.<lambda>z/Got different number of expressions and tensorsc                 s   r   r   r   r
   r   r   r   r   ,   r   c                 S   r   r   r   r   r   r   r   r   -   r   c                 S   s   g | ]}|j d  qS r   )shape)r   cr   r   r   r   2          c                    r   r   r   r   r   r   r   r   <   r   )r   r   r   	decomposeremove_unnamed_trivial_axesany	enumeraterangelenr   replaceextendflattenappend
ValueErrorzipreshaper!   npcumsumslice)exprstensorsbackend	exprs_outr   concat_indexsubexprtensors_outtensorsplitss	subtensorflattened_subexprsflattened_subtensorsr   r   r   r-      sh   &


r-   c                    s   t | t |krtddd | D }dd |D }tjt |t | ftd}t|D ]\}}t|D ]\}}||r>dnd|||f< q3q+d fdd		  |\}	}
|	d u r[td
t|	t	t |ksiJ |
S )Nz4Got different number of input and output expressionsc                 S   $   g | ]}d d t jj|D qS )c                 S      h | ]}|j qS r   namer   ar   r   r   	<setcomp>P       (assignment.<locals>.<listcomp>.<setcomp>r   r   r   get_named_axes)r   expr_inr   r   r   r   P      $ zassignment.<locals>.<listcomp>c                 S   rB   )c                 S   rC   r   rD   rF   r   r   r   rH   R   rI   rJ   rK   )r   expr_outr   r   r   r   Q   s    dtyper   r$   c                    s   || j d krg g fS t| j d D ]7}| ||f dkrI|  }d||d d f< d|d d |f<  ||d \}}|d urI|g| |g| f  S qdS )Nr   r$   NN)r!   r)   copy)cost_matrixrr"   cost_matrix2rowscolsassignment_solverr   r   rZ   [   s   z%assignment.<locals>.assignment_solverz>Failed to find assignment between input and output expressionsr    )
r*   r/   r2   onesintr(   issubsetRuntimeErrorallarange)exprs_inr8   axes_inaxes_outrT   r   a_outja_inrow_indcol_indr   rY   r   
assignmentM   s&   ri   T)	broadcastc          	         s2  t jj| rt jj|sJ d|  d| ddd t jj| D  dd t jj|D } fdd|D } fdd|D t|t krOtd	 fd
d|D }||t|}t	dkrtfddt jj|D }|
||}|r|||j}|st jj fdd|D }||fS )N'z' and 'z' must be flatc                 S      g | ]}|j qS r   rD   rF   r   r   r   r   z   rI   z'transpose_broadcast.<locals>.<listcomp>c                 S   rl   r   rD   rF   r   r   r   r   {   rI   c                    s   g | ]}| v r|qS r   r   rF   in_axesr   r   r   |       c                    s   g | ]}| vr|qS r   r   rF   rm   r   r   r   }   ro   z2Found input axes that are not in output expressionc                    s   g | ]}  |qS r   )index)r   out_axisrm   r   r   r      r#   r   c                 3   s$    | ]}|j  v rd n|jV  qdS )r$   N)rE   valuerF   )out_axes_broadcastr   r   r      s
    
z&transpose_broadcast.<locals>.<genexpr>c                    s*   g | ]}|j  v r|ntjjd dqS )Nr$   )rE   r   r   r   Axisr   axisrm   r   r   r      s    )r   r   r   is_flatget_axessetr^   	transposetupler*   r1   broadcast_tor!   List)	rM   r<   rO   r7   rj   out_axesout_axes_intersectpermpre_broadcast_shaper   )rn   rs   r   transpose_broadcastt   s2   r   c                    s   t jj|}t jj|}tdd |D rQdd t|D d \} g }tt j	D ]t jj
| fdd}t| |||}|| q-|j||d}	n"t| }
t jjt jj|t jjt jj|
ksoJ t|}	||	|j}	|	S )	Nc                 s   r   r   r   r
   r   r   r   r      r   z_unflatten.<locals>.<genexpr>c                 S   r   r   r   r   r   r   r   r      r   z_unflatten.<locals>.<listcomp>r   c                    r   r   r   r   r   r   r   r      r   z_unflatten.<locals>.<lambda>)rv   )r   r   r   r%   r&   r'   r(   r)   r*   r   r+   
_unflattenr.   concatenatenextr1   r!   )ra   
tensors_inrO   r7   expr_out_flatr9   r;   r:   r?   
tensor_outnext_expr_inr   r   r   r      s4   r   c          	      C   st   t | t |krtd|d usJ t| }t|}g }|D ]}t||||}tj||jks2J || q|S )Nz5Got different number of input expressions and tensors)	r*   r/   iterr   r   tracer	get_shaper!   r.   )	ra   r   r8   r7   iter_exprs_initer_tensors_inr;   rO   tr   r   r   	unflatten   s   r   c              
   C   s   |dks|g krt j|t jdS zt |}W n ty. } ztd|  d| |d }~ww t |jt jsAtd|  d| |S )Nr   rP   zGot invalid parameter =)r2   asarrayint64	Exceptionr/   
issubdtyperQ   integer)kvr   r   r   r   _clean_parameter   s   r   c                    s:   dd t jj|  D   fdd| D }| |fS )Nc                 S   s"   h | ]}t |tjjjr|jqS r   )r   r   r   stage1	NamedAxisrE   ru   r   r   r   rH      s    z4_clean_description_and_parameters.<locals>.<setcomp>c                    s$   i | ]\}}| v r|t ||qS r   )r   )r   r   r   
axis_namesr   r   
<dictcomp>   rN   z5_clean_description_and_parameters.<locals>.<dictcomp>)r   r   r   parse_opr_   items)description
parametersr   r   r   !_clean_description_and_parameters   s
   r   c                 C   s   dt | v r	| jS t| S )N__name__)dirr   str)opr   r   r   
_op_to_str   s   r   rR   )r   sysnumpyr2   r-   ri   r   r   r   r   r   r   r   r   r   r   <module>   s    
G'!'