
    |2g.                     ^   d dl Z d dlZd dlmZ d dlmc mZ d dlmZ  G d dej                  j                        Z
 G d dej                  j                        Z G d dej                        Z G d	 d
ej                  j                        Z G d dej                  j                        Z G d dej                  j                        Z G d dej                  j                        Z G d dej                  j                        Z G d dej                  j                        Zd Zy)    N)AdaptiveConvc                   &     e Zd Zd fd	Zd Z xZS )SimpleImplicitFeaturizerc                 >    t         |           || _        d| _        y N   )super__init__n_freqsdim_multiplier)selfr   	__class__s     4/home/cameronsmith/repos/FeatUp/featup/upsamplers.pyr
   z!SimpleImplicitFeaturizer.__init__   s        c                    |j                   \  }}}}t        j                  dd||j                        }t        j                  dd||j                        }t        j                  t        j
                  ||g      D cg c]  }|j                  d       c}      j                  d      }	t        j                  |	||	j                   d   ||f      }	|	g}
t        j                  |
d      j                  d      }	t        j                  t        j                  dd| j                  |j                              j                  d| j                  ddd      }|	|z  }	|	j                  || j                  | j                  z  ||      }	t        j                  |	      t        j                  |	      |g}t        j                  |d      S c c}w )N   devicer   dim
   )shapetorchlinspacer   catmeshgrid	unsqueezebroadcast_toexpr   reshaper   sincos)r   original_imagebchwgrid_hgrid_wtfeats	feat_listfreqs	all_featss                r   forwardz SimpleImplicitFeaturizer.forward   sj   #))
1aAq1F1FGAq1F1FG		5>>66BR3STa1;;q>TU__`ab""51ekk!na*CDG			)+55a8		%..RnF[F[\]WQaA. 	a0C0C!CQJYYu%uyy'7H	yy** Us    G   __name__
__module____qualname__r
   r1   __classcell__r   s   @r   r   r   
   s     
+r   r   c                   &     e Zd Zd fd	Zd Z xZS )IFAc           
         t         |           dt        j                  t        j                  t        j
                  d|dz                     z  | _        || _        t               | _	        t        j                  t        j                  ||dz  z   dz   |d      t        j                  |      t        j                         t        j                  ||d            | _        y )Nr   r      )r	   r
   r   r!   tensorarangescalesfeat_dimr   	sin_featsnn
SequentialConv2dBatchNorm2d	LeakyReLUmlp)r   rA   
num_scalesr   s      r   r
   zIFA.__init__'   s    %))ELLaa1P$QRR 13==IIh*q.1A5xCNN8$LLNIIh!,	
r   c                    |j                   \  }}}}t        j                  ||dz  |dz  fd      }||k(  sJ t        j                  d|||j
                        }t        j                  d|d|z  |j
                        }	t        j                  t        j                  ||      D 
cg c]  }
|
j                  d       c}
d      j                  d      }t        j                  t        j                  |	|	      D 
cg c]  }
|
j                  d       c}
d      j                  d      }t        j                  ||dz  |dz  fd      }||z
  }| j                  |      }|j                   d   }t        j                  ||||dz  |dz  f      }| j                  t        j                  ||gd            S c c}
w c c}
w )Nr   nearestmoder   )stepsr   r   r   )r   Finterpolater   r   r   r   r   r   rB   r    rH   )r   sourceguidancer&   r'   r(   r)   	up_sourcelr_cordhr_cordx	lr_coords	hr_coordsup_lr_coords
coord_diffcoord_diff_featsc2bcast_coord_featss                     r   r1   zIFA.forward3   s|   \\
1aMM&1q5!a%.yI	Av..AQv}}E..AQU6==IIIu~~gw7WX!q{{1~X^_`jjklm	IIu~~gw7WX!q{{1~X^_`jjklm	}}YQAYO!I-
>>*5##A&!../?!RQPQTUPUAVWxx		9.?"@aHII YXs   )F= Gr2   r4   r9   s   @r   r;   r;   %   s    

Jr   r;   c                   R     e Zd Zdddddej                  f fd	Zd Zd Zd	 Z xZ	S )

SAPAModuleNr      @   Tc                 6   t         |           ||n|}|| _        || _        || _         ||      | _         ||      | _        t        j                  |||      | _	        t        j                  |||      | _
        | j                  | j                         y )N)bias)r	   r
   	up_factorup_kernel_sizeembedding_dimnorm_ynorm_xrC   Linearqkapply_init_weights)	r   dim_ydim_xrd   re   rf   qkv_biasnormr   s	           r   r
   zSAPAModule.__init__D   s     	*",*5k5k5-h?5-h?

4%%&r   c                 x   |j                  dddd      j                         }|j                  dddd      j                         }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |||      j                  dddd      j                         S )Nr   r      r   )permute
contiguousrg   rh   rj   rk   	attention)r   yrV   x_rj   rk   s         r   r1   zSAPAModule.forwardV   s    IIaAq!,,.IIaAq!,,.KKN[[^FF1IFF2J~~aA&..q!Q:EEGGr   c                     ddl m}m} t        j                   |||| j
                  | j                        d      } |||| j
                  | j                        S )Nr   )simatnr   r   )saparz   r{   rO   softmaxre   rd   )r   rj   rk   vrz   r{   attns          r   rv   zSAPAModule.attentiona   sE    !yyQ4#6#6GRP4D//@@r   c                 v   ddl m} t        |t        j                        rg ||j
                  d       t        |t        j                        r8|j                  +t        j                  j                  |j                  d       y y y t        |t        j                        rUt        j                  j                  |j                  d       t        j                  j                  |j
                  d       y t        |t        j                        r|j                  d   |j                  d   z  |j                  z  }||j                  z  }|j
                  j                  j                  dt!        j"                  d|z               |j                  %|j                  j                  j%                          y y y )Nr   )trunc_normal_g{Gz?)std      ?r   g       @)timm.models.layersr   
isinstancerC   ri   weightrc   init	constant_	LayerNormrE   kernel_sizeout_channelsgroupsdatanormal_mathsqrtzero_)r   mr   fan_outs       r   rm   zSAPAModule._init_weightsg   s$   4a#!((,!RYY'AFF,>!!!&&!, -?'2<<(GGaffa(GGahh,299%mmA&q)99ANNJG GHHMM!!!TYYsW}%=>vv!!!# "	 &r   )
r5   r6   r7   rC   r   r
   r1   rv   rm   r8   r9   s   @r   r_   r_   C   s,    $(QbR\\'$	HA$r   r_   c                   *     e Zd Z fdZd Zd Z xZS )SAPAUpsamplerc                     t        |   |i | t        |d      | _        t        |d      | _        t        |d      | _        t        |d      | _        y )Nrs   )ro   rn   )r	   r
   r_   up1up2up3up4)r   ro   argskwargsr   s       r   r
   zSAPAUpsampler.__init__z   sM    $)&)E3E3E3E3r   c                 d    |j                   \  }}}}t        j                  ||dz  |dz  f      }|S r   r   rO   adaptive_avg_pool2d)r   rQ   rR   _r(   r)   small_guidances          r   adapt_guidancezSAPAUpsampler.adapt_guidance   s7    \\
1a..x!a%QHr   c                    | j                  | j                  ||      |      }| j                  | j                  ||      |      }| j                  | j                  ||      |      }| j	                  | j                  ||      |      }|S N)r   r   r   r   r   r   rQ   rR   source_2source_4source_8	source_16s          r   r1   zSAPAUpsampler.forward   s|    88D//A6J88D//(CXN88D//(CXNHHT008DhO	r   )r5   r6   r7   r
   r   r1   r8   r9   s   @r   r   r   y   s    4
r   r   c                   $     e Zd Z fdZd Z xZS )CarafeUpsamplerc                     t        |   |i | ddlm}  ||ddd      | _         ||ddd      | _         ||ddd      | _         ||ddd      | _        y )Nr   )
CARAFEPackrs   r   r   )	up_kernelup_groupscale_factor)r	   r
   mmcv.opsr   r   r   r   r   )r   r   r   r   r   r   r   s         r   r
   zCarafeUpsampler.__init__   s`    $)&)'cQKcQKcQKcQKr   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S r   )r   r   r   r   r   s          r   r1   zCarafeUpsampler.forward   s@    88F#88H%88H%HHX&	r   r4   r9   s   @r   r   r      s    Lr   r   c                   *     e Zd Z fdZd Zd Z xZS )LayeredResizeConvc                 |   t        |   |i | t        j                  j	                  |dz   ||d      | _        t        j                  j	                  |dz   ||d      | _        t        j                  j	                  |dz   ||d      | _        t        j                  j	                  |dz   ||d      | _        y )Nrs   same)padding)	r	   r
   r   rC   rE   conv1conv2conv3conv4)r   r   r   r   r   r   s        r   r
   zLayeredResizeConv.__init__   s    $)&)XX__S1Wc;_O
XX__S1Wc;_O
XX__S1Wc;_O
XX__S1Wc;_O
r   c                     t        j                  |dd      }|j                  \  }}}}t        j                  |||fd      }	 | |t        j                  ||	gd                  }
||
z   S )Nr   bilinear)r   rM   rL   r   r   )rO   rP   r   r   r   )r   rQ   rR   conv
activation
big_sourcer   r(   r)   r   outputs              r   
apply_convzLayeredResizeConv.apply_conv   sg    ]]6
K
%%
1ax!QjIDJ+GQ!OPQF""r   c                 L   | j                  ||| j                  t        j                        }| j                  ||| j                  t        j                        }| j                  ||| j
                  t        j                        }| j                  ||| j                  d       }|S )Nc                     | S r    )rV   s    r   <lambda>z+LayeredResizeConv.forward.<locals>.<lambda>   s    a r   )r   r   rO   relur   r   r   r   s          r   r1   zLayeredResizeConv.forward   st    ??68TZZH??8Xtzz166J??8Xtzz166JOOHh

KP	r   )r5   r6   r7   r
   r   r1   r8   r9   s   @r   r   r      s    P#r   r   c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )JBULearnedRangec                 8   t         |           || _        || _        | j                  dz  dz   | _        || _        || _        || _        t        j                  t        j                  d            | _        t        j                  j                  t        j                  j                  ||dd      t        j                  j                         t        j                  j!                  d      t        j                  j                  ||dd            | _        t        j                  j                  t        j                  j                  || j                  dz  z   | j                  dz  dd      t        j                  j                         t        j                  j!                  d      t        j                  j                  | j                  dz  | j                  dz  dd            | _        t        j                  t        j                  d            | _        y )Nr   r   g        皙?r   )r	   r
   scaleradiusdiameterguidance_dimkey_dimrA   rC   	Parameterr   r>   
range_temprD   rE   GELU	Dropout2d
range_proj
fixup_projsigma_spatial)r   r   rA   r   r   r   r   s         r   r
   zJBULearnedRange.__init__   sk   
a!+( ,,u||C'89((--HHOOL'1a8HHMMOHHr"HHOOGWa3	
  ((--HHOOL4==A+==t}}PQ?QSTVWXHHMMOHHr"HHOODMMQ.0BAqI	
  \\%,,s*;<r   c                 L   |j                   \  }}}}| j                  |      }t        j                  || j                  gdz  d      }t        j                  j                  | j                        |      j                  || j                  | j                  | j                  z  ||f      j                  ddddd      }| j                  j                         j                  d      j                  d	      }	t        j                   |	t        j"                  d
||      z  d      S )Nr=   reflectpadrM   r   r   rs   r   g-C6?g     @zbchwp,bchw->bphwr   )r   r   rO   r   r   r   rC   Unfoldr   r"   r   rt   r   r!   	clamp_min	clamp_maxr}   einsum)
r   rV   GBGCGHGWproj_xproj_x_paddedqueriespos_temps
             r   get_range_kernelz JBULearnedRange.get_range_kernel   s    BB#f4;;-!*;)L((//$--0?Wb$,,(Er2NOWQ1a# 	 ??&&(2248BB3GyyELL1CWf$UU[\]]r   c                    t        j                  dd| j                  |      }t        j                  ||      \  }}t        j                  |j                  d      |j                  d      gd      }t        j                  |j                         j                  d       d| j                  dz  z  z        j                  d| j                  | j                  z  dd      S )Nr   r   r   r   r   r   )r   r   r   r   r   r   r!   squaresumr   r"   )r   r   
dist_rangerV   rw   patchs         r   get_spatial_kernelz"JBULearnedRange.get_spatial_kernel   s    ^^B4==H
~~j*51		1;;q>1;;q>:Byy5<<>--a00A8J8Ja8O4OPQWQ5q!<	=r   c                    |j                   \  }}}}|j                   \  }}}	}
||k(  sJ | j                  |j                        }| j                  |      }||z  }||j	                  dd      j                  d      z  }|d| j                  t        j                  ||gd            z  z  }|j                  ddd	d      j                  |||| j                  | j                        }t        j                  j                  ||fd
d      |      }t        j                  || j                   gdz  d      }t#        j$                  ||      }|S )Nr   T)keepdimgHz>r   r   r   r   rs   bicubicF)rM   align_cornersr=   r   r   )r   r   r   r   r   clampr   r   r   rt   r"   r   rC   UpsamplerO   r   r   r   rl   )r   rQ   rR   r   r   r   r   SBSCSHSQspatial_kernelrange_kernelcombined_kernel	hr_sourcehr_source_paddedresults                    r   r1   zJBULearnedRange.forward   s<   !BBBBb00?,,X6&7?..q$.?EEdKK2		?H:U[\0] ^^^)11!Q1=WRR> 	 HH%%r2hYe%TU[\	550A	R $$%5Gr   )r   rs   )r5   r6   r7   r
   r   r   r1   r8   r9   s   @r   r   r      s    =6^=r   r   c                   *     e Zd Z fdZd Zd Z xZS )JBUStackc                    t        |   |i | t        d|dd      | _        t        d|dd      | _        t        d|dd      | _        t        d|dd      | _        t        j                  j                  t        j                  j                  d      t        j                  j                  ||d            | _        y )Nrs       )r   g?r   )r   )r	   r
   r   r   r   r   r   r   rC   rD   r   rE   r   )r   rA   r   r   r   s       r   r
   zJBUStack.__init__   s    $)&)"1h1="1h1="1h1="1h1=((--HHs#HHOOHhAO>@r   c                 v    |j                   \  }}}}t        j                  ||dz  |dz  f      } |||      }|S r   r   )	r   rQ   rR   upr   r(   r)   r   	upsampleds	            r   upsamplezJBUStack.upsample	  sC    \\
1a..x!a%QHv~.	r   c                    | j                  ||| j                        }| j                  ||| j                        }| j                  ||| j                        }| j                  ||| j                        }| j                  |      dz  |z   S )Nr   )r  r   r   r   r   r   r   s          r   r1   zJBUStack.forward  ss    ==488<==8TXX>==8TXX>MM(Hdhh?	y)C/);;r   )r5   r6   r7   r
   r  r1   r8   r9   s   @r   r   r      s    @<r   r   c                   $     e Zd Z fdZd Z xZS )Bilinearc                 $    t        |   |i | y r   )r	   r
   )r   r   r   r   s      r   r
   zBilinear.__init__  s    $)&)r   c                 X    |j                   \  }}}}t        j                  |||fd      S )Nr   rL   )r   rO   rP   )r   r-   imgr   r(   r)   s         r   r1   zBilinear.forward  s*    YY
1a}}UQF<<r   r4   r9   s   @r   r	  r	    s    *=r   r	  c                     | dk(  r
t               S | dk(  rt        |      S | dk(  rt        |d      S | dk(  rt        |d      S | dk(  rt	        |      S | dk(  rt        |      S t        d	|        )
Nr   	jbu_stackresize_convr   carafer|   )ro   ifazUnknown upsampler )r	  r   r   r   r   r;   
ValueError)	upsamplerr   s     r   get_upsamplerr  !  s    Jz	k	!}	m	# a((	h	sA&&	f	3''	e	3x-i[9::r   )r   r   torch.nnrC   torch.nn.functional
functionalrO   'featup.adaptive_conv_cuda.adaptive_convr   Moduler   r;   r_   r   r   r   r   r   r	  r  r   r   r   <module>r     s         @+uxx +6J%((// J<3$ 3$lEHHOO *ehhoo $ 0Behhoo BJ<uxx <4=uxx =;r   