MgJ%0ddlZddlmZddlmcmZddgZ dZddZGddej Z Gd d ej Z Gd d ej Z Gd dej Z ddZGddej ZGddej ZdS)NEncoderDecoderc0|tj|zSN)torchsigmoid)xs 3/home/notantonvoron/switti_demo/models/basic_vae.py nonlinearityr s u}Q  cHtj||ddS)Nư>T) num_groups num_channelsepsaffine)rnn GroupNorm) in_channelsrs r Normalizers* 8  KT$   r c$eZdZfdZdZxZS) Upsample2xcttj||ddd|_dS)N kernel_sizestridepaddingsuper__init__rrConv2dconvselfr __class__s r r#zUpsample2x.__init__D HOO !Aq$   r cV|tj|ddS)Nnearest) scale_factormode)r%F interpolater'r s r forwardzUpsample2x.forward s%yyqqyIIIJJJr __name__ __module__ __qualname__r#r2 __classcell__r(s@r rrsN     KKKKKKKr rc$eZdZfdZdZxZS) Downsample2xcttj||ddd|_dS)Nrr+rrr!r&s r r#zDownsample2x.__init__%r)r cX|tj|dddS)N)rrrrconstantr)padr.value)r%r/r>r1s r r2zDownsample2x.forward+s'yyql1MMMNNNr r3r8s@r r:r:$sN     OOOOOOOr r:c*eZdZddfd ZdZxZS) ResnetBlockN) out_channelsct||_||n|}||_t ||_t j||ddd|_ t ||_ |dkrt j |ntj |_ t j||ddd|_|j|jkr+t j||ddd|_dStj |_dS)Nrrrrr)r"r#rrBrnorm1rrr$conv1norm2DropoutIdentitydropoutconv2 nin_shortcut)r'rrBrIr(s r r#zResnetBlock.__init__0s+ &&2L{{ ({++ X__ 1Q%   |,, 4;dNUux''000  X__ ,Aa%     t0 0 . %\qA!0!!D   !# D   r c H|tj||d}||tj||d}|||zS)NTinplace)rEr/silurDrJrIrFrK)r'r hs r r2zResnetBlock.forwardHs{ JJqvdjjmmT::: ; ; JJt||AF4::a==$$G$G$GHH I I  ##a''r r3r8s@r rArA/sT+/.......0(((((((r rAc$eZdZfdZdZxZS) AttnBlockcVt||_t||_t j|d|zddd|_t|dz|_ t j||ddd|_ dS)Nrrrrg) r"r#Crnormrrr$qkvintw_ratioproj_outr&s r r#zAttnBlock.__init__Os k** 8?? [a1#  ;''D1  !Aq(   r c|||}|j\}}}}|j}||d|||d\}} } |||||z}|ddd}| ||||z} tj ||  |j } tj| d} | ||||z} | ddd} tj | | } | ||||} ||| zS)Nrrrr+)dim)rVrUshaperTreshapeunbindview contiguouspermuterbmmmul_rXr/softmaxrY) r'r rVB_HWrTqkvwrPs r r2zAttnBlock.forward\shhtyy||$$Y 1a F++aAq!,,33A661a FF1aQ   * * , , IIaA   ) ) + + FF1aQ   * * , , IaOO  . . IaQ    FF1aQ   * * , , IIaA   ) ) + + IaOO FF1aA   ) ) + +4==####r r3r8s@r rRrRNsG      $$$$$$$r rRTcJ|rt|ntjSr)rRrrH)rusing_sas r make_attnross %- @9[ ! ! !2;==@r c 8eZdZdddddddddfd Zd ZxZS) rrr+r+rFT)chch_multnum_res_blocksrIrdouble_zrn using_mid_sac t||_t||_d|jdz z|_||_||_tj ||jddd|_ dt|z} tj |_t|jD]} tj } tj } || | z}||| z}t|jD]]}| t#||||}| |jdz kr&|r$| t%|d^tj}| |_| |_| |jdz krt-||_|j|tj|_t#||||j_t%|| |j_t#||||j_t9||_tj ||rd|zn|ddd|_dS) Nr+rrrrrrBrITrn)r"r#rvlennum_resolutionsdownsample_ratiorxrrrr$conv_intuple ModuleListdownrangeappendrAroModuleblockattnr: downsamplemidblock_1attn_1block_2rnorm_outconv_out)r'rvrwrxrIr z_channelsryrnrz in_ch_multi_levelrrblock_in block_outi_blockrr(s r r#zEncoder.__init__xs "7|| !d&:Q&> ?,&x a1'   E'NN* MOO T122 # #GMOOE=??DJw//HWW--I !455 D D $,9g %d2Q66D8DKK (T B B BCCC9;;DDJDI$.22 9".x"8"8 I  T " " " "9;;& x   $H|DDD& x    "(++  ' 7Q^^Z (   r c||}t|jD]}t|jD]g}|j|j||}t |j|jdkr!|j|j||}h||jdz kr |j||}|j |j |j |}| tj||d}|S)NrrTrM)rrrrxrrrrrrrrrrr/rOr)r'r rPrrs r r2zEncoder.forwards9 LLOOT122 5 5G !455 < <5DIg&,W5a88ty).//!3<8 '*/8;;A$.22 5Ig&11!44 H  TX__TX-=-=a-@-@AA B B MM!&q!1!14@@@ A Ar r3r8s@r rrwss B B B B B B B Hr c6eZdZddddddddfd Zd ZxZS) rrqrrr+rurT)rvrwrxrIrrnrzc t||_t||_||_||_dt|z} |||jdz z} tj || ddd|_ tj |_ t| | ||j _t!| ||j _t| | ||j _tj|_t+t-|jD]} tj} tj} ||| z}t-|jdzD]]}| t| |||} | |jdz kr&|r$| t!| d^tj }| |_| |_| dkrt5| |_|jd|t;| |_tj | |ddd|_dS) Nr|rrrr}r~Tr) r"r#rvrrrxrrrrr$rrrrArrorrrupreversedrrrrrupsampleinsertrrr)r'rvrwrxrIrrrnrzrrrrrrrrr(s r r#zDecoder.__init__sm "7||,&E'NN*  4q 899x a1'   9;;& x   $H|DDD& x    -//d&: ; ;<< " "GMOOE=??DWW--I !4q!899 D D $,9g %d2Q66D8DKK (T B B BCCCBBHBG!| 3(22 GNN1b ! ! ! !"(++  kqA(   r c |j|j|j||}t t |jD]}t |jdzD]g}|j |j ||}t|j |j dkr!|j |j ||}h|dkr |j | |}|tj||d}|S)NrrTrM)rrrrrrrrrxrrrrrrr/rOr)r'zrPrrs r r2zDecoder.forwards: H  TX__TX-=-=dll1oo-N-NOO P P d&: ; ;<< 1 1G !4q!899 : :3DGG$*73A66tww',--1:6(-g6q99A!| 1GG$--a00 MM!&q!1!14@@@ A Ar r3r8s@r rrsi ? ? ? ? ? ? ? Br )r )T)rtorch.nnrtorch.nn.functional functionalr/__all__r rrrr:rArRrorrr r rs  y !     KKKKKKKKOOOOO29OOO(((((")(((>"$"$"$"$"$ "$"$"$JAAAAUUUUUbiUUUpRRRRRbiRRRRRr