
    3j                     T    S SK r S SKJr  S SKJs  Jr   " S S\R                  5      rg)    Nc                   Z   ^  \ rS rSrSr   SS\S\S\S\S\4
U 4S jjjrS	 rS
 r	Sr
U =r$ )DySample   zAdapted from 'Learning to Upsample by Learning to Sample':
https://arxiv.org/abs/2308.15085
https://github.com/tiny-smart/dysample
in_channelsout_chscalegroupsend_convolutionc                 |  > [         TU ]  5          X:  a  X-  S:X  d   e SU-  US-  -  nX0l        X@l        XPl        U(       a  [        R                  " XSS9U l        [        R                  " XS5      U l	        [        R                  " XSSS9U l
        U R                  (       ad  [        R                  R                  U R                  R                  SS	9  [        R                  R                  U R                  R                  SS
9  U R!                  SU R#                  5       5        g !   Sn[        U5      e= f)Nr   z(Incorrect in_channels and groups values.      )kernel_sizeF)biasg{Gz?)std)valinit_pos)super__init__
ValueErrorr   r	   r
   nnConv2dend_convoffsetscopetraininginittrunc_normal_weight	constant_register_buffer	_init_pos)	selfr   r   r   r	   r
   msgout_channels	__class__s	           h/home/wildlama/miniconda3/lib/python3.13/site-packages/spandrel/architectures/__arch_helpers/dysample.pyr   DySample.__init__   s    		"([-AQ-FFF-F
 6zE1H,
.IIkqIDMii1=YY{!%H
==GG!!$++"4"4$!?GGdjj//Q7Z)9:#	"<CS/!s   D, ,D;c                 `   [         R                  " U R                  * S-   S-  U R                  S-
  S-  S-   5      U R                  -  n[         R                  " [         R                  " X/SS95      R                  SS5      R                  SU R                  S5      R                  SSSS5      $ )Nr   r   ijindexing)	torcharanger   stackmeshgrid	transposerepeatr	   reshape)r"   hs     r&   r!   DySample._init_pos+   s    LL4::+/Q.a10Dq0HIDJJVKKv=>Yq!_VAt{{A&WQAq!		
    c                    U R                  U5      U R                  U5      R                  5       -  S-  U R                  -   nUR                  u  p4pVUR                  USSXV5      n[        R                  " U5      S-   n[        R                  " U5      S-   n[        R                  " [        R                  " X/SS95      R                  SS5      R                  S5      R                  S5      R                  UR                  5      R                  UR                  SS	9n	[        R                   " Xe/UR                  UR                  S
S9R                  SSSSS5      n
SX-   -  U
-  S-
  n	["        R$                  " U	R'                  USXV5      U R(                  5      R                  USSU R(                  U-  U R(                  U-  5      R+                  SSSSS5      R-                  5       R/                  SS5      n	["        R0                  " UR'                  X0R2                  -  SXV5      U	SS
SS9R                  USU R(                  U-  U R(                  U-  5      nU R4                  (       a  U R7                  U5      nU$ )Ng      ?r   r,   r)   r*   r   r   T)non_blockingF)dtypedevice
pin_memory      bilinearborder)modealign_cornerspadding_mode)r   r   sigmoidr   shapeviewr-   r.   r/   r0   r1   	unsqueezetyper9   tor:   tensorFpixel_shuffler3   r   permute
contiguousflattengrid_sampler	   r
   r   )r"   xr   B_HWcoords_hcoords_wcoords
normalizeroutputs               r&   forwardDySample.forward4   s   Q$**Q-"7"7"99C?$--O\\
aQ2q,<<?S(<<?S( KK';dKLYq!_Yq\Yq\T!'']RtR, 	 \\F''88	

 $q!Q1
 	 fo&3a7 OOFNN1b!7DT!QDJJNDJJN;WQ1a#Z\WQ] 	 IIa++or10!
 $q"djj1ndjj1n
5 	 ]]6*Fr6   )r   r
   r	   r   r   r   )r   r=   T)__name__
__module____qualname____firstlineno____doc__intboolr   r!   rZ   __static_attributes____classcell__)r%   s   @r&   r   r      s\      $;; ; 	;
 ; ; ;>
) )r6   r   )r-   torch.nnr   torch.nn.functional
functionalrJ   Moduler    r6   r&   <module>rj      s#       Wryy Wr6   