
    bi                         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	Zdd
Ze G d de             Z G d dee
      Zy)    N)	dataclass)ListOptionalTupleUnion   )ConfigMixinregister_to_config)
BaseOutput   )SchedulerMixinc                 J   ||j                   n| j                   }t        j                  | |      j                  dd|      j	                  | j                         }t        j
                  t        j
                  |j                  d             j                  d             S )Ndevicer   r   	generator#B;)r   torch
zeros_likeuniform_tologclamp)tr   r   noises       a/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/diffusers/schedulers/scheduling_amused.pygumbel_noiser      s    !*!6YAHHFQv.771	7RUUVWV^V^_EII		%++e"455<<UCDDD    c                    t        j                  |j                  d            |t        ||      z  z   }t        j                  |d      j
                  }t        j                  |d| j                               }||k  }|S )Nr   r   dimr   )r   r   r   r   sortvaluesgatherlong)mask_lenprobstemperaturer   
confidencesorted_confidencecut_offmaskings           r   mask_by_random_topkr.      sj    5;;u-.|E]f?g1ggJ

:26==ll,aAG7"GNr   c                   R    e Zd ZU dZej
                  ed<   dZej
                  ed<   y)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__r2    r   r   r0   r0      s"    
 )-%,,-r   r0   c                   6   e Zd ZU dZej
                  ed<   e	 ddede	fd       Z
	 	 ddedeeeeef   ee   f   d	ee	ej                  f   f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ZddZy)AmusedSchedulerr   temperaturesmask_token_idmasking_schedulec                      d | _         d | _        y N)r<   	timesteps)selfr=   r>   s      r   __init__zAmusedScheduler.__init__1   s     !r   Nnum_inference_stepsr)   r   c                    t        j                  ||      j                  d      | _        t	        |t
        t        f      r%t        j                  |d   |d   ||      | _        y t        j                  |d||      | _        y )Nr   r   r   g{Gz?)	r   arangefliprA   
isinstancetuplelistlinspacer<   )rB   rD   r)   r   s       r   set_timestepszAmusedScheduler.set_timesteps:   sj     &9&INNqQkE4=1 %{1~{1~Obkq rD %{DBU^d eDr   model_outputtimestepsamplestarting_mask_ratior   return_dictreturnc                    |j                   dk(  xr |j                   dk(  }|rM|j                  \  }}	}
}|j                  ||
|z        }|j                  ||	|
|z        j                  ddd      }|| j                  j
                  k(  }|j                  d      }|j                  }||j                  |j                        n|}|j                  j                  dk(  r-|j                  t        j                  k7  r|j                         }|j                  d|j                  d            }t        j                  |d|	      j                  |
      } |d d df   j                   |j                  d d  }t        j"                  |||      }|dk(  r|}n|j                  d   }| j$                  |k(  j'                         }|dz   t)        | j$                        z  }| j                  j*                  dk(  r*t        j,                  |t.        j0                  z  dz        }nA| j                  j*                  dk(  rd|z
  }n"t3        d| j                  j*                         ||z  }||z  j5                         }t        j6                  |j9                  dd      dz
  |      }t        j:                  t        j<                  dg|j                  
      |      }t        j>                  |d|d d d d d f         d d d d df   }t        j"                  ||t        j@                  |j                        j:                        }tC        ||| jD                  |   |      }t        j"                  || j                  j
                  |      }|r&|j                  
      }|j                  ||
|      }|s||fS tG        ||      S )N      r   r   r   r    r!   cpur   r   cosinelinearunknown masking schedule T)r"   keepdim)$ndimshapereshapepermuteconfigr=   softmaxr   r   typedtyper   float32floatsizemultinomialviewwhererA   nonzerolenr>   cosmathpi
ValueErrorfloorminsummaxtensorr%   finfor.   r<   r0   )rB   rM   rN   rO   rP   r   rQ   two_dim_input
batch_sizecodebook_sizeheightwidthunknown_mapr(   r   probs_r2   r1   seq_lenstep_idxratio
mask_ratior'   selected_probsr-   s                            r   stepzAmusedScheduler.stepG   sS    q(C\->->!-C7C7I7I4Jvu^^J?F'//
M6TY>ZbbcdfgijkL 9 99$$$,/8/D)**+%==&6<<5==+H\\^FEJJrN3$00iPSS[aSb>3AqD9>>CR@PQ${{;8LfUq=.Kll1oG(2;;=H\S%88E{{++x7"YYutww':;
--9Y
 #<T[[=Y=Y<Z![\\,z9J*,335HyyR!F!JHUHyyqc,:M:M!NPXYH"\\%5I!QPT*5UVWXZ[]^W^_N"[[nekkR`RfRfFgFkFklN)(NDDUDUV^D_ajkG  ++gt{{/H/HJ^_K%--j&%HK#7#?#?
FTY#Z !566$[2FGGr   c                 |   | j                   |k(  j                         }|dz   t        | j                         z  }| j                  j                  dk(  r*t        j                  |t        j                  z  dz        }nA| j                  j                  dk(  rd|z
  }n"t        d| j                  j                         t        j                  |j                  ||j                  n|j                  |      j                  |j                        |k  }|j                         }| j                  j                  ||<   |S )Nr   rW   r   rX   rY   )r   r   )rA   ri   rj   r_   r>   r   rk   rl   rm   rn   randr\   r   r   cloner=   )	rB   rO   rA   r   r}   r~   r   mask_indicesmasked_samples	            r   	add_noisezAmusedScheduler.add_noise   s   NNi/88:AT^^!44;;''835477?Q#67J[[))X5UJ89U9U8VWXX JJ9NY%5%5TZTaTamvb 	 &*kk&?&?l#r   )rW   ))r   r   N)r   NTr@   )r3   r4   r5   orderr   r7   r8   r
   intstrrC   r   r   r   r   rL   r&   
LongTensorr   	Generatorboolr0   r   r   r9   r   r   r;   r;   ,   s   E,, !)   ?E+/	f f 3c3hc:;f c5<<'(	f$ $%/3 CHllCH **CH   	CH
 !CH EOO,CH CH 
$e+	,CHJr   r;   r@   )g      ?N)rl   dataclassesr   typingr   r   r   r   r   configuration_utilsr	   r
   utilsr   scheduling_utilsr   r   r.   r0   r;   r9   r   r   <module>r      sS     ! / /  A  ,E .J . ."vnk vr   