o
    "jsX                     @   s  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d Zedd	d
 Z	eddd Z
eddd Zeddd Zeddd Zeddd Zeddd Zeddd Zed d!d" Zed#d$d% Zed&d'd( ZdWd)d*Zed+d,d- Zed.d/d0 Zed1d2d3 Zed4d5d6 Zed7d8d9 Zed:dXd;d:Zed<d=d> Zed?d@dA ZedBdCdD ZedEdFdG ZedHdIdJ ZedKdLdM Z edNdOdP Z!edQdRdS Z"edTdUdV Z#dS )Y    N)core   )*)REGISTER_COMPOSITElookup_compositec                 G   s   t | j}|| g|R  S N)r   type)opargsZ
_lowerrule r   i/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/incubate/autograd/composite_rules.py
_composite   s   
r   Zsoftmaxc           	      C   s   d}ddl m} || j}|dv rd}t| d} | js*t| |  }|r(t|d}|S t| |dd}d|_t| | }t||dd	}t	||}|rMt||}|S )
z#define composite rule of op softmaxFr   convert_dtypefloat16Zuint16Tfloat32r   )keepdimaxisr   )
paddle.base.data_feederr   dtypecastshapeexpmaxZstop_gradientsumdivide)	xr   is_ampr   r   resZmax_tempZ	moleculardenominatorr   r   r   softmax_composite"   s&   




r"   Z
batch_normc                    sH  d}ddl m} || j}|dv r*d}t| d} |rt|dn|}|r(t|dn|}|dv r0dnt| jd  |r<|
 p=|	}t fd	d
tt| jD tfdd
t| jD }t	dgd| j}|st
| }t
| |  }|||  }t|| |}|dkr| | | }n| t|| t|| }|| d| |  }|| d| |  }n6t|j|j}t|j|j}t|| |}|dkr| | t|| | }n| t|| tt||| | }|dkr|| | }nt||| t|| }|rt||}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 savedvariance indeed return inverse std.
    Fr   r   r   Tr   )ZNCNCLNCHWZNCHWDr   c                 3   s    | ]	}| kr|V  qd S r   r   ).0i)feature_axisr   r   	<genexpr>_   s    z&composite_batchnorm.<locals>.<genexpr>c                 3   s$    | ]\}}| v rd n|V  qdS )r   Nr   )r%   r&   s)reduce_axesr   r   r(   `   s    
      ZNHWCN)r   r   r   r   lenr   tuplerange	enumeratefullmeanpowreshapezerosassign)r   Zrun_meanZrun_varscalebiasis_testZmomentumepsilondata_layoutZuse_global_statsZtrainable_statisticsr   r   r   Zuse_run_statZstats_shapehalfZ
batch_meantempZ	batch_varZinv_stdZx_hatyZbatch_mean_Zinv_std_Z	run_mean_Zrun_var_Zreserve_spacer   )r'   r*   r   composite_batchnorm=   sb   

 

r>   Z
layer_normc                 C   s\  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d}	| |	 }
|
|
 }t||dd}|| }t	|}|
| }|durr| j|d |jkrnt
|| j|d }|| }|dur| j|d |jkrt
|| j|d }|| }t
|	| jd| }	t
|| jd| }|rt||}||	|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   r1   rsqrtr3   )r   r6   r7   r9   Zbegin_norm_axisr   r   r   r   mean_
differencevar_tmp1variancevar_tmp3Z	rsqrt_varoutr   r   r   layernorm_composite   s:   



rF   Zinstance_normc                 C   sF  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d}| | }|| }t||dd}|| }t	|t
d	gd
|jd}|| }|durvt|d	|d	d	g}|| }|durt|d	|d	d	g}|| }t|dg}d	| }t|dg}|rt||}|||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,   r1   r2   r0   r3   )r   r6   r7   r9   r   r   r   nchwr   r@   rA   rB   rC   rD   Zsqrt_varrE   Z
scale_tileZ	bias_tileZsaved_variancer   r   r   instancenorm_composite   s:   



rO   Zgeluc                 C   s   d}d}t | jdkr| jndg}t|| j}t|d| j}|rHt||| | j}t|d| j}t|| ||  |  |    }	| | ||	  }
|
S ||t| t| j|| j   }| | }
|
S )z define composite rule of op gelug;f?gmBP?r   r   rH   gHm?)r,   r   Zonesr   r0   tanherf)r   ZapproximateZ	M_SQRT1_2Z
M_2_SQRTPI
full_shapeoner;   ZkAlphaZGELU_CONSTANTZtanh_outrE   Zcdfr   r   r   gelu_composite   s    rT   Zreduce_meanc                    s   d}ddl m} | j}|dv rd}t d |dg fv r(ttdt j}t|t	r0|fn|}t
 ||d} fd	d
|D }|g krId}	nttj|}	tg |	|jd}
t||
}|rdt||}|S )z define composite rule of op meanFr   r   r   Tr   Nr   c                    s   g | ]} j | qS r   r   )r%   r   r   r   r   
<listcomp>      z"mean_composite.<locals>.<listcomp>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   ZaxesZsum_xZele_nums_listZvalue_to_fillZnormr    r   rV   r   mean_composite  s.   



ra   Z	expand_v2c                 C   s   | j }t|}t|}||kr|dksJ g }t|D ]8}|| }|| }|dkr-|| nd}	|| }
|
dkr@|dks=J d}n|
|	 dksHJ t|
|	 }|| q||k rxg }t|| D ]}|d q`|| t| |}t||dS t| |dS )z
    define composite rule of op expnad_v2, expand_v2->expand
    repeat_times = shape / x.shape
    out = tile(x, repeat_times = repeat_times)
    r   r   rJ   repeat_timesr   r,   r.   r[   appendextendr3   Ztile)r   r   shape_indim_outdim_inrc   r&   offsetdimsize_insize_outrepeatshape_in_expand	x_reshaper   r   r   expand_v2_composite"  s0   

rq   Zexpand_as_v2c                 C   s  | j }|dur
|j }|dusJ t|}t|}||kr |dks"J g }t|D ]8}|| }|| }	|	dkr:||	 nd}
|| }|dkrM|	dksJJ d}n||
 dksUJ t||
 }|| q(||k rg }t|| D ]}|d qm|| t| |}t||dS t| |dS )z
    define composite rule of op expnad_as_v2, expand_as_v2->expand_as
    repeat_times = target_shape / x.shape
    out = tile(x, repeat_times = repeat_times)
    Nr   r   rJ   rb   rd   )r   r=   Ztarget_shaperg   rh   ri   rc   r&   rj   rk   rl   rm   rn   ro   rp   r   r   r   expand_as_v2_compositeD  s6   

rr   stackc                    sZ   | d j }|dk r|t|d 7 }|d| d ||d   t fdd| D |}|S )zt
    define composite rule of op stack
    unsqueeze each dimension of the input (use reshape), and then concat
    r   r   N)r   c                    s   g | ]}t | qS r   )r3   )r%   itemZ	out_shaper   r   rW   s  rX   z#stack_composite.<locals>.<listcomp>)r   r,   concat)r   r   x_shaperE   r   ru   r   stack_compositei  s   
rx   Zflatten_contiguous_rangec           	      C   s   | j }t|dkr|nd}t|dkr|nd}||ksJ t|dkr,t| dgddfS ||kr8t| |ddfS d}t||d D ]}||| 9 }qAg }t|D ]	}|||  qP|| t|d t|D ]	}|||  qht| |d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   rU   N)r   r,   r3   r.   re   )	r   Z
start_axisZ	stop_axisrg   Z	start_dimZend_dimZslice_numelr&   Z	shape_outr   r   r   "flatten_contiguous_range_compositew  s$   

ry   Zdropoutc           	      C   s   |du rdn|}|r|nd}|dk}t | j| j||d}|rM|sA|dkr1d|  t| jtjjjfS | | d|  t|tjjjfS t	| t|tjjjfS |s[| | t|tjjjfS | d|  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   r4   r   ZVarDescZVarTypeZUINT8r   r5   )	r   Zseed_tensorr{   r8   moder|   Zfix_seedrz   maskr   r   r   dropout_composite  s   

r   c              	   C   sX   ddl m} ||dv rdn|}ttt| |dd|dtt| dkr#| ndg|||S )	Nr   r   r   r   r~   r}   )minr   r|   r   )r   r   r   Zgreater_equaluniformr`   r,   )r   r   r{   r|   r   Z	new_dtyper   r   r   r     s   r   Z
hard_swishc                 C   sv   d}d}d}t | jdkr| jndg}tt| t||| jd t|d| jdt||| jd|  t||| jd }|S )zdefine composite rule of op hard_swish.
    offset=3, threshold=6, scale=6
    out = minimum(
        maxmum(x + offset, 0), threshold
    ) * x / scale
    g      @g      @r   r   rI   r~   )r,   r   minimummaximumr0   r   )r   	thresholdr6   rj   rR   r    r   r   r   hard_swish_composite  s"   r   Zindex_selectc                 C   s(   |dk rt | j| }t| ||d}|S )z)define composite rule of op index_select.r   )r   )r,   r   Zgather)r   indexr   r    r   r   r   index_select_composite  s   r   Zsigmoidc                 C   sX   d}ddl m} || j}|dv rd}t| d} dt|   }d| }|s'|S 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   Zsum_tempr    r   r   r   sigmoid_composite     

r   Zsiluc                 C   sX   d}ddl m} || j}|dv rd}t| d} dt|   }| | }|s'|S t||S )zF
    define composite rule of op silu
    res = x / (1 + exp(-x))
    Fr   r   r   Tr   r   r   r   r   r   r   silu_composite  r   r   Zmeshgridc                 C   s   t | }dg| }t|D ]}| |  }|dks|dksJ |dkr,| | jd ||< qg }t|D ]}dg| }|| ||< || | || q3|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.   rk   r   re   r3   Zbroadcast_to)Zinputssizer   r&   rk   ZoutputsZ
view_shaper   r   r   meshgrid_composite  s   

r   fill_any_likec                 C   s   	 	 t | j||}|S )z&define composite rule of op full_like.)r0   r   )r   Z
fill_valuer   Zplacevalr   r   r   r   +  s   Zsqueeze2c                    s   	 t | j  dkrt| dgS t |dkrtt }n	 fdd|D }g }t| jD ]\}}|dkr9||v s>|| q-t| |}|dgS )z define composite rule of squeezer   Nc                    s   h | ]}|  qS r   r   )r%   axrankr   r   	<setcomp>D  s    z%squeeze2_composite.<locals>.<setcomp>r   )r,   r   r5   setr.   r/   re   r3   )r   r   dimsZ	new_shapedr)   rE   r   r   r   squeeze2_composite4  s   


r   sqrtc                 C   p   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| |}|s3|S t||S )	z@
    define composite rule of op sqrt
    res = pow(x, 0.5)
    Fr   r   r   Tr   r   rH   r   r   r   r   r0   r,   r   r2   r   r   r   r   r=   r    r   r   r   sqrt_compositeM  s   

$
r   r2   c                 C   s~   d}ddl m} || j}|dv rd}t| d} t|ttfr1t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   rZ   r[   floatr0   r,   r   r2   )r   r=   r   r   r   r    r   r   r   pow_composite`  s   

$

r   Zreluc                 C   s:   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   r0   r   rV   r   r   r   relu_compositev  s   r   Z
unsqueeze2c                 C   sf   	 t | j}t |}|D ]}|dk r|t|d 7 }|d| dg ||d  }qt| |}|dgS )z%define composite rule of op unsqueezer   r   N)listr   r,   r3   )r   r   rw   Z	axis_listr&   rE   r   r   r   unsqueeze_composite  s   



r   r?   c                 C   r   )	z"define composite rule of op rsqrt.Fr   r   r   Tr   r   r+   r   r   r   r   r   rsqrt_composite  s   

$
r   Z
group_normc                 C   s4  |dksJ | j \}}}}	d}
ddlm} || j}|dv r/d}
t| d} t|d}t|d}t| || df} t| d	dd
}t| |  d	dd
||  }t|t|}d	t	||  }| | | }t|||||	f}|duru|t|d }|dur|t|d }t|||f}t|||f}|
rt||}|||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
    r$   Fr   r   r   Tr   rJ   r   r   N)rJ   r   r   )
r   r   r   r   r   r3   r1   r   Z
zeros_liker   )r   r6   r7   r9   groupsr:   NCHWr   r   r   r@   Zvar_Zvar_invrE   Z	ret_mean_Zret_var_r   r   r   group_norm_composite  s4   





r   r   c                 C   s   d}| D ]}||7 }q|S )Nr   r   )r   Zansxir   r   r   sum_composite  s   
r   Z
leaky_reluc                 C   s$   |dk rt | ||  S t| ||  S )z'define composite rule of op leaky_relu.r}   )r   r   )r   Znegative_sloper   r   r   leaky_relu_composite  s   r   )r   r   )$r\   r^   Zpaddle.baser   Z
primitivesZprimregr   r   r   r"   r>   rF   rO   rT   ra   rq   rr   rx   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sv   

U
*
+


!
$



!








	


(
