o
    * i[O                     @  s  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rmd 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&j0dej%j&j1dej%j&j2dej%j&j3dej%j&j4dej%j&j5dej%j&j6d Z7e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&j0ej%j&j1ej%j&j2ej%j&j3ej%j&j4d!Z8dFd#d$Z9d%d& Z:dGd+d,Z;	-dHd.d/Z<dHd0d1Z=	-dHd2d3Z>e?e!eefe@eefd4fdId>d?ZAG d@dA dAZBG dBdC dCZCG dDdE dEZDdS )J    )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
complex128Zpstringraw)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 r3   c/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/base/data_feeder.py<lambda>[       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_datar3   r3   r4   convert_float_to_uint16S   s   
rA   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-   r1   r3   r3   r4   r5   g   r6   z)convert_uint16_to_float.<locals>.<lambda>r7   )r:   r;   r   r<   r=   r>   )r?   r@   r3   r3   r4   convert_uint16_to_floate   s   rB   dtyper   returnr   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|  )N)r   r   r   r   r   Zint4r    r!   r"   r#   r$   r%   r&   r   r   )Z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_DTYPEZDataTyper	   typer   r:   r   r   r   r   r    r!   r"   r#   r$   r%   r&   __name__str	TypeErrorrC   r3   r3   r4   convert_dtypem   sB   
rN    c                 C  sj   t  r d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_initrQ   stater   r
   r   
check_typer   check_dtyperC   )input
input_nameexpected_dtypeop_nameextra_messagerQ   expectedr3   r3   r4   check_variable_and_dtype   s   r\   c                 C  s   t  rd S ddlm} ddlm} | r$t|ts|f}|tjj	f7 }nt| tjj	r:| j
s:td| d| dt| |sTtd| d| d	| d
t|  d| 
d S )Nr   rP   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   rR   rQ   Zdygraph.baser]   rE   tupler   eagerZTensorrS   rL   rI   )rV   rW   expected_typerY   rZ   rQ   r]   r3   r3   r4   rT      s*   

$rT   c                 C  sD   t  rd S t| |vr td| d| d| dt|  d| 
d S )NzThe data type of 'r^   r_   r`   ra   )r   rN   rL   )Zinput_dtyperW   rX   rY   rZ   r3   r3   r4   rU      s   $rU   )r"   r#   r>   r   rY   rK   expected_shape_typeexpected_element_typeexpected_tensor_dtypetuple[_DTypeLiteral, ...]Nonec                 C  s   t  rd S t| d|| |d ur=t| ttfs=| D ]#}t|d|| |d ur<t|ttfr<t|jd||dd| q|d urRt| ttfrTt| jd|| d S d S d S )Nr>   zelement of shapez9If element of shape is Tensor, its data type should be {}z, )	r   rT   rE   r   r   rU   rC   formatjoin)r>   rY   re   rf   rg   itemr3   r3   r4   check_shape   s4   


	rm   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 )DataToDenseTensorConverterc                 C  sZ   || _ || _|| _d}| jD ]}|dk r|d7 }|dkr!d | _ nqt|| _|   d S Nr   r   )place	lod_levelr>   rN   rC   _reset)selfrp   rq   r>   rC   Znegative_countsr3   r3   r4   __init__  s   

z#DataToDenseTensorConverter.__init__c                 C  s    g | _ dd t| jD | _d S )Nc                 S  s   g | ]}g qS r3   r3   ).0_r3   r3   r4   
<listcomp>"  s    z5DataToDenseTensorConverter._reset.<locals>.<listcomp>)r?   rangerq   lodrs   r3   r3   r4   rr      s   z!DataToDenseTensorConverter._resetc                 C  s   |  || j| j d S N)_feed_impl_rz   rq   )rs   r?   r3   r3   r4   feed$  s   zDataToDenseTensorConverter.feedc                 C  sR   |dkr| j | d S |d t| |D ]}| ||dd  |d  qd S ro   )r?   appendlenr}   )rs   r?   rz   rq   Z	each_datar3   r3   r4   r}   '  s   z&DataToDenseTensorConverter._feed_impl_c                 C  sH   t | j|D ]\}}||kr!|dkr!|dkr!td| j d| qd S )Nr   z2Shape not match. What is defined in data layer is , but receive )zipr>   
ValueError)rs   r>   s1s2r3   r3   r4   _check_shape/  s   z'DataToDenseTensorConverter._check_shapec                 C  s   t j| j| jd}| jr2t|jt| jkr2z|| j}W n ty1   td| j d|j w t	 }|
|| j | jdkrH|| j |   |S )NrM   z0Reshape error. What is defined in data layer is r   r   )r:   arrayr?   rC   r>   r   r=   r   r   ZDenseTensorsetrp   rq   Zset_recursive_sequence_lengthsrz   rr   )rs   Zarrtr3   r3   r4   done6  s    
zDataToDenseTensorConverter.doneN)	rJ   
__module____qualname__ru   rr   r~   r}   r   r   r3   r3   r3   r4   rn     s    rn   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )BatchedTensorProviderc              	   C  sb   || _ || _|| _g | _|| _|D ]}t s|jdksJ d| jt| j d|j	|j
d qd S )Nr   zlod_level must be 0rp   rq   r>   rC   )rp   
batch_size	generator
converters	drop_lastr   rq   r   rn   r>   rC   )rs   	feed_listrp   r   r   r   varr3   r3   r4   ru   I  s"   zBatchedTensorProvider.__init__c                 C  s   dd | j D S )Nc                 S     g | ]}|  qS r3   )r   rv   cr3   r3   r4   rx   ]      z/BatchedTensorProvider._done.<locals>.<listcomp>)r   r{   r3   r3   r4   _done\  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  r   r3   )rr   r   r3   r3   r4   rx   m  r   z2BatchedTensorProvider.__call__.<locals>.<listcomp>)r   r   r   r?   r   r   r   r   )rs   idxeach_sample	each_sloteach_converterr3   r3   r4   __call___  s   

zBatchedTensorProvider.__call__N)rJ   r   r   ru   r   r   r3   r3   r3   r4   r   H  s    r   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 | _|| _t rO|d u rtj }|D ]/}t	|t
r(tdt	|ts1td| j |j | j|j | jd | j|j qd S |d u rVt }|D ]6}t	|t
rg|d|}t	|ttfsrtd| j |j | j|j | j|j | j|j qXd 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_levelrp   r   r   r   r   rE   rK   r   r   rL   r   rC   namer>   blockr   r   rq   )rs   r   rp   programZeach_varr3   r3   r4   ru     sD   



zDataFeeder.__init__c              	     s  g }t | j| j| jD ]\}}}|t| j|||d q fdd tj	 rQ|D ]%}t
|t
|ks@J dt
|t
|f t ||D ]	\}} || qEq*n(|D ]%}t
|t
|ksiJ dt
|t
|f t ||D ]	\}}|| qnqSi }	t | j|D ]
\}
}| |	|
< q|	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                   s4   t |ttfr|D ]} | | q	d S | | d S r|   )rE   listrb   r~   )	converterr?   rl   	feed_datar3   r4   r     s
   z"DataFeeder.feed.<locals>.feed_datazDThe number of fields in data (%d) does not match len(feed_list) (%d))r   r   r   r   r   rn   rp   paddle	frameworkZuse_pir_apir   r~   r   r   )rs   iterabler   rq   r>   rC   r   r   r   Zret_dictZ	each_namer3   r   r4   r~     sF   (	
	zDataFeeder.feedc                 C  s.   |d urt |S t| jtjrtt S t S r|   )intrE   rp   r   Z	CUDAPlacer   r   r   )rs   Z
num_placesr3   r3   r4   _get_number_of_places_&  s
   
z!DataFeeder._get_number_of_places_r|   )rJ   r   r   __doc__ru   r~   r   r3   r3   r3   r4   r   p  s
    
?#Sr   )r(   )rC   r   rD   r   )rO   )r>   r   rY   rK   re   r   rf   r   rg   rh   rD   ri   )E
__future__r   r.   typingr   r   r   numpyr:   r   r   r   Zpir.corer	   r
   rO   r   r   r   r   r   r   r   r   r   Ztyping_extensionsr   Zpaddle._typingr   r   Zpaddle._typing.dtype_liker   rI   rb   r   __annotations____all__rF   rG   ZBOOLZ
FP8_E4M3FNZFP8_E5M2ZFP16ZBF16ZFP32ZFP64ZINT8ZINT16ZINT32ZINT64ZUINT8Z	COMPLEX64Z
COMPLEX128STRINGZRAWrH   Z_NUMPY_DTYPE_2_PADDLE_DTYPErA   rB   rN   r\   rT   rU   r   r   rm   rn   r   r   r3   r3   r3   r4   <module>   s   $









	









<

"
+7(