a
    Adh                     @   s   d dl Z d dlmZmZmZ dddZdd Zdd Zdd	d
Zdd Z	dd Z
dd ZG dd dZee_ee_ee_ee_e	e_	dS )    N)devices
rng_philoxsharedc                 C   sr   t |  tjjdkr.tj|pt|tj	dS tjjdksFtj	j
dkr`tj|tj|dtj	S tj|tj	|dS )zGenerate a tensor with random numbers from a normal distribution using seed.

    Uses the seed parameter to set the global torch seed; to generate more with that seed, use randn_like/randn_without_seed.NVdeviceCPUmpsr   	generator)manual_seedr   optsrandn_sourcetorchasarraynv_rngrandnr   r   typecputo)seedshaper    r   3/var/www/html/stable-diffusion-webui/modules/rng.pyr      s    r   c                 C   s|   t jjdkr,t| }tj||tj	dS t jjdksDtj	j
dkrJtjntj	}t|t| }tj|||dtj	S )zGenerate a tensor with random numbers from a normal distribution using seed.

    Does not change the global random number generator. You can only generate the seed's first tensor using this function.r   r   r   r	   r
   )r   r   r   r   	Generatorr   r   r   r   r   r   r   r   intr   )r   r   rnglocal_deviceZlocal_generatorr   r   r   randn_local   s    
$r   c                 C   sb   t jjdkr(tjt| j| j| j	dS t jjdks@| jj
dkrXtj| tjd| jS t| S )Generate a tensor with random numbers from a normal distribution using the previously initialized genrator.

    Use either randn() or manual_seed() to initialize the generator.r   )r   dtyper   r	   r   )r   r   r   r   r   r   r   r   r   r    r   
randn_liker   r   r   )xr   r   r   r!   $   s
    r!   c                 C   sj   t jjdkr&tj|pt| tjdS t jjdks>tjj	dkrXtj| tj
|dtjS tj| tj|dS )r   r   r   r   r	   r
   )r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   randn_without_seed2   s
    r#   c                 C   s(   t jjdkrt| adS t|  dS )zASet up a global random number generator using the specified seed.r   N)r   r   r   r   r   r   r   r   )r   r   r   r   r   @   s    
r   c                 C   sR   t jjdkrt| S t jjdks.tjjdkr4tjntj}t	|
t| }|S )Nr   r   r	   )r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   create_generatorK   s
    
$r$   c           	      C   s   |t j|ddd }|t j|ddd }|| d}| dkrV||  |d|    S t |}t |}t d|  | | d| t | | | d|  }|S )N   T)dimkeepdimgCl?g      ?)r   normsummeanacossin	unsqueeze)	vallowhighZlow_normZ	high_normdotomegasoresr   r   r   slerpU   s    

<r5   c                   @   s&   e Zd Zd
ddZdd Zdd	 ZdS )ImageRNGN        r   c                 C   sH   t tt|| _|| _|| _|| _|| _|| _dd |D | _	d| _
d S )Nc                 S   s   g | ]}t |qS r   r$   .0r   r   r   r   
<listcomp>l       z%ImageRNG.__init__.<locals>.<listcomp>T)tuplemapr   r   seedssubseedssubseed_strengthseed_resize_from_hseed_resize_from_w
generatorsis_first)selfr   r?   r@   rA   rB   rC   r   r   r   __init__d   s    zImageRNG.__init__c                    s(  | j dks| jdkr| jn| jd | j d | jd f}g }tt| j| jD ]\}\}}d }| jd ur| jdkr|t	| jkrdn| j| }t
||}|| jkrt
||}nt
|| j|d}|d urt| j||}|| jkrt
|| j|d}	| jd |d  d }
| jd |d  d }|
dkr.|d n|d d|
  }|dkrP|d n|d d|  }|
dk rndn|
}|dk rdn|}t|
 d}
t| d}|d d ||| |
|
| f |	d d ||| ||| f< |	}|| qLtjjpd  r fdd| jD | _t|tjS )Nr      r      r%   c                    s   g | ]}t |  qS r   r8   r9   eta_noise_seed_deltar   r   r;      r<   z"ImageRNG.first.<locals>.<listcomp>)rB   rC   r   	enumeratezipr?   rD   r@   rA   lenr   r5   maxappendr   r   rL   r   stackr   r   )rF   Znoise_shapexsir   r   Zsubnoisesubseednoiser"   dxdywhtxtyr   rK   r   firstp   s:    6 

""@zImageRNG.firstc                 C   sN   | j rd| _ |  S g }| jD ]}t| j|d}|| qt|t	j
S )NFrI   )rE   r]   rD   r#   r   rQ   r   rR   r   r   r   )rF   rS   r   r"   r   r   r   next   s    
zImageRNG.next)Nr7   r   r   )__name__
__module____qualname__rG   r]   r^   r   r   r   r   r6   c   s   
)r6   )N)N)r   modulesr   r   r   r   r   r!   r#   r   r$   r5   r6   r   r   r   r   <module>   s   


C