o
    iI                    @   s  d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlZd dlm	Z	 ddl
mZ ddl
mZ dd	l
mZ d dlZd dlZd dlZd d
lmZ dd ZdddZdddZdddZdddZdddZdd  Zdd!d"Zdd#d$ZG d%d& d&ZG d'd( d(Zd)d* Z d+d, Z!dd.d/Z"d0ej#d1ej#fd2d3Z$d0ej#d1ej#fd4d5Z%e& ddddde'd6dfd7d8Z(e& dd9d:Z)e& dd;d<Z*e& ddddde'd6dfd=d>Z+e& ddddde'd6dfd?d@Z,e& ddAdBZ-e& ddCdDZ.dEdF Z/e& ddHdIZ0G dJdK dKZ1G dLdM dMej2Z3e& ddNdOZ4e& ddUdVZ5e& ddWdXZ6e& ddYdZZ7e& dd[d\Z8e& dd]d^Z9e& dd`daZ:e& ddcddZ;e& ddedfZ<e& ddgdhZ=e& ddidjZ>e& ddkdlZ?e& ddmdnZ@dodp ZAddqdrZBe& ddsdtZCe& ddudvZDe& ddddde'd6dfdwdxZEddydzZFdd{d|ZGe& dd~dZHe& dddZIe& dddZJe& dddZKe& dddZLe& dddZMe& dddZNe& dddZOe& dddZPe& dddZQe& dddZRe& dddZSe& dddZTe& dddZUe& dddZVe& dddZWe& dddZXe& dddZYe& dddZZdS )    N)partial)	integrate)nn)tqdm   )utils)deis)	sa_solver)model_trangec                 C   s   t | | dggS Nr   )torchcat	new_zerosx r   8/mnt/c/Users/fbmor/ComfyUI/comfy/k_diffusion/sampling.pyappend_zero   s   r         @cpuc           	      C   sL   t jdd| |d}|d|  }|d|  }||||   | }t||S )z6Constructs the noise schedule of Karras et al. (2022).r   r   device)r   linspacer   to)	n	sigma_min	sigma_maxrhor   rampmin_inv_rhomax_inv_rhosigmasr   r   r   get_sigmas_karras   s
   r"   c                 C   s*   t jt|t|| |d }t|S )z)Constructs an exponential noise schedule.r   )r   r   mathlogexpr   )r   r   r   r   r!   r   r   r   get_sigmas_exponential    s   "r&         ?c                 C   sF   t jdd| |d| }t |t|t|  t| }t|S )z5Constructs an polynomial in log sigma noise schedule.r   r   r   )r   r   r%   r#   r$   r   )r   r   r   r   r   r   r!   r   r   r   get_sigmas_polyexponential&   s   (r(   fffff3@皙?MbP?c                 C   s@   t jd|| |d}t t j||d  d ||  }t|S )z*Constructs a continuous VP noise schedule.r   r      )r   r   sqrtspecialexpm1r   )r   beta_dbeta_mineps_sr   tr!   r   r   r   get_sigmas_vp-   s   &r4                 ?c              
      sl   d}t jdd| |d} fdd}||t d|  t ddt d|   |   }	|t |	}
|
S )	zAConstructs the noise schedule proposed by Tiankai et al. (2024). h㈵>r   r   r   c                    s   t j|  dS )N)minmax)r   clampr   r   r   r   r   <lambda>8       z$get_sigmas_laplace.<locals>.<lambda>r6   r,   )r   r   signr$   absr%   )r   r   r   mubetar   epsilonr   r:   lmbr!   r   r;   r   get_sigmas_laplace4   s   6rD   c                 C   s   | | t || j S )z6Converts a denoiser output to a Karras ODE derivative.)r   append_dimsndim)r   sigmadenoisedr   r   r   to_d?      rI   c                 C   sV   |s|dfS t |||d | d |d   | d  d  }|d |d  d }||fS )zCalculates the noise level (sigma_down) to step down to and the amount
    of noise to add (sigma_up) when doing an ancestral sampling step.r5   r,   r6   )r8   )
sigma_fromsigma_toetasigma_up
sigma_downr   r   r   get_ancestral_stepD   s
   .rP   c                    sL   |d urj t dkr|d7 }tjj d  | nd   fddS )Nr   r   r   c                    s   t j jjj dS )N)dtypelayoutr   	generator)r   randnsizerQ   rR   r   )rG   
sigma_nextrS   r   r   r   r<   X   s    z'default_noise_sampler.<locals>.<lambda>)r   r   	Generatormanual_seed)r   seedr   rW   r   default_noise_samplerN   s   r[   c                   @   s.   e Zd ZdZd	ddZedd Zdd ZdS )
BatchedBrownianTreezGA wrapper around torchsde.BrownianTree that enables batches of entropy.Nc                    s     dd| _| \| _  dd d u r t|d| _|d u r2tddd f}nt	|t
tfrNt||jd krFtdd| _d n|f}| jrh      t
 fd	d
|D | _d S )Nr   Tw0Fr   l    r   zbPassing a list or tuple of seeds to BatchedBrownianTree requires a length matching the batch size.c                 3   s*    | ]}t jfd |i V  qdS )entropyN)torchsdeBrownianTree).0skwargst0t1r]   r   r   	<genexpr>p   s   ( z/BatchedBrownianTree.__init__.<locals>.<genexpr>)popcpu_treesortr>   r   
zeros_likebatchedrandintitem
isinstancetuplelistlenshape
ValueErrordetachr   trees)selfr   re   rf   rZ   rd   r   rc   r   __init__^   s"   

("zBatchedBrownianTree.__init__c                 C   s   | |k r	| |dfS || dfS Nr   r   )abr   r   r   rj   r      zBatchedBrownianTree.sortc                    s   |   \ } j j}}| jr$        t fdd| j	D j
||d| j|  }| jrA|S |d S )Nc                    s   g | ]}| qS r   r   )ra   treere   rf   r   r   
<listcomp>{   s    z0BatchedBrownianTree.__call__.<locals>.<listcomp>)r   rQ   r   )rj   r   rQ   ri   ru   r   floatr   stackrv   r   r>   rl   )rw   re   rf   r>   r   rQ   wr   r   r   __call__v   s   "0zBatchedBrownianTree.__call__N)__name__
__module____qualname____doc__rx   staticmethodrj   r   r   r   r   r   r\   [   s    

r\   c                   @   s,   e Zd ZdZddd dfddZdd	 ZdS )
BrownianTreeNoiseSampleras  A noise sampler backed by a torchsde.BrownianTree.

    Args:
        x (Tensor): The tensor whose shape, device and dtype to use to generate
            random samples.
        sigma_min (float): The low end of the valid interval.
        sigma_max (float): The high end of the valid interval.
        seed (int or List[int]): The random seed. If a list of seeds is
            supplied instead of a single integer, then the noise sampler will
            use one BrownianTree per batch item, each with its own seed.
        transform (callable): A function that maps sigma to the sampler's
            internal timestep.
    Nc                 C   s   | S r   r   r   r   r   r   r<      s    z!BrownianTreeNoiseSampler.<lambda>Fc           	      C   s@   || _ |  t||  t|}}t|||||d| _d S )Nr   )	transformr   	as_tensorr\   r~   )	rw   r   r   r   rZ   r   r   re   rf   r   r   r   rx      s   "z!BrownianTreeNoiseSampler.__init__c                 C   s>   |  t||  t|}}| ||||    S r   )r   r   r   r~   r?   r-   )rw   rG   rV   re   rf   r   r   r   r      s   "z!BrownianTreeNoiseSampler.__call__)r   r   r   r   rx   r   r   r   r   r   r      s    r   c                 C   s&   t |tjjr|   S |   S )z4Convert sigma to half-logSNR log(alpha_t / sigma_t).)ro   comfymodel_samplingCONSTlogitnegr$   )rG   r   r   r   r   sigma_to_half_log_snr      r   c                 C   s&   t |tjjr|   S |   S )z4Convert half-logSNR log(alpha_t / sigma_t) to sigma.)ro   r   r   r   r   sigmoidr%   )half_log_snrr   r   r   r   half_log_snr_to_sigma   r   r   -C6?c                 C   sD   t | dkr| S t|tjjr | d dkr |  } ||| d< | S )z/Adjust the first sigma to avoid invalid logSNR.r   r   )rr   ro   r   r   r   clonepercent_to_sigma)r!   r   percent_offsetr   r   r   offset_first_sigma_for_snr   s   r   hreturnc                 C   s
   t | S )zCCompute the result of h*phi_1(h) in exponential integrator methods.r   r/   r   r   r   r   
ei_h_phi_1   s   
r   c                 C   s   t | |  |  S )zCCompute the result of h*phi_2(h) in exponential integrator methods.r   r   r   r   r   
ei_h_phi_2   s   r   infc
                 C   s0  |du ri n|}| |jd g}
tt|d |dD ]z}|dkrE|||   kr-|kr:n nt|t|d  dnd}|| |d  }nd}|| }|dkrft||	 }|||d || d  d   }| |||
 fi |}t|||}|dur||||| ||d	 ||d  | }|||  }q|S )
z?Implements Algorithm 2 (Euler steps) from Karras et al. (2022).Nr   r   disable4y?r5   r,   r6   r   irG   	sigma_hatrH   new_onesrs   trangerr   r8   r   
randn_likerI   )modelr   r!   
extra_argscallbackr   s_churns_tmins_tmaxs_noises_inr   gammar   epsrH   ddtr   r   r   sample_euler   s$   6 r   c	              
   C   sB  t | jjjtjjrt| ||||||||	S 	 |d u ri n|}|dd }	|d u r/t||	dn|}||j	d g}
t
t|d |dD ]Z}| ||| |
 fi |}t|| ||d  |d\}}|d urt||||| || |d |dkr{|}qDt||| |}|||  }|||  ||| ||d  | |  }qD|S )NrZ   rZ   r   r   r   rM   r   )ro   inner_modelr   r   r   sample_euler_ancestral_RFgetr[   r   rs   r   rr   rP   rI   )r   r   r!   r   r   r   rM   r   noise_samplerrZ   r   r   rH   rO   rN   r   r   r   r   r   sample_euler_ancestral   s$   ,r   c	                 C   s~  |du ri n|}| dd}	|du rt||	dn|}||jd g}
tt|d |dD ]}| ||| |
 fi |}|durN||||| || |d ||d  dkrY|}q-d||d  ||  d |  }||d  | }d||d   }d| }||d  d |d |d  |d   d	 }|||  }|| d| |  }|dkr|| | ||| ||d  | |  }q-|S )
z+Ancestral sampling with Euler method steps.NrZ   r   r   r   r   r   r,   r6   )r   r[   r   rs   r   rr   )r   r   r!   r   r   r   rM   r   r   rZ   r   r   rH   downstep_ratiorO   	alpha_ip1
alpha_downrenoise_coeffsigma_down_i_ratior   r   r   r      s*    ,*r   c
                 C   s  |du ri n|}| |jd g}
tt|d |dD ]}|dkrE|||   kr-|kr:n nt|t|d  dnd}|| |d  }nd}|| }|| |d  }|dkrnt||	 }|||d || d  d   }| |||
 fi |}t|||}|dur||||| ||d	 ||d  | }||d  dkr|||  }q|||  }| |||d  |
 fi |}t|||d  |}|| d }|||  }q|S )
z>Implements Algorithm 2 (Heun steps) from Karras et al. (2022).Nr   r   r   r   r5   r,   r6   r   r   )r   r   r!   r   r   r   r   r   r   r   r   r   r   r   r   rH   r   r   x_2
denoised_2d_2d_primer   r   r   sample_heun  s2   6 r   c
                 C   s  |du ri n|}| |jd g}
tt|d |dD ]}|dkrE|||   kr-|kr:n nt|t|d  dnd}|| |d  }nd}|| }|dkrft||	 }|||d || d  d   }| |||
 fi |}t|||}|dur||||| ||d	 ||d  dkr||d  | }|||  }q| 	||d   d
 }|| }||d  | }|||  }| |||
 fi |}t|||}|||  }q|S )
zMA sampler inspired by DPM-Solver-2 and Algorithm 2 from Karras et al. (2022).Nr   r   r   r   r5   r,   r6   r   )r   rs   r   rr   r8   r   r   rI   r$   lerpr%   )r   r   r!   r   r   r   r   r   r   r   r   r   r   r   r   rH   r   r   	sigma_middt_1dt_2r   r   r   r   r   r   sample_dpm_2.  s4   6  r   c	              
   C   s  t | jjjtjjrt| ||||||||	S 	 |d u ri n|}|dd }	|d u r/t||	dn|}||j	d g}
t
t|d |dD ]}| ||| |
 fi |}t|| ||d  |d\}}|d urt||||| || |d t||| |}|dkr|||  }|||  }qD||  | d }|||  }|||  }|||  }| |||
 fi |}t|||}|||  }|||| ||d  | |  }qD|S )	NrZ   r   r   r   r   r   r   r6   )ro   r   r   r   r   sample_dpm_2_ancestral_RFr   r[   r   rs   r   rr   rP   rI   r$   r   r%   )r   r   r!   r   r   r   rM   r   r   rZ   r   r   rH   rO   rN   r   r   r   r   r   r   r   r   r   r   r   sample_dpm_2_ancestralR  s2   $r   c	                 C   s  |du ri n|}| dd}	|du rt||	dn|}||jd g}
tt|d |dD ]}| ||| |
 fi |}d||d  ||  d |  }||d  | }d||d   }d| }||d  d |d |d  |d   d }|dur||||| || |d	 t||| |}|dkr|||  }|||  }q-||  | d	 }|||  }|||  }|||  }| |||
 fi |}t|||}|||  }|| | ||| ||d  | |  }q-|S )
z6Ancestral sampling with DPM-Solver second-order steps.NrZ   r   r   r   r   r,   r6   r   )
r   r[   r   rs   r   rr   rI   r$   r   r%   )r   r   r!   r   r   r   rM   r   r   rZ   r   r   rH   r   rO   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  s4    ,,r   c                    sT   d  krt d d   fdd}tj|   d  ddd S )	Nr   zOrder z too high for step c                    sL   d}t D ]}|krq||  |       |    9 }q|S Nr'   )range)tauprodkr   jorderr3   r   r   fn  s   .z"linear_multistep_coeff.<locals>.fnr   )epsrelr   )rt   r   quad)r   r3   r   r   r   r   r   r   linear_multistep_coeff  s   "r      c                    s   |d u ri n|}| |jd g}|   g }tt|d |dD ]h| || | fi |}	t|| |	}
||
 t||krL|	d |d ur^||| | |	d |d  dkri|	}q%t
d |  fddt D }|tdd t|t|D  }q%|S )	Nr   r   r   r   c                    s   g | ]	}t  |qS r   )r   )ra   r   	cur_orderr   
sigmas_cpur   r   r     s    zsample_lms.<locals>.<listcomp>c                 s   s    | ]	\}}|| V  qd S r   r   )ra   coeffr   r   r   r   rg     s    zsample_lms.<locals>.<genexpr>)r   rs   ru   r   numpyr   rr   rI   appendrh   r8   r   sumzipreversed)r   r   r!   r   r   r   r   r   dsrH   r   coeffsr   r   r   
sample_lms  s$   

"r   c                   @   s*   e Zd ZdZdddZdd Zd	d
 ZdS )PIDStepSizeControllerz4A PID controller for ODE adaptive step size control.r   Q?:0yE>c                 C   sL   || _ || | | | _|d|   | | _|| | _|| _|| _g | _d S )Nr,   )r   b1b2b3accept_safetyr   errs)rw   r   pcoefficoeffdcoeffr   r   r   r   r   r   rx     s   

zPIDStepSizeController.__init__c                 C   s   dt |d  S r   )r#   atan)rw   r   r   r   r   limiter  s   zPIDStepSizeController.limiterc                 C   s   dt || j  }| js|||g| _|| jd< | jd | j | jd | j  | jd | j  }| |}|| jk}|rK| jd | jd< | jd | jd< |  j|9  _|S )Nr   r   r,   )	r   r   r   r   r   r   r   r   r   )rw   error	inv_errorfactoracceptr   r   r   propose_step  s   
0

z"PIDStepSizeController.propose_stepN)r   r   r   )r   r   r   r   rx   r   r   r   r   r   r   r     s
    
	r   c                       sl   e Zd ZdZd fdd	Zdd Zdd Zd	d
 ZdddZd ddZ	d!ddZ
d"ddZd#ddZ  ZS )$	DPMSolverz1DPM-Solver. See https://arxiv.org/abs/2206.00927.Nc                    s2   t    || _|d u ri n|| _|| _|| _d S r   )superrx   r   r   eps_callbackinfo_callback)rw   r   r   r  r  	__class__r   r   rx     s
   

zDPMSolver.__init__c                 C   s
   |   S r   r$   )rw   rG   r   r   r   r3     s   
zDPMSolver.tc                 C   s   |   S r   r   r%   )rw   r3   r   r   r   rG     s   zDPMSolver.sigmac           	      O   s   ||v r
|| |fS |  |||jd g }|| j||g|R i | j| |  | }| jd ur8|   |||i|fS )Nr   )rG   r   rs   r   r   r  )	rw   	eps_cachekeyr   r3   argsrd   rG   r   r   r   r   r     s   .
zDPMSolver.epsc                 C   sN   |d u ri n|}|| }|  |d||\}}|| ||  |  }||fS )Nr   r   rG   r/   )rw   r   r3   t_nextr  r   r   x_1r   r   r   dpm_solver_1_step  s
   zDPMSolver.dpm_solver_1_stepr6   c                 C   s   |d u ri n|}|| }|  |d||\}}|||  }|| |||   |  }	|  |d|	|\}
}|| ||  |  | |d|  |  |
|   }||fS )Nr   eps_r1r,   r
  )rw   r   r3   r  r1r  r   r   s1u1r  r   r   r   r   dpm_solver_2_step  s   <zDPMSolver.dpm_solver_2_stepUUUUUU?UUUUUU?c                 C   s"  |d u ri n|}|| }|  |d||\}}|||  }	|||  }
|| |	||   |  }|  |d||	\}}|| |
||   |  | |
||  ||  ||  d  ||   }|  |d||
\}}|| ||  |  | || | | d  ||   }||fS )Nr   r  r   eps_r2r
  )rw   r   r3   r  r  r2r  r   r   r  s2r  r  u2r  x_3r   r   r   dpm_solver_3_step   s   P@zDPMSolver.dpm_solver_3_stepr5   r'   c              	   C   s  |d u rt || jdd dn|}||ks|rtdt|d d }tj|||d |jd}	|d dkrBdg|d  ddg }
ndg|d  |d g }
t	t
|
D ]}i }|	| |	|d  }}|rt| || ||\}}t|| |}| |d | |d  d	 }n|d
}}| |d||\}}|| ||  }| jd ur| |||	| ||d |
| dkr| j||||d\}}n|
| dkr| j||||d\}}n| j||||d\}}||| || || |  }qT|S )NrZ   r   "eta must be 0 for reverse sampling   r   r   r   r,   r6   r5   r   )r   r   r3   t_uprH   r  )r[   r   r   rt   r#   floorr   r   r   r   rr   rP   rG   minimumr3   r   r  r  r  r  )rw   r   t_startt_endnferM   r   r   mtsordersr   r  r3   r  sdsut_next_r   rH   r   r   r   dpm_solver_fast  s6   ""

$zDPMSolver.dpm_solver_fastr  皙?q?r   c               
   C   s  |d u rt || jdd dn|}|dvrtd||k}|s%|r%tdt||r,dnd }t|}t|}|}|}d}t|||	|
|rHd	n||}d
d
d
d
d}|r]||d k ryn||d kryi }|rqt|||j	 nt
|||j	 }|rt| || ||\}}t|| |}| |d | |d  d }n|d}}| |d||\}}|| ||  }|dkr| j||||d\}}| j||||d\}}n| j|||d|d\}}| j||||d\}}t
||t
| |  }tj|| | | d  }||}|r4|}||| || || |  }|}|d  d7  < n|d  d7  < |d  |7  < |d  d7  < | jd urf| ||d d |||||j	d| |rs||d k sd||fS ||d ksd||fS )NrZ   r   >   r,   r  zorder should be 2 or 3r  r   rz   Tg      ?r   )stepsr#  n_acceptn_rejectr7   r,   r6   r5   r   r  r  )r  r  r.  r/  r#  r-  )r   r   r3   r  rH   r   r   )r[   r   r   rt   r?   r   tensorr   r   r   maximumrP   rG   r3   r   r  r  r  linalgnormnumelr   r  ) rw   r   r!  r"  r   rtolatolh_initr   r   r   r   rM   r   r   forwardrb   x_prevr   pidinfor  r3   r'  r(  t_r   rH   x_lowx_highdeltar   r   r   r   dpm_solver_adaptive4  s\   "

"("
  
"(##zDPMSolver.dpm_solver_adaptiveNNNr   )r6   N)r  r  N)r5   r'   N)r  r+  r,  r+  r5   r'   r5   r   r5   r'   N)r   r   r   r   rx   r3   rG   r   r  r  r  r*  r@  __classcell__r   r   r  r   r     s    
	



'r   c              
      s   |dks|dkrt dt||d3}t| ||jd dur' fdd_|t|t||||	|
W  d   S 1 sHw   Y  dS )zHDPM-Solver-Fast (fixed step size). See https://arxiv.org/abs/2206.00927.r   %sigma_min and sigma_max must not be 0)totalr   r  Nc                    &     | d  | d d| S Nr3   r  )rG   r   rG   r;  r   
dpm_solverr   r   r<   r     & z!sample_dpm_fast.<locals>.<lambda>)	rt   r   r   updater  r*  r3   r   r0  )r   r   r   r   r   r   r   r   rM   r   r   pbarr   rJ  r   sample_dpm_fastj  s   ,$rO  r  r+  r,  r   Fc                    s   |dks|dkrt dt|d<}t| ||jd dur& fdd_|t|t||||	|
|||||||\}}W d   n1 sPw   Y  |r[||fS |S )zPDPM-Solver-12 and 23 (adaptive step size). See https://arxiv.org/abs/2206.00927.r   rC  r   rE  Nc                    rF  rG  rH  rI  rJ  r   r   r<   ~  rL  z%sample_dpm_adaptive.<locals>.<lambda>)	rt   r   r   rM  r  r@  r3   r   r0  )r   r   r   r   r   r   r   r   r5  r6  r7  r   r   r   r   rM   r   r   return_inforN  r;  r   rJ  r   sample_dpm_adaptivev  s   BrQ  c	              
   C   s  t | jjjtjjrt| ||||||||	S 	 |d u ri n|}|dd }	|d u r/t||	dn|}||j	d g}
dd }dd }t
t|d |dD ]}| ||| |
 fi |}t|| ||d  |d	\}}|d ur|||||| || |d
 |dkrt||| |}|||  }|||  }nH||| ||}}d}|| }|||  }|||| | | |  |  }| ||||
 fi |}|||| | |  |  }||d  dkr|||| ||d  | |  }qL|S )NrZ   r   r   c                 S      |    S r   r  r3   r   r   r   r<         z+sample_dpmpp_2s_ancestral.<locals>.<lambda>c                 S   rR  r   r$   r   rH  r   r   r   r<     rT  r   r   r   r   r6   )ro   r   r   r   r   sample_dpmpp_2s_ancestral_RFr   r[   r   rs   r   rr   rP   rI   r/   )r   r   r!   r   r   r   rM   r   r   rZ   r   sigma_fnt_fnr   rH   rO   rN   r   r   r3   r  rr   rb   r   r   r   r   r   sample_dpmpp_2s_ancestral  s:   &""rZ  c	                  C   sD  |du ri n|}| dd}	|du rt||	dn|}||jd g}
dd }dd }tt|d |d	D ]}| ||| |
 fi |}d||d  ||  d |  }||d  | }d||d   }d| }||d  d
 |d
 |d
  |d
   d }|dur||||| || |d ||d  dkrt||| |}|||  }|||  }nO|| dkrd}n||| ||}}d}|| }|||  }||}|||  }|| d| |  }| |||
 fi |}|||  }|| d| |  }||d  dkr|dkr|| | ||| ||d  | |  }q5|S )<Ancestral sampling with DPM-Solver++(2S) second-order steps.NrZ   r   r   c                 S   s   |   d d S ry   r%   )lbdar   r   r   r<     r=   z.sample_dpmpp_2s_ancestral_RF.<locals>.<lambda>c                 S   s   d|  |    S r   r  rH  r   r   r   r<     r=   r   r   r,   r6   r   r'   gH.?)r   r[   r   rs   r   rr   rI   ) r   r   r!   r   r   r   rM   r   r   rZ   r   rW  	lambda_fnr   rH   r   rO   r   r   r   r   r   sigma_st_it_downrY  r   rb   sigma_s_i_ratiouD_ir   r   r   r   rV    sF    ,*rV  c
           $      C   s  t |dkr|S |du ri n|}||dk  | }
}|dd}|du r0t||
||ddn|}||jd g}| jj	d}t
t|d}t
t|d}t||}tt |d |d	D ]}| ||| | fi |}|dur||||| || |d
 ||d  dkr|}q]||| |||d  }}|| }||	|  }dd|	  }||}|| |  }||  }||d  |  }t|  |  |\}}|  }|| }|| |   | ||   |  } |dkr|dkr| |||| | | |  } | | || fi |}!t|  |  |\}}|  }"|"| }d| | ||!  }#|| |   | ||   |#  }|dkrl|dkrl||||| ||d   | |  }q]|S )zDPM-Solver++ (stochastic).r   Nr   rZ   TrZ   r   r   r   r   r   r,   )rr   r8   r9   r   r   r   rs   r   model_patcherget_model_objectr   r   r   r   r   r%   rP   r   r$   r/   )$r   r   r!   r   r   r   rM   r   r   rY  r   r   rZ   r   r   rW  r^  r   rH   lambda_slambda_tr   
lambda_s_1fac	sigma_s_1alpha_s	alpha_s_1alpha_tr'  r(  lambda_s_1_h_r   r   	lambda_t_
denoised_dr   r   r   sample_dpmpp_sde  sR   
 ( (&ru  c                 C   sZ  |du ri n|}| |jd g}dd }dd }d}	tt|d |dD ]}
| |||
 | fi |}|durF|||
||
 ||
 |d |||
 |||
d  }}|| }|	du se||
d  dkrw|||| | |  |  }n1||||
d   }|| }ddd	|   | dd	|  |	  }|||| | |  |  }|}	q%|S )
DPM-Solver++(2M).Nr   c                 S   rR  r   r  rS  r   r   r   r<     rT  z!sample_dpmpp_2m.<locals>.<lambda>c                 S   rR  r   rU  rH  r   r   r   r<     rT  r   r   r   r,   )r   rs   r   rr   r/   )r   r   r!   r   r   r   r   rW  rX  old_denoisedr   rH   r3   r  r   h_lastrY  rt  r   r   r   sample_dpmpp_2m  s&   $$"ry  midpointc
                 C   s  t |dkr|S |	dvrtd|du ri n|}|dd}
||dk  | }}|du r8t||||
ddn|}||jd g}| jj	
d	}tt|d
}t||}d}d\}}tt |d |dD ]}| ||| | fi |}|dur||||| || |d ||d  dkr|}n||| |||d  }}|| }||d  }||d  |  }||d  ||  | |   | ||    |  }|dur|| }|	dkr|||   |  d  d|  ||   }n|	dkr|d| |    d|  ||   }|dkr=|dkr=|||| ||d  ||d   d| |     |  }|}|}qe|S )zDPM-Solver++(2M) SDE.r   >   heunrz  z(solver_type must be 'heun' or 'midpoint'NrZ   r   Tre  r   rf  NNr   r   r{  rz  r6   )rr   rt   r   r8   r9   r   r   rs   r   rg  rh  r   r   r   r   r%   r/   r   r-   )r   r   r!   r   r   r   rM   r   r   solver_typerZ   r   r   r   r   r^  rw  r   rx  r   rH   ri  rj  h_etarp  rY  r   r   r   sample_dpmpp_2m_sde1  sH   
<
2
*Br  r{  c
           
      C   s   t | |||||||||	d
S )Nr   r   r   rM   r   r   r~  )r  
r   r   r!   r   r   r   rM   r   r   r~  r   r   r   sample_dpmpp_2m_sde_heung  r}   r  c	           $      C   s  t |dkr|S |du ri n|}|dd}	||dk  | }
}|du r0t||
||	ddn|}||jd g}| jj	d}t
t|d}t||}d	\}}d
\}}}tt |d |dD ]}| ||| | fi |}|dur||||| || |d ||d  dkr|}n||| |||d  }}|| }||d  }||d  |  }||d  ||  | |   | ||    |  }|dur|| }|| }|| | }|| | }||| | ||   }|| ||  }|  | d } | | d }!|||  |  ||! |  }n!|dur;|| }"|| |" }#|  | d } |||  |#  }|dkrf|dkrf|||| ||d  ||d   d| |     |  }||}}||}}q`|S )zDPM-Solver++(3M) SDE.r   NrZ   r   Tre  r   rf  r|  rA  r   r   r6   r}  )rr   r   r8   r9   r   r   rs   r   rg  rh  r   r   r   r   r%   r/   r   r-   )$r   r   r!   r   r   r   rM   r   r   rZ   r   r   r   r   r^  
denoised_1r   r   h_1h_2r   rH   ri  rj  r  rp  r0r  d1_0d1_1d1d2phi_2phi_3rY  r   r   r   r   sample_dpmpp_3m_sdel  sV   

<

B
r  c	                 C   sz   t |dkr|S |d u ri n|}||dk  | }	}
|d u r.t||	|
|dd ddn|}t| ||||||||d	S )Nr   r   rZ   Fre  r   r   r   rM   r   r   )rr   r8   r9   r   r   r  )r   r   r!   r   r   r   rM   r   r   r   r   r   r   r   sample_dpmpp_3m_sde_gpu  s   &r  c
                 C   |   t |dkr|S |d u ri n|}||dk  | }
}|d u r.t||
||dd ddn|}t| |||||||||	d
S Nr   r   rZ   Fre  r  )rr   r8   r9   r   r   r  r   r   r!   r   r   r   rM   r   r   r~  r   r   r   r   r   sample_dpmpp_2m_sde_heun_gpu     &r  c
                 C   r  r  )rr   r8   r9   r   r   r  r  r   r   r   sample_dpmpp_2m_sde_gpu  r  r  c
                 C   r  )Nr   r   rZ   Fre  )r   r   r   rM   r   r   rY  )rr   r8   r9   r   r   ru  )r   r   r!   r   r   r   rM   r   r   rY  r   r   r   r   r   sample_dpmpp_sde_gpu  r  r  c           	      C   s   d|| d  }d|| d  }|| }d|   | d| | d|      }|dkrA|d| d|  d|    ||| 7 }|S )Nr   r'   r   )r-   )	r   rG   
sigma_prevnoiser   alpha_cumprodalpha_cumprod_prevalphar@   r   r   r   DDPMSampler_step  s   (*r  c                 C   s  |d u ri n|}| dd }|d u rt||dn|}||jd g}	tt|d |dD ]W}
| |||
 |	 fi |}|d urN|||
||
 ||
 |d ||td||
 d   ||
 ||
d  || ||
  |}||
d  dkr|td||
d  d  9 }q-|S )	NrZ   r   r   r   r   r   r'          @)r   r[   r   rs   r   rr   r   r-   )r   r   r!   r   r   r   r   step_functionrZ   r   r   rH   r   r   r   generic_step_sampler  s   >r  c              	   C   s   t | ||||||tS r   )r  r  )r   r   r!   r   r   r   r   r   r   r   sample_ddpm  rJ   r  c              	   C   s   |d u ri n|}| dd }|d u rt||dn|}||jd g}tt|d |dD ]B}	| |||	 | fi |}
|d urN|||	||	 ||	 |
d |
}||	d  dkro| jjj||	d  |||	 ||	d  |}q-|S )NrZ   r   r   r   r   r   )	r   r[   r   rs   r   rr   r   r   noise_scaling)r   r   r!   r   r   r   r   rZ   r   r   rH   r   r   r   
sample_lcm  s   .r  c
                 C   s  |d u ri n|}| |jd g}
|d }tt|d |dD ]8}|||   kr.|kr;n nt|t|d  dnd}t||	 }|| |d  }|dkr`|||d || d  d   }| |||
 fi |}t|||}|d ur||||| ||d	 ||d  | }||d  |kr|||  }q||d  |kr|||  }| |||d  |
 fi |}t|||d  |}d|d  }||d  | }d| }|| ||  }|||  }q|||  }| |||d  |
 fi |}t|||d  |}||d  ||d   }|||  }| |||d  |
 fi |}t|||d  |}d
|d  }||d  | }||d  | }d| | }|| ||  ||  }|||  }q|S )Nr   rz   r   r   r   r5   r,   r6   r   r  r   )r   r   r!   r   r   r   r   r   r   r   r   s_endr   r   r   r   rH   r   r   r   r   r   r   w2w1r   r   r  
denoised_3d_3w3r   r   r   sample_heunpp2  sN   6 r  c                 C   s  |d u ri n|}| |jd g}|}g }	tt|d |dD ]}
||
 }||
d  }|}| ||| fi |}|d urJ|||
||
 ||
 |d || | }t||
d }|dkr^|}na|dkrk||| |  }nT|dkr||| d| |	d   d  }n?|dkr||| d| d	|	d   d
|	d    d  }n"|dkr||| d| d|	d   d|	d   d|	d    d  }t|	|d krt|d D ]
}|	|d  |	|< q||	d< q|	| q|S )Nr   r   r   r   r,   r  rz            r}     r   7   ;   %   	      )r   rs   r   rr   r8   r   r   )r   r   r!   r   r   r   	max_orderr   x_nextbuffer_modelr   t_curr  x_currH   d_curr   r   r   r   r   sample_ipndm=  s:   "2<
r  c                 C   sZ  |d u ri n|}| |jd g}|}|}	g }
tt|d |dD ]}|| }||d  }|}| ||| fi |}|d urM||||| || |d || | }t||d }|dkrb|}n|dkrp||| |  }n|dkr|| }||	|d   }d||  d }||  d }||| || ||
d     }n`|dkr|| }||	|d   }|	|d  |	|d   }d|d||   |||   |||    d }d||  d | }||  d d||  |  }|| | }||| || ||
d   ||
d     }n|d	kr|| }||	|d   }|	|d  |	|d   }|	|d  |	|d   }d|d||   |||   |||    d }d|d||    d d|d||    | d
|| |    |||  || |   |||  || |   }d||  d | | }||  d d||  |  d||  |||  |||    |  }|| | || |||  |||   d||    |  }| |||  |||    | | }||| || ||
d   ||
d   ||
d     }t|
|d kr#t|d D ]}|
|d  |
|< q| |
d< q!|
|  q!|S )Nr   r   r   r   r,   rz   r  r}  r      r  )r   rs   r   rr   r8   r   ru   r   )r   r   r!   r   r   r   r  r   r  t_stepsr  r   r  r  r  rH   r  r   h_nh_n_1coeff1coeff2h_n_2tempcoeff3h_n_3temp1temp2coeff4r   r   r   r   sample_ipndm_vh  sn   $
0.
0>F<&8r  tabc                 C   s  |d u ri n|}| |jd g}|}	|}
tj|
||d}g }tt|d |dD ]}|| }||d  }|	}| ||| fi |}|d urT||||| || |d || | }t||d }|dkrgd}|dkrt||| |  }	nY|dkr|| \}}|||  ||d   }	nB|dkr|| \}}}|||  ||d   ||d	   }	n$|d
kr|| \}}}}|||  ||d   ||d	   ||d   }	t||d krt|d D ]
}||d  ||< q| |d< q)|	|  q)|	S )Nr   )	deis_moder   r   r   r,   rz   r  r}  r   r  )
r   rs   r   get_deis_coeff_listr   rr   r8   r   ru   r   )r   r   r!   r   r   r   r  r  r   r  r  
coeff_listr  r   r  r  r  rH   r  r   	coeff_curcoeff_prev1coeff_prev2coeff_prev3r   r   r   r   sample_deis  sD   &0r  c	                    s  |du ri n|}| dd}	|du rt||	dn|}| jjd}
tt|
d}d  fdd}| di  }tjj	||d	d
|d< |
|jd g}tt|d |dD ]}| ||| | fi |}|durv||||| || |d ||d  dkr|}qU|| |||   }||d  |||d    }t||| |  }t|| | ||d  | |d\}}|| }|| ||  }|dkr|dkr||||| ||d   | |  }qU|S )z3Ancestral sampling with Euler method steps (CFG++).NrZ   r   r   rf  c                       | d  | d S Nuncond_denoisedrH   r   r	  r  r   r   post_cfg_function     z8sample_euler_ancestral_cfg_pp.<locals>.post_cfg_functionmodel_optionsTdisable_cfg1_optimizationr   r   r   r   r   )r   r[   r   rg  rh  r   r   copyr   #set_model_options_post_cfg_functionr   rs   r   rr   r%   rI   rP   )r   r   r!   r   r   r   rM   r   r   rZ   r   r^  r  r  r   r   rH   rn  rp  r   rO   rN   r   r  r   sample_euler_ancestral_cfg_pp  s4    &&r  c                 C   s   t | |||||dddd	S )zEuler method steps (CFG++).r5   Nr  )r  )r   r   r!   r   r   r   r   r   r   sample_euler_cfg_pp  s   r  c	                    s  |du ri n|}| dd}	|du rt||	dn|}dg  fdd}
| di  }tjj||
dd	|d< ||jd g}d
d }dd }tt	|d |dD ]}| ||| | fi |}t
|| ||d  |d\}}|dur||||| || |d |dkrt|||  d }|||  }nT||| ||}}d}|| }|||  }|||| || d    | |  |  }| |||| fi |}|||| || d    |  |  }||d  dkr|||| ||d  | |  }qQ|S )r[  NrZ   r   r   c                    s   | d  d< | d S )Nr  r   rH   r   r  r  r   r   r    s   z;sample_dpmpp_2s_ancestral_cfg_pp.<locals>.post_cfg_functionr  Tr  c                 S   rR  r   r  rS  r   r   r   r<     rT  z2sample_dpmpp_2s_ancestral_cfg_pp.<locals>.<lambda>c                 S   rR  r   rU  rH  r   r   r   r<     rT  r   r   r   r   r6   )r   r[   r  r   rg  r  r   rs   r   rr   rP   rI   r/   )r   r   r!   r   r   r   rM   r   r   rZ   r  r  r   rW  rX  r   rH   rO   rN   r   r3   r  rY  r   rb   r   r   r   r  r    sample_dpmpp_2s_ancestral_cfg_pp  s:   2."r  c                    s|  |du ri n|}| |jd g}dd }d}d  fdd}	|di  }
tjj|
|	dd	|d< tt|d
 |dD ]}| ||| | fi |}|dur]||||| || |d ||| |||d
  }}|| }|du s|||d
  dkrt	
|    }n'||||d
   }|| }t	
|    t	| d
d|   ||   }|| t	
| |  } }q<|S )rv  Nr   c                 S   rR  r   rU  rH  r   r   r   r<   =  rT  z(sample_dpmpp_2m_cfg_pp.<locals>.<lambda>c                    r  r  r   r  r  r   r   r  A  r  z1sample_dpmpp_2m_cfg_pp.<locals>.post_cfg_functionr  Tr  r   r   r   r,   )r   rs   r   r  r   rg  r  r   rr   r   r%   r/   )r   r   r!   r   r   r   r   rX  old_uncond_denoisedr  r  r   rH   r3   r  r   denoised_mixrx  rY  r   r  r   sample_dpmpp_2m_cfg_pp8  s,   2r  c
           #         s  |d u ri n|}| dd }
|d u rt||
dn|}||jd g}dd }dd }dd   fdd}d }d }d fd	d
}|	rV| di  }tjj||dd|d< tt	|d |dD ]}| ||| | fi |}t
|| ||d  |d\}}|d ur||||| || |d |dks|d u r|	rt||| }|||  }nt||| |}|||  }|||  }nk||| |||||||d  f\}}}}|| }|| | } | || }} tj|| |  dd}!tj| | dd}"|	r||  }||| ||! |"|    }n||| ||!| |"|    }||d  dkrC|||| ||d  | |  }|	rI}n|}|}q`|S )NrZ   r   r   c                 S   rR  r   r  rS  r   r   r   r<   _  rT  zres_multistep.<locals>.<lambda>c                 S   rR  r   rU  rH  r   r   r   r<   `  rT  c                 S   s   t | |  S r   r   rS  r   r   r   r<   a  s    c                    s    | d |  S r   r   rS  )phi1_fnr   r   r<   b  r=   c                    r  r  r   r  r  r   r   r  g  r  z(res_multistep.<locals>.post_cfg_functionr  Tr  r   r   r   r   r5   nan)r   r[   r   rs   r  r   rg  r  r   rr   rP   rI   r   
nan_to_num)#r   r   r!   r   r   r   r   r   rM   cfg_pprZ   r   rW  rX  phi2_fnold_sigma_downrw  r  r  r   rH   rO   rN   r   r   r3   t_oldr  t_prevr   c2phi1_valphi2_valr   r   r   )r  r  r   res_multistepY  sX   0" "r  c                 C      t | |||||||ddd
S )Nr5   Fr   r   r   r   r   rM   r  r  r   r   r!   r   r   r   r   r   r   r   r   sample_res_multistep  r}   r  c                 C   r  )Nr5   Tr  r  r  r   r   r   sample_res_multistep_cfg_pp  r}   r  c	           	      C      t | ||||||||dd
S )NFr  r  	r   r   r!   r   r   r   rM   r   r   r   r   r   sample_res_multistep_ancestral  r}   r  c	           	      C   r  )NTr  r  r  r   r   r   %sample_res_multistep_ancestral_cfg_pp  r}   r  r  c                    sZ  |du ri n|}| |jd g}d}	d  fdd}
|r0|di  }tjj||
dd|d< tt|d |d	D ]p}| ||| | fi |}|rTt	|||  }nt	||| |}|durn||||| || |d
 ||d  ||  }||d  dkr|}n%|r||||d    }n|||  }|dkr|d ||	  }|||  }|}	q:|S )zLGradient-estimation sampler. Paper: https://openreview.net/pdf?id=o2ND9v0CeKNr   c                    r  r  r   r  r  r   r   r    r  z5sample_gradient_estimation.<locals>.post_cfg_functionr  Tr  r   r   r   )
r   rs   r   r  r   rg  r  r   rr   rI   )r   r   r!   r   r   r   ge_gammar  r   old_dr  r  r   rH   r   r   d_barr   r  r   sample_gradient_estimation  s4   r   c              
   C   s   t | ||||||ddS )NT)r   r   r   r  r  )r   )r   r   r!   r   r   r   r  r   r   r   !sample_gradient_estimation_cfg_pp  s   r  c
           %      C   s  |du ri n|}| dd}
|du rt||
dn|}||jd g}dd }|du r-|n|}d}tjd|tj|jd}| jj	
d	}t||}t||}|  }d}d}tt|d
 |dD ]}| ||| | fi |}|dur||||| || |d t|	|d
 }||d
  dkr|}n|| ||d
  }}|| | }||d
  | }|| }|||| }|| | |d
|  |  }|dkr4|| }| | }|||  }||} td
|  | }!|| |||d
    }"||||!||   |"  }|dkr2t|| |  | }#|"| |||d   d  }$|||d d |#||   |$  }|"}|dkr\||||| ||d
   | |d |d |d    jdd  }|}qa|S )zExtended Reverse-Time SDE solver (VP ER-SDE-Solver-3). arXiv: https://arxiv.org/abs/2309.06169.
    Code reference: https://github.com/QinpengCui/ER-SDE-Solver/blob/main/er_sde_solver.py.
    NrZ   r   r   c                 S   s   | | d   d  S )Ng333333?g      $@r\  r   r   r   r   default_er_sde_noise_scaler  s   z2sample_er_sde.<locals>.default_er_sde_noise_scalerg      i@)rQ   r   r   r   r   r   r,   r  r5   r  )r   r[   r   rs   r   arangefloat32r   r   rg  rh  r   r   r   r%   r   rr   r8   r   r-   r  )%r   r   r!   r   r   r   r   r   noise_scaler	max_stagerZ   r   r  num_integration_pointspoint_indicer   half_log_snrs
er_lambdasrw  old_denoised_dr   rH   
stage_useder_lambda_ser_lambda_trn  rp  r_alpharY  r   lambda_step_size
lambda_pos
scaled_posrb   rt  s_u
denoised_ur   r   r   sample_er_sde  sX   




$
Fr  phi_1c           #      C   s"  |
dvrt d|du ri n|}|dd}|du r t||dn|}||jd g}|dko2|dk}| jjd}tt	|d}tt
|d}t||}d	d
|	  }tt|d	 |dD ]2}| ||| | fi |}|dur}||||| || |d ||d	  dkr|}q[||| |||d	  }}|| }||d	  }t|||	}||}||  }||d	  |  }|||  |	 | |   | |t|	 |  |  }|rd|	 | |    ||| | }||| |  }| ||| fi |}|
dkr+t|||}||d	  ||  | |   | |t|  |  }n0|
dkr[t| |	 } t| |  }!||d	  ||  | |   | ||!| | |    }|r|	d	 | | }"||"  }||"d
   ||||d	    }||||d	   |  }q[|S )zSEEDS-2 - Stochastic Explicit Exponential Derivative-free Solvers (VP Data Prediction) stage 2.
    arXiv: https://arxiv.org/abs/2305.14267 (NeurIPS 2023)
    >   r  r  z&solver_type must be 'phi_1' or 'phi_2'NrZ   r   r   r   rf  r   r,   r   r   r}  r  r  )rt   r   r[   r   rs   r   rg  rh  r   r   r   r   r   rr   r   r   r%   r   r/   r   r-   r   mul)#r   r   r!   r   r   r   rM   r   r   rY  r~  rZ   r   inject_noiser   rW  r^  rl  r   rH   ri  rj  r   r  rk  rm  ro  rp  r   	sde_noiser   rt  r   r   segment_factorr   r   r   sample_seeds_2  sZ   
8*
:
:,r  r  c                 C   s   t | |||||dddd|dS )z[Deterministic exponential Heun second order method in data prediction (x0) and logSNR time.r5   Nr'   r   r   r   rM   r   r   rY  r~  r  )r   r   r!   r   r   r   r~  r   r   r   sample_exp_heun_2_x0[     r  c
           
      C   s   t | ||||||||d|	dS )zXStochastic exponential Heun second order method in data prediction (x0) and logSNR time.r'   r  r  r  r   r   r   sample_exp_heun_2_x0_sdea  r  r   r  r  c           (      C   s  |du ri n|}| dd}|du rt||dn|}||jd g}|dko*|dk}| jjd}tt|d}tt	|d}t
||}tt|d |dD ]{}| ||| | fi |}|duro||||| || |d	 ||d  dkrz|}qM||| |||d  }}|| }||d  }t|||	}t|||
}||||}}||  }||  }||d  |  }|||  |	 | |   | |t|	 |  |  }|rd
|	 | |    ||| | }||| |  }| ||| fi |} |
|	 t|
 |  }!t|
 | |! }"|||  |
 | |   | ||"| |!|     }#|r`|	|
 | | }$||$  }||$d   |||  }|#|| |  }#| |#|| fi |}%t| |
 }&t| |& }'||d  ||  | |   | ||'| |&|%    }|r|
d | | }$||$  }||$d   ||||d    }||||d   |  }qM|S )zSEEDS-3 - Stochastic Explicit Exponential Derivative-free Solvers (VP Data Prediction) stage 3.
    arXiv: https://arxiv.org/abs/2305.14267 (NeurIPS 2023)
    NrZ   r   r   r   rf  r   r   r   r}  r,   )r   r[   r   rs   r   rg  rh  r   r   r   r   r   rr   r   r   r%   r   r/   r   r-   r   r  )(r   r   r!   r   r   r   rM   r   r   r_1r_2rZ   r   r  r   rW  r^  r   rH   ri  rj  r   r  rk  
lambda_s_2rm  	sigma_s_2ro  	alpha_s_2rp  r   r  r   a3_2a3_1r  r  r  r   r   r   r   r   sample_seeds_3g  sb   
8*6$:,r(  c           #   
   C   s  t |dkr|S |du ri n|}|dd}|du r t||dn|}||jd g}| jjd}t||}t	||d}|du rS|
d}|
d	}tj||d
d}t|	|
}|}d}d}d}g }|d  dk}tt |d |dD ]z}| ||| | fi |}|dur||||| || |d || || d }t|	t |}|dks||d  dkr|sd}nt|
t |}|rt|t |d | }t|t |d | }|dkr|}nq||| d |d  }tj|| |||d  || ||dd}tj|| d dd} tj| |dgdgfd}!|| ||d   |d  |   | |! }|dkr=|dkr=|| }|rQ| ||| | fi |}||d< ||d  dkr]|}qt|||d  }||| d |d  }tj||d  ||| ||d  ||dd}tj|| d dd} tj| |dgdgfd}"||d  ||  }||d  ||  |d  |   | |" }|dkr|dkr||| ||d  ||d   d|d  |     | }|| }qt|S )zGStochastic Adams Solver with predictor-corrector method (NeurIPS 2023).r   NrZ   r   r   r   rf  g?g?r'   r   r5   rz   r   r   r,   T)is_corrector_step)dim)dimsFr}  )rr   r   r[   r   rs   r   rg  rh  r   r   r   r	   get_tau_interval_funcr9   rn   r   r   r8   !compute_stochastic_adams_b_coeffsr   r   	tensordotr%   r/   r   r-   )#r   r   r!   r   r   r   tau_funcr   r   predictor_ordercorrector_orderuse_pecesimple_order_2rZ   r   r   lambdasstart_sigma	end_sigmamax_used_orderx_predr   tau_tr  	pred_listlower_order_to_endr   rH   predictor_order_usedcorrector_order_usedcurr_lambdasb_coeffspred_matcorr_respred_resr   r   r   sample_sa_solver  s   





	.

	.BrC  c                 C   s"   t | |||||||||	|
d|dS )u`   Stochastic Adams Solver with PECE (Predict–Evaluate–Correct–Evaluate) mode (NeurIPS 2023).T)
r   r   r   r/  r   r   r0  r1  r2  r3  )rC  )r   r   r!   r   r   r   r/  r   r   r0  r1  r3  r   r   r   sample_sa_solver_pece  s   "rD  )r   r   r   )r'   r   )r)   r*   r+   r   )r5   r6   r   )r'   r   )r   )NNNr'   r'   N)NNNr   )NNNr5   r'   N)NNNr  r+  r,  r+  r5   r'   r5   r   r5   r'   NF)NNNr'   r'   Nr6   rA  )NNNr'   r'   Nrz  )NNNr'   r'   Nr{  )NNNNN)NNNN)NNNr  r  )NNNr'   Nr'   F)NNNr'   N)NNNr  F)NNNr  )NNNr'   NNr  )NNNr'   r'   Nr6   r  )NNNr  )NNNr'   r'   Nr  )NNNr'   r'   Nr  r  )
NNFNr'   Nr  r   FF)	NNFNr'   Nr  r   F)[r#   	functoolsr   scipyr   r   r   r_   	tqdm.autor    r   r   r	   comfy.model_patcherr   comfy.model_samplingcomfy.memory_managementcomfy.utilsr
   r   r   r"   r&   r(   r4   rD   rI   rP   r[   r\   r   r   r   r   Tensorr   r   no_gradr   r   r   r   r   r   r   r   r   r   r   Moduler   rO  rQ  rZ  rV  ru  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   r(  rC  rD  r   r   r   r   <module>   s    

	





$
"#! %285=				


:
+B0+* ?+A=Ag