
    ϑi:t                    *   S SK Jr  S SKrS SKrS SKrS SK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  / rSrS	S
KJrJrJr  S r\S 5       r\S 5       rS SKJr  S r " S S5      rS rSS jrSS jr S r!S r"S r# " S S\RH                  5      r%g)    )annotationsN)core	frameworkunique_name)switch_to_static_graph)in_dynamic_mode)layers)datatype_to_vartypez.json   )BUFFER_NAME_PREFIXINFER_PARAMS_SUFFIXPARAMETER_NAME_PREFIXc                    [         R                  R                  5       n[         R                  R                  R                  X5      nX4$ N)paddlestaticProgrambaser   deserialize_pir_program)model_file_pathprogram	trainables      _/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/jit/pir_translated_layer.py_load_pir_programr   '   s<    mm##%G  88I     c                .    [         R                  " U 5      $ r   )r   generate_with_ignorable_keyprefixs    r   _generate_unique_var_namer    0   s    226::r   c                .    [         R                  " U 5      $ r   )r   generater   s    r   r    r    5   s    ''r   )get_pir_parametersc                   / n/ n0 n[        U 5      u  pEXE-   nU Hc  nUR                  U5        UR                  n[        UR                  5      Ul        XUR                  '   UR                  UR                  5        Me     UUU4$ r   )r#   appendnamer    )	r   persistable_varspersistable_namesrename_new_old_dictparamoptvarsvarorigin_names	            r   _get_pir_parameters_var_namesr/   =   s    #G,JE;D$hh,SXX6(3CHH%  *  	 r   c                  ~   ^  \ rS rSrU 4S jrS r\S 5       r\S 5       r\S 5       r	\S 5       r
\S 5       rS	rU =r$ )
_PirProgramHolderQ   c                   > [         TU ]  5         / U l        / U l        / U l        / U l        X l        S U l        Xl        U R                  5         g r   )
super__init___input_vars_output_vars_parameter_vars_parameter_namessupport_train_suffix_varname_dict_infer_program_preprocess)selfr   r   	__class__s      r   r5   _PirProgramHolder.__init__R   sP     ! "&$(!%r   c                   [        U R                  5      u  U l        U l        U l        U R                  R                  5       nUR                   GH  nUR                  5       S:X  a+  U R                  R                  UR                  S5      5        OUR                  5       S:X  a  UR                  5       S   nUR                  S5      nU   [        R                  R                  UUR                  UR                   [        R"                  R$                  R'                  5       S9nUR)                  U5        UR+                  5       R-                  U5        S S S 5        UR/                  U5        UR                  5       S:X  d  GM8  U R0                  R                  UR3                  S5      5        U   [        R                  R5                  UR3                  S5      S[7        [9        U R0                  5      S-
  5      -   5        S S S 5        UR/                  U5        GM     g ! , (       d  f       N= f! , (       d  f       N6= f)	Nz
pd_op.datar   z
pd_op.feedr&   )r&   shapedtypeplacezpd_op.fetchoutput_r   )r/   r<   r8   r9   r;   global_blockopsr&   r6   r%   resultattrr   _pir_opsdatarB   rC   r   r   Placereplace_all_uses_withget_defining_opmove_before	remove_opr7   operand_sourceset_persistable_valuestrlen)r>   blockopvar_name	org_valuevalues         r   r=   _PirProgramHolder._preprocessb   s   
 *$*=*=>		
 !%##002))BwwyL(  ''		!5l*779V,IIaL	"OO00%'oo'oo$kk..446	 1 E 33E:))+77;  #wwyM)!!(():):1)=>OO99))!,!CD,=,=(>(B$CC 
 #/  U Us   BH$3AH5$
H2	5
I	c                    U R                   $ r   )r<   r>   s    r   infer_program_PirProgramHolder.infer_program   s    """r   c                    U R                   $ r   )r6   r\   s    r   
input_vars_PirProgramHolder.input_vars   s    r   c                    U R                   $ r   )r7   r\   s    r   output_vars_PirProgramHolder.output_vars   s       r   c                    U R                   $ r   )r9   r\   s    r   r(   #_PirProgramHolder.persistable_names   s    $$$r   c                    U R                   $ r   )r8   r\   s    r   r'   "_PirProgramHolder.persistable_vars   s    ###r   )r<   r6   r7   r9   r8   r;   r:   )__name__
__module____qualname____firstlineno__r5   r=   propertyr]   r`   rc   r(   r'   __static_attributes____classcell__r?   s   @r   r1   r1   Q   sr     $@ # #     ! ! % % $ $r   r1   c           
     z   0 n/ n0 n/ nUR                   nUR                  nU V	s/ s H  n	UR                  U	   PM     n
n	[        [	        X5      5       GH+  u  pUR
                  (       a  [        R                  " UR                  [        R                  R                  R                  UR                  SS9nUR                  Ul        XU'   UR                  U5        UR                  UR!                  5       5        M  [        R"                  R%                  [&        UR(                     UR                  UR                  [        R                  R                  R*                  [        R,                  " 5       SS9nXU'   GM.     Uc   S5       e[.        R0                  R3                  X5      n[.        R0                  R5                  U5      (       aE  [        R6                  " U[9        UR;                  5       5      US[        R,                  " 5       5        O[=        SU S35      eUR?                  U5        U$ s  sn	f )NT)rB   rC   r&   persistableF)rC   dimsr&   typerD   rr   z#params_filename should not be None.z	The file z- does not exist. Please check the model path.) r'   r(   r;   sortedziprr   r   EagerParamBaserB   r   VarDescVarTypeFP32r&   stop_gradientr%   
get_tensoreagerTensorr
   rC   DENSE_TENSOR_current_expected_placeospathjoinexistsload_combine_funclistkeys
ValueErrorupdate)
model_pathprogram_holderparams_filenameload_var_dictload_var_listother_var_dictload_densetensor_listpersistable_varpersistable_var_namerW   origin_persistable_var_namer&   r-   new_varvar_file_paths                  r   _load_pir_parameter_varsr      s   MMN$55O);; -#,H 	++H5,   # C ;MN	??..iill**//XX 	G %($5$5G!")$  )!((););)=> jj'')#))4YYXX\\))66779! ( G $+4 1 O6 &M(MM&GGLL=M	ww~~m$$##%&!--/	
 &ST
 	
 (_#s   H8c                   0 nUGbY  [         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      u  p[        X5      X&'   M     U$ [         R                  " U 5       H|  u    pU Hp  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      u  p[        X5      X-'   Mr     M~     U$ )	Nforwardr   .   r   model_ )r   r   basenamer   rT   PIR_INFER_MODEL_SUFFIXlistdirendswith
startswithsplitr   r1   walkstripreplace)r   model_filenameprogram_holder_dictr   
model_namefilename	func_nameparsing_namesr   r   r   
file_namesr&   method_names                 r   _construct_program_holdersr      s   !)).9'',,zB#$Bs+A'B&BC


:.H)%	"$'',,z"J""& %%j11 (
Os+A'B&BQ&F!%*  }%*s=3C/Dq/H -a 0I&(ggll:&HO!2?!CG->.*% /H  !#
 3Aq"d?&(ggll:&DO"&**S/K"g-&/#++GR8):?)K&G7H8'4 # !4 r   c                v   [         R                  R                  U [        U5      5      nUb&  [         R                  R	                  U5      (       d  0 $ [        X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  UR                  [        XU   U5      5        M     U$ )Nr   r   r   r   r   )r   r   r   rS   r   r   rT   r   r   r   r   r   r   )	r   programsr   params_pathvar_dictr   	file_namer   r   s	            r   _construct_params_and_buffersr   !  s!   '',,z3+?@K"277>>++F+F	++_
 %%@,?(@'@A
J/I##J//I4F4F#5 5 !*
Os+>'?&?!&C!%*  }%*s=3C/Dq/H -a 0IOO( 3Y 0( r   c           	         / n/ n[        U5       GH  u  pg[        U[        R                  [        R
                  R                  45      (       d  [        S[        U5       S35      e[        U[        R                  5      (       aL  [        R
                  R                  UUR                  U   R                  S[        R                  " 5       SS9nO UnUR                  U   R                  Ul
        UR                  UR                  5        UR                  U5        GM     U R                  U5      Gc   / n	UR                   V
s/ s H  n
UR                   U
   PM     nn
U 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   SS	KJn  UR                  nUR.                  nXR0                  4nU" UR2                  UUU5      nU R5                  UU5        U R                  U5      nU R6                  (       a  SUl        O#UR:                  (       d  [)        S
5      eSUl        U" U5      $ s  sn
f )Nz^The type of input in PirTranslatedLayer must be numpy array or Variable(Tensor), but received r   FT)rY   r&   rr   rD   	zero_copyzThe persistable variable z. does not exist in current PirTranslatedLayer.r   )PartialProgramLayerz@The model is not trainable, please check model_file of jit.save.)	enumerate
isinstancenpndarrayr   r}   r~   	TypeErrorrt   r`   r&   r   r   r%   _get_partial_program_layerr(   r;   _persistable_var_name_dict_parameters_buffersr   (paddle.jit.dy2static.pir_partial_programr   rc   r'   r]   _set_partial_program_layer_is_testtrainingr:   )instanceinputr   r   input_tensorsinput_tensor_namesirY   tensorpersistable_tensorsrW   r   dy_var_namer   inputsoutputs
parameterslayers                     r   _run_dygraphr   D  sm   Me$%"**djj.?.?!@AApquv{q|p}}~  eRZZ((ZZ&&#..q166!779 ' F F )33A6;;FK!!&++.V$) %, **;7?  +<<'
< //9< 	$ '
 4H"==hGK222#**8+?+?+LM 1 11#**8+<+<[+IJ /z9gh  4 	Q** ,,)+J+JK
#((	
 	++K?//<E++R  "ENO'
s   Jc           	        [         R                  R                  5       n[         R                  R	                  5       n[        UR                  5       R                  5      nUR                  5       R                   H  nUR                  5       S:X  d  M  UR                  5       R                  SU  H  nUR                  5       UR                  5       :X  d  M'  UR                  S5      R                  UR                  S5      R                  :X  d  Ma  [        UR                  5       5       H3  nUR                  UR                  U5      UR                  U5      5        M5     M     M     UR                  n	[        U	5      [        U 5      :w  a$  [        S[        U	5       S[        U 5       S35      e[        X5       H  u  pUR                  X5        M     [         R                  R!                  5       nUR#                  5       nUR%                  XM5        UR&                   Vs/ s H  oR)                  U5      PM     nn[        U5      S:X  a  US   $ U$ s  snf )z[
This function is used when the pirTranslatedLayer is
applied for dy_to_static conversion.
zbuiltin.parameterNr   z)The number of input is invalid, expected z, but received r   r   )r   r   default_main_programpir	IrMappingrT   rF   rG   r&   rH   rangenum_resultsaddr`   r   rv   get_current_insertion_pointrU   copy_to_blockrc   look_up)r   r   src_programdst_program	value_map
len_dst_opdst_opsrc_opr   
src_inputs	src_inputinput_current_insert_pointcurrent_blockvoutputs                   r   _run_static_graphr     s   
 --446K

$$&I [--/334J**,00;;=//%22488*EKKMV[[]2a(--q1A1F1FF"6#5#5#78!fmmA&6a8HI 9 F 1  **J
:#f+%7J7HX[\bXcWddef
 	
 !4	i( 5 "::AAC(..0Mi7,:,F,FG,Fq",FFGFq(6!94f4 Hs   #I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   )rU   r,   r%   
parent_idx_collect_current_and_parent_var)r   	block_idxr,   r-   r   s        r   r   r     sj     D1}}}Y',,C -y)44JB/DDKr   c                     ^  \ rS rSrSr    SU 4S j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S rSrU =r$ )PirTranslatedLayeri  a  
PirTranslatedLayer 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 PirTranslatedLayer 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 PirTranslatedLayer
        >>> # 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        0 U l        g ! , (       d  f       N$= f)NzHPirTranslatedLayer need to use _ProgramHolder's dict for initialization.zLPirTranslatedLayer need to use persistable variable dict for initialization.z?Adding persistent variable which  to layer is not supported nowT)r4   r5   r   dictr   _program_holder_dictr   r   guarditemsr   rw   r    r   add_parameterr   r}   r~   r   register_bufferr   _input_args_names_partial_program_layers)r>   r   r'   r&   r-   dy_namer?   s         r   r5   PirTranslatedLayer.__init__&  s/   
 	(D))Z  *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           	     @   [         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        Ha  u  pxUR                  c+  UR                   V	s/ s H  oR                  PM     sn	Ul        [        [        U[        R                  Xx5      5        Mc     UR!                  5         U$ s  sn	f )NzThere is no directory named '')r   r   normpathisdirr   r   r   r   r   r   r   r   r`   r&   setattr_execution_method_creatoreval)
r   configsr   r   r   r'   translated_layerr   r   inss
             r   
_constructPirTranslatedLayer._constructT  s    WW%%j1
ww}}Z((<ZLJKK$33N%55O .jI 9/

 .hI ,4>>+;'K119(6(A(A6(AHH(A6 2 ""<< ,< 	6s   Dc                &   ^ ^ UU 4S jmT Tl         T$ )Nc                   > U R                   TR                     n[        5       (       a  [        XUT5      $ [	        XUR
                  5      $ r   )r   ri   r   r   r   r]   )r>   r   r   __i_m_p_l__r   s      r   r  APirTranslatedLayer._execution_method_creator.<locals>.__i_m_p_l__  sK    !66{7K7KLN   #DMM(>+G+G r   )ri   )r   r   r  s   ` @r   r  ,PirTranslatedLayer._execution_method_creator  s    		  +r   c                     SU l         SU l        g )NFTr   r   r\   s    r   trainPirTranslatedLayer.train  s    r   c                     SU l         SU l        g )NTFr  r\   s    r   r  PirTranslatedLayer.eval  s    r   c                @    U R                  U5      nUR                  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   r   r   s       r   r   PirTranslatedLayer.program  s'    l 11+> !..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 PirTranslatedLayer.)r   getr   )r>   r   r   s      r   r  &PirTranslatedLayer._get_program_holder  sB    2266{DI!{m+YZ  r   c                    U R                  U5      n/ nUR                   HQ  n[        R                  R	                  UR
                  UR                  UR                  S9nUR                  U5        MS     U$ N)rB   rC   r&   )	r  r`   r   r   	InputSpecrB   rC   r&   r%   )r>   r   r   
input_specr-   specs         r   _input_specPirTranslatedLayer._input_spec  so    11+> 
!,,C==**iiiiXX + D
 d# - r   c                    U R                  U5      n/ nUR                   HQ  n[        R                  R	                  UR
                  UR                  UR                  S9nUR                  U5        MS     U$ r  )	r  rc   r   r   r  rB   rC   r&   r%   )r>   r   r   output_specr-   r  s         r   _output_specPirTranslatedLayer._output_spec  sq    11+> !--C ==**iiiiXX + D
 t$ . r   c                :    U R                   R                  US 5      $ r   )r   r  )r>   r   s     r   r   -PirTranslatedLayer._get_partial_program_layer  s    ++//TBBr   c                     X R                   U'   g r   )r   )r>   r   r   s      r   r   -PirTranslatedLayer._set_partial_program_layer"  s    49$$[1r   )r   r   r   r   r   r   )r   z dict[str, paddle.static.Program]r'   zdict[str, paddle.Tensor]r   )r   )ri   rj   rk   rl   __doc__r5   staticmethodr   dygraph_onlyr  r  r  r  r   r  r  r#  r   r   rn   ro   rp   s   @r   r   r     s    \|,*2,* 3,*\ '   ' R  [z &C: :r   r   r   )&
__future__r   r   numpyr   r   paddle.baser   r   r   paddle.base.dygraph.baser   paddle.frameworkr   paddle.nn.layerr	   paddle.pir.corer
   __all__r   r  r   r   r   r   r    paddle.static.pir_ior#   r/   r1   r   r   r   r   r   r   Layerr    r   r   <module>r7     s    # 	   4 4 ; , " /
    ; ; ( ( 4(C$ C$J7t.b FD N#5L,\: \:r   