Ë
    •\;jž!  ã                   ó„   — 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
 ddlmZ g Z G d	„ d
e«      Z G d„ de«      Zy)é    N)Ú_C_opsé   )ÚcoreÚ	frameworkÚunique_name)Ú
check_type)Ú_current_expected_placeÚin_dygraph_modeé   )ÚInitializerc                   ó*   ‡ — e Zd ZdZˆ fd„Zdd„Zˆ xZS )ÚNumpyArrayInitializerzÚInit 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.

    c                 óh   •— dd l }t        ||j                  «      sJ ‚t        ‰| �  «        || _        y )Nr   )ÚnumpyÚ
isinstanceÚndarrayÚsuperÚ__init__Ú_value)ÚselfÚvaluer   Ú	__class__s      €úeG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/nn/initializer/assign.pyr   zNumpyArrayInitializer.__init__%   s,   ø€ Ûä˜% §¡Ô/Ð/Ð/Ü‰ÑÔØˆ�ó    c           
      ó€	  — | j                  |«      }t        |t        j                  «      sJ ‚t        |t        j                  «      sJ ‚|j
                  t        j                  j                  j                  t        j                  j                  j                  fv r±t        j                  j                  j                  }| j                  j                  d«      }|j                  t        j                   dj#                  d|j$                  dg«      «      |j&                  |t        j                  j                  j(                  d¬«      }n|}|j
                  }| j                  }|t        j                  j                  j                  k(  r&d}|j*                  D �cg c]  }t-        |«      ‘Œ }}�n+|t        j                  j                  j.                  k(  r%d}|j*                  D �cg c]  }t-        |«      ‘Œ }}nß|t        j                  j                  j0                  k(  r%d	}|j*                  D �cg c]  }t3        |«      ‘Œ }}n“|t        j                  j                  j4                  k(  s'|t        j                  j                  j6                  k(  r%d
}|j*                  D �cg c]  }t3        |«      ‘Œ }}n t9        d| j                  j
                  «      ‚| j                  j:                  dkD  rt9        d«      ‚t=        «       rÖt?        j@                  |tC        | j                  j&                  «      ||tE        «       «       |j
                  t        j                  j                  j                  t        j                  j                  j                  fv r2t?        jF                  ||j
                  «      }	|	jI                  |«       y|jI                  |«       y|jK                  dd|id|dtC        | j                  j&                  «      ||id¬«      }
|j
                  t        j                  j                  j                  t        j                  j                  j                  fv r0|jK                  dd|id|i|j
                  |j
                  dœ¬«       |
|_&        |
S c c}w c c}w c c}w c c}w )aN  Initialize the input tensor with Numpy array.

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

        Returns:
            The initialization op
        Úfloat32Ú.Únumpy_array_initÚtmpF)ÚnameÚshapeÚdtypeÚtypeÚpersistableÚfp32_valuesÚfp64_valuesÚint32_valuesÚint8_valueszUnsupported dtype %si   @zXThe size of input is too big. Please consider saving it to file and 'load_op' to load itNÚassign_valueÚOutr"   r!   T)r#   ÚoutputsÚattrsÚstop_gradientÚcastÚX)Úin_dtypeÚ	out_dtype)r#   Úinputsr+   r,   )'Ú_check_blockr   r   ÚVariableÚBlockr"   r   ÚVarDescÚVarTypeÚFP16ÚBF16ÚFP32r   ÚastypeÚ
create_varr   ÚgenerateÚjoinr    r!   Ú
LOD_TENSORÚflatÚfloatÚFP64ÚINT32ÚintÚINT8ÚUINT8Ú
ValueErrorÚsizer
   r   Úassign_value_Úlistr	   r.   Ú_share_underline_tensor_toÚ	append_opÚop)r   ÚvarÚblockr1   Únp_valueÚout_varÚ
value_nameÚvÚvaluesÚvar_tmprM   s              r   ÚforwardzNumpyArrayInitializer.forward,   sË  € ð ×!Ñ! %Ó(ˆä˜#œy×1Ñ1Ô2Ð2Ð2Ü˜%¤§¡Ô1Ð1Ð1ð �9‰9œŸ™×-Ñ-×2Ñ2´D·L±L×4HÑ4H×4MÑ4MÐNÑNÜŸ™×,Ñ,×1Ñ1ˆIØ—{‘{×)Ñ)¨)Ó4ˆHØ×&Ñ&Ü ×)Ñ)Ø—H‘HÐ0°#·(±(¸EÐBÓCóð —i‘iØÜ—\‘\×)Ñ)×4Ñ4Ø!ð 'ó ‰Gð ˆGØŸ	™	ˆIØ—{‘{ˆHàœŸ™×,Ñ,×1Ñ1Ò1Ø&ˆJØ(0¯ªÓ6© 1”e˜A•h¨ˆFÒ6Øœ$Ÿ,™,×.Ñ.×3Ñ3Ò3Ø&ˆJØ(0¯ªÓ6© 1”e˜A•h¨ˆFÑ6Øœ$Ÿ,™,×.Ñ.×4Ñ4Ò4Ø'ˆJØ&.§m¢mÓ4¡m ”c˜!•f mˆFÑ4àœŸ™×-Ñ-×2Ñ2Ò2ØœDŸL™L×0Ñ0×6Ñ6Ò6à&ˆJØ&.§m¢mÓ4¡m ”c˜!•f mˆFÑ4äÐ3°T·[±[×5FÑ5FÓGÐGØ�;‰;×ÑÐ0Ò0Üð=óð ô
 ÔÜ× Ñ ØÜ�T—[‘[×&Ñ&Ó'ØØÜ'Ó)ôð �y‰yÜ—‘×$Ñ$×)Ñ)Ü—‘×$Ñ$×)Ñ)ðñ ô !Ÿ+™+ g¨s¯y©yÓ9�Ø×2Ñ2°3Ô7ð ð ×2Ñ2°3Ô7Øà—‘Ø#Ø Ð(à˜YØœT $§+¡+×"3Ñ"3Ó4Ø ðð
 #ð !ó 	ˆBð �y‰yÜ—‘×$Ñ$×)Ñ)Ü—‘×$Ñ$×)Ñ)ðñ ð —‘ØØ ˜>Ø" C˜LØ'.§}¡}À3Ç9Á9ÑMð	  ô ð ˆCŒFØˆIùò} 7ùò 7ùò 5ùò 5s   Æ R,Ç-R1È9R6Ê,R;©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rV   Ú__classcell__©r   s   @r   r   r      s   ø„ ñ	ô÷br   r   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚAssignaT  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, 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.framework.ParamAttr(
            ...     name="linear_weight_1",
            ...     initializer=paddle.nn.initializer.Assign(np.array([2, 2])))
            >>> bias_attr_1 = paddle.framework.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.framework.ParamAttr(
            ...     name="linear_weight_2",
            ...     initializer=paddle.nn.initializer.Assign([2, 2]))
            >>> bias_attr_2 = paddle.framework.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.framework.ParamAttr(
            ...     name="linear_weight_3",
            ...     initializer=paddle.nn.initializer.Assign(paddle.full([2], 2)))
            >>> bias_attr_3 = paddle.framework.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.]
    c                 ó\  •— dd l }t        |d|j                  t        t        t
        j                  j                  fd«       t        |t        t        f«      r|j                  |«      }t        |t
        j                  j                  «      r|j                  d«      }t        ‰| �-  |«       y )Nr   r   r_   F)r   r   r   rJ   ÚtupleÚpaddleÚstaticr4   r   Úarrayr   r   )r   r   r    r   r   s       €r   r   zAssign.__init__Ù   s€   ø€ ÛäØØØ�]‰]œD¤%¬¯©×)?Ñ)?Ð@Øô		
ô �eœd¤E˜]Ô+Ø—K‘K Ó&ˆEô �eœVŸ]™]×3Ñ3Ô4Ø—K‘K Ó&ˆEä‰Ñ˜Õr   rW   )rX   rY   rZ   r[   r   r\   r]   s   @r   r_   r_   ‘   s   ø„ ñE÷N ñ  r   r_   )rb   r   Úbaser   r   r   Úbase.data_feederr   Úbase.frameworkr	   r
   Úinitializerr   Ú__all__r   r_   © r   r   Ú<module>rk      s?   ðó Ý ç 0Ñ 0Ý *ß FÝ $à
€ôu˜Kô uôpY Ð"õ Y r   