gddlZdejdedejfdZdejdefdZdejdefdZy) Nx scale_factorreturnc |j\}}}}}||dzz}|j||||||||}|jdddddddd}|j||||z||z||z}|S) z 3D pixel shuffle. r)shapereshapepermute)rrBCHWDC_s 6G:\Projects\Beeuty-MapMaker\trellis\modules\spatial.pypixel_shuffle_3drsGGMAq!Q lAo B !R|\1aKA !Q1aAq)A !R<<<HA H patch_sizec |jdz }td|dzD]4}|j||zdk(rJd|d|j|d||jg|jddt td|dzDcgc]}|j||z|gc}g}|j ddgt|Dcgc] }d|zdz c}t|Dcgc] }d|zdz c}z}|j|jd|jd||zzg|j| d}|Scc}wcc}wcc}w) z~ Patchify a tensor. Args: x (torch.Tensor): (N, C, *spatial) tensor patch_size (int): Patch size r rz Dimension z6 of input tensor must be divisible by patch size, got  and Nrr)dimrangerrsumr)rrDIMdis rpatchifyr#s %%'A+C 1cAg wwqzJ&!+ Qz!R!''3$%.RA H&i9<[s EE ,E c p|jdz }|jd||zzdk(sJd|jdd||z|j|jd|jd||zzg|g|z|j| d}|jddgt t |Dcgc]}d|z|zd|zgc}g}|j|jd|jdgt |Dcgc]}|jdd|zz|zc}}|Scc}wcc}w)z Unpatchify a tensor. Args: x (torch.Tensor): (N, C, *spatial) tensor patch_size (int): Patch size r rrzTSecond dimension of input tensor must be divisible by patch size to unpatchify, got rN)rrrrrr)rrr r"s r unpatchifyr%"s %%'A+C 771:s* +q 0n5IJKJQJQRSJTIUUZ[eil[lZm3nn 0 !''!*aggajZ3->?jJ,KU_+`aA HI+`s 2D.D3 )torchTensorintrr#r%rrr*sX     C  ELL     # $ %,, C r