
    NgH\                        d Z ddlmZmZ ddlZddlmZ ddlmc mZ	 ddl
mZmZ ddlmZmZmZ ddlmZ ddlmZmZ dd	lmZ d
gZ G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z  G d dej                  Z! G d dej                  Z" G d d
ej                  Z# e$dg dg d g d!g d"g d#d$dg d%g d&g d'g d(g d)d$dg d*g d+g d,g d-g d.d$d/d0d0gg d1g d2g d3g d4d$d/d5d6gg d7g d8g d9g d:d$d/d5d6gg d;g d<g d=g d>d$d/d5d6gg d?g d@g dAg dBd$d/d6dCgg dDg dEg dFg dGd$d/d6dHgg dIg dJg dKg dLd$d/dCdMgg dNg dOg dPg dQd$R
  
        Z%dxdTZ&dydVZ' ei dW e'dXdYZ          d[ e'dXdYZ          d\ e'dXdYZ          d] e'dXdYZ          d^ e'dXdYZ          d_ e'dY`          da e'dY`          db e'dY`          dc e'dY`          dd e'dY`          de e'dY`          df e'dY`          dg e'dY`          dh e'dY`          di e'dY`          dj e'dY`          dk e'dY`           e'dY`           e'dY`          dl          Z(edxdme#fdn            Z)edxdme#fdo            Z*edxdme#fdp            Z+edxdme#fdq            Z,edxdme#fdr            Z-edxdme#fds            Z.edxdme#fdt            Z/edxdme#fdu            Z0edxdme#fdv            Z1edxdme#fdw            Z2dS )za   PP-HGNet (V1 & V2)

Reference:
https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/zh_CN/models/ImageNet1k/PP-HGNetV2.md
The Paddle Implement of PP-HGNet (https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/docs/en/models/PP-HGNet_en.md)
PP-HGNet: https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/ppcls/arch/backbone/legendary_models/pp_hgnet.py
PP-HGNetv2: https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/ppcls/arch/backbone/legendary_models/pp_hgnet_v2.py
    )DictOptionalNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dDropPathcreate_conv2d   )build_model_with_cfg)register_modelgenerate_default_cfgs)checkpoint_seqHighPerfGpuNetc                   *     e Zd Z	 	 d fd	Zd Z xZS )LearnableAffineBlock      ?        c                     t                                                       t          j        t	          j        |g          d          | _        t          j        t	          j        |g          d          | _        d S )NT)requires_grad)super__init__nn	Parametertorchtensorscalebias)selfscale_value
bias_value	__class__s      M/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/hgnet.pyr   zLearnableAffineBlock.__init__   sc    
 	\%,}"="=TRRR
Lzl!;!;4PPP			    c                 &    | j         |z  | j        z   S N)r   r   r   xs     r#   forwardzLearnableAffineBlock.forward"   s    zA~	))r$   )r   r   __name__
__module____qualname__r   r)   __classcell__r"   s   @r#   r   r      sZ         Q Q Q Q Q Q* * * * * * *r$   r   c                   0     e Zd Z	 	 	 	 	 d fd	Zd Z xZS )	ConvBNActr    TFc	                    t                                                       || _        || _        t	          ||||||          | _        t          j        |          | _        | j        rt          j	                    | _
        nt          j                    | _
        | j        r| j        rt                      | _        d S t          j                    | _        d S )N)stridepaddinggroups)r   r   use_actuse_labr
   convr   BatchNorm2dbnReLUactIdentityr   lab)
r   in_chsout_chskernel_sizer4   r6   r5   r7   r8   r"   s
            r#   r   zConvBNAct.__init__'   s     	!
 
 
	 .))< 	%wyyDHH{}}DH< 	%DL 	%+--DHHH{}}DHHHr$   c                     |                      |          }|                     |          }|                     |          }|                     |          }|S r&   )r9   r;   r=   r?   r'   s     r#   r)   zConvBNAct.forwardG   sC    IIaLLGGAJJHHQKKHHQKKr$   )r   r   r2   TFr*   r/   s   @r#   r1   r1   &   s^         % % % % % %@      r$   r1   c                   *     e Zd Z	 	 d fd	Zd Z xZS )LightConvBNActr   Fc                     t                                                       t          ||dd|          | _        t          ||||d|          | _        d S )Nr   F)rB   r7   r8   T)rB   r6   r7   r8   )r   r   r1   conv1conv2)r   r@   rA   rB   r6   r8   r"   s         r#   r   zLightConvBNAct.__init__P   sn     	
 
 

 #
 
 



r$   c                 Z    |                      |          }|                     |          }|S r&   )rG   rH   r'   s     r#   r)   zLightConvBNAct.forwardi   s%    JJqMMJJqMMr$   )r   Fr*   r/   s   @r#   rE   rE   O   sT         
 
 
 
 
 
2      r$   rE   c                   $     e Zd Z fdZd Z xZS )	EseModulec                     t                                                       t          j        ||ddd          | _        t          j                    | _        d S )Nr   r   rB   r4   r5   )r   r   r   Conv2dr9   Sigmoidsigmoid)r   chsr"   s     r#   r   zEseModule.__init__p   sS    I
 
 
	 z||r$   c                     |}|                     dd          }|                     |          }|                     |          }t          j        ||          S )N)      T)keepdim)meanr9   rP   r   mul)r   r(   identitys      r#   r)   zEseModule.forward{   sL    FF64F((IIaLLLLOOy1%%%r$   r*   r/   s   @r#   rK   rK   o   sG        	$ 	$ 	$ 	$ 	$& & & & & & &r$   rK   c                   $     e Zd Z fdZd Z xZS )StemV1c                     t                                                       t          j        fdt	          t                    dz
            D              | _        t          j        ddd          | _        d S )Nc           	      d    g | ],}t          |         |d z            d|dk    rdnd           -S )r   rT   r   rS   )rB   r4   )r1   ).0istem_chss     r#   
<listcomp>z#StemV1.__init__.<locals>.<listcomp>   s^     $
 $
 $

 01	 QFFqq	+ + +$
 $
 $
r$   r   rT   rS   rM   )	r   r   r   
Sequentialrangelenstem	MaxPool2dpool)r   r_   r"   s    `r#   r   zStemV1.__init__   s    M $
 $
 $
 $

 5:H!5# 5#$
 $
 $
 	 LQq!DDD			r$   c                 Z    |                      |          }|                     |          }|S r&   )rd   rf   r'   s     r#   r)   zStemV1.forward   s%    IIaLLIIaLLr$   r*   r/   s   @r#   rZ   rZ      sL        
E 
E 
E 
E 
E      r$   rZ   c                   &     e Zd Zd fd	Zd Z xZS )StemV2Fc                    t                                                       t          ||dd|          | _        t          ||dz  dd|          | _        t          |dz  |dd|          | _        t          |dz  |dd|          | _        t          ||dd|          | _        t          j	        ddd          | _
        d S )NrT   rS   rB   r4   r8   r   T)rB   r4   	ceil_mode)r   r   r1   stem1stem2astem2bstem3stem4r   re   rf   )r   r@   mid_chsrA   r8   r"   s        r#   r   zStemV2.__init__   s   
 
 

  qL
 
 
  qL
 
 
 aK
 
 

 
 
 

 LQqDIII			r$   c                    |                      |          }t          j        |d          }|                     |          }t          j        |d          }|                     |          }|                     |          }t          j        ||gd          }|                     |          }| 	                    |          }|S )N)r   r   r   r   r   dim)
rm   Fpadrn   ro   rf   r   catrp   rq   )r   r(   x2x1s       r#   r)   zStemV2.forward   s    JJqMME!\""[[^^U2|$$[[__YYq\\Ir2hA&&&JJqMMJJqMMr$   Fr*   r/   s   @r#   ri   ri      sS        %J %J %J %J %J %JN
 
 
 
 
 
 
r$   ri   c                   2     e Zd Z	 	 	 	 	 	 d fd	Zd Z xZS )HighPerfGpuBlockrT   Feser   c           
         t                                                       || _        t          j                    | _        t          |          D ]l}|r4| j                            t          |dk    r|n||||                     8| j                            t          |dk    r|n|||d|                     m|||z  z   }|	dk    rIt          ||dz  dd|          }t          |dz  |dd|          }t          j
        ||          | _        n=t          ||dd|          }t          |          }t          j
        ||          | _        |
rt          |
          nt          j                    | _        d S )Nr   )rB   r8   r   rk   serS   )r   r   residualr   
ModuleListlayersrb   appendrE   r1   ra   aggregationrK   r	   r>   	drop_path)r   r@   rr   rA   	layer_numrB   r   light_blockr8   aggr   r^   	total_chsaggregation_squeeze_convaggregation_excitation_convaggregation_convattr"   s                    r#   r   zHighPerfGpuBlock.__init__   s    	 mooy!! 	 	A """"#q&&g$/ '	      """#q&&g$/  '      Y00	$;;'01( ( ($ +41+ + +'  "}(+   D
  )      G$$C!}    D
 1:L),,,r{}}r$   c                     |}|g}| j         D ]"} ||          }|                    |           #t          j        |d          }|                     |          }| j        r|                     |          |z   }|S )Nr   rt   )r   r   r   rx   r   r   r   )r   r(   rX   outputlayers        r#   r)   zHighPerfGpuBlock.forward  s    [ 	 	EaAMM!If!$$$Q= 	-q!!H,Ar$   )rT   FFFr~   r   r*   r/   s   @r#   r}   r}      sm         IM IM IM IM IM IMV
 
 
 
 
 
 
r$   r}   c                   4     e Zd Z	 	 	 	 	 	 	 d	 fd	Zd Z xZS )
HighPerfGpuStageTrS   FrT   r~   r   c                    t                                                       || _        |rt          ||d||d|
          | _        nt	          j                    | _        g }t          |          D ]b}|                    t          |dk    r|n|||||dk    rdnd|	||
|t          |t          t          f          r||         n|
  
                   ct	          j        | | _        d| _        d S )NrT   F)rB   r4   r6   r7   r8   r   T)r   rB   r   r8   r   r   )r   r   
downsampler1   r   r>   rb   r   r}   
isinstancelisttuplera   blocksgrad_checkpointing)r   r@   rr   rA   	block_numr   r   r4   r   rB   r8   r   r   blocks_listr^   r"   s                  r#   r   zHighPerfGpuStage.__init__'  s!    	$ 	,'  DOO !kmmDOy!! 	 	A 1ffFF'&'1ffUU$ + +#.8T5M.R.RaillXa      m[1!&r$   c                     |                      |          }| j        r6t          j                                        st          | j        |d          }n|                     |          }|S )NF)flatten)r   r   r   jitis_scriptingr   r   r'   s     r#   r)   zHighPerfGpuStage.forwardX  s_    OOA" 	59+A+A+C+C 	t{Au===AAAAr$   )TrS   FrT   Fr~   r   r*   r/   s   @r#   r   r   &  sd         /' /' /' /' /' /'b      r$   r   c                   z     e Zd Z	 	 	 	 ddedededed	ee         d
ef fdZddedee         fdZ	ddefdZ
 xZS )ClassifierHeadavgr      Fin_featuresnum_classes	pool_type	drop_ratehidden_sizer8   c                    t          t          |                                            || _        ||s|dk    s
J d            t	          |          | _        |{|| _        t          j        ||dddd          }t          j                    }|r*t                      }	t          j
        |||	          | _        n3t          j
        ||          | _        nt          j                    | _        t          j        |          | _        |rt          j        d          nt          j                    | _        |dk    rt          j        | j        |          nt          j                    | _        d S )Nr   6Classifier head must be removed if pooling is disabledr   r   F)rB   r4   r5   r   )r   r   r   num_featuresr   global_poolr   rN   r<   r   ra   	last_convr>   DropoutdropoutFlattenr   Linearfc)r   r   r   r   r   r   r8   r   r=   r?   r"   s             r#   r   zClassifierHead.__init__b  sT    	nd##,,...'  b"a''')a'''/)DDD" +D	  I '))C ?*,,!#y#s!C!C!#y#!>!>[]]DNz),,(1Drz!}}}r{}}?JQ")D-{;;;TVT_TaTar$   Nc                 $   |U|s|dk    s
J d            t          |          | _        |rt          j        d          nt          j                    | _        |dk    rt          j        | j        |          nt          j                    | _        d S )Nr   r   r   r   )	r   r   r   r   r>   r   r   r   r   )r   r   r   s      r#   resetzClassifierHead.reset  s      b"a''')a'''3iHHHD,5H2:a===2;==DL?JQ")D-{;;;TVT_TaTar$   
pre_logitsc                     |                      |          }|                     |          }|                     |          }|                     |          }|r|S |                     |          }|S r&   )r   r   r   r   r   r   r(   r   s      r#   r)   zClassifierHead.forward  se    QNN1LLOOLLOO 	HGGAJJr$   )r   r   r   Fr&   r{   )r+   r,   r-   intstrfloatr   boolr   r   r)   r.   r/   s   @r#   r   r   a  s        
 #!)-!%b %b%b %b 	%b
 %b "#%b %b %b %b %b %b %bNb b b# b b b b T        r$   r   c                   &    e Zd Z	 	 	 	 	 	 	 ddeded	ed
edee         dededef fdZ	e
j        j        dd            Ze
j        j        dd            Ze
j        j        dej        fd            Zdd	ed
ee         fdZd ZddefdZd Z xZS )r   rT     r   r   r   Fcfgin_chansr   r   head_hidden_sizer   drop_path_rater8   c	                    t          t          |                                            |d         }
|d         }|d         |d         |d         |d         g}|| _        || _        || _        |
dv sJ |
dk    r%t          ||d	         |d
         |          | _        nt          |g|z             | _        d}g }g | _	        d |D             }d t          j        d	|t          |                                        |          D             }t          |          D ]s\  }}|\  }}}}}}}}|t          ||||||||||
dk    rdnd||                   gz  }|| _        |r|dz  }| xj	        t#          | j        |d|           gz  c_	        tt%          j        | | _        t+          | j        |||||          | _        | j        j        | _        |                                 D ]\  }}t3          |t$          j                  r(t$          j                            |j        dd           Gt3          |t$          j                  rIt$          j                            |j                   t$          j                             |j!                   t3          |t$          j"                  r$t$          j                             |j!                   d S )N	stem_typer_   stage1stage2stage3stage4)v1v2r   r   r   )r@   rr   rA   r8      c                     g | ]
}|d          S )rT    )r]   cs     r#   r`   z+HighPerfGpuNet.__init__.<locals>.<listcomp>  s    111!111r$   c                 6    g | ]}|                                 S r   )tolist)r]   r(   s     r#   r`   z+HighPerfGpuNet.__init__.<locals>.<listcomp>  s     lllaqxxzzlllr$   r   r~   r   )r@   rr   rA   r   r   r   r   rB   r8   r   r   rS   zstages.)num_chs	reductionmodule)r   r   r   r   r8   fan_outrelu)modenonlinearity)#r   r   r   r   r   r8   ri   rd   rZ   feature_infor   linspacesumsplit	enumerater   r   dictr   ra   stagesr   headr   named_modulesr   rN   initkaiming_normal_weightr:   ones_zeros_r   r   )r   r   r   r   r   r   r   r   r8   kwargsr   r_   
stages_cfgcurrent_strider   block_depthsdprr^   stage_configr@   rr   rA   r   r   r   rB   r   nmr"   s                                r#   r   zHighPerfGpuNet.__init__  s    	nd##,,...$	z?(mS]CM3x=Q
&"L((((  	! ! !DII zH455DI11j111ll5>!^SEVEV#W#W#]#]^j#k#klll(44 	s 	sOA|co`FGWi[+W`'##%''&$..EEDa&    F !(D $!#$t/@Ncpmncpcp"q"q"q!rrmV,"#!(
 
 
	 !%	 6&&(( 	' 	'DAq!RY'' '''yv'VVVVAr~.. 'ah'''qv&&&&Ary)) 'qv&&&	' 	'r$   c                 ,    t          d|rdnd          S )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))rd   r   )r   )r   coarses     r#   group_matcherzHighPerfGpuNet.group_matcher  s+    (.S$$4S
 
 
 	
r$   Tc                 (    | j         D ]	}||_        
d S r&   )r   r   )r   enabless      r#   set_grad_checkpointingz%HighPerfGpuNet.set_grad_checkpointing  s(     	* 	*A#)A  	* 	*r$   returnc                     | j         j        S r&   )r   r   )r   s    r#   get_classifierzHighPerfGpuNet.get_classifier  s    y|r$   Nc                 J    || _         | j                            ||           d S r&   )r   r   r   )r   r   r   s      r#   reset_classifierzHighPerfGpuNet.reset_classifier  s&    &	[11111r$   c                 V    |                      |          }|                     |          S r&   )rd   r   r'   s     r#   forward_featureszHighPerfGpuNet.forward_features  s!    IIaLL{{1~~r$   r   c                 ^    |r|                      ||          n|                      |          S )N)r   )r   r   s      r#   forward_headzHighPerfGpuNet.forward_head  s-    6@Rtyyzy222diiPQllRr$   c                 Z    |                      |          }|                     |          }|S r&   )r   r   r'   s     r#   r)   zHighPerfGpuNet.forward  s-    !!!$$a  r$   )rT   r   r   r   r   r   Fr{   )Tr&   )r+   r,   r-   r   r   r   r   r   r   r   r   r   ignorer   r   r   Moduler   r   r   r   r)   r.   r/   s   @r#   r   r     s       
 #$.2!$&!J' J'J' J' 	J'
 J' 'smJ' J' "J' J' J' J' J' J' J'X Y
 
 
 
 Y* * * * Y	    2 2C 2hsm 2 2 2 2  S S$ S S S S      r$   r   )0   r  `   )r  r     r   FFrT      )r       r   TFrT   r  )r        rS   TFrT   r  )r	        r   TFrT   r  )r   r_   r   r   r   r   )@   r  r  )r  r     r   FFrT      )r  r  r	  r   TFrT   r  )r	  r
  r  rS   TFrT   r  )r  r     r   TFrT   r  )r  r  r  )r  r
  @  r   FFrT      )r  r    rS   TFrT   r  )r  r    rT   TFrT   r  )r     i   rS   TFrT   r  r      )r  r  r  r   FFrT   rT   )r      r  r   TFrT   rT   )r  r  r	  rS   TTr  rT   )r	  r  r  r   TTr  rT      r  )r  r  r  r   FFrT   rT   )r  r  r  r   TFrT   rT   )r  r  r	  rS   TTr  rT   )r	  r
  r  r   TTr  rT   )r  r  r  r   FFrT   r   )r  r    r   TFrT   r   )r  r  r  rT   TTr  r   )r  r  i   r   TTr  r   )r  r  r  r   FFrT   r  )r  r  r	  r   TFrT   r  )r	  r  r  rT   TTr  r  )r  r  r   r   TTr  r  r  )r  r  r  r   FFrT   r  )r  r  r	  r   TFrT   r  )r	  r
  r  rT   TTr  r  )r  r  r   r   TTr  r  r  )r  r  r  r   FFrT   r  )r  r  r	  rS   TFrT   r  )r	  r  r  r  TTr  r  )r  r	  r   rS   TTr  r  r  )r  r  r
  rS   FFrT   r  )r
  r
  r	  rT   TFrT   r  )r	  r  r  r  TTr  r  )r  r  r   rT   TTr  r  )

hgnet_tinyhgnet_small
hgnet_base
hgnetv2_b0
hgnetv2_b1
hgnetv2_b2
hgnetv2_b3
hgnetv2_b4
hgnetv2_b5
hgnetv2_b6Fc                     |                     dd          }t          t          | |ft          |          t	          d|          d|S )Nout_indices)r   r   rS   rT   T)flatten_sequentialr$  )	model_cfgfeature_cfg)popr   r   
model_cfgsr   )variant
pretrainedr   r$  s       r#   _create_hgnetr,  l  s^    **]L99K W%DkJJJ    r$   r2   c                 8    | dddddt           t          dddd	d
|S )Nr   )rT   r  r  )r  r  gzG?bicubiczhead.fczstem.stem1.convr   )rT   r  r  )urlr   
input_size	pool_sizecrop_pctinterpolationrV   std
classifier
first_convtest_crop_pcttest_input_sizer   )r/  r   s     r#   _cfgr9  x  s;    =vI%.B/@   r$   zhgnet_tiny.paddle_in1kzstem.stem.0.convztimm/)r6  	hf_hub_idzhgnet_tiny.ssld_in1kzhgnet_small.paddle_in1kzhgnet_small.ssld_in1kzhgnet_base.ssld_in1kzhgnetv2_b0.ssld_stage2_ft_in1k)r:  z!hgnetv2_b0.ssld_stage1_in22k_in1kzhgnetv2_b1.ssld_stage2_ft_in1kz!hgnetv2_b1.ssld_stage1_in22k_in1kzhgnetv2_b2.ssld_stage2_ft_in1kz!hgnetv2_b2.ssld_stage1_in22k_in1kzhgnetv2_b3.ssld_stage2_ft_in1kz!hgnetv2_b3.ssld_stage1_in22k_in1kzhgnetv2_b4.ssld_stage2_ft_in1kz!hgnetv2_b4.ssld_stage1_in22k_in1kzhgnetv2_b5.ssld_stage2_ft_in1kz!hgnetv2_b5.ssld_stage1_in22k_in1k)zhgnetv2_b6.ssld_stage2_ft_in1kz!hgnetv2_b6.ssld_stage1_in22k_in1kr   c                     t          dd| i|S )Nr  r+  )r  r,  r+  r   s     r#   r  r        GG*GGGGr$   c                     t          dd| i|S )Nr  r+  )r  r<  r=  s     r#   r  r    s    HH:HHHHr$   c                     t          dd| i|S )Nr  r+  )r  r<  r=  s     r#   r  r    r>  r$   c                      t          d| dd|S )Nr  Tr+  r8   )r  r<  r=  s     r#   r  r        U*dUUfUUUr$   c                      t          d| dd|S )Nr  TrB  )r  r<  r=  s     r#   r  r    rC  r$   c                      t          d| dd|S )Nr  TrB  )r  r<  r=  s     r#   r  r    rC  r$   c                      t          d| dd|S )Nr  TrB  )r  r<  r=  s     r#   r  r    rC  r$   c                     t          dd| i|S )Nr   r+  )r   r<  r=  s     r#   r   r     r>  r$   c                     t          dd| i|S )Nr!  r+  )r!  r<  r=  s     r#   r!  r!    r>  r$   c                     t          dd| i|S )Nr"  r+  )r"  r<  r=  s     r#   r"  r"    r>  r$   r{   )r2   )3__doc__typingr   r   r   torch.nnr   torch.nn.functional
functionalrv   	timm.datar   r   timm.layersr   r	   r
   _builderr   	_registryr   r   _manipulater   __all__r  r   r1   rE   rK   rZ   ri   r}   r   r   r   r   r)  r,  r9  default_cfgsr  r  r  r  r  r  r  r   r!  r"  r   r$   r#   <module>rV     s	    " ! ! ! ! ! ! !                 A A A A A A A A E E E E E E E E E E * * * * * * < < < < < < < < ' ' ' ' ' '
* * * * *29 * * *& & & & &	 & & &R    RY   @& & & & &	 & & &(    RY   (3 3 3 3 3RY 3 3 3lV V V V Vry V V Vr8 8 8 8 8ry 8 8 8v9 9 9 9 9RY 9 9 9xl l l l lRY l l l^ T  LL666777777777  !MM888777777888  !MM888777777888  H555555555777  H555555555777  H555555666777  H666666777888  H666666777888  H666777777888  H666777777888 i] ] ]
@	 	 	 		 	 	 	 %$ ,&dd%  ,& DD%  	,& tt%     ,& TT%  ,& DD%  ,&  %dd' ' '!,&$ (* * *%,&( %dd' ' '),&, (* * *-,&0 %dd' ' '1,&4 (* * *5,&8 %dd' ' '9,&< (* * *=,&@ %dd' ' 'A,&D (* * *E,&H %dd' ' 'I,&L (* * *M,&P '+d' ' ')-* * *U,& ,& ,& , ,^ H Hn H H H H I I~ I I I I H Hn H H H H V Vn V V V V V Vn V V V V V Vn V V V V V Vn V V V V H Hn H H H H H Hn H H H H H Hn H H H H H Hr$   