o
    pi&                     @  s   d dl mZ d dlmZmZ d dlZd dlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZmZ d	d
lmZ erFd dlmZ d dlmZ g ZG dd deZG dd deZdS )    )annotations)TYPE_CHECKINGAnyN)_C_ops   )core	frameworkunique_name)
check_type)_current_expected_placein_dygraph_modein_pir_mode   )Initializer)Sequencec                      s0   e Zd ZdZd fddZ	ddddZ  ZS )NumpyArrayInitializerzInit an parameter with an numpy array
    This api initialize the tensor by numpy array.

    Args:
        value (numpy): numpy array to initialize the tensor

    Returns:
        A Tensor initialized by numpy.

    valuenpt.NDArray[Any]returnNonec                   s,   dd l }t||jsJ t   || _d S )Nr   )numpy
isinstancendarraysuper__init___value)selfr   r   	__class__ c/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddle/nn/initializer/assign.pyr   3   s   

zNumpyArrayInitializer.__init__Nvarpaddle.Tensorblockpaddle.pir.Block | Nonepaddle.Tensor | Nonec              	   C  s  t |tjr| rJ d| |}t |tjtjjj	fs J t |tj
tjj
fs,J |j}|tjjjtjjjfv r_tjjj}| jd}|jtdd|jdg|j|tjjjdd}n|tjjtjjfv rv|}tjj}| jd}n|}|}| j}|tjjjtjjfv rd}d	d
 |jD }nR|tjjjtjj fv rd}dd
 |jD }n<|tjjj!tjj!fv rd}dd
 |jD }n&|tjjj"tjjj#tjj"tjj#fv rd}dd
 |jD }n	t$d| jj | jj%dkrt$dt& r(t'(|t)| jj||t*  |tjjjtjjjtjjtjjfv r!t'+||}	|	,| dS |,| dS t- rLt'.t)| jj||t* }|tjjtjjfv rJt'+||}|S |j/dd|id|dt)| jj||idd}
|tjjjtjjjfv r|j/dd|id|i|j|dd |
|_0|
S )aS  Initialize the input tensor with Numpy array.

        Args:
            var(Tensor): Tensor that needs to be initialized.
            block(Block|None, optional): The block in which initialization ops
                   should be added. Used in static graph only, default None.

        Returns:
            The initialization op
        zCCurrently, assign initializer not support lazy init for dist param.Zfloat32.Znumpy_array_inittmpF)nameshapedtypetypeZpersistablevaluesc                 S     g | ]}t |qS r   float.0vr   r   r    
<listcomp>m       z1NumpyArrayInitializer.forward.<locals>.<listcomp>c                 S  r-   r   r.   r0   r   r   r    r3   p   r4   c                 S  r-   r   intr0   r   r   r    r3   s   r4   Zint8_valuesc                 S  r-   r   r5   r0   r   r   r    r3   {   r4   zUnsupported dtype i   @zXThe size of input is too big. Please consider saving it to file and 'load_op' to load itNassign_valueZOutr*   r)   T)r+   outputsattrsZstop_gradientcastX)Zin_dtype	out_dtype)r+   Zinputsr8   r9   )1r   r   ZEagerParamBaseZis_distZ_check_blockVariablepaddleZpirr   ZParameterMetaZBlockr*   ZVarDescZVarTypeZFP16ZBF16ZFP32r   ZastypeZ
create_varr	   generatejoinr(   r)   ZDENSE_TENSORZDataTypeZFLOAT16ZBFLOAT16ZFLOAT32ZflatZFP64ZFLOAT64ZINT32ZINT8ZUINT8
ValueErrorsizer   r   Zassign_value_listr   r:   Z_share_underline_tensor_tor   r7   Z	append_opop)r   r!   r#   Zorigin_dtyper<   Znp_valueZout_varZ
value_namer,   Zvar_tmprD   r   r   r    forward:   s   


	




zNumpyArrayInitializer.forward)r   r   r   r   N)r!   r"   r#   r$   r   r%   )__name__
__module____qualname____doc__r   rE   __classcell__r   r   r   r    r   '   s
    r   c                      s&   e Zd ZdZ	dd fd	d
Z  ZS )Assigna  Init an parameter with a numpy array, list, or tensor.

    Args:
        value (Tensor|numpy.ndarray|list|tuple): numpy array, list, tuple, or tensor to initialize the parameter.
        name(str|None, optional): Normally there is no need for user to set this
            property. For more information, please refer to :ref:`api_guide_Name`. Default is None.

    Returns:
        A parameter initialized by the input numpy array, list, or tensor.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> import numpy as np

            >>> # numpy array
            >>> data_1 = paddle.ones(shape=[1, 2], dtype='float32')
            >>> weight_attr_1 = paddle.ParamAttr(
            ...     name="linear_weight_1",
            ...     initializer=paddle.nn.initializer.Assign(np.array([2, 2])))
            >>> bias_attr_1 = paddle.ParamAttr(
            ...     name="linear_bias_1",
            ...     initializer=paddle.nn.initializer.Assign(np.array([2])))
            >>> linear_1 = paddle.nn.Linear(2, 2, weight_attr=weight_attr_1, bias_attr=bias_attr_1)
            >>> print(linear_1.weight.numpy())
            [2. 2.]
            >>> print(linear_1.bias.numpy())
            [2.]

            >>> res_1 = linear_1(data_1)
            >>> print(res_1.numpy())
            [6.]

            >>> # python list
            >>> data_2 = paddle.ones(shape=[1, 2], dtype='float32')
            >>> weight_attr_2 = paddle.ParamAttr(
            ...     name="linear_weight_2",
            ...     initializer=paddle.nn.initializer.Assign([2, 2]))
            >>> bias_attr_2 = paddle.ParamAttr(
            ...     name="linear_bias_2",
            ...     initializer=paddle.nn.initializer.Assign([2]))
            >>> linear_2 = paddle.nn.Linear(2, 2, weight_attr=weight_attr_2, bias_attr=bias_attr_2)
            >>> print(linear_2.weight.numpy())
            [2. 2.]
            >>> print(linear_2.bias.numpy())
            [2.]

            >>> res_2 = linear_2(data_2)
            >>> print(res_2.numpy())
            [6.]

            >>> # tensor
            >>> data_3 = paddle.ones(shape=[1, 2], dtype='float32')
            >>> weight_attr_3 = paddle.ParamAttr(
            ...     name="linear_weight_3",
            ...     initializer=paddle.nn.initializer.Assign(paddle.full([2], 2)))
            >>> bias_attr_3 = paddle.ParamAttr(
            ...     name="linear_bias_3",
            ...     initializer=paddle.nn.initializer.Assign(paddle.full([1], 2)))
            >>> linear_3 = paddle.nn.Linear(2, 2, weight_attr=weight_attr_3, bias_attr=bias_attr_3)
            >>> print(linear_3.weight.numpy())
            [2. 2.]
            >>> print(linear_3.bias.numpy())
            [2.]

            >>> res_3 = linear_3(data_3)
            >>> print(res_3.numpy())
            [6.]
    Nr   0npt.NDArray[Any] | Sequence[int] | paddle.Tensorr(   
str | Noner   r   c                   sd   dd l }t|d|jtttjjfd t|ttfr|	|}t|tjjr*| d}t
 | d S )Nr   r   rL   F)r   r
   r   rC   tupler>   Zstaticr=   r   arrayr   r   )r   r   r(   r   r   r   r    r     s   

zAssign.__init__rF   )r   rM   r(   rN   r   r   )rG   rH   rI   rJ   r   rK   r   r   r   r    rL      s    JrL   )
__future__r   typingr   r   r>   r   baser   r   r	   Zbase.data_feederr
   Zbase.frameworkr   r   r   Zinitializerr   collections.abcr   Znumpy.typingZnpt__all__r   rL   r   r   r   r    <module>   s    