
    x-jUL                     <   d dl Z d dlmZ d dlZd dlmZ ddlmZmZ ddl	m
Z
 	 d dlmZ nQ# e$ rI d dlZ ej        e          dz   Zej                             ej        ed	                     d dlmZ Y nw xY w G d
 d          Z G d d          Zdi fdZdS )    N)path)framework_pb2   )coreunique_name)OpProtoHolder)pass_desc_pb2z/../../baseprotoc                   B    e Zd Zg Zdi fdZd Zd Zd Zd Zd Z	d Z
d	S )
RegisterPassHelper c                 n    || _         || _        || _        t          j                            |            d S N)
_pass_type_pass_pairs_input_specsr   _register_helpersappend)self
pass_pairs	pass_typeinput_specss       Y/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/incubate/passes/ir.py__init__zRegisterPassHelper.__init__%   s6    #%',33D99999    c                    g }t          j        |          }|j        D ]}| j                            |          }t          |t          j        j                  r:|	                    t                              ||j        |j                             ut          |t          j                  r(|	                    t          j        |                     |	                    t                              |dg                     |S )N)inspectgetfullargspecargsr   get
isinstancepaddlestatic	InputSpecr   PassDesc	VarHelpershapedtype	ParamAttr)r   funcr    	arg_specsarg_name
input_specs         r   _get_args_from_funcz&RegisterPassHelper._get_args_from_func+   s    *400	! 	@ 	@H*..x88J*fm&=>> 	@&& *"2J4D    
 J(899 @F,X667777H..x">>????r   c                    |D ]}t          j        |j                                                  }g }|j        D ]}|j        dvrh|                                }t          |          dk    rA|                                d         d         }|                    |j                  }||k    rs|	                    |           |D ]}|j        
                    |           d S )N)op_namescopeop_callstack	op_devicer   r   )r   get_op_attrs_default_valuetypeencodeattrsname
ListFieldslenr!   r   remove)	r   opsop_descdefault_attrsremove_attrsattrattr_list_fields
attr_valuedefault_attr_values	            r   _prune_program_descz&RegisterPassHelper._prune_program_desc<   s    	+ 	+G ;##%% M L * *9 %  
 (,'8'8$+,,11%)__%6%6r%:2%>
-:->->ty-I-I*-;;$##D))))$ + +$$T****++	+ 	+r   c                 >   g }t           j                                        }t           j                                        }t           j                            ||          5  |                     |          }|                    |            || }t          |t          t          f          s|g}|D ]}t          |t          j
                  rl|                                }	t          |	          dk    rt          d|j         d          |	                                D ]}
|                    |
           |                    |           	 d d d            n# 1 swxY w Y   |                                j        }t'          |                                          D ]N}|                                                    |                    |                                                     O|                     |           ||                                j        fS )N   
Operator 'z;' has multiple outputs, please specify one output variable.)r#   r$   Programprogram_guardr/   extendr"   listtupler&   OpHelperOutputsr:   
ValueError_typevaluesr   current_blockdescrangeop_sizeaddParseFromStringopserialize_to_stringrD   r<   )r   r+   r<   varsprogramstartup_programr    outsoutop_outsop_out
block_descis                r   _func_to_program_descz(RegisterPassHelper._func_to_program_descU   s<   -'')) -//11]((/BB 	% 	%++D11DKK4;DdT5M22 v 
% 
%c8#455 	%!kkmmG7||q(((oooo   #*.."2"2 , ,F++++, KK$$$$
%	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%" **,,1
z))++,, 	N 	NAGGII%%jmmA&6&6&J&J&L&LMMMM  %%%W**,,000s   C/EE"Ec                   
 
fd
t          ||          D ]1\  }}|j                                        }|j        |_        |j        |_        |j        }|j        | j        v r|                                }|                    d          	                    |j
                   d|j        _        t          j        j        |j        _        |j        j                            |j                   t&          j        j        j        |_        t(          j        |j        k    r)|j                                        D ]}	 
||	g           3d S )Nc                 v    |D ]4}|j         r|                     |j                     | |j                   5d S r   )
_conditionr   	_elements)
conditionselementselement_add_element_conditionss      r   rk   zNRegisterPassHelper._convert_vars_to_pass_desc.<locals>._add_element_conditionsq   s[    # G G% :%%g&8999''
G4EFFFFG Gr   r(   r   )zipvar_mapsrV   r8   pattern_varreplace_varvar_attr_conditionsr   Attr_to_pass_desc_attrr@   condition_valuer   AttrTypeLONGSr5   longsrJ   r(   r	   r&   ConditionTypekEQr'   	__class___attrsrQ   )r   patternsreplacesrS   patternreplacevar_maprh   	conditionr@   rk   s             @r   _convert_vars_to_pass_descz-RegisterPassHelper._convert_vars_to_pass_descp   sP   	G 	G 	G 	G 	G !$Hh 7 7 	@ 	@GWm''))G"),G"),G1J|t000&NN,,	W%%88HHH13	).1>1G1M	).)/66w}EEE!.!7!E!I	!W%666#N1133 @ @D++J????#	@ 	@r   c                    |D ]}t          |t          j                  r|j                                        D ]}|j        }t          j        |          r ||          }|j        	                                }|
                    |j                   |
                    |j                   |j        |j                            |j                   d S r   )r"   r&   rM   rz   rQ   _mappedr   
isfunctionop_attr_mapsrV   rr   pattern_attrreplace_attr
_operation	operationCopyFrom)r   r{   r|   rS   r~   r@   mappedattr_maps           r   _convert_ops_to_pass_descz,RegisterPassHelper._convert_ops_to_pass_desc   s     	G 	GG'8#455 
G#N1133 	G 	GD!\F)&11 2!'!1!1#04466H--h.CDDD++H,ABBB(4 *33F4EFFF	G 	Gr   c                    t          j                    }|rt          j                     t          j                    }| j        |_        | j        D ]\  }}|j        	                                }| 
                    ||j                  \  }}| 
                    ||j                  \  }}	|                     |||           |                     ||	|           |rt          j                     |                                S r   )r#   in_dynamic_modeenable_staticr	   MultiPassDescr   r   r   
pass_descsrV   rc   r}   r~   r   r   disable_staticSerializeToString)
r   switch_static_modemulti_pass_descr}   r~   	pass_descpattern_varspattern_opsreplace_varsreplace_opss
             r   SerializeMultiPassDescz)RegisterPassHelper.SerializeMultiPassDesc   s   #355 	# """'577$(O! !% 0 	P 	PGW'26688I(,(B(B*) )%L+ )-(B(B*) )%L+ ++lI   **;YOOOO 	$!###00222r   N)__name__
__module____qualname__r   r   r/   rD   rc   r   r   r    r   r   r   r   "   s        -/R : : : :  "+ + +21 1 16@ @ @4G G G3 3 3 3 3r   r   c                       e Zd Z G d d          Z G d dej        j                  Z G d d          Z e            Z	dS )r&   c                   ^    e Zd ZddZd Zd Zd ZddZd Zd Z	d	 Z
d
 Zd Zd Z	 ddZdS )PassDesc.AttrHelperNc                 v    || _         || _        d | _        || _        g | _        d | _        d | _        d | _        d S r   )_obj_name_operation_type_element_indexrg   r   rf   r   )r   objr8   element_indexs       r   r   zPassDesc.AttrHelper.__init__   s@    DIDJ#'D "/DDN"DO"DODLLLr   c                     t                               | j        | j        |          }| j                            |           |S )Nr   )r&   
AttrHelperr   r   rg   r   )r   indexrj   s      r   __getitem__zPassDesc.AttrHelper.__getitem__   sD    ))	4:U *  G N!!'***Nr   c                 ^   t          | j        t          j                  r-t          j        j        j        |_        | j        j        |_	        n,t          j        j        j
        |_        | j        j        |_        | j        |_        | j        | j        |_        | j        | j        |_        d S d S r   )r"   r   r&   r'   r	   RoleType	kVariableroler8   var_name	kOperator_indexop_indexr   r   r   r   r   )r   pass_desc_attrs     r   rr   z&PassDesc.AttrHelper._to_pass_desc_attr   s    $)X%788 ;&3&<&E&O#*.).''&3&<&E&O#*.)*:'"&*N#/+/+?("./3/B,,, /.r   c                     d|_         t          |t                    rt          j        j        |_        ||_        d S t          d          )Nr   z"Unimplemented transform operation.)	r8   r"   intr   rt   INTr5   rb   NotImplementedError)r   valueop_desc_attrs      r   _to_op_desc_attrz$PassDesc.AttrHelper._to_op_desc_attr   sE     "L%%% P$1$:$>!!&)*NOOOr   c                    t                               | j        | j        | j                  }| j                            |           |	||_        |S t          j         	                                }||_
        t          |t           j                  r|                    |j                   n|                     ||j                   ||_        | j        |_        |S r   )r&   r   r   r   r   rg   r   r   r	   	Operationr5   r"   rr   r@   r   r   r   )r   r5   r   r@   r   s        r   _clone_with_operationz)PassDesc.AttrHelper._clone_with_operation   s    &&	4:t': D N!!$'''}'+$%.88::I!IN%!455 >((8888%%eY_==='DO#'#7D Kr   c                 V    |                      t          j        j        j        |          S r   )r   r	   r&   OperationTypekSubr   r   s     r   __sub__zPassDesc.AttrHelper.__sub__   (    --&495  r   c                 V    |                      t          j        j        j        |          S r   )r   r	   r&   r   kAddr   s     r   __add__zPassDesc.AttrHelper.__add__   r   r   c                 V    |                      t          j        j        j        |          S r   )r   r	   r&   r   kModr   s     r   ModzPassDesc.AttrHelper.Mod   r   r   c                 T    |                      t          j        j        j                  S r   )r   r	   r&   r   kSizer   s    r   SizezPassDesc.AttrHelper.Size   s&    --&4:  r   c                 ~   t           j                                        }|                     |j                   ||_        t          |t          j                  r|                    |j                   n| 	                    ||j
                   | j        r|j                            | j                   || _        d S r   )r	   r&   AttrConditionrr   r@   r5   r"   r   condition_attrr   rs   r   r   r   rf   )r   r5   r   r   s       r   _set_with_conditionz'PassDesc.AttrHelper._set_with_condition   s    %.<<>>I##IN333!IN%!455 H(()ABBBB%%eY-FGGG >#,,T_==='DOOOr   c                 Z    |                      t          j        j        j        |           d S r   )r   r	   r&   rw   rx   r   s     r   EQzPassDesc.AttrHelper.EQ  s2    $$&48%    r   r   c                 z    t          |g          rt          d          d }fd}||n|| _        d S )Nz#Only mapped one of which var or op.c                      t          d          )Nz'Mapping to variable is not implemented.)r   )r   s    r   
mapped_varz5PassDesc.AttrHelper.MappedPattern.<locals>.mapped_var  s    )=  r   c                     fd| D             }t          |          k    rt          d d d          t                              |                   S )Nc                 *    g | ]}|j         k    |S r   rP   ).0orX   s     r   
<listcomp>zHPassDesc.AttrHelper.MappedPattern.<locals>.mapped_op.<locals>.<listcomp>  s     ???QBqr   zIndex '' of operator 'z' is incorrect.r   )r:   rO   r&   r   )r   r<   r   r   r8   rX   s     r   	mapped_opz4PassDesc.AttrHelper.MappedPattern.<locals>.mapped_op  s    ????+???s88u$$$K%KKKKK    **JM +   r   )allrO   r   )r   varrX   r   r8   r   r   r   s     ````  r   MappedPatternz!PassDesc.AttrHelper.MappedPattern  sv     C9~~ H !FGGG  
        ),99DLLLr   r   )NNr   NN)r   r   r   r   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s        	  	  	  	 	 	 		C 	C 	C	P 	P 	P	 	 	 	$	 	 	
	 	 	
	 	 	
	 	 	

	( 
	( 
	(	 	 	 HL	D 	D 	D 	D 	D 	Dr   r   c                        e Zd Zd Zd Zd ZdS )PassDesc.VarHelperc                     t           j                                                                        }t          j        j        |i || _        i | _        d S r   )r#   r$   default_main_programrR   data_varrz   )r   r    kwargsblocks       r   r   zPassDesc.VarHelper.__init__)  sE    M6688FFHHE*D;F;;DIDKKKr   c                 ,    t          | j        |          S r   )getattrr   )r   r8   s     r   __getattr__zPassDesc.VarHelper.__getattr__.  s    49d+++r   c                     | j                             |          }|%t                              | |          }|| j         |<   |S r   rz   r!   r&   r   r   r8   r@   s      r   rq   zPassDesc.VarHelper.Attr1  @    ;??4((D|**466$(D!Kr   N)r   r   r   r   r   rq   r   r   r   r'   r   (  sA        	 	 	
	, 	, 	,	 	 	 	 	r   r'   c                   N    e Zd ZddZddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd ZdS )PassDesc.OpHelperTc                 
   t          |t                    sJ dt          |                       d}|d                    d | j                                        D                       z  }|dz  }d}|d                    d | j                                        D                       z  }|dz  }d}|d                    d | j                                        D                       z  }|dz  }| d| j         d	| d| d
}|S )NzCskip_op_callstack parameter's type is error, expect bool, received {z, c                 "    g | ]\  }}| d | S =r   r   kvs      r   r   z7PassDesc.OpHelper._to_readable_code.<locals>.<listcomp>?  s&    >>>1A>>>r   }c                 "    g | ]\  }}| d | S r   r   r   s      r   r   z7PassDesc.OpHelper._to_readable_code.<locals>.<listcomp>E  s&    ===1A===r   c                 "    g | ]\  }}| d | S r   r   r   s      r   r   z7PassDesc.OpHelper._to_readable_code.<locals>.<listcomp>J  s&    #O#O#O41aqJJ1JJ#O#O#Or   z = z(inputs=))	r"   boolr5   join_outputsitems_inputsrz   rP   )r   skip_op_callstackoutputs_str
inputs_str	attrs_strop_strs         r   _to_readable_codez#PassDesc.OpHelper._to_readable_code9  sA   /66  oVZ[lVmVmoo 6 K499>>(;(;(=(=>>>  K 3KJ$))==(:(:(<(<===  J #JI#O#O4;;L;L;N;N#O#O#OPPPII#VV
VVJVV)VVVFMr   Nc                     || _         d S r   r   )r   r5   s     r   r   zPassDesc.OpHelper.__init__P  s    DJJJr   c                 b    t                               |          }|                                 |S r   )r&   rM   Init)r   r8   rX   s      r   r   zPassDesc.OpHelper.__getattr__S  s'    ""4((BGGIIIIr   c                 p   t          |          dk    rt          d          |                                D ]P\  }}| j                            |          }|t          d| j         d| d          t          |t          t          f          r/t          |          dk    rt          d| d| j         d          n|g}|D ]}t          |t          j
                  rl|                                }t          |          d	k    rt          d
|j         d          |                                D ]}|                    |           |                    |           | j                            |d |D                        Rt"          j                                                                        }	| j                                        D ]c\  }
}t-          j        | j                  }|                    |	                    |                     | j                            |
|g           d| S )Nr   z6Each input argument needs to specify a parameter name.rG   z' does not have input named ''.zInput 'r   z' cannot be empty.rF   z!The size of outputs of operator 'z5' is not equal 1, please specify one output variable.c                     g | ]	}|j         
S r   r8   r   rb   s     r   r   z.PassDesc.OpHelper.__call__.<locals>.<listcomp>u  s    .H.H.H!qv.H.H.Hr   r  )r:   rO   r  r  r!   rP   r"   rK   rL   r&   rM   rN   rQ   rJ   r   _desc	set_inputr#   r$   r   rR   r  r   generate
create_var
set_output)r   r    r   in_namein_argsop_inputin_argr_   r`   r   out_name	op_outputop_output_names                r   __call__zPassDesc.OpHelper.__call__X  sq   4yy1}} L   %+LLNN J J <++G44#$YTZYYgYYY   ge}55 (7||q(((\g\\dj\\\   )
  'iG% 
0 
0F!&(*;<< 	0"(.."2"2w<<1,,", !HFL  !H  !H  !H# #  '.nn&6&6 4 4F$OOF33334 !////
$$W.H.Hx.H.H.HIIIIM6688FFHHE'+}':':'<'< B B#)!,!5dj!A!A  !1!1~!1!F!FGGG
%%h0@AAAAKr   c                 h   t           j                                                                        }t	          j                    j                            | j                  | _	        | j	        t          d| j         d          t          |j                  | _        |j                                        | _        | j                            | j                   i | _        d | j	        j        D             | _        d | j	        j        D             | _        |j                            |            d S )Nz)type object 'OpHelper' has no attribute ''c                     i | ]
}|j         g S r   r  r  s     r   
<dictcomp>z*PassDesc.OpHelper.Init.<locals>.<dictcomp>  s    CCC1AFBCCCr   c                     i | ]
}|j         g S r   r  )r   r   s     r   r'  z*PassDesc.OpHelper.Init.<locals>.<dictcomp>  s    EEEAQVREEEr   )r#   r$   r   rR   r   instanceop_proto_mapr!   rP   _protoAttributeErrorr:   r<   r   rS   	append_opr  set_typerz   inputsr  outputsr  r   )r   r   s     r   r  zPassDesc.OpHelper.Init}  s   M6688FFHHE'022?CCDJOODK{"$M
MMM   ei..DK--//DJJ
+++DKCC0BCCCDLEE1DEEEDMIT"""""r   c                     | j                             |          }|%t                              | |          }|| j         |<   |S r   r   r   s      r   rq   zPassDesc.OpHelper.Attr  r   r   c                     t          |t          j                  r||                     |          _        d S | j                            ||           d S r   )r"   r&   r   rq   r   r  	_set_attr)r   r8   r   s      r   SetAttrzPassDesc.OpHelper.SetAttr  sM    %!455 2*/		$'''
$$T511111r   c                 t    | j                             |          }|t          d| j         d| d          |S )NrG   z' does not have output named 'r  )r  r!   rO   rP   )r   r8   outputs      r   OutputzPassDesc.OpHelper.Output  sM    ]&&t,,F~ SSS4SSS   Mr   c                     | j         S r   )r  r   s    r   rN   zPassDesc.OpHelper.Outputs  s
    = r   c                     |                                 D ]C\  }}|| j                            |           "| j                            ||j        g           Dd S r   )r  r  remove_outputr  r8   )r   r   paramargs       r   
SetOutputszPassDesc.OpHelper.SetOutputs  sd    $llnn = =
s;J,,U3333J))%#(<<<<	= =r   )Tr   )r   r   r   r  r   r   r#  r  rq   r4  r7  rN   r=  r   r   r   rM   r   8  s        	 	 	 	.	 	 	 		 	 	
#	 #	 #	J	# 	# 	#	 	 		2 	2 	2	 	 		! 	! 	!	= 	= 	= 	= 	=r   rM   N)
r   r   r   r   r#   r$   Variabler'   rM   OPr   r   r   r&   r&      s        sD sD sD sD sD sD sD sDj    FM*    q= q= q= q= q= q= q= q=f 
BBBr   r&   c                 Z    d fd}t          j        |           r ||           S |S )a  
    The function decorator of Register Pass. Decorator @RegisterPass handles
    the function and register it into a core.Pass instance. Use name of function
    as Pass type.

    Args:
        function (callable): The function with return of callable pair(s) that
            represents the pattern subgraph and the replace subgraph.
        input_specs (dict[str, InputSpec]): Dict of InputSpec to specific the shape/dtype
            information of Tensor. Some operators limit the shape and dtype of datas when
            create subgraph with Paddle APIs. So user need specify InputSpec of data to
            ensure create a correctly subgraph. Of course, this argument is not limited to
            matching subgraph. The default is dict().

    Returns:
        callables: Callable pair(s).

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.incubate.passes.ir import RegisterPass

            >>> @RegisterPass
            >>> def multi_add_to_addn():
            ...    def pattern(x, y, z):
            ...        return paddle.add(paddle.add(x, y), z)
            ...    def replace(x, y, z):
            ...        return paddle.add_n([x, y, z])
            ...    return pattern, replace
    c                     t          | t          t          f          r<t          |           dk    r)t	          t          t          j        |                     rdS dS )N   TF)r"   rK   rL   r:   r   mapr   r   )
check_pairs    r   _is_pass_pairz#RegisterPass.<locals>._is_pass_pair  sP    j4-00 	 :!##s7-z::;;  4ur   c                    | j         }t          j        |           }t          |j                  dk    rt          d          t          |j                  dk    rp |             } |          r|g}n,t          t          |                    st          d          t          ||          }t          j        ||j                   | S )Nr   z2Pass function with parameter is not supported now.z;Return value of Pass function must be (callable, callable).)r   r   	signaturer:   
parametersr   r   rC  rO   r   r   register_passr   )python_funcr   rG  r   helperrE  r   s        r   	decoratedzRegisterPass.<locals>.decorated  s    (	%k22	y#$$q((%D   %&&!++$J}Z(( (\

]J7788  Q   (
I{KKFy&*GHHHr   )r   r   )functionr   rL  rE  s    ` @r   RegisterPassrN    s]    B       & (## #y"""r   )r   osr   r#   paddle.base.protor   baser   r   base.frameworkr   r	   ModuleNotFoundErrorsysdirname__file__	base_pathr   r  r   r&   rN  r   r   r   <module>rX     s|           + + + + + + % % % % % % % % + + + + + +0/////// 0 0 0JJJX&&6IHOOIDIi11222////////0M3 M3 M3 M3 M3 M3 M3 M3`y y y y y y y yx B > > > > > >s   + AA98A9