
    h                      L   S SK JrJrJrJrJrJrJr  S SKJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJr  SSKJr  \R2                  r0 \R6                  \_\R8                  \_\R:                  \_\R<                  \_\R>                  \_\R@                  \_\RB                  \_\RD                  \_\RF                  \_\RH                  \_\RJ                  \_\RL                  \_\RN                  \_\RP                  \_\RR                  \_\RT                  \_\RV                  \_0 \RX                  \_\RZ                  \_\R\                  \_\R^                  \_\R`                  \_\Rb                  \_\Rd                  \_\Rf                  \_\Rh                  \
_\Rj                  \
_\Rl                  \
_\Rn                  \	_\Rp                  \	_\Rr                  \	_\Rt                  \_\Rv                  \_\Rx                  \_E\Rz                  \\R|                  \\R~                  \\R                  \\R                  \\R                  \\R                  \\R                  \\R                  \\R                  \\R                  \0ErHS	S jrI    S
S\R                  4S jjrKg)    )	count_grucount_gru_cell
count_lstmcount_lstm_cell	count_rnncount_rnn_celltorch)count_adap_avgpoolcount_avgpoolcount_convNdcount_convtNdcount_linearcount_normalizationcount_parameterscount_prelu
count_relucount_softmaxcount_upsampleloggingnnzero_ops   )prRedNc                   ^^^^^ / m[        5       mTc  0 mT(       a  SmUUUUU4S jnU R                  nU R                  5         U R                  U5        [        R
                  " 5          U " U6   SSS5        SnSnU R                  5        H?  n	[        U	R                  5       5      (       a  M#  XyR                  -  nXR                  -  nMA     UR                  5       nUR                  5       nU R                  U5        T H  n
U
R                  5         M     U R                  5        H}  u  p[        U	R                  5       5      (       a  M%  SU	R                  ;   a  U	R                  R!                  S5        SU	R                  ;   d  Mb  U	R                  R!                  S5        M     Xx4$ ! , (       d  f       GND= f)z^Profiles a PyTorch model's operations and parameters, applying either custom or default hooks.NTc                   > [        U R                  5       5      (       a  g [        U S5      (       d  [        U S5      (       a#  [        R                  " S[        U 5       S35        U R                  S[        R                  " S[        S95        U R                  S[        R                  " S[        S95        U R                  5        H;  nU =R                  [        R                  " UR                  5       /5      -  sl        M=     [        U 5      nS nUT;   a/  TU   nUT;  a#  T	(       a  [        SUR                    SU S	35        OYU["        ;   a3  ["        U   nUT;  a#  T	(       a  [        S
UR                    SU S	35        OUT;  a  T(       a  [%        SU S35        Ub"  U R'                  U5      nTR)                  U5        TR+                  U5        g )N	total_opstotal_paramsz9Either .total_ops or .total_params is already defined in z3. Be careful, it might change your code's behavior.r   dtype[INFO] Customize rule () .[INFO] Register () for [WARN] Cannot find rule for (. Treat it as zero Macs and zero Params.)listchildrenhasattrr   warningstrregister_bufferr	   zerosdefault_dtype
parametersr   DoubleTensornumeltypeprint__qualname__register_hooksr   register_forward_hookappendadd)
mpm_typefnhandler
custom_opshandler_collectionreport_missingtypes_collectionverboses
        F/home/james-whalen/.local/lib/python3.13/site-packages/thop/profile.py	add_hooks!profile_origin.<locals>.add_hooks[   s   

1k""ga&@&@OOKCPQF8 TD D
 	
+u{{1M'JK	.%++a}*MNANNe00!'')==N   aZF#B--'.r.?s6(!LM~%'B--'((9JK--.4VH<def>--b1G%%g.V$    r   r   r   )settrainingevalapplyr	   no_gradmodulesr'   r(   r   r   itemtrainremovenamed_modules_bufferspop)modelinputsr>   rB   r@   rD   rH   r   r   r9   r=   nr?   rA   s     ```       @@rC   profile_originrV   R   s`   u
"% "%H ~~H	JJL	KK		v 
 IL]]_

[[ 	&	   I$$&L 
KK% & ##%

!**$JJNN;'QZZ'JJNN>* & ""9 
s   ,F//
F>rS   c                   ^^^^^^ 0 m[        5       mTc  0 mT(       a  SmS[        R                  4UUUUU4S jjnU R                  nU R	                  5         U R                  U5        [        R                  " 5          U " U6   SSS5        S
S[        R                  S[        [        44UU4S jjjmT" U 5      u  pn
U R                  U5        TR                  5        H^  u  nu  pUR                  5         UR                  5         UR                  R                  S5        UR                  R                  S	5        M`     U(       a  XU
4$ X4$ ! , (       d  f       N= f)zdProfiles a PyTorch model, returning total operations, parameters, and optionally layer-wise details.NTr9   c                   > U R                  S[        R                  " S[        R                  S95        U R                  S[        R                  " S[        R                  S95        [	        U 5      nSnUT;   a/  TU   nUT;  a#  T(       a  [        SUR                   SU S35        OYU[        ;   a3  [        U   nUT;  a#  T(       a  [        S	UR                   S
U S35        OUT;  a  T(       a  [        SU S35        Ub)  U R                  U5      U R                  [        5      4TU '   TR                  U5        g)zTRegisters hooks to a neural network module to track total operations and parameters.r   r   r   r   Nr    r!   r"   r#   r$   r%   r&   )r,   r	   r-   float64r2   r3   r4   r5   r   r6   r   r8   )r9   r;   r<   r>   r?   r@   rA   rB   s      rC   rD   profile.<locals>.add_hooks   s$   	+u{{1EMM'JK	.%++au}}*MN
 aZF#B--'.r.?s6(!LM~%'B--'((9JK--.4VH<def>''+''(89%q! 	V$rF   modulereturnc                   > U R                   R                  5       Sp20 nU R                  5        H  u  pV0 nUT;   ac  [        U[        R
                  [        R                  45      (       d4  UR                   R                  5       UR                  R                  5       pOT
" XaS-   S9u  pnXU4XE'   X(-  nX9-  nM     X#U4$ )zfRecursively counts the total operations and parameters of the given PyTorch module and its submodules.r   	)prefix)r   rM   named_children
isinstancer   
Sequential
ModuleListr   )r[   r_   r   r   ret_dictrU   r9   	next_dictm_opsm_params	dfs_countr?   s             rC   rh   profile.<locals>.dfs_count   s    "("2"2"7"7"91<))+DA
 I&&z!bmmR]]=[/\/\"#++"2"2"4ann6I6I6Kx-6q$-O* I6HKI$L , 00rF   r   r   )r^   )rG   r   ModulerH   rI   rJ   r	   rK   intrN   itemsrO   rQ   rR   )rS   rT   r>   rB   ret_layer_infor@   rD   prev_training_statusr   r   rd   r9   
op_handlerparams_handlerrh   r?   rA   s     `` `        @@@rC   profilerq      s'    u
%RYY % %> !>>	JJL	KK		v 
1")) 1c3Z 1 1( )2%(8%IX 
KK$%+=+C+C+E''J	

{#	

~&	 ,F 00""G 
s   ?E
E)NTF)NTFF)Lthop.rnn_hooksr   r   r   r   r   r   r	   thop.vision.basic_hooksr
   r   r   r   r   r   r   r   r   r   r   r   r   r   utilsr   rY   r.   	ZeroPad2dConv1dConv2dConv3dConvTranspose1dConvTranspose2dConvTranspose3dBatchNorm1dBatchNorm2dBatchNorm3d	LayerNormInstanceNorm1dInstanceNorm2dInstanceNorm3dPReLUSoftmaxReLUReLU6	LeakyReLU	MaxPool1d	MaxPool2d	MaxPool3dAdaptiveMaxPool1dAdaptiveMaxPool2dAdaptiveMaxPool3d	AvgPool1d	AvgPool2d	AvgPool3dAdaptiveAvgPool1dAdaptiveAvgPool2dAdaptiveAvgPool3dLinearDropoutUpsampleUpsamplingBilinear2dUpsamplingNearest2dRNNCellGRUCellLSTMCellRNNGRULSTMrb   PixelShuffleSyncBatchNormr5   rV   rj   rq    rF   rC   <module>r      s       " .LL(.II|. II|. II|	.
 . . . NN'. NN'. NN'. LL%. *. *. *. HHk.  JJ!." GGX#.$ HHh%.& LL*'.( LL().* LL(+., LL(-.. (/.0 (1.2 (3.4 LL-5.6 LL-7.8 LL-9.: ,;.< ,=.> ,?.@ II|A.B JJC.D KKE.F ^NJJJJKKFFIFFIGGZMM8OOX)[.bN#h X#99X#rF   