
    ϑi[                        S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	J
r
  S SKJr  S SKJr  S SKJr  S SKJr  S SKJrJr  S S	KJr  S S
KJr  / rSrSrSrSrSrSr Sr!S r"S r#S r$S r%S r&S r'\S 5       r(\S 5       r)S r*\S 5       r+S r,S2S jr-\S 5       r.S r/ " S  S!5      r0 S3S" jr1S# r2S$ r3S3S% jr4 S4S& jr5S' r6S( r7S) r8S* r9 S3S+ jr: S3S, jr;S- r<S. r= S2S/ jr> " S0 S1\R~                  5      r@g)5    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                 *   [        U S5       nUR                  5       nS S S 5        [        R                  " W5      n[        R                  " UR                  5       5      (       d  [        SUR                  5        S35      eU$ ! , (       d  f       Nl= f)NrbzUnsupported program version: 
)openreadr   ProgramDesc_is_program_version_supported_version
ValueError)model_file_pathfprogram_desc_strprogram_descs       [/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/jit/translated_layer.py_load_program_descr!   .   s    	ot	$668 
% ##$45L--l.C.C.EFF+L,A,A,C+DBG
 	
  
%	$s   B
Bc                    U R                  5       [        R                  R                  R                  :X  d  U R                  5       [        R                  R                  R
                  :X  dl  U R                  5       [        R                  R                  R                  :X  d6  U R                  5       [        R                  R                  R                  :X  a  gU R                  5       $ )NF)	typer   VarDescVarTypeFEED_MINIBATCH
FETCH_LISTREADERRAWpersistable)var_descs    r    _is_persistabler,   ;   s    4<<//>>>==?dll22=====?dll22999==?dll22666!!    c                 R   / n[        UR                  5       5       Hz  nUR                  U5      n[        UR                  5       5       HI  nUR	                  U5      nU R                  5       UR                  5       ;   d  M8  UR                  U5        MK     M|     [        UR                  5       5       Hq  nUR                  U5      n[        UR                  5       5       H@  nUR	                  U5      nU R                  5       UR                  5       ;   d  M8  Xb;   a  M?      g   Ms     gNFT)	range
num_blocksblockop_sizeopnameinput_arg_namesappendoutput_arg_names)persistable_var_descr   	input_ops	block_idxr2   op_idxr4   s          r    _is_parameterr=   F   s    I<2245	""9-EMMO,F&!B#((*b.@.@.BB  $	 - 6 <2245	""9-EMMO,F&!B#((*b.A.A.CC?  - 6 r-   c           
          / n[        U R                  5       5       HJ  nU R                  U5      nUR                  [	        [        [        UR                  5       5      5      5        ML     U$ N)r0   r1   r2   extendlistfilterr,   all_vars)r   persistable_varsir2   s       r    _get_persistable_varsrF   ^   sY    <**,-""1%VOU^^=M%N OP . r-   c                 p    / n[        U 5      nU H"  nUR                  UR                  5       5        M$     U$ )z4
Get all persistable variable names in ProgramDesc.
)rF   r7   r5   )r   	var_namesrD   vars       r    _get_persistable_var_namesrJ   f   s8     I,\:$  r-   c                     [        5       n[        U R                  5       5       HJ  nU R                  U5      nUR	                  5        H"  nUR                  UR                  5       5        M$     ML     U$ r?   )setr0   r1   r2   rC   addr5   )r   all_var_namesrE   r2   rI   s        r    _get_all_var_namesrO   q   s^    EM<**,-""1%>>#Cchhj) $ . r-   c                 ^    [         n[        R                  " SR                  X45      5      nU$ )zc
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)r5   suffixnew_names      r    _append_loaded_suffixrW   z   s)     F66sxx7OPHOr-   c                 .    [         R                  " U 5      $ r?   )r   rS   prefixs    r    _generate_unique_var_namer[      s    226::r-   c                    0 n[        U 5      nU H  nUR                  5       n[        UR                  5       5      nXAU'   UR                  U5        [	        U R                  5       5       H  nU R                  U5      nUR                  UR                  5       UR                  5       5        [	        UR                  5       5       H6  nUR                  U5      n	U	R                  XE5        U	R                  XE5        M8     M     M     U$ r?   )rF   r5   rW   set_namer0   r1   r2   _rename_varencoder3   r4   _rename_input_rename_output)
r   suffix_varname_dictrD   r+   old_namerV   r;   r2   r<   r4   s
             r    _append_loaded_suffix_to_varrd      s    ,\:$==?(9(0H%(#|6689I &&y1Ehoo/1BC0XXf%  4!!(5 1 : % r-   c                 .    [         R                  " U 5      $ r?   )r   generaterY   s    r    0_generate_unique_var_name_sync_with_main_programrg      s    ''r-   c                 ^    0 n[        U 5      nU H  nUR                  5       nX   X%'   M     U$ r?   )rF   r5   )r   all_new_old_dict_allnew_old_dictrD   r+   name_news         r    _get_loaded_var_new_oldrl      s:    L,\:$==?!5!? % r-   c                 f   0 n0 n/ n[        U R                  5       5       HJ  nU R                  U5      nUR                  5        H"  nUR	                  UR                  5       5        M$     ML     Sn	[        U R                  5       5       GHI  nU R                  U5      n[        UR                  5       5       GH  u  pUR                  5       nSU;   nU	=(       d    Un	USL =(       d    X;   =(       a    USL =(       d    X;  =(       a    U(       + nU(       ao  UR                  S5      n[        U5      S:  a-  US   R                  5       (       a  SR                  USS 5      nOUn [        U5      nUUSU
 XZS-   S -   ;  a  OM  UnX:w  a.  UR                  UR                  5       UR                  5       5        U(       a  GM  XU'   XU'   GM     GML     U	(       a  0 nU H  n[        U R                  5       5       Ho  nU R                  U5      n[        UR                  5       5       H>  u  pUR                  5       nSU;   d  M  UU;   d  M%  UR                  XU   5      nUUU'   M@     Mq     M     U H  nUU   UU'   UUUU   '   M     [        U R                  5       5       GHt  nU R                  U5      n[        UR                  5       5       GHA  nUR!                  U5      nUR#                  5        H  nUU;   d  M  UUU   :w  d  M  UR%                  UUU   5        UR'                  UR                  5       5      (       d  MQ  UR                  UR                  5       UU   R                  5       5        M     UR)                  5        H  nUU;   d  M  UUU   :w  d  M  UR+                  UUU   5        UR'                  UR                  5       5      (       d  MQ  UR                  UR                  5       UU   R                  5       5        M     GMD     GMw     U R-                  5         XC4$ )ah  
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_   )r0   r1   r2   rC   r7   r5   	enumeratesplitlen	isnumericrT   rg   r^   r_   replacer3   r4   r6   r`   has_varr8   ra   flush)r   includeexcludedict_rename_var_old_newdict_rename_var_new_old	old_namesb_idx	cur_blockrI   has_double_gradvar_idxname_oldis_double_grad_varshould_rename	temp_namerk   double_grad_rename_dictvar_namenew_var_namer<   r4   input_arg_nameoutput_arg_names                          r    _rename_var_program_descr      s    * ! I|..01 &&u-	%%'CSXXZ( ( 2 O|..01 &&u-	%i&8&8&:;LGxxzH!(H!4-C1COD7H$7 +_?(?+** 
 $NN3/	y>A%)B-*A*A*C*C #3B 8I (IO! H !('2Y{}5MMN   $#%%hoo&79JK%%4<14<1= < 2F "$/H|6689(..u5	$-i.@.@.B$CLG"xxzH(*x8/C'/'7'7$h&G( =I/9 %D : 0 0H0G1#H-  $$;H$EF	 0 |..01 &&u-	I--/0Ff%B"$"4"4"6!%<<&2>BC ((*3NC %,,^-B-B-DEE%11 . 5 5 7 7$2!""(&(	 #7" $&#6#6#8"&=='2?CD ))+3OD %,,_-C-C-EFF%11 / 6 6 8 7$3!""(&(	 $9' 1 2L ";;r-   c                     [         R                  " 5       nXl        [        UR                  R	                  5       5       Vs/ s H  n[         R
                  " X5      PM     snUl        UR                  5         U$ s  snf r?   )r   Programdescr0   r1   Blockblocks_sync_with_cpp)r   progrE   s      r    _build_program_by_descr   -  sd    DI*/		0D0D0F*G*GQ	 *GDK 	K	s    A;c                    [        U R                  5       5       Ho  nU R                  U5      n[        UR                  5       5       H>  nUR	                  U5      nUR                  S5      (       d  M,  UR                  SU5        M@     Mq     g )Nis_test)r0   r1   r2   r3   r4   has_attr	_set_attr)r   r   rE   r2   jr4   s         r    _change_is_test_statusr   8  si    <**,-""1%u}}'A!B{{9%%Y0 ( .r-   c                   2  ^  \ rS rSrSrU 4S jr\S 5       r\S 5       r	\S 5       r
\S 5       r\S 5       r\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS r\S 5       r\S 5       r\S 5       rSrU =r$ )_ProgramHolderiB  z
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U ]  5         / U l        / U l        / U l        0 U l        [        R                  " 5       U l        S U l	        U R                  U5      U l        g 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   _ProgramHolder.__init__M  s]     "$! !JJL %)!#'#3#3L#A r-   c                     [        U R                  5      nU R                  R                  S5      R	                  5       nUS:  a  [        USU5      $ U$ Nr   )r   train_programr   r2   r3   r   )r   whole_programend_op_indexs      r    _create_forward_train_program,_ProgramHolder._create_forward_train_program_  sN    .t/A/AB//55a8@@B!)-LII  r-   c                 6    U R                  5       R                  $ r?   )r   r   r   s    r    _forward_program_desc$_ProgramHolder._forward_program_desch  s    113888r-   c                 Z   [        U R                  5      nU R                  R                  S5      R	                  5       [        U R                  5      -   nUR                  R                  S5      R	                  5       nX#:  a  [        XU5      $ [        R                  R                  5       $ r   )r   r   r   r2   r3   rs   r   r   r   paddlestaticr   )r   r   start_op_indexr   s       r    _create_backward_train_program-_ProgramHolder._create_backward_train_programm  s    .t/A/AB1177:BBDsH
 
 %))//2::<()|  ==((**r-   c                 6    U R                  5       R                  $ r?   )r   r   r   s    r    _backward_program_desc%_ProgramHolder._backward_program_desc{  s    224999r-   c                     U R                   $ r?   )r   r   s    r    infer_program_ProgramHolder.infer_program  s    '''r-   c                 8    U R                  U R                  5      $ r?   )_append_backward_descr   r   s    r    r   _ProgramHolder.train_program  s    ))$*B*BCCr-   c                     U R                   $ r?   )r   r   s    r    forward_program_ProgramHolder.forward_program  s    )))r-   c                     U R                   $ r?   )r   r   s    r    backward_program_ProgramHolder.backward_program  s    ***r-   c                     U R                   $ r?   )r   r   s    r    input_descs_ProgramHolder.input_descs         r-   c                     U R                   $ r?   )r   r   s    r    output_descs_ProgramHolder.output_descs  s    !!!r-   c                     U R                   $ r?   )r   r   s    r    persistable_names _ProgramHolder.persistable_names  s    &&&r-   c                     U R                   $ r?   )r   r   s    r    scope_ProgramHolder.scope  r   r-   c                     U R                   $ r?   )r   r   s    r    grad_var_names_ProgramHolder.grad_var_names  s    ###r-   c                    [        U5      n[        X5      u  p4/ nUR                  S5      n[        UR	                  5       5       GH  nUR                  U5      nUR                  5       S:X  a  UR                  U5        UR                  S5      S   R                  5       n	UR                  U	5        U R                  R                  UR                  UR                  S5      S   R                  5       5      5        M  UR                  5       S:X  a  UR                  S5      S   R                  S5      (       a  UR                  U5        UR                  S5      S   R                  5       n
UR                  U
5        U R                  R                  UR                  UR                  S5      S   R                  5       5      5        GM  UR                  5       S:X  a  UR                  U5        UR                  S5      S   R                  5       nUR                  U5        UR                  S5      S   R                  S5      (       dM  U R                  R                  UR                  UR                  S5      S   R                  5       5      5        GMS  GMV  UR!                  S5      (       d  GMo  UR#                  S5        GM     [%        U5       H  nUR'                  XS	-   5        M     U R                  R)                  5         [+        U5      nU R-                  U5        [/        X5      U l        [        U5      U l        U$ )
Nr   feedXOutscalezsave_infer_model/scale_fetchop_callstackro   )rJ   r   r2   r0   r3   r4   r#   r7   inputr_   _remove_varr   find_varoutput
startswithr   r   remove_attrreversed
_remove_opreverser   _append_scale_to_outputrl   r   r   )r   r   list_persistable_varrename_new_old_dictrn   ops_to_remove
root_blockrE   r4   feed_var_nameout_var_namefetch_var_namer<   tmp_programs                 r    r   _ProgramHolder._preprocess  s   9,G!9"

 !''*
z))+,Aq!BwwyF"$$Q' "a 0 7 7 9&&}5!!((''		%(8(;(B(B(DE g%"))E*:1*=*H*H)+ + $$Q'!yy/299;&&|4""))''a(8(?(?(AB g%$$Q'!#5!1!!4!;!;!=&&~6xx}Q'223LMM&&--"++BHHSM!,<,C,C,EF N
 ;;~..NN>2; -> }-F!!&1*5 . 	!!# -\: 	$$[1 %<%
!
 #=\"Jr-   c                    U R                    H'  nUR                  5       [        R                  :X  d  M'    g    / n[        R
                  " U5         [        U R                   5       H\  u  pEUR                  5       R                  UR                  5       5      n[        R                  " USSU 3S9nUR                  U5        M^     S S S 5        [        U5       H  u  pFUR                  U R                   U'   M      g ! , (       d  f       N<= f)Ng      ?ztranslated_layer/scale_)r5   )r   dtyper   boolr   program_guardrq   global_blockrI   r5   r   r7   r   )r   programout_descscale_output_varsrE   outrI   s          r    r   &_ProgramHolder._append_scale_to_output  s     **H~~6;;. +
 $$W-#D$6$67**,00<ll34KA32OP!((- 8 .   12FA$'HHDq! 3 .-s   A6C<<
D
c                    [         R                  " U5      n[        US5        [        U5      n[	        UR
                  5       GH  nUR                  U5      nUR                   GH~  nUR                  S:X  a  SUR                  ;  d  [        UR                  S5      5      S:X  a  UR                  [        R                  " SR                  SS/5      5      UR!                  UR#                  S5      S   5      R$                  [         R&                  R(                  R*                  SS	S
9nUR,                  R/                  SUR0                  /5        M  [2        R4                  " 5       R7                  UR                  5      (       d  GM&  [2        R4                  " 5       R9                  UR                  5      nSn	UR:                   H  n
U
R<                  (       d  M  U
R0                  nXR                  ;  d  M3  S	n	UR                  [        R                  " SR                  UR                  S-   U-   S/5      5      [         R&                  R(                  R*                  SS	S9nUR,                  R/                  XR0                  /5        M     U	(       d  GM4  UR,                  R?                  UR,                  5        UR,                  RA                  UR,                  5        GM     GM     U$ )NF
batch_normReserveSpacer   rQ   reserve_spacetmpr   T)r5   r   r#   r*   stop_gradientrn   )r5   r#   r*   r  )!r   r   r   r   r0   r1   r2   opsr#   output_namesrs   r   
create_varr   rS   rT   rI   r   r   r$   r%   DENSE_TENSORr   
set_outputr5   r
   instancehas_op_protoget_op_protooutputsintermediateinfer_var_typeinfer_shape)r   infer_program_descprogram_desc_copyr   r;   r2   r4   r  protohas_create_intermediate_outoutput_protointermediate_nameintermediate_vars                r    _get_train_forward_program)_ProgramHolder._get_train_forward_program  s]    ,,-?@ 	0%8 )):; w112IMM),Eii77l*&boo=ryy89Q>(-(8(8!,!H!H #/5)A B" #())BHHSM!,<"="C"C!%!5!5!B!B(-*. )9 ) **>M<N<N;OP
 %--/<<RWWEE%..0==bggF.3+$)MML#000,8,=,=),OOC:>7/4/?/?%0%L%L$'HH,.GGcM<M,M,1)*%&&" &*\\%9%9%F%F,1.2 0@ 0, GG.. 14I4I3J% %2* /.GG**5::6GG''

3a   3h r-   c                 $   U R                  U5      n/ nU R                   H?  nUR                  UR                  5       R	                  UR                  5       5      5        MA     [        US[        R                  [        [        4S5        [        R                  " U/ S9nU R                   Vs/ s H0  obR                  S5      R	                  UR                  5       5      PM2     nnU R                   Vs/ s H"  oR                  S5      R	                  U5      PM$     n	nU R                   Vs/ s H0  obR                  S5      R	                  UR                  5       5      PM2     n
n[!        XWX5      U l        UR$                  $ s  snf s  snf s  snf )Ntargetszpaddle.static.gradients)r  inputsr   )r  r   r7   r   rI   r5   r   r   VariablerA   tupler   calc_gradient_helperr   r2   r   r   r   r   )r   r  r   r  r   grad_info_mapr   x_varsr5   
param_varsout_varss              r    r   $_ProgramHolder._append_backward_descM  sh   112DE%%CNN7//155chhjAB & 	u-%		
 !55B
 ;?:K:K
:K$MM!  -:K 	 
 483J3J
3J4MM!  &3J 	 
 ;?:L:L
:L$MM!  -:L 	 
  4: 
 ||


s   -7F4)F-7F)r   r   r   r   r   r   r   )__name__
__module____qualname____firstlineno____doc__r   r	   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r  r   __static_attributes____classcell__r   s   @r    r   r   B  sZ   B$ ! ! 9 9 + + : : ( ( D D * * + + ! ! " " ' ' ! ! $ $Qf - -" B BH  r-   r   c                 2   [        UR                  5      n0 nU GH>  nUR                  UR                  5          n[	        XQR                  5      (       aQ  [
        R                  " UR                  5       UR                  5       UR                  5       UR                  5       SS9nOP[
        R                  " UR                  5       UR                  5       UR                  5       UR                  5       SS9nUcF  [
        R                  " 5       R                  S0 SU0S[        R                  R                  X5      0S9  SUl        XtUR                  5       '   GMA     Ub  / nUR                  R#                  5        V	V
s0 s H  u  pX_M	     nn	n
[%        UR'                  5       5       H  nUR)                  XKU      5        M     [
        R                  " 5       R                  S	0 SU0S[        R                  R                  X5      0S9  U H8  n[	        XQR                  5      (       d  M  XER                  5          nSUl        M:     [+        UR,                  5      nU H,  nU[.        R0                  " 5       -   nUU;  d  M#  SXO   l        M.     U$ s  sn
n	f )
NT)shaper   r5   r#   r*   )r#   r5   r.  r   r*   r   r   	file_pathr#   r  r  attrsFload_combine)rF   r   r   r5   r=   r   EagerParamBaser.  r   r#   _create_tensor_dygraph_tracertrace_opospathrT   r  itemssortedkeysr7   rO   r   r   grad_var_suffix)
model_pathprogram_holderparams_filenamerD   load_var_dicteach_varorig_each_namenew_varload_var_listkvdict_name_old_newr5   r   rN   r   grad_var_names                    r    !_load_persistable_vars_by_programrI    sR    -^-I-IJM$'<<X]]_M#?#?@@..nn&nn&]]_]]_ G  ..]]_]]_nn&nn& G "%%'00("BGGLL$LM	 1  !&)0hmmo&7 %: "+@@FFH
HTQADH 	 
 ,1134D  /F!GH 5 	!!#,,M*Z IJ	 	- 	
 )H +G+GHH!--/2E"'E	 ) '~'C'CDM! 4#7#7#99-48M#1 "
 =
s   ?Jc                 r   [        US5       n[        R                  " U5      nS S S 5        0 n/ nUR                  R	                  5        VV	s0 s H  u  pX_M	     n
nn	[        U
5       H  nUW;  a  [        SU5      eX   nX[   R                  SS 5      b;  [        R                  " S/[        R                  R                  R                  USS9nO[        R                  " USS9nX[   S   Ul        XU'   UR!                  U5        M     Uc   S	5       e["        R$                  R'                  X5      n["        R$                  R)                  U5      (       d  [+        W5      S
:w  a  [-        S5      e U$ [        R.                  " 5       R1                  S0 SU0SU0S9  U$ ! , (       d  f       GN= fs  sn	nf )Nr   zdThe model to be loaded is not complete.The variable `%s` of program cannot be found in loaded model.	trainablero   T)r.  r   r5   r*   )r5   r*   r  z#params_filename should not be None.r   z%The model to be loaded is incomplete.r2  r   r/  r0  )r   pickler   r   r9  r:  RuntimeErrorgetr   r3  r   r$   r%   FP32r4  r  r7   r7  r8  rT   existsrs   r   r5  r6  )r=  var_info_pathr>  r?  r   extra_var_infor@  rD  keyvalueinv_suffix_varname_dictr5   rV   rC  var_file_paths                  r    _load_persistable_varsrW    s    
mT	"aQ 
# MM%3%H%H%N%N%P%Pzs
%P   ./~%P  +0##K6B..cll**// 	G  ..H$OG . 4_ E")hW%/ 04 &M(MM&GGLL=M77>>-((~!#DEE $  	!!#,,M*.	 	- 	
 i 
#	"s   F!F3!
F0c                 F    0 nU  H  nUR                   U   nX   X$'   M     U$ r?   )r   )var_dictr>  no_suffix_var_dictr   no_suffix_names        r    _remove_varname_suffixr\    s6    '<<XF-5-?*  r-   c                    0 nUGbU  [         R                  R                  U5      n[         R                  R                  X5      nUS [	        [
        5      *  n[         R                  " U 5       H  nX:X  a"  Sn[         R                  R                  X5      nOUR                  [
        5      (       a  UR                  U5      (       av  U[	        U5      [	        [
        5      * S-    R                  S5      n[	        U5      S:X  a7  [	        US   5      S:  a%  US   n[         R                  R                  X5      nOM  M  [        [        U5      5      X&'   M     U$ [         R                  " U 5       Hx  u    pU	 Hl  n
SU
;   d  M  [         R                  R                  X
5      nU
R                  S5      nUS:X  a  SnOUR                  SS5        [        [        U5      5      X+'   Mn     Mz     U$ )	Nforwardro   rQ      r   modelrn    )r7  r8  basenamerT   rs   INFER_MODEL_SUFFIXlistdirendswithr   rr   r   r!   walkstripru   )r=  model_filenameprogram_holder_dictr   
model_namefilename	func_nameparsing_namesrn   
file_namesr5   method_names               r    _construct_program_holdersrp    s   !)).9'',,zB#$>s+='>&>?


:.H)%	"$'',,z"J""#5668;N;N< < !)
Os+='>&>&B!%*  }%*s=3C/Dq/H -a 0I&(ggll:&HO-;"?3.*# /D  !#
 3Aq"d?&(ggll:&DO"&**S/K"g-&/#++GR87E*?;8'4 # !4 r-   c           	         [        U5      S-   n[        R                  R                  X5      n[        R                  R                  U [        U5      5      n[        R                  R	                  U5      (       Ga  [        XUS   U5      nUS [        [        5      *  n[        R                  " U 5       H  n	U	R                  U5      (       aq  U	R                  [        5      (       aW  U	[        U5      [        [        5      * S-    R                  S5      n
[        U
5      S:X  a  [        U
S   5      S:  a  U
S   nOM  M  [        R                  R                  X5      nUR                  [        XX   U	5      5        M     O8Ub&  [        R                  R	                  U5      (       d  0 $ [        XS   U5      nU(       d  [        XqS   5      nU$ )Nz.infor^  ro   rQ   r_  r   )strr7  r8  rT   rP  rW  rs   INFER_PARAMS_SUFFIXrd  r   re  rr   updaterI  r\  )r=  programsr?  append_suffixvar_info_filenamerQ  params_pathrY  rj  	file_namerm  rl  s               r    _construct_params_and_buffersrz  F  s    O,w6GGLL?M'',,z3+?@K	ww~~m$$)x	':O
 %%@,?(@'@A
J/I##J//I4F4F#5 5 !*
Os+>'?&?!&C!%*  }%*s=3C/Dq/H -a 0IGGLLGMOO&x/BI 0& 
	$RWW^^K-H-H	4+_
 )(Y4GHOr-   c                     U (       a  U $ S $ r?    )varss    r    _valid_varsr~  t  s    4!T!r-   c                 
   / n/ n[        U5       GH  u  pV[        U[        R                  [        R
                  R                  45      (       d  [        S[        U5       S35      e[        U[        R                  5      (       aP  [        R
                  R                  UUR                  U   R                  5       S[        R                  " 5       SS9nO$UnUR                  U   R                  5       Ul
        UR                  UR                  5        UR                  U5        GM     U R                  c/  UR                   Vs/ s H  oR                  5       PM     snU l        / n	UR                   H}  n
U R                   U
   nXR"                  ;   a   U	R                  U R"                  U   5        MA  XR$                  ;   a   U	R                  U R$                  U   5        Mp  ['        SU
 S35      e   / nUR(                   Hm  n[        R
                  R                  UR+                  5       UR-                  5       UR                  5       UR                  5       SS9nUR                  U5        Mo     UR.                  /nU R0                  (       a  UR2                  OUR4                  nU R0                  (       a  UR6                  OUR8                  nUR2                  R;                  S	5      R=                  5       nS
UR;                  S	5      SS	SUSU R0                  S[>        R@                  RC                  X5      SU/nU R0                  (       de  URE                  SURF                  RI                  S/ 5      SURF                  RI                  S/ 5      SURF                  RI                  S/ 5      45        SnURE                  SU45        U(       a_  URE                  SUR;                  S	5      45        U R0                  (       d,  URE                  SURJ                  R;                  S	5      45        [L        RN                  " [Q        U5      [Q        U	5      [Q        U5      US /UQ76   U	 Hw  nUR                  [        RR                  " 5       -   nUR;                  S	5      RU                  URW                  5       5      nUc  MX  URY                  UR                  5       5        My     Un[[        U5      S:X  a  US	   nU$ s  snf )Nz[The type of input in TranslatedLayer must be numpy array or Variable(Tensor), but received rQ   FT)rT  r5   r*   place	zero_copyzThe persistable variable z+ does not exist in current TranslatedLayer.)r   dimsr5   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_blockro   ).rq   
isinstancenpndarrayr   eagerTensor	TypeErrorr#   r   r5   r   _current_expected_placer7   _input_args_namesr   _persistable_var_name_dict_parameters_buffersr   r   r   r.  r   _is_testr   r   r   r   r2   r3   r   utils_hash_with_idr@   r   rN  r   r   run_programr~  r<  r   r_   _set_grad_typers   )r	  r   r>  
input_varsinput_var_namesrE   rT  rI   insrD   r   dy_var_nameoutput_varsr+   tmp_scope_vectrace_programr   r   r1  r  persistable_varrH  grad_varoutss                           r    _run_dygraphr  x  s   JOe$%"**djj.?.?!@AAmnrsxnymzz{|  eRZZ((**###//2779!779 $ C C &11!499;CHsxx(#) %* !!)"0"<"<&
"<3HHJ"<&
" "4499(C...##H$8$8$EF---##H$5$5k$BC+H:5`a  5 K"//jj.."!   
 	3 0 $))*M
  	$$))   	**++ 
 "//55a8@@BL 	A	""=;E "--11'2> --11%<--11#r:		
 	LL')<=>&%%a(	
   LL+"3399!< J$%K  
  ,',,t/C/C/EE &&q)22=3G3G3IJ &&x}}7 , D
;11~Kg&
s   S=c                     [         R                  " 5       n[        U5      n[        X$S9u  pVUR	                  5         [        UUUU U5        UR                  5         [        X1U5      n[        U5      S:X  a  US   nU$ )Nry   ro   r   )	r   default_main_programrJ   r   rw   _append_blockr   _get_output_from_programrs   )r   r>  r  main_programparam_var_namesrn   rz   r  s           r    _run_static_graphr    s    113L0?O!9"A  !#&=D 4yA~AwKr-   c                     / nUS:  a  U$ U R                  U5      R                   H  nUR                  U5        M     U R                  U5      R                  nUS:  a  U[	        X5      -  nU$ )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   rp   )r2   r}  r7   
parent_idx_collect_current_and_parent_var)r   r;   r}  rI   r  s        r    r  r     sj     D1}}}Y',,C -y)44JB/DDKr-   c                    U R                   n[        X5      n[        U R                  U5      UR                  S5      US9  UR                   Vs/ s H  owR                  5       PM     nnU Vs/ s H  owR
                  PM     n	n[        U5      [        U	5      :w  a$  [        S[        U5       S[        U	5       S35      e[        U5       H8  u  pU(       a  XK   nU R                  U5      R                  SSX   /0SU/0S	9  M:     [        U R                  U5      UR                  S5      5      nU R                  5         U R                  S
-
  nSnUR                  5       S
:  at  [        S
UR                  5       5       HV  nUR                  U5      nUR                  nUS:  a  X-   nOUnU R                  US9n[        UUUS9  U[        UU5      -  nMX     U R                  5         U H  nUR!                  S5      (       d  M  UR#                  S5      n[%        U[&        R(                  R*                  5      (       a  UR,                  n[%        U[&        R.                  5      (       a  UR0                  nUR3                  SU R                  UW-   5      5        M     U R                  5         XPl         gs  snf s  snf )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  z)The number of input is invalid, expected z, but received rQ   assignr   r   )r#   r  r  ro   )r  	sub_blockN)current_block_idxr  !append_var_from_block_desc_staticr2   r   r5   rs   r   rq   	append_op append_op_from_block_desc_staticr   r1   r0   parent_create_blockr   attrr  r   r   	BlockDescidr   idxr   )dest_programsrc_program_descr>  input_variablesrz   origin_block_idxr  inpname_inp_descinput_namesrE   out_name
append_opsoffset_block_idxr  src_block_idx	src_blocksrc_parent_idx
dest_blockr4   sub	origin_ids                         r    r  r  6  s   & $555O &+,q! ,:+E+EF+ECXXZ+EMF'6788K7
=S--7M8J7K?[^_j[kZllmn
 	
 !/".8H+,66+.)*XJ' 	7 	
 0 2+,.>.D.DQ.GJ !#..2J""$q("1&6&A&A&CDM(..}=I&--N!-:
-
%33z3JJ-I :I J E !;;{##''+&C#y~~7788FF	#y//GG	LL\//0@90LM  !%5"e G7s   J8.J=c                    / nUR                    Hx  n[        U R                  5       H\  nU R                  U5      R                  nUR                  5       nU(       a  X'   nXv;   d  M@  Xg   nX;  d  MK  UR                  U5        M^     Mz     U$ )z:
Get output name of 'program' according to program_holder
)r   r0   r1   r2   r}  r5   r7   )	r   r>  rz   r  rI   r  r}  r   r   s	            r    r  r    s}     D**++,C==%**DxxzH&2<n?KK$ - + Kr-   c           	          / n[        UR                  5       5       H,  nUR                  [        XR	                  U5      5      5        M.     U$ )z
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.
)r0   r3   r7   append_op_from_desc_staticr4   )r2   src_block_descr  rE   s       r    r  r    sC     C>))+,

-e5F5Fq5IJK -Jr-   c           	          UR                  5       nU R                  R                  5       nUR                  U5        [        R
                  " U UUSSSS9nU R                  R                  U5        U$ )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)r2   r   r#   r  r  r1  )r#   r   r  	copy_fromr   Operatorr  r7   )r2   op_descop_type	op_appendr4   s        r    r  r    sj     llnG

$$&I 			
B 
IIRIr-   c                    / nUR                  5        GH  nUR                  5       nUSL =(       d    Xb;   =(       a    USL =(       d    Xc;  nU R                  U5      (       a  MQ  U(       d  MZ  UR                  5       nU[        R
                  R                  R                  [        R
                  R                  R                  [        R
                  R                  R                  4;   a!  UR                  5       n	UR                  5       n
OSn	Sn
U[        R
                  R                  R                  [        R
                  R                  R                  4;   a  UR                  5       nOSnUR                  5       (       a  U R                  R                  5       nOU nUR!                  UR#                  UR                  5       U	UU
UUR                  5       UR%                  5       S95        GM     U$ )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)r5   r   r#   r.  	lod_levelr*   set_need_check_feed)rC   r5   rv   r#   r   r$   r%   SELECTED_ROWSr  DENSE_TENSOR_ARRAYr   r.  r  r*   r   r   r7   r  need_check_feed)r2   r  rx   ry   vars_appendr+   var_desc_nameshould_appendvar_type	data_type	var_shaper  current_blocks                r    r  r    s   " K"++-  DDM,D 
tO;}; 	 }}]++}}H$$22$$11$$77 
 %NN,	$NN,	 	 	$$11$$77  %..0	 	##%% % : : < %((!#!#' ( 4 4 6(0(@(@(B ) 
= .R r-   c                      ^  \ rS rSrSrU 4S jr\\R                  SS j5       5       r	\S 5       r
S rS rSS jrSS	 jrSS
 jrSS jrSrU =r$ )TranslatedLayeri  a  
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U ]  5         [        U[        5      (       d  [	        S5      e[        U[        5      (       d  [	        S5      eXl        0 U l        [        R                  " 5          UR                  5        H  u  p4[        U[        R                  5      (       a0  [        [        5      nXPR                  U'   U R                  XT5        MT  [        U[        R                   R"                  5      (       a0  [        [$        5      nXPR                  U'   U R'                  XT5        M  [	        S5      e   S S S 5        SU l        S U l        g ! , (       d  f       N= f)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   guardr9  r   r3  r[   PARAMETER_NAME_PREFIXadd_parameterr   r  r  BUFFER_NAME_PREFIXregister_bufferr  r  )r   ru  rD   r5   rI   dy_namer   s         r    r   TranslatedLayer.__init__d  s%   (D))W  *D11[  %-! +-' -335	c9#;#;<<78MNG<C33D9&&w4TZZ%6%67778JKG<C33D9((6#Y  6 ! !%! ! s   2CE
E"c           	      H   [         R                  R                  U 5      n [         R                  R                  U 5      (       d  [	        SU  S35      eS nS nUb  UR
                  nUR                  n[        X5      n[        XU5      n[        XE5      nUR                  5        He  u  pxUR                  c/  UR                   V	s/ s H  oR                  5       PM     sn	Ul        [        [        U[        R                  Xx5      5        Mg     UR!                  5         U$ s  sn	f )NzThere is no directory named '')r7  r8  normpathisdirr   rh  r?  rp  rz  r  r9  r  r   r5   setattr_execution_method_creatoreval)
r=  configsrh  r?  ru  rD   translated_layerro  r>  r  s
             r    
_constructTranslatedLayer._construct  s    WW%%j1
ww}}Z((<ZLJKK$33N%55O .jI 9/

 +8F ,4>>+;'K119*8*D*D6*D3HHJ*D6 2 99 ,< 	6s   Dc                 "   ^ U4S jmU Tl         T$ )Nc                   > U R                   TR                     n[        5       (       a  [        XU5      $ [        R
                  R                  [        R                  " UR                  5      5      n[        XUR                  5      $ 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  >TranslatedLayer._execution_method_creator.<locals>.__i_m_p_l__  sp    !66{7K7KLN   #D@@ %%::$$^%A%AB )GGr-   )r$  )ro  r>  r  s     @r    r  )TranslatedLayer._execution_method_creator  s    	H   +r-   c                      SU l         SU l        g r/   r  trainingr   s    r    trainTranslatedLayer.train  s    r-   c                      SU l         SU l        g )NTFr  r   s    r    r  TranslatedLayer.eval  s    r-   c                 V    U R                  U5      nUR                  n[        U5      nU$ )a  
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   ro  r>  r   r   s        r    r   TranslatedLayer.program  s3    l 11+> &33 )6r-   c                 b    U R                   R                  US 5      nUc  [        SU S35      eU$ )NzThe method `z+` does not exist in loaded TranslatedLayer.)r  rN  r   )r   ro  r>  s      r    r  #TranslatedLayer._get_program_holder4  sB    2266{DI!{m+VW  r-   c                    U R                  U5      n/ nUR                   H]  n[        R                  R	                  UR                  5       UR                  5       UR                  5       S9nUR                  U5        M_     U$ N)r.  r   r5   )	r  r   r   r   	InputSpecr.  r   r5   r7   )r   ro  r>  
input_specr+   specs         r    _input_specTranslatedLayer._input_spec<  sw    11+> 
&22H==**nn&nn&]]_ + D
 d# 3 r-   c                    U R                  U5      n/ nUR                   H]  n[        R                  R	                  UR                  5       UR                  5       UR                  5       S9nUR                  U5        M_     U$ r  )	r  r   r   r   r  r.  r   r5   r7   )r   ro  r>  output_specr+   r  s         r    _output_specTranslatedLayer._output_specL  sy    11+> &33H ==**nn&nn&]]_ + D
 t$ 4 r-   )r  r  r  r  r  r?   )r^  )r$  r%  r&  r'  r(  r   staticmethodr   dygraph_onlyr  r  r  r  r   r  r  r  r*  r+  r,  s   @r    r  r    sl    \|'&R '   ' R  (]~  r-   r  )NNr?   )NT)Ar7  rL  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__rc  rs  INFER_PARAMS_INFO_SUFFIXINFER_PROPERTY_SUFFIXrR   r  r  r!   r,   r=   rF   rJ   rO   rW   r[   rd   rg   rl   r   r   r   r   rI  rW  r\  rp  rz  r~  r  r  r  r  r  r  r  r  Layerr  r|  r-   r    <module>r*     sq   
      > > . ; / , < "
 " ,     
"0   ; ;$ ( (@<F  1k kX
 15CL8x,` ?C+\"M`06 !O6f 6:("6 26;|Xfll Xr-   