Ë
    éÓ^jÎ  ã                   ó´  — d Z ddlZddlmZmZmZmZ ddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ 	 	 	 dXd
edededeej$                     fd„Z	 	 	 dYd
edededeej$                     dej(                  f
d„Zdddddej,                  fdee   dededededeej$                     dej.                  dej(                  fd„Zdee   dee   fd„Zddddddd	ddd dej,                  fdee   d!eej(                     d
ed"ededed#ed$ed%eee      d&ed'edeej$                     dej.                  deej(                     fd(„Z G d)„ d*ej8                  «      Zd+„ Zd,ej(                  dej(                  fd-„Z	 dZd,ej(                  d.ej(                  d/ej(                  d0edej(                  f
d1„Z 	 dZd,eej(                     d.ej(                  d/ej(                  d0edeej(                     f
d2„Z!	 dZd,ej(                  d3ej(                  d0edej(                  fd4„Z"	 dZd,ej(                  d5ej(                  d6ej(                  d7edej(                  f
d8„Z#dddddd	ddd dej,                  fdee   d!eej(                     ded"ededed$ed%eee      d&ed'edeej$                     dej.                  fd9„Z$ G d:„ d;ej8                  «      Z% G d<„ d=ej8                  «      Z&	 	 d[dej,                  d>œd?ed@edAededBedej(                  fdC„Z'ejP                  jR                  e
d dej,                  fdDee   d'edeej$                     dej.                  deej(                  ej(                  f   f
dE„«       «       Z*dFej(                  dGej(                  dHej(                  dej(                  fdI„Z+ G dJ„ dKej8                  «      Z, G dL„ dMej8                  «      Z-ejP                  jR                  e
dNd ddOej,                  fdPedQedRed'ed&edej$                  dej.                  dej(                  fdS„«       «       Z. G dT„ dUej8                  «      Z/	 	 	 d\dVededAedej8                  fdW„Z0y)]zv Sin-cos, fourier, rotary position embedding modules and functions

Hacked together by / Copyright 2022 Ross Wightman
é    N)ÚListÚTupleÚOptionalÚUnion)Únné   )Úregister_notrace_function)Úndgrid)Ú_assertTÚ	num_bandsÚmax_freqÚlinear_bandsÚdevicec                 ó  — |r,t        j                  d|dz  | t         j                  |¬«      }nBdt        j                  dt        j                  |d«      dz
  | t         j                  |¬«      z  }|t         j
                  z  S )Nç      ð?é   ©Údtyper   r   r   )ÚtorchÚlinspaceÚfloat32ÚmathÚlogÚpi)r   r   r   r   Úbandss        úg/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/pos_embed_sincos.pyÚpixel_freq_bandsr      sh   € ñ Ü—‘˜s H¨q¡L°)Ä5Ç=Á=ÐY_Ô`‰à”U—^‘^ A¤t§x¡x°¸!Ó'<¸qÑ'@À)ÔSX×S`ÑS`ÐioÔpÑpˆØ”5—8‘8ÑÐó    ç     ˆÃ@ÚtemperatureÚstepÚreturnc                 ó¦   — t        j                  d| |t         j                  |¬«      j                  t         j                  «      | z  }d||z  z  }|S )Nr   r   r   )r   ÚarangeÚint64Útor   )r   r    r!   r   Úexpr   s         r   Ú
freq_bandsr(      sJ   € ô �,‰,�q˜) T´·±ÀVÔ
L×
OÑ
OÔPU×P]ÑP]Ó
^ÐajÑ
j€CØ�+ Ñ$Ñ%€EØ€Lr   é@   FÚ
feat_shapeÚdimÚreverse_coordÚinterleave_sin_cosr   c                 ó�  — |dz  dk(  sJ d«       ‚|dz  }t        ||d|¬«      }|r| ddd…   } t        j                  t        | D �	cg c]E  }	t        j                  |	|t        j
                  ¬«      j                  t        j                  «      ‘ŒG c}	«      «      j                  d«      j                  dd«      }
|
j                  d«      |j                  d«      z  }|rd	nd}t        j                  t        j                  |«      t        j                  |«      g|¬
«      j                  d«      }|j                  |¬«      S c c}	w )a  

    Args:
        feat_shape:
        dim:
        temperature:
        reverse_coord: stack grid order W, H instead of H, W
        interleave_sin_cos: sin, cos, sin, cos stack instead of sin, sin, cos, cos
        dtype:
        device:

    Returns:

    é   r   zHEmbed dimension must be divisible by 4 for sin-cos 2D position embeddingr   ©r    r!   r   Néÿÿÿÿ©r   r   r   ©r+   ©r   )r(   r   Ústackr
   r$   r%   r&   r   ÚflattenÚ	transposeÚ	unsqueezeÚsinÚcos)r*   r+   r    r,   r-   r   r   Úpos_dimr   ÚsÚgridÚpos2Ú	stack_dimÚpos_embs                 r   Úbuild_sincos2d_pos_embedrA   '   s  € ð. �‰7�aŠ<ÐcÐcÓcˆ<Ø�Q‰h€GÜ�w¨K¸aÈÔO€EáØ¡ " Ñ%ˆ
Ü�;‰;”vàöàô 	�‰�Q˜v¬U¯[©[Ô9×<Ñ<¼U¿]¹]ÕKòó ó ÷ 	‰�‹
—9‘9˜Q “?ð 	ð �>‰>˜"Ó §¡°Ó 2Ñ2€Dñ (‘¨Q€IÜ�k‰kœ5Ÿ9™9 T›?¬E¯I©I°d«OÐ<À)ÔL×TÑTÐUVÓW€GØ�:‰:˜Eˆ:Ó"Ð"ùòs   ÁA
EÚseqc                 óT   — t        | «      dk  r| S | d   | d   gt        | dd  «      z   S )Nr   r   r   )ÚlenÚlist)rB   s    r   Úswap_shape_xyrF   P   s4   € Ü
ˆ3ƒx�!‚|Øˆ
Ø�‰F�C˜‘FÐœd 3 q r 7›mÑ+Ð+r   éà   ç        Úijr   Úmax_resÚinclude_gridÚ	in_pixelsÚref_feat_shapeÚgrid_offsetÚgrid_indexingc           
      ó|  — |€+|rt        |t        |«      ||¬«      }n,t        ||d|¬«      }n|€|j                  }|€|j                  }|
dk(  rt        | «      } |�t        |«      }|r6| D �cg c]*  }t        j                  dd||t        j                  ¬«      ‘Œ, }}nS| D �cg c]H  }t        j                  ||t        j                  ¬«      j                  t        j                  «      |	z   ‘ŒJ }}|�(t        || |«      D ���cg c]  \  }}}||z  |z  ‘Œ }}}}t        j                  t        j                  ||
¬	«      d
¬«      }|j                  d
«      }||z  }|j!                  «       j                  |¬«      |j#                  «       j                  |¬«      }}|r|||g}|S ||g}|S c c}w c c}w c c}}}w )aä  

    Args:
        feat_shape: Feature shape for embedding.
        bands: Pre-calculated frequency bands.
        num_bands: Number of frequency bands (determines output dim).
        max_res: Maximum resolution for pixel based freq.
        temperature: Temperature for non-pixel freq.
        linear_bands: Linear band spacing for pixel based freq.
        include_grid: Include the spatial grid in output.
        in_pixels: Output in pixel freq.
        ref_feat_shape: Reference feature shape for resize / fine-tune.
        grid_offset: Constant offset to add to grid for non-pixel freq.
        grid_indexing: Indexing mode for meshgrid ('ij' or 'xy')
        dtype: Output dtype.
        device: Output device.

    Returns:

    )r   r   r   r0   Úxyg      ð¿r   )Ústepsr   r   r2   ©Úindexingr1   r3   r4   )r   Úfloatr(   r   r   rF   r   r   r   r$   r%   r&   Úzipr5   Úmeshgridr8   r9   r:   )r*   r   r   rJ   r    r   rK   rL   rM   rN   rO   r   r   r<   ÚtÚxÚfÚrr=   ÚposÚpos_sinÚpos_cosÚouts                          r   Úbuild_fourier_pos_embedr`   V   sÂ  € ðF €}ÙÜ$ØÜ�g“Ø)Øô	‰Eô ØØ'ØØô	‰Eð ˆ>Ø—\‘\ˆFØˆ=Ø—K‘KˆEà˜ÒÜ" :Ó.ˆ
ØÐ%Ü*¨>Ó:ˆNáð  ö
àô �N‰N˜3 ¨!°FÄ%Ç-Á-ÖPð
ˆñ 
ð  ö
àô �L‰L˜ 6´·±Ô=×@Ñ@ÄÇÁÓOÐR]Ó]ð
ˆð 
ð
 Ð!ä&)¨!¨Z¸Ó&H×IÐI™7˜1˜a ˆQ�‰U�Q‹YÐIˆÒIä�;‰;”u—~‘~ a°-Ô@ÀbÔI€DØ�>‰>˜"Ó€DØ
�‰,€Cà—w‘w“y—|‘|¨%�|Ó0°#·'±'³)·,±,ÀU°,Ó2KˆW€GÙ&2ˆ4�˜'Ð
"€CØ€Jð :AÀ'Ð8J€CØ€Jùò)
ùò

ùô Js   Á-/F-Â#AF2ÄF7c                   óT   ‡ — e Zd Z	 	 	 	 	 	 ddedefˆ fd„Zd	d„Zd	d„Zd	d„Zd„ Zˆ xZ	S )
ÚFourierEmbedrJ   r   c                 óÎ   •— t         ‰| �  «        || _        || _        || _        || _        | j                  dt        j                  |||¬«      d¬«       | j                  «        y )Nr   r2   F©Ú
persistent)
ÚsuperÚ__init__rJ   r   Úconcat_gridÚkeep_spatialÚregister_bufferr   ÚemptyÚreset_parameters)ÚselfrJ   r   rh   ri   r   r   Ú	__class__s          €r   rg   zFourierEmbed.__init__­   s`   ø€ ô 	‰ÑÔØˆŒØ"ˆŒØ&ˆÔØ(ˆÔØ×Ñ˜W¤e§k¡k°)ÀFÐRWÔ&XÐejÐÔkð 	×ÑÕr   c                 ó$   — | j                  «        y©z"Initialize parameters and buffers.N©Ú_init_buffers©rm   s    r   rl   zFourierEmbed.reset_parametersÀ   ó   € à×ÑÕr   c                 óv   — | j                   j                  t        | j                  | j                  «      «       y©ú.Compute and fill non-persistent buffer values.N)r   Úcopy_r   r   rJ   rs   s    r   rr   zFourierEmbed._init_buffersÄ   s$   € à�
‰
×ÑÔ)¨$¯.©.¸$¿,¹,ÓGÕHr   c                 ó$   — | j                  «        y©z"Initialize non-persistent buffers.Nrq   rs   s    r   Úinit_non_persistent_buffersz(FourierEmbed.init_non_persistent_buffersÈ   rt   r   c           	      óè  — |j                   d d \  }}|j                   dd  }t        || j                  | j                  |j                  |j
                  ¬«      }t        j                  |d¬«      }|j                  dd«      j                  t        |«      «      }|fd|j                  dz
  z  z   }| j                  rKt        j                  ||j                  d«      j                  |«      j                  dd	dd«      gd¬«      }|S t        j                  |j                  ddd	d«      |j                  d«      j                  |«      gd¬«      }|j!                  ||j#                  «       d«      }|S )
Nr   )rK   r   r   r1   r3   éþÿÿÿ©r1   r   r   é   )Úshaper`   r   rh   r   r   r   Úcatr7   r6   rD   Úndimri   r8   ÚexpandÚpermuteÚreshapeÚnumel)rm   rY   ÚBÚCr*   ÚembÚbatch_expands          r   ÚforwardzFourierEmbed.forwardÌ   sC  € Ø�w‰w�r˜ˆ{‰ˆˆ1Ø—W‘W˜Q˜R�[ˆ
Ü%ØØ�J‰JØ×)Ñ)Ø—'‘'Ø—8‘8ô
ˆô �i‰i˜ Ô$ˆØ�m‰m˜B Ó#×+Ñ+¬C°
«OÓ<ˆØ�t˜e q§v¡v°¡zÑ2Ñ2ˆð ×ÒÜ—	‘	˜1˜cŸm™m¨AÓ.×5Ñ5°lÓC×KÑKÈAÈqÐRSÐUVÓWÐXÐ^_Ô`ˆAð
 ˆô —	‘	˜1Ÿ9™9 Q¨¨1¨aÓ0°#·-±-ÀÓ2B×2IÑ2IÈ,Ó2WÐXÐ^`ÔaˆAØ—	‘	˜!˜Z×-Ñ-Ó/°Ó4ˆAàˆr   )rG   r)   TFNN©r"   N)
Ú__name__Ú
__module__Ú__qualname__Úintrg   rl   rr   r{   r‹   Ú__classcell__©rn   s   @r   rb   rb   «   sC   ø„ ð ØØØØØñ àð ð õ ó&óIóör   rb   c                 ó†   — t        j                  | ddd d…f    | dd d d…f   gd«      j                  | j                  «      S )N.r   r   r1   )r   r5   r…   r€   )rY   s    r   Úrotr”   ä   sE   € ô �;‰;˜˜3   1 ˜9™˜ q¨©c°¨c¨¡{Ð3°RÓ8×@Ñ@ÀÇÁÓIÐIr   rY   c                 ób   — | j                  dd¬«      \  }}t        j                  | |gd¬«      S )Nr   r1   r3   )Úchunkr   r�   )rY   Úx1Úx2s      r   Úrope_rotate_halfr™   ê   s1   € ð �W‰W�Q˜BˆWÓ�F€BˆÜ�9‰9�r�c˜2�Y BÔ'Ð'r   Úsin_embÚcos_embÚhalfc                 óV   — |r| |z  t        | «      |z  z   S | |z  t        | «      |z  z   S ©N)r™   r”   )rY   rš   r›   rœ   s       r   Úapply_rot_embedrŸ   ñ   s=   € ñ ð �7‰{Ô-¨aÓ0°7Ñ:Ñ:Ð:ð
 �7‰{œS ›V gÑ-Ñ-Ð-r   c                 óÜ   — t        | t        j                  «      r| g} |r"| D �cg c]  }||z  t        |«      |z  z   ‘Œ c}S | D �cg c]  }||z  t	        |«      |z  z   ‘Œ c}S c c}w c c}w rž   )Ú
isinstancer   ÚTensorr™   r”   )rY   rš   r›   rœ   rX   s        r   Úapply_rot_embed_listr£     su   € ô �!”U—\‘\Ô"ØˆCˆáð FGÖGÀ��G‘Ô.¨qÓ1°GÑ;Ó;ÒGÐGð
 9:Ö:°1��G‘œc !›f wÑ.Ó.Ò:Ð:ùò Hùò
 ;s   ¤A$ÁA)r‰   c                 ó€   — |j                  dd«      \  }}|r| |z  t        | «      |z  z   S | |z  t        | «      |z  z   S )Nr   r1   )r–   r™   r”   )rY   r‰   rœ   rš   r›   s        r   Úapply_rot_embed_catr¥     sR   € ð
 —y‘y  BÓ'Ñ€GˆWáð �7‰{Ô-¨aÓ0°7Ñ:Ñ:Ð:ð
 �7‰{œS ›V gÑ-Ñ-Ð-r   Ú	pos_embedÚkeep_indicesÚpos_embed_has_batchc                 óò  — |rt        |j                  dk\  d«       nYt        |j                  dk\  d«       | j                  d   fd|j                  z  z   }|j                  d«      j	                  |«      }|j                  d   fd|j                  dz
  z  z   |j                  d   dfz   }|j                  |«      }t        |j                  «      }d|d	<   |j	                  |«      }|j                  d	|«      S )
aá   Apply keep indices to different ROPE shapes

    Expected pos_embed shapes:
    * [seq_len, pos_embed_dim] --> output [batch_size, seq_len, pos_embed_dim]
    * [num_heads, seq_len, pos_embed_dim] --> output [batch_size, num_heads, seq_len, pos_embed_dim]
    * [depth, num_heads, seq_len, pos_embed_dim] --> output [batch_size, depth, num_heads, seq_len, pos_embed_dim]

    And all of the above with leading batch dimension already present if `pos_embed_has_batch == True`

    r   zIncorrect number of dimensionsr   r   r~   )r   r   r1   r}   )r   r‚   r€   r8   rƒ   ÚviewrE   Úgather)rY   r¦   r§   r¨   Úexpand_shapeÚ
keep_shapeÚkeep_expands          r   Úapply_keep_indices_nlcr¯   ,  sô   € ñ  ä�	—‘ !Ñ#Ð%EÕFô 	�	—‘ !Ñ#Ð%EÔFØŸ™ ™
�} u¨y¯~©~Ñ'=Ñ=ˆØ×'Ñ'¨Ó*×1Ñ1°,Ó?ˆ	ð ×$Ñ$ QÑ'Ð)¨D°I·N±NÀQÑ4FÑ,GÑGÈ<×K]ÑK]Ð^_ÑK`ÐbcÐJdÑd€JØ×$Ñ$ ZÓ0€Lô �y—‘Ó'€KØ€K��OØ×&Ñ& {Ó3€Là×Ñ˜B Ó-Ð-r   c                 óè   — t        | ||dz  |||||||	|
|¬«      \  }}d}| D ]  }||z  }Œ	 |j                  |d«      j                  dd«      }|j                  |d«      j                  dd«      }||fS )aÐ  

    Args:
        feat_shape: Spatial shape of the target tensor for embedding.
        bands: Optional pre-generated frequency bands
        dim: Output dimension of embedding tensor.
        max_res: Maximum resolution for pixel mode.
        temperature: Temperature (inv freq) for non-pixel mode
        linear_bands: Linearly (instead of log) spaced bands for pixel mode
        in_pixels: Pixel vs language (inv freq) mode.
        ref_feat_shape: Reference feature shape for resize / fine-tune.
        grid_offset: Constant offset to add to grid for non-pixel freq.
        grid_indexing: Indexing mode for meshgrid ('ij' or 'xy')
        device: Output device.
        dtype: Output dtype.

    Returns:

    r/   )r   r   rJ   r    r   rL   rM   rN   rO   r   r   r   r1   r   )r`   r…   Úrepeat_interleave)r*   r   r+   rJ   r    r   rL   rM   rN   rO   r   r   rš   r›   Únum_spatial_dimrY   s                   r   Úbuild_rotary_pos_embedr³   Q  s¡   € ôB /ØØØ˜‘(ØØØ!ØØ%ØØ#ØØôÑ€GˆWð €Oàò ˆØ˜1Ñ‰ðà�o‰o˜o¨rÓ2×DÑDÀQÈÓK€GØ�o‰o˜o¨rÓ2×DÑDÀQÈÓK€GØ�GÐÐr   c                   óä   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddedeee      deee      dede	f
ˆ fd„Z
dd	„Zdd
„Zdd„Zdej                  fdee   fd„Zdd„Zdee   fd„Zddeee      fd„Zd„ Zˆ xZS )ÚRotaryEmbeddinga®   Rotary position embedding

    NOTE: This is my initial attempt at impl rotary embedding for spatial use, it has not
    been well tested, and will likely change. It will be moved to its own file.

    The following impl/resources were referenced for this impl:
    * https://github.com/lucidrains/vit-pytorch/blob/6f3a5fcf0bca1c5ec33a35ef48d97213709df4ba/vit_pytorch/rvt.py
    * https://blog.eleuther.ai/rotary-embeddings/
    Nr   r*   rM   rN   rO   c                 ó.  •— t         ‰| �  «        || _        || _        || _        || _        || _        || _        || _        || _	        |	| _
        |d u| _        |€?|dz  f}| j                  dt        j                  ||
|¬«      d¬«       d | _        d | _        nmd | _        d}|D ]  }||z  }Œ	 ||f}| j                  dt        j                  ||
|¬«      d¬«       | j                  dt        j                  ||
|¬«      d¬«       | j%                  «        y )	Nr/   r   r2   Frd   r   Úpos_embed_sinÚpos_embed_cos)rf   rg   r+   rJ   r    r   rL   r*   rM   rN   rO   Ú_use_cached_embedrj   r   rk   r·   r¸   r   rl   ©rm   r+   rJ   r    rL   r   r*   rM   rN   rO   r   r   Úbands_shapeÚnum_posr<   Ú	emb_shapern   s                   €r   rg   zRotaryEmbedding.__init__”  s/  ø€ ô 	‰ÑÔØˆŒØˆŒØ&ˆÔØ(ˆÔØ"ˆŒØ$ˆŒØ,ˆÔØ&ˆÔØ*ˆÔð ",°4Ð!7ˆÔàÐà !™8˜+ˆKØ× Ñ  ¬%¯+©+°kÈ&ÐX]Ô*^ÐkpÐ ÔqØ!%ˆDÔØ!%ˆDÕð ˆDŒJØˆGØò �Ø˜1‘‘ðà  #˜ˆIØ× Ñ  ´%·+±+¸iÐPVÐ^cÔ2dÐqvÐ ÔwØ× Ñ  ´%·+±+¸iÐPVÐ^cÔ2dÐqvÐ Ôwð 	×ÑÕr   c                 ó$   — | j                  «        yrp   rq   rs   s    r   rl   z RotaryEmbedding.reset_parametersÃ  rt   r   c                 ó  — | j                   s*| j                  j                  | j                  «       «       y| j	                  | j
                  «      \  }}| j                  j                  |«       | j                  j                  |«       yrv   )r¹   r   rx   Ú_compute_bandsÚ_get_pos_embed_valuesr*   r·   r¸   )rm   Úemb_sinÚemb_coss      r   rr   zRotaryEmbedding._init_buffersÇ  sg   € à×%Ò%Ø�J‰J×Ñ˜T×0Ñ0Ó2Õ3à#×9Ñ9¸$¿/¹/ÓJÑˆG�WØ×Ñ×$Ñ$ WÔ-Ø×Ñ×$Ñ$ WÕ-r   c                 óü   — | j                   r9t        | j                  dz  t        | j                  «      | j
                  ¬«      }n%t        | j                  dz  | j                  d¬«      }|j                  ||¬«      S ©zCompute frequency bands.r/   )r   r   )r    r!   r2   ©	rL   r   r+   rU   rJ   r   r(   r    r&   ©rm   r   r   r   s       r   rÀ   zRotaryEmbedding._compute_bandsÐ  ók   € à�>Š>Ü$Ø—‘˜A‘Ü�d—l‘lÓ#Ø!×.Ñ.ô‰Eô Ø—‘˜A‘Ø ×,Ñ,ØôˆEð
 �x‰x˜v¨UˆxÓ3Ð3r   c                 óÜ   — t        || j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  ||¬«      \  }}||fS )N©r*   r+   rJ   r    r   rL   rM   rN   rO   r   r   )	r³   r+   rJ   r    r   rL   rM   rN   rO   )rm   r*   r   r   rÂ   rÃ   s         r   rÁ   z%RotaryEmbedding._get_pos_embed_valuesà  si   € Ü1Ø!Ø—‘Ø—L‘LØ×(Ñ(Ø×*Ñ*Ø—n‘nØ×.Ñ.Ø×(Ñ(Ø×,Ñ,ØØô
Ñˆ�ð ˜ÐÐr   c                 ó$   — | j                  «        yrz   rq   rs   s    r   r{   z+RotaryEmbedding.init_non_persistent_buffersð  rt   r   c                 ó  — | j                   �}|| j                   k7  rm| j                  €J ‚| j                  €J ‚| j                  || j                  j                  | j                  j
                  ¬«      \  | _        | _        || _         y y y ©Nr2   )r*   r·   r¸   rÁ   r   r   ©rm   r*   s     r   Úupdate_feat_shapez!RotaryEmbedding.update_feat_shapeô  s�   € Ø�?‰?Ð&¨:¸¿¹Ò+Hà×%Ñ%Ð1Ð1Ð1Ø×%Ñ%Ð1Ð1Ð1Ø59×5OÑ5OØØ×)Ñ)×0Ñ0Ø×(Ñ(×.Ñ.ð 6Pó 6Ñ2ˆDÔ Ô 2ð
 )ˆD�Oð ,IÐ&r   r€   c                 ó  — |�O| j                   �Ct        || j                   | j                  | j                  | j                  | j
                  ¬«      S | j                  �$| j                  �| j                  | j                  fS J d«       ‚)N©rL   rM   rN   rO   zQget_embed() requires pre-computed pos embeds or valid shape w/ pre-computed bands)r   r³   rL   rM   rN   rO   r·   r¸   )rm   r€   s     r   Ú	get_embedzRotaryEmbedding.get_embed   s…   € ØÐ §¡Ð!7ä)ØØ—
‘
ØŸ.™.Ø#×2Ñ2Ø ×,Ñ,Ø"×0Ñ0ôð ð ×ÑÐ+°×0BÑ0BÐ0NØ×%Ñ% t×'9Ñ'9Ð9Ð9àmÐmÓm�5r   c                 ó^   — | j                  |j                  dd  «      \  }}t        |||«      S ©Nr   )rÒ   r€   rŸ   )rm   rY   rš   r›   s       r   r‹   zRotaryEmbedding.forward  s.   € àŸ>™>¨!¯'©'°!°"¨+Ó6Ñˆ�Ü˜q '¨7Ó3Ð3r   ©
rG   i'  TFNNrH   rI   NNrŒ   ©NNrž   )r�   rŽ   r�   Ú__doc__Úboolr   r   r�   rU   Ústrrg   rl   rr   rÀ   r   r   rÁ   r{   rÏ   rÒ   r‹   r‘   r’   s   @r   rµ   rµ   ‰  sÏ   ø„ ñð ØØØ!&Ø.2Ø26Ø!#Ø!%ØØñ- ð ð- ð !  c¡Ñ+ð- ð % T¨#¡YÑ/ð- ð ð- ð õ- ó^ó.ó4ð  CGÈeÏmÉmñ  °°S±	ó  ó ð
)¨D°©Ió 
)ñn˜x¨¨S©	Ñ2ó nö 4r   rµ   c                   óZ  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddedededededeee      d	eee      d
ede	fˆ fd„Z
dd„Zdd„Zdd„Zdej                  fdee   fd„Zdd„Zdee   fd„Zddeee      fd„Z	 ddeeeef      dee   deej,                  eej,                     f   fd„Zd„ Zˆ xZS )ÚRotaryEmbeddingCata   Rotary position embedding w/ concatenatd sin & cos

    The following impl/resources were referenced for this impl:
    * https://github.com/lucidrains/vit-pytorch/blob/6f3a5fcf0bca1c5ec33a35ef48d97213709df4ba/vit_pytorch/rvt.py
    * https://blog.eleuther.ai/rotary-embeddings/
    Nr+   rJ   r    rL   r   r*   rM   rN   rO   c                 óÒ  •— t         ‰| �  «        || _        || _        || _        || _        || _        || _        || _        || _	        |	| _
        |d u| _        |€8|dz  f}| j                  dt        j                  ||
|¬«      d¬«       d | _        nFd | _        d}|D ]  }||z  }Œ	 ||dz  f}| j                  dt        j                  ||
|¬«      d¬«       | j#                  «        y )	Nr/   r   r2   Frd   r   r   r¦   )rf   rg   r+   rJ   r    rL   r   r*   rM   rN   rO   r¹   rj   r   rk   r¦   r   rl   rº   s                   €r   rg   zRotaryEmbeddingCat.__init__  s  ø€ ô 	‰ÑÔØˆŒØˆŒØ&ˆÔØ"ˆŒØ(ˆÔØ$ˆŒØ,ˆÔØ&ˆÔØ*ˆÔð ",°4Ð!7ˆÔàÐà !™8˜+ˆKØ× Ñ  ¬%¯+©+°kÈ&ÐX]Ô*^ÐkpÐ ÔqØ!ˆD�Nð ˆDŒJØˆGØò �Ø˜1‘‘ðà  #¨¡'Ð*ˆIØ× Ñ  ¬e¯k©k¸)ÈFÐZ_Ô.`ÐmrÐ Ôsð 	×ÑÕr   r"   c                 ó$   — | j                  «        yrp   rq   rs   s    r   rl   z#RotaryEmbeddingCat.reset_parametersK  rt   r   c                 óØ   — | j                   s*| j                  j                  | j                  «       «       y| j                  j                  | j                  | j                  «      «       yrv   )r¹   r   rx   rÀ   r¦   rÁ   r*   rs   s    r   rr   z RotaryEmbeddingCat._init_buffersO  sG   € à×%Ò%Ø�J‰J×Ñ˜T×0Ñ0Ó2Õ3à�N‰N× Ñ  ×!;Ñ!;¸D¿O¹OÓ!LÕMr   c                 óü   — | j                   r9t        | j                  dz  t        | j                  «      | j
                  ¬«      }n%t        | j                  dz  | j                  d¬«      }|j                  ||¬«      S rÅ   rÆ   rÇ   s       r   rÀ   z!RotaryEmbeddingCat._compute_bandsV  rÈ   r   c                 óú   — t        || j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  ||¬«      }t        j                  |d«      S )NrÊ   r1   )r³   r+   rJ   r    r   rL   rM   rN   rO   r   r�   )rm   r*   r   r   Úembedss        r   rÁ   z(RotaryEmbeddingCat._get_pos_embed_valuesf  sj   € Ü'Ø!Ø—‘Ø—L‘LØ×(Ñ(Ø×*Ñ*Ø—n‘nØ×.Ñ.Ø×(Ñ(Ø×,Ñ,ØØô
ˆô �y‰y˜ Ó$Ð$r   c                 ó$   — | j                  «        yrz   rq   rs   s    r   r{   z.RotaryEmbeddingCat.init_non_persistent_buffersv  rt   r   c                 óê   — | j                   �g|| j                   k7  rW| j                  €J ‚| j                  || j                  j                  | j                  j                  ¬«      | _        || _         y y y rÍ   )r*   r¦   rÁ   r   r   rÎ   s     r   rÏ   z$RotaryEmbeddingCat.update_feat_shapez  sm   € Ø�?‰?Ð&¨:¸¿¹Ò+Hà—>‘>Ð-Ð-Ð-Ø!×7Ñ7ØØ—~‘~×,Ñ,Ø—n‘n×*Ñ*ð 8ó ˆDŒNð
 )ˆD�Oð ,IÐ&r   r€   c                 ó  — |�e| j                   �Yt        || j                   | j                  | j                  | j                  | j
                  ¬«      }t        j                  |d«      S | j                  �| j                  S J d«       ‚)NrÑ   r1   zPget_embed() requires pre-computed pos embed or valid shape w/ pre-computed bands)	r   r³   rL   rM   rN   rO   r   r�   r¦   )rm   r€   rá   s      r   rÒ   zRotaryEmbeddingCat.get_embed…  sy   € ØÐ §¡Ð!7ä+ØØ—
‘
ØŸ.™.Ø#×2Ñ2Ø ×,Ñ,Ø"×0Ñ0ôˆFô —9‘9˜V RÓ(Ð(Ø�^‰^Ð'Ø—>‘>Ð!àlÐlÓl�5r   ÚshapesÚseq_lenc                 óÎ  — |sg S | j                   €t        d«      ‚t        d„ |D «       «      }t        d„ |D «       «      }t        ||f| j                   | j                  | j
                  | j                  | j                  ¬«      \  }}t        j                  ||gd¬«      j                  ||d«      }|�{t        j                  t        |«      ||j                  d   «      j                  |«      }t        |«      D ]/  \  }	\  }
}|
|z  }|d|
…d|…f   j!                  |d«      ||	d|…f<   Œ1 |S |D �
�cg c]#  \  }
}|d|
…d|…f   j!                  |
|z  d«      ‘Œ% }}
}|S c c}}
w )a»  Generate ROPE embeddings for multiple grid shapes efficiently.

        Computes embeddings for the maximum grid size once, then extracts
        and flattens the relevant portions for each requested shape.

        Args:
            shapes: List of (H, W) tuples representing different grid sizes

        Returns:
            List of concatenated sin/cos embeddings for each shape,
            where each tensor has shape (H*W, dim)
        NzMBatch embedding generation requires cached bands, not pre-computed embeddingsc              3   ó&   K  — | ]	  \  }}|–— Œ y ­wrž   © ©Ú.0ÚhÚws      r   ú	<genexpr>z6RotaryEmbeddingCat.get_batch_embeds.<locals>.<genexpr>°  ó   è ø€ Ò)™$˜!˜Q”AÑ)ùó   ‚c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wrž   ré   rê   s      r   rî   z6RotaryEmbeddingCat.get_batch_embeds.<locals>.<genexpr>±  rï   rð   )r*   r   rL   rM   rN   rO   r1   r3   )r   ÚRuntimeErrorÚmaxr³   rL   rM   rN   rO   r   r�   rª   ÚzerosrD   r€   Útype_asÚ	enumerater…   )rm   rå   ræ   Úmax_hÚmax_wrš   r›   Úrope_embed_2dÚflat_embedsÚirì   rí   Úsrc_lenÚflat_embeds_lists                 r   Úget_batch_embedsz#RotaryEmbeddingCat.get_batch_embeds–  s‰  € ñ" ØˆIð �:‰:ÐäÐnÓoÐoô Ñ) &Ô)Ó)ˆÜÑ) &Ô)Ó)ˆô 2Ø˜u�~Ø—*‘*Ø—n‘nØ×.Ñ.Ø×(Ñ(Ø×,Ñ,ô
Ñˆ�ô Ÿ	™	 7¨GÐ"4¸"Ô=×BÑBÀ5È%ÐQSÓTˆàÐÜŸ+™+¤c¨&£k°7¸M×<OÑ<OÐPRÑ<SÓT×\Ñ\Ð]dÓeˆKÜ& vÓ.ò V‘	�‘6�A�qØ˜a™%�Ø+8¸¸!¸¸R¸a¸R¸Ñ+@×+HÑ+HÈÐRTÓ+U�˜A˜x ˜x˜KÒ(ðVð ÐàU[×\ÉTÈQÐPQ ¨b¨q¨b°"°1°"¨fÑ 5× =Ñ =¸aÀ!¹eÀRÕ HÐ\ÐÑ\Ø#Ð#ùó  ]s   Ä4(E!c                 óV   — | j                  |j                  dd  «      }t        ||«      S rÔ   ©rÒ   r€   r¥   ©rm   rY   r¦   s      r   r‹   zRotaryEmbeddingCat.forwardË  ó'   € à—N‘N 1§7¡7¨1¨2 ;Ó/ˆ	Ü" 1 iÓ0Ð0r   rÕ   rŒ   rÖ   rž   )r�   rŽ   r�   r×   r�   rU   rØ   r   r   rÙ   rg   rl   rr   rÀ   r   r   rÁ   r{   rÏ   rÒ   r   r   r¢   rþ   r‹   r‘   r’   s   @r   rÛ   rÛ     sE  ø„ ñð Ø!&Ø"Ø!&Ø.2Ø26Ø!#Ø!%ØØñ+ àð+ ð ð+ ð ð	+ ð
 ð+ ð ð+ ð !  c¡Ñ+ð+ ð % T¨#¡YÑ/ð+ ð ð+ ð õ+ óZóNó4ð  CGÈeÏmÉmñ %°°S±	ó %ó ð	)¨D°©Ió 	)ñm˜x¨¨S©	Ñ2ó mð( &*ñ3$à˜˜s C˜x™Ñ)ð3$ð ˜c‘]ð3$ð 
ˆu�|‰|˜T %§,¡,Ñ/Ð/Ñ	0ó	3$öj1r   rÛ   r2   Úhead_dimÚdepthÚ	num_headsÚrotatec          	      ó´  — d|t        j                  d| d||¬«      | z  z  z  }|j                  d«      j                  d«      }|r/t        j                  ||d||¬«      dz  t         j                  z  }nt        j
                  ||d||¬«      }t        j                  |t        j                  |«      z  |t        j                  |t         j                  dz  z   «      z  gd¬«      }	t        j                  |t        j                  |«      z  |t        j                  |t         j                  dz  z   «      z  gd¬«      }
t        j                  |	|
gd¬«      S )	zŽ Vectorised 2D ROPE frequencies with random rotation for mixed mode ROPE.
    Returns:
         Tensor (2, depth, num_heads, head_dim//2)
    r   r   r/   r2   r   r   r1   r3   )
r   r$   r8   Úrandr   rô   r�   r:   r9   r5   )r  r  r  r    r  r   r   ÚmagÚanglesÚfxÚfys              r   Úinit_random_2d_freqsr  Ñ  s!  € ð �¤§¡¨a°¸1ÀVÐSXÔ!YÐ\dÑ!dÑeÑ
f€Cð �-‰-˜Ó
×
$Ñ
$ QÓ
'€Cñ Ü—‘˜E 9¨a¸ÀeÔLÈqÑPÔSX×S[ÑS[Ñ[‰ä—‘˜U I¨q¸ÀuÔMˆô 
�‰�Cœ%Ÿ)™) FÓ+Ñ+¨S´5·9±9¸VÄeÇhÁhÐQRÁlÑ=RÓ3SÑ-SÐTÐZ\Ô	]€BÜ	�‰�Cœ%Ÿ)™) FÓ+Ñ+¨S´5·9±9¸VÄeÇhÁhÐQRÁlÑ=RÓ3SÑ-SÐTÐZ\Ô	]€Bô �;‰;˜˜B�x QÔ'Ð'r   r€   c                 óx  — |dk(  rt        | «      } t        j                  t        j                  | d   |t        j                  ¬«      t        j                  | d   |t        j                  ¬«      |¬«      \  }}|j                  |«      j                  «       }|j                  |«      j                  «       }||fS )NrQ   r   r2   r   rS   )rF   r   rW   r$   r   r&   r6   )r€   rO   r   r   Úx_posÚy_posÚt_xÚt_ys           r   Úget_mixed_gridr  ó  s’   € ð ˜ÒÜ˜eÓ$ˆÜ—>‘>Ü�‰�U˜1‘X f´E·M±MÔBÜ�‰�U˜1‘X f´E·M±MÔBØô�L€Eˆ5ð
 �(‰(�5‹/×
!Ñ
!Ó
#€CØ
�(‰(�5‹/×
!Ñ
!Ó
#€CØ�ˆ8€Or   Úfreqsr  r  c                 óÄ  — | j                   }| j                  «       } |j                  d«      | d   j                  d«      z  }|j                  d«      | d   j                  d«      z  }||z   }t        j                  |«      j                  dd«      }t        j                  |«      j                  dd«      }t        j                  ||gd¬«      }	|	j                  |«      S )z&Compute mixed (learnable) frequencies.r1   r   r}   r   r   r3   )	r   rU   r8   r   r9   r±   r:   r�   r&   )
r  r  r  r   Úfreqs_xÚfreqs_yÚcombinedrš   r›   Úrope_embedss
             r   Úget_mixed_freqsr    sÀ   € ð �K‰K€EØ�K‰K‹M€EØ�}‰}˜RÓ  5¨¡8×#5Ñ#5°bÓ#9Ñ9€GØ�}‰}˜RÓ  5¨¡8×#5Ñ#5°bÓ#9Ñ9€GØ˜Ñ €HÜ�i‰i˜Ó!×3Ñ3°A°rÓ:€GÜ�i‰i˜Ó!×3Ñ3°A°rÓ:€GÜ—)‘)˜W gÐ.°BÔ7€KØ�>‰>˜%Ó Ð r   c            	       óv   ‡ — e Zd ZdZ	 	 	 	 	 d
dedeeeef   dedefˆ fd„Zde	e   de
j                  fd	„Zˆ xZS )ÚRotaryEmbeddingMRopeaa  Interleaved multimodal RoPE (Qwen2-VL style) for vision, matching the reference GenLIP layout.

    Drop-in sibling of ``RotaryEmbeddingCat``: ``get_embed(shape) -> [N, 2*dim]``, consumed by
    ``apply_rot_embed_cat(..., half=True)`` (no new apply path / no separate sin/cos tensors). The ``dim // 2``
    frequency channels are assigned to height/width/temporal axes in a strided ``T,H,W,T,H,W,...`` interleave
    (the reference ``apply_interleaved_mrope``): channels ``1,4,7,...`` -> height, ``2,5,8,...`` -> width, and
    the remainder -> temporal. ``mrope_section`` sets the strided extent per axis; the actual per-axis channel
    *counts* equal ``mrope_section`` only for the standard equal-section configs that tile exactly
    (``3*section == dim // 2``, e.g. ``(12,12,12)`` -> 36 channels = 12/12/12), and are otherwise the clamped
    interleave (e.g. ``dim=64, (8,12,12)`` -> 11/11/10) -- this matches the reference, which also clamps.

    For an image encoder there is no text, so the temporal channels sit at position 0 (inert) and this reduces
    to a 2-axis ``(h, w)`` rope -- numerically identical to a checkpoint trained with the reference MRoPE.

    Only ``grid_indexing='ij'`` is supported (GenLIP / NaFlex ``(y, x)`` row-major patch order); ``'xy'`` would
    require mirroring the timm axial shape-swap and is intentionally not implemented here.
    r+   Úmrope_sectionr    rO   c                 ó  •— t         ‰| �  «        |dz  dk(  sJ d«       ‚t        d„ |D «       «      s
J d|› �«       ‚|dk(  sJ d«       ‚|| _        || _        || _        || _        d|t        j                  d|d|¬	«      j                  «       |z  z  z  }| j                  d
|d¬«       |\  }}	}
t        j                  |dz  t        j                  |¬«      }d|d|	dz  d…<   d|d|
dz  d…<   | j                  d|d¬«       y )Nr   r   zdim (head_dim) must be evenc              3   ó&   K  — | ]	  }|d k\  –— Œ y­w)r   Nré   )rë   r<   s     r   rî   z0RotaryEmbeddingMRope.__init__.<locals>.<genexpr>9  s   è ø€ Ò1˜a�1˜•6Ñ1ùrð   z0mrope_section entries must be non-negative, got rI   zXRotaryEmbeddingMRope supports grid_indexing='ij' only (GenLIP/NaFlex (y,x) patch order).r   ©r   Úinv_freqFrd   r   r   r   Úaxis)rf   rg   Úallr+   r  r    rO   r   r$   rU   rj   rô   Úlong)rm   r+   r  r    rO   r   r   r!  Ú_sec_tÚsec_hÚsec_wr"  rn   s               €r   rg   zRotaryEmbeddingMRope.__init__,  s1  ø€ ô 	‰ÑÔØ�Q‰w˜!Š|Ð:Ð:Ó:ˆ|ô Ñ1 =Ô1Ô1ð 	OØ>¸}¸oÐNó	OÐ1à Ò$ð 	gØfó	gÐ$àˆŒØ*ˆÔØ&ˆÔØ*ˆÔð ˜+¬%¯,©,°q¸#¸qÈÔ*P×*VÑ*VÓ*XÐ[^Ñ*^Ñ_Ñ`ˆØ×Ñ˜Z¨¸eÐÔDð
  -Ñˆ��uÜ�{‰{˜3 !™8¬5¯:©:¸fÔEˆØˆˆQˆu�q‰y˜ˆ]ÑØˆˆQˆu�q‰y˜ˆ]ÑØ×Ñ˜V T°eÐÕ<r   r€   r"   c                 óä  — |\  }}| j                   j                  }t        j                  t        j                  ||¬«      t        j                  ||¬«      | j
                  ¬«      \  }}|j                  d«      j                  «       |j                  d«      j                  «       }}t        j                  |j                  d   | j                  dz  |¬«      }|dd…df   |dd…| j                  dk(  f<   |dd…df   |dd…| j                  dk(  f<   || j                   z  }t        j                  ||gd¬«      }	t        j                  |	j                  «       |	j                  «       gd¬«      S )	z©Args:
            shape: ``(H, W)`` patch grid.

        Returns:
            Rope tensor of shape ``[H*W, 2*dim]`` for ``apply_rot_embed_cat(..., half=True)``.
        r   rS   r1   r   r   Nr   r3   )r!  r   r   rW   r$   rO   r…   rU   rô   r€   r+   r"  r�   r9   r:   )
rm   r€   rì   rí   r   ÚysÚxsr\   r
  r‰   s
             r   rÒ   zRotaryEmbeddingMRope.get_embedO  s'  € ð ‰ˆˆ1Ø—‘×%Ñ%ˆÜ—‘Ü�L‰L˜ 6Ô*Ü�L‰L˜ 6Ô*Ø×'Ñ'ô
‰ˆˆBð
 —‘˜B“×%Ñ%Ó'¨¯©°B«×)=Ñ)=Ó)?ˆBˆä�k‰k˜"Ÿ(™( 1™+ t§x¡x°1¡}¸VÔDˆØ!#¢A t G¡ˆŠAˆt�y‰y˜A‰~ÐÑØ!#¢A t G¡ˆŠAˆt�y‰y˜A‰~ÐÑð �t—}‘}Ñ$ˆÜ�i‰i˜ Ð(¨bÔ1ˆÜ�y‰y˜#Ÿ'™'›) S§W¡W£YÐ/°RÔ8Ð8r   ))é   é   r,  r   rI   NN)r�   rŽ   r�   r×   r�   r   rU   rÙ   rg   r   r   r¢   rÒ   r‘   r’   s   @r   r  r    sk   ø„ ñð* 3>Ø!'Ø!%ØØñ!=àð!=ð !  c¨3 Ñ/ð!=ð ð	!=ð
 õ!=ðF9˜t C™yð 9¨U¯\©\÷ 9r   r  c                   ó@  ‡ — e Zd ZdZ	 	 	 	 	 ddededededeee      defˆ fd„Z	dd
„Z
dd„Zdeee      fd„Zdeee      fd„Zdd„Zddeee      d	ej                   fd„Z	 ddeeeef      dee   d	eej                   eej                      f   fd„Zd„ Zd„ Zˆ xZS )ÚRotaryEmbeddingMixeda~  Rotary position embedding with depth-dependent learnable frequencies.

    This implementation supports mixed (learnable) ROPE. In mixed mode,
    each transformer block has its own set of learnable frequency parameters.

    Based on 'Rotary Position Embedding for Vision: https://arxiv.org/abs/2403.13298)'
    Compatible with original at https://github.com/naver-ai/rope-vit
    r+   r  r  r    r*   rO   c	           	      ó  •— t         ‰| �  «        || _        || _        || _        || _        || _        || _        ||z  }	|	dz  dk(  s
J d|	› �«       ‚t        |	|||d||¬«      }
t        j                  |
«      | _        |�sd}|D ]  }||z  }Œ	 | j                  dt        j                  |||¬	«      d
¬«       | j                  dt        j                  |||¬	«      d
¬«       | j                  «        ydx| _        | _        y)aš  Initialize rotary embeddings.

        Args:
            dim: Embedding dimension (should be divisible by 4)
            depth: Number of transformer blocks
            num_heads: Number of attention heads
            temperature: Base for frequency computation
            feat_shape: Spatial dimensions [H, W] if known in advance
            grid_indexing: How to index grid positions ('xy' or 'ij')
        r/   r   z%head_dim must be divisible by 4, got T)r    r  r   r   Nr   r  r2   Frd   r  )rf   rg   r+   r  r  r    r*   rO   r  r   Ú	Parameterr  rj   r   rk   rr   r  r  )rm   r+   r  r  r    r*   rO   r   r   r  r  r¼   r<   rn   s                €r   rg   zRotaryEmbeddingMixed.__init__r  s  ø€ ô* 	‰ÑÔØˆŒØˆŒ
Ø"ˆŒØ&ˆÔØ$ˆŒØ*ˆÔà˜)Ñ#ˆØ˜!‰|˜qÒ ÐTÐ$IÈ(ÈÐ"TÓTÐ ä$ØØØØ#ØØØô
ˆô —\‘\ %Ó(ˆŒ
àÐ!àˆGØò �Ø˜1‘‘ðà× Ñ  ¬¯©°GÀFÐRWÔ(XÐejÐ ÔkØ× Ñ  ¬¯©°GÀFÐRWÔ(XÐejÐ Ôkà×ÑÕ à"&Ð&ˆDŒH�t•xr   r"   c                 óÆ   — | j                   �U| j                  | j                   «      \  }}| j                  j                  |«       | j                  j                  |«       yyrv   )r*   Ú_get_grid_valuesr  rx   r  )rm   r  r  s      r   rr   z"RotaryEmbeddingMixed._init_buffers©  sI   € à�?‰?Ð&Ø×,Ñ,¨T¯_©_Ó=‰HˆC�Ø�H‰H�N‰N˜3ÔØ�H‰H�N‰N˜3Õð 'r   c                 ó$   — | j                  «        yrp   rq   rs   s    r   rl   z%RotaryEmbeddingMixed.reset_parameters°  rt   r   c                 óh   — t        || j                  | j                  j                  ¬«      \  }}||fS )N©rO   r   )r  rO   r  r   ©rm   r*   r  r  s       r   r2  z%RotaryEmbeddingMixed._get_grid_values´  s4   € Ü!ØØ×,Ñ,Ø—:‘:×$Ñ$ô
‰ˆˆSð
 �Cˆxˆr   c                 ó¨  — | j                   �Æ|| j                   k7  r¶| j                  €J ‚| j                  €J ‚| j                  |«      \  }}|j	                  | j                  j
                  | j                  j                  «      | _        |j	                  | j                  j
                  | j                  j                  «      | _        || _         y y y rž   )r*   r  r  r2  r&   r   r   r6  s       r   rÏ   z&RotaryEmbeddingMixed.update_feat_shape¼  sŸ   € Ø�?‰?Ð&¨:¸¿¹Ò+HØ—8‘8Ð'Ð'Ð'Ø—8‘8Ð'Ð'Ð'Ø×,Ñ,¨ZÓ8‰HˆC�Ø—v‘v˜dŸh™hŸo™o¨t¯x©x¯~©~Ó>ˆDŒHØ—v‘v˜dŸh™hŸo™o¨t¯x©x¯~©~Ó>ˆDŒHØ(ˆD�Oð ,IÐ&r   c                 ó$   — | j                  «        yrz   rq   rs   s    r   r{   z0RotaryEmbeddingMixed.init_non_persistent_buffersÅ  rt   r   r€   c                 ó  — |�0t        || j                  | j                  j                  ¬«      \  }}n8| j                  �%| j
                  �| j                  | j
                  }}nJ d«       ‚t        | j                  ||«      S )zçGenerate rotary embeddings for the given spatial shape.

        Args:
            shape: Spatial dimensions [H, W]

        Returns:
            Tensor of shape (depth, H*W, dim) containing concatenated sin/cos embeddings
        r5  z8get_embed() requires pre-computed t_x/t_y or valid shape)r  rO   r  r   r  r  r  )rm   r€   r  r  s       r   rÒ   zRotaryEmbeddingMixed.get_embedÉ  su   € ð ÐÜ%ØØ"×0Ñ0Ø—z‘z×(Ñ(ô‰HˆC‘ð
 �X‰XÐ! d§h¡hÐ&:Ø—x‘x §¡�‰CàTÐTÓT�5ä˜tŸz™z¨3°Ó4Ð4r   rå   ræ   c           	      óþ  — |sg S t        d„ |D «       «      }t        d„ |D «       «      }t        ||g| j                  | j                  j                  ¬«      \  }}t        | j                  ||«      }|j                  \  }}	}
}|j                  ||	|||«      }|�¡t        |«      }t        j                  |||	||| j                  j                  | j                  j                  ¬«      }t        |«      D ]B  \  }\  }}|dd…dd…d|…d|…f   j                  ||	||z  |«      }||z  }|||dd…dd…d|…f<   ŒD |S g }|D ]<  \  }}|dd…dd…d|…d|…f   j                  ||	||z  |«      }|j                  |«       Œ> |S )ai  Generate ROPE embeddings for multiple grid shapes efficiently.

        Computes embeddings for the maximum grid size once, then extracts
        and flattens the relevant portions for each requested shape.

        Args:
            shapes: List of (H, W) tuples representing different grid sizes
            seq_len: If provided, return padded tensor of this length. Otherwise return list.

        Returns:
            If seq_len is provided: Padded tensor of shape (len(shapes), depth, num_heads, seq_len, dim)
            Otherwise: List of tensors with shape (depth, num_heads, H*W, dim) for each shape
        c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wrž   ré   rê   s      r   rî   z8RotaryEmbeddingMixed.get_batch_embeds.<locals>.<genexpr>õ  rï   rð   c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wrž   ré   rê   s      r   rî   z8RotaryEmbeddingMixed.get_batch_embeds.<locals>.<genexpr>ö  rï   rð   r5  Nr2   )ró   r  rO   r  r   r  r€   rª   rD   r   rô   r   rö   r…   Úappend)rm   rå   ræ   r÷   rø   r  r  Ú	max_embedr  r  Ú_r+   Úmax_embed_2dr‡   Úpaddedrû   rì   rí   Úembed_sliceÚ
actual_lenÚresultss                        r   rþ   z%RotaryEmbeddingMixed.get_batch_embedsß  s¯  € ñ$ ØˆIô Ñ) &Ô)Ó)ˆÜÑ) &Ô)Ó)ˆô "Ø�EˆNØ×,Ñ,Ø—:‘:×$Ñ$ô
‰ˆˆSô
 $ D§J¡J°°SÓ9ˆ	ð $-§?¡?Ñ ˆˆy˜!˜SØ —~‘~ e¨Y¸¸uÀcÓJˆàÐä�F“ˆAÜ—[‘[  E¨9°g¸sÈ4Ï:É:×K\ÑK\Ðdh×dnÑdn×dtÑdtÔuˆFÜ& vÓ.ò ;‘	�‘6�A�qà*ª1ªa°°!°°R°a°R¨<Ñ8×@Ñ@ÀÈ	ÐSTÐWXÑSXÐZ]Ó^�Ø ™U�
Ø/:��qš!šQ   Ð+Ò,ð	;ð
 ˆMð ˆGØò ,‘��1à*ª1ªa°°!°°R°a°R¨<Ñ8×@Ñ@ÀÈ	ÐSTÐWXÑSXÐZ]Ó^�Ø—‘˜{Õ+ð,ð ˆNr   c                 óV   — | j                  |j                  dd  «      }t        ||«      S rÔ   r   r  s      r   r‹   zRotaryEmbeddingMixed.forward  r  r   c                 ó   — dhS )z/Exclude frequency parameters from weight decay.r  ré   rs   s    r   Úno_weight_decayz$RotaryEmbeddingMixed.no_weight_decay  s
   € àˆyÐr   )ç      $@NrQ   NNrŒ   rž   )r�   rŽ   r�   r×   r�   rU   r   r   rÙ   rg   rr   rl   r2  rÏ   r{   r   r¢   rÒ   r   r   rþ   r‹   rG  r‘   r’   s   @r   r.  r.  i  s  ø„ ñð "&Ø.2Ø!%ØØñ5'àð5'ð ð5'ð ð	5'ð
 ð5'ð !  c¡Ñ+ð5'ð õ5'ón óð¨8°D¸±IÑ+>ó ð)¨H°T¸#±YÑ,?ó )óñ5˜x¨¨S©	Ñ2ð 5¸e¿l¹ló 5ð2 &*ñ6à˜˜s C˜x™Ñ)ð6ð ˜c‘]ð6ð 
ˆu�|‰|˜T %§,¡,Ñ/Ð/Ñ	0ó	6òp1ö
r   r.  ÚseparateÚcpuÚheightÚwidthÚnormalize_coordsc                 óØ  — t        j                  d| |t         j                  ¬«      |z   }t        j                  d||t         j                  ¬«      |z   }|dk(  rt        t	        | |«      «      }	|	}
|	}nI|dk(  rt        t        | |«      «      }	|	}
|	}n*|dk(  rt        | «      }
t        |«      }nt        d|› �«      ‚||
z  }||z  }|j                  |«      }|j                  |«      }|dk(  r5t        j                  ||d¬«      \  }}t        j                  ||gd	¬
«      }n-t        j                  t        j                  ||d¬«      d	¬
«      }|j                  dd«      }d|z  dz
  }|S )z{Make coordinate grid matching offset and normalization of original.
    Returns: coords with shape (HW, 2) in [-1, 1].
    g      à?r2   ró   ÚminrI  zUnknown normalize_coords: rQ   rS   r1   r3   rI   r   r   ç       @r   )r   r$   r   rU   ró   rO  Ú
ValueErrorr&   rW   r5   r6   )rK  rL  rM  rO   rN   r   r   Úcoords_hÚcoords_wÚdenomÚh_denomÚw_denomÚgrid_wÚgrid_hÚcoordss                  r   Úmake_coords_dinov3rZ  !  s]  € ô �|‰|˜C °¼e¿m¹mÔLÈ{ÑZ€HÜ�|‰|˜C ¨v¼U¿]¹]ÔKÈkÑY€Hð ˜5Ò Ü”c˜& %Ó(Ó)ˆØˆØ‰Ø	˜UÒ	"Ü”c˜& %Ó(Ó)ˆØˆØ‰Ø	˜ZÒ	'Ü˜“-ˆÜ˜“,‰äÐ5Ð6FÐ5GÐHÓIÐIð ˜'Ñ!€HØ˜'Ñ!€HØ�{‰{˜5Ó!€HØ�{‰{˜5Ó!€Hð ˜ÒÜŸ™¨°(ÀTÔJ‰ˆ�Ü—‘˜f fÐ-°2Ô6‰ä—‘œUŸ^™^¨H°hÈÔNÐTVÔWˆØ�^‰^˜A˜qÓ!€FØ�6‰\˜CÑ€FØ€Mr   c                   óp  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 d"dedee   dee   dee   deee      deded	ed
e	dee   dee   dee   fˆ fd„Z
d#d„Zd#d„Zdej                  fdej                  dej                   dej"                  fd„Zdej"                  dej"                  fd„Zdej"                  deej"                  ej"                  f   fd„Z	 d$dee   de	dej"                  fd„Zdee   fd„Zdee   fd„Zd#d„Zd%deee      dej"                  fd„Zd ej"                  dej"                  fd!„Zˆ xZS )&ÚRotaryEmbeddingDinoV3a  RoPE for timm DinoV3 port, numerically matching original.

    Math is aligned to original DinoV3 RopePositionEmbedding at https://github.com/facebookresearch/dinov3:
      - 0.5-centered coords normalized by H/W (or min/max), mapped to [-1,1]
      - training-time augmentations (shift/jitter/rescale)
      - periods schedule equals Rope's temperature (base) or min/max period
    r+   r    Ú
min_periodÚ
max_periodr*   rM  rN   rO   Úrotate_halfÚshift_coordsÚjitter_coordsÚrescale_coordsc                 ót  •— t         ‰| �  «        || _        |	| _        t	        |«      | _        || _        || _        || _        |
| _	        || _
        || _        t        | j                  | j                  | j                  fD �cg c]  }|d u‘Œ c}«      | _        || _        || _        || _        |dz  f}| j#                  dt%        j&                  |||¬«      d¬«       |�=|d   |d   z  }||dz  f}| j#                  d	t%        j&                  |||¬«      d¬«       nd | _        | j+                  «        y c c}w )
Nr/   Úperiodsr2   Frd   r   r   r   Úpos_embed_cached)rf   rg   r+   r_  rU   r    r]  r^  rM  r`  ra  rb  ÚanyÚ
aug_activer*   rN   rO   rj   r   rk   re  rl   )rm   r+   r    r]  r^  r*   rM  rN   rO   r_  r`  ra  rb  r   r   ÚaÚperiods_shaper¼   r½   rn   s                      €r   rg   zRotaryEmbeddingDinoV3.__init__\  sG  ø€ ô" 	‰ÑÔð ˆŒØ&ˆÔô ! Ó-ˆÔØ$ˆŒØ$ˆŒð !1ˆÔØ(ˆÔØ*ˆÔØ,ˆÔÜ°t×7HÑ7HÈ$×J\ÑJ\Ð^b×^qÑ^qÐ6rÖs°˜q¨š}ÒsÓtˆŒð %ˆŒØ&ˆÔØ*ˆÔð  ™˜ˆØ×Ñ˜Y¬¯©°MÈ&ÐX]Ô(^ÐkpÐÔqàÐ!à  ‘m j°¡mÑ3ˆGØ  #¨¡'Ð*ˆIØ× Ñ Ð!3´U·[±[ÀÐSYÐafÔ5gÐtyÐ Õzà$(ˆDÔ!ð 	×ÑÕùò) ts   ÂD5r"   c                 ó$   — | j                  «        yrp   rq   rs   s    r   rl   z&RotaryEmbeddingDinoV3.reset_parameters“  rt   r   c                 óú   — | j                   j                  | j                  «       «       | j                  �F| j                  �9| j                  | j                  d¬«      }| j                  j                  |«       yyy)rw   NT©Úno_aug)rd  rx   Ú_compute_periodsr*   re  Ú_create_embed)rm   Ú
rope_embeds     r   rr   z#RotaryEmbeddingDinoV3._init_buffers—  sh   € à�‰×Ñ˜4×0Ñ0Ó2Ô3Ø�?‰?Ð&¨4×+@Ñ+@Ð+LØ×+Ñ+¨D¯O©OÀDÐ+ÓIˆJØ×!Ñ!×'Ñ'¨
Õ3ð ,MÐ&r   rJ  r   r   c                 óØ  — | j                   dz  }| j                  �^| j                  �Rt        j                  dd|dt        j
                  ¬«      }| j                  | j                  | j                  z  |z  z  }n_| j                  €t        d«      ‚dt        j                  |dt        j
                  ¬«      z  | j                   dz  z  }| j                  |z  }|j                  ||¬«      S )	z5Construct periods from either min/max or temperature.r/   r   r   rJ  r2   z0Provide either min/max periods or `temperature`.rP  r   )
r+   r]  r^  r   r   r   r    rQ  r$   r&   )rm   r   r   r+   Ú	exponentsrd  s         r   rn  z&RotaryEmbeddingDinoV3._compute_periodsž  sÇ   € à�h‰h˜!‰mˆà�?‰?Ð&¨4¯?©?Ð+FÜŸ™ q¨!¨S¸ÄeÇmÁmÔTˆIØ—o‘o¨$¯/©/¸D¿O¹OÑ*KÐPYÑ)YÑZ‰Gà×ÑÐ'Ü Ð!SÓTÐTØœeŸl™l¨3°uÄEÇMÁMÔRÑRÐVZ×V^ÑV^ÐbcÑVcÑdˆIØ×&Ñ&¨)Ñ3ˆGð �z‰z ¨uˆzÓ5Ð5r   rY  c                 ó,  — | j                   r| j                  s|S |j                  }|j                  }| j                  �Jt        | j                  «      }t        j                  d||¬«      j                  | |«      }||ddd…f   z   }| j                  �}t        | j                  «      }|dk  rt        d«      ‚t        j                  |«      }t        j                  d||¬«      j                  | |«      j                  «       }||ddd…f   z  }| j                  �vt        | j                  «      }	|	dk  rt        d«      ‚t        j                  |	«      }
t        j                  d||¬«      j                  |
 |
«      j                  «       }||z  }|S )z4Apply shift/jitter/rescale train time augmentations.Nr   r2   r   zAjitter_coords must be > 0 (interpreted as multiplicative factor).zBrescale_coords must be > 0 (interpreted as multiplicative factor).r   )Útrainingrg  r   r   r`  rU   r   rk   Úuniform_ra  rQ  r   r   r'   rb  )rm   rY  r   r   ÚshiftÚshift_hwÚjitter_factorÚ
jitter_maxÚ	jitter_hwÚrescale_factorÚrescale_maxÚrescales               r   Ú_apply_coord_augsz'RotaryEmbeddingDinoV3._apply_coord_augs¯  sq  € à�}Š} D§O¢OØˆMà—‘ˆØ—‘ˆð ×ÑÐ(Ü˜$×+Ñ+Ó,ˆEÜ—{‘{ 1¨V¸5ÔA×JÑJÈEÈ6ÐSXÓYˆHØ˜h tªQ wÑ/Ñ/ˆFð ×ÑÐ)Ü! $×"4Ñ"4Ó5ˆMØ Ò!Ü Ð!dÓeÐeÜŸ™ -Ó0ˆJÜŸ™ A¨f¸EÔB×KÑKÈZÈKÐYcÓd×hÑhÓjˆIØ˜i¨ªa¨Ñ0Ñ0ˆFð ×ÑÐ*Ü" 4×#6Ñ#6Ó7ˆNØ Ò"Ü Ð!eÓfÐfÜŸ(™( >Ó2ˆKÜ—k‘k !¨F¸%Ô@×IÑIÈ;È,ÐXcÓd×hÑhÓjˆGØ˜gÑ%ˆFàˆr   c                 ó&  — | j                   dz  }| j                  j                  }| j                  j                  }| j                  j	                  «       |k(  sJ ‚|dd…dd…df   j                  ||¬«      }dt        j                  z  |z  | j                  dddd…f   z  }|j                  d«      }| j                  r|j                  d«      }n|j                  dd¬«      }t        j                  |«      }t        j                  |«      }||fS )zEReturn sin/cos embeddings with either 'half' or 'interleaved' layout.r/   Nr2   r   r   r1   r3   )r+   rd  r   r   r†   r&   r   r   r6   r_  Útiler±   r   r9   r:   )rm   rY  r+   r   r   r
  r9   r:   s           r   Ú_get_pos_embed_from_coordsz0RotaryEmbeddingDinoV3._get_pos_embed_from_coordsÑ  sò   € ð �h‰h˜!‰mˆØ—‘×$Ñ$ˆØ—‘×"Ñ"ˆØ�|‰|×!Ñ!Ó# sÒ*Ð*Ð*ð šš1˜d˜
Ñ#×&Ñ&¨f¸EÐ&ÓBˆØ”T—W‘W‘˜vÑ%¨¯©°T¸4Â°]Ñ(CÑCˆØ—‘ Ó"ˆà×Òà—[‘[ “^‰Fð ×-Ñ-¨a°RÐ-Ó8ˆFä�i‰i˜ÓˆÜ�i‰i˜ÓˆØ�Cˆxˆr   rm  c                 óì   — |\  }}t        ||| j                  | j                  | j                  ¬«      }|s| j	                  |«      }| j                  |«      \  }}t        j                  ||gd¬«      }|S )N)rM  rO   rN   r1   r3   )rZ  rM  rO   rN   r~  r�  r   r�   )	rm   r*   rm  ÚHÚWrY  r9   r:   rp  s	            r   ro  z#RotaryEmbeddingDinoV3._create_embedé  sz   € ð
 ‰ˆˆ1Ü#ØˆqØ!×2Ñ2Ø×,Ñ,Ø×(Ñ(ô	
ˆñ Ø×+Ñ+¨FÓ3ˆFØ×2Ñ2°6Ó:‰ˆˆSÜ—Y‘Y  S˜z¨rÔ2ˆ
ØÐr   c                 ó`   — | j                  |d¬«      }| j                  d|d¬«       || _        y )NTrl  re  Frd   )ro  rj   r*   )rm   r*   rp  s      r   Ú_cache_embedz"RotaryEmbeddingDinoV3._cache_embedû  s4   € à×'Ñ'¨
¸4Ð'Ó@ˆ
Ø×ÑÐ/°ÈÐÔNØ$ˆ�r   c                 ó`   — | j                   �"|| j                   k7  r| j                  |«       y y y rž   )r*   r†  rÎ   s     r   rÏ   z'RotaryEmbeddingDinoV3.update_feat_shape  s.   € Ø�?‰?Ð&¨:¸¿¹Ò+Hà×Ñ˜jÕ)ð ,IÐ&r   c                 ó$   — | j                  «        yrz   rq   rs   s    r   r{   z1RotaryEmbeddingDinoV3.init_non_persistent_buffers  rt   r   r€   c                 ó  — |�| j                  |«      }|S | j                  du xs | j                  xr | j                  }|r0| j                  €J d«       ‚| j                  | j                  «      }|S | j                  €J ‚| j                  }|S )zœGenerate rope_embed matching DINOv3 RopePositionEmbedding numerics.

        Returns: (HW, num_heads, 2 * head_dim) with last dim = [sin, cos] cat.
        Nz&feature shape must be cached on create)ro  re  rt  rg  r*   )rm   r€   rp  Úneed_creates       r   rÒ   zRotaryEmbeddingDinoV3.get_embed
  s    € ð
 ÐØ×+Ñ+¨EÓ2ˆJð Ðð ×/Ñ/°4Ð7Ò^¸D¿M¹MÒ<]ÈdÏoÉoˆKÙØ—‘Ð2Ð\Ð4\Ó\Ð2Ø!×/Ñ/°·±Ó@�
ð
 Ðð ×,Ñ,Ð8Ð8Ð8Ø!×2Ñ2�
àÐr   rY   c                 ón   — | j                  |j                  dd «      }t        ||| j                  ¬«      S )z$Get and apply rotary embeddings to xr   N)rœ   )rÒ   r€   r¥   r_  r  s      r   r‹   zRotaryEmbeddingDinoV3.forward  s1   € ð —N‘N 1§7¡7¨1¨2 ;Ó/ˆ	Ü" 1 i°d×6FÑ6FÔGÐGr   )g      Y@NNNrI  rH   rI   TNNNNNrŒ   ©Frž   )r�   rŽ   r�   r×   r�   r   rU   r   rÙ   rØ   rg   rl   rr   r   r   r   r   r¢   rn  r~  r   r�  ro  r†  rÏ   r{   rÒ   r‹   r‘   r’   s   @r   r\  r\  S  sè  ø„ ñð ,1Ø*.Ø*.Ø.2Ø$.Ø!$Ø!%Ø $Ø,0Ø-1Ø.2ØØñ5 àð5 ð " %™ð5 ð ! ™ð	5 ð
 ! ™ð5 ð !  c¡Ñ+ð5 ð "ð5 ð ð5 ð ð5 ð ð5 ð # 5™/ð5 ð $ E™?ð5 ð % U™Oõ5 ónó4ð 7<ÐRW×R_ÑR_ñ 6 u§|¡|ð 6ÀEÇKÁKð 6Ðdi×dpÑdpó 6ð" ¨¯©ð  ¸¿¹ó  ðD°·±ð À%ÈÏÉÐV[×VbÑVbÐHbÑBcó ð6 !ñà˜S™	ðð ðð 
�‰ó	ð$% t¨C¡yó %ð*¨D°©Ió *ó
ñ˜x¨¨S©	Ñ2ð ¸e¿l¹ló ð$H˜Ÿ™ð H¨%¯,©,÷ Hr   r\  Ú	rope_typec                 óö  — | dk(  r"|j                  dd«       t        dd||z  i|¤ŽS | dk(  r"|j                  dd«       t        dd||z  i|¤ŽS | dk(  r2|j                  dd«       |j                  dd«       t        d||d	œ|¤ŽS | d
k(  r4|j                  dd«       |j                  dd«       t	        dd||z  i|¤ŽS | dk(  r)dD ]  }|j                  |d«       Œ t        dd||z  i|¤ŽS t        d| › �«      ‚)a°  Factory function for creating rotary position embeddings.

    Args:
        rope_type: Type of RoPE to create. Options:
            - 'base': Basic RotaryEmbedding
            - 'cat': RotaryEmbeddingCat (concatenated sin/cos)
            - 'mixed': RotaryEmbeddingMixed (learnable per-depth frequencies)
            - 'dinov3': RotaryEmbeddingDinoV3 (with coordinate transforms)
            - 'mrope': RotaryEmbeddingMRope (interleaved multimodal RoPE; requires `mrope_section`)
        dim: Total embedding dimension
        num_heads: Number of attention heads
        **kwargs: Additional arguments passed to the specific RoPE class

    Returns:
        Rotary embedding module
    Úbaser_  Nr+   r�   ÚmixedrL   rM   )r+   r  Údinov3Úmrope)rL   rM   r_  zUnknown RoPE type: ré   )Úpoprµ   rÛ   r.  r\  r  rQ  )r�  r+   r  ÚkwargsÚks        r   Úcreate_rope_embedr–  #  s'  € ð, �FÒØ�
‰
�= $Ô'ÜÑ> 3¨)Ñ#3Ð>°vÑ>Ð>Ø	�eÒ	Ø�
‰
�= $Ô'Ü!ÑA c¨YÑ&6ÐA¸&ÑAÐAØ	�gÒ	à�
‰
�; Ô%Ø�
‰
Ð# TÔ*Ü#ÐK¨°yÑKÀFÑKÐKØ	�hÒ	Ø�
‰
�; Ô%Ø�
‰
Ð# TÔ*Ü$ÑD¨°	Ñ)9ÐD¸VÑDÐDØ	�gÒ	Ø?ò 	 ˆAØ�J‰J�q˜$Õð	 ä#ÑC¨¨yÑ(8ÐC¸FÑCÐCäÐ.¨y¨kÐ:Ó;Ð;r   )g      l@TN)r   r   NrŒ  )rH  T)r�   i   r,  )1r×   r   Útypingr   r   r   r   r   r   Ú_fxr	   r=   r
   Útrace_utilsr   r�   rU   rØ   r   r   r¢   r(   r   r   rA   rF   rÙ   r`   ÚModulerb   r”   r™   rŸ   r£   r¥   r¯   r³   rµ   rÛ   r  r  Úwrapr  r  r  r.  rZ  r\  r–  ré   r   r   ú<module>rœ     s�  ðñó ß /Ó /ã Ý å *Ý Ý  ð Ø!Ø)-ñ	
Øð
àð
ð ð
ð ˜Ÿ™Ñ&ó	
ð $ØØ)-ñ	Øðàðð ðð ˜Ÿ™Ñ&ð	ð
 ‡\�\óð Ø#Ø#Ø#(Ø)-Ø"Ÿ]™]ñ&#Ø˜‘Ið&#àð&#ð ð&#ð ð	&#ð
 !ð&#ð ˜Ÿ™Ñ&ð&#ð �{‰{ð&#ð ‡\�\ó&#ðR,�t˜C‘yð , T¨#¡Yó ,ð )-ØØØ#Ø"Ø"ØØ.2ØØ!Ø)-Ø"Ÿ]™]ñRØ˜‘IðRà˜Ÿ™Ñ%ðRð ðRð ð	Rð
 ðRð ðRð ðRð ðRð !  c¡Ñ+ðRð ðRð ðRð ˜Ÿ™Ñ&ðRð �{‰{ðRð 
ˆ%�,‰,ÑóRôj6�2—9‘9ô 6òrJð(˜Ÿ™ð (¨¯©ó (ð ñ	.Ø�<‰<ð.à—‘ð.ð —‘ð.ð ð	.ð
 ‡\�\ó.ð. ñ	;Ø�—‘Ñð;à—‘ð;ð —‘ð;ð ð	;ð
 
ˆ%�,‰,Ñó;ð0 ñ.Ø�<‰<ð.à�\‰\ð.ð ð.ð ‡\�\ó	.ð. %*ñ	".Ø�<‰<ð".à—<‘<ð".ð —l‘lð".ð "ð	".ð
 ‡\�\ó".ðN )-ØØØ#Ø"ØØ.2ØØ!Ø)-Ø"Ÿ]™]ñ5Ø˜‘Ið5à˜Ÿ™Ñ%ð5ð ð5ð ð	5ð
 ð5ð ð5ð ð5ð !  c¡Ñ+ð5ð ð5ð ð5ð ˜Ÿ™Ñ&ð5ð �{‰{ó5ôpJ4�b—i‘iô J4ôZx1˜Ÿ™ô x1ð~ "Øð(ð Ø�m‰mò(Øð(àð(ð ð(ð ð	(ð
 ð(ð ‡\�\ó(ðD ‡�‡�Øð "Ø)-Ø"Ÿ]™]ñ	Ø�C‰yðàðð ˜Ÿ™Ñ&ðð �{‰{ð	ð
 ˆ5�<‰<˜Ÿ™Ð%Ñ&òó ó ðð$!Ø�|‰|ð!à�\‰\ð!ð �\‰\ð!ð ‡\�\ó	!ô$M9˜2Ÿ9™9ô M9ô`u˜2Ÿ9™9ô uðp ‡�‡�Øð !+Ø!ØØ$Ø"Ÿ]™]ñ-Øð-àð-ð ð-ð ð	-ð
 ð-ð —‘ð-ð �{‰{ð-ð ‡\�\ò-ó ó ð-ô`MH˜BŸI™Iô MHðb ØØñ*<Øð*<àð*<ð ð*<ð
 ‡Y�Yô*<r   