o
    0j#                     @   s   d dl Z d dlmZ d dlmZ ddlmZ ddlmZ ddd	Z	G d
d dej
ZG dd dej
ZG dd dej
ZG dd dej
ZG dd dej
ZG dd dej
ZG dd dej
ZG dd dej
ZG dd dej
ZdS )    N)Constant   )ACT2FN   )PPLCNetV3Config   c                 C   sF   |d u r|}t |t| |d  | | }|d|  k r||7 }t|S )N   g?)maxint)valuedivisorZ	min_value	new_value r   /var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/inference/models/image_classification/modeling/pplcnetv3.pymake_divisible   s   r   c                       s.   e Zd Z				d fdd	Zdd Z  ZS )	PPLCNetV3ConvLayerr   r   	hardswishc              	      sX   t    tj|||||d d|d| _t|| _|d ur%t| | _	d S t | _	d S )Nr   F)kernel_sizestridepaddingZ	bias_attrgroups)
super__init__nnConv2DconvolutionBatchNorm2Dnormalizationr   Identity
activation)selfin_channelsout_channelsr   r   r   r   	__class__r   r   r   !   s   
		zPPLCNetV3ConvLayer.__init__c                 C   s"   |  |}| |}| |}|S N)r   r   r   )r    inputhidden_stater   r   r   forward9      


zPPLCNetV3ConvLayer.forward)r   r   r   r   __name__
__module____qualname__r   r(   __classcell__r   r   r#   r   r       s    r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )PPLCNetV3LearnableAffineBlock      ?        c                    s>   t    | jdgt|dd| _| jdgt|dd| _d S )Nr   )r   )shapeZdefault_initializer)r   r   Zcreate_parameterr   scalebias)r    Zscale_valueZ
bias_valuer#   r   r   r   A   s   
z&PPLCNetV3LearnableAffineBlock.__init__c                 C   s   | j | | j S r%   )r3   r4   r    r'   r   r   r   r(   J      z%PPLCNetV3LearnableAffineBlock.forward)r0   r1   r*   r   r   r#   r   r/   @   s    	r/   c                       &   e Zd Zd fdd	Zdd Z  ZS ) PPLCNetV3ActLearnableAffineBlockr   c                    s    t    t| | _t | _d S r%   )r   r   r   actr/   lab)r    r   r#   r   r   r   O   s   

z)PPLCNetV3ActLearnableAffineBlock.__init__c                 C   s   |  | |S r%   )r:   r9   r5   r   r   r   r(   T   r6   z(PPLCNetV3ActLearnableAffineBlock.forward)r   r*   r   r   r#   r   r8   N   s    r8   c                       s(   e Zd Z	d fdd	Zdd Z  ZS )PPLCNetV3LearnableRepLayerr   c                    s   t    | _krdkrtnd | _t fddt|D | _dkr9t	d d dnd | _
t | _t|d| _d S )Nr   c              
      s    g | ]}t  d dqS )Nr   r   )r   ).0_r   r!   r   r"   r   r   r   
<listcomp>m   s    	z7PPLCNetV3LearnableRepLayer.__init__.<locals>.<listcomp>r<   )r   )r   r   r   r   r   identity	LayerListrangeconv_symmetricr   conv_small_symmetricr/   r:   r8   r9   )r    r!   r"   r   r   r   num_conv_branchesr   r#   r?   r   r   Y   s&   


	z#PPLCNetV3LearnableRepLayer.__init__c                 C   s   d }| j d ur|  |}| jd ur | |}|d u r|n|| }| jD ]}||}|d u r/|n|| }q#| |}| jdkrC| |}|S )Nr   )rA   rE   rD   r:   r   r9   )r    r'   outputresidualconvr   r   r   r(      s   







z"PPLCNetV3LearnableRepLayer.forward)r   r*   r   r   r#   r   r;   X   s    	,r;   c                       r7   ) PPLCNetV3SqueezeExcitationModule   c              
      s|   t    td| _t | _||| t g|| |t gfD ]\}}}| j	tj
||dddd | j	| q"d S )Nr   r   )r!   r"   r   r   r   )r   r   r   ZAdaptiveAvgPool2Davg_poolrB   convolutionsZReLUZHardsigmoidappendr   )r    Zchannel	reductionZin_chZout_chr   r#   r   r   r      s"   

	z)PPLCNetV3SqueezeExcitationModule.__init__c                 C   s*   |}|  |}| jD ]}||}q
|| S r%   )rL   rM   )r    r'   rH   layerr   r   r   r(      s
   


z(PPLCNetV3SqueezeExcitationModule.forward)rK   r*   r   r   r#   r   rJ      s    rJ   c                       $   e Zd Z fddZdd Z  ZS )$PPLCNetV3DepthwiseSeparableConvLayerc              	      s^   t    t||||||j|jd| _|rt||jnt	 | _
t||dd|j|jd| _d S )N)r!   r"   r   r   r   rF   r   r   )r!   r"   r   r   rF   r   )r   r   r;   Zconv_symmetric_numZ
hidden_actdepthwise_convolutionrJ   rO   r   r   squeeze_excitation_modulepointwise_convolution)r    r!   r"   r   r   use_squeeze_excitationconfigr#   r   r   r      s,   
	z-PPLCNetV3DepthwiseSeparableConvLayer.__init__c                 C   s"   |  |}| |}| |}|S r%   )rS   rT   rU   r5   r   r   r   r(      r)   z,PPLCNetV3DepthwiseSeparableConvLayer.forwardr*   r   r   r#   r   rR      s    !rR   c                       rQ   )PPLCNetV3Blockc                    sv   t    |j| }t | _|D ]'\}}}}}t||j |j}	t||j |j}
| j	t
|	|
||||d qd S )N)r!   r"   r   r   rV   rW   )r   r   block_configsr   rB   layersr   r3   r   rN   rR   )r    rW   Zstage_indexblocksr   r!   r"   r   Zuse_seZ	scaled_inZ
scaled_outr#   r   r   r      s"   


zPPLCNetV3Block.__init__c                 C   s   | j D ]}||}q|S r%   )rZ   )r    hidden_statesrP   r   r   r   r(      s   

zPPLCNetV3Block.forwardr*   r   r   r#   r   rX      s    rX   c                       rQ   )PPLCNetV3Encoderc                    sX   t    tdt j j  jd jd d| _t	
 fddtt jD | _d S )Nr   )r!   r"   r   r   r   c                    s   g | ]}t  |qS r   )rX   )r=   irW   r   r   r@     s    z-PPLCNetV3Encoder.__init__.<locals>.<listcomp>)r   r   r   r   Zstem_channelsr3   r   Zstem_strider   r   rB   rC   lenrY   r[   r    rW   r#   r_   r   r      s   
	

zPPLCNetV3Encoder.__init__c                 C   s4   |  |}g }| jD ]}||}|| q
||fS r%   )r   r[   rN   )r    pixel_valuesr'   r\   blockr   r   r   r(     s   

zPPLCNetV3Encoder.forwardr*   r   r   r#   r   r]      s    r]   c                       rQ   )PPLCNetV3Backbonec                    s.   t    t | _ fdd jD | _d S )Nc                    s&   g | ]}t |d  d  j  jqS )r   )r   r3   r   )r=   Z	block_cfgr_   r   r   r@     s    z.PPLCNetV3Backbone.__init__.<locals>.<listcomp>)r   r   r]   encoderrY   r"   ra   r#   r_   r   r     s
   


zPPLCNetV3Backbone.__init__c                 C   s   |  |\}}|S r%   )rf   )r    rb   r>   r\   r   r   r   r(     s   zPPLCNetV3Backbone.forwardr*   r   r   r#   r   rd     s    rd   )r   N)ZpaddleZ	paddle.nnr   Zpaddle.nn.initializerr   Zcommon.transformers.activationsr   Z_config_pplcnetv3r   r   ZLayerr   r/   r8   r;   rJ   rR   rX   r]   rd   r   r   r   r   <module>   s   
	 
A)