o
    i                     @   s@   d dl Z d dlZdddZdd Zd	d
 Zdd ZdddZdS )    NMbP?Mb`?P   c                 C   s   dd }dt t| d d | t t| d d   |d  }t t| d d d|  }||   |   |    }|||| fS )Nc                    s    fddS )Nc                    s,   d d  | d d         S )N      )logsqrt)sigmabeta_dbeta_min 4/mnt/c/Users/fbmor/ComfyUI/comfy/k_diffusion/deis.py<lambda>   s   , z)edm2t.<locals>.<lambda>.<locals>.<lambda>r   r
   r   r
   r   r      s    zedm2t.<locals>.<lambda>r   r   g      ?)npr   torchtensorcpuclonedetach)	edm_steps	epsilon_s	sigma_min	sigma_maxvp_sigma_inv	vp_beta_dvp_beta_mint_stepsr   r   r   edm2t   s
   H$2r   c                 C   sF   d}t | jd D ]}||krq	||| |  | | | |   9 }q	|S )Nr   r   )rangeshape)prev_tjtauspolykr   r   r   cal_poly   s   "r&   c                 C   s"   t d|d  ||   ||   S )N      r   )r   exp)beta_0beta_1tr   r   r   
t2alpha_fn!   s   "r,   c              	   C   s   t jdd@ | }|  } | }t    |d t| ||}| }|   |j	}W d    n1 s:w   Y  W d    n1 sIw   Y  d| t 
|d|   }|S )NF)modeTr'   r   )r   inference_moder   enable_gradrequires_grad_r,   r   sumbackwardgradr   )r)   r*   r#   alpha	log_alphad_log_alpha_dtau	integrandr   r   r   cal_intergrand&   s   


r8   '  tabc              	      s  |dkrvt | \} }}g }tt| dd | dd D ]W\ \}}t d |}	|	dkr3|g  qt|||}
|| | }|  fddt|	D  }g }t|||
}t|	D ]}t	|||
}|t
|| |  qY|| q|S |dkrcdd	 }d
d }g }tt| dd | dd D ]\ \}}t |}	|	dkr|g  q|  fddt|	d D  }|	dkr||d  d ||d  d  d||d    }|| d d|d |   }||g}nv|	dkr||d |d |||}|||d |||d }|||d |||d }|||g}nG|	dkr]||d |d |d |||}|||d |d |||d }|||d |d |||d }|||d |d |||d }||||g}|| q|S )a  
    Get the coefficient list for DEIS sampling.

    Args:
        t_steps: A pytorch tensor. The time steps for sampling.
        max_order: A `int`. Maximum order of the solver. 1 <= max_order <= 4
        N: A `int`. Use how many points to perform the numerical integration when deis_mode=='tab'.
        deis_mode: A `str`. Select between 'tab' and 'rhoab'. Type of DEIS.
    Returns:
        A pytorch tensor. A batch of generated samples or sampling trajectories if return_inters=True.
    r:   Nr   c                       g | ]} | qS r   r   .0r%   ir   r   
<listcomp>L       z'get_deis_coeff_list.<locals>.<listcomp>rhoabc                 S   sT   |d |d  d |d |d  | |  d  || |  |  }|||  ||   S )N   r   r   )abstartendccoeffr   r   r   get_def_intergral_2V   s   @z0get_deis_coeff_list.<locals>.get_def_intergral_2c                 S   s   |d |d  d |d |d  | | |  d  |d |d  | | | |  ||   d  || |  | |  }|||  ||  ||   S )N   rD   r   r   )rE   rF   rI   rG   rH   drJ   r   r   r   get_def_intergral_3[   s   2*z0get_deis_coeff_list.<locals>.get_def_intergral_3r   c                    r<   r   r   r=   r?   r   r   rA   f   rB   r   rD   )r   	enumeratezipminappendr   linspacer   r8   r&   r1   )r   	max_orderN	deis_moder)   r*   Ct_curt_nextorderr#   dtaur!   
coeff_tempr7   r"   r$   rK   rN   	coeff_curcoeff_prev1coeff_prev2coeff_prev3r   r?   r   get_deis_coeff_list6   sV   *%
*
0


ra   )r   r   r   )r9   r:   )r   numpyr   r   r&   r,   r8   ra   r   r   r   r   <module>   s   
		