
    x-j:t                    6   d dl mZ d dlZd dlZd dlZd dl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 g ZdZd	d
lmZmZmZ d Zed             Zed             Zd dlmZ d Z G d d          Zd ZddZddZ d Z!d Z"d Z# G d dej$                  Z%dS )    )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                    t           j                                        }t           j        j                            | |          }||fS N)paddlestaticProgrambaser   deserialize_pir_program)model_file_pathprogram	trainables      _/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/jit/pir_translated_layer.py_load_pir_programr   '   sA    m##%%G 88 I I    c                *    t          j        |           S r   )r   generate_with_ignorable_keyprefixs    r   _generate_unique_var_namer    0   s    26:::r   c                *    t          j        |           S r   )r   generater   s    r   r    r    5   s    '''r   )get_pir_parametersc                   g }g }i }t          |           \  }}||z   }|D ][}|                    |           |j        }t          |j                  |_        |||j        <   |                    |j                   \|||fS 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,,JE33;D + +$$$h,SX66(3CH%  **** 	 r   c                       e Zd Z fdZd Zed             Zed             Zed             Zed             Z	ed             Z
 xZS )_PirProgramHolderc                    t                                                       g | _        g | _        g | _        g | _        || _        d | _        || _        | 	                                 d S r   )
super__init___input_vars_output_vars_parameter_vars_parameter_namessupport_train_suffix_varname_dict_infer_program_preprocess)selfr   r   	__class__s      r   r4   z_PirProgramHolder.__init__R   sk     ! "&$(!%r   c                   t          | j                  \  | _        | _        | _        | j                                        }|j        D ]}|                                dk    r/| j        	                    |
                    d                     n |                                dk    r|                                d         }|
                    d          }|5  t          j                            ||j        |j        t          j        j                                                  }|                    |           |                                                    |           d d d            n# 1 swxY w Y   |                    |           |                                dk    r| j        	                    |                    d                     |5  t          j                            |                    d          dt7          t9          | j                  dz
            z              d d d            n# 1 swxY w Y   |                    |           d S )	Nz
pd_op.datar   z
pd_op.feedr&   )r&   shapedtypeplacezpd_op.fetchoutput_r   )r/   r;   r7   r8   r:   global_blockopsr&   r5   r%   resultattrr   _pir_opsdatar@   rA   r   r   Placereplace_all_uses_withget_defining_opmove_before	remove_opr6   operand_sourceset_persistable_valuestrlen)r=   blockopvar_name	org_valuevalues         r   r<   z_PirProgramHolder._preprocessb   s   
 *$*=>>		
 !%#0022) 	$ 	$BwwyyL(( ''		!5555l**7799V,IIaLL	 < <"O00%'o'o$k.4466	 1  E 33E:::))++77;;;< < < < < < < < < < < < < < < ###wwyyM))!(():):1)=)=>>>  O99))!,,!CD,=(>(>(B$C$CC                
 ###/	$ 	$s&   BE22E6	9E6	AH>>I	I	c                    | j         S r   )r;   r=   s    r   infer_programz_PirProgramHolder.infer_program   s    ""r   c                    | j         S r   )r5   rY   s    r   
input_varsz_PirProgramHolder.input_vars   s    r   c                    | j         S r   )r6   rY   s    r   output_varsz_PirProgramHolder.output_vars   s      r   c                    | j         S r   )r8   rY   s    r   r(   z#_PirProgramHolder.persistable_names   s    $$r   c                    | j         S r   )r7   rY   s    r   r'   z"_PirProgramHolder.persistable_vars   s    ##r   )__name__
__module____qualname__r4   r<   propertyrZ   r\   r^   r(   r'   __classcell__r>   s   @r   r1   r1   Q   s             $ $ $@ # # X#     X  ! ! X! % % X% $ $ X$ $ $ $ $r   r1   c           	        i }g }i }g }j         }j        }fd|D             }	t          t          |	|                    D ]\  }
}|j        rt          j        |j        t          j	        j
        j        |j        d          }|j        |_        |||
<   |                    |           |                    |                                           t          j                            t$          |j                 |j        |j        t          j	        j
        j        t          j                    d          }|||
<   |
J d            t,          j                            | |          }t,          j                            |          rIt          j        |t7          |                                          |dt          j                               nt;          d| d          |                    |           |S )	Nc                *    g | ]}j         |         S  r:   .0rU   program_holders     r   
<listcomp>z,_load_pir_parameter_vars.<locals>.<listcomp>   s1     # # # 	+H5# # #r   T)r@   rA   r&   persistableF)rA   dimsr&   typerB   ro   z#params_filename should not be None.z	The file z- does not exist. Please check the model path.)r'   r(   sortedzipro   r   EagerParamBaser@   r   VarDescVarTypeFP32r&   stop_gradientr%   
get_tensoreagerTensorr
   rA   DENSE_TENSOR_current_expected_placeospathjoinexistsload_combine_funclistkeys
ValueErrorupdate)
model_pathrm   params_filenameload_var_dictload_var_listother_var_dictload_densetensor_listpersistable_varpersistable_var_nameorigin_persistable_var_namer&   r-   new_varvar_file_paths    `            r   _load_pir_parameter_varsr      s"   MMN$5O);# # # #,# # # C ;_MMNN + +	c? 	+.il*/X 	  G %($5G!")M$  )))!((););)=)=>>>> j'')#)4YX\)6799! (  G $+N4   &&(M&&&GLL_==M	w~~m$$ 
##%%&&!-//	
 	
 	
 	
 TTTT
 
 	
 (((r   c                ^   i }|t           j                            |          }t           j                            | |          }|d t	          t
                              }t          j        |           D ]}||k    r#d}t           j                            | |          }n|                    t
                    r|                    |          r|t	          |          t	          t
                     dz            	                    d          }t	          |          dk    rBt	          |d                   dk    r)|d         }t           j                            | |          }nt          |          \  }}	t          ||	          ||<   nt          j        |           D ]\  }
}
}|D ]}d|v ryt           j                            | |          }|                    d          }|dk    rd}n|                    dd           t          |          \  }}	t          ||	          ||<   |S )	Nforwardr   .   r   model_ )r~   r   basenamer   rR   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      sE   !)).99',,z>BB#$Bs+A'B'B&B$BC

:.. 	 	H))%	"$',,z>"J"J""&  %%j11 !)
OOs+A'B'B&BQ&FF!%**  }%%**s=3C/D/Dq/H/H -a 0I&(gll:x&H&HOO!2?!C!CGY->. .	**%	, !#
 3 3 	 	Aq*"  d??&(gll:t&D&DO"&**S//K"g--&/#++GR888):?)K)K&GY7H8 8'4 r   c                   t           j                            | t          |                    }|!t           j                            |          si S t          | |d         |          }|d t          t                              }t          j        |           D ]}|	                    |          r|
                    t                    rv|t          |          t          t                     dz                                d          }t          |          dk    r"t          |d                   dk    r	|d         }n|                    t          | ||         |                     |S )Nr   r   r   r   r   )r~   r   r   rQ   r   r   rR   r   r   r   r   r   r   )	r   programsr   params_pathvar_dictr   	file_namer   r   s	            r   _construct_params_and_buffersr   !  sq   ',,z3+?+?@@K"27>>++F+F"	++_
 
 %%@,?(@(@'@%@A
J// 	 	I##J// I4F4F#5 5  !*
OOs+>'?'?&?!&CC!%**  }%%**s=3C/D/Dq/H/H -a 0IIOO( 3Y     r   c                   g }g }t          |          D ]\  }}t          |t          j        t          j        j        f          s t          dt          |           d          t          |t          j                  rFt          j                            |j	        |         j
        dt          j                    d          }n|}j	        |         j
        |_
        |                    |j
                   |                    |           |                     |          g }	fdj        D             }
|
D ]u}| j        |         }|| j        v r!|	                    | j        |                    9|| j        v r!|	                    | j        |                    ct'          d| d          d	d
lm} j	        }j        }|	j        f} |j        |||          }|                     ||           |                     |          }| j        rd|_        nj        st'          d          d|_         ||          S )Nz^The type of input in PirTranslatedLayer must be numpy array or Variable(Tensor), but received r   FT)rW   r&   ro   rB   	zero_copyc                *    g | ]}j         |         S ri   rj   rk   s     r   rn   z _run_dygraph.<locals>.<listcomp>a  s1     '
 '
 '
 /9'
 '
 '
r   z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   rz   r{   	TypeErrorrq   r\   r&   r   r}   r%   _get_partial_program_layerr(   _persistable_var_name_dict_parameters_buffersr   (paddle.jit.dy2static.pir_partial_programr   r^   r'   rZ   _set_partial_program_layer_is_testtrainingr9   )instanceinputrm   r   input_tensorsinput_tensor_namesirW   tensorpersistable_tensorsr   rU   dy_var_namer   inputsoutputs
parameterslayers     `               r   _run_dygraphr   D  s   Me$$ % %5%"*dj.?!@AA 	quv{q|q|   eRZ(( 	<Z&&#.q16!799 '  FF F )3A6;FK!!&+...V$$$$**;77? '
 '
 '
 '
*<'
 '
 '
# 4 		 		H"=hGKh222#**8+?+LMMMM 111#**8+<[+IJJJJ hhhh   	QPPPPP* ,)>+JK
##(	
 
 	++K???//<<E "+ 	"R   "EN5r   c           	        t           j                                        }t           j                                        t          |                                j                  }|                                j        D ]}|                                dk    r|                                j        d|         D ]}|                                |                                k    r|	                    d          j        |	                    d          j        k    r`t          |                                          D ]>}                    |	                    |          |	                    |                     ?Ì|j        }t          |          t          |           k    r0t          dt          |           dt          |            d          t          ||           D ]\  }	}
                    |	|
           t           j                                        }|                                }|                    |           fd|j        D             }t          |          dk    r|d         n|S )	zg
    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   c                :    g | ]}                     |          S ri   )look_up)rl   v	value_maps     r   rn   z%_run_static_graph.<locals>.<listcomp>  s'    GGGqi""GGGr   r   )r   r   default_main_programpir	IrMappingrR   rD   rE   r&   rF   rangenum_resultsaddr\   r   rs   get_current_insertion_pointrS   copy_to_blockr^   )r   rm   src_programdst_program
len_dst_opdst_opsrc_opr   
src_inputs	src_inputinput_current_insert_pointcurrent_blockoutputr   s                 @r   _run_static_graphr     sG   
 -4466K
$$&&I [--//344J**,,0 J J;;==///%22448*E J JKKMMV[[]]22a((-q1A1A1FFF"6#5#5#7#788 J J!fmmA&6&6a8H8HIIII  *J
:#f++%%fJffX[\bXcXcfff
 
 	
 !V44 ) )	6i(((( ":AACC(..00Mi777GGGGN,FGGGFFq((6!99f4r   c                    g }|dk     r|S |                      |          j        D ]}|                    |           |                      |          j        }|dk    r|t	          | |          z  }|S )z
    Get variables in current block and its parent block.

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

    Returns:
        List: list of variables.
    r   )rS   r,   r%   
parent_idx_collect_current_and_parent_var)r   	block_idxr,   r-   r   s        r   r   r     s     D1}}}}Y'',  Cy))4JB/DDDKr   c                       e Zd ZdZd 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d Zd Z xZS )PirTranslatedLayeraX  
    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)

    r    dict[str, paddle.static.Program]r'   dict[str, paddle.Tensor]c                   t                                                       t          |t                    st	          d          t          |t                    st	          d          || _        i | _        t          j                    5  |	                                D ]\  }}t          |t          j                  r5t          t                    }|| j        |<   |                     ||           Tt          |t          j        j                  r5t          t$                    }|| j        |<   |                     ||           t	          d          	 d d d            n# 1 swxY w Y   d| _        d | _        i | _        d S )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)r3   r4   r   dictr   _program_holder_dictr   r   guarditemsr   rt   r    r   add_parameterr   rz   r{   r   register_bufferr   _input_args_names_partial_program_layers)r=   r   r'   r&   r-   dy_namer>   s         r   r4   zPirTranslatedLayer.__init__&  s   
 	(D)) 	Z   *D11 	^   %-! +-'   	 	-3355  	cc9#;<< 78MNNG<CD3D9&&w4444TZ%677 78JKKG<CD3D9((#6666#Y  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !%')$$$s   CE$$E(+E(Nc           	     &   t           j                            |           } t           j                            |           st	          d|  d          d }d }||j        }|j        }t          | |          }t          | ||          }t          ||          }|
                                D ]Q\  }}|j        d |j        D             |_        t          t          |t                              ||                     R|                                 |S )NzThere is no directory named ''c                    g | ]	}|j         
S ri   )r&   )rl   inss     r   rn   z1PirTranslatedLayer._construct.<locals>.<listcomp>o  s'     6 6 6!$CH6 6 6r   )r~   r   normpathisdirr   r   r   r   r   r   r   r   r\   setattr_execution_method_creatoreval)	r   configsr   r   r   r'   translated_layerr   rm   s	            r   
_constructzPirTranslatedLayer._constructT  sF    W%%j11
w}}Z(( 	LJZJJJKKK$3N%5O .j.II 9/
 

 .h8HII ,4>>+;+; 	 	'K196 6(6(A6 6 6 2 ""<<     	r   c                $      fd _         S )Nc                    | j         j                 }t                      rt          | ||          S t	          |||j                  S r   )r   ra   r   r   r   rZ   )r=   r   rm   __i_m_p_l__r   s      r   r
  zAPirTranslatedLayer._execution_method_creator.<locals>.__i_m_p_l__  sS    !6{7KLN    #D%MMM(>>+G  r   )ra   )r   rm   r
  s   ` @r   r  z,PirTranslatedLayer._execution_method_creator  s2    		 		 		 		 		 		  +r   c                "    d| _         d| _        d S )NFTr   r   rY   s    r   trainzPirTranslatedLayer.train  s    r   c                "    d| _         d| _        d S )NTFr  rY   s    r   r  zPirTranslatedLayer.eval  s    r   r   c                >    |                      |          }|j        }|S )aX  
        Gets translated program of specified method.

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

        Returns:
            Program

        Examples:
            .. code-block:: python

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

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

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

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

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

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

                >>> # get program
                >>> program = translated_layer.program()
        )_get_program_holderrZ   )r=   r   rm   r   s       r   r   zPirTranslatedLayer.program  s'    l 11+>> !.r   c                f    | j                             |d           }|t          d| d          |S )NzThe method `z.` does not exist in loaded PirTranslatedLayer.)r   getr   )r=   r   rm   s      r   r  z&PirTranslatedLayer._get_program_holder  sH    266{DII!Z{ZZZ   r   c                    |                      |          }g }|j        D ]H}t          j                            |j        |j        |j                  }|                    |           I|S N)r@   rA   r&   )	r  r\   r   r   	InputSpecr@   rA   r&   r%   )r=   r   rm   
input_specr-   specs         r   _input_speczPirTranslatedLayer._input_spec  sx    11+>> 
!, 	$ 	$C=**iiX +  D
 d####r   c                    |                      |          }g }|j        D ]H}t          j                            |j        |j        |j                  }|                    |           I|S r  )	r  r^   r   r   r  r@   rA   r&   r%   )r=   r   rm   output_specr-   r  s         r   _output_speczPirTranslatedLayer._output_spec  sz    11+>> !- 		% 		%C =**iiX +  D
 t$$$$r   c                8    | j                             |d           S r   )r   r  )r=   r   s     r   r   z-PirTranslatedLayer._get_partial_program_layer  s    +//TBBBr   c                    || j         |<   d S r   )r   )r=   r   r   s      r   r   z-PirTranslatedLayer._set_partial_program_layer"  s    49$[111r   )r   r   r'   r   r   )r   )ra   rb   rc   __doc__r4   staticmethodr   dygraph_onlyr  r  r  r  r   r  r  r  r   r   re   rf   s   @r   r   r     s)       \ \|,* ,* ,* ,* ,* ,*\ '  '  '   \' R   \    [ [ [ [z          &C C 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   ri   r   r   <module>r+     s!   # " " " " " 				      4 4 4 4 4 4 4 4 4 4 ; ; ; ; ; ; , , , , , , " " " " " " / / / / / /
              ; ; ; ( ( ( 4 3 3 3 3 3  (C$ C$ C$ C$ C$ C$ C$ C$J7 7 7t. . . .b       FD  D  D N#5 #5 #5L  ,\: \: \: \: \: \: \: \: \: \:r   