
    ^jL                         d Z ddlZddlZddlmZ ddlmZ  G d dej                        Z G d dej                        Zd	 Z	y)
z1Various positional encodings for the transformer.    N)nn)NestedTensorc                   Z     e Zd ZdZd fd	Zd Zd	defdZd	dej                  fdZ
 xZS )
PositionEmbeddingSinezThis is a more standard version of the position embedding, very similar to the one used by the Attention is all
    you need paper, generalized to work on images.c                     t         |           || _        || _        || _        ||du rt        d      |dt        j                  z  }|| _        d| _	        y )NFz+normalize should be True if scale is passed   )
super__init__num_pos_featstemperature	normalize
ValueErrormathpiscale_export)selfr   r   r   r   	__class__s        j/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/models/position_encoding.pyr
   zPositionEmbeddingSine.__init__   s^    *&"e!3JKK=KE
    c                 V    d| _         | j                  | _        | j                  | _        y )NT)r   forward_forward_originforward_exportr   s    r   exportzPositionEmbeddingSine.export)   s"    #||**r   tensor_listc           
         |j                   }|j                  }|J | }|j                  dt        j                        }|j                  dt        j                        }| j
                  rDd}||d d dd d d f   |z   z  | j                  z  }||d d d d dd f   |z   z  | j                  z  }t        j                  | j                  t        j                  |j                        }	| j                  d|	dz  z  | j                  z  z  }	|d d d d d d d f   |	z  }
|d d d d d d d f   |	z  }t        j                  |
d d d d d d dd df   j                         |
d d d d d d dd df   j                         fd	      j                  d
      }
t        j                  |d d d d d d dd df   j                         |d d d d d d dd df   j                         fd	      j                  d
      }|r-t        j                  ||
fd
	      j!                  dddd
      }|S t        j                  ||
fd
	      j!                  dd
dd      }|S N   )dtyper   gư>)r!   devicer      dim   )tensorsmaskcumsumtorchfloat32r   r   aranger   r#   r   stacksincosflattencatpermute)r   r   align_dim_ordersxr)   not_masky_embedx_embedepsdim_tpos_xpos_yposs                r   r   zPositionEmbeddingSine.forward.   s.   5//!5==/9//!5==/9>>CBC!3c!9:TZZGGArs!3c!9:TZZGGT//u}}QXXV  Q%1*%58J8J%JK1a&.1a&.U1aADqD=1557q!Q1}9M9Q9Q9STZ[\ddefgU1aADqD=1557q!Q1}9M9Q9Q9STZ[\ddefg))UEN2::1aAFC
 
 ))UEN2::1aAFC
r   r)   c           
      |   |J | }|j                  dt        j                        }|j                  dt        j                        }| j                  rDd}||d d dd d d f   |z   z  | j                  z  }||d d d d dd f   |z   z  | j                  z  }t        j
                  | j                  t        j                  |j                        }| j                  d|dz  z  | j                  z  z  }|d d d d d d d f   |z  }|d d d d d d d f   |z  }	t        j                  |d d d d d d dd df   j                         |d d d d d d dd df   j                         fd	      j                  d
      }t        j                  |	d d d d d d dd df   j                         |	d d d d d d dd df   j                         fd	      j                  d
      }	|r-t        j                  |	|fd
	      j                  dddd
      }
|
S t        j                  |	|fd
	      j                  dd
dd      }
|
S r   )r*   r+   r,   r   r   r-   r   r#   r   r.   r/   r0   r1   r2   r3   )r   r)   r4   r6   r7   r8   r9   r:   r;   r<   r=   s              r   r   z$PositionEmbeddingSine.forward_exportI   s   5//!5==/9//!5==/9>>CBC!3c!9:TZZGGArs!3c!9:TZZGGT//u}}T[[Y  Q%1*%58J8J%JK1a&.1a&.U1aADqD=1557q!Q1}9M9Q9Q9STZ[\ddefgU1aADqD=1557q!Q1}9M9Q9Q9STZ[\ddefg))UEN2::1aAFC
 
 ))UEN2::1aAFC
r   )@   i'  FN)T)__name__
__module____qualname____doc__r
   r   r   r   r+   Tensorr   __classcell__r   s   @r   r   r      s.    6
+
< 65<< r   r   c                   <     e Zd ZdZd fd	Zd Zd ZdefdZ xZ	S )PositionEmbeddingLearnedz Absolute pos embedding, learned.c                     t         |           t        j                  d|      | _        t        j                  d|      | _        | j                          d| _        y )N2   F)r	   r
   r   	Embedding	row_embed	col_embedreset_parametersr   )r   r   r   s     r   r
   z!PositionEmbeddingLearned.__init__f   sE    b-8b-8r   c                     t         N)NotImplementedErrorr   s    r   r   zPositionEmbeddingLearned.exportm   s    !!r   c                     t         j                  j                  | j                  j                         t         j                  j                  | j
                  j                         y rP   )r   inituniform_rL   weightrM   r   s    r   rN   z)PositionEmbeddingLearned.reset_parametersp   s:    
../
../r   r   c                    |j                   }|j                  d d \  }}t        j                  ||j                        }t        j                  ||j                        }| j                  |      }| j                  |      }t        j                  |j                  d      j                  |dd      |j                  d      j                  d|d      gd      j                  d      j                  dd|j                  d   d      }	|	S )Nr   )r#   r   r    r"   r%   )
r(   shaper+   r-   r#   rM   rL   r2   	unsqueezerepeat)
r   r   r5   hwijx_emby_embr=   s
             r   r   z PositionEmbeddingLearned.forwardt   s    wwr{1LL188,LL188,q!q!IIOOA&--aA6OOA&--aA6  Yq\VAq!''!*a( 	 
r   )   )
r@   rA   rB   rC   r
   r   rN   r   r   rE   rF   s   @r   rH   rH   c   s!    *"0< r   rH   c                 p    | dz  }|dv rt        |d      }|S |dv rt        |      }|S t        d|       )Nr   )v2sineT)r   )v3learnedznot supported )r   rH   r   )
hidden_dimposition_embedding	num_stepss      r   build_position_encodingri      s\    aI^+29M  
0	05i@  >*<)=>??r   )
rC   r   r+   r   rfdetr.utilities.tensorsr   Moduler   rH   ri    r   r   <module>rm      s?    8    1GBII GT$ryy $N
r   