o
    i                     @   sn   d dl Zd dlm  mZ d dlmZ ddlmZ G dd dZ	G dd dZ
G d	d
 d
ZG dd dZdS )    N)pytree   )_skip_idc                   @   $   e Zd Zdd Zdd Zdd ZdS )SkipReshapec                 C   
   || _ d S N)reshape)selfr	    r   X/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/tracer/optimizer/classical.py__init__      
zSkipReshape.__init__c                 C   ,   t |tjot |jtjjjo|jj| jkS r   )	
isinstancetracerTracerorigin	signaturepythonCallfunctionr	   r
   xr   r   r   _is_result_of_call      ,zSkipReshape._is_result_of_callc                 C   s   |  |rU|jjd }t|tjjjrdS |jjd }t|tt	B t
jB r4t|t|jkr4d||fS t|}|  |rU|jjd }dtjj||jj|||gfS dS Nr   FNr   T)r   r   argsr   r   r   r   Valuetuplelistnpndarrayshaper   callr   )r
   r   	transforminputr$   input_of_inputr   r   r   __call__   s   
&
$zSkipReshape.__call__N__name__
__module____qualname__r   r   r)   r   r   r   r   r          r   c                   @   r   )SkipTransposec                 C   r   r   )	transpose)r
   r0   r   r   r   r   "   r   zSkipTranspose.__init__c                 C   r   r   )	r   r   r   r   r   r   r   r   r0   r   r   r   r   r   %   r   z SkipTranspose._is_result_of_callc                    s   |  |r~|jjd }t|tjjjrdS |jjd }t|tt	B t
jB r6t|tt|jkr6d||fS t|}|  |r~|jjd }|jjd  |}tdd  D r_tdd |D saJ t fdd|D }dtjj||jj|||gfS dS )Nr   r   r   Tc                 s   s    | ]}t |tV  qd S r   )r   int.0pr   r   r   	<genexpr>9   s    z)SkipTranspose.__call__.<locals>.<genexpr>c                 3   s    | ]} | V  qd S r   r   r2   perm1r   r   r5   :   s    )r   r   r   r   r   r   r   r   r    r!   r"   r#   rangendimr   allr%   r   )r
   r   r&   r'   permr(   perm2new_permr   r6   r   r)   (   s    
*
($zSkipTranspose.__call__Nr*   r   r   r   r   r/   !   r.   r/   c                   @   r   )SkipConcatenatec                 C   r   r   )concatenate)r
   r?   r   r   r   r   @   r   zSkipConcatenate.__init__c                 C   r   r   )	r   r   r   r   r   r   r   r   r?   r   r   r   r   r   C   r   z"SkipConcatenate._is_result_of_callc                 C   sD   |  |r |jjd }t|ttB r t|dkr d||d fS dS )Nr   r   Tr   )r   r   r   r   r!   r    len)r
   r   r&   tensorsr   r   r   r)   F   s
   
zSkipConcatenate.__call__Nr*   r   r   r   r   r>   ?   r.   r>   c                   @   r   )SkipBroadcastToc                 C   r   r   )broadcast_to)r
   rC   r   r   r   r   P   r   zSkipBroadcastTo.__init__c                 C   r   r   )	r   r   r   r   r   r   r   r   rC   r   r   r   r   r   S   r   z"SkipBroadcastTo._is_result_of_callc                 C   sl   |  |r4|jjd }t|tjjjrdS |jjd }t|tt	B t
jB r4t|t|jkr4d||fS dS r   )r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   )r
   r   r&   r'   r$   r   r   r   r)   V   s   
&zSkipBroadcastTo.__call__Nr*   r   r   r   r   rB   O   r.   rB   )numpyr"   einx._src.tracer_srcr   einx._src.utilr   _utilr   r   r/   r>   rB   r   r   r   r   <module>   s    