o
    ߥi                     @   s>   d dl Zd dlZddlmZ G dd deZG dd dZdS )    N   )GaussianDiffusionc                       s`   e Zd ZdZ fddZ fddZ fddZ fdd	Z fd
dZdd Z	dd Z
  ZS )SpacedDiffusiona#  
    A diffusion process which can skip steps in a base diffusion process.

    :param use_timesteps: a collection (sequence or set) of timesteps from the
                          original diffusion process to retain.
    :param kwargs: the kwargs to create the base diffusion process.
    c                    s   t || _g | _t|d | _tdi |}d}g }t|jD ]\}}|| jv r9|d||   |}| j| qt	
||d< t jdi | d S )Nbetasg      ?r    )setuse_timestepstimestep_maplenoriginal_num_stepsr   	enumeratealphas_cumprodappendnparraysuper__init__)selfr   kwargsbase_diffusionlast_alpha_cumprod	new_betasialpha_cumprod	__class__r   j/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/multi_modal/guided_diffusion/respace.pyr      s   

zSpacedDiffusion.__init__c                        t  j| |g|R i |S N)r   p_mean_variance_wrap_modelr   modelargsr   r   r   r   r   $      zSpacedDiffusion.p_mean_variancec                    r   r   )r   training_lossesr    r!   r   r   r   r%   (   r$   zSpacedDiffusion.training_lossesc                    r   r   )r   condition_meanr    r   cond_fnr#   r   r   r   r   r&   ,   r$   zSpacedDiffusion.condition_meanc                    r   r   )r   condition_scorer    r'   r   r   r   r)   0   r$   zSpacedDiffusion.condition_scorec                 C   s"   t |tr|S t|| j| j| jS r   )
isinstance_WrappedModelr	   rescale_timestepsr   )r   r"   r   r   r   r    4   s
   
zSpacedDiffusion._wrap_modelc                 C   s   |S r   r   )r   tr   r   r   _scale_timesteps:   s   z SpacedDiffusion._scale_timesteps)__name__
__module____qualname____doc__r   r   r%   r&   r)   r    r.   __classcell__r   r   r   r   r      s    r   c                   @   s   e Zd Zdd Zdd ZdS )r+   c                 C   s   || _ || _|| _|| _d S r   )r"   r	   r,   r   )r   r"   r	   r,   r   r   r   r   r   A   s   
z_WrappedModel.__init__c                 K   sJ   t j| j|j|jd}|| }| jr| d| j  }| j||fi |S )N)devicedtypeg     @@)	thtensorr	   r4   r5   r,   floatr   r"   )r   xtsr   
map_tensornew_tsr   r   r   __call__H   s   z_WrappedModel.__call__N)r/   r0   r1   r   r=   r   r   r   r   r+   ?   s    r+   )numpyr   torchr6   gaussian_diffusionr   r   r+   r   r   r   r   <module>   s
   4