o
    Ďi                     @   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 r+e dej d dd Z	dd	 Z
d
d Zdd ZddlmZ dd ZdejfddZdejfddZdejfddZdejf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 < qi Z!d d"l"m#Z# d d#l$m%Z% dd$l&m'Z'm(Z(m)Z) d%d& Z*d4d(ejd)ej+fd*d+Z,e-d,krG d-d. d.ejZ.G d/d0 d0ejjZ/e/ Z0e1d1d2Z2e,e0e2d'd3Z3e4e3 dS dS )5    N)LooseVersionz1.8.0zVtorch.fx requires version higher than 1.8.0. But You are using an old version PyTorch z. c                 C      dS Nr    input_shapesoutput_shapesr   r   K/home/jeff/fluffinator/venv/lib/python3.10/site-packages/thop/fx_profile.pycount_clamp      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   in_shape	out_shapein_featuresnum_elementsr   r   r	   count_matmul   s
   r   c                 O   s"   t | |}d|v r|d  }|S )Nbiasr   )r   r   )r   r   argskwargs	mul_flops	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   stridepaddingdilationgroupsx_shapek_shapeb_shaper   kernel_parametersbias_op
in_channel	total_opsr   r   r	   count_fn_conv2d)   s   

r/   modulec                 C   s
   t ||S N)r   )r0   r   r   r   r   r	   count_nn_linear;   s   
r2   c                 O   r   r   r   )r0   r   r   r   r   r   r   r	   count_zero_ops?   r   r3   c           	      C   sZ   | j d urdnd}|d }| j}| j}| jjdd   }t||| || }t|S )Nr   r   r   )	r   in_channelsr'   r#   shaper   r   r    r!   )	r0   r   r   r,   r   r-   r'   
kernel_opsr.   r   r   r	   count_nn_conv2dC   s   r7   c                 C   s,   t |dks
J d|d }d|  }|S )Nr   z*nn.BatchNorm2d should only have one outputr   r   )r   r   )r0   r   r   yr.   r   r   r	   count_nn_bn2dP   s   r9   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 r1   r   )r   r   r   r   r	   
null_printx   r   r@   Fmodinputc              
   C   s  t | }|j}t|| t}|rt}i }d}|jjD ]H}|d|j d|j d|j	 d|j
  d }	g }
g }|ddd |j
D ]}t||vrKqB||t|  dd |
|t|  qB|  |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 rt| |
|g|j
R i |j}	n|j|ft|< td| d n|jdkrt|j}|tv rt| |
|}	np|j|ft|< t| d na|jdkrC| |j}t|}|t|t|tv  t|tv rtt| ||
|}	n|jft|< t| d tdt| t|tr.td ntt| td|  |jd  j  |jd
 j|t|j	< |	d urW||	7 }td|	 d|  |d qt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:	tensor_meta)outputplaceholdercall_functionat< >|z| is missingcall_methodz is missing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<   	propagater@   printnodesoptargetnamer   strappendmetar5   splitreplacestrip	count_mapr   missing_mapsr>   get_submoduletype
isinstancezero_ops
state_dictr?   r   keysrP   )rA   rB   verbosegmgfprintv_mapstotal_flopsnode
node_flopsr   r   argkeymrP   r   r   r	   
fx_profile|   s   "







rq   __main__c                   @   s   e Zd Zdd ZdS )MyOPc                 C   s   |d S )Nr   r   )selfrB   r   r   r	   forward   s   zMyOP.forwardN)__name__
__module____qualname__ru   r   r   r   r	   rs      s    rs   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linear2rs   myop)rt   	__class__r   r	   r|      s   
zMyModule.__init__c                 C   s,   |  |}| |jddd}| || S )Ng        g      ?)minmax)r   r   r:   r   )rt   xout1out2r   r   r	   ru      s   
zMyModule.forward)rv   rw   rx   r|   ru   __classcell__r   r   r   r	   ry      s    ry      rz   )rf   )F)5loggingr}   thtorch.nnr~   distutils.versionr   __version__warningr
   r   r   r   vision.calc_funcr   r/   Moduler2   r3   Conv2dr7   BatchNorm2dr9   ReLUReLU6Dropout	MaxPool2d	AvgPool2dAdaptiveAvgPool2drc   r   r^   kr_   torch.fxr;   torch.fx.passes.shape_propr<   utilsr=   r>   r?   r@   Tensorrq   rv   rs   ry   netrandndataflopsrS   r   r   r   r	   <module>   sn    	

\