a
    Ad9                     @   sD   d Z ddlZddlmZmZmZ ddlmZmZ G dd de	Z
dS )zSAMPLING ONLY.    N   )NoiseScheduleVPmodel_wrapperUniPC)shareddevicesc                       s>   e Zd Z fddZdd Zdd Ze dddZ  Z	S )UniPCSamplerc                    s>   t     | _ fdd}d | _d | _| d| j d S )Nc                    s   |    tj jS N)clonedetachtotorchfloat32device)xmodel O/var/www/html/stable-diffusion-webui/modules/models/diffusion/uni_pc/sampler.py<lambda>       z'UniPCSampler.__init__.<locals>.<lambda>alphas_cumprod)super__init__r   before_sampleafter_sampleregister_bufferr   )selfr   kwargsto_torch	__class__r   r   r   
   s    
zUniPCSampler.__init__c                 C   s6   t |tjkr&|jtjkr&|tj}t| || d S r	   )typer   Tensorr   r   r   setattr)r   nameattrr   r   r   r      s    zUniPCSampler.register_bufferc                 C   s   || _ || _|| _d S r	   )r   r   after_update)r   r   r   r'   r   r   r   	set_hooks   s    zUniPCSampler.set_hooksNF              ?Td   c           #         s  |d urt |trb|t| d  }t |tr:|d }q&|jd }||krtd| d|  n`t |tr|D ]&}|jd |krptd| d|  qpn(|jd |krtd|jd  d|  |\}}}||||f} jjj}|d u rt	j
||d}n|}td jd} jjdkrdnd}t fd	d
||d|d} t| |ddtjj|| j j jd
}!|!j||tjjdtjjtjjd}"|"|d fS )Nr   zWarning: Got z! conditionings but batch-size is )r   discrete)r   vnoisec                    s    j | ||S r	   )r   apply_model)r   tcr   r   r   r   Y   r   z%UniPCSampler.sample.<locals>.<lambda>zclassifier-free)
model_typeZguidance_typeZguidance_scaleTF)
predict_x0thresholdingvariant	conditionZunconditional_conditionr   r   r'   	multistep)steps	skip_typemethodorderlower_order_final)
isinstancedictlistkeysshapeprintr   betasr   r   randnr   r   parameterizationr   r   r   optsuni_pc_variantr   r   r'   sampleuni_pc_skip_typeuni_pc_orderuni_pc_lower_order_finalr   )#r   S
batch_sizerB   conditioningcallbacknormals_sequenceimg_callbackquantize_x0etamaskx0temperaturenoise_dropoutscore_correctorcorrector_kwargsverbosex_Tlog_every_tunconditional_guidance_scaleunconditional_conditioningr   ctmpcbsCHWsizer   imgnsr3   Zmodel_fnuni_pcr   r   r2   r   rI      s@    








&"zUniPCSampler.sample)NNNNFr)   NNr*   r)   NNTNr+   r*   N)
__name__
__module____qualname__r   r   r(   r   no_gradrI   __classcell__r   r   r    r   r   	   s,                    r   )__doc__r   rh   r   r   r   modulesr   r   objectr   r   r   r   r   <module>   s   