U AdvB@sddlmZddlmZddlmZddlZddlZddl m m Z ddlm Z ddl m Z ddZd d Zd d ZdddZdddZdddZeedZGddde jZdS))deque)partial) isfunctionN)nn)tqdmcCs|dk SN)xrrEC:\Green_Program_Files\So-VITS-SVC-Shengshuyan\diffusion\diffusion.pyexists sr cCst|r |St|r|S|Sr)r r)valdrrr defaultsrcCs2|j^}}|d|}|j|fdt|dS)Nr)shapegatherreshapelen)atx_shapeb_outrrr extracts  rFcs,fdd}fdd}|r&|S|S)Ncs6tjddddjdfdtdS)Nrdevicerr)r)torchrandnrepeatrrrrrr repeat_noisesz noise_like..repeat_noisecstjdS)Nr)rr rr"rr noisesznoise_like..noiser)rrr!r#r$rr"r noise_likesr%{Gz?cCstd||}|S)z linear schedule g-C6?)nplinspace) timestepsmax_betabetasrrr linear_beta_schedule$sr,Mb?cCsv|d}td||}t|||d|tjdd}||d}d|dd|dd}tj|dddS) zW cosine schedule as proposed in https://openreview.net/forum?id=-NEXDKk8gZ rr?Nrg+?)a_mina_max)r'r(cospiclip)r)sstepsr alphas_cumprodr+rrr cosine_beta_schedule,s ( r8)cosinelinearcseZdZd'fdd Zdd Zd d Zd d ZddZe ddZ e d(ddZ e d)ddZ d*ddZ d+ddZd,d!d"Zd#d$Zd%d&ZZS)-GaussianDiffusionr&r/c st||_||_td||d}d|} tj| dd} td| dd} |j\}t ||_ |dkrv||krv|n||_ t dd|_ ttjtjd } |d | ||d | | |d | | |d | t| |d| td| |d| td| |d| td| |d| td| d|d| d| } |d| | |d| tt| d|d| |t| d| |d| d| t| d| |dt|gddd|f|dt|gddd|fdS)Nr:)r*?r)axisrmaxlen)dtyper+r7alphas_cumprod_prevsqrt_alphas_cumprodsqrt_one_minus_alphas_cumprodlog_one_minus_alphas_cumprodsqrt_recip_alphas_cumprodsqrt_recipm1_alphas_cumprodrposterior_varianceposterior_log_variance_clippedg#B ;posterior_mean_coef1posterior_mean_coef2spec_minspec_max)super__init__ denoise_fnout_dims beta_scheduler'cumprodappendrintZ num_timestepsk_stepr noise_listrrtensorfloat32register_buffersqrtlogmaximum FloatTensor)selfrSrTr)rYr*rOrPr+alphasr7rEZto_torchrK __class__rr rR@s>   "zGaussianDiffusion.__init__cCsBt|j||j|}td|j||j}t|j||j}|||fS)Nr?)rrFrr7rH)rbx_startrmeanvarianceZ log_variancerrr q_mean_variancessz!GaussianDiffusion.q_mean_variancecCs(t|j||j|t|j||j|Sr)rrIrrJ)rbx_trr$rrr predict_start_from_noiseysz*GaussianDiffusion.predict_start_from_noisecCsRt|j||j|t|j||j|}t|j||j}t|j||j}|||fSr)rrMrrNrKrL)rbrfrjrZposterior_meanrKrLrrr q_posteriorszGaussianDiffusion.q_posteriorc CsL|j|||d}|j|||d}|dd|j|||d\}}}|||fS)Ncond)rr$gr?)rfrjr)rSrkclamp_rl) rbr rrn noise_predx_recon model_meanrKZposterior_log_variancerrr p_mean_variances  z!GaussianDiffusion.p_mean_variancec Cs~t|j||j}t|jt||t||j}|j|||d}|||d||d|||}|S)z* Use the DDIM method from rmr)rr7rrmax zeros_likerSr^) rbr rintervalrna_ta_prevrpx_prevrrr p_sample_ddims "8zGaussianDiffusion.p_sample_ddimTFc Cs||j|jf^}}}|j|||d\} }} t|j||} d|dkj|fdt|jd} | | d| | S)N)r rrnrrrr.)rrrsr%floatrrexp) rbr rrn clip_denoisedr#rrrrrZmodel_log_variancer$Z nonzero_maskrrr p_samples *zGaussianDiffusion.p_samplecsfdd}j}j|||d} t|dkrd||| |} j| t|d|d} | | d} nt|dkrd| |dd} nbt|dkrd | d |dd |d d } n0d| d|dd|d d|dd} ||| |} || | S)z Use the PLMS method from [Pseudo Numerical Methods for Diffusion Models on Manifolds](https://arxiv.org/abs/2202.09778). c stj||j}tjt|t||j}||}}||d||||d|d||d|||}||}|SNr)rr7rrrtrur^) r Znoise_trrwrxZa_t_sqZ a_prev_sqZx_deltax_predrvrbrr get_x_preds""z3GaussianDiffusion.p_sample_plms..get_x_predrmrr/rr 7;% )rZrSrrtrW)rbr rrvrnr}r#rrZrprZnoise_pred_prevZnoise_pred_primeryrrr p_sample_plmss     &0  zGaussianDiffusion.p_sample_plmsNcs:t|fdd}t|j|jt|j|j|S)Ncs tSrr randn_likerrfrr z,GaussianDiffusion.q_sample..)rrrFrrG)rbrfrr$rrr q_samples zGaussianDiffusion.q_samplel2c sjt|fdd}|j||d}||||}|dkrJ||}n|dkr`t||}nt|S)Ncs tSrrrrrr rrz,GaussianDiffusion.p_losses..)rfrr$l1r)rrrSabsrgFmse_lossNotImplementedError) rbrfrrnr$Z loss_typeZx_noisyrqlossrrr p_lossesszGaussianDiffusion.p_losses dpm-solver,c s|dd}|jd|j} } |sz|} tjdj| f| d} | dddddddddf} j| | |dS|jddj |jdf}|dkrj} tj || d}nT|} |} | dddddddddf} j | tj | dg| dd}|dk r|dkr|dks.|d krdd l m}m}m}|d jd| d }fd d}||j|dd|id}|dkr|||dd}n|d kr|||dd}| |}rtd|d_|j||dddd}rjql|dkrtdd_r^tttd| |d| |dD]*}j|tj| f|| tjd||d}q0nGaussianDiffusion.forward..my_wrapper..wrappedrrrrbrrr my_wrapper sz-GaussianDiffusion.forward..my_wrapperr$rn) model_typeZ model_kwargsZ dpmsolver)Zalgorithm_typez dpmsolver++zsample time step)desctotalZ time_uniformZ multistep)r6orderZ skip_typemethodpndmrArB)rrDddimunipc)rUniPCrcsfdd}|S)Ncs"||f|}rjd|Srrrrrr r\s rrrrrr r[sZbh2)variant)$ transposerr norm_specrrandintrYlongrrTr rr[Zdpm_solver_pytorchrrrr+rSrrsamplecloserrZreversedrangerfullrzuni_pcrrr~squeeze denorm_spec)rb conditiongt_specinfer infer_speeduprrYrrnrrspecrrrr rrrZnoise_schedulerZmodel_fnZ dpm_solverr6irrrrr forwards  $ $"                &$zGaussianDiffusion.forwardcCs||j|j|jddS)Nr/r)rOrPrbr rrr rszGaussianDiffusion.norm_speccCs|dd|j|j|jS)Nrr/)rPrOrrrr rszGaussianDiffusion.denorm_spec)r<r=r=r&r>r/)TF)TF)N)Nr)NTrrrT)__name__ __module__ __qualname__rRrirkrlrsrno_gradrzr~rrrrrr __classcell__rrrdr r;?s:3     $   (r;)F)r&)r-) collectionsr functoolsrinspectrnumpyr'rZtorch.nn.functionalr functionalrrr rrr%r,r8rUModuler;rrrr s"