
    jg                        d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ dZd Zd Zdedej        fd	Zdedej        fd
Zdedej        fdZdej        j        j        fdZd Zd Zd Z d Z!d Z"d Z#d Z$dS )    N)_ConvNd)calculate_adaptive_avgcalculate_avgpoolcalculate_convcalculate_conv2d_flopscalculate_linearcalculate_normcalculate_parameterscalculate_relucalculate_relu_flopscalculate_softmaxcalculate_upsamplecalculate_zero_ops   c                 \    t          |                     d                    | j        d<   dS )zWCalculate and return the total number of learnable parameters in a given PyTorch model.F)recurser   N)r
   
parameterstotal_paramsmxys      \/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/thop/vision/basic_hooks.pycount_parametersr      s*    ,Q\\%\-H-HIIAN1    c                 >    | xj         t                      z  c_         dS )zHIncrementally add zero operations to the model's total operations count.N)	total_opsr   r   s      r   zero_opsr       s    KK%'''KKKKr   r   r   c           
          |d         }| xj         t          t          |j                  t          |j                  t          | j        j                  | j        | j        d          z  c_         dS )mCalculate and add the number of convolutional operations (FLOPs) for a ConvNd layer to the model's total ops.r   F
input_sizeoutput_sizekernel_sizegroupsbias	transposeNr   r   listshapeweightr%   r&   r   s      r   count_convNdr,   %   sc    	!AKK)==MM((xV   KKKKr   c           
          |d         }| xj         t          t          |j                  t          |j                  t          | j        j                  | j        | j        d          z  c_         dS )r    r   Tr!   Nr(   r   s      r   count_convtNdr.   ;   sc    	!AKK)==MM((xV   KKKKr   c                 j   |d         }t          j        |                                dd         |                                dd         z                                             }| xj        t          | j                                        | j                                        |          z  c_        dS )z]Calculates and updates total operations (FLOPs) for a convolutional layer in a PyTorch model.r   Nr      )	torchzerossizenumelr   r   r&   nelementr+   )r   r   r   r#   s       r   count_convNd_ver2r6   I   s    	!A +affhhrrlQVVXXabb\9::@@BBK KK>!&//"3"3QX5F5F5H5H+VVVKKKKr   c                     |d         }t          |                                          }t          | dd          st          | dd          r|dz  }| xj        |z  c_        dS )ziCalculate and add the FLOPs for a batch normalization layer, including elementwise and affine operations.r   affineFelementwise_affiner0   N)r	   r4   getattrr   )r   r   r   flopss       r   count_normalizationr<   Y   sg     	
!A17799%%Eq(E"" ga1Eu&M&M 
KK5KKKKr   c                     |d         }|                                 }| j        s| xj        t          |          z  c_        dS dS )z]Calculate and update the total operation counts for a PReLU layer using input element number.r   N)r4   trainingr   r   )r   r   r   	nelementss       r   count_prelur@   o   sH    	!A		I: 1	~i0001 1r   c                 t    |d         }| xj         t          t          |j                            z  c_         dS )zACalculate and update the total operation counts for a ReLU layer.r   N)r   r   r)   r*   r   s      r   
count_relurB   x   s0    	!AKK'QW666KKKKr   c                     |d         }|                                 | j                 }|                                |z  }| xj        t	          ||          z  c_        dS )zWCalculate and update the total operation counts for a Softmax layer in a PyTorch model.r   N)r3   dimr4   r   r   )r   r   r   	nfeatures
batch_sizes        r   count_softmaxrG   ~   sO    	!AIi'JKK$Z;;;KKKKr   c                 h    |                                 }| xj        t          |          z  c_        dS )znCalculate and update the total number of operations (FLOPs) for an AvgPool layer based on the output elements.N)r4   r   r   )r   r   r   num_elementss       r   count_avgpoolrJ      s.     7799LKK$\222KKKKr   c           	      L   t          j        t          j        g |d         j        dd                   t          j        g |j        dd                             }t          j        |          }|                                }| xj        t          ||          z  c_        dS )zmCalculate and update the total operation counts for an AdaptiveAvgPool layer using kernel and element counts.r   r0   N)r1   divDoubleTensorr*   prodr4   r   r   )r   r   r   kernel	total_addrI   s         r   count_adap_avgpoolrQ      s    Yu)*=QqTZ^*=>>@RScVWV]^_^`^`VaSc@d@deeF
6""I7799LKK))\BBBKKKKr   c                     | j         dvr/t          j        d| j          d           | xj        dz  c_        dS |d         }| xj        t	          | j         |                                          z  c_        dS )zMUpdate total operations counter for upsampling layers based on the mode used.)nearestlinearbilinearbicubic	trilinearzmode z* is not implemented yet, take it a zero opr   N)modeloggingwarningr   r   r5   r   s      r   count_upsampler[      s|    v    	RRRRSSS	qaD	)!&!**,,???r   c                 x    | j         }|                                }| xj        t          ||          z  c_        dS )zWCounts total operations for nn.Linear layers using input and output element dimensions.N)in_featuresr4   r   r   )r   r   r   	total_mulrI   s        r   count_linearr_      s7    I 7799LKK#I|<<<KKKKr   )%rY   r1   torch.nnnntorch.nn.modules.convr   thop.vision.calc_funcr   r   r   r   r   r	   r
   r   r   r   r   r   multiply_addsr   r   Tensorr,   r.   r6   modules	batchnorm
_BatchNormr<   r@   rB   rG   rJ   rQ   r[   r_    r   r   <module>rj      s           ) ) ) ) ) )                            J J J
( ( (
G 5<    ,W EL    W W W W W W 	2:/: 	 	 	 	,1 1 17 7 7< < <3 3 3C C C@ @ @"= = = = =r   