o
    pi                     @   s   d dl Z d dlmZ d dlmZmZmZmZ d dlZddl	m
Z
mZ ddlmZ ddlmZ dd	d
ZdddZeG dd deZG dd dee
ZdS )    N)	dataclass)ListOptionalTupleUnion   )ConfigMixinregister_to_config)
BaseOutput   )SchedulerMixinc                 C   sV   |d ur|j n| j }tj| |djdd|d| j }tt|d d S )Ndevicer   r   	generator#B;)r   torch
zeros_likeuniform_tologclamp)tr   r   noise r   d/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/diffusers/schedulers/scheduling_amused.pygumbel_noise   s   " r         ?c                 C   sN   t |d|t||d  }t j|ddj}t |d|  }||k }|S )Nr   r   dimr   )r   r   r   r   sortvaluesgatherlong)mask_lenprobstemperaturer   
confidencesorted_confidencecut_offmaskingr   r   r   mask_by_random_topk   s
    r,   c                   @   s*   e Zd ZU dZejed< dZejed< dS )AmusedSchedulerOutputaq  
    Output class for the scheduler's `step` function output.

    Args:
        prev_sample (`torch.Tensor` of shape `(batch_size, num_channels, height, width)` for images):
            Computed sample `(x_{t-1})` of previous timestep. `prev_sample` should be used as next model input in the
            denoising loop.
        pred_original_sample (`torch.Tensor` of shape `(batch_size, num_channels, height, width)` for images):
            The predicted denoised sample `(x_{0})` based on the model output from the current timestep.
            `pred_original_sample` can be used to preview progress or for guidance.
    prev_sampleNpred_original_sample)__name__
__module____qualname____doc__r   Tensor__annotations__r/   r   r   r   r   r-      s   
 
r-   c                   @   s   e Zd ZU dZejed< e	ddede	fddZ
			dd
edeeeeef ee f dee	ejf fddZ				ddejdejdejdedeej dedeeef fddZdddZd	S )AmusedSchedulerr   temperaturescosinemask_token_idmasking_schedulec                 C   s   d | _ d | _d S N)r7   	timesteps)selfr9   r:   r   r   r   __init__1   s   
zAmusedScheduler.__init__r   r   Nnum_inference_stepsr'   r   c                 C   s\   t j||dd| _t|ttfr"t j|d |d ||d| _d S t j|d||d| _d S )Nr   r   r   g{Gz?)	r   arangeflipr<   
isinstancetuplelistlinspacer7   )r=   r@   r'   r   r   r   r   set_timesteps:   s    zAmusedScheduler.set_timestepsTmodel_outputtimestepsamplestarting_mask_ratior   return_dictreturnc                 C   st  |j dko	|j dk}|r)|j\}}	}
}|||
| }|||	|
| ddd}|| jjk}|jdd}|j}|d urB||jn|}|jj	dkrT|j
tjkrT| }|d|d}tj|d|d	j|d
}|d d df j|jd d  }t|||}|dkr|}n|jd }| j|k }|d t| j }| jjdkrt|tj d }n| jjdkrd| }n	td| jj || }||  }t|jdddd |}ttjdg|jd
|}t|d|d d d d d f d d d d df }t||t |j
j}t!||| j"| |}t|| jj|}|r.|||
|}|||
|}|s5||fS t#||S )N      r   r   r   r   r   cpur   r   r8   linearunknown masking schedule T)r    keepdim)$ndimshapereshapepermuteconfigr9   softmaxr   r   typedtyper   float32floatsizemultinomialviewwherer<   nonzerolenr:   cosmathpi
ValueErrorfloorminsummaxtensorr#   finfor,   r7   r-   )r=   rH   rI   rJ   rK   r   rL   two_dim_input
batch_sizecodebook_sizeheightwidthunknown_mapr&   r   probs_r/   r.   seq_lenstep_idxratio
mask_ratior%   selected_probsr+   r   r   r   stepG   sN   	 

2
zAmusedScheduler.stepc           	      C   s   | j |k }|d t| j  }| jjdkr!t|tj d }n| jjdkr,d| }n	t	d| jj tj
|j|d ur@|jn|j|d|j|k }| }| jj||< |S )Nr   r8   r   rQ   rR   )r   r   )r<   rb   rc   rX   r:   r   rd   re   rf   rg   randrU   r   r   cloner9   )	r=   rJ   r<   r   rv   rw   rx   mask_indicesmasked_sampler   r   r   	add_noise   s"   
zAmusedScheduler.add_noise)r8   )r?   N)r   NTr;   )r0   r1   r2   orderr   r4   r5   r	   intstrr>   r   r   r   r   rG   r$   
LongTensorr   	Generatorboolr-   rz   r   r   r   r   r   r6   ,   sL   
 



Er6   r;   )r   N)re   dataclassesr   typingr   r   r   r   r   configuration_utilsr   r	   utilsr
   scheduling_utilsr   r   r,   r-   r6   r   r   r   r   <module>   s    

