§
     ’Þjõ  ã                   óP   — d Z ddlZddlZddlmZ ddlmc mZ dZddefd„Z	d„ Z
dS )aÊ  Convolutions of large images by bands of rows (stride 1, kernel height 3 with padding 1, or 1 without), optionally after a nearest x2
upsampling.

Output rows s..e-1 read only the (upsampled) input rows s-1..e: each band convolves its rows plus a one-row halo, so every output value has
the same inputs and weights as with the full convolution. Neither the full-size upsampled input nor cuDNN's workspace for the full image is
allocated: at 2048x2048, a VAE decoder convolution takes a workspace of up to twice its output, which no allocator can do without (cuDNN does
not fall back to a smaller one when memory runs out). cuDNN may choose another kernel for a band's shape, so values can differ in rounding only.
é    Ni   FÚnearestc           	      ó  — | j         \  }}}}|rdnd}	t          d|||z  |	z  |	z  |z  |                      ¦   «         z  z  ¦  «        }
|
|k    r$ ||rt          j        | d|¬¦  «        n| ¦  «        S d}t          d||
¦  «        D �]�}t          |||
z   ¦  «        }t          d|dz
  ¦  «        t          ||dz   ¦  «        }}|r&t          j        | dd…dd…||…f         d|¬¦  «        n| dd…dd…||…f         }|dk    rdnd}|dd…dd…|	||z
  z  |z
  |	||z
  z  ||k     z   …f         } ||¦  «        dd…dd…|||	||z
  z  z   …f         }|€‹|                      ¦   «         s,|                      t          j	        ¬¦  «        rt          j	        nt          j
        }t          j        ||j         d         |	|z  |j         d         f|j        |j        |¬	¦  «        }|dd…dd…|	|z  |	|z  …f                              |¦  «         ~�Œƒ|S )
zÍconv(x), or conv(F.interpolate(x, scale_factor=2, mode=mode)) with upsample, for x (batch, channels, height, width); conv (a module or a
    function) runs on each band, whose halo output rows are dropped.é   é   g       @)Úscale_factorÚmodeNr   )Úmemory_formatéÿÿÿÿ)ÚdtypeÚdevicer	   )ÚshapeÚmaxÚelement_sizeÚFÚinterpolateÚrangeÚminÚis_contiguousÚtorchÚchannels_lastÚcontiguous_formatÚemptyr   r   Úcopy_)ÚxÚconvÚupsampler   Ú
band_bytesÚnÚcÚhÚwÚscaleÚrowsÚoutÚstartÚstopÚloÚhiÚbandÚfirstÚlayouts                      ú?C:\Users\johnn\OneDrive\Documents\AI\shared\utils\conv_bands.pyÚ
conv_bandsr-      s�  € ð ”�J€A€qˆ!ˆQØÐ ˆAˆA˜q€EÝˆq�*  Q¡¨¡°Ñ!6¸Ñ!:¸Q¿^º^Ñ=MÔ=MÑ!MÑNÑOÔO€DØˆq‚y€yØˆtÀXÐT•A”M !°#¸DÐAÑAÔAÐAÐSTÑUÔUÐUØ
€CÝ�q˜!˜TÑ"Ô"ð ñ ˆÝ�1�e˜d‘lÑ#Ô#ˆÝ�Q˜ ™	Ñ"Ô"¥C¨¨4°!©8Ñ$4Ô$4ˆBˆØMUÐi�qŒ}˜Q˜q˜q˜q ! ! ! R¨ U˜{œ^¸#ÀDÐIÑIÔIÐIÐ[\Ð]^Ð]^Ð]^Ð`aÐ`aÐ`aÐceÐfhÐchÐ]hÔ[iˆØ˜Q’Y�Y�� AˆØ�A�A�A�q�q�q˜% 5¨2¡:Ñ.°Ñ6°uÀÀrÁ	Ñ7JÈdÐUVÊhÑ7WÐWÐWÔXˆØˆt�D‰zŒz˜!˜!˜!˜Q˜Q˜Q  e¨e°t¸e±|Ñ.DÑ&DÐ DÐDÔEˆØˆ;Ø01·²Ñ0AÔ0Að  VÀaÇoÂoÕdiÔdwÀoÑFxÔFxð  V•UÔ(Ð(õ  Dô  VˆFÝ”+˜q $¤*¨Q¤-°¸±¸D¼JÀr¼NÐKÐSWÔS]ÐfjÔfqð  BHð  Iñ  Iô  IˆCØˆAˆAˆAˆqˆqˆq�%˜%‘- ¨¡Ð,Ð,Ô-×3Ò3°DÑ9Ô9Ð9Ø‰DØ€Jó    c                 ó\  — |                       ¦   «         D ]–}t          |¦  «        t          j        u ry|j        dk    rn|j        dk    rc|j        dk    rX|j        dk    rM|j        dk    rBt          j
        t          t          j
        t          j        j        |¦  «        ¬¦  «        |_        Œ—dS )zvRuns every 3x3 convolution of module with stride 1 and padding 1 by bands of rows (when its input exceeds BAND_BYTES).)é   r0   )r   r   Úzeros)r   N)ÚmodulesÚtypeÚnnÚConv2dÚkernel_sizeÚstrideÚpaddingÚdilationÚpadding_modeÚ	functoolsÚpartialr-   Úforward)Úmoduler   s     r,   Ú
band_convsr?   +   sÔ   € à—’Ñ Ô ð jð jˆÝ�‰:Œ:�œÐ"Ð" tÔ'7¸6Ò'AÐ'AÀdÄkÐU[ÒF[ÐF[Ð`dÔ`lÐpvÒ`vÐ`vÐ{ô  |Ið  MSò  |Sð  |Sð  X\ô  Xið  mtò  Xtð  XtÝ$Ô,­Z½iÔ>OÕPRÔPYÔPaÐcgÑ>hÔ>hÐiÑiÔiˆDŒLøðjð jr.   )Ú__doc__r;   r   Útorch.nnr4   Útorch.nn.functionalÚ
functionalr   Ú
BAND_BYTESr-   r?   © r.   r,   ú<module>rF      s“   ððð ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ð à€
ð "'¨YÀ:ð ð ð ð ð0jð jð jð jð jr.   