Ë
    éÓ^jºÀ  ã                   óø  — d Z ddlZddlmZmZmZmZmZmZ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mZmZmZ ddlmZ ddlmZ dd	lm Z  dd
l!m"Z"m#Z# dgZ$ G d„ dejJ                  «      Z& G d„ dejJ                  «      Z' G d„ dejJ                  «      Z( G d„ dejJ                  «      Z) G d„ dejJ                  «      Z* G d„ dejJ                  «      Z+de,dedejJ                  fd„Z-dYdee.df   de/de.dee.e.e.e.f   fd „Z0 G d!„ d"ejJ                  «      Z1 G d#„ d$ejJ                  «      Z2	 	 	 	 	 	 	 	 	 	 dZd%ed&e.d'e.d(ee.   d)e.d*e.d+e.d,e.d-e/d.e3d/e/d0e/dedejh                  fd1„Z5	 	 	 	 d[d%ed&e.d'e.d(ee.   d)e.d-e/d.e3d/e/d0e/dedejh                  fd2„Z6 G d3„ dejJ                  «      Z7d\d4e,d5e3dede7fd6„Z8d]d7e,dedee,ef   fd8„Z9 e# e9d9d:d;¬<«       e9d9d=d>d?¬@«       e9d9dAd;¬<«       e9d9dBd>d?¬@«       e9d9dCd;¬<«       e9d9dDd>dE¬@«       e9d9dFd;¬<«       e9d9dGdHdE¬@«       e9d9dId;¬<«       e9d9dJdHdE¬@«       e9d9dKdHdL¬@«      dMœ«      Z:e"d\d5e3dede7fdN„«       Z;e"d\d5e3dede7fdO„«       Z<e"d\d5e3dede7fdP„«       Z=e"d\d5e3dede7fdQ„«       Z>e"d\d5e3dede7fdR„«       Z?e"d\d5e3dede7fdS„«       Z@e"d\d5e3dede7fdT„«       ZAe"d\d5e3dede7fdU„«       ZBe"d\d5e3dede7fdV„«       ZCe"d\d5e3dede7fdW„«       ZDe"d\d5e3dede7fdX„«       ZEy)^a5   Vision OutLOoker (VOLO) implementation

Paper: `VOLO: Vision Outlooker for Visual Recognition` - https://arxiv.org/abs/2106.13112

Code adapted from official impl at https://github.com/sail-sg/volo, original copyright in comment below

Modifications and additions for timm by / Copyright 2022, Ross Wightman
é    N)ÚAnyÚCallableÚDictÚListÚOptionalÚTupleÚUnionÚType©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚDropPathÚMlpÚ	to_2tupleÚ	to_ntupleÚtrunc_normal_Úuse_fused_attné   )Úbuild_model_with_cfg)Úfeature_take_indices)Ú
checkpoint)Úregister_modelÚgenerate_default_cfgsÚVOLOc                   óŽ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 ddededededededed	efˆ fd
„Zdej                  dej                  fd„Z
ˆ xZS )ÚOutlookAttentionz,Outlook attention mechanism for VOLO models.ÚdimÚ	num_headsÚkernel_sizeÚpaddingÚstrideÚqkv_biasÚ	attn_dropÚ	proj_dropc                 ó  •— |	|
dœ}t         ‰| �  «        ||z  }|| _        || _        || _        || _        |dz  | _        t        j                  ||fd|i|¤Ž| _	        t        j                  ||dz  |z  fi |¤Ž| _
        t        j                  |«      | _        t        j                  ||fi |¤Ž| _        t        j                  |«      | _        t        j                  |||¬«      | _        t        j"                  ||d¬«      | _        y)	aÙ  Initialize OutlookAttention.

        Args:
            dim: Input feature dimension.
            num_heads: Number of attention heads.
            kernel_size: Kernel size for attention computation.
            padding: Padding for attention computation.
            stride: Stride for attention computation.
            qkv_bias: Whether to use bias in linear layers.
            attn_drop: Attention dropout rate.
            proj_drop: Projection dropout rate.
        ©ÚdeviceÚdtypeç      à¿Úbiasé   )r   r    r!   T)r   r!   Ú	ceil_modeN)ÚsuperÚ__init__r   r   r    r!   ÚscaleÚnnÚLinearÚvÚattnÚDropoutr#   Úprojr$   ÚUnfoldÚunfoldÚ	AvgPool2dÚpool)Úselfr   r   r   r    r!   r"   r#   r$   r'   r(   ÚddÚhead_dimÚ	__class__s                €ú[/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/volo.pyr.   zOutlookAttention.__init__*   sê   ø€ ð2 ¨Ñ/ˆÜ‰ÑÔØ˜)Ñ#ˆØ"ˆŒØ&ˆÔØˆŒØˆŒØ Ñ%ˆŒ
ä—‘˜3 Ñ9¨(Ð9°bÑ9ˆŒÜ—I‘I˜c ;°!Ñ#3°iÑ#?ÑFÀ2ÑFˆŒ	äŸ™ IÓ.ˆŒÜ—I‘I˜c 3Ñ-¨"Ñ-ˆŒ	ÜŸ™ IÓ.ˆŒä—i‘i¨KÀÐQWÔXˆŒÜ—L‘L¨V¸FÈdÔSˆ�	ó    ÚxÚreturnc                 óà  — |j                   \  }}}}| j                  |«      j                  dddd«      }t        j                  || j
                  z  «      t        j                  || j
                  z  «      }}| j                  |«      j                  || j                  || j                  z  | j                  | j                  z  ||z  «      j                  ddddd«      }| j                  |j                  dddd«      «      j                  dddd«      }	| j                  |	«      j                  |||z  | j                  | j                  | j                  z  | j                  | j                  z  «      j                  ddddd«      }	|	| j                  z  }	|	j                  d¬«      }	| j                  |	«      }	|	|z  j                  ddddd«      j                  ||| j                  z  | j                  z  ||z  «      }t        j                   |||f| j                  | j"                  | j
                  ¬«      }| j%                  |j                  dddd«      «      }| j'                  |«      }|S )	ú›Forward pass.

        Args:
            x: Input tensor of shape (B, H, W, C).

        Returns:
            Output tensor of shape (B, H, W, C).
        r   é   r   é   r+   éÿÿÿÿ©r   )Úoutput_sizer   r    r!   )Úshaper2   ÚpermuteÚmathÚceilr!   r7   Úreshaper   r   r9   r3   r/   Úsoftmaxr#   ÚFÚfoldr    r5   r$   )
r:   r@   ÚBÚHÚWÚCr2   ÚhÚwr3   s
             r>   ÚforwardzOutlookAttention.forwardV   s!  € ð —W‘W‰
ˆˆ1ˆa�à�F‰F�1‹I×Ñ˜a  A qÓ)ˆä�y‰y˜˜TŸ[™[™Ó)¬4¯9©9°Q¸¿¹±_Ó+Eˆ1ˆØ�K‰K˜‹N×"Ñ"Øˆt�~‰~˜q D§N¡NÑ2Ø×Ñ˜t×/Ñ/Ñ/°°Q±ó8ç8?¹ÀÀ1ÀaÈÈAÓ8Nð 	
ð �y‰y˜Ÿ™ 1 a¨¨AÓ.Ó/×7Ñ7¸¸1¸aÀÓCˆØ�y‰y˜‹×&Ñ&Øˆq�1‰u�d—n‘n d×&6Ñ&6¸×9IÑ9IÑ&IØ×Ñ˜t×/Ñ/Ñ/ó1ç18±¸¸A¸qÀ!ÀQÓ1Gð 	ð �d—j‘jÑ ˆØ�|‰| ˆ|Ó#ˆØ�~‰~˜dÓ#ˆà�A‰X×Ñ˜q ! Q¨¨1Ó-×5Ñ5°a¸¸T×=MÑ=MÑ9MÐPT×P`ÑP`Ñ9`ÐbcÐfgÑbgÓhˆÜ�F‰F�1 1 a &°d×6FÑ6FÐPT×P\ÑP\Ðei×epÑepÔqˆà�I‰I�a—i‘i  1 a¨Ó+Ó,ˆØ�N‰N˜1Óˆàˆr?   )rD   r   r   Fç        rX   NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚboolÚfloatr.   ÚtorchÚTensorrW   Ú__classcell__©r=   s   @r>   r   r   '   s˜   ø„ Ù6ð  !ØØØ"Ø!Ø!ØØñ*Tàð*Tð ð*Tð ð	*Tð
 ð*Tð ð*Tð ð*Tð ð*Tð õ*TðX ˜Ÿ™ð  ¨%¯,©,÷  r?   r   c                   óú   ‡ — e Zd ZdZdddddej
                  ej                  dddf
deded	ed
ededededede	ej                     de	ej                     defˆ fd„Zdej                  dej                  fd„Zˆ xZS )Ú	Outlookerz9Outlooker block that combines outlook attention with MLP.r   ç      @rX   FNr   r   r    r!   r   Ú	mlp_ratior#   Ú	drop_pathÚ	act_layerÚ
norm_layerr"   c           	      ó„  •— ||dœ}t         ‰| �  «         |
|fi |¤Ž| _        t        ||f|||||dœ|¤Ž| _        |dkD  rt        |«      nt        j                  «       | _         |
|fi |¤Ž| _	        t        d|t        ||z  «      |	dœ|¤Ž| _        |dkD  rt        |«      | _        yt        j                  «       | _        y)af  Initialize Outlooker block.

        Args:
            dim: Input feature dimension.
            kernel_size: Kernel size for outlook attention.
            padding: Padding for outlook attention.
            stride: Stride for outlook attention.
            num_heads: Number of attention heads.
            mlp_ratio: Ratio for MLP hidden dimension.
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth drop rate.
            act_layer: Activation layer type.
            norm_layer: Normalization layer type.
            qkv_bias: Whether to use bias in linear layers.
        r&   )r   r    r!   r"   r#   rX   ©Úin_featuresÚhidden_featuresri   N© )r-   r.   Únorm1r   r3   r   r0   ÚIdentityÚ
drop_path1Únorm2r   r]   ÚmlpÚ
drop_path2)r:   r   r   r    r!   r   rg   r#   rh   ri   rj   r"   r'   r(   r;   r=   s                  €r>   r.   zOutlooker.__init__|   s×   ø€ ð> ¨Ñ/ˆÜ‰ÑÔÙ Ñ* rÑ*ˆŒ
Ü$ØØð	
ð $ØØØØñ	
ð ñ	
ˆŒ	ð 2;¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
Üð 
ØÜ  i¡Ó0Øñ
ð ñ	
ˆŒð 2;¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�r?   r@   rA   c                 óÎ   — || j                  | j                  | j                  |«      «      «      z   }|| j                  | j	                  | j                  |«      «      «      z   }|S ©zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        ©rr   r3   rp   ru   rt   rs   ©r:   r@   s     r>   rW   zOutlooker.forward³   óQ   € ð �—‘ §	¡	¨$¯*©*°Q«-Ó 8Ó9Ñ9ˆØ�—‘ §¡¨¯©°A«Ó 7Ó8Ñ8ˆØˆr?   )rY   rZ   r[   r\   r0   ÚGELUÚ	LayerNormr]   r_   r
   ÚModuler^   r.   r`   ra   rW   rb   rc   s   @r>   re   re   y   s×   ø„ ÙCð ØØ!Ø!Ø!Ø)+¯©Ø*,¯,©,Ø"ØØñ5Sàð5Sð ð5Sð ð	5Sð
 ð5Sð ð5Sð ð5Sð ð5Sð ð5Sð ˜BŸI™I‘ð5Sð ˜RŸY™Y™ð5Sð õ5Sðn˜Ÿ™ð ¨%¯,©,÷ r?   re   c                   ó¸   ‡ — e Zd ZU dZej
                  j                  e   ed<   	 	 	 	 	 	 dde	de	dede
de
f
ˆ fd„Zd	ej                  d
ej                  fd„Zˆ xZS )Ú	Attentionz!Multi-head self-attention module.Ú
fused_attnr   r   r"   r#   r$   c                 óX  •— ||dœ}t         ‰
| �  «        || _        ||z  }	|	dz  | _        t	        «       | _        t        j                  ||dz  fd|i|¤Ž| _        t        j                  |«      | _
        t        j                  ||fi |¤Ž| _        t        j                  |«      | _        y)a,  Initialize Attention module.

        Args:
            dim: Input feature dimension.
            num_heads: Number of attention heads.
            qkv_bias: Whether to use bias in QKV projection.
            attn_drop: Attention dropout rate.
            proj_drop: Projection dropout rate.
        r&   r)   rD   r*   N)r-   r.   r   r/   r   r€   r0   r1   Úqkvr4   r#   r5   r$   )r:   r   r   r"   r#   r$   r'   r(   r;   r<   r=   s             €r>   r.   zAttention.__init__Å   s˜   ø€ ð& ¨Ñ/ˆÜ‰ÑÔØ"ˆŒØ˜)Ñ#ˆØ Ñ%ˆŒ
Ü(Ó*ˆŒä—9‘9˜S #¨¡'Ñ?°Ð?¸BÑ?ˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜c 3Ñ-¨"Ñ-ˆŒ	ÜŸ™ IÓ.ˆ�r?   r@   rA   c                 ó¨  — |j                   \  }}}}| j                  |«      j                  |||z  d| j                  || j                  z  «      j	                  ddddd«      }|j                  d«      \  }}}	| j                  r<t        j                  |||	| j                  r| j                  j                  nd¬«      }nL|| j                  z  }||j                  dd	«      z  }
|
j                  d	¬
«      }
| j                  |
«      }
|
|	z  }|j                  dd«      j                  ||||«      }| j                  |«      }| j!                  |«      }|S )rC   rD   rE   r   r   r+   rX   )Ú	dropout_péþÿÿÿrF   rG   )rI   r‚   rM   r   rJ   Úunbindr€   rO   Úscaled_dot_product_attentionÚtrainingr#   Úpr/   Ú	transposerN   r5   r$   )r:   r@   rQ   rR   rS   rT   r‚   ÚqÚkr2   r3   s              r>   rW   zAttention.forwardä   s0  € ð —W‘W‰
ˆˆ1ˆa�à�h‰h�q‹k×!Ñ! ! Q¨¡U¨A¨t¯~©~¸qÀDÇNÁNÑ?RÓS×[Ñ[Ð\]Ð_`ÐbcÐefÐhiÓjˆØ—*‘*˜Q“-‰ˆˆ1ˆaà�?Š?Ü×.Ñ.Ø�1�aØ.2¯mªm˜$Ÿ.™.×*Ò*Àô‰Að
 �D—J‘J‘ˆAØ�q—{‘{ 2 rÓ*Ñ*ˆDØ—<‘< B�<Ó'ˆDØ—>‘> $Ó'ˆDØ�q‘ˆAà�K‰K˜˜1Ó×%Ñ% a¨¨A¨qÓ1ˆØ�I‰I�a‹LˆØ�N‰N˜1Óˆàˆr?   )é   FrX   rX   NN)rY   rZ   r[   r\   r`   ÚjitÚFinalr^   Ú__annotations__r]   r_   r.   ra   rW   rb   rc   s   @r>   r   r   Á   s}   ø… Ù+Ø—	‘	—‘ Ñ%Ó%ð
 Ø"Ø!Ø!ØØñ/àð/ð ð/ð ð	/ð
 ð/ð õ/ð>˜Ÿ™ð ¨%¯,©,÷ r?   r   c                   óê   ‡ — e Zd ZdZddddej
                  ej                  ddfdededed	e	d
edede
ej                     de
ej                     fˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚTransformerz9Transformer block with multi-head self-attention and MLP.ç      @FrX   Nr   r   rg   r"   r#   rh   ri   rj   c                 ó~  •— |	|
dœ}t         ‰| �  «         ||fi |¤Ž| _        t        |f|||dœ|¤Ž| _        |dkD  rt        |«      nt        j                  «       | _         ||fi |¤Ž| _	        t        d|t        ||z  «      |dœ|¤Ž| _        |dkD  rt        |«      | _        yt        j                  «       | _        y)aÇ  Initialize Transformer block.

        Args:
            dim: Input feature dimension.
            num_heads: Number of attention heads.
            mlp_ratio: Ratio for MLP hidden dimension.
            qkv_bias: Whether to use bias in QKV projection.
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth drop rate.
            act_layer: Activation layer type.
            norm_layer: Normalization layer type.
        r&   )r   r"   r#   rX   rl   Nro   )r-   r.   rp   r   r3   r   r0   rq   rr   rs   r   r]   rt   ru   )r:   r   r   rg   r"   r#   rh   ri   rj   r'   r(   r;   r=   s               €r>   r.   zTransformer.__init__  s³   ø€ ð2 ¨Ñ/ˆÜ‰ÑÔÙ Ñ* rÑ*ˆŒ
Ü˜cÐe¨YÀÐU^ÑeÐbdÑeˆŒ	Ø1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
ÜÐh 3¼¸CÀ)¹OÓ8LÐXaÑhÐegÑhˆŒØ1:¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�r?   r@   rA   c                 óÎ   — || j                  | j                  | j                  |«      «      «      z   }|| j                  | j	                  | j                  |«      «      «      z   }|S rw   rx   ry   s     r>   rW   zTransformer.forward+  rz   r?   )rY   rZ   r[   r\   r0   r{   r|   r]   r_   r^   r
   r}   r.   r`   ra   rW   rb   rc   s   @r>   r’   r’     s°   ø„ ÙCð  "Ø"Ø!Ø!Ø)+¯©Ø*,¯,©,ØØñ!Sàð!Sð ð!Sð ð	!Sð
 ð!Sð ð!Sð ð!Sð ˜BŸI™I‘ð!Sð ˜RŸY™Y™õ!SðF˜Ÿ™ð ¨%¯,©,÷ r?   r’   c                   óŠ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 ddededee   dededefˆ fd„Zd	e	j                  d
e	j                  fd„Zˆ xZS )ÚClassAttentionz6Class attention mechanism for class token interaction.r   r   r<   r"   r#   r$   c	                 ó"  •— ||dœ}	t         ‰
| �  «        || _        |�|| _        n||z  }|| _        |dz  | _        t        j                  || j                  | j                  z  dz  fd|i|	¤Ž| _        t        j                  || j                  | j                  z  fd|i|	¤Ž| _        t        j                  |«      | _
        t        j                  | j                  | j                  z  |fi |	¤Ž| _        t        j                  |«      | _        y)a{  Initialize ClassAttention.

        Args:
            dim: Input feature dimension.
            num_heads: Number of attention heads.
            head_dim: Dimension per head. If None, computed as dim // num_heads.
            qkv_bias: Whether to use bias in QKV projection.
            attn_drop: Attention dropout rate.
            proj_drop: Projection dropout rate.
        r&   Nr)   rE   r*   )r-   r.   r   r<   r/   r0   r1   Úkvr‹   r4   r#   r5   r$   )r:   r   r   r<   r"   r#   r$   r'   r(   r;   r=   s             €r>   r.   zClassAttention.__init__<  sè   ø€ ð* ¨Ñ/ˆÜ‰ÑÔØ"ˆŒØÐØ$ˆD�Mà˜iÑ'ˆHØ$ˆDŒMØ Ñ%ˆŒ
ä—)‘)˜C §¡°·±Ñ!?À!Ñ!CÑYÈ(ÐYÐVXÑYˆŒÜ—‘˜3 §¡°·±Ñ >ÑTÀXÐTÐQSÑTˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜dŸm™m¨d¯n©nÑ<¸cÑHÀRÑHˆŒ	ÜŸ™ IÓ.ˆ�r?   r@   rA   c                 ó²  — |j                   \  }}}| j                  |«      j                  ||d| j                  | j                  «      j                  ddddd«      }|j                  d«      \  }}| j                  |dd…dd…dd…f   «      j                  || j                  d| j                  «      | j                  z  }||j                  dd«      z  }	|	j                  d¬	«      }	| j                  |	«      }	|	|z  j                  dd«      j                  |d| j                  | j                  z  «      }
| j                  |
«      }
| j                  |
«      }
|
S )
z»Forward pass.

        Args:
            x: Input tensor of shape (B, N, C) where first token is class token.

        Returns:
            Class token output of shape (B, 1, C).
        rE   r   rD   r   r+   Nr…   rF   rG   )rI   r™   rM   r   r<   rJ   r†   r‹   r/   rŠ   rN   r#   r5   r$   )r:   r@   rQ   ÚNrT   r™   rŒ   r2   r‹   r3   Ú	cls_embeds              r>   rW   zClassAttention.forwarda  s)  € ð —'‘'‰ˆˆ1ˆaà�W‰W�Q‹Z×Ñ  1 a¨¯©¸¿¹ÓG×OÑOÐPQÐSTÐVWÐYZÐ\]Ó^ˆØ�y‰y˜‹|‰ˆˆ1Ø�F‰F�1’Q˜˜˜šA�X‘;Ó×'Ñ'¨¨4¯>©>¸1¸d¿m¹mÓLÈtÏzÉzÑYˆà�1—;‘;˜r 2Ó&Ñ&ˆØ�|‰| ˆ|Ó#ˆØ�~‰~˜dÓ#ˆà˜A‘X×(Ñ(¨¨AÓ.×6Ñ6°q¸!¸T¿]¹]ÈTÏ^É^Ñ=[Ó\ˆ	Ø—I‘I˜iÓ(ˆ	Ø—N‘N 9Ó-ˆ	ØÐr?   )r�   NFrX   rX   NN)rY   rZ   r[   r\   r]   r   r^   r_   r.   r`   ra   rW   rb   rc   s   @r>   r—   r—   9  s|   ø„ Ù@ð
 Ø&*Ø"Ø!Ø!ØØñ#/àð#/ð ð#/ð ˜s‘mð	#/ð
 ð#/ð ð#/ð õ#/ðJ˜Ÿ™ð ¨%¯,©,÷ r?   r—   c                   óü   ‡ — e Zd ZdZddddddej
                  ej                  ddf
dededee   d	e	d
e
de	de	de	deej                     deej                     fˆ fd„Zdej                  dej                  fd„Zˆ xZS )Ú
ClassBlockz3Class block that combines class attention with MLP.Nr“   FrX   r   r   r<   rg   r"   Údropr#   rh   ri   rj   c           	      ó„  •— ||dœ}t         ‰| �  «         |
|fi |¤Ž| _        t        |f|||||dœ|¤Ž| _        |dkD  rt        |«      nt        j                  «       | _         |
|fi |¤Ž| _	        t        d|t        ||z  «      |	|dœ|¤Ž| _        |dkD  rt        |«      | _        yt        j                  «       | _        y)a1  Initialize ClassBlock.

        Args:
            dim: Input feature dimension.
            num_heads: Number of attention heads.
            head_dim: Dimension per head. If None, computed as dim // num_heads.
            mlp_ratio: Ratio for MLP hidden dimension.
            qkv_bias: Whether to use bias in QKV projection.
            drop: Dropout rate.
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth drop rate.
            act_layer: Activation layer type.
            norm_layer: Normalization layer type.
        r&   )r   r<   r"   r#   r$   rX   )rm   rn   ri   rŸ   Nro   )r-   r.   rp   r—   r3   r   r0   rq   rr   rs   r   r]   rt   ru   )r:   r   r   r<   rg   r"   rŸ   r#   rh   ri   rj   r'   r(   r;   r=   s                 €r>   r.   zClassBlock.__init__}  sÕ   ø€ ð: ¨Ñ/ˆÜ‰ÑÔÙ Ñ* rÑ*ˆŒ
Ü"Øð
àØØØØñ
ð ñ
ˆŒ	ð 2;¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
Üð 
ØÜ  i¡Ó0ØØñ	
ð
 ñ
ˆŒð 2;¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�r?   r@   rA   c                 ó$  — |dd…dd…f   }|| j                  | j                  | j                  |«      «      «      z   }|| j                  | j	                  | j                  |«      «      «      z   }t        j                  ||dd…dd…f   gd¬«      S )z¼Forward pass.

        Args:
            x: Input tensor of shape (B, N, C) where first token is class token.

        Returns:
            Output tensor with updated class token.
        Nr   rG   )rr   r3   rp   ru   rt   rs   r`   Úcat)r:   r@   rœ   s      r>   rW   zClassBlock.forward²  s~   € ð ’a˜˜!˜�e‘Hˆ	Ø §¡°·	±	¸$¿*¹*ÀQ»-Ó0HÓ IÑIˆ	Ø §¡°·±¸¿¹ÀIÓ9NÓ0OÓ PÑPˆ	Ü�y‰y˜) Q¢q¨!©" u¡XÐ.°AÔ6Ð6r?   )rY   rZ   r[   r\   r0   r{   r|   r]   r   r_   r^   r
   r}   r.   r`   ra   rW   rb   rc   s   @r>   rž   rž   z  sÐ   ø„ Ù=ð '+Ø!Ø"ØØ!Ø!Ø)+¯©Ø*,¯,©,ØØñ3Sàð3Sð ð3Sð ˜s‘mð	3Sð
 ð3Sð ð3Sð ð3Sð ð3Sð ð3Sð ˜BŸI™I‘ð3Sð ˜RŸY™Y™õ3Sðj7˜Ÿ™ð 7¨%¯,©,÷ 7r?   rž   Ú
block_typeÚkwargsrA   c                 ó6   — | dk(  rt        di |¤ŽS J d| › �«       ‚)zÍGet block based on type.

    Args:
        block_type: Type of block ('ca' for ClassBlock).
        **kwargs: Additional keyword arguments for block.

    Returns:
        The requested block module.
    ÚcazInvalid block type: ro   )rž   )r£   r¤   s     r>   Ú	get_blockr§   Á  s,   € ð �TÒÜÑ#˜FÑ#Ð#à9Ð,¨Z¨LÐ9Ó9ˆur?   Úsize.Úlamr/   c                 óò  — | d   |z  }| d   |z  }t        j                  |t         j                  ¬«      }t        j                  |t         j                  ¬«      }t        j                  d|z
  «      }||z  j	                  «       }||z  j	                  «       }	t        j
                  d|d«      }
t        j
                  d|d«      }t        j                  |
|dz  z
  d|«      }t        j                  ||	dz  z
  d|«      }t        j                  |
|dz  z   d|«      }t        j                  ||	dz  z   d|«      }|j                  «       |j                  «       |j                  «       |j                  «       fS )a1  Get random bounding box for token labeling.

    Reference: https://github.com/zihangJiang/TokenLabeling

    Args:
        size: Input tensor size tuple.
        lam: Lambda parameter for cutmix.
        scale: Scaling factor.

    Returns:
        Bounding box coordinates (bbx1, bby1, bbx2, bby2).
    r   rE   )r(   ç      ð?r   ©r   )r`   ÚtensorÚfloat32Úsqrtr]   ÚrandintÚclampÚitem)r¨   r©   r/   rS   rR   ÚW_tÚH_tÚcut_ratÚcut_wÚcut_hÚcxÚcyÚbbx1Úbby1Úbbx2Úbby2s                   r>   Ú	rand_bboxr¾   Ñ  s3  € ð 	ˆQ‰�5Ñ€AØˆQ‰�5Ñ€AÜ
�,‰,�q¤§¡Ô
.€CÜ
�,‰,�q¤§¡Ô
.€CÜ�j‰j˜˜c™Ó"€GØ�7‰]×ÑÓ!€EØ�7‰]×ÑÓ!€Eô 
�‰�q˜!˜TÓ	"€BÜ	�‰�q˜!˜TÓ	"€Bä�;‰;�r˜E Q™J‘¨¨1Ó-€DÜ�;‰;�r˜E Q™J‘¨¨1Ó-€DÜ�;‰;�r˜E Q™J‘¨¨1Ó-€DÜ�;‰;�r˜E Q™J‘¨¨1Ó-€Dà�9‰9‹;˜Ÿ	™	› T§Y¡Y£[°$·)±)³+Ð=Ð=r?   c                   óŒ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 ddededededededefˆ fd	„Zd
ej                  dej                  fd„Z	ˆ xZ
S )Ú
PatchEmbedz6Image to patch embedding with multi-layer convolution.Úimg_sizeÚ	stem_convÚstem_strideÚ
patch_sizeÚin_chansÚ
hidden_dimÚ	embed_dimc
                 ó†  •— ||	dœ}
t         ‰| �  «        |dv sJ ‚|rét        j                  t        j                  ||fd|dddœ|
¤Žt        j
                  |fi |
¤Žt        j                  d¬«      t        j                  ||fdd	d	ddœ|
¤Žt        j
                  |fi |
¤Žt        j                  d¬«      t        j                  ||fdd	d	ddœ|
¤Žt        j
                  |fi |
¤Žt        j                  d¬«      «	      | _        nd
| _        t        j                  ||f||z  ||z  dœ|
¤Ž| _        ||z  ||z  z  | _	        y
)a  Initialize PatchEmbed.

        Different from ViT which uses 1 conv layer, VOLO uses multiple conv layers for patch embedding.

        Args:
            img_size: Input image size.
            stem_conv: Whether to use stem convolution layers.
            stem_stride: Stride for stem convolution.
            patch_size: Patch size (must be 4, 8, or 16).
            in_chans: Number of input channels.
            hidden_dim: Hidden dimension for stem convolution.
            embed_dim: Output embedding dimension.
        r&   )r+   r�   é   é   rD   F)r   r!   r    r*   T)Úinplacer   N©r   r!   )
r-   r.   r0   Ú
SequentialÚConv2dÚBatchNorm2dÚReLUÚconvr5   Únum_patches)r:   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   r'   r(   r;   r=   s              €r>   r.   zPatchEmbed.__init__õ  sN  ø€ ð2 ¨Ñ/ˆÜ‰ÑÔØ˜ZÑ'Ð'Ð'ÙÜŸ™Ü—	‘	˜( JÐo¸AÀkÐ[\ÐchÑoÐlnÑoÜ—‘˜zÑ0¨RÑ0Ü—‘ Ô%Ü—	‘	˜* jÐg¸aÈÐSTÐ[`ÑgÐdfÑgÜ—‘˜zÑ0¨RÑ0Ü—‘ Ô%Ü—	‘	˜* jÐg¸aÈÐSTÐ[`ÑgÐdfÑgÜ—‘˜zÑ0¨RÑ0Ü—‘ Ô%ó
ˆD�Ið ˆDŒIä—I‘IØØð
ð # kÑ1Ø Ñ,ñ	
ð
 ñ
ˆŒ	ð %¨
Ñ2°xÀ:Ñ7MÑNˆÕr?   r@   rA   c                 ób   — | j                   �| j                  |«      }| j                  |«      }|S )z¥Forward pass.

        Args:
            x: Input tensor of shape (B, C, H, W).

        Returns:
            Output tensor of shape (B, embed_dim, H', W').
        )rÑ   r5   ry   s     r>   rW   zPatchEmbed.forward)  s-   € ð �9‰9Ð Ø—	‘	˜!“ˆAØ�I‰I�a‹LˆØˆr?   )	éà   Fr   r�   rD   é@   é€  NN)rY   rZ   r[   r\   r]   r^   r.   r`   ra   rW   rb   rc   s   @r>   rÀ   rÀ   ò  s�   ø„ Ù@ð  Ø#Ø ØØØ Ø ØØñ2Oàð2Oð ð2Oð ð	2Oð
 ð2Oð ð2Oð ð2Oð õ2Oðh˜Ÿ™ð ¨%¯,©,÷ r?   rÀ   c                   óp   ‡ — e Zd ZdZ	 	 	 d	dededefˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )
Ú
Downsamplez#Downsampling module between stages.Úin_embed_dimÚout_embed_dimrÄ   c                 ój   •— t         ‰| �  «        ||dœ}t        j                  ||f||dœ|¤Ž| _        y)zÏInitialize Downsample.

        Args:
            in_embed_dim: Input embedding dimension.
            out_embed_dim: Output embedding dimension.
            patch_size: Patch size for downsampling.
        r&   rÌ   N)r-   r.   r0   rÎ   r5   )r:   rÙ   rÚ   rÄ   r'   r(   r;   r=   s          €r>   r.   zDownsample.__init__;  s:   ø€ ô 	‰ÑÔØ¨Ñ/ˆÜ—I‘I˜l¨MÐkÀzÐZdÑkÐhjÑkˆ�	r?   r@   rA   c                 óx   — |j                  dddd«      }| j                  |«      }|j                  dddd«      }|S )zžForward pass.

        Args:
            x: Input tensor of shape (B, H, W, C).

        Returns:
            Output tensor of shape (B, H', W', C').
        r   rD   r   rE   )rJ   r5   ry   s     r>   rW   zDownsample.forwardN  s>   € ð �I‰I�a˜˜A˜qÓ!ˆØ�I‰I�a‹LˆØ�I‰I�a˜˜A˜qÓ!ˆØˆr?   )rE   NN)
rY   rZ   r[   r\   r]   r.   r`   ra   rW   rb   rc   s   @r>   rØ   rØ   8  sQ   ø„ Ù-ð  ØØñlàðlð ðlð õ	lð&˜Ÿ™ð ¨%¯,©,÷ r?   rØ   Úblock_fnÚindexr   Úlayersr   r   r    r!   rg   r"   r#   Údrop_path_ratec                 óà   — g }t        ||   «      D ]H  }||t        |d| «      z   z  t        |«      dz
  z  }|j                   | |f||||||	|
|||dœ
|¤Ž«       ŒJ t        j                  |Ž }|S )aõ  Generate outlooker layers for stage 1.

    Args:
        block_fn: Block function to use (typically Outlooker).
        index: Index of current stage.
        dim: Feature dimension.
        layers: List of layer counts for each stage.
        num_heads: Number of attention heads.
        kernel_size: Kernel size for outlook attention.
        padding: Padding for outlook attention.
        stride: Stride for outlook attention.
        mlp_ratio: Ratio for MLP hidden dimension.
        qkv_bias: Whether to use bias in QKV projection.
        attn_drop: Attention dropout rate.
        drop_path_rate: Stochastic depth drop rate.
        **kwargs: Additional keyword arguments.

    Returns:
        Sequential module containing outlooker blocks.
    Nr   )
r   r    r!   r   rg   r"   r#   rh   r'   r(   ©ÚrangeÚsumÚappendr0   rÍ   )rÝ   rÞ   r   rß   r   r   r    r!   rg   r"   r#   rà   r'   r(   r¤   ÚblocksÚ	block_idxÚ	block_dprs                     r>   Úoutlooker_blocksré   ]  s¢   € ðJ €FÜ˜6 %™=Ó)ò ˆ	Ø" i´#°f¸V¸e°nÓ2EÑ&EÑFÌ#ÈfË+ÐXYÉ/ÑZˆ	Ø�‰‘hØð
à#ØØØØØØØØØñ
ð ñ
õ 	ðô  �]‰]˜FÐ#€FØ€Mr?   c	                 óÖ   — g }
t        ||   «      D ]C  }||t        |d| «      z   z  t        |«      dz
  z  }|
j                   | ||f||||dœ|	¤Ž«       ŒE t        j                  |
Ž }
|
S )ae  Generate transformer layers for stage 2.

    Args:
        block_fn: Block function to use (typically Transformer).
        index: Index of current stage.
        dim: Feature dimension.
        layers: List of layer counts for each stage.
        num_heads: Number of attention heads.
        mlp_ratio: Ratio for MLP hidden dimension.
        qkv_bias: Whether to use bias in QKV projection.
        attn_drop: Attention dropout rate.
        drop_path_rate: Stochastic depth drop rate.
        **kwargs: Additional keyword arguments.

    Returns:
        Sequential module containing transformer blocks.
    Nr   )rg   r"   r#   rh   râ   )rÝ   rÞ   r   rß   r   rg   r"   r#   rà   r¤   ræ   rç   rè   s                r>   Útransformer_blocksrë   —  s”   € ð: €FÜ˜6 %™=Ó)ò 
ˆ	Ø" i´#°f¸V¸e°nÓ2EÑ&EÑFÌ#ÈfË+ÐXYÉ/ÑZˆ	Ø�‰‘hØØð
ð  ØØØñ
ð ñ
õ 	ð
ô �]‰]˜FÐ#€FØ€Mr?   c            -       ó  ‡ — e Zd ZdZddddddddd	d	d
dddddej
                  ddddddfdee   dedededededede	ee      de	ee      de
edf   de
edf   dedededed ed!ed"eej                     d#e	e
edf      d$ed%ed&ef,ˆ fd'„Zd(ej                  d)dfd*„Zej$                  j&                  d)efd+„«       Zej$                  j&                  dCd,ed)eeef   fd-„«       Zej$                  j&                  dDd.ed)dfd/„«       Zej$                  j&                  d)ej                  fd0„«       ZdEdede	e   d)dfd1„Zd2ej8                  d)ej8                  fd3„Zd2ej8                  d)ej8                  fd4„Zd2ej8                  d)eej8                  e
ej8                  ej8                  e
eeeef   f   f   fd5„Z 	 	 	 	 	 dFd2ej8                  d6e	eeee   f      d7ed8ed9ed:ed)eeej8                     e
ej8                  eej8                     f   f   fd;„Z!	 	 	 dGd6eeee   f   d<ed=ed)ee   fd>„Z"d2ej8                  d)ej8                  fd?„Z#dCd2ej8                  d@ed)ej8                  fdA„Z$d2ej8                  d)ej8                  fdB„Z%ˆ xZ&S )Hr   zVision Outlooker (VOLO) model.rÔ   rD   éè  Útokenr�   rÕ   N)TFFFrf   FrX   )r¦   r¦   TrE   rß   rÁ   rÅ   Únum_classesÚglobal_poolrÄ   Ústem_hidden_dimÚ
embed_dimsr   Údownsamples.Úoutlook_attentionrg   r"   Ú	drop_rateÚpos_drop_rateÚattn_drop_raterà   rj   Úpost_layersÚuse_aux_headÚuse_mix_tokenÚpooling_scalec                 ó¨  •— t         ‰!| �  «        ||dœ}t        |«      } t        |«      |«      }t	        |«      }|| _        || _        || _        || _        || _	        |d   x| _
        | _        |rd| _        |dk(  sJ d«       ‚d| _        t        ddd||||d	   d
œ|¤Ž| _        |}|d	   |z  |z  |d   |z  |z  f}t!        j"                  t%        j&                  d|d	   |d   |d   fi |¤Ž«      | _        t!        j*                  |¬«      | _        g | _        g | _        g }d	}t3        t        |«      «      D ]á  }||   r#t5        t6        |||   ||	|   f||   |||dœ|¤Ž} n#t9        t:        |||   ||	|   f||   ||||dœ|¤Ž} |j=                  | «       | j.                  j=                  |«       | j0                  j=                  t?        ||   |d|› �¬«      «       |dz  }|
|   sŒ²|j=                  tA        ||   ||dz      dfi |¤Ž«       |dz  }|dz  }Œã t!        jB                  |«      | _"        d| _#        |�¢t!        jB                  t3        t        |«      «      D �cg c]"  }tI        ||   f|d   |	d   |d   ||d|dœ|¤Ž‘Œ$ c}«      | _#        t!        j"                  t%        j&                  dd|d   fi |¤Ž«      | _%        tM        | jJ                  d¬«       |r@|d	kD  r!t!        jN                  | j                  |fi |¤Žnt!        jP                  «       | _)        nd| _)         || j                  fi |¤Ž| _*        t!        j*                  |«      | _+        |d	kD  r!t!        jN                  | j                  |fi |¤Žnt!        jP                  «       | _,        tM        | j(                  d¬«       | j[                  | j\                  «       yc c}w )a/  Initialize VOLO model.

        Args:
            layers: Number of blocks in each stage.
            img_size: Input image size.
            in_chans: Number of input channels.
            num_classes: Number of classes for classification.
            global_pool: Global pooling type ('token', 'avg', or '').
            patch_size: Patch size for patch embedding.
            stem_hidden_dim: Hidden dimension for stem convolution.
            embed_dims: List of embedding dimensions for each stage.
            num_heads: List of number of attention heads for each stage.
            downsamples: Whether to downsample between stages.
            outlook_attention: Whether to use outlook attention in each stage.
            mlp_ratio: Ratio for MLP hidden dimension.
            qkv_bias: Whether to use bias in QKV projection.
            drop_rate: Dropout rate.
            pos_drop_rate: Position embedding dropout rate.
            attn_drop_rate: Attention dropout rate.
            drop_path_rate: Stochastic depth drop rate.
            norm_layer: Normalization layer type.
            post_layers: Post-processing layer types.
            use_aux_head: Whether to use auxiliary head.
            use_mix_token: Whether to use token mixing for training.
            pooling_scale: Pooling scale factor.
        r&   rF   r«   rî   z)return all tokens if mix_token is enabledFTrE   r   )rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   r   )r‰   )rg   r"   r#   rj   )rg   r"   rà   r#   rj   znetwork.)Únum_chsÚ	reductionÚmoduleNrX   )r   r   rg   r"   r#   rh   rj   ç{®Gáz”?©Ústdro   )/r-   r.   Úlenr   r   rï   rÅ   rð   Ú	mix_tokenrû   Únum_featuresÚhead_hidden_sizeÚbetaÚgrad_checkpointingrÀ   Úpatch_embedr0   Ú	Parameterr`   ÚzerosÚ	pos_embedr4   Úpos_dropÚ
stage_endsÚfeature_inforã   ré   re   rë   r’   rå   ÚdictrØ   Ú
ModuleListÚnetworkÚpost_networkr§   Ú	cls_tokenr   r1   rq   Úaux_headÚnormÚ	head_dropÚheadÚapplyÚ_init_weights)"r:   rß   rÁ   rÅ   rï   rð   rÄ   rñ   rò   r   ró   rô   rg   r"   rõ   rö   r÷   rà   rj   rø   rù   rú   rû   r'   r(   r;   Ú
num_layersÚrÚ
patch_gridr  rç   ÚiÚstager=   s"                                    €r>   r.   zVOLO.__init__Ç  s$  ø€ ôj 	‰ÑÔØ¨Ñ/ˆÜ˜“[ˆ
Ø)”I˜jÓ)¨)Ó4ˆ	Ü˜XÓ&ˆà&ˆÔØ ˆŒØ&ˆÔØ&ˆŒØ*ˆÔØ4>¸r±NÐBˆÔ˜DÔ1ÙØˆDŒIØ 'Ò)ÐVÐ+VÓVÐ)Ø"'ˆÔä%ð 
ØØØ!ØØ&Ø  ‘mñ
ð ñ
ˆÔð ˆð ˜q‘k ZÑ/°=Ñ@À(È1Á+ÐQ[ÑB[Ð_lÑBlÐmˆ
ÜŸ™¤e§k¡k°!°ZÀ±]ÀJÈqÁMÐS]Ð^`ÑSaÑ&hÐegÑ&hÓiˆŒÜŸ
™
 ]Ô3ˆŒð ˆŒØˆÔØˆØˆ	Ü”s˜6“{Ó#ò &	ˆAØ  Ò#ä(ÜØØ˜q‘MØØ˜a‘Lðð (¨™lØ%Ø,Ø)ñð ñ‘ô +ÜØØ˜q‘MØØ˜a‘Lðð (¨™lØ%Ø#1Ø,Ø)ñð ñ�ð �N‰N˜5Ô!Ø�O‰O×"Ñ" 9Ô-Ø×Ñ×$Ñ$¤T°*¸Q±-È1ÐW_Ð`iÐ_jÐUkÔ%lÔmØ˜‰NˆIØ˜1‹~à—‘œz¨*°Q©-¸ÀAÈÁEÑ9JÈAÑTÐQSÑTÔUØ�Q‘�Ø˜Q‘‘	ðM&	ôP —}‘} WÓ-ˆŒð !ˆÔØÐ"Ü "§¡ô œs ;Ó/Ó0ö/ð ô Ø ‘Nð
à" 2™Ø'¨™mØ'¨™mØ%Ø,Ø Ø)ñ
ð ó
ò/ó !ˆDÔô  Ÿ\™\¬%¯+©+°a¸¸JÀr¹NÑ*QÈbÑ*QÓRˆDŒNÜ˜$Ÿ.™.¨cÕ2ñ ØOZÐ]^ÊœBŸI™I d×&7Ñ&7¸ÑKÈÒKÔdf×doÑdoÓdqˆD�Mà ˆDŒMÙ˜t×0Ñ0Ñ7°BÑ7ˆŒ	ô Ÿ™ IÓ.ˆŒØGRÐUVÂ”B—I‘I˜d×/Ñ/°ÑCÀÒCÔ\^×\gÑ\gÓ\iˆŒ	ä�d—n‘n¨#Õ.Ø�
‰
�4×%Ñ%Õ&ùò;/s   É%'OÚmrA   c                 ó  — t        |t        j                  «      rjt        |j                  d¬«       t        |t        j                  «      r8|j
                  �+t        j                  j                  |j
                  d«       yyyy)z\Initialize weights for modules.

        Args:
            m: Module to initialize.
        r   r  Nr   )Ú
isinstancer0   r1   r   Úweightr*   ÚinitÚ	constant_)r:   r   s     r>   r  zVOLO._init_weightsn  s\   € ô �aœŸ™Ô#Ü˜!Ÿ(™(¨Õ,Ü˜!œRŸY™YÔ'¨A¯F©FÐ,>Ü—‘×!Ñ! !§&¡&¨!Õ,ð -?Ð'ð $r?   c                 ó
   — ddhS )zwGet set of parameters that should not have weight decay.

        Returns:
            Set of parameter names.
        r  r  ro   ©r:   s    r>   Úno_weight_decayzVOLO.no_weight_decayy  s   € ð ˜[Ð)Ð)r?   Úcoarsec                 ó&   — t        dddgg d¢¬«      S )z®Get parameter grouping for optimizer.

        Args:
            coarse: Whether to use coarse grouping.

        Returns:
            Parameter grouping dictionary.
        z ^cls_token|pos_embed|patch_embed)z^network\.(\d+)\.(\d+)N)z^network\.(\d+)©r   ))z
^cls_tokenr+  )z^post_network\.(\d+)N)z^norm)iŸ† )Ústemræ   Úblocks2)r  )r:   r)  s     r>   Úgroup_matcherzVOLO.group_matcher‚  s$   € ô Ø4à1Ø*ðòô
ð 	
r?   Úenablec                 ó   — || _         y)zqSet gradient checkpointing.

        Args:
            enable: Whether to enable gradient checkpointing.
        N)r  )r:   r/  s     r>   Úset_grad_checkpointingzVOLO.set_grad_checkpointing™  s   € ð #)ˆÕr?   c                 ó   — | j                   S )zYGet classifier module.

        Returns:
            The classifier head module.
        )r  r'  s    r>   Úget_classifierzVOLO.get_classifier¢  s   € ð �y‰yÐr?   c                 ó"  — || _         |�|| _        t        | j                  d«      r | j                  j                  j
                  nd}t        | j                  d«      r | j                  j                  j                  nd}|dkD  r#t        j                  | j                  |||¬«      nt        j                  «       | _        | j                  �B|dkD  r#t        j                  | j                  |||¬«      nt        j                  «       | _        yy)z›Reset classifier head.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        Nr#  r   r&   )rï   rð   Úhasattrr  r#  r'   r(   r0   r1   r  rq   r  )r:   rï   rð   r'   r(   s        r>   Úreset_classifierzVOLO.reset_classifier«  sã   € ð 'ˆÔØÐ"Ø*ˆDÔÜ,3°D·I±I¸xÔ,H�—‘×!Ñ!×(Ò(ÈdˆÜ*1°$·)±)¸XÔ*F�—	‘	× Ñ ×&Ò&ÈDˆàKVÐYZÊ?ô —I‘IØ×Ñ˜{°6ÀõHÜ`b×`kÑ`kÓ`mð 	Œ	à�=‰=Ð$àOZÐ]^Êô ŸI™IØ×!Ñ! ;°vÀUõLÜdf×doÑdoÓdqð �Mð %r?   r@   c                 óP  — t        | j                  «      D ]i  \  }}|dk(  r || j                  z   }| j                  |«      }| j                  r+t
        j                  j                  «       st        ||«      }Œb ||«      }Œk |j                  \  }}}}|j                  |d|«      }|S )z·Forward pass through token processing stages.

        Args:
            x: Input tensor of shape (B, H, W, C).

        Returns:
            Token tensor of shape (B, N, C).
        rE   rF   )Ú	enumerater  r  r  r  r`   rŽ   Úis_scriptingr   rI   rM   )r:   r@   ÚidxÚblockrQ   rR   rS   rT   s           r>   Úforward_tokenszVOLO.forward_tokens½  sš   € ô $ D§L¡LÓ1ò 	‰JˆC�Ø�aŠxà˜Ÿ™Ñ&�Ø—M‘M !Ó$�Ø×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜u aÓ(‘á˜!“H‘ð	ð —W‘W‰
ˆˆ1ˆa�Ø�I‰I�a˜˜QÓˆØˆr?   c                 ó2  — |j                   \  }}}| j                  j                  |dd«      }t        j                  ||gd¬«      }| j
                  D ]A  }| j                  r+t        j                  j                  «       st        ||«      }Œ: ||«      }ŒC |S )zÍForward pass through class attention blocks.

        Args:
            x: Input token tensor of shape (B, N, C).

        Returns:
            Output tensor with class token of shape (B, N+1, C).
        rF   r   rG   )
rI   r  Úexpandr`   r¢   r  r  rŽ   r9  r   )r:   r@   rQ   r›   rT   Ú
cls_tokensr;  s          r>   Úforward_clszVOLO.forward_clsÔ  sˆ   € ð —'‘'‰ˆˆ1ˆaØ—^‘^×*Ñ*¨1¨b°"Ó5ˆ
Ü�I‰I�z 1�o¨1Ô-ˆØ×&Ñ&ò 	ˆEØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜u aÓ(‘á˜!“H‘ð		ð
 ˆr?   c                 óê  — 	 | j                  |«      }|j                  dddd«      }| j                  �r0| j                  �r#t        j
                  j                  | j                  | j                  «      j                  «       }|j                  d   | j                  z  |j                  d   | j                  z  }}t        |j                  «       || j                  ¬«      \  }}}}|j                  «       }	| j                  |z  | j                  |z  }}
| j                  |z  | j                  |z  }}|j                  d«      dd…|
|…||…dd…f   |	dd…|
|…||…dd…f<   |	}nd\  }}}}| j                  |«      }| j                   �| j#                  |«      }| j%                  |«      }| j&                  dk(  r|j)                  d¬	«      }n| j&                  d
k(  r
|dd…df   }n|}| j*                  €|S | j+                  |dd…dd…f   «      }| j                  s|d|j-                  d«      d   z  z   S | j                  r«| j                  rŸ|j/                  |j                  d   |j                  d   «      }|j                  «       }	|j                  d«      dd…||…||…dd…f   |	dd…||…||…dd…f<   |	}|j/                  |j                  d   ||z  |j                  d   «      }||||||ffS )a  Forward pass for training with mix token support.

        Args:
            x: Input tensor of shape (B, C, H, W).

        Returns:
            If training with mix_token: tuple of (class_token, aux_tokens, bbox).
            Otherwise: class_token tensor.
        r   rE   rD   r   )r/   N)r   r   r   r   ÚavgrG   rî   ç      à?rF   )r	  rJ   r  rˆ   r`   ÚdistributionsÚBetar  ÚsamplerI   rû   r¾   r¨   ÚcloneÚflipr<  r  r@  r  rð   Úmeanr  ÚmaxrM   )r:   r@   r©   Úpatch_hÚpatch_wrº   r»   r¼   r½   Útemp_xÚsbbx1Úsbby1Úsbbx2Úsbby2Úx_clsÚx_auxs                   r>   Úforward_trainzVOLO.forward_trainç  sÏ  € ð	ð ×Ñ˜QÓˆØ�I‰I�a˜˜A˜qÓ!ˆð �>‹>˜dŸm›mÜ×%Ñ%×*Ñ*¨4¯9©9°d·i±iÓ@×GÑGÓIˆCØ Ÿw™w q™z¨T×-?Ñ-?Ñ?ÀÇÁÈÁÈt×OaÑOaÑAa�WˆGÜ%.¨q¯v©v«x¸ÀD×DVÑDVÔ%WÑ"ˆD�$˜˜dØ—W‘W“YˆFØ×-Ñ-°Ñ4°d×6HÑ6HÈ4Ñ6O�5ˆEØ×-Ñ-°Ñ4°d×6HÑ6HÈ4Ñ6O�5ˆEØ56·V±V¸A³YºqÀ%ÈÀ+ÈuÐUZÈ{Ò\]Ð?]Ñ5^ˆF’1�e˜E�k 5¨ ;²Ð1Ñ2Ø‰Aà%/Ñ"ˆD�$˜˜dð ×Ñ Ó"ˆð ×ÑÐ(Ø× Ñ  Ó#ˆAØ�I‰I�a‹Lˆà×Ñ˜uÒ$Ø—F‘F˜q�F“M‰EØ×Ñ Ò(Ø’a˜�d‘G‰EàˆEà�=‰=Ð ØˆLà—‘˜a¢ 1¡2 ™hÓ'ˆØ�}Š}Ø˜3 §¡¨1£¨a¡Ñ0Ñ0Ð0à�>Š>˜dŸmšmØ—M‘M %§+¡+¨a¡.°'¸7ÀEÇKÁKÐPRÁOÓTˆEØ—[‘[“]ˆFØ16·±¸A³ºqÀ$ÀtÀ)ÈTÐRVÈYÒXYÐ?YÑ1ZˆF’1�d˜4�i  d ªAÐ-Ñ.ØˆEØ—M‘M %§+¡+¨a¡.°'¸GÑ2CÀUÇ[Á[ÐQSÁ_ÓUˆEð �e˜d D¨$°Ð5Ð5Ð5r?   Úindicesr  Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc           	      óÎ  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	|D �
cg c]  }
| j                  |
   ‘Œ }}
| j                  |	   }	|j                  \  }}}}| j	                  |«      j                  dddd«      }t        j                  j                  «       s|s| j                  }n| j                  d|	dz    }t        |«      D ]¬  \  }}|dk(  r || j                  z   }| j                  |«      }| j                  r+t        j                  j                  «       st        ||«      }n ||«      }||v sŒo|r|dk\  r| j                  |«      }n|}|j!                  |j                  dddd«      «       Œ® |r|S |j                  \  }}}}|j#                  |d|«      }| j$                  �| j'                  |«      }| j                  |«      }||fS c c}
w )	aè   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to all intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )ÚNCHWzOutput format must be NCHW.r   rE   rD   r   NrF   )r   r  r  rI   r	  rJ   r`   rŽ   r9  r  r8  r  r  r  r   r  rå   rM   r  r@  )r:   r@   rU  r  rV  rW  rX  ÚintermediatesÚtake_indicesÚ	max_indexr  rQ   Ú_ÚheightÚwidthr  r:  r;  Úx_interrR   rS   rT   s                         r>   Úforward_intermediateszVOLO.forward_intermediates$  sÜ  € ð* ˜YÑ&ÐEÐ(EÓEÐ&ØˆÜ"6´s¸4¿?¹?Ó7KÈWÓ"UÑˆ�iØ4@ÖA¨q˜Ÿ™¨Ó*ÐAˆÐAØ—O‘O IÑ.ˆ	ð  Ÿg™gÑˆˆ1ˆf�eØ×Ñ˜QÓ×'Ñ'¨¨1¨a°Ó3ˆô �9‰9×!Ñ!Ô#©:Ø—l‘l‰Gà—l‘l > I°¡MÐ2ˆGÜ# GÓ,ò 	B‰JˆC�Ø�aŠxà˜Ÿ™Ñ&�Ø—M‘M !Ó$�Ø×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜u aÓ(‘á˜!“H�Ø�lÒ"Ù˜C 1šHØ"Ÿi™i¨›l‘Gà�GØ×$Ñ$ W§_¡_°Q¸¸1¸aÓ%@ÕAð	Bñ  Ø Ð ð —W‘W‰
ˆˆ1ˆa�Ø�I‰I�a˜˜QÓˆØ×ÑÐ(Ø× Ñ  Ó#ˆAØ�I‰I�a‹Lˆà�-ÐÐùòO Bs   ´G"Ú
prune_normÚ
prune_headc                 ó(  — 	 t        t        | j                  «      |«      \  }}| j                  |   }| j                  d|dz    | _        |rt	        j
                  «       | _        |r+t	        j                  «       | _        | j                  dd«       |S )aH  Prune layers not required for specified intermediates.

        Args:
            indices: Indices of intermediate layers to keep.
            prune_norm: Whether to prune normalization layer.
            prune_head: Whether to prune classification head.

        Returns:
            List of kept intermediate indices.
        Nr   r   Ú )
r   r  r  r  r0   rq   r  r  r  r6  )r:   rU  rc  rd  r\  r]  s         r>   Úprune_intermediate_layerszVOLO.prune_intermediate_layerse  s|   € ð 	ä"6´s¸4¿?¹?Ó7KÈWÓ"UÑˆ�iØ—O‘O IÑ.ˆ	Ø—|‘| N Y°¡]Ð3ˆŒÙÜŸ™›ˆDŒIÙÜ "§¡£ˆDÔØ×!Ñ! ! RÔ(ØÐr?   c                 óÊ   — | j                  |«      j                  dddd«      }| j                  |«      }| j                  �| j	                  |«      }| j                  |«      }|S )z¡Forward pass through feature extraction.

        Args:
            x: Input tensor of shape (B, C, H, W).

        Returns:
            Feature tensor.
        r   rE   rD   r   )r	  rJ   r<  r  r@  r  ry   s     r>   Úforward_featureszVOLO.forward_features�  sg   € ð ×Ñ˜QÓ×'Ñ'¨¨1¨a°Ó3ˆð ×Ñ Ó"ˆð ×ÑÐ(Ø× Ñ  Ó#ˆAØ�I‰I�a‹LˆØˆr?   Ú
pre_logitsc                 óL  — | j                   dk(  r|j                  d¬«      }n| j                   dk(  r
|dd…df   }n|}| j                  |«      }|r|S | j                  |«      }| j                  �4| j	                  |dd…dd…f   «      }|d|j                  d«      d   z  z   }|S )zñForward pass through classification head.

        Args:
            x: Input feature tensor.
            pre_logits: Whether to return pre-logits features.

        Returns:
            Classification logits or pre-logits features.
        rB  r   rG   rî   Nr   rC  )rð   rI  r  r  r  rJ  )r:   r@   rj  ÚoutÚauxs        r>   Úforward_headzVOLO.forward_head•  s¦   € ð ×Ñ˜uÒ$Ø—&‘&˜Q�&“-‰CØ×Ñ Ò(Ø’A�q�D‘'‰CàˆCØ�N‰N˜1ÓˆÙØˆJØ�i‰i˜‹nˆØ�=‰=Ð$à—-‘- ¢! Q¡R %¡Ó)ˆCØ˜˜cŸg™g a›j¨™mÑ+Ñ+ˆCØˆ
r?   c                 óL   — 	 | j                  |«      }| j                  |«      }|S )z¶Forward pass (simplified, without mix token training).

        Args:
            x: Input tensor of shape (B, C, H, W).

        Returns:
            Classification logits.
        )ri  rn  ry   s     r>   rW   zVOLO.forward¯  s-   € ð 	@Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr?   ©F)T)N)NFFrZ  F)r   FT)'rY   rZ   r[   r\   r0   r|   r   r]   Ústrr   r   r^   r_   r
   r}   r.   r  r`   rŽ   ÚignoreÚsetr(  r   r   r.  r1  r3  r6  ra   r<  r@  r	   rT  rb  rg  ri  rn  rW   rb   rc   s   @r>   r   r   Ä  s7  ø„ Ù(ð
  ØØ#Ø&ØØ#%Ø.2Ø-1Ø,GØ2MØ"Ø"Ø!Ø#%Ø$&Ø$&Ø*,¯,©,Ø5AØ!%Ø"'Ø!"ØØñ3e'à˜‘Iðe'ð ðe'ð ð	e'ð
 ðe'ð ðe'ð ðe'ð !ðe'ð !  c¡Ñ+ðe'ð    S¡	Ñ*ðe'ð ˜t S˜yÑ)ðe'ð  % T¨3 YÑ/ðe'ð ðe'ð ðe'ð ðe'ð  !ð!e'ð" "ð#e'ð$ "ð%e'ð& ˜RŸY™Y™ð'e'ð( " %¨¨S¨¡/Ñ2ð)e'ð* ð+e'ð,  ð-e'ð. õ/e'ðN	-˜rŸy™yð 	-¨Tó 	-ð ‡Y�Y×Ñð* ò *ó ð*ð ‡Y�Y×Ññ
 Dð 
°T¸#¸s¸(±^ò 
ó ð
ð, ‡Y�Y×Ññ)¨Tð )¸Tò )ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñr¨Cð r¸hÀs¹mð rÐW[ó rð$ §¡ð °·±ó ð.˜UŸ\™\ð ¨e¯l©ló ð&;6˜uŸ|™|ð ;6°°e·l±lÀEÈ%Ï,É,ÐX]×XdÑXdÐfkÐloÐqtÐvyÐ{~Ðl~ÑfÐJñ  EAð  7Añ  1Bó ;6ð@ 8<ØØ$Ø$Ø',ñ? à�|‰|ð? ð ˜e C¨¨c© NÑ3Ñ4ð? ð ð	? ð
 ð? ð ð? ð !%ð? ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó? ðF ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ð	ð
 
ˆc‰óð8 %§,¡,ð °5·<±<ó ñ(˜eŸl™lð ¸ð ÈÏÉó ð4˜Ÿ™ð ¨%¯,©,÷ r?   ÚvariantÚ
pretrainedc                 ód   — |j                  dd«      }t        t        | |fdt        |d¬«      i|¤ŽS )zØCreate VOLO model.

    Args:
        variant: Model variant name.
        pretrained: Whether to load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        VOLO model instance.
    Úout_indicesrD   Úfeature_cfgÚgetter)rw  Úfeature_cls)Úpopr   r   r  )rt  ru  r¤   rw  s       r>   Ú_create_volor|  ¾  sE   € ð —*‘*˜]¨AÓ.€KÜÜØØñô  [¸hÔGð	ð
 ñð r?   Úurlc                 ó4   — | ddddddt         t        ddd	d
œ|¥S )z¾Create model configuration.

    Args:
        url: URL for pretrained weights.
        **kwargs: Additional configuration options.

    Returns:
        Model configuration dictionary.
    rí   )rD   rÔ   rÔ   Nç¸…ëQ¸î?ÚbicubicTzpatch_embed.conv.0)r  r  z
apache-2.0)r}  rï   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚfixed_input_sizerI  r  Ú
first_convÚ
classifierÚlicenser   )r}  r¤   s     r>   Ú_cfgr‰  Ó  s8   € ð Ø¨=ÀtØ¨)ÈÜ%Ô.BØ*Ð:NØñð ðð r?   ztimm/zLhttps://github.com/sail-sg/volo/releases/download/volo_1/d1_224_84.2.pth.tarr  )Ú	hf_hub_idr}  rƒ  zLhttps://github.com/sail-sg/volo/releases/download/volo_1/d1_384_85.2.pth.tarr«   )rD   rÖ   rÖ   )rŠ  r}  rƒ  r�  zLhttps://github.com/sail-sg/volo/releases/download/volo_1/d2_224_85.2.pth.tarzLhttps://github.com/sail-sg/volo/releases/download/volo_1/d2_384_86.0.pth.tarzLhttps://github.com/sail-sg/volo/releases/download/volo_1/d3_224_85.4.pth.tarzLhttps://github.com/sail-sg/volo/releases/download/volo_1/d3_448_86.3.pth.tar)rD   éÀ  r‹  zLhttps://github.com/sail-sg/volo/releases/download/volo_1/d4_224_85.7.pth.tarzMhttps://github.com/sail-sg/volo/releases/download/volo_1/d4_448_86.79.pth.targffffffò?zMhttps://github.com/sail-sg/volo/releases/download/volo_1/d5_224_86.10.pth.tarzLhttps://github.com/sail-sg/volo/releases/download/volo_1/d5_448_87.0.pth.tarzMhttps://github.com/sail-sg/volo/releases/download/volo_1/d5_512_87.07.pth.tar)rD   é   rŒ  )zvolo_d1_224.sail_in1kzvolo_d1_384.sail_in1kzvolo_d2_224.sail_in1kzvolo_d2_384.sail_in1kzvolo_d3_224.sail_in1kzvolo_d3_448.sail_in1kzvolo_d4_224.sail_in1kzvolo_d4_448.sail_in1kzvolo_d5_224.sail_in1kzvolo_d5_448.sail_in1kzvolo_d5_512.sail_in1kc                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )úVOLO-D1 model, Params: 27M.©r+   r+   r�   rE   ©éÀ   rÖ   rÖ   rÖ   ©é   é   r”  r”  ©rß   rò   r   ru  ro   )Úvolo_d1_224©r  r|  ©ru  r¤   Ú
model_argsÚmodels       r>   r–  r–    ó4   € ô Ðp˜\Ð6JÐVeÑpÐioÑp€JÜÑL°:ÐLÀÑL€EØ€Lr?   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )rŽ  r�  r�  r’  r•  ru  ro   )Úvolo_d1_384r—  r˜  s       r>   r�  r�     r›  r?   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )úVOLO-D2 model, Params: 59M.©r“  r+   é
   r+   ©é   rŒ  rŒ  rŒ  ©r�   rÉ   rÉ   rÉ   r•  ru  ro   )Úvolo_d2_224r—  r˜  s       r>   r¥  r¥  (  ó4   € ô Ðq˜]Ð7KÐWfÑqÐjpÑq€JÜÑL°:ÐLÀÑL€EØ€Lr?   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )rŸ  r   r¢  r¤  r•  ru  ro   )Úvolo_d2_384r—  r˜  s       r>   r¨  r¨  0  r¦  r?   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )úVOLO-D3 model, Params: 86M.©r�   r�   rÉ   r+   r¢  r¤  r•  ru  ro   )Úvolo_d3_224r—  r˜  s       r>   r¬  r¬  8  r¦  r?   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )rª  r«  r¢  r¤  r•  ru  ro   )Úvolo_d3_448r—  r˜  s       r>   r®  r®  @  r¦  r?   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )úVOLO-D4 model, Params: 193M.r«  ©rÖ   é   r²  r²  ©r”  rÉ   rÉ   rÉ   r•  ru  ro   )Úvolo_d4_224r—  r˜  s       r>   r´  r´  H  ó4   € ô Ðr˜]Ð7KÐWgÑrÐkqÑr€JÜÑL°:ÐLÀÑL€EØ€Lr?   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )r°  r«  r±  r³  r•  ru  ro   )Úvolo_d4_448r—  r˜  s       r>   r·  r·  P  rµ  r?   c           	      óB   — t        dddddddœ|¤Ž}t        d	d| i|¤Ž}|S )
újVOLO-D5 model, Params: 296M.

    stem_hidden_dim=128, the dim in patch embedding is 128 for VOLO-D5.
    ©r”  r”  é   r+   r±  r³  r+   é€   ©rß   rò   r   rg   rñ   ru  ro   )Úvolo_d5_224r—  r˜  s       r>   r¾  r¾  X  óB   € ô ð 4ØÐ+?ÐK[Ø Sñ4à,2ñ4€Jô ÑL°:ÐLÀÑL€EØ€Lr?   c           	      óB   — t        dddddddœ|¤Ž}t        d	d| i|¤Ž}|S )
r¹  rº  r±  r³  r+   r¼  r½  ru  ro   )Úvolo_d5_448r—  r˜  s       r>   rÁ  rÁ  e  r¿  r?   c           	      óB   — t        dddddddœ|¤Ž}t        d	d| i|¤Ž}|S )
r¹  rº  r±  r³  r+   r¼  r½  ru  ro   )Úvolo_d5_512r—  r˜  s       r>   rÃ  rÃ  r  r¿  r?   r¬   )
r   rD   r   rE   rf   Fr   rX   NN)rf   Fr   rX   rp  )rf  )Fr\   rK   Útypingr   r   r   r   r   r   r	   r
   r`   Útorch.nnr0   Útorch.nn.functionalÚ
functionalrO   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_manipulater   Ú	_registryr   r   Ú__all__r}   r   re   r   r’   r—   rž   rq  r§   r]   r_   r¾   rÀ   rØ   r^   rÍ   ré   rë   r   r|  r‰  Údefault_cfgsr–  r�  r¥  r¨  r¬  r®  r´  r·  r¾  rÁ  rÃ  ro   r?   r>   ú<module>rÐ     sm  ðñó* ß J× JÓ Jã Ý ß Ð ç Aß Z× ZÝ *Ý +Ý #ß <àˆ(€ôO�r—y‘yô OôdE�—	‘	ô EôPA�—	‘	ô AôH1�"—)‘)ô 1ôh>�R—Y‘Yô >ôBD7�—‘ô D7ðN:˜#ð :¨ð :°·±ó :ñ >�E˜#˜s˜(‘Oð >¨%ð >¸ð >ÀEÈ#ÈsÐTWÐY\ÐJ\ÑD]ó >ôBC�—‘ô CôL"�—‘ô "ðT ØØØØØØØ "ØØñ7Øð7àð7ð ð7ð �S‘	ð	7ð
 ð7ð ð7ð ð7ð ð7ð ð7ð ð7ð ð7ð ð7ð ð7ð  ‡]�]ó!7ð@ ØØØ "ñ*Øð*àð*ð ð*ð �S‘	ð	*ð
 ð*ð ð*ð ð*ð ð*ð ð*ð ð*ð ‡]�]ó*ôZwˆ2�9‰9ô wñt˜#ð ¨4ð À3ð È4ó ñ*ˆcð  #ð ¨$¨s°C¨x©.ó ñ* %Ù!ØØZØôñ "ØØZØ ô0ñ "ØØZØôñ "ØØZØ ô0ñ "ØØZØôñ "ØØZØ ô0ñ "ØØZØôñ "ØØ[Ø -ô1ñ "ØØ[Øôñ "ØØZØ -ô1ñ "ØØ[Ø -ô1ñS-&ó -€ð` ñ˜Dð °Cð ¸Dò ó ðð ñ˜Dð °Cð ¸Dò ó ðð ñ˜Dð °Cð ¸Dò ó ðð ñ˜Dð °Cð ¸Dò ó ðð ñ˜Dð °Cð ¸Dò ó ðð ñ˜Dð °Cð ¸Dò ó ðð ñ˜Dð °Cð ¸Dò ó ðð ñ˜Dð °Cð ¸Dò ó ðð ñ	˜Dð 	°Cð 	¸Dò 	ó ð	ð ñ	˜Dð 	°Cð 	¸Dò 	ó ð	ð ñ	˜Dð 	°Cð 	¸Dò 	ó ñ	r?   