o
     jlG                     @   s"  d dl Z d dlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZ g Z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jdejjjdejjjdiZejjjejjjejjjejjjejjjejjjejjjejjjejjjejjjejjjejjjdZ ej!jdej!j"d	ej!j#d
ej!j$dej!j%dej!jdej!jdej!jdej!jdej!jdej!jdej!jdiZ&d,ddZ'dd Z(dd Z)	d-ddZ*d-dd Z+	d-d!d"Z,e-e.e
fe/e
fd#fd$d%Z0G d&d' d'Z1G d(d) d)Z2G d*d+ d+Z3dS ).    N   )Value)ParameterMeta   )core)Variable_cpu_num	_cuda_idsdefault_main_programin_dygraph_modein_pir_modeboolfloat16uint16float32float64int8int16int32int64uint8	complex64
complex128r   r   r   r   r   r   r   r   r   r   r   r   NCHWc                 C   st   | j dkr| tjS |dkrt| g d} tjdd tjgd| j}t|| j}|dkr8t|g d}|S )Nr   ZNHWC)r      r   r   c                 S   s   t dt d| d d? S )N<I<fr      structunpackpackx r%   X/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/base/data_feeder.py<lambda>W       z)convert_float_to_uint16.<locals>.<lambda>Zotypes)r   r   r   r   )	sizeviewnpr   Z	transpose	vectorizeflatreshapeshape)dataZdata_formatnew_datar%   r%   r&   convert_float_to_uint16O   s   
r3   c                 C   s*   t jdd t jgd| j}t || jS )Nc                 S   s   t dt d| d> d S )Nr   r   r   r   r   r#   r%   r%   r&   r'   c   r(   z)convert_uint16_to_float.<locals>.<lambda>r)   )r,   r-   r   r.   r/   r0   )r1   r2   r%   r%   r&   convert_uint16_to_floata   s   r4   c                 C   s   t | tjjr| tv rt|  S t | tjr| tv rt|  S n2t | trB| tt	j
t	jt	jt	jt	jt	jt	jt	jt	jt	jt	jfv rA| jS n| dv rJt| S | dv rPdS td|  )Nr   )Zbfloat16r   zdtype must be any of [bool, float16, uint16, float32, float64, int8, int16, int32, int64, uint8, complex64, complex128, bfloat16], but received %s)
isinstancer   VarDescVarType_PADDLE_DTYPE_2_NUMPY_DTYPEDataType_PADDLE_PIR_DTYPE_2_NUMPY_DTYPEtyper   r,   r   r   r   r   r   r   r   r   r   r   r   __name__str	TypeErrordtyper%   r%   r&   convert_dtypei   sB   
rA    c                 C   sB   t  rt| |ttf|| nt| |t|| t| j|||| d S N)r   
check_typer   r   r   check_dtyper@   )input
input_nameexpected_dtypeop_nameextra_messager%   r%   r&   check_variable_and_dtype   s   rK   c                 C   s   t  rd S ddlm} | rt|ts|f}|tjjf7 }nt| tjjr0td| d| dt| |sBtd	|||t
| |d S )Nr   )in_to_static_modezPlease use `with base.dygraph.guard()` as context or `base.enable_dygraph()` to switch to imperative mode firstly. Because received 'z' in z is a imperative Variable.z6The type of '{}' in {} must be {}, but received {}. {})r   Zdygraph.baserL   r5   tupler   eagerZTensorr>   formatr;   )rF   rG   expected_typerI   rJ   rL   r%   r%   r&   rD      s,   

rD   c                 C   s4   t  rd S t| |vrtd|||t| |d S )Nz;The data type of '{}' in {} must be {}, but received {}. {})r   rA   r>   rO   )Zinput_dtyperG   rH   rI   rJ   r%   r%   r&   rE      s   rE   )r   r   c                 C   s   t  rd S t| d|| |d ur9t| ts9| D ]!}t|d|| |d ur8t|tr8t|jd||dd| q|d urLt| trNt| jd|| d S d S d S )Nr0   zelement of shapez9If element of shape is Tensor, its data type should be {}z, )r   rD   r5   r   rE   r@   rO   join)r0   rI   Zexpected_shape_typeZexpected_element_typeZexpected_tensor_dtypeitemr%   r%   r&   check_shape   s(   	rS   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )DataToLoDTensorConverterc                 C   sZ   || _ || _|| _d}| jD ]}|dk r|d7 }|dkr!d | _ nqt|| _|   d S Nr   r   )place	lod_levelr0   rA   r@   _reset)selfrV   rW   r0   r@   Znegtive_countsr%   r%   r&   __init__   s   

z!DataToLoDTensorConverter.__init__c                 C   s    g | _ dd t| jD | _d S )Nc                 S   s   g | ]}g qS r%   r%   ).0_r%   r%   r&   
<listcomp>  s    z3DataToLoDTensorConverter._reset.<locals>.<listcomp>)r1   rangerW   lodrY   r%   r%   r&   rX     s   zDataToLoDTensorConverter._resetc                 C   s   |  || j| j d S rC   )_feed_impl_r`   rW   )rY   r1   r%   r%   r&   feed  s   zDataToLoDTensorConverter.feedc                 C   sR   |dkr| j | d S |d t| |D ]}| ||dd  |d  qd S rU   )r1   appendlenrb   )rY   r1   r`   rW   Z	each_datar%   r%   r&   rb     s   z$DataToLoDTensorConverter._feed_impl_c                 C   sD   t | j|D ]\}}||kr|dkr|dkrtd| j|qd S )Nr   zDShape not match. What is defined in data layer is {}, but receive {})zipr0   
ValueErrorrO   )rY   r0   s1s2r%   r%   r&   _check_shape  s   z%DataToLoDTensorConverter._check_shapec                 C   s   t j| j| jd}| jr0t|jt| jkr0z|| j}W n ty/   td| j|jw t	
 }||| j | jdkrF|| j |   |S )Nr?   zBReshape error. What is defined in data layer is {}, but receive {}r   )r,   arrayr1   r@   r0   re   r/   rg   rO   r   Z	LoDTensorsetrV   rW   Zset_recursive_sequence_lengthsr`   rX   )rY   Zarrtr%   r%   r&   done&  s$   
zDataToLoDTensorConverter.doneN)	r<   
__module____qualname__r[   rX   rc   rb   rj   rn   r%   r%   r%   r&   rT      s    	rT   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )BatchedTensorProviderc              	   C   s\   || _ || _|| _g | _|| _|D ]}|jdksJ d| jt| j d|j|j	d qd S )Nr   zlod_level must be 0rV   rW   r0   r@   )
rV   
batch_size	generator
converters	drop_lastrW   rd   rT   r0   r@   )rY   	feed_listrV   rs   rt   rv   varr%   r%   r&   r[   ;  s    zBatchedTensorProvider.__init__c                 C   s   dd | j D S )Nc                 S      g | ]}|  qS r%   )rn   r\   cr%   r%   r&   r^   N      z/BatchedTensorProvider._done.<locals>.<listcomp>)ru   ra   r%   r%   r&   _doneM  s   zBatchedTensorProvider._donec                 c   s    d}|   D ]#}t|| jD ]
\}}|j| q|d7 }|| jkr*d}|  V  q| js9|dkr9|  V  d S dd | jD  d S )Nr   r   c                 S   ry   r%   )rX   rz   r%   r%   r&   r^   ^  r|   z2BatchedTensorProvider.__call__.<locals>.<listcomp>)rt   rf   ru   r1   rd   rs   r}   rv   )rY   idxeach_sample	each_sloteach_converterr%   r%   r&   __call__P  s   

zBatchedTensorProvider.__call__N)r<   ro   rp   r[   r}   r   r%   r%   r%   r&   rq   :  s    rq   c                   @   s*   e Zd ZdZd	ddZdd Zd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                 C   s   g | _ g | _g | _g | _|d u rt }|D ]4}t|tr$|d|}t|t	s-t
d| j |j | j|j | j|j | j|j q|| _d S )Nr   z+Feed list should contain a list of variable)feed_dtypes
feed_namesfeed_shapesfeed_lod_levelr
   r5   r=   blockrx   r   r>   rd   r@   namerW   r0   rV   )rY   rw   rV   programZeach_varr%   r%   r&   r[     s    


zDataFeeder.__init__c              	   C   s   g }t | j| j| jD ]\}}}|t| j|||d q|D ]%}t|t|ks5J dt|t|f t ||D ]	\}}|| q:qi }	t | j	|D ]
\}
}|
 |	|
< qM|	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'])

        rr   zDThe number of fields in data (%d) does not match len(feed_list) (%d))rf   r   r   r   rd   rT   rV   re   rc   r   rn   )rY   iterable	converterrW   r0   r@   r   r   r   Zret_dictZ	each_namer%   r%   r&   rc     s0   (	zDataFeeder.feedc                 C   s.   |d urt |S t| jtjrtt S t S rC   )intr5   rV   r   Z	CUDAPlacere   r	   r   )rY   Z
num_placesr%   r%   r&   _get_number_of_places_  s
   
z!DataFeeder._get_number_of_places_rC   )r<   ro   rp   __doc__r[   rc   r   r%   r%   r%   r&   r   a  s
    
?Ar   )r   )rB   )4r    numpyr,   Zpirr   Zpir.corer   rB   r   Z	frameworkr   r   r	   r
   r   r   __all__r6   r7   ZBOOLZFP16ZBF16ZFP32ZFP64ZINT8ZINT16ZINT32ZINT64ZUINT8Z	COMPLEX64Z
COMPLEX128r8   Z_NUMPY_DTYPE_2_PADDLE_DTYPEr9   ZFLOAT16ZBFLOAT16ZFLOAT32ZFLOAT64r:   r3   r4   rA   rK   rD   rE   listrM   r   rS   rT   rq   r   r%   r%   r%   r&   <module>   sz    	












:

#

;'