
    ёi4                        S SK Jr  S SKrS SKJrJrJr  S SKJr  SSKJ	r	  SSK	J
r
Jr  SSKJr  SS	KJr  SS
KJr  SSKJr  / r " S S\5      rg)    )annotationsN)_C_opsin_dynamic_modepir)unique_name   )base)core	framework)VarDesc)check_variable_and_dtype)_current_expected_place   )Initializerc                  N   ^  \ rS rSrSrSSU 4S jjjr S     S	S jjrSrU =r$ )
Dirac   ak  Initialize the 3D/4D/5D Tensor with Dirac delta function.

It can reserve the feature of convolution layer input, which means that
as many channels are reserved as possible.

In this initialize method, elements in the middle of convolution kernels will
be set to 1 . The formula can be described as follow.

.. math::

    X[d, d, shape[2]//2, shape[3]//2, ...]=1,  \   d=0,1...N

where, ``N`` is the minimum value of ``in_channels`` and ``out_channels``

Args:
    groups(int|None, optional): 0-dimension of the Tensor will be divided by groups,
        each group has the same value. Default: 1.
    name(str|None, 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:
    Dirac initializer instance objects.

Examples:
    .. code-block:: pycon

        >>> import paddle

        >>> # 1. For kernel_size is uneven number:
        >>> attr = paddle.ParamAttr(initializer=paddle.nn.initializer.Dirac())
        >>> conv = paddle.nn.Conv1D(3, 2, 3, weight_attr=attr)
        >>> print(conv.weight)
        Parameter containing:
        Tensor(shape=[2, 3, 3], dtype=float32, place=CPUPlace, stop_gradient=False,
        [[[0., 1., 0.],
          [0., 0., 0.],
          [0., 0., 0.]],
         [[0., 0., 0.],
          [0., 1., 0.],
          [0., 0., 0.]]])
        >>> input = paddle.rand([8, 3, 10])
        >>> output = conv(input)
        >>> output == input[:, 0:2, 1:9]
        >>> print(output.shape)
        paddle.Size([8, 2, 8])
        >>> # It means output is almost the same with input, 2 channels are reserved

        >>> # 2. For kernel_size is even number:
        >>> attr = paddle.ParamAttr(initializer=paddle.nn.initializer.Dirac())
        >>> conv = paddle.nn.Conv1D(3, 2, 4, weight_attr=attr)
        >>> print(conv.weight)
        Parameter containing:
        Tensor(shape=[2, 3, 4], dtype=float32, place=CPUPlace, stop_gradient=False,
        [[[0., 0., 1., 0.],
          [0., 0., 0., 0.],
          [0., 0., 0., 0.]],
         [[0., 0., 0., 0.],
          [0., 0., 1., 0.],
          [0., 0., 0., 0.]]])
c                r   > US:  a  [        U[        5      (       d   S5       e[        TU ]  5         Xl        g )Nr   z& 'groups' must be a positive integer. )
isinstanceintsuper__init___groups)selfgroupsname	__class__s      [/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/nn/initializer/dirac.pyr   Dirac.__init__]   s8    zj55 	
4	
5 	    c           
        [        U[        R                  5      (       a  UR                  5       (       a   S5       eU R	                  U5      n[        U[        R
                  [        R                  R                  [        R                  R                  45      (       d   e[        U[        R                  [        R                  45      (       d   e[        US/ SQS5        [        UR                  5      S;   d   S5       eUR                  S   U R                  -  S:X  d   S5       e[        R                   " 5       (       aT  UR"                  [        R$                  R&                  :w  a  [        R$                  R&                  nUnOUR"                  nUnOUR"                  [(        R*                  R,                  :w  a  [(        R*                  R,                  nUR/                  [0        R2                  " S	R5                  S
UR6                  S/5      5      UR                  U[(        R*                  R8                  SS9nOUR"                  nUnSn[        R:                  " 5       (       af  [<        R>                  RA                  5          [C        5       n[D        RF                  " XDR                  [I        [K        S5      5      X65        SSS5        O[        R                   " 5       (       a6  [C        5       n[D        RL                  " UR                  [K        S5      X65      nO6URO                  S0 SU0[K        S5      UR"                  UR                  S.SS9  UR                  nUS   U R                  -  n[Q        XS   5      n	/ n
/ n/ nSn[S        U5       H  nURU                  SU5        X-  nM     [W        U R                  5       H  n[W        U	5       Ho  nURY                  S5        Sn[[        U5       H9  u  nnUS:X  a  UUX-  -   U-  -  nM  US:X  a
  UUU-  -  nM+  UUU   S-  U-  -  nM;     U
RY                  U5        Mq     M     [        R:                  " 5       (       aQ  [<        R>                  RA                  5          [D        R\                  " US/5      nUR_                  U5        SSS5        O[        R                   " 5       (       a  [D        R\                  " US/5      nOUR/                  [0        R2                  " S	R5                  UR6                  S/5      5      UUR                  [(        R*                  R8                  SSS9nURO                  SSU0SS/0UUS.SS9  [        R                   " 5       (       a?  [        R`                  " [        U
5      /[        R$                  Rb                  S9nSUl2        O%UR/                  [0        R2                  " S5      SSS 9n[        R:                  " 5       (       a  [<        R>                  RA                  5          [        Rf                  " 5       n[D        Rh                  " U[        U
5      /[(        R*                  Rb                  U
[C        5       5        UR_                  U5        SSS5        O[        R                   " 5       (       aE  [D        Rh                  " U[        U
5      /[        R$                  Rb                  U
[C        5       5        O:URO                  S!SU0[(        R*                  Rb                  [        U
5      /U
S".SS#9  [        R                   " 5       (       a?  [        R`                  " [        U5      /[        R$                  R&                  S9nSUl2        O%UR/                  [0        R2                  " S$5      SSS 9n[        R:                  " 5       (       a  [<        R>                  RA                  5          [        Rf                  " 5       n[D        Rh                  " U[        U5      /[(        R*                  R,                  U[C        5       5        UR_                  U5        SSS5        O[        R                   " 5       (       aE  [D        Rh                  " U[        U5      /[        R$                  R&                  U[C        5       5        O:URO                  S!SU0[(        R*                  R,                  [        U5      /US".SS#9  [        R:                  " 5       (       a  [<        R>                  RA                  5          [D        Rj                  " UUUS5      nUR_                  U5        [D        R\                  " XG5      nUR_                  U5        UR"                  [(        R*                  R,                  :w  a1  [D        Rl                  " XAR"                  5      nUR_                  U5        SSS5        GO[        R                   " 5       (       ay  [D        Rj                  " UUUS5      n[D        R\                  " XG5      nUR"                  [        R$                  R&                  :w  a   [D        Rl                  " XAR"                  5      $ U$ URO                  S%UUUS&.S'S0SU0SS9nUR/                  [0        R2                  " S	R5                  UR6                  S/5      5      UUR                  [(        R*                  R8                  SSS9nURO                  SSU0SU0UUS.SS9  UR"                  [(        R*                  R,                  :w  a.  URO                  S(SU0SU0UR"                  UR"                  S).SS9  [o        5       (       d  XQl8        U$ ! , (       d  f       GN0= f! , (       d  f       GN.= f! , (       d  f       GN}= f! , (       d  f       GN= f! , (       d  f       Nm= f)*a_  Initialize the input tensor with dirac initializer.

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 most critical OP(scatter) in this initializer, which contains 7~8 ops in total.
zBCurrently, dirac initializer not support lazy init for dist param.Out)float16bfloat16float32float64r   )r         z=Only Tensor with 3/4/5 dimensions can be initialized by Diracr   z.Tensor 0-dimension must be divisible by groups.diractmpF)r   shapedtypetypepersistableNfill_constant)valuer-   r,   T)r.   inputsoutputsattrsstop_gradientr   g      ?   XShape)r   r-   r,   r.   r/   r5   reshape2Xr,   )r"   r8   )r.   r2   r4   r3   r5   )r-   scatter_index)r   r/   r5   assign_value)r-   r,   values)r.   r3   r4   r5   scatter_valuescatter)r:   IdsUpdates	overwritecast)in_dtype	out_dtype)9r   r   EagerParamBaseis_dist_check_blockVariablepaddler   Valuer
   ParameterMetaBlockr   lenr,   r   in_pir_moder-   DataTypeFLOAT32r   VarTypeFP32
create_varr   generatejoinr   DENSE_TENSORin_dygraph_moder	   dygraphno_gradr   r   full_strfloatfull	append_opminreversedinsertrangeappend	enumeratereshape_share_underline_tensor_tozerosINT64r5   _create_tensorassign_value_r?   rC   r   op)r   varblockrE   out_varrl   placeorigin_shapenum_per_group	min_shapeidx_list
value_liststridesproddimijoffsetkstridetmp_outx_shapeindex_tensor
tmp_tensorvalue_tensortmp_reshape_outtmp_cast_outs                              r   __call__Dirac.__call__d   s	    sI4455#++--	PO	P 
 !!%()$$fjj&6&68N8NO
 
 	
 
 %)//399!=>>>> Ew	
 399~ "
 
 	K K		K 

 		!t||+1 	
<	
1   ""yyDMM111 MM11	II	yyGOO000#OO00	**$--'388U!;< ))# 55 % +   II	$$&&%%'/1]]CaM9 ('
 ""$$+-Ekk'--q9LGOO$("1X$]]$]]
 #  
 yy$Q4<<7A7	
L)CNN1d#KD * t||$A9%!!#&!*7!3IAvAv1q'8#8F"BBa!f*,,q/Q"6"?? "4 ' & % $$&&%%' ..2$7227; (' ""$$nnWrd3G&& ))#((GLL(3K*LMmm__11!" ' G OOW~o '7;"     ""!<<Xt}}':':L *.L& ++ ))/:!" , L $$&&%%'&557
$$]OOO))+- 55lC (' ""$$  X##') OO#-$__22!(m_&
 #  	   ""!<<Z!)>)>L *.L& ++ ))/:!" , L $$&&%%'&557
$$_%OO((+- 55lC (' ""$$  Z!%%') OO#-$__11!*o.(
 #  	 $$&&%%' ..\< 227;"(.."G::7C99 4 44#);;w		#BL ;;C@ (' ""$$nnWlL$OGnnW;GyyDMM111{{7II66N '+
 #D)(" ! 
B && ))#((GLL(3K*LMmm__11!" ' G OOW~- '7;"   yyGOO000>"CL'.}}399M"&      F	_ ('Z ('F ('T ('@ ('s?   ?m6*nA+n"A+n,'B+n>6
n
n
n),
n;>
o)r   )r   N)r   r   r   z
str | NonereturnNone)N)rm   paddle.Tensorrn   zpir.Block | Noner   r   )	__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes____classcell__)r   s   @r   r   r      s@    ;z  =AJ J)9J	J Jr    r   )
__future__r   rJ   r   r   r   paddle.utilsr    r	   r
   r   	base.corer   base.data_feederr   base.frameworkr   initializerr   __all__r    r    r   <module>r      s;    #  / / $  #   8 5 $
OK Or    