
    yjM                       U d dl mZ d dlZd dlmZmZmZ d dlZd dl	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mZmZmZmZmZmZ er/d dlmZ d dlmZmZ d dlmZ ee e         e!d         f         Z"de#d<   g Z$i ej%        j&        j'        dej%        j&        j(        dej%        j&        j)        dej%        j&        j*        dej%        j&        j+        dej%        j&        j,        dej%        j&        j-        dej%        j&        j.        dej%        j&        j/        dej%        j&        j0        dej%        j&        j1        dej%        j&        j2        dej%        j&        j3        dej%        j&        j4        dej%        j&        j5        dej%        j&        j6        d Z7d>d"Z8d# Z9d?d(Z:	 d@d*Z;d@d+Z<	 d@d,Z=e>e!eefe?eefd-fdAd7Z@ G d8 d9          ZA G d: d;          ZB G d< d=          ZCdS )B    )annotationsN)TYPE_CHECKINGAnyUnion)pir   )Value)_PADDLE_PIR_DTYPE_2_NUMPY_DTYPEParameterMeta   )core)EagerParamBaseVariable_cpu_num	_cuda_idsdefault_main_programin_dygraph_modein_pir_mode)	TypeAlias)	DTypeLike	ShapeLike)_DTypeLiteral)
_ClassInfo.r   r   boolfloat8_e4m3fnfloat8_e5m2float16uint16float32float64int8int16int32int64uint8	complex64
complex128pstringrawNCHWc                b   | j         dk    r|                     t          j                  S |dk    rt          j        | g d          }  t          j        d t          j        g          | j                  }t          j        || j                  }|dk    rt          j        |g d          }|S )Nr   NHWC)r      r   r   c                d    t          j        dt          j        d|                     d         dz	  S )N<I<fr      structunpackpackxs    g/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/base/data_feeder.py<lambda>z)convert_float_to_uint16.<locals>.<lambda>L   s(    &-fk$&:&:;;A>"D     otypes)r   r   r-   r   )	sizeviewnpr   	transpose	vectorizeflatreshapeshape)datadata_formatnew_datas      r8   convert_float_to_uint16rH   D   s    yA~~yy###f|D,,,//r|DD	{   i H z(DJ//Hf<,,,77Or:   c                     t          j        d t           j        g          | j                  }t          j        || j                  S )Nc                d    t          j        dt          j        d| dz                      d         S )Nr0   r/   r1   r   r2   r6   s    r8   r9   z)convert_uint16_to_float.<locals>.<lambda>X   s'    &-fk$R&@&@AA!D r:   r;   )r?   rA   r   rB   rC   rD   )rE   rG   s     r8   convert_uint16_to_floatrK   V   sP    r|DD
|   i H :h
+++r:   dtyper   returnr   c                   t          | t          j        j                  r| t          v rt          |          S t          | t          j                  r| t          v rt          |          S nt          | t                    r| t          t          j
        t          j        t          j        t          j        t          j        t          j        t          j        t          j        t          j        t          j        t          j        t          j        t          j        fv r| j        S n| dv rt1          |           S | dv rdS t3          d|            )N)r   r   r   uint32uint64r   r    int4r!   r"   r#   r$   r%   r&   r'   r   r   )bfloat16r   zdtype must be any of [bool, float16, uint16, float32, float64, int8, int16, int32, int64, uint8, complex64, complex128, bfloat16], but received )
isinstancer   VarDescVarType_PADDLE_DTYPE_2_NUMPY_DTYPEDataTyper
   typer   r?   r   r   rO   rP   r   r    r!   r"   r#   r$   r%   r&   r'   __name__str	TypeErrorrL   s    r8   convert_dtyper]   ^   s2   %-.. 6///.u55%'' 33332599 4	E4	 	  0JIIIJJGHHHHLM
 
 
  >!!
&  
 
 
, u:: L  8
	WOT	W 	W  r:    c                (   t                      rLddlm}  |            j        rt          t
          t          f}nt          t
          f}t          | ||||           nt          | |t          t          f||           t          | j
        ||||           d S )Nr   lazy_init_helper)r   nn.initializer.lazy_initra   stater	   r   r   
check_typer   check_dtyperL   )input
input_nameexpected_dtypeop_nameextra_messagera   expecteds          r8   check_variable_and_dtyperl      s     }} 	Q??????# 	.}n=HH}-H5*hGGGG5*x&7-PPPZ-PPPPPr:   c                   t                      rd S ddlm} ddlm}  |            r.t          |t                    s|f}|t          j        j	        fz  }nDt          | t          j        j	                  r% |            j
        st          d| d| d          t          | |          s+t          d| d| d	| d
t          |            d| 
          d S )Nr   r`   r   )in_to_static_modezPlease use `with base.dygraph.guard()` as context or `paddle.disable_static()` to switch to dygraph mode firstly. Because received '' in z is an Eager Tensor.zThe type of '	 must be , but received . )r   rb   ra   dygraph.basern   rS   tupler   eagerTensorrc   r[   rX   )rf   rg   expected_typeri   rj   ra   rn   s          r8   rd   rd      sK     
 <;;;;;//////  
-// 	-*,M$*+--	E4:,	-	- 
6F6F6H6H6N 
P!+P P29P P P
 
 	
 e]++ 
{J{{W{{}{{]abg]h]h{{ly{{
 
 	

 
r:   c                    t                      rd S t          |           |vr+t          d| d| d| dt          |            d| 
          d S )NzThe data type of 'ro   rp   rq   rr   )r   r]   r[   )input_dtyperg   rh   ri   rj   s        r8   re   re      s      [!!77 Q  Q  Q'  Q  QN  Q  Qcpq|c}c}  Q  Q  BO  Q  Q
 
 	
 87r:   )r#   r$   rD   r   ri   rZ   expected_shape_typeexpected_element_typeexpected_tensor_dtypetuple[_DTypeLiteral, ...]Nonec                   t                      rd S t          | d||           |t          | t          t          f          ss| D ]p}t          |d||           |Zt          |t          t          f          r>t          |j        d||d                    d                    |                               q|5t          | t          t          f          rt          | j        d||           d S d S d S )NrD   zelement of shapez9If element of shape is Tensor, its data type should be {}z, )	r   rd   rS   r   r	   re   rL   formatjoin)rD   ri   rz   r{   r|   items         r8   check_shaper      s%   "  ug2G<<<(% 2 2(  	 	Dt/1FPPP$0Zx'6 60 J&)OVV		"788    (Z% . .( 	EK*?IIIII )(((r:   c                  2    e Zd Zd Zd Zd Zd Zd Zd ZdS )DataToDenseTensorConverterc                    || _         || _        || _        d}| j        D ]}|dk     r|dz  }|dk    r	d | _         nt          |          | _        |                                  d S Nr   r   )place	lod_levelrD   r]   rL   _reset)selfr   r   rD   rL   negative_countss          r8   __init__z#DataToDenseTensorConverter.__init__  s~    
"
 	 	A1uu!#!!!
 " #5))
r:   c                Z    g | _         d t          | j                  D             | _        d S )Nc                    g | ]}g S  r   ).0_s     r8   
<listcomp>z5DataToDenseTensorConverter._reset.<locals>.<listcomp>  s    6661B666r:   )rE   ranger   lodr   s    r8   r   z!DataToDenseTensorConverter._reset  s,    	66dn 5 5666r:   c                H    |                      || j        | j                   d S N)_feed_impl_r   r   )r   rE   s     r8   feedzDataToDenseTensorConverter.feed  s$    tx88888r:   c                    |dk    r| j                             |           d S |d                             t          |                     |D ]$}|                     ||dd          |dz
             %d S r   )rE   appendlenr   )r   rE   r   r   	each_datas        r8   r   z&DataToDenseTensorConverter._feed_impl_  s    >>IT"""""FMM#d))$$$! D D	  CGY]CCCCD Dr:   c                    t          | j        |          D ]1\  }}||k    r&|dk    r |dk    rt          d| j         d|           2d S )Nr   z2Shape not match. What is defined in data layer is , but receive )ziprD   
ValueError)r   rD   s1s2s       r8   _check_shapez'DataToDenseTensorConverter._check_shape$  sm    $*e,, 	 	FBRxxB!GGa jjjchjj  	 	r:   c                   t          j        | j        | j                  }| j        rst          |j                  t          | j                  k    rI	 |                    | j                  }n-# t          $ r  t          d| j         d|j                   w xY wt          j	                    }|
                    || j                   | j        dk    r|                    | j                   |                                  |S )Nr\   z0Reshape error. What is defined in data layer is r   r   )r?   arrayrE   rL   rD   r   rC   r   r   DenseTensorsetr   r   set_recursive_sequence_lengthsr   r   )r   arrts      r8   donezDataToDenseTensorConverter.done+  s    hty
333: 	39~~TZ00++dj11CC!   $p4:ppehenpp   	c4:>A,,TX666s   A. .*BN)	rY   
__module____qualname__r   r   r   r   r   r   r   r:   r8   r   r     sq          7 7 79 9 9D D D      r:   r   c                       e Zd Zd Zd Zd ZdS )BatchedTensorProviderc           	        || _         || _        || _        g | _        || _        |D ]_}t                      s|j        dk    s
J d            | j                            t          | j         d|j	        |j
                             `d S )Nr   zlod_level must be 0r   r   rD   rL   )r   
batch_size	generator
converters	drop_lastr   r   r   r   rD   rL   )r   	feed_listr   r   r   r   vars          r8   r   zBatchedTensorProvider.__init__>  s    
$"" 
	 
	C== A})))+@)))O""**))	     
	 
	r:   c                $    d | j         D             S )Nc                6    g | ]}|                                 S r   )r   r   cs     r8   r   z/BatchedTensorProvider._done.<locals>.<listcomp>R  s     222Q222r:   )r   r   s    r8   _donezBatchedTensorProvider._doneQ  s    22$/2222r:   c              #  b  K   d}|                                  D ]_}t          || j                  D ]\  }}|j                            |            |dz  }|| j        k    rd}|                                 V  `| j        s|dk    r|                                 V  d S d | j        D              d S )Nr   r   c                6    g | ]}|                                 S r   )r   r   s     r8   r   z2BatchedTensorProvider.__call__.<locals>.<listcomp>b  s     111AQXXZZ111r:   )r   r   r   rE   r   r   r   r   )r   idxeach_sample	each_sloteach_converters        r8   __call__zBatchedTensorProvider.__call__T  s      >>++ 	# 	#K-0do-N-N 6 6)	>#**955551HCdo%%jjll"""~ 	2#''**,,11111111r:   N)rY   r   r   r   r   r   r   r:   r8   r   r   =  sA          &3 3 32 2 2 2 2r:   r   c                  &    e Zd ZdZddZd Zd ZdS )
DataFeedera	  
    :api_attr: Static Graph

    DataFeeder converts the data that returned by a reader into a data
    structure that can feed into Executor. The reader is usually a
    python generator that returns a list of mini-batch data entries.

    Parameters:
        feed_list (list): Variables or names of Variables that need
            to feed.
        place (:ref:`api_paddle_CPUPlace` | :ref:`api_paddle_CUDAPlace` ):
            place indicates the device (CPU | GPU) the data will be fed into, if
            you want to feed data into GPU, please using :code:`base.CUDAPlace(i)`
            (:code:`i` represents the GPU id), or if you want to feed data into CPU,
            please using :code:`base.CPUPlace()`.
        program (:ref:`api_paddle_static_Program` , optional): The Program that will
            feed data into, if program is None, it will use default_main_program().
            Default None.

    Raises:
        :code:`ValueError` - If some Variables are not in this Program.

    Example:
        .. code-block:: python

            >>> import numpy as np
            >>> import paddle
            >>> from paddle import base

            >>> paddle.enable_static()
            >>> place = paddle.CPUPlace()
            >>> def reader():
            ...     for _ in range(4):
            ...         yield np.random.random([4]).astype('float32'), np.random.random([3]).astype('float32'),
            ...
            >>> main_program = paddle.static.Program()
            >>> startup_program = paddle.static.Program()

            >>> with paddle.static.program_guard(main_program, startup_program):
            ...     data_1 = paddle.static.data(name='data_1', shape=[None, 2, 2], dtype='float32')
            ...     data_2 = paddle.static.data(name='data_2', shape=[None, 1, 3], dtype='float32')
            ...     out = paddle.static.nn.fc(x=[data_1, data_2], size=2)
            ...     # ...
            >>> feeder = base.DataFeeder([data_1, data_2], place)

            >>> exe = paddle.static.Executor(place)
            >>> exe.run(startup_program)

            >>> feed_data = feeder.feed(reader())

            >>> # print feed_data to view feed results
            >>> # print(feed_data['data_1'])
            >>> # print(feed_data['data_2'])

            >>> outs = exe.run(
            ...     program=main_program,
            ...     feed=feed_data,
            ...     fetch_list=[out]
            ... )
            >>> print(outs)

    Nc                &   g | _         g | _        g | _        g | _        || _        t                      r|t          j                                        }|D ]}t          |t                    rt          d          t          |t                    st          d          | j                             |j                   | j                            |j                   | j                            d           | j                            |j                   d S |t                      }|D ]}t          |t                    r(|                    d                              |          }t          |t(          t          f          st          d          | j                             |j                   | j                            |j                   | j                            |j                   | j                            |j                   d S )Nz+In PIR Mode, Not supported string input yetz(Feed list should contain a list of Valuer   z+Feed list should contain a list of variable)feed_dtypes
feed_namesfeed_shapesfeed_lod_levelr   r   r   r   r   rS   rZ   r   r	   r[   r   rL   namerD   blockr   r   r   )r   r   r   programeach_vars        r8   r   zDataFeeder.__init__  s    
== 	8(7799% 
8 
8h,, $E   "(E22 P#$NOOO ''777&&x}555#**1--- ''7777
8 
8 .00% 
8 
8h,, >&}}Q//33H==H!(Xu,=>> #E    ''777&&x}555#**8+=>>> ''7777
8 
8r:   c           	     2   g }t          | j        | j        | j                  D ]1\  }}}|                    t          | j        |||                     2fdt          j        	                                rq|D ]m}t          |          t          |          k    s)J dt          |          t          |          fz              t          ||          D ]\  }} ||           nny|D ]v}t          |          t          |          k    s)J dt          |          t          |          fz              t          ||          D ]\  }}|                    |           wi }	t          | j        |          D ]\  }
}|                                |	|
<   |	S )au  
        According to :code:`feed_list` of :code:`DataFeeder` and :code:`iterable` , converts
        the input into a data structure that can feed into Executor.

        Parameters:
            iterable (generator): user defined python generator to read the raw input data

        Returns:
            :code:`dict`: a :code:`dict` that contains (variable name - converted tensor) pairs

        Example:
            .. code-block:: python

                >>> # In this example, reader - generator will return a list of ndarray of 3 elements
                >>> # feed API will convert each ndarray input into a tensor
                >>> # the return result is a dict with keys: data_1, data_2, data_3
                >>> # result['data_1']  a LoD-Tensor with shape of  [5, 2, 1, 3]. 5 is batch size, and [2, 1, 3] is the real shape of data_1.
                >>> # result['data_2'], result['data_3'] are similar.
                >>> import numpy as np
                >>> import paddle
                >>> from paddle import base

                >>> paddle.enable_static()

                >>> def reader(limit=5):
                ...     for i in range(1, limit + 1):
                ...         yield np.ones([6]).astype('float32') * i , np.ones([1]).astype('int64') * i, np.random.random([9]).astype('float32')
                ...
                >>> data_1 = paddle.static.data(name='data_1', shape=[None, 2, 1, 3])
                >>> data_2 = paddle.static.data(name='data_2', shape=[None, 1], dtype='int64')
                >>> data_3 = paddle.static.data(name='data_3', shape=[None, 3, 3], dtype='float32')
                >>> feeder = base.DataFeeder(['data_1','data_2', 'data_3'], paddle.CPUPlace())

                >>> result = feeder.feed(reader())
                >>> print(result['data_1'])
                >>> print(result['data_2'])
                >>> print(result['data_3'])

        r   c                    t          |t          t          f          r|D ]} | |           d S |                     |           d S r   )rS   listrt   r   )	converterrE   r   	feed_datas      r8   r   z"DataFeeder.feed.<locals>.feed_data  sa    $u.. %  / /DIi..../ / t$$$$$r:   zDThe number of fields in data (%d) does not match len(feed_list) (%d))r   r   r   r   r   r   r   paddle	frameworkuse_pir_apir   r   r   r   )r   iterabler   r   rD   rL   r   r   r   ret_dict	each_namer   s              @r8   r   zDataFeeder.feed  s   P 	'*!143C(
 (
 
	 
	#Iue **'	     	% 	% 	% 	% 	% '')) 	3' 9 9;''3y>>999,%%s9~~6<7999 25Y1L1L 9 9-NIIni888899  ( 3 3;''3y>>999,%%s9~~6<7999 25Y1L1L 3 3-NI"''	22223 ),T_i)H)H 	8 	8%I~"0"5"5"7"7HYr:   c                    |t          |          S t          | j        t          j                  rt          t                                S t                      S r   )intrS   r   r   	CUDAPlacer   r   r   )r   
num_placess     r8   _get_number_of_places_z!DataFeeder._get_number_of_places_  sF    !z??"
DN33 	y{{###::r:   r   )rY   r   r   __doc__r   r   r   r   r:   r8   r   r   e  sV        = =~!8 !8 !8 !8FQ Q Qf    r:   r   )r*   )rL   r   rM   r   )r^   )rD   r   ri   rZ   rz   r   r{   r   r|   r}   rM   r~   )D
__future__r   r3   typingr   r   r   numpyr?   r   r   r	   pir.corer
   r   r^   r   r   r   r   r   r   r   r   r   typing_extensionsr   paddle._typingr   r   paddle._typing.dtype_liker   rX   rt   r   __annotations____all__rT   rU   BOOL
FP8_E4M3FNFP8_E5M2FP16BF16FP32FP64INT8INT16INT32INT64UINT8	COMPLEX64
COMPLEX128STRINGRAWrV   rH   rK   r]   rl   rd   re   r   r   r   r   r   r   r   r:   r8   <module>r      s   # " " " " " "  , , , , , , , , , ,                  E E E E E E E E                         G++++++33333333777777!$s)U3D-E"EFJFFFF
LvL#_ 	L!= 	Ly	
 	Lx 	Ly 	Ly 	Lv 	L 	L 	L 	L 	L"K 	L#\ 	L  	Le! (   $, , ,< < < <@ ?AQ Q Q Q 
 
 
 
D EG

 

 

 

" 		' 	)
 8J(J (J (J (J (JV4 4 4 4 4 4 4 4n%2 %2 %2 %2 %2 %2 %2 %2P| | | | | | | | | |r:   