Ë
    Ž\;jR÷  ã                   óæ  — 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,d2d„Z-ed„ «       Z.d„ Z/ G d „ d!«      Z0	 d3d"„Z1d#„ Z2d$„ Z3d3d%„Z4	 d4d&„Z5d'„ Z6d(„ Z7d)„ Z8d*„ Z9	 d3d+„Z:	 d3d,„Z;d-„ Z<d.„ Z=	 d2d/„Z> G d0„ d1ej~                  «      Z@y)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                 ó  — t        | d«      5 }|j                  «       }d d d «       t        j                  «      }t        j                  |j                  «       «      st        d|j                  «       z  «      ‚|S # 1 sw Y   Œ_xY w)NÚrbz Unsupported program version: %d
)ÚopenÚreadr   ÚProgramDescÚ_is_program_version_supportedÚ_versionÚ
ValueError)Úmodel_file_pathÚfÚprogram_desc_strÚprogram_descs       údG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/jit/translated_layer.pyÚ_load_program_descr    .   sx   € ä	ˆo˜tÔ	$¨ØŸ6™6›8Ð÷ 
%ô ×#Ñ#Ð$4Ó5€LÜ×-Ñ-¨l×.CÑ.CÓ.EÔFÜØ/°,×2GÑ2GÓ2IÑIó
ð 	
ð Ð÷ 
%Ð	$ús   �A<Á<Bc                 óÌ  — | j                  «       t        j                  j                  j                  k(  sŸ| j                  «       t        j                  j                  j
                  k(  sj| j                  «       t        j                  j                  j                  k(  s5| j                  «       t        j                  j                  j                  k(  ry| j                  «       S )NF)	Útyper   ÚVarDescÚVarTypeÚFEED_MINIBATCHÚ
FETCH_LISTÚREADERÚRAWÚpersistable)Úvar_descs    r   Ú_is_persistabler+   ;   sŒ   € à�‰‹œ4Ÿ<™<×/Ñ/×>Ñ>Ò>Ø�=‰=‹?œdŸl™l×2Ñ2×=Ñ=Ò=Ø�=‰=‹?œdŸl™l×2Ñ2×9Ñ9Ò9Ø�=‰=‹?œdŸl™l×2Ñ2×6Ñ6Ò6àØ×ÑÓ!Ð!ó    c                 ó4  — g }t        |j                  «       «      D ]t  }|j                  |«      }t        |j                  «       «      D ]E  }|j	                  |«      }| j                  «       |j                  «       v sŒ5|j                  |«       ŒG Œv t        |j                  «       «      D ]j  }|j                  |«      }t        |j                  «       «      D ];  }|j	                  |«      }| j                  «       |j                  «       v sŒ5||v rŒ:  y Œl y©NFT)	ÚrangeÚ
num_blocksÚblockÚop_sizeÚopÚnameÚinput_arg_namesÚappendÚoutput_arg_names)Úpersistable_var_descr   Ú	input_opsÚ	block_idxr1   Úop_idxr3   s          r   Ú_is_parameterr<   F   só   € à€IÜ˜<×2Ñ2Ó4Ö5ˆ	Ø×"Ñ" 9Ó-ˆÜ˜EŸM™M›OÖ,ˆFØ—‘˜&Ó!ˆBà#×(Ñ(Ó*¨b×.@Ñ.@Ó.BÒBØ× Ñ  Õ$ñ	 -ð 6ô ˜<×2Ñ2Ó4Ö5ˆ	Ø×"Ñ" 9Ó-ˆÜ˜EŸM™M›OÖ,ˆFØ—‘˜&Ó!ˆBØ#×(Ñ(Ó*¨b×.AÑ.AÓ.CÒCà˜‘?Øâ ñ -ð 6ð r,   c           
      óÔ   — g }t        | j                  «       «      D ]I  }| j                  |«      }|j                  t	        t        t        |j                  «       «      «      «       ŒK |S ©N)r/   r0   r1   ÚextendÚlistÚfilterr+   Úall_vars)r   Úpersistable_varsÚir1   s       r   Ú_get_persistable_varsrE   ^   sY   € ØÐÜ�<×*Ñ*Ó,Ö-ˆØ×"Ñ" 1Ó%ˆØ×Ñ¤¤V¬O¸U¿^¹^Ó=MÓ%NÓ OÕPð .ð Ðr,   c                 ól   — g }t        | «      }|D ]!  }|j                  |j                  «       «       Œ# |S )z<
    Get all persistable variable names in ProgramDesc.
    )rE   r6   r4   )r   Ú	var_namesrC   Úvars       r   Ú_get_persistable_var_namesrI   f   s8   € ð €IÜ,¨\Ó:ÐÛˆØ×Ñ˜Ÿ™›Õ$ð  àÐr,   c                 óà   — t        «       }t        | j                  «       «      D ]G  }| j                  |«      }|j	                  «       D ]!  }|j                  |j                  «       «       Œ# ŒI |S r>   )Úsetr/   r0   r1   rB   Úaddr4   )r   Úall_var_namesrD   r1   rH   s        r   Ú_get_all_var_namesrN   q   s^   € Ü“E€MÜ�<×*Ñ*Ó,Ö-ˆØ×"Ñ" 1Ó%ˆØ—>‘>Ö#ˆCØ×Ñ˜cŸh™h›jÕ)ñ $ð .ð Ðr,   c                 ó^   — t         }t        j                  dj                  | |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)r4   ÚsuffixÚnew_names      r   Ú_append_loaded_suffixrV   z   s+   € ô €FÜ×6Ñ6°s·x±xÀÀvÀÓ7OÓP€HØ€Or,   c                 ó,   — t        j                  | «      S r>   )r   rR   ©Úprefixs    r   Ú_generate_unique_var_namerZ   …   s   € ä×2Ñ2°6Ó:Ð:r,   c                 ó  — i }t        | «      }|D ]ñ  }|j                  «       }t        |j                  «       «      }|||<   |j                  |«       t	        | j                  «       «      D ]”  }| j                  |«      }|j                  |j                  «       |j                  «       «       t	        |j                  «       «      D ]7  }|j                  |«      }	|	j                  ||«       |	j                  ||«       Œ9 Œ– Œó |S r>   )rE   r4   rV   Úset_namer/   r0   r1   Ú_rename_varÚencoder2   r3   Ú_rename_inputÚ_rename_output)
r   Úsuffix_varname_dictrC   r*   Úold_namerU   r:   r1   r;   r3   s
             r   Ú_append_loaded_suffix_to_varrc   Š   sâ   € ØÐÜ,¨\Ó:ÐÛ$ˆØ—=‘=“?ˆÜ(¨¯©«Ó9ˆØ(0Ð˜HÑ%Ø×Ñ˜(Ô#Ü˜|×6Ñ6Ó8Ö9ˆIØ ×&Ñ& yÓ1ˆEØ×Ñ˜hŸo™oÓ/°·±Ó1BÔCÜ §¡£Ö0�Ø—X‘X˜fÓ%�Ø× Ñ  ¨8Ô4Ø×!Ñ! (¨HÕ5ñ 1ñ :ð %ð Ðr,   c                 ó,   — t        j                  | «      S r>   )r   ÚgeneraterX   s    r   Ú0_generate_unique_var_name_sync_with_main_programrf   œ   s   € ä×Ñ Ó'Ð'r,   c                 ó^   — i }t        | «      }|D ]  }|j                  «       }||   ||<   Œ |S r>   )rE   r4   )r   Úall_new_old_dict_allÚnew_old_dictrC   r*   Úname_news         r   Ú_get_loaded_var_new_oldrk   ¡   s>   € Ø€LÜ,¨\Ó:ÐÛ$ˆØ—=‘=“?ˆØ!5°hÑ!?ˆ�XÒð %ð Ðr,   c                 ó˜  — i }i }g }t        | j                  «       «      D ]G  }| j                  |«      }|j                  «       D ]!  }|j	                  |j                  «       «       Œ# ŒI d}	t        | j                  «       «      D �]  }| j                  |«      }t        |j                  «       «      D ]å  \  }
}|j                  «       }d|v }|	xs |}	|du xs ||v xr |du xs ||vxr | }|rg|j                  d«      }t        |«      dkD  r(|d   j                  «       rdj                  |dd «      }n|}	 t        |«      }||d|
 ||
dz   d z   vrnŒ|}||k7  r.|j                  |j                  «       |j                  «       «       |rŒÜ|||<   |||<   Œç �Œ |	r¤i }|D ]†  }t        | j                  «       «      D ]h  }| j                  |«      }t        |j                  «       «      D ]9  \  }
}|j                  «       }d|v sŒ||v sŒ |j                  |||   «      }|||<   Œ; Œj Œˆ |D ]  }||   ||<   ||||   <   Œ t        | j                  «       «      D �]W  }| j                  |«      }t        |j                  «       «      D �]&  }|j!                  |«      }|j#                  «       D ]v  }||v sŒ|||   k7  sŒ|j%                  |||   «       |j'                  |j                  «       «      sŒF|j                  |j                  «       ||   j                  «       «       Œx |j)                  «       D ]v  }||v sŒ|||   k7  sŒ|j+                  |||   «       |j'                  |j                  «       «      sŒF|j                  |j                  «       ||   j                  «       «       Œx �Œ) �ŒZ | j-                  «        ||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Ú_é   éÿÿÿÿ)r/   r0   r1   rB   r6   r4   Ú	enumerateÚsplitÚlenÚ	isnumericrS   rf   r]   r^   Úreplacer2   r3   r5   r_   Úhas_varr7   r`   Úflush)r   ÚincludeÚexcludeÚdict_rename_var_old_newÚdict_rename_var_new_oldÚ	old_namesÚb_idxÚ	cur_blockrH   Úhas_double_gradÚvar_idxÚname_oldÚis_double_grad_varÚshould_renameÚ	temp_namerj   Údouble_grad_rename_dictÚvar_nameÚnew_var_namer;   r3   Úinput_arg_nameÚoutput_arg_names                          r   Ú_rename_var_program_descr‰   ª   s.  € ð* !ÐØ ÐØ€Iä�|×.Ñ.Ó0Ö1ˆØ ×&Ñ& uÓ-ˆ	Ø×%Ñ%Ö'ˆCØ×Ñ˜SŸX™X›ZÕ(ñ (ð 2ð €OÜ�|×.Ñ.Ó0×1ˆØ ×&Ñ& uÓ-ˆ	Ü% i×&8Ñ&8Ó&:Ö;‰LˆG�SØ—x‘x“zˆHØ!(¨HÐ!4ÐØ-ÒCÐ1CˆOà˜D�Ò7 H°Ð$7ò +Ø �_Ò?¨¸Ð(?ò+à*Ð*ð ñ
 Ø$ŸN™N¨3Ó/�	Ü�y“> AÒ%¨)°B©-×*AÑ*AÔ*CØ #§¡¨°3°B¨Ó 8‘Ià (�IØÜOØ!ó �Hð !Ø(¨¨'Ð2°Y¸wÈ¹{¸}Ð5MÑMñNð ð ð $�Ø˜8Ò#Ø×%Ñ% h§o¡oÓ&7¸¿¹Ó9JÔKÚ%Ø4<Ð'¨Ñ1Ø4<Ð'¨Ò1ò= <ð 2ñF Ø"$ÐÛ/ˆHÜ˜|×6Ñ6Ó8Ö9�Ø(×.Ñ.¨uÓ5�	Ü$-¨i×.@Ñ.@Ó.BÖ$C‘L�G˜SØ"Ÿx™x›z�HØ (Ò*¨x¸8Ò/CØ'/×'7Ñ'7Ø$Ð&=¸hÑ&Gó(˜ð =IÐ/°Ò9ñ %Dñ :ð 0ó 0ˆHØ0GØñ1Ð# HÑ-ð
 ð $Ø'¨Ñ1òð	 0ô �|×.Ñ.Ó0×1ˆØ ×&Ñ& uÓ-ˆ	Ü˜I×-Ñ-Ó/×0ˆFØ—‘˜fÓ%ˆBØ"$×"4Ñ"4Ö"6�Ø!Ð%<Ò<à&Ø2°>ÑBóCð ×(Ñ(Ø*Ø3°NÑCôð %×,Ñ,¨^×-BÑ-BÓ-DÕEØ%×1Ñ1Ø .× 5Ñ 5Ó 7Ø 7Ø$2ñ!"ç"(¡&£(õ	ð #7ð" $&×#6Ñ#6Ö#8�Ø"Ð&=Ò=à'Ø2°?ÑCóDð ×)Ñ)Ø+Ø3°OÑDôð %×,Ñ,¨_×-CÑ-CÓ-EÕFØ%×1Ñ1Ø /× 6Ñ 6Ó 8Ø 7Ø$3ñ!"ç"(¡&£(õ	ò $9ò' 1ð 2ðL ×ÑÔØ"Ð$;Ð;Ð;r,   c                 óú   — t        j                  «       }| |_        t        |j                  j	                  «       «      D �cg c]  }t        j
                  ||«      ‘Œ c}|_        |j                  «        |S c c}w r>   )r   ÚProgramÚdescr/   r0   ÚBlockÚblocksÚ_sync_with_cpp)r   ÚprogrD   s      r   Ú_build_program_by_descr‘   -  sh   € ä×ÑÓ€DØ€D„Iä*/°·	±	×0DÑ0DÓ0FÔ*GóÙ*G QŒ	�‰˜˜aÕ Ð*Gñ€D„Kð 	×ÑÔØ€Kùò	s   ÁA8c                 ó  — t        | j                  «       «      D ]f  }| j                  |«      }t        |j                  «       «      D ]7  }|j	                  |«      }|j                  d«      sŒ&|j                  d|«       Œ9 Œh y )NÚis_test)r/   r0   r1   r2   r3   Úhas_attrÚ	_set_attr)r   r“   rD   r1   Újr3   s         r   Ú_change_is_test_statusr—   8  sf   € ä�<×*Ñ*Ó,Ö-ˆØ×"Ñ" 1Ó%ˆÜ�u—}‘}“Ö'ˆAØ—‘˜!“ˆBØ�{‰{˜9Õ%Ø—‘˜Y¨Õ0ñ (ñ .r,   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 | _	        | j                  |«      | _        y 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  s]   ø€ Ü‰ÑÔð ˆÔØˆÔØ"$ˆÔØ!ˆÔô !ŸJ™J›LˆÔð %)ˆÔ!à#'×#3Ñ#3°LÓ#AˆÕ r,   c                 ó¦   — t        | j                  «      }| j                  j                  d«      j	                  «       }|dkD  rt        |d|«      S |S ©Nr   )r‘   Útrain_programr¥   r1   r2   r   )r¦   Úwhole_programÚend_op_indexs      r   Ú_create_forward_train_programz,_ProgramHolder._create_forward_train_program_  sN   € ä.¨t×/AÑ/AÓBˆØ×/Ñ/×5Ñ5°aÓ8×@Ñ@ÓBˆØ˜!ÒÜ)¨-¸¸LÓIÐIà Ð r,   c                 ó6   — | j                  «       j                  S r>   )r­   rŒ   ©r¦   s    r   Ú_forward_program_descz$_ProgramHolder._forward_program_desch  s   € à×1Ñ1Ó3×8Ñ8Ð8r,   c                 ó\  — t        | j                  «      }| j                  j                  d«      j	                  «       t        | j                  «      z   }|j                  j                  d«      j	                  «       }||k  rt        |||«      S t        j                  j                  «       S r©   )r‘   rª   r¥   r1   r2   rr   rž   rŒ   r   ÚpaddleÚstaticr‹   )r¦   r«   Ústart_op_indexr¬   s       r   Ú_create_backward_train_programz-_ProgramHolder._create_backward_train_programm  s™   € ä.¨t×/AÑ/AÓBˆØ×1Ñ1×7Ñ7¸Ó:×BÑBÓDÄsØ×ÑóH
ñ 
ˆð %×)Ñ)×/Ñ/°Ó2×:Ñ:Ó<ˆØ˜LÒ(Ü)Ø˜~¨|óð ô —=‘=×(Ñ(Ó*Ð*r,   c                 ó6   — | j                  «       j                  S r>   )rµ   rŒ   r¯   s    r   Ú_backward_program_descz%_ProgramHolder._backward_program_desc{  s   € à×2Ñ2Ó4×9Ñ9Ð9r,   c                 ó   — | j                   S r>   )r¥   r¯   s    r   Úinfer_programz_ProgramHolder.infer_program  s   € à×'Ñ'Ð'r,   c                 ó8   — | j                  | j                  «      S r>   )Ú_append_backward_descr¥   r¯   s    r   rª   z_ProgramHolder.train_programƒ  s   € à×)Ñ)¨$×*BÑ*BÓ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                 ób  — t        |«      }t        ||«      \  }}g }|j                  d«      }t        |j	                  «       «      D �]h  }|j                  |«      }|j                  «       dk(  r�|j                  |«       |j                  d«      d   j                  «       }	|j                  |	«       | j                  j                  |j                  |j                  d«      d   j                  «       «      «       Œ·|j                  «       dk(  r³|j                  d«      d   j                  d«      r�|j                  |«       |j                  d«      d   j                  «       }
|j                  |
«       | j                  j                  |j                  |j                  d«      d   j                  «       «      «       �Œ}|j                  «       dk(  rµ|j                  |«       |j                  d«      d   j                  «       }|j                  |«       |j                  d«      d   j                  d«      r�Œù| j                  j                  |j                  |j                  d«      d   j                  «       «      «       �ŒE|j!                  d«      s�ŒX|j#                  d«       �Œk t%        |«      D ]  }|j'                  ||d	z   «       Œ | j                  j)                  «        t+        |«      }| j-                  |«       t/        ||«      | _        t        |«      | _        |S )
Nr   ÚfeedÚXÚOutÚscalezsave_infer_model/scale_ÚfetchÚop_callstackrn   )rI   r‰   r1   r/   r2   r3   r"   r6   Úinputr^   Ú_remove_varr�   Úfind_varÚoutputÚ
startswithrž   r”   Úremove_attrÚreversedÚ
_remove_opÚreverser‘   Ú_append_scale_to_outputrk   r£   rŸ   )r¦   r   Úlist_persistable_varÚrename_new_old_dictrm   Úops_to_removeÚ
root_blockrD   r3   Úfeed_var_nameÚout_var_nameÚfetch_var_namer;   Útmp_programs                 r   r¤   z_ProgramHolder._preprocess£  s³  € ä9¸,ÓGÐÜ!9ØÐ.ó"
ÑÐ˜Qð
 ˆØ!×'Ñ'¨Ó*ˆ
Ü�z×)Ñ)Ó+×,ˆAØ—‘˜qÓ!ˆBØ�w‰w‹y˜FÒ"Ø×$Ñ$ QÔ'Ø "§¡¨£¨aÑ 0× 7Ñ 7Ó 9�Ø×&Ñ& }Ô5Ø×!Ñ!×(Ñ(Ø×'Ñ'¨¯	©	°%Ó(8¸Ñ(;×(BÑ(BÓ(DÓEõð —‘“˜gÒ%¨"¯)©)°EÓ*:¸1Ñ*=×*HÑ*HØ)ô+ð ×$Ñ$ QÔ'Ø!Ÿy™y¨Ó/°Ñ2×9Ñ9Ó;�Ø×&Ñ& |Ô4Ø×"Ñ"×)Ñ)Ø×'Ñ'¨¯©°«°aÑ(8×(?Ñ(?Ó(AÓBöð —‘“˜gÒ%Ø×$Ñ$ QÔ'Ø!#§¡¨5Ó!1°!Ñ!4×!;Ñ!;Ó!=�Ø×&Ñ& ~Ô6à—x‘x “} QÑ'×2Ñ2Ð3LÖMØ×&Ñ&×-Ñ-Ø"×+Ñ+¨B¯H©H°S«M¸!Ñ,<×,CÑ,CÓ,EÓFöð —;‘;˜~Ö.Ø—N‘N >Ö2ð; -ô> ˜}Ö-ˆFØ×!Ñ! &¨&°1©*Õ5ð .ð 	×Ñ×!Ñ!Ô#ô -¨\Ó:ˆð 	×$Ñ$ [Ô1ô %<ØÐ-ó%
ˆÔ!ô
 #=¸\Ó"JˆÔàÐr,   c                 ó2  — | j                   D ]9  }|j                  «       t        j                  j                  j
                  k(  sŒ9 y  g }t        j                  |«      5  t        | j                   «      D ]^  \  }}|j                  «       j                  |j                  «       «      }t        j                  |dd|› �¬«      }|j                  |«       Œ` 	 d d d «       t        |«      D ]  \  }}|j                  | j                   |<   Œ  y # 1 sw Y   Œ6xY w)Ng      ð?ztranslated_layer/scale_)r4   )rž   Údtyper   r#   r$   ÚBOOLr   Úprogram_guardrp   Úglobal_blockrH   r4   r²   rÏ   r6   rŒ   )r¦   ÚprogramÚout_descÚscale_output_varsrD   ÚoutrH   s          r   rÛ   z&_ProgramHolder._append_scale_to_outputö  sä   € ð ×*Ô*ˆHØ�~‰~Ó¤4§<¡<×#7Ñ#7×#<Ñ#<Ó<Ùð +ð
 ÐÜ×$Ñ$ WÕ-Ü# D×$6Ñ$6Ö7‘��3Ø×*Ñ*Ó,×0Ñ0°·±³Ó<�Ü—l‘l 3¨Ð4KÈAÈ3Ð2OÔP�Ø!×(Ñ(¨Õ-ñ 8÷ .ô  Ð 1Ö2‰FˆAˆsØ$'§H¡HˆD×Ñ˜qÒ!ñ 3÷ .Ð-ús   Á A7DÄDc                 ó¢  — t        j                  |«      }t        |d«       t        |«      }t	        |j
                  «      D �]‰  }|j                  |«      }|j                  D �]e  }|j                  dk(  rÚd|j                  vst        |j                  d«      «      dk(  r®|j                  t        j                  dj                  ddg«      «      |j!                  |j#                  d«      d   «      j$                  t         j&                  j(                  j*                  dd	¬
«      }|j,                  j/                  d|j0                  g«       Œít3        j4                  «       j7                  |j                  «      s�Œt3        j4                  «       j9                  |j                  «      }d}	|j:                  D ]¾  }
|
j<                  sŒ|
j0                  }||j                  vsŒ+d	}	|j                  t        j                  dj                  |j                  dz   |z   dg«      «      t         j&                  j(                  j*                  dd	¬«      }|j,                  j/                  ||j0                  g«       ŒÀ |	s�Œ|j,                  j?                  |j,                  «       |j,                  jA                  |j,                  «       �Œh �ŒŒ |S )NFÚ
batch_normÚReserveSpacer   rP   Úreserve_spaceÚtmprÍ   T)r4   rå   r"   r)   Ústop_gradientrm   )r4   r"   r)   rò   )!r   r   r—   r‘   r/   r0   r1   Úopsr"   Úoutput_namesrr   rÕ   Ú
create_varr   rR   rS   rH   rÒ   rå   r#   r$   Ú
LOD_TENSORrŒ   Ú
set_outputr4   r
   ÚinstanceÚhas_op_protoÚget_op_protoÚoutputsÚintermediateÚinfer_var_typeÚinfer_shape)r¦   Úinfer_program_descÚprogram_desc_copyré   r:   r1   r3   rð   ÚprotoÚhas_create_intermediate_outÚoutput_protoÚintermediate_nameÚintermediate_vars                r   Ú_get_train_forward_programz)_ProgramHolder._get_train_forward_program  sY  € ä ×,Ñ,Ð-?Ó@Ðô 	Ð0°%Ô8ô )Ð):Ó;ˆô ˜w×1Ñ1×2ˆIØ—M‘M )Ó,ˆEØ—i•i�Ø—7‘7˜lÒ*à&¨b¯o©oÑ=Ü˜rŸy™y¨Ó8Ó9¸QÒ>à(-×(8Ñ(8Ü!,×!HÑ!HØ #§¡¨/¸5Ð)AÓ Bó"ð #(§)¡)¨B¯H©H°S«M¸!Ñ,<Ó"=×"CÑ"CÜ!%§¡×!5Ñ!5×!@Ñ!@Ø(-Ø*.ð )9ó )˜ð Ÿ™×*Ñ*¨>¸M×<NÑ<NÐ;OÔPØô
 %×-Ñ-Ó/×<Ñ<¸R¿W¹WÔEÙÜ%×.Ñ.Ó0×=Ñ=¸b¿g¹gÓF�Ø.3Ð+Ø$)§M¤M�LØ#×0Ó0Ø,8×,=Ñ,=Ð)Ø,°B·O±OÒCØ:>Ð7Ø/4×/?Ñ/?Ü%0×%LÑ%LØ$'§H¡Hà,.¯G©G°c©MÐ<MÑ,MØ,1ð)*ó%&ó&"ô &*§\¡\×%9Ñ%9×%DÑ%DØ,1Ø.2ð 0@ó 0Ð,ð ŸG™G×.Ñ.Ø 1Ð4D×4IÑ4IÐ3Jõð% %2ó* /Ø—G‘G×*Ñ*¨5¯:©:Ô6Ø—G‘G×'Ñ'¨¯
©
Ö3òa  ð 3ðh ˆr,   c                 ó  — | j                  |«      }g }| j                  D ]>  }|j                  |j                  «       j	                  |j                  «       «      «       Œ@ t        |dt        j                  t        t        fd«       t        j                  |g ¬«      }| j                  D �cg c]0  }|j                  d«      j	                  |j                  «       «      ‘Œ2 }}| j                  D �cg c]"  }|j                  d«      j	                  |«      ‘Œ$ }	}| j                  D �cg c]0  }|j                  d«      j	                  |j                  «       «      ‘Œ2 }
}t!        |||	|
«      | _        |j$                  S c c}w c c}w c c}w )NÚtargetszpaddle.static.gradients)r  Úinputsr   )r  rž   r6   rè   rH   r4   r   r   ÚVariabler@   Útupler   Úcalc_gradient_helperr�   r1   rŸ   r   r    rŒ   )r¦   rÿ   ré   r  rì   Úgrad_info_maprŒ   Úx_varsr4   Ú
param_varsÚout_varss              r   r»   z$_ProgramHolder._append_backward_descM  sr  € à×1Ñ1Ð2DÓEˆàˆØ×%Ô%ˆCØ�N‰N˜7×/Ñ/Ó1×5Ñ5°c·h±h³jÓAÕBð &ô 	ØØÜ×Ñ¤¤uÐ-Ø%ô		
ô !×5Ñ5Ø Bô
ˆð ;?×:KÒ:Kó
Ù:K°$ˆG�M‰M˜!Ó× Ñ  §¡£Õ-Ð:Kð 	ð 
ð 48×3JÒ3Jó
Ù3J¨4ˆG�M‰M˜!Ó× Ñ  Õ&Ð3Jð 	ð 
ð ;?×:LÒ:Ló
Ù:L°$ˆG�M‰M˜!Ó× Ñ  §¡£Õ-Ð:Lð 	ð 
ô  4Ø˜6 :¨xó 
ˆÔð �|‰|Ðùò
ùò
ùò
s   Â-5E?Ã2'FÄ)5F	)Ú__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  sZ  ø„ ñôBð$ ñ!ó ð!ð ñ9ó ð9ð ñ+ó ð+ð ñ:ó ð:ð ñ(ó ð(ð ñDó ðDð ñ*ó ð*ð ñ+ó ð+ð ñ!ó ð!ð ñ"ó ð"ð ñ'ó ð'ð ñ!ó ð!ð ñ$ó ð$òQðf ñ-ó ð-ð" ñBó ðBðH ñó ôr,   r™   c                 ó  — t        |j                  «      }i }|D �]@  }|j                  |j                  «          }t	        ||j                  «      rSt        j                  |j                  «       |j                  «       |j                  «       |j                  «       d¬«      }nRt        j                  |j                  «       |j                  «       |j                  «       |j                  «       d¬«      }|€It        j                  «       j                  di d|idt        j                  j                  | |«      i¬«       d|_        |||j                  «       <   �ŒC |�åg }|j                  j#                  «       D �	�
ci c]  \  }	}
|
|	“Œ
 }}	}
t%        |j'                  «       «      D ]  }|j)                  |||      «       Œ t        j                  «       j                  d	i d|idt        j                  j                  | |«      i¬«       |D ]3  }t	        ||j                  «      sŒ||j                  «          }d|_        Œ5 t+        |j,                  «      }|D ](  }|t/        j0                  «       z   }||vsŒd||   _        Œ* |S c c}
}	w )
NT)Úshaperå   r4   r"   r)   )r"   r4   r  rå   r)   r   rÎ   Ú	file_path©r"   r	  rû   ÚattrsFÚload_combine)rE   r¹   r£   r4   r<   r   ÚEagerParamBaser  rå   r"   Ú_create_tensorÚ_dygraph_tracerÚtrace_opÚosÚpathrS   rò   ÚitemsÚsortedÚkeysr6   rN   rª   r   Úgrad_var_suffix)Ú
model_pathÚprogram_holderÚparams_filenamerC   Úload_var_dictÚeach_varÚorig_each_nameÚnew_varÚload_var_listÚkÚvÚdict_name_old_newr4   r   rM   r…   Úgrad_var_names                    r   Ú!_load_persistable_vars_by_programr4  �  sa  € ô -¨^×-IÑ-IÓJÐØ€MÜ$ˆØ'×<Ñ<¸X¿]¹]»_ÑMˆÜ˜ >×#?Ñ#?Ô@ä×.Ñ.Ø—n‘nÓ&Ø—n‘nÓ&Ø—]‘]“_Ø—]‘]“_Ø ô‰Gô  ×.Ñ.Ø—]‘]“_Ø—]‘]“_Ø—n‘nÓ&Ø—n‘nÓ&Ø ôˆGð Ð"Ü×%Ñ%Ó'×0Ñ0ØØØ Ð(Ø"¤B§G¡G§L¡L°¸^Ó$LÐMð	 1ô ð !&ˆÔØ)0ˆ�h—m‘m“oÓ&ð7 %ð: Ð"Øˆà+×@Ñ@×FÑFÔHô
ÙH‘T�Q˜ˆAˆq‰DÐHð 	ñ 
ô Ð,×1Ñ1Ó3Ö4ˆDØ× Ñ  Ð/@ÀÑ/FÑ!GÕHð 5ô 	×!Ñ!Ó#×,Ñ,ØØØ˜MÐ*Ø¤§¡§¡¨Z¸Ó IÐJð	 	-ô 	
ó )ˆHÜ  ¨>×+GÑ+GÔHØØ! (§-¡-£/Ñ2ˆEØ"'ˆEÕð	 )ô ' ~×'CÑ'CÓD€MÛ!ˆØ ¤4×#7Ñ#7Ó#9Ñ9ˆØ Ò-Ø48ˆM˜(Ñ#Õ1ð "ð
 Ðùó=
s   Å?J	c                 ó`  — t        |d«      5 }t        j                  |«      }d d d «       i }g }|j                  j	                  «       D ��	ci c]  \  }}	|	|“Œ
 }
}}	t        |
«      D ]£  }|vrt        d|«      ‚|
|   }||   j                  dd «      �=t        j                  dgt        j                  j                  j                  |d¬«      }nt        j                  |d¬«      }||   d   |_        |||<   |j!                  |«       Œ¥ |€J d	«       ‚t"        j$                  j'                  | |«      }t"        j$                  j)                  |«      st+        «      d
k7  rt-        d«      ‚|S t        j.                  «       j1                  di d|id|i¬«       |S # 1 sw Y   �Œ|xY wc c}	}w )Nr   zdThe model to be loaded is not complete.The variable `%s` of program cannot be found in loaded model.Ú	trainablern   T)r  rå   r4   r)   )r4   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£   r$  r%  ÚRuntimeErrorÚgetr   r  r   r#   r$   ÚFP32r  rò   r6   r"  r#  rS   Úexistsrr   r   r   r!  )r(  Úvar_info_pathr)  r*  r   Úextra_var_infor+  r/  ÚkeyÚvalueÚinv_suffix_varname_dictr4   rU   r.  Úvar_file_paths                  r   Ú_load_persistable_varsrB  Ó  sÅ  € ô 
ˆm˜TÔ	" aÜŸ™ Q›ˆ÷ 
#ð €MØ€Mà%3×%HÑ%H×%NÑ%NÔ%PôÙ%P‘z�s˜Eˆˆs‰
Ð%Pð ñ ô Ð.Ö/ˆØ�~Ñ%ÜðPàóð ð +¨4Ñ0ˆà˜$Ñ×#Ñ# K°Ó6ÐBä×.Ñ.Ø�cÜ—l‘l×*Ñ*×/Ñ/ØØ ô	‰Gô  ×.Ñ.°HÈ$ÔOˆGà .¨tÑ 4°_Ñ EˆÔØ")ˆ�hÑØ×Ñ˜WÕ%ð/ 0ð4 Ð&ÐMÐ(MÓMÐ&Ü—G‘G—L‘L ¨_Ó=€MÜ�7‰7�>‰>˜-Ô(Üˆ~Ó !Ò#ÜÐDÓEÐEð Ðô 	×!Ñ!Ó#×,Ñ,ØØØ˜MÐ*Ø Ð.ð	 	-ô 	
ð Ð÷i 
#Ñ	"üós   �FÁF*ÆF'c                 óF   — i }| D ]  }|j                   |   }| |   ||<   Œ |S r>   )r£   )Úvar_dictr)  Úno_suffix_var_dictr…   Úno_suffix_names        r   Ú_remove_varname_suffixrG    s:   € ØÐÛˆØ'×<Ñ<¸XÑFˆØ-5°hÑ-?Ð˜>Ò*ð ð Ðr,   c                 ó¸  — i }|��Ht         j                  j                  |«      }t         j                  j                  | |«      }|d t	        t
        «        }t        j                  | «      D ]Ü  }||k(  r#d}t         j                  j                  | |«      }n›|j                  t
        «      r…|j                  |«      rt|t	        |«      t	        t
        «       dz    j                  d«      }t	        |«      dk(  r7t	        |d   «      dkD  r&|d   }t         j                  j                  | |«      }nŒÅŒÆt        t        |«      «      ||<   ŒÞ |S t        j                  | «      D ]t  \  }}}	|	D ]i  }
d|
v sŒt         j                  j                  | |
«      }|
j                  d«      }|dk(  rd}n|j                  dd«       t        t        |«      «      ||<   Œk Œv |S )	NÚforwardrn   rP   é   r   Úmodelrm   Ú )r"  r#  ÚbasenamerS   rr   ÚINFER_MODEL_SUFFIXÚlistdirÚendswithrÖ   rq   r™   r    ÚwalkÚstriprt   )r(  Úmodel_filenameÚprogram_holder_dictr   Ú
model_nameÚfilenameÚ	func_nameÚparsing_namesrm   Ú
file_namesr4   Úmethod_names               r   Ú_construct_program_holdersr[    s¾  € àÐàÑ!äŸ™×)Ñ)¨.Ó9ˆÜŸ'™'Ÿ,™, z°>ÓBˆØ#Ð$>¤sÔ+=Ó'>Ð&>Ð?ˆ
äŸ
™
 :Ö.ˆHØ Ò)Ø%�	Ü"$§'¡'§,¡,¨z¸>Ó"J‘Ø×"Ñ"Ô#5Ô6¸8×;NÑ;NØô<ð !)Ü˜
“O¤sÔ+=Ó'>Ð&>ÀÑ&Bð!ç‘%˜“*ð ô �}Ó%¨Ò*¬s°=ÀÑ3CÓ/DÀqÒ/HØ -¨aÑ 0�IÜ&(§g¡g§l¡l°:¸xÓ&H‘OààÜ-;Ü" ?Ó3ó.Ð 	Ò*ð# /ðD Ðô !#§¡¨
Ö 3ÑˆAˆq�*Û"�Ø˜d’?Ü&(§g¡g§l¡l°:¸tÓ&D�OØ"&§*¡*¨S£/�KØ" gÒ-Ø&/™à#×+Ñ+¨G°RÔ8Ü7EÜ*¨?Ó;ó8Ð'¨Ò4ñ #ð !4ð Ðr,   c           	      ón  — t        |«      dz   }t        j                  j                  | |«      }t        j                  j                  | t        |«      «      }t        j                  j	                  |«      rút        | ||d   |«      }|d t        t        «        }t        j                  | «      D ]½  }	|	j                  |«      ri|	j                  t        «      rT|	t        |«      t        t        «       dz    j                  d«      }
t        |
«      dk(  rt        |
d   «      dkD  r|
d   }nŒ}Œ~t        j                  j                  | |«      }|j                  t        | |||   |	«      «       Œ¿ n3|�!t        j                  j	                  |«      si S t        | |d   |«      }|st        ||d   «      }|S )Nz.inforI  rn   rP   rJ  r   )Ústrr"  r#  rS   r;  rB  rr   ÚINFER_PARAMS_SUFFIXrO  rÖ   rP  rq   Úupdater4  rG  )r(  Úprogramsr*  Úappend_suffixÚvar_info_filenamer<  Úparams_pathrD  rU  Ú	file_namerX  rW  s               r   Ú_construct_params_and_buffersre  F  s–  € ô ˜OÓ,¨wÑ6ÐÜ—G‘G—L‘L Ð->Ó?€MÜ—'‘'—,‘,˜z¬3¨Ó+?Ó@€Kä	‡w�w‡~�~�mÔ$Ü)Ø˜ x°	Ñ':¸Oó
ˆð %Ð%@¬Ô,?Ó(@Ð'@ÐAˆ
äŸ™ JÖ/ˆIØ×#Ñ# JÔ/°I×4FÑ4FÜ#ô5ð !*Ü˜
“O¤sÔ+>Ó'?Ð&?À!Ñ&Cð!ç‘%˜“*ð ô �}Ó%¨Ò*¬s°=ÀÑ3CÓ/DÀqÒ/HØ -¨aÑ 0‘IààÜŸG™GŸL™L¨Ð5FÓGˆMØ�O‰OÜ&Ø ¨x¸	Ñ/BÀIóõñ 0ð& 
Ð	$¬R¯W©W¯^©^¸KÔ-Hàˆ	ä4Ø˜ Ñ+¨_ó
ˆñ Ü)¨(°H¸YÑ4GÓHˆà€Or,   c                 ó   — | r| S d S r>   © )Úvarss    r   Ú_valid_varsri  t  s   € Ùˆ4Ð!˜TÐ!r,   c                 óÈ	  — g }g }t        |«      D �]  \  }}t        |t        j                  t        j
                  j                  f«      st        dt        |«      z  «      ‚t        |t        j                  «      rRt        j
                  j                  ||j                  |   j                  «       dt        j                  «       d¬«      }n$|}|j                  |   j                  «       |_
        |j                  |j                  «       |j                  |«       �Œ | j                  €-|j                  D �cg c]  }|j                  «       ‘Œ c}| _        g }	|j                  D ]x  }
| j                   |
   }|| j"                  v r|	j                  | j"                  |   «       Œ?|| j$                  v r|	j                  | j$                  |   «       Œlt'        d|
z  «      ‚ g }|j(                  D ]o  }t        j
                  j                  |j+                  «       |j-                  «       |j                  «       |j                  «       d¬«      }|j                  |«       Œq |j.                  g}| j0                  r|j2                  n|j4                  }| j0                  r|j6                  n|j8                  }|j2                  j;                  d«      j=                  «       }d|j;                  d«      d	dd
|d| j0                  dt>        j@                  jC                  || «      d|g}| j0                  se|jE                  d|jF                  jI                  dg «      d|jF                  jI                  dg «      d|jF                  jI                  dg «      f«       d}|jE                  d|f«       |rZ|jE                  d|j;                  d«      f«       | j0                  s,|jE                  d|jJ                  j;                  d«      f«       |jE                  ddg«       tM        jN                  tQ        |«      tQ        |	«      tQ        |«      |d g|¢­Ž  |	D ]s  }|j                  t	        jR                  «       z   }|j;                  d«      jU                  |jW                  «       «      }|€ŒU|jY                  |j                  «       «       Œu |}t[        |«      dk(  r|d   }|S c c}w )Nz^The type of input in TranslatedLayer must be numpy array or Variable(Tensor), but received %s.FT)r?  r4   r)   ÚplaceÚ	zero_copyzFThe persistable variable %s does not exist in current TranslatedLayer.)rå   Údimsr4   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_blockÚin_pir_pt_modern   ).rp   Ú
isinstanceÚnpÚndarrayr   ÚeagerÚTensorÚ	TypeErrorr"   rÁ   r4   r   Ú_current_expected_placer6   Ú_input_args_namesrÆ   Ú_persistable_var_name_dictÚ_parametersÚ_buffersr   rÄ   rå   r  rÈ   Ú_is_testr¹   rª   r¥   r½   r1   r2   r²   ÚutilsÚ_hash_with_idr?   rÊ   r9  r¿   r   Úrun_programri  r'  rÔ   r^   Ú_set_grad_typerr   )rø   rÒ   r)  Ú
input_varsÚinput_var_namesrD   r?  rH   ÚinsrC   r…   Údy_var_nameÚoutput_varsr*   Útmp_scope_vecÚtrace_programr½   r¬   r  rt  Úpersistable_varr3  Úgrad_varÚoutss                           r   Ú_run_dygraphr’  x  sœ  € à€JØ€OÜ˜e×$‰ˆˆ5Ü˜%¤"§*¡*¬d¯j©j×.?Ñ.?Ð!@ÔAÜØpÜ�u“+ñóð ô
 �eœRŸZ™ZÔ(Ü—*‘*×#Ñ#ØØ#×/Ñ/°Ñ2×7Ñ7Ó9Ø!Ü×7Ñ7Ó9Øð $ó ‰Cð ˆCð &×1Ñ1°!Ñ4×9Ñ9Ó;ˆCŒHØ×Ñ˜sŸx™xÔ(Ø×Ñ˜#Öð+ %ð, ×!Ñ!Ð)à"0×"<Ò"<ó&
Ù"<˜3ˆC�H‰H�JÐ"<ñ&
ˆÔ"ð ÐØ"×4Ô4ˆØ×9Ñ9¸(ÑCˆØ˜(×.Ñ.Ñ.Ø×#Ñ# H×$8Ñ$8¸Ñ$EÕFØ˜H×-Ñ-Ñ-Ø×#Ñ# H×$5Ñ$5°kÑ$BÕCäØXØñóð ð 5ð €KØ"×/Ô/ˆÜ�j‰j×ÑØ—.‘.Ó"Ø—‘Ó!Ø—‘“Ø—‘“Øð  ó 
ˆð 	×Ñ˜3Õð 0ð $×)Ñ)Ð*€Mð
 ×Òð 	×$Ò$à×)Ñ)ð ð ×Òð 	×*Ò*à×+Ñ+ð ð
 "×/Ñ/×5Ñ5°aÓ8×@Ñ@ÓB€Lð 	Ø×Ñ˜AÓØØ	ØØØØ×ÑØÜ�‰×"Ñ" =°(Ó;ØØð€Eð ×ÒØ�‰à"Ø×-Ñ-×1Ñ1°'¸2Ó>Ø Ø×-Ñ-×1Ñ1°%¸Ó<ØØ×-Ñ-×1Ñ1°#°rÓ:ðô		
ð ÐØ	‡L�LÐ'Ð)<Ð=Ô>ÙØ�‰à&Ø×%Ñ% aÓ(ðô	
ð × Ò Ø�L‰Là+Ø"×3Ñ3×9Ñ9¸!Ó<ðôð 
‡L�LÐ" EÐ*Ô+ä×ÑÜ�JÓÜÐ$Ó%Ü�KÓ ØØðð 
óó  ,ˆØ'×,Ñ,¬t×/CÑ/CÓ/EÑEˆØ ×&Ñ& qÓ)×2Ñ2°=×3GÑ3GÓ3IÓJˆð ÐØØ×&Ñ& x§}¡}£Õ7ð ,ð €DÜ
ˆ;Ó˜1ÒØ˜1‰~ˆØ€Kùòm&
s   Ä;Sc                 ó  — t        j                  «       }t        |«      }t        ||¬«      \  }}|j	                  «        t        |||| |«       |j                  «        t        |||«      }t        |«      dk(  r|d   }|S )N©rx   rn   r   )	r   Údefault_main_programrI   r‰   rv   Ú_append_blockr�   Ú_get_output_from_programrr   )rÒ   r)  rŽ  Úmain_programÚparam_var_namesrm   ry   r‘  s           r   Ú_run_static_graphrš    s�   € Ü×1Ñ1Ó3€LÜ0°Ó?€OÜ!9Ø˜ô"Ñ€AÐð ×ÑÔäØØØØØôð ×ÑÔ!Ü#Ø�nÐ&=ó€Dô ˆ4ƒy�A‚~Ø�A‰wˆØ€Kr,   c                 óØ   — g }|dk  r|S | j                  |«      j                  D ]  }|j                  |«       Œ | j                  |«      j                  }|dkD  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   ro   )r1   rh  r6   Ú
parent_idxÚ_collect_current_and_parent_var)ré   r:   rh  rH   rœ  s        r   r�  r�  $  sl   € ð €DØ�1‚}ØˆØ�}‰}˜YÓ'×,Ô,ˆØ�‰�CÕð -à—‘˜yÓ)×4Ñ4€JØ�B‚ØÔ/°¸ÓDÑDˆØ€Kr,   c                 óv  — | j                   }t        | |«      }t        | j                  |«      |j                  d«      |¬«       |j                  D �cg c]  }|j                  «       ‘Œ }}|D �cg c]  }|j
                  ‘Œ }	}t        |«      t        |	«      k7  r-t        dj                  t        |«      t        |	«      «      «      ‚t        |«      D ]8  \  }
}|r||   }| j                  |«      j                  dd|	|
   gid|gi¬«       Œ: t        | j                  |«      |j                  d«      «      }| j                  «        | j                  dz
  }d}|j                  «       dkD  rxt        d|j                  «       «      D ][  }|j                  |«      }|j                  }|dkD  r||z   }n|}| j!                  |¬	«      }t        |||¬«       |t        ||«      z  }Œ] | j                  «        |D ]Ÿ  }|j#                  d
«      sŒ|j%                  d
«      }t'        |t(        j*                  j,                  «      r|j.                  }t'        |t(        j0                  «      r|j2                  }|j5                  d
| j                  |z   «      «       Œ¡ | j                  «        || _         yc c}w c c}w )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 {}, but received {}.ÚassignrÍ   rÎ   )r"   r	  rû   rn   )rœ  Ú	sub_blockN)Úcurrent_block_idxr�  Ú!append_var_from_block_desc_staticr1   rÁ   r4   rr   r   Úformatrp   Ú	append_opÚ append_op_from_block_desc_staticr�   r0   r/   ÚparentÚ_create_blockr”   Úattrrx  r   r   Ú	BlockDescÚidr�   Úidxr•   )Údest_programÚsrc_program_descr)  Úinput_variablesry   Úorigin_block_idxr™  ÚinpÚname_inp_descÚinput_namesrD   Úout_nameÚ
append_opsÚoffset_block_idxrœ  Úsrc_block_idxÚ	src_blockÚsrc_parent_idxÚ
dest_blockr3   ÚsubÚ	origin_ids                         r   r–  r–  :  s®  € ð& $×5Ñ5ÐÜ5ØÐ&ó€Oô &Ø×ÑÐ+Ó,Ø×Ñ˜qÓ!Øõð ,:×+EÒ+EÓFÑ+E C�S—X‘X•ZÐ+E€MÐFÙ'6Ó7¡ �3—8“8 €KÐ7Ü
ˆ=ÓœS Ó-Ò-ÜØK×RÑRÜ�MÓ"¤C¨Ó$4óó
ð 	
ô
 ! Ö/‰ˆˆ8Ù"Ø.¨xÑ8ˆHØ×ÑÐ+Ó,×6Ñ6ØØ˜+ a™.Ð)Ð*Ø˜X˜JÐ'ð 	7õ 	
ð 0ô 2Ø×ÑÐ+Ó,Ð.>×.DÑ.DÀQÓ.Gó€Jð ×ÑÔ!à#×.Ñ.°Ñ2ÐØ€JØ×"Ñ"Ó$ qÒ(Ü" 1Ð&6×&AÑ&AÓ&CÖDˆMØ(×.Ñ.¨}Ó=ˆIØ&×-Ñ-ˆNØ Ò!Ø-°
Ñ:‘
à-�
Ø%×3Ñ3¸zÐ3ÓJˆJÜ-Ø˜I¨õð Ô:Ø˜Ióñ ‰Jð Eð ×ÑÔ!ÛˆØ�;‰;�{Õ#Ø—'‘'˜+Ó&ˆCÜ˜#œyŸ~™~×7Ñ7Ô8ØŸF™F�	Ü˜#œyŸ™Ô/ØŸG™G�	Ø�L‰LØ˜\×/Ñ/Ð0@À9Ñ0LÓMõð ð ×ÑÔ!Ø%5€LÕ"ùòi GùÚ7s   ÁJ1Á0J6c                 ó  — g }|j                   D ]n  }t        | j                  «      D ]T  }| j                  |«      j                  }|j                  «       }|r||   }||v sŒ:||   }||vsŒD|j                  |«       ŒV Œp |S )zB
    Get output name of 'program' according to program_holder
    )rÄ   r/   r0   r1   rh  r4   r6   )	ré   r)  ry   r‘  rH   r«  rh  r…   rì   s	            r   r—  r—  Ž  s…   € ð €DØ×*Ô*ˆÜ˜×+Ñ+Ö,ˆCØ—=‘= Ó%×*Ñ*ˆDØ—x‘x“zˆHÙ&Ø2°8Ñ<�Ø˜4ÒØ˜8‘n�Ø˜d’?Ø—K‘K Õ$ñ -ð +ð €Kr,   c           	      óš   — g }t        |j                  «       «      D ],  }|j                  t        | |j	                  |«      «      «       Œ. |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.
    )r/   r2   r6   Úappend_op_from_desc_staticr3   )r1   Úsrc_block_descró   rD   s       r   r¥  r¥  ¢  sE   € ð €CÜ�>×)Ñ)Ó+Ö,ˆØ�
‰
Ô-¨e°^×5FÑ5FÀqÓ5IÓJÕKð -à€Jr,   c                 óè   — |j                  «       }| j                  j                  «       }|j                  |«       t	        j
                  | ||ddd¬«      }| j                  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)r1   rŒ   r"   r	  rû   r  )r"   rŒ   r¤  Ú	copy_fromr   ÚOperatorró   r6   )r1   Úop_descÚop_typeÚ	op_appendr3   s        r   r¾  r¾  ³  sj   € ð �l‰l‹n€GØ—
‘
×$Ñ$Ó&€IØ×Ñ˜Ô Ü	×	Ñ	ØØØØØØô
€Bð 
‡I�I×Ñ�RÔØ€Ir,   c                 ó¨  — g }|j                  «       D �]»  }|j                  «       }|du xs ||v xr
 |du xs ||v}| j                  |«      rŒ<|sŒ?|j                  «       }|t        j
                  j                  j                  t        j
                  j                  j                  t        j
                  j                  j                  fv r!|j                  «       }	|j                  «       }
nd}	d}
|t        j
                  j                  j                  t        j
                  j                  j                  fv r|j                  «       }nd}|j                  «       r| j                  j                  «       }n| }|j!                  |j#                  |j                  «       |	||
||j                  «       |j%                  «       ¬«      «       �Œ¾ |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)r4   rå   r"   r  Ú	lod_levelr)   Úset_need_check_feed)rB   r4   ru   r"   r   r#   r$   ÚSELECTED_ROWSrö   ÚLOD_TENSOR_ARRAYrå   r  rÇ  r)   ré   rè   r6   rõ   Úneed_check_feed)r1   r¿  rw   rx   Úvars_appendr*   Úvar_desc_nameÚshould_appendÚvar_typeÚ	data_typeÚ	var_shaperÇ  Úcurrent_blocks                r   r¢  r¢  Í  sš  € ð" €KØ"×+Ñ+×-ˆØ Ÿ™›ˆØ  D˜ÒD¨M¸WÐ,Dò 
Ø�tˆOÒ;˜}°GÐ;ð 	ð �}‰}˜]Õ+²Ø—}‘}“ˆHØÜ—‘×$Ñ$×2Ñ2Ü—‘×$Ñ$×/Ñ/Ü—‘×$Ñ$×5Ñ5ðñ ð
 %ŸN™NÓ,�	Ø$ŸN™NÓ,‘	à �	Ø �	ØÜ—‘×$Ñ$×/Ñ/Ü—‘×$Ñ$×5Ñ5ðñ ð %×.Ñ.Ó0‘	à �	à×#Ñ#Ô%Ø %§¡× :Ñ :Ó <‘à %�à×ÑØ×(Ñ(Ø!Ÿ™›Ø#Ø!Ø#Ø'Ø (× 4Ñ 4Ó 6Ø(0×(@Ñ(@Ó(Bð )ó ö
ð= .ðR Ð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 )ÚTranslatedLayera6  
    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):
            ...     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  |j                  «       D ]¯  \  }}t        |t        j                  «      r1t        t        «      }|| j                  |<   | j                  ||«       ŒQt        |t        j                   j"                  «      r1t        t$        «      }|| j                  |<   | j'                  ||«       Œ¦t	        d«      ‚ 	 d d d «       d| _        d | _        y # 1 sw Y   ŒxY w)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œ   rx  Údictr}  Ú_program_holder_dictr€  r   Úguardr$  r   r  rZ   ÚPARAMETER_NAME_PREFIXÚadd_parameterr   r{  r|  ÚBUFFER_NAME_PREFIXÚregister_bufferrƒ  r  )r¦   r`  rC   r4   rH   Údy_namer§   s         €r   rœ   zTranslatedLayer.__init__j  s%  ø€ Ü‰ÑÔä˜(¤DÔ)ÜØWóð ô Ð*¬DÔ1ÜØ[óð ð %-ˆÔ!ð +-ˆÔ'ä×ÑÕ Ø-×3Ñ3Ö5‘	��cÜ˜c¤9×#;Ñ#;Ô<Ü7Ô8MÓN�GØ<C�D×3Ñ3°DÑ9Ø×&Ñ& w°Õ4Ü ¤T§Z¡Z×%6Ñ%6Ô7Ü7Ô8JÓK�GØ<C�D×3Ñ3°DÑ9Ø×(Ñ(¨°#Õ6ä#ØYóð ñ 6÷ !ð ˆŒØ!%ˆÕ÷! !Ð ús   Á(CEÅEc           	      ó:  — t         j                  j                  | «      } t         j                  j                  | «      st	        d| z  «      ‚d }d }|�|j
                  }|j                  }t        | |«      }t        | ||«      }t        ||«      }|j                  «       D ]c  \  }}|j                  €-|j                  D �	cg c]  }	|	j                  «       ‘Œ c}	|_        t        t        |t        j                  ||«      «       Œe |j!                  «        |S c c}	w )Nz There is no directory named '%s')r"  r#  ÚnormpathÚisdirr   rS  r*  r[  re  rÔ  r$  r  rÁ   r4   ÚsetattrÚ_execution_method_creatorÚeval)
r(  ÚconfigsrS  r*  r`  rC   Útranslated_layerrZ  r)  rŠ  s
             r   Ú
_constructzTranslatedLayer._construct“  s  € ô —W‘W×%Ñ% jÓ1ˆ
Ü�w‰w�}‰}˜ZÔ(ÜÐ?À*ÑLÓMÐMØˆØˆØÐØ$×3Ñ3ˆNØ%×5Ñ5ˆOô .¨j¸.ÓIˆô 9Ø˜ /ó
Ðô
 +¨8Ð5EÓFÐð ,4¯>©>Ö+;Ñ'ˆK˜Ø×1Ñ1Ð9à*8×*DÒ*Dó6Ù*D 3�C—H‘H•JÐ*Dñ6Ð Ô2ô ÜØÜ×9Ñ9Ø óõð ,<ð 	×ÑÔàÐùò6s   Ã Dc                 ó    ‡— ˆfd„Š| ‰_         ‰S )Nc                 ó
  •— | j                   ‰j                     }t        «       rt        | ||«      S t        j
                  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__À  sq   ø€ Ø!×6Ñ6°{×7KÑ7KÑLˆNô Ô Ü# D¨%°Ó@Ð@ô ×%Ñ%×:Ñ:Ü×$Ñ$ ^×%AÑ%AÓBó�ô )¨°ÀÇÁÓGÐGr,   )r  )rZ  r)  rë  s     @r   râ  z)TranslatedLayer._execution_method_creator¾  s   ø€ ô	Hð   +ˆÔØÐr,   c                 ó    — d| _         d| _        y r.   ©rƒ  Útrainingr¯   s    r   ÚtrainzTranslatedLayer.trainÓ  s   € ØˆŒØˆ�r,   c                 ó    — d| _         d| _        y )NTFrí  r¯   s    r   rã  zTranslatedLayer.eval×  s   € ØˆŒØˆ�r,   c                 óV   — | j                  |«      }|j                  }t        |«      }|S )a?  
        Gets translated program of specified method.

        Args:
            - method_name (string): mehtod 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):
                ...     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¦   rZ  r)  r   ré   s        r   ré   zTranslatedLayer.programÛ  s3   € ðl ×1Ñ1°+Ó>ˆð &×3Ñ3ˆô )¨Ó6ˆØˆr,   c                 ó^   — | j                   j                  |d «      }|€t        d|z  «      ‚|S )Nz9The method `%s` does not exist in loaded TranslatedLayer.)r×  r9  r   )r¦   rZ  r)  s      r   rò  z#TranslatedLayer._get_program_holder:  s@   € Ø×2Ñ2×6Ñ6°{ÀDÓIˆØÐ!ÜØKØñóð ð Ðr,   c                 ó  — | j                  |«      }g }|j                  D ]_  }t        j                  j	                  |j                  «       |j                  «       |j                  «       ¬«      }|j                  |«       Œa |S ©N)r  rå   r4   )	rò  rÁ   r²   r³   Ú	InputSpecr  rå   r4   r6   )r¦   rZ  r)  Ú
input_specr*   Úspecs         r   Ú_input_speczTranslatedLayer._input_specC  sw   € à×1Ñ1°+Ó>ˆð ˆ
Ø&×2Ô2ˆHÜ—=‘=×*Ñ*Ø—n‘nÓ&Ø—n‘nÓ&Ø—]‘]“_ð +ó ˆDð
 ×Ñ˜dÕ#ð 3ð Ðr,   c                 ó  — | j                  |«      }g }|j                  D ]_  }t        j                  j	                  |j                  «       |j                  «       |j                  «       ¬«      }|j                  |«       Œa |S rõ  )	rò  rÄ   r²   r³   rö  r  rå   r4   r6   )r¦   rZ  r)  Úoutput_specr*   rø  s         r   Ú_output_speczTranslatedLayer._output_specS  sy   € à×1Ñ1°+Ó>ˆð ˆØ&×3Ô3ˆHô —=‘=×*Ñ*Ø—n‘nÓ&Ø—n‘nÓ&Ø—]‘]“_ð +ó ˆDð
 ×Ñ˜tÕ$ð 4ð Ðr,   r>   )rI  )r  r  r  r  rœ   Ústaticmethodr   Údygraph_onlyræ  râ  rï  rã  ré   rò  rù  rü  r  r  s   @r   rÔ  rÔ    sg   ø„ ñ\ô|'&ðR Ø×Ñò' ó ó ð' ðR ñó ðò(òó]ó~ó÷ r,   rÔ  )NNr>   )NT)Ar"  r7  Únumpyry  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__rN  r^  ÚINFER_PARAMS_INFO_SUFFIXÚINFER_PROPERTY_SUFFIXrQ   rÙ  rÛ  r    r+   r<   rE   rI   rN   rV   rZ   rc   rf   rk   r‰   r‘   r—   r™   r4  rB  rG  r[  re  ri  r’  rš  r�  r–  r—  r¥  r¾  r¢  ÚLayerrÔ  rg  r,   r   Ú<module>r     sq  ðó 
Û ã ã Ý  ß >Ó >Ý .Ý ;Ý /Ý ,÷õ <Ý "à
€àÐ Ø"Ð Ø,Ð ØÐ àÐ ØÐ ØÐ ò
ò"òò0òòð ñó ðð ñ;ó ð;òð$ ñ(ó ð(òó@<ðF ñó ðò1÷kñ kðX
 15óCòL8òxó,ð` ?Có+ò\"òQòhò0ð6 !óQ6ðj 6:óò(ò"ð6 26ó;ô|Y�f—l‘lõ Yr,   