o uyg"@sjddlZddlmZddlmZmZmZddlmZm Z m Z m Z m Z m Z ddlmZGdddejZdS)N)pack rearrangerepeat)SinusoidalPosEmbBlock1D ResnetBlock1D Downsample1DTimestepEmbedding Upsample1DBasicTransformerBlockcs>eZdZ       dfdd Zd d Zdd dZZS)ConditionalDecoderr皙?@snakec s`tt|}||_||_t||_|dd} t|| dd|_t g|_ t g|_ t g|_ |tt|D]D} } || | t|dk} t| | d}t fddt|D}| sktnt jd dd }|j t |||gq=z/ConditionalDecoder.__init__..)paddingc rrr r#r&r)r*r+Sr,Nrc rrr r#r&r)r*r+lr,T)use_conv_transpose)super__init__tupler out_channelsrtime_embeddingsr time_mlpnn ModuleList down_blocks mid_blocks up_blocksrangelenrrConv1dappendr r final_block final_projinitialize_weights)selfrr4channelsr!r n_blocksnum_mid_blocksr'rri input_channelis_lastresnettransformer_blocks downsampleupsample __class__r&r*r2sz            zConditionalDecoder.__init__cCs|D]R}t|tjr#tjj|jdd|jdur"tj|jdqt|tj r:tj|jdtj|jdqt|tj rVtjj|jdd|jdurVtj|jdqdS)Nrelu) nonlinearityrr) modules isinstancer7r>initkaiming_normal_weightbias constant_ GroupNormLinear)rCmr)r)r*rBs      z%ConditionalDecoder.initialize_weightsNc Csv||}||}t||gdd}|dur*t|d|jdd}t||gdd}|dur7t||gdd}g}|g}|jD]Q\} } } |d} | || |}t|d}t | dd | } | D] }||| |d }qct|d }| || || }| | ddddddd fq?|dd}|d}|j D]0\} } | |||}t|d}t | dd |} | D] }||| |d }qt|d }q|j D]W\} } }|}|}t|ddddd|jdf|gdd}| |||}t|d}t | dd |} | D] }||| |d }qt|d }|||}q|||}|||}||S) a.Forward pass of the UNet1DConditional model. Args: x (torch.Tensor): shape (batch_size, in_channels, time) mask (_type_): shape (batch_size, 1, time) t (_type_): shape (batch_size) spks (_type_, optional): shape: (batch_size, condition_channels). Defaults to None. cond (_type_, optional): placeholder for future use. Defaults to None. Raises: ValueError: _description_ ValueError: _description_ Returns: _type_: _description_ zb * trNz b c -> b c tr/)tzb c t -> b t crr) hidden_statesattention_masktimestepzb t c -> b c t)r5r6rrshaper9r contiguoustorchmatmul transposer?r:r;popr@rA)rCxmaskmur\spkscondhiddensmasksrJrKrL mask_down attn_masktransformer_blockmask_midrMmask_upskipoutputr)r)r*forwardsp     $  .   zConditionalDecoder.forward)rrrrrrr)NN)__name__ __module__ __qualname__r2rBrt __classcell__r)r)rNr*r slr )rbtorch.nnr7einopsrrr matcha.models.components.decoderrrrrr r $matcha.models.components.transformerr Moduler r)r)r)r*s