o
    e9                     @   sP   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dl	T G dd deZ
dS )    N)FuseBase)PaddleGraphPaddleLayer)*c                       s,   e Zd Z fddZdd Zdd Z  ZS )TransposeEliminationc                    s0   t t|   g d| _g d| _g d| _d S )N)zpaddle.nn.ReLUzpaddle.nn.ReLU6z
paddle.abszpaddle.nn.Sigmoidz
paddle.expzpaddle.rsqrtzpaddle.nn.Swishzpaddle.nn.Tanhzpaddle.nn.Softpluszpaddle.nn.LeakyReLUzpaddle.floorz
paddle.erfzpaddle.square)z
paddle.addzfluid.layers.elementwise_subzpaddle.multiplyzpaddle.divide)zpaddle.meanz
paddle.allz
paddle.maxz
paddle.anyz
paddle.sumzpaddle.prod)superr   __init__direct_layerselementwise_layersreduce_layers)self	__class__ dD:\Projects\ConvertPro\env\Lib\site-packages\x2paddle/optimizer/elimination/transpose_elimination.pyr      s   

zTransposeElimination.__init__c                 C   s.   d}|j  D ]\}}|jdkr|d7 }q|S )Nr   paddle.transpose   )layersitemskernel)r   graphcountlayer_idlayerr   r   r   get_transpose_num)   s   
z&TransposeElimination.get_transpose_numc           
   	      sX  t jt t t t t dd   f	dd}}t}t |j||r>	 ||s9ttD ]}| qDttD ]+}j| j	dd }|d ur}t
t |D ]}g d||  ||< qh|j| jd< qRttD ]}j| j	dd}g d| j| jd< q}	td||	 d S )	Nc                 S   s   | j drd| j vrdS dS )Nz	paddle.nnZ
functionalr   r   )r   
startswith)r   r   r   r   	get_index8   s   
z/TransposeElimination.operate.<locals>.get_indexc                    s  t | j}| D ]\}}|v rq
| tt d d}tj	d
| |jdkr3q
|jd g dkr=q
t }t }t }t }t }	d}
| j|g D ]}| j| jdkru| j| jd g dkrod	}
 n|| qU| j| jjv r|| qU| j| jjv r | j| }| j| j| | jv rd	}
 nl|| qU| j| jjv r | j| }| j| j| | jv rd	}
 nG| j| jd
d	sd	}
 n9|| || qU| j| jdkr | j| }| j| j| | jv rd	}
 n|| || qUd	}
 t }t|dkr|
r|d}|| | j|g D ]}| j| jdkrP| j| jd g dkrId	}
 n|| q-| j| jjv r} | j| }| j| j| | jv rqd	}
 n||vr{|| q-| j| jjv r | j| }| j| j| | jv rd	}
 n||vr|| q-| j| jjv r | j| }| j| j| | jv rd	}
 nT| j| jd
d	sd	}
 nE||vr|| || q-| j| jdkr | j| }| j| j| | jv rd	}
 n||vr|| || q-d	}
 | j|g D ]q}| j| jjv rzo| j| jd }| j| jd } | j| }| j| j| | j| jd krtt|dgkskt|dk rs|	| W q&n-| j| j| | j| jd krt|dgkst|dk r|	| W q&ntdW n ty } z	d	}
W Y d }~ nd }~ww  | j| }| j| jdkr| j| jd g dkrd	}
 n||vr|| q&| j| jjv r| j| j| | jv r d	}
 n||vr
|| q&| j| jjv r2| j| j| | jv r&d	}
 ns||vr0|| q&| j| jjv rl| j| j| | jv rLd	}
 nM| j| jd
d	s[d	}
 n>||vrj|| || q&| j| jdkr| j| j| | jv rd	}
 n||vr|| || q&d	}
 |
sn
t|dkr|
s|
sq
|| tt|}|D ]} j| }j| j| jv rd	}
 nq|
sq
|D ]}| | qو| | | |	  dS d	S )Nd      z Optimize Transpose Layers...{}%r   permr   r      r   T)r   r!   r   r   FZkeepdimzpaddle.concatr   xyr   z7Unexcepted situation happend while optimizing transpose)copydeepcopyr   r   addroundlensysstderrwriteformatr   attrslistZ	edges_outgetappendr
   r	   Zoutputsr   setpopZedges_inZinput_shapesZinputs	Exception	del_layerextend)Z_graphr   r   r   percentZtranspose_layersZpropagate_layersr   Zconcat_layersr
   Zcan_be_optimizedoutZouput_indexZvisited_layersZ
current_idZoutput_indexZiptZx_shapeZy_shapeel	r   r   Zoptimized_concat_layersZoptimized_elementwise_layersZoptimized_reduce_layersZoptimized_transpose_layersZscanned_layersr   Ztotal_layer_numr   r   strip_transpose?   s(  











































~




z5TransposeElimination.operate.<locals>.strip_transposeaxisr    r   zN
Transpose layers optimized, before: transpose_num={}, after: transpose_num={})r(   r   r1   r.   r   r$   r%   r4   r-   r/   rangeprintr,   )
r   r   r;   Zbefore_transpose_numZ	opt_graphr   dimir<   Zcurrent_transpose_numr   r:   r   operate0   s@   
 
R


zTransposeElimination.operate)__name__
__module____qualname__r   r   rA   __classcell__r   r   r   r   r      s    r   )r$   r)   numpynpZ"x2paddle.optimizer.pattern_matcherr   Zx2paddle.core.programr   r   Zx2paddle.core.utilr   r   r   r   r   <module>   s   