o
    ߥi                     @   s   d dl Z d dlZddlmZmZmZmZ ddlmZm	Z	 g dZ
dd Z			dd	d
Zdd ZG dd deZG dd deZG dd deZdS )    N   )
DPM_SolverNoiseScheduleVPmodel_wrappermodel_wrapper_guided_diffusion)#discretized_gaussian_log_likelihoodkl_divergence)GaussianDiffusionbeta_scheduleGaussianDiffusion_stylec                 C   sF   | dfd|jd   }| j|jkr| |j} | | ||S )z?Index tensor using t and format the output according to x.
    r   r   r   )sizendimdevicetoview)tensortxshape r   i/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/multi_modal/videocomposer/diffusion.py_i   s   r     c           
      C   s  | dkrd| }|p|d }|p|d }t j|||t jdS | dkr2t j|d |d |t jdd S | d	krN|p9d
}|p=d}t j|d |d |t jdd S | dkrg }t|D ] }|| }|d | }dd }	|td|	||	|  d qXt j|t jdS td|  )a  
    This code defines a function beta_schedule that generates a sequence of beta
    values based on the given input parameters.
    These beta values can be used in video diffusion processes. The function has the following parameters:
        schedule(str): Determines the type of beta schedule to be generated.
            It can be 'linear', 'linear_sd', 'quadratic', or 'cosine'.
        num_timesteps(int, optional): The number of timesteps for the generated beta schedule. Default is 1000.
        init_beta(float, optional): The initial beta value.
            If not provided, a default value is used based on the chosen schedule.
        last_beta(float, optional): The final beta value.
            If not provided, a default value is used based on the chosen schedule.
    The function returns a PyTorch tensor containing the generated beta values.
    The beta schedule is determined by the schedule parameter:
        1.Linear: Generates a linear sequence of beta values betweeninit_betaandlast_beta.
        2.Linear_sd: Generates a linear sequence of beta values between the square root of
            init_beta and the square root oflast_beta, and then squares the result.
        3.Quadratic: Similar to the 'linear_sd' schedule, but with different default values forinit_betaandlast_beta.
        4.Cosine: Generates a sequence of beta values based on a cosine function,
            ensuring the values are between 0 and 0.999.
    If an unsupported schedule is provided, a ValueError is raised with a message indicating the issue.
    linear     @@-C6?g{Gz?dtype	linear_sd      ?   	quadraticg~jtX?g+?cosiner   c                 S   s    t | d d t j d d S )NgMb?gT㥛 ?r!   )mathcospi)ur   r   r   <lambda>E   s
    zbeta_schedule.<locals>.<lambda>      ?g+?zUnsupported schedule: )torchlinspacefloat64rangeappendminr   
ValueError)
schedulenum_timesteps	init_beta	last_betascalebetasstept1t2fnr   r   r   r
      s@   
"r
   c                 C   s   dd l }| }t|  }|D ]I}|ddkrY|dd }|dv r*|dd}|rS|ddkr9|dd	}|d
dkrF|d
d}|ddkrS|dd}| | ||< q|S )Nr   diffusion_modelzdiffusion_model.)zinput_blocks.3.0.op.weightzinput_blocks.3.0.op.biaszinput_blocks.6.0.op.weightzinput_blocks.6.0.op.biaszinput_blocks.9.0.op.weightzinput_blocks.9.0.op.biasz0.opopzmiddle_block.2zmiddle_block.3zoutput_blocks.5.2zoutput_blocks.5.3zoutput_blocks.8.2zoutput_blocks.8.3)collectionsOrderedDictlistkeysfindsplitreplace)
state_dicttemporal_attentionr>   sd_newrA   kk_newr   r   r    load_stable_diffusion_pretrainedM   s,   rJ   c                   @   s&   e Zd Zd
ddZdd Zdd Zd	S )AddGaussianNoise        皙?c                 C   s   || _ || _d S N)stdmean)selfrP   rO   r   r   r   __init__k   s   
zAddGaussianNoise.__init__c                 C   s\   t |tjsJ |j}| s|tj}|| jt|  | j	 }|j|kr,||}|S rN   )

isinstancer*   Tensorr   is_floating_pointr   float32rO   
randn_likerP   )rQ   imgr   outr   r   r   __call__o   s   

zAddGaussianNoise.__call__c                 C   s   | j jd| j| j S )Nz(mean={0}, std={1}))	__class____name__formatrP   rO   )rQ   r   r   r   __repr__y   s   
zAddGaussianNoise.__repr__N)rL   rM   )r\   
__module____qualname__rR   rZ   r^   r   r   r   r   rK   i   s    

rK   c                   @   sz  e Zd Z					d+ddZd,d	d
Zdd Zdd Ze i ddddfddZ	e i ddddfddZ
i dddfddZe i ddddddfddZe i ddddddfddZe i ddddfddZe i ddddfddZe i dddddfdd Ze i dddddfd!d"Zi dddfd#d$Zi ddfd%d&Ze i ddfd'd(Zd)d* ZdS )-r	   epslearned_rangemse-q=Fc                 C   s  t |tjstj|tjd}t|dkrt|dksJ |dv s"J |dv s(J |dv s.J || _t|| _	|| _
|| _|| _|| _|| _d| j }tj|dd| _t|dg| jd d g| _t| jdd  |dgg| _t| j| _td	| j | _td	| j | _td	| j | _td	| j d | _|d	| j  d	| j  | _t| jd
| _|t| j d	| j  | _ d	| j t| d	| j  | _!d S )Nr   r   r   x0x_{t-1}ra   learnedrb   fixed_largefixed_small)rc   rescaled_mseklrescaled_kll1rescaled_l1charbonnierdimr<   r)   #B;)"rS   r*   DoubleTensorr   r,   r/   maxr6   lenr2   	mean_typevar_type	loss_typeepsilonrescale_timestepscumprodalphas_cumprodcatnew_onesalphas_cumprod_prev	new_zerosalphas_cumprod_nextsqrtsqrt_alphas_cumprodsqrt_one_minus_alphas_cumprodloglog_one_minus_alphas_cumprodsqrt_recip_alphas_cumprodsqrt_recipm1_alphas_cumprodposterior_varianceclampposterior_log_variance_clippedposterior_mean_coef1posterior_mean_coef2)rQ   r6   rx   ry   rz   r{   r|   alphasr   r   r   rR      sb   




zGaussianDiffusion.__init__Nc                 C   s:   |du r	t |n|}t| j||| t| j|||  S z"Sample from q(x_t | x_0).
        N)r*   rW   r   r   r   )rQ   rf   r   noiser   r   r   q_sample   s   zGaussianDiffusion.q_samplec                 C   <   t | j||| }t d| j ||}t | j||}|||fS z&Distribution of q(x_t | x_0).
        r)   r   r   r~   r   rQ   rf   r   muvarlog_varr   r   r   q_mean_variance      
z!GaussianDiffusion.q_mean_variancec                 C   J   t | j||| t | j|||  }t | j||}t | j||}|||fS z/Distribution of q(x_{t-1} | x_t, x_0).
        r   r   r   r   r   rQ   rf   xtr   r   r   r   r   r   r   q_posterior_mean_variance      
z+GaussianDiffusion.q_posterior_mean_variancec	              	   C   s   |  |||||||\}	}
}}t|}|d jdgd|jd  R  }|durA||| |fi |}|	 |
|   }	|	|td|  |  }||fS zSample from p(x_{t-1} | x_t).
            - condition_fn: for classifier-based guidance (guided-diffusion).
            - guide_scale: for classifier-free guidance (glide/dalle-2).
        r   r<   r   r   Nr    )	p_mean_variancer*   rW   nefloatr   r   _scale_timestepsexp)rQ   r   r   modelmodel_kwargsr   
percentilecondition_fnguide_scaler   r   r   rf   r   maskgradxt_1r   r   r   p_sample   s"   
zGaussianDiffusion.p_samplec                 C   ^   | d}|}	t| jdD ]}
tj|f|
tj|	jd}| |	|||||||\}	}q|	S zLSample from p(x_{t-1} | x_t) p(x_{t-2} | x_{t-1}) ... p(x_0 | x_1).
        r   r   r   	r   r*   aranger2   flipfulllongr   r   rQ   r   r   r   r   r   r   r   br   r7   r   _r   r   r   p_sample_loop      

zGaussianDiffusion.p_sample_loopc                 C   s&  |du r|||  |fi |}njt|trt|dksJ |||  |fi |d }	|||  |fi |d }
| jdrE|	dn|	dd }tj|
ddd|f ||	ddd|f |
ddd|f    |	dd|df gdd}| jdkr|j	ddd\}}t
|}nh| jdkr|j	ddd\}}t| j||}tt| j||}|d d	 }|| d| |  }t
|}n3| jd
krtt| jdd | jdd g||}t|}n| jdkrt| j||}t| j||}| jdkr|}td| j ||| t| j| j |||  }n5| jdkr*|}| |||\}}}n"| jdkrLt| j||| t| j|||  }| |||\}}}|dur|dkr[|dks]J tj|d |ddddddd}t|t| || }n|dur|| |}||||fS )*Distribution of p(x_{t-1} | x_t).
        Nr!   r   r   fixedrr   ri   rb          @rj   rk   rg   r)   rf   ra   r<   )r   rS   r@   rw   ry   
startswithr   r*   r   chunkr   r   r   r   r6   r   rx   r   r   r   r   r   quantileflattenabsclamp_r   r/   rv   r   )rQ   r   r   r   r   r   r   r   rY   y_outu_outrs   r   r   fractionmin_log_varmax_log_varr   rf   r   sr   r   r   r     s|   &
	

"


z!GaussianDiffusion.p_mean_variance   rL   c              	   C   s  | j |	 }| |||||||\}}}}|durWt| j||}t| j||| | t| j|| }|d|  ||| |fi |  }t| j||| t| j|||  }t| j||| | t| j|| }t| j||}t| j|| d|}|
t	d| d|  d||    }t	
|}t	d| |d  | }|d jdgd|jd  R  }t	|| | || |  }||fS )Sample from p(x_{t-1} | x_t) using DDIM.
            - condition_fn: for classifier-based guidance (guided-diffusion).
            - guide_scale: for classifier-free guidance (glide/dalle-2).
        Nr   r   r!   r<   r   )r2   r   r   r~   r   r   r   r   r   r*   rW   r   r   r   r   )rQ   r   r   r   r   r   r   r   r   ddim_timestepsetastrider   rf   alphara   r   alphas_prevsigmasr   	directionr   r   r   r   r   ddim_sampleO  s<   




&zGaussianDiffusion.ddim_samplec
                 C   s   | d}
|}dtd| j| j|  d| jd d}|D ]}tj|
f|tj|jd}| 	||||||||||	
\}}q |S Nr   r   r   )
r   r*   r   r2   r   r   r   r   r   r   )rQ   r   r   r   r   r   r   r   r   r   r   r   stepsr7   r   r   r   r   r   ddim_sample_loop  s"   


z"GaussianDiffusion.ddim_sample_loopc	              	   C   s   | j | }	| |||||||\}
}
}
}t| j||| | t| j|| }tt| j| jdgg||	 	d| j |}t
|| t
d| |  }||fS )MSample from p(x_{t+1} | x_t) using DDIM reverse ODE (deterministic).
        r   r   )r2   r   r   r   r   r*   r   r~   r   r   r   )rQ   r   r   r   r   r   r   r   r   r   r   rf   ra   alphas_nextr   r   r   r   ddim_reverse_sample  s"   
 z%GaussianDiffusion.ddim_reverse_samplec                 C   sf   | d}|}	td| j| j| }
|
D ]}tj|f|tj|	jd}| |	|||||||\}	}q|	S )Nr   r   )r   r*   r   r2   r   r   r   r   )rQ   rf   r   r   r   r   r   r   r   r   r   r7   r   r   r   r   r   ddim_reverse_sample_loop  s   



z*GaussianDiffusion.ddim_reverse_sample_loopc
                    s   j |	  fdd}
fdd}|
|}ttdkr<|||\}}|
|| d}|| d }nHttdkrMd| td	  d }n7ttd
krfd| dtd	   dtd   d }nttdkrd| dtd	   dtd   dtd   d }|||\}}|||fS )Sample from p(x_{t-1} | x_t) using PLMS.
            - condition_fn: for classifier-based guidance (guided-diffusion).
            - guide_scale: for classifier-free guidance (glide/dalle-2).
        c              	      s    | | \}}}}d urRtj|| }tj|| |  | tj||  }|d|  | |fi   }tj|| |  tj|| |  }tj|| |  | tj||  }|S Nr   )r   r   r~   r   r   r   r   )r   r   r   rf   r   ra   r   r   r   r   r   r   rQ   r   r   compute_eps  s(   

z2GaussianDiffusion.plms_sample.<locals>.compute_epsc                    sh   t  j| t  j||   }t  j| d}td| |  }t|| | }||fS )Nr   r   )r   r   r   r~   r   r*   r   )ra   r   rf   r   r   r   )rQ   r   r   r   r   
compute_x0  s   z1GaussianDiffusion.plms_sample.<locals>.compute_x0r   r   r      r<   r!                  (@7   ;   %   	         8@)r2   rw   	eps_cacher   )rQ   r   r   r   r   r   r   r   r   plms_timestepsr   r   ra   r   rf   eps_next	eps_primer   )	r   r   r   r   r   r   rQ   r   r   r   plms_sample  s0   




zGaussianDiffusion.plms_samplec	                 C   s   | d}	|}
dtd| j| j|  d| jd d}g }|D ]/}tj|	f|tj|
jd}| 	|
|||||||||
\}
}}|
| t|dkrQ|d q"|
S Nr   r   r      )r   r*   r   r2   r   r   r   r   r   r   r.   rw   pop)rQ   r   r   r   r   r   r   r   r   r   r   r   r   r7   r   r   ra   r   r   r   plms_sample_loop  s.   




z"GaussianDiffusion.plms_sample_loopc                    s  |d u r	t |n|}| j|||d}| jdv r/| |||||\}	}
| jdkr-|	| j }	|	S | jdv r||| |fi |}d}| jdv rw|jddd	\}}t j	|
 |gdd	 | j||| fd
dd\}}
| jdrw|| j d }||| |||d d| j }|| | jdrdnd djdd	}	|d ur|	| }	|r| jdkr|jd dkrt| j||| t| j|||  }d|jdd	djdd	d  }|	| }	|	| }	|	S | jdv r_||| |fi |}d}| jdv r-|jddd	\}}t j	|
 |gdd	 | j||| fddd\}}
| jdr-|| j d }||| |||d d| j }t || d | j }	|d urR|	| }	|	djdd	}	|	| }	|	S )Nr   rm   rn   rn   rc   rl   ro   rp   rL   ri   rb   r!   r   rr   c                         S rN   r   argskwargsfrozenr   r   r(   Z      z(GaussianDiffusion.loss.<locals>.<lambda>)r   	rescaled_r   r   ra   rf   rg   ro   ra   gMbP?r   )rq   c                     r   rN   r   r   r  r   r   r(     r  )r*   rW   r   rz   variational_lower_boundr2   r   ry   r   r   detachr   r   rx   powendswithr   r   rP   r   r   r   r   rO   r   r{   )rQ   rf   r   r   r   r   weightuse_div_lossr   lossr   rY   loss_vlbr   targetx0_div_lossr   r  r   r  ;  s   	


E




zGaussianDiffusion.lossc                 C   s   |  |||\}}	}
| ||||||\}}	}}t||
||}|djddtd }t||d| d }|djddtd }t	|dk||}||fS )Nr   rr   r   r    rP   	log_scaler   )
r   r   r   r   rP   r$   r   r   r*   where)rQ   rf   r   r   r   r   r   r   mu1r   log_var1mu2log_var2rm   nllvlbr   r   r   r    s   	
z)GaussianDiffusion.variational_lower_boundc              
   C   p  | d}g g g d}t| jdD ]d}tj|f|tj|jd}	t|}
| 	||	|
}| 
|||	||||\}}t| j|	|| | t| j|	| }|d | |d ||  djdd |d ||
  djdd qd	d
 | D }| ||	\}}}t||t|t|}|djddtd }||d< |d jdd| |d< |S )NCompute the entire variational lower bound, measured in bits-per-dim.
        r   r  rc   x0_mser   r  r  r   rr   rc   c                 S       i | ]\}}|t j|d dqS r   rr   r*   stack.0rH   vr   r   r   
<dictcomp>       zBGaussianDiffusion.variational_lower_bound_loop.<locals>.<dictcomp>r   prior_bits_per_dimtotal_bits_per_dimr   r*   r   r2   r   r   r   r   rW   r   r  r   r   r   r.   squarer   rP   itemsr   r   
zeros_liker$   r   sumrQ   rf   r   r   r   r   r   metricsr7   r   r   r   r  pred_x0ra   r   r   r   kl_priorr   r   r   variational_lower_bound_loop  8   


z.GaussianDiffusion.variational_lower_bound_loopc                 C      | j r| d | j S |S Nr   r|   r   r2   rQ   r   r   r   r   r        z"GaussianDiffusion._scale_timesteps)ra   rb   rc   rd   FrN   )r\   r_   r`   rR   r   r   r   r*   no_gradr   r   r   r   r   r   r   r   r   r  r  r3  r   r   r   r   r   r	   ~   s    

9	
I/I$
]
,r	   c                   @   s  e Zd Z				d<ddZd=dd	Zd
d Zdd Ze i ddddfddZ	e i ddddfddZ
i dddfddZe i ddddddfddZe i ddddddfddZe i ddddfddZe i ddddfddZe i dddddfddZe i dddddfd d!Ze i d"d#d$dddddd%ddd&dd'fd(d)Ze i dddfd*d+Ze i dddfd,d-Ze i dddd.fd/d0Ze i dddd.fd1d2Zi ddd3fd4d5Zi ddd3fd6d7Ze i ddfd8d9Zd:d; ZdS )>r   ra   rk   rc   Fc                 C   s  t |tjstj|tjd}t|dkrt|dksJ |dv s"J |dv s(J |dv s.J || _t|| _	|| _
|| _|| _|| _d| j }tj|dd| _t|dg| jd d g| _t| jdd  |dgg| _t| j| _td	| j | _td	| j | _td	| j | _td	| j d | _|d	| j  d	| j  | _t| jd
| _|t| j d	| j  | _d	| j t| d	| j  | _ d S )Nr   r   r   re   rh   )rc   rl   rm   rn   ro   rp   rr   r<   r)   rt   )!rS   r*   ru   r   r,   r/   rv   r6   rw   r2   rx   ry   rz   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rQ   r6   rx   ry   rz   r|   r   r   r   r   rR     s`   




z GaussianDiffusion_style.__init__Nc                 C   sD   |du r	t |n|}t| j||| t| j|||  }||S r   )r*   rW   r   r   r   type_as)rQ   rf   r   r   r   r   r   r   r     s
   
z GaussianDiffusion_style.q_samplec                 C   r   r   r   r   r   r   r   r      r   z'GaussianDiffusion_style.q_mean_variancec                 C   r   r   r   r   r   r   r   r   (  r   z1GaussianDiffusion_style.q_posterior_mean_variancec	              	   C   s   |j }	| |||||||\}
}}}t|}|d jdgd|jd  R  }|durD||| |fi |}|
 ||   }
|
|t	d|  |  }|
|	|
|	fS r   )r   r   r*   rW   r   r   r   r   r   r   type)rQ   r   r   r   r   r   r   r   r   r   r   r   r   rf   r   t_maskr   r   r   r   r   r   1  s$   
z GaussianDiffusion_style.p_samplec                 C   r   r   r   r   r   r   r   r   R  r   z%GaussianDiffusion_style.p_sample_loopc                 C   s*  |du r||fd|  |i|}nst|trt|dksJ ||fd|  |i|d }	|dkr||fd|  |i|d }
| jdrL|	dn|	dd }tj|
ddd|f ||	ddd|f |
ddd|f    |	dd|df gdd}n|	}| jd	kr|j	ddd\}}t
|}ni| jd
kr|j	ddd\}}t| j||}tt| j||}|d d }|| d| |  }t
|}n4| jdkrtt| jdd | jdd g||}t|}n| jdkrt| j||}t| j||}| jdkr"|}td| j ||| t| j| j |||  }n!| jdkr+|}n| jdkrCt| j||| t| j|||  }|dury|dkrR|dksTJ tj|d |dddddddd}t|t| || }n|dur|| |}| |||\}}}||||fS )r   Nr   r!   r   r)   r   r   rr   ri   rb   r   rj   rk   rg   rf   ra   r<   )r   rS   r@   rw   ry   r   r   r*   r   r   r   r   r   r   r6   r   rx   r   r   r   r   r   r   r   r   r   r/   rv   r   r   )rQ   r   r   r   r   r   r   r   rY   r   r   rs   r   r   r   r   r   r   rf   r   r   r   r   r   r   h  s   &


"

z'GaussianDiffusion_style.p_mean_variancer   rL   c              	   C   s  |j }| |||||||	\}}}}|durUt| j||}t| j||| | t| j|| }|d|  ||| |fi |  }t| j||| t| j|||  }t| j||| | t| j|| }t| j||}t| j||}|td| d|  d||    }t	|}td| |d  | }|
d jdgd|jd  R  }t|| | || |  }||||fS )r   Nr   r!   r   r<   r   )r   r   r   r~   r   r   r   r   r*   rW   r   r   r   r   r<  )rQ   r   r   t_prevr   r   r   r   r   r   r   r   r   r   rf   r   ra   r   r   r   r   r   r=  r   r   r   r   r     sL   



&
z#GaussianDiffusion_style.ddim_samplec
                 C   s   | d}
|}dtd| j| j|  d| jd d}t|D ];\}}tj|
f|tj|j	d}tj|
f|t
|d k rD||d  ndtj|j	d}| |||||||||||	\}}q"|S r   )r   r*   r   r2   r   r   	enumerater   r   r   rw   r   )rQ   r   r   r   r   r   r   r   r   r   r   r   r   ir7   r   r>  r   r   r   r   r     s,   


z(GaussianDiffusion_style.ddim_sample_loopc
              	   C   s   |j }
| |||||||\}}}}t| j||| | t| j|| }tt| j| jdgg||}t	|| t	d| |  }|
|
|
|
fS )r   r   )r   r   r   r   r   r*   r   r~   r   r   r<  )rQ   r   r   t_nextr   r   r   r   r   r   r   r   rf   ra   r   r   r   r   r   r     s"    z+GaussianDiffusion_style.ddim_reverse_samplec                 C   s   | d}|}	dtd| j| j|  d| jd }
t|
D ]5\}}tj|f|dkr1|
|d  ndtj|	jd}tj|f|tj|	jd}| 	|	||||||||	\}	}q|	S r   )
r   r*   r   r2   r   r?  r   r   r   r   )rQ   rf   r   r   r   r   r   r   r   r   r   r@  r7   r   rA  r   r   r   r   r   &  s2   



z0GaussianDiffusion_style.ddim_reverse_sample_loopc                    s   fdd}fdd}||}t tdkr2|||\}}||}|| d }nHt tdkrCd| td	  d }n7t td
kr\d| dtd	   dtd   d }nt tdkrzd| dtd	   dtd   dtd   d }|||\}}|||fS )r   c              	      s   | j }| | \}}}}d urUtj|| }tj|| |  | tj||  }|d|  | |fi   }tj|| |  tj|| |  }tj|| |  | tj||  }||S r   )	r   r   r   r~   r   r   r   r   r<  )r   r   r   r   rf   r   ra   r   r   r   r   W  s*   


z8GaussianDiffusion_style.plms_sample.<locals>.compute_epsc                    sp   | j }t j| t j||   }t j}td| |  }t|| | }||||fS r   )r   r   r   r   r~   r*   r   r<  )ra   r   r   rf   r   r   r   )rQ   r>  r   r   r   r   q  s   z7GaussianDiffusion_style.plms_sample.<locals>.compute_x0r   r   r   r   r<   r!   r   r   r   r   r   r   r   r   r   r   r   )rw   r   )rQ   r   r   r>  r   r   r   r   r   r   r   r   r   ra   r   rf   r   r   r   )	r   r   r   r   r   r   rQ   r>  r   r   r   E  s.   




z#GaussianDiffusion_style.plms_samplec	                 C   s   | d}	|}
dtd| j| j|  d| jd d}g }t|D ]L\}}tj|	f|tj|
j	d}tj|	f|t
|d k rF||d  ndtj|
j	d}| |
||||||||||\}
}}|| t
|dkrp|d q$|
S r   )r   r*   r   r2   r   r   r?  r   r   r   rw   r   r.   r   )rQ   r   r   r   r   r   r   r   r   r   r   r   r   r@  r7   r   r>  r   ra   r   r   r   r     s8   




z(GaussianDiffusion_style.plms_sample_loopr!   logSNR	multistepzdpmsolver++T	dpmsolverc                 C   s   | j dv sJ |dv sJ |du s|du sJ td| j d}t||| j| j || j| j|
|	d	}t|||||d}|j	||||||||||d
}|S )	a  Sample using DPM-Solver-based method.
            - condition_fn: for classifier-based guidance (guided-diffusion).
            - guide_scale: for classifier-free guidance (glide/dalle-2).

            Please check all the parameters in `dpm_solver.sample` before using.
        )ra   rf   )Ngףp=
?Ndiscrete)r1   r6   )	r   noise_schedulery   rx   r   r|   r2   r   r   )model_fnrF  algorithm_typer   r   )	r   order	skip_typemethodsolver_typet_startt_endlower_order_finaldenoise_to_zero)
rx   r   r6   r   r   ry   r|   r2   r   sample)rQ   r   r   r   rI  rJ  rK  r   r   r   r   dpm_solver_timestepsrH  rM  rN  rO  rP  rL  rF  rG  
dpm_solverr   r   r   r   dpm_solver_sample_loop  sJ   

z.GaussianDiffusion_style.dpm_solver_sample_loopc
              	   C   s   |j }
| ||| |d|   }| |||||||	\}}}}|d jdgd|jd  R  }||td|  t	|  }|
|
|
|
fS )z+DDPM sampling step for inpainting.
        r   r   r<   r   r    )r   r   r   r   r   r   r   r*   r   rW   r<  )rQ   r   r   yr   r   r   r   r   r   r   r   r   r   rf   r=  r   r   r   r   inpaint_p_sample  s    z(GaussianDiffusion_style.inpaint_p_samplec	                 C   s`   | d}	|}
t| jdD ]}tj|	f|tj|
jd}| |
||||||||	\}
}q|
S )z+DDPM sampling loop for inpainting.
        r   r   )	r   r*   r   r2   r   r   r   r   rV  )rQ   r   rU  r   r   r   r   r   r   r   r   r7   r   r   r   r   r   inpaint_p_sample_loop  s   

z-GaussianDiffusion_style.inpaint_p_sample_loopr)   c              
   C   s  |j }t 1 |d | |||||||	\}}}}|| ||    }tj||d }W d   n1 s;w   Y  |	d
 jdgd|jd  R  }||td|  t|  }||
|  }| ||| |d|   }||||fS )z`DDPM sampling step for inpainting, with Manifold Constrained Gradient (MCG) correction.
        Tr   Nr<   r   r   r    )r   r*   enable_gradrequires_grad_r   r+  rP   autogradr   r   r   r   r   r   rW   r   r<  )rQ   r   r   rU  r   r   r   r   r   r   	mcg_scaler   r   r   r   rf   r  r   r=  r   r   r   r   inpaint_mcg_p_sample'  s(   

 z,GaussianDiffusion_style.inpaint_mcg_p_samplec
                 C   sb   | d}
|}t| jdD ]}tj|
f|tj|jd}| ||||||||||	
\}}q|S )z`DDPM sampling loop for inpainting, with Manifold Constrained Gradient (MCG) correction.
        r   r   )	r   r*   r   r2   r   r   r   r   r\  )rQ   r   rU  r   r   r   r   r   r   r[  r   r   r7   r   r   r   r   r   inpaint_mcg_p_sample_loopK  s   

z1GaussianDiffusion_style.inpaint_mcg_p_sample_looprP   c                    sv  |dv sJ |d u rt |n|}|d u r|n|}| j|||d}| jdv r=| |||||\}	}
| jdkr;|	| j }	|	S | jdv r||fd| |i|}d}| jdv r|jd	d
d\}}t j	|
 |gd
d | j||| fdd|d\}}
| jdr|| j d }||| |||d d| j }|| | jdrd
nd	 }	|dkr|	d
jd
d}	|	| }	|	S )NrP   noner   r   rn   r   r   rL   r   r!   r   rr   c                     r   rN   r   r   r  r   r   r(     r  z.GaussianDiffusion_style.loss.<locals>.<lambda>)r   	reductionr  r   r   r  ro   rP   )r*   rW   r   rz   r  r2   r   ry   r   r   r  r   r   rx   r	  r
  r   r   rP   )rQ   rf   r   r   r   r   input_x0r`  r   r  r   rY   r  r   r  r   r  r   r  d  sZ   


"



zGaussianDiffusion_style.lossc	                 C   s   |dv sJ |  |||\}	}
}| ||||||\}}
}}t|	|||td }|dkr7|djdd}t||d| d td }|dkrS|djdd}|jdgd	|j	d  R  }t
|d
k||}||fS )Nr^  r   rP   r   rr   r    r  r<   r   r   )r   r   r   r$   r   r   rP   r   r   r   r*   r  )rQ   rf   r   r   r   r   r   r   r`  r  r   r  r  r  rm   r  r  r   r   r   r    s$   	
z/GaussianDiffusion_style.variational_lower_boundc              
   C   r  )r  r   r  r   r  r  r   rr   rc   c                 S   r  r   r!  r#  r   r   r   r&    r'  zHGaussianDiffusion_style.variational_lower_bound_loop.<locals>.<dictcomp>r   r(  r)  r*  r/  r   r   r   r3    r4  z4GaussianDiffusion_style.variational_lower_bound_loopc                 C   r5  r6  r7  r8  r   r   r   r     r9  z(GaussianDiffusion_style._scale_timesteps)ra   rk   rc   FrN   )r\   r_   r`   rR   r   r   r   r*   r:  r   r   r   r   r   r   r   r   r   rT  rV  rW  r\  r]  r  r  r3  r   r   r   r   r   r     s   

6	 
O1M$:#
;
 ,r   )r   NN)r$   r*   rS  r   r   r   r   
ops.lossesr   r   __all__r   r
   rJ   objectrK   r	   r   r   r   r   r   <module>   s$   

6    f