
    zj[                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ g ZdZdZdZdZdZdZ dZ!d Z"d Z#d Z$d Z%d Z&d Z'ed             Z(ed             Z)d Z*ed             Z+d Z,d3dZ-ed             Z.d Z/ G d  d!          Z0	 d4d"Z1d# Z2d$ Z3d4d%Z4	 d5d'Z5d( Z6d) Z7d* Z8d+ Z9	 d4d,Z:	 d4d-Z;d. Z<d/ Z=	 d3d0Z> G d1 d2ej?                  Z@dS )6    N)_legacy_C_ops)backwardcore	frameworkunique_name)
check_type)switch_to_static_graph)OpProtoHolder)in_dynamic_mode)LazyInitializedadd_build_strategy_for)construct_grad_names)layersz.pdmodelz
.pdiparamsz.pdiparams.infoz.metaloadparambufferc                 <   t          | d          5 }|                                }d d d            n# 1 swxY w Y   t          j        |          }t          j        |                                          s%t          d|                                 d          |S )NrbzUnsupported program version: 
)openreadr   ProgramDesc_is_program_version_supported_version
ValueError)model_file_pathfprogram_desc_strprogram_descs       k/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/jit/translated_layer.py_load_program_descr!   .   s    	ot	$	$ $6688$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ #$455L-l.C.C.E.EFF 
GL,A,A,C,CGGG
 
 	
    266c                    |                                  t          j        j        j        k    s|                                  t          j        j        j        k    sX|                                  t          j        j        j        k    s,|                                  t          j        j        j        k    rdS |                                 S )NF)	typer   VarDescVarTypeFEED_MINIBATCH
FETCH_LISTREADERRAWpersistable)var_descs    r    _is_persistabler-   ;   s    4</>>>==??dl2=====??dl2999==??dl2666u!!!    c                    g }t          |                                          D ]}|                    |          }t          |                                          D ]T}|                    |          }|                                 |                                v r|                    |           Ut          |                                          D ]}|                    |          }t          |                                          D ]H}|                    |          }|                                 |                                v r	||v rD  dS IdS NFT)	range
num_blocksblockop_sizeopnameinput_arg_namesappendoutput_arg_names)persistable_var_descr   	input_ops	block_idxr3   op_idxr5   s          r    _is_parameterr>   F   s\   I<224455 % %	""9--EMMOO,, 	% 	%F&!!B#((**b.@.@.B.BBB  $$$		% <224455 	! 	!	""9--EMMOO,, 	! 	!F&!!B#((**b.A.A.C.CCC?? 555 D	! 4r.   c           
      
   g }t          |                                           D ]^}|                     |          }|                    t	          t          t          |                                                               _|S N)r1   r2   r3   extendlistfilterr-   all_vars)r   persistable_varsir3   s       r    _get_persistable_varsrG   ^   sy    <**,,-- Q Q""1%%VOU^^=M=M%N%N O OPPPPr.   c                     g }t          |           }|D ])}|                    |                                           *|S )z<
    Get all persistable variable names in ProgramDesc.
    )rG   r8   r6   )r   	var_namesrE   vars       r    _get_persistable_var_namesrK   f   sK     I,\:: % %$$$$r.   c                    t                      }t          |                                           D ]U}|                     |          }|                                D ])}|                    |                                           *V|S r@   )setr1   r2   r3   rD   addr6   )r   all_var_namesrF   r3   rJ   s        r    _get_all_var_namesrP   q   s    EEM<**,,-- * *""1%%>>## 	* 	*Cchhjj))))	*r.   c                 f    t           }t          j        d                    | |f                    }|S )zo
    Append loaded suffix to the given variable name
    e.g. x ==> x.load_0, x.load_0 ==> x.load_0.load_0
    .)LOADED_VAR_SUFFIXr   generate_with_ignorable_keyjoin)r6   suffixnew_names      r    _append_loaded_suffixrX   z   s.     F6sxxv7O7OPPHOr.   c                 *    t          j        |           S r@   )r   rT   prefixs    r    _generate_unique_var_namer\      s    26:::r.   c                    i }t          |           }|D ]*}|                                }t          |                                          }|||<   |                    |           t	          |                                           D ]}|                     |          }|                    |                                |                                           t	          |	                                          D ]C}|
                    |          }	|	                    ||           |	                    ||           D,|S r@   )rG   r6   rX   set_namer1   r2   r3   _rename_varencoder4   r5   _rename_input_rename_output)
r   suffix_varname_dictrE   r,   old_namerW   r<   r3   r=   r5   s
             r    _append_loaded_suffix_to_varre      s7   ,\::$ 6 6==??(99(0H%(###|668899 	6 	6I &&y11Ehoo//1B1BCCC00 6 6XXf%%  8444!!(H55556	6 r.   c                 *    t          j        |           S r@   )r   generaterZ   s    r    0_generate_unique_var_name_sync_with_main_programrh      s    '''r.   c                 p    i }t          |           }|D ]!}|                                }||         ||<   "|S r@   )rG   r6   )r   all_new_old_dict_allnew_old_dictrE   r,   name_news         r    _get_loaded_var_new_oldrm      sK    L,\::$ @ @==??!5h!?Xr.   c                 *	   i }i }g }t          |                                           D ]U}|                     |          }|                                D ])}|                    |                                           *Vd}	t          |                                           D ]O}|                     |          }t          |                                          D ]\  }
}|                                }d|v }|	p|}	|du s||v o
|du p||vo| }|r|                    d          }t          |          dk    r8|d         	                                rd
                    |dd                   }n|}	 t          |          }||d|
         ||
dz   d         z   vrn+n|}||k    r:|                    |                                |                                           |s
|||<   |||<   Q|	ri }|D ]}t          |                                           D ]{}|                     |          }t          |                                          D ]B\  }
}|                                }d|v r%||v r!|                    |||                   }|||<   C||D ]}||         ||<   ||||         <   t          |                                           D ]}|                     |          }t          |                                          D ]l}|                    |          }|                                D ]}||v r|||         k    r|                    |||                    |                    |                                          r@|                    |                                ||                                                    |                                D ]}||v r|||         k    r|                    |||                    |                    |                                          r@|                    |                                ||                                                    n|                                  ||fS )a  
    Change the name of the loaded variables.Use 'unique_name.generate' to avoid duplication.
    It is used when loading multiple program during inference.

    e.g. linear_0.tmp_3 ==> linear_0.tmp_1, x ==> x_0. For double grad, x@GRAD ==> x_0@GRAD
    If 'include' is not `None`,variables in include and the corresponding
      double grad variables (if exist) are renamed.
    If 'exclude' is not `None`,variables that are in exclude and the
      corresponding double grad variables (if exist) are not renamed.

    Args:
        program_desc(ProgramDesc):the variables in it will be modified.
        include(List):list of names of variables.
        exclude(List):list of names of variables.

    Returns:
        tuple of (dict_rename_var_new_old, dict_rename_var_old_new)
        dict_rename_var_new_old is a dict mapping from new name to old name
        dict_rename_var_old_new is a dict mapping from old name to new name
    Fz@GRADN_   )r1   r2   r3   rD   r8   r6   	enumeratesplitlen	isnumericrU   rh   r_   r`   replacer4   r5   r7   ra   has_varr9   rb   flush)r   includeexcludedict_rename_var_old_newdict_rename_var_new_old	old_namesb_idx	cur_blockrJ   has_double_gradvar_idxname_oldis_double_grad_varshould_rename	temp_namerl   double_grad_rename_dictvar_namenew_var_namer=   r5   input_arg_nameoutput_arg_names                          r    _rename_var_program_descr      s   * ! I|..0011 ) ) &&u--	%%'' 	) 	)CSXXZZ((((	)
 O|..0011  =  = &&u--	%i&8&8&:&:;; 	= 	=LGSxxzzH!(H!4-C1COD7H$7 +_?(?+** 
  $$NN3//	y>>A%%)B-*A*A*C*C% #3B3 8 8II (IO!   H !('2Yw{}}5MMN N  #8##%%hoo&7&79J9JKKK% =4<'14<'1=	=B  "$/ 		I 		IH|668899 I I(..u55	$-i.@.@.B.B$C$C I ILGS"xxzzH(**x8/C/C'/'7'7$&=h&G( ( =I/9II 0 	 	H0G1#H-  $$;H$EFF
 |..0011 % % &&u--	I--//00 #	 #	Ff%%B"$"4"4"6"6  !%<<<&2>BC C ((*3NC   %,,^-B-B-D-DEE %11 . 5 5 7 7 7$2!""(&((	   $&#6#6#8#8  "&==='2?CD D ))+3OD   %,,_-C-C-E-EFF %11 / 6 6 8 8 7$3!""(&((	  '#	H "$;;;r.   c                     t          j                    | _        fdt          j                                                  D             _                                         S )Nc                 :    g | ]}t          j        |          S  )r   Block).0rF   progs     r    
<listcomp>z*_build_program_by_desc.<locals>.<listcomp>1  s2       %&	a    r.   )r   Programdescr1   r2   blocks_sync_with_cpp)r   r   s    @r    _build_program_by_descr   -  sq    DDI   */	0D0D0F0F*G*G  DK 	Kr.   c                 @   t          |                                           D ]{}|                     |          }t          |                                          D ]B}|                    |          }|                    d          r|                    d|           C|d S )Nis_test)r1   r2   r3   r4   r5   has_attr	_set_attr)r   r   rF   r3   jr5   s         r    _change_is_test_statusr   8  s    <**,,-- 1 1""1%%u}}'' 	1 	1A!B{{9%% 1Y000	11 1r.   c                       e Zd ZdZ fdZed             Zed             Zed             Z	ed             Z
ed             Zed             Zed	             Zed
             Zed             Zed             Zed             Zed             Zed             Zd Zed             Zed             Zed             Z xZS )_ProgramHolderz
    Holds the execution information of a Program.

    _ProgramHolder is the execution unit of TranslatedLayer,
    if TranslatedLayer contains multiple _ProgramHolder,
    it can execute multiple methods

    _ProgramHolder is an internal concept.
    c                     t                                                       g | _        g | _        g | _        i | _        t          j                    | _        d | _	        | 
                    |          | _        d S r@   )super__init___input_descs_output_descs_persistable_names_grad_var_namesr   Scope_inner_scope_suffix_varname_dict_preprocess_infer_program_desc)selfr   	__class__s     r    r   z_ProgramHolder.__init__M  sq     "$! !JLL %)!#'#3#3L#A#A   r.   c                     t          | j                  }| j                            d                                          }|dk    rt          |d|          S |S Nr   )r   train_programr   r3   r4   r   )r   whole_programend_op_indexs      r    _create_forward_train_programz,_ProgramHolder._create_forward_train_program_  sW    .t/ABB/55a88@@BB!)-LIII  r.   c                 4    |                                  j        S r@   )r   r   r   s    r    _forward_program_descz$_ProgramHolder._forward_program_desch  s    113388r.   c                 n   t          | j                  }| j                            d                                          t          | j                  z   }|j                            d                                          }||k     rt          |||          S t          j
                                        S r   )r   r   r   r3   r4   rt   r   r   r   paddlestaticr   )r   r   start_op_indexr   s       r    _create_backward_train_programz-_ProgramHolder._create_backward_train_programm  s    .t/ABB177::BBDDsH
 H
 
 %)//22::<<L(()~|   =((***r.   c                 4    |                                  j        S r@   )r   r   r   s    r    _backward_program_descz%_ProgramHolder._backward_program_desc{  s    224499r.   c                     | j         S r@   )r   r   s    r    infer_programz_ProgramHolder.infer_program  s    ''r.   c                 6    |                      | j                  S r@   )_append_backward_descr   r   s    r    r   z_ProgramHolder.train_program  s    ))$*BCCCr.   c                     | j         S r@   )r   r   s    r    forward_programz_ProgramHolder.forward_program  s    ))r.   c                     | j         S r@   )r   r   s    r    backward_programz_ProgramHolder.backward_program  s    **r.   c                     | j         S r@   )r   r   s    r    input_descsz_ProgramHolder.input_descs        r.   c                     | j         S r@   )r   r   s    r    output_descsz_ProgramHolder.output_descs  s    !!r.   c                     | j         S r@   )r   r   s    r    persistable_namesz _ProgramHolder.persistable_names  s    &&r.   c                     | j         S r@   )r   r   s    r    scopez_ProgramHolder.scope  r   r.   c                     | j         S r@   )r   r   s    r    grad_var_namesz_ProgramHolder.grad_var_names  s    ##r.   c                    t          |          }t          ||          \  }}g }|                    d          }t          |                                          D ]}|                    |          }|                                dk    r|                    |           |                    d          d         	                                }	|
                    |	           | j                            |                    |                    d          d         	                                                     |                                dk    r|                    d          d                             d          r|                    |           |                    d          d         	                                }
|
                    |
           | j                            |                    |                    d          d         	                                                     |                                dk    r|                    |           |                    d          d         	                                }|
                    |           |                    d          d                             d          sX| j                            |                    |                    d          d         	                                                     |                    d          r|                    d           t%          |          D ]}|                    ||d	z              | j                                         t+          |          }|                     |           t/          ||          | _        t          |          | _        |S )
Nr   feedXOutscalezsave_infer_model/scale_fetchop_callstackrp   )rK   r   r3   r1   r4   r5   r$   r8   inputr`   _remove_varr   find_varoutput
startswithr   r   remove_attrreversed
_remove_opreverser   _append_scale_to_outputrm   r   r   )r   r   list_persistable_varrename_new_old_dictro   ops_to_remove
root_blockrF   r5   feed_var_nameout_var_namefetch_var_namer=   tmp_programs                 r    r   z_ProgramHolder._preprocess  s   9,GG!9."
 "
Q
 !''**
z))++,, 	3 	3Aq!!BwwyyF""$$Q''' "a 0 7 7 9 9&&}555!((''		%(8(8(;(B(B(D(DEE    g%%"))E*:*:1*=*H*H)+ +% $$Q'''!yy//299;;&&|444"))''a(8(?(?(A(ABB    g%%$$Q'''!#5!1!1!!4!;!;!=!=&&~666xx}}Q'223LMM &--"++BHHSMM!,<,C,C,E,EFF   ;;~.. 3NN>222}-- 	6 	6F!!&&1*5555 	!!### -\:: 	$$[111 %<-%
 %
!
 #=\"J"Jr.   c                    | j         D ]'}|                                t          j        k    r d S (g }t	          j        |          5  t          | j                   D ]m\  }}|                                                    |	                                          }t          j
        |dd|           }|                    |           n	 d d d            n# 1 swxY w Y   t          |          D ]\  }}|j        | j         |<   d S )Ng      ?ztranslated_layer/scale_r6   )r   dtyper   boolr   program_guardrr   global_blockrJ   r6   r   r8   r   )r   programout_descscale_output_varsrF   outrJ   s          r    r   z&_ProgramHolder._append_scale_to_output  sa    * 	 	H~~6;.. / $W-- 	. 	.#D$677 . .3**,,00<<l32OA2O2OPPP!((----.	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.   122 	- 	-FAs$'HDq!!	- 	-s   BCCCc                    t          j        |          }t          |d           t          |          }t	          |j                  D ]C}|                    |          }|j        D ]"}|j        dk    rd|j	        vs&t          |                    d                    dk    r|                    t          j        d                    ddg                    |                    |                    d          d                   j        t           j        j        j        dd	
          }|j                            d|j        g           t3          j                                        |j                  st3          j                                        |j                  }d}	|j        D ]}
|
j        r|
j        }||j	        vrd	}	|                    t          j        d                    |j        dz   |z   dg                    t           j        j        j        dd	          }|j                            ||j        g           |	r>|j                            |j                   |j                             |j                   $E|S )NF
batch_normReserveSpacer   rR   reserve_spacetmpr   T)r6   r   r$   r+   stop_gradientro   )r6   r$   r+   r   )!r   r   r   r   r1   r2   r3   opsr$   output_namesrt   r   
create_varr   rT   rU   rJ   r   r   r%   r&   DENSE_TENSORr   
set_outputr6   r
   instancehas_op_protoget_op_protooutputsintermediateinfer_var_typeinfer_shape)r   infer_program_descprogram_desc_copyr   r<   r3   r5   r   protohas_create_intermediate_outoutput_protointermediate_nameintermediate_vars                r    _get_train_forward_programz)_ProgramHolder._get_train_forward_program  s    ,-?@@ 	0%888 )):;; w122 2	4 2	4IMM),,Ei 04 047l**&bo==ryy8899Q>>(-(8(8!,!H #/5)A B B" " #())BHHSMM!,<"="="C!%!5!B(-*. )9 ) ) **>M<N;OPPP
 %-//<<RWEE %.00==bgFF.3+$)M  L#0 ,8,=),BOCC:>7/4/?/?%0%L$'HH,.GcM<M,M,1)*%& %&&" &" &*\%9%F,1.2 0@ 0 0, G.. 14D4I3J   / 4G**5:666G''
333a04d r.   c                 
   |                      |          g }| j        D ]N}|                                                                        |                                                     Ot          |dt          j        t          t          fd           t          j        |g           }fd| j        D             }fd| j        D             }fd| j        D             }t          ||||          | _        j        S )Ntargetszpaddle.static.gradients)r  inputsc                     g | ]<}                     d                               |                                          =S r   r3   rJ   r6   r   r   r   s     r    r   z8_ProgramHolder._append_backward_desc.<locals>.<listcomp>_  sH     
 
 
26GMM!  --
 
 
r.   c                 `    g | ]*}                     d                               |          +S r  )r3   rJ   )r   r6   r   s     r    r   z8_ProgramHolder._append_backward_desc.<locals>.<listcomp>b  s@     
 
 
+/GMM!  &&
 
 
r.   c                     g | ]<}                     d                               |                                          =S r  r  r  s     r    r   z8_ProgramHolder._append_backward_desc.<locals>.<listcomp>e  sH     
 
 
26GMM!  --
 
 
r.   )r  r   r8   r   rJ   r6   r   r   VariablerB   tupler   calc_gradient_helperr   r   r   r   r   )	r   r  r  r   grad_info_mapx_vars
param_varsout_varsr   s	           @r    r   z$_ProgramHolder._append_backward_descM  sW   112DEE% 	C 	CCNN7//1155chhjjAABBBB 	u-%		
 	
 	
 !5B
 
 

 
 
 
:>:K
 
 

 
 
 
373J
 
 


 
 
 
:>:L
 
 
  46:x 
  
 |r.   )__name__
__module____qualname____doc__r   r	   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r  r   __classcell__r   s   @r    r   r   B  s        B B B B B$ ! ! ! 9 9 _9 + + + : : _: ( ( X( D D _D * * X* + + X+ ! ! X! " " X" ' ' X' ! ! X! $ $ X$Q Q Qf - - -" B B BH       r.   r   c                 n   t          |j                  }i }|D ]f}|j        |                                         }t	          ||j                  rbt          j        |                                |                                |                                |	                                d          }nat          j
        |	                                |                                |                                |                                d          }|Lt          j                                        di d|idt          j                            | |          i           d|_        |||                                <   h|g }d	 |j                                        D             }	t%          |	                                          D ]#}
|                    ||	|
                             $t          j                                        d
i d|idt          j                            | |          i           |D ]9}t	          ||j                  s||                                         }d|_        :t+          |j                  }|D ])}|t/          j                    z   }||vrd||         _        *|S )NT)shaper   r6   r$   r+   )r$   r6   r&  r   r+   r   r   	file_pathr$   r  r  attrsFc                     i | ]\  }}||	S r   r   )r   kvs      r    
<dictcomp>z5_load_persistable_vars_by_program.<locals>.<dictcomp>  s+     
 
 
QAq
 
 
r.   load_combine)rG   r   r   r6   r>   r   EagerParamBaser&  r   r$   _create_tensor_dygraph_tracertrace_opospathrU   r   itemssortedkeysr8   rP   r   r   grad_var_suffix)
model_pathprogram_holderparams_filenamerE   load_var_dicteach_varorig_each_namenew_varload_var_listdict_name_old_newr6   r   rO   r   grad_var_names                  r    !_load_persistable_vars_by_programrC    s    -^-IJJM$ 1 1'<X]]__M>#?@@ 	.nn&&nn&&]]__]]__   GG  .]]__]]__nn&&nn&&   G "%''00("BGLL^$L$LM	 1    !&)0hmmoo&&"
 
+@FFHH
 
 
 ,113344 	I 	ID  /@/F!GHHHH!##,,M*Z I IJ	 	- 	
 	
 	
 ) 	( 	(H >+GHH !(--//2E"'E '~'CDDM! 9 9 4#7#9#99--48M(#1r.   c                 z   t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   i }g }d |j                                        D             }t          |          D ]}	|	|vrt          d|	          ||	         }
||	                             dd           .t          j	        dgt          j        j        j        |
d          }nt          j        |
d          }||	         d	         |_        |||
<   |                    |           |
J d
            t"          j                            | |          }t"          j                            |          s#t+          |          dk    rt-          d          n.t          j                                        di d|id|i           |S )Nr   c                     i | ]\  }}||	S r   r   )r   keyvalues      r    r-  z*_load_persistable_vars.<locals>.<dictcomp>  s+       !sEs  r.   zdThe model to be loaded is not complete.The variable `%s` of program cannot be found in loaded model.	trainablerp   T)r&  r   r6   r+   )r6   r+   r   z#params_filename should not be None.r   z%The model to be loaded is incomplete.r.  r   r'  r(  )r   pickler   r   r5  r6  RuntimeErrorgetr   r/  r   r%   r&   FP32r0  r   r8   r3  r4  rU   existsrt   r   r1  r2  )r9  var_info_pathr:  r;  r   extra_var_infor<  r@  inv_suffix_varname_dictr6   rW   r?  var_file_paths                r    _load_persistable_varsrR    s<    
mT	"	" (aQ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( MM %3%H%N%N%P%P   .// & &~%%P   +40$##K66B.cl*/ 	  GG  .H$OOOG .t 4_ E")hW%%%% &&(M&&&GLL_==M7>>-(( 	
~!##DEEE $ 	!##,,M*.	 	- 	
 	
 	
 r"   c                 D    i }| D ]}|j         |         }| |         ||<   |S r@   )r   )var_dictr:  no_suffix_var_dictr   no_suffix_names        r    _remove_varname_suffixrW    s?     @ @'<XF-5h-?>**r.   c                 F   i }|t           j                            |          }t           j                            | |          }|d t	          t
                              }t          j        |           D ]}||k    r#d}t           j                            | |          }n|                    t
                    r|                    |          r|t	          |          t	          t
                     dz            	                    d          }t	          |          dk    rBt	          |d                   dk    r)|d         }t           j                            | |          }nt          t          |                    ||<   nt          j        |           D ]\  }}}	|	D ]y}
d|
v rst           j                            | |
          }|
                    d          }|dk    rd}n|                    dd           t          t          |                    ||<   z|S )	Nforwardrp   rR      r   modelro    )r3  r4  basenamerU   rt   INFER_MODEL_SUFFIXlistdirendswithr   rs   r   r!   walkstriprv   )r9  model_filenameprogram_holder_dictr   
model_namefilename	func_nameparsing_namesro   
file_namesr6   method_names               r    _construct_program_holdersrk    s-   !)).99',,z>BB#$>s+='>'>&>$>?

:.. 	 	H))%	"$',,z>"J"J""#566 8;N;N< <  !)
OOs+='>'>&>&BB!%**  }%%**s=3C/D/Dq/H/H -a 0I&(gll:x&H&HOO-;"?33. .	**#	* !#
 3 3 	 	Aq*" 
 
d??&(gll:t&D&DO"&**S//K"g--&/#++GR8887E*?;;8 8'4
 r.   Tc           	      $   t          |          dz   }t          j                            | |          }t          j                            | t          |                    }t          j                            |          r>t          | ||d         |          }|d t          t                              }t          j        |           D ]}	|		                    |          r|	
                    t                    rv|	t          |          t          t                     dz                                d          }
t          |
          dk    r"t          |
d                   dk    r	|
d         }nt          j                            | |          }|                    t          | |||         |	                     n:|!t          j                            |          si S t          | |d         |          }|st          ||d                   }|S )Nz.inforY  rp   rR   rZ  r   )strr3  r4  rU   rM  rR  rt   INFER_PARAMS_SUFFIXr_  r   r`  rs   updaterC  rW  )r9  programsr;  append_suffixvar_info_filenamerN  params_pathrT  re  	file_namerh  rg  s               r    _construct_params_and_buffersru  F  s    O,,w6GLL->??M',,z3+?+?@@K	w~~m$$ 
)x	':O
 
 %%@,?(@(@'@%@A
J// 	 	I##J// I4F4F#5 5  !*
OOs+>'?'?&?!&CC!%**  }%%**s=3C/D/Dq/H/H -a 0IIGLL5FGGMOO&x	/BI    	& 
	$RW^^K-H-H	$	4+_
 
  I)(HY4GHHOr.   c                     | r| nd S r@   r   )varss    r    _valid_varsrx  t  s    !44T!r.   c                 x	   g }g }t          |          D ]\  }}t          |t          j        t          j        j        f          s t          dt          |           d          t          |t          j                  rSt          j                            ||j	        |         
                                dt          j                    d          }n&|}|j	        |         
                                |_
        |                    |j
                   |                    |           | j        d |j	        D             | _        g }|j        D ]u}	| j        |	         }
|
| j        v r!|                    | j        |
                    9|
| j        v r!|                    | j        |
                    ct'          d|	 d          g }|j        D ]}t          j                            |                                |                                |
                                |                                d	          }|                    |           |j        g}| j        r|j        n|j        }| j        r|j        n|j        }|j                            d
                                          }d|                    d
          dd
d|d| j        dt>          j         !                    ||           d|g}| j        sf|"                    d|j#        $                    dg           d|j#        $                    dg           d|j#        $                    dg           f           d}|"                    d|f           |r`|"                    d|                    d
          f           | j        s/|"                    d|j%                            d
          f           tM          j'        tQ          |          tQ          |          tQ          |          |d g|R   |D ]}|j
        t	          j)                    z   }|                    d
          *                    |+                                          }|Z|,                    |                                           |}t[          |          dk    r|d
         }|S )Nz[The type of input in TranslatedLayer must be numpy array or Variable(Tensor), but received rR   FT)rG  r6   r+   place	zero_copyc                 6    g | ]}|                                 S r   r   r   inss     r    r   z _run_dygraph.<locals>.<listcomp>  s-     &
 &
 &
CHHJJ&
 &
 &
r.   zThe persistable variable z+ does not exist in current TranslatedLayer.)r   dimsr6   r$   r+   r   r   r   r   r   
program_idx_namesparam_grad_namesr   out_grad_namesr   x_grad_namesxuse_interpretorcoreforward_global_blockbackward_global_blockrp   ).rr   
isinstancenpndarrayr   eagerTensor	TypeErrorr$   r   r6   r   _current_expected_placer8   _input_args_namesr   _persistable_var_name_dict_parameters_buffersr   r   r   r&  r   _is_testr   r   r   r   r3   r4   r   utils_hash_with_idrA   r   rK  r   r   run_programrx  r8  r   r`   _set_grad_typert   )r   r   r:  
input_varsinput_var_namesrF   rG  rJ   rE   r   dy_var_nameoutput_varsr,   tmp_scope_vectrace_programr   r   r)  r  persistable_varrB  grad_varoutss                          r    _run_dygraphr  x  s.   JOe$$  5%"*dj.?!@AA 	|nrsxnyny|||   eRZ(( 	<*###/27799!799 $  CC C &1!499;;CHsx(((#!)&
 &
"0"<&
 &
 &
" "4 	 	9(C(...##H$8$EFFFFH---##H$5k$BCCCCaHaaa   K"/    j..""!!   
 
 	3 $)*M
 	*$$)  	,**+ 
 "/55a88@@BBL 	A	""=(;;E  

"-11'2>> -11%<<-11#r::		
 		
 		
 	LL')<=>>> &%%a((	
 	
 	
   	LL+"399!<<   J$%%K   
     , 8 8',t/C/E/EE &&q))22=3G3G3I3IJJ &&x}}7777 D
;11~Kr.   c                 @   t          j                    }t          |          }t          ||          \  }}|                                 t          |||| |           |                                 t          |||          }t          |          dk    r|d         }|S )Nrz   rp   r   )	r   default_main_programrK   r   rx   _append_blockr   _get_output_from_programrt   )r   r:  r  main_programparam_var_namesro   r{   r  s           r    _run_static_graphr    s    133L0??O!9" " "A    !!!#n&= D 4yyA~~AwKr.   c                     g }|dk     r|S |                      |          j        D ]}|                    |           |                      |          j        }|dk    r|t	          | |          z  }|S )z
    Get variables in current block and its parent block.

    Args:
        program(Program): The program containing the current block.
        block_idx(int): index of current block.

    Returns:
        List: list of variables.
    r   rq   )r3   rw  r8   
parent_idx_collect_current_and_parent_var)r   r<   rw  rJ   r  s        r    r  r     s     D1}}}}Y'',  Cy))4JB/DDDKr.   c                    | j         }t          | |          }t          |                     |          |                    d          |           d |j        D             }d |D             }t          |          t          |          k    r0t          dt          |           dt          |           d          t          |          D ]F\  }	}
|r||
         }
|                     |                              dd	||	         gid
|
gi           Gt          |                     |          |                    d                    }| 
                                 | j        dz
  }d}|                                dk    rt          d|                                          D ]g}|                    |          }|j        }|dk    r||z   }n|}|                     |          }t          |||           |t          ||          z  }h| 
                                 |D ]}|                    d          r|                    d          }t#          |t$          j        j                  r|j        }t#          |t$          j                  r|j        }|                    d|                     ||z                        | 
                                 || _         dS )a,  
    Append Variables and Operators in 'src_program_desc' to dest_program.

    Args:
        dest_program(Program): Variables and Operators are appended to it.
        src_program_desc(ProgramDesc): Variables in it will be appended to 'dest_program'.
        program_holder(_ProgramHolder): program_holder of TranslatedLayer
        input_variables(list): list of input variables
        dict_rename_var_old_new(None|dict): When using '_rename_var_program_desc',
        use it to map the name of the variable before it was modified and the new name.
    r   r  c                 6    g | ]}|                                 S r   r   r   inps     r    r   z!_append_block.<locals>.<listcomp>S  s     FFFCSXXZZFFFr.   c                     g | ]	}|j         
S r   r   r  s     r    r   z!_append_block.<locals>.<listcomp>T  s    77738777r.   z)The number of input is invalid, expected z, but received rR   assignr   r   )r$   r  r  rp   )r  	sub_blockN)current_block_idxr  !append_var_from_block_desc_staticr3   r   rt   r   rr   	append_op append_op_from_block_desc_staticr   r2   r1   parent_create_blockr   attrr  r   r   	BlockDescidr   idxr   )dest_programsrc_program_descr:  input_variablesr{   origin_block_idxr  name_inp_descinput_namesrF   out_name
append_opsoffset_block_idxr  src_block_idx	src_blocksrc_parent_idx
dest_blockr5   sub	origin_ids                        r    r  r  6  sT   & $55& O &+,,q!!    GF>+EFFFM77777K
=S----nM8J8Jnn[^_j[k[knnn
 
 	
 !// 
 
8" 	9.x8H+,,66+a.)*XJ' 	7 	
 	
 	
 	
 2+,,.>.D.DQ.G.G J !!!#.2J""$$q(("1&6&A&A&C&CDD 	 	M(..}==I&-N!!-
:

-
%33z3JJJ-I    :I  JJ !!! 	 	;;{## 	''+&&C#y~788 #F	#y// $G	LL\//0@90LMM   !!!%5L"""r.   c                    g }|j         D ]v}t          | j                  D ]_}|                     |          j        }|                                }|r||         }||v r!||         }||vr|                    |           `w|S )zB
    Get output name of 'program' according to program_holder
    )r   r1   r2   r3   rw  r6   r8   )	r   r:  r{   r  rJ   r  rw  r   r   s	            r    r  r    s     D* 	% 	%+,, 	% 	%C==%%*DxxzzH& =28<48nd??KK$$$	% Kr.   c           	          g }t          |                                          D ]8}|                    t          | |                    |                               9|S )a  
    Append Operators of 'src_block_desc' to current block.

    Args:
        block(Block): append OP of  'src_block_desc' to it.
        src_block_desc(BlockDesc): append var of  'src_block_desc'

    Returns:
        List: list of the OP that are append to current block.
    )r1   r4   r8   append_op_from_desc_staticr5   )r3   src_block_descr   rF   s       r    r  r    sa     C>))++,, L L

-e^5F5Fq5I5IJJKKKKJr.   c                     |                                 }| j                                        }|                    |           t	          j        | ||ddd          }| j                            |           |S )z
    Append Operators to 'block' according to 'op_desc'.

    Args:
        block(Block): append OP of  'src_block_desc' to it.
        op_desc(OpDesc): create OP according to it.

    Returns:
        Operator: OP appended to 'block'.
    N)r3   r   r$   r  r  r)  )r$   r   r  	copy_fromr   Operatorr   r8   )r3   op_descop_type	op_appendr5   s        r    r  r    s~     llnnG
$$&&I   		
 
 
B 
IRIr.   c                 r   g }|                                 D ]}|                                }|du s||v o|du p||v}|                     |          sa|r^|                                }|t          j        j        j        t          j        j        j        t          j        j        j	        fv r)|
                                }	|                                }
nd}	d}
|t          j        j        j        t          j        j        j	        fv r|                                }nd}|                                r| j                                        }n| }|                    |                    |                                |	||
||                                |                                                     |S )a*  
    Append Variables of 'src_block_desc' to current block.
    If 'include' is not `None`,variables that are not in include are not append.
    If 'exclude' is not `None`,variables that are in exclude will are not append.

    Args:
        block(Block): append Variables of  'src_block_desc' to it.
        src_block_desc(BlockDesc): append var of  'src_block_desc'
        include(List):list of names of variables
        exclude(List):list of names of variables

    Returns:
        List: list of the variables that are append to current block.
    N)r6   r   r$   r&  	lod_levelr+   set_need_check_feed)rD   r6   rw   r$   r   r%   r&   SELECTED_ROWSr   DENSE_TENSOR_ARRAYr   r&  r  r+   r   r   r8   r   need_check_feed)r3   r  ry   rz   vars_appendr,   var_desc_nameshould_appendvar_type	data_type	var_shaper  current_blocks                r    r  r    s   " K"++-- ( (  DDMW,D 
tO;}G; 	 }}]++ #	 #	}}H$2$1$7  
 %NN,,	$NN,,		 	 	$1$7   %..00		 	##%% & % : : < < %((!#!#' ( 4 4 6 6(0(@(@(B(B )  
 
 
 r.   c                        e Zd ZdZ fdZeej        dd                        Zed             Z	d Z
d Zdd	Zdd
ZddZddZ xZS )TranslatedLayeraO  
    TranslatedLayer is a ``paddle.nn.Layer`` for holding the model
    loaded by :ref:`api_paddle_jit_load` . It can be used like a
    general Layer object in eval or train mode.

    .. note:
        The TranslatedLayer objects should not be created by constructor, it only can be loaded and constructed by :ref:`api_paddle_jit_load` .

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('`paddle.jit.to_static` can not run in xdoctest')
            >>> import numpy as np
            >>> import paddle
            >>> import paddle.nn as nn
            >>> import paddle.optimizer as opt

            >>> BATCH_SIZE = 16
            >>> BATCH_NUM = 4
            >>> EPOCH_NUM = 4

            >>> IMAGE_SIZE = 784
            >>> CLASS_NUM = 10

            >>> # define a random dataset
            >>> class RandomDataset(paddle.io.Dataset): # type: ignore[type-arg]
            ...     def __init__(self, num_samples):
            ...         self.num_samples = num_samples
            ...
            ...     def __getitem__(self, idx):
            ...         image = np.random.random([IMAGE_SIZE]).astype('float32')
            ...         label = np.random.randint(0, CLASS_NUM - 1, (1, )).astype('int64')
            ...         return image, label
            ...
            ...     def __len__(self):
            ...         return self.num_samples
            ...
            >>> class LinearNet(nn.Layer):
            ...     def __init__(self):
            ...         super().__init__()
            ...         self._linear = nn.Linear(IMAGE_SIZE, CLASS_NUM)
            ...
            ...     @paddle.jit.to_static
            ...     def forward(self, x):
            ...         return self._linear(x)
            ...
            >>> def train(layer, loader, loss_fn, opt):
            ...     for epoch_id in range(EPOCH_NUM):
            ...         for batch_id, (image, label) in enumerate(loader()):
            ...             out = layer(image)
            ...             loss = loss_fn(out, label)
            ...             loss.backward()
            ...             opt.step()
            ...             opt.clear_grad()
            ...             print("Epoch {} batch {}: loss = {}".format(
            ...                 epoch_id, batch_id, np.mean(loss.numpy())))
            ...
            >>> # 1. train & save model.
            >>> # create network
            >>> layer = LinearNet()
            >>> loss_fn = nn.CrossEntropyLoss()
            >>> adam = opt.Adam(learning_rate=0.001, parameters=layer.parameters())

            >>> # create data loader
            >>> dataset = RandomDataset(BATCH_NUM * BATCH_SIZE)
            >>> loader = paddle.io.DataLoader(dataset,
            ...     batch_size=BATCH_SIZE,
            ...     shuffle=True,
            ...     drop_last=True,
            ...     num_workers=2
            ... )
            >>> # train
            >>> train(layer, loader, loss_fn, adam)

            >>> # save
            >>> model_path = "linear.example.model"
            >>> paddle.jit.save(layer, model_path)

            >>> # 2. load model as TranslatedLayer
            >>> # load
            >>> translated_layer = paddle.jit.load(model_path)

            >>> # inference
            >>> translated_layer.eval()
            >>> x = paddle.randn([1, IMAGE_SIZE], 'float32')
            >>> pred = translated_layer(x)

            >>> # fine-tune
            >>> translated_layer.train()
            >>> adam = opt.Adam(learning_rate=0.001, parameters=translated_layer.parameters())
            >>> train(translated_layer, loader, loss_fn, adam)

    c                    t                                                       t          |t                    st	          d          t          |t                    st	          d          || _        i | _        t          j                    5  |	                                D ]\  }}t          |t          j                  r5t          t                    }|| j        |<   |                     ||           Tt          |t          j        j                  r5t          t$                    }|| j        |<   |                     ||           t	          d          	 d d d            n# 1 swxY w Y   d| _        d | _        d S )NzETranslatedLayer need to use _ProgramHolder's dict for initialization.zITranslatedLayer need to use persistable variable dict for initialization.z?Adding persistent variable which  to layer is not supported nowT)r   r   r  dictr  _program_holder_dictr  r   guardr5  r   r/  r\   PARAMETER_NAME_PREFIXadd_parameterr   r  r  BUFFER_NAME_PREFIXregister_bufferr  r  )r   rp  rE   r6   rJ   dy_namer   s         r    r   zTranslatedLayer.__init__d  s   (D)) 	W   *D11 	[   %-! +-'   	 	-3355  	cc9#;<< 78MNNG<CD3D9&&w4444TZ%677 78JKKG<CD3D9((#6666#Y  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !%s   CE$$E(+E(Nc           	      &   t           j                            |           } t           j                            |           st	          d|  d          d }d }||j        }|j        }t          | |          }t          | ||          }t          ||          }|
                                D ]Q\  }}|j        d |j        D             |_        t          t          |t                              ||                     R|                                 |S )NzThere is no directory named ''c                 6    g | ]}|                                 S r   r   r}  s     r    r   z.TranslatedLayer._construct.<locals>.<listcomp>  s-     6 6 6#&CHHJJ6 6 6r.   )r3  r4  normpathisdirr   rc  r;  rk  ru  r  r5  r  r   setattr_execution_method_creatoreval)	r9  configsrc  r;  rp  rE   translated_layerrj  r:  s	            r    
_constructzTranslatedLayer._construct  sF    W%%j11
w}}Z(( 	LJZJJJKKK$3N%5O .j.II 9/
 

 +85EFF ,4>>+;+; 	 	'K196 6*8*D6 6 6 2 99     	r.   c                      fd| _         S )Nc                     | j         j                 }t                      rt          | ||          S t          j                            t          j        |j	                            }t          |||j                  S r@   )r  r  r   r  r   r   _construct_from_descr   r   r   r  r   )r   r   r:  p__i_m_p_l__s       r    r  z>TranslatedLayer._execution_method_creator.<locals>.__i_m_p_l__  sw    !6{7KLN    
H#D%@@@ %::$^%ABB  )GGGr.   )r  )rj  r:  r  s     @r    r  z)TranslatedLayer._execution_method_creator  s1    	H 	H 	H 	H 	H   +r.   c                 "    d| _         d| _        d S r0   r  trainingr   s    r    trainzTranslatedLayer.train  s    r.   c                 "    d| _         d| _        d S )NTFr  r   s    r    r  zTranslatedLayer.eval  s    r.   rY  c                 \    |                      |          }|j        }t          |          }|S )aX  
        Gets translated program of specified method.

        Args:
            - method_name (string): method name corresponding to the program
                to be obtained. Default: 'forward'.

        Returns:
            Program

        Examples:
            .. code-block:: python

                >>> # doctest: +SKIP('`paddle.jit.to_static` can not run in xdoctest')
                >>> import numpy as np
                >>> import paddle
                >>> from paddle import nn
                >>> import paddle.optimizer as opt

                >>> BATCH_SIZE = 16
                >>> BATCH_NUM = 4
                >>> EPOCH_NUM = 4

                >>> IMAGE_SIZE = 784
                >>> CLASS_NUM = 10

                >>> # define a random dataset
                >>> class RandomDataset(paddle.io.Dataset): # type: ignore[type-arg]
                ...     def __init__(self, num_samples):
                ...         self.num_samples = num_samples
                ...
                ...     def __getitem__(self, idx):
                ...         image = np.random.random([IMAGE_SIZE]).astype('float32')
                ...         label = np.random.randint(0, CLASS_NUM - 1, (1, )).astype('int64')
                ...         return image, label
                ...
                ...     def __len__(self):
                ...         return self.num_samples
                ...
                >>> class LinearNet(nn.Layer):
                ...     def __init__(self):
                ...         super().__init__()
                ...         self._linear = nn.Linear(IMAGE_SIZE, CLASS_NUM)
                ...
                ...     @paddle.jit.to_static
                ...     def forward(self, x):
                ...         return self._linear(x)
                ...
                >>> def train(layer, loader, loss_fn, opt):
                ...     for epoch_id in range(EPOCH_NUM):
                ...         for batch_id, (image, label) in enumerate(loader()):
                ...             out = layer(image)
                ...             loss = loss_fn(out, label)
                ...             loss.backward()
                ...             opt.step()
                ...             opt.clear_grad()
                ...             print("Epoch {} batch {}: loss = {}".format(
                ...                 epoch_id, batch_id, np.mean(loss.numpy())))
                ...
                >>> # create network
                >>> layer = LinearNet()
                >>> loss_fn = nn.CrossEntropyLoss()
                >>> adam = opt.Adam(learning_rate=0.001, parameters=layer.parameters())
                >>> # create data loader
                >>> dataset = RandomDataset(BATCH_NUM * BATCH_SIZE)
                >>> loader = paddle.io.DataLoader(dataset,
                ...     batch_size=BATCH_SIZE,
                ...     shuffle=True,
                ...     drop_last=True,
                ...     num_workers=2
                ... )
                >>> # train
                >>> train(layer, loader, loss_fn, adam)

                >>> # save
                >>> model_path = "linear.example.model"
                >>> paddle.jit.save(layer, model_path)

                >>> # load
                >>> translated_layer = paddle.jit.load(model_path)

                >>> # get program
                >>> program = translated_layer.program()
        )_get_program_holderr   r   )r   rj  r:  r   r   s        r    r   zTranslatedLayer.program  s6    l 11+>> &3 )66r.   c                 f    | j                             |d           }|t          d| d          |S )NzThe method `z+` does not exist in loaded TranslatedLayer.)r  rK  r   )r   rj  r:  s      r    r  z#TranslatedLayer._get_program_holder4  sH    266{DII!W{WWW   r.   c                 "   |                      |          }g }|j        D ]o}t          j                            |                                |                                |                                          }|                    |           p|S N)r&  r   r6   )	r  r   r   r   	InputSpecr&  r   r6   r8   )r   rj  r:  
input_specr,   specs         r    _input_speczTranslatedLayer._input_spec<  s    11+>> 
&2 	$ 	$H=**nn&&nn&&]]__ +  D
 d####r.   c                 "   |                      |          }g }|j        D ]o}t          j                            |                                |                                |                                          }|                    |           p|S r	  )	r  r   r   r   r
  r&  r   r6   r8   )r   rj  r:  output_specr,   r  s         r    _output_speczTranslatedLayer._output_specL  s    11+>> &3 		% 		%H =**nn&&nn&&]]__ +  D
 t$$$$r.   r@   )rY  )r  r  r   r!  r   staticmethodr   dygraph_onlyr  r  r  r  r   r  r  r  r#  r$  s   @r    r  r    s       \ \|'& '& '& '& '&R '  '  '   \' R   \(    ] ] ] ]~              r.   r  )NNr@   )NT)Ar3  rI  numpyr  r   r   paddle.baser   r   r   r   paddle.base.data_feederr   paddle.base.dygraph.baser	   paddle.base.frameworkr
   paddle.frameworkr   $paddle.jit.dy2static.partial_programr   r   paddle.jit.dy2static.utilsr   paddle.nn.layerr   __all__r^  rn  INFER_PARAMS_INFO_SUFFIXINFER_PROPERTY_SUFFIXrS   r  r  r!   r-   r>   rG   rK   rP   rX   r\   re   rh   rm   r   r   r   r   rC  rR  rW  rk  ru  rx  r  r  r  r  r  r  r  r  Layerr  r   r.   r    <module>r      s   
			                   > > > > > > > > > > > > . . . . . . ; ; ; ; ; ; / / / / / / , , , , , ,        < ; ; ; ; ; " " " " " "
 " ,     
 
 
" " "  0          ; ; ;  $ ( ( (  @< @< @< @<F   1 1 1k k k k k k k kX
 15C C C CL8 8 8x  , , , ,` ?C+ + + +\" " "M M M`  0  6 !O6 O6 O6 O6f 6:   (  "  6 26; ; ; ;|X X X X Xfl X X X X Xr.   