
    x-jeV                     2   d dl Z d dlZd dlmZ ddlT ddlmZmZ d Z ed          d             Z	 ed	          d
             Z
 ed          d             Z ed          d             Z ed          d             Z ed          d             Z ed          d             Z ed          d             Z ed          d             Z ed          d             Z ed          d             Zd:dZ ed          d             Z ed           d!             Z ed"          d#             Z ed$          d%             Z ed&          d'             Z ed(          d;d)            Z ed*          d+             Z ed,          d-             Z ed.          d/             Z ed0          d1             Z ed2          d3             Z ed4          d5             Z  ed6          d7             Z! ed8          d9             Z"dS )<    N)core   )*)REGISTER_COMPOSITElookup_compositec                 <    t          | j                  } || g|R  S N)r   type)opargs
_lowerrules      h/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/incubate/autograd/composite_rules.py
_compositer      s)    !"'**J:b 4        softmaxc                 z   d}ddl m}  || j                  }|dv rd}t          | d          } | j        s&t          | | z
            }|rt          |d          }|S t          | |d          }d|_        t          | |z
            }t          ||d	          }t          ||          }|rt          ||          }|S )
z#define composite rule of op softmaxFr   convert_dtypefloat16uint16Tfloat32r   )keepdimaxisr   )
paddle.base.data_feederr   dtypecastshapeexpmaxstop_gradientsumdivide)	xr   is_ampr   r   resmax_temp	moleculardenominators	            r   softmax_compositer+   "   s     F555555 M!'""E%%%I7 !a%jj 	'sI&&C
1dD)))H!HAL!!IidD999K
K
(
(C 3Jr   
batch_normc                 x   d}ddl m}  || j                  }|dv r:d}t          | d          } |rt          |d          n|}|rt          |d          n|}|dv rdnt	          | j                  dz
  |r|
 p|	}t          fd	t          t	          | j                            D                       t          fd
t          | j                  D                       }t          dgd| j                  }|st          |           }t          | | z            }|||z  z
  }t          ||z   |          }|dk    r	| |z
  |z  }n$| t          ||          z
  t          ||          z  }||z  d|z
  |z  z   }||z  d|z
  |z  z   }nt          |j        |j                  }t          |j        |j                  }t          ||z   |          }|dk    r| |z
  t          ||z   |          z  }n5| t          ||          z
  t          t          ||          |z   |          z  }|dk    r	||z  |z   }n$t          ||          |z  t          ||          z   }|rt          ||          }t          |          }t          |          }t          |          }t          |          }d}|s||||||fS |||dd|fS )z
    define composite rule of op batch_norm
    As the same with op kernel, the position of saved variance indeed return inverse std.
    Fr   r   r   Tr   )NCNCLNCHWNCHWDr   c              3   (   K   | ]}|k    |V  d S r	    ).0ifeature_axiss     r   	<genexpr>z&composite_batchnorm.<locals>.<genexpr>_   s-      LLa!|:K:K:K:K:K:KLLr   c              3   .   K   | ]\  }}|v rd n|V  dS )r   Nr3   )r4   r5   sreduce_axess      r   r7   z&composite_batchnorm.<locals>.<genexpr>`   sF        )-AQ+1     r   g      NHWCN)r   r   r   r   lenr   tuplerange	enumeratefullmeanpowreshapezerosassign)r%   run_meanrun_varscalebiasis_testmomentumepsilondata_layoutuse_global_statstrainable_statisticsr&   r   r   use_run_statstats_shapehalf
batch_meantemp	batch_varinv_stdx_hatybatch_mean_inv_std_	run_mean_run_var_reserve_spacer6   r:   s                               @@r   composite_batchnormr^   =   sd   & F555555M!'""E%%%I*/:UI&&&U(,6tD)$$$$ :::AGq@P  :%9!9O?OLLLLL5QW#6#6LLLLLK    1:171C1C    K T17##D ![))
AE;'':
22	y7*T22&  ^w.EE[999W> > E h&!h,*)DDW$H	'AA8>8>::
'-77	y7*T22&  \S'G*;d%C%CCEE;7773+..84< < E fEMD E;''%/'$2L2LL ENN $$KgHx  IgH M A)X{HmKK)XtT=@@r   
layer_normc                 ,   d}ddl m}  || j                  }|dv r:d}t          | d          } |rt          |d          n|}|rt          |d          n|}t	          t          |t          | j                                      }t          | |d          }	| |	z
  }
|
|
z  }t          ||d          }||z   }t          |          }|
|z  }|:| j        |d         |j        k    rt          || j        |d                   }||z  }|:| j        |d         |j        k    rt          || j        |d                   }||z   }t          |	| j        d|                   }	t          || j        d|                   }|rt          ||          }||	|fS )	z}
    define composite rule of op layer_norm
    out = (x - mean(x)) / sqrt(var + epsilon))
    var = mean((x-mean(x))^2)
    Fr   r   r   Tr   r   N)r   r   r   r   r=   r>   r<   r   rA   rsqrtrC   )r%   rH   rI   rL   begin_norm_axisr&   r   r   r   mean_
differencevar_tmp1variancevar_tmp3	rsqrt_varouts                   r   layernorm_compositerj      s    F555555M!'""E%%%I*/:UI&&&U(,6tD)$$$$AG5566Dt,,,EUJJ&HH4666H'!HhI
y
 C7?##$33E17?+;+;#<==EEk7?##$
224)9)9!:;;DDj E17#3O#3455Ex)9/)9!:;;H 3xr   instance_normc                    d}ddl m}  || j                  }|dv r:d}t          | d          } |rt          |d          n|}|rt          |d          n|}| j        \  }}}	}
t          t          dt          | j                                      }t          | |d          }| |z
  }||z  }t          ||d          }||z   }t          |t          d	gd
|j                            }||z  }|t          |d	|d	d	g          }||z  }|t          |d	|d	d	g          }||z   }t          |dg          }d	|z  }t          |dg          }|rt          ||          }|||fS )z
    define composite rule of op instance_norm
    out = (x - mean(x)) / sqrt(var + epsilon))
    var = mean((x-mean(x))^2)
    Fr   r   r   Tr      r   r         ?r   N)r   r   r   r   r   r=   r>   r<   rA   rB   r@   rC   )r%   rH   rI   rL   r&   r   r   nchwr   rc   rd   re   rf   rg   sqrt_varri   
scale_tile	bias_tilesaved_variances                         r   instancenorm_compositery      s    F555555M!'""E%%%I*/:UI&&&U(,6tD)$$$$JAq!Qq#ag,,''((Dt,,,EUJJ&HH4666H'!H8T1#s(.AAABBH
x
CUQ1aL11
JD1aA,//	IoEB4  E\N^bT22N 3~%%r   geluc           
         d}d}t          | j                  dk    r| j        ndg}t          || j                  }t	          |d| j                  }|rZt	          |||z  | j                  }t	          |d| j                  }t          || || z  | z  | z  z   z            }	| |z  ||	z   z  }
|
S ||t          | t	          | j        || j                  z            z   z  }| |z  }
|
S )z define composite rule of op gelug;f?gmBP?r   r   rn   gHm?)r<   r   onesr   r@   tanherf)r%   approximate	M_SQRT1_2
M_2_SQRTPI
full_shapeonerR   kAlphaGELU_CONSTANTtanh_outri   cdfs               r   gelu_compositer      s    	  (JLLA--A3J
z17
#
#C
C))D j*y"8!'BBZ17;;!ma&7!&;a&?"?@AA$h#.)
 cCD)QW$E$E EFFFG#g
r   reduce_meanc                     d}ddl m}  | j                  }|dv rd}t           d           |dg fv r/t	          t          dt           j                                      }t          |t                    r|fn|}t           ||          } fd	|D             }|g k    rd
}	nt          j        t          j        |          }	t          g |	|j                  }
t!          ||
          }|rt          ||          }|S )z define composite rule of op meanFr   r   r   Tr   Nr   c                 *    g | ]}j         |         S r3   r   )r4   r   r%   s     r   
<listcomp>z"mean_composite.<locals>.<listcomp>  s    444tQWT]444r   r   )r   valuer   )r   r   r   r   r=   r>   r<   r   
isinstanceintr#   	functoolsreduceoperatormulfill_constantr$   )r%   r   r   r&   r   r   axessum_xele_nums_listvalue_to_fillnormr'   s   `           r   mean_compositer     s4    F555555M!'""E%%%IbzU1c!'ll++,, s++5D77Dg...E4444t444M!(}EEk  D
 

C 3Jr   	expand_v2c                 X   | j         }t          |          }t          |          }||k    r|dk    sJ g }t          |          D ]m}||z
  }||z
  }|dk    r||         nd}	||         }
|
dk    s|	dk    r|dk    sJ d}n|
|	z  dk    sJ t          |
|	z            }|                    |           n||k     rbg }t          ||z
            D ]}|                    d           |                    |           t          | |          }t          ||          S t          | |          S )z
    define composite rule of op expand_v2, expand_v2->expand
    repeat_times = shape / x.shape
    out = tile(x, repeat_times = repeat_times)
    r   r   rp   repeat_timesr   r<   r>   r   appendextendrC   tile)r%   r   shape_indim_outdim_inr   r5   offsetdimsize_insize_outrepeatshape_in_expand	x_reshapes                 r   expand_v2_compositer   "  ss    wH%jjG]]FWA-L7^^ $ $1vo#&!88(3--8r>>W\\!8888FFg%****G+,,FF####w'(( 	& 	&A""1%%%%x(((A//	IL9999----r   expand_as_v2c                 f   | j         }||j         }|J t          |          }t          |          }||k    r|dk    sJ g }t          |          D ]g}||z
  }||z
  }	|	dk    r||	         nd}
||         }|dk    r|	dk    sJ d}n||
z  dk    sJ t          ||
z            }|                    |           h||k     rbg }t          ||z
            D ]}|                    d           |                    |           t          | |          }t          ||          S t          | |          S )z
    define composite rule of op expand_as_v2, expand_as_v2->expand_as
    repeat_times = target_shape / x.shape
    out = tile(x, repeat_times = repeat_times)
    Nr   r   rp   r   r   )r%   rX   target_shaper   r   r   r   r5   r   r   r   r   r   r   r   s                  r   expand_as_v2_compositer   D  s    wH}w###,G]]FWA-L7^^ $ $1vo#&!88(3--?r>>!8888FFg%****G+,,FF####w'(( 	& 	&A""1%%%%x(((A//	IL9999----r   stackc                     | d         j         }|dk     r|t          |          dz   z  }g |d|         d||d         R t          fd| D             |          }|S )zt
    define composite rule of op stack
    unsqueeze each dimension of the input (use reshape), and then concat
    r   r   Nc                 0    g | ]}t          |          S r3   )rC   )r4   item	out_shapes     r   r   z#stack_composite.<locals>.<listcomp>s  s#    999t'$	**999r   )r   r<   concat)r%   r   x_shaperi   r   s       @r   stack_compositer   i  s~     djGaxxGq  5'%4%.5!5gdeen55I
9999q9994
@
@CJr   flatten_contiguous_rangec                 l   | j         }t          |          dk    r|nd}t          |          dk    r|nd}||k    sJ t          |          dk    rt          | dg          dfS ||k    rt          | |          dfS d}t          ||dz             D ]}|||         z  }g }t          |          D ]}|                    ||                    |                    |           t          |dz   t          |                    D ]}|                    ||                    t          | |          dfS )a  
    define composite rule of op flatten, flatten_contiguous_range -> flatten.

    xshape is the dim with 0 added to the front of x, keep the shape information of x to calculate the grad.
    CINN doesn't need xshape for backward pass, return none instead of xshape.
    shape_out is the parameter of reshape, get from start_axis and stop_axis.
    out = reshape(x, shape=shape_out), xshape
    r   r   r   N)r   r<   rC   r>   r   )	r%   
start_axis	stop_axisr   	start_dimend_dimslice_numelr5   	shape_outs	            r   "flatten_contiguous_range_compositer   w  so    wH!(mmq00

aIx==A--ii1G
8}}q$$$d**Gq)))4//K9gk** # #x{"I9 & &!%%%%[!!!7Q;H.. & &!%%%%1I&&&,,r   dropoutc                 B   |dn|}|r|nd}|dk    }t          | j        | j        ||          }|r|sc|dk    r.d| z  t          | j        t          j        j        j                  fS | |z  d|z
  z  t          |t          j        j        j                  fS t          |           t          |t          j        j        j                  fS |s)| |z  t          |t          j        j        j                  fS | d|z
  z  t          |t          j        j        j                  fS )zdefine composite rule of op dropout.
    upscale_in_train:
        train: out = input * mask / ( 1.0 - p )
        inference: out = input
    downscale_in_infer
        train: out = input * mask
        inference: out = input * (1.0 - p)
    NTr   upscale_in_train)r   r   pseed      ?        )
	bernoullir   r   rD   r   VarDescVarTypeUINT8r   rE   )	r%   seed_tensorr   rJ   moder   fix_seedr   masks	            r   dropout_compositer     s+     'ttXH"44D1117!'QTBBBD I 		ECxxQwagt|/C/I J JJJ4x37+T$,.4. .   !99d4)=)CDDDD 	It8T$(<(BCCCCa=$tT\-A-G"H"HHHr   c                     ddl m}  ||          dv rdn|}t          t          t	          | |dd|          t          t          |           dk    r| ndg||                    |          S )	Nr   r   r   r   r   r   )minr!   r   r   )r   r   r   greater_equaluniformr   r<   )r   r   r   r   r   	new_dtypes         r   r   r     s    555555 #]5))-BBB		  E9#3TBBB3u::??%%YJJ	
 	
 	  r   
hard_swishc           
      L   d}d}d}t          | j                  dk    r| j        ndg}t          t          | t	          ||| j                  z   t	          |d| j                            t	          ||| j                            | z  t	          ||| j                  z  }|S )zdefine composite rule of op hard_swish.
    offset=3, threshold=6, scale=6
    out = minimum(
        maximum(x + offset, 0), threshold
    ) * x / scale
    g      @g      @r   r   ro   r   )r<   r   minimummaximumr@   r   )r%   	thresholdrH   r   r   r'   s         r   hard_swish_compositer     s     IEFLLA--A3JDV17;;;;ZAG444  Yag666	
 	
 	 z5
0
0
0	1  Jr   index_selectc                 d    |dk     rt          | j                  |z   }t          | ||          }|S )z)define composite rule of op index_select.r   )r   )r<   r   gather)r%   indexr   r'   s       r   index_select_compositer     s8     axx17||d"
E
%
%
%CJr   sigmoidc                     d}ddl m}  || j                  }|dv rd}t          | d          } dt	          |            z   }d|z  }|s|nt          ||          S )zI
    define composite rule of op sigmoid
    res = 1 / (1 + exp(-x))
    Fr   r   r   Tr   r   r   r   r   r   r    r%   r&   r   r   sum_tempr'   s         r   sigmoid_compositer          F555555M!'""E%%%I3r77{H
h,C233$sE"2"22r   siluc                     d}ddl m}  || j                  }|dv rd}t          | d          } dt	          |            z   }| |z  }|s|nt          ||          S )zF
    define composite rule of op silu
    res = x / (1 + exp(-x))
    Fr   r   r   Tr   r   r   r   s         r   silu_compositer     r   r   meshgridc                    t          |           }dg|z  }t          |          D ]F}| |                                         }|dk    s|dk    sJ |dk    r| |         j        d         ||<   Gg }t          |          D ]T}dg|z  }||         ||<   |                    | |                             |                              |                     U|S )a  
    define composite rule of op meshgrid
    If the input has N tensors of size S_0, ... S_n-1, then the output will also have N tensors, where
    each tensor is of shape (S_0, ..., S_n-1).
    E.g. a1 is Tensor [1,2,3]
         b1 is Tensor [4,5]
         r1, r2 = paddle.meshgrid([a1, b1])
         r1 is Tensor [[1,1], [2,2], [3,3]]
         r2 is Tensor [[4,5], [4,5], [4,5]]
    r   r   )r<   r>   r   r   r   rC   broadcast_to)inputssizer   r5   r   outputs
view_shapes          r   meshgrid_compositer     s     v;;DC$JE4[[ * *Qimmooaxx3!888#!88ayq)E!HG4[[ J JS4Z
a
1vay((44AA%HHIIIINr   fill_any_likec                 6    	 	 t          | j        ||          }|S )z&define composite rule of op full_like.)r@   r   )r%   
fill_valuer   placevals        r   r   r   +  s"     ;H
qw
E
*
*CJr   squeeze2c                 v   	 t          | j                  dk    rt          |           dgS t          |          dk    rt          t	                              }nfd|D             }g }t          | j                  D ]$\  }}|dk    r||v s|                    |           %t          | |          }|dgS )z define composite rule of squeezer   Nc                     h | ]}|z  S r3   r3   )r4   axranks     r   	<setcomp>z%squeeze2_composite.<locals>.<setcomp>D  s    )))bT	)))r   r   )r<   r   rE   setr>   r?   r   rC   )r%   r   dims	new_shapedr9   ri   r   s          @r   squeeze2_compositer  4  s     qw<<Dqyyq		4  
4yyA~~5;;))))D)))I!'""    1QAIIQ
!Y

C;r   sqrtc                    d}ddl m}  || j                  }|dv rd}t          | d          } t	          t          | j                  dk    r| j        ndgd| j                  }t          | |          }|s|nt          ||          S )	z@
    define composite rule of op sqrt
    res = pow(x, 0.5)
    Fr   r   r   Tr   r   rn   )r   r   r   r   r@   r<   r   rB   )r%   r&   r   r   rX   r'   s         r   sqrt_compositer  M  s     F555555M!'""E%%%IAG))QWWsCAAA
a))C233$sE"2"22r   rB   c                 J   d}ddl m}  || j                  }|dv rd}t          | d          } t	          |t
          t          f          r6t          t          | j	                  dk    r| j	        ndg|| j                  }t          | |          }|rt          ||          }|S )z7
    define composite rule of op pow
    res = x^y
    Fr   r   r   Tr   r   )r   r   r   r   r   r   floatr@   r<   r   rB   )r%   rX   r&   r   r   r'   s         r   pow_compositer  `  s     F555555M!'""E%%%I!c5\"" DCLLA--A317CC
a))C 3Jr   reluc                     t          | j                  dk    r)t          | t          | j        d| j                            S t          | t          dgd| j                            S )z!define composite rule of op relu.r   r   r   )r<   r   r   r@   r   )r%   s    r   relu_compositer  v  sW     17||qq$qwQW55666q$sC11222r   
unsqueeze2c                     	 t          | j                  }t          |          }|D ]5}|dk     r|t          |          dz   z  }g |d|         d||d         }6t          | |          }|dgS )z%define composite rule of op unsqueezer   r   N)listr   r<   rC   )r%   r   r   	axis_listr5   ri   s         r   unsqueeze_compositer    s     217mmGT

I 2 2q55W!!A1GBQBK11WQRR[1
!W

C;r   
group_normc                    |dk    sJ | j         \  }}}}	d}
ddlm}  || j                  }|dv r2d}
t	          | d          } t	          |d          }t	          |d          }t          | ||z  df          } t          | d	d
          }t          | | z  d	d
          ||z  z
  }t          |t          |                    }d	t          ||z             z  }| |z
  |z  }t          |||||	f          }||t          |d          z  }||t          |d          z   }t          |||f          }t          |||f          }|
rt	          ||          }|||fS )z
    define composite rule of op group_norm.
    x = ((x - mean) / sqrt(var + epsilon)) * scale + bias
    mean and var are computed from groups
    r0   Fr   r   r   Tr   rp   r   r   N)rp   r   r   )
r   r   r   r   r   rC   rA   r   
zeros_liker  )r%   rH   rI   rL   groupsrM   NCHWr&   r   r   rc   var_var_invri   	ret_mean_ret_var_s                      r   group_norm_compositer     s    &    JAq!QF555555M!'""E%%%IUI&&D)$$AJ#$$AD)))EAAt,,,uu}<D4D))**D$tg~&&&Gu9
C
#1a|
$
$CGE:...GD*---6{++Ita[))H 3	8##r   r#   c                     d}| D ]}||z  }|S )Nr   r3   )r%   ansxis      r   sum_compositer$    s&    
C  r	Jr   
leaky_reluc                 Z    |dk     rt          | || z            S t          | || z            S )z'define composite rule of op leaky_relu.r   )r   r   )r%   negative_slopes     r   leaky_relu_compositer(    s9     q.1,---q.1,---r   )r   r	   )#r   r   paddle.baser   
primitivesprimregr   r   r   r+   r^   rj   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r$  r(  r3   r   r   <module>r,     sd  (                9 9 9 9 9 9 9 9! ! !
 I  4 L!!RA RA "!RAj L!!'  '  "!' T O$$(& (& %$(&V F  0 M""  #"< K  . . ! .B N##!. !. $#!.H G
 
 
 .//- - 0/-: II I IB     L!!  "!2 N##  $# I3 3 3$ F3 3 3$ J   4 O$$   %$ J   0 F3 3 3$ E  * F3 3 3 L!!
 
 "!
 L!!%$ %$ "!%$P E   L!!. . "!. . .r   