Ë
    •\;jù¿  ã                   óî  — d dl Z d dlZd dlmZ d dlZd dlm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 d dlmZmZmZ d dlmZmZmZmZ d d	lmZ g Z e«       d#d
„«       Z e«       d#d„«       Z e«       d#d„«       Zda d„ Z!d„ Z"d„ Z# G d„ d«      Z$ G d„ de$«      Z%d„ Z& G d„ d«      Z' G d„ de'«      Z( G d„ de'«      Z)da*d„ Z+da,d„ Z- G d„ de'«      Z.ej^                  d$d „«       Z0d!„ Z1d"„ Z2e'Z3e(Z4e)Z5e.Z6y)%é    N)ÚNotSupportedError)Ú_C_ops)ÚcoreÚ	frameworkÚunique_name)Úcheck_variable_and_dtype)ÚDataType)ÚVariableÚ
check_typeÚdefault_main_program)ÚLayerHelperÚin_dynamic_modeÚin_dynamic_or_pir_modeÚin_pir_mode)Útemplatedocc                 óœ  — t        «       rt        j                  | |«      S t        di t	        «       ¤Ž}t        | dg d¢d«       t        |dt        d«       |€0t        j                  dj                  |j                  dg«      «      }|j                  | j                  || j                  d¬«      }|j                  dd| id|id	|i¬
«       |S )a@  
    ${comment}

    Args:
        x(${x_type}): ${x_comment}
        max_norm(${max_norm_type}): ${max_norm_comment}
        name(str, optional): For detailed information, please refer
            to :ref:`api_guide_Name`. Usually name is no need to set and
            None by default.

    Returns:
        Tensor:

        out(${out_type}): ${out_comment}


    Examples:

        .. code-block:: python

            >>> import paddle
            >>> from paddle.nn import clip

            >>> input = paddle.to_tensor([[2.0, 2.0], [2.0, 2.0]], dtype='float32')
            >>> reward = clip.clip_by_norm(x=input, max_norm=1.0)
            >>> print(reward)
            Tensor(shape=[2, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
            [[0.50000000, 0.50000000],
             [0.50000000, 0.50000000]])
    Úclip_by_normÚX)Úfloat16Úfloat32Úuint16Úmax_normÚ.ÚtmpF)ÚtypeÚnameÚdtypeÚpersistableÚOut©r   ÚinputsÚattrsÚoutputs)r   )r   r   r   r   Úlocalsr   r   Úfloatr   Úgenerate_with_ignorable_keyÚjoinr   Úcreate_variabler   r   Ú	append_op)Úxr   r   ÚhelperÚouts        úWG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/nn/clip.pyr   r   %   sÖ   € ôB ÔÜ×"Ñ" 1 hÓ/Ð/äÑ4¬6«8Ñ4€FÜØ	ˆ3Ò0°.ôô ˆx˜¤e¨nÔ=à€|Ü×6Ñ6Ø�H‰H�f—k‘k 5Ð)Ó*ó
ˆð ×
 Ñ
 Ø�V‰V˜$ a§g¡g¸5ð !ó €Cð ×ÑØØ�QˆxØ˜8Ð$Ø˜�ð	 ô ð €Jó    c                 óÔ   — t        «       rt        j                  | «      S t        di t	        «       ¤Ž}|j                  | j                  ¬«      }|j                  dd| ii d|i¬«       |S )aQ  
    ${comment}

    Args:
        x(${x_type}): ${x_comment}
        name(basestring|None): Name of the output.

    Returns:
        out(${out_type}): ${out_comment}

    Examples:

        .. code-block:: python

            >>> import paddle
            >>> import paddle.base as base

            >>> b = paddle.static.default_main_program().global_block()
            >>> var = b.create_var(
            ...     name="X", dtype="float32", persistable=True,
            ...     type=base.core.VarDesc.VarType.SELECTED_ROWS)
            >>> y = paddle.nn.clip.merge_selected_rows(var)
    Úmerge_selected_rows©r   r   r   r    )r0   )r   r   r0   r   r$   Ú"create_variable_for_type_inferencer   r)   ©r*   r   r+   r,   s       r-   r0   r0   b   so   € ô2 ÔÜ×)Ñ)¨!Ó,Ð,äÑ;´&³(Ñ;€FØ
×
3Ñ
3¸!¿'¹'Ð
3Ó
B€CØ
×ÑØ"Ø�QˆxØØ˜�ð	 ô ð €Jr.   c                 óp  — t        «       rt        j                  | «      S t        | dt        d«       | j
                  t        j                  j                  j                  k7  rt        d«      ‚t        di t        «       ¤Ž}|j                  | j                  ¬«      }|j                  dd| id|ii ¬«       |S )	a?  
    Get tensor data from input with SelectedRows type, and outputs a Tensor.

    .. code-block:: text

        input x is SelectedRows:
           x.rows = [0, 5, 5, 4, 19]
           x.height = 20
           x.value = [[1, 1] [2, 2] [2, 2] [3, 3] [6, 6]]

        Output is LoDTensor:
           out.shape = [5, 2]
           out.data = [[1, 1],
                       [2, 2],
                       [2, 2],
                       [3, 3],
                       [6, 6]]

    Args:
        x(SelectedRows): Input with SelectedRows type. The data type is float32, float64, int32 or int64.
        name(str, optional): The default value is None.  Normally there is no need for user to set this property.
            For more information, please refer to :ref:`api_guide_Name` .

    Returns:
        Variable: LoDTensor transformed from SelectedRows. The data type is same with input.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> import paddle.base as base
            >>> from paddle.base import core
            >>> paddle.enable_static()
            >>> scope = core.Scope()
            >>> block = paddle.static.default_main_program().global_block()
            >>> x_rows = [0, 5, 5, 4, 19]
            >>> height = 20
            >>> x = scope.var('X').get_selected_rows()
            >>> x.set_rows(x_rows)
            >>> x.set_height(height)
            >>> x = block.create_var(name="X", dtype="float32", persistable=True, type=base.core.VarDesc.VarType.SELECTED_ROWS)
            >>> z = paddle.nn.clip.get_tensor_from_selected_rows(x)
    r*   Úget_tensor_from_selected_rowszGThe type of 'x' in get_tensor_from_selected_rows must be SELECTED_ROWS.r1   r   r   ©r   r!   r#   r"   )r5   )r   r   r5   r   r
   r   r   ÚVarDescÚVarTypeÚSELECTED_ROWSÚ	TypeErrorr   r$   r2   r   r)   r3   s       r-   r5   r5   ‰   s¬   € ôZ „}Ü×3Ñ3°AÓ6Ð6äˆq�#”xÐ!@ÔAØ‡v�v”—‘×%Ñ%×3Ñ3Ò3ÜØUó
ð 	
ô ÑE¼F»HÑE€FØ
×
3Ñ
3¸!¿'¹'Ð
3Ó
B€CØ
×ÑØ,Ø�QˆxØ˜�Øð	 ô ð €Jr.   Fc                  óŽ   — t        | «      dk  sJ ‚t        | «      dk(  r"t        | d   t        «      sJ ‚t        }| d   a|S t        S )Né   r   )ÚlenÚ
isinstanceÚboolÚ'_clip_by_global_norm_using_mp_type_flag©ÚargsÚ	old_values     r-   Ú"_clip_by_global_norm_using_mp_typerD   Ì   sL   € äˆt‹9˜Š>Ðˆ>Ü
ˆ4ƒy�A‚~Ü˜$˜q™'¤4Ô(Ð(Ð(Ü;ˆ	Ø26°q±'Ð/ØÐä6Ð6r.   c                 ó
  — | j                   t        j                  j                  j                  k(  s1| j                   t        j                  j                  j
                  k(  r=t        «       r3| j                  t        j                  j                  j                  «      S | j                   t        j                  k(  s| j                   t        j                  k(  r)t        «       r| j                  t        j                  «      S | S ©N)r   r   r7   r8   ÚFP16ÚBF16rD   ÚastypeÚFP32r	   ÚFLOAT16ÚBFLOAT16©r*   s    r-   Ú_cast_to_mp_type_if_enabledrN   Ø   s    € à	�‰”4—<‘<×'Ñ'×,Ñ,Ò,Ø�7‰7”d—l‘l×*Ñ*×/Ñ/Ò/Ü
,Ô
.Ø�x‰xœŸ™×,Ñ,×1Ñ1Ó2Ð2à	�‰”8×#Ñ#Ò# q§w¡w´(×2CÑ2CÒ'CÜ
,Ô
.Ø�x‰xœŸ™Ó&Ð&àˆr.   c                 ó  — t        | «      } t        «       rt        j                  | «      S d}t	        | dg d¢|«       t        |fi t        «       ¤Ž}|j                  | j                  «      }d| i}d|i}|j                  |||¬«       |S )z1
    Return the squared L2 norm of a tensor.
    Úsquared_l2_normr*   )r   Úfloat64r   r   r   r   ©r   r!   r#   )
rN   r   r   rP   r   r   r$   r2   r   r)   )r*   Úop_typer+   r,   r!   r#   s         r-   Ú_squared_l2_normrT   æ   s�   € ô
 	$ AÓ&€AäÔÜ×%Ñ% aÓ(Ð(à€GÜØ	ˆ3Ò;¸Wôô ˜Ñ-¤F£HÑ-€FØ
×
3Ñ
3°A·G±GÓ
<€Cà�1ˆX€FØ�cˆl€GØ
×Ñ˜'¨&¸'ÐÔBØ€Jr.   c                   ó   — e Zd Zd„ Zd„ Zy)ÚBaseErrorClipAttrc                 ó   — t        «       ‚rF   ©ÚNotImplementedError©Úselfs    r-   Ú__str__zBaseErrorClipAttr.__str__þ   ó   € Ü!Ó#Ð#r.   c                 ó   — t        «       ‚rF   rX   )r[   ÚblockÚ	grad_names      r-   Ú_append_clip_opz!BaseErrorClipAttr._append_clip_op  r]   r.   N)Ú__name__Ú
__module__Ú__qualname__r\   ra   © r.   r-   rV   rV   ý   s   „ ò$ó$r.   rV   c                   ó$   — e Zd ZdZdd„Zd„ Zd„ Zy)ÚErrorClipByValuea1  
    Clip tensor values to the range [min, max].

    Given a tensor ``t`` (see Examples below), this operation clips its value \
    to ``min`` and ``max`` inplace.

    - Any values less than min are set to min.
    - Any values greater than max are set to max.

    Args:
        max (float): The maximum value to clip by.
        min (float, optional): The minimum value to clip by. if not set by user, \
        will be set to ``-max`` by framework.

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> paddle.enable_static()
            >>> BATCH_SIZE = 128
            >>> CLIP_MAX = 2e-6
            >>> CLIP_MIN = -1e-6
            >>> prog = paddle.static.Program()
            >>> with paddle.static.program_guard(main_program=prog):
            ...     image = paddle.static.data(name='x', shape=[None, 784], dtype='float32')
            ...     hidden1 = paddle.static.nn.fc(image, size=128, activation='relu')
            ...     hidden2 = paddle.static.nn.fc(hidden1, size=64, activation='relu')
            ...     predict = paddle.static.nn.fc(hidden2, size=10, activation='softmax')
            ...     label = paddle.static.data(name='y', shape=[1], dtype='int64')
            ...     cost = paddle.nn.functional.cross_entropy(input=predict, label=label)
            ...     avg_cost = paddle.mean(cost)
            >>> prog_clip = prog.clone()
            >>> prog_clip.block(0).var(hidden1.name)._set_error_clip(
            ...     paddle.nn.clip.ErrorClipByValue(
            ...         max=CLIP_MAX, min=CLIP_MIN))
    Nc                 óX   — t        |«      }|€| }nt        |«      }|| _        || _        y rF   )r%   ÚmaxÚmin)r[   ri   rj   s      r-   Ú__init__zErrorClipByValue.__init__,  s.   € Ü�C‹jˆØˆ;Ø�$‰Cä˜“*ˆCØˆŒØˆ�r.   c                 ó>   — d| j                   d›d| j                  d›�S )NzByValue, min=Úfú, max=©rj   ri   rZ   s    r-   r\   zErrorClipByValue.__str__5  s!   € Ø˜tŸx™x¨˜l¨&°·±¸!°Ð=Ð=r.   c                 ó  — |j                   j                  «       }|j                  d«       |j                  d|g«       |j	                  d|g«       |j                  d| j                  «       |j                  d| j                  «       y )NÚclipr   r   rj   ri   )Údescr)   Úset_typeÚ	set_inputÚ
set_outputÚ	_set_attrrj   ri   )r[   r_   r`   Úclip_op_descs       r-   ra   z ErrorClipByValue._append_clip_op8  sn   € Ø—z‘z×+Ñ+Ó-ˆØ×Ñ˜fÔ%Ø×Ñ˜s Y KÔ0Ø×Ñ ¨	 {Ô3Ø×Ñ˜u d§h¡hÔ/Ø×Ñ˜u d§h¡hÕ/r.   rF   )rb   rc   rd   Ú__doc__rk   r\   ra   re   r.   r-   rg   rg     s   „ ñ$óLò>ó0r.   rg   c                 ót  — |}| j                   j                  | j                   j                  «       dz
  «      }|j                  «       D �cg c]	  }||v sŒ|‘Œ c}D ]U  }| j	                  ||   «      }t        |dd «      }|�t        |t        «      st        d«      ‚|€ŒD|j                  | |«       ŒW y c c}w )Nr<   Ú
error_clipzIVariable's error_clip should be an instance of BaseErrorClipAttr or None.)
rr   ÚopÚop_sizeÚoutput_arg_namesÚ_var_recursiveÚgetattrr>   rV   r:   ra   )r_   ÚcontextÚgrad_to_varÚop_descÚnÚgrad_nÚfwd_varrz   s           r-   Úerror_clip_callbackr†   A  sµ   € à€KØ�j‰j�m‰m˜EŸJ™J×.Ñ.Ó0°1Ñ4Ó5€GØ%×6Ñ6Ô8ÓMÑ8˜¸AÀÒ<L’1Ð8ÔMˆØ×&Ñ& {°6Ñ':Ó;ˆÜ˜W l°DÓ9ˆ
àÐ¤*¨ZÔ9JÔ"KäØ[óð ð Ñ!Ø×&Ñ& u¨fÕ5ñ NùÒMs   Á	B5ÁB5c                   óp   ‡ — e Zd Zˆ fd„Zd„ Z ej                  «       d„ «       Zd„ Zd„ Z	d„ Z
d„ Zd„ Zˆ xZS )	ÚClipGradBasec                 ó"   •— t         ‰| �  «        y rF   )Úsuperrk   )r[   Ú	__class__s    €r-   rk   zClipGradBase.__init__S  s   ø€ Ü‰ÑÕr.   c                 ó   — t        «       ‚rF   rX   rZ   s    r-   r\   zClipGradBase.__str__V  r]   r.   c                 ó   — t         ‚rF   rX   ©r[   Úparams_gradss     r-   Ú_dygraph_clipzClipGradBase._dygraph_clipY  s   € ä!Ð!r.   c                 ó   — t         ‚rF   rX   rŽ   s     r-   Ú	_pir_clipzClipGradBase._pir_clip]  ó   € Ü!Ð!r.   c                 ó   — t         ‚rF   rX   rŽ   s     r-   Ú_static_clipzClipGradBase._static_clip`  r“   r.   c                 óì   — t        «       r| j                  |«      S t        «       r| j                  |«      S |D ])  \  }}t	        |dd «      €Œt        j                  d«        n | j                  |«      S )NÚgradient_clip_attrz•'set_gradient_clip' will be ineffective, because you have set 'need_clip' in 'ParamAttr'. So, 'set_gradient_clip' is redundant and you can remove it.)r   r�   r   r’   r   ÚwarningsÚwarnr•   )r[   r�   ÚpÚgs       r-   Ú__call__zClipGradBase.__call__c  st   € ÜÔØ×%Ñ% lÓ3Ð3ÜŒ]Ø—>‘> ,Ó/Ð/ã$‘��1Ü˜1Ð2°DÓ9ÑEÜ—M‘Mð>ôñ
 ð %ð ×$Ñ$ \Ó2Ð2r.   c                 ó   — t        «       ‚rF   rX   ©r[   r€   ÚparamÚgrads       r-   Ú_process_contextzClipGradBase._process_contexts  r]   r.   c                 ó   — t        «       ‚rF   rX   )r[   rŸ   r    s      r-   Ú_create_operatorszClipGradBase._create_operatorsv  r]   r.   )rb   rc   rd   rk   r\   Úimperative_baseÚno_gradr�   r’   r•   rœ   r¡   r£   Ú__classcell__©r‹   s   @r-   rˆ   rˆ   R  sE   ø„ ôò$ð €_×ÑÓñ"ó ð"ò"ò"ò3ò $ö$r.   rˆ   c                   ój   ‡ — e Zd ZdZdˆ fd„	Zd„ Z ej                  «       d„ «       Zd„ Z	d„ Z
d„ Zˆ xZS )	ÚClipGradByValueaÍ  
    Limit the value of multi-dimensional Tensor :math:`X` to the range [min, max].

    - Any values less than min are set to ``min``.

    - Any values greater than max are set to ``max``.

    The multi-dimensional Tensor :math:`X` is not passed from this class, but the gradients of all parameters set in ``optimizer``.
    If ``need_clip`` of specific param is ``False`` in its ``ParamAttr``, then the gradients of this param will not be clipped.

    Gradient clip will takes effect after being set in ``optimizer`` , see the document ``optimizer``
    (for example: :ref:`api_paddle_optimizer_SGD`).

    Note:
        ``need_clip`` of ``ClipGradByValue`` HAS BEEN DEPRECATED since 2.0.
        Please use ``need_clip`` in ``ParamAttr`` to speficiy the clip scope.

    Args:
        max (float): The maximum value to clip by.
        min (float, optional): The minimum value to clip by. if not set by user, it will be set to ``-max``
            automatically. In this case, ``max`` must be greater than :math:`0`.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> x = paddle.uniform([10, 10], min=-1.0, max=1.0, dtype='float32')
            >>> linear = paddle.nn.Linear(in_features=10, out_features=10,
            ...                           weight_attr=paddle.ParamAttr(need_clip=True),
            ...                           bias_attr=paddle.ParamAttr(need_clip=False))
            >>> out = linear(x)
            >>> loss = paddle.mean(out)
            >>> loss.backward()

            >>> clip = paddle.nn.ClipGradByValue(min=-1, max=1)
            >>> sdg = paddle.optimizer.SGD(learning_rate=0.1, parameters=linear.parameters(), grad_clip=clip)
            >>> sdg.step()
    c                 óz   •— t         ‰| �  «        |€
|dkD  sJ ‚| }t        |«      | _        t        |«      | _        y )Ng        )rŠ   rk   r%   ri   rj   )r[   ri   rj   r‹   s      €r-   rk   zClipGradByValue.__init__¢  s<   ø€ Ü‰ÑÔØˆ;Ø˜’9Ð�9Ø�$ˆCÜ˜“:ˆŒÜ˜“:ˆ�r.   c                 ó>   — d| j                   d›d| j                  d›�S )NzClip Gradient By Value, min = rm   rn   ro   rZ   s    r-   r\   zClipGradByValue.__str__ª  s!   € Ø/°·±¸¨|¸6À$Ç(Á(È1ÀÐNÐNr.   c                 óè   — g }|D ]j  \  }}|€Œ	t        |dd«      du r|j                  ||f«       Œ,t        j                  || j                  | j
                  ¬«      }|j                  ||f«       Œl |S )NÚ	need_clipTF©r*   rj   ri   )r   ÚappendÚpaddlerq   rj   ri   ©r[   r�   Úparams_and_gradsrš   r›   Únew_grads         r-   r�   zClipGradByValue._dygraph_clip­  sx   € àÐÛ ‰DˆAˆqØˆyØÜ�q˜+ tÓ,°Ñ5Ø ×'Ñ'¨¨A¨Ô/ØÜ—{‘{ Q¨D¯H©H¸$¿(¹(ÔCˆHØ×#Ñ# Q¨ MÕ2ð !ð  Ðr.   c                 ó  — g }i }t        j                  d«      5  |D ]³  \  }}|€Œ	t        |dd«      du r|j                  ||f«       Œ,|j                  j
                  j                  ||g«      5  t        j                  || j                  | j                  ¬«      }d d d «       |j                  |f«       |j                  ||j                  <   Œµ 	 d d d «       t        ||«       |S # 1 sw Y   ŒNxY w# 1 sw Y   Œ#xY w)NÚgradient_clipr­   TFr®   )r   Ú
name_scoper   r¯   r_   ÚprogramÚ_optimized_guardr°   rq   rj   ri   r   Ú_correct_clip_op_role_var©r[   r�   r²   Úparam_new_grad_name_dictrš   r›   r³   s          r-   r•   zClipGradByValue._static_clipº  sá   € ØÐØ#%Ð Ü×!Ñ! /Õ2Û$‘��1Ø�9ØÜ˜1˜k¨4Ó0°EÑ9Ø$×+Ñ+¨Q°¨FÔ3Øà—W‘W—_‘_×5Ñ5°q¸!°fÕ=Ü%Ÿ{™{¨Q°D·H±HÀ$Ç(Á(ÔK�H÷ >à ×'Ñ'¨¨H¨Ô6Ø3;·=±=Ð(¨¯©Ò0ñ %÷ 3ô 	"Ð"2Ð4LÔMØÐ÷ >Ð=ú÷ 3Ð2ús$   šAC6Á0-C*Â6C6Ã*C3Ã/C6Ã6C?c                  ó   — y rF   re   rž   s       r-   r¡   z ClipGradByValue._process_contextÌ  ó   € Ør.   c                 ób   — t        j                  || j                  | j                  ¬«      }||fS )Nr®   )r°   rq   rj   ri   ©r[   rŸ   r    r³   s       r-   r£   z!ClipGradByValue._create_operatorsÏ  s&   € Ü—;‘; ¨4¯8©8¸¿¹ÔBˆØ�hˆÐr.   rF   ©rb   rc   rd   rx   rk   r\   r¤   r¥   r�   r•   r¡   r£   r¦   r§   s   @r-   r©   r©   z  sB   ø„ ñ%õNòOð €_×ÑÓñ
 ó ð
 ò ò$ör.   r©   c                   óh   ‡ — e Zd ZdZˆ fd„Zd„ Z ej                  «       d„ «       Zd„ Z	d„ Z
d„ Zˆ xZS )ÚClipGradByNorma  
    Limit the l2 norm of multi-dimensional Tensor :math:`X` to ``clip_norm`` .

    - If the l2 norm of :math:`X` is greater than ``clip_norm`` , :math:`X` will be compressed by a ratio.

    - If the l2 norm of :math:`X` is less than or equal to ``clip_norm`` , nothing will be done.

    The multidimensional Tensor :math:`X` is not passed from this class, but the gradients of all parameters set in ``optimizer``.
    If ``need_clip`` of specific param is ``False`` in its ``ParamAttr``, then the gradients of this param will not be clipped.

    Gradient clip will takes effect after being set in ``optimizer`` , see the document ``optimizer``
    (for example: :ref:`api_paddle_optimizer_SGD`).

    The clipping formula is:

    .. math::
        Out =
        \left\{
            \begin{array}{ccl}
                X & & if (norm(X) \leq clip\_norm) \\
                \frac{clip\_norm*X}{norm(X)} & & if (norm(X) > clip\_norm) \\
        \end{array}
        \right.


    where :math:`norm(X)` represents the L2 norm of :math:`X`.

    .. math::
        norm(X) = ( \sum_{i=1}^{n}|x\_i|^2)^{ \frac{1}{2}}

    Note:
        ``need_clip`` of ``ClipGradByNorm`` HAS BEEN DEPRECATED since 2.0.
        Please use ``need_clip`` in ``ParamAttr`` to speficiy the clip scope.

    Args:
        clip_norm(float): The maximum norm value.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> x = paddle.uniform([10, 10], min=-1.0, max=1.0, dtype='float32')
            >>> linear = paddle.nn.Linear(in_features=10, out_features=10,
            ...                           weight_attr=paddle.ParamAttr(need_clip=True),
            ...                           bias_attr=paddle.ParamAttr(need_clip=False))
            >>> out = linear(x)
            >>> loss = paddle.mean(out)
            >>> loss.backward()

            >>> clip = paddle.nn.ClipGradByNorm(clip_norm=1.0)
            >>> sdg = paddle.optimizer.SGD(learning_rate=0.1, parameters=linear.parameters(), grad_clip=clip)
            >>> sdg.step()
    c                 óB   •— t         ‰| �  «        t        |«      | _        y rF   )rŠ   rk   r%   Ú	clip_norm)r[   rÄ   r‹   s     €r-   rk   zClipGradByNorm.__init__  s   ø€ Ü‰ÑÔÜ˜yÓ)ˆ�r.   c                 ó    — d| j                   z  S )Nz#Gradient Clip By Norm, clip_norm=%f©rÄ   rZ   s    r-   r\   zClipGradByNorm.__str__  s   € Ø4°t·~±~ÑEÐEr.   c                 ó¾   — g }|D ]U  \  }}|€Œ	t        |dd«      du r|j                  ||f«       Œ,t        || j                  ¬«      }|j                  ||f«       ŒW |S )Nr­   TF©r*   r   )r   r¯   r   rÄ   r±   s         r-   r�   zClipGradByNorm._dygraph_clip  sn   € àÐÛ ‰DˆAˆqØˆyØÜ�q˜+ tÓ,°Ñ5Ø ×'Ñ'¨¨A¨Ô/ØÜ# a°$·.±.ÔAˆHØ×#Ñ# Q¨ MÕ2ð !ð  Ðr.   c                 óÚ  — g }t        j                  d«      5  i }|D ]ž  \  }}|€Œ	t        |dd«      du r|j                  ||f«       Œ,|j                  j
                  j                  ||g«      5  t        || j                  ¬«      }d d d «       j                  ||j                  <   |j                  ||f«       Œ  	 d d d «       t        |«       |S # 1 sw Y   ŒNxY w# 1 sw Y   Œ#xY w)Nrµ   r­   TFrÈ   )r   r¶   r   r¯   r_   r·   r¸   r   rÄ   r   r¹   rº   s          r-   r•   zClipGradByNorm._static_clip  s×   € ØÐÜ×!Ñ! /Õ2Ø')Ð$Û$‘��1Ø�9ØÜ˜1˜k¨4Ó0°EÑ9Ø$×+Ñ+¨Q°¨FÔ3Øà—W‘W—_‘_×5Ñ5°q¸!°fÕ=Ü+¨a¸$¿.¹.ÔI�H÷ >à3;·=±=Ð(¨¯©Ñ0Ø ×'Ñ'¨¨H¨Õ6ñ %÷ 3ô 	"Ð"2Ð4LÔMØÐ÷ >Ð=ú÷ 3Ð2ús$   ˜AC!Á0CÂ6C!ÃCÃC!Ã!C*c                  ó   — y rF   re   rž   s       r-   r¡   zClipGradByNorm._process_context1  r½   r.   c                 ó8   — t        || j                  ¬«      }||fS )NrÈ   )r   rÄ   r¿   s       r-   r£   z ClipGradByNorm._create_operators4  s   € Ü $°·±Ô@ˆØ�hˆÐr.   rÀ   r§   s   @r-   rÂ   rÂ   Ô  sB   ø„ ñ4ôl*òFð €_×ÑÓñ
 ó ð
 ò ò$ör.   rÂ   c                  óŠ   — t        | «      dk(  rt        S t        | «      dk(  rt        | d   t        «      sJ ‚t        }| d   a|S ©Nr   r<   )r=   Ú&_allow_pure_fp16_global_norm_clip_flagr>   r?   rA   s     r-   Ú!_allow_pure_fp16_global_norm_cliprÏ   <  óF   € ä
ˆ4ƒy�A‚~Ü5Ð5ä�4‹y˜AŠ~¤*¨T°!©W´dÔ";Ð;Ð;Ü:ˆ	Ø15°a±Ð.ØÐr.   c                  óŠ   — t        | «      dk(  rt        S t        | «      dk(  rt        | d   t        «      sJ ‚t        }| d   a|S rÍ   )r=   Ú&_allow_pure_bf16_global_norm_clip_flagr>   r?   rA   s     r-   Ú!_allow_pure_bf16_global_norm_cliprÓ   J  rÐ   r.   c                   ór   ‡ — e Zd ZdZ	 d	ˆ fd„	Zd„ Z ej                  «       d„ «       Zd„ Z	d„ Z
d„ Zd„ Zˆ xZS )
ÚClipGradByGlobalNormao  
    Given a list of Tensor :math:`t\_list` , calculate the global norm for the elements of all tensors in
    :math:`t\_list` , and limit it to ``clip_norm`` .

    - If the global norm is greater than ``clip_norm`` , all elements of :math:`t\_list` will be compressed by a ratio.

    - If the global norm is less than or equal to ``clip_norm`` , nothing will be done.

    The list of Tensor :math:`t\_list` is not passed from this class, but the gradients of all parameters set in ``optimizer``.
    If ``need_clip`` of specific param is ``False`` in its ``ParamAttr``, then the gradients of this param will not be clipped.

    Gradient clip will takes effect after being set in ``optimizer`` , see the document ``optimizer``
    (for example: :ref:`api_paddle_optimizer_SGD`).

    The clipping formula is:

    .. math::

        t\_list[i] = t\_list[i] * \frac{clip\_norm}{\max(global\_norm, clip\_norm)}

    where:

    .. math::

        global\_norm = \sqrt{\sum_{i=0}^{N-1}(l2norm(t\_list[i]))^2}

    Note:
        ``need_clip`` of ``ClipGradyGlobalNorm`` HAS BEEN DEPRECATED since 2.0.
        Please use ``need_clip`` in ``ParamAttr`` to speficiy the clip scope.

    Args:
        clip_norm (float): The maximum norm value.
        group_name (str, optional): The group name for this clip. Default value is ``default_group``.
        auto_skip_clip (bool, optional): skip clipping gradient. Default value is ``False``.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> x = paddle.uniform([10, 10], min=-1.0, max=1.0, dtype='float32')
            >>> linear = paddle.nn.Linear(in_features=10, out_features=10,
            ...                           weight_attr=paddle.ParamAttr(need_clip=True),
            ...                           bias_attr=paddle.ParamAttr(need_clip=False))
            >>> out = linear(x)
            >>> loss = paddle.mean(out)
            >>> loss.backward()

            >>> clip = paddle.nn.ClipGradByGlobalNorm(clip_norm=1.0)
            >>> sdg = paddle.optimizer.SGD(learning_rate=0.1, parameters=linear.parameters(), grad_clip=clip)
            >>> sdg.step()
    c                 ó�   •— t         ‰| �  «        t        |«      | _        || _        t        |t        «      sJ ‚|| _        d | _        y rF   )	rŠ   rk   r%   rÄ   Ú
group_namer>   r?   Úauto_skip_clipÚ_async_add_n)r[   rÄ   r×   rØ   r‹   s       €r-   rk   zClipGradByGlobalNorm.__init__Š  sE   ø€ ô 	‰ÑÔÜ˜yÓ)ˆŒØ$ˆŒÜ˜.¬$Ô/Ð/Ð/Ø,ˆÔð !ˆÕr.   c                 ó    — d| j                   z  S )Nz+Gradient Clip By GlobalNorm, global_norm=%frÆ   rZ   s    r-   r\   zClipGradByGlobalNorm.__str__™  s   € Ø<ÀÇÁÑOÐOr.   c                 ó`  — g }g }g }g }|D �]m  \  }}|€Œ
t        |dd«      du rŒ|}t        «       r,|j                  «       rt        |«      }|j	                  «       }nG|j
                  t        j                  j                  j                  k(  rt        |«      }t        |«      }t        |«      }	|	j                  t        j                  j                  j                  k(  s1|	j                  t        j                  j                  j                  k(  r|j                  |	«       �Œ|	j                  t        j                  j                  j                   k(  r|j                  |	«       �Œ]|j                  |	«       �Œp t#        |«      t#        |«      z   t#        |«      z   dk(  r|S d„ }
t#        |«      dkD  rdnd}g }t#        |«      dkD  r( |
|«      }|j                  |j%                  |«      «       t#        |«      dkD  r? |
|«      }|dk(  r|j                  |«       n |j                  |j%                  |«      «       t#        |«      dkD  r |
|«      }|j                  |«        |
|«      }t'        j(                  |«      }t'        j*                  g |j                  | j,                  ¬«      }d}| j.                  s/d}t'        j0                  |t'        j2                  ||¬	«      ¬	«      }n||kD  rd}t'        j0                  ||¬	«      }|D ]   \  }}|€Œ	t        |dd«      du r|j                  ||f«       Œ,|r`j                  |j                  k7  r|j%                  |j                  «      n|}t'        j4                  ||«      }|j                  ||f«       ŒŽ|j                  ||f«       Œ¢ |S )
Nr­   TFr   c                 óH   — t        j                  | «      j                  «       S rF   ©r°   ÚstackÚsum©Úvar_lists    r-   Úasync_add_nz7ClipGradByGlobalNorm._dygraph_clip.<locals>.async_add_nÅ  ó   € Ü—<‘< Ó)×-Ñ-Ó/Ð/r.   rQ   r   ©Úshaper   Ú
fill_value©r*   Úy)r   r   Úis_selected_rowsr0   Ú_get_tensor_from_selected_rowsr   r   r7   r8   r9   r5   rT   r   rG   rH   r¯   rJ   r=   rI   r°   ÚsqrtÚfullrÄ   rØ   ÚdivideÚmaximumÚmultiply©r[   r�   r²   Úsum_square_listÚsum_square_list_fp16Úsum_square_list_fp32rš   r›   Ú
merge_gradÚ
sum_squarerâ   Ú	sum_dtypeÚglobal_norm_varÚglobal_norm_var_fp16Úglobal_norm_var_fp32Úglobal_norm_var_fp64Úmax_global_normr­   Úclip_varÚ
clip_inputr³   s                        r-   r�   z"ClipGradByGlobalNorm._dygraph_clipœ  s_  € àÐØˆØ!ÐØ!ÐÜ ‰DˆAˆqØˆyØÜ�q˜+ tÓ,°Ñ5ØØˆJäÔ  Q×%7Ñ%7Ô%9Ü0°Ó3�
Ø'×FÑFÓH‘
à—‘œ4Ÿ<™<×/Ñ/×=Ñ=Ò=Ü0°Ó3�
Ü:¸:ÓF�
ä)¨*Ó5ˆJà× Ñ ¤D§L¡L×$8Ñ$8×$=Ñ$=Ò=Ø×#Ñ#¤t§|¡|×';Ñ';×'@Ñ'@Ò@à$×+Ñ+¨JÖ7Ø×!Ñ!¤T§\¡\×%9Ñ%9×%>Ñ%>Ò>Ø$×+Ñ+¨JÖ7à×&Ñ& zÖ2ð1 !ô8 �Ó ÜÐ&Ó'ñ(äÐ&Ó'ñ(ð òð
  Ðò	0ô "% _Ó!5¸Ò!9‘I¸yˆ	ØˆÜÐ#Ó$ qÒ(Ù#.Ð/CÓ#DÐ Ø×"Ñ"Ð#7×#>Ñ#>¸yÓ#IÔJÜÐ#Ó$ qÒ(Ù#.Ð/CÓ#DÐ Ø˜IÒ%Ø×&Ñ&Ð';Õ<à×&Ñ&Ð';×'BÑ'BÀ9Ó'MÔNÜˆÓ !Ò#Ù#.¨Ó#?Ð Ø×"Ñ"Ð#7Ô8Ù% oÓ6ˆÜ Ÿ+™+ oÓ6ˆÜ Ÿ+™+Ø˜O×1Ñ1¸d¿n¹nô
ˆð ˆ	Ø×"Ò"ØˆIÜ—}‘}Ø!Ü—.‘. ?°oÔFô‰Hð ˜Ò.àˆIÜ—}‘} ¸/ÔJˆHã ‰DˆAˆqØˆyØÜ�q˜+ tÓ,°Ñ5Ø ×'Ñ'¨¨A¨Ô/Øáð  —~‘~¨¯©Ò0ð —O‘O A§G¡GÔ,à!ð ô
 "Ÿ?™?¨1¨jÓ9�Ø ×'Ñ'¨¨H¨Õ6à ×'Ñ'¨¨A¨Õ/ð! !ð$  Ðr.   c                 óF  — g }g }g }g }|D ]á  \  }}|€Œ	t        |dd«      du rŒ|}t        «       r&|j                  «       rt        |«      }t	        |«      }t        |«      }	|	j                  t        j                  k(  s|	j                  t        j                  k(  r|j                  |	«       Œ¢|	j                  t        j                  k(  r|j                  |	«       ŒÑ|j                  |	«       Œã t        |«      t        |«      z   t        |«      z   dk(  r|S d„ }
t        |«      dkD  rdnd}g }t        |«      dkD  r( |
|«      }|j                  |j                  |«      «       t        |«      dkD  r? |
|«      }|dk(  r|j                  |«       n |j                  |j                  |«      «       t        |«      dkD  r |
|«      }|j                  |«        |
|«      }t        j                  |«      }t        j                   g |j                  | j"                  ¬«      }d}| j$                  s/d}t        j&                  |t        j(                  ||¬	«      ¬	«      }n||kD  rd}t        j&                  ||¬	«      }|D ]   \  }}|€Œ	t        |dd«      du r|j                  ||f«       Œ,|r`j                  |j                  k7  r|j                  |j                  «      n|}t        j*                  ||«      }|j                  ||f«       ŒŽ|j                  ||f«       Œ¢ |S )
Nr­   TFr   c                 óH   — t        j                  | «      j                  «       S rF   rÝ   rà   s    r-   râ   z3ClipGradByGlobalNorm._pir_clip.<locals>.async_add_n   rã   r.   rQ   r   rä   rç   )r   r   Úis_selected_row_typer0   r5   rT   r   r	   rK   rL   r¯   ÚFLOAT32r=   rI   r°   rë   rì   rÄ   rØ   rí   rî   rï   rð   s                        r-   r’   zClipGradByGlobalNorm._pir_clipü  s  € ØÐØˆØ!ÐØ!ÐÛ ‰DˆAˆqØˆyØÜ�q˜+ tÓ,°Ñ5ØØˆJäŒ} ×!7Ñ!7Ô!9Ü0°Ó3�
Ü:¸:ÓF�
ä)¨*Ó5ˆJà× Ñ ¤H×$4Ñ$4Ò4Ø×#Ñ#¤x×'8Ñ'8Ò8à$×+Ñ+¨JÕ7Ø×!Ñ!¤X×%5Ñ%5Ò5Ø$×+Ñ+¨JÕ7à×&Ñ& zÕ2ð) !ô0 �Ó ÜÐ&Ó'ñ(äÐ&Ó'ñ(ð òð
  Ðò	0ô "% _Ó!5¸Ò!9‘I¸yˆ	ØˆÜÐ#Ó$ qÒ(Ù#.Ð/CÓ#DÐ Ø×"Ñ"Ð#7×#>Ñ#>¸yÓ#IÔJÜÐ#Ó$ qÒ(Ù#.Ð/CÓ#DÐ Ø˜IÒ%Ø×&Ñ&Ð';Õ<à×&Ñ&Ð';×'BÑ'BÀ9Ó'MÔNÜˆÓ !Ò#Ù#.¨Ó#?Ð Ø×"Ñ"Ð#7Ô8Ù% oÓ6ˆÜ Ÿ+™+ oÓ6ˆÜ Ÿ+™+Ø˜O×1Ñ1¸d¿n¹nô
ˆð ˆ	Ø×"Ò"ØˆIÜ—}‘}Ø!Ü—.‘. ?°oÔFô‰Hð ˜Ò.àˆIÜ—}‘} ¸/ÔJˆHã ‰DˆAˆqØˆyØÜ�q˜+ tÓ,°Ñ5Ø ×'Ñ'¨¨A¨Ô/Øáð  —~‘~¨¯©Ò0ð —O‘O A§G¡GÔ,à!ð ô
 "Ÿ?™?¨1¨jÓ9�Ø ×'Ñ'¨¨H¨Õ6à ×'Ñ'¨¨A¨Õ/ð! !ð$  Ðr.   c                 ó†  ‡ — g }g }g }g }g }ˆ fd„}t        j                  d«      5  |D �]w  \  }}	|	€Œ
t        |dd«      du rŒ|	}
|j                  j                  j                  ||	g«      5  |	j                  t        j                  j                  j                  k(  rt        |	«      }
t        |
«      }
t        |
«      }|j                  t        j                  j                  j                  k(  r|j!                  |«       n—|j                  t        j                  j                  j"                  k(  r|j!                  |«       nT|j                  t        j                  j                  j$                  k(  r|j!                  |«       n|j!                  |«       d d d «       �Œz t'        |«      dkD  rt'        |«      dkD  rt)        d«      ‚t'        |«      t'        |«      z   t'        |«      z   dk(  r1t'        |«      t'        |«      z   t'        |«      z   dk(  r|cd d d «       S j                  j                  j                  |	g«      5  t'        |«      dkD  rdnd	}g }t'        |«      dkD  rH ||«      }|s|s
t+        «       s!|j!                  |j-                  |«      «       n|j!                  |«       t'        |«      dkD  rH ||«      }|s|s
t/        «       s!|j!                  |j-                  |«      «       n|j!                  |«       t'        |«      dkD  r? ||«      }|d	k(  r|j!                  |«       n |j!                  |j-                  |«      «       t'        |«      dkD  r ||«      }|j!                  |«       t'        |«      d
kD  r ||«      n|d   }t1        j2                  |¬«      }t1        j4                  d
g|j                  ‰ j6                  ¬«      }t1        j8                  |t1        j:                  ||¬«      ¬«      }d d d «       i }|D �]â  \  }}	|	€Œ
t        |dd«      du r|j!                  ||	f«       Œ-|j                  j                  j                  ||	g«      5  t=        |	«      }|j                  t        j                  j                  j                  k(  rCj                  t        j                  j                  j                  k7  r|j-                  d«      }nv|j                  t        j                  j                  j"                  k(  rCj                  t        j                  j                  j"                  k7  r|j-                  d«      }n}t?        «       jA                  «       }|jC                  d||dœd|i¬«       ||	ur0|jC                  dd|id|	i|j                  |	j                  dœ¬«       d d d «       |	jD                  ||jD                  <   |j!                  ||	f«       �Œå 	 d d d «       tG        |«       |S # 1 sw Y   �ŒòxY w# 1 sw Y   �ŒxY w# 1 sw Y   ŒixY w# 1 sw Y   Œ=xY w)Nc                 óŒ   •— ‰j                   r#t        j                  | «      j                  «       S t        j                  | «      S rF   )rÙ   r°   rÞ   rß   Úadd_n)rá   r[   s    €r-   Ú_add_nz1ClipGradByGlobalNorm._static_clip.<locals>._add_n^  s3   ø€ Ø× Ò Ü—|‘| HÓ-×1Ñ1Ó3Ð3ä—|‘| HÓ-Ð-r.   rµ   r­   TFr   z1FP16 and BF16 are not supported at the same time.rQ   r   r<   rM   rä   rç   r   Úbfloat16Úelementwise_mul©r   ÚYr   rR   Úcastr   )Úin_dtypeÚ	out_dtyper6   )$r   r¶   r   r_   r·   r¸   r   r   r7   r8   r9   r0   r5   rT   r   rG   r¯   rH   rJ   r=   r   rÏ   rI   rÓ   r°   rë   rì   rÄ   rí   rî   rN   r   Úcurrent_blockr)   r   r¹   )r[   r�   r²   rñ   rò   Úsum_square_list_bf16ró   r  rš   r›   rô   rõ   rö   r÷   rø   Úglobal_norm_var_bf16rù   Úglobal_norm_var_other_dtyperû   Ú	scale_varr»   Únew_gÚscale_inputr_   s   `                       r-   r•   z!ClipGradByGlobalNorm._static_clipW  s£  ø€ ØÐØˆØ!ÐØ!ÐØ!Ðô	.ô ×!Ñ! /Õ2Ü$‘��1Ø�9ØÜ˜1˜k¨4Ó0°EÑ9ØØ�
Ø—W‘W—_‘_×5Ñ5°q¸!°fÕ=Ø—v‘v¤§¡×!5Ñ!5×!CÑ!CÒCÜ%8¸Ó%;˜
Ü%BÀ:Ó%N˜
Ü!1°*Ó!=�JØ!×'Ñ'¬4¯<©<×+?Ñ+?×+DÑ+DÒDØ,×3Ñ3°JÕ?Ø#×)Ñ)¬T¯\©\×-AÑ-A×-FÑ-FÒFØ,×3Ñ3°JÕ?Ø#×)Ñ)¬T¯\©\×-AÑ-A×-FÑ-FÒFØ,×3Ñ3°JÕ?à'×.Ñ.¨zÔ:÷ >Ñ=ð %ô( Ð'Ó(¨1Ò,´Ð5IÓ1JÈQÒ1NÜ'ØGóð ô �OÓ$ÜÐ*Ó+ñ,äÐ*Ó+ñ,ð òô
 �OÓ$ÜÐ*Ó+ñ,äÐ*Ó+ñ,ð òð
 $÷M 3Ñ2ðP —‘—‘×1Ñ1°1°a°&Õ9Ü),¨_Ó)=ÀÒ)A™IÀy�	à"$�ÜÐ+Ó,¨qÒ0Ù+1Ð2FÓ+GÐ(á,Ù*Ü@ÔBà'×.Ñ.Ø0×7Ñ7¸	ÓBõð (×.Ñ.Ð/CÔDÜÐ+Ó,¨qÒ0Ù+1Ð2FÓ+GÐ(á,Ù*Ü@ÔBà'×.Ñ.Ø0×7Ñ7¸	ÓBõð (×.Ñ.Ð/CÔDÜÐ+Ó,¨qÒ0Ù+1Ð2FÓ+GÐ(Ø  IÒ-Ø'×.Ñ.Ð/CÕDà'×.Ñ.Ø0×7Ñ7¸	ÓBôô �Ó'¨!Ò+á28¸Ó2IÐ/Ø#×*Ñ*Ð+FÔGô ˜?Ó+¨aÒ/ñ ˜?Ô+à(¨Ñ+ð  ô
 #)§+¡+°Ô"@�Ü"(§+¡+Ø˜#Ø)×/Ñ/Ø#Ÿ~™~ô#�ô
 #ŸM™MØ%Ü—n‘n ¸/ÔJô�	÷i :ðp (*Ð$Ü$‘��1Ø�9ØÜ˜1˜k¨4Ó0°EÑ9Ø$×+Ñ+¨Q°¨FÔ3Øà—W‘W—_‘_×5Ñ5°q¸!°fÕ=Ü7¸Ó:�Eð Ÿ™¤t§|¡|×';Ñ';×'@Ñ'@Ò@Ø%ŸO™O¬t¯|©|×/CÑ/C×/HÑ/HÒHà&/×&6Ñ&6°yÓ&A™àŸ™¤t§|¡|×';Ñ';×'@Ñ'@Ò@Ø%ŸO™O¬t¯|©|×/CÑ/C×/HÑ/HÒHà&/×&6Ñ&6°zÓ&B™à&/˜ô
 1Ó2×@Ñ@ÓB�EØ—O‘OØ.Ø%*°Ñ=Ø!&¨ ð $ô ð
  A‘~ØŸ™Ø!'Ø$'¨ <Ø%*¨A Jà,1¯K©KØ-.¯W©Wñ#ð	 (ô ÷5 >ðH 45·6±6Ð(¨¯©Ñ0Ø ×'Ñ'¨¨A¨Ö/ñY %÷C 3ô^ 	"Ð"2Ð4LÔMØÐ÷S >Ñ=ú÷B :Ñ9ú÷@ >Ð=ú÷Q 3Ð2ús_   ¦AX7Á,D-XÆA?X7È"'X7É	F?XÐA X7Ñ(EX+×7X7ØXØX7ØX(	Ø#X7Ø+X4Ø0X7Ø7Y c                 óš  — | j                   |vrig || j                   <   | j                  || j                   dz   <   t        j                  dg|j                  | j                  ¬«      || j                   dz   <   n*| j                  || j                   dz      k(  st        d«      ‚|}|j                  t        j                  j                  j                  k(  rt        |«      }t        |«      }n0t        «       r&|j                  «       rt        |«      }t        |«      }t        |«      }|| j                      j!                  |«       || _        y )NÚ_clip_valuer<   rä   Ú_clipz>All parameters' 'clip_norm' of a same group should be the same)r×   rÄ   r°   rì   r   Ú
ValueErrorr   r   r7   r8   r9   r0   r5   r   r   rT   r¯   r€   )r[   r€   rŸ   r    rô   Úlocal_norm_vars         r-   r¡   z%ClipGradByGlobalNorm._process_contextö  s  € Ø�?‰? 'Ñ)Ø')ˆG�D—O‘OÑ$Ø7;·~±~ˆG�D—O‘O mÑ3Ñ4Ü17·±Ø�c §¡¸¿¹ô2ˆG�D—O‘O gÑ-Ò.ð —>‘> W¨T¯_©_¸}Ñ-LÑ%MÒMÜ ØTóð ð ˆ
Ø�9‰9œŸ™×,Ñ,×:Ñ:Ò:Ü,¨TÓ2ˆJÜ6°zÓB‰JÜŒ]˜t×8Ñ8Ô:Ü,¨TÓ2ˆJÜ6°zÓBˆJä)¨*Ó5ˆØ�—‘Ñ ×'Ñ'¨Ô7àˆ�r.   c                 óF  — d„ }| j                   dz   }|| j                  vr� || j                  | j                      «      }t        j                  |¬«      }| j                  | j                   dz      }t        j                  |t        j
                  ||¬«      ¬«      }|j                  dk(  sJ ‚|| j                  |<   t        «       r't        j                  || j                  |   «      }||fS |j                  j                  d|| j                  |   dœd	|i¬
«       ||fS )Nc                 óH   — t        j                  | «      j                  «       S rF   rÝ   rà   s    r-   râ   z;ClipGradByGlobalNorm._create_operators.<locals>.async_add_n  rã   r.   Ú_scalerM   r  rç   )r<   r  r  r   rR   )r×   r€   r°   rë   rí   rî   rå   r   rï   r_   r)   )r[   rŸ   r    râ   Úgroup_scale_nameÚgroup_norm_varrü   Úgroup_scale_vars           r-   r£   z&ClipGradByGlobalNorm._create_operators  s  € ò	0ð  Ÿ?™?¨XÑ5ÐØ 4§<¡<Ñ/Ù(¨¯©°d·o±oÑ)FÓGˆNÜ#Ÿ[™[¨>Ô:ˆNØ—|‘| D§O¡O°gÑ$=Ñ>ˆHÜ$Ÿm™mØÜ—.‘. 8¨~Ô>ôˆOð #×(Ñ(¨DÒ0Ð0Ð0Ø-<ˆD�L‰LÐ)Ñ*äŒ=Ü—?‘? 4¨¯©Ð6FÑ)GÓHˆDØ˜$�;Ðð 	�‰×ÑØ"Ø D§L¡LÐ1AÑ$BÑCØ˜D�Mð 	ô 	
ð �dˆ{Ðr.   )Údefault_groupF)rb   rc   rd   rx   rk   r\   r¤   r¥   r�   r’   r•   r¡   r£   r¦   r§   s   @r-   rÕ   rÕ   U  sU   ø„ ñ2ðj EJõ!òPð €_×ÑÓñ] ó ð] ò~Y òv] ò~ö4r.   rÕ   c                 ó�  — t        j                  d«       t        | t        «      st	        d«      ‚|€t        j                  «       }|j                  d«      j                  D ]?  }d|j                  «       v sŒd|j                  d«      v sŒ*t        j                  d«        n |€|j                  d«      j                  «       }t        d„ |D «       «      r-|D �cg c]"  }|j                  d«      j                  |«      ‘Œ$ }}t        d	„ |D «       «      st	        d
«      ‚|D ]  }t        j                  | «      |_        Œ yc c}w )až  
    Warning:

        This API must be used after building network, and before ``minimize`` ,
        and it may be removed in future releases, so it is not recommended.
        It is recommended to set ``grad_clip`` when initializing the ``optimizer`` ,
        this is a better method to clip gradient. There are three clipping strategies:
         :ref:`api_paddle_nn_ClipGradByGlobalNorm` , :ref:`api_paddle_nn_ClipGradByNorm` ,
         :ref:`api_paddle_nn_ClipGradByValue` .

    To specify parameters that require gradient clip.

    Args:
        grad_clip (GradientClipBase, optional): Gradient cliping strategy, it's an instance of
            some derived class of ``GradientClipBase`` . There are three cliping strategies
            ( :ref:`api_paddle_nn_ClipGradByGlobalNorm` , :ref:`api_paddle_nn_ClipGradByNorm` ,
            :ref:`api_paddle_nn_ClipGradByValue` ). Default value: None, and there is no
            gradient clipping.
        param_list (list(Variable), optional): Parameters that require gradient clip.
                It can be a list of parameter or a list of parameter's name.
                Default None, meaning that all parameters in the program will be included.
        program (Program, optional): The program where parameters are located.
                Default None, meaning that using :ref:`api_paddle_static_default_main_program` .

    Returns:
        None

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> paddle.enable_static()

            >>> def network():
            ...     image = paddle.static.data(name='image', shape=[
            ...                        None, 28], dtype='float32')
            ...     param_attr1 = paddle.ParamAttr("fc1_param")
            ...     fc1 = paddle.static.nn.fc(image, size=10, weight_attr=param_attr1)
            ...     param_attr2 = paddle.ParamAttr("fc2_param")
            ...     fc2 = paddle.static.nn.fc(fc1, size=10, weight_attr=param_attr2)
            ...     loss = paddle.mean(fc2)
            ...     return loss


            >>> # network 1: clip all parameter gradient
            >>> with paddle.static.program_guard(paddle.static.Program(), paddle.static.Program()):
            ...     loss = network()
            ...     paddle.nn.clip.set_gradient_clip(
            ...         paddle.nn.ClipGradByGlobalNorm(clip_norm=2.0))
            ...     sgd = paddle.optimizer.SGD(learning_rate=1e-3)
            ...     sgd.minimize(loss)

            >>> # network 2: clip parameter gradient by name
            >>> with paddle.static.program_guard(base.Program(), paddle.static.Program()):
            ...     loss = network()
            ...     paddle.nn.clip.set_gradient_clip(
            ...         paddle.nn.ClipGradByValue(min=-1.0, max=1.0),
            ...         param_list=["fc1_param", "fc2_param"])
            ...     sgd = paddle.optimizer.SGD(learning_rate=1e-3)
            ...     sgd.minimize(loss)

            >>> # network 3: clip parameter gradient by value
            >>> with paddle.static.program_guard(base.Program(), paddle.static.Program()):
            ...     loss = network()
            ...     param_var1 = paddle.static.default_main_program().global_block().var("fc1_param")
            ...     param_var2 = paddle.static.default_main_program().global_block().var("fc2_param")
            ...     paddle.nn.clip.set_gradient_clip(
            ...         paddle.nn.ClipGradByValue(min=-1.0, max=1.0),
            ...         param_list=[param_var1, param_var2])
            ...     sgd = paddle.optimizer.SGD(learning_rate=1e-3)
            ...     sgd.minimize(loss)

            >>> # network 4: use 'set_gradient_clip' and 'optimize(grad_clip=clip)' together
            >>> with paddle.static.program_guard(base.Program(), paddle.static.Program()):
            ...     loss = network()
            ...     clip1 = paddle.nn.ClipGradByValue(min=-1.0, max=1.0)
            ...     clip2 = paddle.nn.ClipGradByNorm(clip_norm=1.0)
            ...     # Set the gradient clipping strategy: clip1
            ...     paddle.nn.clip.set_gradient_clip(clip1)
            ...     # Set the gradient clipping strategy: clip2
            ...     sgd = paddle.optimizer.SGD(learning_rate=1e-3, grad_clip=clip2)
            ...     sgd.minimize(loss)
            ...     # 'set_gradient_clip' will not take effect when setting has a conflict,
            ...     # and the gradient clipping strategy will be 'clip2'


    zñCaution! 'set_gradient_clip' is not recommended and may be deprecated in future! We recommend a new strategy: set 'grad_clip' when initializing the 'optimizer'. This method can reduce the mistakes, please refer to documention of 'optimizer'.z<'clip' should be an instance of ClipGradBase's derived classNr   Úop_namescopeÚ	optimizerz‹'minimize' has been invoked before, this will make 'set_gradient_clip' be ineffective! Please invoke 'set_gradient_clip' before 'minimize'.c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wrF   )r>   Ústr©Ú.0Úelems     r-   Ú	<genexpr>z$set_gradient_clip.<locals>.<genexpr>¤  s   è ø€ Ð
8©Z TŒ:�dœC× ©Zùs   ‚c              3   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrF   )r>   r   Ú	Parameterr%  s     r-   r(  z$set_gradient_clip.<locals>.<genexpr>¦  s   è ø€ ÐLÁ¸Œz˜$¤	× 3Ñ 3×4Áùs   ‚$&zK'param_list' should be a list of Parameter or basestring(parameter's name).)r˜   r™   r>   rˆ   r:   r   r   r_   ÚopsÚ	all_attrsÚattrÚall_parametersÚallÚvarÚcopyÚdeepcopyr—   )rq   Ú
param_listr·   r{   r'  rŸ   s         r-   Úset_gradient_clipr4  .  s3  € ôt ‡M�Mð	/ôô �dœLÔ)ÜØJó
ð 	
ð €Ü×0Ñ0Ó2ˆà�m‰m˜AÓ×"Ô"ˆØ˜RŸ\™\›^Ò+°¸r¿w¹wØó@
ò 1
ô �M‰MðWôñ ð #ð ÐØ—]‘] 1Ó%×4Ñ4Ó6ˆ
Ü
Ñ
8©ZÓ
8Ô8Ù=GÓH¹Z°T�g—m‘m AÓ&×*Ñ*¨4Õ0¸Zˆ
ÐHÜÑLÁÓLÔLÜØYó
ð 	
ó ˆÜ#'§=¡=°Ó#6ˆÕ ñ ùò Is   Ã'Ec                 ó$  — i }| D ]ª  \  }}|€Œ	|j                   j                  j                  ||g«      5  t        j                  d«      5  t        |dd «      }|€| cd d d «       cd d d «       c S t        |t        «      st        d«      ‚|j                  |||¬«       d d d «       d d d «       Œ¬ g }i }| D ]˜  \  }}|€Œ	|j                   j                  j                  ||g«      5  t        j                  d«      5  j                  ||¬«      \  }}|j                  ||j                  <   |j                  ||g«       d d d «       d d d «       Œš t        ||«       |S # 1 sw Y   ŒÂxY w# 1 sw Y   �ŒrxY w# 1 sw Y   Œ:xY w# 1 sw Y   Œ×xY w)Nrµ   r—   z8clip attribute should be an instance of GradientClipBase)r€   rŸ   r    )rŸ   r    )r_   r·   r¸   r   r¶   r   r>   rˆ   r:   r¡   r£   r   r¯   r¹   )	Úparam_gradsr€   rš   r›   Ú	clip_attrÚresr»   rŸ   r³   s	            r-   Úappend_gradient_clip_opsr9  ¯  s|  € Ø€GÛ‰ˆˆ1Øˆ9ØØ�W‰W�_‰_×-Ñ-¨q°!¨fÕ5´y×7KÑ7KØõ8
ô   Ð#7¸Ó>ˆIØÐ Ø"÷8
ð 8
×5Ó5ô ˜i¬Ô6ÜØNóð ð ×&Ñ&¨w¸aÀaÐ&ÔH÷8
×5Ð5ð ð  €CØ!ÐÛ‰ˆˆ1Øˆ9ØØ�W‰W�_‰_×-Ñ-¨q°!¨fÕ5´y×7KÑ7KØõ8
ð (×9Ñ9ÀÈÐ9ÓJ‰OˆE�8Ø3;·=±=Ð$ U§Z¡ZÑ0Ø�J‰J˜˜xÐ(Ô)÷8
×5Ð5ð ô ˜cÐ#;Ô<Ø€J÷58
ð 8
ú×5Ñ5ú÷$8
ð 8
ú×5Ð5úsT   µE-ÁE!Á	E-Á1/E!Â E-Ã(FÃ>AE:ÅFÅ!E*Å&E-Å-E7	Å:FÅ?FÆF	c                 óÒ  — g }t        |«      dk(  ry | D ]Ñ  \  }}|€Œ	|j                  j                  }||v rŒ$|j                  |«       |j                  j                  j                  «       j                  D ]l  }|j                  d«      sŒd|j                  d«      v sŒ)|j                  d«      sŒ;|j                  d«      d   }||v sŒT|||   g}|j                  d|«       Œn ŒÓ y )Nr   r!  rµ   Úop_role_var)
r=   r_   Úidxr¯   r·   Úglobal_blockr+  Úhas_attrr-  rv   )	r�   r»   Úblock_id_listrŸ   r    Úblock_idr{   Ú
param_nameÚcorrect_p_gs	            r-   r¹   r¹   Ô  sÞ   € Ø€MÜ
Ð#Ó$¨Ò)ØÛ#‰ˆˆtØˆ<ØØ—;‘;—?‘?ˆØ�}Ñ$ØØ×Ñ˜XÔ&Ø—+‘+×%Ñ%×2Ñ2Ó4×8Ô8ˆBà—‘˜NÕ+Ø# r§w¡w¨~Ó'>Ò>Ø—G‘G˜MÕ*àŸW™W ]Ó3°AÑ6�
ØÐ!9Ò9à"Ø0°Ñ<ð#�Kð —L‘L °Õ<ñ 9ñ $r.   rF   )NN)7r1  r˜   Úsqlite3r   r°   Úpaddle.autogradÚautogradr¤   r   Úpaddle.baser   r   r   Úpaddle.base.data_feederr   Úpaddle.base.libpaddler	   Úpaddle.common_ops_importr
   r   r   Úpaddle.frameworkr   r   r   r   Ú&paddle.tensor.layer_function_generatorr   Ú__all__r   r0   r5   r@   rD   rN   rT   rV   rg   r†   rˆ   r©   rÂ   rÎ   rÏ   rÒ   rÓ   rÕ   Údygraph_not_supportr4  r9  r¹   ÚGradientClipBaseÚGradientClipByValueÚGradientClipByNormÚGradientClipByGlobalNormre   r.   r-   Ú<module>rR     sL  ðó Û Ý %ã Ý )Ý ß 4Ñ 4Ý <Ý *ß OÑ O÷ó õ ?à
€ñ ƒò9ó ð9ñx ƒò#ó ð#ñL ƒò<ó ð<ð~ +0Ð 'ò	7òò÷.$ñ $ô90Ð(ô 90òx6÷"%$ñ %$ôPW�lô Wôtb�\ô bðJ */Ð &òð */Ð &òôV˜<ô Vðr ×Ñò}7ó ð}7ò@òJ=ð4  Ð Ø%Ð Ø#Ð Ø/Ñ r.   