o
    *j                     @   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   v/var/www/html/Deteccion_Ine/venv/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.
    Zlinear     @@-C6?g{Gz?dtypeZ	linear_sd      ?   Z	quadraticg~jtX?g+?Z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: )torchZlinspacefloat64rangeappendminr   
ValueError)
schedulenum_timestepsZ	init_betaZ	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   Z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)Z
state_dictZtemporal_attentionr6   Zsd_newr9   kZk_newr   r   r    load_stable_diffusion_pretrainedM   s,   r>   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)selfrD   rC   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 rB   )

isinstancer&   ZTensorr   Zis_floating_pointr   Zfloat32rC   
randn_likerD   )rE   Z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__formatrD   rC   )rE   r   r   r   __repr__y   s   
zAddGaussianNoise.__repr__N)r@   rA   )rL   
__module____qualname__rF   rJ   rN   r   r   r   r   r?   i   s    

r?   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}rQ   learnedrR   fixed_largefixed_small)rS   rescaled_mseklrescaled_kll1rescaled_l1charbonnierdimr4   r%   #B;)"rG   r&   DoubleTensorr   r'   r*   maxr/   lenr-   	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)rE   r/   rh   ri   rj   rk   rl   alphasr   r   r   rF      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&   rH   r   ru   rv   )rE   rV   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   ru   rn   rx   rE   rV   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}   rE   rV   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   r4   r   r   Nr   )	p_mean_variancer&   rH   nefloatr   r   _scale_timestepsexp)rE   r   r   modelmodel_kwargsr|   
percentilecondition_fnguide_scaler   r   r   rV   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&   aranger-   flipfulllongr   r   rE   r   r   r   r|   r   r   r   br   r0   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   fixedrb   rY   rR          @rZ   r[   rW   r%   rV   rQ   r4   )r   rG   r8   rg   ri   
startswithr   r&   ro   chunkr   r   r}   rw   r/   r{   rh   r~   r   r   ry   rz   quantileflattenabsclamp_r   r*   rf   r|   )rE   r   r   r   r   r|   r   r   rI   y_outu_outrc   r   r   fractionmin_log_varmax_log_varr   rV   r   sr   r   r   r     s|   &
	

"


z!GaussianDiffusion.p_mean_variance   r@   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   r4   r   )r-   r   r   rn   ry   rz   rt   r   r|   r&   rH   r   r   r   r   )rE   r   r   r   r   r|   r   r   r   ddim_timestepsetastrider   rV   alpharQ   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   r-   r|   r   r   r   r   r   )rE   r   r   r   r|   r   r   r   r   r   r   r   stepsr0   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   )r-   r   r   ry   rz   r&   ro   rn   rr   r|   rt   )rE   r   r   r   r   r|   r   r   r   r   r   rV   rQ   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   r-   r   r   r   r   )rE   rV   r   r   r|   r   r   r   r   r   r   r0   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   rn   ry   rz   rt   r   )r   r   r   rV   r   rQ   r|   r   r   r   r   r   rE   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   ry   rz   rn   r|   r&   rt   )rQ   r   rV   r   r   r   )rE   r   r   r   r   
compute_x0  s   z1GaussianDiffusion.plms_sample.<locals>.compute_x0r   r   r      r4   r                  (@7   ;   %   	         8@)r-   rg   	eps_cacher|   )rE   r   r   r   r   r|   r   r   r   plms_timestepsr   r   rQ   r   rV   eps_next	eps_primer   )	r|   r   r   r   r   r   rE   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   r-   r|   r   r   r   r   r   r)   rg   pop)rE   r   r   r   r|   r   r   r   r   r   r   r   r   r0   r   r   rQ   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   r]   r^   r^   rS   r\   r_   r`   r@   rY   rR   r   r   rb   c                         S rB   r   argskwargsfrozenr   r   r$   Z      z(GaussianDiffusion.loss.<locals>.<lambda>)r   	rescaled_r   r   rQ   rV   rW   r_   rQ   gMbP?r   )ra   c                     r   rB   r   r   r   r   r   r$     r   )r&   rH   r   rj   variational_lower_boundr-   r   ri   r   ro   detachr   r   rh   powendswithr   r   rD   r   r   ry   rz   rC   rt   rk   )rE   rV   r   r   r   r   weightZuse_div_lossr   lossr   rI   loss_vlbr   targetZx0_Z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   rb   r   r   rD   Z	log_scaler   )
r   r   r   r   rD   r    rw   r   r&   where)rE   rV   r   r   r   r   r|   r   mu1r   log_var1mu2log_var2r]   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  rS   x0_mser   r  r
  r   rb   rS   c                 S       i | ]\}}|t j|d dqS r   rb   r&   stack.0r=   vr   r   r   
<dictcomp>       zBGaussianDiffusion.variational_lower_bound_loop.<locals>.<dictcomp>r   prior_bits_per_dimtotal_bits_per_dimr   r&   r   r-   r   r   r   r   rH   r   r   r   ry   rz   r)   squarer   rD   itemsr   r   Z
zeros_liker    rw   sumrE   rV   r   r   r|   r   r   Zmetricsr0   r   r   r   r  Zpred_x0rQ   r   r   r   Zkl_priorr   r   r   variational_lower_bound_loop  8   


z.GaussianDiffusion.variational_lower_bound_loopc                 C      | j r| d | j S |S Nr   rl   r   r-   rE   r   r   r   r   r        z"GaussianDiffusion._scale_timesteps)rQ   rR   rS   rT   FrB   )rL   rO   rP   rF   r   r   r   r&   no_gradr   r   r   r   r   r   r   r   r   r   r   r  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   rQ   r[   rS   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   rU   rX   )rS   r\   r]   r^   r_   r`   rb   r4   r%   rd   )!rG   r&   re   r   r'   r*   rf   r/   rg   r-   rh   ri   rj   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   )rE   r/   rh   ri   rj   rl   r   r   r   r   rF     s`   




z GaussianDiffusion_style.__init__Nc                 C   sD   |du r	t |n|}t| j||| t| j|||  }||S r   )r&   rH   r   ru   rv   Ztype_as)rE   rV   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&   rH   r   r   r   r   r   r   type)rE   r   r   r   r   r|   r   r   r   r   r   r   r   rV   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   rb   rY   rR   r   rZ   r[   rW   rV   rQ   r4   )r   rG   r8   rg   ri   r   r   r&   ro   r   r   r   r}   rw   r/   r{   rh   r~   r   ry   rz   r   r   r   r   r   r*   rf   r|   r   )rE   r   r   r   r   r|   r   r   rI   r   r   rc   r   r   r   r   r   r   rV   r   r   r   r   r   r   h  s   &


"

z'GaussianDiffusion_style.p_mean_variancer   r@   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   r4   r   )r   r   r   rn   ry   rz   rt   r   r&   rH   r   r   r   r   r#  )rE   r   r   t_prevr   r   r|   r   r   r   r   r   r   r   rV   r   rQ   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   r-   r|   r   	enumerater   r   r   rg   r   )rE   r   r   r   r|   r   r   r   r   r   r   r   r   ir0   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   ry   rz   r&   ro   rn   rr   rt   r#  )rE   r   r   t_nextr   r   r|   r   r   r   r   r   rV   rQ   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   r-   r|   r&  r   r   r   r   )rE   rV   r   r   r|   r   r   r   r   r   r   r'  r0   r   r(  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   rn   ry   rz   rt   r   r#  )r   r   r   r   rV   r   rQ   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   ry   rz   rn   r&   rt   r#  )rQ   r   r   rV   r   r   r   )rE   r%  r   r   r   r   q  s   z7GaussianDiffusion_style.plms_sample.<locals>.compute_x0r   r   r   r   r4   r   r   r   r   r   r   r   r   r   r   r   r   )rg   r   )rE   r   r   r%  r   r   r|   r   r   r   r   r   r   rQ   r   rV   r   r   r   )	r|   r   r   r   r   r   rE   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   r-   r|   r   r&  r   r   r   rg   r   r)   r   )rE   r   r   r   r|   r   r   r   r   r   r   r   r   r'  r0   r   r%  r   rQ   r   r   r   r     s8   




z(GaussianDiffusion_style.plms_sample_loopr   ZlogSNRZ	multistepzdpmsolver++TZ	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.
        )rQ   rV   )Ngףp=
?NZdiscrete)r,   r/   )	r   noise_scheduleri   rh   r   rl   r-   r   r   )model_fnr)  algorithm_typer   r|   )	r   order	skip_typemethodsolver_typet_startt_endlower_order_finaldenoise_to_zero)
rh   r   r/   r   r   ri   rl   r-   r   sample)rE   r   r   r   r,  r-  r.  r|   r   r   r   Zdpm_solver_timestepsr+  r0  r1  r2  r3  r/  r)  r*  
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   r4   r   r   )r   r   r   r   r   r   r   r&   r   rH   r#  )rE   r   r   yr   r   r   r|   r   r   r   r   r   r   rV   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   r-   r   r   r   r   r8  )rE   r   r7  r   r   r   r|   r   r   r   r   r0   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   Nr4   r   r   r   )r   r&   Zenable_gradZrequires_grad_r   r  rD   Zautogradr   r   r   r   r   r   rH   r   r#  )rE   r   r   r7  r   r   r   r|   r   r   	mcg_scaler   r   r   r   rV   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   r-   r   r   r   r   r;  )rE   r   r7  r   r   r   r|   r   r   r:  r   r   r0   r   r   r   r   r   inpaint_mcg_p_sample_loopK  s   

z1GaussianDiffusion_style.inpaint_mcg_p_sample_looprD   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rD   noner   r   r^   r   r   r@   r   r   r   rb   c                     r   rB   r   r   r   r   r   r$     r   z.GaussianDiffusion_style.loss.<locals>.<lambda>)r   	reductionr   r   r   r   r_   rD   )r&   rH   r   rj   r   r-   r   ri   r   ro   r   r   r   rh   r   r   r   r   rD   )rE   rV   r   r   r   r   Zinput_x0r?  r   r   r   rI   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   rD   r   rb   r   r   r4   r   r   )r   r   r   r    rw   r   rD   r   r   r   r&   r   )rE   rV   r   r   r   r   r|   r   r?  r  r   r  r  r  r]   r  r  r   r   r   r     s$   	
z/GaussianDiffusion_style.variational_lower_boundc              
   C   r  )r  r   r	  r   r  r
  r   rb   rS   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   r    r  z4GaussianDiffusion_style.variational_lower_bound_loopc                 C   r  r  r  r   r   r   r   r     r!  z(GaussianDiffusion_style._scale_timesteps)rQ   r[   rS   FrB   )rL   rO   rP   rF   r   r   r   r&   r"  r   r   r   r   r   r   r   r   r   r6  r8  r9  r;  r<  r   r   r  r   r   r   r   r   r     s   

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