ٳf# .dZddlmZddlmZddlZddlmZddlm Z m Z Gddej Z Gdd ej Z dd Zd ZGd dej ZGddej ZddlmZ ddejdededededef dZdS)zs Author: Luigi Piccinelli Licensed under the CC-BY NC 4.0 license (http://creativecommons.org/licenses/by-nc/4.0/) )pi)OptionalN) rearrangerepeatcleZdZ d fd Z d dejdeejdejfd Zdd ZxZ S)PositionEmbeddingSine@'FNct||_||_||_||durt d| dt z}||_dS)NFz+normalize should be True if scale is passed)super__init__ num_pos_feats temperature normalize ValueErrorrscale)selfrrrr __class__s =/home/hossein/UniDepth/unidepth/utils/positional_embedding.pyrzPositionEmbeddingSine.__init__sj *&"  e!3!3JKK K =FE xmaskreturnc |btj|d|d|df|jtj}|}|dtj}|dtj}|jr@d}||ddddddf|zz |jz}||ddddddf|zz |jz}tj |j tj|j }|j dtj |dd z|j z z}|dddddddf|z }|dddddddf|z } tj |dddddddddf|dddddddddffd d}tj | dddddddddf| dddddddddffd d} tj| |fd dddd} | S)Nrr devicedtype)rgư>)rrfloor) rounding_modedim)torchzerossizerboolcumsumfloat32rrarangerrdivstacksincosflattencatpermute) rrrnot_masky_embedx_embedepsdim_tpos_xpos_yposs rforwardzPositionEmbeddingSine.forwards <;AFF1IIqvvayy1!(%*D5//!5=/99//!5=/99 > HCBCC!3c!9:TZGGAAArss!3c!9:TZGG T/u}QXVVV  %'::: :T=O O 111aaa &.111aaa &. 111aaaADqD= ! % % ' 'qqq!!!QQQ1})=)A)A)C)C D!   '!**  111aaaADqD= ! % % ' 'qqq!!!QQQ1})=)A)A)C)C D!   '!** iA...66q!QBB rr$c<d|jjz}d|jd|jd|jd|jg}|gfd|Dz}d|S)NzPositional encoding znum_pos_feats: {}ztemperature: {}z normalize: {}z scale: {}c g|] }dz|z S) ).0line _repr_indents r z2PositionEmbeddingSine.__repr__..Ds#EEE# ,t3EEEr )r__name__formatrrrrjoin)rrDheadbodyliness ` r__repr__zPositionEmbeddingSine.__repr__;s%(??  & &t'9 : :  $ $T%5 6 6  " "4> 2 2   tz * *  EEEEEEEEyyr)r r FNN)r$) rG __module__ __qualname__rr'Tensorrr=rM __classcell__rs@rrrsJN      ?C%-el%; >         rrc$eZdZfdZdZxZS)LearnedSinusoidalPosEmbct|dzdksJ|dz}tjt j||_dS)Nr r)r rnn Parameterr'randnweights)rr&half_dimrs rrz LearnedSinusoidalPosEmb.__init__IsR aA~~~~!8|EK$9$9:: rct|d}|t|jdzdztz}tj||fd}tj||fd}|S)Nzb -> b 1zd -> 1 dr r!r%)rrZrr'r3r0r1)rrfreqs fouriereds rr=zLearnedSinusoidalPosEmb.forwardOsx a $ $IdlJ777!;b@Iuyy{{EIIKK8bAAA Iq)n"555 rrGrOrPrr=rRrSs@rrUrUHsG;;;;; rrUr!c R t| tttd|}t|dks Jdt|d}dkr|zntt td|}fdt |D}t gtd|s Jdttd |}tt fd |}||ftt td |}ttd t ||}tj | S)Nc*t|jSrN)lenshapets rzbroadcat..YsAG rr z3tensors must all have the same number of dimensionsrc*t|jSrN)listrcrds rrfzbroadcat..]s4==rc*g|]\}}|k ||fSrArA)rBivalr&s rrEzbroadcat..^s&JJJFAsc3xrcNtt|ddkS)Nr r )rbsetrds rrfzbroadcat..`sC!II!+rz3invalid dimensions for broadcastable concatentationc<|dt|dfSNrr )maxrds rrfzbroadcat..bs1Q4QqT"3rc,|d|dfzfSrorA)re num_tensorss rrfzbroadcat..cs!qtg .C'Drc|dS)Nr rArds rrfzbroadcat..es !rc.|dj|dSro)expandrds rrfzbroadcat..fs1ad!3rr%) rbrmrhmapzip enumerateallinsertr'r3) tensorsr& shape_lens shape_lendimsexpandable_dimsmax_dims expanded_dimsexpandable_shapesrrs ` @rbroadcatrWsg,,KT#44g>>??@@J z??a   !V   Z  #I"Qww3??CC S00'::; < #++_ = =>  ==<== C33_EEFFHDDDDhOOPPMsDI.///S#nnm"D"DEFF333SBS5T5TUUVVG 9W# & & &&rct|dd}|d\}}tj| |fd}t|dS)Nz... (d r) -> ... d rr rr!r%z... d r -> ... (d r))runbindr'r/)rx1x2s r rotate_halfrjsY!+q111A XX"X  FB bS"I2&&&A Q. / //rc4eZdZ d fd Zd dZxZS) VisionRotaryEmbeddingNlangr r c t|r|} n|dkr=d|tjd|dd|dz|z zz } nj|dkr%tjd|dz |dzt z} n?|dkr'tj|} ntd|||}tj||z |z} tj d| | } t| d d } tj d| | } t| d d } t| dddddf| dddddffd } | d | | d| td|jjddS)Nr?rr pixelconstantunknown modality ..., f -> ... f... n -> ... (n r)rr!r% freqs_cos freqs_sinz======== shape of rope freqz========)r rr'r-floatlinspaceronesreinsumrrregister_bufferr1r0printrrc)rr& pt_seq_len ft_seq_len custom_freqs freqs_forthetamax_freq num_freqsr]refreqs_hfreqs_wrs rrzVisionRotaryEmbedding.__init__rs   > EE & %,q#q11,SAX,?EEGG#MNEE' ! !N31 cQh??"DEE * $ $Jy))//11EE<<<== =  #J L $ $z 1J >,0!U;;"6!<<<,0!U;;"6!<<<'!!!T111*-wtQQQz/BCLLL [%))++666 [%))++666 +T^-A:NNNNNrrcF|jjd}||z}||jdksJd|jdd||dd|f|d||f|d|df}}}||jzt||jzz}t j|||fdS)Nr!zfeature dimension z: is not of sufficient size to rotate in all the positions .r%)rrcrrr'r3)rre start_indexrot_dim end_indext_leftt_rights rr=zVisionRotaryEmbedding.forwards.&r*') qwr{ " " " p p pgn p p # " " c EE & %,q#q11,SAX,?EEGG#MNEE' ! !N31 cQh??"DEE * $ $Jy))//11EE<<<== =  #J L $ $z 1J > .599u2a888%4 +U4AAA:->?RHHHIIKK$$RR99 IIKK$$RR99  [)444 [)44444rcF||jzt||jzzSrN)rrr)rres rr=z!VisionRotaryEmbeddingFast.forwards!4>!KNNT^$CCCrrr_rSs@rrrsh %5%5%5%5%5%5NDDDDDDDrr)log2r Frr&ruse_cosuse_logcat_origc|}|j|j|jd} }}|r|d| zzn|| z} |r*dtjdt || ||z} ntjd|dz | ||} |d}| gdt|jd z ztR} || ztz}tj |r(| | gn| gd }| d }|rtj ||fd S|S) Nr!r g@g)stepsrrrrrNr r%)rrrcr'rr unsqueezerbEllipsisrr3r0r1r2) rr&rrrrx_origrr input_dim num_bandsscaless rgenerate_fourier_featuresrslF x!'"+9EF*1GI &&si7GI  hyu     Ayu    BA ?w#ag,,"23?h?? @F F RA  QUUWWaeegg      A " A.y!V"---- Hr)r!)rr FFF)__doc__mathrtypingrr'torch.nnrWeinopsrrModulerrUrrrrrrQintr*rrArrrs  $$$$$$$$7 7 7 7 7 BI7 7 7 t     bi   ''''&0007777777777BI777777t)D)D)D)D)D )D)D)DX  & &  |& & &  &  &  & & & & & & r