a
    5Df                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZ eejedk rVe dej d dd Z	dd	 Z
d
d Zdd ZddlmZ dd ZejdddZejdddZejdddZejdddZejejejejejejfZejeejeejedede	dededed e
d!e
i
ZeD ]Z eee < qi Z!d d"l"m#Z# d d#l$m%Z% dd$l&m'Z'm(Z(m)Z) d%d& Z*d3ejej+d(d)d*Z,e-d+krG d,d- d-ejZ.G d.d/ d/ejjZ/e/ Z0e1d0d1Z2e,e0e2d'd2Z3e4e3 dS )4    N)LooseVersionz1.8.0zVtorch.fx requires version higher than 1.8.0. But You are using an old version PyTorch z. c                 C   s   dS Nr    input_shapesoutput_shapesr   r   \/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/thop/fx_profile.pycount_clamp   s    r	   c                 C   s   |d   S r   numelr   r   r   r   	count_mul   s    r   c                 C   s(   | d }|d }|d }|  }|| S )Nr   r
   )r   r   Zin_shape	out_shapeZin_featuresZnum_elementsr   r   r   count_matmul   s
    r   c                 O   s"   t | |}d|v r|d  }|S )Nbiasr   )r   r   )r   r   argskwargsZ	mul_flopsZ	add_flopsr   r   r   count_fn_linear   s    
r      )calculate_convc                 O   s   |\}}}}}}	}
t | dkr(| \}}nt | dkr>| \}}}|d }|dd   }d}|d }t||| ||
 }t|S )N      r   r   )lenr   r   itemint)r   r   r   r   inputsweightr   ZstridepaddingZdilationgroupsZx_shapeZk_shapeZb_shaper   Zkernel_parametersbias_op
in_channel	total_opsr   r   r   count_fn_conv2d)   s    

r"   )modulec                 C   s
   t ||S N)r   )r#   r   r   r   r   r   count_nn_linear;   s    r%   c                 O   s   dS r   r   )r#   r   r   r   r   r   r   r   count_zero_ops?   s    r&   c           	      C   sZ   | j d urdnd}|d }| j}| j}| jjdd   }t||| || }t|S )Nr   r   r   )	r   Zin_channelsr   r   shaper   r   r   r   )	r#   r   r   r   r   r    r   Z
kernel_opsr!   r   r   r   count_nn_conv2dC   s    r(   c                 C   s,   t |dksJ d|d }d|  }|S )Nr   z*nn.BatchNorm2d should only have one outputr   r   )r   r   )r#   r   r   yr!   r   r   r   count_nn_bn2dP   s    r*   zfunction linearclampzbuilt-in function addzbuilt-in method flz%built-in method conv2d of type objectzbuilt-in function mulzbuilt-in function truediv)symbolic_trace)	ShapeProp)prGreenprRedprYellowc                  O   s   d S r$   r   )r   r   r   r   r   
null_printx   s    r1   F)modinputc              
   C   s  t | }|j}t|| t}|r(t}i }d}|jjD ]}|d|j d|j d|j	 d|j
  d }	g }
g }|ddd |j
D ]:}t||vrq||t|  dd |
|t|  q|  |d	|jd
 j  ||jd
 j |jdv rd}	n|jdkrt|jdd dddd }|tv rbt| |
|g|j
R i |j}	n|j|ft|< td| d n|jdkrt|j}|tv rt| |
|}	n|j|ft|< t| d n|jdkr| |j}t|}|t|t|tv  t|tv r,tt| ||
|}	n|jft|< t| d tdt| t|trjtd n*tt| td|  |jd  j  |jd
 j|t|j	< |	d ur||	7 }td|	 d|  |d q8tt dkrddlm} td |t |S )Nr   zNodeOP:z	,	Target:z,	NodeName:z,	NodeArgs:zinput_shape:	)endzoutput_shape:	Ztensor_meta)outputplaceholdercall_functionat< >|z| is missingZcall_methodz is missingZcall_modulezmodule type:zweight_shape: Nonezweight_shape: z.weightzCurrent node's FLOPs: z, total FLOPs: zP================================================================================)pprintzMissing operators: )r,   graphr-   	propagater1   printnodesoptargetnamer   strappendmetar'   splitreplacestrip	count_mapr   missing_mapsr/   Zget_submoduletype
isinstancezero_opsZ
state_dictr0   r   keysr>   )r2   r3   verboseZgmgZfprintZv_mapsZtotal_flopsnodeZ
node_flopsr   r   argkeymr>   r   r   r   
fx_profile|   s    "







rX   __main__c                   @   s   e Zd Zdd ZdS )MyOPc                 C   s   |d S )Nr   r   )selfr3   r   r   r   forward   s    zMyOP.forwardN)__name__
__module____qualname__r\   r   r   r   r   rZ      s   rZ   c                       s$   e Zd Z fddZdd Z  ZS )MyModulec                    s6   t    tjdd| _tjdd| _t | _d S )N   r   )	super__init__torchnnLinearlinear1linear2rZ   myop)r[   	__class__r   r   rc      s    
zMyModule.__init__c                 C   s,   |  |}| |jddd}| || S )Ng        g      ?)minmax)rg   rh   r+   ri   )r[   xZout1Zout2r   r   r   r\      s    
zMyModule.forward)r]   r^   r_   rc   r\   __classcell__r   r   rj   r   r`      s   r`      ra   )rR   )F)5loggingrd   thZtorch.nnre   Zdistutils.versionr   __version__warningr	   r   r   r   Zvision.calc_funcr   r"   Moduler%   r&   ZConv2dr(   ZBatchNorm2dr*   ZReLUZReLU6ZDropoutZ	MaxPool2dZ	AvgPool2dZAdaptiveAvgPool2drP   rf   rL   krM   Ztorch.fxr,   Ztorch.fx.passes.shape_propr-   utilsr.   r/   r0   r1   ZTensorrX   r]   rZ   r`   netZrandndataZflopsrA   r   r   r   r   <module>   sj   	
\
