a
    Ad*                     @   s   d dl Z d dlmZmZmZ d dlmZmZ d dlmZ d dl	m
Z
mZ d dl	mZmZ d dl	mZmZ dd Zd	d
 Zdd ZG dd de jjZdS )    N)prompt_parserdevicessd_samplers_common)optsstate)CFGDenoiserParamscfg_denoiser_callback)CFGDenoisedParamscfg_denoised_callback)AfterCFGCallbackParamscfg_after_cfg_callbackc                    s2   t  d tst S  fdd d  D S )Nr   c                    s&   i | ]  t  fd dD qS )c                    s   g | ]}|  qS  r   .0xkeyr   H/var/www/html/stable-diffusion-webui/modules/sd_samplers_cfg_denoiser.py
<listcomp>       z-catenate_conds.<locals>.<dictcomp>.<listcomp>)torchcat)r   condsr   r   
<dictcomp>   r   z"catenate_conds.<locals>.<dictcomp>)
isinstancedictr   r   keysr   r   r   r   catenate_conds   s    
r   c                    s.   t | ts|   S  fdd|  D S )Nc                    s   i | ]\}}||  qS r   r   )r   r   vecabr   r   r      r   z"subscript_cond.<locals>.<dictcomp>)r   r   items)condr!   r"   r   r    r   subscript_cond   s    
r%   c                 C   sF   t | ts.tj| || jd |dfgddS t| d ||| d< | S )Nr      )axis	crossattn)r   r   r   r   repeatshapepad_cond)tensorrepeatsemptyr   r   r   r+      s    
$r+   c                       sT   e Zd ZdZ fddZedd Zdd Zdd	 Zd
d Z	dd Z
dd Z  ZS )CFGDenoisera?  
    Classifier free guidance denoiser. A wrapper for stable diffusion model (specifically for unet)
    that can take a noisy picture and produce a noise-free picture using two guidances (prompts)
    instead of one. Originally, the second prompt is just an empty string, but we use non-empty
    negative prompt.
    c                    s\   t    d | _d | _d | _d | _d | _d | _d| _d | _	d| _
|| _d | _d | _d| _d S )Nr   F)super__init__
model_wrapmasknmaskinit_latentstepstotal_stepsstepimage_cfg_scalepadded_cond_uncondsamplerpmask_before_denoising)selfr;   	__class__r   r   r1   )   s    
zCFGDenoiser.__init__c                 C   s
   t  d S N)NotImplementedError)r>   r   r   r   inner_model=   s    zCFGDenoiser.inner_modelc                 C   sf   ||j d  d  }t|}t|D ]:\}}|D ],\}	}
||  ||	 ||  |
|  7  < q2q&|S )Nr   )r*   r   clone	enumerate)r>   x_out
conds_listuncond
cond_scaleZdenoised_unconddenoisedir   Z
cond_indexweightr   r   r   combine_denoisedA   s    
(zCFGDenoiser.combine_denoisedc                 C   s2   | d\}}}||||   | j||   }|S )N   )chunkr9   )r>   rF   rI   Zout_condZout_img_condZ
out_uncondrJ   r   r   r   combine_denoised_for_edit_modelK   s    z+CFGDenoiser.combine_denoised_for_edit_modelc                 C   s   |S rA   r   )r>   x_inrF   sigmar   r   r   get_pred_x0Q   s    zCFGDenoiser.get_pred_x0c                 C   s0   d | _ | j \}}|| jjd< || jjd< d S )Nr$   rH   )r2   r<   	get_condsr;   sampler_extra_args)r>   cucr   r   r   update_inner_modelT   s    zCFGDenoiser.update_inner_modelc              	      s  t jst jrtjt| r4| jjd }| jjd }tj	j
dkoR| jd uoR| jdk}t|| j\ }	t|| j}|rtdd  D sJ d| jr| jd ur| j| j | j  t }
 fdd	t|
D }tj	jjd
krt}dd }n"}t|trdd }ndd }|stfdd	t|D g tfdd	t|D g }tfdd	t|D |g }ntfdd	t|D g g tfdd	t|D g g }tfdd	t|D |g t| jg }t||t j t j!|	|}t"| |j#|j$}|j%}|j&}	|j'}d}| jd r|dkrd |k r|sd}d |
  |d |
  }d| _(tj)j*r|	j+d |j+d krtj	j,}|	j+d |j+d  |j+d  }|dk r t-|	| |}	d| _(n|dkrt-|||}d| _(|	j+d |j+d ks8|r|rNt.|	||g}n|rZ|	}nt.|	|g}tj)j/r| j0||||dnnttdj+d |
D ]P}|}||
 }| j0|| ||| |t1|||||| d||< qnttj)j/r|
d n|
}
td|	j+d |
D ]~}|}t2||
 |	j+d }|s\t1|	||}nt|	|| g|}| j0|| ||| ||||| d||< q,|s| j0|j+d  d  ||j+d  d  ||||j+d  d  d|j+d  d < dd	  D }|rBtfdd	|D }t|gt3t j t j!| j0}t4| t56d |r~| 7|n(|r| 8 |dn| 8 ||| js| jd ur| j| j | j  | 9tfdd	|D tfdd	|D | j_:t)j;d kr | jj:}nrt)j;d!kr\| 9|j+d  d  |j+d  d  }n6| 9tfd"d	|D tfd#d	|D }t<| t=t j t j!}t>| |j#|  jd7  _S )$Nr$   rH   editg      ?c                 s   s   | ]}t |d kV  qdS )r&   Nlen)r   r   r   r   r   	<genexpr>j   r   z&CFGDenoiser.forward.<locals>.<genexpr>zXAND is not supported for InstructPix2Pix checkpoint (unless using Image CFG scale = 1.0)c                    s   g | ]}t  | qS r   rZ   r   rK   )rG   r   r   r   p   r   z'CFGDenoiser.forward.<locals>.<listcomp>zcrossattn-admc                 S   s   | g|dS )Nc_crossattnc_admr   r^   r   r   r   <lambda>t   r   z%CFGDenoiser.forward.<locals>.<lambda>c                 S   s   i | d|giS )Nc_concatr   r_   rb   r   r   r   ra   x   r   c                 S   s   | g|gdS )Nrc   r   rc   r   r   r   ra   z   r   c                    s.   g | ]&\ }t  fd dt|D qS )c                    s   g | ]}  qS r   r   r   _rK   r   r   r   r   }   r   2CFGDenoiser.forward.<locals>.<listcomp>.<listcomp>r   stackranger   nr   rK   r   r   }   r   c                    s.   g | ]&\ }t  fd dt|D qS )c                    s   g | ]}  qS r   r   rd   rK   rR   r   r   r   ~   r   rg   rh   rk   rR   rn   r   r   ~   r   c                    s.   g | ]&\ }t  fd dt|D qS )c                    s   g | ]}  qS r   r   rd   rK   
image_condr   r   r      r   rg   rh   rk   rr   rn   r   r      r   c                    s.   g | ]&\ }t  fd dt|D qS )c                    s   g | ]}  qS r   r   rd   rf   r   r   r      r   rg   rh   rk   rm   rn   r   r      r   c                    s.   g | ]&\ }t  fd dt|D qS )c                    s   g | ]}  qS r   r   rd   ro   r   r   r      r   rg   rh   rk   rp   rn   r   r      r   c                    s.   g | ]&\ }t  fd dt|D qS )c                    s   g | ]}  qS r   r   rd   rq   r   r   r      r   rg   rh   rk   rs   rn   r   r      r   F   r   Tr&   )r$   c                 S   s   g | ]}|d  d  qS )r   r   r   r   r   r   r      r   c                    s   g | ]} ||d   qS r&   r   r]   rF   r   r   r      r   unetc                    s   g | ]} ||d   qS ru   r   r]   rQ   r   r   r      r   c                    s   g | ]} ||d   qS ru   r   r]   rv   r   r   r      r   PromptzNegative promptc                    s   g | ]} ||d   qS ru   r   r]   rx   r   r   r      r   c                    s   g | ]} ||d   qS ru   r   r]   )rJ   r   r   r      r   )?r   interruptedskippedr   InterruptedExceptionapply_refinerr;   rU   sharedsd_modelcond_stage_keyr9   r   reconstruct_multicond_batchr8   reconstruct_cond_batchallr=   r3   r5   r4   r[   rj   modelconditioning_keyr   
zeros_liker   r   r   rE   r   sampling_stepsampling_stepsr   r   rr   rR   	text_condtext_uncondr:   r   pad_cond_uncondr*   cond_stage_model_empty_promptr+   r   batch_cond_uncondrC   r%   minr	   r
   r   test_for_nansrP   rM   rS   last_latentlive_preview_contentstore_latentr   r   )r>   r   rR   rH   r$   rI   s_min_uncondrr   Zis_edit_modelr,   
batch_sizer-   Zimage_uncondZmake_condition_dictZsigma_inZimage_cond_inZdenoiser_paramsZskip_uncondr.   num_repeatsZcond_inZbatch_offsetr!   r"   r_   Zdenoised_image_indexesZfake_uncondZdenoised_paramspreviewZafter_cfg_callback_paramsr   )rG   rJ   rr   rR   r   rQ   rF   r   forward[   s    
 


""$((0* 



F
:V:
06
zCFGDenoiser.forward)__name__
__module____qualname____doc__r1   propertyrC   rM   rP   rS   rX   r   __classcell__r   r   r?   r   r/   !   s   

r/   )r   modulesr   r   r   modules.sharedr   r   r~   modules.script_callbacksr   r   r	   r
   r   r   r   r%   r+   nnModuler/   r   r   r   r   <module>   s   