o
    eN
                     @   s@   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 )ConstantFuserc                    s   t t|   d S )N)superr   __init__self	__class__ XD:\Projects\ConvertPro\env\Lib\site-packages\x2paddle/optimizer/fusion/constant_fuser.pyr      s   zConstantFuser.__init__c                 C   s.   | j jdi dgdd | j   dg| j _dS )u    描述需要替换的constant图结构。
        constant层模式python实现代码示例:
            x3 = 10
            for _x70 in range(x3):
                ...
        zprim.constantx1   )inputsoutputsvalueN)patternZ	add_layerbuildr   r	   r   r   r   build_pattern   s
   

zConstantFuser.build_patternc           
         s    fdd t | d }t | d }|jd }|jd }|j|ddkr<|j| D ]}|j| }	 |	|| q.d S d S )Nc                    s   | j  D ]\}}||kr| j | || j|<  nq| j D ]\}}||kr/|| j|<  nq | jdks:| jdkr`| jD ]$}|j D ]\}}|j|ddkr^d|j| v r^ ||| qDq=d S d S )Nz	prim.loopzprim.ifr   )	r   itemspopattrsZkernelblockslayersZedges_inget)layer_connectZ
match_nameZmatch_valuekvblockZ
b_layer_idZb_layerreplace_valuer   r   r#   &   s,   




z5ConstantFuser.insert_new_layer.<locals>.replace_valuer   r   )listkeysvaluesr   r   Z	edges_outr   r   )
r
   graph
parametersmatchesZlayer_idlayerZlayer_output_nameZlayer_valueZlayer_id_outr   r   r"   r   insert_new_layer%   s   


zConstantFuser.insert_new_layer)__name__
__module____qualname__r   r   r+   __classcell__r   r   r   r   r      s    r   )	numpynpZ"x2paddle.optimizer.pattern_matcherr   Zx2paddle.core.programr   r   Zx2paddle.core.utilr   r   r   r   r   <module>   s
   